From c61ba3abdaf09644cb22d3969b9ce5d0f3d43f7c Mon Sep 17 00:00:00 2001 From: tengge <930372551@qq.com> Date: Sat, 8 Aug 2020 22:07:00 +0800 Subject: [PATCH] Use CesiumJS instead of WebWorldWind --- README.md | 3 +- README_zh.md | 3 +- server/server/server.go | 4 + .../Assets/IAU2006_XYS/IAU2006_XYS_0.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_1.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_10.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_11.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_12.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_13.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_14.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_15.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_16.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_17.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_18.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_19.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_2.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_20.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_21.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_22.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_23.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_24.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_25.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_26.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_27.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_3.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_4.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_5.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_6.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_7.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_8.json | 1 + .../Assets/IAU2006_XYS/IAU2006_XYS_9.json | 1 + .../Cesium/Assets/Images/bing_maps_credit.png | Bin 0 -> 18831 bytes .../Cesium/Assets/Images/cesium_credit.png | Bin 0 -> 4242 bytes .../Assets/Images/google_earth_credit.png | Bin 0 -> 7703 bytes .../Cesium/Assets/Images/ion-credit.png | Bin 0 -> 6028 bytes .../Assets/Textures/LensFlare/DirtMask.jpg | Bin 0 -> 113718 bytes .../Assets/Textures/LensFlare/StarBurst.jpg | Bin 0 -> 195728 bytes .../Assets/Textures/NaturalEarthII/0/0/0.jpg | Bin 0 -> 12067 bytes .../Assets/Textures/NaturalEarthII/0/1/0.jpg | Bin 0 -> 14055 bytes .../Assets/Textures/NaturalEarthII/1/0/0.jpg | Bin 0 -> 7278 bytes .../Assets/Textures/NaturalEarthII/1/0/1.jpg | Bin 0 -> 11399 bytes .../Assets/Textures/NaturalEarthII/1/1/0.jpg | Bin 0 -> 10652 bytes .../Assets/Textures/NaturalEarthII/1/1/1.jpg | Bin 0 -> 13142 bytes .../Assets/Textures/NaturalEarthII/1/2/0.jpg | Bin 0 -> 9643 bytes .../Assets/Textures/NaturalEarthII/1/2/1.jpg | Bin 0 -> 15312 bytes .../Assets/Textures/NaturalEarthII/1/3/0.jpg | Bin 0 -> 10532 bytes .../Assets/Textures/NaturalEarthII/1/3/1.jpg | Bin 0 -> 13262 bytes .../Assets/Textures/NaturalEarthII/2/0/0.jpg | Bin 0 -> 8157 bytes .../Assets/Textures/NaturalEarthII/2/0/1.jpg | Bin 0 -> 9307 bytes .../Assets/Textures/NaturalEarthII/2/0/2.jpg | Bin 0 -> 7891 bytes .../Assets/Textures/NaturalEarthII/2/0/3.jpg | Bin 0 -> 10341 bytes .../Assets/Textures/NaturalEarthII/2/1/0.jpg | Bin 0 -> 7852 bytes .../Assets/Textures/NaturalEarthII/2/1/1.jpg | Bin 0 -> 6850 bytes .../Assets/Textures/NaturalEarthII/2/1/2.jpg | Bin 0 -> 11581 bytes .../Assets/Textures/NaturalEarthII/2/1/3.jpg | Bin 0 -> 15862 bytes .../Assets/Textures/NaturalEarthII/2/2/0.jpg | Bin 0 -> 10657 bytes .../Assets/Textures/NaturalEarthII/2/2/1.jpg | Bin 0 -> 12456 bytes .../Assets/Textures/NaturalEarthII/2/2/2.jpg | Bin 0 -> 12262 bytes .../Assets/Textures/NaturalEarthII/2/2/3.jpg | Bin 0 -> 14940 bytes .../Assets/Textures/NaturalEarthII/2/3/0.jpg | Bin 0 -> 9531 bytes .../Assets/Textures/NaturalEarthII/2/3/1.jpg | Bin 0 -> 10234 bytes .../Assets/Textures/NaturalEarthII/2/3/2.jpg | Bin 0 -> 11678 bytes .../Assets/Textures/NaturalEarthII/2/3/3.jpg | Bin 0 -> 10754 bytes .../Assets/Textures/NaturalEarthII/2/4/0.jpg | Bin 0 -> 8474 bytes .../Assets/Textures/NaturalEarthII/2/4/1.jpg | Bin 0 -> 12265 bytes .../Assets/Textures/NaturalEarthII/2/4/2.jpg | Bin 0 -> 16477 bytes .../Assets/Textures/NaturalEarthII/2/4/3.jpg | Bin 0 -> 11888 bytes .../Assets/Textures/NaturalEarthII/2/5/0.jpg | Bin 0 -> 7540 bytes .../Assets/Textures/NaturalEarthII/2/5/1.jpg | Bin 0 -> 10274 bytes .../Assets/Textures/NaturalEarthII/2/5/2.jpg | Bin 0 -> 16112 bytes .../Assets/Textures/NaturalEarthII/2/5/3.jpg | Bin 0 -> 11877 bytes .../Assets/Textures/NaturalEarthII/2/6/0.jpg | Bin 0 -> 6636 bytes .../Assets/Textures/NaturalEarthII/2/6/1.jpg | Bin 0 -> 11564 bytes .../Assets/Textures/NaturalEarthII/2/6/2.jpg | Bin 0 -> 16411 bytes .../Assets/Textures/NaturalEarthII/2/6/3.jpg | Bin 0 -> 12756 bytes .../Assets/Textures/NaturalEarthII/2/7/0.jpg | Bin 0 -> 9032 bytes .../Assets/Textures/NaturalEarthII/2/7/1.jpg | Bin 0 -> 12957 bytes .../Assets/Textures/NaturalEarthII/2/7/2.jpg | Bin 0 -> 11362 bytes .../Assets/Textures/NaturalEarthII/2/7/3.jpg | Bin 0 -> 11859 bytes .../NaturalEarthII/tilemapresource.xml | 14 + .../Assets/Textures/SkyBox/tycho2t3_80_mx.jpg | Bin 0 -> 118775 bytes .../Assets/Textures/SkyBox/tycho2t3_80_my.jpg | Bin 0 -> 152501 bytes .../Assets/Textures/SkyBox/tycho2t3_80_mz.jpg | Bin 0 -> 167980 bytes .../Assets/Textures/SkyBox/tycho2t3_80_px.jpg | Bin 0 -> 122746 bytes .../Assets/Textures/SkyBox/tycho2t3_80_py.jpg | Bin 0 -> 152999 bytes .../Assets/Textures/SkyBox/tycho2t3_80_pz.jpg | Bin 0 -> 152537 bytes .../Cesium/Assets/Textures/maki/airfield.png | Bin 0 -> 1188 bytes .../Cesium/Assets/Textures/maki/airport.png | Bin 0 -> 1554 bytes .../Assets/Textures/maki/alcohol-shop.png | Bin 0 -> 1293 bytes .../Assets/Textures/maki/america-football.png | Bin 0 -> 2595 bytes .../Assets/Textures/maki/art-gallery.png | Bin 0 -> 3159 bytes .../Cesium/Assets/Textures/maki/bakery.png | Bin 0 -> 2714 bytes .../Cesium/Assets/Textures/maki/bank.png | Bin 0 -> 936 bytes .../Cesium/Assets/Textures/maki/bar.png | Bin 0 -> 1435 bytes .../Cesium/Assets/Textures/maki/baseball.png | Bin 0 -> 1838 bytes .../Assets/Textures/maki/basketball.png | Bin 0 -> 1318 bytes .../Cesium/Assets/Textures/maki/beer.png | Bin 0 -> 1403 bytes .../Cesium/Assets/Textures/maki/bicycle.png | Bin 0 -> 3989 bytes .../Cesium/Assets/Textures/maki/building.png | Bin 0 -> 1765 bytes .../Cesium/Assets/Textures/maki/bus.png | Bin 0 -> 998 bytes .../Cesium/Assets/Textures/maki/cafe.png | Bin 0 -> 1518 bytes .../Cesium/Assets/Textures/maki/camera.png | Bin 0 -> 1976 bytes .../Cesium/Assets/Textures/maki/campsite.png | Bin 0 -> 2411 bytes .../Cesium/Assets/Textures/maki/car.png | Bin 0 -> 1498 bytes .../Cesium/Assets/Textures/maki/cemetery.png | Bin 0 -> 967 bytes .../Cesium/Assets/Textures/maki/cesium.png | Bin 0 -> 3610 bytes .../Cesium/Assets/Textures/maki/chemist.png | Bin 0 -> 1603 bytes .../Cesium/Assets/Textures/maki/cinema.png | Bin 0 -> 1492 bytes .../Assets/Textures/maki/circle-stroked.png | Bin 0 -> 2126 bytes .../Cesium/Assets/Textures/maki/circle.png | Bin 0 -> 1459 bytes .../Cesium/Assets/Textures/maki/city.png | Bin 0 -> 788 bytes .../Assets/Textures/maki/clothing-store.png | Bin 0 -> 2037 bytes .../Cesium/Assets/Textures/maki/college.png | Bin 0 -> 2502 bytes .../Assets/Textures/maki/commercial.png | Bin 0 -> 1002 bytes .../Cesium/Assets/Textures/maki/cricket.png | Bin 0 -> 1677 bytes .../Cesium/Assets/Textures/maki/cross.png | Bin 0 -> 1888 bytes .../Cesium/Assets/Textures/maki/dam.png | Bin 0 -> 1703 bytes .../Cesium/Assets/Textures/maki/danger.png | Bin 0 -> 2429 bytes .../Assets/Textures/maki/disability.png | Bin 0 -> 3437 bytes .../Cesium/Assets/Textures/maki/dog-park.png | Bin 0 -> 3146 bytes .../Cesium/Assets/Textures/maki/embassy.png | Bin 0 -> 1680 bytes .../Textures/maki/emergency-telephone.png | Bin 0 -> 1533 bytes .../Cesium/Assets/Textures/maki/entrance.png | Bin 0 -> 1307 bytes .../Cesium/Assets/Textures/maki/farm.png | Bin 0 -> 1686 bytes .../Cesium/Assets/Textures/maki/fast-food.png | Bin 0 -> 2019 bytes .../Cesium/Assets/Textures/maki/ferry.png | Bin 0 -> 2879 bytes .../Assets/Textures/maki/fire-station.png | Bin 0 -> 2228 bytes .../Cesium/Assets/Textures/maki/fuel.png | Bin 0 -> 1741 bytes .../Cesium/Assets/Textures/maki/garden.png | Bin 0 -> 2057 bytes .../Cesium/Assets/Textures/maki/gift.png | Bin 0 -> 1606 bytes .../Cesium/Assets/Textures/maki/golf.png | Bin 0 -> 1999 bytes .../Cesium/Assets/Textures/maki/grocery.png | Bin 0 -> 1425 bytes .../Assets/Textures/maki/hairdresser.png | Bin 0 -> 3301 bytes .../Cesium/Assets/Textures/maki/harbor.png | Bin 0 -> 2048 bytes .../Cesium/Assets/Textures/maki/heart.png | Bin 0 -> 1745 bytes .../Cesium/Assets/Textures/maki/heliport.png | Bin 0 -> 2059 bytes .../Cesium/Assets/Textures/maki/hospital.png | Bin 0 -> 909 bytes .../Cesium/Assets/Textures/maki/ice-cream.png | Bin 0 -> 1602 bytes .../Assets/Textures/maki/industrial.png | Bin 0 -> 1092 bytes .../Cesium/Assets/Textures/maki/land-use.png | Bin 0 -> 1773 bytes .../Cesium/Assets/Textures/maki/laundry.png | Bin 0 -> 2407 bytes .../Cesium/Assets/Textures/maki/library.png | Bin 0 -> 1355 bytes .../Assets/Textures/maki/lighthouse.png | Bin 0 -> 1944 bytes .../Cesium/Assets/Textures/maki/lodging.png | Bin 0 -> 1362 bytes .../Cesium/Assets/Textures/maki/logging.png | Bin 0 -> 1378 bytes .../Textures/maki/london-underground.png | Bin 0 -> 2979 bytes .../Assets/Textures/maki/marker-stroked.png | Bin 0 -> 3414 bytes .../Cesium/Assets/Textures/maki/marker.png | Bin 0 -> 2448 bytes .../Cesium/Assets/Textures/maki/minefield.png | Bin 0 -> 1907 bytes .../Assets/Textures/maki/mobilephone.png | Bin 0 -> 1474 bytes .../Cesium/Assets/Textures/maki/monument.png | Bin 0 -> 1376 bytes .../Cesium/Assets/Textures/maki/museum.png | Bin 0 -> 2578 bytes .../Cesium/Assets/Textures/maki/music.png | Bin 0 -> 1371 bytes .../Cesium/Assets/Textures/maki/oil-well.png | Bin 0 -> 3357 bytes .../Cesium/Assets/Textures/maki/park.png | Bin 0 -> 2059 bytes .../Cesium/Assets/Textures/maki/park2.png | Bin 0 -> 2284 bytes .../Assets/Textures/maki/parking-garage.png | Bin 0 -> 1563 bytes .../Cesium/Assets/Textures/maki/parking.png | Bin 0 -> 1250 bytes .../Cesium/Assets/Textures/maki/pharmacy.png | Bin 0 -> 2258 bytes .../Cesium/Assets/Textures/maki/pitch.png | Bin 0 -> 3288 bytes .../Assets/Textures/maki/place-of-worship.png | Bin 0 -> 1111 bytes .../Assets/Textures/maki/playground.png | Bin 0 -> 3856 bytes .../Cesium/Assets/Textures/maki/police.png | Bin 0 -> 2194 bytes .../Assets/Textures/maki/polling-place.png | Bin 0 -> 1772 bytes .../Cesium/Assets/Textures/maki/post.png | Bin 0 -> 1273 bytes .../Cesium/Assets/Textures/maki/prison.png | Bin 0 -> 1371 bytes .../Assets/Textures/maki/rail-above.png | Bin 0 -> 2071 bytes .../Assets/Textures/maki/rail-light.png | Bin 0 -> 2816 bytes .../Assets/Textures/maki/rail-metro.png | Bin 0 -> 2249 bytes .../Assets/Textures/maki/rail-underground.png | Bin 0 -> 1996 bytes .../Cesium/Assets/Textures/maki/rail.png | Bin 0 -> 2073 bytes .../Textures/maki/religious-christian.png | Bin 0 -> 948 bytes .../Assets/Textures/maki/religious-jewish.png | Bin 0 -> 2384 bytes .../Assets/Textures/maki/religious-muslim.png | Bin 0 -> 3925 bytes .../Assets/Textures/maki/restaurant.png | Bin 0 -> 2499 bytes .../Cesium/Assets/Textures/maki/roadblock.png | Bin 0 -> 1312 bytes .../Cesium/Assets/Textures/maki/rocket.png | Bin 0 -> 1653 bytes .../Cesium/Assets/Textures/maki/school.png | Bin 0 -> 3838 bytes .../Cesium/Assets/Textures/maki/scooter.png | Bin 0 -> 2942 bytes .../Cesium/Assets/Textures/maki/shop.png | Bin 0 -> 1544 bytes .../Cesium/Assets/Textures/maki/skiing.png | Bin 0 -> 3345 bytes .../Assets/Textures/maki/slaughterhouse.png | Bin 0 -> 2270 bytes .../Cesium/Assets/Textures/maki/soccer.png | Bin 0 -> 2420 bytes .../Assets/Textures/maki/square-stroked.png | Bin 0 -> 650 bytes .../Cesium/Assets/Textures/maki/square.png | Bin 0 -> 582 bytes .../Assets/Textures/maki/star-stroked.png | Bin 0 -> 3460 bytes .../Cesium/Assets/Textures/maki/star.png | Bin 0 -> 2703 bytes .../Cesium/Assets/Textures/maki/suitcase.png | Bin 0 -> 1129 bytes .../Cesium/Assets/Textures/maki/swimming.png | Bin 0 -> 2106 bytes .../Cesium/Assets/Textures/maki/telephone.png | Bin 0 -> 1702 bytes .../Cesium/Assets/Textures/maki/tennis.png | Bin 0 -> 1658 bytes .../Cesium/Assets/Textures/maki/theatre.png | Bin 0 -> 3233 bytes .../Cesium/Assets/Textures/maki/toilets.png | Bin 0 -> 2917 bytes .../Cesium/Assets/Textures/maki/town-hall.png | Bin 0 -> 2005 bytes .../Cesium/Assets/Textures/maki/town.png | Bin 0 -> 1125 bytes .../Assets/Textures/maki/triangle-stroked.png | Bin 0 -> 2837 bytes .../Cesium/Assets/Textures/maki/triangle.png | Bin 0 -> 2137 bytes .../Cesium/Assets/Textures/maki/village.png | Bin 0 -> 2145 bytes .../Cesium/Assets/Textures/maki/warehouse.png | Bin 0 -> 1908 bytes .../Assets/Textures/maki/waste-basket.png | Bin 0 -> 1917 bytes .../Cesium/Assets/Textures/maki/water.png | Bin 0 -> 2411 bytes .../Cesium/Assets/Textures/maki/wetland.png | Bin 0 -> 2151 bytes .../Cesium/Assets/Textures/maki/zoo.png | Bin 0 -> 2681 bytes .../Cesium/Assets/Textures/moonSmall.jpg | Bin 0 -> 18196 bytes web/assets/Cesium/Assets/Textures/pin.svg | 1 + .../Cesium/Assets/Textures/waterNormals.jpg | Bin 0 -> 294196 bytes .../Assets/Textures/waterNormalsSmall.jpg | Bin 0 -> 34121 bytes .../Assets/approximateTerrainHeights.json | 1 + web/assets/Cesium/Cesium.d.ts | 42690 ++++++++++++++++ web/assets/Cesium/Cesium.js | 1 + web/assets/Cesium/README.md | 5 + .../Cesium/ThirdParty/Workers/deflate.js | 1 + .../ThirdParty/Workers/draco_decoder.js | 33 + .../ThirdParty/Workers/draco_wasm_wrapper.js | 129 + .../Cesium/ThirdParty/Workers/inflate.js | 1 + .../Cesium/ThirdParty/draco_decoder.wasm | Bin 0 -> 330634 bytes .../ThirdParty/google-earth-dbroot-parser.js | 1 + .../Cesium/Widgets/Animation/Animation.css | 1 + .../Cesium/Widgets/Animation/lighter.css | 1 + .../BaseLayerPicker/BaseLayerPicker.css | 1 + .../Widgets/BaseLayerPicker/lighter.css | 1 + .../Cesium3DTilesInspector.css | 1 + .../CesiumInspector/CesiumInspector.css | 1 + .../Widgets/CesiumWidget/CesiumWidget.css | 1 + .../Cesium/Widgets/CesiumWidget/lighter.css | 1 + .../FullscreenButton/FullscreenButton.css | 1 + .../Cesium/Widgets/Geocoder/Geocoder.css | 1 + .../Cesium/Widgets/Geocoder/lighter.css | 1 + .../Images/ImageryProviders/bingAerial.png | Bin 0 -> 9943 bytes .../ImageryProviders/bingAerialLabels.png | Bin 0 -> 10374 bytes .../Images/ImageryProviders/bingRoads.png | Bin 0 -> 8076 bytes .../Images/ImageryProviders/blueMarble.png | Bin 0 -> 7403 bytes .../Images/ImageryProviders/earthAtNight.png | Bin 0 -> 5836 bytes .../esriNationalGeographic.png | Bin 0 -> 11555 bytes .../ImageryProviders/esriWorldImagery.png | Bin 0 -> 11575 bytes .../ImageryProviders/esriWorldStreetMap.png | Bin 0 -> 8501 bytes .../mapQuestOpenStreetMap.png | Bin 0 -> 11342 bytes .../ImageryProviders/mapboxSatellite.png | Bin 0 -> 9242 bytes .../Images/ImageryProviders/mapboxStreets.png | Bin 0 -> 7270 bytes .../Images/ImageryProviders/mapboxTerrain.png | Bin 0 -> 8300 bytes .../ImageryProviders/naturalEarthII.png | Bin 0 -> 7491 bytes .../Images/ImageryProviders/openStreetMap.png | Bin 0 -> 2663 bytes .../Images/ImageryProviders/sentinel-2.png | Bin 0 -> 10086 bytes .../Images/ImageryProviders/stamenToner.png | Bin 0 -> 4119 bytes .../ImageryProviders/stamenWatercolor.png | Bin 0 -> 10806 bytes .../Widgets/Images/NavigationHelp/Mouse.svg | 84 + .../Images/NavigationHelp/MouseLeft.svg | 76 + .../Images/NavigationHelp/MouseMiddle.svg | 76 + .../Images/NavigationHelp/MouseRight.svg | 76 + .../Widgets/Images/NavigationHelp/Touch.svg | 120 + .../Images/NavigationHelp/TouchDrag.svg | 129 + .../Images/NavigationHelp/TouchRotate.svg | 76 + .../Images/NavigationHelp/TouchTilt.svg | 135 + .../Images/NavigationHelp/TouchZoom.svg | 74 + .../TerrainProviders/CesiumWorldTerrain.png | Bin 0 -> 10080 bytes .../Images/TerrainProviders/Ellipsoid.png | Bin 0 -> 6173 bytes .../Cesium/Widgets/Images/TimelineIcons.png | Bin 0 -> 781 bytes .../Cesium/Widgets/Images/info-loading.gif | Bin 0 -> 723 bytes web/assets/Cesium/Widgets/InfoBox/InfoBox.css | 1 + .../Widgets/InfoBox/InfoBoxDescription.css | 1 + .../NavigationHelpButton.css | 1 + .../Widgets/NavigationHelpButton/lighter.css | 1 + .../PerformanceWatchdog.css | 1 + .../ProjectionPicker/ProjectionPicker.css | 1 + .../SceneModePicker/SceneModePicker.css | 1 + .../SelectionIndicator/SelectionIndicator.css | 1 + .../Cesium/Widgets/Timeline/Timeline.css | 1 + .../Cesium/Widgets/Timeline/lighter.css | 1 + .../Cesium/Widgets/VRButton/VRButton.css | 1 + web/assets/Cesium/Widgets/Viewer/Viewer.css | 1 + web/assets/Cesium/Widgets/lighter.css | 1 + web/assets/Cesium/Widgets/lighterShared.css | 1 + web/assets/Cesium/Widgets/shared.css | 1 + web/assets/Cesium/Widgets/widgets.css | 1 + web/assets/Cesium/Workers/ArcType-dc1c5aee.js | 1 + .../Workers/AttributeCompression-9fc99391.js | 1 + .../Workers/BoundingRectangle-8de79d83.js | 1 + .../Cesium/Workers/BoxGeometry-ee1413aa.js | 1 + .../Cesium/Workers/Cartesian2-bddc1162.js | 1 + web/assets/Cesium/Workers/Check-6c0211bc.js | 1 + web/assets/Cesium/Workers/Color-bc1ab1f9.js | 1 + .../Workers/ComponentDatatype-6d99a1ee.js | 1 + ...CoplanarPolygonGeometryLibrary-dc8e954f.js | 1 + .../CorridorGeometryLibrary-38c8d28f.js | 1 + .../Workers/CylinderGeometry-01400a36.js | 1 + .../CylinderGeometryLibrary-b0214ab1.js | 1 + .../Workers/EllipseGeometry-b2472656.js | 1 + .../EllipseGeometryLibrary-c9c767e4.js | 1 + .../EllipseOutlineGeometry-2cffcd24.js | 1 + .../Workers/EllipsoidGeodesic-30fae80b.js | 1 + .../Workers/EllipsoidGeometry-ceb731dc.js | 1 + .../EllipsoidOutlineGeometry-5b7b6e19.js | 1 + .../Workers/EllipsoidRhumbLine-c704bf4c.js | 1 + .../Workers/EllipsoidTangentPlane-ed172748.js | 1 + .../Workers/EncodedCartesian3-e9c71cf0.js | 1 + .../Workers/FrustumGeometry-d632cb92.js | 1 + .../Workers/GeometryAttribute-44fb48f1.js | 1 + .../Workers/GeometryAttributes-4fcfcf40.js | 1 + .../Workers/GeometryInstance-11f9a3bd.js | 1 + .../GeometryOffsetAttribute-7350d9af.js | 1 + .../Workers/GeometryPipeline-b49b2e59.js | 1 + .../Cesium/Workers/IndexDatatype-53503fee.js | 1 + .../Workers/IntersectionTests-2626c9e9.js | 1 + web/assets/Cesium/Workers/Math-fc8cecf5.js | 1 + .../Workers/OrientedBoundingBox-c9ad91c4.js | 1 + web/assets/Cesium/Workers/Plane-231f1723.js | 1 + .../PolygonGeometryLibrary-29b9a52e.js | 1 + .../Workers/PolygonPipeline-ff364b47.js | 1 + .../Workers/PolylinePipeline-8a1a1e4f.js | 1 + .../PolylineVolumeGeometryLibrary-ec7dce94.js | 1 + .../Workers/PrimitivePipeline-bde6ab6f.js | 1 + .../RectangleGeometryLibrary-341b00f2.js | 1 + .../Cesium/Workers/RuntimeError-2109023a.js | 1 + .../Workers/TerrainEncoding-b34235ca.js | 1 + .../Cesium/Workers/Transforms-ec27f304.js | 1 + .../Cesium/Workers/VertexFormat-7572c785.js | 1 + .../Workers/WallGeometryLibrary-cfdc73e3.js | 1 + .../Cesium/Workers/WebGLConstants-76bb35d1.js | 1 + .../Workers/WebMercatorProjection-df58d479.js | 1 + .../Workers/arrayRemoveDuplicates-ebc732b0.js | 1 + .../Workers/cesiumWorkerBootstrapper.js | 1 + web/assets/Cesium/Workers/combineGeometry.js | 1 + .../Cesium/Workers/createBoxGeometry.js | 1 + .../Workers/createBoxOutlineGeometry.js | 1 + .../Cesium/Workers/createCircleGeometry.js | 1 + .../Workers/createCircleOutlineGeometry.js | 1 + .../Workers/createCoplanarPolygonGeometry.js | 1 + .../createCoplanarPolygonOutlineGeometry.js | 1 + .../Cesium/Workers/createCorridorGeometry.js | 1 + .../Workers/createCorridorOutlineGeometry.js | 1 + .../Cesium/Workers/createCylinderGeometry.js | 1 + .../Workers/createCylinderOutlineGeometry.js | 1 + .../Cesium/Workers/createEllipseGeometry.js | 1 + .../Workers/createEllipseOutlineGeometry.js | 1 + .../Cesium/Workers/createEllipsoidGeometry.js | 1 + .../Workers/createEllipsoidOutlineGeometry.js | 1 + .../Cesium/Workers/createFrustumGeometry.js | 1 + .../Workers/createFrustumOutlineGeometry.js | 1 + web/assets/Cesium/Workers/createGeometry.js | 1 + .../Workers/createGroundPolylineGeometry.js | 1 + .../Cesium/Workers/createPlaneGeometry.js | 1 + .../Workers/createPlaneOutlineGeometry.js | 1 + .../Cesium/Workers/createPolygonGeometry.js | 1 + .../Workers/createPolygonOutlineGeometry.js | 1 + .../Cesium/Workers/createPolylineGeometry.js | 1 + .../Workers/createPolylineVolumeGeometry.js | 1 + .../createPolylineVolumeOutlineGeometry.js | 1 + .../Cesium/Workers/createRectangleGeometry.js | 1 + .../Workers/createRectangleOutlineGeometry.js | 1 + .../Workers/createSimplePolylineGeometry.js | 1 + .../Cesium/Workers/createSphereGeometry.js | 1 + .../Workers/createSphereOutlineGeometry.js | 1 + .../Workers/createTaskProcessorWorker.js | 1 + .../Workers/createVectorTileGeometries.js | 1 + .../Cesium/Workers/createVectorTilePoints.js | 1 + .../Workers/createVectorTilePolygons.js | 1 + .../Workers/createVectorTilePolylines.js | 1 + ...VerticesFromGoogleEarthEnterpriseBuffer.js | 1 + .../Workers/createVerticesFromHeightmap.js | 1 + .../createVerticesFromQuantizedTerrainMesh.js | 1 + .../Cesium/Workers/createWallGeometry.js | 1 + .../Workers/createWallOutlineGeometry.js | 1 + web/assets/Cesium/Workers/decodeDraco.js | 1 + .../decodeGoogleEarthEnterprisePacket.js | 1 + .../Cesium/Workers/transcodeCRNToDXT.js | 1 + .../Cesium/Workers/transferTypedArrayTest.js | 1 + .../Workers/upsampleQuantizedTerrainMesh.js | 1 + web/assets/Cesium/Workers/when-54c2dc71.js | 1 + web/index.html | 2 + web/src/editor/menu/SceneMenu.jsx | 20 +- web/src/editor/viewport/Viewport.jsx | 23 + web/src/editor/viewport/css/Viewport.css | 11 +- web/src/gis/BasicWorldWindowController.js | 408 - web/src/gis/README.md | 7 - web/src/gis/WorldWind.js | 517 - web/src/gis/WorldWindow.js | 1491 - web/src/gis/WorldWindowController.js | 120 - web/src/gis/cache/GpuResourceCache.js | 272 - web/src/gis/cache/MemoryCache.js | 347 - web/src/gis/cache/MemoryCacheListener.js | 56 - web/src/gis/error/AbstractError.js | 53 - web/src/gis/error/ArgumentError.js | 46 - web/src/gis/error/NotYetImplementedError.js | 46 - .../gis/error/UnsupportedOperationError.js | 48 - web/src/gis/geom/Angle.js | 216 - web/src/gis/geom/BoundingBox.js | 579 - web/src/gis/geom/Frustum.js | 315 - web/src/gis/geom/Line.js | 140 - web/src/gis/geom/Location.js | 961 - web/src/gis/geom/Matrix.js | 1908 - web/src/gis/geom/Matrix3.js | 228 - web/src/gis/geom/Plane.js | 287 - web/src/gis/geom/Position.js | 207 - web/src/gis/geom/Rectangle.js | 161 - web/src/gis/geom/Sector.js | 536 - web/src/gis/geom/Vec2.js | 321 - web/src/gis/geom/Vec3.js | 538 - web/src/gis/gesture/ClickRecognizer.js | 162 - web/src/gis/gesture/DragRecognizer.js | 108 - web/src/gis/gesture/GestureRecognizer.js | 793 - web/src/gis/gesture/PanRecognizer.js | 132 - web/src/gis/gesture/PinchRecognizer.js | 169 - web/src/gis/gesture/RotationRecognizer.js | 172 - web/src/gis/gesture/TapRecognizer.js | 182 - web/src/gis/gesture/TiltRecognizer.js | 120 - web/src/gis/gesture/Touch.js | 112 - web/src/gis/globe/ArcgisElevationCoverage.js | 115 - web/src/gis/globe/ArcgisElevationWorker.js | 2219 - web/src/gis/globe/AsterV2ElevationCoverage.js | 47 - web/src/gis/globe/EarthElevationModel.js | 44 - web/src/gis/globe/ElevationCoverage.js | 168 - web/src/gis/globe/ElevationImage.js | 354 - web/src/gis/globe/ElevationModel.js | 417 - web/src/gis/globe/GebcoElevationCoverage.js | 47 - web/src/gis/globe/Globe.js | 651 - web/src/gis/globe/Terrain.js | 226 - web/src/gis/globe/TerrainTile.js | 230 - web/src/gis/globe/TerrainTileList.js | 81 - web/src/gis/globe/Tessellator.js | 1528 - web/src/gis/globe/TiledElevationCoverage.js | 635 - web/src/gis/globe/UsgsNedElevationCoverage.js | 49 - .../gis/globe/UsgsNedHiElevationCoverage.js | 49 - web/src/gis/layer/AtmosphereLayer.js | 313 - web/src/gis/layer/Layer.js | 158 - web/src/gis/layer/MercatorTiledImageLayer.js | 67 - web/src/gis/layer/StarFieldLayer.js | 428 - web/src/gis/layer/TiledImageLayer.js | 542 - web/src/gis/layer/XYZLayer.js | 30 - web/src/gis/navigate/LookAtNavigator.js | 54 - web/src/gis/navigate/Navigator.js | 53 - web/src/gis/pick/PickedObject.js | 78 - web/src/gis/pick/PickedObjectList.js | 114 - .../gis/projections/GeographicProjection.js | 252 - web/src/gis/projections/ProjectionWgs84.js | 311 - web/src/gis/render/DrawContext.js | 1567 - web/src/gis/render/FramebufferTexture.js | 147 - web/src/gis/render/FramebufferTile.js | 128 - .../gis/render/FramebufferTileController.js | 251 - web/src/gis/render/ImageTile.js | 137 - web/src/gis/render/OrderedRenderable.js | 75 - web/src/gis/render/Renderable.js | 76 - web/src/gis/render/ScreenCreditController.js | 128 - web/src/gis/render/SurfaceRenderable.js | 61 - web/src/gis/render/SurfaceTile.js | 72 - web/src/gis/render/SurfaceTileRenderer.js | 189 - web/src/gis/render/TextRenderer.js | 307 - web/src/gis/render/Texture.js | 187 - web/src/gis/render/TextureTile.js | 84 - web/src/gis/shaders/AtmosphereProgram.js | 320 - web/src/gis/shaders/BasicProgram.js | 127 - web/src/gis/shaders/BasicTextureProgram.js | 256 - web/src/gis/shaders/GpuProgram.js | 281 - web/src/gis/shaders/GpuShader.js | 99 - web/src/gis/shaders/GroundProgram.js | 61 - web/src/gis/shaders/SkyProgram.js | 62 - web/src/gis/shaders/StarFieldProgram.js | 172 - .../gis/shaders/SurfaceTileRendererProgram.js | 212 - web/src/gis/shaders/glsl/basic_fragment.glsl | 23 - .../shaders/glsl/basic_texture_fragment.glsl | 47 - .../shaders/glsl/basic_texture_vertex.glsl | 35 - web/src/gis/shaders/glsl/basic_vertex.glsl | 23 - web/src/gis/shaders/glsl/ground_fragment.glsl | 40 - web/src/gis/shaders/glsl/ground_vertex.glsl | 123 - web/src/gis/shaders/glsl/sky_fragment.glsl | 41 - web/src/gis/shaders/glsl/sky_vertex.glsl | 123 - .../gis/shaders/glsl/star_field_fragment.glsl | 34 - .../gis/shaders/glsl/star_field_vertex.glsl | 59 - .../shaders/glsl/surface_tile_fragment.glsl | 48 - .../gis/shaders/glsl/surface_tile_vertex.glsl | 33 - web/src/gis/shapes/AbstractMesh.js | 545 - web/src/gis/shapes/AbstractShape.js | 429 - web/src/gis/shapes/Annotation.js | 515 - web/src/gis/shapes/AnnotationAttributes.js | 285 - web/src/gis/shapes/Compass.js | 81 - web/src/gis/shapes/GeographicMesh.js | 397 - web/src/gis/shapes/GeographicText.js | 119 - web/src/gis/shapes/Path.js | 624 - web/src/gis/shapes/Placemark.js | 793 - web/src/gis/shapes/PlacemarkAttributes.js | 243 - web/src/gis/shapes/Polygon.js | 902 - web/src/gis/shapes/ScreenImage.js | 374 - web/src/gis/shapes/ScreenText.js | 87 - web/src/gis/shapes/ShapeAttributes.js | 310 - web/src/gis/shapes/SurfaceCircle.js | 183 - web/src/gis/shapes/SurfaceEllipse.js | 230 - web/src/gis/shapes/SurfaceImage.js | 179 - web/src/gis/shapes/SurfacePolygon.js | 143 - web/src/gis/shapes/SurfacePolyline.js | 125 - web/src/gis/shapes/SurfaceRectangle.js | 198 - web/src/gis/shapes/SurfaceSector.js | 139 - web/src/gis/shapes/SurfaceShape.js | 1063 - web/src/gis/shapes/SurfaceShapeTile.js | 248 - web/src/gis/shapes/SurfaceShapeTileBuilder.js | 512 - web/src/gis/shapes/Text.js | 538 - web/src/gis/shapes/TextAttributes.js | 225 - web/src/gis/shapes/TriangleMesh.js | 384 - web/src/gis/util/AbsentResourceList.js | 141 - web/src/gis/util/Color.js | 353 - web/src/gis/util/Font.js | 190 - web/src/gis/util/FrameStatistics.js | 220 - web/src/gis/util/GoToAnimator.js | 262 - web/src/gis/util/HashMap.js | 91 - web/src/gis/util/ImageSource.js | 60 - web/src/gis/util/Insets.js | 135 - web/src/gis/util/Level.js | 148 - web/src/gis/util/LevelSet.js | 210 - web/src/gis/util/Logger.js | 171 - web/src/gis/util/Offset.js | 120 - web/src/gis/util/PolygonSplitter.js | 452 - web/src/gis/util/SunPosition.js | 166 - web/src/gis/util/Tile.js | 570 - web/src/gis/util/TileFactory.js | 50 - web/src/gis/util/UrlBuilder.js | 46 - web/src/gis/util/WWMath.js | 873 - web/src/gis/util/WWUtil.js | 303 - web/src/gis/util/WmsUrlBuilder.js | 182 - web/src/gis/util/libtess.js | 5272 -- web/view.html | 2 + 518 files changed, 43926 insertions(+), 46546 deletions(-) create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json create mode 100644 web/assets/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json create mode 100644 web/assets/Cesium/Assets/Images/bing_maps_credit.png create mode 100644 web/assets/Cesium/Assets/Images/cesium_credit.png create mode 100644 web/assets/Cesium/Assets/Images/google_earth_credit.png create mode 100644 web/assets/Cesium/Assets/Images/ion-credit.png create mode 100644 web/assets/Cesium/Assets/Textures/LensFlare/DirtMask.jpg create mode 100644 web/assets/Cesium/Assets/Textures/LensFlare/StarBurst.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg create mode 100644 web/assets/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml create mode 100644 web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg create mode 100644 web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg create mode 100644 web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg create mode 100644 web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg create mode 100644 web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg create mode 100644 web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg create mode 100644 web/assets/Cesium/Assets/Textures/maki/airfield.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/airport.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/alcohol-shop.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/america-football.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/art-gallery.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/bakery.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/bank.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/bar.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/baseball.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/basketball.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/beer.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/bicycle.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/building.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/bus.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/cafe.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/camera.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/campsite.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/car.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/cemetery.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/cesium.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/chemist.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/cinema.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/circle-stroked.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/circle.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/city.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/clothing-store.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/college.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/commercial.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/cricket.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/cross.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/dam.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/danger.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/disability.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/dog-park.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/embassy.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/emergency-telephone.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/entrance.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/farm.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/fast-food.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/ferry.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/fire-station.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/fuel.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/garden.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/gift.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/golf.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/grocery.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/hairdresser.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/harbor.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/heart.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/heliport.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/hospital.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/ice-cream.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/industrial.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/land-use.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/laundry.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/library.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/lighthouse.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/lodging.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/logging.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/london-underground.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/marker-stroked.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/marker.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/minefield.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/mobilephone.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/monument.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/museum.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/music.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/oil-well.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/park.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/park2.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/parking-garage.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/parking.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/pharmacy.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/pitch.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/place-of-worship.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/playground.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/police.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/polling-place.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/post.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/prison.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/rail-above.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/rail-light.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/rail-metro.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/rail-underground.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/rail.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/religious-christian.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/religious-jewish.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/religious-muslim.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/restaurant.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/roadblock.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/rocket.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/school.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/scooter.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/shop.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/skiing.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/slaughterhouse.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/soccer.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/square-stroked.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/square.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/star-stroked.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/star.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/suitcase.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/swimming.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/telephone.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/tennis.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/theatre.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/toilets.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/town-hall.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/town.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/triangle-stroked.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/triangle.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/village.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/warehouse.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/waste-basket.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/water.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/wetland.png create mode 100644 web/assets/Cesium/Assets/Textures/maki/zoo.png create mode 100644 web/assets/Cesium/Assets/Textures/moonSmall.jpg create mode 100644 web/assets/Cesium/Assets/Textures/pin.svg create mode 100644 web/assets/Cesium/Assets/Textures/waterNormals.jpg create mode 100644 web/assets/Cesium/Assets/Textures/waterNormalsSmall.jpg create mode 100644 web/assets/Cesium/Assets/approximateTerrainHeights.json create mode 100644 web/assets/Cesium/Cesium.d.ts create mode 100644 web/assets/Cesium/Cesium.js create mode 100644 web/assets/Cesium/README.md create mode 100644 web/assets/Cesium/ThirdParty/Workers/deflate.js create mode 100644 web/assets/Cesium/ThirdParty/Workers/draco_decoder.js create mode 100644 web/assets/Cesium/ThirdParty/Workers/draco_wasm_wrapper.js create mode 100644 web/assets/Cesium/ThirdParty/Workers/inflate.js create mode 100644 web/assets/Cesium/ThirdParty/draco_decoder.wasm create mode 100644 web/assets/Cesium/ThirdParty/google-earth-dbroot-parser.js create mode 100644 web/assets/Cesium/Widgets/Animation/Animation.css create mode 100644 web/assets/Cesium/Widgets/Animation/lighter.css create mode 100644 web/assets/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css create mode 100644 web/assets/Cesium/Widgets/BaseLayerPicker/lighter.css create mode 100644 web/assets/Cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css create mode 100644 web/assets/Cesium/Widgets/CesiumInspector/CesiumInspector.css create mode 100644 web/assets/Cesium/Widgets/CesiumWidget/CesiumWidget.css create mode 100644 web/assets/Cesium/Widgets/CesiumWidget/lighter.css create mode 100644 web/assets/Cesium/Widgets/FullscreenButton/FullscreenButton.css create mode 100644 web/assets/Cesium/Widgets/Geocoder/Geocoder.css create mode 100644 web/assets/Cesium/Widgets/Geocoder/lighter.css create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/bingAerial.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/bingRoads.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/blueMarble.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/earthAtNight.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/esriNationalGeographic.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/esriWorldImagery.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/esriWorldStreetMap.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxStreets.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/sentinel-2.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/stamenToner.png create mode 100644 web/assets/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/Mouse.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/MouseLeft.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/MouseRight.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/Touch.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/TouchDrag.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/TouchRotate.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/TouchTilt.svg create mode 100644 web/assets/Cesium/Widgets/Images/NavigationHelp/TouchZoom.svg create mode 100644 web/assets/Cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png create mode 100644 web/assets/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png create mode 100644 web/assets/Cesium/Widgets/Images/TimelineIcons.png create mode 100644 web/assets/Cesium/Widgets/Images/info-loading.gif create mode 100644 web/assets/Cesium/Widgets/InfoBox/InfoBox.css create mode 100644 web/assets/Cesium/Widgets/InfoBox/InfoBoxDescription.css create mode 100644 web/assets/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css create mode 100644 web/assets/Cesium/Widgets/NavigationHelpButton/lighter.css create mode 100644 web/assets/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css create mode 100644 web/assets/Cesium/Widgets/ProjectionPicker/ProjectionPicker.css create mode 100644 web/assets/Cesium/Widgets/SceneModePicker/SceneModePicker.css create mode 100644 web/assets/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css create mode 100644 web/assets/Cesium/Widgets/Timeline/Timeline.css create mode 100644 web/assets/Cesium/Widgets/Timeline/lighter.css create mode 100644 web/assets/Cesium/Widgets/VRButton/VRButton.css create mode 100644 web/assets/Cesium/Widgets/Viewer/Viewer.css create mode 100644 web/assets/Cesium/Widgets/lighter.css create mode 100644 web/assets/Cesium/Widgets/lighterShared.css create mode 100644 web/assets/Cesium/Widgets/shared.css create mode 100644 web/assets/Cesium/Widgets/widgets.css create mode 100644 web/assets/Cesium/Workers/ArcType-dc1c5aee.js create mode 100644 web/assets/Cesium/Workers/AttributeCompression-9fc99391.js create mode 100644 web/assets/Cesium/Workers/BoundingRectangle-8de79d83.js create mode 100644 web/assets/Cesium/Workers/BoxGeometry-ee1413aa.js create mode 100644 web/assets/Cesium/Workers/Cartesian2-bddc1162.js create mode 100644 web/assets/Cesium/Workers/Check-6c0211bc.js create mode 100644 web/assets/Cesium/Workers/Color-bc1ab1f9.js create mode 100644 web/assets/Cesium/Workers/ComponentDatatype-6d99a1ee.js create mode 100644 web/assets/Cesium/Workers/CoplanarPolygonGeometryLibrary-dc8e954f.js create mode 100644 web/assets/Cesium/Workers/CorridorGeometryLibrary-38c8d28f.js create mode 100644 web/assets/Cesium/Workers/CylinderGeometry-01400a36.js create mode 100644 web/assets/Cesium/Workers/CylinderGeometryLibrary-b0214ab1.js create mode 100644 web/assets/Cesium/Workers/EllipseGeometry-b2472656.js create mode 100644 web/assets/Cesium/Workers/EllipseGeometryLibrary-c9c767e4.js create mode 100644 web/assets/Cesium/Workers/EllipseOutlineGeometry-2cffcd24.js create mode 100644 web/assets/Cesium/Workers/EllipsoidGeodesic-30fae80b.js create mode 100644 web/assets/Cesium/Workers/EllipsoidGeometry-ceb731dc.js create mode 100644 web/assets/Cesium/Workers/EllipsoidOutlineGeometry-5b7b6e19.js create mode 100644 web/assets/Cesium/Workers/EllipsoidRhumbLine-c704bf4c.js create mode 100644 web/assets/Cesium/Workers/EllipsoidTangentPlane-ed172748.js create mode 100644 web/assets/Cesium/Workers/EncodedCartesian3-e9c71cf0.js create mode 100644 web/assets/Cesium/Workers/FrustumGeometry-d632cb92.js create mode 100644 web/assets/Cesium/Workers/GeometryAttribute-44fb48f1.js create mode 100644 web/assets/Cesium/Workers/GeometryAttributes-4fcfcf40.js create mode 100644 web/assets/Cesium/Workers/GeometryInstance-11f9a3bd.js create mode 100644 web/assets/Cesium/Workers/GeometryOffsetAttribute-7350d9af.js create mode 100644 web/assets/Cesium/Workers/GeometryPipeline-b49b2e59.js create mode 100644 web/assets/Cesium/Workers/IndexDatatype-53503fee.js create mode 100644 web/assets/Cesium/Workers/IntersectionTests-2626c9e9.js create mode 100644 web/assets/Cesium/Workers/Math-fc8cecf5.js create mode 100644 web/assets/Cesium/Workers/OrientedBoundingBox-c9ad91c4.js create mode 100644 web/assets/Cesium/Workers/Plane-231f1723.js create mode 100644 web/assets/Cesium/Workers/PolygonGeometryLibrary-29b9a52e.js create mode 100644 web/assets/Cesium/Workers/PolygonPipeline-ff364b47.js create mode 100644 web/assets/Cesium/Workers/PolylinePipeline-8a1a1e4f.js create mode 100644 web/assets/Cesium/Workers/PolylineVolumeGeometryLibrary-ec7dce94.js create mode 100644 web/assets/Cesium/Workers/PrimitivePipeline-bde6ab6f.js create mode 100644 web/assets/Cesium/Workers/RectangleGeometryLibrary-341b00f2.js create mode 100644 web/assets/Cesium/Workers/RuntimeError-2109023a.js create mode 100644 web/assets/Cesium/Workers/TerrainEncoding-b34235ca.js create mode 100644 web/assets/Cesium/Workers/Transforms-ec27f304.js create mode 100644 web/assets/Cesium/Workers/VertexFormat-7572c785.js create mode 100644 web/assets/Cesium/Workers/WallGeometryLibrary-cfdc73e3.js create mode 100644 web/assets/Cesium/Workers/WebGLConstants-76bb35d1.js create mode 100644 web/assets/Cesium/Workers/WebMercatorProjection-df58d479.js create mode 100644 web/assets/Cesium/Workers/arrayRemoveDuplicates-ebc732b0.js create mode 100644 web/assets/Cesium/Workers/cesiumWorkerBootstrapper.js create mode 100644 web/assets/Cesium/Workers/combineGeometry.js create mode 100644 web/assets/Cesium/Workers/createBoxGeometry.js create mode 100644 web/assets/Cesium/Workers/createBoxOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createCircleGeometry.js create mode 100644 web/assets/Cesium/Workers/createCircleOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createCoplanarPolygonGeometry.js create mode 100644 web/assets/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createCorridorGeometry.js create mode 100644 web/assets/Cesium/Workers/createCorridorOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createCylinderGeometry.js create mode 100644 web/assets/Cesium/Workers/createCylinderOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createEllipseGeometry.js create mode 100644 web/assets/Cesium/Workers/createEllipseOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createEllipsoidGeometry.js create mode 100644 web/assets/Cesium/Workers/createEllipsoidOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createFrustumGeometry.js create mode 100644 web/assets/Cesium/Workers/createFrustumOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createGeometry.js create mode 100644 web/assets/Cesium/Workers/createGroundPolylineGeometry.js create mode 100644 web/assets/Cesium/Workers/createPlaneGeometry.js create mode 100644 web/assets/Cesium/Workers/createPlaneOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createPolygonGeometry.js create mode 100644 web/assets/Cesium/Workers/createPolygonOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createPolylineGeometry.js create mode 100644 web/assets/Cesium/Workers/createPolylineVolumeGeometry.js create mode 100644 web/assets/Cesium/Workers/createPolylineVolumeOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createRectangleGeometry.js create mode 100644 web/assets/Cesium/Workers/createRectangleOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createSimplePolylineGeometry.js create mode 100644 web/assets/Cesium/Workers/createSphereGeometry.js create mode 100644 web/assets/Cesium/Workers/createSphereOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/createTaskProcessorWorker.js create mode 100644 web/assets/Cesium/Workers/createVectorTileGeometries.js create mode 100644 web/assets/Cesium/Workers/createVectorTilePoints.js create mode 100644 web/assets/Cesium/Workers/createVectorTilePolygons.js create mode 100644 web/assets/Cesium/Workers/createVectorTilePolylines.js create mode 100644 web/assets/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js create mode 100644 web/assets/Cesium/Workers/createVerticesFromHeightmap.js create mode 100644 web/assets/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js create mode 100644 web/assets/Cesium/Workers/createWallGeometry.js create mode 100644 web/assets/Cesium/Workers/createWallOutlineGeometry.js create mode 100644 web/assets/Cesium/Workers/decodeDraco.js create mode 100644 web/assets/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js create mode 100644 web/assets/Cesium/Workers/transcodeCRNToDXT.js create mode 100644 web/assets/Cesium/Workers/transferTypedArrayTest.js create mode 100644 web/assets/Cesium/Workers/upsampleQuantizedTerrainMesh.js create mode 100644 web/assets/Cesium/Workers/when-54c2dc71.js delete mode 100644 web/src/gis/BasicWorldWindowController.js delete mode 100644 web/src/gis/README.md delete mode 100644 web/src/gis/WorldWind.js delete mode 100644 web/src/gis/WorldWindow.js delete mode 100644 web/src/gis/WorldWindowController.js delete mode 100644 web/src/gis/cache/GpuResourceCache.js delete mode 100644 web/src/gis/cache/MemoryCache.js delete mode 100644 web/src/gis/cache/MemoryCacheListener.js delete mode 100644 web/src/gis/error/AbstractError.js delete mode 100644 web/src/gis/error/ArgumentError.js delete mode 100644 web/src/gis/error/NotYetImplementedError.js delete mode 100644 web/src/gis/error/UnsupportedOperationError.js delete mode 100644 web/src/gis/geom/Angle.js delete mode 100644 web/src/gis/geom/BoundingBox.js delete mode 100644 web/src/gis/geom/Frustum.js delete mode 100644 web/src/gis/geom/Line.js delete mode 100644 web/src/gis/geom/Location.js delete mode 100644 web/src/gis/geom/Matrix.js delete mode 100644 web/src/gis/geom/Matrix3.js delete mode 100644 web/src/gis/geom/Plane.js delete mode 100644 web/src/gis/geom/Position.js delete mode 100644 web/src/gis/geom/Rectangle.js delete mode 100644 web/src/gis/geom/Sector.js delete mode 100644 web/src/gis/geom/Vec2.js delete mode 100644 web/src/gis/geom/Vec3.js delete mode 100644 web/src/gis/gesture/ClickRecognizer.js delete mode 100644 web/src/gis/gesture/DragRecognizer.js delete mode 100644 web/src/gis/gesture/GestureRecognizer.js delete mode 100644 web/src/gis/gesture/PanRecognizer.js delete mode 100644 web/src/gis/gesture/PinchRecognizer.js delete mode 100644 web/src/gis/gesture/RotationRecognizer.js delete mode 100644 web/src/gis/gesture/TapRecognizer.js delete mode 100644 web/src/gis/gesture/TiltRecognizer.js delete mode 100644 web/src/gis/gesture/Touch.js delete mode 100644 web/src/gis/globe/ArcgisElevationCoverage.js delete mode 100644 web/src/gis/globe/ArcgisElevationWorker.js delete mode 100644 web/src/gis/globe/AsterV2ElevationCoverage.js delete mode 100644 web/src/gis/globe/EarthElevationModel.js delete mode 100644 web/src/gis/globe/ElevationCoverage.js delete mode 100644 web/src/gis/globe/ElevationImage.js delete mode 100644 web/src/gis/globe/ElevationModel.js delete mode 100644 web/src/gis/globe/GebcoElevationCoverage.js delete mode 100644 web/src/gis/globe/Globe.js delete mode 100644 web/src/gis/globe/Terrain.js delete mode 100644 web/src/gis/globe/TerrainTile.js delete mode 100644 web/src/gis/globe/TerrainTileList.js delete mode 100644 web/src/gis/globe/Tessellator.js delete mode 100644 web/src/gis/globe/TiledElevationCoverage.js delete mode 100644 web/src/gis/globe/UsgsNedElevationCoverage.js delete mode 100644 web/src/gis/globe/UsgsNedHiElevationCoverage.js delete mode 100644 web/src/gis/layer/AtmosphereLayer.js delete mode 100644 web/src/gis/layer/Layer.js delete mode 100644 web/src/gis/layer/MercatorTiledImageLayer.js delete mode 100644 web/src/gis/layer/StarFieldLayer.js delete mode 100644 web/src/gis/layer/TiledImageLayer.js delete mode 100644 web/src/gis/layer/XYZLayer.js delete mode 100644 web/src/gis/navigate/LookAtNavigator.js delete mode 100644 web/src/gis/navigate/Navigator.js delete mode 100644 web/src/gis/pick/PickedObject.js delete mode 100644 web/src/gis/pick/PickedObjectList.js delete mode 100644 web/src/gis/projections/GeographicProjection.js delete mode 100644 web/src/gis/projections/ProjectionWgs84.js delete mode 100644 web/src/gis/render/DrawContext.js delete mode 100644 web/src/gis/render/FramebufferTexture.js delete mode 100644 web/src/gis/render/FramebufferTile.js delete mode 100644 web/src/gis/render/FramebufferTileController.js delete mode 100644 web/src/gis/render/ImageTile.js delete mode 100644 web/src/gis/render/OrderedRenderable.js delete mode 100644 web/src/gis/render/Renderable.js delete mode 100644 web/src/gis/render/ScreenCreditController.js delete mode 100644 web/src/gis/render/SurfaceRenderable.js delete mode 100644 web/src/gis/render/SurfaceTile.js delete mode 100644 web/src/gis/render/SurfaceTileRenderer.js delete mode 100644 web/src/gis/render/TextRenderer.js delete mode 100644 web/src/gis/render/Texture.js delete mode 100644 web/src/gis/render/TextureTile.js delete mode 100644 web/src/gis/shaders/AtmosphereProgram.js delete mode 100644 web/src/gis/shaders/BasicProgram.js delete mode 100644 web/src/gis/shaders/BasicTextureProgram.js delete mode 100644 web/src/gis/shaders/GpuProgram.js delete mode 100644 web/src/gis/shaders/GpuShader.js delete mode 100644 web/src/gis/shaders/GroundProgram.js delete mode 100644 web/src/gis/shaders/SkyProgram.js delete mode 100644 web/src/gis/shaders/StarFieldProgram.js delete mode 100644 web/src/gis/shaders/SurfaceTileRendererProgram.js delete mode 100644 web/src/gis/shaders/glsl/basic_fragment.glsl delete mode 100644 web/src/gis/shaders/glsl/basic_texture_fragment.glsl delete mode 100644 web/src/gis/shaders/glsl/basic_texture_vertex.glsl delete mode 100644 web/src/gis/shaders/glsl/basic_vertex.glsl delete mode 100644 web/src/gis/shaders/glsl/ground_fragment.glsl delete mode 100644 web/src/gis/shaders/glsl/ground_vertex.glsl delete mode 100644 web/src/gis/shaders/glsl/sky_fragment.glsl delete mode 100644 web/src/gis/shaders/glsl/sky_vertex.glsl delete mode 100644 web/src/gis/shaders/glsl/star_field_fragment.glsl delete mode 100644 web/src/gis/shaders/glsl/star_field_vertex.glsl delete mode 100644 web/src/gis/shaders/glsl/surface_tile_fragment.glsl delete mode 100644 web/src/gis/shaders/glsl/surface_tile_vertex.glsl delete mode 100644 web/src/gis/shapes/AbstractMesh.js delete mode 100644 web/src/gis/shapes/AbstractShape.js delete mode 100644 web/src/gis/shapes/Annotation.js delete mode 100644 web/src/gis/shapes/AnnotationAttributes.js delete mode 100644 web/src/gis/shapes/Compass.js delete mode 100644 web/src/gis/shapes/GeographicMesh.js delete mode 100644 web/src/gis/shapes/GeographicText.js delete mode 100644 web/src/gis/shapes/Path.js delete mode 100644 web/src/gis/shapes/Placemark.js delete mode 100644 web/src/gis/shapes/PlacemarkAttributes.js delete mode 100644 web/src/gis/shapes/Polygon.js delete mode 100644 web/src/gis/shapes/ScreenImage.js delete mode 100644 web/src/gis/shapes/ScreenText.js delete mode 100644 web/src/gis/shapes/ShapeAttributes.js delete mode 100644 web/src/gis/shapes/SurfaceCircle.js delete mode 100644 web/src/gis/shapes/SurfaceEllipse.js delete mode 100644 web/src/gis/shapes/SurfaceImage.js delete mode 100644 web/src/gis/shapes/SurfacePolygon.js delete mode 100644 web/src/gis/shapes/SurfacePolyline.js delete mode 100644 web/src/gis/shapes/SurfaceRectangle.js delete mode 100644 web/src/gis/shapes/SurfaceSector.js delete mode 100644 web/src/gis/shapes/SurfaceShape.js delete mode 100644 web/src/gis/shapes/SurfaceShapeTile.js delete mode 100644 web/src/gis/shapes/SurfaceShapeTileBuilder.js delete mode 100644 web/src/gis/shapes/Text.js delete mode 100644 web/src/gis/shapes/TextAttributes.js delete mode 100644 web/src/gis/shapes/TriangleMesh.js delete mode 100644 web/src/gis/util/AbsentResourceList.js delete mode 100644 web/src/gis/util/Color.js delete mode 100644 web/src/gis/util/Font.js delete mode 100644 web/src/gis/util/FrameStatistics.js delete mode 100644 web/src/gis/util/GoToAnimator.js delete mode 100644 web/src/gis/util/HashMap.js delete mode 100644 web/src/gis/util/ImageSource.js delete mode 100644 web/src/gis/util/Insets.js delete mode 100644 web/src/gis/util/Level.js delete mode 100644 web/src/gis/util/LevelSet.js delete mode 100644 web/src/gis/util/Logger.js delete mode 100644 web/src/gis/util/Offset.js delete mode 100644 web/src/gis/util/PolygonSplitter.js delete mode 100644 web/src/gis/util/SunPosition.js delete mode 100644 web/src/gis/util/Tile.js delete mode 100644 web/src/gis/util/TileFactory.js delete mode 100644 web/src/gis/util/UrlBuilder.js delete mode 100644 web/src/gis/util/WWMath.js delete mode 100644 web/src/gis/util/WWUtil.js delete mode 100644 web/src/gis/util/WmsUrlBuilder.js delete mode 100644 web/src/gis/util/libtess.js diff --git a/README.md b/README.md index d92666e0..4f904471 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ English / [中文](README_zh.md)    |    @@ -25,6 +25,7 @@ English / [中文](README_zh.md)    |    $U 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 z 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Images/google_earth_credit.png b/web/assets/Cesium/Assets/Images/google_earth_credit.png new file mode 100644 index 0000000000000000000000000000000000000000..a7622d822d38c661a56b32be271b815691b6df7f GIT binary patch literal 7703 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 Rvh4r>002ovPDHLkV1jBLV0Hii literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Images/ion-credit.png b/web/assets/Cesium/Assets/Images/ion-credit.png new file mode 100644 index 0000000000000000000000000000000000000000..71b7bdf1c993b6a03d5ee7e021a3116173b2fd62 GIT binary patch literal 6028 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

-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
bNZv670eE(ocea|WYJ+=S9<~I+lYlbnY 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%0AGV@2|d;eeu^iq@gYmFr!di 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%0DUz<)3u)Mq?O05Y3|nMn{x%p?;Ula0o30%ZgN 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

tS)XRORWB8Mt2rUnXP5R@#$;Zf?EB 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%0A+}OQql|61ruuq<&g(RD(Wf3__M0>0$sb? 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e63bd63e15e41ae5cc6de1cf5c9d16ce6a3ac48 GIT binary patch literal 14055 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�^LnCJNOiE^|dQAevN1N8_>y7MSL3^S0uzkkUwQ+k)H z?Kg~*G@`El5ZO9O>6%A;_7tCfa@F4meqU}kDTcmjt|LbJg5xzSY;QgnvsT+r>Qp=Rq5=|3NKa1-vHE8V zuGxk;F+o`+YL_Z~E(LlRsOL4%CSRKbEZ=Fu^W08hmrS%2sLz0sN?GbEk1^{^N@4q( zaKvhwSCI5{Okbroit$ra|J{rrE#6hmqWS0oSKnlr*n)t70FpyOWJmvYx8;wtmf#7!~$b-~V)Sby55kTW^=>;-Ehojjp8yTtq>Oxo5Y#a-|71RM9kj0^5_d7qf9Q--=%KLzi*p z9ocbR>`7D%3hh;Ln}!|q&DhSddnl8;#uzeDL0D(?Ep8TT@5;K z7vk6-FDH28qOnrR2JH^#{c()JI88V9?rMsHl9NJ044bdYta-=OB%8k%Q{=#r&if!k z^Ge)@h|!fL-dBq}QDHX^HvI3cT!853CcI2;s=>TgWl8knEdzHN{%kD*m-&O^$4>8; zSL7IGQ>)6t^cyj%9loE-)nw$tz%ndvQ|Ha{hfJcG5ldXHA6U6Ndbu^JE8>*@im0g? zHzdNtw=(~fd+k!6JoYS=NMT0Lj}kifl~1iUYTU@Jht{1>j&g7|S=GO^ttT_GPkADu zHcv`3-Lk_=@tR{1CWK5XP-<#E`h7 zuceLahG|F^D9^>K{(g5LRuF&S&!|KHnq&PSEhkqN$AJkty)C%JSMw*)**3A(ZzWxE0nT{fI5#KymTA!jo`W;;%R! zcW>Lgd!c9F2%d^q!;2_Ut*Ts-%ogYEAX}}#cngNR5fEr_o<>1j)5sz zl|FHot?eYynAh>A2lR5QgMp9nJoVc?0D1A#+p%ibJ+@MyYf0!C zz^R`9q55mh?9QN;rZ_K)BoV=OY-B|Ifv%EB59(B!V~F-i`)n1 zPY9~ytvu&n-Irbjq6?_PelFhH3B9~-$uCS3k&ar8tJ`-4E? zgQlUS0*<1K084rB6G=<#>;%jsKmaDAI7E*sH8y@5MZj+^#&blIEc!14vZBr^G9sn z%DrL1HaM8wnAH0$umb6<{scRCXn~^On;ex=iM({c=C_POSsqIGri@mSqO>8_v&<~T zpVZzPVp)3qmZ86bII#8d{gZx$qn!MzSoh)6NtxD&ihO3ed!V$xG%5e>4#+si&0V=t#1#RJa(Net{;vh{h z1tK^4vqbS#`6-4)`m2rNB7*~$w>pbJmaiaIz`pucvO7}Wzr|cD1>_{NH`$M~N7`F3 zj*4^`D6&`3Bn$e@Z!DvicV$mX;~h;vpS)oWyCv9GZhkbY^NBEHWqaIqNPN`@7wFHN z@A~%>+8QHPULO%TCQ7frQd^YE8>7fm)!!iu(TO=3QZ-qtUw%^T`u1g7uc5olN!hWV zSz-%nz548z9>|i?d}HWogA`+()D-qln=9#|%4Yg<=oh4-*=^GAG+^PIBfVR{2-U z2Uc$#Y>%q)`@%b07vN(cXECuscm7m~E)JDo2=Y;*)W_d`dezjH=vCsfcoVx-KUOUk zbZ>xuQ9xSw^u9;$9>sr^C(FoS%#d>gd53jS%=;PO1*uV3C^??@UnIyfaX7|+Sq7)7 z9di47q#25t%$AYzT~cOHz6{`uM!$^cHBrrk;UVQ?~@O*}D@z0&+I%{NAQL4(bY5U{mrcr4Q`MW`~b~T@dz3Vn*7G$oAo&PZZ zMI;pha*IpF%?w}OmAcGLMKa`^yp5fH2AC>?#QHO98e(v7`-Rvo?^XNW0w1F+?@3fW z0&o_IGN(7)_T(X6{_|561Z`%0@}F>N%*+MP1Fi@>6|$PuADIoQ`#y^c8M3QB(4Ob~ zmD+?HTb$(2qbgZ{hphO6JPfatcNJ1F%BuX|BHd`{WLqf0CLc`@grzmUOl}a6VEZ;= z#fJSlav=SzFaC)#(a>g|mbohK=QS;4v^*s?gcL=?e2P^&@OxzJ6iu{gj}iVl@dqdQ nGEs^3tOoyPaiQ126}_~o(HS23x87XbhQfdK3C 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 N=ZW^Fvg+)|e*opc=PUpK literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..605f63f13ae6f7304fca2ebffa0420afdc3e1f8c GIT binary patch literal 11399 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 M%z23(+5O!A0yWH#b^rhX literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..319458e12a338f54f662f01f8a5966acbb26a891 GIT binary patch literal 10652 zcmbWcbySp382Gz@u!sm!O1B`Xbc29&FDVTR!jdk{5-TF8NT;+&cXvuHy};5fEM3wp z`Qv- z5S;&>c(}ND_)qcifk6CcPY54BC3{9rM*57Dl>7x975Q`8=cJ_6EY!603`|T+T#mJT$0%2EfL`!NGpe{{i5kb-+VC;1LNfDHES89+{36 zkQqwO9~6^?&mvd(hXOSAk5$0h?ek-T=PxL!s9&j(? zYU}D78k;)1x_f#Nef6zKNzpHEL^^MJ~?VY3Jlhd>Fi%ZPae_a1@{xA8z z!TujyBoAEJ57Y7p_#YP*w)aEEA$f$$#D_;Js{^!xk}>lK;gie7WL5ro%pw5#M`7(Y zM(~_f@bAl`|Iq#~vj2BrpZ|Z6{co`U!!-vW#KC%)JRA~$3}C%&bhE@>Iy9pSk(mrc zQK-QM+bogr+<-7IX;9B*BepOB_9qFb`PaWtNBUq|=ssk`SYi3(ndpt^pBu+P*0_)F zT$_e|1#M}$n`b$?x`O{M*S_BzO2@Nh@Torr(88C6PB7@zEk#mSgZ4ac%aw(Bv+&~L zY@V~pE@iXyb3%II$QKNsDAKvZsq^`&xHW0ab37VpZ7Q{R@v!#Zl6-ng}ulBI?xs|DQN5Q!YY~RVhI&p*Ha&BA-BCH4D z&3ZAltquzxpR;W4jyV3Nyiuepx8(|y-OHAm9HDlkdRO%{tWtK>dw@jX=TO{12t6)OrNQ}b+JvH{ z$E_o(MRw)(I5mPz(mk;rd5k6zV3H=UX&v z7R%+bL&}f&BG(zbPXxz44&DQ}r%!TYP0Qa(CxDdbic6~njjtUeg9KEkxd$7Q;fE=| zh*mXZ+@Do$M&@PzEGEUIj!=I<&4=tu^*hnl5%$elRCb^GIa!Fs$3ue9>ARZt`@8&1@O*UE z+^W>ZBJLNbdwTo#voaisP|g71mH828%5~EN`HZg(Wu}Vs8O%iK3hgV`DX2nD&_>j0 zl=39cfWxbf7{V~spinV%c;-+bMYJMXIzO|sNrT6FT5#emm5Y|aJ-`Xfel^7!Q-q(y zNL%BB$j`5*z#MRf7pmlsp6)8Ba3DT_=KR3qQ{h)BRYwUp;Usds_?UKn$H+~(uuKtK z$hC31*Z)c89t)$F;y_r|Q%P?A%B|B)jE_pHRT2*U?qJf%9RkY% z!^<4}^lc(!yhQ3HPlENwWIm3+S)Zr92XIbCQ0UW)dX|`ogf(M5p`u7{>?_soVeDsh zk;F2(5TTb7ENXMiAi=su>|O>Yz?Ntbh1@kogD zJ9Bk6KT!HwXh=p~VZP@L=LtWWT-(DCxft|9^^s!38cfW;C7_2ES=HU|jATNTzfPch z4anE&B2*N9&WmCd?O9f?u@xx>YSY{}py3{`&81*dF#3?v?f}zTupap`lS#Ut%!d$?VG==v(Q~G2xW{;2-AZnjJ#cA(9B5qvHFCj zxcU1*;6TL_r}XW7_qmLMKM^l$$ME}^ z6Ig9rDErO|7vsZ2ainY429qU}dsx3>tor8rrHbCwSw*&-zw@~xP}nR2;+qE%nF3RACsDL6sKE0Mu1pzbaRZOCpd^V;cg zLnOXSfWw|cs^&tPfBsy|=f_=Soso-0DwNE0KPmgAZ+FCLdRd`GEq}516d0l}3NZAur-SPIRgD7RXBG=;m4KXw~BlwoW(WsF4Zbb zzBTG7X1o#TikPbv(r1{fr;)a_0e5U8?*Zo3RDRRDqO?-tls=s)Rke3c|JX&ug!|YA z8BK8_?*Su)Rnf3O3eQ#tyhAgd$NW4kp0v90&VX0Qsh>l$Ynh$7+5)!@YA>UfO1s4l z9I6Tz2cZV5=IM^g$yMW@$k-*l^QtPT4tFDK&;a+VFu%Shbj7GvhY$LEaobTaKsZhV zS!8F%AyN`<{DU?EL3PXdUb&nzI8lsF1yiK~iV1RV!1&o^aH8tq^u1ZoNW^i;``^6# z2OK%>VTp0BLXF9k>KUA9&Wd+tR~ZSc&$^3V!khQ_9ZH8fRa9shUm60XBsL;~p|R>C zv*0-W9OZSH{m5`p<}^3=xsY%)Y(h%am}ZG#nzxiUV{)D+DqY^0lou8Shn=@dyYfv9 z!+puH|D>|8oYDc;ETretoA$r`S&)CNnN4x{9MtcMmo8p3$f4Wl-x5OEOXRqDBC4Rt zuV(0R4|qb~i#4DVZ$2<}qbw95X7;b3GQ%q)HQ*L-Xo}Y9XDufSm=Fa{Tp(&an_7xJ z-K8cR*Asqte7)2=W65;7^Bgj=ovEr@@5dkw`ekk%FzOzlNjeJal5cY&Uk?gojGLW8 zHQ#GW_)YXK2m0`Y8BJ_D)B!2bVy1r-d-}kffIghKaJ^9N%0vWCxUPQaxbP{1fWFF$ zeWy{yO9hsU?#QLH6hl~wQw@8#se1Dy_UFJ|dIyQnhR;CAi`S8WHTFDQEmtf>z7{L7 zK3ga3fF4$3r3ly!w#ve)20`YC58v{3!gW$Hrch)@9f%>@84~vgAxB?Q1dL znk0Py;$h{N@>BV!#31rS3$Z^3^TY;l{>EFt^F7}v;SxqQR&Gh8Ol^2kt{Y0~8~7KV z(oaf$#Z0PDl0|L!7CPl9x|x)dBc32dFLqV`eiGf?4*RxAMG^Pm+w@$~uLH`f6Ab8f zlJ%8jfY$bSj=nx_YPkEZ4m$RuGF2a4v7-Q2#O+^2qsU3xP01+u$*y)^w$vMOEL~?x zbmAJ22eGasxabuL5g#UXaSA zn7XX&^Hlg_q^jT+&|&|j52#X#S&`cSL~~NHZrs86UE498+e&M;QBN?>D7F&28}r}x zuG0~YDZU~T_CC32QI{NDUjN;}Z|0(DzTwJt3>|n_7c$;a3SzrqlgD@ZhbfnP0s0*8 z>2!^w?Fi+9FZBqUO%u>D!5NdkEirC>4@>dFX{jwEVS~+jRp-SwK%Ez$anAR={~jQH ziedc@#;h4Uih`9K^^G&|GVsN(pgrhMB%?6aC!<)It9w9%O6lSAovLRo|AGszriEDG#Ig(1)96N9g45epTR#cb zkJen8{OjNOS{l4weux=yZ>ZHvau@RzL&$=-f7IJc5_SG+U@hCT!a{Gf^$KpI%vaUM zXhocN3}b?X2qS7CRR4S|MxrB@{qF!eZhQLCG1_TYle5-NI5pu{6S(;7>kRTe*25(D zAmv?*UNMzayI}6x(K&OD!ReiKEM;ZBbml+m3Nj#z%s=V~H%;HQqe6t#+aCKE!o)X^ z8Isu2W^`(7;p*DW)jdxs`?rYK4P=cqTOFE@1){nqd*5?8(dc|c~74Ld_tpGU!W);P_fCZyud-d zVL&l5wTklKm4qJ|CfI1{QRJ$WxT3}%)nZ|BbXwG|nQ#JR)8Pdu`i~)c$?Zv^M0*Tk zyp3JBaL~Zz+U-theEs}fZNpL4X2cqjmMqKrW0w4UZA*r;_EjWDocnJ)D{AzatL&~; z1O=F0)#@_^2q*_+7_YVb!qcL&55#Wc&(&~c`K@}e@op^5iKPrkVQd0rahgx0MH3}t zdxb6?(QCic`cyh2(w^^N!?63oXN~`rb&EG5e=Q}%&y2FwgWq^cAHG;r6y0ke6RDg+kFcK}x-B&f$W~D_Br;d@gA3ws01j1o!Dd%o2 zhIQ6U+|r&b@5Czqs_7^#8y@-7vswZ+_ZExW0GE0H?}9}Lx^Buw{jtr z+IfY##;^8eNO|Yyd{dK`aTwCy zKiA=`L=K4)s}7rdHKYR9k5Xr-mCnp5(`Ur9eK}BLjg#lBP%tG7nEU*fMfh(YNXwKc z{&}prOI+{{6r@Jqhg~_pt++Nbz=3>p=W%A%>gHfpxw$TuU-0NuC`Dl*!dKE=_jlU( zZ+8@4uKv|zjv6?|`xzeKz;s!zo}Uc&14U7@27opzHwl~MV-STL&UO+K%9rc>rRh_B^Vx@O@P&I01+ zbx(=-1`;ctiCJ0E#RvHUQp{V3GEUPkbFcwL(%QJ<_!^UQZ{d?sDOwu8 zs@TvU^fyuMCxvk}CUsp>z^;GdkZnRc%hNEJmdWGT}c&-TwY=5AJl_+Ly_y{h|bwaCe_g)pWq3(90I24lVt||>un8ZX(d2`|Bs-v#na%;Jo3)tKTWzbX? zODm6e^ZBUo5wWJ$uBpcfm)&)Ceq$kT&haX^nR3N11(6c?hU@go2u7*5CdbKfE(sKy zm~uhKjvzky6s;pmNuMsSx zDT>Yq?Y!h(3s8(6v;iR`jdrSjJxWm8&7A&=7cW3Txz#UFYKJc>SLP(|i$t6FM5nYs zuhb63en-#yC@AG7c|Wsrw{tIWnh`~VqGT|x8avw*m2%hN_s{aSw38%ipZbB@=XJ4~ z8e%|ox}BCeP~yxGLHLs$jrLs2lw4;zVeqp?+%S3X51fZK1$i?fnqw(S8fwe5?~ zuCK?ID2{Ve97+@2+V{ZAMVXti7DUK*w^m=3#vPcpp|Q^{@<`bBRw{F3S4 ztC76`m3YAeGl)^R zm99@GqeAGUv|8;14kS}v`lozXMhbN=j^vc6mOL)(<;2!=kO=uAYZS71!%m*7v0xdfKFws^4P$F?)I^jmP15MJ&SgHBqx5H7LnMRHow|I z)Ov{9rnlbxX3E$yaVFeDj#UWM_{H_OpBr7v-kpnS{uD0Qa+GD)Ve=3-RTPSIQZ2ZA8E7342{Q=mEK;lbJj0c?iL>1yL?1;MYs6&} z)UcjRj67w0@U9D%jJGQV%!Vr4#=#&>3!FUh>CM=Dj!E?A$#dzdv@8PexX~3)X9?~4 zn6h#kGOo5U-kSp{m?uSo!C@^;shq|IX(HgJKve&VpwObw3Tz-4?`V=b2wrm(6^}r* zw)ECHvRz5d2T{`b9-1(^4~zYDny;adlBIKmDE%Dauk7lhffiH`d!Ee9Y7%W#AexTC zM&i0KPCYX8;astLxue_qEEC;^g$7Pg!+Su*2Hnf3qhT=*nmiUqCi<3%V`K#;djaVy z5vJenztz2W98k3N7&4>{JEd z`x!#gW24Y#fW_ODC@1mwx1#^=p#d0r<&zu!T`i)k2!n9$5*&aPIC)S4b6w=i6`Ubx zlioX%vRP7%5`3wzw0A-$+Ji+ayW9$tClYt`N`Bp(6&@RVk%6&^#|M)(w?l+Er`oeP zr$s!0_kiP(XEIAdXCF(4%24L{i7R8pkEXuS?DGjGZ-@3SAIWT{gdXfHLB7|2G0C?f zGC31cx>i)D?QXw#uwceX*Rtp9rN==3BVGFwce6X;>pISnsY;QbjUDJKflZA` z;gc4%1KL$8v@Byv>?Z}(t2=Lr=jh^=A2EysZ5w_8Dpukh-nUVkrV`mqj{wTVJ)a> z6x(m^0o66hfVCci6^5UiTkf}R2(#G~BydNbH!?XGN7Km*dU|&5wQ)Y@n|jp!`J*1_#;Rp(x#G`wh8jvD@^k z00{OzVFQ7OAs00VEbhI zj>10HQv%^ctfOVte_`XvK31(=P^kaY6Rl7BCtG6hfJ*Qc-Q$}bv$2@5_{fc)T@gJM zQtp}^OiYG23~M)AcMlu9z<2^niX7oH74|mKn;nnpR#r?9i^X{wT=gx;{(=@4fqF2i zSkY-^Yll6<2^tUrPfEooFY0J#5jwPpBQ5xP5=bW5ZG5b?=3@o zAMXwJ-?)QH|9tmv_^ZCTfx+CF>eQ{CK2x-@B&Ir;5G43g;6xYz8D!?Ty?d8)M2SwJ z-t{#LEBcyu*m~CUv|EUYq(4(z2ATWHfR1Ar%Ajb=6HfYqE%|&xi3aQhvjjEK=Zw!` zrn=nFapCpw@y70`y{q`CBX=sA1~Hs8gVxEtDu%^)WHEYeOI%-hO0-_BHYcX3vd4}~ zBn#SP90vZd<^m@KePbQ@8&w7cac==7Gu6QuP;Do)RWGxEeM>Z3c1O{0eFSTh0hX4l zgvXBtw)(80J2LTpwz0Gc+7`I-YA`*LV#AIhv|*Y3os;!74yv( zJsp2@5Af84n}fn<5=ufB4xf3w{mJnX#KVr!eMuFVgmH(8SbIxx)@sY8<8c zrZ+Ai=2M(I>v&Xaq^1A@XS`{c?2kywx0u7!y*G+IW-}i&I*8+WeMex|)~#Hs|3V_t zV>{|{-w-_hSr8vQ%}OM8A%rlY(4^*hKc+=2wsWc!*_FNH{Y-&%pCShoO>w|#RK4?- zoz*XBF4f!4j*y4Nf(Aw7>#I#kNDpnS$J+8*%P;kmdDbE$9G-Zg62N*sO*FW!c|GL( zDG&r_$X_#u-vh8p3q|xfmgPC-h!eZ(L2peloOc#)S^vo7>VmNVz6weOt7(Usf48;! zFe9+3y?&CGnBZeHai9a+Pv9E#Do#H9T2DbMSDuI9!u&8w9fgZ}P4ek?3OJ9vV4@Vz zx7VF0eJPq3$`aIZzAvjArco>W%0eJg^y(x<h4Cpr>c7(I-+d^lX;ZtagvCKlb05C>;kvFkltxr*1zv#sO9;~# zdR$cfBxP(?`6iyxZ(=yVz5uvuazRgbMA5(_oa9+UOIl!Rw9?DKbjwnU}bCf4N(QA$B(X{8aefB z`w7pN7Nu0KR?7$TEab5zjH`Osg!eb4KdrH!lzRSye|Mf4rcXML;!gWw6A#__m3i0d z2x-bOR_D_w=qffsM$3$GTYVB4PIH-W2=@{SFEUxF77BlTWX~J*Z)f#t0$I4AW&MT< z>kHk=th zv2iy8&+lZa=EvakjU-$@PPlRP)0RKdw%SV#=t+sq<1YWP!|f488P1cmw4B++fl_eq z-K%9GL>P0uqX6;j-#MzIWGt}}CD-!Sk0A}B<$9M1dHv9wxt*ZSR7Jj~#9sZ%&%lWQ zIOlQJZ~!k!A;>_ITh1Z7kz_?rV=u3)Kyx*Hy*HpZEBnz<@8a#kghtDGk0Yh!-5L8V zSjMx+S9L>Cx@##WluKjpWHhYwWtL`7gcgUYa*ja?sLc22A|#I`GQLEAz*a*rTp#%| z${d#|+{^S9V&u)SKTQArw7AXSg#=V7cF4!r;7PofPF+oQMMLsu1Pvef6JXa&D6^}b zWT!argwQmL9NEyi@JH{Z{119uogwy`0a$XR0u2~vvbi+f8l(puHhb#aqNB% zhzu=DQo1zi|7bIL0P>N$shr0{Ussmo8pnIbI8eN-lGO2-o=?=db?DsgTM(4_CUkm` zxzbKN`;Pu8+oQCz6Qz_F+s&e-qBV5Fl*Xd_j6d96*+diEw2aq%LxgHHLxKw~?E3eu zW#?&a0+fU*^L$>IPEn)`Y9%B<6P*jh?g2jG(Z9i;ur5ub^5c5YaiWUw0Qg z+9$ZKUN5<6b_SWioFdG(e0r{@!xGxTeJ!Z{gY1!&YDF601WcEDE7F)5Smsde@bSAB zm0ZTM2wO`J6_3uAlzMR{_NDpSMx1;Qu`5T0%qWR*;#ELxdQ5fb6zf-ex$wpXAZ=X# z4df}h!G#~|y2p)pbX>`si9r~7y;J8_Fqw1kA^Xum^yOOQ;=4CNitd6C5eKIN=?YI+h!(DOU?o#1yQk6>wHSlQ{+_3)#1Cz5`ptY-kk;FRiB^4$lL${ z1(;yvcs>QaJ~%XwN@Hnr;2xl=F}!V|wrnrXn-g9?XI3+N$3pq^9uPpJ;5KdX#9vHU zqb13pL{o7V2W!7iW~ABbr!Jhda+sSnaW3O!sMM!y7x7x}tNbpLUB7<3%mNcN*UY40 zYg%IYkX}cTJBoug@IvS$^5R{COhH-gx132#I34wmtN~Yq|2QUdFKn3}_efV6B=vHc zZt5M&$q1*?rQg~k4TKW=?1%8oTY}V5ElkqVYg_4|joHztWZ++wCSuHbW^cVo#~qjM ziGB4QrA*)Ctw@J>={!7lze?vGAVp+!3%JVxc^1xH$m?w^#)@f-Ro(+Yue!y0hYXA6 zZ}`X82rk6qkHg(q2$JtS8}0tSCYbrvo4nax(lvx!@hS5KbClMKM3QDN%lCU^5;{=V z#Pmb*G`#UGjfy!515|oo$Q!QA$EiBhUEI9BOKgKtE^aca^R@M;QWX$ImR* z4Ijm=t%pZ-wp`654_`OY#s3=%yQt;&kipw(qU&g?AvHC{3Sup7C?5p?%F;>F|H*2L z$8sjk*=dXL!d2atDkYVWjb&nu!%Lc*>QXh=JEf?>C6X5>pFZy*)EBfV8zeB>o`~ah(!;A%!-*2eisnan|*|mkR1Hta=jb zThi_&t@V+k&GC6ZtKT?>6D>(p8KlcyWat;MsV;UZE;xFKxUwLFv1_A?7$l(UJoiRI z&-tuW`&(TCkT_F49DJOovLQ^+A4=CZES9YB&MurjuSPjhxk~E>WJ#=AQ6C*GVyl%W zpm#S$&zB-E$Uc3Xow!=*@;)mX?D25@ z#g~>5R@!m1eNz8xZ}jr-@v=8Vs2jw1^%1M!kC+M19{mK@my`wsQa$>@Zso(wiDFp_ zQZprx(r$i^Im{I{XG>_m#b$WgJ>Z3q5m3{B4QEuZ6FMr_am(50Tw!E7U-^{UdG}B6 z)3+>`erQX^&J4pq3EqcYvOtzFH$=<~*1VvT1PO=6m*@edw=?;43syhe7YHZ9iz)lp zw%j!%{jsHwug?pq-VfRA^SyC3Zy(5Bq|QuMrr+@`&W%o=SC&SQ9~fC4xRw#0=KB$b zN_bnv1TVPjK6wKm4AGQ=U!5*4ztIW0)a@QA4RMcL(5t%wv|I6n5;HzT%Wfeop*}QT zi)(pivVy0L(Xljf%VA0T7JF$E=JK@1bz|2_z_w?rza3-JOG;ywDf4J<$d32(giw5^ zn}V;}{Z#PB!NPF6z`QXOZNY)}` zA1s&7`aPiezxT*<{)MW~`tGO5OI@#pkI=Y7<2H+`yN4e>Qd@YvsWnH?YmtZu)s6a) zW1?L7HN<2g!_j0wXY}=^%0m}b?H7~uquh4*V|dSnaE=614PBOBM>gP;LVUpt9)TWh z#`gg4v+Oi(yNGGxTjK2pm*Yr5=&J6LVK8z>1o(Z$6Xk7!pl{bP+q>ja~vKW#I{>5RM7yAIfzX}rk($!$o` zVFlBr^8KSPqhoL$ncPG3q7g6Bvhr13Ur{PbEFkntQX(FWoyM5%`PfG;jE*W0UUj?!y4^ O(89*{jodQtXa5H+guAo= literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6a3859d6c448595bf674abb88bc3c51c7d083b2 GIT binary patch literal 13142 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 I`Q!5c09|P>?*IS* literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6913a2b087bcaab44d4b1cb2a4cf7e92cea59062 GIT binary patch literal 9643 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df89ed220abff86b7a6ebde048cd6427533a1e68 GIT binary patch literal 15312 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

^0hw>=ycdl0c0`L%NK1XE9zY5 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f27415e273302f8e68b11f041dabc05d323e8f7 GIT binary patch literal 10532 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 CbCZDp literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce2b06ecb08af6d7f0ed5a71aede2e75d7c1da79 GIT binary patch literal 13262 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 Q{d+fdY9K(zemDKU0L;K*x&QzG literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3c0312010a8ff72e5d03f840ec730869f9d7642 GIT binary patch literal 8157 zcmbW5c{G%N`1gmw2qg@S3`1mXvlL?+%hxitv2RI=EF}z4h_Qr{eTg)dVrCGP$P&tu z8HBMV*^;r3CCgaG7(d_N@AoX{`RjR}>pq|Rocr9LbD!&VuIqj7>-{+zJ(>obHZepR z0$5mB0B*+@;AkA64`63I4&c9c4t919&Xb&+AQ0ziZk`h-1x|wn_)qimgU^TxgN2|% z{QPGn&qBpu5)u+%VJR6YacNO;3GshF!otqM!3pBz<>cfQ7vvWd|9_67762b73xEXx zWH|?5^)!Nq;N;nQgVD+>_FdYu0;!13;g zw&*g%C`e!PH+jGfe4>HFD)Z0C$Dn# znyMOHUH=~gLnC9PiH)tDy@R8Zv%AL~PcLtuyFm|vLmoZ~4U2se7oYI-Sz<$6Tz(WnlyT%f-U_@OT0F*w`f$Irw$0K)28W=aiy3 z!FuVht6EP;DqH^*yd5~eB_yTt=lsUMX#Yv}e+L%x|3&sc!TuN57=Q=Ja$Gzh9{>TM z$mArQlf8PqCksYP(#G0X{%E?u9UA3+@Z*Uie@N{g>dhM$g*OL=^YJ{!K1y1O=I&zQ zg;ZL31xe+M_NV;sA9n0kN$`Vji9Wtwpn@M_6zb1P>2(`xMU;Qz_LBL8GRYaeL^W@f zB!J^p^4Q@HGL@Gm3e@mGlZ7SIco5E*1$v({JXD+N|60ZIlHr>YE=3D2&?k6RZJESL zD^fT5Q2r4ifZu455sAWi4#Wv>6cAA zMZsie0FqBvUdm9*VhU}>O(l&~aLBxg(m5!)o!5cxTv}AlyP%N{o*uk^C~vm5Z-_YS z;(_kOxt*hcCwPhYUyaly9hRWCA-Gj4>W<|Zf0=p`x49&iCw;p_u?Rg9YhpC7 zF;IsCs1*7pDy9XEdPJKzq&iz=_lfx5Ml(uT&l^188MXR}Rs#;=QbP{EXWMjn3g6ZU zrWMa6+a)ge14H|Mho#L$^&!_#aFt5*#86YZv!oajR4SNPRV^nT38w9jFTlkT2y@Q% zhUc*=*!MOC`HDkJ&J2tBn_PdZnazf&9G#p3dr%g+z*u}2?}ph?3> zr$v_=MCf2rgg3Cj09g|Zj#q`b47#(HkRZkW(0EJQO`0V<^cfuUiZBY?Au+$=WLv%|bDRN{(L^G5XEHh#s@^j0V( zV4Ykk#CrJxlwh`%Pt0qegpzC3ZTC8%w9?8|Vnw(bOyp7*ps zUfBjcn$<Tth=H*41A z*EnFI^KC%WaI_I>ZrDbbA}mH}Rud%=WSXz=A=OS2BMgi=C5wPm>|psU$1L_fz0f4o zs!k*xonZuHzBcFd6pTKvr2e2+wJROT$N0X)6qJRNgJE%MP)gla`3IM0PWo&Q#+V6- zx$I*B0owUT0Cl}`hXu>_-&h+n6M|xu{^1Z)g;O-tJ(i^P6z`tm=)ON(-oxQR0j;|u z3K4@jyS|Fh#E5wKp*O2wUxbDi4jH98%hc=_5Jk?!6i)hLLl)(t)?$l<8B4mv6}me| z6yc}TMuxfCsp&|=-1rJ~oO~%@N7I@;9qFO7h)~a&1Ey#G#A(@{=D?ix{_sxkqk^A< zz0M;z^mcrdptP#Ix<}wiCt;{GfT(07xnzE&qB8%b_Un+s!RPGV9nxJ}iYZNj2>S3q zP2%U;O+ZNBG-d4r4`{&(2@Ldb#L{1n8vQXD5$)uv>Kka;!HX%O_X^}&Yke>E?k&W| zpl0t%^S}Qsg{j6`DqjZQFHAR1Xj97eBG8d(-vq z9iqCW;`)A&-7S~rJ_r+afyNlQgGfx%>4BDm31Cw85;L+U{>oZQTkJa3!o>q%5f(It zEyta(C-n#TjCvwe?lPZX)B%>2jY%GVea6EIiXy^>UTB}{9hD&*0bKK|g}Gba8mA}L zQ)5&8*o{vMFcu*#W6J9&tGp6%?ie+)3Y$$UF?^^tMmQD($X#${iTpA!nZdaU9n0~O3 zx)YR$`JOZzrB36hV23XiR?5b4&T@rtXVVvev|jmDQnT5}K@?wuYf#cGtmTJ~)Rm0$ zt_je@>wY3Dru&7&Y~)gG`sAb4{UP@ZVGeh<_F?F7d4-OKuJEdv{s7KZNfa}t$qbeo zvzXi?K|sQca`8%1w=Sc~`fnM@ravtF2ftMMyO0dz`qu4Y1G6N?mvYh(;Jq$=cF5@| zrEVlTR}I!r8Oed>MfNtd?l*(}_LqN^g$|l%JZ|#E`yg1(Tnd*?IyXY!!iLyV#pNNvbmmORZGo zLby&1zc#{b5H88>iLzV9vrHAdB@?I?b`+|~nM{kedbjcy6yQ`!@k76cl8}ojk3`uO zQ;cOQS)opiSM^X|j27~2$U{@FVo)af|CmGiZ06vrgSqBy=~c0^3m`-h2VTpkvHYz3 z%yYb@Dqaf=8^+o&=G?!%R9ouM3q&qZjYF!)C)Yw%?w%D8R^KUxFW%+3gk+E2x$DAz zXp(-s`#$GCs73SkYnXE*kZgyQ}4b&TLE|>W`V?3#(1W zm&7Xw%_D$`J$HI2PtZVfit(Y(m+Nvep1()%jzocBME0F`Dk*bwSST9x+RO0mj2#r>9p;mP)8 zpCl$FrJ-c94{`Xw1q2&>)d+mS=(r4g$AK8buR(xyW$Ww4x6%wT7lKPfKgUi`qLHIQ zR2rD*Tfl)@uvQwGz^e9uz8Gy6ceRK_TNQje){yz9ssffpVjw@?SM4#*!x_&x*0XF#N2oRbqeP%Cmg90x)0eMXkMidpXb1$V5 zi#$0AA|WZrRuFy2*(|7rGG2h;a%rz}TUo9oeFA8R1)OR0n|aF}CkjEY4;Ie9A3`Lb z;TA&vV*c7$GP}fV`Qe!x8wPD1*xFDA+1U$mZA}ZH8F^J`Q|n6; zMqOWKN|Q3-5gDv1`V5k-(CG%UYQWf-PjHf5=+MJ3+wfMnJxH`wWnxVuRc%e@2tXSY zzJl%>WWQ2tp~`^|hEEof5ICsUx}R2;4Qb?gN_)e~*Z5F;t#ND6wn|ujw}HgA+wVAl zgoZpj6l4go36B%;C+EG$P~mGYE*9$c<)d&S!028AZ4%n%!A@ zbm+sQ=a{1HzB-m`a@<50Q(`ms=+-s9EwzK)i05j(5?#Q82|q!}tCAYIb>E{Wc$lBG zCuF!x5yz|&tH86pjVq+ zB*C{kRL~5m@Koj}k?YK`(^_&owmhUcIkI-v2%D!svg0KPp><8 zxofGoZw+DX&|{1T?b%pNMZKTCmUp9A;WrSEp$|7#b&~(+@Q}}kp^2frm*Gs&FO%jP z(O9?eQwVj7Z_}xBIxJ~P8+$NjvvlZpL+}oXBWnS;=kT5*w}-Hn(XhH3Ck~D>{u50@ z9ENH8uX`;b$eZ{AwF{v7BLH<^H;Sl8Yb|o8$G%{TP-bG}ts0Yp_J&YBa7o~A>Adgt z!Jxv&%m*G!eSV^$kCLa?E+}R$qn))D^R4kiQ-JIwGkiGot}3S5 zpubDAl?1iCuDL_E4JT@^ihMrnz;cLeTiq=={38tUAIyx9@I4mKB8%Y_rBND9C5d!M zSvP`appl!07%qJs)7d-y{>po&#Qg)Y4fstuF}5 zq~T{$wjF_LU@k?&lR_-v$DTlge&{1RA9b=vDV#opynSlTT*JRvTJ{5{T*$!yvOl;4 zWc=a6)?N!s$vwf%wTP2nm(lozrHyou1Yc7pUpu0_^}p=44G z2mv6;Ej(@2q+LK>oy#wjU~T>3glPx3(fh-R0(H-%jlrDz(z3&BDp{*FHI5v&lWfY+ zL~oW{VI1kxMUB#F8|R=z}anmPOH!UCRMYl)qCK z#87eMYK)Kz`O)fq1ehdn>!)O`bOiocXjX|^H~myarXu6WlVr+uNYbxUkyIdaP1f6; z_>dPrEw58WQ!H#5e)YPAD_5&e-q)_X4MOVuxzsBeCePv!X%^tHg&Q^g6J!t0Dp(w5GIFiqfWVqNq7gq6Am{kb{eu4C z47&!GIyCR|MNv|x5-7+lqc;cYQP7@eFWUW}AD3$KX~$~~pGMT#F1n;+Br4a4+CXoY zC8nE?Mac1_axY@ea&nZ65!Ss_zBmy>HgsGP{NE&A^D65#`_PoY-QjdYo#Gb~yEow0 zpzmGm|3!XpNP05fO}j!4Q+@rR((!;a>R=c-bv&o_(DQx|G2rM@VfO6ij$f%FO;4Y@ zBf4uVAD?(Xfj*TGs5ljP4z{-=4=om*jDNRd1itv|GgpBIC@4x{VD$@>`ksI5mhZxz zM~KW8AhAaK%wD3AVn?Y{713gHIx-w>wYqe1_GWeI&a?S;lUuvV@CQFYqUK?OmH^*pV5PI#Qh-W;JE}$;96y;2@_gPMKO`9~Ylqx}1)b z&d0sVdd{jByS9M8*T4FO?>)!Xb(tTx6JTYC!NyeHNB7MC_BN7k@nz4FUP|>KeIM*F z;?O@xHi?H*6^n%USCP!88$y5mp9*a|UyGGWaR^XkbYrG*^-@n+6k#8i z)ic$WTn~3Db)7!E*tq5XcswWfQ9vHlfp=U&(3Vj&@Gu%b*B#g|Gmoufe$(k{Symij2E0JQ}Av?>#5WjbR z&6a9}=a?QSO?4@2~$O2~*}a z98_t(#9wd^YYk`@0*ngCMQ8stA{9{V= zFy9_<5WiKilRg(qRC93fZlsv?#CfIgCCK6mS^VW8qz zamqd8Nbea=lnajl>P%T(bSACh&clzYDbMXK`YLo}Kv!K#(89vk&o{V{Do;MH-`4?A z^WxqK>A&bWFLZ4HF_!RGRz)O=#FOpN1DJEnLn)$!xv6>YY*ES=U+P02*E5zcOKXP( zlPzdMe^T0VdPMV{U%%zzEc>SPo9vrJ!2iDFvwJJZImnN?oz@6CEu=WKI4LfqRjWMn zo}2RH{C|oTzaI{cl9nuZOASL~%rGBY%Xh~rw^Eh2Rp#=9h`(%^S6#>-5;rC$g;-7P zNu@LItPJ!YLToR%vy~;24$4Crr5S(D-LA-hKIBC24;xw5!H&(!7oU=E8eMf+Sg!zT zMi6}{@AoV>wC~A7@Ia{Wjd2*v-X&CHuiemEYDkuU56C?^%bwUp{t|7s;@`+=pIIN3s(e+>A$$ z0QLw?>ovGW{d#M8;~cCFA+ImFt;Q&w<9<=cR9XGK8fk~>aSLNP0t&fC!uH?1b)?Lj?gv@8gmr zx#*Et?T$U}YkZvHd^R}j1$eW(ou?=@%w3n8Rr7-u>DVn6#Ub4@4_y+E0BhKx<@ci( z8}>zH8Uisd@%h@9Opq764s*n9cEjUw-SXJ9Nsmz93XM$3%S*8qn+ujF0<=G#y*RJ* z<7z%Qss~)~QtR&9n)LL~X0RQk|B~5(?fvWw1Ne$DYoYA(H~+}63>Q|4fU()abi0eq zBPt3hak^k)Lj#EWlkEc$pUoZ7mnET)(h;S~bVS>X(a`gDj@)_`cTD^E4aK0~i7OkhR5{-ul*s!X5AW(@)16rw?qJ>eeR0 zhjT^y5b6Q8)Ok!{cYaH(A7ZYE;S->|o0f<*Xe=pwS=@O9@Iif2h(5uc!U;>31@$w7 zRew3W??xTeaN5GM9X5~qaPTv$Ppg6a^K;?Ex0(BSo!Dik(YF`U3zE+P8C5qTS$vqE_J-?@zh8G>3VDk|M7ZQ<$^JJ z>K#^X=pK&KdDKmWM6Z})Ot9Wx>;+Um<~MzPMV`xZ9V!~u>~d^ts^3iAwSY5_D!(Th z75i+rHr3SdmH76LDvdJGYNhvE;GL+?s|Om!?S~}`8(ebun07Ya#=tq-?FmB^Ro@^0 zc6Y6H%>eFuK3!>K@8+69j1kpjWcSrS_rP-znjNsgd`4UQ;h)-X3trZ2vWE65x^K0Y8gH~gLhnm z+;LA%sJeQ-@>7@fmT7=7RN=z{bD#Cyw`va{@AqX>SpV?n=x!^aEq*|95R+y+_IO-J zk%CzDd_P@=2u>)nM&y>-b2jvTEw5BtE=(p)=4Na52878-gk!;BUgNxyNFDU~}yo<_YFEn8E9OMa!G@a`m_C0a7rWu>dT1hsm0g zYGs{t4!QXmz%WMu58Ahifx}klc#(saA=PUukgw3x4MOC()b8k$ zvb=wzd>%K^#xPtrzgbUX!k$M98^VGe{+4WxGecARaFm0#6hxD3y<=)OdCF>k$XO6J qd3YDIceLw6E`HPQp*(A}fdNJ8#j{wnJk6Yc3e*Fiz{l_l= literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3ec3215035c09e69bb908d948cf84ac199f847d GIT binary patch literal 9307 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

B(0oLYLG5>jB|SL<8z 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32c6e5ae28e354be0e2bc54ad06cdd5421087c4f GIT binary patch literal 15862 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c390948178866dcbea9f05c0726c306ef073385 GIT binary patch literal 10657 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 M*_KK>`gZ!i0SZmd6aWAK literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e7abe713796c195cd9b2fdd35bab1a56d93d923 GIT binary patch literal 12456 zcmbWdXHb(*`2HIR5PDHSN@xNiMJ4nW5ctx2?+Aq61Bwv33Mz)sK|0bxN2Ci%HKBv_ z-U39rbm@P7r_P*L=bU?IpEtX+bAM)cXRqDox}CmV2GDA%YN!GT2nYancLi`e2T%qO z6Ws;yf4(Hd#3ZCtq@*AaDJ=yh8P$DS`uq22@7<$+z{X6^2xh!@kA<5B%+A5Z#YNA| z!^gweqr^M3{*ASNLp1(DK_lG1Q8++*PU{~WjN06J0v0096<@DM;qM*yTFxa|gT z000EUciH|=!v9AQ5CVyaNkF7z

(UqMK&i1Or?IyTt{CzX<&VbSiEcEjuuy@wiy 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�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 E1AMk3J^%m! literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eabb83c797f17f2d050def7490a89ec0dadfd923 GIT binary patch literal 8474 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 DwUaJM literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54e6b007638c5635711fd66bf0e865cf2d293713 GIT binary patch literal 12265 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 L57JeI-u?a`tsc*t literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..311241c8d8dd68f5e0c9e6bdd93c92450720fc7d GIT binary patch literal 16477 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 ONjPipD?QNFkN*H+1YbM= literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01a1caf81b392c69579a146845461cb84fa24c72 GIT binary patch literal 10274 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 MtS(79^>69F0GRHO1ONa4 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fbcfa628f1d8b16cb5923858a851722ac939ab2d GIT binary patch literal 11877 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 bIl1ie$J5y!#kB{r>L`lu6K13!ALjlW031w_ literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..334ab2581e88ff5d677a0f9d27b6647242f5d6bb GIT binary patch literal 6636 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebbc3a099b5bbe6d8d22b0e79231e6ccf595a969 GIT binary patch literal 11564 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3a8e97c87b91e3dfd53501aec18385b34ad3f5a GIT binary patch literal 16411 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f730f364ebd0a3db37383a638b4384662f1f733 GIT binary patch literal 12756 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 V@<3z0L8+)r-_^Uk2K+GpKL7*R`uP9= literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75235d6f8763163e1aff35b916422c00cc3a12a2 GIT binary patch literal 9032 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..036d682ec89d85ce8bd3a0aaf645ad008a621850 GIT binary patch literal 12957 zcmbWcbyyT{827tKiU@+B#FC42_fktp3rKe(DP7Vaf{IHmU5iL8jpULN0!xE*EalP& zNGwRd{LXpfy3SwcoO`aBf9APnp3gk@%zb~qb2oRl3V5QftfmaW!NCDo-*14sMSvmz zAMZYJ|2q=k;}Z})CL$svBzp3QbJXZPs%

{${_o=QKd%2c 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 cfdKh!MP6x{SuDa1Bh!zA%^s=Id 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 n!t@hwGU0hTWP&Zid5IhuC%> literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82c2a34aae83ac3608136b3b6faaf132a409dc25 GIT binary patch literal 11859 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 DcH2J` literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml b/web/assets/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml new file mode 100644 index 00000000..d7734cce --- /dev/null +++ b/web/assets/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml @@ -0,0 +1,14 @@ + + + NE2_HR_LC_SR_W_DR_recolored.tif + + EPSG:4326 + + + + + + + + + diff --git a/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg b/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67192282d950d99c8a6e46de20c6e2291295be2b GIT binary patch literal 118775 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 KC|1t+AOG1BP&b$W literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg b/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dfe883b32634e08fef90982bbfe4f75388bdb0b GIT binary patch literal 152501 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 eF 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®J-Y=N_BX>PM&2>Pl*4dvTzM zoh^+F5=|+1_0{z{*9bc{MnEzHo7U(Mk4a<^>PM(jynB_B^h#Y`w2MYjXoYc)@CVC5 F|Jn05A1?p^ literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg b/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ef2363f27a8b6743202502fa4183362e9540def GIT binary patch literal 167980 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�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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg b/web/assets/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8421113e0b4a7a51160372eb19a6f2ab2e35884 GIT binary patch literal 152999 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 UE9TaW1e4Xu)s0izmhVrFn?oG1&1>9)rdqYW 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� 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

    b*&C#e?R-c!Y+IkGbf!#zix}h$ez$2xDZM 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
  1. 1gDa_Mei!z}iDsxNWvxUXUPBWjvR%B0?&YB26}8}w^22-X3p z)tut4rs+oaA<*9nqLGr&qQ4BAhw%8!59Jh|uQ@+s z=NzBXNAh~5MnnSIl!sS9NZAQv`T1IgZlF`>Zs$+L(F{|Ap1kntG&0B+J9#oh!o`yg zLL)Xnex{KO6P8+M&HCPtfvFwNJCQ0!wU zs!?CL894SSf9F-r*9|u1vE;v6_s(W*`aJ`v#Q0WE?yT8v^ z`b1|$aqqz{UYWi|ihB1ul;_(ti>Ie<$q_)FgqH4yRrmonWy7)Od^D-nBWA+{Oxbi? zxz^hiqgJ)qRMWy%ncq`U!QX8ZBwQ1wll-Yh!$B5ARH0!;GPi#FvmO(Kw`?1PrRSWp zmuR2_+V0{`3y++eVNrZ_Bpu_$FM>N;xsikJ{_a-?jrTP@oE7AVX9%$7pRlnP&EwJP z!{*WQUPK_F*8t@`m|M>j%_KS*X!`);Yd5%kiejzv8W4fanQ%(`Wp1mM3B5m=hN(gw zex!eSnSXQ*HUTsQ4P9dG-z{Cev2}dD6eLEOjt-B@t>fnZN0h_NJyXZ{sn1tX-cB|h zHnn{q691wD|E&o)yU&pPr*Lrh&fma;qI3U&y;DZ z60ktfLbaH9pi@sBbzI5c(S5Y4U8`w?NmY5YIp5-YAOU~(M)bi{Ou3oKy+Acm<)S7` zX;6WI;kjq&2m*G~#d6S)Rz|+8iKfQlTH1PIn6?C%TcsT@7lZ!9@Ose$p4rBq)Z6sJ zdFNLie2PsJ6|r9bZX$2t!4eRz{$0FHnRT7A??-dpH?o?;zQ&o<*$B&gvA-FT5A=8zt!|q3mpxv{y@jT5H&*e&DWd)%L;~{k)L~oF zB5li-*}JD_%guS;8(%xwDUYSfp{thjL-a)NV1MDnLd}9w50*-tw))O|yI)@nsck*! zeuLe!_pc;H{+s%PGpX~{E>B9gGOJLd!^;H<;#kYDgz`2ToZ+klEeY4@;dD*GCsIPM zWQNz_`GQ5W+z|gn6$+}?AyeRebxX*kUg5OE{D-2sp88~0^`(Fivd}=E_NZ{IQENdEM93;*;R;+Ju|j-!BCNYl4Q+ri20i@0~hWg?Oo^)uZaPd*;xfB193DM&MXzcKaW3vQiIx+Q_jy&BX4Cyf=yHgIB1 zi)nkAhHk217?CK9#^&kYZy`_Pm}CJhC)B<`2vh1__2SCd$I8e*)5H}8*-WN}2{(

    U+p|UPy^_6=WSVr}?kN_M8tN`>HdZ_u>u!JY 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 M5gp@4I2{N7*#rT|-v9sr literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/airfield.png b/web/assets/Cesium/Assets/Textures/maki/airfield.png new file mode 100644 index 0000000000000000000000000000000000000000..b7746842450337edd3077787e78714d54613eac1 GIT binary patch literal 1188 zcmV;V1Y7%wP)Px#32;bRa{vGi!vFvd!vV){sAK>D1UX4WK~#9!?VU|% z6G0TmYpYchs-mFa(T|IjDoR`F!K%%7VqyXwvbA9B#ioT`gkmnGjXhYUc<|8NiU&pU zQm}fo)QFc}O6koUM8s$z7>ULPHqJtX5VrZ)%naQ@az+f;K z3ZkWn;)!Rk9iYmLaIkN+HPS^L^n8K(!>iva%8(_J*cA9FAZ02o($lH)uaQolXb2 zOTr}pT}Dm$>K&19005xg1b!F**aGOU6fGW)KcWSI_z|dFJ^Z*TMYGv#c`X1Y zCnq1P0Js8`8;}38761g?UzN{uLuCUJaLHxl0k!~;hylPHGoOQMvmdJVXq6^+$uiy*-RJvU`a$|PETS-Sw8od#t)4sql)5LNbn=-jv&Oban z{F>s426=pZ{Ar<3@KJ!#OZvH&r&-Gxt)Zpd6N$tNf-wc3>iHU@kpCo4XP5`44Yc)@$Qa5zC!LpUf zWUe=Q57<)TkB*MMFyeSfJRW~&>feZNK>Utc9aL_tlhK)D^g@Qu*=#mY$9>;c;YNQX z5_!wfp((jWuILs902%Fncs{-6bUL%bEZ)reei;A&000000MG}(^z`%`?=Ca|lfE&v z-^}$N5dfI?-7x|H=oO(JPx#32;bRa{vGi!vFvd!vV){sAK>D1*b_wK~#9!?VMdm zTt^hgHKs8eDTP4OrcEU+lsqJD+LzEaB$RY_vtQa;rKa0jKTvm3mxUs%F9}GYf_)JL zp$YmRk(AbAw-2?(w$g`SMMMy>NPV#hrb`K?Qj4j$b_RCodcF7VxgWDL_ug~iuRh4# zng4I*%{T-_U4&R!7l2;{$E6lEE7r8}BSEEPSxNyGoJSL_OEiy&uVgVvK4!Qxc~xkhRT_rl|nCg9o^IiV4s=6VDJw$0L{(K z-(fE>XYei8+WPbKf--c~VC(Pd>bd~|AU75epl)>4AOMK@RH0DlK87J<=DVck(YZbp zfKnL3g*yYYpP`|lgcbnH%ga|}0Ff00e*l5C8%Y^r3nEO8K2;1E33jxIette79PbGXnrw zopXA)c@>go&JaL$iTVYn8GjUFOe&SC*1Hs)XGz+b$D2q6OCUyMa)5S>7%x>tMaAzL zKor}t)q5b7Z)j-v!A#?&>hA9DbJP(hQjxQe3itK(eZtassivl;nt{FHq*aYS2JP}@ zha0GTKHr9huyn{OalRN@DPq9iJdBsBs;X)QSmvPUt=F%n4eW35cpHWd1Mz4^MjDW zk@@$1D;Y0UI2^tMgy1Wb@jgg_5{bm;RyJO$iHV5_5X42Uah{&fvXk*rt*)-V2Ly4# ztZC)b&{$}-IImZgm6fX+#)mS!#+N|jd`(Twf)k9Fs->mnTOfqXOy={wy}h40(Rit5 zXJqAf5&7#mX%c`~CjE&}?N@S6BZEgy7XQr?0E4 z`xy;}tFyCn2s~v~`=^0{fvae!e#xCz-jkt0ew<;k7mM1Xv>E`>%-^Bghpnxx$(fm% zdNVfV$HvBDB!vDH3We5qf&c>;A0LktU=9AaSS)sHbaXV%Gb>_naIh;HjebL*-(_9r zwY9Yx5PW+t*skGB-C@rx^e}qZou^xu1oUAmrKgkf9-)nc{C<-;0P-PE7<`eJ=(v;42V{Cq(1>ru z_k+1FELC|S-G;nKKa_Req}2~-WcE=`WqMA4>;5sGkijEL2mk>f00e*l5C8%|00;m9 z=*_}ouozd0ZtrjT&lGqy)P=79Z~k#5qo${)8yGG}V^2^!%turHSZ#*e`b@9}^A%6n z(A^_5H^jHLwklO1lwizf(DF4xIE>~qG#@x7xSU|V;($vNv3Mm&IpV?&wU|#c33z9z z*?M4ByD5cr*in*N9+T}LC{>guIEj|8nbBLe2f(Z4Lm}A7{8G`=-)+BWhX4cw;Pra{ z5&2w~-2end?F9wBa)2X%Cq+C8r7{h*-^H$KUw&3rR<1-Mkt9uxXRUZVepBwWiX}4F zSV9mcW!&a#K`xQacf_62oX;fS=1fj+cv%qhPw?{KKUxVkp5=ta761SM07*qoM6N<$ Ef)m}|HUIzs literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/alcohol-shop.png b/web/assets/Cesium/Assets/Textures/maki/alcohol-shop.png new file mode 100644 index 0000000000000000000000000000000000000000..b75a5d9eaa9f28c1903123abfb7e53f381abe74e GIT binary patch literal 1293 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 FV1ko^?Tr8c literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/art-gallery.png b/web/assets/Cesium/Assets/Textures/maki/art-gallery.png new file mode 100644 index 0000000000000000000000000000000000000000..a663512ef383476c5371146562eb372718a0936d GIT binary patch literal 3159 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/bank.png b/web/assets/Cesium/Assets/Textures/maki/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..a67cee06eb706317409be669ca47654565aca264 GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49vEkE{-7;x8BZ;^$1RsIDVa7R8XW;P$JMJ zJa$S#S+K~ZZBf}bRisT8`k0BnVa{K6K|H5Pg7+Z5T4O-?B&pPJrQK4BPUfBFuI5fX z@7Ut5nQbLj zwE=b4IntjL%1$|A`EW`>$g3T%GS}6H%;GTXkK#x=X%DLDzKcZ8bqqtJ7N>`^j zmz`g~&_eX_o(;C~2OcI#>+9&;>2O=TZ{|!%`xnW1dGFGUX6^}EvTbX9_x{igS>_V* z^80V!xbfp++GgG8wbyv29MPYC`s>!^%b#a5GWsRXcdZM_{BL1qR(3ycd;Ri;wu$dv zy{cNbcJrGbSF_kcp7XELynNxpht5Tk-7=n&Hb%VJ=GGK@w&C*6=2thC_5_+d=44?~ zz7?5pQct3Yd7{S?#-m2<+qP{p&*qYlk*V?7c;?{y@B5t@m;@RcdKDbzntlELoxQ!i zUEZm3$K7}5cd@Q$jj)m1f2?%&r;imj@&XMEED8*a91buIcR61JL1?$3M*pv0zw~3e z9z+Si6(FfaVTy=exN=40^@|r3OWVJF`*z)Iwyx_#UI7CGgAXq6doxO%=kxzkWMCAL zW8_%DvUcs-e0O(u=GU#)U)TPR=YH|-om}Mk^8G6xDFGc~;M(x&o1wk^`>V~bx)qq} zLcAQ()1Q0qU4PLdDk^H3ukeDfEw9e*viceM@|uC_9=F32{_j7uRYC6tb%!1nWR#VC3!8XaJU#XK{W;n9R~tG&3EE#Uk9ySpymVO!_+$xbtytlqqd{9MhFa(M5dk2(ICDN~NOzPZjM kb3*nrCvxhYaO#FVdQ&MBb@0JrL$(*X{S~Knx0v0)W;cxF|w$-$6+@4;P?$So8C~z!E%zlK?>W&+mZxaolDU< z-fx}b4eV-*ON+5CRdz7C7Z&S+P>P(8180KrA(?pdV#=vQx8|BxoI8A|yrC~&Si@A( zc1}?an!sl9Dk_CSwq~EfV3Z{^mCCxR%KWH7olg}1o~M?-H>QxmzM0_4 z=P*2wW>>m@gYO|Sy5vVhaX@&NB3Qh5BRwcIv`I@{{l)0?^p3mn{T)M+@9YyAZBI7h z_`0>N?d+AfxR*AzwtR74U*B0viSyIK=;P(uupF1*Y&L# zu#da(JR3I!2@DLJg+xK;SK2dwc_uS7G7<*Jd_vhu*%_lGhlMd%E~yGKl9LcV19#y@lT(2 zgXQLbr95!!>B*Zy&dL`u2_GgVlAS!cb#--TVS;GZk&ms#JZEkK79*vxQ zO;z4P1UsU5Rw4$2Q6wcOYKhF>;5IhuE+kTQ=6S8_>hIPZ-xMHALi9|qj@o+zeq09! zhj=-gJ*gz0Zh$r*t(@6j@+n zZvHk}Qan0}do|8My-hdNJp62#n(%z(3@eEu;ffs>O{gsBp@ySW?YTr536aUzdYxoC~pui4x(wx>6kX=D;Zf-meuQ%9R z)V~NfKI-~mbo6Ttqcw*P>=BKv4u#w$lgVMX;V&gBp6(t+qu7&*F$e9Sv+`a;dmoG7 z_RLyq!dQl@1H7%Pizqc6o7z0oUK5i+RP~~I32YoE!1Y^(S&H6a!X4cix;v`LMlHLg l-Mc}esmip9dtGU8T_^QbC-5%0ym|jn0WWuqTeC}e=6|d!rZfNm literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/baseball.png b/web/assets/Cesium/Assets/Textures/maki/baseball.png new file mode 100644 index 0000000000000000000000000000000000000000..23f344bbfab9618ca1eb6d1390c104547211f9ab GIT binary patch literal 1838 zcmV+}2hsS6P)Px#32;bRa{vGi!vFvd!vV){sAK>D2E$22K~#9!?VWo_ zWK|r;$F*{)WDBF(h~3zww%x7WUQ4(ewUv(Z&>SamOeGb~K&8?me3We=>pBR&(0m|< zsG#K^4U`ZWNSTFFlOQY~x z3{?!G_?zr@RFtv!OG`^Bb8~a9si~=~g@uJwivKx@%IXwl@L7#9DyoOqJJmmu*snQwJ>A;)!r`tK^gIVS^y9$ zDJkgzAUuYuE42R3&dzeJ;%``1R@P@gOn4BL2LR|5f5Xz!(!K^f;V`Pt833{T{QM69 zPdFgD_(_N0EksoRI~w}aI?q&9`G0BoOH1UK&-d7_hkUWb)o_=`-_p2lk+hT z0K_~VPZ0niN<;v${zBB$)YS3WB`zw4sQU&a6Z8#Kjm0mU0sI|f?SMqI2=D30O1kH zkogE4837PTe;vd`Ede1&mXwtAQxJ26TM&X|85tR$2MdA}4|X90$%>1M2YCW;I-TEQ z%}4=4U0vN-o)88G242KvE|($LmLXb3uY2+(gbvIWcBu zXP@B(z~OLwkMZCNgky4IEH5u7^McUY+WNZCl~X?mcPb=oM&}3jiU{F0h5FH|!SP_X za1f*~eLVz$jOAGau-om67!S63LKFm{s;a7)HH6B_%C`~1R!@k8Ak56nWEi-_CDtVB zrL=DhlNcj+ zjDqM8B9!7ndV2a7oRhS@CebfaK87HW4d4tQ_=KO-SMY|Ll)OQ2_MDlS`6&ivon4aN z>CVBy!I!XTr(76{GF&1Zxg83oz|$jU4h%LTO%yk4(E zm~sViZC>JUSW!{YyJ{goXBr7plAf5D$WBg9{$aB)wY9Z1S|ChLPCm=9Tw&iS;s-26 zukS$y3vY#mh41l>3(%G*$#dg&Z0n~LC^0edycP%v2?-Zi%qfR;q9%QTQ!GXc9XK3$Xv)TRtKI@?!)B0U5*H;X)*chc%7^S79?=U)4>d1}&ptX!36PWEZqbxPE zZ3P7d?*pH8G@QhbGNP8_cTd?B+lz~fPt)F~yu7>}fN(5q3v1)!<2gJ5tV2jpnDV5$ zS6f@#Yhew6$MH9`2~(iczqEKEuo;BdJz+V~qE&p7tf|RZ$>u!;2tJ)FutPs4u-w*4 zGUfoEcS4~N>{giW{Fmn5_4V~{h2<)2GD`7(;OXh zG&D543B?4GolABfd6AK1_e;Ou7_xH$DlMA#^GKfXD-DE>j*bcq&;NKxdxApC-(^&z zpe<)BBx~Fo64RIvj8~pO^&{HRQG0uPrA7z`gFQsGD?H#SgFI6ff^;n~NY)^)-V-Wi zi|F+NUR0>XC^9QY1EHy@>5V{3?cHwoIXn|pCj^_#_B#!Po}QjpHpLMyML9*xP32mK zsIyn;6 zf4$}3jp}Ml&QelRzSG(AkD{{l0Jg0&B0Fq!OkLv3OI5~zYXS*L7W1kd?MQYPD#|b) z$ji(7khaf9@%4GZwa}VVx7&RddOs!xTsB^ybxQRJs>cq3MWy&S&gTFjmQsA|^Nk)E cX??ZI|7*Dd*pJ!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1quc4ZA&E978H@y`AgtArdHaeEFp}@-1#IWh*{} z1Xg?$`r8;&e%n4TReM>`t|XU9>=&IKQ>r%lxhioe-Q`jIG9@KZT##AtkX|L%eY5BN^Ru(Rr?uVppX8(WvBKv5t4VXhJQn*2 zx8|&1QlBBeX=jbWeWp!QKT1nWN6$&ww^m_-@ZGgnI!>NE`8sU+rJs|}ZM}Nx*>ml= zHJ+X)<@=9sPAqLb{7_PqWA_@1HzHbdO)_uHl0D;p;{EskL6VdBqE>e zq6f@cm(P@%&zLXpGRHn7@0_L5S^K3)b$5K9sXzJrQ!G^Bjd@Am{w-TdPWB!ZxU1?T6RcGan z!w0@R{rQ&&^Z{P0uDod?1xM*WN>+!M9OGl0z;cbh2oyO#$ z{AS68=QwyD+q&F+|`-i+)(K2t(8R?ZSk4=RRym^yzEiFblcc$Q6Al5E)?U2#3{rmTOF8OJq&Q!Jk*ip&a zD$PTGrcIj`=l5Q};kTBvpzji&;_0r7FPcxCI`#3F)q6!u;=;qf?^?e6xt#CONf-a@ zFPlG2YK6>>d5;284p`rG+Hto1fvJRpU`$xN{1d4wpUWfGuB~VM6h3uUQEOs0D3y7- L`njxgN@xNAi`h+a literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/beer.png b/web/assets/Cesium/Assets/Textures/maki/beer.png new file mode 100644 index 0000000000000000000000000000000000000000..a15cf99119df13c3f50968f637e6df3170134342 GIT binary patch literal 1403 zcmV->1%&#EP)Px#32;bRa{vGi!vFvd!vV){sAK>D1rSL@K~#9!?VVdl zltC27*X&}Z(M?T5iry-^5SG1^L3?+#%vDpe+{M5mkZ4gN5)75dkbDu$$`|v=hm>%; z;6qO)A{Lq9qalT135I5vZZr6xjpI7sef;JO{NMJQ@67ql?#!7vGi$LhmbtmP1f(Po zvl1;z3#udz$pccXWXaACg+e>Paq0>AbC1;C4~|n=QhI+hILtr*=)=3nhsVdqv-jA(9dE;Ez!@d~FA0Ni9nd3kw#EJg$Zfv08yP*+!1#nNuK z+dZZxfE2Q#^78V>EQaLf=JqR|3ma6BohM1#OG-+fv$Wgi^Sz?9`;1&elF7>2+S*DP zzlw9J^#uI^EU`N?Gjo`w-8D5e_bJaGkYxy(ipFp;7;ylAwavY~y_YD@Cm3RkhyYZJ z0RR9eZB}9oZC6N9Z_uHjpWQXw18_Q>zvQloAjNXt`!^~{NYDa+jjYh?^$sWq#`bd# zAfB{27z~!MwAbVDeA5EJak9eF($Z%v2KoK|AjKdj=Kzk8Hdj?uJz!~Xetv#8WfkKvo|Lv=RHe%F(?XvBT4~8iM}eTZ~-z=lU@M;bewhr z00000NZIZ7DHfxqr>8Slv-5E<$p~OpO8|DV;`H?N?~nnpAQYTVPyo2q0+2>lURGB2 z1RTF0G*$gTnSxr?0)x)cyq2UhY8<3*b0#yX$iprX7Y~x~y7LsuR000000Kj|z zGBPs0fb;bOuq0Qey1Kd+oNo;k78btM13&`#g2BPTd;nk#wYRrlrvNyt_GWb?`I3o= ziE{wJ8X6fH$)QBSQECH#U`#^x2hOhGDqjW$U;qFB0DuMnSkDWXRSt(^N>2bO5DWaT z;^N{L6aWt0vc@_)JFkiips}&>HU+>wtrAzG73`UsQawFAmnl=wtz4#Vi!uNs0P6vO z*=9fhfMWo5yZtu+&<}u$rop5 zXMchiK&R_?(2G*Zmj?m?q0S57;8XV)Al!KYG$j)%N2s>8wp#Tw!4iIg)`~t5FLNFs z&d?L(Fat99NIw7o0Ad5M*=*B-0GQkY$V02qjuU51VU0HVx*00000004kf0A8>6BW%Rz2Vlv*Kz)7v zU6bbm1q~0v76I5!8q?q3f6>eU@GZK!=K{gLK=?cGG)+gBGY+`j?jL4!K9@HEE4}J* zwfBA=0L0Ra!p54(`S=R^Wjb5D#pn|5-c6i8iBA&ZEP~Z0pU?MtU|^siT>C7%6f^#H z;Yz~yXK(`m8M96>0GlnmmF50_#e_Y7y@lt3j67sg=clUetAEZ&&<#%~#s~la002ov JPDHLkV1oGCVwV5_ literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/bicycle.png b/web/assets/Cesium/Assets/Textures/maki/bicycle.png new file mode 100644 index 0000000000000000000000000000000000000000..fb871be483a439271a6a9ec1123dcd82729f1ce8 GIT binary patch literal 3989 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/building.png b/web/assets/Cesium/Assets/Textures/maki/building.png new file mode 100644 index 0000000000000000000000000000000000000000..885f1128a60dd5382036528c43f8fde8a1a432d9 GIT binary patch literal 1765 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 UyCZWW6#xJL07*qoM6N<$g0*?N_5c6? literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/camera.png b/web/assets/Cesium/Assets/Textures/maki/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54e12a21c131a7d455fc6735e0b48356b0d1be GIT binary patch literal 1976 zcmV;p2S@mcP)Px#32;bRa{vGi!vFvd!vV){sAK>D2Te&tK~#9!?Oh8@ z990yhAL~Cx>L;nS(U>$Q8f~nfCMNX@?7s-REG#q#Xjv8#@B=Lgh!)!NiM657)Gwha zrXXsIO)F7Cup%a!U=gXL4F*F|6h%=hN?Cj-F3mEX-FdUjEDUpRaISKo@idAR&sCWBEdK`Z89y+ZZ0_+I{Nzhl9H2?JENkaybRMyBPAu}Q`itG``U%({A*-5{-U-OH^g)-k+AWw z|8)}+6E?fu{*4-r_lLvb=p7#)kM*~WvPhLToX)?N70RGM`+8Rp8&?S1{_^tjO0}Io z1K1Ll7iC%q&c7^ByBrFbu3G{$Kas+7Q&Ush!bLz@TH41V<&B(=fzR~}cQD+`utC@? z0F#rG*4oC;Y;o5GW{K?ECx=O!g3eGx7K zU`wQ|8v~S83isn_M~8&@Zv~IzmtZvL8*K)y!DyFRZQ-h!X0!R{BS((pg!;53CMJFv zE&^anrEaZ}`Si;Me~oTm8GFwxP`ks%-<8c)E3{s&uI zTQk*)x9A<)wrzV&_!LA4<2w8H?JFi{sROs$eOQu!nwpvta+W$kFOUcz0*C-2fCx|) zY|QeP)9L&wFE8(HHt4B1aNxl6M~@!$w6wHj<2#PwH$-gbb9}Sd2=KD;N`Gl->F)mi z{zTq5%$YN161Q*P{tB)QcXxZy5U^>}rop{?_r8evh)@G!xE4B~iwNMy`RwfMcSc7? z(4BcwKA2dsV!C?6F;K75>sU4@UudmN%w*DXj zW(TqU*}s2(QMfYVU<+YnA|OZrOKmWluM+{j>A^rVN@@Z&)tCm=6ai=k5E_^3xTdD2 zJUlfXkLO(gwHe3c5_#;{u`D!yx+NeZBjZCkj^DX+XQkC@JsTt|; zDcupUb?eqQc%0*QyWbDhMpjnVdptG@3JTuT9RZDvjk!F{!(3jH?Apm73o|YNFL0%r zAx#i~aKO;ekb|T4A68?IR*2!@VY^Zx3QZ7Tv)P8EqMZ0WSdT}JEuLNx&eIJ6>;-&E z${|RXM4pWjVGf=i5jq9BApo;hQVuzB;zT+-cS;F+ot>R&Qua_L-4K9vT2c<_?(R-e zC}1`fU}4@YurhtE8v>Bb%G3Wh8jZir)fUq+#xovZWg5^80Vb2_cb*xq&6_uWGFMyB z!9%veU>MiaIKYcGUdl1m)zvS})fVQ2rR=n~w?C!SbfsnnVr6AzFY^T8un=%A3o&>` z!pOSN-AI@<4IMnrLArM+?*i7$jiF}q*ifRW(;NXvv_k$4kAoT-8lE+q&7-`!aW1am z(apvi2}+DNG&vu@8;}Fgm-p=>5o~NQ#m@PRr{AweAWm}xpr#@YBWD(?v9a+P;1n?cl@S7Z6h(}?4v##fakuWu1`vv)uwe&qHk5~JUl$PQLWHO^iqPFv~sfd~@L^Yio3ddmOxtcX!?d7?e&yGf~MvZp@bTZu| zlpW2Pu!U|VZ)%BDN{h$iX;v#2bWyL6VSV&puw_nfZ?8+P<8ckHg$`OFqresb7~vKb z71d&07;3fuoHD-S7}kpw7Z=yKT&^xPx|p;|(l4t5BUqcw_C0{_3uWUGTBb?_5CKF0 z5ujgWW@fgC5wKA>!9mVa2f4Yq4Ppe`=YL>iWF+2XGW|*pQ$E?CuCA^?xR*8vxK+ps z`pe`nWr4AZNY3j6Gn-`_#WrSDaz0egH6IiE0W!XCp4l+_PO%|7qL0{391GnD@=;P! zQXOcim2dObr89ent`OUto1hwu7wyQ-4qVCbC^;uA&R-SiuR|{NZC7t5N2&G~S&=;d z;j$9@-uwQrfykH}Vtifw)$}KEBqSsxBqSsxBqSsxBqSvBEdK%j+k|KG;WoVh0000< KMNUMnLSTZ}C8~D- literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/campsite.png b/web/assets/Cesium/Assets/Textures/maki/campsite.png new file mode 100644 index 0000000000000000000000000000000000000000..36e0a92deb342424d23a58fe325c74c07b11deb4 GIT binary patch literal 2411 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 A7XSbN literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/cemetery.png b/web/assets/Cesium/Assets/Textures/maki/cemetery.png new file mode 100644 index 0000000000000000000000000000000000000000..df244fda024b8220e1b9e4dc496c24dedb952efa GIT binary patch literal 967 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/chemist.png b/web/assets/Cesium/Assets/Textures/maki/chemist.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1ea3574940e0d0fb4332518e3393016880bcfe GIT binary patch literal 1603 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/circle-stroked.png b/web/assets/Cesium/Assets/Textures/maki/circle-stroked.png new file mode 100644 index 0000000000000000000000000000000000000000..88689e47fcd3e61645900d6b2f763264df148c45 GIT binary patch literal 2126 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 N002ovPDHLkV1g;=myiGe literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/city.png b/web/assets/Cesium/Assets/Textures/maki/city.png new file mode 100644 index 0000000000000000000000000000000000000000..37d8fad8850f8e449ca94b0848c5d46d3ea7d99a GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-3`{FMT^vIyZoR#0*e&HKa-h(3f{PQ!&K8mI zmSzW!T_WN;PMKuKl-P1abQH)x$hox4E4_5<()$N)ou6<_Yihz&Jy(HslSJ~;{8=}@ zd3F14VS4%d{U4;xOCJATTz3DAXt0**jT>^}PFbcxm8OOlQpDfPC@_kIW)%kb@w zp7!(=56~w-(4)Tl75`U(x^ymu6dV3zF=76uU%?+eE^HGrns(f3)tvM|?;|3N-;TOJ z{Qg_v&3eHL-?nbZ)z14g|M<#_#!LkTN7wv|>%aBf@AhYj?CD-tqWdNnGpN52TNGC> zxOqSK)DuN#ww=}3|8F`gV?p1B+Mvsp(+n6+->)#6U8=hJ+QEc^#nKMnyDVSSUi!Br zclzn4OH16k*lxW3TKB?l&B`Lv7qy;gaX0$azNsleoQohOSzmnroqUqPeep%}yT9#r zeeVfkx*er0s1yG#}1VRO%%mCKZ6E5`U8Qg;0K(kFk#PH4?(Vz)N;R71 z{YzAQdA?hPVe-i*Q9_pty?A{-5c9Juv+M z0UzUyf8xg6fiJ^TFXPK)-mo`e7KnB!@b{p Z{~2!INpjQb4|osK^j!HCg}w literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/clothing-store.png b/web/assets/Cesium/Assets/Textures/maki/clothing-store.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5f8a2b18022fa2455b1c539a72a7e3599687e3 GIT binary patch literal 2037 zcmbW2`9IT-1IOQ+jg977QG^v*nj=lt{~OLIiA=1!Sf z7M8^3C~}{DB-gM|R=z&JeSZGF9*^hi`FQ;WuT&drON6MLC;$KmJkG*y&!m5V3Gekx zLD<#N7UT#&>FDeG^#Ay%W#sXB*WTHl4OZ-5e2nLgVTT-)G) zqU<7g(APa0^(iUpT^*$};$sYpr}64)W&KmNy~uOwOXF1HRQ^(|KTE z;P%480@YweBqb|rw~4`E-16`^YRa+)4YhQ*kl#9ukkpEEdI$1ybD2lTRCmO*iJRL5 zp3{uE@@>|VlkQa$!vEGcAHD@?Z*LbkySfSnc|6{LH7@0jw-f(Uc7ugx{UHT~7m9}A zwc5J6n~9x(xD$O)>+Fydt=`=A6hvC+?ZVQZzP`Tvt(Ec7&!eLhWpl9P;_8`9hy61M zaq)^#|E4YCu>mEH9A}^Td6vzQW`|nQH-oqz!wueCe0gMc$r`o0yIYZm1WS`9>LW{{ z{?JQ%b2DgKSSU zg=dd&w+|dRP?I=wLT*QiKp;#^5&u%OlS^vtc8L5_Y5#N`8*2&I(a|xM%9bqai0=6O zcvUMjDD!yRt(R}P78b;m+QWYWLVa&n|>pX{IOYX%1t zKlBzXEiGj=`k-bZyT-R?EJ{#;4fiT^1-@Btlc%&N>Ub(Sb-R`tp;kEDwm5hn2rh4A z1`e2e1Rv~3mqmWq{zCHVmQ zyztm(Wo2bRv=p)QZ+pG6zO%#q{dPyYluQlWE^;SPU2ZEQFBW$qbeX5G1%2>)5eq+c z1*YYG@cy(34Mr@tj?>lEb$~^`L#E-2jpC52W-&1_!-RGHAq*<`rjJj!8&AbQ#DMaY zEg?guJ;^7Rl@!fqqY%m{_m-eH@);7-$klcZ$C@(i{|AA1UT}Y*tE~k^zREflmTP@lu zd`u59Z0zxhiaQd5VM5Y7blP3I?(-&d!o{ZPt1FXlcdx0ij7)?bYcmi3jJuU0?W+z7so$&n?aVQJIMo;BUm99lB$~4YIkzMtFT2JKJI5};L=N7+;_B63^xGpXC zA2|FZ#axJ{$DFadU~u@hp6-|BO&Qfo;BM7o(L&M}5X0~5XW`Rw`MG>Rzkje=e;?)?U6GYrVK!Ly&#yzFZLY`Y}AdO02(*`Cml|C@69K zOoe_)#h^-So{h8fNc&u7b?5Ws?}Y&HS5HHff}OoR7Z%C1JvG~)f2|EXnOf_ z^s8tE-x>f2suBtY{Pnu)?;juV=M7A3=hAWRemBp=BmhwP?o}S2ol)+G=iLSy21b7n zekF+(O(F~xh7wz4&@O>(^D*-(8Z)Bt<8yo?vA)x7A}t?>`iGDQWA4WTzq;;`3boQJ zv;;6!>f}=f;Ao{Y^#WL8Lm0lJ-mt00&)lh=85-o<0#*SBNXJ7^p#NL(Y>0X;(_O(0 z{D4Z`P0%yvRlmFDt{j29rBpUUp*s&y*M9Cye82cxga?Q5j{&!|a n`7&TH1_(RJwlw`$9%6REODgbgc`LT!-cG literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/college.png b/web/assets/Cesium/Assets/Textures/maki/college.png new file mode 100644 index 0000000000000000000000000000000000000000..102638704ac3a302655240bc8b51071492960438 GIT binary patch literal 2502 zcmV;%2|4zOP)Px#32;bRa{vGi!vFvd!vV){sAK>D30p}-K~#9!?Oh8{ zRAm&#@R3=Tr8y>LS~{7NrDd9BfSeM@I-tA)p|~ z%#3l+&@3{F95KtWEGLV!ED$=MU6|!^@BRN}ciFqU|Cu=h!!UPuzw*OR% zm@r|&gb5QSOqeiX!h{JECQQqknwoBJY-}7x{sQ>~@)6{H1TvNf{#F9|F>+7xDGEM@ z{->8f%KX50A%BDbc2@!3(7ot?pTsN?$e9j&X9DygayJg(<&If0oV>e0(slpb7=gg78A{LVDv;#>p1|ryKVQ@W_44J*ev1|@%J%T^_|4VT_1}ny zh?2_6%Gr!SOeTLAvq~VXJmPy3K+kG{cw;N?!U;!1LI@^;J;#xuv0 z--qBkaxOm-S&JG-_4V~rb8>Q${r&yFB5)g7;2XM^m)FnBmoHyeS6Ao52*fz@dmSba z9J%~WFD@>Q4G9T3Mqu7B26(won>Ov-x^?T)5KKlOz#;CkXW+Z?@C&a?l&x$* zF5iK`w{mcZdGqGIfBg9IFb)neSoa*l)LhZzdqI5 z+xx6ufLGuUzb7Up?!fHi;1K<-p1N8(m$#PdoGBVQAxxBT!5gcOQzI|LAf-t+S z!*coa=g$YupFcm3a`~%v2z(nd7aAIR4QmmTGTaiQjLmc7* zvvUZZT>kp?>(eNgU#+KH-pU*zzqYnE$RrLS)#b;qa``oD)};CP_?&Ze;1xK;AK(xd zFJAO#%!mnXI0XISeyz;L7IS%Pa)@QimaXUD5W{Z@=6RDu*a5D~px~0RebM z{>SX>?ALvLeQN}8=5cp-_qwE{r0rL(T=A8w_z-|0YGvcM$fi!6`lA4`{r!fBh=}4- zr%ugM*#n-tS>MrOx`^76B}+DWdV2mUK;>U@LPA0+l$IQshP8J~S((Lpu{SJSxNs-( zT>-GV`}z6RY}>Xig;BTzJMO1ca2rVOsuhT;s;Zf>v9a$G1N>V6-YWn9B`qy&4VG@L zQO|7lON!(nQj}B!ff~r1IdeY5I_Jp1qX3zZkg$t`0i$Es)7YlVFjnoqq@*Nf=FFMp zw%T+tVS}xw0a(T%3dSj(zU}Usp{`B-gjU-TzGu&#g@J*ApF7B?uPZ7liemupYE}`j zRI(Vw>i>fEVI#8V0H6xYp(W~Kk+vi~{2ubLEa{0oa|o3HU|^0kODBvo5Piv?X9WTr z0vUp>*81b(;`TyU$`OFUR*@gl3%f`<8BO_NVq#*Bt#Ake{;!yrm;&^;@&1E?f=;jk zfM$!e1-MKOar*S>8G7arXfsAdMHS22jJgj%J2^xdKCoVZpF4MM>CvM{Us8I%HWL7Y z{h=EVhd`|)G&J;6YjFtV^5Nm(2U!XSn+t$UGs-;Eo0pgO3Vq0v9oTh)JpJ&20|%mb z-k;3|K+?r<9jrFs5Z_ub5Dl|t%_@gv(wIZvHW>g(TQuI-6Yl7tu2``mlQ_f=<}44- zm@(rRhpNr40^lq^54L;v?nGV?z#*0{UAmDt#3d7tB%Qz#$Mc#q0cdq{ao4V0Nj#$!90EDJj6*bH z^WMC9^Aar`PP5~J58N-Ir2KHi0JH=G?@#1WAFk8qbY2!_A4#fWb z`{Pm6GX?l&r_}f}g#c8_0`QZ<02raG+g7AzO{+tFnVFd@%vsyPp>J~^gM~0z4z5(O zZ6!s~SPsYO=C&1i%My}zJ zWMr&VSO(AFbg0$|7(E1_kCJ}K9BZ|?Rm`}WKn={Anwk)$5(sYN0{d1ujx<5HC25F! z^#VRr-#j;IMMXswYCPj|R#sMK8|}YN_JRINA1Em)DaXn)p#gnq2nBe!1*)>RJ3{Sw z$ne^ne$i25W|UehQj#-voHVdv)NCNOS68Ld=3rOd0=rUGElq*v{ZL1&54Xlc0$ zG3u{5YD`Z_PHc0IInDshzlbUR~>T{@9-X6SlWGQCb%0D0DOmmlb%f~RrHgT z)?PfFFkFd)lurZrGln%H4WB4ooZ)Q5?Crsl=gTDOJ)LaDF#V-NAfBubhbwYYQ&ZOh zY=fFmEtV`6@Y2oc1C0S*ArLqxF-&@vS{cGNzt2Y6BZg>vxK=_gv@ch!T9v^AJnm&M z1$dREw1;%B5}rLsx{cl0$<|HM6uHQ+QE1Obh^yAbmo}I-EAGaI#owfne^5kW()C>{83lk!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49xYOE{-7;x8C0M_n2HLbNplE1kTd+-U_8J z1fD9sJ-;%i`dO9PaWg@0GlMr5l7yGJHd?zlaVp9k>b`Mnp?!k-($jjPWn6D2t=TVd zMN#a~f~b(yYwrtNpD{gpzyG-9_V3K{aw6Yq>d$}Q`uyYb{NgB`u4udY_a~ixI?MHz z%PrR}Rb3YKt8d7Q{@$Ck|8CGqUy(a1T<^p-c3Yg>|6-B8?y<>5YiI9|6v^|Sl_;gD1&a7EJ>>78<{%P;nvE#+uS+jPT7#S5Uo@ZodSC^WY`0$I7Ks&2T z^USmPI_2l*&zR9+HTRr<*lN@G{);AWt5t+L(>F(k&(uzApUH6c>8$+CH#dE~_2&^w z^Fj8f>zIrgr``E|`Q?`7^XC6d{Zw65Wfj9zaLK3P+oR^=k3Vvo)Mh#@yzuwZ>H|Iu zYkwSAym;~Tj9-_&eEq7b#a0lTV8}^(=qAtA zlIp!TWvytZOWt*z0~an_(4A`fZQZ(c;#>^&lTSX;ycuO|Z2X*&fuUg*i-d&4j${*8 zGrRfvE14#EsGK`>t?Ou#_)JzqZYE%K!aze5(~o4GNhjTG^p*$tFP-*k_E|F)2Mv*3 z=JxjQr}zHw{jt>PbN$(K=jKgbYiem(IdiMRwI-0}&y0WS{!jMWr(|Yhb4EMK#~ElX z94y$!SQ7jH&DW~LEbNq3ocJ%7an?Kun3+lLn6<(2Pxc#2d-v}7Ui&MPd)K|zoO-^{*v`j)TUdSl zf9GjR5nW)lD=Zl%VXHv5`A3ebv>5!7J&{a=V+UPeZhxYOh&>999Se4jf}V@%;0(N#Fh14nO>G*DEzI z@7)=$vt?6$*Qre|k z)V{Y1W-`n^!Wg~!CCkwneVw(7ZKBvc46gR8gIwn6>gTe~DWM4fpr)u0 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/cricket.png b/web/assets/Cesium/Assets/Textures/maki/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..6642a3af2a8342896188779f3b75939d26565cc0 GIT binary patch literal 1677 zcmV;826Fj{P)Px#32;bRa{vGi!vFvd!vV){sAK>D1|msBK~#9!?VU?( z8$}q$Ln)Owf#3k5Nb~@=3JC-#eS|>jwb$!9iSuw0If)ZXN$kXq6Q4i|haONAqAwc03T7epf2z8j1V(L1c+41h|&TQse=~E9`)w}=S z%>3t@*H%>6bgi$i@2G&w{wtTu?L=`96MH}*drJ3qB(6pfzAzpD#n_g3l~Q=935Nf#^dp<=OdHJ946df392#@zpk$C+d|Vr^|L$Wr`#q*AG)kgQ!@`mZe|hTreMXa@kJE-H$BvX%bI zVi8tXS8MGOKOeDJ>}3Lk2c>R)!r}0zb^|anW>hmh(gJWod`e@k1^^BO@`RJp8guar zFD@>&ISoLMuCA`vrSk+-x^6A?!d|a;g$IQ0?(SC!5R|Q0`tQfRu%>Ch@qp0V+k2V- zp+>6FPm~K>-~{0e;kl}$f}kkMDtLmV5IQ?M-;&J}0-|{WO4eSI4Fa|%1OkCyIYD?) zs$`7>0d-OT63`Q*gYY*G2$4wSoK#~+q&1+tJi(wQ$mI#>TH*o0U?^LzWKC7oi=1l0 z8&a)1644V{TU$SrYL3~!6P9^E=;-Kpn*hNpRk9Wg27lxJ@5@5q*{2{*kdqbHDz`4SHZ4Gj%n5g_=sA_P@5 zPcRro-I5SA!iMi}z?daX)<`u$I%DRw+G0z40xCt>VkhH#a+29qz<)wMAoN z*EKr}3kzMk$(6A)@~Y6q-~j>iJhzJ|{yww&3Jj|I{}Bp>oQ80@)N{D1^wYj9g0w~h z!O3NilarH&N<4#KMDcgC*k`P1+V7MQe&W^q=sQYXQTm66ho5BF=57kqY<Q~Bre2WG+c=sA0L0*LerziT?W64g%A#hKf#UhjE;_uw)6~(-;tF856T9)$wdXB+j zqMtV6@%U*P2<`3dq|;k8Ar09?+-%~v6$TJaF)-#D-ln|EV#(ib;kP|jAtVxslMFTl zRtwoPGKeZhwNRx5y&w0t{{H?GG!WX_+TIs>2hPS=kx|odw}Xqnt}nW;iU8p_0|;Wy zA3NknI(Q!{1UDEI5^PP-=dBquM@j`;hBXxnf%f|eq+tvAV3BnQ$7mq5w6uIA)vint zA?O)60fGuDTgYWnsnoNS$=bUB!9EB_862Sl-%qpB92I{%ld#bDV*-RbKxGRxA)QV? zO#?w+yPx#32;bRa{vGi!vFvd!vV){sAK>D2K7lqK~#9!?OokV z9Y++uiMCIPdQBnFQYd{%G&iQu_n5>h)Yg`^Nlm{V+HlpYR%x4-)_%PN`Xu6u;s*+f zTBTUyjr|Kmd=x|k5d={LL9qBFk$5{(YLI33%*>uSv%9l*VP5v$JG=WkbI$Ml&di-n zBqWb~K3~dOS)y->c{0?(s@ zB2H;hhv!tmKht?>%tn36FIL({eq4>fp7RYXR?6V7t*w2sy1M%5(b3U+0wa{gdE_4) z9DJ~{vhvyb`ufMx;fS5M?DfUEy1IYT>2%)Nj*pMu1uk&OQt&Iho_TqB`Exg%8X6jw zg~aUj1-A~*w$07W`+yP3Ed&3W*R%HZ_5BLrR9jnn42B}N57>{MiVPq!f-RiDp5=yL z@I{`$JAc`Ea({pSLzzxb+wSh}JzI?cfj>Px{f!DvUIwUkp6u-G98l?4WQ3@OBPi_5 z&d#>0V&q25Jf%uIPiC{($Euz4wzakOkuAgw5$@2?P^TY!coymA0Tr^0F4HzPHtt6~ zMTJt$-rnBd{9@yl!h4di-;0PmA?%z0i7dY(ALIZp11v2qeSx{y_V)I@sCfcZRPz(_ zMc_X-00ZO}g~b^$-;D|}v-_#kmF*}bD6a}j5m+NIozM_=BS7HG=J|fIL+4GDQ@NkO z2qgi7e}f8quBU)7T&$G$&d<-cQjLV5h#4Z>$;ruwnCIQw+q>&)&_P5rIy(A2p%Ic% z7Fi0S^dc%I4h|0fgt@t$ot?nN8YHqtMn-<1dOjsjXFs??Ig?z_l3d{)(8;z0|Ns;M=Gm>hg%v^0u*+zgewR;<&;@OWfa63M7Y>2 z&Lnp!bHdoz*mps@HI!;nCJtI-K1NAW##WJ7gG3f~{CvlTsjhpJfG4Cb8~ZFVZiI^>iXSkk!2zrVU0i}vPu%R z9h73tdXZ%!MeXnJ|HTCOkri1c#2U6_Y`w@b;R)CRp7kQj1SepZgh#fj8KzP;R;vMB>?~W|D03f^&LjcvsN2{Qe^QNF#v!n2l3Yg6po5R2|hOL2ne^* z<9==d+0hfLh#7jr29|L7(iGrfuL|z#Cg2H_V(q-uA`2S%DxT2V+By?yPM{Q7(8zbj ze2M$4q4ETQSUXQS@{?4AD~S0ipM&L&HJkv6EG*$d*^VgYOBkU#^4U>PA`1(?j1fXF z)&dk+Db3tW-Ajrg;fS8N55^fM8OJg_$gXfcMVX8>pfHpa0D$Xu{QD1S*~I{C{a~AM!W;5E5=G z5yFGr*KO0p>}deZ#rPf&VIy2k#EeN%pSc=Oc;Om^;C;rlj-EEC~KhL}ZZ=oM8XEG{m7X$#@%FhX~C z_al$jnLm}Px#32;bRa{vGi!vFvd!vV){sAK>D20TebK~#9!?VW2# zWMvq~H`=ybqK$1SqbMlY4^r&55k$4yhn(Zwbn-UqCCy6-V>noO$tco3Xw;Vk8Awu+ zL{rz5{2-B-7?fF;CUD}LP5P)%z9bcOBg?0h*AiM*QVgM)*$DxdYCn&!nnuO|BD z=4K#0Jv~Z1rsWuhI9>hA%gaGM;q?FzzX?^f34lg?@SdKYdX?`#imK9!pO!4(+}zw# zv;YEuz!eNb_5iq(#jC8W9HRxG6^6)=_8L^zV)!X4D*D0%s1gTWyzVaaP8zpFWJMo9(>0D<> z8?JL408-ZHta1qA9rhaJGPrr(=tn9PR5SiGpcY^+sqj9 z>8=3C0zevdvrd~*D6Vv~ex7D$4uHWy0>*Xkx@S*XuLuB;-lS5`g`|!j)5_H0;P)l| zGRVJgh~H2Aq8#cJ1|Tytb44o*k-w*{cA~$({{>?2jgOC4i4-ra$#7pVYf!VqNIl$MrG@~GQjyVSqBx|&;2QSlMax@Tu+OB@Rze#ON^I@C$7%%4To zCmq22{Cu$<1knIQyL13mNM;85tRWQk3&wb8~Zh;`c(K&}EUL=j7ykx3#sEmDq;r>gr2+7lb1K7=~%b`*fTyu1ay2E$_8%*@QwEEmuwCMKR$6y-0Yw!uhDBguq|O98-g zb<~Q(@^$j^gw~*L|Yh-QA6j9tF_?XlrYG%TD>z)6->kHsfLO&~6`ldwXAWEP$b*p|FTe z8o%HF6Ag^X$;oGOb928vu*=bAe+7X+V2Q)MXFBni%p1gLmMIP;05ebV#SIxw_W=aJ z*@MC0*9HJ~5P-yAK`0cuga9xMaRXrc>FF#Swj#{}fQLiD(2~qZmt}3n!#3&Y=;(7W z%(V(2%?Tq9=zt!8-C-gea)lYG+GpTp67b+ap6w*%Z??C$zpmBJ;o;%1*Xv!Q2B5Vb zB;$%Q+TS%Zi;YAgudv)gwKAiIM0EgW2>|UoWLWyz+FA~eMYE=+rgzM?1vb**B}S~; z0q0`X_L_GASbmEVONXNzyjL+{$g6c;X=-Y!Quvmn-oAj*d&GFS#mqxXogWw&V6|%M zW&z;jKHAIx(Qi%4_PkqQ{g6U?uS$w*su>u29$>}dU6LF;1s+2{{@w{M8l_C`KFy&W zkL%?&tF+-ZNYd6R?}ApM@(Bm+ou=E&a)+ervo`aIk1}|?!6|sR+U`??sUBls_I<)m x6JPC-15hSK-M8Q)T+qCP)Px#32;bRa{vGi!vFvd!vV){sAK>D2@**}K~#9!?Oh8{ zRYe#E0kgE{lombB(#$j;nVM;3JT8|D7kMi0N0%tLW5A5OdT0m~Oh_|oU|~&z2F{2M zIvAJ{Lk#0sS&UJnQIt_m)Fj44A<+KKy+wDG<=al(8Xvu z5{9Q6VR3EuX9T=0>CpFl+^GMj@oVe^ye&QM>cIQbf_MD*anqhXd-7gFPi<{&{;^}n z(rMd5qv1|h1Rs04DK9TC4Gj(b*3Zvx0+$R1!@$<9TdPQ>C07Dp7LcBvo{c)4?ji~3 zV&w1dKho0D@+9VHnBvR}t+yNiCr+G5LZFSS0lWZ>@7=pM2SX6kT@rkxsiTa5x1}+R zkubxV!1t8uY*|^^%XR|(f0UJ#)gU7TAE%%5!@|P8b_DoV((CoV$OyrcckuOMol|R( zRe>%^34v$u@8SS_tEDt5F$xwt)x5uc{rWRn0)NtUG$n4 zQ&Zm+5rUp4@O^|jF*-ULqGj-{)YsP+!?kHDrv2cN@*n_k*ti}ALd+jIa^z`F!2gFJ z{=}tO3TZ(h#(4tYN+P4+KJK)im$~1TATGt7Um(P=$z(cA+Ii$5pBWh$3AMHnA0OXA z@_tlQ)TfhqfZs`ZK<|9Ul>jVhMa9$4@bIuv%pM1?m2v^4;)SbdDPnAv(oPQ!4u;D` zDk%V?o({RnpdsewDiMIeVE6$iX_AwZ^On&2k&%(zIPWJUB(&l3bn4Wpc!4%nXmtu& zX3K1Ue}6P?XZP*fmyMf3q|ttxqz^Su;OA&{1gy4Ywz;|aDcsI>c6O%NLjbVG;PO;e zRaMN*LabB(H8nLwN(3<3YLX%no?J=*au$r0j7DR>(EEXbfxqLt9~2aH!7TvFbwJLF z85$ZgO1_q@=XKx?nb& z>uKK4$jCUjd-v`_^z#rc4=ybLEs$FPZUMLj;1+;e0B!;BB7h~%l8litY1cVzIGU5R zgSQ6>VJbm_ z<&stwS%F3O3J;zi&>q?>7c0W4zCg6p!CQ}M+$(p+5x@$7@{BxCORn3v5RwMLpLaG)6oJTT;FEk;G%R9y@ulKg*7-O+&l`v zvh8X)1tz!9X#E_er;$im4?GC~^<$cphmT1Qs6M<1Xbz780L@hy2Vcc={?VgHGZGUM z+qP`k@+!rMc+|SvQ0VW_radg7?Ck8f#ROmpr94F1w~C625-6c>XlTe*v?d@19ww>B z5v!qBLJ+2aLR&RKHyVw7=gysrlKFNpDX+1yv7I9INnupS;?O!t{{H@d*4NiRqqZ=1 z?b`L6l2L&)vrKKCAV~v(JKB8?!~#GcyGU5i)2eo-q3%;m+iWQ!BBBS=(ewc-jEyV<5 zO8eg1+q;28084HE`TY6w5o#`mkQHMAm>L9pp=qv5&Hh3?tEL1nnNFTOnWzQePoF*= ztA@5K7639q?+{`zH#hf9mUekzVPUl+fQKV5S@sJ}kB3yTf+m-TqlNW1Rt$%PgnTzJ zFc8TSbg<8nmGn8w^k!RI+Y{8z7;Z-r5)#^3YLD0+0a~i7tIK8SWyi$Ce1yBU$$7%w zBputnefx_n1(B4L^u7|{O(s(lOa8WP+x7}!IL5~VGwe##QK%|VVlU(P6d0j|e?u7t zgW*Sp#L4WEl9CFRi*jaWW&?wm z(pt^jw1Jqp(o&X3)QRZm=ucQqGY1YFFxw%b8jJ*Sy`zA?pOoR=-rkKk$!rDD)bBBN zxUixJ?FGC}YoQ6TQ*LR>VIZ7rZ8t3~t(l^oAk{r!)Zo=L-mgxl8)A76j9RHp*o-X` z;~&L6jmyR>zEP>RuO$5_#7$UgJMPJdINDBgeG23iC@TUzNr1ndRNEQH-N$NbY6{c< z9_|xUgQvK-xK4^uF&_u~n{XS1m^jNtH8eD|U+NTH6570Zb1kc@PvBZb0$x@qPDvIQ z7gsXAUTQzh#hkE%U20?CrcImbSn^#^P*9^NB?*ZGsc8oCo-8lXX>4rFq5%G0QYC_E zh~;Gx5fKqzNKH>t*3M#~#fl}f5D=r8W)QE}N+{Ag+YrXfKS2y|>=7Ha{Zk@S~Ptt1BBOld}6M-vo8cK@)W1h7EKIm=>%hWQ7S={+x% z97!)4%PAuxqfu$!L7*f8n66@Z`dDjgtBIoHs~Lw@4-Q68Wd(*2bm2q(ED9KIM zJVX^OTX2a>Zjf*C4K5bp;o)DZR+=d1aGA~KcPM~g=jgaPga}}9C*{4UsOUABJjNy3 z+R#~IFD54^zh|4w?&#=9r2u|`Ml*TyC@KPDY`52fza;U_Ld7N=<^C%@L{&LCW@iRX z*c~V3Ns?YvD^anE=Sz`=u4Peha=;YkrkhgRUBiV2GZlhAjW*FvlnvtIP&;KK!pCxC v4;#%Fk^WUOA6Vw$f)DEVJu=|WlxyQ}7J6F}oa(3200000NkvXXu0mjfGL>@9 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/disability.png b/web/assets/Cesium/Assets/Textures/maki/disability.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc355097788c5fe5252fe1958f04d492b68c279 GIT binary patch literal 3437 zcmV-z4U+PSP)Px#32;bRa{vGi!vFvd!vV){sAK>D4FX9-K~#9!?Oh9S zRA&_i(iE&!()0lptfq*Vfwm9}wG~QvWH*luYeL9_00{^rKtdioBJvCb7?2=u2^170 zNKi;o24oNs5i^J>${>owI4F%WqG%)v4O#rZ=HGhv&$)a5yL;~@+1$*W=?rP^<9z>r z&iT*z&beK>w9_A#%hjDpUnZ|G`681sOl*%HJsQjYJAz3RlL#gs?PC2H_rnzY6jSP} zOyZb0BqW{#^gR39u9gP%*DuyAE?>TU%h97pa~m5QonFjRe@nY^D?dh5;Qjme z$CZ_ptsXyq{I#)T$2K#0M2IUPA>q%(#l_{fZ{HrT0>mdREqk~5t<27qD_1g7Q&WGb zqI6Oi5Pv#$>{u=VKpdR9rEMC3C{bZ2PoB(iI2`qQl(&+GH5mYJF$u9W z?y3B6G1|F$_3A{X{P%oOz5;~*9zJ}yfY=EUmexH17%D1>nVn1iDBmsd@$rAHtE)>9 zu0MwDf^L@P|8M&}4q4l_ZCh@H^4&6b?%adKE_lw;ehUD7MdhTVq`Ye+0I{*LcZta8 zB}@A)0K6pH{^;oFCL;lWY~Q|pnE=3>miAi!cwMQO9Xoa`HCp*9X2@&At+PN20Fg??+_`fnDJCZ7p1}aPDl04V z1pwZ#LZB7^o)c~J)TvWX83};X>8wLWRk+UpOZzQRPzY+fO68n7bt>D)vjFM`gafuJ zWr|%eP*f1&b|aLJoD#A6E%PG)@DZ^P1EpnTWL)q^`KSwAzkWU4$^*%P@EK82_4W11 zQ>IKg>x=S}l9H}hS662d${%WJoAw3Wm~vjD%8`o}Eh?9djNm(F%$V^5m9pd*>+t0r zgvZ6ygt9bQSXj7!+_-UnL|94W{cq2lIrAM<(Y&xDEXOP958m`fHDPu=?a-k^1-o|b z`YH}?mo8nJqCrhTlof7iSAHiv#^mz`@q$LMYdv9URsY#wpb?}jcC9BZjp{T(OliXn zTK$kwmgALQ`A>-HX{Er{!|s=smTp+JYSl)il$Dj0Ubt{!s>6SAybpknu* z7KvF<{)7n=e&uT#V)5d|-yn8DFH74r0B?xO@-+qFmbkdMzu&!kH&M85lx1p|8Nf>9 zalTDVMME}k-n`O?Oz66G>(&xsX}8X*_-;&I@D}B`oo-@cVyzJXOqw+5JaLbwJEMu| z#p7|!xc$V56SJsXkB^MFe~M;^ErQQ=CdGH>rbfEYYt5Q9>y0c&9yoAdo&dn`&J@|G z_IcgBc{2qR6i^YB|GseH!rev!ke{D_Kx|hEdO8ZX^>J#MO!Rj#^YAa28uWZAe?Ncz z{5?hjz(UzycdBrdz1(Lh#p7U9Qc|)BOl2iq#B2cUc6;NkTel_%&oeMsl|O(|eoaly zhFe<+vrF;}ja41qEOa%gfyu7^c1T`_2y-aT^(m`t}`n0?; z)&c=Qa&q!jVsShlEXse9>g`>>e*GG)>}8+;z#^!tt4kH0aZpg4Zuz7V59ODamoH|@ ze;~uz3ojZ3f3Azp$%IShu7!woIAWNDJ6aW}$K=^?k9a;Gw6Jvc8LUiPD9%9ym zIN!l605Il&@B^Rd$N;n=QDtXmS4qa^_qJ@=QbI*dW&yxV;{BlU18nO)BPy<F0+hhZ!GXA(L23gShEa8Nzi&`Xvq*~u2$@TJ8Sp>t+t<{1?l{Lp|9zSvEAiZ{nY`H+KwBYRA7-514>HX$M5 zRyzaX193PUf4O}5@+8Wa1***G5&d8ql@==j3^#9cdeF5ZzED9y!MEEZ0Pe0!ygQLs z>S?z9A0*E8(TaXRs3o@Svjn&vju@dLz-zA{6c-o2P0`?$JKGEZJZ3t8Ca(3MvuDr# zp3Hy@_HUmSUkI!=qxeB4oG0Etc<^8$0m3V00x(i}Gn{I*9u%{G#8skV-a;tG96J;2 z)ys?yl)z7^9P0X*1%O8cgpNh6hg`dM?K;^Gb+xi4h+3S&((XV&5JLC^yD1~|#d*$1 zY-v3pF*x-#jeC%NVTe3%zqq)#JMAq*MRyK0wcYT%k+?c@a&q3$dO#%U^vr1BXN@Se z(<}?L_!-jY>+C(t4ysOW3(v(<5`TH zuzJ~#X3ZM38ZD>HDVI%>sq6O$9ugK_Z+~{d5OHfuMhPxrdO2jIQS?B5h->vB2$@N| z81^JOU`{@W7Oy9hf^iFaoe9T2%IBfsyxY;^fu>KNeq6F~`fpS*gFjGDKb0RsouH92 z$9=V)4fO}YTs*}IXz^mfNYB?jN=r-24EvfBUX+J_KF#=qBU6bq5E=FNWo01oCDxVQ zL4pin05xqQbR6l9-SJ!muo>7jvK{+qNYs-P(|X}Zf5r-66eV$NSNes1GG>X7Hj7mI z=$q`^QOue1R~(_iJC!$lS!{DF*_%gf6~?#D-ogfQ>S)#g z5sJ#kcpL0dSy@@ge9%t-rk+tY6jf5IoXGvbtK#3`L!v5OK@W+ttTB_@@i5eIJygMD zof9F=PN%aLX>2g$aDu*e?OHk#dKhDj)dr9;&Ia`eKE$}cw< zi|Og<)c^u)K%}zqK_Zn&j>fb`@er_8<`J>4QN?tCi5EgD6U`mS;Q6lxZa>XMvy;ZxHO`$PThZVOuf_-mm<%8q} z9+QevBK$DJy(tTz0`dS;IizZg2Aq^xbaJDul%JH8^gFQ?)<|c_Bf>#cvpNr3hnh}X z6pHDjT|_MGuMO8}avl^F6@3fYP_vXTCIgW_LhCF4KIXG+(n&*oh(Wm%uUN5S zb6Q&3MPKNL_?w9nCsrfu#kDjX;TJmH7<*nMiJ)eKQe%qou{BWrP#%OC0WitQ$yXp4 zM~tj1dPx#32;bRa{vGi!vFvd!vV){sAK>D3*SjZK~#9!?OhFU zR96*lOGt}Su+!E``DwAxQrbd)7=%WsEg{(?{Di+GguetBf}tdk@EiU@NT7fO`AdNa z3POZoKwuC>92umUjK&(pSVhuQ6mh61mNqpNvhjY*+s@m&=ic|;?%TI-GxyA#31N2M zJNKM(&pm(l$@Akp24`?C0xx zWdHYdhJ6^uM&a6G*czT-IEY`DhH(s^VxMalDFW|f1Pov}!URGXUx*UMw`277WIy9g zuI+2!MI;FAW0JtTh~40J#xs19(K^h^x-@*+QDWH(J1|TNg3w1@%J?2ZGTw&?j+!F& z!smD*u3x`C?$V`86Mfjw(2zmwf<7)gzq)JoT*}}pSFWV#*M{GTwSCDc!XMzZzqz@2 z6oV`A@$oG_Oixe$HL;k!ZeTv6<1sUgKY8-xoGDYL{DQ6Lj&EJVhYxSwuwlbmLI96A zMSNfW=y#I@?syJydyCB&k-x`6rJ7^cV=f9A}YoN3dh{hTrTwtijsy{xQkBk`RS zCV-AkXn!oP{Y_0xqZz!fCv?Ju3BSF4`}RnV$l(!l+5GAEh!}tN?AcjaSy^W_jc?`f zPHAcBwy-sM)v;509ZroVL6T5r&?jmA~e$@rq|18D8^XJdc$j;6_!!-Oeg7J5m zzk2oRZwtIT#6R~tr9Fwf?H@B{%w;{X|1?h* zwAu{wfk{b8|0yUa_#Wl|6W);hfug8>> zly}stIvKikL?qO1>gm3{5cSeH{@3jICt*cOhNwq z^CAWl!VeHZh7+Ob%mZtnJTq-K*6VlU(xpq^c2WRLAwD271%ra|tq1U0hcrYawzO4T zym;~Ma0Fy#Fh4*4AhBzo2)3l>_n-v}7VM1%0l*Yt$LdRu?EgM>;@vophz!94!2~+7 z0yE@|1|g)SrTs>43Shn*hztHkX#Zf_vZGpUpdlIr09?6peJ`* z=g;3yoEe`^pFaJ^D6?L@dUb-0F7vCwnx6Z4`w!0|+L-S{efk^;G#0Ub-e8cKnfXio zF0mOOw?+GL_%bbNidF$2U4s0OZ#{<&9hwJIgr=-8M({6$(zfka+?X+A#_4Efz7LuC zyr4HlMMXswCQ6QcRx??%3?lSsnc8kaH*oRUP^~Q49PI*t`@DYr`gLaRIG~uKwXi?N zes)HM3%)#Da}C>b7^7i3JE}{5^#It> zYbyc(u3fu!gFpb!xuKo=K|cS3{q53Dfhun*{JY(Gk&R%+Ji3Gfxo$=0^m)F6>WGaUFc3h%JO~sj>=1z9ws|-09>PGYgFxWL z1l#FmYr)*c!?zuO_#$0vriaGp<{>UK5dHJ7>yutu>9eag7GbcKiA@#>00r<6+EnU@ zXZCkh@(s9b*|N9IEG9oc|A6c>a5Jsmq(m-W8xry`bzQ2UpkQAJwSbQZg?KHZ`F~C8 z{0_j>)YSKlZV)0xq0L$l1wBm|_d-OSF&1bG7#5PAp8l>uW0cHs@E$*Yoa$POjg0N&CsW2M!!4l+jP+f*cz^LugpQ zKnoVE{6wZ80)kE2Jwe4 zszoBA`58LY>>x?eJH={$ByaywMilw~xw*MVd11){N&Ve{h{OY!>&YL!$BrF)Q*?Nt z8JDl4O3Z?zS9{8Fg)A29{>zRb+bYEjT8xhd~OYa;QTo=)}s4CBLl7Np!1%t-iPO_rGLGJ&~)7REuD|z@y<7K)@^r9x9DE1%GD>~Y!_f=L_E|uku&~7d=T~$?8^97>?dW7@v9cX2y0+mj_(4qr}KcZdeq z6tjg7m;ei75?V3c$|!@nWy_Xg(f2X?NYb7@)Yf_dHO>naD6`i+bqgwyeFuvo+`LzU zwg0lZG^Y3xoo)eV0YCFjk5i{kJtx@-z3db~9G_dkL?{_E(ZOKWBhlH{&xji*iDuk9 zK0bkVBKaqKUr9;HW}{tzfg-Y93o}IoXm@vkodS4G|L}_!FHS=0S%zpMp>py@-y`~O zJZAcD_}M@3&@gvF_AWRPMm1;b5)4|BJqLm$($$`@b-g)^Lmj3u!H(xx8Z#5j0p}q0 zG@*J%3g-8q^RG>hC0tE^bC{Un4 kfdT~z6ev)jK!FYLf9Bk)G(tW!;s5{u07*qoM6N<$g8FIz6aWAK literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/embassy.png b/web/assets/Cesium/Assets/Textures/maki/embassy.png new file mode 100644 index 0000000000000000000000000000000000000000..46b7e1e1cd9a0e7a5a4eb7b18fd6b68ccaf59ad2 GIT binary patch literal 1680 zcmb7?YgEz)7{>pYre$v45(Uc4dF^PKnP91FX~Gs>7)F6b<}EKI>QXXwG%v$~Fg3F@ zZ`jmK$y*H5jCrZN;2EYS^Va?r;VnQ^YAUnu`?B|(=Y7s|-uKIM&M({F*GF$VY&!q| zdKk19Zqv_yk;;j$w}hKm%KMEm&(aLlSU4-vRYPgmg1(qoU6w0KiwB zUj%s(TOA4jTdgo&$M7`q!u{xzh(O~PcSd~nMNv3)6l`tXZ`Lj~BSh~ylgzMd@2qsL ze@lP7)qnEqPD@1=z4iLGz=~f~^HAmxD0GER8YSUs6c?nwX1TxuXf;Q*Gmh`DuzO=LyXJlkF=;-L^@jzcQHh81tCYiQ>jJ@l`&z=<|5W}-~ zD#3CeJ!;d3!;b_Xyz8i~t*zb#gC*NpTZg;Z*hnt;`3>GUn3|Duvo*n`no&AM)>a+{ zzjiBhDmvusY(x$UTHAeh-N)ZQXCQk6i$<&JIULaHuE$_*;?qu=mHdXXkYMI{H~us{5@4wRYu!&b*HM#Ix0mf zYy~BXUta$9c1uf(j!#HH&}wddV$#~tII&oKZUjL;5Mr!-&fi}qIK|=(CF5|S=?@<+ z=H@k&&X_)!)QbY4euylt84xhd?$h#caalf@mbUS$v8wdap|m_2yop$MS$Ha4HV~I{ zq2qeneJrMg`|x3M-bXXc*%IQ}v#gmN zcVEAL4G|VY09VNL)#9UlcM1wF>ZTJc6}dU0_vh`Z(6Yic}+^v`F7BEDIJ6K2FiIa#7mpNbZUdI-;sQbbp*$bl}C z$;fkabL1b9pn3CHjBCQ-qwcHQQG9{$)RyJ-hc^4Q^W>gOroz7^KiN)byzK4$d{Pi2 zneR#cN@0lPyz{l#8Q91!FE4LasZ<{)B2z*`XV`6{o9uhN>QZ+-$@i1#)0>VC?Y!Ah zL||~9y{Q(7L`fein_IoX2sj*0GQM;>;z?a%W)Vb_s$~oXk+U%_%GK3~?(S|@jf;o9 z{jB!0KZGyNY3*Bq5WrDgdMAn5J$0rY#@#x}lfpqLU!^+E<@5O%!KsjuE}FZBepvKw zsNu(N^gv3+YFx4>6UOSf%__WDLqvhB~Zs^21j3e(u>RB;t^)f%YS*+4+< zwLfDJTsgF3uuSqE3wZ5Gj01ZxATEd-Igq_~w10sNk;Mvfbb@^YFo00n55 zxBM@F{_9y52{c}Y{r;Y0_4bObfcalJvxMh%S1lb(`k=yo zNh2gZJzZ*eg||V)yVE;YfS#V767V|VX4>24%F3Cu*}Z!u?FYTl+9Z9oNo)@Of#E;m z9oBhLu0o;UJ;*JuVTVwMF6;OphQmM1&f3>hSJQ4pACmP_a|~fGF~ijOXwsjNP@{6} zy`8PHhQP-|nK4TL;*@b+fuA=eE1}hn_BQ=5gV6<)ojm@%QVobGO5QH&Z10MBa_8yN U_qHjIzLdmx`+C)Xcm9`u0ez_m1^@s6 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/emergency-telephone.png b/web/assets/Cesium/Assets/Textures/maki/emergency-telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..fac62396845e81e45b98752d76b3cd6cc35f1910 GIT binary patch literal 1533 zcmVPx#32;bRa{vGi!vFvd!vV){sAK>D1(HcbK~#9!?OaVr zRY4Sf_CuObN=XDoY5vfUErbXmiolya-m`jXkz&>>7ZSM9+_@;Ql_4m!EdrrcySJ%L zhzk=D7s*?_jU<&I2!bFzdapa=gWL7qnYs7QnYlk_;4CWh&V1jQ?|d`&&ctF8Td`Oy z)8llZP&g99Ca>v$SL%^8hfYQtq5}{9Nh|OT(T*s=fnUo2zZ8{{B(O?<)@9B1NbNGI+)Al9uV-M2_RNi0r;RZ*>mO_!G|P32Y)XMpqZJOr@g(sv&R1LL^7HD zF+M*2%9kXtG~YZJh)xq7rhzgwHTBXd=yuW3(Xq-PA>j+RV+B400j$hVBoeG4X>Dz-ld~{afVv&8 z1o*w+T7kc{wRPKxJCdULZU_h>_(XQ>ezv>2dyb0$k#5H=0UWaP$B&xtIq{$~pSL4H zb2~iXlbD~Me`Gsu2)E;gfS|b@E6ulyp`oGomg6SX7^>j%5)eeU<1{hH#>QUT5g-kG z2aA=!xgFOtUxw_sCBP>Ix8O$exd_mwe!0~@bar-Tp(0@57e#Y%lw_} zuQo5jTEi?mcHmo(P!N&%3kwTotc2 zRG`~&Av=s&UBeG&v$)F(Uy$YXJg2Phmy^fWhY=p&1E~bo`%sze0p|Li13X&$G=PH3D{h3Ebb` zpHX?`i*G&!mqb8|d9ayG<{5Sjz^?fUbF=#vl-z>=>2{pFu#du)MBHlNBO@bkWnFMbIsSh(vKw7ivfvv?Xy6?;5(dE+?T*O%1V+ZA>_ECB&Oo;#W1WC*2bP2u7k8{xA#wuS j&RuJ94)9wLt$*z=x$v=T>eQds00000NkvXXu0mjfj>pns literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/entrance.png b/web/assets/Cesium/Assets/Textures/maki/entrance.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ba8c5d6ad858d5b79edfe30fb0cefd28ddaf26 GIT binary patch literal 1307 zcmV+$1?2jPP)Px#32;bRa{vGi!vFvd!vV){sAK>D1h7d&K~#9!?VU|% z6G0Tm8;gQk{J{D_@gNo~l!8)4t-Xlmqsb;QBw%XP5IwXWEJ=F`p-3+U!IOu81PY=E z=`p7sya=UKDX~y0*h{b=ViYVCE0t*CjBFsJyPa*aGqbz%0{_d>oteJh&dlz-_hwpJ zIQ%M=iVdl~TrPK5SjSt8^g{+eh#KV;Rp|e}%FXzw0UnW!UkBn8YvY6Ax2hkE&tILi zjX$7Pd8t(LEiW%e^7;H-t7>s^@lLT=3~dL2%Y^H8yVvY?dqpJShfT#E4q8vYTd6|S zn6hZbuL}1HX1zeEqF^xiQB>ns#RLEvep*$Y{)*@-6bfPL08pWO0f4d|qaTYNunzzz zYkYh>4FCWD00000KwaoV?T6Wf+Wp5e0L-|q69@zf0000000000xB<9c6{_D}6<%$u zk+ViFSpzk4*T^GFsu2LtpbHF~OxFMaSqA_B=Q#ki;~W6sKM6|!zyNPSs7<>7fX)C` zR#tA+-1m2LbJI_Na0meC2teuH>FMb>;l4`%fFb~_a5(&)aIXgdPy~SGa5zdD=7m-O zKnXxqqPn6&9|D@OVf>{8ZF%p2Pa7=2m z^MWY=$PMi`8UVH6s5%|B1ORzHXfqlBtYk8oA(VgFPyo;$_8KkArP&AtNs_)c^1Z+e zfc!Qi8Py9#GhlYRbtEPLaE71J-GF+=>&(r~-6KF~X9fUWyl4hLtlmLW@p$}|mU)3H z0Cb_-ERJv*k!v20=R2WZH#GpHH`iGQjgj10YG#H$wR?E5wF&8nFkAjErOnW%pPi zI{KIqhai%py?(rh`~V#RG&0@;0386}9jzK2?;%I5NdQAbL!_{hZb;Ij1VGJ!UZeex zB}oYY_UI8NTN~sFQvl#{xqfO{&w)g39RRGauLo-Hi^XEE3HNltUJ(=`ljrB>W2EfI zM#p;qpo3t)AbtScuwxcK0Mt$>0sw?92e2Q5=ISm0P+3ku>SH7i0Dzry0RR91006*} z0K(yL-fVI@oxk7=88|}*00000006iHfU_jkH8C;qlv`8;08l>InHd0w!|@w(%{U(D zjJ;MO8$XlDq*wyzQK}3daxbFs)9LghRvtS|(Q$Yz#6eS$NaU?m6^%yU}(V-?w$2mWp^LU&eUhn7Q^$)z>-+t*%L8u;51poly zOeK5nNdGfX$j+5=;_y4{3MSD=0MJmNrU+Et>7W=-iaqdf0QGjKz@n(c82d2V(}u6Ws@6SF|;tyOh$2n7>nT;BsW7407bf%mHQmStDeaP|E7@VaSY>;TVz{>VYHikJ zkS=9|R?ZtyX7W8=s&v+1eaYYcA)oKt+}s>(WN0`e?(Yxp@99~LC2+Z$o15ro${Y@d z6&MtxLu$|bo!*YSS1+?mEjJS;eAD#k(Ywp1Pyehdm}t>LA_XfM(=%voc{d zn1aL9(6^uu`-~<hI>^fj)Qs{NpQbc&D)65yI=5Ux$P&%**BS+1J^! zOVQEqPQFOsTy4mjcFRso{S^EnLS@yjLi!^t$nkKECi&)KUs0jveI9T5DZP`@)z!6q z9FLc)T4M?q%OI$rU~99vZC)mb%E4_!ebtuYxg7wufy_2GHYRCAxEg@n^hWq~b#;S7 z^gh|=$O|=P@$vEH`ns*9I2>+MYJ-`j+~Pf_u@?g8Iz%CJp|`YfujA3hSP?(fbjlWw z$~P@KQPI+(@QY>gei=t%$>9D&$Y)ZhabX`p(pG(o&0Z}WhRkLEU)-(5lQ*eieFOun z{k?j3l_kB^Ad3=a6@p5meY(?sltWr#ySFA7FeY|yo-5Ij#*L4S@mzL`A|_YfJ3GQP zw6mQ2JA;FR|D&aH|G|R?|IJ`Bnf#!#y?R<#m`fDb)&Rv!d%JzKK3t@AdI$pTW%8-m zE}Qcv-YO=9A`>B6jr&X>5b&wb{iJc`pt5+PVnCrta?yuVU0iM>dH~kT*qM@3c6Qs9 zqhVZcUskaX#8{25OP}bN1h8(0d-aB9XUp?);NN#1Fl8kqCiFH^!HnOUNqcO6W#_$gF@HvPf!#p0D=I7;IBs%in(voh##_MxYNOuOey$fJ1;J1c{ zhdn(R4Cx*J&NyVR{xLJOx*C|Jwl8;Y`!xnxCe7J@O2_9?KI}R(9Izb8XgTOXBDGOo zYPXgO15Fy7@U^bss5eKpS?S5b>gr!<)DSNnY!hmCxA5l>g>72g$%bVV(geyJEdbd^ ztypf+DU@!S@C(ZlV8iuAo#bXE}brg^q7CrB{yFbr!K@d{^Z zdelW(a=WxNC$Ra6vBi;?TLO!VV-f%>y2L>L)Yqpt1717n>gqcC;pn0jfp9yt!6$`X zXg4PAetUcaq2a!Z#f3QRvDEmSaPi{&RJ8q|g@wi7x$nnh^RK-;J>R99z(rM7tIqG$ z^YZfMhq@zb!_%Gx*!7CVV#`ADdQL8M(aFJ~HCg#Mg(2y@85kyF>Py<<6ep*!X*c_;7Z8OK=Rs{8y#K+nxR3q>&+6RdcHs}KI zcRn5m21j1q4-T-@f~VdDVJlBr2c_Sk>4JX(%+uhQe@6~k-`KEPlM-;>d>}4gNb7hh zcZq1WwY8nNvy^4~Tec{`$I!1lH#e7*no_x5ksnEf!8Ch@ME_aL3*U>-nmtfk=6s*^f5_G(DW&h}wzUPx#32;bRa{vGi!vFvd!vV){sAK>D2Y5+DK~#9!?OhE_ zTtyJZpSCJh+s0yB|5DppYn!$jLz`CH+H!aN{~g>32bJIBOpjs?>}7s@HqMIQS$eG@^=Zrg1IE{o8Y0y!#yHAEC?ZRhQm+j5E}`+pwrAo z!7n9^-z4<5z*!Dof+u0r&S+&o;|LxUhIYUl5IhSiFjoY(%_PC!Od7UYZg0PI=~Be$ z)29>b>+265KYl!;yu3WStgP%MB>=pus;V;U>grx-Zf;KL>FIfPWMm{rrkUDAuxMI^ zPa1G95&Rx0jlO*Oa(F{SgE=QBrz9aE;lqfCh%P@rzbh)0YQ)FK=Q_cdn=uOaR;$%R zp`oD{_V3^SNqTyERb^$RwYRrdFHsR1f;G?y-QDYNB{$yU$kg=r_iGCZ3W~_XwGv_f zH4Q?R1)`L{bvoVGR;#t_%$YOKNl?U2B9q1L>h*UCZk*i))z;Qp;^X5#g5EV-ggynX z>-GAt3JVKg85|r8bzqhrP+It2!mwjD0_-dFoM|#CiX$i}=;yq=yf=o1hC=Mf04&0K zaKDu>J1Yotf7XrL+uP#}216UzRUQut<|;KcwGQBl=>i*1Mq;zYVtI$y`E$G!0dq!0 zMMc&WqhTXgB@l+og&{WKM&LmlJ$m#tjYc!b>*0vdh8r6jpC7*me1`Aj@XF54E)~y5 zAt50@avTxYOeWJw@ZwlX0C$yF&%c9ZcEBDcCMGuW>hJ| z=NeK{Qcf{O!EQP69W@|GtJVMTnsZ=rN-1EU;tifADA&xUckjg7m(tGJ5P)dIc)iHHJKan9t$Ehu`AytT8b$Z43ph zlA?gc^o6eY;$pSyCCZ&>(+hll^b<5@Kt%~i$-ST8l? zJmEsUUjHS}WCuKSWMt&GF0Ls?fd}vcp02bhI5@ZuIvK2Hd1l-g3fLr90cX*@bRMVx zQ~)Xf6@Usr1)u^@0jK~}z${Y0a{5BE+58?^^n8PG4zd)$iUlFKVV#sb@HP~bV%Tdp zGe&;6-O-*;1Q+;EO419vop+&d+*bxgWPZ1}_dmw^$Cj2Bqs3yWPD)Dp0CvG4oC9R- zU=OLCB9L7->I$IThPCfAGc&V7rBeNi?xgEsX-F2a_6yy}kU@D7{ll?i$6iIj@dXsA zFh;^Q51|5Z!u}tBfB!#GX#7V)O-)TYJr{TgHL(+_TTocaAT2GembNw?wD$v5E+{Nz zU^biIWhua0{6$}1pAHhrC@}sgEiKKV*94$|wX{|;GBPSrV0;0wA=oBQ$$AGUz?0sH z1^-BV|M%x=v7NgCTU|OkI}Hps^r7*U@K)AB40esh#l^Mgbh-|VZaNQx!O)(YoBJlc ziEKPB1Q7^v5N;oa2;2rJXZ51vK})8p0Y-4eYI_k;I813b3P>?%99B+3lnw=@45V(( zos^P1bm-9A7~OOptO|Ne%HysGQ~)Xf6@Utu$_u)OzEE!Y&wK_HjW86jLCOg5q%Sm? zOg0p%(^WS=NnU_4c1TRf5knXih3XuPM&n6_0=%RaYVV-alspQn=Mk>K(U^>_C<~=3 z02B2tCg2&p-`knPIu_Dq2yz5C8B3}U{;i{<%NoU8MZ*6T&va=U-sVk?TGfztd&j=2>fC*B8f}*0L0-Md2>frG2&0Nk86_ntM zF@2}N_wZKX^&Wdru#R8&0Pj&y@?8OIXUVHbrlas;t6N^~Ab3b%mYxtiCI5LUbQPQn z3aLh@Fv8a~At50lAt50lAt50lAt50lAtB9R`X3|ypq&mbx90!=002ovPDHLkV1ksY BqFDd{ literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/ferry.png b/web/assets/Cesium/Assets/Textures/maki/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..58c2f27a8567c693ec875537330915b00cafa33b GIT binary patch literal 2879 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/garden.png b/web/assets/Cesium/Assets/Textures/maki/garden.png new file mode 100644 index 0000000000000000000000000000000000000000..265edb8d6751d7cc9a4d15f4b81af52ab10e9163 GIT binary patch literal 2057 zcmV+k2=@1hP)Px#32;bRa{vGi!vFvd!vV){sAK>D2cAhpK~#9!?Ol6J z97P!47VE3NpS8yNjIr@Wv6k9mQz^$C$D89gI1V^SN-#b`fW%fHsSQ3Lxf)4>z#nL0 z|7g<03V)PDG-*V{hz3QXL5QghYKRXaDUm`8&NO%C#GToh-I?8;WxnJK$+7#*%D-QupU}YEBS_d={XbP~u9sFI-(l)S}1oSDOw<{tFsJI(w z7D9I!04EV+7wT>Ub$%RU*DVtGStP2%ZYD?DT{Q7p_{pjOe!%E}MpfhsO8{zBvF z+8DL<2g@$q21&6xK0_t#+T?u>%J0at!aP0jo9Hhn(dcR~{YVLDdv-xV^#}xJqjNK$$xq(37OBI{TLKA=j3KFAd{KbJE)4931JX*Vjg@xau>^YJE zs9vx4ch=zJKtpMMe*OflEk_UlH6tVAFGBDy&=7zcI#z2=PR)Mmf*)t__KQMTXO{1O(g-607-x(KoTGc zkOW8q=m~JSTnmx_3kfJKEgcdW{M_8!GeQ&4)z#G~G64+@4Lu?e;C9+PKy%P<2LkRe zy7Oo!h4UAJfX9UL3xY?4A`*Z)U$(nrR=QfHL!r>8B7qOjA%q%!NW9G)F!n>=rOOq& z3(A{qX=y221n@Cl6&Z>sf_j4NP6E!QMG;9rg>TjHMmTFH;5{DCISseT`xMbcE12Tc zsZ-C|0sNkxo|iP-S9U3)3aq@AZ%#)?N3#{czX626cPLd6T?oR8F6qq7j4vDxf5a2? zl9G~P=-f-_HMdJ~ih#!4M(eLRFfdTv+}wQB@ArQL-b&BYI%WBMzV8nnJlNIO*Y})` zc!e#B(lrr!fVSc03mpW&=$M-&y7WC`yAc8anR_LQk^o776iI+2K#C+l5+FqqAPJBn z2_W7QfQj+$0S)mG?yqD-vz%P(L;`@VtD}iT+@!gRfIdK-tPq#2gf>|c&^tvY0A@|3 z09@;wA(5oOOh(}U?|4to?xPh1M4ii?OuCW=s3XM|_O_wy2fas8$W&#G8sK#cQ zrLduPA^=>w$ISMtRp2_*#S04yIfoA)e$(&wf9-O)7FBXF{BY>dp|^&Ihr>E5bFY;I zpj_&4IyN>IYH4YS6c!eatJLEH{Jp8EsRL&Bq9I@_LxOplgef_6Gui5kmy9aw~_vm#{$u zB<$r$0LkiRettgJ>-GM|)6E@4zz(&G>+9>^VHkDz6U`*Wk^qtyO7O&f#j360aCiVw z&OY3vWJ+*FcX#*81ic}F1py@E{mGLjUob1kLu)y+Q(e&E1?ZZimIZ*PBvR~z86n@NZhxZx@*q8+QN zt9yA80Nvd!imu$GXDimFW^8b9u!?6RDk>^I=0O0Q77< z2P_HT{p2$ndQ=Fw+p56p#>U3CSrE|K+1X@OU^mc*SsV*`P_OK~8-`jPkrFUEIvV0# z$LZ;5Kh?fJ%b{p!XsD8R1J&LWNC+?^C>%z3niALz4Bmt)C=?2vHoJ?H5CFHuElTJC z^)4PRBD+xq>P-tws(E>NKhh8Y773qm&Lwo-=xLu`61=E_X+ueMboV9_0(idVM)jhl zU)y8+r3+m{5sm=P;4fSLkvCA#6&fU57>Gri`n$5jSKs`CN@wfuzy zSOvaO2QFIyd{LXvKho8ZgZ3A(^f)KY0j{%A|V-9$*QWV zei6YhDk>TkCY259C^M!fPMmmAB=94V$g3LQ?@{a~Bwp1V$7xnCSc?Sb5y^^Og(LyT zkt0W1>QkH&Y)2e<)7#toJnJuSz{wSU%Yf2jJ3(=hXf0Jy3NtCv z5(0;pU@$nOGk7FLak7{c3Z*NkP+3btGD(}HnWk(b+n9)b76I>3r2J>aw1H!o?7vSt n(2WvpvYxSn5$I3bwT=G(+JH4uNBw=x00000NkvXXu0mjfmN2@u literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/gift.png b/web/assets/Cesium/Assets/Textures/maki/gift.png new file mode 100644 index 0000000000000000000000000000000000000000..866263e16b72f6bf5abdf6ffede21aeddc5a7c79 GIT binary patch literal 1606 zcmV-M2D$l(P)Px#32;bRa{vGi!vFvd!vV){sAK>D1=~qPK~#9!?VVpp zB~=)}N3FfGq*A505+iBQUy6np8#EPM#e zSHVXK^g&FBz`!6PF$|FvM35reySeMGtM+|xh0EQ0&dixRbIvz&zkv@$XXg9!JLfxR z&U`atSq8R)gM$b6_xGOwc?F~f1#@*fBw+{DTUtez+9v&Wa5{#9V zmF7ZPKI%bzhsU8EtE;O`km~MY3eSP1m45BS9EkBEbkxHemXYX5ASGO$Mx3#tPCl$R74Gq65 z08EktFf=sug-RZ^xo)^+*P^$#w^O2h;P`D-otTpHooi%d_U*~fmd)lcgkY@f;nYZKqZgq*qfWg7Rp+Eqbot=F@ zp9A&v^?$ex%HrbUyD9*1f492O&V1*bo15z-2LLWaUQ$UJ0|Nu!c%6p4Oh0I!$~n=0 z(>>svYOrw085|vUa$%$c0NR1}pk0!4?g;>#A-NVbJw5$_A8RtEWO;e{8rc<5$#U@R zFa*E3x%n4?k8u(Jpc|gjxgx4l;7U3zxieO7QQ2fUwzjtR&maaLrk!6&{EAzYHfRkG z*bR2Qy}e`L*goZ;<5KzP=;&t-?hBV#)HX2eaZQy8Mg@ZZFy+dKr$Qe56G5mAIu_F4 zmsvsDz~~o368K6h$QzcP2QcvQK%^T%z)SEF9m~S8#5`Lv_mE$P-`{Xi#`t<>pg${- zNAdis!3KF1=r5JPmu6a!i8N7>v7y{x znkqFJ{7Tcg+U_bmw1adeH&PfZj}e(EUDP?fJWpu0a+Q!R=Z!DCO-)UG7>mVj>a5Sy zwF--Vp?`%wLRDz+6OtmTw4V!QrU5uvqW1L(8c`vxu62JZ0PO7XZDu5zZYC0me~J+R z`mOa|K|W#yR=tB6nkBeE&xf2juHgm z&pU))TS?e6KeQ0MKu(Z%e^a5Pn~fqxS{*_ljd#Wdwd_rAPqmX|ITI zS{*SqHukAsAP4~1L;sAvGcE(*0-*|o*9h67@6)!B=c5yV4;n~D#H!uIbN~PV07*qoM6N<$ Ef(ec2SpWb4 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/golf.png b/web/assets/Cesium/Assets/Textures/maki/golf.png new file mode 100644 index 0000000000000000000000000000000000000000..2169d91589d4f1e5de6ef5d7fa32ccec863040dd GIT binary patch literal 1999 zcmV;=2Qc`FP)Px#32;bRa{vGi!vFvd!vV){sAK>D2V_Y^K~#9!?VW2( z990y@X{**(;{z?Nw!W<`t*v6KZG&w^SoQ(9%L1zl3oLqBIzkh*B5tF&9Ipcb1uDX7(}XCjUU1G;=w>nS1W@ ze}jU&P!<*zu5r0sJBSXD-y_M-D540W{X{#7Hj{t9JP3>AfnQC68%ks#idjYm3It$W zgwd0rkYL^|An+_j12_WWN{piC!4DSr<}deEJU|ozUlT@ET=R1eH=uKKb8)9mok|`Y z984P<8%vsgxWTttt%H$~kqcD+7z~DAQc_Yrt*)+qZgh0? zQGp>KoR;&FzD=X^+DNhJ(p2%~;Y0_SUQ9mER z#asXb0|V)N!RN@8n3(ugU0q%6)YMeGKo}aLZA4dK^j8kxe~~6?GCx26t)ZczRDmGi znfDW|Cv{kb09FWKQBhG*f7@)fPnw&XOCgsCgz*s3?W#=LQUh2jlgTt%QBlzdy(obo zv_!i|ovuaz5&&3KbaXT%?Jh{#^YinuB9iu|fKS>=09e|cO-f4ovZ0}&W_o(sB=D<< zB6Zvvut{5C085kh&jkeqZwwC)+e9SoJw(?BRMPeqfF()$uhi7kzLu7jCxs?$Qs+ZN zw-H@}0Hl-4Xf%FbRaN!;#Kc5`(B_Hg1_U6nAZh31g6U6 ztVIA4584)IS_KT+c4HEjt_L)mnVET_v$Hc-;Iu`AUr*xs2mn`HT-=$mva**%Ox)>U zBLUPO#{nzoX2LS(v17-c60zp|FswI|dS8lD5gtmf*Z=BtI^TAaRGB+2NL@Ds+~SRb z09*+P318RN*4Bw!zTED&eSBX4pw(*s$jHd(>FDTi3SA4J+ahmL#jZQK0Fb0QR$5xx z1UoE5B-ML~u2t0Sre>C(R-j-FF0ZQk5HkMx&Xv+wHyW?d^FY_KF@Lx*4~!uK)l{ z5s;+%3T)UFv4$H4JFiu}@k%NHMx*hJh@`qjwMo@W03fOEgY{WF8=x!z9X(ltN!3dL z_F)7O00O{*01yBc1b_grAOHk_1py!cEC>JrU_k%~01E;@09X(J0>FX*5C9egfB>){ z00e-=4*-A<5S)}Dx)F9&)1ScsY3k=I0AL3->@B7K(>ga!yx{?3*5oSysCVcgk!Ill zX`A1J@FoCio4jKs&h7M)i4X)J{;gk2x3tGdAh5aI>X!#Wya50XZ;=0ckT0O%83!&| zxw*OT!WmkRH8z=7PY%+YSCeLY=dUii%!ya~An71i((XyIBE)H##OJ=0~vy!;_Pf z`*|!bAt!7=0Ou#&oqWLu_Y_Yp5x@$W2ZF}u4+=sB!4!kr4U`%Hy-$YO?0E9#a|L;U z$8|T%7lXcrjyU)7^}nSAzyb_9efqS;WHNmxl`Bh0Ny)1`r#FLrCGarR-$XAYR`2LsOBAaK zC@d^|U7{x7Tv}S%N6Wd}!kZW$AOEe=?z>v8cA7CR&?&NZKy4l`2)@(lY?I-SJ!dwX zzbP&*ZUOUExNrfIINX9kyP4;_Wq}O!V7wIT=?!#hZW5?AD zfYlY1GY5n-0Q{h004~<_w47f+824dtm#Px#32;bRa{vGi!vFvd!vV){sAK>D1tv*EK~#9!?VWK* zT~!>%uUm@^DrTeoF(@jE`Xkq1kZhw`&FAy^oTfhKd@zKXE)-D&O+g4Mvq(h2{wPZ( z6@m3nWQeGUNHAf-7@~|s2(6F=!+KG@dUg&yYhBNMo_pW9zjL zm%{(g8N557qBr3Wr6c^!4mI72|ClQAlm0AJmCyItGNLXlEL3%OcfVOzSNA#hhK7bu zCnhE?;x0(P_dAN-)YSA*US8hTZVmv73-0RbYK4sO+rG54bRGcQr=Gnc@#p8~qi)3K z&eIbBxbOWz5dgR1yGlWf`a$?VE)uP{xcJ*tLWe@3pUTS0Zg7u8BJ<77&6jsA!t5V+ zD;{Fqw(calhggN%;@<;d<$Qd6yjC{7NKeEdth`rNR$dhVNO*{K;NN@?Vdb6KcXj}& za=gI9_JVsH!peIf5ctCmU~Fvc(k{O{!#sy+oh2G(ov{C4W@hF^FT<=%^|`sZ3yvv9 zVxo~{|8YDXKMP@r05}z42nzri1z^WwQ)6S}ClHqo!2R|Bv$M0+5SIu*@@YQOkS+kI z1BL=9EiL^90@DG=wFl|y>UtXj(*ZbyG^7y#>VTmD0)fEq5Sb3Zj_03MRaI9YG97>? z?19$T*UKO>5dhK3DCz(q02E?F0kA?GhtNa-SQ^T+2kY(aeH}v60mw!g(g*-`0000$ z1RxrXVnRj;AjckXdV2aLh)o25f5C?|q!9q>fS~|_!C(x669EuS$T~VY-i6?Fcfet+ zjOx7uurjI>01C0804gdfu0eDn04xn1vj-j;8ft;)bO7!`8qx>=b-+*nY(n-6gr@^= z#vZ)3w)P7MPXvI~frpWXGy*^!0001RD8#=)d^!Nn+5dy7si}()p9p|x*C>3J9P1K6%ceAiO}$N~V30Fr4a1OOTVV1GF?0OSCGfpgzBFDfef-l6xOCIyg*TN-qBcD|G1 zfSx^m0(i>p$bo;{!F$VgK?YZxEK}muE*1CU!gr_PfyPqUfP$R zpC7v=0KCP_!v+57M}AegA?@<=@;O1Qpl$$1ReV*?XU=~0E>Yak(b1RPw2z;P=P<9h z&(dw_&W8EHm<}->QPjR?MDhFk`(Kr5UqL~^&qkjIoN9%%wYBv_w`s?Zi`!+{#BsrJ zWMrf+#cvN=rkKpiXkTC7Yi(_9?>jui_Vv(vnHS6Wd0_l-=7E8Mc8Mj80?Ra0xL)&+ zPwhLYs*RS3rs(atBR+SMC(~?S$THpdGf^)WM>VBSx!^P)Px#32;bRa{vGi!vFvd!vV){sAK>D40=gKK~#9!?Oh9S zl}8m0Ez|FFd|O_8Bh=q zgcu13Dn^V*5gEjZ42nc54x*`4S_&Ekg8QX=nLnG|{r`LafB$z#`1 zQ0(z|?l|?lMjkO@#9zwF%5qs(vSrH>!Qy|xw>4wfP}2#&FFOy8A3r{waYIo~<_3uCX%fV> z`ihE*DWgY^{+&XruglEL{AqP{b($zCMR^B;eu{mO#PEj|3RcfEX3RLmISZa~$m(Ad zW$>{2#fukjj*X4Iqw3j+oBij84IADTEk2A5diPmMSN08L+q|cG0Z6F!H;!;!94I3U zltnnHsj25xT0O~oetz-d#j&ykl<*VAt=iZ4hRVvy$yQ@tn|%MwnKK!TaD8kP&V+R< zBu2}YE!&{j>fc|tZe5{7@i7hJe!~JZhz@XIxS;%cMjeR}^7R0%et^vC)6&v@qtK}8 zNYeF7WXTfc_iteJ%mNHCzIo-!l|^nX!0Oej*D!((_S4sQ6!j-y^++P^Wbjrpd_04s z^Z={>thDAuJ6VrDw0!yUZ@RSrUn3OA0w8ln2q&^QDM06TZ?{0bxVP_w2DEJ|kesJ{?juhQy2Bwpg{CSAaAf8yl`;};-Zc0>8d z1q6N*wV{sewxw3zUuN~=#*O=xN?$)_%$Q$u0tX`x@Vo0ryFZV<4CEE=sI%^+H_R3fX#e9*t+<}jT@J{bq;`u>o{ey8yay@QBfgc zZ-qPb4l-s*gafPZ>_}ISjVMr>O-xLzc5@NnLQF!sdPdg?T{e|gpOTVt;pEAaSrR!0 zIa<9XU-%sRBWSRzEXW0t)L>_-ER&!rik^VP*TUb}krt*z?qd7S_-*E-A6kzNDC?Cq@<)vGUyEL9lHms1ZW72VxBO_ zFawFThYufq9p_1DX=(1rkt3@^LGfs~&zUplJIHw?h_-G)0gq91#4w&<@Wl`uunP-K z=yy>9zIpTJC}WbBo16PRCma3#@~BaxE~Dco@%54QovL8tBiSMy>z0T`=OJR4GG$6R zlA(-@jGv*)wPeYXO=$N?B8h}Od-lu)O2BQapEYaNcTKGR<&c3)qJAx_INIeKH*O>Y zzUW4%3)gqxz=3>;JVS`$+lDGcyOWG8AX3q~MpAm$%R8200MH?jb)&0-QTN zl%o7qFrA)3lf0)0d3^2KwG`lHfS+*?2=(s%{rhK`$n{KEQz8msX-{!Pk(`|oPs_;| zTY3eZe`EX%R4{7(BBcO{2SkBgtDiY@=0Ovy@6lw(r|2R)OJRQfDcm~Fr+C`r?+mmZ zr>5VW1p%;87LqR;R)1~Ru3cX?*_Fej@bC~;d>d-{(SEp~VKlOMlH!lvQgjwP$j;9G zfe8|s-37f&hb2NJ8fr=jG?-as14CjvC)Bx&Q!2!`DQS0mJxpaE}H`Fr>7okP#1fcpcIt{8ShS7p0_CRq)jDZo9dgnh_h-bF=4E3GOX z2WoC^?tUkF3`t2ze>i&d=nRt%*;6X4zX$tcsP6}%2V7|a^KQV04jsyO8a{)-0b`{m zJ>o8o^@wS0r$Kq)$dM!2Zg#Ca9*-H!JC>Kk5gBV0q9m#ia?7wmm_u{I`k&>@h?Tje z{Pgtn(+F`T4;n!OgrO>`r)D^zg$oyc%LEf@4;@FVn(T~NjcUbXs{`h3V)fx75V6}x zIgD;ejO6uz@u6(=gDYsa8q5 z&}PIqeOf8Z8$e>&RXT8GcKQic81rVhML-6tXN|{f0fIIowtoHkx7jeykBmJ=qy!|7 zfWE8T4bYQS_h}Xd1#LzQU@x`?<7eg`VPQ^8*~E;6Ik5=SIWZQLyLRo`RcARJ9u~{elyN#}$a8?*|U36Ah+4CTYlugLfTO(VT z&WNEpsPgs@;G2%PVxG|Q*5%4(&63f=I zxiZA_xQ0yS-9RYgND7H)`t*HtrznLW#d+p{ksN}=Qbj)iKxI=froD6{)QeP@HiQ}=b~hYKK+(X4>4 z@)p5?<_vt{j|EMR-a!B#NN>yqild;QU^{L0JP6R@Yf0{L76-8;N$cKdMvONZZan z#?_1{N`ZmjA(pTc?Lx^cmhT4f)?pz+^v3v?WEED2IMVWYM-#Mx3WOLSygx1Y3(=f* z2!}ds@wi)}L!f@LvqK2!So)_unuUcp(cGaeosfTxT5c5GAu^7pu5}P~GaViIvn{Y# zI&u`q7LB2weIl%h6LnRO3-~eR#)TiE#k)S#k9!4M4zKmbw$p#gN|Po{nlx$Bq)C$| jO`0@m(xgd~rjP0WQW9%2I4;lw00000NkvXXu0mjf$x2kn literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/harbor.png b/web/assets/Cesium/Assets/Textures/maki/harbor.png new file mode 100644 index 0000000000000000000000000000000000000000..2814f3cd541ec74cc62887ac81597d334a21dd38 GIT binary patch literal 2048 zcmV+b2>Px#32;bRa{vGi!vFvd!vV){sAK>D2bD=gK~#9!?Ok1H zTtyV#S~Y5ILHeK|MFpv}6~P~93tElM{$w{H$>#r$#JuDsC<#VHNgyGQf`Yyz7$SiL zBq0wz`JfL%1Kp+?DIuk16`~;!hy=t1F=f{|ve@KWk-Fs)gZ|<4- z&N(wT5(zKnmCxs^3WdTGZ}vkA;Ye z1Ah()c&EieblI-vm?q$z_I!x;(NTZK3yAys`{~Wi&Cd1p^`4E5jjrwO?KZDOgs9&G z{~`~pY&P4`)YO!%si`RlSblnX`ooX}F}L$73!vHA+4luOceU>B?rR|lbnsth0Yd=1 zs{($hjgOCi8j|1;Q8X~-=H}kR0>0D|iNv2F3HJza1z}`l#pv0R9QLj&E&kwVMK;;TB9AZDKCluthPbcBI1%4Gq8eK>))Q zMay;cS35g5g0qvWtE+EegD*)!-iR9#X!vs`-A_+X z&oxnyV6N~Q?eyY~v=ZPk&VI@i0ixj4*Vq3h6ZeNX!FK|{wb&3RS0P|!Wo3xhPV)B` zRG#6MPrv~Ge#wkcl}!Xt+IUj%8A3}`Na~;xK)^rF3HAQ_;GLbFRugjpHUXl~DCz|6 zGa$2uMt~^zV7xpm?m{WH<3Z+YBLLESwDytL{*GTsm{NnfBdPvl`9EC* z(0qO|1D3S`e5gC3wDGJF@O2Tu0-v~@o0fntR~f;owZ(Rhi21jda>yNg855-@yqu=#M@pwEZ+ZZeY$Zrx1pZ~Kh;6w2jt)0wr z6xxp(8yl5MIxq-e`TUlamJM6LhvF~B{CUQ+>sel2en+)Yssy;?m;bYlj*g5Cz(d^; zM>$`Vay=N0Qz3x0&L`mC@EdrD^zw4aus?wp=XsPe>Hg&>0W9#->GUQhkf4}L19+?` zDkS=$+Cn5=1p5=D1ee!x4lqL4q1#&{LjcR|V2dnJ%$hdpRY}Ks08Eui;L@EZUI}1L zxNU81KOp<=tOnrY#xhAP#V11mYpIDXvOqB-0}lh|gmNb7;NYOiOGozh_L^CfxF`WE zk%c|-flNf;tA!$)lnMAT=MABJLbM~XSS-hDpa=o1@B+5a2gS@8#a9GCzW}wU7~$OW z&YREA&%Z0$8Mj&&L3>@q=VPySKru7gRO?4Y@f*&D3=Iu^siTSy%u@-#VNbTzCx-Phm{@&&Hmt~`x z*ztUh$cjg7xJ(kj8u{2F3v`2Z6Rw{Ga7ssR8WdRxt2VZoAi$)^;*9)M#I{Q}0W6=7 zUAM#W`N@clmrepWr6X$wS3CBe&7g|_mfO)FvTg+S6hj>Za75NEg9fW6w`h^%-dXqQd`u-EyV9BwKS z#7h?e*b0{;vVsY|E&{M)JDj?mU>|^oO@M~dku~0gOa6RHFp=)nlEq_>pM^6qtS10F zp3f0kwY1|YHQU2h5}-k3-D3HCgWmzrd*~Df0oXZQkN{ zK}-5hfXZ2#59H29{6P0a0=9|E{|H(iTAW)xwnPb(goHGUqtj%{;=m1Ue zd^GdA%}TWD+ZrXTL1dvB>{-(RKKh3jOcKD!;i4F9m(t|(0sP}u1>+D!ma@T49oQ}v zDDVvukcY4Zra@^u>`zef^P)#qYCU$}7A0)sp-M(Rwo}OjkOjfE?_a&ER02jvM?bgX zlY^B=fZHM3zJ1+DWsg_@EibZr(=-7uIUBLGwDfklfuG4_`Z(bGQ_e^`6S`c07ZiUl zT34DfGc)r+kbx)jSVl0n`;ZN_L5VUU;qJo1!ib+A5|VX8%n}cn6JTP7)sZbWI5_y# zM4W-qij5N}Y2;BA}or eb$u#P$Mp}f{76RMq(d?Q0000Px#32;bRa{vGi!vFvd!vV){sAK>D24+b_K~#9!?Okn1 zWK|fR-FDeNcA+-3t6{i{5{GdRakMImP zxdI*eA7;andfZ_v>_yRmN6puD@pwF5swm2zxw*MJdJqf-KV4f}^Xm}dq(OUgw9dJ@ zx?1G*dVkPstIy{Fk37wstFS2MG)Zck%=V@qYcspHNBaz5! z+(kgQzSadQDk?rt*O^pwcX#(uuIVvrZ*z0=o2+eZX=xeZCIaoGQ&Us*ter`Q)9L)% zs8gihE-o%s@U#_SeSN)oTA?RDKYvZMLkZN>)O={9 zE2xtHn^m^f*4Dmfx;-G(rsCq_udQ+@fu^RWF+Jq_{r>Y-+e+%up|KQ={A+Osjf{*u zWwk>IjE|2$Nh4om%s1OG69<+gr(|(R%dwf6nQGZ=)qNMJ|2T&GvD@wbMK-5Mj>%|e zC=~iYS6e{pcFO1!LO2|rNa-N_C9AE3$a1e{_>r~tr#cpo$4g|kv%bE5l6n`YG3jbM z)&2y$Uhj{)c5caTE1@kol&Jkm>OXsWdY+fvDTIN6foJVt=k)Y+h&YL3$J%c<1cSlP zh+zl>ur3T?1=!fw@Bv|h1W^B6WyRy$OvL8qW&uusJ5s+y6Cywudn_$2mE#1+O8qht ziM$SkvB$!~!eclA_H;qfqhBD5J!WTTt8fD3VCGKW0K(W~ettfP6X3qoFZ=uZp8>+y zV|jVG3@5;?sb9{`%~b+n?15WTgkAT8eh7qFI1q!8FbJ^kpeV`(LjqJ*R(=A+vBTit zUjMCX*is1ZKEqOGy&oE@%(-;1Xra z>@glWgIu_aW$L^ErOWv+&y;1@i}v;PJ(uY#owB5DDh37JX{Em)}v#isr z8NCZmWomoi@pyiskbjNHw3VI=6k&_f=$^46cPQ2vv+S8`SB)}m zX}OR_SI1p&oMc!y9DZj%kdM;!P~!d}%kxLm8fCS_?M%K#R>T{m$)2v!DBE&XMNv`F zw-oYoq)TB>%VcFY5lG9)cj1!uJpvjc*hPSCGl^qmd7r>#B;)O}zKDB1XaOQzNpe8O zyl#3k;7aq>jC3aT5k^NxBQlbYGQU&EKkTquA+0q<=<4cvK_>EJu~@m#XZr$0$fgX` zCS)LgVq)TP3i&4-b}zU+Xi15{zqFEk^vFc$n=mXCA)n+Z8t}+A%H=w%CF5whprGJ; zk>ocvHoirv`FW20T4;T2x7+=z2=c3|t3R@RU!Ru@3EfNFr8HXd6%k_sI^3mfBAfJ;6YFPQ1Mt)UQ)yF_S=Ws-N11fq~B#;e zCLhf&0QrK$Q79C8ACW&iJlqE4TOPx#32;bRa{vGi!vFvd!vV){sAK>D2cStrK~#9!?OY2? zm1P*F%+yTtQnoB}HM3=2Qt^_OrrZwa(mCAW5S&CVqj3{(94KfDkP)NlLdPYjku>nq zh8o2jvE?Qs#wcbKVr(>GQ8bFAC<^-C{D9w&??2~oI_Kwb{`cA5an%3(pS;g^dB5j< zzt6=5fj}S-2m}IwKp+qZ1OkCTAP|VTjq&mEJIBVxRuS7sY!CVK3*_ek8QDH!JBY0# zwpdc!!QA`xvot z8QI?&jixs@H@AR808G&#@bDP9a^*^d&_86#cDE$~PY7QQa~}*pbpDj3rKOdyoz#{DY!JSJcqp;%TZd7bS0{G@d{JY$g^Y11P?Xp2bZj@;xV9It8|K4NH`6iPnFrUMM z0tTPWG`I!U2x7a5c}STfuoD5Q85+zW`{`P_(&U^^ryXw39~v6c<>%+;g@uKE2AeC; zHQ<-iXf)p)K76?D^y$+nj;6WWm;eX;0r%LzpvO|aKggF z!y92EG@C}&tbDcu1qTOzZq2)jii%#ZuC7iZ9V^IOV=3!YaCT;9 zX3^l_pwGl}Fz3S}ESFRxOvnEI{_QX|gWAg@0g^1_=hB%F@Dv+n`uO- z8QK@+rtuITbyZbWC5wy%2)UP7N`Nb?V6ws)8M@7;V*Z|ZV?I%4ZSK?sW~Ab;RBHl>SmS%y1AJAQb|e4t84>> zg@rlh2#AP?_*l+W4{>pEH6kP&G$}uj2lfiTP+MCY$4Mranj;`6D5zELr6-AriB%?) z;)P;U(01X&H*VYrW;b8HzP{g>sPIxZH8s5q^C4!w+{crXliw2=3H!L^h-@+)jKuk0 zauUkrJm*7LN_u|_I)5r+6e+?2+Y9?Hb_6VEAI!_k%jXR-GS7bkHIE?9!Dg+Zq9ToK z$U4yJ(@B8nNMxU|{WevU9-?q#i>h=w-F2~gM{jTML4`swgpM{%LUwlcTOuQ2EjtaZ zV;=%hjX3(3nKo?AcbvHtrJ$f7S42r&Bpe0v>Bix<2hW^2lQfgElE}!&kFH(2rYDPb zClW9z;rw1xQVLM| zN+XAIY?VsYj|ALGREXtz#x0J zmdY3F>E{)MsCmq@n|LIE(khn5l!L{@#MIjDd;q(S5POD40Q)!a-^ zPcPwAOv8G&(vdIzo=0=h+>`rdWo79(IXQ)nY$r~fc%!4EBSa*RzQe`QL30Vao$%^n zH>=JR&*Dhf<}A*qLgW&cxdwU}l-C?5VCS6a`6luSPg+qhHrqXZD_r?z_KGqD0)apv p5C{YUfj}S-2m}IwKp^ace*un%aS95`T2}x7002ovPDHLkV1iTn%PRl? literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/hospital.png b/web/assets/Cesium/Assets/Textures/maki/hospital.png new file mode 100644 index 0000000000000000000000000000000000000000..faf294e870656bbc24bb750a80e42df7d219ed7b GIT binary patch literal 909 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49rTNE{-7;x8B~}m@S+rbL`{lrs&1q?MkBN zTW7ektSq@;=KFpPr=rJ&7J-grw*PFcK7J?nCw}welVsVRcTjPKLdsgvRv*jz@)Z(~ z@0uExzn@#VpZ)xm3(xB2pDw)cyf!&f(({@cc8m!}EQ<2}|u0zkTE3>e~)_4q|{pP3Mu#5Na zhids(7k_M;$S~FGsf&683ozJlf)BDWZucH+@-%KZbyee>;i|^_7p|W66m*a|sb^B5 zTH#x6n01u#nSQ-$sJID>!XCDj8|Cth8tj{N5ngwhWmk+nE9l(2oJ~`^)M@>{pp{=HDjtjG;A465{r7pv zxDw7)$4$J;W3q ze{U|@`KNKA>#ZJ(*cGCNGJNxmcDzuM7Sv-=SQ)nZz2v=56MH$Fs~y+9e#f?V!NrU{ zsU832ZgvhHvElQM=5{Y^}n^Nv=&W;imb*EQTTZ$~_tDxaKh$T(-W%sZjlZ_0MmEWR-?@ZrgHPGCobOlv9mtp3=+V``_;2*(F>D zHwiurnmadiKX2vLA1kh_pOC8nidZgP$*sn?M*Ys&Is5f?9OAInl>DcB`ik;Nrw{8b troD7;y82_c*l~G*-Lu&K8|Xg&BYZe;o8YC=yNf{X@O1TaS?83{1OSi{ej)$> literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/ice-cream.png b/web/assets/Cesium/Assets/Textures/maki/ice-cream.png new file mode 100644 index 0000000000000000000000000000000000000000..323c964948a2a1fd4cad80d51262d13b60b3b242 GIT binary patch literal 1602 zcmV-I2EF--P)Px#32;bRa{vGi!vFvd!vV){sAK>D1=mSLK~#9!?Okt3 z97h!2R3X&XK$GS}C?rrqghC`FCLte$hM2p0|Ee(;bN1}lsFc{$1O%@IK`5d0OTkuJ zLMs$S2&ErH@N@emfzVQlVkriS(Ao+ng5_Ehuk%_DuHMYt&hE_ao7ow7pyIxH@AsSc zX7|nPtm7bSrBbPm$csBtFH7(C_V$4topp|F{{sCC0i~HpN<_$Yhl%VVKQ|F+6}_Gz z&0tR?fG5r#k_4J6Ib`aHKa3pssz@^h_nEB{=ok8Tsi##Z@ME75HVDo}PZk4GGz7_D8om!ETPOz1Rq#8ag#Kbwf4yW%>Nhoncw2s4QSV zOAjXSkJAiXT3X5l1%6pbpI2)UaAR=rOF^AEhOXnNM}N@Zmqm6I@N{B$(mg>l>{4gv z&tVaePA31TML{bRNf)`$gx1?B&Y~l61z=q@Us8;ZLy;@b>lVQ#=ADCns-->LmVs zh9(U$M*mYR1gJ1c09yBA{wV!}kv! z^hSXI@Dl?8uT<5378Y_*AOQTtK)_3O4hVM+sIvsv+fYluZt3jkc!-FAr#$diS6914 zb+Xos(GUQuQdkHWA0K~@N5DXT|5u_qCnhEemhjxcFA>mb%!3Y1azaMbY@X>z~ zH32*C@R}R}dmQY|PQKw2aKumojySqBngdXuff_t^VbzfwofVIw!&9TwZ(T^~J5B3bB<|^=IGV#?(f0`ANn_b^z)txyzEex zDbT-h_x>CL4q{6~jP!HRF}2Ygez#EgI1KQi-^iq&TFaG~wlEq^0BcM8Yw`G>L4ptc zq1$R6W)$3=nHda{0O&7rqrV~wPKBL@7^DAGR0yE%9eSgu=Ux!tLqFQ?`B9mMR37f? z=1^8AN)0|K5>^^w-2EJIqSk0Y6cj%b6ryUq|W zfc=cuTZ=Nl2R&%ta>ty8W+Z+5VTSP$28;Ut2{@}N4KYUlS&O=h0$n1Jc={uYa_k0|Kt>-*Xb`0#&r^!q0u;WY}hIbsYs0gYb1 z%*y!!YNJI}oCIo_I-k!|*9ze8w(KnTnV^AHN*Ea#`J@tj_?>geQiDa)dla<#JmaU; zqNu1yXUqv#rjlS$lTSjsOYqw*S|Lo#I!?I%09b?*A1i|?9{>OV07*qoM6N<$f_oR< AT>t<8 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/industrial.png b/web/assets/Cesium/Assets/Textures/maki/industrial.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3b525db81c45627bcd6719793834151e035a1d GIT binary patch literal 1092 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49qt@T^vIyZoQrBogwVV&~{sE>%If*FGAmV zuD;UEK3~*xk>@Ovi_WtaY?>(3n!xAe@3odw%_-A0bwa;N5ABe9Qru^y zM)BLtYp!NF?)_jMDDqTx9c%2XIyE)5eH&O-I5(-V^q!ss zjf(O$3}Mrig=RR;-1R?no45nt3mx4ly}i8+CnofrxO1E@e&MG?77}j6^?d(=NP5i*GTW%{usx+iTyc^#9+I9D= z;SMK@OH(^THAGfP@OrN{JegvoyLn%((t@dpn%S0n7RyXLHsMojTJ7zShOXJ7`(}q7 z{Pd~lMoz%m-j&y1+s*tM>Co_RFaM{u?r#e-On!xhMQ9yOGF04br_HGllf_@}a*VM_ zx5n=N_10F_)}rHi=AUOLZP_Ywz}-ON&x*%oiSRf*vs42%pwSqI`J6&&0f zmj87vEmmYvo4<7FQtO!AOFQ2D=lKyhfAIp<1O{oduWSotHwUe}Qrx1}fAr|lYA2?U zPe1<%x1`UzdiAR3+#dIx+n3FsJ-gb*+S;1;hlU7Oe@of<(D_N~h2aqgo~^ic?P$25 zkH3ZM?LEIum|kfeub4mKiDN|2!OhPD1FTNPAI^7;m+tLX0OouKPgg&ebxsLQ0D`K| Ai2wiq literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/land-use.png b/web/assets/Cesium/Assets/Textures/maki/land-use.png new file mode 100644 index 0000000000000000000000000000000000000000..f86b21bcd08af8c9ba96eda25409fe0357bd6245 GIT binary patch literal 1773 zcmVPx#32;bRa{vGi!vFvd!vV){sAK>D27*aMK~#9!?VVjr z9Yqv?(Q345YOy~?s|hBJ+L&OgR;#Hsid=r~DuML!FW^r|6o|%zAP;CTQi7ByQt|0FB$Y?v0}1+oxh*&+xi`68c4lXH=XZB*a$aEX-E+=2J9FmD z%-NhAPM_V~-NQ&uQp!U)A^RYk9uaCM`thfbyvayP_V)G;=;m~!^Jxz@9%AMAqYNE? zhaiJq(Wu2g=fl1uL2vpDFXv~ACIH0RhQ6F9!udKtK>EET)GqYs+)et??d|RIWHMQ^ zva-@ZBWr7G^_!cUmt2&6UE#jJ(5^4oWVdr?XQzw_0GyMSmX_WrEG*m$A`J}<^MpP# zSJ5XRX4loStWCRZ03k2{Xo*hF86O}2G^q145{t!lbn1$P0YG0kfpZKi=Vzp@uI?J< zUhyac5aRrdtgf!Ujk)Kk$N|7Pzp}FOIxheqgz?}mh7Pcd0MG>mPCwq>-aanU`Dxh=(iNfWE{L4D2L^x(IboJ7!TFicbP;2)<t(nZvIiU-c$h4A79{==V6$tNYO%o?#X`5`uci}482_es1S0}%IN6m=NMft zx;@QBMMWtk0T7&jTQvYKp=mD3CRzFt0Vo!7(#kEju1E_2xOH6!&lGlkX8qtQDKymu zfEN9}7sJwWRCxfnFs-VpYE>5igz>;q9)MF;aCv#TNhjy0L(~6g(*&wL0r`IO9S{o2 zjCTBrHe)~t0F>$izzQP(-R1%DkO4TX6@aWAy_V(x&b!U-l?C8+DNiPVAe#vc00Y1P zFaQhy1Hb?<01N;FzyL4+3;+XwYB%u_kz4y%9d1)e=RiBW5rBIXQv71%0Hlp6RY7Su zrRkyJ+^aAEOW1*AhR#3kL+2;7Z~Zod@@2G^AoU~C$B}>Q8}?N|oSvTkNcHXLtmA#J zvazvI#iaNk`qDXvqe|b02>{Od6%`dXIGtNNZUDH%`;(KCpYS}VKpiNA830tT<$Z3T zv9a;zK!b9~0SGyY3v(sRy$T`=fKc`855c>-k8uN#NF@HWe|KhP=0jQqc>%yxdz_!2 ze_uw49pZQpHUPMIU&P#|zP|n!&*MP|0Z6U-1-11sI$Q`n09?q4X0E@hT4EDEIdE4vKn8sTOC#3c%@IFFex`6B831z8Xqc0XTi9udnY*2{YjHkplpa zzKmpCe}Dgg=f)BQKyh*LzW^ayaOp(b0LHn-n=;*j2F%NVuG7B=e5LA?|XmmrK>nhB=v5VG01<>$Jl?^3dP!S0))J`+NYavNo6};9wAC3;+Yb z05AYl0x&o@*bA>2cayfZwkfBVz|nlyi--U~t4lJOtYHcOMrs{S$TJ4Ov?N22(mGm{ z`f@P%@qqR|rd0U^^drwkrS-FJbl4fLkFMyfCas@Y5huTCi!6E6%l-ZbAf3MZbLKKk P00000NkvXXu0mjfJQXlO literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/laundry.png b/web/assets/Cesium/Assets/Textures/maki/laundry.png new file mode 100644 index 0000000000000000000000000000000000000000..53fd20de4216737841f12430ee9fb6d7d338b0be GIT binary patch literal 2407 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/lighthouse.png b/web/assets/Cesium/Assets/Textures/maki/lighthouse.png new file mode 100644 index 0000000000000000000000000000000000000000..a78e21a5b5a78a08a78d660a0129a7e0eaffbda5 GIT binary patch literal 1944 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/london-underground.png b/web/assets/Cesium/Assets/Textures/maki/london-underground.png new file mode 100644 index 0000000000000000000000000000000000000000..94972f7dd657dc83ea14b64875909009c651aedf GIT binary patch literal 2979 zcmV;U3taSxP)Px#32;bRa{vGi!vFvd!vV){sAK>D3phzcK~#9!?Oh9S zRYw_)JQN4|5{tB@6b1_NEX7v9LMcLWliUOdO<6p=y9UYX-=AF_-BY=4-<7G`WhHZlwgyvNkfTx)BIl~YNk2enDMQ^ zbasLhT&5VJzVxg|HRDOV5HtF-Q<@M4dWq<%Pu;CxV&+9AzfCc#y1IH)d3kyIp+kq} zZ{51}+w0e_U$=Vo>dmWGt$JrHmb>)a&T*ndx+Jo%S<_wN11y?gf(4c0Y; z*4`%4ncs$)fWnuAyw1$bJVGb*KW;N#MCs}2zumuo|007;fUogHq$=9B%;anIVpUaD zqZcn;{C%I#_fa?)&(SAzBYsg}g>eQ1k1|*x%*VCIo3v4Gk`LN6J zVt7FhGyegN9zD9^?Af!^WH-UfUTq`n=H|_tDQRhG7bAi3^~vw|-#&Ki*j&jbbnzUP z12mFfXk}$(8p-?eNMnA0$VjLV|p80|P(!2GXXy_z9o9y4=$upoVN3FO_H-OM4fc_7lVv$GG_St~@5V10u_ z;w7`wAHyp>oL<7qS*`tb(R5xFlkjcfyC{v1qyjUC^ldi4=vN_zp3&PBS((BQC?o2A&E*o z?cl9_gy#D?{~R!oVN^=DK%lSuu3AJ4<8Sa18#iuzRng7=xU{rXq;P>JJ?>KK%TQ4m zluX_Vm3NpnZQ9QS>+j*_2K3<{n39t6N0r6r<>kFDI{9u|6UdSi6eUUv zEl^2~*|KFzzQt#C<(dC^Sq6iQ0RJk4`YP>$Yi`q=Idk5!`d+hV&wk6|bNmg`UFbhA zh+KAL2_Sc7)TmLFWV8RJKG8|JV|AfO8RX~j8Ug!PFsZ9Wb0HfK&fbk1H&P`Ye#=0j ztec5@UL!cF2p$Pz%OYTnuGAsTIA;m*4L)ldSXC5*bRYZ@P%AKb%{1o; zr~$7FqIl1+q@*NIGs_*CJ9qAnd1=!KTto4LW|ljYnVI<$y#aay^akh+@X`kGN?66i z)nty~Ws7b=gS5g67cNXzftWP~r!{NV6pA*WC;v-SjA({Ao^AaeGR67w*g#r2pVgci z$yv=FtiJh|q!z7v0E`o6HzP`vn3(w2*x1-A0BQ9}rP2lPH9wEnNCgFe$QI3oB(5n_ zrks-CK!^>rs$aPtCxcIsHUj*=KB)xbk>HAr<>&GeWo2a@R0z(W5X}_?dhcwywo62S zSQQdp?<1|;tFZu}z$*Ep-=SggS>jqVR^4biFoSjgRu@ZG^50qLgNdP?{N$U&y=|>PnA;aUE$!DPdQCq8xHJ)J2lX|j_RSjas zs7ygn+QGp5OYAvrQhx^n@^!hnxy6EL7Y=YQ`uSx9;TwPv`7QY1Qy})O zT1Ja{2*Dxh?RHsGG@qWL5}*emuSk*^9phw*A}gaEEYV~8RI6on@7}#caDX0jJ3G1? z|InPAoFAxqiLi^#xNhMdbKBc6j`~gjz%=7_eOzzFh zy?)GujSW^mjKH{^l2uqsl13h(IsHbu0Dghplolv-6#O~uXkl&0RI`h0q8v+7F(2AC zHtf0&=NE%^0ZvrNBQwtlj~T5l0kAod>jVc0CUeu zQZLp32pBCB$lv(DiM0Tvla$f+3U{-P=R~mt@{k=3=nw<`He<$&V*t$1z2y4!>*>I6 zAlDITI(_=|474`L&dz>=wM28QITWycv|1A|ALU3b!riW>rKtD~2qCH<-D)j{nl6YH z)M>HckSlF#@QmW(;^m^Mm#~Q*!6vj3Ss=hkRLXw5LJ)zQH*a1oF^fBTt!q|$5rlpI z{P`)UFNieeli2wP4L&4#rjIB4#?iu_5jj9mUa;{ah57L64H~-k_jI>)_T>s;z{9Q+ z6bcIB3=W8hp3-a+girtq+EmJbLLl#J5aBcEQ}jYaHT0$hcaViO;T)mmiz*W7G{HkQ zXi*smqDS6G9)Rf^wX8pQ@ZbUz0fw=5>s@3t7&v*j#a$x$!ww9%8)W3QqIQ@y*b7A$ zbuHay)+qTa;5R@Hqn_AdWnBx9k38w0?%TI7C&+gL0+vpz zsHQfU!#2Px#32;bRa{vGi!vFvd!vV){sAK>D4C_fmK~#9!?Oh9S zlvfpA0&RH}DU?FfLIp-_YH4{H%EJI9&&`WR0zbOH7X!$M8!TS|lJRkuHQ@F3;r(W7(n^73}gm@(r-T3XuG#Kgpp;^X71Vq#+c z6CEA>Nc?`^>2%&rO--%H$jCUoc=6)BrKP30ckbL7%RG!IK^;Ox>brW=@nHJCefx5z zPoG{cnEf}wSV==6}wYXQYwuw z+!G}vBz!t+)~vF#XU|S&+=h0+#{9O@og_DX@7}%9%a<=NhHCLQ<5h}{js4fmnKO@F zxNu>LheL=L^ir^>oDPCwb(`J2dv{)Pa`K-VoAJa!R4-k+v;@Z6gG%ZNFD;NIzl)S6 zw+&WSR*suCZQ4(b>UV$9m@#8MICktLoRW0S` z=NEZ!V*~3D#A2V2#Wdh=gq^zNaQv_Qd3MRcT?8i@pTX`faE9+gv3zH{L z{sr{8a5q0`=pl$;?~1Td=^8w#qn$CGFH@2uyp2+W%zr$3^yrF3ix%xeUDf~QnH-5 z1^unm{ch3^L&v<kES0l^n%&11)oy@vna7Pmmc4fQs2<;sNVsw1#!Vc1Aa23$iC{3+)J&R$9Gq&RT&54b1zDeIJRZ}68!BjoY5@enxdn#~ z9hy(9Kio{|4_6nkef#z`9O*|kiZZxn`qaAE1^zzg7N9tQ*h614Z-85F7ixur?Ua|7 z&n6b%-HJ4+dW)f2IN3R2=k6hvATXjZGZr2u>uLV?!0x3wXK|59h zaFEzbdovE8HHGaD`$qtvxb%D6D z5jH?`JE-eIHjSfFQQe__){F%YR-s+gU^39e_w3+)a-0f@=6XGVJ$v@7u;KvfLA)q> zl~u|f7n_-x`D5Y$y4v6XTB;!3&Ye3~aSmY1mM!Z|KL8clg<<97e1q`--Vu)#2T-q} z0+j>6cf2h&BO~MI!~yiQ!2z_TipMwy0QkiU6%?t0SR4=znJ)_cw1E+RL0uP0=o`31NdE{c3|M=rz$q>+?!LE8;HGH0 zPuiGtd%vQ7|J=EAf5Z_UO<`6qOVWANpbd@}0ot`|*EfibylH~;yH#@oP~<@BNl8h! z)oKVSIISF3JXCQm25WGPae8|CZwZ&w32>~Db$^tmh03eYELpPTyS6FLl^beKb-}w_ zE>5v)O>uGYN;5Yk2Zhx8z8g1gjOVzXxFJ*}H)>?9hI3z47j@vkfyJC0L0Vec?}%HF z*chW@q_B)s*9xiTNI$wfslgtW_ln7cM!f2hqC=6hF-=?25PxrsLOs#-!l~vK(*I9X zeiQ4o$3PF1XRC`t#LKw_KotqY=GSbQ%=@}E5zd}H`(0)c)(;8QGu$?lw%`R&b@$A` zrZz7xZ>MJB;ZuHE-vIURpFDYT7N>&~fg^$Y+ajH+Zt`^sp5O#G*rZSg6B`35r7HQL zBGGNn5e{U>sKCp1bLJ>p075xBvuyo1)dbfNF9SD-GQ6^s-m9yeoSb}%>Xx_dFelk6 z>eeqTqT?z~Kdz>Bbc9j3no6G{=n?_dUpQ{^=FOWo5W0V;ZAaJ0xp2|yqL(dOwujj- zT%j?@5eAswk!s50c15CyK;t5Ja@hG13w%Z0G;nrK!UlxA0)-Qyl-$Rx-3Tf^;S`a< zZfT}yMLO*MNU+N-+((Zs$1R0tqS<^Dw-Js)YH_o0!#F~aot=GHBLr<7f$+%0eWJlO zCPc_rHN*5?V+g?W)OT|`I8i=>#C*U`%&NnPK9oU*%gJGcup7m`dPTB(b0h^2GN-oa z`hedKxH;3(Ep?layKddOEgTmRr6CBGG=sOF)~LRI)SPKf{{m>zq)BHr1EInlf%wRQ z8E*Z!T$~6^(HgI)9|sx-p_hv}=J-?1=!8f|pgvM62dkSpbLPwpPVp0H!GZ+`G+p&w z>oC6!b=&st-TQTp*P~05BCrIGLa!Lscj{zhgJQHfH%`o}KjU*$DgA#}O78ZV!_!|j9H$hzvbahij=rUodqMEg9*M7?z^Wixm zfxlqufb|REJ|wcs-0;K+YINoe+1xD-5jq`AwTPZRCDFD=Vwan`;}? z57nIx0tm((pofV1$>&a;I+e-Q`xud_d7sRHpjADZn-EFqa74cxMxq1~lTCd245sGd zGt>}Pl&d>J>5*7b3^mzSFqb9GDJdy`L@JYeYu2w{U#OY=`Jy8fADJ*uG&(@f7xEBC z^mc^uLnTjqN#-+eN~LB%Y*fgRNXhnf z+`Ovy@e0I{b~$}Ggm8*cFq}s10p?Q>qlT@YdT!%G=&i8_$9-i!#!qU>$%p%^VL;!W2%Y5O+Rv$TXWG;nrn%+zopb4CKDn8&22G{uepjVnW%sYgasQ5tk@jfyz z8o5dD8#sj5DMotgW&{+i!Fi%W{`KVs>_He6AE3+xb(>U)JCgkxh`DVOM~xjqYYH#A zbm`J$WxDO-ZQHixYjB?MCQdd?6?LNQ0p1z^q~wHZA+qev7D0Lly(k9f9ck)F zhXhSkgAG(sGb(=obdxHim1?V16X*PU3!b4SoM`lZrzVay&P{ku_m*x;2WNy}kd~lf se&3MF>sojS9i>fh)(Nz_1tRnR3r95jUO%!%pa1{>07*qoM6N<$f+nSEX#fBK literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/marker.png b/web/assets/Cesium/Assets/Textures/maki/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..825eeca6997b7946c5308d0208d9a39fbcf2bb77 GIT binary patch literal 2448 zcmV;B32*j^P)Px#32;bRa{vGi!vFvd!vV){sAK>D2_;EHK~#9!?Oh8@ z)>Rb$i<*zrOr;c4QO$ z(cRrWg2?!;uCB+3%qQ|J5oaQ6iEIENf4`o5t|qdQ$U-7cL?)6yA1T;}O`wk?06tD+ zDfzyUe7X_YVuR?&zh6aUHj%M*Wcy#~lL2%h1{(plCT6;GX4rQI13Wb^>xKbzp1eqY zcOH>Zng*W$;YjWGpa5)dZ}+@;^QQOp>(_m+UAwjozPGitZSCyrbRW$BLw?(pe9k4G z4q99FW2wXJ*S2?bbaHc+fb-hcz-!Yrb zH$6Q)8$&}wE92tg-YqF9No;9p@fn~pT!>83%Br8$pN$95j~zRfuw%!L3Ig`81mt@} zx(6$uq`<(yOIcZ2hXyLWFfIBzQ^X+A`0N?!TX>1wigz~<&=zwq$zPi(dC zLnYqc-rtv%l|@_G4bLc23G^gu#vbbA$&;^;RsXY;z_Vs4EiEnAN*JpwC6LKZ0JP8R2`HJHcR?EsMlL%gV~iRGQQ6Pr|~&KINnYQ@FHNysi(C8h1RSp9qU z?0HXx;NKS?AD;%ORmfr&&~!r|@ayX8f=njUpK4VA?1J3f+;l8gB!&4|sioE5YZrWn zB<=K~R?=w7!ORxQY5A~Q<4rM)+hMrtA1gs4tB%LgV0>)!GAGIC4`jgn$ z*bfjhG*_%rW1k;ROiV1&68Io~etxxx0+xxPfT!3W4i69iSZfM^{1BU}2AZWL4%pk< z`-;{S045hQz6=%yF?N76693=OpaQyq-N7zKF%+VEWUpq z1!QMuXJ}0UK&?ko5sSsx0i#$F)`bff!eL8lNdX5B9?VCwq0_~x2drm#KwGzN{ZUKy zzp}D25-HA)6RRS&Sc~=GUbkwlAm(R-XnaxHQlQTSDk>_Xv{DmDNJw}aQNTj6IYFCQ zGvw*%*`xsl+(XO{*#Aewrlma1PU66U18=Hb0sj8}HOT7UBn2_c!VEPuGz1t7hC6Cj z0Ed{hKoV*q)@TDL8)^lA%a$$ISvCaaM~xGt7#KMh8f&Q48OO)RzatxRF5Lwqv0Lzg zfq@s*20j#>;Bq;lfN4_S5m>}d>coi?acZj(z%5U#v4`Y$#c1yzBO8*EXrWp~tN%7I zzYzt%_gkirgLvga0Y zkt3Oi?O!k3)-|**oGUx&ef#z)j=byV=l3mAa)g|}qaf!&COC&x0Nfu?Qo#oN7N?7r zvmp0DQ`Ii)c=;%{es~TuNC@5jj!o8akuQ5S?i>9U~f5mppvPNSEhYWGG z0`CEDR$QNH8kSmg$W2dA&yj1kG&nf8iqp8yNl@Z|9&1=zVmaoCj7H-vPBT|$L8*f} zohzteU?*fSMF9Z; zmt>G^`=h$LI+SzbRmXb;Xk(`r*oTA%hg;`TMm^ct*{>lh-=w+@>a?M&g(-qtCQ_NA zu&}VtI1Tyc32GelHB=V;<;Vf;a|sv@zi{&WYZToveE?C>8jMdQa)-sc*bPTjL_Gu8 z1!#}af`Woq#mW^$MMa(FL_M;z{P1gJhi zOR(X5Yeso_`O8=nRw82rEe)D0(y?Fw^Vnc8+#ZgQGb1A-o74MqhM>hkTi;lutq&bK z^!iYTrVw&+5^YNbEf0+5KGem0cr6x2E2PXeZNFEN@=Gn=BMFXjC@y?Jd6CoQ&?sr! zVHt*|283xH4UY3c>^{5#QPUykAe7*Q0R@iJR(}v08u}&DYFPTN=Q38pQjR}3X9KC~ zDu+%EoX*j9wE6zP1@i~w05#yYXe5knKXc|x43^~-{W6_G3phsXd@#Vq;JkPrWR4x- zfhl1oc0S0>%}s+unl%ML_{vE!+wJ}!m9PW@GA1VGBWv%4GZ8=cJe?*b%i&3FEPRQB6%v2sBRZeS1AGFE5Rg=W((l`Cz8V5%UM|&iI~g zjo1|;$=+37= literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/minefield.png b/web/assets/Cesium/Assets/Textures/maki/minefield.png new file mode 100644 index 0000000000000000000000000000000000000000..60e174abbcb228c0a069449a161e8d777fc7621e GIT binary patch literal 1907 zcmV-(2aNcMP)Px#32;bRa{vGi!vFvd!vV){sAK>D2M9?-K~#9!?Oj_; zV?`J)yRe|^eb)q|LR{Urn%##@$ZpiQ>jes>7bpS+DHo$4ay10CMj~Xn2?_+cB$bqy z00KUUgr`Ok#gK>~F@^^*E2cqFOp!=LK@^-ZttrQr&YW{*=CqwZ`5s8yGc(^e^Us-o z{uxv%Zrr$W+dBbp5#WB#23_J~0d!t)iL*o4_V@Q=e2~vYpw#2E(r#ke0gfSuwjQgA=M1Sl#h8s{uha6iCSy$JvjXhZ%8T*LrGD4;GkOX>Y? z?Ck8EQ$Sn7UA!Li^@S)Ofvr;vdw(Jd`Kzm|>4yoBo0~h$uni}C@OskoOOgH>sbu$~ z*Xvgf6TmeYhcl?Z+E3kMu^I})0ThR9v>fiojp^y>B#Ok}f?9W60jP}z)Vd4|47`9M z0GOnIpj7Wi@M76I(!%lpjNB@KoP*@h9U^o_j=rpj6DJp5)!rrLTF)_n04e6 z6$=XsPZAeuRc5XneM|pYquowZr$o-Rcug}iT{>;Zq z!FAXTH=E5L`)XWcW8>>mMgv?dk?j2*ZYY+9ulKh?7pfa4X46B6#Kgqk1iwkf=wX*= z2vAZ|@-9Z59v9i`KR>JvrKP1KLX{)rYsd%7#KoUQXjS7$!>z=LXL= zCDd|LQ&Yc{Ljc!X$Wf2-9}`1940Yp{3j~W}vIv4`YHDf~?l-{LI8FEC#@yUof>>X_ zwY8N(Wc~pU*Pv8jW@hFou@&&Liblf7$jI|@3IOLaG4)7KPhS*UrbeUr)t>;j(dv!; z{rxZDG#t3G9XSPXtqG9JUt3#yLTY*Q^Yccgu^5y$B^vI>4X4wYhEg_|v_F)iJXym5 zFe)k+5v{GQO^20bv)L>p1n@Tspg?k#g(|>(a;%DRk(89QNwfF+6CfuiXGYF)tXAtQ zsIiYQmTqBaXsC*&06jfDuafLo9zsXT9+i~KH+p$f`fvBGqN3s*k^;c8Jc5m%k}3x` z^m-8^_CbuCuCA^+lFxU;;c#SG7z+xv{aaa!$6_fZxwj1&HNtNIV7y z2XhsjC>89GC3O=cbFP<@egN_u76;^>7n}VR%4lwGevNv(i!7IK!CedN;RB?8Y=qw`d&7h&7T+y28T|k`!P8=*$EFhNKFC;&sm2DG~i`V z@W2JUao5X@FuriB63M?&3ehmP2oSQSv>h#&(d?tn7nDSPlo-;7hli^IDack?Svg4a z&Lm=Mf~u;jw*xua30&4!Ebr12l7E&})R8rydjg|BK45x(FvkAt>gqZJLV#f2fMIq` zzSN7gg9RxmDGzf27$PexD^Bq)2qvip@dkW2pM)6!o{?j{2#dxML8H<95-fS2t~Q-l z!dd`phYaSBVqE&9H2h_^+n-g;LQLuoS#@=_Ef9!@DVOlF4#8ePgkl81IbH7yQ&UsV z6c-o2rv$=HCes(Aqob9+BBYA_Pkkg}|L}@5cxeW_t_+IQ-Q8VVUtixL7A-9;&Ew9AMBi4-Fgts`+?w%nuPB#K))t-Ei)wRtU}p?LUTg tZQz_%7~$t&mWPTPH*VaxapM*m_74Whh|T#d9P0o8002ovPDHLkV1hw3Z7=`; literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/mobilephone.png b/web/assets/Cesium/Assets/Textures/maki/mobilephone.png new file mode 100644 index 0000000000000000000000000000000000000000..a40ef9c1f6a026e82e340c37c3dcb7667399555e GIT binary patch literal 1474 zcmZWoXHXMp5dDH8k)o8LoeBXYaMCWK5I~fYUJW_M?Qy!Uoz-bPznT@(@gO%MPeVva%C@cQ+= zgdXD6iS!^OuN`zXwloHyB2kFz#Lt@{B%6ySpzQte8QyT%2V+kH;7IdcLfXBb5&_`1 zGe;T!b9;nCyN4m#9&dM*m$WcWbQq~o4#W=$$2^A(J-VURl|l1ulWl)h6_eO!(}zN1 ziarG{C(0G9t4bzgl zR~Zc^W~LmGQe$enunc$G)437`t4EO1IcgzmA!kAy4j){ABiDB!*`iF&{5<(R+b?+D z2ic%}r>d&z!YqdqY{u7w2rn1WytUIqdVJG8IC#5sX=%x$Ff^~ft*s5W^fxNk_dqu5 zT&QV%es6EDJv?P5IdWsSgHXXeZ(xuGH$nmx-QD%t2f9@Z2E*|^H(+IL%}xkRjDMem zu)4E`2L@Kd#Y1y)a`YjMN`(Ric}j&0%&SkddWX`)ysc(nBtnRuaMI5`aRouS_~TS% zD-`V9s(0i}dKY2ksQO_tpm7=LmX--&Y1l4xc6MH(QmNjjAgZdWGR0+O3$ZnvL+1VN0GkYaHBg5Qva#qU7)YKIJax3VNfI#k( zy7d+4b>`fPi`lWpt}d)1)&4UiPpgR@6~$lVL)cQyX9TLX)}^AgFWJ~M@P&q`xNxG4 z+8QMGHu--nL&uXpOj+O#0J`Q(IwwI+UOq%|1V~9srwqN0)P$s_rq&$K#xMypxbPlKjK4fHBV)r2hZ|7ws~qKMPmC@vzY@wP>SXPX zJ5R4&pb}CKP4x(xs6qFufF^;^=Y!3#j^dJ%SrJHM6iW|(dG9s$DRBZEYZf?4>Pg3spyKlFCTdEhwdMZA8 z%~xj=$8^~eV_Kgvh3r>_DN0mn4)*uInG9qYuv=>0NaC)nMd{~6zssI<&bFG;#Ukcg zj}n_YBKKghXJ9N=0Zdhcanw_(xJSx8$(1~V2a}am;Bdj0bq@-WeuHCUV=!?0asc29 zYxJ7%>cTaPKY&)dQ0(o8WusXNR`H;QU)ONVdN@BnKZeC(9eswI`{2o?YKT1vtRP2N z9(U35wMh4dJGfdqD?oK)@gqO)RjV?stYe9*Vvd85h)f~dAAx#ML>@9iO3-#$$~VY1 zz8f{-{n6&|g4Wv$uRoOAM?9%wtRrdd3N?Lf+{UslWx>Dh@|)D2z0=LnR;V(Q>*46G==`!I=i?(ehDRa~;!Aa6ClAGk5)eKM* zw?$cM&LnCc!!XokmT3f%i%^`Ih1tNVsez9Eh@Epk_j5i!+;i^v+|Rk^q9Q2>xFZ|@ z00cFR7-QlCUjSQU>VMZ12ABvuLZA@Agu<=7uHH0l>QF z3m|tQ- z=a88;D$cwbdj7gS3O5&(0OKxU$yf;txuA)KRT06e!hO z6%`ewUh6NkO*`LHLkb{c$hv0>S?TF-YBZ}(zYWzOUT7nR$VfwH zXXm5-?&`}t-a?YU?e!^eSBs_Q_Ig~pJqo21&a0glXOD7fYnSko-JPi3j-ZXQg-{xe zrnegp>IUH;F$Ps)7?X8zOBG5bFI$)-IR;I=PckYM3PvRM;5wclDSo%#fwKQdbqf^8)g^`#>gp1a0G!M zrAZds$Cqt%&{rx|>}e9dsHh0{#c79_V#VavvVT5JT0nV`s+CKMtRwdn+oMKQvOe?8 zJq5?VT~VRTPr~D-^^-TDoCaOVe9BaHtgDA8Z?Y8n=79ilqSAm}dFc&{;@Y%)WBBUS z&9$gMqT^FjnJze-5vkJB!ouENvc+IlA0>iqH?BURA2Nj}(|hYyi8Szjvk&FpyZcV? z^qB5Fl{Rl)O75urhKUpk)8;N&R^XW?W*RKokeVUQamy_H>;vz6`&j&sda+n+>+xOl z`$EqxTYi6Q(ZqxD9cN6zP5~KH*KgbimeGpm0?$ogQUzwu>o4>91}7*MfMOq_&2{K; zrBYeZ($ezz@mO49VzqXs*}}2K(90o@nkTJbYogk1n;VL2Uu+lzf|e2;rl$371A#JC kPMO<>jKk$Y8}hn<{9 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/museum.png b/web/assets/Cesium/Assets/Textures/maki/museum.png new file mode 100644 index 0000000000000000000000000000000000000000..23c179003a5028a6345a3240900e1837ef04b8ca GIT binary patch literal 2578 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/music.png b/web/assets/Cesium/Assets/Textures/maki/music.png new file mode 100644 index 0000000000000000000000000000000000000000..dbef56f228820e5b9270f81cba7fb9eac3fbe0e5 GIT binary patch literal 1371 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�a=nmM0A^3^Z z)RF~IJYqoIwIX=#LX83pRS^alWd{7jiJS@!D1Iix#UDC!Xfa$omD?&`O4LlAJh@sU z2LQ=~FDrOM^%pK&NF~~N$jI5>OZ*^cS``HxJ$iJZH#d?S;+)RVguCAV@)sKRLf^R4o z_WjDr$~59o*1-q^JRx=#^sEYIQUk|bKyGesu~DaJtviSX3lk31l zTM4XuK_%4t^y$;-SoSJ=hPOdapFaJUNP9)$56oELu?{QZ&fK|k%g|R978OJxv7Zdk z(*Pc&hPkUK9rMX%{JVP0cpUo5%E}f{61$CMmw2!OKrk;6wF71~7u~7(Jj# zMnIDj{diIj@5cjvIEiMY;@=0ZBaqhLE6KBG&(2CuPyaF7d+r$7XQ$Ko2H_2j@v8WFVY;t%}v5gP;zYlPw%ZlBN? zKs-^)t$*_@6&@ZRCS!!x_pb#PTWR_3f5NK7gF&v`waPzq0%M}#gSLKZtZiwD8hQQ$q zr(vB8;nG;ekNRSOzW&D5Q%8RsbN~YqiU*wZ@uyf43;_;{s#_-t_BMV{^y?)LjfWuy z`r`eJBBxrGg&=t`e;xH7d(%}xG_XEsSeP{u! zB5;;s9jT|JxZ(|~%frj4^%M)qQi8)K3QYOHSv64S7Nz%Ts2A=)yDGAbuer%B3B~s| zvo0Hd$E=5pA;8*lx?CEXaG~V$i+%ik$I)W7E6}d88BFR2F_bd}mqj2W82KI?UorroF6G0*pgbcW;KkBt$NQ>?ABNFV7;{c}xa= zJl=UhfUFMLj>!4yY2{an_=@O8z4WB&1p>B|->32N&dckvtffY_W0;+uhiV2*9xSlz zbtPhq2yQ6KD-3yg=cPe1Sm}4c^h6+)U8xWQ+o@7daFGP`WOuh30UPBgs zK=oR_s)%p&O0ldrbmYj9T&eeIDEI-rD*GXgN+-5|shX++sqz33XbmYCqHew> zPMr9rw8c#vB4}ujCN}ZSymMEL~Nx9^d0iwjPL)nv`#(ikeyvazNjZ{JyDcYU- zNHk%9R`DNMDntsue^+tVTLm6hv&cJ^j2&{x8X%n51HS7eo~JP}G4an-xH-6_kRba} z`avub=g1ngXm~KH#N>>S3O{itV1S5%|BE^hNasOT3vS1>DqLB*wx;i^ptBZ7gcCBH z5aDm7_~1m5+4g#rVc(6g@(;!U!It^XZT__T!#W nKb|$J6_14T!!YcLT9fntSflJP1jA9f00000NkvXXu0mjf3%pY& literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/park.png b/web/assets/Cesium/Assets/Textures/maki/park.png new file mode 100644 index 0000000000000000000000000000000000000000..741110e37e065804f2460167763c03760291687c GIT binary patch literal 2059 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 W83OF7@gwd40000!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49sslT^vIyZoQp*He1+HrY(Ewwulw-x*bXt z9}+TOuho#t`Fmnk&f-iT?oP(rBDb0=M59~;PC71OuYR%cNc8^}E=!F?;*R_~GuCn_ zR(uKId8--ZIj2#l?dHt8H{Y0?eYelPfZ`>n z$y=k|N@Q%|tI|K2>$u3pOypba`+qauKk@6=FXel-DjYxV|IYp``=(8Sfe8~evF(d4N&mEf<%;{MzTZ+d zKO5$T9q!9xk5AdWY15}OX(u*a?%x}?S-PypMd@i6#{>z@#XH|kkF!_!yyeiFH*a=_ z9bA6V*UB8XROw4xd(WJQ}lR0mp*fv7vi-ek3olpEYNWj_E$lPrEV-7aEDNFqXtMX1toR z?)84@+a61U=Ig4=5&TxSdvzE$r=vi^t$n+8{n|3~_WgBjY_4H{bsC;DdButR3)uWU z$IQ%3u1IR{t768-b7ptHpS^eQ!MRFXHf;D1wd|me+UIHJ?@v8vQoE6RG2_d0pX%AO zXJ^i1xTn(TZ^WxM`DD|Xi}%u*d=mNhEV^LJ&Emj7CDibrWyZ6Tr$sxD-^}^8H1^uH zYx6!_>rdD|)obYzpX#?_7k^2-*(Sau<<{f1{_1;IEo|2O(X4el`*2Ly&3T(rx!$N5 z{Z>hwzCT|_#9-BmgA=Q&YwJW3*8E)jp}g<6^!09uqMJ81beERwVc6dtdFRQp(`NqV j3xGL}tJP}9FZSpA`Bn$LE&L2D3>Z9J{an^LB{Ts5?4$8s literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/playground.png b/web/assets/Cesium/Assets/Textures/maki/playground.png new file mode 100644 index 0000000000000000000000000000000000000000..5270d3c424195b82c728422293fc4589edfebe11 GIT binary patch literal 3856 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 UK|+Dz9{>OV07*qoM6N<$g531-egFUf literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/polling-place.png b/web/assets/Cesium/Assets/Textures/maki/polling-place.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d02a9041f5e01f43c9b4f73359efcfd8e51ad3 GIT binary patch literal 1772 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/prison.png b/web/assets/Cesium/Assets/Textures/maki/prison.png new file mode 100644 index 0000000000000000000000000000000000000000..355cba44adc86fa9820f59fe440e1c0d99d05702 GIT binary patch literal 1371 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 X_$`j+;@B!`00000NkvXXu0mjfxTOP= literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/rail-underground.png b/web/assets/Cesium/Assets/Textures/maki/rail-underground.png new file mode 100644 index 0000000000000000000000000000000000000000..42cfeb7e18d5bfa514901f2417063be45cb6f3f7 GIT binary patch literal 1996 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 D-P^wD literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/religious-christian.png b/web/assets/Cesium/Assets/Textures/maki/religious-christian.png new file mode 100644 index 0000000000000000000000000000000000000000..201bc81ca35ce5287e40f87e5974a3fef1f77a97 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49uRME{-7;x8B}8pMAMN;`m3asSAUT_y(vM z2^{&Eyx@UL!R)-hFIR0{)Wl&`y&scd+Q0UIB6ZRU8 zzj9mtFF(Ag=dns=@srhocQo#JEftE4kKey{+qSawNIC#1?NJiNBJ-a$TQ zVL*id58LUqL)UjLJHWH8>9We5DsG8u?90FX6g%|)?!}BRiy04y3gzu(?RnKang7oD zFvcrk6HcZ)+LanB{2+G89hroh;*3`U!Ll!JFs#tm(Xlc9u|Gjy)BHYb>|L2#r%s)+ zEiFlAPsq!AxAb7%ivB5#3=K>S48TO7!N9P90mwPH_j48H9U{8zXA(0e0>tIl~0b4ow^mP$5U|0?gZ z>gucBq>UB#SDs7T-2awoNzh7jzje_oLv}57FJMk6`pms<-MV{Qh0m3}xOwwtI4~_? z0|(65W?Y!Rf4<-H`PNrIsm0HpE4}Q!i_*t)CreL1E$X*oESM*sA{DQ8uy?Z<-^!V4 z3=-R{Co^pAPGtD-UgU;h`1&i0mi^D3&wly8VZ*HAXTiqS)GXV=XZCH$ zVTQlCG1ud!GNvCZ%u>SU1RP=xj0_CG>>$Fx5Wv8I;6PMg*l4tC{)bDKE?qu)^yrkU zVcVUa*B!dHy`h*dF6OZQ>HD6i&Ten0V`uc6xWTezGGC0yE2G8tr49wY6^o4Cx4!#J fXJ5?u<1T-hk`4c;O8@(n2r|{v)z4*}Q$iB}k9V4L literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/religious-jewish.png b/web/assets/Cesium/Assets/Textures/maki/religious-jewish.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c75f6b3087ab511b5d5b1f75c391633b7d5f2b GIT binary patch literal 2384 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%0AZtWr z)nphO^i;rNm_;QAB4Q9izzuop)~%aw^1c~FRqKY$jd>QGwmN}?cF~({_3G6N;L!rF z$qVT|3nYJl03j4A@Ibg2I)J-o+&r;T(e*SvTr5SZ8f+Ndunm(IZ2;hv0yLbPo4XRX z8{yV%z{AlF1{REwSW$$oTRPGiJ=6=qZ{dq_I+Uz%sG8W`gtZtfL@AySX`;FYR}&@j zwvjc%-mG-Wn?@RtBhxzB-Hy@=XxoDODivHMk8(lE^HgD7o}29uz$r=Km>=ME8gi)O jv&G(;DS1ksr~3Inte7zh<8AW#00000NkvXXu0mjf$I5Zq literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/restaurant.png b/web/assets/Cesium/Assets/Textures/maki/restaurant.png new file mode 100644 index 0000000000000000000000000000000000000000..816282a6e07e44e9e667a42d5c4e8759b0438144 GIT binary patch literal 2499 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/school.png b/web/assets/Cesium/Assets/Textures/maki/school.png new file mode 100644 index 0000000000000000000000000000000000000000..fb20bf4e24eb49d5b4acfae16c143e714274f338 GIT binary patch literal 3838 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 Af&c&j literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/scooter.png b/web/assets/Cesium/Assets/Textures/maki/scooter.png new file mode 100644 index 0000000000000000000000000000000000000000..41f74164946dfdadec10b1851bd68a6a2cc58b3e GIT binary patch literal 2942 zcmV-^3xV{BP)Px#32;bRa{vGi!vFvd!vV){sAK>D3lm91K~#9!?Oh3Q zRn-|rKtvH21hiPBI0i&EmnfZqq;N5fX|DALG z{l6_**ux(7u!lYDVGn!Q!yfi9Ycw}E-^A#?rlzJojN%!245mc({K4$c-i$h6KAY=& zFoxX9XrKv9mm@c$rx~@gcYbqo8^(y|LdbkyN?`MMjP>3Blts+{{%T@$N38Dt+t|yy zq)cgSY)sy_Z(rW7UArb4LA!VFo^b5gv5{AJXu!uRfT>fbzC{>egJoS2+-LqmgfjmI zIl)AoHiO>=tgEZbU~-^Al<^LS=bO$u9VN5J+v_# zneRhQGH&0;bO3ON^m!XMZk!>qo)s%rERbP-SEak}N$C&akP36=Unh^p^Cg^X(&&>; z0Q@3o=g*%{$K5Vqcu{))qau?IlzIzsr$qt)I0Xj}9?T&E;Vm@?;g*b^l`;`mi__`+ zT4^m_ulH{R00Tt;807n-ix)3?MJ5av+PimezSKa|VkNWR^^`IY+6)B0pj^6KQ&W>k ztfjRQ@_nU~rl+U>B@&pQn3z}(mx1J^Ur?(FA(4s--j|k^mf@6%uBW1+f{F)sP?|hW z`XeUXUR5)(Rg|BfUroGlKb2QcYbs`dtBu|L^#%lC;zR_GTY3s|a&q>BGxKpuW%TZ@ zDtG_mRMbpF|Cdr)TG}bqa)4Wa1E}1Yg$ozHjvzKyNt=8qWJ1=Lp#LW&CHQYCoY7Vyeh`;vxURUkxC+cLllkMujoYok9nn<< z^KYS&bgQeY3*k)Dy6#o0R?Sl_2l#@zsd?G4W5@0bGXS2@>vp(s;X+z!YU*h{>z*`e z(sp8P4~aUX`is7>)?;cC0KL`d{yfMO@EizHz3ax6O+0&m=%R$;rV!G@hYvpz1^_&- zHq`?@dCKj+Zr!>PHt#h9{8X1~Yioz8vP~!x+*czwaNxi=cpyO=Hf)%got?ecY++0R z03pjQ_s1A@R%`L{Q$9%gTqZb&dpw>xqt?E9_3F9A+V57a1(lSPRJvTQ3s$I^G5|cF zGwc{gon|J_eq-d?3kwV16_x|+AKFuPKyGgCFRj$`jRpV-26Aq9qfaxlQECVPo)*rZ zT(V@zGOI0NBLU!v1_80|!-o%#bvm6Fjb1ylDP;UYtweo6HC9`?Mgl-Z{BXrGMdCBF z)?Zm!Ih!~IJw&~s|BV&^Agn3vZuaciYs_4~j9r5BES)Qqn&ydY`N1 z<>ia1QxJ6ku>aSK+HF<`n2_i|#4wyu1pt*`3#zE7SQri=R?0^dH30AgvjBY`<)Uo& zeH9L2RK(h&5&-T>cTpo4ZpphTH~OeiqYh}9o4x-fcu42Y zox8HEtZb=Kbm-8b>_`W|BN{LoKYsj9t;Q3@D6=T)008sz^YcH@GABSIa!qXjLAYAJ_xw*N! zM3|5G!M1JNrl4SB#E21}0_^1E>MU`bDRZ(C{K{2h5rC|$ ztWRO21!F#fDY#zr%mal$=7bH1Spd){2=5q-`P_p3lM(Zw*jr|v&ano-RcJd9rb>5y zUS3|cf%9I2Gce);GDZ?oPh_eX18Dp9?Jol?gNq64AWx(L`l#1}pq1br4pPG#KukD) zV#ZqL&!1mGX3Iq*0Bpzq2WcT_&Z@>J0#JHemB~>?M#i5>VJrmz0tnJSB_-vHNFX#z zMSC$+GftmAef^d#TZ)u~ELR14$OLZ8I*s3TO% znW8HqiV3^E+l`cVsz?L=Co=&kFE1~RIRJQOTu)@lDV1bpXJ`M~OaPWHUHVF_0Fc1T zt?rkrOra9D3JMB7FcSc|pnOlB!skm4${~fcbu(zso;?Lr_>ou_Mfg6zu7A<vOPM$oOWmT7P-X$dWO2_>HMM#J z6%ceqMMZDw?e}2NDdA@nWo z`%xeurCd$lP|41(4dM*!re<;7HBkl5&RfhxqJ@+brs=-bSuvGlVDa zA>Aap!H^0sbM1hhQnktWRV4c{wByH*k3g!1*X#W|)oTGe2z@2W%F0TEWFWY%SBqHt zp@;VTqibYJ%9=H6=0N_j4fm~_o{vZxrS160w`aBVv%Asu{Yj;iK={)kz+g3_|2`I@ z6#V8_oTbc{C>}vS^a*twmOB7JG8l|V6nra%Iyv*(>eU!}Y55#T5PC7(zAVJMsTlq3 z$v%qR6IFhRLT{sQH%~8b(;^H9+Me-_EP6MagMV=1CZiYFio0{wexb|qak*u$LhfA~oKMOqXA*#H0l07*qoM6N<$f(|2xI{*Lx literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/shop.png b/web/assets/Cesium/Assets/Textures/maki/shop.png new file mode 100644 index 0000000000000000000000000000000000000000..11a6b755a2b887a911ba0833071d857352fd307a GIT binary patch literal 1544 zcmV+j2KV`iP)Px#32;bRa{vGi!vFvd!vV){sAK>D1)WJmK~#9!?VVd_ zV?`LptLuucyC}QL>WX&+7jLY)EGsK6?j~)LUQN;~y`+-XqD$2h@u9JW7Ao~Yi(>7I z#rC1JFV)s66s>}_R9tI)s6`(X!5WBEBE@Rlu8C)q#qH!f$;p{HC+Ru=!2d1zCiDNz zne)w@nK=aodHzWx68jY$63~GHe6)R%$>bG^VW$+87$v0)hoURtc4|xa7->8uxc*HY!$ES8JD+mKyYGWo4x<7K=Tu0Yb5z%)dLG z8I_flUppL*q->RymHn6j!g0G~I-~(ZLqlOBjOP^&hX>O@*k|?DPgcCOwROr2^DnBZ zs_HA-Wk+gVk6A6BS6f@#J1P(!vQ6uc$Kz$`Ome&3zZDl3NA*hieJox4wY9ZMTU-T7 z-@litXklUDpOi77Q0Oh0sb+tF|4S+m5-PtrXtmbw7$oE-VN|iS@ zHujw5uL7!qN*D19Z-&?F{m#fiS0E7hh=6dxmH?>MXvWA_Yq?6dd6`xE|J{NBoC4BR zZZsP85dijB_6EGXyj*WaS3t${cs%QT*)uaUPZ8feWR>pcF1~W(>vDp zV1q;AKOEi(E&N0_b1}oi!!Piacez}@o4FD~8FMTV4`|-aGS10d8-GS;<-g=B9}EUR zFcW~vQ@DiActv?}V-=Z=oSU0#F?&6b?Ach;W>532;`#JH%($sK03fa0Mw-7T&9ajB za08m{<^MGss$M`}91_pWoz>y3D0v{T_+@0!v>gwt~2Y`R|x8XNp^#9psLjV8( z000000001xBLLDy!x#l;Ry-armA$6vQUJH|!6T7~561s5wgZO%a7-ByM_JLpvqVR;!f181w6wfW0C-d{fRuxlnwpwEhSBP(sHpf}+KreB zq*%61U88vyhv5{dYQx2-Bax(3@)^=Wo?_DQ1g9?13z zxRDRShS@MUvjztTUnBtBpY0WJgb&i!*Y`3E&a7ZCI70v^6h3FIp`qbZ7@S!ikLOq6 zOh{!x?s*t&QYwlJ2mk;800000G95PzX+OkC2mpJvER5AI>ZL&0n13^|FW3)bwTqq1 zD+1tf7Ow(?2sJl1&*=t0%>%8kuX|yv*n}Lipq-wE&d<+30dq5JWMt%d830aFLD(th zFj-yf-3Thn6J1gsNnUz2G&VMV!cI=KyV%yG$;rvH(vP-Resp~4N9 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/skiing.png b/web/assets/Cesium/Assets/Textures/maki/skiing.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc11e2e5edaede5a1efa409aca19b46619e7149 GIT binary patch literal 3345 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 bNwxn1+}=3eX&$w^00000NkvXXu0mjfOz$Od literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/slaughterhouse.png b/web/assets/Cesium/Assets/Textures/maki/slaughterhouse.png new file mode 100644 index 0000000000000000000000000000000000000000..9b094cabd1d164d2d71bd420993478ed4a355baf GIT binary patch literal 2270 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/soccer.png b/web/assets/Cesium/Assets/Textures/maki/soccer.png new file mode 100644 index 0000000000000000000000000000000000000000..2385daf916c328a4581974f3793f9d0d48a617d5 GIT binary patch literal 2420 zcmV-)35)iLP)Px#32;bRa{vGi!vFvd!vV){sAK>D2?&^7?e%~kc;{Gdd8C^1}%wz~oOkLjx< z+RKUQO0-*AY0H)x<98U$bS3g|b-Dg5DU+tAru@gp$AgB4hr_O3y&84p%9WVG!NJIp zk&#e%KRrF|M*#>=SDW!W^)dk%Sz20J=IiS_;^pNvhfBf1!CzHXRlR}(gfw9uclH^- zUeAClD=Uj^Hro#*4A-K-z`$?LpFf|j6Nr1Aan@T=XS$D%&-W~uu0;O+{?~PY;N>ig z-+(e85DP{yU4dpnpCE#0fhI$uqoaE}Iy%z& z`}P z(9)_I2L{tP;f{`uhV0+J|5uX!96EHUK?8*4JjKo$rH;UC!5w5kK)`iMCt1~#H11i$ zY&PFCd?iR9S*bQSoPlL$XV)8H`$SPqb~}0pQ&Lh=E`kv*K0dxnZ{H08 zftJ_-c`TYG6vp7~?L9*Y1RD$HTWN?L*s%y|ivE|*o;{mO352aQnZJp2=I`6L?+=j~ zFEg%L3OZpGQ@M}I{HUm?Pn?DMcapSQ`jK>ZL}T{b6i&B4qjWAaGqc$lnZH0`VPT(> zoD+zws8R!u$u-*4)bs*Mr{GlT%*b&rf#RGtXf`V$wyP;WvmA4xi07=&UrS^e}ii%>Afn2e<4I&NPT+FYkO`_t3YThtmpaNxj) z&LDnB0f>%{?j!lOLM-ZbO#pc8EJOwX*T*dv5UeVOlpO6E4c{hZeoalyOQHe*b|}`{ z;5%o(r{f=cdU_Jo8qCVdYNTM?8Wj-$76(IBJs|f-yWRe=tB4=H0I>MJLXya~B_aPs z001&|6vdDc0311T@4Mfe0=-|ya9lH zz0m;3h1&xFTV&Ej3t0jX8you(ZvY^n+h_nFi9}8WEviTY;o>X-7#bRi;0=HX`Uyn4 z+zMFafRBlZ>1BNeK=G^6BE2Sao~sZ5c*gN%Mn=Y4yxe=Nncvvh_@drErKF_1%c3uG zE=mC43CEY^<>e(j{j0ULwTEdBHZn5uQ_&^{6c~}y0gvd-Ze$hi0TB$OgA57^`kF>x z<{dCxc0u<$zJ#Ts)(~VJvI3#FxVQpma1h1JBB75a0MH)NNf?k)YpAcUFP=lX&@{@R zA|fI_V;v0#ajHVug0ix*ns|f(0?u0J2M@Xdpm(T*@@p~?a=R7)c-rxgZEbBCY7Ij988`Fq zif{c*uO$?U)2dcIp}h}IN=oWC@QQSP*OR1GTb| z67zTj&$4DbPL!LpZTt=~N8lZ`c3^cNCuzw2Bgkvf940)inh-uu(!N4^)Ltb3JdBKB zpvm}#hK5{P{elo0T;I0tA|7%-2n-Ay;sF3H#VqZ~Cs_2azP>&Ob?2iJj_9M6q-Qa5 z73AmV*NW_6Ti8;f=thM;?!d|u_Ve@mR&-IsJK9c-ph7Tqw!G2NY>*W04AFLaClTDA zfLbeJxm*JU1qD^2t^zGD9#2xTlTj(u#4D*zF94`Dj93$tX;$dtPQB%7?vZNY)6 zXv!r-59%#QEcF2n08pdH2Ml-~wQ=SbjHH?6AE@K>EN#Jj4+$0LP9UJ8GcV0p_pZaec`qr4G1LTM4vJ%n%R^!Ma+Z@vs7Ep9jFsq;YqQ zaaXFV>4ZB((yU0PVjUj3DTFJmR*G<$+Zrvgz|)jXgP=?^!UdmV-NcO|pLu%L7&?Qj zCQ%>M%bR&Q`cVmr(;_PQP0nzo?ON0w%Y59CAvyv|azb5H#J<{u6FCS#Y!$JD0aSz3 zd878DCTD%-J!>|-dwIxD&`J_PB`CiJHSjR*l=m{Z%A@4y*F%sW2F`czJV7!!Wb{K> z1*mNS1xBFC3)EwPdPjucvO1l((J7iNA|_e5)Qm?2!b1?|Z!|6CXFfE33umTpHn|_g mm9bhbagdNag)kd9JpTY$dWdjeo!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-3{3K#E{-7;x8B~}*d^>J!~P&f`9|l`x2Eao z3tN3x@d~|L-02Z7U`-pt!xtz_=~T(3W%O7P#wsVS#FyB%#8K0mc|M~nHl#k)T3 z_R3QA5B5ISn$-8jbH}}u@ALM=t-rr6Y<2nRr=Rwkc)!Wsd~?sr*I(~1eQs2GD97w~ zh={9Z`RSyMKLU0eE}u8YM=gFzc|}Xazr$CAy-v?paftXoKa~I6^UwWUr{`apHzB6( z*yE4ktxx^$%#dc}X+QiPDE#9s2QVZU{8$%UfBpB>_uuyKs-495_cIwt@Jw6x`pvp^ zf*@%IhK9w=d*00XzzpHhf;^DR80Xp|+$W#+_3&Dd1qC$?9}d|oAFB1AqmtCtqiDy( z(2&9?(d%|!`jwVQu)2o-Jo*Tgd%$ zV-WbH+Sl&?HF{d=M{$Ke9~0!AV)`D<6EJ`FTKn! zJpXvZwM(MQPoGtP*uZ)E@6r1A)z{u~7QK#Xi#xw6_CMn${@LdfjZ&OIF7$Nub6Mw< G&;$SjWBh^u literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/square.png b/web/assets/Cesium/Assets/Textures/maki/square.png new file mode 100644 index 0000000000000000000000000000000000000000..babc9c531005241fba7a844629e8acc4abff26a1 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1quc1-Ct2978H@y}i3I?@)k5+r#EaqwPNDl4i`l zp|dJ2aRuvTC#&>zO@SltXBMJX9yH|D{-dY_x+@rRrNELy_|LMPx!Q_XIKlO|8H2eO0)Ur`j1~+>H&%5o>g(CiXowIv zvHR=(&Ube?mMcE_d)u-)mnSn5^)B5ok^RT{ciAfC&zCc+)h?``z2en^eP69x9Uqo; Su*@+4IndM9&t;ucLK6V=cF+_6 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/star-stroked.png b/web/assets/Cesium/Assets/Textures/maki/star-stroked.png new file mode 100644 index 0000000000000000000000000000000000000000..242e42e206ac917a8f6f2115291f97e9ecffc2d7 GIT binary patch literal 3460 zcmV-~4SVv5P)Px#32;bRa{vGi!vFvd!vV){sAK>D4H-#9K~#9!?Ol0r zl~)y~SZ!r3Eu|D%pcDoXrLDBAT1rc{m#|0zSs)OWKv+UpgX~)X5e*O^vXns(5LA{y z1d$>lA|fIVlR+I2%gCT8EtZOf0>S(1+}HWIoOADeTi*9E-+Q3Z)2Y@FgL( zr@xH`{7*g!N|GIJGMlaPO67PA`M=p8{ zs86Y%?%lgr3c9yp!-ir)4f!T%6xB~#72u+xqAdU)l%Jo!hhV^~K624H{hwjf&$~ee zKn-2Le!aKCfMnkqiq7eOT0PyncI_$@z~2or0IF#H`t{!+q@b~nU<}kxVPWA99N-7l z&|Y5+Re}1sdGn^wK0Pn03t3Zw(J^DvF@Iga{4EY(sfc8G3p@ILX04>o8BH}$d_2W=O z?_arcC7sBYJ?0~8&wz&NDc-tu>v)s;3DT-nt7Z{W@Vt+#z5ahi1#r};Q9rf;A2fLI z;GYu==-?x3Z~Y{z&R1Gm+COX=Ak@$Ygj0rm@#lPm!%#oSdf9>>q!lYx%pnprO?-sS z>gOvea3e>K+{xMfsi~>|r2dzem-mjZhQhOcl2q%5Q$GU-4m>9`}*vPye&(sok_`(j!ZiPRFOGr~fJVTvk@r z@2F>zlasGAYN%FK?hTe*D4;hHi|i^W)uIS0ri5fWr(RH!5`1pPj2Y$JbET!FCGp;e z#Il>97g%P9e>_6PU*bvJ1q<4?ZQHoubB7Kc%2!g9&Wrk&ZrT&V<2dLP1Dd#Lp|E}e zfxuM?R5b}Nvt;iw*3f?mH56}pkz&AC-Lyy~**WWnvhg`z0kmYvk_9efz?+l_n5eq{ zh^?2Gm(Pp`<>u!8iUahU;-zj1YvrEL%*_0Ky!Nqr_39Z!SR|E_fbQz1=FFM1Tx{S@ zs9}Iuk}yASo;h=-zq(eKqe9(Wchg#NFBKOTuO}oRnUa9El(@{BH*cw%n2?c?QNf9J zPEO8m+ywrVDO27?8r7i zfTWmwzEruUJ>J3P&t14-gYRI%6RMLIBzTx&fwxRdm_B{_cVh%n2P%Od4MMKLbl>6s zbLY-orm=SFM=LbVGNH7zbiNG}G-g>OryqA!Z7Jqa`)o^#@6P=B^Gjn6z6}$go8h5W zArq3F<%Y6~Iw@MT*m#6@m>DCQqLHwgvz=g6%bggndgYuPc)} zE#x!0&tRLqp-ybThkDY0|75H)Wpz1^xvZ>gwha>|O`5b`qgGsZ^tLh4d+8h%Q zg0+x@N=;lR5KSh?JAyp?CZUrE<0Rg-JS-E?vt^@>ii(OhGfW6X!UWmmL4rSR+O*X+YDbgQk3aa1 zi@6qOT_ClHysU`{W5`Et{_azpmTrh$3bJ`hPV{ zcs@k%$q+?xaq&7+d~o&aXAN$rUH>LVTaFu%Q0)>wmM0*Y+~ z6FxLa0y<(CNl2s`Eo5aiDSa?^O(!4V!-vs;U)yViwl!oqUK-VKfjogp5()|mc2bfc zKD!xX@jP(yVdk2?2bLPs-kK&YJa2(-D+v~{c9^JJi1&XHCm#A3PLMqPE!5`_{Ikdr z-{sVfr@>dMEgq1B&6_t*v`L^dxrA7xzZmj!Fx=CrPaeA0S{DN=jP@fF#(dDoqgN{ zE*P|D&z{ky=koIM4w}BNU%!5*sVZhqt05V(zOU2f+_`g^u(?gv4`&uSqpc_#fp@Km z*?dB1=CJU9Z=hygWZ*jIZRQQgK>z`?dhsf)7^0N}yX)x9SpBjb$edznmK zTd%5~>XiA}w{PD+ntV?YM~)mB>U$1gHzCPk=oeqw$#6W|6>;~UhId@-o1PGXcJSJflr;i0{&xa zMheyonk#gh?$f8wU!bN=o;*1a7iqNX_l0SD;qc+Z!?2#r%*<1!7}TXpm--TE(VAXh zKvSwt$Q1c3DJl6j=E9j6<<#*gbDTMI=1Sp=S=|vB=(ld&x~YhMnw~{zIw1uuy}*FZ zL@3}LgVpjL95jm(mSCsknf?3s7dXvZajH*Rwz=LyJy4GxJ^rqHE+;4F1i^r=t`1Ge zeDHmt2k2hY3B}|qn@$v1FsSFDJYJ|T6xZ71oMq?E`zA)6I&~_S@Clx9GXq+Nn-nn- zJm`Z54-Pj4-i{qRHaI&w`?t~fP9_=D#;vwLrmei8F4$HzXfDJL5&K~h^x8UqDOq8E zw=fL;%#@~7cOwJpsf&dON77M=84s#sMwF?rJz@w+3>Yxr*OB-U2M!z#g6 zF-h@|H;#%4)ax5geOJl!I=V?O_zYMyCY{d_N+yZVeZ_U52em*K8;1yoy5X#>tP{}V zh9B(wf^+hejJ&qc^@<@gCKEv+b<)FHB7UdLT|bvd)#U8myLVJ5VFW}$p|^FN@Pb~~ zSs^k3)I}!^2upK=pg4;O6@9KAiBAn%Ei5eDX1hUz3aAjW;)S-d8Ga|{-Zj@r1A=nM z9oR|(;zzEXz9@^LQq+@XGwT^v3d~f4uK!v%1+lVPyR%Lj5NXAa|AaY_zhxvQA53Fem66PS&)KtQvk`nVIfCeiCY-Y7ZeT!1bz%519bG&| z=;1}WQ!lNWI#FCBJoHXFX+U|RE)FHk*`v&z^hi9_PYu-$M>>&lfGVMPsc~b%$oD-TTvofnNVb?Od- zZ$doZI&Pr{h@iS4STs&g5{VU}>`$Gm(7dWeSae=tL!6G;KbgIxucb?a3FYDKv&h2Gt6j)E#B1486_zVjdjw1(t08`ln{@_whJLX-yYUSHIKX?4I%EYV>}jF z-(q2i8aDA_iMN!7M%+LWSNw7}brCz~Px#32;bRa{vGi!vFvd!vV){sAK>D3M5HHK~#9!?Ol0L zl~ojXE6aUfGIt#{OEXh(DO2G+9uF`X5J8c}El}K-R1^e}%y9!Ub#zEliz%}y)6AyH zj3K5R%W<4chhlPUvrG)blt=eC_c@=}bHDE`-{ZUA*}wqNcC=2~vW5`}Xay@bK^-0|Nu^oIH7Q213H)5;^?{XotBU0=|Pt z&D^c}5&)8! znYk6Qg256&@3p@@3+&;;hf@jY)k*>)A|ftSRaJ#EziT7XSfZ%2`$G703Sl z`il!Nn~9EzYzh< zq6DzAvT~x9`%#9ZM~)mxL9C#=MAtO}IVQv3E zgat1pCFNaL!3VKgtv4=QxDbPcr0pca+R;xid-w_s4gJL(0zg)-T)9h@EOl@{2M!!q z>@N5qaAJmM2V1g);=V+h?|zqFq8#q_Uzg3dkVf&AcDe5mO_W5kisSM zaBT_J^;S_)@gn4Qyd}V9v;D;>S+=XC{WWw4^lorqp$V)|Bc-6AV7a&8J7wLvb=wTw z3t%~pNKY;qV2)V+#YmYmXU+$D5in`eq#uy{kP$KrEf7)77Y2NYenLV*uIfbq2&ZIe zg!IM;7$Xt^d-v{r*_-IcjgqAiG9C*7E$s0h`Yw0u*s;b4iHnQ-LQn8PEEdbZn>TOH zuFZYGLGaqOYm?Y#0%ie$EK?a78QY=tPj4XVkW?>UzI-osnFOVzGw@fe zSg{9t@S_Pq8ixmAB&=V*elwgXC8(~0k7Z(=+RwekLwoRpB?(?@J`a4z#CFum$F$*G zf(y;b$=N7LPzOIPE$uZ9_|PWV!PTS~mxK))HoQtm_)mh3g1^IS@D))}YaR(3H*U<4 zB-|%=)~;QfrviR^PZM&I1Q)O2`zXeKnBoavE1}S@Nd0BK0NRtVyx{B zhUPpHAO-7BmH?U$VYe{gD@nl8*dS0#AeK<+51P-pZvbL3{4TN@3A=aiUS(!?1mKe} zd%dvWD;~_vc%x*Xv}mRok|0%TfWqrD%ObenSF)zjf=@Ob+-#!hx@FM@@Mo z?Ay0*nHfj`@bmNY(@h6HL&A6-3Bkd^6{3OSknp(j z(xppNkoyD8{6YJBA_bfb(V`$ufu)~6Sil2a*Ku)iCq*M*^5n^9IK!Umn_2stvo~!n zUc49$F}H{*=aQ0=1cZdPW+tE?r`cD?lkn1|OR-MoL1uM54Y2StDk|z*Q3;qhapEOp z@}k9*V{T}B<9*Wft%o)0XUe zi-%i+#I%1i3jt6xx_tR^6mq+zsTm09j`a!Yo%w_u{<3Au_N-a6CLhL==}iLM212Z$ zuNep!#V$M{A>mU!!HJBFJbUcev6qzLZFF?>*Lwbq*x1-o(+&Nj_2Bzb59Q_Mll9V2 zX!KgOYSm68O1T?lL9f1EHD{GM)U8A&pf7f(Ob6X0E&x?6Jbi09)EN7 z>ea8CW&$srw(`m%{ zkoOH|+?a9>PYCblrKP3u)22=P(wo%8@#DwmAm80VMECO~yHL0-?%{;1>oBK6L+i&< z(p#uadV%kNhz6!+d9s%I^XDH#zITXlsRy<}7d8$i?CyrAOqo&&eq7^Kh5eP2r)cK2 z4}1Pl%9%4~rqM!>Tj6k6SlG|V>`|*wsR?Yz-PXaQ)n znl(VHxtoKa9MI7x^o!!KVXLXBsc*Zw!KqWH7K6W5(|RcGxH9~X&b{lUW)0`gor{Ix zO|Du4XApRRDDI~byIIgQSB9-ZlmcO@hOd9llZIH@tvyQ38lVH3Si>K#Jd?1YOVIHl zg7$ayVA`Pr{4sXWVXpZ1^(N$l(3o~*a9;v_{`~nENWQV}C1VBdLnDW>ULp_>z%FdY zj2TDOW_S`moTH}oG^%N#;~L?FK2psZpgmD7VMxN+Q=Df~eIwmZ6E+Tq0jZn=kOTbg z*|TS-YG{2QUu=pV6npSyUx1XAl|@tKsm79j@a#a&AuWv5{@&R92zK!hb--OK4PQUH zHX326(u`0$MMIl9_6&ow3G({`3`;$L39<`vmOh`yLfwcXxa}|2kwkgv&sa$J- zdcdq%vp!UY(vXEklxTt>sR?>n`+@Mz*>nZ|G&eVQokq@Pq>=rXv~zp7+8Uuesd#x1 z`toQ)UW)>z$1Vhh7J=3$B_(|f9dH_2-$R7lI<@4kycrnI=Ne3Lhwiz>ix!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sBugD~Uq{1qt-49x#LT^vIyZoQrBn<4Bd(YE>a64hHVhc<4gbG0yl|Z2nVn^?Je+{S-sd};Y_=AO)*p$Kq-a1N|IB|sqXxO^E3CwlQ z<^197*lA|=AdImG8v3JW8Mj+@@i!;$9uXxIl!^tKzTq}Sm|BH<9ioOxw3_U z>!0SSzLh(o>wMD>_h*G33%C5?HkCd8!Jf493_=g4-P*QkQ_`oOHTPVUF2=n)pSUsN znwz`({4LwIEnD)8wM5M3`V>GCH=l}0n3S_1)nsR?T!>T)uk+}Bx|6B{^uAOr8qU8xY(f12)e7kVEa@V1INqvm1Vf_!nr*(@w7j|V@5fGt~?Oe0U zDL*mupTD@va(4HX{#oyPdwbh5Om4a4uln)m?x90Y?LvYRci;Q<>(`pQdH?+?{a*Pj z5P8J4_Wn^R{PIsW$bx>G3eY!D{Jd+DYNs1cQ);~@cOIX;^GPO*R9iA*5G^X z+~2={8C!hp+}zyq-en8O$;zL@T+=rTy)0gro+}UF- zz%l1^+U8P@=l2X|`pjl#X7>JH5x3MpqrL2%Px#32;bRa{vGi!vFvd!vV){sAK>D2hT}FK~#9!?OhE_ zRaG2^>_b;tZDq}B&D7b)n$xT_Gc$Of@F>E^j8<>}L=nWiW@cMOhH3VHm{w z!^&Bsv*KSOB>q3(ENZvn#Sp>SBqQELLhzwOhh85U8F^La|CV!R<%zfBl3rU|TOJ-B zJ{1U?&31vCA~G943rqwq@ijFyg2em7Y&QQP^jS34J)H3y#NSF{X3ERUYvhRcM@vgf zk-&9UapM0uIAIg-cDq|ii1#5nI{F80hW<}HwvFGiWlN_L;{D*^3bb%d|cv>(InoBt0Lpw$I16%A~}| zW}yHuHA6!~v09ODXeH2A!13e9lhu&e-`}6KVZ(;+g`TG7=H|D8P6@OW(9zM6t%i7b zN5EkWXRNZavO0-ttuwp=;^N{?k}6FJh@CV#-nb!bhj{K9Q#&)JO^t^!b;R zlr)eMGCVvSgKK(V1=HB>id=tLP`D$kR_i5-rs!Xcjg7rR>%5Val=P+HcSKTQM_Qpp ze`IB4eMU2eL(>$|R=~u>M3lfd zw*{4ZT8Z0PD+QcAdp1ts37Bm(;^#`OS|wZ4GiS~uOrr^!WhC;KOOd~S|Nb1B*R{wst!!Gt}AH znQgd24|IbMN)bOgIvUN|PUq+6w=hg+xmVBROBPWS7Z<9yI>6D&q&>HMn=YGT9WUB+wJ~9>b?#iKAc`rQBhq~RMgbg z)|Q9q;$C1Vdk_2b=^$V31*!ySt;`S$}+P*Bi}OTvKz2eN2ZuvAr5RpO4_ z*x0zuNH61cN-9wxg;2m%e5I?aE0bj@QEO{!p%Cfu@$n}h6l&NC7<4YUTf>^H6>tLg zrT@WCZ(F!TKIjQc^w_ zQ&Uqh+O~B~Lk7dw5aoh=p6crA3Z-FB6}Xn2o!t&+ z1qkHt+O@09<#G)$Q2@GdKW?+rMSrk#>K=$(~RMn_L?h((j-l#8N^Y7D`-emCy&~_^sk+ z)ixbM*O*Un@^c8so=5SCyGtbx^L$Sym?~&gqIpgclyWMV{4%w@*T6JlexGn4=7(_M k!i5VLE?l^9;S!wkHx5;Ij^&gVjQ{`u07*qoM6N<$g7YBnPXGV_ literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/telephone.png b/web/assets/Cesium/Assets/Textures/maki/telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..6d57dc61a8a62c84825a83c8fae7c1ddcc6d694b GIT binary patch literal 1702 zcmV;X23h%uP)Px#32;bRa{vGi!vFvd!vV){sAK>D20KYaK~#9!?VVpp zWK|r;XSb!7AcB3V-g+pamW{2pjh$LC9c8sqM|XBni;5nkfB0WVt#&nEL&twPGp&}X z=z~6p2tG=P`5=anwX01#IS7Iv2$E#XbPsgvdb;=AKXcDL=g#jO_~GE(nS0LXd*^rl z|BlB4ETz-whf}H43zA)vtXQ%)b?kNNGtWwP&Lff~;13yqY}S0z_nsAWod=Iwu@FKf zNnl=d0KU>L3F`mBFLW6GzrO|nKb0yn0&9PNzkGRl`MrgOg%9TD=04K0`T6+|S65fx zIXpZpGb#jR_{0{?z`(%m{QUfMhL)O`m}t-wL8=$dK!dLdBOZ_6v;qA8Ykl z!Nc$G@4rI>zHFgTC<isjI8|ju-gD!^59u zU5}Ymi2C~aF<#(DqtSL{-bzbLw~@Je?1%)vp`qa$Uf_?6jI?6#i`n`mX?+nFYt$khCa&_zR%}7;Yt9vwDZwiGS<$2VC8#`kB>{Z z5x^}y+}_^aPG#Q8%F5z4&mZT38rum5gFnjms;Q}&BVF6m)6=EQTObhFwsOy8G8yEi z7tC^06Ricp@430TS*dnyI2^{|-?tmSWKZ%mors6@00k|1CrKxr#h`wXQ=xJku5ymp-5NiZvadpQn=7C$z3dPqdMH z>MUL72Yz#N^Vc-t>-gV%LY^;ZeGb7T-4n04F}uvuG-AZ*PL>h)a+0ojO|OMiRaLd@ z^ZEX)uCD%G2RyPXV8-(g4h{ll+>TWdOc+1#+uPfR7{brBP!@02!0+hj7-R@PCxbFw zvLe`jas26XsEtl%dS ziJ+71d>-NFvhw*Tum;T@t{dQ=Cv>u64B_W^AS5jS-QC?^GK8NC1%93y02DcjmCt9g zc9OTJpH*we$V^r?!GBr}0$S6~XjBspe66Q{YisKki?y1d+zv?qtBX<%L=)KtU*Q@N zfY#H$wzl>*=%%I${70P>U}IyWS_D2lEx=Q1>tHCxSNmB+pFJ(WB^(5LN}b&D3Az$i z3v|7{zW$ceo1XEQ{Xzf+JI_J7BbEXnL)(Kui@;I<}13!fkefWx1io&A^~!W%*W zx;xPCtA+o<#)lpg0@z^TaQKcIeAy-^C+k5Sj^JcJps%m*HVM9LOG``dYy1k%WupL& z^n~${FIwh%YzIh~cLV`ThRi&3wL~px_Tk0z9MPhW@ewe|mbl)@)EygZqAqK+TF- zsSE6YujPIm--YO8`e)x$M(cvCMwB(W10BM^oa(QjtE;QWY!q>;@CkbYK#Yu@C+q>c zODm$Rk-fiQjt4{|k7j}_sYH}bQdlc=(E}-w_6H~r%)!r0p#=X`55z>;A%jG~PYY5z zIl_iRF=4{jtCVq5o|$4}bipegk@Q7CCk0V}|B4`QPy{R6mUQ4>7Q{`~31&8Ha~0Io zg(7$}30I&~;R^Vfx}%wynNQTf7Zw&Cot&KbxrwU@p>>2pNa{qj67Zd9qUxA%I}Ak- w@NE*oXBNKXb{-exY)t5=ZiDc>g4XHuH{NepCC=3qnE(I)07*qoM6N<$g31Lx@&Et; literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/tennis.png b/web/assets/Cesium/Assets/Textures/maki/tennis.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb63205403a91c1a22f1bc01fd498ae0da7865e GIT binary patch literal 1658 zcmV-=28H>FP)Px#32;bRa{vGi!vFvd!vV){sAK>D1`kO@K~#9!?VW8% zWK|f)$8|TU*r?rFqM(8z0;9g!Zbh}Ncizmo^R#)RcI(>X9h!*tKNFLUm_=Q;OWcvwFybI^ZWfb$H&LtHVC3vto)<&)D?z^hHuV zcyIlxg&rFl8-^l&#+H|tTS@Ckpn~q~?CcxR#Lw8?-d+s>!h>LDxlqN=7zkG+s`%*% zTY^wOFE8R3sTHuZv-1-X0ARx_u7puh0S^Gm)Yf%G5nsa-=srA!(0dmE6aMAi9EjO68xw*O5 zx!6T>W9v`bEyvvudf}Ze29R(YZn~f5Hg8+7R zc4{R62LYrH*h&C$7%Bls01|*p0mNdlFC+l_mZP7@efh$|LWcxkAAl2XcSAhviv6zu zUavPH0XTRjXmWD$P0@r#v2BT00H;NFLs)!Lowzt3q*jQ=#>Ov25I-7?eobpsya0GX z#9okl4wPE}q+Zb6+`I@?{HCU+D|#9fPXPR)^aAAbKi69qu1-p;6=r^Z{xwMAH#9VS zW#mgA-T<6eD^P81?Iz^2|6l-Ud?$7bYRiWP;0&~n^+-M+B!Ki9(MzOUKoCYd-~rHF z5&q~Iiq8iPfChnwz2oc|uCM^KvLZSam@{iTRsle!@YD;a$yi%jT0VmyzCi%|K)~na zwJHYrI7=uL`h~m9i)veydaSRn?|q06@I;df2&64aqc$`&^e*IOYey1#pqD(rI;S%p zvewnrtwDhh4u`*|q&X|KQvBPkPOyz9aWgYB7t71buk#F{qN3tDr5=7O+)e>axRsTa zR~1G1E4z@ry}cjgkzm^~>+kQM&;y~SrshZ6VgmMWYA@3BwM=_^`=_EpKrvz6@}59S zQ)A>q4V=_NR0xqs1z!1uq0x&yzz}a-UO9l2{Jxi=~N2VdL{7jV;3piTSDzP{)D@Of)A?vRsdC$w4 zc7aw7QI))UK%O7z{R1IKGYbeBleM5DF`%uj?J|^mTxb_k=!HOAw$NQ~0svFjknHd8 zSF8Nq;~q{QMlpf5fafy>z|6Yq%-1lm<4c&ib)m*3T1*wfSVp-7jg*)UHC&|c1T z&Bg=tVKF+=IIHwB?d43?XrSMU%_1gLRaIT3X!MxjBZ;E7d@CS?LZP2c>11+y@~lU& zheb@NudiPr{KkuV){5>W?H9P>+E_*qMn*>7Vd5>)i+4pHmpv?os3N;-5HUgRRzIn# zjYCwN07U|@I3^4X42)AQ7mZ2)HuMCwR6pTx_y-vSY>Ww+t=;wY^%(wF^f?okJwb;( zEEQw};b{}%D^fXz51Jp{V?g{1QZeg#L$QYVXR`nQzfY;c1)GgeumAu607*qoM6N<$ Eg3(O{?*IS* literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/theatre.png b/web/assets/Cesium/Assets/Textures/maki/theatre.png new file mode 100644 index 0000000000000000000000000000000000000000..772c96e4e31b501c5ec76fd5838bcc98d7c4214e GIT binary patch literal 3233 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 CG6nJg literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/toilets.png b/web/assets/Cesium/Assets/Textures/maki/toilets.png new file mode 100644 index 0000000000000000000000000000000000000000..e87cf19c072126f496cc1918a344fc3d595d8a0a GIT binary patch literal 2917 zcmai0`8U*!7yir`W0x2T$>g;j{i9$loppV zgOzCs;(;(l06=vT%O59t8U_X4G1LJnhpw#C0F%FwZ6E-!cm3y}KEF~|0AQvd^$?aJ z)0_4z{+3^P*~3q?3mEZtK-@5?k;R@ciRK!v9tjf)RGI|&uIQP9So`(df`6Ja*cK`(7(3p+{faO_hKj~%J9uM z8r2DIq%7GNY6{4YayvGp;JjqFn*ed;H{${5w_KVvTJVorW~z*VXQ>sodu51`p`9%a zhNN`FuCb;K21E?Qnxg|%-~CD8SAyoKV;)=D+S=|CGoLEMil(psEkT$2`=y#E5nM?>l%{oS-|5c}S zA`B3HA|fKvF3O4(?fB&f1!WwD+90Q6EI36c*p<>uW{9j$SJCd@c;8s>wx5R)oConF$N~qRj7;92o z4IeKyoiVP!N7DlbH4ed>(;u(Jhn`DX2(AvC9rvgFwVa}P)!qwMUVVEpocE^Z$bu_f za&9gb1m!$k1p5ujQ06~)S)@FCrcL7Y$c_q0r{sW1WgtH(*#_T*wr5&~(Br=jUiL+R z=hK-1gZRq<(+wuEX%BrSE6-jqyCAG9Y^qaj_NtBY7MN*;wFCR&MzNB(ANr1N7bGbV%eet}3nWap)(<%8F z^xO{6DVdrq+|n4Z-20-N)b82@AI~ZKn8>fRb>@Hf)Awo@E#SP^yZTxMQF(r0`M9}b zW_^8~%2>|>C_Y4_%s(uFTxMnt@+Cf-@7 z(C)u)6UEwJyhWSXL=c`*>}3+1zqpv6t{!^exmAQrlWcL=ehq3kloC%B)ciXHPq>=x zTz}9Pme#)&fB17!#vL*JQu{^WHQlHQX__RoI*Q=cw?7QUoa)18hramHnADppVuH1> zv1#Ci>>1KzBnMfPwM(k6YZRK%anv(Uu_`MsuO*1ktIETB2CX0Pnz5n&fj^QM+1L}_ zZfTf7!atA%TxWlQ>|J1Bw4GaGu@P%^W0-ZiJ*yTgKan2uIcYoe4UX zPVwsqbDc4g-P{m5Jl>f)X+D8-(}CX_V+Z^7Z}Om2c6>YZKN@qKQ!7~#&(U8r#&E_`BP-{gnBBhe5mZ=E04^Ak5%R<}G2W1JN+&-}yRp!-WT-M&Pc?~G2hI79d4C93bYPCQYI3X5QdTzpPN81Zj1@pV|TfNW`Q&udl=}A-K)Ha!dSd7$9 z{#q079P~IbMz2+!d#iqr5co+LSnf+&DB%Xm;9Ww*NjLsmfvbb2k>!&YgSGeDin59U z9FNf)pdROU*|$!vf1kiJt9c)A+PjH`M$TYw2pWGK= z^b?M|5ZteFCcq%^%5RS)+ry%bj?Xf?P&GSC-iDy{F-1!@9fnzY7DKp+VZC91Rhwp#Fh@Q4=k8 zIylcb$I2dkv)o6FmhpNY67cuH73ALz!e~i@hd$Yd5o`0&;Ep1tqPf!maiCgRGU^sg zV4mYwr5F%Hb)Zd4P9zK(?fkF=P$S85lxpFnmMBn6EssYKgWGh3Ou;UavK5lmygG9& z=L1H!3PH#4U?P|Pk!fQ`BXd37*RG?x&W6Uf3;1GPw2PWzr6~B-lDf!8L0o#l@oIMmr+YsoiTO_bvhXBgw{o zMparBadH%uptTV_tFQ?Dd5!>YD>FVk0TrdBHW5mlWh2YoN+I~UY zR6YA|o@Fw&MV=Lc`C=`Qx{3Q(W)_x(TVEk>v!dGSJ6}Ka6Q8x;r z4hkAO969Jr*~JSGdW}n_z=y)4pP$}UbHs1XHU>`DJ(^+G=Nt;hRCRGa?T$GYo#omR zAnB`Z77nl_^pGQ_FNPRJ)rv{?%K_m-UTaDBc=(^gdoQ>c`$B+_ou8%!V8FM3Q)%?~ z6-HcAdtnVmR;*wY>?kLmD=0V~A$SM!{?*23FK>bl0KKdPPvRuAcr-Ygx){rM<=gQXj2X IspE+MA2>mI{Qv*} literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/town-hall.png b/web/assets/Cesium/Assets/Textures/maki/town-hall.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5c7ce4d8f5c83c0f596136ec9b8995874d52d GIT binary patch literal 2005 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/triangle.png b/web/assets/Cesium/Assets/Textures/maki/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c47f42180c8f91fa40e5d77abbd3bcf4bdb253 GIT binary patch literal 2137 zcmV-f2&VUmP)Px#32;bRa{vGi!vFvd!vV){sAK>D2kuEkK~#9!?VSry zR8<(qNi)sNw6uq5rI}`CrJ1SuDCMyab_sR?dCnrqOF<|JV!#muOc(;DatH?)3mJ-` z2V*owGYmOKlbH=MG-<=cL=TH1Q4FJ&&d1zaa`wB+?y`6H-n-|_{KpxUoxQ*B-1FUg zzVCnV@?wJxHrQZ;4K~8Uee>3V2#7@-uT7Ip@H?mH^#s2Yg;?^0TuT!HKW=%Y`6!baX_V zI&~^~aBwg{;QwqQL72=aIzIbn5r`TZY;ke%0li+|c)oKl}wWd{}N&D%Ai6pBK413Xr>C z6(efrBPWqJ4KgMs=0j`nLH_>!KaydjA5Ym+(F7Ckkt0Xaxix=eJV8DXNXU~I-SOei zq!aJZ(2zbbFz~D`@IgL4K0~dot5%?fqU*A95+uKdZ zQgja^|NrcNoCcJen_D(f_`IT`qCQ3vvM&k3bqv1Qd46|C?p6AJTU-|32Zfwh^gr4=vE{EkdUW% z68zg}2COyd#V z6y!qhqv1C-H6@Y6d&N}&0A*!mRUmi4Iz=aBa&gnKzMhbfkS|;bAEZ*LF2Y715`_6m z4#1=I1s^Ca@lZN+cK|?p_wIcexeL}RA|aCt zxt=Qpj=8{X+qQis1^6JfT73aF0FfZfQ$he%(ic`+qp~zBnyPRhK z!}J9lI&>%pW|-6i07^(mco(?~w#dS3K)&Q`uJ`7@FAu#rTtEMa90V1)#>U2EBnV3+ zpLmHj&|f?~J-tRQ@OcFX2Y(4YsdPeyN}iOLp1W!ICr_S?QK?jy=!cAnUxj*E9Sq= zZYkVwX1Xzn7kX{TIIBeXyw{+mr6ms8CtBo=#A{)u%g)YzRjKfKg@=cKirfW$E_LH$ zX1X(H&O}0KPw4@G<+Zf5G!F^FN>|N()J(U1`}Pk!06y=={{izFKn2hhv){r@S65e; zCUk&?QYB#i+azj2=FD_sTp?mx!2CDcnX})*Oa~=9 zPfNU3%zxELF4*9dgp8T#pj0QOnNDu<^YgnT;Kskp83C{`)8*&qmoV@)ng4tyWuH_TuQ zDPo8CNo`0NlCs^I~-gkICgVf^B-rX)6!--D7`U=BAfrXLW_l& z4tii1K-P(?xXaZ;F7>&lS*jupk;0qj$wruo83^P~5PF`hY zWmalx>KjmoOh`z0hsi!ACnwj#vV%N+@~5y&zj`Y|WO7gz=MZ5ocP7!a3iTPo zHYxP7FhHUSR+(j1P2Sv*1Bp}b>_@OA06=Xfe8Wq0JBvg*k}ZL%A=Ibs01dOIMgo9j=O2sogg!b80AfFn zS`kjhOnz}sus?Zfx12V{c0KHvwpwJ@qXYa0Qg{QFj~Detn=ELwZWW%Ya^D*g;f>Dm z#@+Hd+m)1cG#6!|w$+PLE;X;&gT*M;X|W#Tu&@%`Zj-W^iofS)8bhOJU1vDP__pwz z+l_0R7gq|ShnhdoN{{bT{;x)RNn~;;xDq8VKLNPxasipIBk@XlXj1?oS<{aIHQn9w zX611a3_Lr4rorGmLvNcnei>A!ryOKtDk~Ksq)P-)6+wk9Xf>S_$_{MMJI8W z{zoOjMTcDE4M)< zC6$QhChFe1=S!fF%VasyRTFt%n8V;6%e>rN`sK8=wJQruYYOG?^ynz79XYoz%BQQc zMen<;1&-M}IXUUq$>ChgV(DUZbe8c^wkYK5+wL~vnk;h!bSX=k59O4tL ztgPahI#-lAr1s<9xwb+KCD~{CiJx6_-`U@zNCDM2PEM}{Zw8 z{bEb*A;x|dLk95`VCD;j!W`Q?!-9ykcqFeS6%K>V*!Skj*>acY63kmq{D!ef36-J( zDK~=i%Yj^xwU4(A;DT46L~~Nid?Cvdhr4y72Qe}-lBJ-iIK|c%U`R{!IO!Hc$|vu; zcc@Qzv>oye(eQA33qWOwY&=+;43)yEcDaN#uC+$ZV)R)ljb1I+P#!!KYDGRka&YA|9I? zf0P?9;$E~}#z4mUb0uM0#(DO9Pv%PR;2_%(K`25eW>0$`xS5^p3{`Pc(&ZEHeGc;X z?_EHgabg+FJL0M@o^p21)_z+}Y6zaLNebYxs}&p$ z=kJ(RO>xjrfoXOZ9Q2jAyga(1+ZGlY8tN7p7+5iqo;|m}g+$`W>Ll!itX2SpcEdwM zRpAFZ^=C&+AU9w&q-FY34ec1fnfEE-HsO^wHQ6B5$W5VJ)v+FrN={T_Cj-rZ@2BqT zDC3)6Dn-?$`Gc`XDV?em+GgPQ#le+kDKP4A{I38S0?7Gt1=xa{)@m(jFDUEjdfh;F zeI9CmIOO}JzF8W4(%HGKeIQpqGr}qHJU=@$K7ON&hH39zo__ZEE!MH1pdhomyE~zZ zfcQ!d4-e0<9HS@UL0VZJ3mby(8S?V-p(G+P0eWIXOdU-TPK>Gy^mx{vZo8EBPOa3sWv|RNZAp=Q-st0QmEZLb389E>ZL*Yhi5-3f zo2Qm*1j*KUo;rAfN)_BM6ScQaMZIfJ+A-W&xp`_>-}}YG*Powq=30`^vJb{%poup5 zfi3u_7RQeDrx~3vJ_F^XI0vgnZCWAF=H_jnY$G#cZc0ju-B7+U>y`ZI=~L^Nlm#C{ z9;H1(P^p&=U}xgsoBAZu{Oth?9{-f9>(o37S+il*dDmp*KN?%mtJTE#tV{c?vMt#`az4k#o3aL{>{n&z2A$GDRs_pDj*u%E~W3J-dY^U zbdax*@i-_#$v5(fUTBPrh$x>%wln(|8M>JIr%w;5KTFfAmbED3Cx>{l-^JDgh}C$W zEk3dK-kEQKB4KH^j*f50B)7&pmmhAHl#~#!#<_eM16jMOR+N|XYaBH}&rm;fIDJ`# zg~B^g;^{}yB+WV%&3}5?LPTPywPmwNB9T}U*dzAO;mRN-3lPrxK{*As1McZ~+G>9j zKq!w+RB!?QdHp4gjDiGB7W2#5NnnUHEKKvV?cT#mk5m8E2F}38B9vi?RWINB(n66I zE>02$9syNrnKuCy0E(8oS6aGgd`>J1Oq$E64_R+{@Y#w?W?W-xUx0cV=IK6eD%#s) z1MHP+_~s(RJ)*7Pu4%6+f{qIg`;jm`J>3wFv}mf8QOJ_L7jYzC;Z@#o(5tt+J_Bg@ zx|>9=$MCT^wMu|9IGEK~YwGYF@-n!(u0TWfU~kco{Ct;;Ma|0O1u;5Lq6D zW=W4ZdCZ*_hFqx$bQBU`UTGgR)cWvHzYamaXt%7TT1Jog**QB#dh*r(=y(W2gnbh_ VA@*_T;r3eq93@h$sw_Q|{|C9P$Q%Fw literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/warehouse.png b/web/assets/Cesium/Assets/Textures/maki/warehouse.png new file mode 100644 index 0000000000000000000000000000000000000000..910f1e4c940c73334fe62ac0845f2783189dc191 GIT binary patch literal 1908 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 Dn66b{ literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/maki/water.png b/web/assets/Cesium/Assets/Textures/maki/water.png new file mode 100644 index 0000000000000000000000000000000000000000..159a557de69a1b2f8998b56d3ebc85aec3203a6a GIT binary patch literal 2411 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/moonSmall.jpg b/web/assets/Cesium/Assets/Textures/moonSmall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47f52522ea7501f58eb0cf14bd89e4f90c32fde5 GIT binary patch literal 18196 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/pin.svg b/web/assets/Cesium/Assets/Textures/pin.svg new file mode 100644 index 00000000..7892c368 --- /dev/null +++ b/web/assets/Cesium/Assets/Textures/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/assets/Cesium/Assets/Textures/waterNormals.jpg b/web/assets/Cesium/Assets/Textures/waterNormals.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb1baa2d62829297680a99ef890ef719599965cc GIT binary patch literal 294196 zcmbTdc{p3!|3B)So=#MIT2)2MX$@_SHH5a5 uQswqg2qvk}UhM39cv_(sC%oWoy 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�+MF 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

    wyy2=a9FLQ8h}6#D77{rNRn8IRs)5W|CzsVe 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𝔒gs%v+c8CCNCS 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 z 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μ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%0A{Q_eH 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 Ql)4Vfg;7(EzyCA+|7<^4(EtDd literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/waterNormalsSmall.jpg b/web/assets/Cesium/Assets/Textures/waterNormalsSmall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57b19d8f46fdc4a7e6fe249da37f0fe9c3c461e8 GIT binary patch literal 34121 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�MKo&Lj{(*y=W)D+k z1YZEH#0F9xPW8@d!7WkJiW6+*hA(mNPqZ2%c{BK7a+c0woL$drk`<4n2!O_H19ed8 z$rzra;(iBZ;fv`07_F1ZL|2`FtlHTd20aMdw14T*6aFh*PV1$n9gEEb+=&O>pmYca z%6;t}Z#{xOp71OC3A=wn4G2Bp89OGP?O_ zbS?UdNk6>O>3gj%?O1#{zM@$}Cy;uZgnzsWnvDAPKQh!CW2?O@*2?8}8krk@V!N}g zhnF;E%Q3bq_nXsee^i02EOhC8Q};X+GI%5eI)w{Y?na^~N_gJ|YfA}xhP>B35Fbx` z;G9Tz%(ADmgy~+v%^aVnuXuA3l=_UAtW2oi(-h-!+yqeemXg zG!~8jXe>3sVvC5hxylqT%7aNtoi(>GfGr*0V+1N}6eYM6AcD%9+~2GXRorX}iFkeb zq7lngn;bKvMiN|DShPZ`4lukH(rPyS;LV$Ikw{8)b`x7P-f|)~*pB1VtGUWt-})V_ zmdLALa6m!}0FWqD2Bq-#Xu-9TnetHz4<>OTy_-7K=>@`G>-%XHsC{n;W9kh`SC6j~ z8;>0cpDR!w-DQbcc;yJwIs>XtgjPUsG{lh{P(;ENiZ7K=97q=2Ez%>sk(TOFd(WLtp(O%*3};DM$7_N8cG zgK*s2c*o9bMaFYByd$48D5hwh@5cJFFm&90lq|(_<4VfVr=5{9G^^Xf+@$3EDm~IU z$V`-;l={xM{5rt1z(>{~YA{fEy0EWvpbxmt{dh}c|B-Day@A=Ss#yIM3T$*J0RKqoO1w2Kon~cileBf6|pY | Promise; + token?: string; + ellipsoid?: Ellipsoid; + }); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. This function should not be called before {@link ArcGISTiledElevationTerrainProvider#ready} returns true. + */ + credit: Credit; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link ArcGISTiledElevationTerrainProvider#ready} returns true. + */ + tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. This function should not be + * called before {@link ArcGISTiledElevationTerrainProvider#ready} returns true. + */ + hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * This function should not be called before {@link ArcGISTiledElevationTerrainProvider#ready} returns true. + */ + hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This function should not be called before + * {@link TerrainProvider#ready} returns true. This property may be undefined if availability + * information is not available. + */ + availability: TileAvailability; + /** + * Requests the geometry for a given tile. This function should not be called before + * {@link ArcGISTiledElevationTerrainProvider#ready} returns true. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable(x: number, y: number, level: number): boolean; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined | Promise; +} + +/** + * ArcType defines the path that should be taken connecting vertices. + */ +export enum ArcType { + /** + * Straight line that does not conform to the surface of the ellipsoid. + */ + NONE = 0, + /** + * Follow geodesic path. + */ + GEODESIC = 1, + /** + * Follow rhumb or loxodrome path. + */ + RHUMB = 2 +} + +/** + * A collection of key-value pairs that is stored as a hash for easy + * lookup but also provides an array for fast iteration. + */ +export class AssociativeArray { + constructor(); + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Gets an unordered array of all values in the collection. + * This is a live array that will automatically reflect the values in the collection, + * it should not be modified directly. + */ + values: any[]; + /** + * Determines if the provided key is in the array. + * @param key - The key to check. + * @returns true if the key is in the array, false otherwise. + */ + contains(key: string | number): boolean; + /** + * Associates the provided key with the provided value. If the key already + * exists, it is overwritten with the new value. + * @param key - A unique identifier. + * @param value - The value to associate with the provided key. + */ + set(key: string | number, value: any): void; + /** + * Retrieves the value associated with the provided key. + * @param key - The key whose value is to be retrieved. + * @returns The associated value, or undefined if the key does not exist in the collection. + */ + get(key: string | number): any; + /** + * Removes a key-value pair from the collection. + * @param key - The key to be removed. + * @returns True if it was removed, false if the key was not in the collection. + */ + remove(key: string | number): boolean; + /** + * Clears the collection. + */ + removeAll(): void; +} + +/** + * Creates an instance of an AxisAlignedBoundingBox from the minimum and maximum points along the x, y, and z axes. + * @param [minimum = Cartesian3.ZERO] - The minimum point along the x, y, and z axes. + * @param [maximum = Cartesian3.ZERO] - The maximum point along the x, y, and z axes. + * @param [center] - The center of the box; automatically computed if not supplied. + */ +export class AxisAlignedBoundingBox { + constructor(minimum?: Cartesian3, maximum?: Cartesian3, center?: Cartesian3); + /** + * The minimum point defining the bounding box. + */ + minimum: Cartesian3; + /** + * The maximum point defining the bounding box. + */ + maximum: Cartesian3; + /** + * The center point of the bounding box. + */ + center: Cartesian3; + /** + * Computes an instance of an AxisAlignedBoundingBox. The box is determined by + * finding the points spaced the farthest apart on the x, y, and z axes. + * @example + * // Compute an axis aligned bounding box enclosing two points. + * var box = Cesium.AxisAlignedBoundingBox.fromPoints([new Cesium.Cartesian3(2, 0, 0), new Cesium.Cartesian3(-2, 0, 0)]); + * @param positions - List of points that the bounding box will enclose. Each point must have a x, y, and z properties. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided. + */ + static fromPoints(positions: Cartesian3[], result?: AxisAlignedBoundingBox): AxisAlignedBoundingBox; + /** + * Duplicates a AxisAlignedBoundingBox instance. + * @param box - The bounding box to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if none was provided. (Returns undefined if box is undefined) + */ + static clone(box: AxisAlignedBoundingBox, result?: AxisAlignedBoundingBox): AxisAlignedBoundingBox; + /** + * Compares the provided AxisAlignedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first AxisAlignedBoundingBox. + * @param [right] - The second AxisAlignedBoundingBox. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: AxisAlignedBoundingBox, right?: AxisAlignedBoundingBox): boolean; + /** + * Determines which side of a plane a box is located. + * @param box - The bounding box to test. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + static intersectPlane(box: AxisAlignedBoundingBox, plane: Plane): Intersect; + /** + * Duplicates this AxisAlignedBoundingBox instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided. + */ + clone(result?: AxisAlignedBoundingBox): AxisAlignedBoundingBox; + /** + * Determines which side of a plane this box is located. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + intersectPlane(plane: Plane): Intersect; + /** + * Compares this AxisAlignedBoundingBox against the provided AxisAlignedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side AxisAlignedBoundingBox. + * @returns true if they are equal, false otherwise. + */ + equals(right?: AxisAlignedBoundingBox): boolean; +} + +/** + * Object for setting and retrieving the default Bing Maps API key. + * + * A Bing API key is only required if you are using {@link BingMapsImageryProvider} + * or {@link BingMapsGeocoderService}. You can create your own key at + * {@link https://www.bingmapsportal.com/}. + */ +export namespace BingMapsApi { + /** + * The default Bing Maps API key to use if one is not provided to the + * constructor of an object that uses the Bing Maps API. + */ + var defaultKey: string; + /** + * Gets the key to use to access the Bing Maps API. If the provided + * key is defined, it is returned. Otherwise, returns {@link BingMapsApi.defaultKey}. + * @param providedKey - The provided key to use if defined. + * @returns The Bing Maps API key to use. + */ + function getKey(providedKey: string | null | undefined): string | undefined; +} + +/** + * Provides geocoding through Bing Maps. + * @param options - Object with the following properties: + * @param options.key - A key to use with the Bing Maps geocoding service + */ +export class BingMapsGeocoderService { + constructor(options: { + key: string; + }); + /** + * The URL endpoint for the Bing geocoder service + */ + readonly url: string; + /** + * The key for the Bing geocoder service + */ + readonly key: string; + /** + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; +} + +/** + * A bounding rectangle given by a corner, width and height. + * @param [x = 0.0] - The x coordinate of the rectangle. + * @param [y = 0.0] - The y coordinate of the rectangle. + * @param [width = 0.0] - The width of the rectangle. + * @param [height = 0.0] - The height of the rectangle. + */ +export class BoundingRectangle { + constructor(x?: number, y?: number, width?: number, height?: number); + /** + * The x coordinate of the rectangle. + */ + x: number; + /** + * The y coordinate of the rectangle. + */ + y: number; + /** + * The width of the rectangle. + */ + width: number; + /** + * The height of the rectangle. + */ + height: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: BoundingRectangle, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: BoundingRectangle): BoundingRectangle; + /** + * Computes a bounding rectangle enclosing the list of 2D points. + * The rectangle is oriented with the corner at the bottom left. + * @param positions - List of points that the bounding rectangle will enclose. Each point must have x and y properties. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static fromPoints(positions: Cartesian2[], result?: BoundingRectangle): BoundingRectangle; + /** + * Computes a bounding rectangle from a rectangle. + * @param rectangle - The valid rectangle used to create a bounding rectangle. + * @param [projection = GeographicProjection] - The projection used to project the rectangle into 2D. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static fromRectangle(rectangle: Rectangle, projection?: any, result?: BoundingRectangle): BoundingRectangle; + /** + * Duplicates a BoundingRectangle instance. + * @param rectangle - The bounding rectangle to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. (Returns undefined if rectangle is undefined) + */ + static clone(rectangle: BoundingRectangle, result?: BoundingRectangle): BoundingRectangle; + /** + * Computes a bounding rectangle that is the union of the left and right bounding rectangles. + * @param left - A rectangle to enclose in bounding rectangle. + * @param right - A rectangle to enclose in a bounding rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static union(left: BoundingRectangle, right: BoundingRectangle, result?: BoundingRectangle): BoundingRectangle; + /** + * Computes a bounding rectangle by enlarging the provided rectangle until it contains the provided point. + * @param rectangle - A rectangle to expand. + * @param point - A point to enclose in a bounding rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static expand(rectangle: BoundingRectangle, point: Cartesian2, result?: BoundingRectangle): BoundingRectangle; + /** + * Determines if two rectangles intersect. + * @param left - A rectangle to check for intersection. + * @param right - The other rectangle to check for intersection. + * @returns Intersect.INTESECTING if the rectangles intersect, Intersect.OUTSIDE otherwise. + */ + static intersect(left: BoundingRectangle, right: BoundingRectangle): Intersect; + /** + * Compares the provided BoundingRectangles componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first BoundingRectangle. + * @param [right] - The second BoundingRectangle. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: BoundingRectangle, right?: BoundingRectangle): boolean; + /** + * Duplicates this BoundingRectangle instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + clone(result?: BoundingRectangle): BoundingRectangle; + /** + * Determines if this rectangle intersects with another. + * @param right - A rectangle to check for intersection. + * @returns Intersect.INTESECTING if the rectangles intersect, Intersect.OUTSIDE otherwise. + */ + intersect(right: BoundingRectangle): Intersect; + /** + * Compares this BoundingRectangle against the provided BoundingRectangle componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side BoundingRectangle. + * @returns true if they are equal, false otherwise. + */ + equals(right?: BoundingRectangle): boolean; +} + +/** + * A bounding sphere with a center and a radius. + * @param [center = Cartesian3.ZERO] - The center of the bounding sphere. + * @param [radius = 0.0] - The radius of the bounding sphere. + */ +export class BoundingSphere { + constructor(center?: Cartesian3, radius?: number); + /** + * The center point of the sphere. + */ + center: Cartesian3; + /** + * The radius of the sphere. + */ + radius: number; + /** + * Computes a tight-fitting bounding sphere enclosing a list of 3D Cartesian points. + * The bounding sphere is computed by running two algorithms, a naive algorithm and + * Ritter's algorithm. The smaller of the two spheres is used to ensure a tight fit. + * @param [positions] - An array of points that the bounding sphere will enclose. Each point must have x, y, and z properties. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static fromPoints(positions?: Cartesian3[], result?: BoundingSphere): BoundingSphere; + /** + * Computes a bounding sphere from a rectangle projected in 2D. + * @param [rectangle] - The rectangle around which to create a bounding sphere. + * @param [projection = GeographicProjection] - The projection used to project the rectangle into 2D. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromRectangle2D(rectangle?: Rectangle, projection?: any, result?: BoundingSphere): BoundingSphere; + /** + * Computes a bounding sphere from a rectangle projected in 2D. The bounding sphere accounts for the + * object's minimum and maximum heights over the rectangle. + * @param [rectangle] - The rectangle around which to create a bounding sphere. + * @param [projection = GeographicProjection] - The projection used to project the rectangle into 2D. + * @param [minimumHeight = 0.0] - The minimum height over the rectangle. + * @param [maximumHeight = 0.0] - The maximum height over the rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromRectangleWithHeights2D(rectangle?: Rectangle, projection?: any, minimumHeight?: number, maximumHeight?: number, result?: BoundingSphere): BoundingSphere; + /** + * Computes a bounding sphere from a rectangle in 3D. The bounding sphere is created using a subsample of points + * on the ellipsoid and contained in the rectangle. It may not be accurate for all rectangles on all types of ellipsoids. + * @param [rectangle] - The valid rectangle used to create a bounding sphere. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid used to determine positions of the rectangle. + * @param [surfaceHeight = 0.0] - The height above the surface of the ellipsoid. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromRectangle3D(rectangle?: Rectangle, ellipsoid?: Ellipsoid, surfaceHeight?: number, result?: BoundingSphere): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing a list of 3D points, where the points are + * stored in a flat array in X, Y, Z, order. The bounding sphere is computed by running two + * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to + * ensure a tight fit. + * @example + * // Compute the bounding sphere from 3 positions, each specified relative to a center. + * // In addition to the X, Y, and Z coordinates, the points array contains two additional + * // elements per point which are ignored for the purpose of computing the bounding sphere. + * var center = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * var points = [1.0, 2.0, 3.0, 0.1, 0.2, + * 4.0, 5.0, 6.0, 0.1, 0.2, + * 7.0, 8.0, 9.0, 0.1, 0.2]; + * var sphere = Cesium.BoundingSphere.fromVertices(points, center, 5); + * @param [positions] - An array of points that the bounding sphere will enclose. Each point + * is formed from three elements in the array in the order X, Y, Z. + * @param [center = Cartesian3.ZERO] - The position to which the positions are relative, which need not be the + * origin of the coordinate system. This is useful when the positions are to be used for + * relative-to-center (RTC) rendering. + * @param [stride = 3] - The number of array elements per vertex. It must be at least 3, but it may + * be higher. Regardless of the value of this parameter, the X coordinate of the first position + * is at array index 0, the Y coordinate is at array index 1, and the Z coordinate is at array index + * 2. When stride is 3, the X coordinate of the next position then begins at array index 3. If + * the stride is 5, however, two array elements are skipped and the next position begins at array + * index 5. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static fromVertices(positions?: number[], center?: Cartesian3, stride?: number, result?: BoundingSphere): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing a list of EncodedCartesian3s, where the points are + * stored in parallel flat arrays in X, Y, Z, order. The bounding sphere is computed by running two + * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to + * ensure a tight fit. + * @param [positionsHigh] - An array of high bits of the encoded cartesians that the bounding sphere will enclose. Each point + * is formed from three elements in the array in the order X, Y, Z. + * @param [positionsLow] - An array of low bits of the encoded cartesians that the bounding sphere will enclose. Each point + * is formed from three elements in the array in the order X, Y, Z. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static fromEncodedCartesianVertices(positionsHigh?: number[], positionsLow?: number[], result?: BoundingSphere): BoundingSphere; + /** + * Computes a bounding sphere from the corner points of an axis-aligned bounding box. The sphere + * tighly and fully encompases the box. + * @example + * // Create a bounding sphere around the unit cube + * var sphere = Cesium.BoundingSphere.fromCornerPoints(new Cesium.Cartesian3(-0.5, -0.5, -0.5), new Cesium.Cartesian3(0.5, 0.5, 0.5)); + * @param [corner] - The minimum height over the rectangle. + * @param [oppositeCorner] - The maximum height over the rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromCornerPoints(corner?: Cartesian3, oppositeCorner?: Cartesian3, result?: BoundingSphere): BoundingSphere; + /** + * Creates a bounding sphere encompassing an ellipsoid. + * @example + * var boundingSphere = Cesium.BoundingSphere.fromEllipsoid(ellipsoid); + * @param ellipsoid - The ellipsoid around which to create a bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromEllipsoid(ellipsoid: Ellipsoid, result?: BoundingSphere): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing the provided array of bounding spheres. + * @param [boundingSpheres] - The array of bounding spheres. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromBoundingSpheres(boundingSpheres?: BoundingSphere[], result?: BoundingSphere): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing the provided oriented bounding box. + * @param orientedBoundingBox - The oriented bounding box. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromOrientedBoundingBox(orientedBoundingBox: OrientedBoundingBox, result?: BoundingSphere): BoundingSphere; + /** + * Duplicates a BoundingSphere instance. + * @param sphere - The bounding sphere to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. (Returns undefined if sphere is undefined) + */ + static clone(sphere: BoundingSphere, result?: BoundingSphere): BoundingSphere; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: BoundingSphere, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: BoundingSphere): BoundingSphere; + /** + * Computes a bounding sphere that contains both the left and right bounding spheres. + * @param left - A sphere to enclose in a bounding sphere. + * @param right - A sphere to enclose in a bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static union(left: BoundingSphere, right: BoundingSphere, result?: BoundingSphere): BoundingSphere; + /** + * Computes a bounding sphere by enlarging the provided sphere to contain the provided point. + * @param sphere - A sphere to expand. + * @param point - A point to enclose in a bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static expand(sphere: BoundingSphere, point: Cartesian3, result?: BoundingSphere): BoundingSphere; + /** + * Determines which side of a plane a sphere is located. + * @param sphere - The bounding sphere to test. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire sphere is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire sphere is + * on the opposite side, and {@link Intersect.INTERSECTING} if the sphere + * intersects the plane. + */ + static intersectPlane(sphere: BoundingSphere, plane: Plane): Intersect; + /** + * Applies a 4x4 affine transformation matrix to a bounding sphere. + * @param sphere - The bounding sphere to apply the transformation to. + * @param transform - The transformation matrix to apply to the bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static transform(sphere: BoundingSphere, transform: Matrix4, result?: BoundingSphere): BoundingSphere; + /** + * Computes the estimated distance squared from the closest point on a bounding sphere to a point. + * @example + * // Sort bounding spheres from back to front + * spheres.sort(function(a, b) { + * return Cesium.BoundingSphere.distanceSquaredTo(b, camera.positionWC) - Cesium.BoundingSphere.distanceSquaredTo(a, camera.positionWC); + * }); + * @param sphere - The sphere. + * @param cartesian - The point + * @returns The estimated distance squared from the bounding sphere to the point. + */ + static distanceSquaredTo(sphere: BoundingSphere, cartesian: Cartesian3): number; + /** + * Applies a 4x4 affine transformation matrix to a bounding sphere where there is no scale + * The transformation matrix is not verified to have a uniform scale of 1. + * This method is faster than computing the general bounding sphere transform using {@link BoundingSphere.transform}. + * @example + * var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(positionOnEllipsoid); + * var boundingSphere = new Cesium.BoundingSphere(); + * var newBoundingSphere = Cesium.BoundingSphere.transformWithoutScale(boundingSphere, modelMatrix); + * @param sphere - The bounding sphere to apply the transformation to. + * @param transform - The transformation matrix to apply to the bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static transformWithoutScale(sphere: BoundingSphere, transform: Matrix4, result?: BoundingSphere): BoundingSphere; + /** + * The distances calculated by the vector from the center of the bounding sphere to position projected onto direction + * plus/minus the radius of the bounding sphere. + *
    + * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding sphere. + * @param sphere - The bounding sphere to calculate the distance to. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding sphere from position in direction. + */ + static computePlaneDistances(sphere: BoundingSphere, position: Cartesian3, direction: Cartesian3, result?: Interval): Interval; + /** + * Creates a bounding sphere in 2D from a bounding sphere in 3D world coordinates. + * @param sphere - The bounding sphere to transform to 2D. + * @param [projection = GeographicProjection] - The projection to 2D. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static projectTo2D(sphere: BoundingSphere, projection?: any, result?: BoundingSphere): BoundingSphere; + /** + * Determines whether or not a sphere is hidden from view by the occluder. + * @param sphere - The bounding sphere surrounding the occludee object. + * @param occluder - The occluder. + * @returns true if the sphere is not visible; otherwise false. + */ + static isOccluded(sphere: BoundingSphere, occluder: Occluder): boolean; + /** + * Compares the provided BoundingSphere componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first BoundingSphere. + * @param [right] - The second BoundingSphere. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: BoundingSphere, right?: BoundingSphere): boolean; + /** + * Determines which side of a plane the sphere is located. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire sphere is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire sphere is + * on the opposite side, and {@link Intersect.INTERSECTING} if the sphere + * intersects the plane. + */ + intersectPlane(plane: Plane): Intersect; + /** + * Computes the estimated distance squared from the closest point on a bounding sphere to a point. + * @example + * // Sort bounding spheres from back to front + * spheres.sort(function(a, b) { + * return b.distanceSquaredTo(camera.positionWC) - a.distanceSquaredTo(camera.positionWC); + * }); + * @param cartesian - The point + * @returns The estimated distance squared from the bounding sphere to the point. + */ + distanceSquaredTo(cartesian: Cartesian3): number; + /** + * The distances calculated by the vector from the center of the bounding sphere to position projected onto direction + * plus/minus the radius of the bounding sphere. + *
    + * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding sphere. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding sphere from position in direction. + */ + computePlaneDistances(position: Cartesian3, direction: Cartesian3, result?: Interval): Interval; + /** + * Determines whether or not a sphere is hidden from view by the occluder. + * @param occluder - The occluder. + * @returns true if the sphere is not visible; otherwise false. + */ + isOccluded(occluder: Occluder): boolean; + /** + * Compares this BoundingSphere against the provided BoundingSphere componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side BoundingSphere. + * @returns true if they are equal, false otherwise. + */ + equals(right?: BoundingSphere): boolean; + /** + * Duplicates this BoundingSphere instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + clone(result?: BoundingSphere): BoundingSphere; + /** + * Computes the radius of the BoundingSphere. + * @returns The radius of the BoundingSphere. + */ + volume(): number; +} + +/** + * Describes a cube centered at the origin. + * @example + * var box = new Cesium.BoxGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0), + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0) + * }); + * var geometry = Cesium.BoxGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.minimum - The minimum x, y, and z coordinates of the box. + * @param options.maximum - The maximum x, y, and z coordinates of the box. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class BoxGeometry { + constructor(options: { + minimum: Cartesian3; + maximum: Cartesian3; + vertexFormat?: VertexFormat; + }); + /** + * Creates a cube centered at the origin given its dimensions. + * @example + * var box = Cesium.BoxGeometry.fromDimensions({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * dimensions : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0) + * }); + * var geometry = Cesium.BoxGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.dimensions - The width, depth, and height of the box stored in the x, y, and z coordinates of the Cartesian3, respectively. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + static fromDimensions(options: { + dimensions: Cartesian3; + vertexFormat?: VertexFormat; + }): BoxGeometry; + /** + * Creates a cube from the dimensions of an AxisAlignedBoundingBox. + * @example + * var aabb = Cesium.AxisAlignedBoundingBox.fromPoints(Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ])); + * var box = Cesium.BoxGeometry.fromAxisAlignedBoundingBox(aabb); + * @param boundingBox - A description of the AxisAlignedBoundingBox. + */ + static fromAxisAlignedBoundingBox(boundingBox: AxisAlignedBoundingBox): BoxGeometry; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: BoxGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoxGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: BoxGeometry): BoxGeometry; + /** + * Computes the geometric representation of a box, including its vertices, indices, and a bounding sphere. + * @param boxGeometry - A description of the box. + * @returns The computed vertices and indices. + */ + static createGeometry(boxGeometry: BoxGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a cube centered at the origin. + * @example + * var box = new Cesium.BoxOutlineGeometry({ + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0), + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0) + * }); + * var geometry = Cesium.BoxOutlineGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.minimum - The minimum x, y, and z coordinates of the box. + * @param options.maximum - The maximum x, y, and z coordinates of the box. + */ +export class BoxOutlineGeometry { + constructor(options: { + minimum: Cartesian3; + maximum: Cartesian3; + }); + /** + * Creates an outline of a cube centered at the origin given its dimensions. + * @example + * var box = Cesium.BoxOutlineGeometry.fromDimensions({ + * dimensions : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0) + * }); + * var geometry = Cesium.BoxOutlineGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.dimensions - The width, depth, and height of the box stored in the x, y, and z coordinates of the Cartesian3, respectively. + */ + static fromDimensions(options: { + dimensions: Cartesian3; + }): BoxOutlineGeometry; + /** + * Creates an outline of a cube from the dimensions of an AxisAlignedBoundingBox. + * @example + * var aabb = Cesium.AxisAlignedBoundingBox.fromPoints(Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ])); + * var box = Cesium.BoxOutlineGeometry.fromAxisAlignedBoundingBox(aabb); + * + * + * @param boundingBox - A description of the AxisAlignedBoundingBox. + */ + static fromAxisAlignedBoundingBox(boundingBox: AxisAlignedBoundingBox): BoxOutlineGeometry; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: BoxOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoxOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: BoxOutlineGeometry): BoxOutlineGeometry; + /** + * Computes the geometric representation of an outline of a box, including its vertices, indices, and a bounding sphere. + * @param boxGeometry - A description of the box outline. + * @returns The computed vertices and indices. + */ + static createGeometry(boxGeometry: BoxOutlineGeometry): Geometry | undefined; +} + +/** + * A 2D Cartesian point. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + */ +export class Cartesian2 { + constructor(x?: number, y?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * Creates a Cartesian2 instance from x and y coordinates. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromElements(x: number, y: number, result?: Cartesian2): Cartesian2; + /** + * Duplicates a Cartesian2 instance. + * @param cartesian - The Cartesian to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. (Returns undefined if cartesian is undefined) + */ + static clone(cartesian: Cartesian2, result?: Cartesian2): Cartesian2; + /** + * Creates a Cartesian2 instance from an existing Cartesian3. This simply takes the + * x and y properties of the Cartesian3 and drops z. + * @param cartesian - The Cartesian3 instance to create a Cartesian2 instance from. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromCartesian3(cartesian: Cartesian3, result?: Cartesian2): Cartesian2; + /** + * Creates a Cartesian2 instance from an existing Cartesian4. This simply takes the + * x and y properties of the Cartesian4 and drops z and w. + * @param cartesian - The Cartesian4 instance to create a Cartesian2 instance from. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromCartesian4(cartesian: Cartesian4, result?: Cartesian2): Cartesian2; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Cartesian2, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Cartesian2): Cartesian2; + /** + * Flattens an array of Cartesian2s into and array of components. + * @param array - The array of cartesians to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 2 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 2) elements. + * @returns The packed array. + */ + static packArray(array: Cartesian2[], result?: number[]): number[]; + /** + * Unpacks an array of cartesian components into and array of Cartesian2s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Cartesian2[]): Cartesian2[]; + /** + * Creates a Cartesian2 from two consecutive elements in an array. + * @example + * // Create a Cartesian2 with (1.0, 2.0) + * var v = [1.0, 2.0]; + * var p = Cesium.Cartesian2.fromArray(v); + * + * // Create a Cartesian2 with (1.0, 2.0) using an offset into an array + * var v2 = [0.0, 0.0, 1.0, 2.0]; + * var p2 = Cesium.Cartesian2.fromArray(v2, 2); + * @param array - The array whose two consecutive elements correspond to the x and y components, respectively. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to the x component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromArray(array: number[], startingIndex?: number, result?: Cartesian2): Cartesian2; + /** + * Computes the value of the maximum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the maximum component. + */ + static maximumComponent(cartesian: Cartesian2): number; + /** + * Computes the value of the minimum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the minimum component. + */ + static minimumComponent(cartesian: Cartesian2): number; + /** + * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the minimum components. + */ + static minimumByComponent(first: Cartesian2, second: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the maximum components. + */ + static maximumByComponent(first: Cartesian2, second: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the provided Cartesian's squared magnitude. + * @param cartesian - The Cartesian instance whose squared magnitude is to be computed. + * @returns The squared magnitude. + */ + static magnitudeSquared(cartesian: Cartesian2): number; + /** + * Computes the Cartesian's magnitude (length). + * @param cartesian - The Cartesian instance whose magnitude is to be computed. + * @returns The magnitude. + */ + static magnitude(cartesian: Cartesian2): number; + /** + * Computes the distance between two points. + * @example + * // Returns 1.0 + * var d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(2.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distance(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the squared distance between two points. Comparing squared distances + * using this function is more efficient than comparing distances using {@link Cartesian2#distance}. + * @example + * // Returns 4.0, not 2.0 + * var d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(3.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distanceSquared(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the normalized form of the supplied Cartesian. + * @param cartesian - The Cartesian to be normalized. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the dot (scalar) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The dot product. + */ + static dot(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the componentwise product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyComponents(left: Cartesian2, right: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the componentwise quotient of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideComponents(left: Cartesian2, right: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the componentwise sum of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Cartesian2, right: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the componentwise difference of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Cartesian2, right: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Multiplies the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(cartesian: Cartesian2, scalar: number, result: Cartesian2): Cartesian2; + /** + * Divides the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar(cartesian: Cartesian2, scalar: number, result: Cartesian2): Cartesian2; + /** + * Negates the provided Cartesian. + * @param cartesian - The Cartesian to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the absolute value of the provided Cartesian. + * @param cartesian - The Cartesian whose absolute value is to be computed. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the linear interpolation or extrapolation at t using the provided cartesians. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp(start: Cartesian2, end: Cartesian2, t: number, result: Cartesian2): Cartesian2; + /** + * Returns the angle, in radians, between the provided Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The angle between the Cartesians. + */ + static angleBetween(left: Cartesian2, right: Cartesian2): number; + /** + * Returns the axis that is most orthogonal to the provided Cartesian. + * @param cartesian - The Cartesian on which to find the most orthogonal axis. + * @param result - The object onto which to store the result. + * @returns The most orthogonal axis. + */ + static mostOrthogonalAxis(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Compares the provided Cartesians componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartesian2, right?: Cartesian2): boolean; + /** + * Compares the provided Cartesians componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Cartesian2, right?: Cartesian2, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * An immutable Cartesian2 instance initialized to (0.0, 0.0). + */ + static readonly ZERO: Cartesian2; + /** + * An immutable Cartesian2 instance initialized to (1.0, 0.0). + */ + static readonly UNIT_X: Cartesian2; + /** + * An immutable Cartesian2 instance initialized to (0.0, 1.0). + */ + static readonly UNIT_Y: Cartesian2; + /** + * Duplicates this Cartesian2 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + clone(result?: Cartesian2): Cartesian2; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side Cartesian. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Cartesian2): boolean; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Cartesian2, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Creates a string representing this Cartesian in the format '(x, y)'. + * @returns A string representing the provided Cartesian in the format '(x, y)'. + */ + toString(): string; +} + +/** + * A 3D Cartesian point. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + * @param [z = 0.0] - The Z component. + */ +export class Cartesian3 { + constructor(x?: number, y?: number, z?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * The Z component. + */ + z: number; + /** + * Converts the provided Spherical into Cartesian3 coordinates. + * @param spherical - The Spherical to be converted to Cartesian3. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromSpherical(spherical: Spherical, result?: Cartesian3): Cartesian3; + /** + * Creates a Cartesian3 instance from x, y and z coordinates. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param z - The z coordinate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromElements(x: number, y: number, z: number, result?: Cartesian3): Cartesian3; + /** + * Duplicates a Cartesian3 instance. + * @param cartesian - The Cartesian to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. (Returns undefined if cartesian is undefined) + */ + static clone(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Creates a Cartesian3 instance from an existing Cartesian4. This simply takes the + * x, y, and z properties of the Cartesian4 and drops w. + * @param cartesian - The Cartesian4 instance to create a Cartesian3 instance from. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromCartesian4(cartesian: Cartesian4, result?: Cartesian3): Cartesian3; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Cartesian3, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Cartesian3): Cartesian3; + /** + * Flattens an array of Cartesian3s into an array of components. + * @param array - The array of cartesians to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 3 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 3) elements. + * @returns The packed array. + */ + static packArray(array: Cartesian3[], result?: number[]): number[]; + /** + * Unpacks an array of cartesian components into an array of Cartesian3s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Cartesian3[]): Cartesian3[]; + /** + * Creates a Cartesian3 from three consecutive elements in an array. + * @example + * // Create a Cartesian3 with (1.0, 2.0, 3.0) + * var v = [1.0, 2.0, 3.0]; + * var p = Cesium.Cartesian3.fromArray(v); + * + * // Create a Cartesian3 with (1.0, 2.0, 3.0) using an offset into an array + * var v2 = [0.0, 0.0, 1.0, 2.0, 3.0]; + * var p2 = Cesium.Cartesian3.fromArray(v2, 2); + * @param array - The array whose three consecutive elements correspond to the x, y, and z components, respectively. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to the x component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromArray(array: number[], startingIndex?: number, result?: Cartesian3): Cartesian3; + /** + * Computes the value of the maximum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the maximum component. + */ + static maximumComponent(cartesian: Cartesian3): number; + /** + * Computes the value of the minimum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the minimum component. + */ + static minimumComponent(cartesian: Cartesian3): number; + /** + * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the minimum components. + */ + static minimumByComponent(first: Cartesian3, second: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the maximum components. + */ + static maximumByComponent(first: Cartesian3, second: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the provided Cartesian's squared magnitude. + * @param cartesian - The Cartesian instance whose squared magnitude is to be computed. + * @returns The squared magnitude. + */ + static magnitudeSquared(cartesian: Cartesian3): number; + /** + * Computes the Cartesian's magnitude (length). + * @param cartesian - The Cartesian instance whose magnitude is to be computed. + * @returns The magnitude. + */ + static magnitude(cartesian: Cartesian3): number; + /** + * Computes the distance between two points. + * @example + * // Returns 1.0 + * var d = Cesium.Cartesian3.distance(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(2.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distance(left: Cartesian3, right: Cartesian3): number; + /** + * Computes the squared distance between two points. Comparing squared distances + * using this function is more efficient than comparing distances using {@link Cartesian3#distance}. + * @example + * // Returns 4.0, not 2.0 + * var d = Cesium.Cartesian3.distanceSquared(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(3.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distanceSquared(left: Cartesian3, right: Cartesian3): number; + /** + * Computes the normalized form of the supplied Cartesian. + * @param cartesian - The Cartesian to be normalized. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the dot (scalar) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The dot product. + */ + static dot(left: Cartesian3, right: Cartesian3): number; + /** + * Computes the componentwise product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyComponents(left: Cartesian3, right: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the componentwise quotient of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideComponents(left: Cartesian3, right: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the componentwise sum of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Cartesian3, right: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the componentwise difference of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Cartesian3, right: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Multiplies the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(cartesian: Cartesian3, scalar: number, result: Cartesian3): Cartesian3; + /** + * Divides the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar(cartesian: Cartesian3, scalar: number, result: Cartesian3): Cartesian3; + /** + * Negates the provided Cartesian. + * @param cartesian - The Cartesian to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the absolute value of the provided Cartesian. + * @param cartesian - The Cartesian whose absolute value is to be computed. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the linear interpolation or extrapolation at t using the provided cartesians. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp(start: Cartesian3, end: Cartesian3, t: number, result: Cartesian3): Cartesian3; + /** + * Returns the angle, in radians, between the provided Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The angle between the Cartesians. + */ + static angleBetween(left: Cartesian3, right: Cartesian3): number; + /** + * Returns the axis that is most orthogonal to the provided Cartesian. + * @param cartesian - The Cartesian on which to find the most orthogonal axis. + * @param result - The object onto which to store the result. + * @returns The most orthogonal axis. + */ + static mostOrthogonalAxis(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Projects vector a onto vector b + * @param a - The vector that needs projecting + * @param b - The vector to project onto + * @param result - The result cartesian + * @returns The modified result parameter + */ + static projectVector(a: Cartesian3, b: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Compares the provided Cartesians componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartesian3, right?: Cartesian3): boolean; + /** + * Compares the provided Cartesians componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Cartesian3, right?: Cartesian3, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Computes the cross (outer) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The cross product. + */ + static cross(left: Cartesian3, right: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the midpoint between the right and left Cartesian. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The midpoint. + */ + static midpoint(left: Cartesian3, right: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Returns a Cartesian3 position from longitude and latitude values given in degrees. + * @example + * var position = Cesium.Cartesian3.fromDegrees(-115.0, 37.0); + * @param longitude - The longitude, in degrees + * @param latitude - The latitude, in degrees + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The position + */ + static fromDegrees(longitude: number, latitude: number, height?: number, ellipsoid?: Ellipsoid, result?: Cartesian3): Cartesian3; + /** + * Returns a Cartesian3 position from longitude and latitude values given in radians. + * @example + * var position = Cesium.Cartesian3.fromRadians(-2.007, 0.645); + * @param longitude - The longitude, in radians + * @param latitude - The latitude, in radians + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The position + */ + static fromRadians(longitude: number, latitude: number, height?: number, ellipsoid?: Ellipsoid, result?: Cartesian3): Cartesian3; + /** + * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in degrees. + * @example + * var positions = Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, -107.0, 33.0]); + * @param coordinates - A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...]. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the coordinates lie. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromDegreesArray(coordinates: number[], ellipsoid?: Ellipsoid, result?: Cartesian3[]): Cartesian3[]; + /** + * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in radians. + * @example + * var positions = Cesium.Cartesian3.fromRadiansArray([-2.007, 0.645, -1.867, .575]); + * @param coordinates - A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...]. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the coordinates lie. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromRadiansArray(coordinates: number[], ellipsoid?: Ellipsoid, result?: Cartesian3[]): Cartesian3[]; + /** + * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in degrees. + * @example + * var positions = Cesium.Cartesian3.fromDegreesArrayHeights([-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]); + * @param coordinates - A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...]. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the position lies. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromDegreesArrayHeights(coordinates: number[], ellipsoid?: Ellipsoid, result?: Cartesian3[]): Cartesian3[]; + /** + * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in radians. + * @example + * var positions = Cesium.Cartesian3.fromRadiansArrayHeights([-2.007, 0.645, 100000.0, -1.867, .575, 150000.0]); + * @param coordinates - A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...]. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the position lies. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromRadiansArrayHeights(coordinates: number[], ellipsoid?: Ellipsoid, result?: Cartesian3[]): Cartesian3[]; + /** + * An immutable Cartesian3 instance initialized to (0.0, 0.0, 0.0). + */ + static readonly ZERO: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (1.0, 0.0, 0.0). + */ + static readonly UNIT_X: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (0.0, 1.0, 0.0). + */ + static readonly UNIT_Y: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (0.0, 0.0, 1.0). + */ + static readonly UNIT_Z: Cartesian3; + /** + * Duplicates this Cartesian3 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + clone(result?: Cartesian3): Cartesian3; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side Cartesian. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Cartesian3): boolean; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Cartesian3, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Creates a string representing this Cartesian in the format '(x, y, z)'. + * @returns A string representing this Cartesian in the format '(x, y, z)'. + */ + toString(): string; +} + +/** + * A 4D Cartesian point. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + * @param [z = 0.0] - The Z component. + * @param [w = 0.0] - The W component. + */ +export class Cartesian4 { + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * The Z component. + */ + z: number; + /** + * The W component. + */ + w: number; + /** + * Creates a Cartesian4 instance from x, y, z and w coordinates. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param z - The z coordinate. + * @param w - The w coordinate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static fromElements(x: number, y: number, z: number, w: number, result?: Cartesian4): Cartesian4; + /** + * Creates a Cartesian4 instance from a {@link Color}. red, green, blue, + * and alpha map to x, y, z, and w, respectively. + * @param color - The source color. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static fromColor(color: Color, result?: Cartesian4): Cartesian4; + /** + * Duplicates a Cartesian4 instance. + * @param cartesian - The Cartesian to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. (Returns undefined if cartesian is undefined) + */ + static clone(cartesian: Cartesian4, result?: Cartesian4): Cartesian4; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Cartesian4, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Cartesian4): Cartesian4; + /** + * Flattens an array of Cartesian4s into and array of components. + * @param array - The array of cartesians to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 4 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 4) elements. + * @returns The packed array. + */ + static packArray(array: Cartesian4[], result?: number[]): number[]; + /** + * Unpacks an array of cartesian components into and array of Cartesian4s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Cartesian4[]): Cartesian4[]; + /** + * Creates a Cartesian4 from four consecutive elements in an array. + * @example + * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0) + * var v = [1.0, 2.0, 3.0, 4.0]; + * var p = Cesium.Cartesian4.fromArray(v); + * + * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0) using an offset into an array + * var v2 = [0.0, 0.0, 1.0, 2.0, 3.0, 4.0]; + * var p2 = Cesium.Cartesian4.fromArray(v2, 2); + * @param array - The array whose four consecutive elements correspond to the x, y, z, and w components, respectively. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to the x component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static fromArray(array: number[], startingIndex?: number, result?: Cartesian4): Cartesian4; + /** + * Computes the value of the maximum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the maximum component. + */ + static maximumComponent(cartesian: Cartesian4): number; + /** + * Computes the value of the minimum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the minimum component. + */ + static minimumComponent(cartesian: Cartesian4): number; + /** + * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the minimum components. + */ + static minimumByComponent(first: Cartesian4, second: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the maximum components. + */ + static maximumByComponent(first: Cartesian4, second: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the provided Cartesian's squared magnitude. + * @param cartesian - The Cartesian instance whose squared magnitude is to be computed. + * @returns The squared magnitude. + */ + static magnitudeSquared(cartesian: Cartesian4): number; + /** + * Computes the Cartesian's magnitude (length). + * @param cartesian - The Cartesian instance whose magnitude is to be computed. + * @returns The magnitude. + */ + static magnitude(cartesian: Cartesian4): number; + /** + * Computes the 4-space distance between two points. + * @example + * // Returns 1.0 + * var d = Cesium.Cartesian4.distance( + * new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0), + * new Cesium.Cartesian4(2.0, 0.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distance(left: Cartesian4, right: Cartesian4): number; + /** + * Computes the squared distance between two points. Comparing squared distances + * using this function is more efficient than comparing distances using {@link Cartesian4#distance}. + * @example + * // Returns 4.0, not 2.0 + * var d = Cesium.Cartesian4.distance( + * new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0), + * new Cesium.Cartesian4(3.0, 0.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distanceSquared(left: Cartesian4, right: Cartesian4): number; + /** + * Computes the normalized form of the supplied Cartesian. + * @param cartesian - The Cartesian to be normalized. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the dot (scalar) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The dot product. + */ + static dot(left: Cartesian4, right: Cartesian4): number; + /** + * Computes the componentwise product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyComponents(left: Cartesian4, right: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the componentwise quotient of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideComponents(left: Cartesian4, right: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the componentwise sum of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Cartesian4, right: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the componentwise difference of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Cartesian4, right: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Multiplies the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(cartesian: Cartesian4, scalar: number, result: Cartesian4): Cartesian4; + /** + * Divides the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar(cartesian: Cartesian4, scalar: number, result: Cartesian4): Cartesian4; + /** + * Negates the provided Cartesian. + * @param cartesian - The Cartesian to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the absolute value of the provided Cartesian. + * @param cartesian - The Cartesian whose absolute value is to be computed. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the linear interpolation or extrapolation at t using the provided cartesians. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp(start: Cartesian4, end: Cartesian4, t: number, result: Cartesian4): Cartesian4; + /** + * Returns the axis that is most orthogonal to the provided Cartesian. + * @param cartesian - The Cartesian on which to find the most orthogonal axis. + * @param result - The object onto which to store the result. + * @returns The most orthogonal axis. + */ + static mostOrthogonalAxis(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Compares the provided Cartesians componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartesian4, right?: Cartesian4): boolean; + /** + * Compares the provided Cartesians componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Cartesian4, right?: Cartesian4, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 0.0). + */ + static readonly ZERO: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (1.0, 0.0, 0.0, 0.0). + */ + static readonly UNIT_X: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (0.0, 1.0, 0.0, 0.0). + */ + static readonly UNIT_Y: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (0.0, 0.0, 1.0, 0.0). + */ + static readonly UNIT_Z: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 1.0). + */ + static readonly UNIT_W: Cartesian4; + /** + * Duplicates this Cartesian4 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + clone(result?: Cartesian4): Cartesian4; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side Cartesian. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Cartesian4): boolean; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Cartesian4, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Creates a string representing this Cartesian in the format '(x, y, z, w)'. + * @returns A string representing the provided Cartesian in the format '(x, y, z, w)'. + */ + toString(): string; + /** + * Packs an arbitrary floating point value to 4 values representable using uint8. + * @param value - A floating point number + * @param [result] - The Cartesian4 that will contain the packed float. + * @returns A Cartesian4 representing the float packed to values in x, y, z, and w. + */ + static packFloat(value: number, result?: Cartesian4): Cartesian4; +} + +/** + * A position defined by longitude, latitude, and height. + * @param [longitude = 0.0] - The longitude, in radians. + * @param [latitude = 0.0] - The latitude, in radians. + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + */ +export class Cartographic { + constructor(longitude?: number, latitude?: number, height?: number); + /** + * The longitude, in radians. + */ + longitude: number; + /** + * The latitude, in radians. + */ + latitude: number; + /** + * The height, in meters, above the ellipsoid. + */ + height: number; + /** + * Creates a new Cartographic instance from longitude and latitude + * specified in radians. + * @param longitude - The longitude, in radians. + * @param latitude - The latitude, in radians. + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. + */ + static fromRadians(longitude: number, latitude: number, height?: number, result?: Cartographic): Cartographic; + /** + * Creates a new Cartographic instance from longitude and latitude + * specified in degrees. The values in the resulting object will + * be in radians. + * @param longitude - The longitude, in degrees. + * @param latitude - The latitude, in degrees. + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. + */ + static fromDegrees(longitude: number, latitude: number, height?: number, result?: Cartographic): Cartographic; + /** + * Creates a new Cartographic instance from a Cartesian position. The values in the + * resulting object will be in radians. + * @param cartesian - The Cartesian position to convert to cartographic representation. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid. + */ + static fromCartesian(cartesian: Cartesian3, ellipsoid?: Ellipsoid, result?: Cartographic): Cartographic; + /** + * Creates a new Cartesian3 instance from a Cartographic input. The values in the inputted + * object should be in radians. + * @param cartographic - Input to be converted into a Cartesian3 output. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The position + */ + static toCartesian(cartographic: Cartographic, ellipsoid?: Ellipsoid, result?: Cartesian3): Cartesian3; + /** + * Duplicates a Cartographic instance. + * @param cartographic - The cartographic to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. (Returns undefined if cartographic is undefined) + */ + static clone(cartographic: Cartographic, result?: Cartographic): Cartographic; + /** + * Compares the provided cartographics componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first cartographic. + * @param [right] - The second cartographic. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartographic, right?: Cartographic): boolean; + /** + * Compares the provided cartographics componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first cartographic. + * @param [right] - The second cartographic. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Cartographic, right?: Cartographic, epsilon?: number): boolean; + /** + * An immutable Cartographic instance initialized to (0.0, 0.0, 0.0). + */ + static readonly ZERO: Cartographic; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. + */ + clone(result?: Cartographic): Cartographic; + /** + * Compares the provided against this cartographic componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The second cartographic. + * @returns true if left and right are equal, false otherwise. + */ + equals(right?: Cartographic): boolean; + /** + * Compares the provided against this cartographic componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The second cartographic. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Cartographic, epsilon?: number): boolean; + /** + * Creates a string representing this cartographic in the format '(longitude, latitude, height)'. + * @returns A string representing the provided cartographic in the format '(longitude, latitude, height)'. + */ + toString(): string; +} + +/** + * Geocodes queries containing longitude and latitude coordinates and an optional height. + * Query format: `longitude latitude (height)` with longitude/latitude in degrees and height in meters. + */ +export class CartographicGeocoderService { + constructor(); + /** + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; +} + +/** + * A Catmull-Rom spline is a cubic spline where the tangent at control points, + * except the first and last, are computed using the previous and next control points. + * Catmull-Rom splines are in the class C1. + * @example + * // spline above the earth from Philadelphia to Los Angeles + * var spline = new Cesium.CatmullRomSpline({ + * times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ], + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * + * var p0 = spline.evaluate(times[i]); // equal to positions[i] + * var p1 = spline.evaluate(times[i] + delta); // interpolated value when delta < times[i + 1] - times[i] + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of {@link Cartesian3} control points. + * @param [options.firstTangent] - The tangent of the curve at the first control point. + * If the tangent is not given, it will be estimated. + * @param [options.lastTangent] - The tangent of the curve at the last control point. + * If the tangent is not given, it will be estimated. + */ +export class CatmullRomSpline { + constructor(options: { + times: number[]; + points: Cartesian3[]; + firstTangent?: Cartesian3; + lastTangent?: Cartesian3; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Cartesian3} control points. + */ + readonly points: Cartesian3[]; + /** + * The tangent at the first control point. + */ + readonly firstTangent: Cartesian3; + /** + * The tangent at the last control point. + */ + readonly lastTangent: Cartesian3; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3): Cartesian3; +} + +/** + * A {@link TerrainProvider} that accesses terrain data in a Cesium terrain format. + * @example + * // Create Arctic DEM terrain with normals. + * var viewer = new Cesium.Viewer('cesiumContainer', { + * terrainProvider : new Cesium.CesiumTerrainProvider({ + * url : Cesium.IonResource.fromAssetId(3956), + * requestVertexNormals : true + * }) + * }); + * @param options - Object with the following properties: + * @param options.url - The URL of the Cesium terrain server. + * @param [options.requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server, in the form of per vertex normals if available. + * @param [options.requestWaterMask = false] - Flag that indicates if the client should request per tile water masks from the server, if available. + * @param [options.requestMetadata = true] - Flag that indicates if the client should request per tile metadata from the server, if available. + * @param [options.ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + */ +export class CesiumTerrainProvider { + constructor(options: { + url: Resource | string | Promise | Promise; + requestVertexNormals?: boolean; + requestWaterMask?: boolean; + requestMetadata?: boolean; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }); + /** + * Requests the geometry for a given tile. This function should not be called before + * {@link CesiumTerrainProvider#ready} returns true. The result must include terrain data and + * may optionally include a water mask and an indication of which child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. This function should not be called before {@link CesiumTerrainProvider#ready} returns true. + */ + credit: Credit; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link CesiumTerrainProvider#ready} returns true. + */ + tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. This function should not be + * called before {@link CesiumTerrainProvider#ready} returns true. + */ + hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * This function should not be called before {@link CesiumTerrainProvider#ready} returns true. + */ + hasVertexNormals: boolean; + /** + * Gets a value indicating whether or not the requested tiles include metadata. + * This function should not be called before {@link CesiumTerrainProvider#ready} returns true. + */ + hasMetadata: boolean; + /** + * Boolean flag that indicates if the client should request vertex normals from the server. + * Vertex normals data is appended to the standard tile mesh data only if the client requests the vertex normals and + * if the server provides vertex normals. + */ + requestVertexNormals: boolean; + /** + * Boolean flag that indicates if the client should request a watermask from the server. + * Watermask data is appended to the standard tile mesh data only if the client requests the watermask and + * if the server provides a watermask. + */ + requestWaterMask: boolean; + /** + * Boolean flag that indicates if the client should request metadata from the server. + * Metadata is appended to the standard tile mesh data only if the client requests the metadata and + * if the server provides a metadata. + */ + requestMetadata: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This function should not be called before + * {@link CesiumTerrainProvider#ready} returns true. This property may be undefined if availability + * information is not available. Note that this reflects tiles that are known to be available currently. + * Additional tiles may be discovered to be available in the future, e.g. if availability information + * exists deeper in the tree rather than it all being discoverable at the root. However, a tile that + * is available now will not become unavailable in the future. + */ + availability: TileAvailability; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported or availability is unknown, otherwise true or false. + */ + getTileDataAvailable(x: number, y: number, level: number): boolean; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined | Promise; +} + +/** + * A description of a circle on the ellipsoid. Circle geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // Create a circle. + * var circle = new Cesium.CircleGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * radius : 100000.0 + * }); + * var geometry = Cesium.CircleGeometry.createGeometry(circle); + * @param options - Object with the following properties: + * @param options.center - The circle's center point in the fixed frame. + * @param options.radius - The radius in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid the circle will be on. + * @param [options.height = 0.0] - The distance in meters between the circle and the ellipsoid surface. + * @param [options.granularity = 0.02] - The angular distance between points on the circle in radians. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.extrudedHeight = 0.0] - The distance in meters between the circle's extruded face and the ellipsoid surface. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + */ +export class CircleGeometry { + constructor(options: { + center: Cartesian3; + radius: number; + ellipsoid?: Ellipsoid; + height?: number; + granularity?: number; + vertexFormat?: VertexFormat; + extrudedHeight?: number; + stRotation?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CircleGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CircleGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CircleGeometry): CircleGeometry; + /** + * Computes the geometric representation of a circle on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param circleGeometry - A description of the circle. + * @returns The computed vertices and indices. + */ + static createGeometry(circleGeometry: CircleGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a circle on the ellipsoid. + * @example + * // Create a circle. + * var circle = new Cesium.CircleOutlineGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * radius : 100000.0 + * }); + * var geometry = Cesium.CircleOutlineGeometry.createGeometry(circle); + * @param options - Object with the following properties: + * @param options.center - The circle's center point in the fixed frame. + * @param options.radius - The radius in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid the circle will be on. + * @param [options.height = 0.0] - The distance in meters between the circle and the ellipsoid surface. + * @param [options.granularity = 0.02] - The angular distance between points on the circle in radians. + * @param [options.extrudedHeight = 0.0] - The distance in meters between the circle's extruded face and the ellipsoid surface. + * @param [options.numberOfVerticalLines = 16] - Number of lines to draw between the top and bottom of an extruded circle. + */ +export class CircleOutlineGeometry { + constructor(options: { + center: Cartesian3; + radius: number; + ellipsoid?: Ellipsoid; + height?: number; + granularity?: number; + extrudedHeight?: number; + numberOfVerticalLines?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CircleOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CircleOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CircleOutlineGeometry): CircleOutlineGeometry; + /** + * Computes the geometric representation of an outline of a circle on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param circleGeometry - A description of the circle. + * @returns The computed vertices and indices. + */ + static createGeometry(circleGeometry: CircleOutlineGeometry): Geometry | undefined; +} + +/** + * A simple clock for keeping track of simulated time. + * @example + * // Create a clock that loops on Christmas day 2013 and runs in real-time. + * var clock = new Cesium.Clock({ + * startTime : Cesium.JulianDate.fromIso8601("2013-12-25"), + * currentTime : Cesium.JulianDate.fromIso8601("2013-12-25"), + * stopTime : Cesium.JulianDate.fromIso8601("2013-12-26"), + * clockRange : Cesium.ClockRange.LOOP_STOP, + * clockStep : Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER + * }); + * @param [options] - Object with the following properties: + * @param [options.startTime] - The start time of the clock. + * @param [options.stopTime] - The stop time of the clock. + * @param [options.currentTime] - The current time. + * @param [options.multiplier = 1.0] - Determines how much time advances when {@link Clock#tick} is called, negative values allow for advancing backwards. + * @param [options.clockStep = ClockStep.SYSTEM_CLOCK_MULTIPLIER] - Determines if calls to {@link Clock#tick} are frame dependent or system clock dependent. + * @param [options.clockRange = ClockRange.UNBOUNDED] - Determines how the clock should behave when {@link Clock#startTime} or {@link Clock#stopTime} is reached. + * @param [options.canAnimate = true] - Indicates whether {@link Clock#tick} can advance time. This could be false if data is being buffered, for example. The clock will only tick when both {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + * @param [options.shouldAnimate = false] - Indicates whether {@link Clock#tick} should attempt to advance time. The clock will only tick when both {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + */ +export class Clock { + constructor(options?: { + startTime?: JulianDate; + stopTime?: JulianDate; + currentTime?: JulianDate; + multiplier?: number; + clockStep?: ClockStep; + clockRange?: ClockRange; + canAnimate?: boolean; + shouldAnimate?: boolean; + }); + /** + * The start time of the clock. + */ + startTime: JulianDate; + /** + * The stop time of the clock. + */ + stopTime: JulianDate; + /** + * Determines how the clock should behave when + * {@link Clock#startTime} or {@link Clock#stopTime} + * is reached. + */ + clockRange: ClockRange; + /** + * Indicates whether {@link Clock#tick} can advance time. This could be false if data is being buffered, + * for example. The clock will only advance time when both + * {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + */ + canAnimate: boolean; + /** + * An {@link Event} that is fired whenever {@link Clock#tick} is called. + */ + onTick: Event; + /** + * An {@link Event} that is fired whenever {@link Clock#stopTime} is reached. + */ + onStop: Event; + /** + * The current time. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + */ + currentTime: JulianDate; + /** + * Gets or sets how much time advances when {@link Clock#tick} is called. Negative values allow for advancing backwards. + * If {@link Clock#clockStep} is set to {@link ClockStep.TICK_DEPENDENT}, this is the number of seconds to advance. + * If {@link Clock#clockStep} is set to {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}, this value is multiplied by the + * elapsed system time since the last call to {@link Clock#tick}. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + */ + multiplier: number; + /** + * Determines if calls to {@link Clock#tick} are frame dependent or system clock dependent. + * Changing this property to {@link ClockStep.SYSTEM_CLOCK} will set + * {@link Clock#multiplier} to 1.0, {@link Clock#shouldAnimate} to true, and + * {@link Clock#currentTime} to the current system clock time. + */ + clockStep: ClockStep; + /** + * Indicates whether {@link Clock#tick} should attempt to advance time. + * The clock will only advance time when both + * {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + */ + shouldAnimate: boolean; + /** + * Advances the clock from the current time based on the current configuration options. + * tick should be called every frame, regardless of whether animation is taking place + * or not. To control animation, use the {@link Clock#shouldAnimate} property. + * @returns The new value of the {@link Clock#currentTime} property. + */ + tick(): JulianDate; +} + +/** + * Constants used by {@link Clock#tick} to determine behavior + * when {@link Clock#startTime} or {@link Clock#stopTime} is reached. + */ +export enum ClockRange { + /** + * {@link Clock#tick} will always advances the clock in its current direction. + */ + UNBOUNDED = 0, + /** + * When {@link Clock#startTime} or {@link Clock#stopTime} is reached, + * {@link Clock#tick} will not advance {@link Clock#currentTime} any further. + */ + CLAMPED = 1, + /** + * When {@link Clock#stopTime} is reached, {@link Clock#tick} will advance + * {@link Clock#currentTime} to the opposite end of the interval. When + * time is moving backwards, {@link Clock#tick} will not advance past + * {@link Clock#startTime} + */ + LOOP_STOP = 2 +} + +/** + * Constants to determine how much time advances with each call + * to {@link Clock#tick}. + */ +export enum ClockStep { + /** + * {@link Clock#tick} advances the current time by a fixed step, + * which is the number of seconds specified by {@link Clock#multiplier}. + */ + TICK_DEPENDENT = 0, + /** + * {@link Clock#tick} advances the current time by the amount of system + * time elapsed since the previous call multiplied by {@link Clock#multiplier}. + */ + SYSTEM_CLOCK_MULTIPLIER = 1, + /** + * {@link Clock#tick} sets the clock to the current system time; + * ignoring all other settings. + */ + SYSTEM_CLOCK = 2 +} + +/** + * A color, specified using red, green, blue, and alpha values, + * which range from 0 (no intensity) to 1.0 (full intensity). + * @param [red = 1.0] - The red component. + * @param [green = 1.0] - The green component. + * @param [blue = 1.0] - The blue component. + * @param [alpha = 1.0] - The alpha component. + */ +export class Color { + constructor(red?: number, green?: number, blue?: number, alpha?: number); + /** + * The red component. + */ + red: number; + /** + * The green component. + */ + green: number; + /** + * The blue component. + */ + blue: number; + /** + * The alpha component. + */ + alpha: number; + /** + * Creates a Color instance from a {@link Cartesian4}. x, y, z, + * and w map to red, green, blue, and alpha, respectively. + * @param cartesian - The source cartesian. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static fromCartesian4(cartesian: Cartesian4, result?: Color): Color; + /** + * Creates a new Color specified using red, green, blue, and alpha values + * that are in the range of 0 to 255, converting them internally to a range of 0.0 to 1.0. + * @param [red = 255] - The red component. + * @param [green = 255] - The green component. + * @param [blue = 255] - The blue component. + * @param [alpha = 255] - The alpha component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static fromBytes(red?: number, green?: number, blue?: number, alpha?: number, result?: Color): Color; + /** + * Creates a new Color that has the same red, green, and blue components + * of the specified color, but with the specified alpha value. + * @example + * var translucentRed = Cesium.Color.fromAlpha(Cesium.Color.RED, 0.9); + * @param color - The base color + * @param alpha - The new alpha component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static fromAlpha(color: Color, alpha: number, result?: Color): Color; + /** + * Creates a new Color from a single numeric unsigned 32-bit RGBA value, using the endianness + * of the system. + * @example + * var color = Cesium.Color.fromRgba(0x67ADDFFF); + * @param rgba - A single numeric unsigned 32-bit RGBA value. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The color object. + */ + static fromRgba(rgba: number, result?: Color): Color; + /** + * Creates a Color instance from hue, saturation, and lightness. + * @param [hue = 0] - The hue angle 0...1 + * @param [saturation = 0] - The saturation value 0...1 + * @param [lightness = 0] - The lightness value 0...1 + * @param [alpha = 1.0] - The alpha component 0...1 + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The color object. + */ + static fromHsl(hue?: number, saturation?: number, lightness?: number, alpha?: number, result?: Color): Color; + /** + * Creates a random color using the provided options. For reproducible random colors, you should + * call {@link Math#setRandomNumberSeed} once at the beginning of your application. + * @example + * //Create a completely random color + * var color = Cesium.Color.fromRandom(); + * + * //Create a random shade of yellow. + * var color = Cesium.Color.fromRandom({ + * red : 1.0, + * green : 1.0, + * alpha : 1.0 + * }); + * + * //Create a random bright color. + * var color = Cesium.Color.fromRandom({ + * minimumRed : 0.75, + * minimumGreen : 0.75, + * minimumBlue : 0.75, + * alpha : 1.0 + * }); + * @param [options] - Object with the following properties: + * @param [options.red] - If specified, the red component to use instead of a randomized value. + * @param [options.minimumRed = 0.0] - The maximum red value to generate if none was specified. + * @param [options.maximumRed = 1.0] - The minimum red value to generate if none was specified. + * @param [options.green] - If specified, the green component to use instead of a randomized value. + * @param [options.minimumGreen = 0.0] - The maximum green value to generate if none was specified. + * @param [options.maximumGreen = 1.0] - The minimum green value to generate if none was specified. + * @param [options.blue] - If specified, the blue component to use instead of a randomized value. + * @param [options.minimumBlue = 0.0] - The maximum blue value to generate if none was specified. + * @param [options.maximumBlue = 1.0] - The minimum blue value to generate if none was specified. + * @param [options.alpha] - If specified, the alpha component to use instead of a randomized value. + * @param [options.minimumAlpha = 0.0] - The maximum alpha value to generate if none was specified. + * @param [options.maximumAlpha = 1.0] - The minimum alpha value to generate if none was specified. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static fromRandom(options?: { + red?: number; + minimumRed?: number; + maximumRed?: number; + green?: number; + minimumGreen?: number; + maximumGreen?: number; + blue?: number; + minimumBlue?: number; + maximumBlue?: number; + alpha?: number; + minimumAlpha?: number; + maximumAlpha?: number; + }, result?: Color): Color; + /** + * Creates a Color instance from a CSS color value. + * @example + * var cesiumBlue = Cesium.Color.fromCssColorString('#67ADDF'); + * var green = Cesium.Color.fromCssColorString('green'); + * @param color - The CSS color value in #rgb, #rgba, #rrggbb, #rrggbbaa, rgb(), rgba(), hsl(), or hsla() format. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The color object, or undefined if the string was not a valid CSS color. + */ + static fromCssColorString(color: string, result?: Color): Color; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Color, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Color): Color; + /** + * Converts a 'byte' color component in the range of 0 to 255 into + * a 'float' color component in the range of 0 to 1.0. + * @param number - The number to be converted. + * @returns The converted number. + */ + static byteToFloat(number: number): number; + /** + * Converts a 'float' color component in the range of 0 to 1.0 into + * a 'byte' color component in the range of 0 to 255. + * @param number - The number to be converted. + * @returns The converted number. + */ + static floatToByte(number: number): number; + /** + * Duplicates a Color. + * @param color - The Color to duplicate. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. (Returns undefined if color is undefined) + */ + static clone(color: Color, result?: Color): Color; + /** + * Returns true if the first Color equals the second color. + * @param left - The first Color to compare for equality. + * @param right - The second Color to compare for equality. + * @returns true if the Colors are equal; otherwise, false. + */ + static equals(left: Color, right: Color): boolean; + /** + * Returns a duplicate of a Color instance. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + clone(result?: Color): Color; + /** + * Returns true if this Color equals other. + * @param other - The Color to compare for equality. + * @returns true if the Colors are equal; otherwise, false. + */ + equals(other: Color): boolean; + /** + * Returns true if this Color equals other componentwise within the specified epsilon. + * @param other - The Color to compare for equality. + * @param [epsilon = 0.0] - The epsilon to use for equality testing. + * @returns true if the Colors are equal within the specified epsilon; otherwise, false. + */ + equalsEpsilon(other: Color, epsilon?: number): boolean; + /** + * Creates a string representing this Color in the format '(red, green, blue, alpha)'. + * @returns A string representing this Color in the format '(red, green, blue, alpha)'. + */ + toString(): string; + /** + * Creates a string containing the CSS color value for this color. + * @returns The CSS equivalent of this color. + */ + toCssColorString(): string; + /** + * Creates a string containing CSS hex string color value for this color. + * @returns The CSS hex string equivalent of this color. + */ + toCssHexString(): string; + /** + * Converts this color to an array of red, green, blue, and alpha values + * that are in the range of 0 to 255. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + toBytes(result?: number[]): number[]; + /** + * Converts this color to a single numeric unsigned 32-bit RGBA value, using the endianness + * of the system. + * @example + * var rgba = Cesium.Color.BLUE.toRgba(); + * @returns A single numeric unsigned 32-bit RGBA value. + */ + toRgba(): number; + /** + * Brightens this color by the provided magnitude. + * @example + * var brightBlue = Cesium.Color.BLUE.brighten(0.5, new Cesium.Color()); + * @param magnitude - A positive number indicating the amount to brighten. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + brighten(magnitude: number, result: Color): Color; + /** + * Darkens this color by the provided magnitude. + * @example + * var darkBlue = Cesium.Color.BLUE.darken(0.5, new Cesium.Color()); + * @param magnitude - A positive number indicating the amount to darken. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + darken(magnitude: number, result: Color): Color; + /** + * Creates a new Color that has the same red, green, and blue components + * as this Color, but with the specified alpha value. + * @example + * var translucentRed = Cesium.Color.RED.withAlpha(0.9); + * @param alpha - The new alpha component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + withAlpha(alpha: number, result?: Color): Color; + /** + * Computes the componentwise sum of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise difference of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise product of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise quotient of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divide(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise modulus of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static mod(left: Color, right: Color, result: Color): Color; + /** + * Computes the linear interpolation or extrapolation at t between the provided colors. + * @param start - The color corresponding to t at 0.0. + * @param end - The color corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp(start: Color, end: Color, t: number, result: Color): Color; + /** + * Multiplies the provided Color componentwise by the provided scalar. + * @param color - The Color to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(color: Color, scalar: number, result: Color): Color; + /** + * Divides the provided Color componentwise by the provided scalar. + * @param color - The Color to be divided. + * @param scalar - The scalar to divide with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar(color: Color, scalar: number, result: Color): Color; + /** + * An immutable Color instance initialized to CSS color #F0F8FF + * + */ + static readonly ALICEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #FAEBD7 + * + */ + static readonly ANTIQUEWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #00FFFF + * + */ + static readonly AQUA: Color; + /** + * An immutable Color instance initialized to CSS color #7FFFD4 + * + */ + static readonly AQUAMARINE: Color; + /** + * An immutable Color instance initialized to CSS color #F0FFFF + * + */ + static readonly AZURE: Color; + /** + * An immutable Color instance initialized to CSS color #F5F5DC + * + */ + static readonly BEIGE: Color; + /** + * An immutable Color instance initialized to CSS color #FFE4C4 + * + */ + static readonly BISQUE: Color; + /** + * An immutable Color instance initialized to CSS color #000000 + * + */ + static readonly BLACK: Color; + /** + * An immutable Color instance initialized to CSS color #FFEBCD + * + */ + static readonly BLANCHEDALMOND: Color; + /** + * An immutable Color instance initialized to CSS color #0000FF + * + */ + static readonly BLUE: Color; + /** + * An immutable Color instance initialized to CSS color #8A2BE2 + * + */ + static readonly BLUEVIOLET: Color; + /** + * An immutable Color instance initialized to CSS color #A52A2A + * + */ + static readonly BROWN: Color; + /** + * An immutable Color instance initialized to CSS color #DEB887 + * + */ + static readonly BURLYWOOD: Color; + /** + * An immutable Color instance initialized to CSS color #5F9EA0 + * + */ + static readonly CADETBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #7FFF00 + * + */ + static readonly CHARTREUSE: Color; + /** + * An immutable Color instance initialized to CSS color #D2691E + * + */ + static readonly CHOCOLATE: Color; + /** + * An immutable Color instance initialized to CSS color #FF7F50 + * + */ + static readonly CORAL: Color; + /** + * An immutable Color instance initialized to CSS color #6495ED + * + */ + static readonly CORNFLOWERBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #FFF8DC + * + */ + static readonly CORNSILK: Color; + /** + * An immutable Color instance initialized to CSS color #DC143C + * + */ + static readonly CRIMSON: Color; + /** + * An immutable Color instance initialized to CSS color #00FFFF + * + */ + static readonly CYAN: Color; + /** + * An immutable Color instance initialized to CSS color #00008B + * + */ + static readonly DARKBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #008B8B + * + */ + static readonly DARKCYAN: Color; + /** + * An immutable Color instance initialized to CSS color #B8860B + * + */ + static readonly DARKGOLDENROD: Color; + /** + * An immutable Color instance initialized to CSS color #A9A9A9 + * + */ + static readonly DARKGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #006400 + * + */ + static readonly DARKGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #A9A9A9 + * + */ + static readonly DARKGREY: Color; + /** + * An immutable Color instance initialized to CSS color #BDB76B + * + */ + static readonly DARKKHAKI: Color; + /** + * An immutable Color instance initialized to CSS color #8B008B + * + */ + static readonly DARKMAGENTA: Color; + /** + * An immutable Color instance initialized to CSS color #556B2F + * + */ + static readonly DARKOLIVEGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FF8C00 + * + */ + static readonly DARKORANGE: Color; + /** + * An immutable Color instance initialized to CSS color #9932CC + * + */ + static readonly DARKORCHID: Color; + /** + * An immutable Color instance initialized to CSS color #8B0000 + * + */ + static readonly DARKRED: Color; + /** + * An immutable Color instance initialized to CSS color #E9967A + * + */ + static readonly DARKSALMON: Color; + /** + * An immutable Color instance initialized to CSS color #8FBC8F + * + */ + static readonly DARKSEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #483D8B + * + */ + static readonly DARKSLATEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #2F4F4F + * + */ + static readonly DARKSLATEGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #2F4F4F + * + */ + static readonly DARKSLATEGREY: Color; + /** + * An immutable Color instance initialized to CSS color #00CED1 + * + */ + static readonly DARKTURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #9400D3 + * + */ + static readonly DARKVIOLET: Color; + /** + * An immutable Color instance initialized to CSS color #FF1493 + * + */ + static readonly DEEPPINK: Color; + /** + * An immutable Color instance initialized to CSS color #00BFFF + * + */ + static readonly DEEPSKYBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #696969 + * + */ + static readonly DIMGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #696969 + * + */ + static readonly DIMGREY: Color; + /** + * An immutable Color instance initialized to CSS color #1E90FF + * + */ + static readonly DODGERBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #B22222 + * + */ + static readonly FIREBRICK: Color; + /** + * An immutable Color instance initialized to CSS color #FFFAF0 + * + */ + static readonly FLORALWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #228B22 + * + */ + static readonly FORESTGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FF00FF + * + */ + static readonly FUCHSIA: Color; + /** + * An immutable Color instance initialized to CSS color #DCDCDC + * + */ + static readonly GAINSBORO: Color; + /** + * An immutable Color instance initialized to CSS color #F8F8FF + * + */ + static readonly GHOSTWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #FFD700 + * + */ + static readonly GOLD: Color; + /** + * An immutable Color instance initialized to CSS color #DAA520 + * + */ + static readonly GOLDENROD: Color; + /** + * An immutable Color instance initialized to CSS color #808080 + * + */ + static readonly GRAY: Color; + /** + * An immutable Color instance initialized to CSS color #008000 + * + */ + static readonly GREEN: Color; + /** + * An immutable Color instance initialized to CSS color #ADFF2F + * + */ + static readonly GREENYELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #808080 + * + */ + static readonly GREY: Color; + /** + * An immutable Color instance initialized to CSS color #F0FFF0 + * + */ + static readonly HONEYDEW: Color; + /** + * An immutable Color instance initialized to CSS color #FF69B4 + * + */ + static readonly HOTPINK: Color; + /** + * An immutable Color instance initialized to CSS color #CD5C5C + * + */ + static readonly INDIANRED: Color; + /** + * An immutable Color instance initialized to CSS color #4B0082 + * + */ + static readonly INDIGO: Color; + /** + * An immutable Color instance initialized to CSS color #FFFFF0 + * + */ + static readonly IVORY: Color; + /** + * An immutable Color instance initialized to CSS color #F0E68C + * + */ + static readonly KHAKI: Color; + /** + * An immutable Color instance initialized to CSS color #E6E6FA + * + */ + static readonly LAVENDER: Color; + /** + * An immutable Color instance initialized to CSS color #FFF0F5 + * + */ + static readonly LAVENDAR_BLUSH: Color; + /** + * An immutable Color instance initialized to CSS color #7CFC00 + * + */ + static readonly LAWNGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FFFACD + * + */ + static readonly LEMONCHIFFON: Color; + /** + * An immutable Color instance initialized to CSS color #ADD8E6 + * + */ + static readonly LIGHTBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #F08080 + * + */ + static readonly LIGHTCORAL: Color; + /** + * An immutable Color instance initialized to CSS color #E0FFFF + * + */ + static readonly LIGHTCYAN: Color; + /** + * An immutable Color instance initialized to CSS color #FAFAD2 + * + */ + static readonly LIGHTGOLDENRODYELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #D3D3D3 + * + */ + static readonly LIGHTGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #90EE90 + * + */ + static readonly LIGHTGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #D3D3D3 + * + */ + static readonly LIGHTGREY: Color; + /** + * An immutable Color instance initialized to CSS color #FFB6C1 + * + */ + static readonly LIGHTPINK: Color; + /** + * An immutable Color instance initialized to CSS color #20B2AA + * + */ + static readonly LIGHTSEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #87CEFA + * + */ + static readonly LIGHTSKYBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #778899 + * + */ + static readonly LIGHTSLATEGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #778899 + * + */ + static readonly LIGHTSLATEGREY: Color; + /** + * An immutable Color instance initialized to CSS color #B0C4DE + * + */ + static readonly LIGHTSTEELBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #FFFFE0 + * + */ + static readonly LIGHTYELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #00FF00 + * + */ + static readonly LIME: Color; + /** + * An immutable Color instance initialized to CSS color #32CD32 + * + */ + static readonly LIMEGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FAF0E6 + * + */ + static readonly LINEN: Color; + /** + * An immutable Color instance initialized to CSS color #FF00FF + * + */ + static readonly MAGENTA: Color; + /** + * An immutable Color instance initialized to CSS color #800000 + * + */ + static readonly MAROON: Color; + /** + * An immutable Color instance initialized to CSS color #66CDAA + * + */ + static readonly MEDIUMAQUAMARINE: Color; + /** + * An immutable Color instance initialized to CSS color #0000CD + * + */ + static readonly MEDIUMBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #BA55D3 + * + */ + static readonly MEDIUMORCHID: Color; + /** + * An immutable Color instance initialized to CSS color #9370DB + * + */ + static readonly MEDIUMPURPLE: Color; + /** + * An immutable Color instance initialized to CSS color #3CB371 + * + */ + static readonly MEDIUMSEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #7B68EE + * + */ + static readonly MEDIUMSLATEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #00FA9A + * + */ + static readonly MEDIUMSPRINGGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #48D1CC + * + */ + static readonly MEDIUMTURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #C71585 + * + */ + static readonly MEDIUMVIOLETRED: Color; + /** + * An immutable Color instance initialized to CSS color #191970 + * + */ + static readonly MIDNIGHTBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #F5FFFA + * + */ + static readonly MINTCREAM: Color; + /** + * An immutable Color instance initialized to CSS color #FFE4E1 + * + */ + static readonly MISTYROSE: Color; + /** + * An immutable Color instance initialized to CSS color #FFE4B5 + * + */ + static readonly MOCCASIN: Color; + /** + * An immutable Color instance initialized to CSS color #FFDEAD + * + */ + static readonly NAVAJOWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #000080 + * + */ + static readonly NAVY: Color; + /** + * An immutable Color instance initialized to CSS color #FDF5E6 + * + */ + static readonly OLDLACE: Color; + /** + * An immutable Color instance initialized to CSS color #808000 + * + */ + static readonly OLIVE: Color; + /** + * An immutable Color instance initialized to CSS color #6B8E23 + * + */ + static readonly OLIVEDRAB: Color; + /** + * An immutable Color instance initialized to CSS color #FFA500 + * + */ + static readonly ORANGE: Color; + /** + * An immutable Color instance initialized to CSS color #FF4500 + * + */ + static readonly ORANGERED: Color; + /** + * An immutable Color instance initialized to CSS color #DA70D6 + * + */ + static readonly ORCHID: Color; + /** + * An immutable Color instance initialized to CSS color #EEE8AA + * + */ + static readonly PALEGOLDENROD: Color; + /** + * An immutable Color instance initialized to CSS color #98FB98 + * + */ + static readonly PALEGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #AFEEEE + * + */ + static readonly PALETURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #DB7093 + * + */ + static readonly PALEVIOLETRED: Color; + /** + * An immutable Color instance initialized to CSS color #FFEFD5 + * + */ + static readonly PAPAYAWHIP: Color; + /** + * An immutable Color instance initialized to CSS color #FFDAB9 + * + */ + static readonly PEACHPUFF: Color; + /** + * An immutable Color instance initialized to CSS color #CD853F + * + */ + static readonly PERU: Color; + /** + * An immutable Color instance initialized to CSS color #FFC0CB + * + */ + static readonly PINK: Color; + /** + * An immutable Color instance initialized to CSS color #DDA0DD + * + */ + static readonly PLUM: Color; + /** + * An immutable Color instance initialized to CSS color #B0E0E6 + * + */ + static readonly POWDERBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #800080 + * + */ + static readonly PURPLE: Color; + /** + * An immutable Color instance initialized to CSS color #FF0000 + * + */ + static readonly RED: Color; + /** + * An immutable Color instance initialized to CSS color #BC8F8F + * + */ + static readonly ROSYBROWN: Color; + /** + * An immutable Color instance initialized to CSS color #4169E1 + * + */ + static readonly ROYALBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #8B4513 + * + */ + static readonly SADDLEBROWN: Color; + /** + * An immutable Color instance initialized to CSS color #FA8072 + * + */ + static readonly SALMON: Color; + /** + * An immutable Color instance initialized to CSS color #F4A460 + * + */ + static readonly SANDYBROWN: Color; + /** + * An immutable Color instance initialized to CSS color #2E8B57 + * + */ + static readonly SEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FFF5EE + * + */ + static readonly SEASHELL: Color; + /** + * An immutable Color instance initialized to CSS color #A0522D + * + */ + static readonly SIENNA: Color; + /** + * An immutable Color instance initialized to CSS color #C0C0C0 + * + */ + static readonly SILVER: Color; + /** + * An immutable Color instance initialized to CSS color #87CEEB + * + */ + static readonly SKYBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #6A5ACD + * + */ + static readonly SLATEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #708090 + * + */ + static readonly SLATEGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #708090 + * + */ + static readonly SLATEGREY: Color; + /** + * An immutable Color instance initialized to CSS color #FFFAFA + * + */ + static readonly SNOW: Color; + /** + * An immutable Color instance initialized to CSS color #00FF7F + * + */ + static readonly SPRINGGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #4682B4 + * + */ + static readonly STEELBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #D2B48C + * + */ + static readonly TAN: Color; + /** + * An immutable Color instance initialized to CSS color #008080 + * + */ + static readonly TEAL: Color; + /** + * An immutable Color instance initialized to CSS color #D8BFD8 + * + */ + static readonly THISTLE: Color; + /** + * An immutable Color instance initialized to CSS color #FF6347 + * + */ + static readonly TOMATO: Color; + /** + * An immutable Color instance initialized to CSS color #40E0D0 + * + */ + static readonly TURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #EE82EE + * + */ + static readonly VIOLET: Color; + /** + * An immutable Color instance initialized to CSS color #F5DEB3 + * + */ + static readonly WHEAT: Color; + /** + * An immutable Color instance initialized to CSS color #FFFFFF + * + */ + static readonly WHITE: Color; + /** + * An immutable Color instance initialized to CSS color #F5F5F5 + * + */ + static readonly WHITESMOKE: Color; + /** + * An immutable Color instance initialized to CSS color #FFFF00 + * + */ + static readonly YELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #9ACD32 + * + */ + static readonly YELLOWGREEN: Color; + /** + * An immutable Color instance initialized to CSS transparent. + * + */ + static readonly TRANSPARENT: Color; +} + +/** + * Value and type information for per-instance geometry color. + * @example + * var instance = new Cesium.GeometryInstance({ + * geometry : Cesium.BoxGeometry.fromDimensions({ + * dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(0.0, 0.0)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(red, green, blue, alpha) + * } + * }); + * @param [red = 1.0] - The red component. + * @param [green = 1.0] - The green component. + * @param [blue = 1.0] - The blue component. + * @param [alpha = 1.0] - The alpha component. + */ +export class ColorGeometryInstanceAttribute { + constructor(red?: number, green?: number, blue?: number, alpha?: number); + /** + * The values for the attributes stored in a typed array. + */ + value: Uint8Array; + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentDatatype: ComponentDatatype; + /** + * The number of components in the attributes, i.e., {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + */ + readonly normalize: boolean; + /** + * Creates a new {@link ColorGeometryInstanceAttribute} instance given the provided {@link Color}. + * @example + * var instance = new Cesium.GeometryInstance({ + * geometry : geometry, + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.CORNFLOWERBLUE), + * } + * }); + * @param color - The color. + * @returns The new {@link ColorGeometryInstanceAttribute} instance. + */ + static fromColor(color: Color): ColorGeometryInstanceAttribute; + /** + * Converts a color to a typed array that can be used to assign a color attribute. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA, attributes.color); + * @param color - The color. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static toValue(color: Color, result?: Uint8Array): Uint8Array; + /** + * Compares the provided ColorGeometryInstanceAttributes and returns + * true if they are equal, false otherwise. + * @param [left] - The first ColorGeometryInstanceAttribute. + * @param [right] - The second ColorGeometryInstanceAttribute. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: ColorGeometryInstanceAttribute, right?: ColorGeometryInstanceAttribute): boolean; +} + +/** + * WebGL component datatypes. Components are intrinsics, + * which form attributes, which form vertices. + */ +export enum ComponentDatatype { + /** + * 8-bit signed byte corresponding to gl.BYTE and the type + * of an element in Int8Array. + */ + BYTE = WebGLConstants.BYTE, + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + */ + UNSIGNED_BYTE = WebGLConstants.UNSIGNED_BYTE, + /** + * 16-bit signed short corresponding to SHORT and the type + * of an element in Int16Array. + */ + SHORT = WebGLConstants.SHORT, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + */ + UNSIGNED_SHORT = WebGLConstants.UNSIGNED_SHORT, + /** + * 32-bit signed int corresponding to INT and the type + * of an element in Int32Array. + */ + INT = WebGLConstants.INT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + */ + UNSIGNED_INT = WebGLConstants.UNSIGNED_INT, + /** + * 32-bit floating-point corresponding to FLOAT and the type + * of an element in Float32Array. + */ + FLOAT = WebGLConstants.FLOAT, + /** + * 64-bit floating-point corresponding to gl.DOUBLE (in Desktop OpenGL; + * this is not supported in WebGL, and is emulated in Cesium via {@link GeometryPipeline.encodeAttribute}) + * and the type of an element in Float64Array. + */ + DOUBLE = WebGLConstants.DOUBLE +} + +/** + * Describes a compressed texture and contains a compressed texture buffer. + * @param internalFormat - The pixel format of the compressed texture. + * @param width - The width of the texture. + * @param height - The height of the texture. + * @param buffer - The compressed texture buffer. + */ +export class CompressedTextureBuffer { + constructor(internalFormat: PixelFormat, width: number, height: number, buffer: Uint8Array); + /** + * The format of the compressed texture. + */ + readonly internalFormat: PixelFormat; + /** + * The width of the texture. + */ + readonly width: number; + /** + * The height of the texture. + */ + readonly height: number; + /** + * The compressed texture buffer. + */ + readonly bufferView: Uint8Array; + /** + * Creates a shallow clone of a compressed texture buffer. + * @param object - The compressed texture buffer to be cloned. + * @returns A shallow clone of the compressed texture buffer. + */ + static clone(object: CompressedTextureBuffer): CompressedTextureBuffer; + /** + * Creates a shallow clone of this compressed texture buffer. + * @returns A shallow clone of the compressed texture buffer. + */ + clone(): CompressedTextureBuffer; +} + +/** + * A description of a polygon composed of arbitrary coplanar positions. + * @example + * var polygon = new Cesium.CoplanarPolygonGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * -90.0, 30.0, 0.0, + * -90.0, 30.0, 1000.0, + * -80.0, 30.0, 1000.0, + * -80.0, 30.0, 0.0 + * ]) + * }); + * var geometry = Cesium.CoplanarPolygonGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + */ +export class CoplanarPolygonGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + stRotation?: number; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * A description of a coplanar polygon from an array of positions. + * @example + * // create a polygon from points + * var polygon = Cesium.CoplanarPolygonGeometry.fromPositions({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * }); + * var geometry = Cesium.PolygonGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + */ + static fromPositions(options: { + positions: Cartesian3[]; + vertexFormat?: VertexFormat; + stRotation?: number; + ellipsoid?: Ellipsoid; + }): CoplanarPolygonGeometry; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CoplanarPolygonGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CoplanarPolygonGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CoplanarPolygonGeometry): CoplanarPolygonGeometry; + /** + * Computes the geometric representation of an arbitrary coplanar polygon, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon. + * @returns The computed vertices and indices. + */ + static createGeometry(polygonGeometry: CoplanarPolygonGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a polygon composed of arbitrary coplanar positions. + * @example + * var polygonOutline = new Cesium.CoplanarPolygonOutlineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * -90.0, 30.0, 0.0, + * -90.0, 30.0, 1000.0, + * -80.0, 30.0, 1000.0, + * -80.0, 30.0, 0.0 + * ]) + * }); + * var geometry = Cesium.CoplanarPolygonOutlineGeometry.createGeometry(polygonOutline); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + */ +export class CoplanarPolygonOutlineGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * A description of a coplanar polygon outline from an array of positions. + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + */ + static fromPositions(options: { + positions: Cartesian3[]; + }): CoplanarPolygonOutlineGeometry; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CoplanarPolygonOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CoplanarPolygonOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CoplanarPolygonOutlineGeometry): CoplanarPolygonOutlineGeometry; + /** + * Computes the geometric representation of an arbitrary coplanar polygon, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon. + * @returns The computed vertices and indices. + */ + static createGeometry(polygonGeometry: CoplanarPolygonOutlineGeometry): Geometry | undefined; +} + +/** + * Style options for corners. + */ +export enum CornerType { + /** + * + * + * Corner has a smooth edge. + */ + ROUNDED = 0, + /** + * + * + * Corner point is the intersection of adjacent edges. + */ + MITERED = 1, + /** + * + * + * Corner is clipped. + */ + BEVELED = 2 +} + +/** + * A description of a corridor. Corridor geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * var corridor = new Cesium.CorridorGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * positions : Cesium.Cartesian3.fromDegreesArray([-72.0, 40.0, -70.0, 35.0]), + * width : 100000 + * }); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that define the center of the corridor. + * @param options.width - The distance between the edges of the corridor in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0] - The distance in meters between the ellipsoid surface and the positions. + * @param [options.extrudedHeight] - The distance in meters between the ellipsoid surface and the extruded face. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ +export class CorridorGeometry { + constructor(options: { + positions: Cartesian3[]; + width: number; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CorridorGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CorridorGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CorridorGeometry): CorridorGeometry; + /** + * Computes the bounding rectangle given the provided options + * @param options - Object with the following properties: + * @param options.positions - An array of positions that define the center of the corridor. + * @param options.width - The distance between the edges of the corridor in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + * @param [result] - An object in which to store the result. + * @returns The result rectangle. + */ + static computeRectangle(options: { + positions: Cartesian3[]; + width: number; + ellipsoid?: Ellipsoid; + cornerType?: CornerType; + }, result?: Rectangle): Rectangle; + /** + * Computes the geometric representation of a corridor, including its vertices, indices, and a bounding sphere. + * @param corridorGeometry - A description of the corridor. + * @returns The computed vertices and indices. + */ + static createGeometry(corridorGeometry: CorridorGeometry): Geometry | undefined; +} + +/** + * A description of a corridor outline. + * @example + * var corridor = new Cesium.CorridorOutlineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([-72.0, 40.0, -70.0, 35.0]), + * width : 100000 + * }); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that define the center of the corridor outline. + * @param options.width - The distance between the edges of the corridor outline. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0] - The distance in meters between the positions and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the extruded face and the ellipsoid surface. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ +export class CorridorOutlineGeometry { + constructor(options: { + positions: Cartesian3[]; + width: number; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + extrudedHeight?: number; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CorridorOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CorridorOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CorridorOutlineGeometry): CorridorOutlineGeometry; + /** + * Computes the geometric representation of a corridor, including its vertices, indices, and a bounding sphere. + * @param corridorOutlineGeometry - A description of the corridor. + * @returns The computed vertices and indices. + */ + static createGeometry(corridorOutlineGeometry: CorridorOutlineGeometry): Geometry | undefined; +} + +/** + * A credit contains data pertaining to how to display attributions/credits for certain content on the screen. + * @example + * //Create a credit with a tooltip, image and link + * var credit = new Cesium.Credit('
    '); + * @param html - An string representing an html code snippet + * @param [showOnScreen = false] - If true, the credit will be visible in the main credit container. Otherwise, it will appear in a popover + */ +export class Credit { + constructor(html: string, showOnScreen?: boolean); + /** + * The credit content + */ + readonly html: string; + /** + * Whether the credit should be displayed on screen or in a lightbox + */ + readonly showOnScreen: boolean; + /** + * Gets the credit element + */ + readonly element: HTMLElement; + /** + * Returns true if the credits are equal + * @param left - The first credit + * @param right - The second credit + * @returns true if left and right are equal, false otherwise. + */ + static equals(left: Credit, right: Credit): boolean; + /** + * Returns true if the credits are equal + * @param credit - The credit to compare to. + * @returns true if left and right are equal, false otherwise. + */ + equals(credit: Credit): boolean; + /** + * Duplicates a Credit instance. + * @param [credit] - The Credit to duplicate. + * @returns A new Credit instance that is a duplicate of the one provided. (Returns undefined if the credit is undefined) + */ + static clone(credit?: Credit): Credit; +} + +/** + * Defines functions for 3rd order polynomial functions of one variable with only real coefficients. + */ +export namespace CubicRealPolynomial { + /** + * Provides the discriminant of the cubic equation from the supplied coefficients. + * @param a - The coefficient of the 3rd order monomial. + * @param b - The coefficient of the 2nd order monomial. + * @param c - The coefficient of the 1st order monomial. + * @param d - The coefficient of the 0th order monomial. + * @returns The value of the discriminant. + */ + function computeDiscriminant(a: number, b: number, c: number, d: number): number; + /** + * Provides the real valued roots of the cubic polynomial with the provided coefficients. + * @param a - The coefficient of the 3rd order monomial. + * @param b - The coefficient of the 2nd order monomial. + * @param c - The coefficient of the 1st order monomial. + * @param d - The coefficient of the 0th order monomial. + * @returns The real valued roots. + */ + function computeRealRoots(a: number, b: number, c: number, d: number): number[]; +} + +/** + * The culling volume defined by planes. + * @param [planes] - An array of clipping planes. + */ +export class CullingVolume { + constructor(planes?: Cartesian4[]); + /** + * Each plane is represented by a Cartesian4 object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin. + */ + planes: Cartesian4[]; + /** + * Constructs a culling volume from a bounding sphere. Creates six planes that create a box containing the sphere. + * The planes are aligned to the x, y, and z axes in world coordinates. + * @param boundingSphere - The bounding sphere used to create the culling volume. + * @param [result] - The object onto which to store the result. + * @returns The culling volume created from the bounding sphere. + */ + static fromBoundingSphere(boundingSphere: BoundingSphere, result?: CullingVolume): CullingVolume; + /** + * Determines whether a bounding volume intersects the culling volume. + * @param boundingVolume - The bounding volume whose intersection with the culling volume is to be tested. + * @returns Intersect.OUTSIDE, Intersect.INTERSECTING, or Intersect.INSIDE. + */ + computeVisibility(boundingVolume: any): Intersect; +} + +/** + * A description of a cylinder. + * @example + * // create cylinder geometry + * var cylinder = new Cesium.CylinderGeometry({ + * length: 200000, + * topRadius: 80000, + * bottomRadius: 200000, + * }); + * var geometry = Cesium.CylinderGeometry.createGeometry(cylinder); + * @param options - Object with the following properties: + * @param options.length - The length of the cylinder. + * @param options.topRadius - The radius of the top of the cylinder. + * @param options.bottomRadius - The radius of the bottom of the cylinder. + * @param [options.slices = 128] - The number of edges around the perimeter of the cylinder. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class CylinderGeometry { + constructor(options: { + length: number; + topRadius: number; + bottomRadius: number; + slices?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CylinderGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CylinderGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CylinderGeometry): CylinderGeometry; + /** + * Computes the geometric representation of a cylinder, including its vertices, indices, and a bounding sphere. + * @param cylinderGeometry - A description of the cylinder. + * @returns The computed vertices and indices. + */ + static createGeometry(cylinderGeometry: CylinderGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a cylinder. + * @example + * // create cylinder geometry + * var cylinder = new Cesium.CylinderOutlineGeometry({ + * length: 200000, + * topRadius: 80000, + * bottomRadius: 200000, + * }); + * var geometry = Cesium.CylinderOutlineGeometry.createGeometry(cylinder); + * @param options - Object with the following properties: + * @param options.length - The length of the cylinder. + * @param options.topRadius - The radius of the top of the cylinder. + * @param options.bottomRadius - The radius of the bottom of the cylinder. + * @param [options.slices = 128] - The number of edges around the perimeter of the cylinder. + * @param [options.numberOfVerticalLines = 16] - Number of lines to draw between the top and bottom surfaces of the cylinder. + */ +export class CylinderOutlineGeometry { + constructor(options: { + length: number; + topRadius: number; + bottomRadius: number; + slices?: number; + numberOfVerticalLines?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: CylinderOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CylinderOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: CylinderOutlineGeometry): CylinderOutlineGeometry; + /** + * Computes the geometric representation of an outline of a cylinder, including its vertices, indices, and a bounding sphere. + * @param cylinderGeometry - A description of the cylinder outline. + * @returns The computed vertices and indices. + */ + static createGeometry(cylinderGeometry: CylinderOutlineGeometry): Geometry | undefined; +} + +/** + * A simple proxy that appends the desired resource as the sole query parameter + * to the given proxy URL. + * @param proxy - The proxy URL that will be used to requests all resources. + */ +export class DefaultProxy extends Proxy { + constructor(proxy: string); + /** + * Get the final URL to use to request a given resource. + * @param resource - The resource to request. + * @returns proxied resource + */ + getURL(resource: string): string; +} + +/** + * Constructs an exception object that is thrown due to a developer error, e.g., invalid argument, + * argument out of range, etc. This exception should only be thrown during development; + * it usually indicates a bug in the calling code. This exception should never be + * caught; instead the calling code should strive not to generate it. + *

    + * On the other hand, a {@link RuntimeError} indicates an exception that may + * be thrown at runtime, e.g., out of memory, that the calling code should be prepared + * to catch. + * @param [message] - The error message for this exception. + */ +export class DeveloperError extends Error { + constructor(message?: string); + /** + * 'DeveloperError' indicating that this exception was thrown due to a developer error. + */ + readonly name: string; + /** + * The explanation for why this exception was thrown. + */ + readonly message: string; + /** + * The stack trace of this exception, if available. + */ + readonly stack: string; +} + +/** + * Determines visibility based on the distance to the camera. + * @example + * // Make a billboard that is only visible when the distance to the camera is between 10 and 20 meters. + * billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(10.0, 20.0); + * @param [near = 0.0] - The smallest distance in the interval where the object is visible. + * @param [far = Number.MAX_VALUE] - The largest distance in the interval where the object is visible. + */ +export class DistanceDisplayCondition { + constructor(near?: number, far?: number); + /** + * The smallest distance in the interval where the object is visible. + */ + near: number; + /** + * The largest distance in the interval where the object is visible. + */ + far: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: DistanceDisplayCondition, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new DistanceDisplayCondition instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: DistanceDisplayCondition): DistanceDisplayCondition; + /** + * Determines if two distance display conditions are equal. + * @param left - A distance display condition. + * @param right - Another distance display condition. + * @returns Whether the two distance display conditions are equal. + */ + static equals(left: DistanceDisplayCondition, right: DistanceDisplayCondition): boolean; + /** + * Duplicates a distance display condition instance. + * @param [value] - The distance display condition to duplicate. + * @param [result] - The result onto which to store the result. + * @returns The duplicated instance. + */ + static clone(value?: DistanceDisplayCondition, result?: DistanceDisplayCondition): DistanceDisplayCondition; + /** + * Duplicates this instance. + * @param [result] - The result onto which to store the result. + * @returns The duplicated instance. + */ + clone(result?: DistanceDisplayCondition): DistanceDisplayCondition; + /** + * Determines if this distance display condition is equal to another. + * @param other - Another distance display condition. + * @returns Whether this distance display condition is equal to the other. + */ + equals(other: DistanceDisplayCondition): boolean; +} + +/** + * Value and type information for per-instance geometry attribute that determines if the geometry instance has a distance display condition. + * @example + * var instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.BoxGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL, + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0), + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * distanceDisplayCondition : new Cesium.DistanceDisplayConditionGeometryInstanceAttribute(100.0, 10000.0) + * } + * }); + * @param [near = 0.0] - The near distance. + * @param [far = Number.MAX_VALUE] - The far distance. + */ +export class DistanceDisplayConditionGeometryInstanceAttribute { + constructor(near?: number, far?: number); + /** + * The values for the attributes stored in a typed array. + */ + value: Float32Array; + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link DistanceDisplayConditionGeometryInstanceAttribute#value}. + */ + readonly componentDatatype: ComponentDatatype; + /** + * The number of components in the attributes, i.e., {@link DistanceDisplayConditionGeometryInstanceAttribute#value}. + */ + readonly componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + */ + readonly normalize: boolean; + /** + * Creates a new {@link DistanceDisplayConditionGeometryInstanceAttribute} instance given the provided an enabled flag and {@link DistanceDisplayCondition}. + * @example + * var distanceDisplayCondition = new Cesium.DistanceDisplayCondition(100.0, 10000.0); + * var instance = new Cesium.GeometryInstance({ + * geometry : geometry, + * attributes : { + * distanceDisplayCondition : Cesium.DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(distanceDisplayCondition) + * } + * }); + * @param distanceDisplayCondition - The distance display condition. + * @returns The new {@link DistanceDisplayConditionGeometryInstanceAttribute} instance. + */ + static fromDistanceDisplayCondition(distanceDisplayCondition: DistanceDisplayCondition): DistanceDisplayConditionGeometryInstanceAttribute; + /** + * Converts a distance display condition to a typed array that can be used to assign a distance display condition attribute. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.distanceDisplayCondition = Cesium.DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition); + * @param distanceDisplayCondition - The distance display condition value. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static toValue(distanceDisplayCondition: DistanceDisplayCondition, result?: Float32Array): Float32Array; +} + +/** + * Easing functions for use with TweenCollection. These function are from + * {@link https://github.com/sole/tween.js/|Tween.js} and Robert Penner. See the + * {@link http://sole.github.io/tween.js/examples/03_graphs.html|Tween.js graphs for each function}. + */ +export namespace EasingFunction { + /** + * Linear easing. + */ + const LINEAR_NONE: EasingFunction.Callback; + /** + * Quadratic in. + */ + const QUADRACTIC_IN: EasingFunction.Callback; + /** + * Quadratic out. + */ + const QUADRACTIC_OUT: EasingFunction.Callback; + /** + * Quadratic in then out. + */ + const QUADRACTIC_IN_OUT: EasingFunction.Callback; + /** + * Cubic in. + */ + const CUBIC_IN: EasingFunction.Callback; + /** + * Cubic out. + */ + const CUBIC_OUT: EasingFunction.Callback; + /** + * Cubic in then out. + */ + const CUBIC_IN_OUT: EasingFunction.Callback; + /** + * Quartic in. + */ + const QUARTIC_IN: EasingFunction.Callback; + /** + * Quartic out. + */ + const QUARTIC_OUT: EasingFunction.Callback; + /** + * Quartic in then out. + */ + const QUARTIC_IN_OUT: EasingFunction.Callback; + /** + * Quintic in. + */ + const QUINTIC_IN: EasingFunction.Callback; + /** + * Quintic out. + */ + const QUINTIC_OUT: EasingFunction.Callback; + /** + * Quintic in then out. + */ + const QUINTIC_IN_OUT: EasingFunction.Callback; + /** + * Sinusoidal in. + */ + const SINUSOIDAL_IN: EasingFunction.Callback; + /** + * Sinusoidal out. + */ + const SINUSOIDAL_OUT: EasingFunction.Callback; + /** + * Sinusoidal in then out. + */ + const SINUSOIDAL_IN_OUT: EasingFunction.Callback; + /** + * Exponential in. + */ + const EXPONENTIAL_IN: EasingFunction.Callback; + /** + * Exponential out. + */ + const EXPONENTIAL_OUT: EasingFunction.Callback; + /** + * Exponential in then out. + */ + const EXPONENTIAL_IN_OUT: EasingFunction.Callback; + /** + * Circular in. + */ + const CIRCULAR_IN: EasingFunction.Callback; + /** + * Circular out. + */ + const CIRCULAR_OUT: EasingFunction.Callback; + /** + * Circular in then out. + */ + const CIRCULAR_IN_OUT: EasingFunction.Callback; + /** + * Elastic in. + */ + const ELASTIC_IN: EasingFunction.Callback; + /** + * Elastic out. + */ + const ELASTIC_OUT: EasingFunction.Callback; + /** + * Elastic in then out. + */ + const ELASTIC_IN_OUT: EasingFunction.Callback; + /** + * Back in. + */ + const BACK_IN: EasingFunction.Callback; + /** + * Back out. + */ + const BACK_OUT: EasingFunction.Callback; + /** + * Back in then out. + */ + const BACK_IN_OUT: EasingFunction.Callback; + /** + * Bounce in. + */ + const BOUNCE_IN: EasingFunction.Callback; + /** + * Bounce out. + */ + const BOUNCE_OUT: EasingFunction.Callback; + /** + * Bounce in then out. + */ + const BOUNCE_IN_OUT: EasingFunction.Callback; + /** + * Function interface for implementing a custom easing function. + * @example + * function quadraticIn(time) { + * return time * time; + * } + * @example + * function quadraticOut(time) { + * return time * (2.0 - time); + * } + * @param time - The time in the range [0, 1]. + */ + type Callback = (time: number) => number; +} + +/** + * A description of an ellipse on an ellipsoid. Ellipse geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // Create an ellipse. + * var ellipse = new Cesium.EllipseGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * semiMajorAxis : 500000.0, + * semiMinorAxis : 300000.0, + * rotation : Cesium.Math.toRadians(60.0) + * }); + * var geometry = Cesium.EllipseGeometry.createGeometry(ellipse); + * @param options - Object with the following properties: + * @param options.center - The ellipse's center point in the fixed frame. + * @param options.semiMajorAxis - The length of the ellipse's semi-major axis in meters. + * @param options.semiMinorAxis - The length of the ellipse's semi-minor axis in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid the ellipse will be on. + * @param [options.height = 0.0] - The distance in meters between the ellipse and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the ellipse's extruded face and the ellipsoid surface. + * @param [options.rotation = 0.0] - The angle of rotation counter-clockwise from north. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates counter-clockwise from north. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The angular distance between points on the ellipse in radians. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class EllipseGeometry { + constructor(options: { + center: Cartesian3; + semiMajorAxis: number; + semiMinorAxis: number; + ellipsoid?: Ellipsoid; + height?: number; + extrudedHeight?: number; + rotation?: number; + stRotation?: number; + granularity?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: EllipseGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipseGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: EllipseGeometry): EllipseGeometry; + /** + * Computes the bounding rectangle based on the provided options + * @param options - Object with the following properties: + * @param options.center - The ellipse's center point in the fixed frame. + * @param options.semiMajorAxis - The length of the ellipse's semi-major axis in meters. + * @param options.semiMinorAxis - The length of the ellipse's semi-minor axis in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid the ellipse will be on. + * @param [options.rotation = 0.0] - The angle of rotation counter-clockwise from north. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The angular distance between points on the ellipse in radians. + * @param [result] - An object in which to store the result + * @returns The result rectangle + */ + static computeRectangle(options: { + center: Cartesian3; + semiMajorAxis: number; + semiMinorAxis: number; + ellipsoid?: Ellipsoid; + rotation?: number; + granularity?: number; + }, result?: Rectangle): Rectangle; + /** + * Computes the geometric representation of a ellipse on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipseGeometry - A description of the ellipse. + * @returns The computed vertices and indices. + */ + static createGeometry(ellipseGeometry: EllipseGeometry): Geometry | undefined; +} + +/** + * A description of the outline of an ellipse on an ellipsoid. + * @example + * var ellipse = new Cesium.EllipseOutlineGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * semiMajorAxis : 500000.0, + * semiMinorAxis : 300000.0, + * rotation : Cesium.Math.toRadians(60.0) + * }); + * var geometry = Cesium.EllipseOutlineGeometry.createGeometry(ellipse); + * @param options - Object with the following properties: + * @param options.center - The ellipse's center point in the fixed frame. + * @param options.semiMajorAxis - The length of the ellipse's semi-major axis in meters. + * @param options.semiMinorAxis - The length of the ellipse's semi-minor axis in meters. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid the ellipse will be on. + * @param [options.height = 0.0] - The distance in meters between the ellipse and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the ellipse's extruded face and the ellipsoid surface. + * @param [options.rotation = 0.0] - The angle from north (counter-clockwise) in radians. + * @param [options.granularity = 0.02] - The angular distance between points on the ellipse in radians. + * @param [options.numberOfVerticalLines = 16] - Number of lines to draw between the top and bottom surface of an extruded ellipse. + */ +export class EllipseOutlineGeometry { + constructor(options: { + center: Cartesian3; + semiMajorAxis: number; + semiMinorAxis: number; + ellipsoid?: Ellipsoid; + height?: number; + extrudedHeight?: number; + rotation?: number; + granularity?: number; + numberOfVerticalLines?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: EllipseOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipseOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: EllipseOutlineGeometry): EllipseOutlineGeometry; + /** + * Computes the geometric representation of an outline of an ellipse on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipseGeometry - A description of the ellipse. + * @returns The computed vertices and indices. + */ + static createGeometry(ellipseGeometry: EllipseOutlineGeometry): Geometry | undefined; +} + +/** + * A quadratic surface defined in Cartesian coordinates by the equation + * (x / a)^2 + (y / b)^2 + (z / c)^2 = 1. Primarily used + * by Cesium to represent the shape of planetary bodies. + * + * Rather than constructing this object directly, one of the provided + * constants is normally used. + * @param [x = 0] - The radius in the x direction. + * @param [y = 0] - The radius in the y direction. + * @param [z = 0] - The radius in the z direction. + */ +export class Ellipsoid { + constructor(x?: number, y?: number, z?: number); + /** + * Gets the radii of the ellipsoid. + */ + readonly radii: Cartesian3; + /** + * Gets the squared radii of the ellipsoid. + */ + readonly radiiSquared: Cartesian3; + /** + * Gets the radii of the ellipsoid raise to the fourth power. + */ + readonly radiiToTheFourth: Cartesian3; + /** + * Gets one over the radii of the ellipsoid. + */ + readonly oneOverRadii: Cartesian3; + /** + * Gets one over the squared radii of the ellipsoid. + */ + readonly oneOverRadiiSquared: Cartesian3; + /** + * Gets the minimum radius of the ellipsoid. + */ + readonly minimumRadius: number; + /** + * Gets the maximum radius of the ellipsoid. + */ + readonly maximumRadius: number; + /** + * Duplicates an Ellipsoid instance. + * @param ellipsoid - The ellipsoid to duplicate. + * @param [result] - The object onto which to store the result, or undefined if a new + * instance should be created. + * @returns The cloned Ellipsoid. (Returns undefined if ellipsoid is undefined) + */ + static clone(ellipsoid: Ellipsoid, result?: Ellipsoid): Ellipsoid; + /** + * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions. + * @param [cartesian = Cartesian3.ZERO] - The ellipsoid's radius in the x, y, and z directions. + * @param [result] - The object onto which to store the result, or undefined if a new + * instance should be created. + * @returns A new Ellipsoid instance. + */ + static fromCartesian3(cartesian?: Cartesian3, result?: Ellipsoid): Ellipsoid; + /** + * An Ellipsoid instance initialized to the WGS84 standard. + */ + static readonly WGS84: Ellipsoid; + /** + * An Ellipsoid instance initialized to radii of (1.0, 1.0, 1.0). + */ + static readonly UNIT_SPHERE: Ellipsoid; + /** + * An Ellipsoid instance initialized to a sphere with the lunar radius. + */ + static readonly MOON: Ellipsoid; + /** + * Duplicates an Ellipsoid instance. + * @param [result] - The object onto which to store the result, or undefined if a new + * instance should be created. + * @returns The cloned Ellipsoid. + */ + clone(result?: Ellipsoid): Ellipsoid; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Ellipsoid, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Ellipsoid instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Ellipsoid): Ellipsoid; + /** + * Computes the unit vector directed from the center of this ellipsoid toward the provided Cartesian position. + * @param cartesian - The Cartesian for which to to determine the geocentric normal. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + geocentricSurfaceNormal(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position. + * @param cartographic - The cartographic position for which to to determine the geodetic normal. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + geodeticSurfaceNormalCartographic(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position. + * @param cartesian - The Cartesian position for which to to determine the surface normal. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + geodeticSurfaceNormal(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Converts the provided cartographic to Cartesian representation. + * @example + * //Create a Cartographic and determine it's Cartesian representation on a WGS84 ellipsoid. + * var position = new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 5000); + * var cartesianPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position); + * @param cartographic - The cartographic position. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + cartographicToCartesian(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Converts the provided array of cartographics to an array of Cartesians. + * @example + * //Convert an array of Cartographics and determine their Cartesian representation on a WGS84 ellipsoid. + * var positions = [new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 0), + * new Cesium.Cartographic(Cesium.Math.toRadians(21.321), Cesium.Math.toRadians(78.123), 100), + * new Cesium.Cartographic(Cesium.Math.toRadians(21.645), Cesium.Math.toRadians(78.456), 250)]; + * var cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(positions); + * @param cartographics - An array of cartographic positions. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Array instance if none was provided. + */ + cartographicArrayToCartesianArray(cartographics: Cartographic[], result?: Cartesian3[]): Cartesian3[]; + /** + * Converts the provided cartesian to cartographic representation. + * The cartesian is undefined at the center of the ellipsoid. + * @example + * //Create a Cartesian and determine it's Cartographic representation on a WGS84 ellipsoid. + * var position = new Cesium.Cartesian3(17832.12, 83234.52, 952313.73); + * var cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position); + * @param cartesian - The Cartesian position to convert to cartographic representation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid. + */ + cartesianToCartographic(cartesian: Cartesian3, result?: Cartographic): Cartographic; + /** + * Converts the provided array of cartesians to an array of cartographics. + * @example + * //Create an array of Cartesians and determine their Cartographic representation on a WGS84 ellipsoid. + * var positions = [new Cesium.Cartesian3(17832.12, 83234.52, 952313.73), + * new Cesium.Cartesian3(17832.13, 83234.53, 952313.73), + * new Cesium.Cartesian3(17832.14, 83234.54, 952313.73)] + * var cartographicPositions = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions); + * @param cartesians - An array of Cartesian positions. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Array instance if none was provided. + */ + cartesianArrayToCartographicArray(cartesians: Cartesian3[], result?: Cartographic[]): Cartographic[]; + /** + * Scales the provided Cartesian position along the geodetic surface normal + * so that it is on the surface of this ellipsoid. If the position is + * at the center of the ellipsoid, this function returns undefined. + * @param cartesian - The Cartesian position to scale. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center. + */ + scaleToGeodeticSurface(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Scales the provided Cartesian position along the geocentric surface normal + * so that it is on the surface of this ellipsoid. + * @param cartesian - The Cartesian position to scale. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + scaleToGeocentricSurface(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Transforms a Cartesian X, Y, Z position to the ellipsoid-scaled space by multiplying + * its components by the result of {@link Ellipsoid#oneOverRadii}. + * @param position - The position to transform. + * @param [result] - The position to which to copy the result, or undefined to create and + * return a new instance. + * @returns The position expressed in the scaled space. The returned instance is the + * one passed as the result parameter if it is not undefined, or a new instance of it is. + */ + transformPositionToScaledSpace(position: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Transforms a Cartesian X, Y, Z position from the ellipsoid-scaled space by multiplying + * its components by the result of {@link Ellipsoid#radii}. + * @param position - The position to transform. + * @param [result] - The position to which to copy the result, or undefined to create and + * return a new instance. + * @returns The position expressed in the unscaled space. The returned instance is the + * one passed as the result parameter if it is not undefined, or a new instance of it is. + */ + transformPositionFromScaledSpace(position: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Compares this Ellipsoid against the provided Ellipsoid componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The other Ellipsoid. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Ellipsoid): boolean; + /** + * Creates a string representing this Ellipsoid in the format '(radii.x, radii.y, radii.z)'. + * @returns A string representing this ellipsoid in the format '(radii.x, radii.y, radii.z)'. + */ + toString(): string; + /** + * Computes a point which is the intersection of the surface normal with the z-axis. + * @param position - the position. must be on the surface of the ellipsoid. + * @param [buffer = 0.0] - A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid. + * In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center. + * In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis). + * Intersection point could be outside the ellipsoid if the ratio of MajorAxis / AxisOfRotation is bigger than the square root of 2 + * @param [result] - The cartesian to which to copy the result, or undefined to create and + * return a new instance. + * @returns the intersection point if it's inside the ellipsoid, undefined otherwise + */ + getSurfaceNormalIntersectionWithZAxis(position: Cartesian3, buffer?: number, result?: Cartesian3): Cartesian3 | undefined; + /** + * Computes an approximation of the surface area of a rectangle on the surface of an ellipsoid using + * Gauss-Legendre 10th order quadrature. + * @param rectangle - The rectangle used for computing the surface area. + * @returns The approximate area of the rectangle on the surface of this ellipsoid. + */ + surfaceArea(rectangle: Rectangle): number; +} + +/** + * Initializes a geodesic on the ellipsoid connecting the two provided planetodetic points. + * @param [start] - The initial planetodetic point on the path. + * @param [end] - The final planetodetic point on the path. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the geodesic lies. + */ +export class EllipsoidGeodesic { + constructor(start?: Cartographic, end?: Cartographic, ellipsoid?: Ellipsoid); + /** + * Gets the ellipsoid. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets the surface distance between the start and end point + */ + readonly surfaceDistance: number; + /** + * Gets the initial planetodetic point on the path. + */ + readonly start: Cartographic; + /** + * Gets the final planetodetic point on the path. + */ + readonly end: Cartographic; + /** + * Gets the heading at the initial point. + */ + readonly startHeading: number; + /** + * Gets the heading at the final point. + */ + readonly endHeading: number; + /** + * Sets the start and end points of the geodesic + * @param start - The initial planetodetic point on the path. + * @param end - The final planetodetic point on the path. + */ + setEndPoints(start: Cartographic, end: Cartographic): void; + /** + * Provides the location of a point at the indicated portion along the geodesic. + * @param fraction - The portion of the distance between the initial and final points. + * @param [result] - The object in which to store the result. + * @returns The location of the point along the geodesic. + */ + interpolateUsingFraction(fraction: number, result?: Cartographic): Cartographic; + /** + * Provides the location of a point at the indicated distance along the geodesic. + * @param distance - The distance from the inital point to the point of interest along the geodesic + * @param [result] - The object in which to store the result. + * @returns The location of the point along the geodesic. + */ + interpolateUsingSurfaceDistance(distance: number, result?: Cartographic): Cartographic; +} + +/** + * A description of an ellipsoid centered at the origin. + * @example + * var ellipsoid = new Cesium.EllipsoidGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0) + * }); + * var geometry = Cesium.EllipsoidGeometry.createGeometry(ellipsoid); + * @param [options] - Object with the following properties: + * @param [options.radii = Cartesian3(1.0, 1.0, 1.0)] - The radii of the ellipsoid in the x, y, and z directions. + * @param [options.innerRadii = options.radii] - The inner radii of the ellipsoid in the x, y, and z directions. + * @param [options.minimumClock = 0.0] - The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.maximumClock = 2*PI] - The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.minimumCone = 0.0] - The minimum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.maximumCone = PI] - The maximum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.stackPartitions = 64] - The number of times to partition the ellipsoid into stacks. + * @param [options.slicePartitions = 64] - The number of times to partition the ellipsoid into radial slices. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class EllipsoidGeometry { + constructor(options?: { + radii?: Cartesian3; + innerRadii?: Cartesian3; + minimumClock?: number; + maximumClock?: number; + minimumCone?: number; + maximumCone?: number; + stackPartitions?: number; + slicePartitions?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: EllipsoidGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipsoidGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: EllipsoidGeometry): EllipsoidGeometry; + /** + * Computes the geometric representation of an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipsoidGeometry - A description of the ellipsoid. + * @returns The computed vertices and indices. + */ + static createGeometry(ellipsoidGeometry: EllipsoidGeometry): Geometry | undefined; +} + +/** + * A description of the outline of an ellipsoid centered at the origin. + * @example + * var ellipsoid = new Cesium.EllipsoidOutlineGeometry({ + * radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0), + * stackPartitions: 6, + * slicePartitions: 5 + * }); + * var geometry = Cesium.EllipsoidOutlineGeometry.createGeometry(ellipsoid); + * @param [options] - Object with the following properties: + * @param [options.radii = Cartesian3(1.0, 1.0, 1.0)] - The radii of the ellipsoid in the x, y, and z directions. + * @param [options.innerRadii = options.radii] - The inner radii of the ellipsoid in the x, y, and z directions. + * @param [options.minimumClock = 0.0] - The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.maximumClock = 2*PI] - The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.minimumCone = 0.0] - The minimum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.maximumCone = PI] - The maximum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.stackPartitions = 10] - The count of stacks for the ellipsoid (1 greater than the number of parallel lines). + * @param [options.slicePartitions = 8] - The count of slices for the ellipsoid (Equal to the number of radial lines). + * @param [options.subdivisions = 128] - The number of points per line, determining the granularity of the curvature. + */ +export class EllipsoidOutlineGeometry { + constructor(options?: { + radii?: Cartesian3; + innerRadii?: Cartesian3; + minimumClock?: number; + maximumClock?: number; + minimumCone?: number; + maximumCone?: number; + stackPartitions?: number; + slicePartitions?: number; + subdivisions?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: EllipsoidOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipsoidOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: EllipsoidOutlineGeometry): EllipsoidOutlineGeometry; + /** + * Computes the geometric representation of an outline of an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipsoidGeometry - A description of the ellipsoid outline. + * @returns The computed vertices and indices. + */ + static createGeometry(ellipsoidGeometry: EllipsoidOutlineGeometry): Geometry | undefined; +} + +/** + * Initializes a rhumb line on the ellipsoid connecting the two provided planetodetic points. + * @param [start] - The initial planetodetic point on the path. + * @param [end] - The final planetodetic point on the path. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the rhumb line lies. + */ +export class EllipsoidRhumbLine { + constructor(start?: Cartographic, end?: Cartographic, ellipsoid?: Ellipsoid); + /** + * Gets the ellipsoid. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets the surface distance between the start and end point + */ + readonly surfaceDistance: number; + /** + * Gets the initial planetodetic point on the path. + */ + readonly start: Cartographic; + /** + * Gets the final planetodetic point on the path. + */ + readonly end: Cartographic; + /** + * Gets the heading from the start point to the end point. + */ + readonly heading: number; + /** + * Create a rhumb line using an initial position with a heading and distance. + * @param start - The initial planetodetic point on the path. + * @param heading - The heading in radians. + * @param distance - The rhumb line distance between the start and end point. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the rhumb line lies. + * @param [result] - The object in which to store the result. + * @returns The EllipsoidRhumbLine object. + */ + static fromStartHeadingDistance(start: Cartographic, heading: number, distance: number, ellipsoid?: Ellipsoid, result?: EllipsoidRhumbLine): EllipsoidRhumbLine; + /** + * Sets the start and end points of the rhumb line. + * @param start - The initial planetodetic point on the path. + * @param end - The final planetodetic point on the path. + */ + setEndPoints(start: Cartographic, end: Cartographic): void; + /** + * Provides the location of a point at the indicated portion along the rhumb line. + * @param fraction - The portion of the distance between the initial and final points. + * @param [result] - The object in which to store the result. + * @returns The location of the point along the rhumb line. + */ + interpolateUsingFraction(fraction: number, result?: Cartographic): Cartographic; + /** + * Provides the location of a point at the indicated distance along the rhumb line. + * @param distance - The distance from the inital point to the point of interest along the rhumbLine. + * @param [result] - The object in which to store the result. + * @returns The location of the point along the rhumb line. + */ + interpolateUsingSurfaceDistance(distance: number, result?: Cartographic): Cartographic; + /** + * Provides the location of a point at the indicated longitude along the rhumb line. + * If the longitude is outside the range of start and end points, the first intersection with the longitude from the start point in the direction of the heading is returned. This follows the spiral property of a rhumb line. + * @param intersectionLongitude - The longitude, in radians, at which to find the intersection point from the starting point using the heading. + * @param [result] - The object in which to store the result. + * @returns The location of the intersection point along the rhumb line, undefined if there is no intersection or infinite intersections. + */ + findIntersectionWithLongitude(intersectionLongitude: number, result?: Cartographic): Cartographic; + /** + * Provides the location of a point at the indicated latitude along the rhumb line. + * If the latitude is outside the range of start and end points, the first intersection with the latitude from that start point in the direction of the heading is returned. This follows the spiral property of a rhumb line. + * @param intersectionLatitude - The latitude, in radians, at which to find the intersection point from the starting point using the heading. + * @param [result] - The object in which to store the result. + * @returns The location of the intersection point along the rhumb line, undefined if there is no intersection or infinite intersections. + */ + findIntersectionWithLatitude(intersectionLatitude: number, result?: Cartographic): Cartographic; +} + +/** + * A plane tangent to the provided ellipsoid at the provided origin. + * If origin is not on the surface of the ellipsoid, it's surface projection will be used. + * If origin is at the center of the ellipsoid, an exception will be thrown. + * @param origin - The point on the surface of the ellipsoid where the tangent plane touches. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid to use. + */ +export class EllipsoidTangentPlane { + constructor(origin: Cartesian3, ellipsoid?: Ellipsoid); + /** + * Gets the ellipsoid. + */ + ellipsoid: Ellipsoid; + /** + * Gets the origin. + */ + origin: Cartesian3; + /** + * Gets the plane which is tangent to the ellipsoid. + */ + readonly plane: Plane; + /** + * Gets the local X-axis (east) of the tangent plane. + */ + readonly xAxis: Cartesian3; + /** + * Gets the local Y-axis (north) of the tangent plane. + */ + readonly yAxis: Cartesian3; + /** + * Gets the local Z-axis (up) of the tangent plane. + */ + readonly zAxis: Cartesian3; + /** + * Creates a new instance from the provided ellipsoid and the center + * point of the provided Cartesians. + * @param cartesians - The list of positions surrounding the center point. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid to use. + */ + static fromPoints(cartesians: Cartesian3[], ellipsoid?: Ellipsoid): void; + /** + * Computes the projection of the provided 3D position onto the 2D plane, radially outward from the {@link EllipsoidTangentPlane.ellipsoid} coordinate system origin. + * @param cartesian - The point to project. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if none was provided. Undefined if there is no intersection point + */ + projectPointOntoPlane(cartesian: Cartesian3, result?: Cartesian2): Cartesian2; + /** + * Computes the projection of the provided 3D positions onto the 2D plane (where possible), radially outward from the global origin. + * The resulting array may be shorter than the input array - if a single projection is impossible it will not be included. + * @param cartesians - The array of points to project. + * @param [result] - The array of Cartesian2 instances onto which to store results. + * @returns The modified result parameter or a new array of Cartesian2 instances if none was provided. + */ + projectPointsOntoPlane(cartesians: Cartesian3[], result?: Cartesian2[]): Cartesian2[]; + /** + * Computes the projection of the provided 3D position onto the 2D plane, along the plane normal. + * @param cartesian - The point to project. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if none was provided. + */ + projectPointToNearestOnPlane(cartesian: Cartesian3, result?: Cartesian2): Cartesian2; + /** + * Computes the projection of the provided 3D positions onto the 2D plane, along the plane normal. + * @param cartesians - The array of points to project. + * @param [result] - The array of Cartesian2 instances onto which to store results. + * @returns The modified result parameter or a new array of Cartesian2 instances if none was provided. This will have the same length as cartesians. + */ + projectPointsToNearestOnPlane(cartesians: Cartesian3[], result?: Cartesian2[]): Cartesian2[]; + /** + * Computes the projection of the provided 2D position onto the 3D ellipsoid. + * @param cartesian - The points to project. + * @param [result] - The Cartesian3 instance to store result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + projectPointOntoEllipsoid(cartesian: Cartesian2, result?: Cartesian3): Cartesian3; + /** + * Computes the projection of the provided 2D positions onto the 3D ellipsoid. + * @param cartesians - The array of points to project. + * @param [result] - The array of Cartesian3 instances onto which to store results. + * @returns The modified result parameter or a new array of Cartesian3 instances if none was provided. + */ + projectPointsOntoEllipsoid(cartesians: Cartesian2[], result?: Cartesian3[]): Cartesian3[]; +} + +/** + * A very simple {@link TerrainProvider} that produces geometry by tessellating an ellipsoidal + * surface. + * @param [options] - Object with the following properties: + * @param [options.tilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link GeographicTilingScheme} + * is used. + * @param [options.ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + */ +export class EllipsoidTerrainProvider { + constructor(options?: { + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + }); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. This function should not be called before {@link EllipsoidTerrainProvider#ready} returns true. + */ + credit: Credit; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link EllipsoidTerrainProvider#ready} returns true. + */ + tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. This function should not be + * called before {@link EllipsoidTerrainProvider#ready} returns true. + */ + hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * This function should not be called before {@link EllipsoidTerrainProvider#ready} returns true. + */ + hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This function should not be called before + * {@link TerrainProvider#ready} returns true. This property may be undefined if availability + * information is not available. + */ + availability: TileAvailability; + /** + * Requests the geometry for a given tile. This function should not be called before + * {@link TerrainProvider#ready} returns true. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable(x: number, y: number, level: number): boolean; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined | Promise; +} + +/** + * A generic utility class for managing subscribers for a particular event. + * This class is usually instantiated inside of a container class and + * exposed as a property for others to subscribe to. + * @example + * MyObject.prototype.myListener = function(arg1, arg2) { + * this.myArg1Copy = arg1; + * this.myArg2Copy = arg2; + * } + * + * var myObjectInstance = new MyObject(); + * var evt = new Cesium.Event(); + * evt.addEventListener(MyObject.prototype.myListener, myObjectInstance); + * evt.raiseEvent('1', '2'); + * evt.removeEventListener(MyObject.prototype.myListener); + */ +export class Event { + constructor(); + /** + * The number of listeners currently subscribed to the event. + */ + readonly numberOfListeners: number; + /** + * Registers a callback function to be executed whenever the event is raised. + * An optional scope can be provided to serve as the this pointer + * in which the function will execute. + * @param listener - The function to be executed when the event is raised. + * @param [scope] - An optional object scope to serve as the this + * pointer in which the listener function will execute. + * @returns A function that will remove this event listener when invoked. + */ + addEventListener(listener: (...params: any[]) => any, scope?: any): Event.RemoveCallback; + /** + * Unregisters a previously registered callback. + * @param listener - The function to be unregistered. + * @param [scope] - The scope that was originally passed to addEventListener. + * @returns true if the listener was removed; false if the listener and scope are not registered with the event. + */ + removeEventListener(listener: (...params: any[]) => any, scope?: any): boolean; + /** + * Raises the event by calling each registered listener with all supplied arguments. + * @param arguments - This method takes any number of parameters and passes them through to the listener functions. + */ + raiseEvent(...arguments: any[]): void; +} + +export namespace Event { + /** + * A function that removes a listener. + */ + type RemoveCallback = () => void; +} + +/** + * A convenience object that simplifies the common pattern of attaching event listeners + * to several events, then removing all those listeners at once later, for example, in + * a destroy method. + * @example + * var helper = new Cesium.EventHelper(); + * + * helper.add(someObject.event, listener1, this); + * helper.add(otherObject.event, listener2, this); + * + * // later... + * helper.removeAll(); + */ +export class EventHelper { + constructor(); + /** + * Adds a listener to an event, and records the registration to be cleaned up later. + * @param event - The event to attach to. + * @param listener - The function to be executed when the event is raised. + * @param [scope] - An optional object scope to serve as the this + * pointer in which the listener function will execute. + * @returns A function that will remove this event listener when invoked. + */ + add(event: Event, listener: (...params: any[]) => any, scope?: any): EventHelper.RemoveCallback; + /** + * Unregisters all previously added listeners. + */ + removeAll(): void; +} + +export namespace EventHelper { + /** + * A function that removes a listener. + */ + type RemoveCallback = () => void; +} + +/** + * Constants to determine how an interpolated value is extrapolated + * when querying outside the bounds of available data. + */ +export enum ExtrapolationType { + /** + * No extrapolation occurs. + */ + NONE = 0, + /** + * The first or last value is used when outside the range of sample data. + */ + HOLD = 1, + /** + * The value is extrapolated. + */ + EXTRAPOLATE = 2 +} + +/** + * A set of functions to detect whether the current browser supports + * various features. + */ +export namespace FeatureDetection { + /** + * Detects whether the current browser supports the full screen standard. + * @returns true if the browser supports the full screen standard, false if not. + */ + function supportsFullscreen(): boolean; + /** + * Detects whether the current browser supports typed arrays. + * @returns true if the browser supports typed arrays, false if not. + */ + function supportsTypedArrays(): boolean; + /** + * Detects whether the current browser supports Web Workers. + * @returns true if the browsers supports Web Workers, false if not. + */ + function supportsWebWorkers(): boolean; + /** + * Detects whether the current browser supports Web Assembly. + * @returns true if the browsers supports Web Assembly, false if not. + */ + function supportsWebAssembly(): boolean; +} + +/** + * Describes a frustum at the given the origin and orientation. + * @param options - Object with the following properties: + * @param options.frustum - The frustum. + * @param options.origin - The origin of the frustum. + * @param options.orientation - The orientation of the frustum. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class FrustumGeometry { + constructor(options: { + frustum: PerspectiveFrustum | OrthographicFrustum; + origin: Cartesian3; + orientation: Quaternion; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: FrustumGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack(array: number[], startingIndex?: number, result?: FrustumGeometry): void; + /** + * Computes the geometric representation of a frustum, including its vertices, indices, and a bounding sphere. + * @param frustumGeometry - A description of the frustum. + * @returns The computed vertices and indices. + */ + static createGeometry(frustumGeometry: FrustumGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a frustum with the given the origin and orientation. + * @param options - Object with the following properties: + * @param options.frustum - The frustum. + * @param options.origin - The origin of the frustum. + * @param options.orientation - The orientation of the frustum. + */ +export class FrustumOutlineGeometry { + constructor(options: { + frustum: PerspectiveFrustum | OrthographicFrustum; + origin: Cartesian3; + orientation: Quaternion; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: FrustumOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack(array: number[], startingIndex?: number, result?: FrustumOutlineGeometry): void; + /** + * Computes the geometric representation of a frustum outline, including its vertices, indices, and a bounding sphere. + * @param frustumGeometry - A description of the frustum. + * @returns The computed vertices and indices. + */ + static createGeometry(frustumGeometry: FrustumOutlineGeometry): Geometry | undefined; +} + +/** + * Browser-independent functions for working with the standard fullscreen API. + */ +export namespace Fullscreen { + /** + * The element that is currently fullscreen, if any. To simply check if the + * browser is in fullscreen mode or not, use {@link Fullscreen#fullscreen}. + */ + const element: any; + /** + * The name of the event on the document that is fired when fullscreen is + * entered or exited. This event name is intended for use with addEventListener. + * In your event handler, to determine if the browser is in fullscreen mode or not, + * use {@link Fullscreen#fullscreen}. + */ + const changeEventName: string; + /** + * The name of the event that is fired when a fullscreen error + * occurs. This event name is intended for use with addEventListener. + */ + const errorEventName: string; + /** + * Determine whether the browser will allow an element to be made fullscreen, or not. + * For example, by default, iframes cannot go fullscreen unless the containing page + * adds an "allowfullscreen" attribute (or prefixed equivalent). + */ + const enabled: boolean; + /** + * Determines if the browser is currently in fullscreen mode. + */ + const fullscreen: boolean; + /** + * Detects whether the browser supports the standard fullscreen API. + * @returns true if the browser supports the standard fullscreen API, + * false otherwise. + */ + function supportsFullscreen(): boolean; + /** + * Asynchronously requests the browser to enter fullscreen mode on the given element. + * If fullscreen mode is not supported by the browser, does nothing. + * @example + * // Put the entire page into fullscreen. + * Cesium.Fullscreen.requestFullscreen(document.body) + * + * // Place only the Cesium canvas into fullscreen. + * Cesium.Fullscreen.requestFullscreen(scene.canvas) + * @param element - The HTML element which will be placed into fullscreen mode. + * @param [vrDevice] - The HMDVRDevice device. + */ + function requestFullscreen(element: any, vrDevice?: any): void; + /** + * Asynchronously exits fullscreen mode. If the browser is not currently + * in fullscreen, or if fullscreen mode is not supported by the browser, does nothing. + */ + function exitFullscreen(): void; +} + +/** + * The type of geocoding to be performed by a {@link GeocoderService}. + */ +export enum GeocodeType { + /** + * Perform a search where the input is considered complete. + */ + SEARCH = 0, + /** + * Perform an auto-complete using partial input, typically + * reserved for providing possible results as a user is typing. + */ + AUTOCOMPLETE = 1 +} + +export namespace GeocoderService { + /** + * @property displayName - The display name for a location + * @property destination - The bounding box for a location + */ + type Result = { + displayName: string; + destination: Rectangle | Cartesian3; + }; +} + +/** + * Provides geocoding through an external service. This type describes an interface and + * is not intended to be used. + */ +export class GeocoderService { + constructor(); + /** + * @param query - The query to be sent to the geocoder service + * @param [type = GeocodeType.SEARCH] - The type of geocode to perform. + */ + geocode(query: string, type?: GeocodeType): Promise; +} + +/** + * A simple map projection where longitude and latitude are linearly mapped to X and Y by multiplying + * them by the {@link Ellipsoid#maximumRadius}. This projection + * is commonly known as geographic, equirectangular, equidistant cylindrical, or plate carrée. It + * is also known as EPSG:4326. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid. + */ +export class GeographicProjection { + constructor(ellipsoid?: Ellipsoid); + /** + * Gets the {@link Ellipsoid}. + */ + readonly ellipsoid: Ellipsoid; + /** + * Projects a set of {@link Cartographic} coordinates, in radians, to map coordinates, in meters. + * X and Y are the longitude and latitude, respectively, multiplied by the maximum radius of the + * ellipsoid. Z is the unmodified height. + * @param cartographic - The coordinates to project. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The projected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + project(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Unprojects a set of projected {@link Cartesian3} coordinates, in meters, to {@link Cartographic} + * coordinates, in radians. Longitude and Latitude are the X and Y coordinates, respectively, + * divided by the maximum radius of the ellipsoid. Height is the unmodified Z coordinate. + * @param cartesian - The Cartesian position to unproject with height (z) in meters. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The unprojected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic; +} + +/** + * A tiling scheme for geometry referenced to a simple {@link GeographicProjection} where + * longitude and latitude are directly mapped to X and Y. This projection is commonly + * known as geographic, equirectangular, equidistant cylindrical, or plate carrée. + * @param [options] - Object with the following properties: + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose surface is being tiled. Defaults to + * the WGS84 ellipsoid. + * @param [options.rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the tiling scheme. + * @param [options.numberOfLevelZeroTilesX = 2] - The number of tiles in the X direction at level zero of + * the tile tree. + * @param [options.numberOfLevelZeroTilesY = 1] - The number of tiles in the Y direction at level zero of + * the tile tree. + */ +export class GeographicTilingScheme { + constructor(options?: { + ellipsoid?: Ellipsoid; + rectangle?: Rectangle; + numberOfLevelZeroTilesX?: number; + numberOfLevelZeroTilesY?: number; + }); + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + */ + ellipsoid: Ellipsoid; + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + */ + rectangle: Rectangle; + /** + * Gets the map projection used by this tiling scheme. + */ + projection: MapProjection; + /** + * Gets the total number of tiles in the X direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the X direction at the given level. + */ + getNumberOfXTilesAtLevel(level: number): number; + /** + * Gets the total number of tiles in the Y direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the Y direction at the given level. + */ + getNumberOfYTilesAtLevel(level: number): number; + /** + * Transforms a rectangle specified in geodetic radians to the native coordinate system + * of this tiling scheme. + * @param rectangle - The rectangle to transform. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the native rectangle if 'result' + * is undefined. + */ + rectangleToNativeRectangle(rectangle: Rectangle, result?: Rectangle): Rectangle; + /** + * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates + * of the tiling scheme. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToNativeRectangle(x: number, y: number, level: number, result?: any): Rectangle; + /** + * Converts tile x, y coordinates and level to a cartographic rectangle in radians. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToRectangle(x: number, y: number, level: number, result?: any): Rectangle; + /** + * Calculates the tile x, y coordinates of the tile containing + * a given cartographic position. + * @param position - The position. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the tile x, y coordinates + * if 'result' is undefined. + */ + positionToTileXY(position: Cartographic, level: number, result?: Cartesian2): Cartesian2; +} + +/** + * A geometry representation with attributes forming vertices and optional index data + * defining primitives. Geometries and an {@link Appearance}, which describes the shading, + * can be assigned to a {@link Primitive} for visualization. A Primitive can + * be created from many heterogeneous - in many cases - geometries for performance. + *

    + * Geometries can be transformed and optimized using functions in {@link GeometryPipeline}. + *

    + * @example + * // Create geometry with a position attribute and indexed lines. + * var positions = new Float64Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]); + * + * var geometry = new Cesium.Geometry({ + * attributes : { + * position : new Cesium.GeometryAttribute({ + * componentDatatype : Cesium.ComponentDatatype.DOUBLE, + * componentsPerAttribute : 3, + * values : positions + * }) + * }, + * indices : new Uint16Array([0, 1, 1, 2, 2, 0]), + * primitiveType : Cesium.PrimitiveType.LINES, + * boundingSphere : Cesium.BoundingSphere.fromVertices(positions) + * }); + * @param options - Object with the following properties: + * @param options.attributes - Attributes, which make up the geometry's vertices. + * @param [options.primitiveType = PrimitiveType.TRIANGLES] - The type of primitives in the geometry. + * @param [options.indices] - Optional index data that determines the primitives in the geometry. + * @param [options.boundingSphere] - An optional bounding sphere that fully enclosed the geometry. + */ +export class Geometry { + constructor(options: { + attributes: GeometryAttributes; + primitiveType?: PrimitiveType; + indices?: Uint16Array | Uint32Array; + boundingSphere?: BoundingSphere; + }); + /** + * Attributes, which make up the geometry's vertices. Each property in this object corresponds to a + * {@link GeometryAttribute} containing the attribute's data. + *

    + * Attributes are always stored non-interleaved in a Geometry. + *

    + *

    + * There are reserved attribute names with well-known semantics. The following attributes + * are created by a Geometry (depending on the provided {@link VertexFormat}. + *

      + *
    • position - 3D vertex position. 64-bit floating-point (for precision). 3 components per attribute. See {@link VertexFormat#position}.
    • + *
    • normal - Normal (normalized), commonly used for lighting. 32-bit floating-point. 3 components per attribute. See {@link VertexFormat#normal}.
    • + *
    • st - 2D texture coordinate. 32-bit floating-point. 2 components per attribute. See {@link VertexFormat#st}.
    • + *
    • bitangent - Bitangent (normalized), used for tangent-space effects like bump mapping. 32-bit floating-point. 3 components per attribute. See {@link VertexFormat#bitangent}.
    • + *
    • tangent - Tangent (normalized), used for tangent-space effects like bump mapping. 32-bit floating-point. 3 components per attribute. See {@link VertexFormat#tangent}.
    • + *
    + *

    + *

    + * The following attribute names are generally not created by a Geometry, but are added + * to a Geometry by a {@link Primitive} or {@link GeometryPipeline} functions to prepare + * the geometry for rendering. + *

      + *
    • position3DHigh - High 32 bits for encoded 64-bit position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
    • + *
    • position3DLow - Low 32 bits for encoded 64-bit position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
    • + *
    • position3DHigh - High 32 bits for encoded 64-bit 2D (Columbus view) position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
    • + *
    • position2DLow - Low 32 bits for encoded 64-bit 2D (Columbus view) position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
    • + *
    • color - RGBA color (normalized) usually from {@link GeometryInstance#color}. 32-bit floating-point. 4 components per attribute.
    • + *
    • pickColor - RGBA color used for picking. 32-bit floating-point. 4 components per attribute.
    • + *
    + *

    + * @example + * geometry.attributes.position = new Cesium.GeometryAttribute({ + * componentDatatype : Cesium.ComponentDatatype.FLOAT, + * componentsPerAttribute : 3, + * values : new Float32Array(0) + * }); + */ + attributes: GeometryAttributes; + /** + * Optional index data that - along with {@link Geometry#primitiveType} - + * determines the primitives in the geometry. + */ + indices: any[]; + /** + * The type of primitives in the geometry. This is most often {@link PrimitiveType.TRIANGLES}, + * but can varying based on the specific geometry. + */ + primitiveType: PrimitiveType; + /** + * An optional bounding sphere that fully encloses the geometry. This is + * commonly used for culling. + */ + boundingSphere: BoundingSphere; + /** + * Computes the number of vertices in a geometry. The runtime is linear with + * respect to the number of attributes in a vertex, not the number of vertices. + * @example + * var numVertices = Cesium.Geometry.computeNumberOfVertices(geometry); + * @param geometry - The geometry. + * @returns The number of vertices in the geometry. + */ + static computeNumberOfVertices(geometry: Geometry): number; +} + +/** + * Values and type information for geometry attributes. A {@link Geometry} + * generally contains one or more attributes. All attributes together form + * the geometry's vertices. + * @example + * var geometry = new Cesium.Geometry({ + * attributes : { + * position : new Cesium.GeometryAttribute({ + * componentDatatype : Cesium.ComponentDatatype.FLOAT, + * componentsPerAttribute : 3, + * values : new Float32Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]) + * }) + * }, + * primitiveType : Cesium.PrimitiveType.LINE_LOOP + * }); + * @param [options] - Object with the following properties: + * @param [options.componentDatatype] - The datatype of each component in the attribute, e.g., individual elements in values. + * @param [options.componentsPerAttribute] - A number between 1 and 4 that defines the number of components in an attributes. + * @param [options.normalize = false] - When true and componentDatatype is an integer format, indicate that the components should be mapped to the range [0, 1] (unsigned) or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * @param [options.values] - The values for the attributes stored in a typed array. + */ +export class GeometryAttribute { + constructor(options?: { + componentDatatype?: ComponentDatatype; + componentsPerAttribute?: number; + normalize?: boolean; + values?: number[] | Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; + }); + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link GeometryAttribute#values}. + */ + componentDatatype: ComponentDatatype; + /** + * A number between 1 and 4 that defines the number of components in an attributes. + * For example, a position attribute with x, y, and z components would have 3 as + * shown in the code example. + * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.FLOAT; + * attribute.componentsPerAttribute = 3; + * attribute.values = new Float32Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]); + */ + componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + *

    + * This is commonly used when storing colors using {@link ComponentDatatype.UNSIGNED_BYTE}. + *

    + * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.UNSIGNED_BYTE; + * attribute.componentsPerAttribute = 4; + * attribute.normalize = true; + * attribute.values = new Uint8Array([ + * Cesium.Color.floatToByte(color.red), + * Cesium.Color.floatToByte(color.green), + * Cesium.Color.floatToByte(color.blue), + * Cesium.Color.floatToByte(color.alpha) + * ]); + */ + normalize: boolean; + /** + * The values for the attributes stored in a typed array. In the code example, + * every three elements in values defines one attributes since + * componentsPerAttribute is 3. + * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.FLOAT; + * attribute.componentsPerAttribute = 3; + * attribute.values = new Float32Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]); + */ + values: number[] | Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; +} + +/** + * Attributes, which make up a geometry's vertices. Each property in this object corresponds to a + * {@link GeometryAttribute} containing the attribute's data. + *

    + * Attributes are always stored non-interleaved in a Geometry. + *

    + */ +export class GeometryAttributes { + constructor(); + /** + * The 3D position attribute. + *

    + * 64-bit floating-point (for precision). 3 components per attribute. + *

    + */ + position: GeometryAttribute; + /** + * The normal attribute (normalized), which is commonly used for lighting. + *

    + * 32-bit floating-point. 3 components per attribute. + *

    + */ + normal: GeometryAttribute; + /** + * The 2D texture coordinate attribute. + *

    + * 32-bit floating-point. 2 components per attribute + *

    + */ + st: GeometryAttribute; + /** + * The bitangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

    + * 32-bit floating-point. 3 components per attribute. + *

    + */ + bitangent: GeometryAttribute; + /** + * The tangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

    + * 32-bit floating-point. 3 components per attribute. + *

    + */ + tangent: GeometryAttribute; + /** + * The color attribute. + *

    + * 8-bit unsigned integer. 4 components per attribute. + *

    + */ + color: GeometryAttribute; +} + +/** + * Base class for all geometry creation utility classes that can be passed to {@link GeometryInstance} + * for asynchronous geometry creation. + */ +export class GeometryFactory { + constructor(); + /** + * Returns a geometry. + * @param geometryFactory - A description of the circle. + * @returns The computed vertices and indices. + */ + static createGeometry(geometryFactory: GeometryFactory): Geometry | undefined; +} + +/** + * Geometry instancing allows one {@link Geometry} object to be positions in several + * different locations and colored uniquely. For example, one {@link BoxGeometry} can + * be instanced several times, each with a different modelMatrix to change + * its position, rotation, and scale. + * @example + * // Create geometry for a box, and two instances that refer to it. + * // One instance positions the box on the bottom and colored aqua. + * // The other instance positions the box on the top and color white. + * var geometry = Cesium.BoxGeometry.fromDimensions({ + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL, + * dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0) + * }); + * var instanceBottom = new Cesium.GeometryInstance({ + * geometry : geometry, + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * }, + * id : 'bottom' + * }); + * var instanceTop = new Cesium.GeometryInstance({ + * geometry : geometry, + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 3000000.0), new Cesium.Matrix4()), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * }, + * id : 'top' + * }); + * @param options - Object with the following properties: + * @param options.geometry - The geometry to instance. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The model matrix that transforms to transform the geometry from model to world coordinates. + * @param [options.id] - A user-defined object to return when the instance is picked with {@link Scene#pick} or get/set per-instance attributes with {@link Primitive#getGeometryInstanceAttributes}. + * @param [options.attributes] - Per-instance attributes like a show or color attribute shown in the example below. + */ +export class GeometryInstance { + constructor(options: { + geometry: Geometry | GeometryFactory; + modelMatrix?: Matrix4; + id?: any; + attributes?: any; + }); + /** + * The geometry being instanced. + */ + geometry: Geometry; + /** + * The 4x4 transformation matrix that transforms the geometry from model to world coordinates. + * When this is the identity matrix, the geometry is drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + */ + modelMatrix: Matrix4; + /** + * User-defined object returned when the instance is picked or used to get/set per-instance attributes. + */ + id: any; + /** + * Per-instance attributes like {@link ColorGeometryInstanceAttribute} or {@link ShowGeometryInstanceAttribute}. + * {@link Geometry} attributes varying per vertex; these attributes are constant for the entire instance. + */ + attributes: any; +} + +/** + * Values and type information for per-instance geometry attributes. + * @example + * var instance = new Cesium.GeometryInstance({ + * geometry : Cesium.BoxGeometry.fromDimensions({ + * dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(0.0, 0.0)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * color : new Cesium.GeometryInstanceAttribute({ + * componentDatatype : Cesium.ComponentDatatype.UNSIGNED_BYTE, + * componentsPerAttribute : 4, + * normalize : true, + * value : [255, 255, 0, 255] + * }) + * } + * }); + * @param options - Object with the following properties: + * @param options.componentDatatype - The datatype of each component in the attribute, e.g., individual elements in values. + * @param options.componentsPerAttribute - A number between 1 and 4 that defines the number of components in an attributes. + * @param [options.normalize = false] - When true and componentDatatype is an integer format, indicate that the components should be mapped to the range [0, 1] (unsigned) or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * @param options.value - The value for the attribute. + */ +export class GeometryInstanceAttribute { + constructor(options: { + componentDatatype: ComponentDatatype; + componentsPerAttribute: number; + normalize?: boolean; + value: number[]; + }); + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link GeometryInstanceAttribute#value}. + */ + componentDatatype: ComponentDatatype; + /** + * A number between 1 and 4 that defines the number of components in an attributes. + * For example, a position attribute with x, y, and z components would have 3 as + * shown in the code example. + * @example + * show : new Cesium.GeometryInstanceAttribute({ + * componentDatatype : Cesium.ComponentDatatype.UNSIGNED_BYTE, + * componentsPerAttribute : 1, + * normalize : true, + * value : [1.0] + * }) + */ + componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + *

    + * This is commonly used when storing colors using {@link ComponentDatatype.UNSIGNED_BYTE}. + *

    + * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.UNSIGNED_BYTE; + * attribute.componentsPerAttribute = 4; + * attribute.normalize = true; + * attribute.value = [ + * Cesium.Color.floatToByte(color.red), + * Cesium.Color.floatToByte(color.green), + * Cesium.Color.floatToByte(color.blue), + * Cesium.Color.floatToByte(color.alpha) + * ]; + */ + normalize: boolean; + /** + * The values for the attributes stored in a typed array. In the code example, + * every three elements in values defines one attributes since + * componentsPerAttribute is 3. + * @example + * show : new Cesium.GeometryInstanceAttribute({ + * componentDatatype : Cesium.ComponentDatatype.UNSIGNED_BYTE, + * componentsPerAttribute : 1, + * normalize : true, + * value : [1.0] + * }) + */ + value: number[]; +} + +/** + * Content pipeline functions for geometries. + */ +export namespace GeometryPipeline { + /** + * Converts a geometry's triangle indices to line indices. If the geometry has an indices + * and its primitiveType is TRIANGLES, TRIANGLE_STRIP, + * TRIANGLE_FAN, it is converted to LINES; otherwise, the geometry is not changed. + *

    + * This is commonly used to create a wireframe geometry for visual debugging. + *

    + * @example + * geometry = Cesium.GeometryPipeline.toWireframe(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument, with its triangle indices converted to lines. + */ + function toWireframe(geometry: Geometry): Geometry; + /** + * Creates a new {@link Geometry} with LINES representing the provided + * attribute (attributeName) for the provided geometry. This is used to + * visualize vector attributes like normals, tangents, and bitangents. + * @example + * var geometry = Cesium.GeometryPipeline.createLineSegmentsForVectors(instance.geometry, 'bitangent', 100000.0); + * @param geometry - The Geometry instance with the attribute. + * @param [attributeName = 'normal'] - The name of the attribute. + * @param [length = 10000.0] - The length of each line segment in meters. This can be negative to point the vector in the opposite direction. + * @returns A new Geometry instance with line segments for the vector. + */ + function createLineSegmentsForVectors(geometry: Geometry, attributeName?: string, length?: number): Geometry; + /** + * Creates an object that maps attribute names to unique locations (indices) + * for matching vertex attributes and shader programs. + * @example + * var attributeLocations = Cesium.GeometryPipeline.createAttributeLocations(geometry); + * // Example output + * // { + * // 'position' : 0, + * // 'normal' : 1 + * // } + * @param geometry - The geometry, which is not modified, to create the object for. + * @returns An object with attribute name / index pairs. + */ + function createAttributeLocations(geometry: Geometry): any; + /** + * Reorders a geometry's attributes and indices to achieve better performance from the GPU's pre-vertex-shader cache. + * @example + * geometry = Cesium.GeometryPipeline.reorderForPreVertexCache(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument, with its attributes and indices reordered for the GPU's pre-vertex-shader cache. + */ + function reorderForPreVertexCache(geometry: Geometry): Geometry; + /** + * Reorders a geometry's indices to achieve better performance from the GPU's + * post vertex-shader cache by using the Tipsify algorithm. If the geometry primitiveType + * is not TRIANGLES or the geometry does not have an indices, this function has no effect. + * @example + * geometry = Cesium.GeometryPipeline.reorderForPostVertexCache(geometry); + * @param geometry - The geometry to modify. + * @param [cacheCapacity = 24] - The number of vertices that can be held in the GPU's vertex cache. + * @returns The modified geometry argument, with its indices reordered for the post-vertex-shader cache. + */ + function reorderForPostVertexCache(geometry: Geometry, cacheCapacity?: number): Geometry; + /** + * Splits a geometry into multiple geometries, if necessary, to ensure that indices in the + * indices fit into unsigned shorts. This is used to meet the WebGL requirements + * when unsigned int indices are not supported. + *

    + * If the geometry does not have any indices, this function has no effect. + *

    + * @example + * var geometries = Cesium.GeometryPipeline.fitToUnsignedShortIndices(geometry); + * @param geometry - The geometry to be split into multiple geometries. + * @returns An array of geometries, each with indices that fit into unsigned shorts. + */ + function fitToUnsignedShortIndices(geometry: Geometry): Geometry[]; + /** + * Projects a geometry's 3D position attribute to 2D, replacing the position + * attribute with separate position3D and position2D attributes. + *

    + * If the geometry does not have a position, this function has no effect. + *

    + * @example + * geometry = Cesium.GeometryPipeline.projectTo2D(geometry, 'position', 'position3D', 'position2D'); + * @param geometry - The geometry to modify. + * @param attributeName - The name of the attribute. + * @param attributeName3D - The name of the attribute in 3D. + * @param attributeName2D - The name of the attribute in 2D. + * @param [projection = new GeographicProjection()] - The projection to use. + * @returns The modified geometry argument with position3D and position2D attributes. + */ + function projectTo2D(geometry: Geometry, attributeName: string, attributeName3D: string, attributeName2D: string, projection?: any): Geometry; + /** + * Encodes floating-point geometry attribute values as two separate attributes to improve + * rendering precision. + *

    + * This is commonly used to create high-precision position vertex attributes. + *

    + * @example + * geometry = Cesium.GeometryPipeline.encodeAttribute(geometry, 'position3D', 'position3DHigh', 'position3DLow'); + * @param geometry - The geometry to modify. + * @param attributeName - The name of the attribute. + * @param attributeHighName - The name of the attribute for the encoded high bits. + * @param attributeLowName - The name of the attribute for the encoded low bits. + * @returns The modified geometry argument, with its encoded attribute. + */ + function encodeAttribute(geometry: Geometry, attributeName: string, attributeHighName: string, attributeLowName: string): Geometry; + /** + * Transforms a geometry instance to world coordinates. This changes + * the instance's modelMatrix to {@link Matrix4.IDENTITY} and transforms the + * following attributes if they are present: position, normal, + * tangent, and bitangent. + * @example + * Cesium.GeometryPipeline.transformToWorldCoordinates(instance); + * @param instance - The geometry instance to modify. + * @returns The modified instance argument, with its attributes transforms to world coordinates. + */ + function transformToWorldCoordinates(instance: GeometryInstance): GeometryInstance; + /** + * Computes per-vertex normals for a geometry containing TRIANGLES by averaging the normals of + * all triangles incident to the vertex. The result is a new normal attribute added to the geometry. + * This assumes a counter-clockwise winding order. + * @example + * Cesium.GeometryPipeline.computeNormal(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument with the computed normal attribute. + */ + function computeNormal(geometry: Geometry): Geometry; + /** + * Computes per-vertex tangents and bitangents for a geometry containing TRIANGLES. + * The result is new tangent and bitangent attributes added to the geometry. + * This assumes a counter-clockwise winding order. + *

    + * Based on Computing Tangent Space Basis Vectors + * for an Arbitrary Mesh by Eric Lengyel. + *

    + * @example + * Cesium.GeometryPipeline.computeTangentAndBiTangent(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument with the computed tangent and bitangent attributes. + */ + function computeTangentAndBitangent(geometry: Geometry): Geometry; + /** + * Compresses and packs geometry normal attribute values to save memory. + * @example + * geometry = Cesium.GeometryPipeline.compressVertices(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument, with its normals compressed and packed. + */ + function compressVertices(geometry: Geometry): Geometry; +} + +/** + * Provides metadata using the Google Earth Enterprise REST API. This is used by the GoogleEarthEnterpriseImageryProvider + * and GoogleEarthEnterpriseTerrainProvider to share metadata requests. + * @param resourceOrUrl - The url of the Google Earth Enterprise server hosting the imagery + */ +export class GoogleEarthEnterpriseMetadata { + constructor(resourceOrUrl: Resource | string); + /** + * True if imagery is available. + */ + imageryPresent: boolean; + /** + * True if imagery is sent as a protocol buffer, false if sent as plain images. If undefined we will try both. + */ + protoImagery: boolean; + /** + * True if terrain is available. + */ + terrainPresent: boolean; + /** + * Exponent used to compute constant to calculate negative height values. + */ + negativeAltitudeExponentBias: number; + /** + * Threshold where any numbers smaller are actually negative values. They are multiplied by -2^negativeAltitudeExponentBias. + */ + negativeAltitudeThreshold: number; + /** + * Dictionary of provider id to copyright strings. + */ + providers: any; + /** + * Key used to decode packets + */ + key: ArrayBuffer; + /** + * Gets the name of the Google Earth Enterprise server. + */ + readonly url: string; + /** + * Gets the proxy used for metadata requests. + */ + readonly proxy: Proxy; + /** + * Gets the resource used for metadata requests. + */ + readonly resource: Resource; + /** + * Gets a promise that resolves to true when the metadata is ready for use. + */ + readonly readyPromise: Promise; + /** + * Converts a tiles (x, y, level) position into a quadkey used to request an image + * from a Google Earth Enterprise server. + * @param x - The tile's x coordinate. + * @param y - The tile's y coordinate. + * @param level - The tile's zoom level. + */ + static tileXYToQuadKey(x: number, y: number, level: number): void; + /** + * Converts a tile's quadkey used to request an image from a Google Earth Enterprise server into the + * (x, y, level) position. + * @param quadkey - The tile's quad key + */ + static quadKeyToTileXY(quadkey: string): void; +} + +/** + * Terrain data for a single tile from a Google Earth Enterprise server. + * @example + * var buffer = ... + * var childTileMask = ... + * var terrainData = new Cesium.GoogleEarthEnterpriseTerrainData({ + * buffer : heightBuffer, + * childTileMask : childTileMask + * }); + * @param options - Object with the following properties: + * @param options.buffer - The buffer containing terrain data. + * @param options.negativeAltitudeExponentBias - Multiplier for negative terrain heights that are encoded as very small positive values. + * @param options.negativeElevationThreshold - Threshold for negative values + * @param [options.childTileMask = 15] - A bit mask indicating which of this tile's four children exist. + * If a child's bit is set, geometry will be requested for that tile as well when it + * is needed. If the bit is cleared, the child tile is not requested and geometry is + * instead upsampled from the parent. The bit values are as follows: + * + * + * + * + * + * + *
    Bit PositionBit ValueChild Tile
    01Southwest
    12Southeast
    24Northeast
    38Northwest
    + * @param [options.createdByUpsampling = false] - True if this instance was created by upsampling another instance; + * otherwise, false. + * @param [options.credits] - Array of credits for this tile. + */ +export class GoogleEarthEnterpriseTerrainData { + constructor(options: { + buffer: ArrayBuffer; + negativeAltitudeExponentBias: number; + negativeElevationThreshold: number; + childTileMask?: number; + createdByUpsampling?: boolean; + credits?: Credit[]; + }); + /** + * An array of credits for this tile + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. If the position + * is outside the rectangle, this method will extrapolate the height, which is likely to be wildly + * incorrect for positions far outside the rectangle. + */ + interpolateHeight(rectangle: Rectangle, longitude: number, latitude: number): number; + /** + * Upsamples this terrain data for use by a descendant tile. The resulting instance will contain a subset of the + * height samples in this instance, interpolated if necessary. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled heightmap terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample(tilingScheme: TilingScheme, thisX: number, thisY: number, thisLevel: number, descendantX: number, descendantY: number, descendantLevel: number): Promise | undefined; + /** + * Determines if a given child tile is available, based on the + * {@link HeightmapTerrainData.childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable(thisX: number, thisY: number, childX: number, childY: number): boolean; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link HeightmapTerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; +} + +/** + * Provides tiled terrain using the Google Earth Enterprise REST API. + * @example + * var geeMetadata = new GoogleEarthEnterpriseMetadata('http://www.earthenterprise.org/3d'); + * var gee = new Cesium.GoogleEarthEnterpriseTerrainProvider({ + * metadata : geeMetadata + * }); + * @param options - Object with the following properties: + * @param options.url - The url of the Google Earth Enterprise server hosting the imagery. + * @param options.metadata - A metadata object that can be used to share metadata requests with a GoogleEarthEnterpriseImageryProvider. + * @param [options.ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + */ +export class GoogleEarthEnterpriseTerrainProvider { + constructor(options: { + url: Resource | string; + metadata: GoogleEarthEnterpriseMetadata; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }); + /** + * Gets the name of the Google Earth Enterprise server url hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link GoogleEarthEnterpriseTerrainProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. This function should not be called before {@link GoogleEarthEnterpriseTerrainProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. This function should not be + * called before {@link GoogleEarthEnterpriseTerrainProvider#ready} returns true. + */ + hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * This function should not be called before {@link GoogleEarthEnterpriseTerrainProvider#ready} returns true. + */ + hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This function should not be called before + * {@link GoogleEarthEnterpriseTerrainProvider#ready} returns true. This property may be undefined if availability + * information is not available. + */ + availability: TileAvailability; + /** + * Requests the geometry for a given tile. This function should not be called before + * {@link GoogleEarthEnterpriseTerrainProvider#ready} returns true. The result must include terrain data and + * may optionally include a water mask and an indication of which child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable(x: number, y: number, level: number): boolean; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined | Promise; +} + +/** + * Represents a Gregorian date in a more precise format than the JavaScript Date object. + * In addition to submillisecond precision, this object can also represent leap seconds. + * @param [year] - The year as a whole number. + * @param [month] - The month as a whole number with range [1, 12]. + * @param [day] - The day of the month as a whole number starting at 1. + * @param [hour] - The hour as a whole number with range [0, 23]. + * @param [minute] - The minute of the hour as a whole number with range [0, 59]. + * @param [second] - The second of the minute as a whole number with range [0, 60], with 60 representing a leap second. + * @param [millisecond] - The millisecond of the second as a floating point number with range [0.0, 1000.0). + * @param [isLeapSecond] - Whether this time is during a leap second. + */ +export class GregorianDate { + constructor(year?: number, month?: number, day?: number, hour?: number, minute?: number, second?: number, millisecond?: number, isLeapSecond?: boolean); + /** + * Gets or sets the year as a whole number. + */ + year: number; + /** + * Gets or sets the month as a whole number with range [1, 12]. + */ + month: number; + /** + * Gets or sets the day of the month as a whole number starting at 1. + */ + day: number; + /** + * Gets or sets the hour as a whole number with range [0, 23]. + */ + hour: number; + /** + * Gets or sets the minute of the hour as a whole number with range [0, 59]. + */ + minute: number; + /** + * Gets or sets the second of the minute as a whole number with range [0, 60], with 60 representing a leap second. + */ + second: number; + /** + * Gets or sets the millisecond of the second as a floating point number with range [0.0, 1000.0). + */ + millisecond: number; + /** + * Gets or sets whether this time is during a leap second. + */ + isLeapSecond: boolean; +} + +/** + * A description of a polyline on terrain or 3D Tiles. Only to be used with {@link GroundPolylinePrimitive}. + * @example + * var positions = Cesium.Cartesian3.fromDegreesArray([ + * -112.1340164450331, 36.05494287836128, + * -112.08821010582645, 36.097804071380715, + * -112.13296079730024, 36.168769146801104 + * ]); + * + * var geometry = new Cesium.GroundPolylineGeometry({ + * positions : positions + * }); + * @param options - Options with the following properties: + * @param options.positions - An array of {@link Cartesian3} defining the polyline's points. Heights above the ellipsoid will be ignored. + * @param [options.width = 1.0] - The screen space width in pixels. + * @param [options.granularity = 9999.0] - The distance interval in meters used for interpolating options.points. Defaults to 9999.0 meters. Zero indicates no interpolation. + * @param [options.loop = false] - Whether during geometry creation a line segment will be added between the last and first line positions to make this Polyline a loop. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ +export class GroundPolylineGeometry { + constructor(options: { + positions: Cartesian3[]; + width?: number; + granularity?: number; + loop?: boolean; + arcType?: ArcType; + }); + /** + * The screen space width in pixels. + */ + width: number; + /** + * The distance interval used for interpolating options.points. Zero indicates no interpolation. + * Default of 9999.0 allows centimeter accuracy with 32 bit floating point. + */ + granularity: boolean; + /** + * Whether during geometry creation a line segment will be added between the last and first line positions to make this Polyline a loop. + * If the geometry has two positions this parameter will be ignored. + */ + loop: boolean; + /** + * The type of path the polyline must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ + arcType: ArcType; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PolygonGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack(array: number[], startingIndex?: number, result?: PolygonGeometry): void; +} + +/** + * Defines a heading angle, pitch angle, and range in a local frame. + * Heading is the rotation from the local north direction where a positive angle is increasing eastward. + * Pitch is the rotation from the local xy-plane. Positive pitch angles are above the plane. Negative pitch + * angles are below the plane. Range is the distance from the center of the frame. + * @param [heading = 0.0] - The heading angle in radians. + * @param [pitch = 0.0] - The pitch angle in radians. + * @param [range = 0.0] - The distance from the center in meters. + */ +export class HeadingPitchRange { + constructor(heading?: number, pitch?: number, range?: number); + /** + * Heading is the rotation from the local north direction where a positive angle is increasing eastward. + */ + heading: number; + /** + * Pitch is the rotation from the local xy-plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. + */ + pitch: number; + /** + * Range is the distance from the center of the local frame. + */ + range: number; + /** + * Duplicates a HeadingPitchRange instance. + * @param hpr - The HeadingPitchRange to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRange instance if one was not provided. (Returns undefined if hpr is undefined) + */ + static clone(hpr: HeadingPitchRange, result?: HeadingPitchRange): HeadingPitchRange; +} + +/** + * A rotation expressed as a heading, pitch, and roll. Heading is the rotation about the + * negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about + * the positive x axis. + * @param [heading = 0.0] - The heading component in radians. + * @param [pitch = 0.0] - The pitch component in radians. + * @param [roll = 0.0] - The roll component in radians. + */ +export class HeadingPitchRoll { + constructor(heading?: number, pitch?: number, roll?: number); + /** + * Gets or sets the heading. + */ + heading: number; + /** + * Gets or sets the pitch. + */ + pitch: number; + /** + * Gets or sets the roll. + */ + roll: number; + /** + * Computes the heading, pitch and roll from a quaternion (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles ) + * @param quaternion - The quaternion from which to retrieve heading, pitch, and roll, all expressed in radians. + * @param [result] - The object in which to store the result. If not provided, a new instance is created and returned. + * @returns The modified result parameter or a new HeadingPitchRoll instance if one was not provided. + */ + static fromQuaternion(quaternion: Quaternion, result?: HeadingPitchRoll): HeadingPitchRoll; + /** + * Returns a new HeadingPitchRoll instance from angles given in degrees. + * @param heading - the heading in degrees + * @param pitch - the pitch in degrees + * @param roll - the heading in degrees + * @param [result] - The object in which to store the result. If not provided, a new instance is created and returned. + * @returns A new HeadingPitchRoll instance + */ + static fromDegrees(heading: number, pitch: number, roll: number, result?: HeadingPitchRoll): HeadingPitchRoll; + /** + * Duplicates a HeadingPitchRoll instance. + * @param headingPitchRoll - The HeadingPitchRoll to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRoll instance if one was not provided. (Returns undefined if headingPitchRoll is undefined) + */ + static clone(headingPitchRoll: HeadingPitchRoll, result?: HeadingPitchRoll): HeadingPitchRoll; + /** + * Compares the provided HeadingPitchRolls componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first HeadingPitchRoll. + * @param [right] - The second HeadingPitchRoll. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: HeadingPitchRoll, right?: HeadingPitchRoll): boolean; + /** + * Compares the provided HeadingPitchRolls componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first HeadingPitchRoll. + * @param [right] - The second HeadingPitchRoll. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: HeadingPitchRoll, right?: HeadingPitchRoll, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Duplicates this HeadingPitchRoll instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRoll instance if one was not provided. + */ + clone(result?: HeadingPitchRoll): HeadingPitchRoll; + /** + * Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side HeadingPitchRoll. + * @returns true if they are equal, false otherwise. + */ + equals(right?: HeadingPitchRoll): boolean; + /** + * Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side HeadingPitchRoll. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: HeadingPitchRoll, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Creates a string representing this HeadingPitchRoll in the format '(heading, pitch, roll)' in radians. + * @returns A string representing the provided HeadingPitchRoll in the format '(heading, pitch, roll)'. + */ + toString(): string; +} + +/** + * The encoding that is used for a heightmap + */ +export enum HeightmapEncoding { + /** + * No encoding + */ + NONE = 0, + /** + * LERC encoding + */ + LERC = 1 +} + +/** + * Terrain data for a single tile where the terrain data is represented as a heightmap. A heightmap + * is a rectangular array of heights in row-major order from north to south and west to east. + * @example + * var buffer = ... + * var heightBuffer = new Uint16Array(buffer, 0, that._heightmapWidth * that._heightmapWidth); + * var childTileMask = new Uint8Array(buffer, heightBuffer.byteLength, 1)[0]; + * var waterMask = new Uint8Array(buffer, heightBuffer.byteLength + 1, buffer.byteLength - heightBuffer.byteLength - 1); + * var terrainData = new Cesium.HeightmapTerrainData({ + * buffer : heightBuffer, + * width : 65, + * height : 65, + * childTileMask : childTileMask, + * waterMask : waterMask + * }); + * @param options - Object with the following properties: + * @param options.buffer - The buffer containing height data. + * @param options.width - The width (longitude direction) of the heightmap, in samples. + * @param options.height - The height (latitude direction) of the heightmap, in samples. + * @param [options.childTileMask = 15] - A bit mask indicating which of this tile's four children exist. + * If a child's bit is set, geometry will be requested for that tile as well when it + * is needed. If the bit is cleared, the child tile is not requested and geometry is + * instead upsampled from the parent. The bit values are as follows: + * + * + * + * + * + * + *
    Bit PositionBit ValueChild Tile
    01Southwest
    12Southeast
    24Northwest
    38Northeast
    + * @param [options.waterMask] - The water mask included in this terrain data, if any. A water mask is a square + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + * @param [options.structure] - An object describing the structure of the height data. + * @param [options.structure.heightScale = 1.0] - The factor by which to multiply height samples in order to obtain + * the height above the heightOffset, in meters. The heightOffset is added to the resulting + * height after multiplying by the scale. + * @param [options.structure.heightOffset = 0.0] - The offset to add to the scaled height to obtain the final + * height in meters. The offset is added after the height sample is multiplied by the + * heightScale. + * @param [options.structure.elementsPerHeight = 1] - The number of elements in the buffer that make up a single height + * sample. This is usually 1, indicating that each element is a separate height sample. If + * it is greater than 1, that number of elements together form the height sample, which is + * computed according to the structure.elementMultiplier and structure.isBigEndian properties. + * @param [options.structure.stride = 1] - The number of elements to skip to get from the first element of + * one height to the first element of the next height. + * @param [options.structure.elementMultiplier = 256.0] - The multiplier used to compute the height value when the + * stride property is greater than 1. For example, if the stride is 4 and the strideMultiplier + * is 256, the height is computed as follows: + * `height = buffer[index] + buffer[index + 1] * 256 + buffer[index + 2] * 256 * 256 + buffer[index + 3] * 256 * 256 * 256` + * This is assuming that the isBigEndian property is false. If it is true, the order of the + * elements is reversed. + * @param [options.structure.isBigEndian = false] - Indicates endianness of the elements in the buffer when the + * stride property is greater than 1. If this property is false, the first element is the + * low-order element. If it is true, the first element is the high-order element. + * @param [options.structure.lowestEncodedHeight] - The lowest value that can be stored in the height buffer. Any heights that are lower + * than this value after encoding with the `heightScale` and `heightOffset` are clamped to this value. For example, if the height + * buffer is a `Uint16Array`, this value should be 0 because a `Uint16Array` cannot store negative numbers. If this parameter is + * not specified, no minimum value is enforced. + * @param [options.structure.highestEncodedHeight] - The highest value that can be stored in the height buffer. Any heights that are higher + * than this value after encoding with the `heightScale` and `heightOffset` are clamped to this value. For example, if the height + * buffer is a `Uint16Array`, this value should be `256 * 256 - 1` or 65535 because a `Uint16Array` cannot store numbers larger + * than 65535. If this parameter is not specified, no maximum value is enforced. + * @param [options.encoding = HeightmapEncoding.NONE] - The encoding that is used on the buffer. + * @param [options.createdByUpsampling = false] - True if this instance was created by upsampling another instance; + * otherwise, false. + */ +export class HeightmapTerrainData { + constructor(options: { + buffer: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; + width: number; + height: number; + childTileMask?: number; + waterMask?: Uint8Array; + structure?: { + heightScale?: number; + heightOffset?: number; + elementsPerHeight?: number; + stride?: number; + elementMultiplier?: number; + isBigEndian?: boolean; + lowestEncodedHeight?: number; + highestEncodedHeight?: number; + }; + encoding?: HeightmapEncoding; + createdByUpsampling?: boolean; + }); + /** + * An array of credits for this tile. + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a square + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. If the position + * is outside the rectangle, this method will extrapolate the height, which is likely to be wildly + * incorrect for positions far outside the rectangle. + */ + interpolateHeight(rectangle: Rectangle, longitude: number, latitude: number): number; + /** + * Upsamples this terrain data for use by a descendant tile. The resulting instance will contain a subset of the + * height samples in this instance, interpolated if necessary. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled heightmap terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample(tilingScheme: TilingScheme, thisX: number, thisY: number, thisLevel: number, descendantX: number, descendantY: number, descendantLevel: number): Promise | undefined; + /** + * Determines if a given child tile is available, based on the + * {@link HeightmapTerrainData.childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable(thisX: number, thisY: number, childX: number, childY: number): boolean; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link HeightmapTerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; +} + +/** + * An {@link InterpolationAlgorithm} for performing Hermite interpolation. + */ +export namespace HermitePolynomialApproximation { + /** + * Given the desired degree, returns the number of data points required for interpolation. + * @param degree - The desired degree of interpolation. + * @param [inputOrder = 0] - The order of the inputs (0 means just the data, 1 means the data and its derivative, etc). + * @returns The number of required data points needed for the desired degree of interpolation. + */ + function getRequiredDataPoints(degree: number, inputOrder?: number): number; + /** + * Interpolates values using Hermite Polynomial Approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero(x: number, xTable: number[], yTable: number[], yStride: number, result?: number[]): number[]; + /** + * Interpolates values using Hermite Polynomial Approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param inputOrder - The number of derivatives supplied for input. + * @param outputOrder - The number of derivatives desired for output. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolate(x: number, xTable: number[], yTable: number[], yStride: number, inputOrder: number, outputOrder: number, result?: number[]): number[]; +} + +/** + * A Hermite spline is a cubic interpolating spline. Points, incoming tangents, outgoing tangents, and times + * must be defined for each control point. The outgoing tangents are defined for points [0, n - 2] and the incoming + * tangents are defined for points [1, n - 1]. For example, when interpolating a segment of the curve between points[i] and + * points[i + 1], the tangents at the points will be outTangents[i] and inTangents[i], + * respectively. + * @example + * // Create a G1 continuous Hermite spline + * var times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * var spline = new Cesium.HermiteSpline({ + * times : times, + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ], + * outTangents : [ + * new Cesium.Cartesian3(1125196, -161816, 270551), + * new Cesium.Cartesian3(-996690.5, -365906.5, 184028.5), + * new Cesium.Cartesian3(-2096917, 48379.5, -292683.5), + * new Cesium.Cartesian3(-890902.5, 408999.5, -447115) + * ], + * inTangents : [ + * new Cesium.Cartesian3(-1993381, -731813, 368057), + * new Cesium.Cartesian3(-4193834, 96759, -585367), + * new Cesium.Cartesian3(-1781805, 817999, -894230), + * new Cesium.Cartesian3(1165345, 112641, 47281) + * ] + * }); + * + * var p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of {@link Cartesian3} control points. + * @param options.inTangents - The array of {@link Cartesian3} incoming tangents at each control point. + * @param options.outTangents - The array of {@link Cartesian3} outgoing tangents at each control point. + */ +export class HermiteSpline { + constructor(options: { + times: number[]; + points: Cartesian3[]; + inTangents: Cartesian3[]; + outTangents: Cartesian3[]; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Cartesian3} control points. + */ + readonly points: Cartesian3[]; + /** + * An array of {@link Cartesian3} incoming tangents at each control point. + */ + readonly inTangents: Cartesian3[]; + /** + * An array of {@link Cartesian3} outgoing tangents at each control point. + */ + readonly outTangents: Cartesian3[]; + /** + * Creates a spline where the tangents at each control point are the same. + * The curves are guaranteed to be at least in the class C1. + * @example + * var points = [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ]; + * + * // Add tangents + * var tangents = new Array(points.length); + * tangents[0] = new Cesium.Cartesian3(1125196, -161816, 270551); + * var temp = new Cesium.Cartesian3(); + * for (var i = 1; i < tangents.length - 1; ++i) { + * tangents[i] = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.subtract(points[i + 1], points[i - 1], temp), 0.5, new Cesium.Cartesian3()); + * } + * tangents[tangents.length - 1] = new Cesium.Cartesian3(1165345, 112641, 47281); + * + * var spline = Cesium.HermiteSpline.createC1({ + * times : times, + * points : points, + * tangents : tangents + * }); + * @param options - Object with the following properties: + * @param options.times - The array of control point times. + * @param options.points - The array of control points. + * @param options.tangents - The array of tangents at the control points. + * @returns A hermite spline. + */ + static createC1(options: { + times: number[]; + points: Cartesian3[]; + tangents: Cartesian3[]; + }): HermiteSpline; + /** + * Creates a natural cubic spline. The tangents at the control points are generated + * to create a curve in the class C2. + * @example + * // Create a natural cubic spline above the earth from Philadelphia to Los Angeles. + * var spline = Cesium.HermiteSpline.createNaturalCubic({ + * times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ], + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * @param options - Object with the following properties: + * @param options.times - The array of control point times. + * @param options.points - The array of control points. + * @returns A hermite spline or a linear spline if less than 3 control points were given. + */ + static createNaturalCubic(options: { + times: number[]; + points: Cartesian3[]; + }): HermiteSpline | LinearSpline; + /** + * Creates a clamped cubic spline. The tangents at the interior control points are generated + * to create a curve in the class C2. + * @example + * // Create a clamped cubic spline above the earth from Philadelphia to Los Angeles. + * var spline = Cesium.HermiteSpline.createClampedCubic({ + * times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ], + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ], + * firstTangent : new Cesium.Cartesian3(1125196, -161816, 270551), + * lastTangent : new Cesium.Cartesian3(1165345, 112641, 47281) + * }); + * @param options - Object with the following properties: + * @param options.times - The array of control point times. + * @param options.points - The array of control points. + * @param options.firstTangent - The outgoing tangent of the first control point. + * @param options.lastTangent - The incoming tangent of the last control point. + * @returns A hermite spline or a linear spline if less than 3 control points were given. + */ + static createClampedCubic(options: { + times: number[]; + points: Cartesian3[]; + firstTangent: Cartesian3; + lastTangent: Cartesian3; + }): HermiteSpline | LinearSpline; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3): Cartesian3; +} + +/** + * Constants for WebGL index datatypes. These corresponds to the + * type parameter of {@link http://www.khronos.org/opengles/sdk/docs/man/xhtml/glDrawElements.xml|drawElements}. + */ +export enum IndexDatatype { + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + */ + UNSIGNED_BYTE = WebGLConstants.UNSIGNED_BYTE, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + */ + UNSIGNED_SHORT = WebGLConstants.UNSIGNED_SHORT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + */ + UNSIGNED_INT = WebGLConstants.UNSIGNED_INT +} + +export namespace InterpolationAlgorithm { + /** + * Gets the name of this interpolation algorithm. + */ + var type: string; + /** + * Given the desired degree, returns the number of data points required for interpolation. + * @param degree - The desired degree of interpolation. + * @returns The number of required data points needed for the desired degree of interpolation. + */ + function getRequiredDataPoints(degree: number): number; + /** + * Performs zero order interpolation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero(x: number, xTable: number[], yTable: number[], yStride: number, result?: number[]): number[]; + /** + * Performs higher order interpolation. Not all interpolators need to support high-order interpolation, + * if this function remains undefined on implementing objects, interpolateOrderZero will be used instead. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param inputOrder - The number of derivatives supplied for input. + * @param outputOrder - The number of derivatives desired for output. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolate(x: number, xTable: number[], yTable: number[], yStride: number, inputOrder: number, outputOrder: number, result?: number[]): number[]; +} + +/** + * The interface for interpolation algorithms. + */ +export interface InterpolationAlgorithm { +} + +/** + * This enumerated type is used in determining where, relative to the frustum, an + * object is located. The object can either be fully contained within the frustum (INSIDE), + * partially inside the frustum and partially outside (INTERSECTING), or somewhere entirely + * outside of the frustum's 6 planes (OUTSIDE). + */ +export enum Intersect { + /** + * Represents that an object is not contained within the frustum. + */ + OUTSIDE = -1, + /** + * Represents that an object intersects one of the frustum's planes. + */ + INTERSECTING = 0, + /** + * Represents that an object is fully within the frustum. + */ + INSIDE = 1 +} + +/** + * Functions for computing the intersection between geometries such as rays, planes, triangles, and ellipsoids. + */ +export namespace IntersectionTests { + /** + * Computes the intersection of a ray and a plane. + * @param ray - The ray. + * @param plane - The plane. + * @param [result] - The object onto which to store the result. + * @returns The intersection point or undefined if there is no intersections. + */ + function rayPlane(ray: Ray, plane: Plane, result?: Cartesian3): Cartesian3; + /** + * Computes the intersection of a ray and a triangle as a parametric distance along the input ray. The result is negative when the triangle is behind the ray. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * @param ray - The ray. + * @param p0 - The first vertex of the triangle. + * @param p1 - The second vertex of the triangle. + * @param p2 - The third vertex of the triangle. + * @param [cullBackFaces = false] - If true, will only compute an intersection with the front face of the triangle + * and return undefined for intersections with the back face. + * @returns The intersection as a parametric distance along the ray, or undefined if there is no intersection. + */ + function rayTriangleParametric(ray: Ray, p0: Cartesian3, p1: Cartesian3, p2: Cartesian3, cullBackFaces?: boolean): number; + /** + * Computes the intersection of a ray and a triangle as a Cartesian3 coordinate. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * @param ray - The ray. + * @param p0 - The first vertex of the triangle. + * @param p1 - The second vertex of the triangle. + * @param p2 - The third vertex of the triangle. + * @param [cullBackFaces = false] - If true, will only compute an intersection with the front face of the triangle + * and return undefined for intersections with the back face. + * @param [result] - The Cartesian3 onto which to store the result. + * @returns The intersection point or undefined if there is no intersections. + */ + function rayTriangle(ray: Ray, p0: Cartesian3, p1: Cartesian3, p2: Cartesian3, cullBackFaces?: boolean, result?: Cartesian3): Cartesian3; + /** + * Computes the intersection of a line segment and a triangle. + * @param v0 - The an end point of the line segment. + * @param v1 - The other end point of the line segment. + * @param p0 - The first vertex of the triangle. + * @param p1 - The second vertex of the triangle. + * @param p2 - The third vertex of the triangle. + * @param [cullBackFaces = false] - If true, will only compute an intersection with the front face of the triangle + * and return undefined for intersections with the back face. + * @param [result] - The Cartesian3 onto which to store the result. + * @returns The intersection point or undefined if there is no intersections. + */ + function lineSegmentTriangle(v0: Cartesian3, v1: Cartesian3, p0: Cartesian3, p1: Cartesian3, p2: Cartesian3, cullBackFaces?: boolean, result?: Cartesian3): Cartesian3; + /** + * Computes the intersection points of a ray with a sphere. + * @param ray - The ray. + * @param sphere - The sphere. + * @param [result] - The result onto which to store the result. + * @returns The interval containing scalar points along the ray or undefined if there are no intersections. + */ + function raySphere(ray: Ray, sphere: BoundingSphere, result?: Interval): Interval; + /** + * Computes the intersection points of a line segment with a sphere. + * @param p0 - An end point of the line segment. + * @param p1 - The other end point of the line segment. + * @param sphere - The sphere. + * @param [result] - The result onto which to store the result. + * @returns The interval containing scalar points along the ray or undefined if there are no intersections. + */ + function lineSegmentSphere(p0: Cartesian3, p1: Cartesian3, sphere: BoundingSphere, result?: Interval): Interval; + /** + * Computes the intersection points of a ray with an ellipsoid. + * @param ray - The ray. + * @param ellipsoid - The ellipsoid. + * @returns The interval containing scalar points along the ray or undefined if there are no intersections. + */ + function rayEllipsoid(ray: Ray, ellipsoid: Ellipsoid): Interval; + /** + * Provides the point along the ray which is nearest to the ellipsoid. + * @param ray - The ray. + * @param ellipsoid - The ellipsoid. + * @returns The nearest planetodetic point on the ray. + */ + function grazingAltitudeLocation(ray: Ray, ellipsoid: Ellipsoid): Cartesian3; + /** + * Computes the intersection of a line segment and a plane. + * @example + * var origin = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * var normal = ellipsoid.geodeticSurfaceNormal(origin); + * var plane = Cesium.Plane.fromPointNormal(origin, normal); + * + * var p0 = new Cesium.Cartesian3(...); + * var p1 = new Cesium.Cartesian3(...); + * + * // find the intersection of the line segment from p0 to p1 and the tangent plane at origin. + * var intersection = Cesium.IntersectionTests.lineSegmentPlane(p0, p1, plane); + * @param endPoint0 - An end point of the line segment. + * @param endPoint1 - The other end point of the line segment. + * @param plane - The plane. + * @param [result] - The object onto which to store the result. + * @returns The intersection point or undefined if there is no intersection. + */ + function lineSegmentPlane(endPoint0: Cartesian3, endPoint1: Cartesian3, plane: Plane, result?: Cartesian3): Cartesian3; + /** + * Computes the intersection of a triangle and a plane + * @example + * var origin = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * var normal = ellipsoid.geodeticSurfaceNormal(origin); + * var plane = Cesium.Plane.fromPointNormal(origin, normal); + * + * var p0 = new Cesium.Cartesian3(...); + * var p1 = new Cesium.Cartesian3(...); + * var p2 = new Cesium.Cartesian3(...); + * + * // convert the triangle composed of points (p0, p1, p2) to three triangles that don't cross the plane + * var triangles = Cesium.IntersectionTests.trianglePlaneIntersection(p0, p1, p2, plane); + * @param p0 - First point of the triangle + * @param p1 - Second point of the triangle + * @param p2 - Third point of the triangle + * @param plane - Intersection plane + * @returns An object with properties positions and indices, which are arrays that represent three triangles that do not cross the plane. (Undefined if no intersection exists) + */ + function trianglePlaneIntersection(p0: Cartesian3, p1: Cartesian3, p2: Cartesian3, plane: Plane): any; +} + +/** + * Contains functions for operating on 2D triangles. + */ +export namespace Intersections2D { + /** + * Splits a 2D triangle at given axis-aligned threshold value and returns the resulting + * polygon on a given side of the threshold. The resulting polygon may have 0, 1, 2, + * 3, or 4 vertices. + * @example + * var result = Cesium.Intersections2D.clipTriangleAtAxisAlignedThreshold(0.5, false, 0.2, 0.6, 0.4); + * // result === [2, 0, -1, 1, 0, 0.25, -1, 1, 2, 0.5] + * @param threshold - The threshold coordinate value at which to clip the triangle. + * @param keepAbove - true to keep the portion of the triangle above the threshold, or false + * to keep the portion below. + * @param u0 - The coordinate of the first vertex in the triangle, in counter-clockwise order. + * @param u1 - The coordinate of the second vertex in the triangle, in counter-clockwise order. + * @param u2 - The coordinate of the third vertex in the triangle, in counter-clockwise order. + * @param [result] - The array into which to copy the result. If this parameter is not supplied, + * a new array is constructed and returned. + * @returns The polygon that results after the clip, specified as a list of + * vertices. The vertices are specified in counter-clockwise order. + * Each vertex is either an index from the existing list (identified as + * a 0, 1, or 2) or -1 indicating a new vertex not in the original triangle. + * For new vertices, the -1 is followed by three additional numbers: the + * index of each of the two original vertices forming the line segment that + * the new vertex lies on, and the fraction of the distance from the first + * vertex to the second one. + */ + function clipTriangleAtAxisAlignedThreshold(threshold: number, keepAbove: boolean, u0: number, u1: number, u2: number, result?: number[]): number[]; + /** + * Compute the barycentric coordinates of a 2D position within a 2D triangle. + * @example + * var result = Cesium.Intersections2D.computeBarycentricCoordinates(0.0, 0.0, 0.0, 1.0, -1, -0.5, 1, -0.5); + * // result === new Cesium.Cartesian3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0); + * @param x - The x coordinate of the position for which to find the barycentric coordinates. + * @param y - The y coordinate of the position for which to find the barycentric coordinates. + * @param x1 - The x coordinate of the triangle's first vertex. + * @param y1 - The y coordinate of the triangle's first vertex. + * @param x2 - The x coordinate of the triangle's second vertex. + * @param y2 - The y coordinate of the triangle's second vertex. + * @param x3 - The x coordinate of the triangle's third vertex. + * @param y3 - The y coordinate of the triangle's third vertex. + * @param [result] - The instance into to which to copy the result. If this parameter + * is undefined, a new instance is created and returned. + * @returns The barycentric coordinates of the position within the triangle. + */ + function computeBarycentricCoordinates(x: number, y: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, result?: Cartesian3): Cartesian3; + /** + * Compute the intersection between 2 line segments + * @example + * var result = Cesium.Intersections2D.computeLineSegmentLineSegmentIntersection(0.0, 0.0, 0.0, 2.0, -1, 1, 1, 1); + * // result === new Cesium.Cartesian2(0.0, 1.0); + * @param x00 - The x coordinate of the first line's first vertex. + * @param y00 - The y coordinate of the first line's first vertex. + * @param x01 - The x coordinate of the first line's second vertex. + * @param y01 - The y coordinate of the first line's second vertex. + * @param x10 - The x coordinate of the second line's first vertex. + * @param y10 - The y coordinate of the second line's first vertex. + * @param x11 - The x coordinate of the second line's second vertex. + * @param y11 - The y coordinate of the second line's second vertex. + * @param [result] - The instance into to which to copy the result. If this parameter + * is undefined, a new instance is created and returned. + * @returns The intersection point, undefined if there is no intersection point or lines are coincident. + */ + function computeLineSegmentLineSegmentIntersection(x00: number, y00: number, x01: number, y01: number, x10: number, y10: number, x11: number, y11: number, result?: Cartesian2): Cartesian2; +} + +/** + * Represents the closed interval [start, stop]. + * @param [start = 0.0] - The beginning of the interval. + * @param [stop = 0.0] - The end of the interval. + */ +export class Interval { + constructor(start?: number, stop?: number); + /** + * The beginning of the interval. + */ + start: number; + /** + * The end of the interval. + */ + stop: number; +} + +/** + * Default settings for accessing the Cesium ion API. + * + * An ion access token is only required if you are using any ion related APIs. + * A default access token is provided for evaluation purposes only. + * Sign up for a free ion account and get your own access token at {@link https://cesium.com} + */ +export namespace Ion { + /** + * Gets or sets the default Cesium ion access token. + */ + var defaultAccessToken: string; + /** + * Gets or sets the default Cesium ion server. + */ + var defaultServer: string | Resource; +} + +/** + * Provides geocoding through Cesium ion. + * @param options - Object with the following properties: + * @param options.scene - The scene + * @param [options.accessToken = Ion.defaultAccessToken] - The access token to use. + * @param [options.server = Ion.defaultServer] - The resource to the Cesium ion API server. + */ +export class IonGeocoderService { + constructor(options: { + scene: Scene; + accessToken?: string; + server?: string | Resource; + }); + /** + * @param query - The query to be sent to the geocoder service + * @param [type = GeocodeType.SEARCH] - The type of geocode to perform. + */ + geocode(query: string, type?: GeocodeType): Promise; +} + +/** + * A {@link Resource} instance that encapsulates Cesium ion asset access. + * This object is normally not instantiated directly, use {@link IonResource.fromAssetId}. + * @param endpoint - The result of the Cesium ion asset endpoint service. + * @param endpointResource - The resource used to retreive the endpoint. + */ +export class IonResource extends Resource { + constructor(endpoint: any, endpointResource: Resource); + /** + * Asynchronously creates an instance. + * @example + * //Load a Cesium3DTileset with asset ID of 124624234 + * viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: Cesium.IonResource.fromAssetId(124624234) })); + * @example + * //Load a CZML file with asset ID of 10890 + * Cesium.IonResource.fromAssetId(10890) + * .then(function (resource) { + * viewer.dataSources.add(Cesium.CzmlDataSource.load(resource)); + * }); + * @param assetId - The Cesium ion asset id. + * @param [options] - An object with the following properties: + * @param [options.accessToken = Ion.defaultAccessToken] - The access token to use. + * @param [options.server = Ion.defaultServer] - The resource to the Cesium ion API server. + * @returns A Promise to am instance representing the Cesium ion Asset. + */ + static fromAssetId(assetId: number, options?: { + accessToken?: string; + server?: string | Resource; + }): Promise; + /** + * Gets the credits required for attribution of the asset. + */ + readonly credits: Credit[]; + /** + * Duplicates a Resource instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Resource instance if one was not provided. + */ + clone(result?: Resource): Resource; + /** + * Asynchronously loads the given image resource. Returns a promise that will resolve to + * an {@link https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap|ImageBitmap} if preferImageBitmap is true and the browser supports createImageBitmap or otherwise an + * {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement|Image} once loaded, or reject if the image failed to load. + * @example + * // load a single image asynchronously + * resource.fetchImage().then(function(image) { + * // use the loaded image + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * // load several images in parallel + * when.all([resource1.fetchImage(), resource2.fetchImage()]).then(function(images) { + * // images is an array containing all the loaded images + * }); + * @param [options] - An object with the following properties. + * @param [options.preferBlob = false] - If true, we will load the image via a blob. + * @param [options.preferImageBitmap = false] - If true, image will be decoded during fetch and an ImageBitmap is returned. + * @param [options.flipY = false] - If true, image will be vertically flipped during decode. Only applies if the browser supports createImageBitmap. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchImage(options?: { + preferBlob?: boolean; + preferImageBitmap?: boolean; + flipY?: boolean; + }): Promise | Promise | undefined; +} + +/** + * Constants related to ISO8601 support. + */ +export namespace Iso8601 { + /** + * A {@link JulianDate} representing the earliest time representable by an ISO8601 date. + * This is equivalent to the date string '0000-01-01T00:00:00Z' + */ + const MINIMUM_VALUE: JulianDate; + /** + * A {@link JulianDate} representing the latest time representable by an ISO8601 date. + * This is equivalent to the date string '9999-12-31T24:00:00Z' + */ + const MAXIMUM_VALUE: JulianDate; + /** + * A {@link TimeInterval} representing the largest interval representable by an ISO8601 interval. + * This is equivalent to the interval string '0000-01-01T00:00:00Z/9999-12-31T24:00:00Z' + */ + const MAXIMUM_INTERVAL: JulianDate; +} + +/** + * Represents an astronomical Julian date, which is the number of days since noon on January 1, -4712 (4713 BC). + * For increased precision, this class stores the whole number part of the date and the seconds + * part of the date in separate components. In order to be safe for arithmetic and represent + * leap seconds, the date is always stored in the International Atomic Time standard + * {@link TimeStandard.TAI}. + * @param [julianDayNumber = 0.0] - The Julian Day Number representing the number of whole days. Fractional days will also be handled correctly. + * @param [secondsOfDay = 0.0] - The number of seconds into the current Julian Day Number. Fractional seconds, negative seconds and seconds greater than a day will be handled correctly. + * @param [timeStandard = TimeStandard.UTC] - The time standard in which the first two parameters are defined. + */ +export class JulianDate { + constructor(julianDayNumber?: number, secondsOfDay?: number, timeStandard?: TimeStandard); + /** + * Gets or sets the number of whole days. + */ + dayNumber: number; + /** + * Gets or sets the number of seconds into the current day. + */ + secondsOfDay: number; + /** + * Creates a new instance from a GregorianDate. + * @param date - A GregorianDate. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromGregorianDate(date: GregorianDate, result?: JulianDate): JulianDate; + /** + * Creates a new instance from a JavaScript Date. + * @param date - A JavaScript Date. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromDate(date: Date, result?: JulianDate): JulianDate; + /** + * Creates a new instance from a from an {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} date. + * This method is superior to Date.parse because it will handle all valid formats defined by the ISO 8601 + * specification, including leap seconds and sub-millisecond times, which discarded by most JavaScript implementations. + * @param iso8601String - An ISO 8601 date. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601(iso8601String: string, result?: JulianDate): JulianDate; + /** + * Creates a new instance that represents the current system time. + * This is equivalent to calling JulianDate.fromDate(new Date());. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static now(result?: JulianDate): JulianDate; + /** + * Creates a {@link GregorianDate} from the provided instance. + * @param julianDate - The date to be converted. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static toGregorianDate(julianDate: JulianDate, result?: GregorianDate): GregorianDate; + /** + * Creates a JavaScript Date from the provided instance. + * Since JavaScript dates are only accurate to the nearest millisecond and + * cannot represent a leap second, consider using {@link JulianDate.toGregorianDate} instead. + * If the provided JulianDate is during a leap second, the previous second is used. + * @param julianDate - The date to be converted. + * @returns A new instance representing the provided date. + */ + static toDate(julianDate: JulianDate): Date; + /** + * Creates an ISO8601 representation of the provided date. + * @param julianDate - The date to be converted. + * @param [precision] - The number of fractional digits used to represent the seconds component. By default, the most precise representation is used. + * @returns The ISO8601 representation of the provided date. + */ + static toIso8601(julianDate: JulianDate, precision?: number): string; + /** + * Duplicates a JulianDate instance. + * @param julianDate - The date to duplicate. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. Returns undefined if julianDate is undefined. + */ + static clone(julianDate: JulianDate, result?: JulianDate): JulianDate; + /** + * Compares two instances. + * @param left - The first instance. + * @param right - The second instance. + * @returns A negative value if left is less than right, a positive value if left is greater than right, or zero if left and right are equal. + */ + static compare(left: JulianDate, right: JulianDate): number; + /** + * Compares two instances and returns true if they are equal, false otherwise. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @returns true if the dates are equal; otherwise, false. + */ + static equals(left?: JulianDate, right?: JulianDate): boolean; + /** + * Compares two instances and returns true if they are within epsilon seconds of + * each other. That is, in order for the dates to be considered equal (and for + * this function to return true), the absolute value of the difference between them, in + * seconds, must be less than epsilon. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @param [epsilon = 0] - The maximum number of seconds that should separate the two instances. + * @returns true if the two dates are within epsilon seconds of each other; otherwise false. + */ + static equalsEpsilon(left?: JulianDate, right?: JulianDate, epsilon?: number): boolean; + /** + * Computes the total number of whole and fractional days represented by the provided instance. + * @param julianDate - The date. + * @returns The Julian date as single floating point number. + */ + static totalDays(julianDate: JulianDate): number; + /** + * Computes the difference in seconds between the provided instance. + * @param left - The first instance. + * @param right - The second instance. + * @returns The difference, in seconds, when subtracting right from left. + */ + static secondsDifference(left: JulianDate, right: JulianDate): number; + /** + * Computes the difference in days between the provided instance. + * @param left - The first instance. + * @param right - The second instance. + * @returns The difference, in days, when subtracting right from left. + */ + static daysDifference(left: JulianDate, right: JulianDate): number; + /** + * Computes the number of seconds the provided instance is ahead of UTC. + * @param julianDate - The date. + * @returns The number of seconds the provided instance is ahead of UTC + */ + static computeTaiMinusUtc(julianDate: JulianDate): number; + /** + * Adds the provided number of seconds to the provided date instance. + * @param julianDate - The date. + * @param seconds - The number of seconds to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addSeconds(julianDate: JulianDate, seconds: number, result: JulianDate): JulianDate; + /** + * Adds the provided number of minutes to the provided date instance. + * @param julianDate - The date. + * @param minutes - The number of minutes to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addMinutes(julianDate: JulianDate, minutes: number, result: JulianDate): JulianDate; + /** + * Adds the provided number of hours to the provided date instance. + * @param julianDate - The date. + * @param hours - The number of hours to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addHours(julianDate: JulianDate, hours: number, result: JulianDate): JulianDate; + /** + * Adds the provided number of days to the provided date instance. + * @param julianDate - The date. + * @param days - The number of days to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addDays(julianDate: JulianDate, days: number, result: JulianDate): JulianDate; + /** + * Compares the provided instances and returns true if left is earlier than right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is earlier than right, false otherwise. + */ + static lessThan(left: JulianDate, right: JulianDate): boolean; + /** + * Compares the provided instances and returns true if left is earlier than or equal to right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is earlier than or equal to right, false otherwise. + */ + static lessThanOrEquals(left: JulianDate, right: JulianDate): boolean; + /** + * Compares the provided instances and returns true if left is later than right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is later than right, false otherwise. + */ + static greaterThan(left: JulianDate, right: JulianDate): boolean; + /** + * Compares the provided instances and returns true if left is later than or equal to right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is later than or equal to right, false otherwise. + */ + static greaterThanOrEquals(left: JulianDate, right: JulianDate): boolean; + /** + * Duplicates this instance. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + clone(result?: JulianDate): JulianDate; + /** + * Compares this and the provided instance and returns true if they are equal, false otherwise. + * @param [right] - The second instance. + * @returns true if the dates are equal; otherwise, false. + */ + equals(right?: JulianDate): boolean; + /** + * Compares this and the provided instance and returns true if they are within epsilon seconds of + * each other. That is, in order for the dates to be considered equal (and for + * this function to return true), the absolute value of the difference between them, in + * seconds, must be less than epsilon. + * @param [right] - The second instance. + * @param [epsilon = 0] - The maximum number of seconds that should separate the two instances. + * @returns true if the two dates are within epsilon seconds of each other; otherwise false. + */ + equalsEpsilon(right?: JulianDate, epsilon?: number): boolean; + /** + * Creates a string representing this date in ISO8601 format. + * @returns A string representing this date in ISO8601 format. + */ + toString(): string; + /** + * Gets or sets the list of leap seconds used throughout Cesium. + */ + static leapSeconds: LeapSecond[]; +} + +/** + * This enumerated type is for representing keyboard modifiers. These are keys + * that are held down in addition to other event types. + */ +export enum KeyboardEventModifier { + /** + * Represents the shift key being held down. + */ + SHIFT = 0, + /** + * Represents the control key being held down. + */ + CTRL = 1, + /** + * Represents the alt key being held down. + */ + ALT = 2 +} + +/** + * An {@link InterpolationAlgorithm} for performing Lagrange interpolation. + */ +export namespace LagrangePolynomialApproximation { + /** + * Given the desired degree, returns the number of data points required for interpolation. + * @param degree - The desired degree of interpolation. + * @returns The number of required data points needed for the desired degree of interpolation. + */ + function getRequiredDataPoints(degree: number): number; + /** + * Interpolates values using Lagrange Polynomial Approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero(x: number, xTable: number[], yTable: number[], yStride: number, result?: number[]): number[]; +} + +/** + * Describes a single leap second, which is constructed from a {@link JulianDate} and a + * numerical offset representing the number of seconds TAI is ahead of the UTC time standard. + * @param [date] - A Julian date representing the time of the leap second. + * @param [offset] - The cumulative number of seconds that TAI is ahead of UTC at the provided date. + */ +export class LeapSecond { + constructor(date?: JulianDate, offset?: number); + /** + * Gets or sets the date at which this leap second occurs. + */ + julianDate: JulianDate; + /** + * Gets or sets the cumulative number of seconds between the UTC and TAI time standards at the time + * of this leap second. + */ + offset: number; +} + +/** + * An {@link InterpolationAlgorithm} for performing linear interpolation. + */ +export namespace LinearApproximation { + /** + * Given the desired degree, returns the number of data points required for interpolation. + * Since linear interpolation can only generate a first degree polynomial, this function + * always returns 2. + * @param degree - The desired degree of interpolation. + * @returns This function always returns 2. + */ + function getRequiredDataPoints(degree: number): number; + /** + * Interpolates values using linear approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero(x: number, xTable: number[], yTable: number[], yStride: number, result?: number[]): number[]; +} + +/** + * A spline that uses piecewise linear interpolation to create a curve. + * @example + * var times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * var spline = new Cesium.LinearSpline({ + * times : times, + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * + * var p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of {@link Cartesian3} control points. + */ +export class LinearSpline { + constructor(options: { + times: number[]; + points: Cartesian3[]; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Cartesian3} control points. + */ + readonly points: Cartesian3[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3): Cartesian3; +} + +/** + * Defines how geodetic ellipsoid coordinates ({@link Cartographic}) project to a + * flat map like Cesium's 2D and Columbus View modes. + */ +export class MapProjection { + constructor(); + /** + * Gets the {@link Ellipsoid}. + */ + readonly ellipsoid: Ellipsoid; + /** + * Projects {@link Cartographic} coordinates, in radians, to projection-specific map coordinates, in meters. + * @param cartographic - The coordinates to project. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The projected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + project(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Unprojects projection-specific map {@link Cartesian3} coordinates, in meters, to {@link Cartographic} + * coordinates, in radians. + * @param cartesian - The Cartesian position to unproject with height (z) in meters. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The unprojected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic; +} + +export namespace MapboxApi { + /** + * The default Mapbox API access token to use if one is not provided to the + * constructor of an object that uses the Mapbox API. If this property is undefined, + * Cesium's default access token is used, which is only suitable for use early in development. + * Please supply your own access token as soon as possible and prior to deployment. + * Visit {@link https://www.mapbox.com/help/create-api-access-token/} for details. + * When Cesium's default access token is used, a message is printed to the console the first + * time the Mapbox API is used. + */ + var defaultAccessToken: string; +} + +/** + * Math functions. + */ +export namespace Math { + /** + * 0.1 + */ + const EPSILON1 = 0.1; + /** + * 0.01 + */ + const EPSILON2 = 0.01; + /** + * 0.001 + */ + const EPSILON3 = 0.001; + /** + * 0.0001 + */ + const EPSILON4 = 0.0001; + /** + * 0.00001 + */ + const EPSILON5 = 0.00001; + /** + * 0.000001 + */ + const EPSILON6 = 0.000001; + /** + * 0.0000001 + */ + const EPSILON7 = 1e-7; + /** + * 0.00000001 + */ + const EPSILON8 = 1e-8; + /** + * 0.000000001 + */ + const EPSILON9 = 1e-9; + /** + * 0.0000000001 + */ + const EPSILON10 = 1e-10; + /** + * 0.00000000001 + */ + const EPSILON11 = 1e-11; + /** + * 0.000000000001 + */ + const EPSILON12 = 1e-12; + /** + * 0.0000000000001 + */ + const EPSILON13 = 1e-13; + /** + * 0.00000000000001 + */ + const EPSILON14 = 1e-14; + /** + * 0.000000000000001 + */ + const EPSILON15 = 1e-15; + /** + * 0.0000000000000001 + */ + const EPSILON16 = 1e-16; + /** + * 0.00000000000000001 + */ + const EPSILON17 = 1e-17; + /** + * 0.000000000000000001 + */ + const EPSILON18 = 1e-18; + /** + * 0.0000000000000000001 + */ + const EPSILON19 = 1e-19; + /** + * 0.00000000000000000001 + */ + const EPSILON20 = 1e-20; + /** + * 0.000000000000000000001 + */ + const EPSILON21 = 1e-21; + /** + * The gravitational parameter of the Earth in meters cubed + * per second squared as defined by the WGS84 model: 3.986004418e14 + */ + const GRAVITATIONALPARAMETER = 398600441800000; + /** + * Radius of the sun in meters: 6.955e8 + */ + const SOLAR_RADIUS = 695500000; + /** + * The mean radius of the moon, according to the "Report of the IAU/IAG Working Group on + * Cartographic Coordinates and Rotational Elements of the Planets and satellites: 2000", + * Celestial Mechanics 82: 83-110, 2002. + */ + const LUNAR_RADIUS = 1737400; + /** + * 64 * 1024 + */ + const SIXTY_FOUR_KILOBYTES: number; + /** + * 4 * 1024 * 1024 * 1024 + */ + const FOUR_GIGABYTES: number; + /** + * Returns the sign of the value; 1 if the value is positive, -1 if the value is + * negative, or 0 if the value is 0. + * @param value - The value to return the sign of. + * @returns The sign of value. + */ + function sign(value: number): number; + /** + * Returns 1.0 if the given value is positive or zero, and -1.0 if it is negative. + * This is similar to {@link Math#sign} except that returns 1.0 instead of + * 0.0 when the input value is 0.0. + * @param value - The value to return the sign of. + * @returns The sign of value. + */ + function signNotZero(value: number): number; + /** + * Converts a scalar value in the range [-1.0, 1.0] to a SNORM in the range [0, rangeMaximum] + * @param value - The scalar value in the range [-1.0, 1.0] + * @param [rangeMaximum = 255] - The maximum value in the mapped range, 255 by default. + * @returns A SNORM value, where 0 maps to -1.0 and rangeMaximum maps to 1.0. + */ + function toSNorm(value: number, rangeMaximum?: number): number; + /** + * Converts a SNORM value in the range [0, rangeMaximum] to a scalar in the range [-1.0, 1.0]. + * @param value - SNORM value in the range [0, rangeMaximum] + * @param [rangeMaximum = 255] - The maximum value in the SNORM range, 255 by default. + * @returns Scalar in the range [-1.0, 1.0]. + */ + function fromSNorm(value: number, rangeMaximum?: number): number; + /** + * Converts a scalar value in the range [rangeMinimum, rangeMaximum] to a scalar in the range [0.0, 1.0] + * @param value - The scalar value in the range [rangeMinimum, rangeMaximum] + * @param rangeMinimum - The minimum value in the mapped range. + * @param rangeMaximum - The maximum value in the mapped range. + * @returns A scalar value, where rangeMinimum maps to 0.0 and rangeMaximum maps to 1.0. + */ + function normalize(value: number, rangeMinimum: number, rangeMaximum: number): number; + /** + * Returns the hyperbolic sine of a number. + * The hyperbolic sine of value is defined to be + * (ex - e-x)/2.0 + * where e is Euler's number, approximately 2.71828183. + * + *

    Special cases: + *

      + *
    • If the argument is NaN, then the result is NaN.
    • + * + *
    • If the argument is infinite, then the result is an infinity + * with the same sign as the argument.
    • + * + *
    • If the argument is zero, then the result is a zero with the + * same sign as the argument.
    • + *
    + *

    + * @param value - The number whose hyperbolic sine is to be returned. + * @returns The hyperbolic sine of value. + */ + function sinh(value: number): number; + /** + * Returns the hyperbolic cosine of a number. + * The hyperbolic cosine of value is defined to be + * (ex + e-x)/2.0 + * where e is Euler's number, approximately 2.71828183. + * + *

    Special cases: + *

      + *
    • If the argument is NaN, then the result is NaN.
    • + * + *
    • If the argument is infinite, then the result is positive infinity.
    • + * + *
    • If the argument is zero, then the result is 1.0.
    • + *
    + *

    + * @param value - The number whose hyperbolic cosine is to be returned. + * @returns The hyperbolic cosine of value. + */ + function cosh(value: number): number; + /** + * Computes the linear interpolation of two values. + * @example + * var n = Cesium.Math.lerp(0.0, 2.0, 0.5); // returns 1.0 + * @param p - The start value to interpolate. + * @param q - The end value to interpolate. + * @param time - The time of interpolation generally in the range [0.0, 1.0]. + * @returns The linearly interpolated value. + */ + function lerp(p: number, q: number, time: number): number; + /** + * pi + */ + const PI: number; + /** + * 1/pi + */ + const ONE_OVER_PI: number; + /** + * pi/2 + */ + const PI_OVER_TWO: number; + /** + * pi/3 + */ + const PI_OVER_THREE: number; + /** + * pi/4 + */ + const PI_OVER_FOUR: number; + /** + * pi/6 + */ + const PI_OVER_SIX: number; + /** + * 3pi/2 + */ + const THREE_PI_OVER_TWO: number; + /** + * 2pi + */ + const TWO_PI: number; + /** + * 1/2pi + */ + const ONE_OVER_TWO_PI: number; + /** + * The number of radians in a degree. + */ + const RADIANS_PER_DEGREE: number; + /** + * The number of degrees in a radian. + */ + const DEGREES_PER_RADIAN: number; + /** + * The number of radians in an arc second. + */ + const RADIANS_PER_ARCSECOND: number; + /** + * Converts degrees to radians. + * @param degrees - The angle to convert in degrees. + * @returns The corresponding angle in radians. + */ + function toRadians(degrees: number): number; + /** + * Converts radians to degrees. + * @param radians - The angle to convert in radians. + * @returns The corresponding angle in degrees. + */ + function toDegrees(radians: number): number; + /** + * Converts a longitude value, in radians, to the range [-Math.PI, Math.PI). + * @example + * // Convert 270 degrees to -90 degrees longitude + * var longitude = Cesium.Math.convertLongitudeRange(Cesium.Math.toRadians(270.0)); + * @param angle - The longitude value, in radians, to convert to the range [-Math.PI, Math.PI). + * @returns The equivalent longitude value in the range [-Math.PI, Math.PI). + */ + function convertLongitudeRange(angle: number): number; + /** + * Convenience function that clamps a latitude value, in radians, to the range [-Math.PI/2, Math.PI/2). + * Useful for sanitizing data before use in objects requiring correct range. + * @example + * // Clamp 108 degrees latitude to 90 degrees latitude + * var latitude = Cesium.Math.clampToLatitudeRange(Cesium.Math.toRadians(108.0)); + * @param angle - The latitude value, in radians, to clamp to the range [-Math.PI/2, Math.PI/2). + * @returns The latitude value clamped to the range [-Math.PI/2, Math.PI/2). + */ + function clampToLatitudeRange(angle: number): number; + /** + * Produces an angle in the range -Pi <= angle <= Pi which is equivalent to the provided angle. + * @param angle - in radians + * @returns The angle in the range [-Math.PI, Math.PI]. + */ + function negativePiToPi(angle: number): number; + /** + * Produces an angle in the range 0 <= angle <= 2Pi which is equivalent to the provided angle. + * @param angle - in radians + * @returns The angle in the range [0, Math.TWO_PI]. + */ + function zeroToTwoPi(angle: number): number; + /** + * The modulo operation that also works for negative dividends. + * @param m - The dividend. + * @param n - The divisor. + * @returns The remainder. + */ + function mod(m: number, n: number): number; + /** + * Determines if two values are equal using an absolute or relative tolerance test. This is useful + * to avoid problems due to roundoff error when comparing floating-point values directly. The values are + * first compared using an absolute tolerance test. If that fails, a relative tolerance test is performed. + * Use this test if you are unsure of the magnitudes of left and right. + * @example + * var a = Cesium.Math.equalsEpsilon(0.0, 0.01, Cesium.Math.EPSILON2); // true + * var b = Cesium.Math.equalsEpsilon(0.0, 0.1, Cesium.Math.EPSILON2); // false + * var c = Cesium.Math.equalsEpsilon(3699175.1634344, 3699175.2, Cesium.Math.EPSILON7); // true + * var d = Cesium.Math.equalsEpsilon(3699175.1634344, 3699175.2, Cesium.Math.EPSILON9); // false + * @param left - The first value to compare. + * @param right - The other value to compare. + * @param [relativeEpsilon = 0] - The maximum inclusive delta between left and right for the relative tolerance test. + * @param [absoluteEpsilon = relativeEpsilon] - The maximum inclusive delta between left and right for the absolute tolerance test. + * @returns true if the values are equal within the epsilon; otherwise, false. + */ + function equalsEpsilon(left: number, right: number, relativeEpsilon?: number, absoluteEpsilon?: number): boolean; + /** + * Determines if the left value is less than the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns false. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is less than right by more than + * absoluteEpsilon. false if left is greater or if the two + * values are nearly equal. + */ + function lessThan(left: number, right: number, absoluteEpsilon: number): boolean; + /** + * Determines if the left value is less than or equal to the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns true. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is less than right or if the + * the values are nearly equal. + */ + function lessThanOrEquals(left: number, right: number, absoluteEpsilon: number): boolean; + /** + * Determines if the left value is greater the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns false. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is greater than right by more than + * absoluteEpsilon. false if left is less or if the two + * values are nearly equal. + */ + function greaterThan(left: number, right: number, absoluteEpsilon: number): boolean; + /** + * Determines if the left value is greater than or equal to the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns true. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is greater than right or if the + * the values are nearly equal. + */ + function greaterThanOrEquals(left: number, right: number, absoluteEpsilon: number): boolean; + /** + * Computes the factorial of the provided number. + * @example + * //Compute 7!, which is equal to 5040 + * var computedFactorial = Cesium.Math.factorial(7); + * @param n - The number whose factorial is to be computed. + * @returns The factorial of the provided number or undefined if the number is less than 0. + */ + function factorial(n: number): number; + /** + * Increments a number with a wrapping to a minimum value if the number exceeds the maximum value. + * @example + * var n = Cesium.Math.incrementWrap(5, 10, 0); // returns 6 + * var n = Cesium.Math.incrementWrap(10, 10, 0); // returns 0 + * @param [n] - The number to be incremented. + * @param [maximumValue] - The maximum incremented value before rolling over to the minimum value. + * @param [minimumValue = 0.0] - The number reset to after the maximum value has been exceeded. + * @returns The incremented number. + */ + function incrementWrap(n?: number, maximumValue?: number, minimumValue?: number): number; + /** + * Determines if a positive integer is a power of two. + * @example + * var t = Cesium.Math.isPowerOfTwo(16); // true + * var f = Cesium.Math.isPowerOfTwo(20); // false + * @param n - The positive integer to test. + * @returns true if the number if a power of two; otherwise, false. + */ + function isPowerOfTwo(n: number): boolean; + /** + * Computes the next power-of-two integer greater than or equal to the provided positive integer. + * @example + * var n = Cesium.Math.nextPowerOfTwo(29); // 32 + * var m = Cesium.Math.nextPowerOfTwo(32); // 32 + * @param n - The positive integer to test. + * @returns The next power-of-two integer. + */ + function nextPowerOfTwo(n: number): number; + /** + * Constraint a value to lie between two values. + * @param value - The value to constrain. + * @param min - The minimum value. + * @param max - The maximum value. + * @returns The value clamped so that min <= value <= max. + */ + function clamp(value: number, min: number, max: number): number; + /** + * Sets the seed used by the random number generator + * in {@link Math#nextRandomNumber}. + * @param seed - An integer used as the seed. + */ + function setRandomNumberSeed(seed: number): void; + /** + * Generates a random floating point number in the range of [0.0, 1.0) + * using a Mersenne twister. + * @returns A random number in the range of [0.0, 1.0). + */ + function nextRandomNumber(): number; + /** + * Generates a random number between two numbers. + * @param min - The minimum value. + * @param max - The maximum value. + * @returns A random number between the min and max. + */ + function randomBetween(min: number, max: number): number; + /** + * Computes Math.acos(value), but first clamps value to the range [-1.0, 1.0] + * so that the function will never return NaN. + * @param value - The value for which to compute acos. + * @returns The acos of the value if the value is in the range [-1.0, 1.0], or the acos of -1.0 or 1.0, + * whichever is closer, if the value is outside the range. + */ + function acosClamped(value: number): number; + /** + * Computes Math.asin(value), but first clamps value to the range [-1.0, 1.0] + * so that the function will never return NaN. + * @param value - The value for which to compute asin. + * @returns The asin of the value if the value is in the range [-1.0, 1.0], or the asin of -1.0 or 1.0, + * whichever is closer, if the value is outside the range. + */ + function asinClamped(value: number): number; + /** + * Finds the chord length between two points given the circle's radius and the angle between the points. + * @param angle - The angle between the two points. + * @param radius - The radius of the circle. + * @returns The chord length. + */ + function chordLength(angle: number, radius: number): number; + /** + * Finds the logarithm of a number to a base. + * @param number - The number. + * @param base - The base. + * @returns The result. + */ + function logBase(number: number, base: number): number; + /** + * Finds the cube root of a number. + * Returns NaN if number is not provided. + * @param [number] - The number. + * @returns The result. + */ + function cbrt(number?: number): number; + /** + * Finds the base 2 logarithm of a number. + * @param number - The number. + * @returns The result. + */ + function log2(number: number): number; + /** + * Computes a fast approximation of Atan for input in the range [-1, 1]. + * + * Based on Michal Drobot's approximation from ShaderFastLibs, + * which in turn is based on "Efficient approximations for the arctangent function," + * Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006. + * Adapted from ShaderFastLibs under MIT License. + * @param x - An input number in the range [-1, 1] + * @returns An approximation of atan(x) + */ + function fastApproximateAtan(x: number): number; + /** + * Computes a fast approximation of Atan2(x, y) for arbitrary input scalars. + * + * Range reduction math based on nvidia's cg reference implementation: http://developer.download.nvidia.com/cg/atan2.html + * @param x - An input number that isn't zero if y is zero. + * @param y - An input number that isn't zero if x is zero. + * @returns An approximation of atan2(x, y) + */ + function fastApproximateAtan2(x: number, y: number): number; +} + +export interface Matrix2 extends ArrayLike { +} + +/** + * A 2x2 matrix, indexable as a column-major order array. + * Constructor parameters are in row-major order for code readability. + * @param [column0Row0 = 0.0] - The value for column 0, row 0. + * @param [column1Row0 = 0.0] - The value for column 1, row 0. + * @param [column0Row1 = 0.0] - The value for column 0, row 1. + * @param [column1Row1 = 0.0] - The value for column 1, row 1. + */ +export class Matrix2 implements ArrayLike { + constructor(column0Row0?: number, column1Row0?: number, column0Row1?: number, column1Row1?: number); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Matrix2, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Matrix2): Matrix2; + /** + * Duplicates a Matrix2 instance. + * @param matrix - The matrix to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined) + */ + static clone(matrix: Matrix2, result?: Matrix2): Matrix2; + /** + * Creates a Matrix2 from 4 consecutive elements in an array. + * @example + * // Create the Matrix2: + * // [1.0, 2.0] + * // [1.0, 2.0] + * + * var v = [1.0, 1.0, 2.0, 2.0]; + * var m = Cesium.Matrix2.fromArray(v); + * + * // Create same Matrix2 with using an offset into an array + * var v2 = [0.0, 0.0, 1.0, 1.0, 2.0, 2.0]; + * var m2 = Cesium.Matrix2.fromArray(v2, 2); + * @param array - The array whose 4 consecutive elements correspond to the positions of the matrix. Assumes column-major order. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to first column first row position in the matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. + */ + static fromArray(array: number[], startingIndex?: number, result?: Matrix2): Matrix2; + /** + * Creates a Matrix2 instance from a column-major order array. + * @param values - The column-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromColumnMajorArray(values: number[], result?: Matrix2): Matrix2; + /** + * Creates a Matrix2 instance from a row-major order array. + * The resulting matrix will be in column-major order. + * @param values - The row-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromRowMajorArray(values: number[], result?: Matrix2): Matrix2; + /** + * Computes a Matrix2 instance representing a non-uniform scale. + * @example + * // Creates + * // [7.0, 0.0] + * // [0.0, 8.0] + * var m = Cesium.Matrix2.fromScale(new Cesium.Cartesian2(7.0, 8.0)); + * @param scale - The x and y scale factors. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromScale(scale: Cartesian2, result?: Matrix2): Matrix2; + /** + * Computes a Matrix2 instance representing a uniform scale. + * @example + * // Creates + * // [2.0, 0.0] + * // [0.0, 2.0] + * var m = Cesium.Matrix2.fromUniformScale(2.0); + * @param scale - The uniform scale factor. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromUniformScale(scale: number, result?: Matrix2): Matrix2; + /** + * Creates a rotation matrix. + * @example + * // Rotate a point 45 degrees counterclockwise. + * var p = new Cesium.Cartesian2(5, 6); + * var m = Cesium.Matrix2.fromRotation(Cesium.Math.toRadians(45.0)); + * var rotated = Cesium.Matrix2.multiplyByVector(m, p, new Cesium.Cartesian2()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromRotation(angle: number, result?: Matrix2): Matrix2; + /** + * Creates an Array from the provided Matrix2 instance. + * The array will be in column-major order. + * @param matrix - The matrix to use.. + * @param [result] - The Array onto which to store the result. + * @returns The modified Array parameter or a new Array instance if one was not provided. + */ + static toArray(matrix: Matrix2, result?: number[]): number[]; + /** + * Computes the array index of the element at the provided row and column. + * @example + * var myMatrix = new Cesium.Matrix2(); + * var column1Row0Index = Cesium.Matrix2.getElementIndex(1, 0); + * var column1Row0 = myMatrix[column1Row0Index] + * myMatrix[column1Row0Index] = 10.0; + * @param row - The zero-based index of the row. + * @param column - The zero-based index of the column. + * @returns The index of the element at the provided row and column. + */ + static getElementIndex(row: number, column: number): number; + /** + * Retrieves a copy of the matrix column at the provided index as a Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getColumn(matrix: Matrix2, index: number, result: Cartesian2): Cartesian2; + /** + * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setColumn(matrix: Matrix2, index: number, cartesian: Cartesian2, result: Cartesian2): Matrix2; + /** + * Retrieves a copy of the matrix row at the provided index as a Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRow(matrix: Matrix2, index: number, result: Cartesian2): Cartesian2; + /** + * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified row. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRow(matrix: Matrix2, index: number, cartesian: Cartesian2, result: Matrix2): Matrix2; + /** + * Extracts the non-uniform scale assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getScale(matrix: Matrix2, result: Cartesian2): Cartesian2; + /** + * Computes the maximum scale assuming the matrix is an affine transformation. + * The maximum scale is the maximum length of the column vectors. + * @param matrix - The matrix. + * @returns The maximum scale. + */ + static getMaximumScale(matrix: Matrix2): number; + /** + * Computes the product of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Matrix2, right: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the sum of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Matrix2, right: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the difference of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Matrix2, right: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the product of a matrix and a column vector. + * @param matrix - The matrix. + * @param cartesian - The column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByVector(matrix: Matrix2, cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the product of a matrix and a scalar. + * @param matrix - The matrix. + * @param scalar - The number to multiply by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(matrix: Matrix2, scalar: number, result: Matrix2): Matrix2; + /** + * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix2.multiply(m, Cesium.Matrix2.fromScale(scale), m); + * Cesium.Matrix2.multiplyByScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The non-uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScale(matrix: Matrix2, scale: Cartesian2, result: Matrix2): Matrix2; + /** + * Creates a negated copy of the provided matrix. + * @param matrix - The matrix to negate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the transpose of the provided matrix. + * @param matrix - The matrix to transpose. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static transpose(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements. + * @param matrix - The matrix with signed elements. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Compares the provided matrices componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Matrix2, right?: Matrix2): boolean; + /** + * Compares the provided matrices componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Matrix2, right?: Matrix2, epsilon?: number): boolean; + /** + * An immutable Matrix2 instance initialized to the identity matrix. + */ + static readonly IDENTITY: Matrix2; + /** + * An immutable Matrix2 instance initialized to the zero matrix. + */ + static readonly ZERO: Matrix2; + /** + * The index into Matrix2 for column 0, row 0. + * @example + * var matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN0ROW0] = 5.0; // set column 0, row 0 to 5.0 + */ + static readonly COLUMN0ROW0: number; + /** + * The index into Matrix2 for column 0, row 1. + * @example + * var matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN0ROW1] = 5.0; // set column 0, row 1 to 5.0 + */ + static readonly COLUMN0ROW1: number; + /** + * The index into Matrix2 for column 1, row 0. + * @example + * var matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN1ROW0] = 5.0; // set column 1, row 0 to 5.0 + */ + static readonly COLUMN1ROW0: number; + /** + * The index into Matrix2 for column 1, row 1. + * @example + * var matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN1ROW1] = 5.0; // set column 1, row 1 to 5.0 + */ + static readonly COLUMN1ROW1: number; + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Duplicates the provided Matrix2 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. + */ + clone(result?: Matrix2): Matrix2; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side matrix. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Matrix2): boolean; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Matrix2, epsilon?: number): boolean; + /** + * Creates a string representing this Matrix with each row being + * on a separate line and in the format '(column0, column1)'. + * @returns A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1)'. + */ + toString(): string; +} + +export interface Matrix3 extends ArrayLike { +} + +/** + * A 3x3 matrix, indexable as a column-major order array. + * Constructor parameters are in row-major order for code readability. + * @param [column0Row0 = 0.0] - The value for column 0, row 0. + * @param [column1Row0 = 0.0] - The value for column 1, row 0. + * @param [column2Row0 = 0.0] - The value for column 2, row 0. + * @param [column0Row1 = 0.0] - The value for column 0, row 1. + * @param [column1Row1 = 0.0] - The value for column 1, row 1. + * @param [column2Row1 = 0.0] - The value for column 2, row 1. + * @param [column0Row2 = 0.0] - The value for column 0, row 2. + * @param [column1Row2 = 0.0] - The value for column 1, row 2. + * @param [column2Row2 = 0.0] - The value for column 2, row 2. + */ +export class Matrix3 implements ArrayLike { + constructor(column0Row0?: number, column1Row0?: number, column2Row0?: number, column0Row1?: number, column1Row1?: number, column2Row1?: number, column0Row2?: number, column1Row2?: number, column2Row2?: number); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Matrix3, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Matrix3): Matrix3; + /** + * Duplicates a Matrix3 instance. + * @param matrix - The matrix to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined) + */ + static clone(matrix: Matrix3, result?: Matrix3): Matrix3; + /** + * Creates a Matrix3 from 9 consecutive elements in an array. + * @example + * // Create the Matrix3: + * // [1.0, 2.0, 3.0] + * // [1.0, 2.0, 3.0] + * // [1.0, 2.0, 3.0] + * + * var v = [1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0]; + * var m = Cesium.Matrix3.fromArray(v); + * + * // Create same Matrix3 with using an offset into an array + * var v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0]; + * var m2 = Cesium.Matrix3.fromArray(v2, 2); + * @param array - The array whose 9 consecutive elements correspond to the positions of the matrix. Assumes column-major order. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to first column first row position in the matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. + */ + static fromArray(array: number[], startingIndex?: number, result?: Matrix3): Matrix3; + /** + * Creates a Matrix3 instance from a column-major order array. + * @param values - The column-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromColumnMajorArray(values: number[], result?: Matrix3): Matrix3; + /** + * Creates a Matrix3 instance from a row-major order array. + * The resulting matrix will be in column-major order. + * @param values - The row-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRowMajorArray(values: number[], result?: Matrix3): Matrix3; + /** + * Computes a 3x3 rotation matrix from the provided quaternion. + * @param quaternion - the quaternion to use. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The 3x3 rotation matrix from this quaternion. + */ + static fromQuaternion(quaternion: Quaternion, result?: Matrix3): Matrix3; + /** + * Computes a 3x3 rotation matrix from the provided headingPitchRoll. (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles ) + * @param headingPitchRoll - the headingPitchRoll to use. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The 3x3 rotation matrix from this headingPitchRoll. + */ + static fromHeadingPitchRoll(headingPitchRoll: HeadingPitchRoll, result?: Matrix3): Matrix3; + /** + * Computes a Matrix3 instance representing a non-uniform scale. + * @example + * // Creates + * // [7.0, 0.0, 0.0] + * // [0.0, 8.0, 0.0] + * // [0.0, 0.0, 9.0] + * var m = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0)); + * @param scale - The x, y, and z scale factors. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromScale(scale: Cartesian3, result?: Matrix3): Matrix3; + /** + * Computes a Matrix3 instance representing a uniform scale. + * @example + * // Creates + * // [2.0, 0.0, 0.0] + * // [0.0, 2.0, 0.0] + * // [0.0, 0.0, 2.0] + * var m = Cesium.Matrix3.fromUniformScale(2.0); + * @param scale - The uniform scale factor. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromUniformScale(scale: number, result?: Matrix3): Matrix3; + /** + * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector. + * @example + * // Creates + * // [0.0, -9.0, 8.0] + * // [9.0, 0.0, -7.0] + * // [-8.0, 7.0, 0.0] + * var m = Cesium.Matrix3.fromCrossProduct(new Cesium.Cartesian3(7.0, 8.0, 9.0)); + * @param vector - the vector on the left hand side of the cross product operation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromCrossProduct(vector: Cartesian3, result?: Matrix3): Matrix3; + /** + * Creates a rotation matrix around the x-axis. + * @example + * // Rotate a point 45 degrees counterclockwise around the x-axis. + * var p = new Cesium.Cartesian3(5, 6, 7); + * var m = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(45.0)); + * var rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRotationX(angle: number, result?: Matrix3): Matrix3; + /** + * Creates a rotation matrix around the y-axis. + * @example + * // Rotate a point 45 degrees counterclockwise around the y-axis. + * var p = new Cesium.Cartesian3(5, 6, 7); + * var m = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(45.0)); + * var rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRotationY(angle: number, result?: Matrix3): Matrix3; + /** + * Creates a rotation matrix around the z-axis. + * @example + * // Rotate a point 45 degrees counterclockwise around the z-axis. + * var p = new Cesium.Cartesian3(5, 6, 7); + * var m = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(45.0)); + * var rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRotationZ(angle: number, result?: Matrix3): Matrix3; + /** + * Creates an Array from the provided Matrix3 instance. + * The array will be in column-major order. + * @param matrix - The matrix to use.. + * @param [result] - The Array onto which to store the result. + * @returns The modified Array parameter or a new Array instance if one was not provided. + */ + static toArray(matrix: Matrix3, result?: number[]): number[]; + /** + * Computes the array index of the element at the provided row and column. + * @example + * var myMatrix = new Cesium.Matrix3(); + * var column1Row0Index = Cesium.Matrix3.getElementIndex(1, 0); + * var column1Row0 = myMatrix[column1Row0Index] + * myMatrix[column1Row0Index] = 10.0; + * @param row - The zero-based index of the row. + * @param column - The zero-based index of the column. + * @returns The index of the element at the provided row and column. + */ + static getElementIndex(row: number, column: number): number; + /** + * Retrieves a copy of the matrix column at the provided index as a Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getColumn(matrix: Matrix3, index: number, result: Cartesian3): Cartesian3; + /** + * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setColumn(matrix: Matrix3, index: number, cartesian: Cartesian3, result: Matrix3): Matrix3; + /** + * Retrieves a copy of the matrix row at the provided index as a Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRow(matrix: Matrix3, index: number, result: Cartesian3): Cartesian3; + /** + * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified row. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRow(matrix: Matrix3, index: number, cartesian: Cartesian3, result: Matrix3): Matrix3; + /** + * Extracts the non-uniform scale assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getScale(matrix: Matrix3, result: Cartesian3): Cartesian3; + /** + * Computes the maximum scale assuming the matrix is an affine transformation. + * The maximum scale is the maximum length of the column vectors. + * @param matrix - The matrix. + * @returns The maximum scale. + */ + static getMaximumScale(matrix: Matrix3): number; + /** + * Computes the product of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Matrix3, right: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the sum of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Matrix3, right: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the difference of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Matrix3, right: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the product of a matrix and a column vector. + * @param matrix - The matrix. + * @param cartesian - The column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByVector(matrix: Matrix3, cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the product of a matrix and a scalar. + * @param matrix - The matrix. + * @param scalar - The number to multiply by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(matrix: Matrix3, scalar: number, result: Matrix3): Matrix3; + /** + * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix3.multiply(m, Cesium.Matrix3.fromScale(scale), m); + * Cesium.Matrix3.multiplyByScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The non-uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScale(matrix: Matrix3, scale: Cartesian3, result: Matrix3): Matrix3; + /** + * Creates a negated copy of the provided matrix. + * @param matrix - The matrix to negate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the transpose of the provided matrix. + * @param matrix - The matrix to transpose. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static transpose(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Extracts the rotation assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter + */ + static getRotation(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the eigenvectors and eigenvalues of a symmetric matrix. + *

    + * Returns a diagonal matrix and unitary matrix such that: + * matrix = unitary matrix * diagonal matrix * transpose(unitary matrix) + *

    + *

    + * The values along the diagonal of the diagonal matrix are the eigenvalues. The columns + * of the unitary matrix are the corresponding eigenvectors. + *

    + * @example + * var a = //... symetric matrix + * var result = { + * unitary : new Cesium.Matrix3(), + * diagonal : new Cesium.Matrix3() + * }; + * Cesium.Matrix3.computeEigenDecomposition(a, result); + * + * var unitaryTranspose = Cesium.Matrix3.transpose(result.unitary, new Cesium.Matrix3()); + * var b = Cesium.Matrix3.multiply(result.unitary, result.diagonal, new Cesium.Matrix3()); + * Cesium.Matrix3.multiply(b, unitaryTranspose, b); // b is now equal to a + * + * var lambda = Cesium.Matrix3.getColumn(result.diagonal, 0, new Cesium.Cartesian3()).x; // first eigenvalue + * var v = Cesium.Matrix3.getColumn(result.unitary, 0, new Cesium.Cartesian3()); // first eigenvector + * var c = Cesium.Cartesian3.multiplyByScalar(v, lambda, new Cesium.Cartesian3()); // equal to Cesium.Matrix3.multiplyByVector(a, v) + * @param matrix - The matrix to decompose into diagonal and unitary matrix. Expected to be symmetric. + * @param [result] - An object with unitary and diagonal properties which are matrices onto which to store the result. + * @returns An object with unitary and diagonal properties which are the unitary and diagonal matrices, respectively. + */ + static computeEigenDecomposition(matrix: Matrix3, result?: any): any; + /** + * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements. + * @param matrix - The matrix with signed elements. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the determinant of the provided matrix. + * @param matrix - The matrix to use. + * @returns The value of the determinant of the matrix. + */ + static determinant(matrix: Matrix3): number; + /** + * Computes the inverse of the provided matrix. + * @param matrix - The matrix to invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverse(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Compares the provided matrices componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Matrix3, right?: Matrix3): boolean; + /** + * Compares the provided matrices componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Matrix3, right?: Matrix3, epsilon?: number): boolean; + /** + * An immutable Matrix3 instance initialized to the identity matrix. + */ + static readonly IDENTITY: Matrix3; + /** + * An immutable Matrix3 instance initialized to the zero matrix. + */ + static readonly ZERO: Matrix3; + /** + * The index into Matrix3 for column 0, row 0. + */ + static readonly COLUMN0ROW0: number; + /** + * The index into Matrix3 for column 0, row 1. + */ + static readonly COLUMN0ROW1: number; + /** + * The index into Matrix3 for column 0, row 2. + */ + static readonly COLUMN0ROW2: number; + /** + * The index into Matrix3 for column 1, row 0. + */ + static readonly COLUMN1ROW0: number; + /** + * The index into Matrix3 for column 1, row 1. + */ + static readonly COLUMN1ROW1: number; + /** + * The index into Matrix3 for column 1, row 2. + */ + static readonly COLUMN1ROW2: number; + /** + * The index into Matrix3 for column 2, row 0. + */ + static readonly COLUMN2ROW0: number; + /** + * The index into Matrix3 for column 2, row 1. + */ + static readonly COLUMN2ROW1: number; + /** + * The index into Matrix3 for column 2, row 2. + */ + static readonly COLUMN2ROW2: number; + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Duplicates the provided Matrix3 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. + */ + clone(result?: Matrix3): Matrix3; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side matrix. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Matrix3): boolean; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Matrix3, epsilon?: number): boolean; + /** + * Creates a string representing this Matrix with each row being + * on a separate line and in the format '(column0, column1, column2)'. + * @returns A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2)'. + */ + toString(): string; +} + +export interface Matrix4 extends ArrayLike { +} + +/** + * A 4x4 matrix, indexable as a column-major order array. + * Constructor parameters are in row-major order for code readability. + * @param [column0Row0 = 0.0] - The value for column 0, row 0. + * @param [column1Row0 = 0.0] - The value for column 1, row 0. + * @param [column2Row0 = 0.0] - The value for column 2, row 0. + * @param [column3Row0 = 0.0] - The value for column 3, row 0. + * @param [column0Row1 = 0.0] - The value for column 0, row 1. + * @param [column1Row1 = 0.0] - The value for column 1, row 1. + * @param [column2Row1 = 0.0] - The value for column 2, row 1. + * @param [column3Row1 = 0.0] - The value for column 3, row 1. + * @param [column0Row2 = 0.0] - The value for column 0, row 2. + * @param [column1Row2 = 0.0] - The value for column 1, row 2. + * @param [column2Row2 = 0.0] - The value for column 2, row 2. + * @param [column3Row2 = 0.0] - The value for column 3, row 2. + * @param [column0Row3 = 0.0] - The value for column 0, row 3. + * @param [column1Row3 = 0.0] - The value for column 1, row 3. + * @param [column2Row3 = 0.0] - The value for column 2, row 3. + * @param [column3Row3 = 0.0] - The value for column 3, row 3. + */ +export class Matrix4 implements ArrayLike { + constructor(column0Row0?: number, column1Row0?: number, column2Row0?: number, column3Row0?: number, column0Row1?: number, column1Row1?: number, column2Row1?: number, column3Row1?: number, column0Row2?: number, column1Row2?: number, column2Row2?: number, column3Row2?: number, column0Row3?: number, column1Row3?: number, column2Row3?: number, column3Row3?: number); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Matrix4, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Matrix4): Matrix4; + /** + * Duplicates a Matrix4 instance. + * @param matrix - The matrix to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. (Returns undefined if matrix is undefined) + */ + static clone(matrix: Matrix4, result?: Matrix4): Matrix4; + /** + * Creates a Matrix4 from 16 consecutive elements in an array. + * @example + * // Create the Matrix4: + * // [1.0, 2.0, 3.0, 4.0] + * // [1.0, 2.0, 3.0, 4.0] + * // [1.0, 2.0, 3.0, 4.0] + * // [1.0, 2.0, 3.0, 4.0] + * + * var v = [1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0]; + * var m = Cesium.Matrix4.fromArray(v); + * + * // Create same Matrix4 with using an offset into an array + * var v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0]; + * var m2 = Cesium.Matrix4.fromArray(v2, 2); + * @param array - The array whose 16 consecutive elements correspond to the positions of the matrix. Assumes column-major order. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to first column first row position in the matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. + */ + static fromArray(array: number[], startingIndex?: number, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a column-major order array. + * @param values - The column-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromColumnMajorArray(values: number[], result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a row-major order array. + * The resulting matrix will be in column-major order. + * @param values - The row-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromRowMajorArray(values: number[], result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a Matrix3 representing the rotation + * and a Cartesian3 representing the translation. + * @param rotation - The upper left portion of the matrix representing the rotation. + * @param [translation = Cartesian3.ZERO] - The upper right portion of the matrix representing the translation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromRotationTranslation(rotation: Matrix3, translation?: Cartesian3, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a translation, rotation, and scale (TRS) + * representation with the rotation represented as a quaternion. + * @example + * var result = Cesium.Matrix4.fromTranslationQuaternionRotationScale( + * new Cesium.Cartesian3(1.0, 2.0, 3.0), // translation + * Cesium.Quaternion.IDENTITY, // rotation + * new Cesium.Cartesian3(7.0, 8.0, 9.0), // scale + * result); + * @param translation - The translation transformation. + * @param rotation - The rotation transformation. + * @param scale - The non-uniform scale transformation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromTranslationQuaternionRotationScale(translation: Cartesian3, rotation: Quaternion, scale: Cartesian3, result?: Matrix4): Matrix4; + /** + * Creates a Matrix4 instance from a {@link TranslationRotationScale} instance. + * @param translationRotationScale - The instance. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromTranslationRotationScale(translationRotationScale: TranslationRotationScale, result?: Matrix4): Matrix4; + /** + * Creates a Matrix4 instance from a Cartesian3 representing the translation. + * @param translation - The upper right portion of the matrix representing the translation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromTranslation(translation: Cartesian3, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing a non-uniform scale. + * @example + * // Creates + * // [7.0, 0.0, 0.0, 0.0] + * // [0.0, 8.0, 0.0, 0.0] + * // [0.0, 0.0, 9.0, 0.0] + * // [0.0, 0.0, 0.0, 1.0] + * var m = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0)); + * @param scale - The x, y, and z scale factors. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromScale(scale: Cartesian3, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing a uniform scale. + * @example + * // Creates + * // [2.0, 0.0, 0.0, 0.0] + * // [0.0, 2.0, 0.0, 0.0] + * // [0.0, 0.0, 2.0, 0.0] + * // [0.0, 0.0, 0.0, 1.0] + * var m = Cesium.Matrix4.fromUniformScale(2.0); + * @param scale - The uniform scale factor. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromUniformScale(scale: number, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a Camera. + * @param camera - The camera to use. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromCamera(camera: Camera, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing a perspective transformation matrix. + * @param fovY - The field of view along the Y axis in radians. + * @param aspectRatio - The aspect ratio. + * @param near - The distance to the near plane in meters. + * @param far - The distance to the far plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computePerspectiveFieldOfView(fovY: number, aspectRatio: number, near: number, far: number, result: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing an orthographic transformation matrix. + * @param left - The number of meters to the left of the camera that will be in view. + * @param right - The number of meters to the right of the camera that will be in view. + * @param bottom - The number of meters below of the camera that will be in view. + * @param top - The number of meters above of the camera that will be in view. + * @param near - The distance to the near plane in meters. + * @param far - The distance to the far plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeOrthographicOffCenter(left: number, right: number, bottom: number, top: number, near: number, far: number, result: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing an off center perspective transformation. + * @param left - The number of meters to the left of the camera that will be in view. + * @param right - The number of meters to the right of the camera that will be in view. + * @param bottom - The number of meters below of the camera that will be in view. + * @param top - The number of meters above of the camera that will be in view. + * @param near - The distance to the near plane in meters. + * @param far - The distance to the far plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computePerspectiveOffCenter(left: number, right: number, bottom: number, top: number, near: number, far: number, result: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing an infinite off center perspective transformation. + * @param left - The number of meters to the left of the camera that will be in view. + * @param right - The number of meters to the right of the camera that will be in view. + * @param bottom - The number of meters below of the camera that will be in view. + * @param top - The number of meters above of the camera that will be in view. + * @param near - The distance to the near plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeInfinitePerspectiveOffCenter(left: number, right: number, bottom: number, top: number, near: number, result: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance that transforms from normalized device coordinates to window coordinates. + * @example + * // Create viewport transformation using an explicit viewport and depth range. + * var m = Cesium.Matrix4.computeViewportTransformation({ + * x : 0.0, + * y : 0.0, + * width : 1024.0, + * height : 768.0 + * }, 0.0, 1.0, new Cesium.Matrix4()); + * @param [viewport = { x : 0.0, y : 0.0, width : 0.0, height : 0.0 }] - The viewport's corners as shown in Example 1. + * @param [nearDepthRange = 0.0] - The near plane distance in window coordinates. + * @param [farDepthRange = 1.0] - The far plane distance in window coordinates. + * @param [result] - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeViewportTransformation(viewport?: any, nearDepthRange?: number, farDepthRange?: number, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance that transforms from world space to view space. + * @param position - The position of the camera. + * @param direction - The forward direction. + * @param up - The up direction. + * @param right - The right direction. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeView(position: Cartesian3, direction: Cartesian3, up: Cartesian3, right: Cartesian3, result: Matrix4): Matrix4; + /** + * Computes an Array from the provided Matrix4 instance. + * The array will be in column-major order. + * @example + * //create an array from an instance of Matrix4 + * // m = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * var a = Cesium.Matrix4.toArray(m); + * + * // m remains the same + * //creates a = [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0] + * @param matrix - The matrix to use.. + * @param [result] - The Array onto which to store the result. + * @returns The modified Array parameter or a new Array instance if one was not provided. + */ + static toArray(matrix: Matrix4, result?: number[]): number[]; + /** + * Computes the array index of the element at the provided row and column. + * @example + * var myMatrix = new Cesium.Matrix4(); + * var column1Row0Index = Cesium.Matrix4.getElementIndex(1, 0); + * var column1Row0 = myMatrix[column1Row0Index]; + * myMatrix[column1Row0Index] = 10.0; + * @param row - The zero-based index of the row. + * @param column - The zero-based index of the column. + * @returns The index of the element at the provided row and column. + */ + static getElementIndex(row: number, column: number): number; + /** + * Retrieves a copy of the matrix column at the provided index as a Cartesian4 instance. + * @example + * //returns a Cartesian4 instance with values from the specified column + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * //Example 1: Creates an instance of Cartesian + * var a = Cesium.Matrix4.getColumn(m, 2, new Cesium.Cartesian4()); + * @example + * //Example 2: Sets values for Cartesian instance + * var a = new Cesium.Cartesian4(); + * Cesium.Matrix4.getColumn(m, 2, a); + * + * // a.x = 12.0; a.y = 16.0; a.z = 20.0; a.w = 24.0; + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getColumn(matrix: Matrix4, index: number, result: Cartesian4): Cartesian4; + /** + * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian4 instance. + * @example + * //creates a new Matrix4 instance with new column values from the Cartesian4 instance + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * var a = Cesium.Matrix4.setColumn(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4()); + * + * // m remains the same + * // a = [10.0, 11.0, 99.0, 13.0] + * // [14.0, 15.0, 98.0, 17.0] + * // [18.0, 19.0, 97.0, 21.0] + * // [22.0, 23.0, 96.0, 25.0] + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setColumn(matrix: Matrix4, index: number, cartesian: Cartesian4, result: Matrix4): Matrix4; + /** + * Computes a new matrix that replaces the translation in the rightmost column of the provided + * matrix with the provided translation. This assumes the matrix is an affine transformation + * @param matrix - The matrix to use. + * @param translation - The translation that replaces the translation of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setTranslation(matrix: Matrix4, translation: Cartesian3, result: Matrix4): Matrix4; + /** + * Computes a new matrix that replaces the scale with the provided scale. This assumes the matrix is an affine transformation + * @param matrix - The matrix to use. + * @param scale - The scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setScale(matrix: Matrix4, scale: Cartesian3, result: Matrix4): Matrix4; + /** + * Retrieves a copy of the matrix row at the provided index as a Cartesian4 instance. + * @example + * //returns a Cartesian4 instance with values from the specified column + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * //Example 1: Returns an instance of Cartesian + * var a = Cesium.Matrix4.getRow(m, 2, new Cesium.Cartesian4()); + * @example + * //Example 2: Sets values for a Cartesian instance + * var a = new Cesium.Cartesian4(); + * Cesium.Matrix4.getRow(m, 2, a); + * + * // a.x = 18.0; a.y = 19.0; a.z = 20.0; a.w = 21.0; + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRow(matrix: Matrix4, index: number, result: Cartesian4): Cartesian4; + /** + * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian4 instance. + * @example + * //create a new Matrix4 instance with new row values from the Cartesian4 instance + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * var a = Cesium.Matrix4.setRow(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4()); + * + * // m remains the same + * // a = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [99.0, 98.0, 97.0, 96.0] + * // [22.0, 23.0, 24.0, 25.0] + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified row. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRow(matrix: Matrix4, index: number, cartesian: Cartesian4, result: Matrix4): Matrix4; + /** + * Extracts the non-uniform scale assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter + */ + static getScale(matrix: Matrix4, result: Cartesian3): Cartesian3; + /** + * Computes the maximum scale assuming the matrix is an affine transformation. + * The maximum scale is the maximum length of the column vectors in the upper-left + * 3x3 matrix. + * @param matrix - The matrix. + * @returns The maximum scale. + */ + static getMaximumScale(matrix: Matrix4): number; + /** + * Computes the product of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the sum of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the difference of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the product of two matrices assuming the matrices are + * affine transformation matrices, where the upper left 3x3 elements + * are a rotation matrix, and the upper three elements in the fourth + * column are the translation. The bottom row is assumed to be [0, 0, 0, 1]. + * The matrix is not verified to be in the proper form. + * This method is faster than computing the product for general 4x4 + * matrices using {@link Matrix4.multiply}. + * @example + * var m1 = new Cesium.Matrix4(1.0, 6.0, 7.0, 0.0, 2.0, 5.0, 8.0, 0.0, 3.0, 4.0, 9.0, 0.0, 0.0, 0.0, 0.0, 1.0); + * var m2 = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3(1.0, 1.0, 1.0)); + * var m3 = Cesium.Matrix4.multiplyTransformation(m1, m2, new Cesium.Matrix4()); + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyTransformation(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Multiplies a transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by a 3x3 rotation matrix. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromRotationTranslation(rotation), m); with less allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromRotationTranslation(rotation), m); + * Cesium.Matrix4.multiplyByMatrix3(m, rotation, m); + * @param matrix - The matrix on the left-hand side. + * @param rotation - The 3x3 rotation matrix on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByMatrix3(matrix: Matrix4, rotation: Matrix3, result: Matrix4): Matrix4; + /** + * Multiplies a transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by an implicit translation matrix defined by a {@link Cartesian3}. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromTranslation(position), m); with less allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromTranslation(position), m); + * Cesium.Matrix4.multiplyByTranslation(m, position, m); + * @param matrix - The matrix on the left-hand side. + * @param translation - The translation on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByTranslation(matrix: Matrix4, translation: Cartesian3, result: Matrix4): Matrix4; + /** + * Multiplies an affine transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by an implicit uniform scale matrix. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromUniformScale(scale), m);, where + * m must be an affine matrix. + * This function performs fewer allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromUniformScale(scale), m); + * Cesium.Matrix4.multiplyByUniformScale(m, scale, m); + * @param matrix - The affine matrix on the left-hand side. + * @param scale - The uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByUniformScale(matrix: Matrix4, scale: number, result: Matrix4): Matrix4; + /** + * Multiplies an affine transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by an implicit non-uniform scale matrix. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromUniformScale(scale), m);, where + * m must be an affine matrix. + * This function performs fewer allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromScale(scale), m); + * Cesium.Matrix4.multiplyByScale(m, scale, m); + * @param matrix - The affine matrix on the left-hand side. + * @param scale - The non-uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScale(matrix: Matrix4, scale: Cartesian3, result: Matrix4): Matrix4; + /** + * Computes the product of a matrix and a column vector. + * @param matrix - The matrix. + * @param cartesian - The vector. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByVector(matrix: Matrix4, cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the product of a matrix and a {@link Cartesian3}. This is equivalent to calling {@link Matrix4.multiplyByVector} + * with a {@link Cartesian4} with a w component of zero. + * @example + * var p = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * var result = Cesium.Matrix4.multiplyByPointAsVector(matrix, p, new Cesium.Cartesian3()); + * // A shortcut for + * // Cartesian3 p = ... + * // Cesium.Matrix4.multiplyByVector(matrix, new Cesium.Cartesian4(p.x, p.y, p.z, 0.0), result); + * @param matrix - The matrix. + * @param cartesian - The point. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByPointAsVector(matrix: Matrix4, cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the product of a matrix and a {@link Cartesian3}. This is equivalent to calling {@link Matrix4.multiplyByVector} + * with a {@link Cartesian4} with a w component of 1, but returns a {@link Cartesian3} instead of a {@link Cartesian4}. + * @example + * var p = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * var result = Cesium.Matrix4.multiplyByPoint(matrix, p, new Cesium.Cartesian3()); + * @param matrix - The matrix. + * @param cartesian - The point. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByPoint(matrix: Matrix4, cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the product of a matrix and a scalar. + * @example + * //create a Matrix4 instance which is a scaled version of the supplied Matrix4 + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * var a = Cesium.Matrix4.multiplyByScalar(m, -2, new Cesium.Matrix4()); + * + * // m remains the same + * // a = [-20.0, -22.0, -24.0, -26.0] + * // [-28.0, -30.0, -32.0, -34.0] + * // [-36.0, -38.0, -40.0, -42.0] + * // [-44.0, -46.0, -48.0, -50.0] + * @param matrix - The matrix. + * @param scalar - The number to multiply by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(matrix: Matrix4, scalar: number, result: Matrix4): Matrix4; + /** + * Computes a negated copy of the provided matrix. + * @example + * //create a new Matrix4 instance which is a negation of a Matrix4 + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * var a = Cesium.Matrix4.negate(m, new Cesium.Matrix4()); + * + * // m remains the same + * // a = [-10.0, -11.0, -12.0, -13.0] + * // [-14.0, -15.0, -16.0, -17.0] + * // [-18.0, -19.0, -20.0, -21.0] + * // [-22.0, -23.0, -24.0, -25.0] + * @param matrix - The matrix to negate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the transpose of the provided matrix. + * @example + * //returns transpose of a Matrix4 + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * var a = Cesium.Matrix4.transpose(m, new Cesium.Matrix4()); + * + * // m remains the same + * // a = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * @param matrix - The matrix to transpose. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static transpose(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements. + * @param matrix - The matrix with signed elements. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Compares the provided matrices componentwise and returns + * true if they are equal, false otherwise. + * @example + * //compares two Matrix4 instances + * + * // a = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * // b = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * if(Cesium.Matrix4.equals(a,b)) { + * console.log("Both matrices are equal"); + * } else { + * console.log("They are not equal"); + * } + * + * //Prints "Both matrices are equal" on the console + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Matrix4, right?: Matrix4): boolean; + /** + * Compares the provided matrices componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @example + * //compares two Matrix4 instances + * + * // a = [10.5, 14.5, 18.5, 22.5] + * // [11.5, 15.5, 19.5, 23.5] + * // [12.5, 16.5, 20.5, 24.5] + * // [13.5, 17.5, 21.5, 25.5] + * + * // b = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * if(Cesium.Matrix4.equalsEpsilon(a,b,0.1)){ + * console.log("Difference between both the matrices is less than 0.1"); + * } else { + * console.log("Difference between both the matrices is not less than 0.1"); + * } + * + * //Prints "Difference between both the matrices is not less than 0.1" on the console + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Matrix4, right?: Matrix4, epsilon?: number): boolean; + /** + * Gets the translation portion of the provided matrix, assuming the matrix is a affine transformation matrix. + * @param matrix - The matrix to use. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getTranslation(matrix: Matrix4, result: Cartesian3): Cartesian3; + /** + * Gets the upper left 3x3 rotation matrix of the provided matrix, assuming the matrix is an affine transformation matrix. + * @example + * // returns a Matrix3 instance from a Matrix4 instance + * + * // m = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * var b = new Cesium.Matrix3(); + * Cesium.Matrix4.getMatrix3(m,b); + * + * // b = [10.0, 14.0, 18.0] + * // [11.0, 15.0, 19.0] + * // [12.0, 16.0, 20.0] + * @param matrix - The matrix to use. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getMatrix3(matrix: Matrix4, result: Matrix3): Matrix3; + /** + * Computes the inverse of the provided matrix using Cramers Rule. + * If the determinant is zero, the matrix can not be inverted, and an exception is thrown. + * If the matrix is an affine transformation matrix, it is more efficient + * to invert it with {@link Matrix4.inverseTransformation}. + * @param matrix - The matrix to invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverse(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the inverse of the provided matrix assuming it is + * an affine transformation matrix, where the upper left 3x3 elements + * are a rotation matrix, and the upper three elements in the fourth + * column are the translation. The bottom row is assumed to be [0, 0, 0, 1]. + * The matrix is not verified to be in the proper form. + * This method is faster than computing the inverse for a general 4x4 + * matrix using {@link Matrix4.inverse}. + * @param matrix - The matrix to invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverseTransformation(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * An immutable Matrix4 instance initialized to the identity matrix. + */ + static readonly IDENTITY: Matrix4; + /** + * An immutable Matrix4 instance initialized to the zero matrix. + */ + static readonly ZERO: Matrix4; + /** + * The index into Matrix4 for column 0, row 0. + */ + static readonly COLUMN0ROW0: number; + /** + * The index into Matrix4 for column 0, row 1. + */ + static readonly COLUMN0ROW1: number; + /** + * The index into Matrix4 for column 0, row 2. + */ + static readonly COLUMN0ROW2: number; + /** + * The index into Matrix4 for column 0, row 3. + */ + static readonly COLUMN0ROW3: number; + /** + * The index into Matrix4 for column 1, row 0. + */ + static readonly COLUMN1ROW0: number; + /** + * The index into Matrix4 for column 1, row 1. + */ + static readonly COLUMN1ROW1: number; + /** + * The index into Matrix4 for column 1, row 2. + */ + static readonly COLUMN1ROW2: number; + /** + * The index into Matrix4 for column 1, row 3. + */ + static readonly COLUMN1ROW3: number; + /** + * The index into Matrix4 for column 2, row 0. + */ + static readonly COLUMN2ROW0: number; + /** + * The index into Matrix4 for column 2, row 1. + */ + static readonly COLUMN2ROW1: number; + /** + * The index into Matrix4 for column 2, row 2. + */ + static readonly COLUMN2ROW2: number; + /** + * The index into Matrix4 for column 2, row 3. + */ + static readonly COLUMN2ROW3: number; + /** + * The index into Matrix4 for column 3, row 0. + */ + static readonly COLUMN3ROW0: number; + /** + * The index into Matrix4 for column 3, row 1. + */ + static readonly COLUMN3ROW1: number; + /** + * The index into Matrix4 for column 3, row 2. + */ + static readonly COLUMN3ROW2: number; + /** + * The index into Matrix4 for column 3, row 3. + */ + static readonly COLUMN3ROW3: number; + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Duplicates the provided Matrix4 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. + */ + clone(result?: Matrix4): Matrix4; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side matrix. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Matrix4): boolean; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Matrix4, epsilon?: number): boolean; + /** + * Computes a string representing this Matrix with each row being + * on a separate line and in the format '(column0, column1, column2, column3)'. + * @returns A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2, column3)'. + */ + toString(): string; +} + +/** + * Represents a scalar value's lower and upper bound at a near distance and far distance in eye space. + * @param [near = 0.0] - The lower bound of the camera range. + * @param [nearValue = 0.0] - The value at the lower bound of the camera range. + * @param [far = 1.0] - The upper bound of the camera range. + * @param [farValue = 0.0] - The value at the upper bound of the camera range. + */ +export class NearFarScalar { + constructor(near?: number, nearValue?: number, far?: number, farValue?: number); + /** + * The lower bound of the camera range. + */ + near: number; + /** + * The value at the lower bound of the camera range. + */ + nearValue: number; + /** + * The upper bound of the camera range. + */ + far: number; + /** + * The value at the upper bound of the camera range. + */ + farValue: number; + /** + * Duplicates a NearFarScalar instance. + * @param nearFarScalar - The NearFarScalar to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new NearFarScalar instance if one was not provided. (Returns undefined if nearFarScalar is undefined) + */ + static clone(nearFarScalar: NearFarScalar, result?: NearFarScalar): NearFarScalar; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: NearFarScalar, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new NearFarScalar instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: NearFarScalar): NearFarScalar; + /** + * Compares the provided NearFarScalar and returns true if they are equal, + * false otherwise. + * @param [left] - The first NearFarScalar. + * @param [right] - The second NearFarScalar. + * @returns true if left and right are equal; otherwise false. + */ + static equals(left?: NearFarScalar, right?: NearFarScalar): boolean; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new NearFarScalar instance if one was not provided. + */ + clone(result?: NearFarScalar): NearFarScalar; + /** + * Compares this instance to the provided NearFarScalar and returns true if they are equal, + * false otherwise. + * @param [right] - The right hand side NearFarScalar. + * @returns true if left and right are equal; otherwise false. + */ + equals(right?: NearFarScalar): boolean; +} + +/** + * Creates an Occluder derived from an object's position and radius, as well as the camera position. + * The occluder can be used to determine whether or not other objects are visible or hidden behind the + * visible horizon defined by the occluder and camera position. + * @example + * // Construct an occluder one unit away from the origin with a radius of one. + * var cameraPosition = Cesium.Cartesian3.ZERO; + * var occluderBoundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1), 1); + * var occluder = new Cesium.Occluder(occluderBoundingSphere, cameraPosition); + * @param occluderBoundingSphere - The bounding sphere surrounding the occluder. + * @param cameraPosition - The coordinate of the viewer/camera. + */ +export class Occluder { + constructor(occluderBoundingSphere: BoundingSphere, cameraPosition: Cartesian3); + /** + * The position of the occluder. + */ + position: Cartesian3; + /** + * The radius of the occluder. + */ + radius: number; + /** + * The position of the camera. + */ + cameraPosition: Cartesian3; + /** + * Creates an occluder from a bounding sphere and the camera position. + * @param occluderBoundingSphere - The bounding sphere surrounding the occluder. + * @param cameraPosition - The coordinate of the viewer/camera. + * @param [result] - The object onto which to store the result. + * @returns The occluder derived from an object's position and radius, as well as the camera position. + */ + static fromBoundingSphere(occluderBoundingSphere: BoundingSphere, cameraPosition: Cartesian3, result?: Occluder): Occluder; + /** + * Determines whether or not a point, the occludee, is hidden from view by the occluder. + * @example + * var cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * var littleSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1), 0.25); + * var occluder = new Cesium.Occluder(littleSphere, cameraPosition); + * var point = new Cesium.Cartesian3(0, 0, -3); + * occluder.isPointVisible(point); //returns true + * @param occludee - The point surrounding the occludee object. + * @returns true if the occludee is visible; otherwise false. + */ + isPointVisible(occludee: Cartesian3): boolean; + /** + * Determines whether or not a sphere, the occludee, is hidden from view by the occluder. + * @example + * var cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * var littleSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1), 0.25); + * var occluder = new Cesium.Occluder(littleSphere, cameraPosition); + * var bigSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -3), 1); + * occluder.isBoundingSphereVisible(bigSphere); //returns true + * @param occludee - The bounding sphere surrounding the occludee object. + * @returns true if the occludee is visible; otherwise false. + */ + isBoundingSphereVisible(occludee: BoundingSphere): boolean; + /** + * Determine to what extent an occludee is visible (not visible, partially visible, or fully visible). + * @example + * var sphere1 = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1.5), 0.5); + * var sphere2 = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -2.5), 0.5); + * var cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * var occluder = new Cesium.Occluder(sphere1, cameraPosition); + * occluder.computeVisibility(sphere2); //returns Visibility.NONE + * @param occludeeBS - The bounding sphere of the occludee. + * @returns Visibility.NONE if the occludee is not visible, + * Visibility.PARTIAL if the occludee is partially visible, or + * Visibility.FULL if the occludee is fully visible. + */ + computeVisibility(occludeeBS: BoundingSphere): Visibility; + /** + * Computes a point that can be used as the occludee position to the visibility functions. + * Use a radius of zero for the occludee radius. Typically, a user computes a bounding sphere around + * an object that is used for visibility; however it is also possible to compute a point that if + * seen/not seen would also indicate if an object is visible/not visible. This function is better + * called for objects that do not move relative to the occluder and is large, such as a chunk of + * terrain. You are better off not calling this and using the object's bounding sphere for objects + * such as a satellite or ground vehicle. + * @example + * var cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * var occluderBoundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -8), 2); + * var occluder = new Cesium.Occluder(occluderBoundingSphere, cameraPosition); + * var positions = [new Cesium.Cartesian3(-0.25, 0, -5.3), new Cesium.Cartesian3(0.25, 0, -5.3)]; + * var tileOccluderSphere = Cesium.BoundingSphere.fromPoints(positions); + * var occludeePosition = tileOccluderSphere.center; + * var occludeePt = Cesium.Occluder.computeOccludeePoint(occluderBoundingSphere, occludeePosition, positions); + * @param occluderBoundingSphere - The bounding sphere surrounding the occluder. + * @param occludeePosition - The point where the occludee (bounding sphere of radius 0) is located. + * @param positions - List of altitude points on the horizon near the surface of the occluder. + * @returns An object containing two attributes: occludeePoint and valid + * which is a boolean value. + */ + static computeOccludeePoint(occluderBoundingSphere: BoundingSphere, occludeePosition: Cartesian3, positions: Cartesian3[]): any; + /** + * Computes a point that can be used as the occludee position to the visibility functions from a rectangle. + * @param rectangle - The rectangle used to create a bounding sphere. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid used to determine positions of the rectangle. + * @returns An object containing two attributes: occludeePoint and valid + * which is a boolean value. + */ + static computeOccludeePointFromRectangle(rectangle: Rectangle, ellipsoid?: Ellipsoid): any; +} + +/** + * Provides geocoding via a {@link https://opencagedata.com/|OpenCage} server. + * @example + * // Configure a Viewer to use the OpenCage Geocoder + * var viewer = new Cesium.Viewer('cesiumContainer', { + * geocoder: new Cesium.OpenCageGeocoderService('https://api.opencagedata.com/geocode/v1/', '') + * }); + * @param url - The endpoint to the OpenCage server. + * @param apiKey - The OpenCage API Key. + * @param [params] - An object with the following properties (See https://opencagedata.com/api#forward-opt): + * @param [params.abbrv] - When set to 1 we attempt to abbreviate and shorten the formatted string we return. + * @param [options.add_request] - When set to 1 the various request parameters are added to the response for ease of debugging. + * @param [options.bounds] - Provides the geocoder with a hint to the region that the query resides in. + * @param [options.countrycode] - Restricts the results to the specified country or countries (as defined by the ISO 3166-1 Alpha 2 standard). + * @param [options.jsonp] - Wraps the returned JSON with a function name. + * @param [options.language] - An IETF format language code. + * @param [options.limit] - The maximum number of results we should return. + * @param [options.min_confidence] - An integer from 1-10. Only results with at least this confidence will be returned. + * @param [options.no_annotations] - When set to 1 results will not contain annotations. + * @param [options.no_dedupe] - When set to 1 results will not be deduplicated. + * @param [options.no_record] - When set to 1 the query contents are not logged. + * @param [options.pretty] - When set to 1 results are 'pretty' printed for easier reading. Useful for debugging. + * @param [options.proximity] - Provides the geocoder with a hint to bias results in favour of those closer to the specified location (For example: 41.40139,2.12870). + */ +export class OpenCageGeocoderService { + constructor(url: Resource | string, apiKey: string, params?: { + abbrv?: number; + }); + /** + * The Resource used to access the OpenCage endpoint. + */ + readonly url: Resource; + /** + * Optional params passed to OpenCage in order to customize geocoding + */ + readonly params: any; + /** + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; +} + +/** + * Creates an instance of an OrientedBoundingBox. + * An OrientedBoundingBox of some object is a closed and convex cuboid. It can provide a tighter bounding volume than {@link BoundingSphere} or {@link AxisAlignedBoundingBox} in many cases. + * @example + * // Create an OrientedBoundingBox using a transformation matrix, a position where the box will be translated, and a scale. + * var center = new Cesium.Cartesian3(1.0, 0.0, 0.0); + * var halfAxes = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(1.0, 3.0, 2.0), new Cesium.Matrix3()); + * + * var obb = new Cesium.OrientedBoundingBox(center, halfAxes); + * @param [center = Cartesian3.ZERO] - The center of the box. + * @param [halfAxes = Matrix3.ZERO] - The three orthogonal half-axes of the bounding box. + * Equivalently, the transformation matrix, to rotate and scale a 0x0x0 + * cube centered at the origin. + */ +export class OrientedBoundingBox { + constructor(center?: Cartesian3, halfAxes?: Matrix3); + /** + * The center of the box. + */ + center: Cartesian3; + /** + * The transformation matrix, to rotate the box to the right position. + */ + halfAxes: Matrix3; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: OrientedBoundingBox, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: OrientedBoundingBox): OrientedBoundingBox; + /** + * Computes an instance of an OrientedBoundingBox of the given positions. + * This is an implementation of Stefan Gottschalk's Collision Queries using Oriented Bounding Boxes solution (PHD thesis). + * Reference: http://gamma.cs.unc.edu/users/gottschalk/main.pdf + * @example + * // Compute an object oriented bounding box enclosing two points. + * var box = Cesium.OrientedBoundingBox.fromPoints([new Cesium.Cartesian3(2, 0, 0), new Cesium.Cartesian3(-2, 0, 0)]); + * @param [positions] - List of {@link Cartesian3} points that the bounding box will enclose. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if one was not provided. + */ + static fromPoints(positions?: Cartesian3[], result?: OrientedBoundingBox): OrientedBoundingBox; + /** + * Computes an OrientedBoundingBox that bounds a {@link Rectangle} on the surface of an {@link Ellipsoid}. + * There are no guarantees about the orientation of the bounding box. + * @param rectangle - The cartographic rectangle on the surface of the ellipsoid. + * @param [minimumHeight = 0.0] - The minimum height (elevation) within the tile. + * @param [maximumHeight = 0.0] - The maximum height (elevation) within the tile. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the rectangle is defined. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if none was provided. + */ + static fromRectangle(rectangle: Rectangle, minimumHeight?: number, maximumHeight?: number, ellipsoid?: Ellipsoid, result?: OrientedBoundingBox): OrientedBoundingBox; + /** + * Duplicates a OrientedBoundingBox instance. + * @param box - The bounding box to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if none was provided. (Returns undefined if box is undefined) + */ + static clone(box: OrientedBoundingBox, result?: OrientedBoundingBox): OrientedBoundingBox; + /** + * Determines which side of a plane the oriented bounding box is located. + * @param box - The oriented bounding box to test. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + static intersectPlane(box: OrientedBoundingBox, plane: Plane): Intersect; + /** + * Computes the estimated distance squared from the closest point on a bounding box to a point. + * @example + * // Sort bounding boxes from back to front + * boxes.sort(function(a, b) { + * return Cesium.OrientedBoundingBox.distanceSquaredTo(b, camera.positionWC) - Cesium.OrientedBoundingBox.distanceSquaredTo(a, camera.positionWC); + * }); + * @param box - The box. + * @param cartesian - The point + * @returns The estimated distance squared from the bounding sphere to the point. + */ + static distanceSquaredTo(box: OrientedBoundingBox, cartesian: Cartesian3): number; + /** + * The distances calculated by the vector from the center of the bounding box to position projected onto direction. + *
    + * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding box. + * @param box - The bounding box to calculate the distance to. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding box from position in direction. + */ + static computePlaneDistances(box: OrientedBoundingBox, position: Cartesian3, direction: Cartesian3, result?: Interval): Interval; + /** + * Determines whether or not a bounding box is hidden from view by the occluder. + * @param box - The bounding box surrounding the occludee object. + * @param occluder - The occluder. + * @returns true if the box is not visible; otherwise false. + */ + static isOccluded(box: OrientedBoundingBox, occluder: Occluder): boolean; + /** + * Determines which side of a plane the oriented bounding box is located. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + intersectPlane(plane: Plane): Intersect; + /** + * Computes the estimated distance squared from the closest point on a bounding box to a point. + * @example + * // Sort bounding boxes from back to front + * boxes.sort(function(a, b) { + * return b.distanceSquaredTo(camera.positionWC) - a.distanceSquaredTo(camera.positionWC); + * }); + * @param cartesian - The point + * @returns The estimated distance squared from the bounding sphere to the point. + */ + distanceSquaredTo(cartesian: Cartesian3): number; + /** + * The distances calculated by the vector from the center of the bounding box to position projected onto direction. + *
    + * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding box. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding box from position in direction. + */ + computePlaneDistances(position: Cartesian3, direction: Cartesian3, result?: Interval): Interval; + /** + * Determines whether or not a bounding box is hidden from view by the occluder. + * @param occluder - The occluder. + * @returns true if the sphere is not visible; otherwise false. + */ + isOccluded(occluder: Occluder): boolean; + /** + * Compares the provided OrientedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param left - The first OrientedBoundingBox. + * @param right - The second OrientedBoundingBox. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left: OrientedBoundingBox, right: OrientedBoundingBox): boolean; + /** + * Duplicates this OrientedBoundingBox instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if one was not provided. + */ + clone(result?: OrientedBoundingBox): OrientedBoundingBox; + /** + * Compares this OrientedBoundingBox against the provided OrientedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side OrientedBoundingBox. + * @returns true if they are equal, false otherwise. + */ + equals(right?: OrientedBoundingBox): boolean; +} + +/** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * var maxRadii = ellipsoid.maximumRadius; + * + * var frustum = new Cesium.OrthographicFrustum(); + * frustum.near = 0.01 * maxRadii; + * frustum.far = 50.0 * maxRadii; + * @param [options] - An object with the following properties: + * @param [options.width] - The width of the frustum in meters. + * @param [options.aspectRatio] - The aspect ratio of the frustum's width to it's height. + * @param [options.near = 1.0] - The distance of the near plane. + * @param [options.far = 500000000.0] - The distance of the far plane. + */ +export class OrthographicFrustum { + constructor(options?: { + width?: number; + aspectRatio?: number; + near?: number; + far?: number; + }); + /** + * The horizontal width of the frustum in meters. + */ + width: number; + /** + * The aspect ratio of the frustum's width to it's height. + */ + aspectRatio: number; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: OrthographicFrustum, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new OrthographicFrustum instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: OrthographicFrustum): OrthographicFrustum; + /** + * Gets the orthographic projection matrix computed from the view frustum. + */ + readonly projectionMatrix: Matrix4; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * var intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume(position: Cartesian3, direction: Cartesian3, up: Cartesian3): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 0.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions(drawingBufferWidth: number, drawingBufferHeight: number, distance: number, pixelRatio: number, result: Cartesian2): Cartesian2; + /** + * Returns a duplicate of a OrthographicFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrthographicFrustum instance if one was not provided. + */ + clone(result?: OrthographicFrustum): OrthographicFrustum; + /** + * Compares the provided OrthographicFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side OrthographicFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: OrthographicFrustum): boolean; + /** + * Compares the provided OrthographicFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side OrthographicFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon(other: OrthographicFrustum, relativeEpsilon: number, absoluteEpsilon?: number): boolean; +} + +/** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * var maxRadii = ellipsoid.maximumRadius; + * + * var frustum = new Cesium.OrthographicOffCenterFrustum(); + * frustum.right = maxRadii * Cesium.Math.PI; + * frustum.left = -c.frustum.right; + * frustum.top = c.frustum.right * (canvas.clientHeight / canvas.clientWidth); + * frustum.bottom = -c.frustum.top; + * frustum.near = 0.01 * maxRadii; + * frustum.far = 50.0 * maxRadii; + * @param [options] - An object with the following properties: + * @param [options.left] - The left clipping plane distance. + * @param [options.right] - The right clipping plane distance. + * @param [options.top] - The top clipping plane distance. + * @param [options.bottom] - The bottom clipping plane distance. + * @param [options.near = 1.0] - The near clipping plane distance. + * @param [options.far = 500000000.0] - The far clipping plane distance. + */ +export class OrthographicOffCenterFrustum { + constructor(options?: { + left?: number; + right?: number; + top?: number; + bottom?: number; + near?: number; + far?: number; + }); + /** + * The left clipping plane. + */ + left: number; + /** + * The right clipping plane. + */ + right: number; + /** + * The top clipping plane. + */ + top: number; + /** + * The bottom clipping plane. + */ + bottom: number; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * Gets the orthographic projection matrix computed from the view frustum. + */ + readonly projectionMatrix: Matrix4; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * var intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume(position: Cartesian3, direction: Cartesian3, up: Cartesian3): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 0.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions(drawingBufferWidth: number, drawingBufferHeight: number, distance: number, pixelRatio: number, result: Cartesian2): Cartesian2; + /** + * Returns a duplicate of a OrthographicOffCenterFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrthographicOffCenterFrustum instance if one was not provided. + */ + clone(result?: OrthographicOffCenterFrustum): OrthographicOffCenterFrustum; + /** + * Compares the provided OrthographicOffCenterFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side OrthographicOffCenterFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: OrthographicOffCenterFrustum): boolean; + /** + * Compares the provided OrthographicOffCenterFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side OrthographicOffCenterFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon(other: OrthographicOffCenterFrustum, relativeEpsilon: number, absoluteEpsilon?: number): boolean; +} + +export namespace Packable { + /** + * The number of elements used to pack the object into an array. + */ + var packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + */ + function pack(value: any, array: number[], startingIndex?: number): void; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Object instance if one was not provided. + */ + function unpack(array: number[], startingIndex?: number, result?: any): any; +} + +/** + * Static interface for types which can store their values as packed + * elements in an array. These methods and properties are expected to be + * defined on a constructor function. + */ +export interface Packable { +} + +/** + * Static interface for {@link Packable} types which are interpolated in a + * different representation than their packed value. These methods and + * properties are expected to be defined on a constructor function. + */ +export namespace PackableForInterpolation { + /** + * The number of elements used to store the object into an array in its interpolatable form. + */ + var packedInterpolationLength: number; + /** + * Converts a packed array into a form suitable for interpolation. + * @param packedArray - The packed array. + * @param [startingIndex = 0] - The index of the first element to be converted. + * @param [lastIndex = packedArray.length] - The index of the last element to be converted. + * @param [result] - The object into which to store the result. + */ + function convertPackedArrayForInterpolation(packedArray: number[], startingIndex?: number, lastIndex?: number, result?: number[]): void; + /** + * Retrieves an instance from a packed array converted with {@link PackableForInterpolation.convertPackedArrayForInterpolation}. + * @param array - The array previously packed for interpolation. + * @param sourceArray - The original packed array. + * @param [startingIndex = 0] - The startingIndex used to convert the array. + * @param [lastIndex = packedArray.length] - The lastIndex used to convert the array. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Object instance if one was not provided. + */ + function unpackInterpolationResult(array: number[], sourceArray: number[], startingIndex?: number, lastIndex?: number, result?: any): any; +} + +/** + * Provides geocoding via a {@link https://pelias.io/|Pelias} server. + * @example + * // Configure a Viewer to use the Pelias server hosted by https://geocode.earth/ + * var viewer = new Cesium.Viewer('cesiumContainer', { + * geocoder: new Cesium.PeliasGeocoderService(new Cesium.Resource({ + * url: 'https://api.geocode.earth/v1/', + * queryParameters: { + * api_key: '' + * } + * })) + * }); + * @param url - The endpoint to the Pelias server. + */ +export class PeliasGeocoderService { + constructor(url: Resource | string); + /** + * The Resource used to access the Pelias endpoint. + */ + readonly url: Resource; + /** + * @param query - The query to be sent to the geocoder service + * @param [type = GeocodeType.SEARCH] - The type of geocode to perform. + */ + geocode(query: string, type?: GeocodeType): Promise; +} + +/** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * var frustum = new Cesium.PerspectiveFrustum({ + * fov : Cesium.Math.PI_OVER_THREE, + * aspectRatio : canvas.clientWidth / canvas.clientHeight + * near : 1.0, + * far : 1000.0 + * }); + * @param [options] - An object with the following properties: + * @param [options.fov] - The angle of the field of view (FOV), in radians. + * @param [options.aspectRatio] - The aspect ratio of the frustum's width to it's height. + * @param [options.near = 1.0] - The distance of the near plane. + * @param [options.far = 500000000.0] - The distance of the far plane. + * @param [options.xOffset = 0.0] - The offset in the x direction. + * @param [options.yOffset = 0.0] - The offset in the y direction. + */ +export class PerspectiveFrustum { + constructor(options?: { + fov?: number; + aspectRatio?: number; + near?: number; + far?: number; + xOffset?: number; + yOffset?: number; + }); + /** + * The angle of the field of view (FOV), in radians. This angle will be used + * as the horizontal FOV if the width is greater than the height, otherwise + * it will be the vertical FOV. + */ + fov: number; + /** + * The aspect ratio of the frustum's width to it's height. + */ + aspectRatio: number; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * Offsets the frustum in the x direction. + */ + xOffset: number; + /** + * Offsets the frustum in the y direction. + */ + yOffset: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PerspectiveFrustum, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PerspectiveFrustum instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PerspectiveFrustum): PerspectiveFrustum; + /** + * Gets the perspective projection matrix computed from the view frustum. + */ + readonly projectionMatrix: Matrix4; + /** + * The perspective projection matrix computed from the view frustum with an infinite far plane. + */ + readonly infiniteProjectionMatrix: Matrix4; + /** + * Gets the angle of the vertical field of view, in radians. + */ + readonly fovy: number; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * var intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume(position: Cartesian3, direction: Cartesian3, up: Cartesian3): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @example + * // Example 2 + * // Get the width and height of a pixel if the near plane was set to 'distance'. + * // For example, get the size of a pixel of an image on a billboard. + * var position = camera.position; + * var direction = camera.direction; + * var toCenter = Cesium.Cartesian3.subtract(primitive.boundingVolume.center, position, new Cesium.Cartesian3()); // vector from camera to a primitive + * var toCenterProj = Cesium.Cartesian3.multiplyByScalar(direction, Cesium.Cartesian3.dot(direction, toCenter), new Cesium.Cartesian3()); // project vector onto camera direction vector + * var distance = Cesium.Cartesian3.magnitude(toCenterProj); + * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions(drawingBufferWidth: number, drawingBufferHeight: number, distance: number, pixelRatio: number, result: Cartesian2): Cartesian2; + /** + * Returns a duplicate of a PerspectiveFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new PerspectiveFrustum instance if one was not provided. + */ + clone(result?: PerspectiveFrustum): PerspectiveFrustum; + /** + * Compares the provided PerspectiveFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side PerspectiveFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: PerspectiveFrustum): boolean; + /** + * Compares the provided PerspectiveFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side PerspectiveFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon(other: PerspectiveFrustum, relativeEpsilon: number, absoluteEpsilon?: number): boolean; +} + +/** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * var frustum = new Cesium.PerspectiveOffCenterFrustum({ + * left : -1.0, + * right : 1.0, + * top : 1.0, + * bottom : -1.0, + * near : 1.0, + * far : 100.0 + * }); + * @param [options] - An object with the following properties: + * @param [options.left] - The left clipping plane distance. + * @param [options.right] - The right clipping plane distance. + * @param [options.top] - The top clipping plane distance. + * @param [options.bottom] - The bottom clipping plane distance. + * @param [options.near = 1.0] - The near clipping plane distance. + * @param [options.far = 500000000.0] - The far clipping plane distance. + */ +export class PerspectiveOffCenterFrustum { + constructor(options?: { + left?: number; + right?: number; + top?: number; + bottom?: number; + near?: number; + far?: number; + }); + /** + * Defines the left clipping plane. + */ + left: number; + /** + * Defines the right clipping plane. + */ + right: number; + /** + * Defines the top clipping plane. + */ + top: number; + /** + * Defines the bottom clipping plane. + */ + bottom: number; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * Gets the perspective projection matrix computed from the view frustum. + */ + readonly projectionMatrix: Matrix4; + /** + * Gets the perspective projection matrix computed from the view frustum with an infinite far plane. + */ + readonly infiniteProjectionMatrix: Matrix4; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * var intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume(position: Cartesian3, direction: Cartesian3, up: Cartesian3): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @example + * // Example 2 + * // Get the width and height of a pixel if the near plane was set to 'distance'. + * // For example, get the size of a pixel of an image on a billboard. + * var position = camera.position; + * var direction = camera.direction; + * var toCenter = Cesium.Cartesian3.subtract(primitive.boundingVolume.center, position, new Cesium.Cartesian3()); // vector from camera to a primitive + * var toCenterProj = Cesium.Cartesian3.multiplyByScalar(direction, Cesium.Cartesian3.dot(direction, toCenter), new Cesium.Cartesian3()); // project vector onto camera direction vector + * var distance = Cesium.Cartesian3.magnitude(toCenterProj); + * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions(drawingBufferWidth: number, drawingBufferHeight: number, distance: number, pixelRatio: number, result: Cartesian2): Cartesian2; + /** + * Returns a duplicate of a PerspectiveOffCenterFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new PerspectiveFrustum instance if one was not provided. + */ + clone(result?: PerspectiveOffCenterFrustum): PerspectiveOffCenterFrustum; + /** + * Compares the provided PerspectiveOffCenterFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side PerspectiveOffCenterFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: PerspectiveOffCenterFrustum): boolean; + /** + * Compares the provided PerspectiveOffCenterFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side PerspectiveOffCenterFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon(other: PerspectiveOffCenterFrustum, relativeEpsilon: number, absoluteEpsilon?: number): boolean; +} + +/** + * A utility class for generating custom map pins as canvas elements. + *

    + *
    + *
    + * Example pins generated using both the maki icon set, which ships with Cesium, and single character text. + *
    + */ +export class PinBuilder { + constructor(); + /** + * Creates an empty pin of the specified color and size. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element that represents the generated pin. + */ + fromColor(color: Color, size: number): HTMLCanvasElement; + /** + * Creates a pin with the specified icon, color, and size. + * @param url - The url of the image to be stamped onto the pin. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element or a Promise to the canvas element that represents the generated pin. + */ + fromUrl(url: Resource | string, color: Color, size: number): HTMLCanvasElement | Promise; + /** + * Creates a pin with the specified {@link https://www.mapbox.com/maki/|maki} icon identifier, color, and size. + * @param id - The id of the maki icon to be stamped onto the pin. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element or a Promise to the canvas element that represents the generated pin. + */ + fromMakiIconId(id: string, color: Color, size: number): HTMLCanvasElement | Promise; + /** + * Creates a pin with the specified text, color, and size. The text will be sized to be as large as possible + * while still being contained completely within the pin. + * @param text - The text to be stamped onto the pin. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element that represents the generated pin. + */ + fromText(text: string, color: Color, size: number): HTMLCanvasElement; +} + +/** + * The format of a pixel, i.e., the number of components it has and what they represent. + */ +export enum PixelFormat { + /** + * A pixel format containing a depth value. + */ + DEPTH_COMPONENT = WebGLConstants.DEPTH_COMPONENT, + /** + * A pixel format containing a depth and stencil value, most often used with {@link PixelDatatype.UNSIGNED_INT_24_8}. + */ + DEPTH_STENCIL = WebGLConstants.DEPTH_STENCIL, + /** + * A pixel format containing an alpha channel. + */ + ALPHA = WebGLConstants.ALPHA, + /** + * A pixel format containing red, green, and blue channels. + */ + RGB = WebGLConstants.RGB, + /** + * A pixel format containing red, green, blue, and alpha channels. + */ + RGBA = WebGLConstants.RGBA, + /** + * A pixel format containing a luminance (intensity) channel. + */ + LUMINANCE = WebGLConstants.LUMINANCE, + /** + * A pixel format containing luminance (intensity) and alpha channels. + */ + LUMINANCE_ALPHA = WebGLConstants.LUMINANCE_ALPHA, + /** + * A pixel format containing red, green, and blue channels that is DXT1 compressed. + */ + RGB_DXT1 = WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed. + */ + RGBA_DXT1 = WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed. + */ + RGBA_DXT3 = WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed. + */ + RGBA_DXT5 = WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT, + /** + * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed. + */ + RGB_PVRTC_4BPPV1 = WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed. + */ + RGB_PVRTC_2BPPV1 = WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed. + */ + RGBA_PVRTC_4BPPV1 = WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed. + */ + RGBA_PVRTC_2BPPV1 = WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, and blue channels that is ETC1 compressed. + */ + RGB_ETC1 = WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL +} + +/** + * A plane in Hessian Normal Form defined by + *
    + * ax + by + cz + d = 0
    + * 
    + * where (a, b, c) is the plane's normal, d is the signed + * distance to the plane, and (x, y, z) is any point on + * the plane. + * @example + * // The plane x=0 + * var plane = new Cesium.Plane(Cesium.Cartesian3.UNIT_X, 0.0); + * @param normal - The plane's normal (normalized). + * @param distance - The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ +export class Plane { + constructor(normal: Cartesian3, distance: number); + /** + * The plane's normal. + */ + normal: Cartesian3; + /** + * The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ + distance: number; + /** + * Creates a plane from a normal and a point on the plane. + * @example + * var point = Cesium.Cartesian3.fromDegrees(-72.0, 40.0); + * var normal = ellipsoid.geodeticSurfaceNormal(point); + * var tangentPlane = Cesium.Plane.fromPointNormal(point, normal); + * @param point - The point on the plane. + * @param normal - The plane's normal (normalized). + * @param [result] - The object onto which to store the result. + * @returns A new plane instance or the modified result parameter. + */ + static fromPointNormal(point: Cartesian3, normal: Cartesian3, result?: Plane): Plane; + /** + * Creates a plane from the general equation + * @param coefficients - The plane's normal (normalized). + * @param [result] - The object onto which to store the result. + * @returns A new plane instance or the modified result parameter. + */ + static fromCartesian4(coefficients: Cartesian4, result?: Plane): Plane; + /** + * Computes the signed shortest distance of a point to a plane. + * The sign of the distance determines which side of the plane the point + * is on. If the distance is positive, the point is in the half-space + * in the direction of the normal; if negative, the point is in the half-space + * opposite to the normal; if zero, the plane passes through the point. + * @param plane - The plane. + * @param point - The point. + * @returns The signed shortest distance of the point to the plane. + */ + static getPointDistance(plane: Plane, point: Cartesian3): number; + /** + * Projects a point onto the plane. + * @param plane - The plane to project the point onto + * @param point - The point to project onto the plane + * @param [result] - The result point. If undefined, a new Cartesian3 will be created. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static projectPointOntoPlane(plane: Plane, point: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Transforms the plane by the given transformation matrix. + * @param plane - The plane. + * @param transform - The transformation matrix. + * @param [result] - The object into which to store the result. + * @returns The plane transformed by the given transformation matrix. + */ + static transform(plane: Plane, transform: Matrix4, result?: Plane): Plane; + /** + * Duplicates a Plane instance. + * @param plane - The plane to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Plane instance if one was not provided. + */ + static clone(plane: Plane, result?: Plane): Plane; + /** + * Compares the provided Planes by normal and distance and returns + * true if they are equal, false otherwise. + * @param left - The first plane. + * @param right - The second plane. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left: Plane, right: Plane): boolean; + /** + * A constant initialized to the XY plane passing through the origin, with normal in positive Z. + */ + static readonly ORIGIN_XY_PLANE: Plane; + /** + * A constant initialized to the YZ plane passing through the origin, with normal in positive X. + */ + static readonly ORIGIN_YZ_PLANE: Plane; + /** + * A constant initialized to the ZX plane passing through the origin, with normal in positive Y. + */ + static readonly ORIGIN_ZX_PLANE: Plane; +} + +/** + * Describes geometry representing a plane centered at the origin, with a unit width and length. + * @example + * var planeGeometry = new Cesium.PlaneGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY + * }); + * @param [options] - Object with the following properties: + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class PlaneGeometry { + constructor(options?: { + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PlaneGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PlaneGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PlaneGeometry): PlaneGeometry; + /** + * Computes the geometric representation of a plane, including its vertices, indices, and a bounding sphere. + * @param planeGeometry - A description of the plane. + * @returns The computed vertices and indices. + */ + static createGeometry(planeGeometry: PlaneGeometry): Geometry | undefined; +} + +/** + * Describes geometry representing the outline of a plane centered at the origin, with a unit width and length. + */ +export class PlaneOutlineGeometry { + constructor(); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @returns The array that was packed into + */ + static pack(value: PlaneOutlineGeometry, array: number[]): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PlaneOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PlaneOutlineGeometry): PlaneOutlineGeometry; + /** + * Computes the geometric representation of an outline of a plane, including its vertices, indices, and a bounding sphere. + * @returns The computed vertices and indices. + */ + static createGeometry(): Geometry | undefined; +} + +/** + * A description of a polygon on the ellipsoid. The polygon is defined by a polygon hierarchy. Polygon geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // 1. create a polygon from points + * var polygon = new Cesium.PolygonGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ) + * }); + * var geometry = Cesium.PolygonGeometry.createGeometry(polygon); + * + * // 2. create a nested polygon with holes + * var polygonWithHole = new Cesium.PolygonGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -109.0, 30.0, + * -95.0, 30.0, + * -95.0, 40.0, + * -109.0, 40.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -107.0, 31.0, + * -107.0, 39.0, + * -97.0, 39.0, + * -97.0, 31.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -105.0, 33.0, + * -99.0, 33.0, + * -99.0, 37.0, + * -105.0, 37.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -103.0, 34.0, + * -101.0, 34.0, + * -101.0, 36.0, + * -103.0, 36.0 + * ]) + * )] + * )] + * )] + * ) + * }); + * var geometry = Cesium.PolygonGeometry.createGeometry(polygonWithHole); + * + * // 3. create extruded polygon + * var extrudedPolygon = new Cesium.PolygonGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ), + * extrudedHeight: 300000 + * }); + * var geometry = Cesium.PolygonGeometry.createGeometry(extrudedPolygon); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.height = 0.0] - The distance in meters between the polygon and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the polygon's extruded face and the ellipsoid surface. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.closeTop = true] - When false, leaves off the top of an extruded polygon open. + * @param [options.closeBottom = true] - When false, leaves off the bottom of an extruded polygon open. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ +export class PolygonGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + stRotation?: number; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + closeTop?: boolean; + closeBottom?: boolean; + arcType?: ArcType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * A description of a polygon from an array of positions. Polygon geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // create a polygon from points + * var polygon = Cesium.PolygonGeometry.fromPositions({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * }); + * var geometry = Cesium.PolygonGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + * @param [options.height = 0.0] - The height of the polygon. + * @param [options.extrudedHeight] - The height of the polygon extrusion. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.closeTop = true] - When false, leaves off the top of an extruded polygon open. + * @param [options.closeBottom = true] - When false, leaves off the bottom of an extruded polygon open. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ + static fromPositions(options: { + positions: Cartesian3[]; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + stRotation?: number; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + closeTop?: boolean; + closeBottom?: boolean; + arcType?: ArcType; + }): PolygonGeometry; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PolygonGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack(array: number[], startingIndex?: number, result?: PolygonGeometry): void; + /** + * Returns the bounding rectangle given the provided options + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions sampled. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [result] - An object in which to store the result. + * @returns The result rectangle + */ + static computeRectangle(options: { + polygonHierarchy: PolygonHierarchy; + granularity?: number; + arcType?: ArcType; + ellipsoid?: Ellipsoid; + }, result?: Rectangle): Rectangle; + /** + * Computes the geometric representation of a polygon, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon. + * @returns The computed vertices and indices. + */ + static createGeometry(polygonGeometry: PolygonGeometry): Geometry | undefined; +} + +/** + * An hierarchy of linear rings which define a polygon and its holes. + * The holes themselves may also have holes which nest inner polygons. + * @param [positions] - A linear ring defining the outer boundary of the polygon or hole. + * @param [holes] - An array of polygon hierarchies defining holes in the polygon. + */ +export class PolygonHierarchy { + constructor(positions?: Cartesian3[], holes?: PolygonHierarchy[]); + /** + * A linear ring defining the outer boundary of the polygon or hole. + */ + positions: Cartesian3[]; + /** + * An array of polygon hierarchies defining holes in the polygon. + */ + holes: PolygonHierarchy[]; +} + +/** + * A description of the outline of a polygon on the ellipsoid. The polygon is defined by a polygon hierarchy. + * @example + * // 1. create a polygon outline from points + * var polygon = new Cesium.PolygonOutlineGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ) + * }); + * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygon); + * + * // 2. create a nested polygon with holes outline + * var polygonWithHole = new Cesium.PolygonOutlineGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -109.0, 30.0, + * -95.0, 30.0, + * -95.0, 40.0, + * -109.0, 40.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -107.0, 31.0, + * -107.0, 39.0, + * -97.0, 39.0, + * -97.0, 31.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -105.0, 33.0, + * -99.0, 33.0, + * -99.0, 37.0, + * -105.0, 37.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -103.0, 34.0, + * -101.0, 34.0, + * -101.0, 36.0, + * -103.0, 36.0 + * ]) + * )] + * )] + * )] + * ) + * }); + * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygonWithHole); + * + * // 3. create extruded polygon outline + * var extrudedPolygon = new Cesium.PolygonOutlineGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ), + * extrudedHeight: 300000 + * }); + * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(extrudedPolygon); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.height = 0.0] - The distance in meters between the polygon and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the polygon's extruded face and the ellipsoid surface. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.arcType = ArcType.GEODESIC] - The type of path the outline must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ +export class PolygonOutlineGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + arcType?: ArcType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PolygonOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolygonOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PolygonOutlineGeometry): PolygonOutlineGeometry; + /** + * A description of a polygon outline from an array of positions. + * @example + * // create a polygon from points + * var polygon = Cesium.PolygonOutlineGeometry.fromPositions({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * }); + * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + * @param [options.height = 0.0] - The height of the polygon. + * @param [options.extrudedHeight] - The height of the polygon extrusion. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.arcType = ArcType.GEODESIC] - The type of path the outline must follow. Valid options are {@link LinkType.GEODESIC} and {@link ArcType.RHUMB}. + */ + static fromPositions(options: { + positions: Cartesian3[]; + height?: number; + extrudedHeight?: number; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + arcType?: ArcType; + }): PolygonOutlineGeometry; + /** + * Computes the geometric representation of a polygon outline, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon outline. + * @returns The computed vertices and indices. + */ + static createGeometry(polygonGeometry: PolygonOutlineGeometry): Geometry | undefined; +} + +/** + * A description of a polyline modeled as a line strip; the first two positions define a line segment, + * and each additional position defines a line segment from the previous position. The polyline is capable of + * displaying with a material. + * @example + * // A polyline with two connected line segments + * var polyline = new Cesium.PolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0, + * 5.0, 5.0 + * ]), + * width : 10.0 + * }); + * var geometry = Cesium.PolylineGeometry.createGeometry(polyline); + * @param options - Object with the following properties: + * @param options.positions - An array of {@link Cartesian3} defining the positions in the polyline as a line strip. + * @param [options.width = 1.0] - The width in pixels. + * @param [options.colors] - An Array of {@link Color} defining the per vertex or per segment colors. + * @param [options.colorsPerVertex = false] - A boolean that determines whether the colors will be flat across each segment of the line or interpolated across the vertices. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude if options.arcType is not ArcType.NONE. Determines the number of positions in the buffer. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + */ +export class PolylineGeometry { + constructor(options: { + positions: Cartesian3[]; + width?: number; + colors?: Color[]; + colorsPerVertex?: boolean; + arcType?: ArcType; + granularity?: number; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PolylineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolylineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PolylineGeometry): PolylineGeometry; + /** + * Computes the geometric representation of a polyline, including its vertices, indices, and a bounding sphere. + * @param polylineGeometry - A description of the polyline. + * @returns The computed vertices and indices. + */ + static createGeometry(polylineGeometry: PolylineGeometry): Geometry | undefined; +} + +/** + * A description of a polyline with a volume (a 2D shape extruded along a polyline). + * @example + * function computeCircle(radius) { + * var positions = []; + * for (var i = 0; i < 360; i++) { + * var radians = Cesium.Math.toRadians(i); + * positions.push(new Cesium.Cartesian2(radius * Math.cos(radians), radius * Math.sin(radians))); + * } + * return positions; + * } + * + * var volume = new Cesium.PolylineVolumeGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * polylinePositions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0 + * ]), + * shapePositions : computeCircle(100000.0) + * }); + * @param options - Object with the following properties: + * @param options.polylinePositions - An array of {@link Cartesain3} positions that define the center of the polyline volume. + * @param options.shapePositions - An array of {@link Cartesian2} positions that define the shape to be extruded along the polyline + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ +export class PolylineVolumeGeometry { + constructor(options: { + polylinePositions: Cartesian3[]; + shapePositions: Cartesian2[]; + ellipsoid?: Ellipsoid; + granularity?: number; + vertexFormat?: VertexFormat; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PolylineVolumeGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolylineVolumeGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PolylineVolumeGeometry): PolylineVolumeGeometry; + /** + * Computes the geometric representation of a polyline with a volume, including its vertices, indices, and a bounding sphere. + * @param polylineVolumeGeometry - A description of the polyline volume. + * @returns The computed vertices and indices. + */ + static createGeometry(polylineVolumeGeometry: PolylineVolumeGeometry): Geometry | undefined; +} + +/** + * A description of a polyline with a volume (a 2D shape extruded along a polyline). + * @example + * function computeCircle(radius) { + * var positions = []; + * for (var i = 0; i < 360; i++) { + * var radians = Cesium.Math.toRadians(i); + * positions.push(new Cesium.Cartesian2(radius * Math.cos(radians), radius * Math.sin(radians))); + * } + * return positions; + * } + * + * var volumeOutline = new Cesium.PolylineVolumeOutlineGeometry({ + * polylinePositions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0 + * ]), + * shapePositions : computeCircle(100000.0) + * }); + * @param options - Object with the following properties: + * @param options.polylinePositions - An array of positions that define the center of the polyline volume. + * @param options.shapePositions - An array of positions that define the shape to be extruded along the polyline + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ +export class PolylineVolumeOutlineGeometry { + constructor(options: { + polylinePositions: Cartesian3[]; + shapePositions: Cartesian2[]; + ellipsoid?: Ellipsoid; + granularity?: number; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: PolylineVolumeOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolylineVolumeOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: PolylineVolumeOutlineGeometry): PolylineVolumeOutlineGeometry; + /** + * Computes the geometric representation of the outline of a polyline with a volume, including its vertices, indices, and a bounding sphere. + * @param polylineVolumeOutlineGeometry - A description of the polyline volume outline. + * @returns The computed vertices and indices. + */ + static createGeometry(polylineVolumeOutlineGeometry: PolylineVolumeOutlineGeometry): Geometry | undefined; +} + +/** + * The type of a geometric primitive, i.e., points, lines, and triangles. + */ +export enum PrimitiveType { + /** + * Points primitive where each vertex (or index) is a separate point. + */ + POINTS = WebGLConstants.POINTS, + /** + * Lines primitive where each two vertices (or indices) is a line segment. Line segments are not necessarily connected. + */ + LINES = WebGLConstants.LINES, + /** + * Line loop primitive where each vertex (or index) after the first connects a line to + * the previous vertex, and the last vertex implicitly connects to the first. + */ + LINE_LOOP = WebGLConstants.LINE_LOOP, + /** + * Line strip primitive where each vertex (or index) after the first connects a line to the previous vertex. + */ + LINE_STRIP = WebGLConstants.LINE_STRIP, + /** + * Triangles primitive where each three vertices (or indices) is a triangle. Triangles do not necessarily share edges. + */ + TRIANGLES = WebGLConstants.TRIANGLES, + /** + * Triangle strip primitive where each vertex (or index) after the first two connect to + * the previous two vertices forming a triangle. For example, this can be used to model a wall. + */ + TRIANGLE_STRIP = WebGLConstants.TRIANGLE_STRIP, + /** + * Triangle fan primitive where each vertex (or index) after the first two connect to + * the previous vertex and the first vertex forming a triangle. For example, this can be used + * to model a cone or circle. + */ + TRIANGLE_FAN = WebGLConstants.TRIANGLE_FAN +} + +/** + * Base class for proxying requested made by {@link Resource}. + */ +export class Proxy { + constructor(); + /** + * Get the final URL to use to request a given resource. + * @param resource - The resource to request. + * @returns proxied resource + */ + getURL(resource: string): string; +} + +/** + * Defines functions for 2nd order polynomial functions of one variable with only real coefficients. + */ +export namespace QuadraticRealPolynomial { + /** + * Provides the discriminant of the quadratic equation from the supplied coefficients. + * @param a - The coefficient of the 2nd order monomial. + * @param b - The coefficient of the 1st order monomial. + * @param c - The coefficient of the 0th order monomial. + * @returns The value of the discriminant. + */ + function computeDiscriminant(a: number, b: number, c: number): number; + /** + * Provides the real valued roots of the quadratic polynomial with the provided coefficients. + * @param a - The coefficient of the 2nd order monomial. + * @param b - The coefficient of the 1st order monomial. + * @param c - The coefficient of the 0th order monomial. + * @returns The real valued roots. + */ + function computeRealRoots(a: number, b: number, c: number): number[]; +} + +/** + * Terrain data for a single tile where the terrain data is represented as a quantized mesh. A quantized + * mesh consists of three vertex attributes, longitude, latitude, and height. All attributes are expressed + * as 16-bit values in the range 0 to 32767. Longitude and latitude are zero at the southwest corner + * of the tile and 32767 at the northeast corner. Height is zero at the minimum height in the tile + * and 32767 at the maximum height in the tile. + * @example + * var data = new Cesium.QuantizedMeshTerrainData({ + * minimumHeight : -100, + * maximumHeight : 2101, + * quantizedVertices : new Uint16Array([// order is SW NW SE NE + * // longitude + * 0, 0, 32767, 32767, + * // latitude + * 0, 32767, 0, 32767, + * // heights + * 16384, 0, 32767, 16384]), + * indices : new Uint16Array([0, 3, 1, + * 0, 2, 3]), + * boundingSphere : new Cesium.BoundingSphere(new Cesium.Cartesian3(1.0, 2.0, 3.0), 10000), + * orientedBoundingBox : new Cesium.OrientedBoundingBox(new Cesium.Cartesian3(1.0, 2.0, 3.0), Cesium.Matrix3.fromRotationX(Cesium.Math.PI, new Cesium.Matrix3())), + * horizonOcclusionPoint : new Cesium.Cartesian3(3.0, 2.0, 1.0), + * westIndices : [0, 1], + * southIndices : [0, 1], + * eastIndices : [2, 3], + * northIndices : [1, 3], + * westSkirtHeight : 1.0, + * southSkirtHeight : 1.0, + * eastSkirtHeight : 1.0, + * northSkirtHeight : 1.0 + * }); + * @param options - Object with the following properties: + * @param options.quantizedVertices - The buffer containing the quantized mesh. + * @param options.indices - The indices specifying how the quantized vertices are linked + * together into triangles. Each three indices specifies one triangle. + * @param options.minimumHeight - The minimum terrain height within the tile, in meters above the ellipsoid. + * @param options.maximumHeight - The maximum terrain height within the tile, in meters above the ellipsoid. + * @param options.boundingSphere - A sphere bounding all of the vertices in the mesh. + * @param [options.orientedBoundingBox] - An OrientedBoundingBox bounding all of the vertices in the mesh. + * @param options.horizonOcclusionPoint - The horizon occlusion point of the mesh. If this point + * is below the horizon, the entire tile is assumed to be below the horizon as well. + * The point is expressed in ellipsoid-scaled coordinates. + * @param options.westIndices - The indices of the vertices on the western edge of the tile. + * @param options.southIndices - The indices of the vertices on the southern edge of the tile. + * @param options.eastIndices - The indices of the vertices on the eastern edge of the tile. + * @param options.northIndices - The indices of the vertices on the northern edge of the tile. + * @param options.westSkirtHeight - The height of the skirt to add on the western edge of the tile. + * @param options.southSkirtHeight - The height of the skirt to add on the southern edge of the tile. + * @param options.eastSkirtHeight - The height of the skirt to add on the eastern edge of the tile. + * @param options.northSkirtHeight - The height of the skirt to add on the northern edge of the tile. + * @param [options.childTileMask = 15] - A bit mask indicating which of this tile's four children exist. + * If a child's bit is set, geometry will be requested for that tile as well when it + * is needed. If the bit is cleared, the child tile is not requested and geometry is + * instead upsampled from the parent. The bit values are as follows: + * + * + * + * + * + * + *
    Bit PositionBit ValueChild Tile
    01Southwest
    12Southeast
    24Northwest
    38Northeast
    + * @param [options.createdByUpsampling = false] - True if this instance was created by upsampling another instance; + * otherwise, false. + * @param [options.encodedNormals] - The buffer containing per vertex normals, encoded using 'oct' encoding + * @param [options.waterMask] - The buffer containing the watermask. + * @param [options.credits] - Array of credits for this tile. + */ +export class QuantizedMeshTerrainData { + constructor(options: { + quantizedVertices: Uint16Array; + indices: Uint16Array | Uint32Array; + minimumHeight: number; + maximumHeight: number; + boundingSphere: BoundingSphere; + orientedBoundingBox?: OrientedBoundingBox; + horizonOcclusionPoint: Cartesian3; + westIndices: number[]; + southIndices: number[]; + eastIndices: number[]; + northIndices: number[]; + westSkirtHeight: number; + southSkirtHeight: number; + eastSkirtHeight: number; + northSkirtHeight: number; + childTileMask?: number; + createdByUpsampling?: boolean; + encodedNormals?: Uint8Array; + waterMask?: Uint8Array; + credits?: Credit[]; + }); + /** + * An array of credits for this tile. + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Upsamples this terrain data for use by a descendant tile. The resulting instance will contain a subset of the + * vertices in this instance, interpolated if necessary. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled heightmap terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample(tilingScheme: TilingScheme, thisX: number, thisY: number, thisLevel: number, descendantX: number, descendantY: number, descendantLevel: number): Promise | undefined; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. The position is clamped to + * the rectangle, so expect incorrect results for positions far outside the rectangle. + */ + interpolateHeight(rectangle: Rectangle, longitude: number, latitude: number): number; + /** + * Determines if a given child tile is available, based on the + * {@link HeightmapTerrainData.childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable(thisX: number, thisY: number, childX: number, childY: number): boolean; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link HeightmapTerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; +} + +/** + * Defines functions for 4th order polynomial functions of one variable with only real coefficients. + */ +export namespace QuarticRealPolynomial { + /** + * Provides the discriminant of the quartic equation from the supplied coefficients. + * @param a - The coefficient of the 4th order monomial. + * @param b - The coefficient of the 3rd order monomial. + * @param c - The coefficient of the 2nd order monomial. + * @param d - The coefficient of the 1st order monomial. + * @param e - The coefficient of the 0th order monomial. + * @returns The value of the discriminant. + */ + function computeDiscriminant(a: number, b: number, c: number, d: number, e: number): number; + /** + * Provides the real valued roots of the quartic polynomial with the provided coefficients. + * @param a - The coefficient of the 4th order monomial. + * @param b - The coefficient of the 3rd order monomial. + * @param c - The coefficient of the 2nd order monomial. + * @param d - The coefficient of the 1st order monomial. + * @param e - The coefficient of the 0th order monomial. + * @returns The real valued roots. + */ + function computeRealRoots(a: number, b: number, c: number, d: number, e: number): number[]; +} + +/** + * A set of 4-dimensional coordinates used to represent rotation in 3-dimensional space. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + * @param [z = 0.0] - The Z component. + * @param [w = 0.0] - The W component. + */ +export class Quaternion { + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * The Z component. + */ + z: number; + /** + * The W component. + */ + w: number; + /** + * Computes a quaternion representing a rotation around an axis. + * @param axis - The axis of rotation. + * @param angle - The angle in radians to rotate around the axis. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static fromAxisAngle(axis: Cartesian3, angle: number, result?: Quaternion): Quaternion; + /** + * Computes a Quaternion from the provided Matrix3 instance. + * @param matrix - The rotation matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static fromRotationMatrix(matrix: Matrix3, result?: Quaternion): Quaternion; + /** + * Computes a rotation from the given heading, pitch and roll angles. Heading is the rotation about the + * negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about + * the positive x axis. + * @param headingPitchRoll - The rotation expressed as a heading, pitch and roll. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if none was provided. + */ + static fromHeadingPitchRoll(headingPitchRoll: HeadingPitchRoll, result?: Quaternion): Quaternion; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Quaternion, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Quaternion): Quaternion; + /** + * The number of elements used to store the object into an array in its interpolatable form. + */ + static packedInterpolationLength: number; + /** + * Converts a packed array into a form suitable for interpolation. + * @param packedArray - The packed array. + * @param [startingIndex = 0] - The index of the first element to be converted. + * @param [lastIndex = packedArray.length] - The index of the last element to be converted. + * @param [result] - The object into which to store the result. + */ + static convertPackedArrayForInterpolation(packedArray: number[], startingIndex?: number, lastIndex?: number, result?: number[]): void; + /** + * Retrieves an instance from a packed array converted with {@link convertPackedArrayForInterpolation}. + * @param array - The array previously packed for interpolation. + * @param sourceArray - The original packed array. + * @param [firstIndex = 0] - The firstIndex used to convert the array. + * @param [lastIndex = packedArray.length] - The lastIndex used to convert the array. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static unpackInterpolationResult(array: number[], sourceArray: number[], firstIndex?: number, lastIndex?: number, result?: Quaternion): Quaternion; + /** + * Duplicates a Quaternion instance. + * @param quaternion - The quaternion to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. (Returns undefined if quaternion is undefined) + */ + static clone(quaternion: Quaternion, result?: Quaternion): Quaternion; + /** + * Computes the conjugate of the provided quaternion. + * @param quaternion - The quaternion to conjugate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static conjugate(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes magnitude squared for the provided quaternion. + * @param quaternion - The quaternion to conjugate. + * @returns The magnitude squared. + */ + static magnitudeSquared(quaternion: Quaternion): number; + /** + * Computes magnitude for the provided quaternion. + * @param quaternion - The quaternion to conjugate. + * @returns The magnitude. + */ + static magnitude(quaternion: Quaternion): number; + /** + * Computes the normalized form of the provided quaternion. + * @param quaternion - The quaternion to normalize. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the inverse of the provided quaternion. + * @param quaternion - The quaternion to normalize. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverse(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the componentwise sum of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Quaternion, right: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the componentwise difference of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Quaternion, right: Quaternion, result: Quaternion): Quaternion; + /** + * Negates the provided quaternion. + * @param quaternion - The quaternion to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the dot (scalar) product of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @returns The dot product. + */ + static dot(left: Quaternion, right: Quaternion): number; + /** + * Computes the product of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Quaternion, right: Quaternion, result: Quaternion): Quaternion; + /** + * Multiplies the provided quaternion componentwise by the provided scalar. + * @param quaternion - The quaternion to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(quaternion: Quaternion, scalar: number, result: Quaternion): Quaternion; + /** + * Divides the provided quaternion componentwise by the provided scalar. + * @param quaternion - The quaternion to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar(quaternion: Quaternion, scalar: number, result: Quaternion): Quaternion; + /** + * Computes the axis of rotation of the provided quaternion. + * @param quaternion - The quaternion to use. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static computeAxis(quaternion: Quaternion, result: Cartesian3): Cartesian3; + /** + * Computes the angle of rotation of the provided quaternion. + * @param quaternion - The quaternion to use. + * @returns The angle of rotation. + */ + static computeAngle(quaternion: Quaternion): number; + /** + * Computes the linear interpolation or extrapolation at t using the provided quaternions. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp(start: Quaternion, end: Quaternion, t: number, result: Quaternion): Quaternion; + /** + * Computes the spherical linear interpolation or extrapolation at t using the provided quaternions. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static slerp(start: Quaternion, end: Quaternion, t: number, result: Quaternion): Quaternion; + /** + * The logarithmic quaternion function. + * @param quaternion - The unit quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static log(quaternion: Quaternion, result: Cartesian3): Cartesian3; + /** + * The exponential quaternion function. + * @param cartesian - The cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static exp(cartesian: Cartesian3, result: Quaternion): Quaternion; + /** + * Computes an inner quadrangle point. + *

    This will compute quaternions that ensure a squad curve is C1.

    + * @param q0 - The first quaternion. + * @param q1 - The second quaternion. + * @param q2 - The third quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static computeInnerQuadrangle(q0: Quaternion, q1: Quaternion, q2: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the spherical quadrangle interpolation between quaternions. + * @example + * // 1. compute the squad interpolation between two quaternions on a curve + * var s0 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[i - 1], quaternions[i], quaternions[i + 1], new Cesium.Quaternion()); + * var s1 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[i], quaternions[i + 1], quaternions[i + 2], new Cesium.Quaternion()); + * var q = Cesium.Quaternion.squad(quaternions[i], quaternions[i + 1], s0, s1, t, new Cesium.Quaternion()); + * + * // 2. compute the squad interpolation as above but where the first quaternion is a end point. + * var s1 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[0], quaternions[1], quaternions[2], new Cesium.Quaternion()); + * var q = Cesium.Quaternion.squad(quaternions[0], quaternions[1], quaternions[0], s1, t, new Cesium.Quaternion()); + * @param q0 - The first quaternion. + * @param q1 - The second quaternion. + * @param s0 - The first inner quadrangle. + * @param s1 - The second inner quadrangle. + * @param t - The time in [0,1] used to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static squad(q0: Quaternion, q1: Quaternion, s0: Quaternion, s1: Quaternion, t: number, result: Quaternion): Quaternion; + /** + * Computes the spherical linear interpolation or extrapolation at t using the provided quaternions. + * This implementation is faster than {@link Quaternion#slerp}, but is only accurate up to 10-6. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static fastSlerp(start: Quaternion, end: Quaternion, t: number, result: Quaternion): Quaternion; + /** + * Computes the spherical quadrangle interpolation between quaternions. + * An implementation that is faster than {@link Quaternion#squad}, but less accurate. + * @param q0 - The first quaternion. + * @param q1 - The second quaternion. + * @param s0 - The first inner quadrangle. + * @param s1 - The second inner quadrangle. + * @param t - The time in [0,1] used to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fastSquad(q0: Quaternion, q1: Quaternion, s0: Quaternion, s1: Quaternion, t: number, result: Quaternion): Quaternion; + /** + * Compares the provided quaternions componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first quaternion. + * @param [right] - The second quaternion. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Quaternion, right?: Quaternion): boolean; + /** + * Compares the provided quaternions componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first quaternion. + * @param [right] - The second quaternion. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Quaternion, right?: Quaternion, epsilon?: number): boolean; + /** + * An immutable Quaternion instance initialized to (0.0, 0.0, 0.0, 0.0). + */ + static readonly ZERO: Quaternion; + /** + * An immutable Quaternion instance initialized to (0.0, 0.0, 0.0, 1.0). + */ + static readonly IDENTITY: Quaternion; + /** + * Duplicates this Quaternion instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + clone(result?: Quaternion): Quaternion; + /** + * Compares this and the provided quaternion componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side quaternion. + * @returns true if left and right are equal, false otherwise. + */ + equals(right?: Quaternion): boolean; + /** + * Compares this and the provided quaternion componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side quaternion. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Quaternion, epsilon?: number): boolean; + /** + * Returns a string representing this quaternion in the format (x, y, z, w). + * @returns A string representing this Quaternion. + */ + toString(): string; +} + +/** + * A spline that uses spherical linear (slerp) interpolation to create a quaternion curve. + * The generated curve is in the class C1. + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of {@link Quaternion} control points. + */ +export class QuaternionSpline { + constructor(options: { + times: number[]; + points: Quaternion[]; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Quaternion} control points. + */ + readonly points: Quaternion[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Quaternion): Quaternion; +} + +/** + * A queue that can enqueue items at the end, and dequeue items from the front. + */ +export class Queue { + constructor(); + /** + * The length of the queue. + */ + readonly length: number; + /** + * Enqueues the specified item. + * @param item - The item to enqueue. + */ + enqueue(item: any): void; + /** + * Dequeues an item. Returns undefined if the queue is empty. + * @returns The the dequeued item. + */ + dequeue(): any; + /** + * Returns the item at the front of the queue. Returns undefined if the queue is empty. + * @returns The item at the front of the queue. + */ + peek(): any; + /** + * Check whether this queue contains the specified item. + * @param item - The item to search for. + */ + contains(item: any): void; + /** + * Remove all items from the queue. + */ + clear(): void; + /** + * Sort the items in the queue in-place. + * @param compareFunction - A function that defines the sort order. + */ + sort(compareFunction: Queue.Comparator): void; +} + +export namespace Queue { + /** + * A function used to compare two items while sorting a queue. + * @example + * function compareNumbers(a, b) { + * return a - b; + * } + * @param a - An item in the array. + * @param b - An item in the array. + */ + type Comparator = (a: any, b: any) => number; +} + +/** + * Represents a ray that extends infinitely from the provided origin in the provided direction. + * @param [origin = Cartesian3.ZERO] - The origin of the ray. + * @param [direction = Cartesian3.ZERO] - The direction of the ray. + */ +export class Ray { + constructor(origin?: Cartesian3, direction?: Cartesian3); + /** + * The origin of the ray. + */ + origin: Cartesian3; + /** + * The direction of the ray. + */ + direction: Cartesian3; + /** + * Duplicates a Ray instance. + * @param ray - The ray to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Ray instance if one was not provided. (Returns undefined if ray is undefined) + */ + static clone(ray: Ray, result?: Ray): Ray; + /** + * Computes the point along the ray given by r(t) = o + t*d, + * where o is the origin of the ray and d is the direction. + * @example + * //Get the first intersection point of a ray and an ellipsoid. + * var intersection = Cesium.IntersectionTests.rayEllipsoid(ray, ellipsoid); + * var point = Cesium.Ray.getPoint(ray, intersection.start); + * @param ray - The ray. + * @param t - A scalar value. + * @param [result] - The object in which the result will be stored. + * @returns The modified result parameter, or a new instance if none was provided. + */ + static getPoint(ray: Ray, t: number, result?: Cartesian3): Cartesian3; +} + +/** + * A two dimensional region specified as longitude and latitude coordinates. + * @param [west = 0.0] - The westernmost longitude, in radians, in the range [-Pi, Pi]. + * @param [south = 0.0] - The southernmost latitude, in radians, in the range [-Pi/2, Pi/2]. + * @param [east = 0.0] - The easternmost longitude, in radians, in the range [-Pi, Pi]. + * @param [north = 0.0] - The northernmost latitude, in radians, in the range [-Pi/2, Pi/2]. + */ +export class Rectangle { + constructor(west?: number, south?: number, east?: number, north?: number); + /** + * The westernmost longitude in radians in the range [-Pi, Pi]. + */ + west: number; + /** + * The southernmost latitude in radians in the range [-Pi/2, Pi/2]. + */ + south: number; + /** + * The easternmost longitude in radians in the range [-Pi, Pi]. + */ + east: number; + /** + * The northernmost latitude in radians in the range [-Pi/2, Pi/2]. + */ + north: number; + /** + * Gets the width of the rectangle in radians. + */ + readonly width: number; + /** + * Gets the height of the rectangle in radians. + */ + readonly height: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: Rectangle, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Rectangle instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: Rectangle): Rectangle; + /** + * Computes the width of a rectangle in radians. + * @param rectangle - The rectangle to compute the width of. + * @returns The width. + */ + static computeWidth(rectangle: Rectangle): number; + /** + * Computes the height of a rectangle in radians. + * @param rectangle - The rectangle to compute the height of. + * @returns The height. + */ + static computeHeight(rectangle: Rectangle): number; + /** + * Creates a rectangle given the boundary longitude and latitude in degrees. + * @example + * var rectangle = Cesium.Rectangle.fromDegrees(0.0, 20.0, 10.0, 30.0); + * @param [west = 0.0] - The westernmost longitude in degrees in the range [-180.0, 180.0]. + * @param [south = 0.0] - The southernmost latitude in degrees in the range [-90.0, 90.0]. + * @param [east = 0.0] - The easternmost longitude in degrees in the range [-180.0, 180.0]. + * @param [north = 0.0] - The northernmost latitude in degrees in the range [-90.0, 90.0]. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromDegrees(west?: number, south?: number, east?: number, north?: number, result?: Rectangle): Rectangle; + /** + * Creates a rectangle given the boundary longitude and latitude in radians. + * @example + * var rectangle = Cesium.Rectangle.fromRadians(0.0, Math.PI/4, Math.PI/8, 3*Math.PI/4); + * @param [west = 0.0] - The westernmost longitude in radians in the range [-Math.PI, Math.PI]. + * @param [south = 0.0] - The southernmost latitude in radians in the range [-Math.PI/2, Math.PI/2]. + * @param [east = 0.0] - The easternmost longitude in radians in the range [-Math.PI, Math.PI]. + * @param [north = 0.0] - The northernmost latitude in radians in the range [-Math.PI/2, Math.PI/2]. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromRadians(west?: number, south?: number, east?: number, north?: number, result?: Rectangle): Rectangle; + /** + * Creates the smallest possible Rectangle that encloses all positions in the provided array. + * @param cartographics - The list of Cartographic instances. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromCartographicArray(cartographics: Cartographic[], result?: Rectangle): Rectangle; + /** + * Creates the smallest possible Rectangle that encloses all positions in the provided array. + * @param cartesians - The list of Cartesian instances. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid the cartesians are on. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromCartesianArray(cartesians: Cartesian3[], ellipsoid?: Ellipsoid, result?: Rectangle): Rectangle; + /** + * Duplicates a Rectangle. + * @param rectangle - The rectangle to clone. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. (Returns undefined if rectangle is undefined) + */ + static clone(rectangle: Rectangle, result?: Rectangle): Rectangle; + /** + * Compares the provided Rectangles componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Rectangle. + * @param [right] - The second Rectangle. + * @param [absoluteEpsilon = 0] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon(left?: Rectangle, right?: Rectangle, absoluteEpsilon?: number): boolean; + /** + * Duplicates this Rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + clone(result?: Rectangle): Rectangle; + /** + * Compares the provided Rectangle with this Rectangle componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The Rectangle to compare. + * @returns true if the Rectangles are equal, false otherwise. + */ + equals(other?: Rectangle): boolean; + /** + * Compares the provided rectangles and returns true if they are equal, + * false otherwise. + * @param [left] - The first Rectangle. + * @param [right] - The second Rectangle. + * @returns true if left and right are equal; otherwise false. + */ + static equals(left?: Rectangle, right?: Rectangle): boolean; + /** + * Compares the provided Rectangle with this Rectangle componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [other] - The Rectangle to compare. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if the Rectangles are within the provided epsilon, false otherwise. + */ + equalsEpsilon(other?: Rectangle, epsilon?: number): boolean; + /** + * Checks a Rectangle's properties and throws if they are not in valid ranges. + * @param rectangle - The rectangle to validate + */ + static validate(rectangle: Rectangle): void; + /** + * Computes the southwest corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static southwest(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the northwest corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static northwest(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the northeast corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static northeast(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the southeast corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static southeast(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the center of a rectangle. + * @param rectangle - The rectangle for which to find the center + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static center(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the intersection of two rectangles. This function assumes that the rectangle's coordinates are + * latitude and longitude in radians and produces a correct intersection, taking into account the fact that + * the same angle can be represented with multiple values as well as the wrapping of longitude at the + * anti-meridian. For a simple intersection that ignores these factors and can be used with projected + * coordinates, see {@link Rectangle.simpleIntersection}. + * @param rectangle - On rectangle to find an intersection + * @param otherRectangle - Another rectangle to find an intersection + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection. + */ + static intersection(rectangle: Rectangle, otherRectangle: Rectangle, result?: Rectangle): Rectangle | undefined; + /** + * Computes a simple intersection of two rectangles. Unlike {@link Rectangle.intersection}, this function + * does not attempt to put the angular coordinates into a consistent range or to account for crossing the + * anti-meridian. As such, it can be used for rectangles where the coordinates are not simply latitude + * and longitude (i.e. projected coordinates). + * @param rectangle - On rectangle to find an intersection + * @param otherRectangle - Another rectangle to find an intersection + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection. + */ + static simpleIntersection(rectangle: Rectangle, otherRectangle: Rectangle, result?: Rectangle): Rectangle | undefined; + /** + * Computes a rectangle that is the union of two rectangles. + * @param rectangle - A rectangle to enclose in rectangle. + * @param otherRectangle - A rectangle to enclose in a rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static union(rectangle: Rectangle, otherRectangle: Rectangle, result?: Rectangle): Rectangle; + /** + * Computes a rectangle by enlarging the provided rectangle until it contains the provided cartographic. + * @param rectangle - A rectangle to expand. + * @param cartographic - A cartographic to enclose in a rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if one was not provided. + */ + static expand(rectangle: Rectangle, cartographic: Cartographic, result?: Rectangle): Rectangle; + /** + * Returns true if the cartographic is on or inside the rectangle, false otherwise. + * @param rectangle - The rectangle + * @param cartographic - The cartographic to test. + * @returns true if the provided cartographic is inside the rectangle, false otherwise. + */ + static contains(rectangle: Rectangle, cartographic: Cartographic): boolean; + /** + * Samples a rectangle so that it includes a list of Cartesian points suitable for passing to + * {@link BoundingSphere#fromPoints}. Sampling is necessary to account + * for rectangles that cover the poles or cross the equator. + * @param rectangle - The rectangle to subsample. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid to use. + * @param [surfaceHeight = 0.0] - The height of the rectangle above the ellipsoid. + * @param [result] - The array of Cartesians onto which to store the result. + * @returns The modified result parameter or a new Array of Cartesians instances if none was provided. + */ + static subsample(rectangle: Rectangle, ellipsoid?: Ellipsoid, surfaceHeight?: number, result?: Cartesian3[]): Cartesian3[]; + /** + * The largest possible rectangle. + */ + static readonly MAX_VALUE: Rectangle; +} + +/** + * A description of a cartographic rectangle on an ellipsoid centered at the origin. Rectangle geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // 1. create a rectangle + * var rectangle = new Cesium.RectangleGeometry({ + * ellipsoid : Cesium.Ellipsoid.WGS84, + * rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), + * height : 10000.0 + * }); + * var geometry = Cesium.RectangleGeometry.createGeometry(rectangle); + * + * // 2. create an extruded rectangle without a top + * var rectangle = new Cesium.RectangleGeometry({ + * ellipsoid : Cesium.Ellipsoid.WGS84, + * rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), + * height : 10000.0, + * extrudedHeight: 300000 + * }); + * var geometry = Cesium.RectangleGeometry.createGeometry(rectangle); + * @param options - Object with the following properties: + * @param options.rectangle - A cartographic rectangle with north, south, east and west properties in radians. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the rectangle lies. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0.0] - The distance in meters between the rectangle and the ellipsoid surface. + * @param [options.rotation = 0.0] - The rotation of the rectangle, in radians. A positive rotation is counter-clockwise. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.extrudedHeight] - The distance in meters between the rectangle's extruded face and the ellipsoid surface. + */ +export class RectangleGeometry { + constructor(options: { + rectangle: Rectangle; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + rotation?: number; + stRotation?: number; + extrudedHeight?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: RectangleGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new RectangleGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: RectangleGeometry): RectangleGeometry; + /** + * Computes the bounding rectangle based on the provided options + * @param options - Object with the following properties: + * @param options.rectangle - A cartographic rectangle with north, south, east and west properties in radians. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the rectangle lies. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.rotation = 0.0] - The rotation of the rectangle, in radians. A positive rotation is counter-clockwise. + * @param [result] - An object in which to store the result. + * @returns The result rectangle + */ + static computeRectangle(options: { + rectangle: Rectangle; + ellipsoid?: Ellipsoid; + granularity?: number; + rotation?: number; + }, result?: Rectangle): Rectangle; + /** + * Computes the geometric representation of a rectangle, including its vertices, indices, and a bounding sphere. + * @param rectangleGeometry - A description of the rectangle. + * @returns The computed vertices and indices. + */ + static createGeometry(rectangleGeometry: RectangleGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a a cartographic rectangle on an ellipsoid centered at the origin. + * @example + * var rectangle = new Cesium.RectangleOutlineGeometry({ + * ellipsoid : Cesium.Ellipsoid.WGS84, + * rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), + * height : 10000.0 + * }); + * var geometry = Cesium.RectangleOutlineGeometry.createGeometry(rectangle); + * @param options - Object with the following properties: + * @param options.rectangle - A cartographic rectangle with north, south, east and west properties in radians. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid on which the rectangle lies. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0.0] - The distance in meters between the rectangle and the ellipsoid surface. + * @param [options.rotation = 0.0] - The rotation of the rectangle, in radians. A positive rotation is counter-clockwise. + * @param [options.extrudedHeight] - The distance in meters between the rectangle's extruded face and the ellipsoid surface. + */ +export class RectangleOutlineGeometry { + constructor(options: { + rectangle: Rectangle; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + rotation?: number; + extrudedHeight?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: RectangleOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: RectangleOutlineGeometry): RectangleOutlineGeometry; + /** + * Computes the geometric representation of an outline of a rectangle, including its vertices, indices, and a bounding sphere. + * @param rectangleGeometry - A description of the rectangle outline. + * @returns The computed vertices and indices. + */ + static createGeometry(rectangleGeometry: RectangleOutlineGeometry): Geometry | undefined; +} + +/** + * Constants for identifying well-known reference frames. + */ +export enum ReferenceFrame { + /** + * The fixed frame. + */ + FIXED = 0, + /** + * The inertial frame. + */ + INERTIAL = 1 +} + +/** + * Stores information for making a request. In general this does not need to be constructed directly. + * @param [options] - An object with the following properties: + * @param [options.url] - The url to request. + * @param [options.requestFunction] - The function that makes the actual data request. + * @param [options.cancelFunction] - The function that is called when the request is cancelled. + * @param [options.priorityFunction] - The function that is called to update the request's priority, which occurs once per frame. + * @param [options.priority = 0.0] - The initial priority of the request. + * @param [options.throttle = false] - Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the request will be throttled and sent based on priority. + * @param [options.throttleByServer = false] - Whether to throttle the request by server. + * @param [options.type = RequestType.OTHER] - The type of request. + */ +export class Request { + constructor(options?: { + url?: string; + requestFunction?: Request.RequestCallback; + cancelFunction?: Request.CancelCallback; + priorityFunction?: Request.PriorityCallback; + priority?: number; + throttle?: boolean; + throttleByServer?: boolean; + type?: RequestType; + }); + /** + * The URL to request. + */ + url: string; + /** + * The function that makes the actual data request. + */ + requestFunction: Request.RequestCallback; + /** + * The function that is called when the request is cancelled. + */ + cancelFunction: Request.CancelCallback; + /** + * The function that is called to update the request's priority, which occurs once per frame. + */ + priorityFunction: Request.PriorityCallback; + /** + * Priority is a unit-less value where lower values represent higher priority. + * For world-based objects, this is usually the distance from the camera. + * A request that does not have a priority function defaults to a priority of 0. + * + * If priorityFunction is defined, this value is updated every frame with the result of that call. + */ + priority: number; + /** + * Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the + * request will be throttled and sent based on priority. + */ + readonly throttle: boolean; + /** + * Whether to throttle the request by server. Browsers typically support about 6-8 parallel connections + * for HTTP/1 servers, and an unlimited amount of connections for HTTP/2 servers. Setting this value + * to true is preferable for requests going through HTTP/1 servers. + */ + readonly throttleByServer: boolean; + /** + * Type of request. + */ + readonly type: RequestType; + /** + * The current state of the request. + */ + readonly state: RequestState; + /** + * Duplicates a Request instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Resource instance if one was not provided. + */ + clone(result?: Request): Request; +} + +export namespace Request { + /** + * The function that makes the actual data request. + */ + type RequestCallback = () => Promise; + /** + * The function that is called when the request is cancelled. + */ + type CancelCallback = () => void; + /** + * The function that is called to update the request's priority, which occurs once per frame. + */ + type PriorityCallback = () => number; +} + +/** + * An event that is raised when a request encounters an error. + * @param [statusCode] - The HTTP error status code, such as 404. + * @param [response] - The response included along with the error. + * @param [responseHeaders] - The response headers, represented either as an object literal or as a + * string in the format returned by XMLHttpRequest's getAllResponseHeaders() function. + */ +export class RequestErrorEvent { + constructor(statusCode?: number, response?: any, responseHeaders?: string | any); + /** + * The HTTP error status code, such as 404. If the error does not have a particular + * HTTP code, this property will be undefined. + */ + statusCode: number; + /** + * The response included along with the error. If the error does not include a response, + * this property will be undefined. + */ + response: any; + /** + * The headers included in the response, represented as an object literal of key/value pairs. + * If the error does not include any headers, this property will be undefined. + */ + responseHeaders: any; + /** + * Creates a string representing this RequestErrorEvent. + * @returns A string representing the provided RequestErrorEvent. + */ + toString(): string; +} + +/** + * The request scheduler is used to track and constrain the number of active requests in order to prioritize incoming requests. The ability + * to retain control over the number of requests in CesiumJS is important because due to events such as changes in the camera position, + * a lot of new requests may be generated and a lot of in-flight requests may become redundant. The request scheduler manually constrains the + * number of requests so that newer requests wait in a shorter queue and don't have to compete for bandwidth with requests that have expired. + */ +export namespace RequestScheduler { + /** + * The maximum number of simultaneous active requests. Un-throttled requests do not observe this limit. + */ + var maximumRequests: number; + /** + * The maximum number of simultaneous active requests per server. Un-throttled requests or servers specifically + * listed in {@link requestsByServer} do not observe this limit. + */ + var maximumRequestsPerServer: number; + /** + * A per server key list of overrides to use for throttling instead of maximumRequestsPerServer + * @example + * RequestScheduler.requestsByServer = { + * 'api.cesium.com:443': 18, + * 'assets.cesium.com:443': 18 + * }; + */ + var requestsByServer: any; + /** + * Specifies if the request scheduler should throttle incoming requests, or let the browser queue requests under its control. + */ + var throttleRequests: boolean; +} + +/** + * State of the request. + */ +export enum RequestState { + /** + * Initial unissued state. + */ + UNISSUED = 0, + /** + * Issued but not yet active. Will become active when open slots are available. + */ + ISSUED = 1, + /** + * Actual http request has been sent. + */ + ACTIVE = 2, + /** + * Request completed successfully. + */ + RECEIVED = 3, + /** + * Request was cancelled, either explicitly or automatically because of low priority. + */ + CANCELLED = 4, + /** + * Request failed. + */ + FAILED = 5 +} + +/** + * An enum identifying the type of request. Used for finer grained logging and priority sorting. + */ +export enum RequestType { + /** + * Terrain request. + */ + TERRAIN = 0, + /** + * Imagery request. + */ + IMAGERY = 1, + /** + * 3D Tiles request. + */ + TILES3D = 2, + /** + * Other request. + */ + OTHER = 3 +} + +/** + * A resource that includes the location and any other parameters we need to retrieve it or create derived resources. It also provides the ability to retry requests. + * @example + * function refreshTokenRetryCallback(resource, error) { + * if (error.statusCode === 403) { + * // 403 status code means a new token should be generated + * return getNewAccessToken() + * .then(function(token) { + * resource.queryParameters.access_token = token; + * return true; + * }) + * .otherwise(function() { + * return false; + * }); + * } + * + * return false; + * } + * + * var resource = new Resource({ + * url: 'http://server.com/path/to/resource.json', + * proxy: new DefaultProxy('/proxy/'), + * headers: { + * 'X-My-Header': 'valueOfHeader' + * }, + * queryParameters: { + * 'access_token': '123-435-456-000' + * }, + * retryCallback: refreshTokenRetryCallback, + * retryAttempts: 1 + * }); + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + */ +export class Resource { + constructor(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }); + /** + * Additional HTTP headers that will be sent with the request. + */ + headers: any; + /** + * A Request object that will be used. Intended for internal use only. + */ + request: Request; + /** + * A proxy to be used when loading the resource. + */ + proxy: Proxy; + /** + * Function to call when a request for this resource fails. If it returns true or a Promise that resolves to true, the request will be retried. + */ + retryCallback: (...params: any[]) => any; + /** + * The number of times the retryCallback should be called before giving up. + */ + retryAttempts: number; + /** + * Returns true if blobs are supported. + */ + static readonly isBlobSupported: boolean; + /** + * Query parameters appended to the url. + */ + readonly queryParameters: any; + /** + * The key/value pairs used to replace template parameters in the url. + */ + readonly templateValues: any; + /** + * The url to the resource with template values replaced, query string appended and encoded by proxy if one was set. + */ + url: string; + /** + * The file extension of the resource. + */ + readonly extension: string; + /** + * True if the Resource refers to a data URI. + */ + isDataUri: boolean; + /** + * True if the Resource refers to a blob URI. + */ + isBlobUri: boolean; + /** + * True if the Resource refers to a cross origin URL. + */ + isCrossOriginUrl: boolean; + /** + * True if the Resource has request headers. This is equivalent to checking if the headers property has any keys. + */ + hasHeaders: boolean; + /** + * Override Object#toString so that implicit string conversion gives the + * complete URL represented by this Resource. + * @returns The URL represented by this Resource + */ + toString(): string; + /** + * Returns the url, optional with the query string and processed by a proxy. + * @param [query = false] - If true, the query string is included. + * @param [proxy = false] - If true, the url is processed by the proxy object, if defined. + * @returns The url with all the requested components. + */ + getUrlComponent(query?: boolean, proxy?: boolean): string; + /** + * Combines the specified object and the existing query parameters. This allows you to add many parameters at once, + * as opposed to adding them one at a time to the queryParameters property. If a value is already set, it will be replaced with the new value. + * @param params - The query parameters + * @param [useAsDefault = false] - If true the params will be used as the default values, so they will only be set if they are undefined. + */ + setQueryParameters(params: any, useAsDefault?: boolean): void; + /** + * Combines the specified object and the existing query parameters. This allows you to add many parameters at once, + * as opposed to adding them one at a time to the queryParameters property. + * @param params - The query parameters + */ + appendQueryParameters(params: any): void; + /** + * Combines the specified object and the existing template values. This allows you to add many values at once, + * as opposed to adding them one at a time to the templateValues property. If a value is already set, it will become an array and the new value will be appended. + * @param template - The template values + * @param [useAsDefault = false] - If true the values will be used as the default values, so they will only be set if they are undefined. + */ + setTemplateValues(template: any, useAsDefault?: boolean): void; + /** + * Returns a resource relative to the current instance. All properties remain the same as the current instance unless overridden in options. + * @param options - An object with the following properties + * @param [options.url] - The url that will be resolved relative to the url of the current instance. + * @param [options.queryParameters] - An object containing query parameters that will be combined with those of the current instance. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). These will be combined with those of the current instance. + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The function to call when loading the resource fails. + * @param [options.retryAttempts] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.preserveQueryParameters = false] - If true, this will keep all query parameters from the current resource and derived resource. If false, derived parameters will replace those of the current resource. + * @returns The resource derived from the current one. + */ + getDerivedResource(options: { + url?: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + preserveQueryParameters?: boolean; + }): Resource; + /** + * Duplicates a Resource instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Resource instance if one was not provided. + */ + clone(result?: Resource): Resource; + /** + * Returns the base path of the Resource. + * @param [includeQuery = false] - Whether or not to include the query string and fragment form the uri + * @returns The base URI of the resource + */ + getBaseUri(includeQuery?: boolean): string; + /** + * Appends a forward slash to the URL. + */ + appendForwardSlash(): void; + /** + * Asynchronously loads the resource as raw binary data. Returns a promise that will resolve to + * an ArrayBuffer once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load a single URL asynchronously + * resource.fetchArrayBuffer().then(function(arrayBuffer) { + * // use the data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchArrayBuffer(): Promise | undefined; + /** + * Creates a Resource and calls fetchArrayBuffer() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchArrayBuffer(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as a blob. Returns a promise that will resolve to + * a Blob once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load a single URL asynchronously + * resource.fetchBlob().then(function(blob) { + * // use the data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchBlob(): Promise | undefined; + /** + * Creates a Resource and calls fetchBlob() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchBlob(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given image resource. Returns a promise that will resolve to + * an {@link https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap|ImageBitmap} if preferImageBitmap is true and the browser supports createImageBitmap or otherwise an + * {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement|Image} once loaded, or reject if the image failed to load. + * @example + * // load a single image asynchronously + * resource.fetchImage().then(function(image) { + * // use the loaded image + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * // load several images in parallel + * when.all([resource1.fetchImage(), resource2.fetchImage()]).then(function(images) { + * // images is an array containing all the loaded images + * }); + * @param [options] - An object with the following properties. + * @param [options.preferBlob = false] - If true, we will load the image via a blob. + * @param [options.preferImageBitmap = false] - If true, image will be decoded during fetch and an ImageBitmap is returned. + * @param [options.flipY = false] - If true, image will be vertically flipped during decode. Only applies if the browser supports createImageBitmap. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchImage(options?: { + preferBlob?: boolean; + preferImageBitmap?: boolean; + flipY?: boolean; + }): Promise | Promise | undefined; + /** + * Creates a Resource and calls fetchImage() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.flipY = false] - Whether to vertically flip the image during fetch and decode. Only applies when requesting an image and the browser supports createImageBitmap. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.preferBlob = false] - If true, we will load the image via a blob. + * @param [options.preferImageBitmap = false] - If true, image will be decoded during fetch and an ImageBitmap is returned. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchImage(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + flipY?: boolean; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + preferBlob?: boolean; + preferImageBitmap?: boolean; + }): Promise | Promise | undefined; + /** + * Asynchronously loads the given resource as text. Returns a promise that will resolve to + * a String once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load text from a URL, setting a custom header + * var resource = new Resource({ + * url: 'http://someUrl.com/someJson.txt', + * headers: { + * 'X-Custom-Header' : 'some value' + * } + * }); + * resource.fetchText().then(function(text) { + * // Do something with the text + * }).otherwise(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchText(): Promise | undefined; + /** + * Creates a Resource and calls fetchText() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchText(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as JSON. Returns a promise that will resolve to + * a JSON object once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. This function + * adds 'Accept: application/json,*/*;q=0.01' to the request headers, if not + * already specified. + * @example + * resource.fetchJson().then(function(jsonData) { + * // Do something with the JSON object + * }).otherwise(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchJson(): Promise | undefined; + /** + * Creates a Resource and calls fetchJson() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchJson(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as XML. Returns a promise that will resolve to + * an XML Document once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load XML from a URL, setting a custom header + * Cesium.loadXML('http://someUrl.com/someXML.xml', { + * 'X-Custom-Header' : 'some value' + * }).then(function(document) { + * // Do something with the document + * }).otherwise(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchXML(): Promise | undefined; + /** + * Creates a Resource and calls fetchXML() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchXML(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Requests a resource using JSONP. + * @example + * // load a data asynchronously + * resource.fetchJsonp().then(function(data) { + * // use the loaded data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param [callbackParameterName = 'callback'] - The callback parameter name that the server expects. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchJsonp(callbackParameterName?: string): Promise | undefined; + /** + * Creates a Resource from a URL and calls fetchJsonp() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.callbackParameterName = 'callback'] - The callback parameter name that the server expects. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchJsonp(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + callbackParameterName?: string; + }): Promise | undefined; + /** + * Asynchronously loads the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. It's recommended that you use + * the more specific functions eg. fetchJson, fetchBlob, etc. + * @example + * resource.fetch() + * .then(function(body) { + * // use the data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetch(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls fetch() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetch(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously deletes the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.delete() + * .then(function(body) { + * // use the data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + delete(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls delete() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.data] - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static delete(options: { + url: string; + data?: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously gets headers the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.head() + * .then(function(headers) { + * // use the data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + head(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls head() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static head(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously gets options the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.options() + * .then(function(headers) { + * // use the data + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + options(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls options() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static options(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously posts data to the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.post(data) + * .then(function(result) { + * // use the result + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param data - Data that is posted with the resource. + * @param [options] - Object with the following properties: + * @param [options.data] - Data that is posted with the resource. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + post(data: any, options?: { + data?: any; + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls post() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param options.data - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static post(options: { + url: string; + data: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously puts data to the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.put(data) + * .then(function(result) { + * // use the result + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param data - Data that is posted with the resource. + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + put(data: any, options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls put() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param options.data - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static put(options: { + url: string; + data: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously patches data to the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.patch(data) + * .then(function(result) { + * // use the result + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param data - Data that is posted with the resource. + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + patch(data: any, options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls patch() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param options.data - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static patch(options: { + url: string; + data: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * A resource instance initialized to the current browser location + */ + static readonly DEFAULT: Resource; +} + +export namespace Resource { + /** + * A function that returns the value of the property. + * @param [resource] - The resource that failed to load. + * @param [error] - The error that occurred during the loading of the resource. + */ + type RetryCallback = (resource?: Resource, error?: Error) => boolean | Promise; +} + +/** + * Constructs an exception object that is thrown due to an error that can occur at runtime, e.g., + * out of memory, could not compile shader, etc. If a function may throw this + * exception, the calling code should be prepared to catch it. + *

    + * On the other hand, a {@link DeveloperError} indicates an exception due + * to a developer error, e.g., invalid argument, that usually indicates a bug in the + * calling code. + * @param [message] - The error message for this exception. + */ +export class RuntimeError extends Error { + constructor(message?: string); + /** + * 'RuntimeError' indicating that this exception was thrown due to a runtime error. + */ + readonly name: string; + /** + * The explanation for why this exception was thrown. + */ + readonly message: string; + /** + * The stack trace of this exception, if available. + */ + readonly stack: string; +} + +/** + * Handles user input events. Custom functions can be added to be executed on + * when the user enters input. + * @param [element = document] - The element to add events to. + */ +export class ScreenSpaceEventHandler { + constructor(element?: HTMLCanvasElement); + /** + * Set a function to be executed on an input event. + * @param action - Function to be executed when the input event occurs. + * @param type - The ScreenSpaceEventType of input event. + * @param [modifier] - A KeyboardEventModifier key that is held when a type + * event occurs. + */ + setInputAction(action: (...params: any[]) => any, type: number, modifier?: number): void; + /** + * Returns the function to be executed on an input event. + * @param type - The ScreenSpaceEventType of input event. + * @param [modifier] - A KeyboardEventModifier key that is held when a type + * event occurs. + * @returns The function to be executed on an input event. + */ + getInputAction(type: number, modifier?: number): (...params: any[]) => any; + /** + * Removes the function to be executed on an input event. + * @param type - The ScreenSpaceEventType of input event. + * @param [modifier] - A KeyboardEventModifier key that is held when a type + * event occurs. + */ + removeInputAction(type: number, modifier?: number): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes listeners held by this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * handler = handler && handler.destroy(); + */ + destroy(): void; + /** + * The amount of time, in milliseconds, that mouse events will be disabled after + * receiving any touch events, such that any emulated mouse events will be ignored. + */ + static mouseEmulationIgnoreMilliseconds: number; + /** + * The amount of time, in milliseconds, before a touch on the screen becomes a + * touch and hold. + */ + static touchHoldDelayMilliseconds: number; +} + +/** + * This enumerated type is for classifying mouse events: down, up, click, double click, move and move while a button is held down. + */ +export enum ScreenSpaceEventType { + /** + * Represents a mouse left button down event. + */ + LEFT_DOWN = 0, + /** + * Represents a mouse left button up event. + */ + LEFT_UP = 1, + /** + * Represents a mouse left click event. + */ + LEFT_CLICK = 2, + /** + * Represents a mouse left double click event. + */ + LEFT_DOUBLE_CLICK = 3, + /** + * Represents a mouse left button down event. + */ + RIGHT_DOWN = 5, + /** + * Represents a mouse right button up event. + */ + RIGHT_UP = 6, + /** + * Represents a mouse right click event. + */ + RIGHT_CLICK = 7, + /** + * Represents a mouse middle button down event. + */ + MIDDLE_DOWN = 10, + /** + * Represents a mouse middle button up event. + */ + MIDDLE_UP = 11, + /** + * Represents a mouse middle click event. + */ + MIDDLE_CLICK = 12, + /** + * Represents a mouse move event. + */ + MOUSE_MOVE = 15, + /** + * Represents a mouse wheel event. + */ + WHEEL = 16, + /** + * Represents the start of a two-finger event on a touch surface. + */ + PINCH_START = 17, + /** + * Represents the end of a two-finger event on a touch surface. + */ + PINCH_END = 18, + /** + * Represents a change of a two-finger event on a touch surface. + */ + PINCH_MOVE = 19 +} + +/** + * Value and type information for per-instance geometry attribute that determines if the geometry instance will be shown. + * @example + * var instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.BoxGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL, + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0), + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * show : new Cesium.ShowGeometryInstanceAttribute(false) + * } + * }); + * @param [show = true] - Determines if the geometry instance will be shown. + */ +export class ShowGeometryInstanceAttribute { + constructor(show?: boolean); + /** + * The values for the attributes stored in a typed array. + */ + value: Uint8Array; + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentDatatype: ComponentDatatype; + /** + * The number of components in the attributes, i.e., {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + */ + readonly normalize: boolean; + /** + * Converts a boolean show to a typed array that can be used to assign a show attribute. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true, attributes.show); + * @param show - The show value. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static toValue(show: boolean, result?: Uint8Array): Uint8Array; +} + +/** + * Contains functions for finding the Cartesian coordinates of the sun and the moon in the + * Earth-centered inertial frame. + */ +export namespace Simon1994PlanetaryPositions { + /** + * Computes the position of the Sun in the Earth-centered inertial frame + * @param [julianDate] - The time at which to compute the Sun's position, if not provided the current system time is used. + * @param [result] - The object onto which to store the result. + * @returns Calculated sun position + */ + function computeSunPositionInEarthInertialFrame(julianDate?: JulianDate, result?: Cartesian3): Cartesian3; + /** + * Computes the position of the Moon in the Earth-centered inertial frame + * @param [julianDate] - The time at which to compute the Sun's position, if not provided the current system time is used. + * @param [result] - The object onto which to store the result. + * @returns Calculated moon position + */ + function computeMoonPositionInEarthInertialFrame(julianDate?: JulianDate, result?: Cartesian3): Cartesian3; +} + +/** + * A description of a polyline modeled as a line strip; the first two positions define a line segment, + * and each additional position defines a line segment from the previous position. + * @example + * // A polyline with two connected line segments + * var polyline = new Cesium.SimplePolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0, + * 5.0, 5.0 + * ]) + * }); + * var geometry = Cesium.SimplePolylineGeometry.createGeometry(polyline); + * @param options - Object with the following properties: + * @param options.positions - An array of {@link Cartesian3} defining the positions in the polyline as a line strip. + * @param [options.colors] - An Array of {@link Color} defining the per vertex or per segment colors. + * @param [options.colorsPerVertex = false] - A boolean that determines whether the colors will be flat across each segment of the line or interpolated across the vertices. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude if options.arcType is not ArcType.NONE. Determines the number of positions in the buffer. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid to be used as a reference. + */ +export class SimplePolylineGeometry { + constructor(options: { + positions: Cartesian3[]; + colors?: Color[]; + colorsPerVertex?: boolean; + arcType?: ArcType; + granularity?: number; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: SimplePolylineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new SimplePolylineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: SimplePolylineGeometry): SimplePolylineGeometry; + /** + * Computes the geometric representation of a simple polyline, including its vertices, indices, and a bounding sphere. + * @param simplePolylineGeometry - A description of the polyline. + * @returns The computed vertices and indices. + */ + static createGeometry(simplePolylineGeometry: SimplePolylineGeometry): Geometry | undefined; +} + +/** + * A description of a sphere centered at the origin. + * @example + * var sphere = new Cesium.SphereGeometry({ + * radius : 100.0, + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY + * }); + * var geometry = Cesium.SphereGeometry.createGeometry(sphere); + * @param [options] - Object with the following properties: + * @param [options.radius = 1.0] - The radius of the sphere. + * @param [options.stackPartitions = 64] - The number of times to partition the ellipsoid into stacks. + * @param [options.slicePartitions = 64] - The number of times to partition the ellipsoid into radial slices. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class SphereGeometry { + constructor(options?: { + radius?: number; + stackPartitions?: number; + slicePartitions?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: SphereGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new SphereGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: SphereGeometry): SphereGeometry; + /** + * Computes the geometric representation of a sphere, including its vertices, indices, and a bounding sphere. + * @param sphereGeometry - A description of the sphere. + * @returns The computed vertices and indices. + */ + static createGeometry(sphereGeometry: SphereGeometry): Geometry | undefined; +} + +/** + * A description of the outline of a sphere. + * @example + * var sphere = new Cesium.SphereOutlineGeometry({ + * radius : 100.0, + * stackPartitions : 6, + * slicePartitions: 5 + * }); + * var geometry = Cesium.SphereOutlineGeometry.createGeometry(sphere); + * @param [options] - Object with the following properties: + * @param [options.radius = 1.0] - The radius of the sphere. + * @param [options.stackPartitions = 10] - The count of stacks for the sphere (1 greater than the number of parallel lines). + * @param [options.slicePartitions = 8] - The count of slices for the sphere (Equal to the number of radial lines). + * @param [options.subdivisions = 200] - The number of points per line, determining the granularity of the curvature . + */ +export class SphereOutlineGeometry { + constructor(options?: { + radius?: number; + stackPartitions?: number; + slicePartitions?: number; + subdivisions?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: SphereOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new SphereOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: SphereOutlineGeometry): SphereOutlineGeometry; + /** + * Computes the geometric representation of an outline of a sphere, including its vertices, indices, and a bounding sphere. + * @param sphereGeometry - A description of the sphere outline. + * @returns The computed vertices and indices. + */ + static createGeometry(sphereGeometry: SphereOutlineGeometry): Geometry | undefined; +} + +/** + * A set of curvilinear 3-dimensional coordinates. + * @param [clock = 0.0] - The angular coordinate lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [cone = 0.0] - The angular coordinate measured from the positive z-axis and toward the negative z-axis. + * @param [magnitude = 1.0] - The linear coordinate measured from the origin. + */ +export class Spherical { + constructor(clock?: number, cone?: number, magnitude?: number); + /** + * The clock component. + */ + clock: number; + /** + * The cone component. + */ + cone: number; + /** + * The magnitude component. + */ + magnitude: number; + /** + * Converts the provided Cartesian3 into Spherical coordinates. + * @param cartesian3 - The Cartesian3 to be converted to Spherical. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new instance if one was not provided. + */ + static fromCartesian3(cartesian3: Cartesian3, result?: Spherical): Spherical; + /** + * Creates a duplicate of a Spherical. + * @param spherical - The spherical to clone. + * @param [result] - The object to store the result into, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. (Returns undefined if spherical is undefined) + */ + static clone(spherical: Spherical, result?: Spherical): Spherical; + /** + * Computes the normalized version of the provided spherical. + * @param spherical - The spherical to be normalized. + * @param [result] - The object to store the result into, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static normalize(spherical: Spherical, result?: Spherical): Spherical; + /** + * Returns true if the first spherical is equal to the second spherical, false otherwise. + * @param left - The first Spherical to be compared. + * @param right - The second Spherical to be compared. + * @returns true if the first spherical is equal to the second spherical, false otherwise. + */ + static equals(left: Spherical, right: Spherical): boolean; + /** + * Returns true if the first spherical is within the provided epsilon of the second spherical, false otherwise. + * @param left - The first Spherical to be compared. + * @param right - The second Spherical to be compared. + * @param [epsilon = 0.0] - The epsilon to compare against. + * @returns true if the first spherical is within the provided epsilon of the second spherical, false otherwise. + */ + static equalsEpsilon(left: Spherical, right: Spherical, epsilon?: number): boolean; + /** + * Returns true if this spherical is equal to the provided spherical, false otherwise. + * @param other - The Spherical to be compared. + * @returns true if this spherical is equal to the provided spherical, false otherwise. + */ + equals(other: Spherical): boolean; + /** + * Creates a duplicate of this Spherical. + * @param [result] - The object to store the result into, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + clone(result?: Spherical): Spherical; + /** + * Returns true if this spherical is within the provided epsilon of the provided spherical, false otherwise. + * @param other - The Spherical to be compared. + * @param epsilon - The epsilon to compare against. + * @returns true if this spherical is within the provided epsilon of the provided spherical, false otherwise. + */ + equalsEpsilon(other: Spherical, epsilon: number): boolean; + /** + * Returns a string representing this instance in the format (clock, cone, magnitude). + * @returns A string representing this instance. + */ + toString(): string; +} + +/** + * Creates a curve parameterized and evaluated by time. This type describes an interface + * and is not intended to be instantiated directly. + */ +export class Spline { + constructor(); + /** + * An array of times for the control points. + */ + times: number[]; + /** + * An array of control points. + */ + points: Cartesian3[] | Quaternion[]; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3 | Quaternion | number[]): Cartesian3 | Quaternion | number[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @param startIndex - The index from which to start the search. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number, startIndex: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around the animation period. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; +} + +/** + * A wrapper around a web worker that allows scheduling tasks for a given worker, + * returning results asynchronously via a promise. + * + * The Worker is not constructed until a task is scheduled. + * @param workerName - The name of the worker. This is expected to be a script + * in the Workers folder. + * @param [maximumActiveTasks = 5] - The maximum number of active tasks. Once exceeded, + * scheduleTask will not queue any more tasks, allowing + * work to be rescheduled in future frames. + */ +export class TaskProcessor { + constructor(workerName: string, maximumActiveTasks?: number); + /** + * Schedule a task to be processed by the web worker asynchronously. If there are currently more + * tasks active than the maximum set by the constructor, will immediately return undefined. + * Otherwise, returns a promise that will resolve to the result posted back by the worker when + * finished. + * @example + * var taskProcessor = new Cesium.TaskProcessor('myWorkerName'); + * var promise = taskProcessor.scheduleTask({ + * someParameter : true, + * another : 'hello' + * }); + * if (!Cesium.defined(promise)) { + * // too many active tasks - try again later + * } else { + * Cesium.when(promise, function(result) { + * // use the result of the task + * }); + * } + * @param parameters - Any input data that will be posted to the worker. + * @param [transferableObjects] - An array of objects contained in parameters that should be + * transferred to the worker instead of copied. + * @returns Either a promise that will resolve to the result when available, or undefined + * if there are too many active tasks, + */ + scheduleTask(parameters: any, transferableObjects?: object[]): Promise | undefined; + /** + * Posts a message to a web worker with configuration to initialize loading + * and compiling a web assembly module asychronously, as well as an optional + * fallback JavaScript module to use if Web Assembly is not supported. + * @param [webAssemblyOptions] - An object with the following properties: + * @param [webAssemblyOptions.modulePath] - The path of the web assembly JavaScript wrapper module. + * @param [webAssemblyOptions.wasmBinaryFile] - The path of the web assembly binary file. + * @param [webAssemblyOptions.fallbackModulePath] - The path of the fallback JavaScript module to use if web assembly is not supported. + * @returns A promise that resolves to the result when the web worker has loaded and compiled the web assembly module and is ready to process tasks. + */ + initWebAssemblyModule(webAssemblyOptions?: { + modulePath?: string; + wasmBinaryFile?: string; + fallbackModulePath?: string; + }): Promise; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys this object. This will immediately terminate the Worker. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + */ + destroy(): void; +} + +/** + * Terrain data for a single tile. This type describes an + * interface and is not intended to be instantiated directly. + */ +export class TerrainData { + constructor(); + /** + * An array of credits for this tile. + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. If the position + * is outside the rectangle, this method will extrapolate the height, which is likely to be wildly + * incorrect for positions far outside the rectangle. + */ + interpolateHeight(rectangle: Rectangle, longitude: number, latitude: number): number; + /** + * Determines if a given child tile is available, based on the + * {@link TerrainData#childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable(thisX: number, thisY: number, childX: number, childY: number): boolean; + /** + * Upsamples this terrain data for use by a descendant tile. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample(tilingScheme: TilingScheme, thisX: number, thisY: number, thisLevel: number, descendantX: number, descendantY: number, descendantLevel: number): Promise | undefined; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link TerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; +} + +/** + * Provides terrain or other geometry for the surface of an ellipsoid. The surface geometry is + * organized into a pyramid of tiles according to a {@link TilingScheme}. This type describes an + * interface and is not intended to be instantiated directly. + */ +export class TerrainProvider { + constructor(); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. This function should + * not be called before {@link TerrainProvider#ready} returns true. + */ + credit: Credit; + /** + * Gets the tiling scheme used by the provider. This function should + * not be called before {@link TerrainProvider#ready} returns true. + */ + tilingScheme: TilingScheme; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. This function should not be + * called before {@link TerrainProvider#ready} returns true. + */ + hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * This function should not be called before {@link TerrainProvider#ready} returns true. + */ + hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This function should not be called before + * {@link TerrainProvider#ready} returns true. This property may be undefined if availability + * information is not available. + */ + availability: TileAvailability; + /** + * Gets a list of indices for a triangle mesh representing a regular grid. Calling + * this function multiple times with the same grid width and height returns the + * same list of indices. The total number of vertices must be less than or equal + * to 65536. + * @param width - The number of vertices in the regular grid in the horizontal direction. + * @param height - The number of vertices in the regular grid in the vertical direction. + * @returns The list of indices. Uint16Array gets returned for 64KB or less and Uint32Array for 4GB or less. + */ + static getRegularGridIndices(width: number, height: number): Uint16Array | Uint32Array; + /** + * Specifies the quality of terrain created from heightmaps. A value of 1.0 will + * ensure that adjacent heightmap vertices are separated by no more than + * {@link Globe.maximumScreenSpaceError} screen pixels and will probably go very slowly. + * A value of 0.5 will cut the estimated level zero geometric error in half, allowing twice the + * screen pixels between adjacent heightmap vertices and thus rendering more quickly. + */ + static heightmapTerrainQuality: number; + /** + * Determines an appropriate geometric error estimate when the geometry comes from a heightmap. + * @param ellipsoid - The ellipsoid to which the terrain is attached. + * @param tileImageWidth - The width, in pixels, of the heightmap associated with a single tile. + * @param numberOfTilesAtLevelZero - The number of tiles in the horizontal direction at tile level zero. + * @returns An estimated geometric error. + */ + static getEstimatedLevelZeroGeometricErrorForAHeightmap(ellipsoid: Ellipsoid, tileImageWidth: number, numberOfTilesAtLevelZero: number): number; + /** + * Requests the geometry for a given tile. This function should not be called before + * {@link TerrainProvider#ready} returns true. The result must include terrain data and + * may optionally include a water mask and an indication of which child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. This function should not be + * called before {@link TerrainProvider#ready} returns true. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported by the terrain provider, otherwise true or false. + */ + getTileDataAvailable(x: number, y: number, level: number): boolean; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined | Promise; +} + +/** + * Reports the availability of tiles in a {@link TilingScheme}. + * @param tilingScheme - The tiling scheme in which to report availability. + * @param maximumLevel - The maximum tile level that is potentially available. + */ +export class TileAvailability { + constructor(tilingScheme: TilingScheme, maximumLevel: number); + /** + * Marks a rectangular range of tiles in a particular level as being available. For best performance, + * add your ranges in order of increasing level. + * @param level - The level. + * @param startX - The X coordinate of the first available tiles at the level. + * @param startY - The Y coordinate of the first available tiles at the level. + * @param endX - The X coordinate of the last available tiles at the level. + * @param endY - The Y coordinate of the last available tiles at the level. + */ + addAvailableTileRange(level: number, startX: number, startY: number, endX: number, endY: number): void; + /** + * Determines the level of the most detailed tile covering the position. This function + * usually completes in time logarithmic to the number of rectangles added with + * {@link TileAvailability#addAvailableTileRange}. + * @param position - The position for which to determine the maximum available level. The height component is ignored. + * @returns The level of the most detailed tile covering the position. + */ + computeMaximumLevelAtPosition(position: Cartographic): number; + /** + * Finds the most detailed level that is available _everywhere_ within a given rectangle. More detailed + * tiles may be available in parts of the rectangle, but not the whole thing. The return value of this + * function may be safely passed to {@link sampleTerrain} for any position within the rectangle. This function + * usually completes in time logarithmic to the number of rectangles added with + * {@link TileAvailability#addAvailableTileRange}. + * @param rectangle - The rectangle. + * @returns The best available level for the entire rectangle. + */ + computeBestAvailableLevelOverRectangle(rectangle: Rectangle): number; + /** + * Determines if a particular tile is available. + * @param level - The tile level to check. + * @param x - The X coordinate of the tile to check. + * @param y - The Y coordinate of the tile to check. + * @returns True if the tile is available; otherwise, false. + */ + isTileAvailable(level: number, x: number, y: number): boolean; + /** + * Computes a bit mask indicating which of a tile's four children exist. + * If a child's bit is set, a tile is available for that child. If it is cleared, + * the tile is not available. The bit values are as follows: + * + * + * + * + * + * + *
    Bit PositionBit ValueChild Tile
    01Southwest
    12Southeast
    24Northwest
    38Northeast
    + * @param level - The level of the parent tile. + * @param x - The X coordinate of the parent tile. + * @param y - The Y coordinate of the parent tile. + * @returns The bit mask indicating child availability. + */ + computeChildMaskForTile(level: number, x: number, y: number): number; +} + +/** + * Provides details about an error that occurred in an {@link ImageryProvider} or a {@link TerrainProvider}. + * @param provider - The imagery or terrain provider that experienced the error. + * @param message - A message describing the error. + * @param [x] - The X coordinate of the tile that experienced the error, or undefined if the error + * is not specific to a particular tile. + * @param [y] - The Y coordinate of the tile that experienced the error, or undefined if the error + * is not specific to a particular tile. + * @param [level] - The level of the tile that experienced the error, or undefined if the error + * is not specific to a particular tile. + * @param [timesRetried = 0] - The number of times this operation has been retried. + * @param [error] - The error or exception that occurred, if any. + */ +export class TileProviderError { + constructor(provider: ImageryProvider | TerrainProvider, message: string, x?: number, y?: number, level?: number, timesRetried?: number, error?: Error); + /** + * The {@link ImageryProvider} or {@link TerrainProvider} that experienced the error. + */ + provider: ImageryProvider | TerrainProvider; + /** + * The message describing the error. + */ + message: string; + /** + * The X coordinate of the tile that experienced the error. If the error is not specific + * to a particular tile, this property will be undefined. + */ + x: number; + /** + * The Y coordinate of the tile that experienced the error. If the error is not specific + * to a particular tile, this property will be undefined. + */ + y: number; + /** + * The level-of-detail of the tile that experienced the error. If the error is not specific + * to a particular tile, this property will be undefined. + */ + level: number; + /** + * The number of times this operation has been retried. + */ + timesRetried: number; + /** + * True if the failed operation should be retried; otherwise, false. The imagery or terrain provider + * will set the initial value of this property before raising the event, but any listeners + * can change it. The value after the last listener is invoked will be acted upon. + */ + retry: boolean; + /** + * The error or exception that occurred, if any. + */ + error: Error; + /** + * Handles an error in an {@link ImageryProvider} or {@link TerrainProvider} by raising an event if it has any listeners, or by + * logging the error to the console if the event has no listeners. This method also tracks the number + * of times the operation has been retried and will automatically retry if requested to do so by the + * event listeners. + * @param previousError - The error instance returned by this function the last + * time it was called for this error, or undefined if this is the first time this error has + * occurred. + * @param provider - The imagery or terrain provider that encountered the error. + * @param event - The event to raise to inform listeners of the error. + * @param message - The message describing the error. + * @param x - The X coordinate of the tile that experienced the error, or undefined if the + * error is not specific to a particular tile. + * @param y - The Y coordinate of the tile that experienced the error, or undefined if the + * error is not specific to a particular tile. + * @param level - The level-of-detail of the tile that experienced the error, or undefined if the + * error is not specific to a particular tile. + * @param retryFunction - The function to call to retry the operation. If undefined, the + * operation will not be retried. + * @param [errorDetails] - The error or exception that occurred, if any. + * @returns The error instance that was passed to the event listeners and that + * should be passed to this function the next time it is called for the same error in order + * to track retry counts. + */ + static handleError(previousError: TileProviderError, provider: ImageryProvider | TerrainProvider, event: Event, message: string, x: number, y: number, level: number, retryFunction: TileProviderError.RetryFunction, errorDetails?: Error): TileProviderError; + /** + * Handles success of an operation by resetting the retry count of a previous error, if any. This way, + * if the error occurs again in the future, the listeners will be informed that it has not yet been retried. + * @param previousError - The previous error, or undefined if this operation has + * not previously resulted in an error. + */ + static handleSuccess(previousError: TileProviderError): void; +} + +export namespace TileProviderError { + /** + * A function that will be called to retry the operation. + */ + type RetryFunction = () => void; +} + +/** + * A tiling scheme for geometry or imagery on the surface of an ellipsoid. At level-of-detail zero, + * the coarsest, least-detailed level, the number of tiles is configurable. + * At level of detail one, each of the level zero tiles has four children, two in each direction. + * At level of detail two, each of the level one tiles has four children, two in each direction. + * This continues for as many levels as are present in the geometry or imagery source. + */ +export class TilingScheme { + constructor(); + /** + * Gets the ellipsoid that is tiled by the tiling scheme. + */ + ellipsoid: Ellipsoid; + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + */ + rectangle: Rectangle; + /** + * Gets the map projection used by the tiling scheme. + */ + projection: MapProjection; + /** + * Gets the total number of tiles in the X direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the X direction at the given level. + */ + getNumberOfXTilesAtLevel(level: number): number; + /** + * Gets the total number of tiles in the Y direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the Y direction at the given level. + */ + getNumberOfYTilesAtLevel(level: number): number; + /** + * Transforms a rectangle specified in geodetic radians to the native coordinate system + * of this tiling scheme. + * @param rectangle - The rectangle to transform. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the native rectangle if 'result' + * is undefined. + */ + rectangleToNativeRectangle(rectangle: Rectangle, result?: Rectangle): Rectangle; + /** + * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates + * of the tiling scheme. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToNativeRectangle(x: number, y: number, level: number, result?: any): Rectangle; + /** + * Converts tile x, y coordinates and level to a cartographic rectangle in radians. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToRectangle(x: number, y: number, level: number, result?: any): Rectangle; + /** + * Calculates the tile x, y coordinates of the tile containing + * a given cartographic position. + * @param position - The position. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the tile x, y coordinates + * if 'result' is undefined. + */ + positionToTileXY(position: Cartographic, level: number, result?: Cartesian2): Cartesian2; +} + +/** + * An interval defined by a start and a stop time; optionally including those times as part of the interval. + * Arbitrary data can optionally be associated with each instance for used with {@link TimeIntervalCollection}. + * @example + * // Create an instance that spans August 1st, 1980 and is associated + * // with a Cartesian position. + * var timeInterval = new Cesium.TimeInterval({ + * start : Cesium.JulianDate.fromIso8601('1980-08-01T00:00:00Z'), + * stop : Cesium.JulianDate.fromIso8601('1980-08-02T00:00:00Z'), + * isStartIncluded : true, + * isStopIncluded : false, + * data : Cesium.Cartesian3.fromDegrees(39.921037, -75.170082) + * }); + * @example + * // Create two instances from ISO 8601 intervals with associated numeric data + * // then compute their intersection, summing the data they contain. + * var left = Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2000/2010', + * data : 2 + * }); + * + * var right = Cesium.TimeInterval.fromIso8601({ + * iso8601 : '1995/2005', + * data : 3 + * }); + * + * //The result of the below intersection will be an interval equivalent to + * //var intersection = Cesium.TimeInterval.fromIso8601({ + * // iso8601 : '2000/2005', + * // data : 5 + * //}); + * var intersection = new Cesium.TimeInterval(); + * Cesium.TimeInterval.intersect(left, right, intersection, function(leftData, rightData) { + * return leftData + rightData; + * }); + * @example + * // Check if an interval contains a specific time. + * var dateToCheck = Cesium.JulianDate.fromIso8601('1982-09-08T11:30:00Z'); + * var containsDate = Cesium.TimeInterval.contains(timeInterval, dateToCheck); + * @param [options] - Object with the following properties: + * @param [options.start = new JulianDate()] - The start time of the interval. + * @param [options.stop = new JulianDate()] - The stop time of the interval. + * @param [options.isStartIncluded = true] - true if options.start is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if options.stop is included in the interval, false otherwise. + * @param [options.data] - Arbitrary data associated with this interval. + */ +export class TimeInterval { + constructor(options?: { + start?: JulianDate; + stop?: JulianDate; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + data?: any; + }); + /** + * Gets or sets the start time of this interval. + */ + start: JulianDate; + /** + * Gets or sets the stop time of this interval. + */ + stop: JulianDate; + /** + * Gets or sets the data associated with this interval. + */ + data: any; + /** + * Gets or sets whether or not the start time is included in this interval. + */ + isStartIncluded: boolean; + /** + * Gets or sets whether or not the stop time is included in this interval. + */ + isStopIncluded: boolean; + /** + * Gets whether or not this interval is empty. + */ + readonly isEmpty: boolean; + /** + * Creates a new instance from a {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} interval. + * @param options - Object with the following properties: + * @param options.iso8601 - An ISO 8601 interval. + * @param [options.isStartIncluded = true] - true if options.start is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if options.stop is included in the interval, false otherwise. + * @param [options.data] - Arbitrary data associated with this interval. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601(options: { + iso8601: string; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + data?: any; + }, result?: TimeInterval): TimeInterval; + /** + * Creates an ISO8601 representation of the provided interval. + * @param timeInterval - The interval to be converted. + * @param [precision] - The number of fractional digits used to represent the seconds component. By default, the most precise representation is used. + * @returns The ISO8601 representation of the provided interval. + */ + static toIso8601(timeInterval: TimeInterval, precision?: number): string; + /** + * Duplicates the provided instance. + * @param [timeInterval] - The instance to clone. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static clone(timeInterval?: TimeInterval, result?: TimeInterval): TimeInterval; + /** + * Compares two instances and returns true if they are equal, false otherwise. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if the dates are equal; otherwise, false. + */ + static equals(left?: TimeInterval, right?: TimeInterval, dataComparer?: TimeInterval.DataComparer): boolean; + /** + * Compares two instances and returns true if they are within epsilon seconds of + * each other. That is, in order for the dates to be considered equal (and for + * this function to return true), the absolute value of the difference between them, in + * seconds, must be less than epsilon. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @param [epsilon = 0] - The maximum number of seconds that should separate the two instances. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if the two dates are within epsilon seconds of each other; otherwise false. + */ + static equalsEpsilon(left?: TimeInterval, right?: TimeInterval, epsilon?: number, dataComparer?: TimeInterval.DataComparer): boolean; + /** + * Computes the intersection of two intervals, optionally merging their data. + * @param left - The first interval. + * @param [right] - The second interval. + * @param [result] - An existing instance to use for the result. + * @param [mergeCallback] - A function which merges the data of the two intervals. If omitted, the data from the left interval will be used. + * @returns The modified result parameter. + */ + static intersect(left: TimeInterval, right?: TimeInterval, result?: TimeInterval, mergeCallback?: TimeInterval.MergeCallback): TimeInterval; + /** + * Checks if the specified date is inside the provided interval. + * @param timeInterval - The interval. + * @param julianDate - The date to check. + * @returns true if the interval contains the specified date, false otherwise. + */ + static contains(timeInterval: TimeInterval, julianDate: JulianDate): boolean; + /** + * Duplicates this instance. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + clone(result?: TimeInterval): TimeInterval; + /** + * Compares this instance against the provided instance componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side interval. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if they are equal, false otherwise. + */ + equals(right?: TimeInterval, dataComparer?: TimeInterval.DataComparer): boolean; + /** + * Compares this instance against the provided instance componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side interval. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: TimeInterval, epsilon?: number, dataComparer?: TimeInterval.DataComparer): boolean; + /** + * Creates a string representing this TimeInterval in ISO8601 format. + * @returns A string representing this TimeInterval in ISO8601 format. + */ + toString(): string; + /** + * An immutable empty interval. + */ + static readonly EMPTY: TimeInterval; +} + +export namespace TimeInterval { + /** + * Function interface for merging interval data. + * @param leftData - The first data instance. + * @param rightData - The second data instance. + */ + type MergeCallback = (leftData: any, rightData: any) => any; + /** + * Function interface for comparing interval data. + * @param leftData - The first data instance. + * @param rightData - The second data instance. + */ + type DataComparer = (leftData: any, rightData: any) => boolean; +} + +/** + * A non-overlapping collection of {@link TimeInterval} instances sorted by start time. + * @param [intervals] - An array of intervals to add to the collection. + */ +export class TimeIntervalCollection { + constructor(intervals?: TimeInterval[]); + /** + * Gets an event that is raised whenever the collection of intervals change. + */ + readonly changedEvent: Event; + /** + * Gets the start time of the collection. + */ + readonly start: JulianDate; + /** + * Gets whether or not the start time is included in the collection. + */ + readonly isStartIncluded: boolean; + /** + * Gets the stop time of the collection. + */ + readonly stop: JulianDate; + /** + * Gets whether or not the stop time is included in the collection. + */ + readonly isStopIncluded: boolean; + /** + * Gets the number of intervals in the collection. + */ + readonly length: number; + /** + * Gets whether or not the collection is empty. + */ + readonly isEmpty: boolean; + /** + * Compares this instance against the provided instance componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side collection. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if they are equal, false otherwise. + */ + equals(right?: TimeIntervalCollection, dataComparer?: TimeInterval.DataComparer): boolean; + /** + * Gets the interval at the specified index. + * @param index - The index of the interval to retrieve. + * @returns The interval at the specified index, or undefined if no interval exists as that index. + */ + get(index: number): TimeInterval | undefined; + /** + * Removes all intervals from the collection. + */ + removeAll(): void; + /** + * Finds and returns the interval that contains the specified date. + * @param date - The date to search for. + * @returns The interval containing the specified date, undefined if no such interval exists. + */ + findIntervalContainingDate(date: JulianDate): TimeInterval | undefined; + /** + * Finds and returns the data for the interval that contains the specified date. + * @param date - The date to search for. + * @returns The data for the interval containing the specified date, or undefined if no such interval exists. + */ + findDataForIntervalContainingDate(date: JulianDate): any; + /** + * Checks if the specified date is inside this collection. + * @param julianDate - The date to check. + * @returns true if the collection contains the specified date, false otherwise. + */ + contains(julianDate: JulianDate): boolean; + /** + * Finds and returns the index of the interval in the collection that contains the specified date. + * @param date - The date to search for. + * @returns The index of the interval that contains the specified date, if no such interval exists, + * it returns a negative number which is the bitwise complement of the index of the next interval that + * starts after the date, or if no interval starts after the specified date, the bitwise complement of + * the length of the collection. + */ + indexOf(date: JulianDate): number; + /** + * Returns the first interval in the collection that matches the specified parameters. + * All parameters are optional and undefined parameters are treated as a don't care condition. + * @param [options] - Object with the following properties: + * @param [options.start] - The start time of the interval. + * @param [options.stop] - The stop time of the interval. + * @param [options.isStartIncluded] - true if options.start is included in the interval, false otherwise. + * @param [options.isStopIncluded] - true if options.stop is included in the interval, false otherwise. + * @returns The first interval in the collection that matches the specified parameters. + */ + findInterval(options?: { + start?: JulianDate; + stop?: JulianDate; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + }): TimeInterval | undefined; + /** + * Adds an interval to the collection, merging intervals that contain the same data and + * splitting intervals of different data as needed in order to maintain a non-overlapping collection. + * The data in the new interval takes precedence over any existing intervals in the collection. + * @param interval - The interval to add. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + */ + addInterval(interval: TimeInterval, dataComparer?: TimeInterval.DataComparer): void; + /** + * Removes the specified interval from this interval collection, creating a hole over the specified interval. + * The data property of the input interval is ignored. + * @param interval - The interval to remove. + * @returns true if the interval was removed, false if no part of the interval was in the collection. + */ + removeInterval(interval: TimeInterval): boolean; + /** + * Creates a new instance that is the intersection of this collection and the provided collection. + * @param other - The collection to intersect with. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @param [mergeCallback] - A function which merges the data of the two intervals. If omitted, the data from the left interval will be used. + * @returns A new TimeIntervalCollection which is the intersection of this collection and the provided collection. + */ + intersect(other: TimeIntervalCollection, dataComparer?: TimeInterval.DataComparer, mergeCallback?: TimeInterval.MergeCallback): TimeIntervalCollection; + /** + * Creates a new instance from a JulianDate array. + * @param options - Object with the following properties: + * @param options.julianDates - An array of ISO 8601 dates. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromJulianDateArray(options: { + julianDates: JulianDate[]; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, result?: TimeIntervalCollection): TimeIntervalCollection; + /** + * Creates a new instance from an {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} time interval (start/end/duration). + * @param options - Object with the following properties: + * @param options.iso8601 - An ISO 8601 interval. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601(options: { + iso8601: string; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, result?: TimeIntervalCollection): TimeIntervalCollection; + /** + * Creates a new instance from a {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} date array. + * @param options - Object with the following properties: + * @param options.iso8601Dates - An array of ISO 8601 dates. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601DateArray(options: { + iso8601Dates: string[]; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, result?: TimeIntervalCollection): TimeIntervalCollection; + /** + * Creates a new instance from a {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} duration array. + * @param options - Object with the following properties: + * @param options.epoch - An date that the durations are relative to. + * @param options.iso8601Durations - An array of ISO 8601 durations. + * @param [options.relativeToPrevious = false] - true if durations are relative to previous date, false if always relative to the epoch. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601DurationArray(options: { + epoch: JulianDate; + iso8601Durations: string; + relativeToPrevious?: boolean; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, result?: TimeIntervalCollection): TimeIntervalCollection; +} + +/** + * Provides the type of time standards which JulianDate can take as input. + */ +export enum TimeStandard { + /** + * Represents the coordinated Universal Time (UTC) time standard. + * + * UTC is related to TAI according to the relationship + * UTC = TAI - deltaT where deltaT is the number of leap + * seconds which have been introduced as of the time in TAI. + */ + UTC = 0, + /** + * Represents the International Atomic Time (TAI) time standard. + * TAI is the principal time standard to which the other time standards are related. + */ + TAI = 1 +} + +/** + * Contains functions for transforming positions to various reference frames. + */ +export namespace Transforms { + /** + * Generates a function that computes a 4x4 transformation matrix from a reference frame + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * @param firstAxis - name of the first axis of the local reference frame. Must be + * 'east', 'north', 'up', 'west', 'south' or 'down'. + * @param secondAxis - name of the second axis of the local reference frame. Must be + * 'east', 'north', 'up', 'west', 'south' or 'down'. + * @returns The function that will computes a + * 4x4 transformation matrix from a reference frame, with first axis and second axis compliant with the parameters, + */ + function localFrameToFixedFrameGenerator(firstAxis: string, secondAxis: string): Transforms.LocalFrameToFixedFrame; + /** + * Computes a 4x4 transformation matrix from a reference frame + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + */ + type LocalFrameToFixedFrame = (origin: Cartesian3, ellipsoid?: Ellipsoid, result?: Matrix4) => Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an east-north-up axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
      + *
    • The x axis points in the local east direction.
    • + *
    • The y axis points in the local north direction.
    • + *
    • The z axis points in the direction of the ellipsoid surface normal which passes through the position.
    • + *
    + * @example + * // Get the transform from local east-north-up at cartographic (0.0, 0.0) to Earth's fixed frame. + * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function eastNorthUpToFixedFrame(origin: Cartesian3, ellipsoid?: Ellipsoid, result?: Matrix4): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an north-east-down axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
      + *
    • The x axis points in the local north direction.
    • + *
    • The y axis points in the local east direction.
    • + *
    • The z axis points in the opposite direction of the ellipsoid surface normal which passes through the position.
    • + *
    + * @example + * // Get the transform from local north-east-down at cartographic (0.0, 0.0) to Earth's fixed frame. + * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var transform = Cesium.Transforms.northEastDownToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function northEastDownToFixedFrame(origin: Cartesian3, ellipsoid?: Ellipsoid, result?: Matrix4): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an north-up-east axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
      + *
    • The x axis points in the local north direction.
    • + *
    • The y axis points in the direction of the ellipsoid surface normal which passes through the position.
    • + *
    • The z axis points in the local east direction.
    • + *
    + * @example + * // Get the transform from local north-up-east at cartographic (0.0, 0.0) to Earth's fixed frame. + * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var transform = Cesium.Transforms.northUpEastToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function northUpEastToFixedFrame(origin: Cartesian3, ellipsoid?: Ellipsoid, result?: Matrix4): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an north-west-up axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
      + *
    • The x axis points in the local north direction.
    • + *
    • The y axis points in the local west direction.
    • + *
    • The z axis points in the direction of the ellipsoid surface normal which passes through the position.
    • + *
    + * @example + * // Get the transform from local north-West-Up at cartographic (0.0, 0.0) to Earth's fixed frame. + * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var transform = Cesium.Transforms.northWestUpToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function northWestUpToFixedFrame(origin: Cartesian3, ellipsoid?: Ellipsoid, result?: Matrix4): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with axes computed from the heading-pitch-roll angles + * centered at the provided origin to the provided ellipsoid's fixed reference frame. Heading is the rotation from the local north + * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis. + * @example + * // Get the transform from local heading-pitch-roll at cartographic (0.0, 0.0) to Earth's fixed frame. + * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var heading = -Cesium.Math.PI_OVER_TWO; + * var pitch = Cesium.Math.PI_OVER_FOUR; + * var roll = 0.0; + * var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); + * var transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr); + * @param origin - The center point of the local reference frame. + * @param headingPitchRoll - The heading, pitch, and roll. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [fixedFrameTransform = Transforms.eastNorthUpToFixedFrame] - A 4x4 transformation + * matrix from a reference frame to the provided ellipsoid's fixed reference frame + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function headingPitchRollToFixedFrame(origin: Cartesian3, headingPitchRoll: HeadingPitchRoll, ellipsoid?: Ellipsoid, fixedFrameTransform?: Transforms.LocalFrameToFixedFrame, result?: Matrix4): Matrix4; + /** + * Computes a quaternion from a reference frame with axes computed from the heading-pitch-roll angles + * centered at the provided origin. Heading is the rotation from the local north + * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis. + * @example + * // Get the quaternion from local heading-pitch-roll at cartographic (0.0, 0.0) to Earth's fixed frame. + * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var heading = -Cesium.Math.PI_OVER_TWO; + * var pitch = Cesium.Math.PI_OVER_FOUR; + * var roll = 0.0; + * var hpr = new HeadingPitchRoll(heading, pitch, roll); + * var quaternion = Cesium.Transforms.headingPitchRollQuaternion(center, hpr); + * @param origin - The center point of the local reference frame. + * @param headingPitchRoll - The heading, pitch, and roll. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [fixedFrameTransform = Transforms.eastNorthUpToFixedFrame] - A 4x4 transformation + * matrix from a reference frame to the provided ellipsoid's fixed reference frame + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if none was provided. + */ + function headingPitchRollQuaternion(origin: Cartesian3, headingPitchRoll: HeadingPitchRoll, ellipsoid?: Ellipsoid, fixedFrameTransform?: Transforms.LocalFrameToFixedFrame, result?: Quaternion): Quaternion; + /** + * Computes heading-pitch-roll angles from a transform in a particular reference frame. Heading is the rotation from the local north + * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis. + * @param transform - The transform + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [fixedFrameTransform = Transforms.eastNorthUpToFixedFrame] - A 4x4 transformation + * matrix from a reference frame to the provided ellipsoid's fixed reference frame + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRoll instance if none was provided. + */ + function fixedFrameToHeadingPitchRoll(transform: Matrix4, ellipsoid?: Ellipsoid, fixedFrameTransform?: Transforms.LocalFrameToFixedFrame, result?: HeadingPitchRoll): HeadingPitchRoll; + /** + * Computes a rotation matrix to transform a point or vector from True Equator Mean Equinox (TEME) axes to the + * pseudo-fixed axes at a given time. This method treats the UT1 time standard as equivalent to UTC. + * @example + * //Set the view to the inertial frame. + * scene.postUpdate.addEventListener(function(scene, time) { + * var now = Cesium.JulianDate.now(); + * var offset = Cesium.Matrix4.multiplyByPoint(camera.transform, camera.position, new Cesium.Cartesian3()); + * var transform = Cesium.Matrix4.fromRotationTranslation(Cesium.Transforms.computeTemeToPseudoFixedMatrix(now)); + * var inverseTransform = Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()); + * Cesium.Matrix4.multiplyByPoint(inverseTransform, offset, offset); + * camera.lookAtTransform(transform, offset); + * }); + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if none was provided. + */ + function computeTemeToPseudoFixedMatrix(date: JulianDate, result?: Matrix3): Matrix3; + /** + * Preloads the data necessary to transform between the ICRF and Fixed axes, in either + * direction, over a given interval. This function returns a promise that, when resolved, + * indicates that the preload has completed. + * @example + * var interval = new Cesium.TimeInterval(...); + * when(Cesium.Transforms.preloadIcrfFixed(interval), function() { + * // the data is now loaded + * }); + * @param timeInterval - The interval to preload. + * @returns A promise that, when resolved, indicates that the preload has completed + * and evaluation of the transformation between the fixed and ICRF axes will + * no longer return undefined for a time inside the interval. + */ + function preloadIcrfFixed(timeInterval: TimeInterval): Promise; + /** + * Computes a rotation matrix to transform a point or vector from the International Celestial + * Reference Frame (GCRF/ICRF) inertial frame axes to the Earth-Fixed frame axes (ITRF) + * at a given time. This function may return undefined if the data necessary to + * do the transformation is not yet loaded. + * @example + * scene.postUpdate.addEventListener(function(scene, time) { + * // View in ICRF. + * var icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time); + * if (Cesium.defined(icrfToFixed)) { + * var offset = Cesium.Cartesian3.clone(camera.position); + * var transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed); + * camera.lookAtTransform(transform, offset); + * } + * }); + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix, or undefined if the data necessary to do the + * transformation is not yet loaded. + */ + function computeIcrfToFixedMatrix(date: JulianDate, result?: Matrix3): Matrix3; + /** + * Computes a rotation matrix to transform a point or vector from the Earth-Fixed frame axes (ITRF) + * to the International Celestial Reference Frame (GCRF/ICRF) inertial frame axes + * at a given time. This function may return undefined if the data necessary to + * do the transformation is not yet loaded. + * @example + * // Transform a point from the ICRF axes to the Fixed axes. + * var now = Cesium.JulianDate.now(); + * var pointInFixed = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var fixedToIcrf = Cesium.Transforms.computeIcrfToFixedMatrix(now); + * var pointInInertial = new Cesium.Cartesian3(); + * if (Cesium.defined(fixedToIcrf)) { + * pointInInertial = Cesium.Matrix3.multiplyByVector(fixedToIcrf, pointInFixed, pointInInertial); + * } + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix, or undefined if the data necessary to do the + * transformation is not yet loaded. + */ + function computeFixedToIcrfMatrix(date: JulianDate, result?: Matrix3): Matrix3; + /** + * Transform a point from model coordinates to window coordinates. + * @param modelViewProjectionMatrix - The 4x4 model-view-projection matrix. + * @param viewportTransformation - The 4x4 viewport transformation. + * @param point - The point to transform. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if none was provided. + */ + function pointToWindowCoordinates(modelViewProjectionMatrix: Matrix4, viewportTransformation: Matrix4, point: Cartesian3, result?: Cartesian2): Cartesian2; + /** + * Transform a position and velocity to a rotation matrix. + * @param position - The position to transform. + * @param velocity - The velocity vector to transform. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if none was provided. + */ + function rotationMatrixFromPositionVelocity(position: Cartesian3, velocity: Cartesian3, ellipsoid?: Ellipsoid, result?: Matrix3): Matrix3; +} + +/** + * An affine transformation defined by a translation, rotation, and scale. + * @param [translation = Cartesian3.ZERO] - A {@link Cartesian3} specifying the (x, y, z) translation to apply to the node. + * @param [rotation = Quaternion.IDENTITY] - A {@link Quaternion} specifying the (x, y, z, w) rotation to apply to the node. + * @param [scale = new Cartesian3(1.0, 1.0, 1.0)] - A {@link Cartesian3} specifying the (x, y, z) scaling to apply to the node. + */ +export class TranslationRotationScale { + constructor(translation?: Cartesian3, rotation?: Quaternion, scale?: Cartesian3); + /** + * Gets or sets the (x, y, z) translation to apply to the node. + */ + translation: Cartesian3; + /** + * Gets or sets the (x, y, z, w) rotation to apply to the node. + */ + rotation: Quaternion; + /** + * Gets or sets the (x, y, z) scaling to apply to the node. + */ + scale: Cartesian3; + /** + * Compares this instance against the provided instance and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side TranslationRotationScale. + * @returns true if they are equal, false otherwise. + */ + equals(right?: TranslationRotationScale): boolean; +} + +/** + * Uses the Tridiagonal Matrix Algorithm, also known as the Thomas Algorithm, to solve + * a system of linear equations where the coefficient matrix is a tridiagonal matrix. + */ +export namespace TridiagonalSystemSolver { + /** + * Solves a tridiagonal system of linear equations. + * @example + * var lowerDiagonal = [1.0, 1.0, 1.0, 1.0]; + * var diagonal = [2.0, 4.0, 4.0, 4.0, 2.0]; + * var upperDiagonal = [1.0, 1.0, 1.0, 1.0]; + * var rightHandSide = [ + * new Cesium.Cartesian3(410757.0, -1595711.0, 1375302.0), + * new Cesium.Cartesian3(-5986705.0, -2190640.0, 1099600.0), + * new Cesium.Cartesian3(-12593180.0, 288588.0, -1755549.0), + * new Cesium.Cartesian3(-5349898.0, 2457005.0, -2685438.0), + * new Cesium.Cartesian3(845820.0, 1573488.0, -1205591.0) + * ]; + * + * var solution = Cesium.TridiagonalSystemSolver.solve(lowerDiagonal, diagonal, upperDiagonal, rightHandSide); + * @param diagonal - An array with length n that contains the diagonal of the coefficient matrix. + * @param lower - An array with length n - 1 that contains the lower diagonal of the coefficient matrix. + * @param upper - An array with length n - 1 that contains the upper diagonal of the coefficient matrix. + * @param right - An array of Cartesians with length n that is the right side of the system of equations. + * @returns An array of Cartesians with length n that is the solution to the tridiagonal system of equations. + */ + function solve(diagonal: number[], lower: number[], upper: number[], right: Cartesian3[]): Cartesian3[]; +} + +/** + * A singleton that contains all of the servers that are trusted. Credentials will be sent with + * any requests to these servers. + */ +export namespace TrustedServers { + /** + * Adds a trusted server to the registry + * @example + * // Add a trusted server + * TrustedServers.add('my.server.com', 80); + * @param host - The host to be added. + * @param port - The port used to access the host. + */ + function add(host: string, port: number): void; + /** + * Removes a trusted server from the registry + * @example + * // Remove a trusted server + * TrustedServers.remove('my.server.com', 80); + * @param host - The host to be removed. + * @param port - The port used to access the host. + */ + function remove(host: string, port: number): void; + /** + * Tests whether a server is trusted or not. The server must have been added with the port if it is included in the url. + * @example + * // Add server + * TrustedServers.add('my.server.com', 81); + * + * // Check if server is trusted + * if (TrustedServers.contains('https://my.server.com:81/path/to/file.png')) { + * // my.server.com:81 is trusted + * } + * if (TrustedServers.contains('https://my.server.com/path/to/file.png')) { + * // my.server.com isn't trusted + * } + * @param url - The url to be tested against the trusted list + * @returns Returns true if url is trusted, false otherwise. + */ + function contains(url: string): boolean; + /** + * Clears the registry + * @example + * // Remove a trusted server + * TrustedServers.clear(); + */ + function clear(): void; +} + +/** + * A {@link TerrainProvider} that produces terrain geometry by tessellating height maps + * retrieved from a {@link http://vr-theworld.com/|VT MÄK VR-TheWorld server}. + * @example + * var terrainProvider = new Cesium.VRTheWorldTerrainProvider({ + * url : 'https://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/' + * }); + * viewer.terrainProvider = terrainProvider; + * @param options - Object with the following properties: + * @param options.url - The URL of the VR-TheWorld TileMap. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid. If this parameter is not + * specified, the WGS84 ellipsoid is used. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + */ +export class VRTheWorldTerrainProvider { + constructor(options: { + url: Resource | string; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. This function should not be called before {@link VRTheWorldTerrainProvider#ready} returns true. + */ + credit: Credit; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link VRTheWorldTerrainProvider#ready} returns true. + */ + tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. This function should not be + * called before {@link VRTheWorldTerrainProvider#ready} returns true. + */ + hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * This function should not be called before {@link VRTheWorldTerrainProvider#ready} returns true. + */ + hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This function should not be called before + * {@link TerrainProvider#ready} returns true. This property may be undefined if availability + * information is not available. + */ + availability: TileAvailability; + /** + * Requests the geometry for a given tile. This function should not be called before + * {@link VRTheWorldTerrainProvider#ready} returns true. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable(x: number, y: number, level: number): boolean; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined | Promise; +} + +/** + * A vertex format defines what attributes make up a vertex. A VertexFormat can be provided + * to a {@link Geometry} to request that certain properties be computed, e.g., just position, + * position and normal, etc. + * @example + * // Create a vertex format with position and 2D texture coordinate attributes. + * var format = new Cesium.VertexFormat({ + * position : true, + * st : true + * }); + * @param [options] - An object with boolean properties corresponding to VertexFormat properties as shown in the code example. + */ +export class VertexFormat { + constructor(options?: any); + /** + * When true, the vertex has a 3D position attribute. + *

    + * 64-bit floating-point (for precision). 3 components per attribute. + *

    + */ + position: boolean; + /** + * When true, the vertex has a normal attribute (normalized), which is commonly used for lighting. + *

    + * 32-bit floating-point. 3 components per attribute. + *

    + */ + normal: boolean; + /** + * When true, the vertex has a 2D texture coordinate attribute. + *

    + * 32-bit floating-point. 2 components per attribute + *

    + */ + st: boolean; + /** + * When true, the vertex has a bitangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

    + * 32-bit floating-point. 3 components per attribute. + *

    + */ + bitangent: boolean; + /** + * When true, the vertex has a tangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

    + * 32-bit floating-point. 3 components per attribute. + *

    + */ + tangent: boolean; + /** + * When true, the vertex has an RGB color attribute. + *

    + * 8-bit unsigned byte. 3 components per attribute. + *

    + */ + color: boolean; + /** + * An immutable vertex format with only a position attribute. + */ + static readonly POSITION_ONLY: VertexFormat; + /** + * An immutable vertex format with position and normal attributes. + * This is compatible with per-instance color appearances like {@link PerInstanceColorAppearance}. + */ + static readonly POSITION_AND_NORMAL: VertexFormat; + /** + * An immutable vertex format with position, normal, and st attributes. + * This is compatible with {@link MaterialAppearance} when {@link MaterialAppearance#materialSupport} + * is TEXTURED/code>. + */ + static readonly POSITION_NORMAL_AND_ST: VertexFormat; + /** + * An immutable vertex format with position and st attributes. + * This is compatible with {@link EllipsoidSurfaceAppearance}. + */ + static readonly POSITION_AND_ST: VertexFormat; + /** + * An immutable vertex format with position and color attributes. + */ + static readonly POSITION_AND_COLOR: VertexFormat; + /** + * An immutable vertex format with well-known attributes: position, normal, st, tangent, and bitangent. + */ + static readonly ALL: VertexFormat; + /** + * An immutable vertex format with position, normal, and st attributes. + * This is compatible with most appearances and materials; however + * normal and st attributes are not always required. When this is + * known in advance, another VertexFormat should be used. + */ + static readonly DEFAULT: VertexFormat; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: VertexFormat, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new VertexFormat instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: VertexFormat): VertexFormat; + /** + * Duplicates a VertexFormat instance. + * @param vertexFormat - The vertex format to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new VertexFormat instance if one was not provided. (Returns undefined if vertexFormat is undefined) + */ + static clone(vertexFormat: VertexFormat, result?: VertexFormat): VertexFormat; +} + +/** + * Synchronizes a video element with a simulation clock. + * @param [options] - Object with the following properties: + * @param [options.clock] - The clock instance used to drive the video. + * @param [options.element] - The video element to be synchronized. + * @param [options.epoch = Iso8601.MINIMUM_VALUE] - The simulation time that marks the start of the video. + * @param [options.tolerance = 1.0] - The maximum amount of time, in seconds, that the clock and video can diverge. + */ +export class VideoSynchronizer { + constructor(options?: { + clock?: Clock; + element?: HTMLVideoElement; + epoch?: JulianDate; + tolerance?: number; + }); + /** + * Gets or sets the simulation time that marks the start of the video. + */ + epoch: JulianDate; + /** + * Gets or sets the amount of time in seconds the video's currentTime + * and the clock's currentTime can diverge before a video seek is performed. + * Lower values make the synchronization more accurate but video + * performance might suffer. Higher values provide better performance + * but at the cost of accuracy. + */ + tolerance: number; + /** + * Gets or sets the clock used to drive the video element. + */ + clock: Clock; + /** + * Gets or sets the video element to synchronize. + */ + element: HTMLVideoElement; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; +} + +/** + * This enumerated type is used in determining to what extent an object, the occludee, + * is visible during horizon culling. An occluder may fully block an occludee, in which case + * it has no visibility, may partially block an occludee from view, or may not block it at all, + * leading to full visibility. + */ +export enum Visibility { + /** + * Represents that no part of an object is visible. + */ + NONE = -1, + /** + * Represents that part, but not all, of an object is visible + */ + PARTIAL = 0, + /** + * Represents that an object is visible in its entirety. + */ + FULL = 1 +} + +/** + * A description of a wall, which is similar to a KML line string. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall that spans from ground level to 10000 meters + * var wall = new Cesium.WallGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * 19.0, 47.0, 10000.0, + * 19.0, 48.0, 10000.0, + * 20.0, 48.0, 10000.0, + * 20.0, 47.0, 10000.0, + * 19.0, 47.0, 10000.0 + * ]) + * }); + * var geometry = Cesium.WallGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.maximumHeights] - An array parallel to positions that give the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeights] - An array parallel to positions that give the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid for coordinate manipulation + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ +export class WallGeometry { + constructor(options: { + positions: Cartesian3[]; + granularity?: number; + maximumHeights?: number[]; + minimumHeights?: number[]; + ellipsoid?: Ellipsoid; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: WallGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new WallGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: WallGeometry): WallGeometry; + /** + * A description of a wall, which is similar to a KML line string. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall that spans from 10000 meters to 20000 meters + * var wall = Cesium.WallGeometry.fromConstantHeights({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 19.0, 47.0, + * 19.0, 48.0, + * 20.0, 48.0, + * 20.0, 47.0, + * 19.0, 47.0, + * ]), + * minimumHeight : 20000.0, + * maximumHeight : 10000.0 + * }); + * var geometry = Cesium.WallGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.maximumHeight] - A constant that defines the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeight] - A constant that defines the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid for coordinate manipulation + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + static fromConstantHeights(options: { + positions: Cartesian3[]; + maximumHeight?: number; + minimumHeight?: number; + ellipsoid?: Ellipsoid; + vertexFormat?: VertexFormat; + }): WallGeometry; + /** + * Computes the geometric representation of a wall, including its vertices, indices, and a bounding sphere. + * @param wallGeometry - A description of the wall. + * @returns The computed vertices and indices. + */ + static createGeometry(wallGeometry: WallGeometry): Geometry | undefined; +} + +/** + * A description of a wall outline. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall outline that spans from ground level to 10000 meters + * var wall = new Cesium.WallOutlineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * 19.0, 47.0, 10000.0, + * 19.0, 48.0, 10000.0, + * 20.0, 48.0, 10000.0, + * 20.0, 47.0, 10000.0, + * 19.0, 47.0, 10000.0 + * ]) + * }); + * var geometry = Cesium.WallOutlineGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.maximumHeights] - An array parallel to positions that give the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeights] - An array parallel to positions that give the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid for coordinate manipulation + */ +export class WallOutlineGeometry { + constructor(options: { + positions: Cartesian3[]; + granularity?: number; + maximumHeights?: number[]; + minimumHeights?: number[]; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack(value: WallOutlineGeometry, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new WallOutlineGeometry instance if one was not provided. + */ + static unpack(array: number[], startingIndex?: number, result?: WallOutlineGeometry): WallOutlineGeometry; + /** + * A description of a walloutline. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall that spans from 10000 meters to 20000 meters + * var wall = Cesium.WallOutlineGeometry.fromConstantHeights({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 19.0, 47.0, + * 19.0, 48.0, + * 20.0, 48.0, + * 20.0, 47.0, + * 19.0, 47.0, + * ]), + * minimumHeight : 20000.0, + * maximumHeight : 10000.0 + * }); + * var geometry = Cesium.WallOutlineGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.maximumHeight] - A constant that defines the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeight] - A constant that defines the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid for coordinate manipulation + */ + static fromConstantHeights(options: { + positions: Cartesian3[]; + maximumHeight?: number; + minimumHeight?: number; + ellipsoid?: Ellipsoid; + }): WallOutlineGeometry; + /** + * Computes the geometric representation of a wall outline, including its vertices, indices, and a bounding sphere. + * @param wallGeometry - A description of the wall outline. + * @returns The computed vertices and indices. + */ + static createGeometry(wallGeometry: WallOutlineGeometry): Geometry | undefined; +} + +/** + * The map projection used by Google Maps, Bing Maps, and most of ArcGIS Online, EPSG:3857. This + * projection use longitude and latitude expressed with the WGS84 and transforms them to Mercator using + * the spherical (rather than ellipsoidal) equations. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid. + */ +export class WebMercatorProjection { + constructor(ellipsoid?: Ellipsoid); + /** + * Gets the {@link Ellipsoid}. + */ + readonly ellipsoid: Ellipsoid; + /** + * Converts a Mercator angle, in the range -PI to PI, to a geodetic latitude + * in the range -PI/2 to PI/2. + * @param mercatorAngle - The angle to convert. + * @returns The geodetic latitude in radians. + */ + static mercatorAngleToGeodeticLatitude(mercatorAngle: number): number; + /** + * Converts a geodetic latitude in radians, in the range -PI/2 to PI/2, to a Mercator + * angle in the range -PI to PI. + * @param latitude - The geodetic latitude in radians. + * @returns The Mercator angle. + */ + static geodeticLatitudeToMercatorAngle(latitude: number): number; + /** + * The maximum latitude (both North and South) supported by a Web Mercator + * (EPSG:3857) projection. Technically, the Mercator projection is defined + * for any latitude up to (but not including) 90 degrees, but it makes sense + * to cut it off sooner because it grows exponentially with increasing latitude. + * The logic behind this particular cutoff value, which is the one used by + * Google Maps, Bing Maps, and Esri, is that it makes the projection + * square. That is, the rectangle is equal in the X and Y directions. + * + * The constant value is computed by calling: + * WebMercatorProjection.mercatorAngleToGeodeticLatitude(Math.PI) + */ + static MaximumLatitude: number; + /** + * Converts geodetic ellipsoid coordinates, in radians, to the equivalent Web Mercator + * X, Y, Z coordinates expressed in meters and returned in a {@link Cartesian3}. The height + * is copied unmodified to the Z coordinate. + * @param cartographic - The cartographic coordinates in radians. + * @param [result] - The instance to which to copy the result, or undefined if a + * new instance should be created. + * @returns The equivalent web mercator X, Y, Z coordinates, in meters. + */ + project(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Converts Web Mercator X, Y coordinates, expressed in meters, to a {@link Cartographic} + * containing geodetic ellipsoid coordinates. The Z coordinate is copied unmodified to the + * height. + * @param cartesian - The web mercator Cartesian position to unrproject with height (z) in meters. + * @param [result] - The instance to which to copy the result, or undefined if a + * new instance should be created. + * @returns The equivalent cartographic coordinates. + */ + unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic; +} + +/** + * A tiling scheme for geometry referenced to a {@link WebMercatorProjection}, EPSG:3857. This is + * the tiling scheme used by Google Maps, Microsoft Bing Maps, and most of ESRI ArcGIS Online. + * @param [options] - Object with the following properties: + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid whose surface is being tiled. Defaults to + * the WGS84 ellipsoid. + * @param [options.numberOfLevelZeroTilesX = 1] - The number of tiles in the X direction at level zero of + * the tile tree. + * @param [options.numberOfLevelZeroTilesY = 1] - The number of tiles in the Y direction at level zero of + * the tile tree. + * @param [options.rectangleSouthwestInMeters] - The southwest corner of the rectangle covered by the + * tiling scheme, in meters. If this parameter or rectangleNortheastInMeters is not specified, the entire + * globe is covered in the longitude direction and an equal distance is covered in the latitude + * direction, resulting in a square projection. + * @param [options.rectangleNortheastInMeters] - The northeast corner of the rectangle covered by the + * tiling scheme, in meters. If this parameter or rectangleSouthwestInMeters is not specified, the entire + * globe is covered in the longitude direction and an equal distance is covered in the latitude + * direction, resulting in a square projection. + */ +export class WebMercatorTilingScheme { + constructor(options?: { + ellipsoid?: Ellipsoid; + numberOfLevelZeroTilesX?: number; + numberOfLevelZeroTilesY?: number; + rectangleSouthwestInMeters?: Cartesian2; + rectangleNortheastInMeters?: Cartesian2; + }); + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + */ + ellipsoid: Ellipsoid; + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + */ + rectangle: Rectangle; + /** + * Gets the map projection used by this tiling scheme. + */ + projection: MapProjection; + /** + * Gets the total number of tiles in the X direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the X direction at the given level. + */ + getNumberOfXTilesAtLevel(level: number): number; + /** + * Gets the total number of tiles in the Y direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the Y direction at the given level. + */ + getNumberOfYTilesAtLevel(level: number): number; + /** + * Transforms a rectangle specified in geodetic radians to the native coordinate system + * of this tiling scheme. + * @param rectangle - The rectangle to transform. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the native rectangle if 'result' + * is undefined. + */ + rectangleToNativeRectangle(rectangle: Rectangle, result?: Rectangle): Rectangle; + /** + * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates + * of the tiling scheme. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToNativeRectangle(x: number, y: number, level: number, result?: any): Rectangle; + /** + * Converts tile x, y coordinates and level to a cartographic rectangle in radians. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToRectangle(x: number, y: number, level: number, result?: any): Rectangle; + /** + * Calculates the tile x, y coordinates of the tile containing + * a given cartographic position. + * @param position - The position. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the tile x, y coordinates + * if 'result' is undefined. + */ + positionToTileXY(position: Cartographic, level: number, result?: Cartesian2): Cartesian2; +} + +/** + * A spline that linearly interpolates over an array of weight values used by morph targets. + * @example + * var times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * var weights = [0.0, 1.0, 0.25, 0.75, 0.5, 0.5, 0.75, 0.25, 1.0, 0.0]; //Two targets + * var spline = new Cesium.WeightSpline({ + * times : times, + * weights : weights + * }); + * + * var p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.weights - The array of floating-point control weights given. The weights are ordered such + * that all weights for the targets are given in chronological order and order in which they appear in + * the glTF from which the morph targets come. This means for 2 targets, weights = [w(0,0), w(0,1), w(1,0), w(1,1) ...] + * where i and j in w(i,j) are the time indices and target indices, respectively. + */ +export class WeightSpline { + constructor(options: { + times: number[]; + weights: number[]; + }); + /** + * An array of times for the control weights. + */ + readonly times: number[]; + /** + * An array of floating-point array control weights. + */ + readonly weights: number[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: number[]): number[]; +} + +/** + * Winding order defines the order of vertices for a triangle to be considered front-facing. + */ +export enum WindingOrder { + /** + * Vertices are in clockwise order. + */ + CLOCKWISE = WebGLConstants.CW, + /** + * Vertices are in counter-clockwise order. + */ + COUNTER_CLOCKWISE = WebGLConstants.CCW +} + +/** + * Computes the barycentric coordinates for a point with respect to a triangle. + * @example + * // Returns Cartesian3.UNIT_X + * var p = new Cesium.Cartesian3(-1.0, 0.0, 0.0); + * var b = Cesium.barycentricCoordinates(p, + * new Cesium.Cartesian3(-1.0, 0.0, 0.0), + * new Cesium.Cartesian3( 1.0, 0.0, 0.0), + * new Cesium.Cartesian3( 0.0, 1.0, 1.0)); + * @param point - The point to test. + * @param p0 - The first point of the triangle, corresponding to the barycentric x-axis. + * @param p1 - The second point of the triangle, corresponding to the barycentric y-axis. + * @param p2 - The third point of the triangle, corresponding to the barycentric z-axis. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ +export function barycentricCoordinates(point: Cartesian2 | Cartesian3, p0: Cartesian2 | Cartesian3, p1: Cartesian2 | Cartesian3, p2: Cartesian2 | Cartesian3, result?: Cartesian3): Cartesian3; + +/** + * Finds an item in a sorted array. + * @example + * // Create a comparator function to search through an array of numbers. + * function comparator(a, b) { + * return a - b; + * }; + * var numbers = [0, 2, 4, 6, 8]; + * var index = Cesium.binarySearch(numbers, 6, comparator); // 3 + * @param array - The sorted array to search. + * @param itemToFind - The item to find in the array. + * @param comparator - The function to use to compare the item to + * elements in the array. + * @returns The index of itemToFind in the array, if it exists. If itemToFind + * does not exist, the return value is a negative number which is the bitwise complement (~) + * of the index before which the itemToFind should be inserted in order to maintain the + * sorted order of the array. + */ +export function binarySearch(array: any[], itemToFind: any, comparator: binarySearchComparator): number; + +/** + * A function used to compare two items while performing a binary search. + * @example + * function compareNumbers(a, b) { + * return a - b; + * } + * @param a - An item in the array. + * @param b - The item being searched for. + */ +export type binarySearchComparator = (a: any, b: any) => number; + +/** + * Given a relative URL under the Cesium base URL, returns an absolute URL. + * @example + * var viewer = new Cesium.Viewer("cesiumContainer", { + * imageryProvider: new Cesium.TileMapServiceImageryProvider({ + * url: Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"), + * }), + * baseLayerPicker: false, + * }); + * @param relativeUrl - The relative path. + * @returns The absolutely URL representation of the provided path. + */ +export function buildModuleUrl(relativeUrl: string): string; + +/** + * A browser-independent function to cancel an animation frame requested using {@link requestAnimationFrame}. + * @param requestID - The value returned by {@link requestAnimationFrame}. + */ +export function cancelAnimationFrame(requestID: number): void; + +/** + * Clones an object, returning a new object containing the same properties. + * @param object - The object to clone. + * @param [deep = false] - If true, all properties will be deep cloned recursively. + * @returns The cloned object. + */ +export function clone(object: any, deep?: boolean): any; + +/** + * Merges two objects, copying their properties onto a new combined object. When two objects have the same + * property, the value of the property on the first object is used. If either object is undefined, + * it will be treated as an empty object. + * @example + * var object1 = { + * propOne : 1, + * propTwo : { + * value1 : 10 + * } + * } + * var object2 = { + * propTwo : 2 + * } + * var final = Cesium.combine(object1, object2); + * + * // final === { + * // propOne : 1, + * // propTwo : { + * // value1 : 10 + * // } + * // } + * @param [object1] - The first object to merge. + * @param [object2] - The second object to merge. + * @param [deep = false] - Perform a recursive merge. + * @returns The combined object containing all properties from both objects. + */ +export function combine(object1?: any, object2?: any, deep?: boolean): any; + +/** + * Creates a Globally unique identifier (GUID) string. A GUID is 128 bits long, and can guarantee uniqueness across space and time. + * @example + * this.guid = Cesium.createGuid(); + */ +export function createGuid(): string; + +/** + * Creates a {@link CesiumTerrainProvider} instance for the {@link https://cesium.com/content/#cesium-world-terrain|Cesium World Terrain}. + * @example + * // Create Cesium World Terrain with default settings + * var viewer = new Cesium.Viewer('cesiumContainer', { + * terrainProvider : Cesium.createWorldTerrain(); + * }); + * @example + * // Create Cesium World Terrain with water and normals. + * var viewer = new Cesium.Viewer('cesiumContainer', { + * terrainProvider : Cesium.createWorldTerrain({ + * requestWaterMask : true, + * requestVertexNormals : true + * }); + * }); + * @param [options] - Object with the following properties: + * @param [options.requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server if available. + * @param [options.requestWaterMask = false] - Flag that indicates if the client should request per tile water masks from the server if available. + */ +export function createWorldTerrain(options?: { + requestVertexNormals?: boolean; + requestWaterMask?: boolean; +}): CesiumTerrainProvider; + +/** + * Returns the first parameter if not undefined, otherwise the second parameter. + * Useful for setting a default value for a parameter. + * @example + * param = Cesium.defaultValue(param, 'default'); + * @returns Returns the first parameter if not undefined, otherwise the second parameter. + */ +export function defaultValue(a: any, b: any): any; + +/** + * @example + * if (Cesium.defined(positions)) { + * doSomething(); + * } else { + * doSomethingElse(); + * } + * @param value - The object. + * @returns Returns true if the object is defined, returns false otherwise. + */ +export function defined(value: any): boolean; + +/** + * Destroys an object. Each of the object's functions, including functions in its prototype, + * is replaced with a function that throws a {@link DeveloperError}, except for the object's + * isDestroyed function, which is set to a function that returns true. + * The object's properties are removed with delete. + *

    + * This function is used by objects that hold native resources, e.g., WebGL resources, which + * need to be explicitly released. Client code calls an object's destroy function, + * which then releases the native resource and calls destroyObject to put itself + * in a destroyed state. + * @example + * // How a texture would destroy itself. + * this.destroy = function () { + * _gl.deleteTexture(_texture); + * return Cesium.destroyObject(this); + * }; + * @param object - The object to destroy. + * @param [message] - The message to include in the exception that is thrown if + * a destroyed object's function is called. + */ +export function destroyObject(object: any, message?: string): void; + +/** + * Formats an error object into a String. If available, uses name, message, and stack + * properties, otherwise, falls back on toString(). + * @param object - The item to find in the array. + * @returns A string containing the formatted error. + */ +export function formatError(object: any): string; + +/** + * Given a relative Uri and a base Uri, returns the absolute Uri of the relative Uri. + * @example + * //absolute Uri will be "https://test.com/awesome.png"; + * var absoluteUri = Cesium.getAbsoluteUri('awesome.png', 'https://test.com'); + * @param relative - The relative Uri. + * @param [base] - The base Uri. + * @returns The absolute Uri of the given relative Uri. + */ +export function getAbsoluteUri(relative: string, base?: string): string; + +/** + * Given a URI, returns the base path of the URI. + * @example + * // basePath will be "/Gallery/"; + * var basePath = Cesium.getBaseUri('/Gallery/simple.czml?value=true&example=false'); + * + * // basePath will be "/Gallery/?value=true&example=false"; + * var basePath = Cesium.getBaseUri('/Gallery/simple.czml?value=true&example=false', true); + * @param uri - The Uri. + * @param [includeQuery = false] - Whether or not to include the query string and fragment form the uri + * @returns The base path of the Uri. + */ +export function getBaseUri(uri: string, includeQuery?: boolean): string; + +/** + * Given a URI, returns the extension of the URI. + * @example + * //extension will be "czml"; + * var extension = Cesium.getExtensionFromUri('/Gallery/simple.czml?value=true&example=false'); + * @param uri - The Uri. + * @returns The extension of the Uri. + */ +export function getExtensionFromUri(uri: string): string; + +/** + * Given a URI, returns the last segment of the URI, removing any path or query information. + * @example + * //fileName will be"simple.czml"; + * var fileName = Cesium.getFilenameFromUri('/Gallery/simple.czml?value=true&example=false'); + * @param uri - The Uri. + * @returns The last segment of the Uri. + */ +export function getFilenameFromUri(uri: string): string; + +/** + * Extract a pixel array from a loaded image. Draws the image + * into a canvas so it can read the pixels back. + * @param image - The image to extract pixels from. + * @param width - The width of the image. If not defined, then image.width is assigned. + * @param height - The height of the image. If not defined, then image.height is assigned. + * @returns The pixels of the image. + */ +export function getImagePixels(image: HTMLImageElement, width: number, height: number): ImageData; + +/** + * Gets a timestamp that can be used in measuring the time between events. Timestamps + * are expressed in milliseconds, but it is not specified what the milliseconds are + * measured from. This function uses performance.now() if it is available, or Date.now() + * otherwise. + * @returns The timestamp in milliseconds since some unspecified reference time. + */ +export function getTimestamp(): number; + +/** + * Determines if a given date is a leap year. + * @example + * var leapYear = Cesium.isLeapYear(2000); // true + * @param year - The year to be tested. + * @returns True if year is a leap year. + */ +export function isLeapYear(year: number): boolean; + +/** + * Asynchronously loads and parses the given URL to a CRN file or parses the raw binary data of a CRN file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load a single URL asynchronously + * Cesium.loadCRN('some/url').then(function(textureData) { + * var width = textureData.width; + * var height = textureData.height; + * var format = textureData.internalFormat; + * var arrayBufferView = textureData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param resourceOrUrlOrBuffer - The URL of the binary data or an ArrayBuffer. + * @returns A promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ +export function loadCRN(resourceOrUrlOrBuffer: Resource | string | ArrayBuffer): Promise | undefined; + +/** + * Asynchronously loads and parses the given URL to a KTX file or parses the raw binary data of a KTX file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + *

    + * The following are part of the KTX format specification but are not supported: + *

      + *
    • Big-endian files
    • + *
    • Metadata
    • + *
    • 3D textures
    • + *
    • Texture Arrays
    • + *
    • Cubemaps
    • + *
    • Mipmaps
    • + *
    + *

    + * @example + * // load a single URL asynchronously + * Cesium.loadKTX('some/url').then(function(ktxData) { + * var width = ktxData.width; + * var height = ktxData.height; + * var format = ktxData.internalFormat; + * var arrayBufferView = ktxData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * @param resourceOrUrlOrBuffer - The URL of the binary data or an ArrayBuffer. + * @returns A promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ +export function loadKTX(resourceOrUrlOrBuffer: Resource | string | ArrayBuffer): Promise | undefined; + +/** + * A stable merge sort. + * @example + * // Assume array contains BoundingSpheres in world coordinates. + * // Sort them in ascending order of distance from the camera. + * var position = camera.positionWC; + * Cesium.mergeSort(array, function(a, b, position) { + * return Cesium.BoundingSphere.distanceSquaredTo(b, position) - Cesium.BoundingSphere.distanceSquaredTo(a, position); + * }, position); + * @param array - The array to sort. + * @param comparator - The function to use to compare elements in the array. + * @param [userDefinedObject] - Any item to pass as the third parameter to comparator. + */ +export function mergeSort(array: any[], comparator: mergeSortComparator, userDefinedObject?: any): void; + +/** + * A function used to compare two items while performing a merge sort. + * @example + * function compareNumbers(a, b, userDefinedObject) { + * return a - b; + * } + * @param a - An item in the array. + * @param b - An item in the array. + * @param [userDefinedObject] - An object that was passed to {@link mergeSort}. + */ +export type mergeSortComparator = (a: any, b: any, userDefinedObject?: any) => number; + +/** + * Converts an object representing a set of name/value pairs into a query string, + * with names and values encoded properly for use in a URL. Values that are arrays + * will produce multiple values with the same name. + * @example + * var str = Cesium.objectToQuery({ + * key1 : 'some value', + * key2 : 'a/b', + * key3 : ['x', 'y'] + * }); + * @param obj - The object containing data to encode. + * @returns An encoded query string. + */ +export function objectToQuery(obj: any): string; + +/** + * Determines if a point is inside a triangle. + * @example + * // Returns true + * var p = new Cesium.Cartesian2(0.25, 0.25); + * var b = Cesium.pointInsideTriangle(p, + * new Cesium.Cartesian2(0.0, 0.0), + * new Cesium.Cartesian2(1.0, 0.0), + * new Cesium.Cartesian2(0.0, 1.0)); + * @param point - The point to test. + * @param p0 - The first point of the triangle. + * @param p1 - The second point of the triangle. + * @param p2 - The third point of the triangle. + * @returns true if the point is inside the triangle; otherwise, false. + */ +export function pointInsideTriangle(point: Cartesian2 | Cartesian3, p0: Cartesian2 | Cartesian3, p1: Cartesian2 | Cartesian3, p2: Cartesian2 | Cartesian3): boolean; + +/** + * Parses a query string into an object, where the keys and values of the object are the + * name/value pairs from the query string, decoded. If a name appears multiple times, + * the value in the object will be an array of values. + * @example + * var obj = Cesium.queryToObject('key1=some%20value&key2=a%2Fb&key3=x&key3=y'); + * // obj will be: + * // { + * // key1 : 'some value', + * // key2 : 'a/b', + * // key3 : ['x', 'y'] + * // } + * @param queryString - The query string. + * @returns An object containing the parameters parsed from the query string. + */ +export function queryToObject(queryString: string): any; + +/** + * A browser-independent function to request a new animation frame. This is used to create + * an application's draw loop as shown in the example below. + * @example + * // Create a draw loop using requestAnimationFrame. The + * // tick callback function is called for every animation frame. + * function tick() { + * scene.render(); + * Cesium.requestAnimationFrame(tick); + * } + * tick(); + * @param callback - The function to call when the next frame should be drawn. + * @returns An ID that can be passed to {@link cancelAnimationFrame} to cancel the request. + */ +export function requestAnimationFrame(callback: requestAnimationFrameCallback): number; + +/** + * A function that will be called when the next frame should be drawn. + * @param timestamp - A timestamp for the frame, in milliseconds. + */ +export type requestAnimationFrameCallback = (timestamp: number) => void; + +/** + * Initiates a terrain height query for an array of {@link Cartographic} positions by + * requesting tiles from a terrain provider, sampling, and interpolating. The interpolation + * matches the triangles used to render the terrain at the specified level. The query + * happens asynchronously, so this function returns a promise that is resolved when + * the query completes. Each point height is modified in place. If a height can not be + * determined because no terrain data is available for the specified level at that location, + * or another error occurs, the height is set to undefined. As is typical of the + * {@link Cartographic} type, the supplied height is a height above the reference ellipsoid + * (such as {@link Ellipsoid.WGS84}) rather than an altitude above mean sea level. In other + * words, it will not necessarily be 0.0 if sampled in the ocean. This function needs the + * terrain level of detail as input, if you need to get the altitude of the terrain as precisely + * as possible (i.e. with maximum level of detail) use {@link sampleTerrainMostDetailed}. + * @example + * // Query the terrain height of two Cartographic positions + * var terrainProvider = Cesium.createWorldTerrain(); + * var positions = [ + * Cesium.Cartographic.fromDegrees(86.925145, 27.988257), + * Cesium.Cartographic.fromDegrees(87.0, 28.0) + * ]; + * var promise = Cesium.sampleTerrain(terrainProvider, 11, positions); + * Cesium.when(promise, function(updatedPositions) { + * // positions[0].height and positions[1].height have been updated. + * // updatedPositions is just a reference to positions. + * }); + * @param terrainProvider - The terrain provider from which to query heights. + * @param level - The terrain level-of-detail from which to query terrain heights. + * @param positions - The positions to update with terrain heights. + * @returns A promise that resolves to the provided list of positions when terrain the query has completed. + */ +export function sampleTerrain(terrainProvider: TerrainProvider, level: number, positions: Cartographic[]): Promise; + +/** + * Initiates a sampleTerrain() request at the maximum available tile level for a terrain dataset. + * @example + * // Query the terrain height of two Cartographic positions + * var terrainProvider = Cesium.createWorldTerrain(); + * var positions = [ + * Cesium.Cartographic.fromDegrees(86.925145, 27.988257), + * Cesium.Cartographic.fromDegrees(87.0, 28.0) + * ]; + * var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions); + * Cesium.when(promise, function(updatedPositions) { + * // positions[0].height and positions[1].height have been updated. + * // updatedPositions is just a reference to positions. + * }); + * @param terrainProvider - The terrain provider from which to query heights. + * @param positions - The positions to update with terrain heights. + * @returns A promise that resolves to the provided list of positions when terrain the query has completed. This + * promise will reject if the terrain provider's `availability` property is undefined. + */ +export function sampleTerrainMostDetailed(terrainProvider: TerrainProvider, positions: Cartographic[]): Promise; + +/** + * Subdivides an array into a number of smaller, equal sized arrays. + * @param array - The array to divide. + * @param numberOfArrays - The number of arrays to divide the provided array into. + */ +export function subdivideArray(array: any[], numberOfArrays: number): void; + +/** + * Writes the given text into a new canvas. The canvas will be sized to fit the text. + * If text is blank, returns undefined. + * @param text - The text to write. + * @param [options] - Object with the following properties: + * @param [options.font = '10px sans-serif'] - The CSS font to use. + * @param [options.textBaseline = 'bottom'] - The baseline of the text. + * @param [options.fill = true] - Whether to fill the text. + * @param [options.stroke = false] - Whether to stroke the text. + * @param [options.fillColor = Color.WHITE] - The fill color. + * @param [options.strokeColor = Color.BLACK] - The stroke color. + * @param [options.strokeWidth = 1] - The stroke width. + * @param [options.backgroundColor = Color.TRANSPARENT] - The background color of the canvas. + * @param [options.padding = 0] - The pixel size of the padding to add around the text. + * @returns A new canvas with the given text drawn into it. The dimensions object + * from measureText will also be added to the returned canvas. If text is + * blank, returns undefined. + */ +export function writeTextToCanvas(text: string, options?: { + font?: string; + textBaseline?: string; + fill?: boolean; + stroke?: boolean; + fillColor?: Color; + strokeColor?: Color; + strokeWidth?: number; + backgroundColor?: Color; + padding?: number; +}): HTMLCanvasElement; + +export namespace BillboardGraphics { + /** + * Initialization options for the BillboardGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the billboard. + * @property [image] - A Property specifying the Image, URI, or Canvas to use for the billboard. + * @property [scale = 1.0] - A numeric Property specifying the scale to apply to the image size. + * @property [pixelOffset = Cartesian2.ZERO] - A {@link Cartesian2} Property specifying the pixel offset. + * @property [eyeOffset = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the eye offset. + * @property [horizontalOrigin = HorizontalOrigin.CENTER] - A Property specifying the {@link HorizontalOrigin}. + * @property [verticalOrigin = VerticalOrigin.CENTER] - A Property specifying the {@link VerticalOrigin}. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [color = Color.WHITE] - A Property specifying the tint {@link Color} of the image. + * @property [rotation = 0] - A numeric Property specifying the rotation about the alignedAxis. + * @property [alignedAxis = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the unit vector axis of rotation. + * @property [sizeInMeters] - A boolean Property specifying whether this billboard's size should be measured in meters. + * @property [width] - A numeric Property specifying the width of the billboard in pixels, overriding the native size. + * @property [height] - A numeric Property specifying the height of the billboard in pixels, overriding the native size. + * @property [scaleByDistance] - A {@link NearFarScalar} Property used to scale the point based on distance from the camera. + * @property [translucencyByDistance] - A {@link NearFarScalar} Property used to set translucency based on distance from the camera. + * @property [pixelOffsetScaleByDistance] - A {@link NearFarScalar} Property used to set pixelOffset based on distance from the camera. + * @property [imageSubRegion] - A Property specifying a {@link BoundingRectangle} that defines a sub-region of the image to use for the billboard, rather than the entire image, measured in pixels from the bottom-left. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this billboard will be displayed. + * @property [disableDepthTestDistance] - A Property specifying the distance from the camera at which to disable the depth test to. + */ + type ConstructorOptions = { + show?: Property | boolean; + image?: Property | string | HTMLCanvasElement; + scale?: Property | number; + pixelOffset?: Property | Cartesian2; + eyeOffset?: Property | Cartesian3; + horizontalOrigin?: Property | HorizontalOrigin; + verticalOrigin?: Property | VerticalOrigin; + heightReference?: Property | HeightReference; + color?: Property | Color; + rotation?: Property | number; + alignedAxis?: Property | Cartesian3; + sizeInMeters?: Property | boolean; + width?: Property | number; + height?: Property | number; + scaleByDistance?: Property | NearFarScalar; + translucencyByDistance?: Property | NearFarScalar; + pixelOffsetScaleByDistance?: Property | NearFarScalar; + imageSubRegion?: Property | BoundingRectangle; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + disableDepthTestDistance?: Property | number; + }; +} + +/** + * Describes a two dimensional icon located at the position of the containing {@link Entity}. + *

    + *

    + *
    + * Example billboards + *
    + *

    + * @param [options] - Object describing initialization options + */ +export class BillboardGraphics { + constructor(options?: BillboardGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the billboard. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the Image, URI, or Canvas to use for the billboard. + */ + image: Property | undefined; + /** + * Gets or sets the numeric Property specifying the uniform scale to apply to the image. + * A scale greater than 1.0 enlarges the billboard while a scale less than 1.0 shrinks it. + *

    + *

    + *
    + * From left to right in the above image, the scales are 0.5, 1.0, and 2.0. + *
    + *

    + */ + scale: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the billboard's pixel offset in screen space + * from the origin of this billboard. This is commonly used to align multiple billboards and labels at + * the same position, e.g., an image and text. The screen space origin is the top, left corner of the + * canvas; x increases from left to right, and y increases from top to bottom. + *

    + *

    + * + * + * + *
    default
    b.pixeloffset = new Cartesian2(50, 25);
    + * The billboard's origin is indicated by the yellow point. + *
    + *

    + */ + pixelOffset: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the billboard's offset in eye coordinates. + * Eye coordinates is a left-handed coordinate system, where x points towards the viewer's + * right, y points up, and z points into the screen. + *

    + * An eye offset is commonly used to arrange multiple billboards or objects at the same position, e.g., to + * arrange a billboard above its corresponding 3D model. + *

    + * Below, the billboard is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

    + *

    + * + * + * + *
    + * b.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0); + *
    + *

    + */ + eyeOffset: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HorizontalOrigin}. + */ + horizontalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link VerticalOrigin}. + */ + verticalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} that is multiplied with the image. + * This has two common use cases. First, the same white texture may be used by many different billboards, + * each with a different color, to create colored billboards. Second, the color's alpha component can be + * used to make the billboard translucent as shown below. An alpha of 0.0 makes the billboard + * transparent, and 1.0 makes the billboard opaque. + *

    + *

    + * + * + * + *
    default
    alpha : 0.5
    + *
    + *

    + */ + color: Property | undefined; + /** + * Gets or sets the numeric Property specifying the rotation of the image + * counter clockwise from the alignedAxis. + */ + rotation: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the unit vector axis of rotation + * in the fixed frame. When set to Cartesian3.ZERO the rotation is from the top of the screen. + */ + alignedAxis: Property | undefined; + /** + * Gets or sets the boolean Property specifying if this billboard's size will be measured in meters. + */ + sizeInMeters: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the billboard in pixels. + * When undefined, the native width is used. + */ + width: Property | undefined; + /** + * Gets or sets the numeric Property specifying the height of the billboard in pixels. + * When undefined, the native height is used. + */ + height: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the scale of the billboard based on the distance from the camera. + * A billboard's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's scale remains clamped to the nearest bound. + */ + scaleByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the billboard based on the distance from the camera. + * A billboard's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's translucency remains clamped to the nearest bound. + */ + translucencyByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the pixel offset of the billboard based on the distance from the camera. + * A billboard's pixel offset will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's pixel offset remains clamped to the nearest bound. + */ + pixelOffsetScaleByDistance: Property | undefined; + /** + * Gets or sets the Property specifying a {@link BoundingRectangle} that defines a + * sub-region of the image to use for the billboard, rather than the entire image, + * measured in pixels from the bottom-left. + */ + imageSubRegion: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this billboard will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: BillboardGraphics): BillboardGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: BillboardGraphics): void; +} + +/** + * A {@link Visualizer} which maps {@link Entity#billboard} to a {@link Billboard}. + * @param entityCluster - The entity cluster to manage the collection of billboards and optionally cluster with other entities. + * @param entityCollection - The entityCollection to visualize. + */ +export class BillboardVisualizer { + constructor(entityCluster: EntityCluster, entityCollection: EntityCollection); + /** + * Updates the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link GeometryUpdater} for boxes. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class BoxGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace BoxGraphics { + /** + * Initialization options for the BoxGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the box. + * @property [dimensions] - A {@link Cartesian3} Property specifying the length, width, and height of the box. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height from the entity position is relative to. + * @property [fill = true] - A boolean Property specifying whether the box is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the box. + * @property [outline = false] - A boolean Property specifying whether the box is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the box casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this box will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + dimensions?: Property | Cartesian3; + heightReference?: Property | HeightReference; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describes a box. The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ +export class BoxGraphics { + constructor(options?: BoxGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the box. + */ + show: Property | undefined; + /** + * Gets or sets {@link Cartesian3} Property property specifying the length, width, and height of the box. + */ + dimensions: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the box is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the material used to fill the box. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the Property specifying whether the box is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the box + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this box will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: BoxGraphics): BoxGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: BoxGraphics): void; +} + +/** + * A {@link Property} whose value is lazily evaluated by a callback function. + * @param callback - The function to be called when the property is evaluated. + * @param isConstant - true when the callback function returns the same value every time, false if the value will change. + */ +export class CallbackProperty { + constructor(callback: CallbackProperty.Callback, isConstant: boolean); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setCallback is called. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property. + * @param [time] - The time for which to retrieve the value. This parameter is unused since the value does not change with respect to time. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied or is unsupported. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Sets the callback to be used. + * @param callback - The function to be called when the property is evaluated. + * @param isConstant - true when the callback function returns the same value every time, false if the value will change. + */ + setCallback(callback: CallbackProperty.Callback, isConstant: boolean): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +export namespace CallbackProperty { + /** + * A function that returns the value of the property. + * @param [time] - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + */ + type Callback = (time?: JulianDate, result?: any) => any; +} + +export namespace Cesium3DTilesetGraphics { + /** + * Initialization options for the Cesium3DTilesetGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the tileset. + * @property [uri] - A string or Resource Property specifying the URI of the tileset. + * @property [maximumScreenSpaceError] - A number or Property specifying the maximum screen space error used to drive level of detail refinement. + */ + type ConstructorOptions = { + show?: Property | boolean; + uri?: Property | string | Resource; + maximumScreenSpaceError?: Property | number; + }; +} + +/** + * A 3D Tiles tileset represented by an {@link Entity}. + * The tileset modelMatrix is determined by the containing Entity position and orientation + * or is left unset if position is undefined. + * @param [options] - Object describing initialization options + */ +export class Cesium3DTilesetGraphics { + constructor(options?: Cesium3DTilesetGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the model. + */ + show: Property | undefined; + /** + * Gets or sets the string Property specifying the URI of the glTF asset. + */ + uri: Property | undefined; + /** + * Gets or sets the maximum screen space error used to drive level of detail refinement. + */ + maximumScreenSpaceError: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: Cesium3DTilesetGraphics): Cesium3DTilesetGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: Cesium3DTilesetGraphics): void; +} + +/** + * A {@link Visualizer} which maps {@link Entity#tileset} to a {@link Cesium3DTileset}. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + */ +export class Cesium3DTilesetVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection); + /** + * Updates models created this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link MaterialProperty} that maps to checkerboard {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.evenColor = Color.WHITE] - A Property specifying the first {@link Color}. + * @param [options.oddColor = Color.BLACK] - A Property specifying the second {@link Color}. + * @param [options.repeat = new Cartesian2(2.0, 2.0)] - A {@link Cartesian2} Property specifying how many times the tiles repeat in each direction. + */ +export class CheckerboardMaterialProperty { + constructor(options?: { + evenColor?: Property | Color; + oddColor?: Property | Color; + repeat?: Property | Cartesian2; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the first {@link Color}. + */ + evenColor: Property | undefined; + /** + * Gets or sets the Property specifying the second {@link Color}. + */ + oddColor: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying how many times the tiles repeat in each direction. + */ + repeat: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link MaterialProperty} that maps to solid color {@link Material} uniforms. + * @param [color = Color.WHITE] - The {@link Color} Property to be used. + */ +export class ColorMaterialProperty { + constructor(color?: Property | Color); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the {@link Color} {@link Property}. + */ + color: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * Non-destructively composites multiple {@link EntityCollection} instances into a single collection. + * If a Entity with the same ID exists in multiple collections, it is non-destructively + * merged into a single new entity instance. If an entity has the same property in multiple + * collections, the property of the Entity in the last collection of the list it + * belongs to is used. CompositeEntityCollection can be used almost anywhere that a + * EntityCollection is used. + * @param [collections] - The initial list of EntityCollection instances to merge. + * @param [owner] - The data source (or composite entity collection) which created this collection. + */ +export class CompositeEntityCollection { + constructor(collections?: EntityCollection[], owner?: DataSource | CompositeEntityCollection); + /** + * Gets the event that is fired when entities are added or removed from the collection. + * The generated event is a {@link EntityCollection.collectionChangedEventCallback}. + */ + readonly collectionChanged: Event; + /** + * Gets a globally unique identifier for this collection. + */ + readonly id: string; + /** + * Gets the array of Entity instances in the collection. + * This array should not be modified directly. + */ + readonly values: Entity[]; + /** + * Gets the owner of this composite entity collection, ie. the data source or composite entity collection which created it. + */ + readonly owner: DataSource | CompositeEntityCollection; + /** + * Adds a collection to the composite. + * @param collection - the collection to add. + * @param [index] - the index to add the collection at. If omitted, the collection will + * added on top of all existing collections. + */ + addCollection(collection: EntityCollection, index?: number): void; + /** + * Removes a collection from this composite, if present. + * @param collection - The collection to remove. + * @returns true if the collection was in the composite and was removed, + * false if the collection was not in the composite. + */ + removeCollection(collection: EntityCollection): boolean; + /** + * Removes all collections from this composite. + */ + removeAllCollections(): void; + /** + * Checks to see if the composite contains a given collection. + * @param collection - the collection to check for. + * @returns true if the composite contains the collection, false otherwise. + */ + containsCollection(collection: EntityCollection): boolean; + /** + * Returns true if the provided entity is in this collection, false otherwise. + * @param entity - The entity. + * @returns true if the provided entity is in this collection, false otherwise. + */ + contains(entity: Entity): boolean; + /** + * Determines the index of a given collection in the composite. + * @param collection - The collection to find the index of. + * @returns The index of the collection in the composite, or -1 if the collection does not exist in the composite. + */ + indexOfCollection(collection: EntityCollection): number; + /** + * Gets a collection by index from the composite. + * @param index - the index to retrieve. + */ + getCollection(index: number): void; + /** + * Gets the number of collections in this composite. + */ + getCollectionsLength(): void; + /** + * Raises a collection up one position in the composite. + * @param collection - the collection to move. + */ + raiseCollection(collection: EntityCollection): void; + /** + * Lowers a collection down one position in the composite. + * @param collection - the collection to move. + */ + lowerCollection(collection: EntityCollection): void; + /** + * Raises a collection to the top of the composite. + * @param collection - the collection to move. + */ + raiseCollectionToTop(collection: EntityCollection): void; + /** + * Lowers a collection to the bottom of the composite. + * @param collection - the collection to move. + */ + lowerCollectionToBottom(collection: EntityCollection): void; + /** + * Prevents {@link EntityCollection#collectionChanged} events from being raised + * until a corresponding call is made to {@link EntityCollection#resumeEvents}, at which + * point a single event will be raised that covers all suspended operations. + * This allows for many items to be added and removed efficiently. + * While events are suspended, recompositing of the collections will + * also be suspended, as this can be a costly operation. + * This function can be safely called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + suspendEvents(): void; + /** + * Resumes raising {@link EntityCollection#collectionChanged} events immediately + * when an item is added or removed. Any modifications made while while events were suspended + * will be triggered as a single event when this function is called. This function also ensures + * the collection is recomposited if events are also resumed. + * This function is reference counted and can safely be called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + resumeEvents(): void; + /** + * Computes the maximum availability of the entities in the collection. + * If the collection contains a mix of infinitely available data and non-infinite data, + * It will return the interval pertaining to the non-infinite data only. If all + * data is infinite, an infinite interval will be returned. + * @returns The availability of entities in the collection. + */ + computeAvailability(): TimeInterval; + /** + * Gets an entity with the specified id. + * @param id - The id of the entity to retrieve. + * @returns The entity with the provided id or undefined if the id did not exist in the collection. + */ + getById(id: string): Entity | undefined; +} + +/** + * A {@link CompositeProperty} which is also a {@link MaterialProperty}. + */ +export class CompositeMaterialProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link CompositeProperty} which is also a {@link PositionProperty}. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ +export class CompositePositionProperty { + constructor(referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets or sets the reference frame which this position presents itself as. + * Each PositionProperty making up this object has it's own reference frame, + * so this property merely exposes a "preferred" reference frame for clients + * to use. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} which is defined by a {@link TimeIntervalCollection}, where the + * data property of each {@link TimeInterval} is another Property instance which is + * evaluated at the provided time. + * @example + * var constantProperty = ...; + * var sampledProperty = ...; + * + * //Create a composite property from two previously defined properties + * //where the property is valid on August 1st, 2012 and uses a constant + * //property for the first half of the day and a sampled property for the + * //remaining half. + * var composite = new Cesium.CompositeProperty(); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T00:00:00.00Z/2012-08-01T12:00:00.00Z', + * data : constantProperty + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T12:00:00.00Z/2012-08-02T00:00:00.00Z', + * isStartIncluded : false, + * isStopIncluded : false, + * data : sampledProperty + * })); + */ +export class CompositeProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link PositionProperty} whose value does not change in respect to the + * {@link ReferenceFrame} in which is it defined. + * @param [value] - The property value. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ +export class ConstantPositionProperty { + constructor(value?: Cartesian3, referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Sets the value of the property. + * @param value - The property value. + * @param [referenceFrame = this.referenceFrame] - The reference frame in which the position is defined. + */ + setValue(value: Cartesian3, referenceFrame?: ReferenceFrame): void; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} whose value does not change with respect to simulation time. + * @param [value] - The property value. + */ +export class ConstantProperty { + constructor(value?: any); + /** + * Gets a value indicating if this property is constant. + * This property always returns true. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property. + * @param [time] - The time for which to retrieve the value. This parameter is unused since the value does not change with respect to time. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Sets the value of the property. + * @param value - The property value. + */ + setValue(value: any): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + /** + * Gets this property's value. + * @returns This property's value. + */ + valueOf(): any; + /** + * Creates a string representing this property's value. + * @returns A string representing the property's value. + */ + toString(): string; +} + +/** + * A {@link GeometryUpdater} for corridors. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class CorridorGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace CorridorGraphics { + /** + * Initialization options for the CorridorGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the corridor. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions that define the centerline of the corridor. + * @property [width] - A numeric Property specifying the distance between the edges of the corridor. + * @property [height = 0] - A numeric Property specifying the altitude of the corridor relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the corridor's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [cornerType = CornerType.ROUNDED] - A {@link CornerType} Property specifying the style of the corners. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the distance between each latitude and longitude. + * @property [fill = true] - A boolean Property specifying whether the corridor is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the corridor. + * @property [outline = false] - A boolean Property specifying whether the corridor is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the corridor casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this corridor will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this corridor will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex] - A Property specifying the zIndex of the corridor, used for ordering. Only has an effect if height and extrudedHeight are undefined, and if the corridor is static. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3; + width?: Property | number; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + cornerType?: Property | CornerType; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: ConstantProperty | number; + }; +} + +/** + * Describes a corridor, which is a shape defined by a centerline and width that + * conforms to the curvature of the globe. It can be placed on the surface or at altitude + * and can optionally be extruded into a volume. + * @param [options] - Object describing initialization options + */ +export class CorridorGraphics { + constructor(options?: CorridorGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the corridor. + */ + show: Property | undefined; + /** + * Gets or sets a Property specifying the array of {@link Cartesian3} positions that define the centerline of the corridor. + */ + positions: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the corridor. + */ + width: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the corridor. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the corridor extrusion. + * Setting this property creates a corridor shaped volume starting at height and ending + * at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the {@link CornerType} Property specifying how corners are styled. + */ + cornerType: Property | undefined; + /** + * Gets or sets the numeric Property specifying the sampling distance between each latitude and longitude point. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the corridor is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the corridor. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the Property specifying whether the corridor is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the corridor + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this corridor will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this corridor will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ordering of the corridor. Only has an effect if the coridor is static and neither height or exturdedHeight are specified. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: CorridorGraphics): CorridorGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: CorridorGraphics): void; +} + +/** + * A {@link DataSource} implementation which can be used to manually manage a group of entities. + * @example + * var dataSource = new Cesium.CustomDataSource('myData'); + * + * var entity = dataSource.entities.add({ + * position : Cesium.Cartesian3.fromDegrees(1, 2, 0), + * billboard : { + * image : 'image.png' + * } + * }); + * + * viewer.dataSources.add(dataSource); + * @param [name] - A human-readable name for this instance. + */ +export class CustomDataSource { + constructor(name?: string); + /** + * Gets or sets a human-readable name for this instance. + */ + name: string; + /** + * Gets or sets the clock for this instance. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets or sets whether the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; +} + +/** + * A {@link GeometryUpdater} for cylinders. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class CylinderGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace CylinderGraphics { + /** + * Initialization options for the CylinderGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the cylinder. + * @property [length] - A numeric Property specifying the length of the cylinder. + * @property [topRadius] - A numeric Property specifying the radius of the top of the cylinder. + * @property [bottomRadius] - A numeric Property specifying the radius of the bottom of the cylinder. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height from the entity position is relative to. + * @property [fill = true] - A boolean Property specifying whether the cylinder is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the cylinder. + * @property [outline = false] - A boolean Property specifying whether the cylinder is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [numberOfVerticalLines = 16] - A numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + * @property [slices = 128] - The number of edges around the perimeter of the cylinder. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the cylinder casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this cylinder will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + length?: Property | number; + topRadius?: Property | number; + bottomRadius?: Property | number; + heightReference?: Property | HeightReference; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + numberOfVerticalLines?: Property | number; + slices?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describes a cylinder, truncated cone, or cone defined by a length, top radius, and bottom radius. + * The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ +export class CylinderGraphics { + constructor(options?: CylinderGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the cylinder. + */ + show: Property | undefined; + /** + * Gets or sets the numeric Property specifying the length of the cylinder. + */ + length: Property | undefined; + /** + * Gets or sets the numeric Property specifying the radius of the top of the cylinder. + */ + topRadius: Property | undefined; + /** + * Gets or sets the numeric Property specifying the radius of the bottom of the cylinder. + */ + bottomRadius: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the cylinder is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the cylinder. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the boolean Property specifying whether the cylinder is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets the Property specifying the number of vertical lines to draw along the perimeter for the outline. + */ + numberOfVerticalLines: Property | undefined; + /** + * Gets or sets the Property specifying the number of edges around the perimeter of the cylinder. + */ + slices: Property | undefined; + /** + * Get or sets the enum Property specifying whether the cylinder + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this cylinder will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: CylinderGraphics): CylinderGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: CylinderGraphics): void; +} + +export namespace CzmlDataSource { + /** + * Initialization options for the `load` method. + * @property [sourceUri] - Overrides the url to use for resolving relative links. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type LoadOptions = { + sourceUri?: Resource | string; + credit?: Credit | string; + }; +} + +/** + * A {@link DataSource} which processes {@link https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/CZML-Guide|CZML}. + * @param [name] - An optional name for the data source. This value will be overwritten if a loaded document contains a name. + */ +export class CzmlDataSource { + constructor(name?: string); + /** + * Creates a Promise to a new instance loaded with the provided CZML data. + * @param czml - A url or CZML object to be processed. + * @param [options] - An object specifying configuration options + * @returns A promise that resolves to the new instance once the data is processed. + */ + static load(czml: Resource | string | any, options?: CzmlDataSource.LoadOptions): Promise; + /** + * Gets a human-readable name for this instance. + */ + name: string; + /** + * Gets the clock settings defined by the loaded CZML. If no clock is explicitly + * defined in the CZML, the combined availability of all objects is returned. If + * only static data exists, this value is undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Gets the credit that will be displayed for the data source + */ + credit: Credit; + /** + * Gets the array of CZML processing functions. + */ + static updaters: any[]; + /** + * Processes the provided url or CZML object without clearing any existing data. + * @param czml - A url or CZML object to be processed. + * @param [options] - An object with the following properties: + * @param [options.sourceUri] - Overrides the url to use for resolving relative links. + * @returns A promise that resolves to this instances once the data is processed. + */ + process(czml: Resource | string | any, options?: { + sourceUri?: string; + }): Promise; + /** + * Loads the provided url or CZML object, replacing any existing data. + * @param czml - A url or CZML object to be processed. + * @param [options] - An object specifying configuration options + * @returns A promise that resolves to this instances once the data is processed. + */ + load(czml: Resource | string | any, options?: CzmlDataSource.LoadOptions): Promise; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + /** + * A helper function used by custom CZML updater functions + * which creates or updates a {@link Property} from a CZML packet. + * @param type - The constructor function for the property being processed. + * @param object - The object on which the property will be added or updated. + * @param propertyName - The name of the property on the object. + * @param packetData - The CZML packet being processed. + * @param interval - A constraining interval for which the data is valid. + * @param sourceUri - The originating uri of the data being processed. + * @param entityCollection - The collection being processsed. + */ + static processPacketData(type: (...params: any[]) => any, object: any, propertyName: string, packetData: any, interval: TimeInterval, sourceUri: string, entityCollection: EntityCollection): void; + /** + * A helper function used by custom CZML updater functions + * which creates or updates a {@link PositionProperty} from a CZML packet. + * @param object - The object on which the property will be added or updated. + * @param propertyName - The name of the property on the object. + * @param packetData - The CZML packet being processed. + * @param interval - A constraining interval for which the data is valid. + * @param sourceUri - The originating uri of the data being processed. + * @param entityCollection - The collection being processsed. + */ + static processPositionPacketData(object: any, propertyName: string, packetData: any, interval: TimeInterval, sourceUri: string, entityCollection: EntityCollection): void; + /** + * A helper function used by custom CZML updater functions + * which creates or updates a {@link MaterialProperty} from a CZML packet. + * @param object - The object on which the property will be added or updated. + * @param propertyName - The name of the property on the object. + * @param packetData - The CZML packet being processed. + * @param interval - A constraining interval for which the data is valid. + * @param sourceUri - The originating uri of the data being processed. + * @param entityCollection - The collection being processsed. + */ + static processMaterialPacketData(object: any, propertyName: string, packetData: any, interval: TimeInterval, sourceUri: string, entityCollection: EntityCollection): void; +} + +/** + * Defines the interface for data sources, which turn arbitrary data into a + * {@link EntityCollection} for generic consumption. This object is an interface + * for documentation purposes and is not intended to be instantiated directly. + */ +export class DataSource { + constructor(); + /** + * Gets a human-readable name for this instance. + */ + name: string; + /** + * Gets the preferred clock settings for this data source. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the value of isLoading changes. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; +} + +/** + * Represents desired clock settings for a particular {@link DataSource}. These settings may be applied + * to the {@link Clock} when the DataSource is loaded. + */ +export class DataSourceClock { + constructor(); + /** + * Gets the event that is raised whenever a new property is assigned. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the desired start time of the clock. + * See {@link Clock#startTime}. + */ + startTime: JulianDate; + /** + * Gets or sets the desired stop time of the clock. + * See {@link Clock#stopTime}. + */ + stopTime: JulianDate; + /** + * Gets or sets the desired current time when this data source is loaded. + * See {@link Clock#currentTime}. + */ + currentTime: JulianDate; + /** + * Gets or sets the desired clock range setting. + * See {@link Clock#clockRange}. + */ + clockRange: ClockRange; + /** + * Gets or sets the desired clock step setting. + * See {@link Clock#clockStep}. + */ + clockStep: ClockStep; + /** + * Gets or sets the desired clock multiplier. + * See {@link Clock#multiplier}. + */ + multiplier: number; + /** + * Duplicates a DataSourceClock instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: DataSourceClock): DataSourceClock; + /** + * Returns true if this DataSourceClock is equivalent to the other + * @param other - The other DataSourceClock to compare to. + * @returns true if the DataSourceClocks are equal; otherwise, false. + */ + equals(other: DataSourceClock): boolean; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: DataSourceClock): void; + /** + * Gets the value of this clock instance as a {@link Clock} object. + * @returns The modified result parameter or a new instance if one was not provided. + */ + getValue(): Clock; +} + +/** + * A collection of {@link DataSource} instances. + */ +export class DataSourceCollection { + constructor(); + /** + * Gets the number of data sources in this collection. + */ + readonly length: number; + /** + * An event that is raised when a data source is added to the collection. + * Event handlers are passed the data source that was added. + */ + readonly dataSourceAdded: Event; + /** + * An event that is raised when a data source is removed from the collection. + * Event handlers are passed the data source that was removed. + */ + readonly dataSourceRemoved: Event; + /** + * An event that is raised when a data source changes position in the collection. Event handlers are passed the data source + * that was moved, its new index after the move, and its old index prior to the move. + */ + readonly dataSourceMoved: Event; + /** + * Adds a data source to the collection. + * @param dataSource - A data source or a promise to a data source to add to the collection. + * When passing a promise, the data source will not actually be added + * to the collection until the promise resolves successfully. + * @returns A Promise that resolves once the data source has been added to the collection. + */ + add(dataSource: DataSource | Promise): Promise; + /** + * Removes a data source from this collection, if present. + * @param dataSource - The data source to remove. + * @param [destroy = false] - Whether to destroy the data source in addition to removing it. + * @returns true if the data source was in the collection and was removed, + * false if the data source was not in the collection. + */ + remove(dataSource: DataSource, destroy?: boolean): boolean; + /** + * Removes all data sources from this collection. + * @param [destroy = false] - whether to destroy the data sources in addition to removing them. + */ + removeAll(destroy?: boolean): void; + /** + * Checks to see if the collection contains a given data source. + * @param dataSource - The data source to check for. + * @returns true if the collection contains the data source, false otherwise. + */ + contains(dataSource: DataSource): boolean; + /** + * Determines the index of a given data source in the collection. + * @param dataSource - The data source to find the index of. + * @returns The index of the data source in the collection, or -1 if the data source does not exist in the collection. + */ + indexOf(dataSource: DataSource): number; + /** + * Gets a data source by index from the collection. + * @param index - the index to retrieve. + * @returns The data source at the specified index. + */ + get(index: number): DataSource; + /** + * Gets a data source by name from the collection. + * @param name - The name to retrieve. + * @returns A list of all data sources matching the provided name. + */ + getByName(name: string): DataSource[]; + /** + * Raises a data source up one position in the collection. + * @param dataSource - The data source to move. + */ + raise(dataSource: DataSource): void; + /** + * Lowers a data source down one position in the collection. + * @param dataSource - The data source to move. + */ + lower(dataSource: DataSource): void; + /** + * Raises a data source to the top of the collection. + * @param dataSource - The data source to move. + */ + raiseToTop(dataSource: DataSource): void; + /** + * Lowers a data source to the bottom of the collection. + * @param dataSource - The data source to move. + */ + lowerToBottom(dataSource: DataSource): void; + /** + * Returns true if this object was destroyed; otherwise, false. + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the resources held by all data sources in this collection. Explicitly destroying this + * object allows for deterministic release of WebGL resources, instead of relying on the garbage + * collector. Once this object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * dataSourceCollection = dataSourceCollection && dataSourceCollection.destroy(); + */ + destroy(): void; +} + +/** + * Visualizes a collection of {@link DataSource} instances. + * @param options - Object with the following properties: + * @param options.scene - The scene in which to display the data. + * @param options.dataSourceCollection - The data sources to display. + * @param [options.visualizersCallback = DataSourceDisplay.defaultVisualizersCallback] - A function which creates an array of visualizers used for visualization. + * If undefined, all standard visualizers are used. + */ +export class DataSourceDisplay { + constructor(options: { + scene: Scene; + dataSourceCollection: DataSourceCollection; + visualizersCallback?: DataSourceDisplay.VisualizersCallback; + }); + /** + * Gets or sets the default function which creates an array of visualizers used for visualization. + * By default, this function uses all standard visualizers. + */ + static defaultVisualizersCallback(): void; + /** + * Gets the scene associated with this display. + */ + scene: Scene; + /** + * Gets the collection of data sources to display. + */ + dataSources: DataSourceCollection; + /** + * Gets the default data source instance which can be used to + * manually create and visualize entities not tied to + * a specific data source. This instance is always available + * and does not appear in the list dataSources collection. + */ + defaultDataSource: CustomDataSource; + /** + * Gets a value indicating whether or not all entities in the data source are ready + */ + readonly ready: boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * dataSourceDisplay = dataSourceDisplay.destroy(); + */ + destroy(): void; + /** + * Updates the display to the provided time. + * @param time - The simulation time. + * @returns True if all data sources are ready to be displayed, false otherwise. + */ + update(time: JulianDate): boolean; +} + +export namespace DataSourceDisplay { + /** + * A function which creates an array of visualizers used for visualization. + * @example + * function createVisualizers(scene, dataSource) { + * return [new Cesium.BillboardVisualizer(scene, dataSource.entities)]; + * } + * @param scene - The scene to create visualizers for. + * @param dataSource - The data source to create visualizers for. + */ + type VisualizersCallback = (scene: Scene, dataSource: DataSource) => Visualizer[]; +} + +/** + * A {@link GeometryUpdater} for ellipses. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class EllipseGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Gets a value indicating if the geometry should be drawn on terrain. + */ + readonly onTerrain: boolean; +} + +export namespace EllipseGraphics { + /** + * Initialization options for the EllipseGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the ellipse. + * @property [semiMajorAxis] - The numeric Property specifying the semi-major axis. + * @property [semiMinorAxis] - The numeric Property specifying the semi-minor axis. + * @property [height = 0] - A numeric Property specifying the altitude of the ellipse relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the ellipse's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [rotation = 0.0] - A numeric property specifying the rotation of the ellipse counter-clockwise from north. + * @property [stRotation = 0.0] - A numeric property specifying the rotation of the ellipse texture counter-clockwise from north. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between points on the ellipse. + * @property [fill = true] - A boolean Property specifying whether the ellipse is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the ellipse. + * @property [outline = false] - A boolean Property specifying whether the ellipse is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [numberOfVerticalLines = 16] - A numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the ellipse casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this ellipse will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this ellipse will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A property specifying the zIndex of the Ellipse. Used for ordering ground geometry. Only has an effect if the ellipse is constant and neither height or exturdedHeight are specified. + */ + type ConstructorOptions = { + show?: Property | boolean; + semiMajorAxis?: Property | number; + semiMinorAxis?: Property | number; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + rotation?: Property | number; + stRotation?: Property | number; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + numberOfVerticalLines?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: ConstantProperty | number; + }; +} + +/** + * Describes an ellipse defined by a center point and semi-major and semi-minor axes. + * The ellipse conforms to the curvature of the globe and can be placed on the surface or + * at altitude and can optionally be extruded into a volume. + * The center point is determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ +export class EllipseGraphics { + constructor(options?: EllipseGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the ellipse. + */ + show: Property | undefined; + /** + * Gets or sets the numeric Property specifying the semi-major axis. + */ + semiMajorAxis: Property | undefined; + /** + * Gets or sets the numeric Property specifying the semi-minor axis. + */ + semiMinorAxis: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the ellipse. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the ellipse extrusion. + * Setting this property creates volume starting at height and ending at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the ellipse clockwise from north. + */ + rotation: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the ellipse texture counter-clockwise from north. + */ + stRotation: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the ellipse. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the ellipse is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the ellipse. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the Property specifying whether the ellipse is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets the numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + */ + numberOfVerticalLines: Property | undefined; + /** + * Get or sets the enum Property specifying whether the ellipse + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this ellipse will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this ellipse will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ellipse ordering. Only has an effect if the ellipse is constant and neither height or extrudedHeight are specified + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: EllipseGraphics): EllipseGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: EllipseGraphics): void; +} + +/** + * A {@link GeometryUpdater} for ellipsoids. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class EllipsoidGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @param [skipModelMatrix = false] - Whether to compute a model matrix for the geometry instance + * @param [modelMatrixResult] - Used to store the result of the model matrix calculation + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate, skipModelMatrix?: boolean, modelMatrixResult?: Matrix4): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @param [skipModelMatrix = false] - Whether to compute a model matrix for the geometry instance + * @param [modelMatrixResult] - Used to store the result of the model matrix calculation + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate, skipModelMatrix?: boolean, modelMatrixResult?: Matrix4): GeometryInstance; +} + +export namespace EllipsoidGraphics { + /** + * Initialization options for the EllipsoidGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the ellipsoid. + * @property [radii] - A {@link Cartesian3} Property specifying the radii of the ellipsoid. + * @property [innerRadii] - A {@link Cartesian3} Property specifying the inner radii of the ellipsoid. + * @property [minimumClock = 0.0] - A Property specifying the minimum clock angle of the ellipsoid. + * @property [maximumClock = 2*PI] - A Property specifying the maximum clock angle of the ellipsoid. + * @property [minimumCone = 0.0] - A Property specifying the minimum cone angle of the ellipsoid. + * @property [maximumCone = PI] - A Property specifying the maximum cone angle of the ellipsoid. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height from the entity position is relative to. + * @property [fill = true] - A boolean Property specifying whether the ellipsoid is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the ellipsoid. + * @property [outline = false] - A boolean Property specifying whether the ellipsoid is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [stackPartitions = 64] - A Property specifying the number of stacks. + * @property [slicePartitions = 64] - A Property specifying the number of radial slices. + * @property [subdivisions = 128] - A Property specifying the number of samples per outline ring, determining the granularity of the curvature. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the ellipsoid casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this ellipsoid will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + radii?: Property | Cartesian3; + innerRadii?: Property | Cartesian3; + minimumClock?: Property | number; + maximumClock?: Property | number; + minimumCone?: Property | number; + maximumCone?: Property | number; + heightReference?: Property | HeightReference; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + stackPartitions?: Property | number; + slicePartitions?: Property | number; + subdivisions?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describe an ellipsoid or sphere. The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ +export class EllipsoidGraphics { + constructor(options?: EllipsoidGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the ellipsoid. + */ + show: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} {@link Property} specifying the radii of the ellipsoid. + */ + radii: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} {@link Property} specifying the inner radii of the ellipsoid. + */ + innerRadii: Property | undefined; + /** + * Gets or sets the Property specifying the minimum clock angle of the ellipsoid. + */ + minimumClock: Property | undefined; + /** + * Gets or sets the Property specifying the maximum clock angle of the ellipsoid. + */ + maximumClock: Property | undefined; + /** + * Gets or sets the Property specifying the minimum cone angle of the ellipsoid. + */ + minimumCone: Property | undefined; + /** + * Gets or sets the Property specifying the maximum cone angle of the ellipsoid. + */ + maximumCone: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the ellipsoid is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the ellipsoid. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the ellipsoid is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets the Property specifying the number of stacks. + */ + stackPartitions: Property | undefined; + /** + * Gets or sets the Property specifying the number of radial slices per 360 degrees. + */ + slicePartitions: Property | undefined; + /** + * Gets or sets the Property specifying the number of samples per outline ring, determining the granularity of the curvature. + */ + subdivisions: Property | undefined; + /** + * Get or sets the enum Property specifying whether the ellipsoid + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this ellipsoid will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: EllipsoidGraphics): EllipsoidGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: EllipsoidGraphics): void; +} + +export namespace Entity { + /** + * Initialization options for the Entity constructor + * @property [id] - A unique identifier for this object. If none is provided, a GUID is generated. + * @property [name] - A human readable name to display to users. It does not have to be unique. + * @property [availability] - The availability, if any, associated with this object. + * @property [show] - A boolean value indicating if the entity and its children are displayed. + * @property [description] - A string Property specifying an HTML description for this entity. + * @property [position] - A Property specifying the entity position. + * @property [orientation] - A Property specifying the entity orientation. + * @property [viewFrom] - A suggested initial offset for viewing this object. + * @property [parent] - A parent entity to associate with this entity. + * @property [billboard] - A billboard to associate with this entity. + * @property [box] - A box to associate with this entity. + * @property [corridor] - A corridor to associate with this entity. + * @property [cylinder] - A cylinder to associate with this entity. + * @property [ellipse] - A ellipse to associate with this entity. + * @property [ellipsoid] - A ellipsoid to associate with this entity. + * @property [label] - A options.label to associate with this entity. + * @property [model] - A model to associate with this entity. + * @property [tileset] - A 3D Tiles tileset to associate with this entity. + * @property [path] - A path to associate with this entity. + * @property [plane] - A plane to associate with this entity. + * @property [point] - A point to associate with this entity. + * @property [polygon] - A polygon to associate with this entity. + * @property [polyline] - A polyline to associate with this entity. + * @property [properties] - Arbitrary properties to associate with this entity. + * @property [polylineVolume] - A polylineVolume to associate with this entity. + * @property [rectangle] - A rectangle to associate with this entity. + * @property [wall] - A wall to associate with this entity. + */ + type ConstructorOptions = { + id?: string; + name?: string; + availability?: TimeIntervalCollection; + show?: boolean; + description?: Property | string; + position?: PositionProperty | Cartesian3; + orientation?: Property; + viewFrom?: Property; + parent?: Entity; + billboard?: BillboardGraphics | BillboardGraphics.ConstructorOptions; + box?: BoxGraphics | BoxGraphics.ConstructorOptions; + corridor?: CorridorGraphics | CorridorGraphics.ConstructorOptions; + cylinder?: CylinderGraphics | CylinderGraphics.ConstructorOptions; + ellipse?: EllipseGraphics | EllipseGraphics.ConstructorOptions; + ellipsoid?: EllipsoidGraphics | EllipsoidGraphics.ConstructorOptions; + label?: LabelGraphics | LabelGraphics.ConstructorOptions; + model?: ModelGraphics | ModelGraphics.ConstructorOptions; + tileset?: Cesium3DTilesetGraphics | Cesium3DTilesetGraphics.ConstructorOptions; + path?: PathGraphics | PathGraphics.ConstructorOptions; + plane?: PlaneGraphics | PlaneGraphics.ConstructorOptions; + point?: PointGraphics | PointGraphics.ConstructorOptions; + polygon?: PolygonGraphics | PolygonGraphics.ConstructorOptions; + polyline?: PolylineGraphics | PolylineGraphics.ConstructorOptions; + properties?: PropertyBag | { + [key: string]: any; + }; + polylineVolume?: PolylineVolumeGraphics | PolylineVolumeGraphics.ConstructorOptions; + rectangle?: RectangleGraphics | RectangleGraphics.ConstructorOptions; + wall?: WallGraphics | WallGraphics.ConstructorOptions; + }; +} + +/** + * Entity instances aggregate multiple forms of visualization into a single high-level object. + * They can be created manually and added to {@link Viewer#entities} or be produced by + * data sources, such as {@link CzmlDataSource} and {@link GeoJsonDataSource}. + * @param [options] - Object describing initialization options + */ +export class Entity { + constructor(options?: Entity.ConstructorOptions); + /** + * Gets or sets the entity collection that this entity belongs to. + */ + entityCollection: EntityCollection; + /** + * The availability, if any, associated with this object. + * If availability is undefined, it is assumed that this object's + * other properties will return valid data for any provided time. + * If availability exists, the objects other properties will only + * provide valid data if queried within the given interval. + */ + availability: TimeIntervalCollection | undefined; + /** + * Gets the unique ID associated with this object. + */ + id: string; + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the name of the object. The name is intended for end-user + * consumption and does not need to be unique. + */ + name: string | undefined; + /** + * Gets or sets whether this entity should be displayed. When set to true, + * the entity is only displayed if the parent entity's show property is also true. + */ + show: boolean; + /** + * Gets whether this entity is being displayed, taking into account + * the visibility of any ancestor entities. + */ + isShowing: boolean; + /** + * Gets or sets the parent object. + */ + parent: Entity | undefined; + /** + * Gets the names of all properties registered on this instance. + */ + propertyNames: string[]; + /** + * Gets or sets the billboard. + */ + billboard: BillboardGraphics | undefined; + /** + * Gets or sets the box. + */ + box: BoxGraphics | undefined; + /** + * Gets or sets the corridor. + */ + corridor: CorridorGraphics | undefined; + /** + * Gets or sets the cylinder. + */ + cylinder: CylinderGraphics | undefined; + /** + * Gets or sets the description. + */ + description: Property | undefined; + /** + * Gets or sets the ellipse. + */ + ellipse: EllipseGraphics | undefined; + /** + * Gets or sets the ellipsoid. + */ + ellipsoid: EllipsoidGraphics | undefined; + /** + * Gets or sets the label. + */ + label: LabelGraphics | undefined; + /** + * Gets or sets the model. + */ + model: ModelGraphics | undefined; + /** + * Gets or sets the tileset. + */ + tileset: Cesium3DTilesetGraphics | undefined; + /** + * Gets or sets the orientation. + */ + orientation: Property | undefined; + /** + * Gets or sets the path. + */ + path: PathGraphics | undefined; + /** + * Gets or sets the plane. + */ + plane: PlaneGraphics | undefined; + /** + * Gets or sets the point graphic. + */ + point: PointGraphics | undefined; + /** + * Gets or sets the polygon. + */ + polygon: PolygonGraphics | undefined; + /** + * Gets or sets the polyline. + */ + polyline: PolylineGraphics | undefined; + /** + * Gets or sets the polyline volume. + */ + polylineVolume: PolylineVolumeGraphics | undefined; + /** + * Gets or sets the bag of arbitrary properties associated with this entity. + */ + properties: PropertyBag | undefined; + /** + * Gets or sets the position. + */ + position: PositionProperty | undefined; + /** + * Gets or sets the rectangle. + */ + rectangle: RectangleGraphics | undefined; + /** + * Gets or sets the suggested initial offset when tracking this object. + * The offset is typically defined in the east-north-up reference frame, + * but may be another frame depending on the object's velocity. + */ + viewFrom: Property | undefined; + /** + * Gets or sets the wall. + */ + wall: WallGraphics | undefined; + /** + * Given a time, returns true if this object should have data during that time. + * @param time - The time to check availability for. + * @returns true if the object should have data during the provided time, false otherwise. + */ + isAvailable(time: JulianDate): boolean; + /** + * Adds a property to this object. Once a property is added, it can be + * observed with {@link Entity#definitionChanged} and composited + * with {@link CompositeEntityCollection} + * @param propertyName - The name of the property to add. + */ + addProperty(propertyName: string): void; + /** + * Removed a property previously added with addProperty. + * @param propertyName - The name of the property to remove. + */ + removeProperty(propertyName: string): void; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: Entity): void; + /** + * Computes the model matrix for the entity's transform at specified time. Returns undefined if orientation or position + * are undefined. + * @param time - The time to retrieve model matrix for. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. Result is undefined if position or orientation are undefined. + */ + computeModelMatrix(time: JulianDate, result?: Matrix4): Matrix4; + /** + * Checks if the given Scene supports materials besides Color on Entities draped on terrain or 3D Tiles. + * If this feature is not supported, Entities with non-color materials but no `height` will + * instead be rendered as if height is 0. + * @param scene - The current scene. + * @returns Whether or not the current scene supports materials for entities on terrain. + */ + static supportsMaterialsforEntitiesOnTerrain(scene: Scene): boolean; + /** + * Checks if the given Scene supports polylines clamped to terrain or 3D Tiles. + * If this feature is not supported, Entities with PolylineGraphics will be rendered with vertices at + * the provided heights and using the `arcType` parameter instead of clamped to the ground. + * @param scene - The current scene. + * @returns Whether or not the current scene supports polylines on terrain or 3D TIles. + */ + static supportsPolylinesOnTerrain(scene: Scene): boolean; +} + +/** + * Defines how screen space objects (billboards, points, labels) are clustered. + * @param [options] - An object with the following properties: + * @param [options.enabled = false] - Whether or not to enable clustering. + * @param [options.pixelRange = 80] - The pixel range to extend the screen space bounding box. + * @param [options.minimumClusterSize = 2] - The minimum number of screen space objects that can be clustered. + * @param [options.clusterBillboards = true] - Whether or not to cluster the billboards of an entity. + * @param [options.clusterLabels = true] - Whether or not to cluster the labels of an entity. + * @param [options.clusterPoints = true] - Whether or not to cluster the points of an entity. + */ +export class EntityCluster { + constructor(options?: { + enabled?: boolean; + pixelRange?: number; + minimumClusterSize?: number; + clusterBillboards?: boolean; + clusterLabels?: boolean; + clusterPoints?: boolean; + }); + /** + * Gets or sets whether clustering is enabled. + */ + enabled: boolean; + /** + * Gets or sets the pixel range to extend the screen space bounding box. + */ + pixelRange: number; + /** + * Gets or sets the minimum number of screen space objects that can be clustered. + */ + minimumClusterSize: number; + /** + * Gets the event that will be raised when a new cluster will be displayed. The signature of the event listener is {@link EntityCluster.newClusterCallback}. + */ + clusterEvent: Event; + /** + * Gets or sets whether clustering billboard entities is enabled. + */ + clusterBillboards: boolean; + /** + * Gets or sets whether clustering labels entities is enabled. + */ + clusterLabels: boolean; + /** + * Gets or sets whether clustering point entities is enabled. + */ + clusterPoints: boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Unlike other objects that use WebGL resources, this object can be reused. For example, if a data source is removed + * from a data source collection and added to another. + *

    + */ + destroy(): void; +} + +export namespace EntityCluster { + /** + * A event listener function used to style clusters. + * @example + * // The default cluster values. + * dataSource.clustering.clusterEvent.addEventListener(function(entities, cluster) { + * cluster.label.show = true; + * cluster.label.text = entities.length.toLocaleString(); + * }); + * @param clusteredEntities - An array of the entities contained in the cluster. + * @param cluster - An object containing billboard, label, and point properties. The values are the same as + * billboard, label and point entities, but must be the values of the ConstantProperty. + */ + type newClusterCallback = (clusteredEntities: Entity[], cluster: any) => void; +} + +/** + * An observable collection of {@link Entity} instances where each entity has a unique id. + * @param [owner] - The data source (or composite entity collection) which created this collection. + */ +export class EntityCollection { + constructor(owner?: DataSource | CompositeEntityCollection); + /** + * Prevents {@link EntityCollection#collectionChanged} events from being raised + * until a corresponding call is made to {@link EntityCollection#resumeEvents}, at which + * point a single event will be raised that covers all suspended operations. + * This allows for many items to be added and removed efficiently. + * This function can be safely called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + suspendEvents(): void; + /** + * Resumes raising {@link EntityCollection#collectionChanged} events immediately + * when an item is added or removed. Any modifications made while while events were suspended + * will be triggered as a single event when this function is called. + * This function is reference counted and can safely be called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + resumeEvents(): void; + /** + * The signature of the event generated by {@link EntityCollection#collectionChanged}. + * @param collection - The collection that triggered the event. + * @param added - The array of {@link Entity} instances that have been added to the collection. + * @param removed - The array of {@link Entity} instances that have been removed from the collection. + * @param changed - The array of {@link Entity} instances that have been modified. + */ + static collectionChangedEventCallback(collection: EntityCollection, added: Entity[], removed: Entity[], changed: Entity[]): void; + /** + * Gets the event that is fired when entities are added or removed from the collection. + * The generated event is a {@link EntityCollection.collectionChangedEventCallback}. + */ + readonly collectionChanged: Event; + /** + * Gets a globally unique identifier for this collection. + */ + readonly id: string; + /** + * Gets the array of Entity instances in the collection. + * This array should not be modified directly. + */ + readonly values: Entity[]; + /** + * Gets whether or not this entity collection should be + * displayed. When true, each entity is only displayed if + * its own show property is also true. + */ + show: boolean; + /** + * Gets the owner of this entity collection, ie. the data source or composite entity collection which created it. + */ + readonly owner: DataSource | CompositeEntityCollection; + /** + * Computes the maximum availability of the entities in the collection. + * If the collection contains a mix of infinitely available data and non-infinite data, + * it will return the interval pertaining to the non-infinite data only. If all + * data is infinite, an infinite interval will be returned. + * @returns The availability of entities in the collection. + */ + computeAvailability(): TimeInterval; + /** + * Add an entity to the collection. + * @param entity - The entity to be added. + * @returns The entity that was added. + */ + add(entity: Entity | Entity.ConstructorOptions): Entity; + /** + * Removes an entity from the collection. + * @param entity - The entity to be removed. + * @returns true if the item was removed, false if it did not exist in the collection. + */ + remove(entity: Entity): boolean; + /** + * Returns true if the provided entity is in this collection, false otherwise. + * @param entity - The entity. + * @returns true if the provided entity is in this collection, false otherwise. + */ + contains(entity: Entity): boolean; + /** + * Removes an entity with the provided id from the collection. + * @param id - The id of the entity to remove. + * @returns true if the item was removed, false if no item with the provided id existed in the collection. + */ + removeById(id: string): boolean; + /** + * Removes all Entities from the collection. + */ + removeAll(): void; + /** + * Gets an entity with the specified id. + * @param id - The id of the entity to retrieve. + * @returns The entity with the provided id or undefined if the id did not exist in the collection. + */ + getById(id: string): Entity | undefined; + /** + * Gets an entity with the specified id or creates it and adds it to the collection if it does not exist. + * @param id - The id of the entity to retrieve or create. + * @returns The new or existing object. + */ + getOrCreateEntity(id: string): Entity; +} + +/** + * A utility object for tracking an entity with the camera. + * @param entity - The entity to track with the camera. + * @param scene - The scene to use. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid to use for orienting the camera. + */ +export class EntityView { + constructor(entity: Entity, scene: Scene, ellipsoid?: Ellipsoid); + /** + * The entity to track with the camera. + */ + entity: Entity; + /** + * The scene in which to track the object. + */ + scene: Scene; + /** + * The ellipsoid to use for orienting the camera. + */ + ellipsoid: Ellipsoid; + /** + * The bounding sphere of the object. + */ + boundingSphere: BoundingSphere; + /** + * Gets or sets a camera offset that will be used to + * initialize subsequent EntityViews. + */ + static defaultOffset3D: Cartesian3; + /** + * Should be called each animation frame to update the camera + * to the latest settings. + * @param time - The current animation time. + * @param [boundingSphere] - bounding sphere of the object. + */ + update(time: JulianDate, boundingSphere?: BoundingSphere): void; +} + +export namespace GeoJsonDataSource { + /** + * Initialization options for the `load` method. + * @property [sourceUri] - Overrides the url to use for resolving relative links. + * @property [markerSize = GeoJsonDataSource.markerSize] - The default size of the map pin created for each point, in pixels. + * @property [markerSymbol = GeoJsonDataSource.markerSymbol] - The default symbol of the map pin created for each point. + * @property [markerColor = GeoJsonDataSource.markerColor] - The default color of the map pin created for each point. + * @property [stroke = GeoJsonDataSource.stroke] - The default color of polylines and polygon outlines. + * @property [strokeWidth = GeoJsonDataSource.strokeWidth] - The default width of polylines and polygon outlines. + * @property [fill = GeoJsonDataSource.fill] - The default color for polygon interiors. + * @property [clampToGround = GeoJsonDataSource.clampToGround] - true if we want the geometry features (polygons or linestrings) clamped to the ground. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type LoadOptions = { + sourceUri?: string; + markerSize?: number; + markerSymbol?: string; + markerColor?: Color; + stroke?: Color; + strokeWidth?: number; + fill?: Color; + clampToGround?: boolean; + credit?: Credit | string; + }; + /** + * This callback is displayed as part of the GeoJsonDataSource class. + * @param properties - The properties of the feature. + * @param nameProperty - The property key that Cesium estimates to have the name of the feature. + */ + type describe = (properties: any, nameProperty: string) => void; +} + +/** + * A {@link DataSource} which processes both + * {@link http://www.geojson.org/|GeoJSON} and {@link https://github.com/mbostock/topojson|TopoJSON} data. + * {@link https://github.com/mapbox/simplestyle-spec|simplestyle-spec} properties will also be used if they + * are present. + * @example + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.dataSources.add(Cesium.GeoJsonDataSource.load('../../SampleData/ne_10m_us_states.topojson', { + * stroke: Cesium.Color.HOTPINK, + * fill: Cesium.Color.PINK, + * strokeWidth: 3, + * markerSymbol: '?' + * })); + * @param [name] - The name of this data source. If undefined, a name will be taken from + * the name of the GeoJSON file. + */ +export class GeoJsonDataSource { + constructor(name?: string); + /** + * Creates a Promise to a new instance loaded with the provided GeoJSON or TopoJSON data. + * @param data - A url, GeoJSON object, or TopoJSON object to be loaded. + * @param [options] - An object specifying configuration options + * @returns A promise that will resolve when the data is loaded. + */ + static load(data: Resource | string | any, options?: GeoJsonDataSource.LoadOptions): Promise; + /** + * Gets or sets the default size of the map pin created for each point, in pixels. + */ + static markerSize: number; + /** + * Gets or sets the default symbol of the map pin created for each point. + * This can be any valid {@link http://mapbox.com/maki/|Maki} identifier, any single character, + * or blank if no symbol is to be used. + */ + static markerSymbol: string; + /** + * Gets or sets the default color of the map pin created for each point. + */ + static markerColor: Color; + /** + * Gets or sets the default color of polylines and polygon outlines. + */ + static stroke: Color; + /** + * Gets or sets the default width of polylines and polygon outlines. + */ + static strokeWidth: number; + /** + * Gets or sets default color for polygon interiors. + */ + static fill: Color; + /** + * Gets or sets default of whether to clamp to the ground. + */ + static clampToGround: boolean; + /** + * Gets an object that maps the name of a crs to a callback function which takes a GeoJSON coordinate + * and transforms it into a WGS84 Earth-fixed Cartesian. Older versions of GeoJSON which + * supported the EPSG type can be added to this list as well, by specifying the complete EPSG name, + * for example 'EPSG:4326'. + */ + static crsNames: any; + /** + * Gets an object that maps the href property of a crs link to a callback function + * which takes the crs properties object and returns a Promise that resolves + * to a function that takes a GeoJSON coordinate and transforms it into a WGS84 Earth-fixed Cartesian. + * Items in this object take precedence over those defined in crsLinkHrefs, assuming + * the link has a type specified. + */ + static crsLinkHrefs: any; + /** + * Gets an object that maps the type property of a crs link to a callback function + * which takes the crs properties object and returns a Promise that resolves + * to a function that takes a GeoJSON coordinate and transforms it into a WGS84 Earth-fixed Cartesian. + * Items in crsLinkHrefs take precedence over this object. + */ + static crsLinkTypes: any; + /** + * Gets or sets a human-readable name for this instance. + */ + name: string; + /** + * This DataSource only defines static data, therefore this property is always undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Gets the credit that will be displayed for the data source + */ + credit: Credit; + /** + * Asynchronously loads the provided GeoJSON or TopoJSON data, replacing any existing data. + * @param data - A url, GeoJSON object, or TopoJSON object to be loaded. + * @param [options] - An object with the following properties: + * @param [options.sourceUri] - Overrides the url to use for resolving relative links. + * @param [options.describe = GeoJsonDataSource.defaultDescribeProperty] - A function which returns a Property object (or just a string), + * which converts the properties into an html description. + * @param [options.markerSize = GeoJsonDataSource.markerSize] - The default size of the map pin created for each point, in pixels. + * @param [options.markerSymbol = GeoJsonDataSource.markerSymbol] - The default symbol of the map pin created for each point. + * @param [options.markerColor = GeoJsonDataSource.markerColor] - The default color of the map pin created for each point. + * @param [options.stroke = GeoJsonDataSource.stroke] - The default color of polylines and polygon outlines. + * @param [options.strokeWidth = GeoJsonDataSource.strokeWidth] - The default width of polylines and polygon outlines. + * @param [options.fill = GeoJsonDataSource.fill] - The default color for polygon interiors. + * @param [options.clampToGround = GeoJsonDataSource.clampToGround] - true if we want the features clamped to the ground. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + * @returns a promise that will resolve when the GeoJSON is loaded. + */ + load(data: Resource | string | any, options?: { + sourceUri?: string; + describe?: GeoJsonDataSource.describe; + markerSize?: number; + markerSymbol?: string; + markerColor?: Color; + stroke?: Color; + strokeWidth?: number; + fill?: Color; + clampToGround?: boolean; + credit?: Credit | string; + }): Promise; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; +} + +/** + * An abstract class for updating geometry entities. + * @param options - An object with the following properties: + * @param options.entity - The entity containing the geometry to be visualized. + * @param options.scene - The scene where visualization is taking place. + * @param options.geometryOptions - Options for the geometry + * @param options.geometryPropertyName - The geometry property name + * @param options.observedPropertyNames - The entity properties this geometry cares about + */ +export class GeometryUpdater { + constructor(options: { + entity: Entity; + scene: Scene; + geometryOptions: any; + geometryPropertyName: string; + observedPropertyNames: string[]; + }); + /** + * Gets the unique ID associated with this updater + */ + readonly id: string; + /** + * Gets the entity associated with this geometry. + */ + readonly entity: Entity; + /** + * Gets a value indicating if the geometry has a fill component. + */ + readonly fillEnabled: boolean; + /** + * Gets a value indicating if fill visibility varies with simulation time. + */ + readonly hasConstantFill: boolean; + /** + * Gets the material property used to fill the geometry. + */ + readonly fillMaterialProperty: MaterialProperty; + /** + * Gets a value indicating if the geometry has an outline component. + */ + readonly outlineEnabled: boolean; + /** + * Gets a value indicating if the geometry has an outline component. + */ + readonly hasConstantOutline: boolean; + /** + * Gets the {@link Color} property for the geometry outline. + */ + readonly outlineColorProperty: Property; + /** + * Gets the constant with of the geometry outline, in pixels. + * This value is only valid if isDynamic is false. + */ + readonly outlineWidth: number; + /** + * Gets the property specifying whether the geometry + * casts or receives shadows from light sources. + */ + readonly shadowsProperty: Property; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this geometry will be displayed. + */ + readonly distanceDisplayConditionProperty: Property; + /** + * Gets or sets the {@link ClassificationType} Property specifying if this geometry will classify terrain, 3D Tiles, or both when on the ground. + */ + readonly classificationTypeProperty: Property; + /** + * Gets a value indicating if the geometry is time-varying. + * If true, all visualization is delegated to a DynamicGeometryUpdater + * returned by GeometryUpdater#createDynamicUpdater. + */ + readonly isDynamic: boolean; + /** + * Gets a value indicating if the geometry is closed. + * This property is only valid for static geometry. + */ + readonly isClosed: boolean; + /** + * Gets an event that is raised whenever the public properties + * of this updater change. + */ + readonly geometryChanged: boolean; + /** + * Checks if the geometry is outlined at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is outlined at the provided time, false otherwise. + */ + isOutlineVisible(time: JulianDate): boolean; + /** + * Checks if the geometry is filled at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is filled at the provided time, false otherwise. + */ + isFilled(time: JulianDate): boolean; + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; +} + +/** + * A general purpose visualizer for geometry represented by {@link Primitive} instances. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + * @param [primitives = scene.primitives] - A collection to add primitives related to the entities + * @param [groundPrimitives = scene.groundPrimitives] - A collection to add ground primitives related to the entities + */ +export class GeometryVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection, primitives?: PrimitiveCollection, groundPrimitives?: PrimitiveCollection); + /** + * Updates all of the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns True if the visualizer successfully updated to the provided time, + * false if the visualizer is waiting for asynchronous primitives to be created. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link MaterialProperty} that maps to grid {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the grid {@link Color}. + * @param [options.cellAlpha = 0.1] - A numeric Property specifying cell alpha values. + * @param [options.lineCount = new Cartesian2(8, 8)] - A {@link Cartesian2} Property specifying the number of grid lines along each axis. + * @param [options.lineThickness = new Cartesian2(1.0, 1.0)] - A {@link Cartesian2} Property specifying the thickness of grid lines along each axis. + * @param [options.lineOffset = new Cartesian2(0.0, 0.0)] - A {@link Cartesian2} Property specifying starting offset of grid lines along each axis. + */ +export class GridMaterialProperty { + constructor(options?: { + color?: Property | Color; + cellAlpha?: Property | number; + lineCount?: Property | Cartesian2; + lineThickness?: Property | Cartesian2; + lineOffset?: Property | Cartesian2; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the grid {@link Color}. + */ + color: Property | undefined; + /** + * Gets or sets the numeric Property specifying cell alpha values. + */ + cellAlpha: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the number of grid lines along each axis. + */ + lineCount: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the thickness of grid lines along each axis. + */ + lineThickness: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the starting offset of grid lines along each axis. + */ + lineOffset: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * An abstract class for updating ground geometry entities. + * @param options - An object with the following properties: + * @param options.entity - The entity containing the geometry to be visualized. + * @param options.scene - The scene where visualization is taking place. + * @param options.geometryOptions - Options for the geometry + * @param options.geometryPropertyName - The geometry property name + * @param options.observedPropertyNames - The entity properties this geometry cares about + */ +export class GroundGeometryUpdater { + constructor(options: { + entity: Entity; + scene: Scene; + geometryOptions: any; + geometryPropertyName: string; + observedPropertyNames: string[]; + }); + /** + * Gets the zindex + */ + readonly zIndex: number; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; +} + +/** + * A {@link MaterialProperty} that maps to image {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.image] - A Property specifying the Image, URL, Canvas, or Video. + * @param [options.repeat = new Cartesian2(1.0, 1.0)] - A {@link Cartesian2} Property specifying the number of times the image repeats in each direction. + * @param [options.color = Color.WHITE] - The color applied to the image + * @param [options.transparent = false] - Set to true when the image has transparency (for example, when a png has transparent sections) + */ +export class ImageMaterialProperty { + constructor(options?: { + image?: Property | string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement; + repeat?: Property | Cartesian2; + color?: Property | Color; + transparent?: Property | boolean; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying Image, URL, Canvas, or Video to use. + */ + image: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the number of times the image repeats in each direction. + */ + repeat: Property | undefined; + /** + * Gets or sets the Color Property specifying the desired color applied to the image. + */ + color: Property | undefined; + /** + * Gets or sets the Boolean Property specifying whether the image has transparency + */ + transparent: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * Representation of from KML + * @param position - camera position + * @param headingPitchRoll - camera orientation + */ +export class KmlCamera { + constructor(position: Cartesian3, headingPitchRoll: HeadingPitchRoll); +} + +export namespace KmlDataSource { + /** + * Initialization options for the `load` method. + * @property camera - The camera that is used for viewRefreshModes and sending camera properties to network links. + * @property canvas - The canvas that is used for sending viewer properties to network links. + * @property [sourceUri] - Overrides the url to use for resolving relative links and other KML network features. + * @property [clampToGround = false] - true if we want the geometry features (Polygons, LineStrings and LinearRings) clamped to the ground. + * @property [ellipsoid = Ellipsoid.WGS84] - The global ellipsoid used for geographical calculations. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type LoadOptions = { + camera: Camera; + canvas: HTMLCanvasElement; + sourceUri?: string; + clampToGround?: boolean; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }; +} + +/** + * A {@link DataSource} which processes Keyhole Markup Language 2.2 (KML). + *

    + * KML support in Cesium is incomplete, but a large amount of the standard, + * as well as Google's gx extension namespace, is supported. See Github issue + * {@link https://github.com/CesiumGS/cesium/issues/873|#873} for a + * detailed list of what is and isn't support. Cesium will also write information to the + * console when it encounters most unsupported features. + *

    + *

    + * Non visual feature data, such as atom:author and ExtendedData + * is exposed via an instance of {@link KmlFeatureData}, which is added to each {@link Entity} + * under the kml property. + *

    + * @example + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.dataSources.add(Cesium.KmlDataSource.load('../../SampleData/facilities.kmz', + * { + * camera: viewer.scene.camera, + * canvas: viewer.scene.canvas + * }) + * ); + * @param options - An object with the following properties: + * @param options.camera - The camera that is used for viewRefreshModes and sending camera properties to network links. + * @param options.canvas - The canvas that is used for sending viewer properties to network links. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The global ellipsoid used for geographical calculations. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + */ +export class KmlDataSource { + constructor(options: { + camera: Camera; + canvas: HTMLCanvasElement; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }); + /** + * Creates a Promise to a new instance loaded with the provided KML data. + * @param data - A url, parsed KML document, or Blob containing binary KMZ data or a parsed KML document. + * @param [options] - An object specifying configuration options + * @returns A promise that will resolve to a new KmlDataSource instance once the KML is loaded. + */ + static load(data: Resource | string | Document | Blob, options?: KmlDataSource.LoadOptions): Promise; + /** + * Gets or sets a human-readable name for this instance. + * This will be automatically be set to the KML document name on load. + */ + name: string; + /** + * Gets the clock settings defined by the loaded KML. This represents the total + * availability interval for all time-dynamic data. If the KML does not contain + * time-dynamic data, this value is undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets an event that will be raised when the data source refreshes a network link. + */ + refreshEvent: Event; + /** + * Gets an event that will be raised when the data source finds an unsupported node type. + */ + unsupportedNodeEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Gets the credit that will be displayed for the data source + */ + credit: Credit; + /** + * Asynchronously loads the provided KML data, replacing any existing data. + * @param data - A url, parsed KML document, or Blob containing binary KMZ data or a parsed KML document. + * @param [options] - An object with the following properties: + * @param [options.sourceUri] - Overrides the url to use for resolving relative links and other KML network features. + * @param [options.clampToGround = false] - true if we want the geometry features (Polygons, LineStrings and LinearRings) clamped to the ground. If true, lines will use corridors so use Entity.corridor instead of Entity.polyline. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The global ellipsoid used for geographical calculations. + * @returns A promise that will resolve to this instances once the KML is loaded. + */ + load(data: Resource | string | Document | Blob, options?: { + sourceUri?: Resource | string; + clampToGround?: boolean; + ellipsoid?: Ellipsoid; + }): Promise; + /** + * Updates any NetworkLink that require updating. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; +} + +/** + * Contains KML Feature data loaded into the Entity.kml property by {@link KmlDataSource}. + */ +export class KmlFeatureData { + constructor(); + /** + * Gets the atom syndication format author field. + */ + author: KmlFeatureData.Author; + /** + * Gets the link. + */ + link: KmlFeatureData.Link; + /** + * Gets the unstructured address field. + */ + address: string; + /** + * Gets the phone number. + */ + phoneNumber: string; + /** + * Gets the snippet. + */ + snippet: string; + /** + * Gets the extended data, parsed into a JSON object. + * Currently only the Data property is supported. + * SchemaData and custom data are ignored. + */ + extendedData: string; +} + +export namespace KmlFeatureData { + /** + * @property name - Gets the name. + * @property uri - Gets the URI. + * @property age - Gets the email. + */ + type Author = { + name: string; + uri: string; + age: number; + }; + /** + * @property href - Gets the href. + * @property hreflang - Gets the language of the linked resource. + * @property rel - Gets the link relation. + * @property type - Gets the link type. + * @property title - Gets the link title. + * @property length - Gets the link length. + */ + type Link = { + href: string; + hreflang: string; + rel: string; + type: string; + title: string; + length: string; + }; +} + +/** + * @param position - camera position + * @param headingPitchRange - camera orientation + */ +export class KmlLookAt { + constructor(position: Cartesian3, headingPitchRange: HeadingPitchRange); +} + +/** + * @param name - name parsed from KML + * @param id - id parsed from KML + * @param playlist - array with KMLTourFlyTos, KMLTourWaits and KMLTourSoundCues + */ +export class KmlTour { + constructor(name: string, id: string, playlist: any[]); + /** + * Id of kml gx:Tour entry + */ + id: string; + /** + * Tour name + */ + name: string; + /** + * Index of current entry from playlist + */ + playlistIndex: number; + /** + * Array of playlist entries + */ + playlist: any[]; + /** + * Event will be called when tour starts to play, + * before any playlist entry starts to play. + */ + tourStart: Event; + /** + * Event will be called when all playlist entries are + * played, or tour playback being canceled. + * + * If tour playback was terminated, event callback will + * be called with terminated=true parameter. + */ + tourEnd: Event; + /** + * Event will be called when entry from playlist starts to play. + * + * Event callback will be called with curent entry as first parameter. + */ + entryStart: Event; + /** + * Event will be called when entry from playlist ends to play. + * + * Event callback will be called with following parameters: + * 1. entry - entry + * 2. terminated - true if playback was terminated by calling {@link KmlTour#stop} + */ + entryEnd: Event; + /** + * Add entry to this tour playlist. + * @param entry - an entry to add to the playlist. + */ + addPlaylistEntry(entry: KmlTourFlyTo | KmlTourWait): void; + /** + * Play this tour. + * @param viewer - viewer widget. + * @param [cameraOptions] - these options will be merged with {@link Camera#flyTo} + * options for FlyTo playlist entries. + */ + play(viewer: Viewer, cameraOptions?: any): void; + /** + * Stop curently playing tour. + */ + stop(): void; +} + +/** + * @param duration - entry duration + * @param flyToMode - KML fly to mode: bounce, smooth, etc + * @param view - KmlCamera or KmlLookAt + */ +export class KmlTourFlyTo { + constructor(duration: number, flyToMode: string, view: KmlCamera | KmlLookAt); + /** + * Play this playlist entry + * @param done - function which will be called when playback ends + * @param camera - Cesium camera + * @param [cameraOptions] - which will be merged with camera flyTo options. See {@link Camera#flyTo} + */ + play(done: KmlTourFlyTo.DoneCallback, camera: Camera, cameraOptions?: any): void; + /** + * Stop execution of curent entry. Cancel camera flyTo + */ + stop(): void; + /** + * Returns options for {@link Camera#flyTo} or {@link Camera#flyToBoundingSphere} + * depends on this.view type. + * @param cameraOptions - options to merge with generated. See {@link Camera#flyTo} + * @returns {@link Camera#flyTo} or {@link Camera#flyToBoundingSphere} options + */ + getCameraOptions(cameraOptions: any): any; +} + +export namespace KmlTourFlyTo { + /** + * A function that will be executed when the flight completes. + * @param terminated - true if {@link KmlTourFlyTo#stop} was + * called before entry done playback. + */ + type DoneCallback = (terminated: boolean) => void; +} + +/** + * @param duration - entry duration + */ +export class KmlTourWait { + constructor(duration: number); + /** + * Play this playlist entry + * @param done - function which will be called when playback ends + */ + play(done: KmlTourWait.DoneCallback): void; + /** + * Stop execution of curent entry, cancel curent timeout + */ + stop(): void; +} + +export namespace KmlTourWait { + /** + * A function which will be called when playback ends. + * @param terminated - true if {@link KmlTourWait#stop} was + * called before entry done playback. + */ + type DoneCallback = (terminated: boolean) => void; +} + +export namespace LabelGraphics { + /** + * Initialization options for the LabelGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the label. + * @property [text] - A Property specifying the text. Explicit newlines '\n' are supported. + * @property [font = '30px sans-serif'] - A Property specifying the CSS font. + * @property [style = LabelStyle.FILL] - A Property specifying the {@link LabelStyle}. + * @property [scale = 1.0] - A numeric Property specifying the scale to apply to the text. + * @property [showBackground = false] - A boolean Property specifying the visibility of the background behind the label. + * @property [backgroundColor = new Color(0.165, 0.165, 0.165, 0.8)] - A Property specifying the background {@link Color}. + * @property [backgroundPadding = new Cartesian2(7, 5)] - A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. + * @property [pixelOffset = Cartesian2.ZERO] - A {@link Cartesian2} Property specifying the pixel offset. + * @property [eyeOffset = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the eye offset. + * @property [horizontalOrigin = HorizontalOrigin.CENTER] - A Property specifying the {@link HorizontalOrigin}. + * @property [verticalOrigin = VerticalOrigin.CENTER] - A Property specifying the {@link VerticalOrigin}. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [fillColor = Color.WHITE] - A Property specifying the fill {@link Color}. + * @property [outlineColor = Color.BLACK] - A Property specifying the outline {@link Color}. + * @property [outlineWidth = 1.0] - A numeric Property specifying the outline width. + * @property [translucencyByDistance] - A {@link NearFarScalar} Property used to set translucency based on distance from the camera. + * @property [pixelOffsetScaleByDistance] - A {@link NearFarScalar} Property used to set pixelOffset based on distance from the camera. + * @property [scaleByDistance] - A {@link NearFarScalar} Property used to set scale based on distance from the camera. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this label will be displayed. + * @property [disableDepthTestDistance] - A Property specifying the distance from the camera at which to disable the depth test to. + */ + type ConstructorOptions = { + show?: Property | boolean; + text?: Property | string; + font?: Property | string; + style?: Property | LabelStyle; + scale?: Property | number; + showBackground?: Property | boolean; + backgroundColor?: Property | Color; + backgroundPadding?: Property | Cartesian2; + pixelOffset?: Property | Cartesian2; + eyeOffset?: Property | Cartesian3; + horizontalOrigin?: Property | HorizontalOrigin; + verticalOrigin?: Property | VerticalOrigin; + heightReference?: Property | HeightReference; + fillColor?: Property | Color; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + translucencyByDistance?: Property | NearFarScalar; + pixelOffsetScaleByDistance?: Property | NearFarScalar; + scaleByDistance?: Property | NearFarScalar; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + disableDepthTestDistance?: Property | number; + }; +} + +/** + * Describes a two dimensional label located at the position of the containing {@link Entity}. + *

    + *

    + *
    + * Example labels + *
    + *

    + * @param [options] - Object describing initialization options + */ +export class LabelGraphics { + constructor(options?: LabelGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the label. + */ + show: Property | undefined; + /** + * Gets or sets the string Property specifying the text of the label. + * Explicit newlines '\n' are supported. + */ + text: Property | undefined; + /** + * Gets or sets the string Property specifying the font in CSS syntax. + */ + font: Property | undefined; + /** + * Gets or sets the Property specifying the {@link LabelStyle}. + */ + style: Property | undefined; + /** + * Gets or sets the numeric Property specifying the uniform scale to apply to the image. + * A scale greater than 1.0 enlarges the label while a scale less than 1.0 shrinks it. + *

    + *

    + *
    + * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
    + *

    + */ + scale: Property | undefined; + /** + * Gets or sets the boolean Property specifying the visibility of the background behind the label. + */ + showBackground: Property | undefined; + /** + * Gets or sets the Property specifying the background {@link Color}. + */ + backgroundColor: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's horizontal and vertical + * background padding in pixels. + */ + backgroundPadding: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's pixel offset in screen space + * from the origin of this label. This is commonly used to align multiple labels and labels at + * the same position, e.g., an image and text. The screen space origin is the top, left corner of the + * canvas; x increases from left to right, and y increases from top to bottom. + *

    + *

    + * + * + * + *
    default
    l.pixeloffset = new Cartesian2(25, 75);
    + * The label's origin is indicated by the yellow point. + *
    + *

    + */ + pixelOffset: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the label's offset in eye coordinates. + * Eye coordinates is a left-handed coordinate system, where x points towards the viewer's + * right, y points up, and z points into the screen. + *

    + * An eye offset is commonly used to arrange multiple labels or objects at the same position, e.g., to + * arrange a label above its corresponding 3D model. + *

    + * Below, the label is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

    + *

    + * + * + * + *
    + * l.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

    + *
    + *

    + */ + eyeOffset: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HorizontalOrigin}. + */ + horizontalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link VerticalOrigin}. + */ + verticalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the fill {@link Color}. + */ + fillColor: Property | undefined; + /** + * Gets or sets the Property specifying the outline {@link Color}. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the outline width. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the label based on the distance from the camera. + * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's translucency remains clamped to the nearest bound. + */ + translucencyByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the pixel offset of the label based on the distance from the camera. + * A label's pixel offset will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's pixel offset remains clamped to the nearest bound. + */ + pixelOffsetScaleByDistance: Property | undefined; + /** + * Gets or sets near and far scaling properties of a Label based on the label's distance from the camera. + * A label's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + */ + scaleByDistance: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this label will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: LabelGraphics): LabelGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: LabelGraphics): void; +} + +/** + * A {@link Visualizer} which maps the {@link LabelGraphics} instance + * in {@link Entity#label} to a {@link Label}. + * @param entityCluster - The entity cluster to manage the collection of billboards and optionally cluster with other entities. + * @param entityCollection - The entityCollection to visualize. + */ +export class LabelVisualizer { + constructor(entityCluster: EntityCluster, entityCollection: EntityCollection); + /** + * Updates the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * The interface for all {@link Property} objects that represent {@link Material} uniforms. + * This type defines an interface and cannot be instantiated directly. + */ +export class MaterialProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +export namespace ModelGraphics { + /** + * Initialization options for the ModelGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the model. + * @property [uri] - A string or Resource Property specifying the URI of the glTF asset. + * @property [scale = 1.0] - A numeric Property specifying a uniform linear scale. + * @property [minimumPixelSize = 0.0] - A numeric Property specifying the approximate minimum pixel size of the model regardless of zoom. + * @property [maximumScale] - The maximum scale size of a model. An upper limit for minimumPixelSize. + * @property [incrementallyLoadTextures = true] - Determine if textures may continue to stream in after the model is loaded. + * @property [runAnimations = true] - A boolean Property specifying if glTF animations specified in the model should be started. + * @property [clampAnimations = true] - A boolean Property specifying if glTF animations should hold the last pose for time durations with no keyframes. + * @property [shadows = ShadowMode.ENABLED] - An enum Property specifying whether the model casts or receives shadows from light sources. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [silhouetteColor = Color.RED] - A Property specifying the {@link Color} of the silhouette. + * @property [silhouetteSize = 0.0] - A numeric Property specifying the size of the silhouette in pixels. + * @property [color = Color.WHITE] - A Property specifying the {@link Color} that blends with the model's rendered color. + * @property [colorBlendMode = ColorBlendMode.HIGHLIGHT] - An enum Property specifying how the color blends with the model. + * @property [colorBlendAmount = 0.5] - A numeric Property specifying the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @property [imageBasedLightingFactor = new Cartesian2(1.0, 1.0)] - A property specifying the contribution from diffuse and specular image-based lighting. + * @property [lightColor] - A property specifying the light color when shading the model. When undefined the scene's light color is used instead. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this model will be displayed. + * @property [nodeTransformations] - An object, where keys are names of nodes, and values are {@link TranslationRotationScale} Properties describing the transformation to apply to that node. The transformation is applied after the node's existing transformation as specified in the glTF, and does not replace the node's existing transformation. + * @property [articulations] - An object, where keys are composed of an articulation name, a single space, and a stage name, and the values are numeric properties. + * @property [clippingPlanes] - A property specifying the {@link ClippingPlaneCollection} used to selectively disable rendering the model. + */ + type ConstructorOptions = { + show?: Property | boolean; + uri?: Property | string | Resource; + scale?: Property | number; + minimumPixelSize?: Property | number; + maximumScale?: Property | number; + incrementallyLoadTextures?: Property | boolean; + runAnimations?: Property | boolean; + clampAnimations?: Property | boolean; + shadows?: Property | ShadowMode; + heightReference?: Property | HeightReference; + silhouetteColor?: Property | Color; + silhouetteSize?: Property | number; + color?: Property | Color; + colorBlendMode?: Property | ColorBlendMode; + colorBlendAmount?: Property | number; + imageBasedLightingFactor?: Property | Cartesian2; + lightColor?: Property | Color; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + nodeTransformations?: PropertyBag | { + [key: string]: TranslationRotationScale; + }; + articulations?: PropertyBag | { + [key: string]: number; + }; + clippingPlanes?: Property | ClippingPlaneCollection; + }; +} + +/** + * A 3D model based on {@link https://github.com/KhronosGroup/glTF|glTF}, the runtime asset format for WebGL, OpenGL ES, and OpenGL. + * The position and orientation of the model is determined by the containing {@link Entity}. + *

    + * Cesium includes support for glTF geometry, materials, animations, and skinning. + * Cameras and lights are not currently supported. + *

    + * @param [options] - Object describing initialization options + */ +export class ModelGraphics { + constructor(options?: ModelGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the model. + */ + show: Property | undefined; + /** + * Gets or sets the string Property specifying the URI of the glTF asset. + */ + uri: Property | undefined; + /** + * Gets or sets the numeric Property specifying a uniform linear scale + * for this model. Values greater than 1.0 increase the size of the model while + * values less than 1.0 decrease it. + */ + scale: Property | undefined; + /** + * Gets or sets the numeric Property specifying the approximate minimum + * pixel size of the model regardless of zoom. This can be used to ensure that + * a model is visible even when the viewer zooms out. When 0.0, + * no minimum size is enforced. + */ + minimumPixelSize: Property | undefined; + /** + * Gets or sets the numeric Property specifying the maximum scale + * size of a model. This property is used as an upper limit for + * {@link ModelGraphics#minimumPixelSize}. + */ + maximumScale: Property | undefined; + /** + * Get or sets the boolean Property specifying whether textures + * may continue to stream in after the model is loaded. + */ + incrementallyLoadTextures: Property | undefined; + /** + * Gets or sets the boolean Property specifying if glTF animations should be run. + */ + runAnimations: Property | undefined; + /** + * Gets or sets the boolean Property specifying if glTF animations should hold the last pose for time durations with no keyframes. + */ + clampAnimations: Property | undefined; + /** + * Get or sets the enum Property specifying whether the model + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the silhouette. + */ + silhouetteColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the size of the silhouette in pixels. + */ + silhouetteSize: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} that blends with the model's rendered color. + */ + color: Property | undefined; + /** + * Gets or sets the enum Property specifying how the color blends with the model. + */ + colorBlendMode: Property | undefined; + /** + * A numeric Property specifying the color strength when the colorBlendMode is MIX. + * A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with + * any value in-between resulting in a mix of the two. + */ + colorBlendAmount: Property | undefined; + /** + * A property specifying the {@link Cartesian2} used to scale the diffuse and specular image-based lighting contribution to the final color. + */ + imageBasedLightingFactor: Property | undefined; + /** + * A property specifying the {@link Cartesian3} light color when shading the model. When undefined the scene's light color is used instead. + */ + lightColor: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this model will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the set of node transformations to apply to this model. This is represented as an {@link PropertyBag}, where keys are + * names of nodes, and values are {@link TranslationRotationScale} Properties describing the transformation to apply to that node. + * The transformation is applied after the node's existing transformation as specified in the glTF, and does not replace the node's existing transformation. + */ + nodeTransformations: PropertyBag; + /** + * Gets or sets the set of articulation values to apply to this model. This is represented as an {@link PropertyBag}, where keys are + * composed as the name of the articulation, a single space, and the name of the stage. + */ + articulations: PropertyBag; + /** + * A property specifying the {@link ClippingPlaneCollection} used to selectively disable rendering the model. + */ + clippingPlanes: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: ModelGraphics): ModelGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: ModelGraphics): void; +} + +/** + * A {@link Visualizer} which maps {@link Entity#model} to a {@link Model}. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + */ +export class ModelVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection); + /** + * Updates models created this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link Property} that produces {@link TranslationRotationScale} data. + * @param [options] - Object with the following properties: + * @param [options.translation = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the (x, y, z) translation to apply to the node. + * @param [options.rotation = Quaternion.IDENTITY] - A {@link Quaternion} Property specifying the (x, y, z, w) rotation to apply to the node. + * @param [options.scale = new Cartesian3(1.0, 1.0, 1.0)] - A {@link Cartesian3} Property specifying the (x, y, z) scaling to apply to the node. + */ +export class NodeTransformationProperty { + constructor(options?: { + translation?: Property | Cartesian3; + rotation?: Property | Quaternion; + scale?: Property | Cartesian3; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the {@link Cartesian3} Property specifying the (x, y, z) translation to apply to the node. + */ + translation: Property | undefined; + /** + * Gets or sets the {@link Quaternion} Property specifying the (x, y, z, w) rotation to apply to the node. + */ + rotation: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the (x, y, z) scaling to apply to the node. + */ + scale: Property | undefined; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: TranslationRotationScale): TranslationRotationScale; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +export namespace PathGraphics { + /** + * Initialization options for the PathGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the path. + * @property [leadTime] - A Property specifying the number of seconds in front the object to show. + * @property [trailTime] - A Property specifying the number of seconds behind of the object to show. + * @property [width = 1.0] - A numeric Property specifying the width in pixels. + * @property [resolution = 60] - A numeric Property specifying the maximum number of seconds to step when sampling the position. + * @property [material = Color.WHITE] - A Property specifying the material used to draw the path. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this path will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + leadTime?: Property | number; + trailTime?: Property | number; + width?: Property | number; + resolution?: Property | number; + material?: MaterialProperty | Color; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describes a polyline defined as the path made by an {@link Entity} as it moves over time. + * @param [options] - Object describing initialization options + */ +export class PathGraphics { + constructor(options?: PathGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the path. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the number of seconds in front of the object to show. + */ + leadTime: Property | undefined; + /** + * Gets or sets the Property specifying the number of seconds behind the object to show. + */ + trailTime: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width in pixels. + */ + width: Property | undefined; + /** + * Gets or sets the Property specifying the maximum number of seconds to step when sampling the position. + */ + resolution: Property | undefined; + /** + * Gets or sets the Property specifying the material used to draw the path. + */ + material: MaterialProperty; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this path will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PathGraphics): PathGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PathGraphics): void; +} + +/** + * A {@link Visualizer} which maps {@link Entity#path} to a {@link Polyline}. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + */ +export class PathVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection); + /** + * Updates all of the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link GeometryUpdater} for planes. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class PlaneGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace PlaneGraphics { + /** + * Initialization options for the PlaneGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the plane. + * @property [plane] - A {@link Plane} Property specifying the normal and distance for the plane. + * @property [dimensions] - A {@link Cartesian2} Property specifying the width and height of the plane. + * @property [fill = true] - A boolean Property specifying whether the plane is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the plane. + * @property [outline = false] - A boolean Property specifying whether the plane is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the plane casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this plane will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + plane?: Property | Plane; + dimensions?: Property | Cartesian2; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describes a plane. The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ +export class PlaneGraphics { + constructor(options?: PlaneGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the plane. + */ + show: Property | undefined; + /** + * Gets or sets the {@link Plane} Property specifying the normal and distance of the plane. + */ + plane: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the width and height of the plane. + */ + dimensions: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the plane is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the material used to fill the plane. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the plane is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the plane + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this plane will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PlaneGraphics): PlaneGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PlaneGraphics): void; +} + +export namespace PointGraphics { + /** + * Initialization options for the PointGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the point. + * @property [pixelSize = 1] - A numeric Property specifying the size in pixels. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [color = Color.WHITE] - A Property specifying the {@link Color} of the point. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 0] - A numeric Property specifying the the outline width in pixels. + * @property [scaleByDistance] - A {@link NearFarScalar} Property used to scale the point based on distance. + * @property [translucencyByDistance] - A {@link NearFarScalar} Property used to set translucency based on distance from the camera. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this point will be displayed. + * @property [disableDepthTestDistance] - A Property specifying the distance from the camera at which to disable the depth test to. + */ + type ConstructorOptions = { + show?: Property | boolean; + pixelSize?: Property | number; + heightReference?: Property | HeightReference; + color?: Property | Color; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + scaleByDistance?: Property | NearFarScalar; + translucencyByDistance?: Property | NearFarScalar; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + disableDepthTestDistance?: Property | number; + }; +} + +/** + * Describes a graphical point located at the position of the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ +export class PointGraphics { + constructor(options?: PointGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the point. + */ + show: Property | undefined; + /** + * Gets or sets the numeric Property specifying the size in pixels. + */ + pixelSize: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the point. + */ + color: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the the outline width in pixels. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets the {@link NearFarScalar} Property used to scale the point based on distance. + * If undefined, a constant size is used. + */ + scaleByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the point based on the distance from the camera. + * A point's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the points's translucency remains clamped to the nearest bound. + */ + translucencyByDistance: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this point will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PointGraphics): PointGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PointGraphics): void; +} + +/** + * A {@link Visualizer} which maps {@link Entity#point} to a {@link PointPrimitive}. + * @param entityCluster - The entity cluster to manage the collection of billboards and optionally cluster with other entities. + * @param entityCollection - The entityCollection to visualize. + */ +export class PointVisualizer { + constructor(entityCluster: EntityCluster, entityCollection: EntityCollection); + /** + * Updates the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link GeometryUpdater} for polygons. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class PolygonGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace PolygonGraphics { + /** + * Initialization options for the PolygonGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the polygon. + * @property [hierarchy] - A Property specifying the {@link PolygonHierarchy}. + * @property [height = 0] - A numeric Property specifying the altitude of the polygon relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the polygon's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [stRotation = 0.0] - A numeric property specifying the rotation of the polygon texture counter-clockwise from north. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude point. + * @property [fill = true] - A boolean Property specifying whether the polygon is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the polygon. + * @property [outline = false] - A boolean Property specifying whether the polygon is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [perPositionHeight = false] - A boolean specifying whether or not the height of each position is used. + * @property [closeTop = true] - When false, leaves off the top of an extruded polygon open. + * @property [closeBottom = true] - When false, leaves off the bottom of an extruded polygon open. + * @property [arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the polygon casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this polygon will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this polygon will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A property specifying the zIndex used for ordering ground geometry. Only has an effect if the polygon is constant and neither height or extrudedHeight are specified. + */ + type ConstructorOptions = { + show?: Property | boolean; + hierarchy?: Property | PolygonHierarchy; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + stRotation?: Property | number; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + perPositionHeight?: Property | boolean; + closeTop?: boolean | boolean; + closeBottom?: boolean | boolean; + arcType?: Property | ArcType; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: ConstantProperty | number; + }; +} + +/** + * Describes a polygon defined by an hierarchy of linear rings which make up the outer shape and any nested holes. + * The polygon conforms to the curvature of the globe and can be placed on the surface or + * at altitude and can optionally be extruded into a volume. + * @param [options] - Object describing initialization options + */ +export class PolygonGraphics { + constructor(options?: PolygonGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the polygon. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the {@link PolygonHierarchy}. + */ + hierarchy: Property | undefined; + /** + * Gets or sets the numeric Property specifying the constant altitude of the polygon. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the polygon extrusion. + * If {@link PolygonGraphics#perPositionHeight} is false, the volume starts at {@link PolygonGraphics#height} and ends at this altitude. + * If {@link PolygonGraphics#perPositionHeight} is true, the volume starts at the height of each {@link PolygonGraphics#hierarchy} position and ends at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the polygon texture counter-clockwise from north. + */ + stRotation: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the polygon. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the polygon is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the polygon. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the polygon is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets the boolean specifying whether or not the the height of each position is used. + * If true, the shape will have non-uniform altitude defined by the height of each {@link PolygonGraphics#hierarchy} position. + * If false, the shape will have a constant altitude as specified by {@link PolygonGraphics#height}. + */ + perPositionHeight: Property | undefined; + /** + * Gets or sets a boolean specifying whether or not the top of an extruded polygon is included. + */ + closeTop: Property | undefined; + /** + * Gets or sets a boolean specifying whether or not the bottom of an extruded polygon is included. + */ + closeBottom: Property | undefined; + /** + * Gets or sets the {@link ArcType} Property specifying the type of lines the polygon edges use. + */ + arcType: Property | undefined; + /** + * Get or sets the enum Property specifying whether the polygon + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this polygon will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this polygon will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Prperty specifying the ordering of ground geometry. Only has an effect if the polygon is constant and neither height or extrudedHeight are specified. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PolygonGraphics): PolygonGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PolygonGraphics): void; +} + +/** + * A {@link MaterialProperty} that maps to PolylineArrow {@link Material} uniforms. + * @param [color = Color.WHITE] - The {@link Color} Property to be used. + */ +export class PolylineArrowMaterialProperty { + constructor(color?: Property | Color); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the {@link Color} {@link Property}. + */ + color: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link MaterialProperty} that maps to polyline dash {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the {@link Color} of the line. + * @param [options.gapColor = Color.TRANSPARENT] - A Property specifying the {@link Color} of the gaps in the line. + * @param [options.dashLength = 16.0] - A numeric Property specifying the length of the dash pattern in pixels. + * @param [options.dashPattern = 255.0] - A numeric Property specifying a 16 bit pattern for the dash + */ +export class PolylineDashMaterialProperty { + constructor(options?: { + color?: Property | Color; + gapColor?: Property | Color; + dashLength?: Property | number; + dashPattern?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link Color} of the line. + */ + color: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the gaps in the line. + */ + gapColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the length of a dash cycle + */ + dashLength: Property | undefined; + /** + * Gets or sets the numeric Property specifying a dash pattern + */ + dashPattern: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link GeometryUpdater} for polylines. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class PolylineGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Gets the unique ID associated with this updater + */ + readonly id: string; + /** + * Gets the entity associated with this geometry. + */ + readonly entity: Entity; + /** + * Gets a value indicating if the geometry has a fill component. + */ + readonly fillEnabled: boolean; + /** + * Gets a value indicating if fill visibility varies with simulation time. + */ + readonly hasConstantFill: boolean; + /** + * Gets the material property used to fill the geometry. + */ + readonly fillMaterialProperty: MaterialProperty; + /** + * Gets the material property used to fill the geometry when it fails the depth test. + */ + readonly depthFailMaterialProperty: MaterialProperty; + /** + * Gets a value indicating if the geometry has an outline component. + */ + readonly outlineEnabled: boolean; + /** + * Gets a value indicating if outline visibility varies with simulation time. + */ + readonly hasConstantOutline: boolean; + /** + * Gets the {@link Color} property for the geometry outline. + */ + readonly outlineColorProperty: Property; + /** + * Gets the property specifying whether the geometry + * casts or receives shadows from light sources. + */ + readonly shadowsProperty: Property; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this geometry will be displayed. + */ + readonly distanceDisplayConditionProperty: Property; + /** + * Gets or sets the {@link ClassificationType} Property specifying if this geometry will classify terrain, 3D Tiles, or both when on the ground. + */ + readonly classificationTypeProperty: Property; + /** + * Gets a value indicating if the geometry is time-varying. + * If true, all visualization is delegated to the {@link DynamicGeometryUpdater} + * returned by GeometryUpdater#createDynamicUpdater. + */ + readonly isDynamic: boolean; + /** + * Gets a value indicating if the geometry is closed. + * This property is only valid for static geometry. + */ + readonly isClosed: boolean; + /** + * Gets an event that is raised whenever the public properties + * of this updater change. + */ + readonly geometryChanged: boolean; + /** + * Gets a value indicating if the path of the line. + */ + readonly arcType: ArcType; + /** + * Gets a value indicating if the geometry is clamped to the ground. + * Returns false if polylines on terrain is not supported. + */ + readonly clampToGround: boolean; + /** + * Gets the zindex + */ + readonly zIndex: number; + /** + * Checks if the geometry is outlined at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is outlined at the provided time, false otherwise. + */ + isOutlineVisible(time: JulianDate): boolean; + /** + * Checks if the geometry is filled at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is filled at the provided time, false otherwise. + */ + isFilled(time: JulianDate): boolean; + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; +} + +/** + * A {@link MaterialProperty} that maps to polyline glow {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the {@link Color} of the line. + * @param [options.glowPower = 0.25] - A numeric Property specifying the strength of the glow, as a percentage of the total line width. + * @param [options.taperPower = 1.0] - A numeric Property specifying the strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used. + */ +export class PolylineGlowMaterialProperty { + constructor(options?: { + color?: Property | Color; + glowPower?: Property | number; + taperPower?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link Color} of the line. + */ + color: Property | undefined; + /** + * Gets or sets the numeric Property specifying the strength of the glow, as a percentage of the total line width (less than 1.0). + */ + glowPower: Property | undefined; + /** + * Gets or sets the numeric Property specifying the strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used. + */ + taperPower: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +export namespace PolylineGraphics { + /** + * Initialization options for the PolylineGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the polyline. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions that define the line strip. + * @property [width = 1.0] - A numeric Property specifying the width in pixels. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude if arcType is not ArcType.NONE. + * @property [material = Color.WHITE] - A Property specifying the material used to draw the polyline. + * @property [depthFailMaterial] - A property specifying the material used to draw the polyline when it is below the terrain. + * @property [arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. + * @property [clampToGround = false] - A boolean Property specifying whether the Polyline should be clamped to the ground. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the polyline casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this polyline will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this polyline will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A Property specifying the zIndex used for ordering ground geometry. Only has an effect if `clampToGround` is true and polylines on terrain is supported. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + width?: Property | number; + granularity?: Property | number; + material?: MaterialProperty | Color; + depthFailMaterial?: MaterialProperty | Color; + arcType?: Property | ArcType; + clampToGround?: Property | boolean; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: Property | number; + }; +} + +/** + * Describes a polyline. The first two positions define a line segment, + * and each additional position defines a line segment from the previous position. The segments + * can be linear connected points, great arcs, or clamped to terrain. + * @param [options] - Object describing initialization options + */ +export class PolylineGraphics { + constructor(options?: PolylineGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the polyline. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} + * positions that define the line strip. + */ + positions: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width in pixels. + */ + width: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between each latitude and longitude if arcType is not ArcType.NONE and clampToGround is false. + */ + granularity: Property | undefined; + /** + * Gets or sets the Property specifying the material used to draw the polyline. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying the material used to draw the polyline when it fails the depth test. + *

    + * Requires the EXT_frag_depth WebGL extension to render properly. If the extension is not supported, + * there may be artifacts. + *

    + */ + depthFailMaterial: MaterialProperty; + /** + * Gets or sets the {@link ArcType} Property specifying whether the line segments should be great arcs, rhumb lines or linearly connected. + */ + arcType: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the polyline + * should be clamped to the ground. + */ + clampToGround: Property | undefined; + /** + * Get or sets the enum Property specifying whether the polyline + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this polyline will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this polyline will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ordering of the polyline. Only has an effect if `clampToGround` is true and polylines on terrain is supported. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PolylineGraphics): PolylineGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PolylineGraphics): void; +} + +/** + * A {@link MaterialProperty} that maps to polyline outline {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the {@link Color} of the line. + * @param [options.outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @param [options.outlineWidth = 1.0] - A numeric Property specifying the width of the outline, in pixels. + */ +export class PolylineOutlineMaterialProperty { + constructor(options?: { + color?: Property | Color; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link Color} of the line. + */ + color: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A visualizer for polylines represented by {@link Primitive} instances. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + * @param [primitives = scene.primitives] - A collection to add primitives related to the entities + * @param [groundPrimitives = scene.groundPrimitives] - A collection to add ground primitives related to the entities + */ +export class PolylineVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection, primitives?: PrimitiveCollection, groundPrimitives?: PrimitiveCollection); + /** + * Updates all of the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns True if the visualizer successfully updated to the provided time, + * false if the visualizer is waiting for asynchronous primitives to be created. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; +} + +/** + * A {@link GeometryUpdater} for polyline volumes. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class PolylineVolumeGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace PolylineVolumeGraphics { + /** + * Initialization options for the PolylineVolumeGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the volume. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions which define the line strip. + * @property [shape] - A Property specifying the array of {@link Cartesian2} positions which define the shape to be extruded. + * @property [cornerType = CornerType.ROUNDED] - A {@link CornerType} Property specifying the style of the corners. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude point. + * @property [fill = true] - A boolean Property specifying whether the volume is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the volume. + * @property [outline = false] - A boolean Property specifying whether the volume is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the volume casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this volume will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + shape?: Property | Cartesian2[]; + cornerType?: Property | CornerType; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describes a polyline volume defined as a line strip and corresponding two dimensional shape which is extruded along it. + * The resulting volume conforms to the curvature of the globe. + * @param [options] - Object describing initialization options + */ +export class PolylineVolumeGraphics { + constructor(options?: PolylineVolumeGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the volume. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} positions which define the line strip. + */ + positions: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian2} positions which define the shape to be extruded. + */ + shape: Property | undefined; + /** + * Gets or sets the {@link CornerType} Property specifying the style of the corners. + */ + cornerType: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the volume. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the volume is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the volume. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the volume is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the volume + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this volume will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PolylineVolumeGraphics): PolylineVolumeGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PolylineVolumeGraphics): void; +} + +/** + * The interface for all {@link Property} objects that define a world + * location as a {@link Cartesian3} with an associated {@link ReferenceFrame}. + * This type defines an interface and cannot be instantiated directly. + */ +export class PositionProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame that the position is defined in. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: Cartesian3): Cartesian3; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} whose value is an array whose items are the computed value + * of other PositionProperty instances. + * @param [value] - An array of Property instances. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ +export class PositionPropertyArray { + constructor(value?: Property[], referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in the array are constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value or one of the properties in the array also changes. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: Cartesian3[]): Cartesian3[]; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3[]): Cartesian3[]; + /** + * Sets the value of the property. + * @param value - An array of Property instances. + */ + setValue(value: Property[]): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * The interface for all properties, which represent a value that can optionally vary over time. + * This type defines an interface and cannot be instantiated directly. + */ +export class Property { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} whose value is an array whose items are the computed value + * of other property instances. + * @param [value] - An array of Property instances. + */ +export class PropertyArray { + constructor(value?: Property[]); + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in the array are constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value or one of the properties in the array also changes. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter, which is an array of values produced by evaluating each of the contained properties at the given time or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: object[]): object[]; + /** + * Sets the value of the property. + * @param value - An array of Property instances. + */ + setValue(value: Property[]): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +export interface PropertyBag extends DictionaryLike { +} + +/** + * A {@link Property} whose value is a key-value mapping of property names to the computed value of other properties. + * @param [value] - An object, containing key-value mapping of property names to properties. + * @param [createPropertyCallback] - A function that will be called when the value of any of the properties in value are not a Property. + */ +export class PropertyBag implements DictionaryLike { + constructor(value?: any, createPropertyCallback?: (...params: any[]) => any); + /** + * Gets the names of all properties registered on this instance. + */ + propertyNames: any[]; + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in this object are constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the set of properties contained in this + * object changes, or one of the properties itself changes. + */ + readonly definitionChanged: Event; + /** + * Determines if this object has defined a property with the given name. + * @param propertyName - The name of the property to check for. + * @returns True if this object has defined a property with the given name, false otherwise. + */ + hasProperty(propertyName: string): boolean; + /** + * Adds a property to this object. + * @param propertyName - The name of the property to add. + * @param [value] - The value of the new property, if provided. + * @param [createPropertyCallback] - A function that will be called when the value of this new property is set to a value that is not a Property. + */ + addProperty(propertyName: string, value?: any, createPropertyCallback?: (...params: any[]) => any): void; + /** + * Removed a property previously added with addProperty. + * @param propertyName - The name of the property to remove. + */ + removeProperty(propertyName: string): void; + /** + * Gets the value of this property. Each contained property will be evaluated at the given time, and the overall + * result will be an object, mapping property names to those values. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * Note that any properties in result which are not part of this PropertyBag will be left as-is. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + * @param [createPropertyCallback] - A function that will be called when the value of any of the properties in value are not a Property. + */ + merge(source: any, createPropertyCallback?: (...params: any[]) => any): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link GeometryUpdater} for rectangles. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class RectangleGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace RectangleGraphics { + /** + * Initialization options for the RectangleGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the rectangle. + * @property [coordinates] - The Property specifying the {@link Rectangle}. + * @property [height = 0] - A numeric Property specifying the altitude of the rectangle relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the rectangle's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [rotation = 0.0] - A numeric property specifying the rotation of the rectangle clockwise from north. + * @property [stRotation = 0.0] - A numeric property specifying the rotation of the rectangle texture counter-clockwise from north. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between points on the rectangle. + * @property [fill = true] - A boolean Property specifying whether the rectangle is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the rectangle. + * @property [outline = false] - A boolean Property specifying whether the rectangle is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the rectangle casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this rectangle will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this rectangle will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A Property specifying the zIndex used for ordering ground geometry. Only has an effect if the rectangle is constant and neither height or extrudedHeight are specified. + */ + type ConstructorOptions = { + show?: Property | boolean; + coordinates?: Property | Rectangle; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + rotation?: Property | number; + stRotation?: Property | number; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: Property | number; + }; +} + +/** + * Describes graphics for a {@link Rectangle}. + * The rectangle conforms to the curvature of the globe and can be placed on the surface or + * at altitude and can optionally be extruded into a volume. + * @param [options] - Object describing initialization options + */ +export class RectangleGraphics { + constructor(options?: RectangleGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the rectangle. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Rectangle}. + */ + coordinates: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the rectangle. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the rectangle extrusion. + * Setting this property creates volume starting at height and ending at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the rectangle clockwise from north. + */ + rotation: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the rectangle texture counter-clockwise from north. + */ + stRotation: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the rectangle. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the rectangle is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the rectangle. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the rectangle is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the rectangle + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this rectangle will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this rectangle will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ordering of the rectangle. Only has an effect if the rectangle is constant and neither height or extrudedHeight are specified. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: RectangleGraphics): RectangleGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: RectangleGraphics): void; +} + +/** + * A {@link Property} which transparently links to another property on a provided object. + * @example + * var collection = new Cesium.EntityCollection(); + * + * //Create a new entity and assign a billboard scale. + * var object1 = new Cesium.Entity({id:'object1'}); + * object1.billboard = new Cesium.BillboardGraphics(); + * object1.billboard.scale = new Cesium.ConstantProperty(2.0); + * collection.add(object1); + * + * //Create a second entity and reference the scale from the first one. + * var object2 = new Cesium.Entity({id:'object2'}); + * object2.model = new Cesium.ModelGraphics(); + * object2.model.scale = new Cesium.ReferenceProperty(collection, 'object1', ['billboard', 'scale']); + * collection.add(object2); + * + * //Create a third object, but use the fromString helper function. + * var object3 = new Cesium.Entity({id:'object3'}); + * object3.billboard = new Cesium.BillboardGraphics(); + * object3.billboard.scale = Cesium.ReferenceProperty.fromString(collection, 'object1#billboard.scale'); + * collection.add(object3); + * + * //You can refer to an entity with a # or . in id and property names by escaping them. + * var object4 = new Cesium.Entity({id:'#object.4'}); + * object4.billboard = new Cesium.BillboardGraphics(); + * object4.billboard.scale = new Cesium.ConstantProperty(2.0); + * collection.add(object4); + * + * var object5 = new Cesium.Entity({id:'object5'}); + * object5.billboard = new Cesium.BillboardGraphics(); + * object5.billboard.scale = Cesium.ReferenceProperty.fromString(collection, '\\#object\\.4#billboard.scale'); + * collection.add(object5); + * @param targetCollection - The entity collection which will be used to resolve the reference. + * @param targetId - The id of the entity which is being referenced. + * @param targetPropertyNames - The names of the property on the target entity which we will use. + */ +export class ReferenceProperty { + constructor(targetCollection: EntityCollection, targetId: string, targetPropertyNames: string[]); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever the referenced property's definition is changed. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame that the position is defined in. + * This property is only valid if the referenced property is a {@link PositionProperty}. + */ + readonly referenceFrame: ReferenceFrame; + /** + * Gets the id of the entity being referenced. + */ + readonly targetId: string; + /** + * Gets the collection containing the entity being referenced. + */ + readonly targetCollection: EntityCollection; + /** + * Gets the array of property names used to retrieve the referenced property. + */ + readonly targetPropertyNames: string[]; + /** + * Gets the resolved instance of the underlying referenced property. + */ + readonly resolvedProperty: Property | undefined; + /** + * Creates a new instance given the entity collection that will + * be used to resolve it and a string indicating the target entity id and property. + * The format of the string is "objectId#foo.bar", where # separates the id from + * property path and . separates sub-properties. If the reference identifier or + * or any sub-properties contains a # . or \ they must be escaped. + * @returns A new instance of ReferenceProperty. + */ + static fromString(targetCollection: EntityCollection, referenceString: string): ReferenceProperty; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * This method is only valid if the property being referenced is a {@link PositionProperty}. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3): Cartesian3; + /** + * Gets the {@link Material} type at the provided time. + * This method is only valid if the property being referenced is a {@link MaterialProperty}. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +export namespace Rotation { + /** + * The number of elements used to pack the object into an array. + */ + var packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + function pack(value: Rotation, array: number[], startingIndex?: number): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Rotation instance if one was not provided. + */ + function unpack(array: number[], startingIndex?: number, result?: Rotation): Rotation; + /** + * Converts a packed array into a form suitable for interpolation. + * @param packedArray - The packed array. + * @param [startingIndex = 0] - The index of the first element to be converted. + * @param [lastIndex = packedArray.length] - The index of the last element to be converted. + * @param [result] - The object into which to store the result. + */ + function convertPackedArrayForInterpolation(packedArray: number[], startingIndex?: number, lastIndex?: number, result?: number[]): void; + /** + * Retrieves an instance from a packed array converted with {@link Rotation.convertPackedArrayForInterpolation}. + * @param array - The array previously packed for interpolation. + * @param sourceArray - The original packed array. + * @param [firstIndex = 0] - The firstIndex used to convert the array. + * @param [lastIndex = packedArray.length] - The lastIndex used to convert the array. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Rotation instance if one was not provided. + */ + function unpackInterpolationResult(array: number[], sourceArray: number[], firstIndex?: number, lastIndex?: number, result?: Rotation): Rotation; +} + +/** + * Represents a {@link Packable} number that always interpolates values + * towards the shortest angle of rotation. This object is never used directly + * but is instead passed to the constructor of {@link SampledProperty} + * in order to represent a two-dimensional angle of rotation. + * @example + * var time1 = Cesium.JulianDate.fromIso8601('2010-05-07T00:00:00'); + * var time2 = Cesium.JulianDate.fromIso8601('2010-05-07T00:01:00'); + * var time3 = Cesium.JulianDate.fromIso8601('2010-05-07T00:02:00'); + * + * var property = new Cesium.SampledProperty(Cesium.Rotation); + * property.addSample(time1, 0); + * property.addSample(time3, Cesium.Math.toRadians(350)); + * + * //Getting the value at time2 will equal 355 degrees instead + * //of 175 degrees (which is what you get if you construct + * //a SampledProperty(Number) instead. Note, the actual + * //return value is in radians, not degrees. + * property.getValue(time2); + */ +export interface Rotation { +} + +/** + * A {@link SampledProperty} which is also a {@link PositionProperty}. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + * @param [numberOfDerivatives = 0] - The number of derivatives that accompany each position; i.e. velocity, acceleration, etc... + */ +export class SampledPositionProperty { + constructor(referenceFrame?: ReferenceFrame, numberOfDerivatives?: number); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the degree of interpolation to perform when retrieving a value. Call setInterpolationOptions to set this. + */ + readonly interpolationDegree: number; + /** + * Gets the interpolation algorithm to use when retrieving a value. Call setInterpolationOptions to set this. + */ + readonly interpolationAlgorithm: InterpolationAlgorithm; + /** + * The number of derivatives contained by this property; i.e. 0 for just position, 1 for velocity, etc. + */ + numberOfDerivatives: number; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time after any available samples. + */ + forwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate forward before + * the property becomes undefined. A value of 0 will extrapolate forever. + */ + forwardExtrapolationDuration: number; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time before any available samples. + */ + backwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate backward + * before the property becomes undefined. A value of 0 will extrapolate forever. + */ + backwardExtrapolationDuration: number; + /** + * Gets the position at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: Cartesian3): Cartesian3; + /** + * Gets the position at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3): Cartesian3; + /** + * Sets the algorithm and degree to use when interpolating a position. + * @param [options] - Object with the following properties: + * @param [options.interpolationAlgorithm] - The new interpolation algorithm. If undefined, the existing property will be unchanged. + * @param [options.interpolationDegree] - The new interpolation degree. If undefined, the existing property will be unchanged. + */ + setInterpolationOptions(options?: { + interpolationAlgorithm?: InterpolationAlgorithm; + interpolationDegree?: number; + }): void; + /** + * Adds a new sample. + * @param time - The sample time. + * @param position - The position at the provided time. + * @param [derivatives] - The array of derivative values at the provided time. + */ + addSample(time: JulianDate, position: Cartesian3, derivatives?: Cartesian3[]): void; + /** + * Adds multiple samples via parallel arrays. + * @param times - An array of JulianDate instances where each index is a sample time. + * @param positions - An array of Cartesian3 position instances, where each value corresponds to the provided time index. + * @param [derivatives] - An array where each value is another array containing derivatives for the corresponding time index. + */ + addSamples(times: JulianDate[], positions: Cartesian3[], derivatives?: any[][]): void; + /** + * Adds samples as a single packed array where each new sample is represented as a date, + * followed by the packed representation of the corresponding value and derivatives. + * @param packedSamples - The array of packed samples. + * @param [epoch] - If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. + */ + addSamplesPackedArray(packedSamples: number[], epoch?: JulianDate): void; + /** + * Removes a sample at the given time, if present. + * @param time - The sample time. + * @returns true if a sample at time was removed, false otherwise. + */ + removeSample(time: JulianDate): boolean; + /** + * Removes all samples for the given time interval. + * @param time - The time interval for which to remove all samples. + */ + removeSamples(time: TimeInterval): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} whose value is interpolated for a given time from the + * provided set of samples and specified interpolation algorithm and degree. + * @example + * //Create a linearly interpolated Cartesian2 + * var property = new Cesium.SampledProperty(Cesium.Cartesian2); + * + * //Populate it with data + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:00:00.00Z'), new Cesium.Cartesian2(0, 0)); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-02T00:00:00.00Z'), new Cesium.Cartesian2(4, 7)); + * + * //Retrieve an interpolated value + * var result = property.getValue(Cesium.JulianDate.fromIso8601('2012-08-01T12:00:00.00Z')); + * @example + * //Create a simple numeric SampledProperty that uses third degree Hermite Polynomial Approximation + * var property = new Cesium.SampledProperty(Number); + * property.setInterpolationOptions({ + * interpolationDegree : 3, + * interpolationAlgorithm : Cesium.HermitePolynomialApproximation + * }); + * + * //Populate it with data + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:00:00.00Z'), 1.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:01:00.00Z'), 6.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:02:00.00Z'), 12.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:03:30.00Z'), 5.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:06:30.00Z'), 2.0); + * + * //Samples can be added in any order. + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:00:30.00Z'), 6.2); + * + * //Retrieve an interpolated value + * var result = property.getValue(Cesium.JulianDate.fromIso8601('2012-08-01T00:02:34.00Z')); + * @param type - The type of property. + * @param [derivativeTypes] - When supplied, indicates that samples will contain derivative information of the specified types. + */ +export class SampledProperty { + constructor(type: number | Packable, derivativeTypes?: Packable[]); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the type of property. + */ + type: any; + /** + * Gets the derivative types used by this property. + */ + derivativeTypes: Packable[]; + /** + * Gets the degree of interpolation to perform when retrieving a value. + */ + interpolationDegree: number; + /** + * Gets the interpolation algorithm to use when retrieving a value. + */ + interpolationAlgorithm: InterpolationAlgorithm; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time after any available samples. + */ + forwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate forward before + * the property becomes undefined. A value of 0 will extrapolate forever. + */ + forwardExtrapolationDuration: number; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time before any available samples. + */ + backwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate backward + * before the property becomes undefined. A value of 0 will extrapolate forever. + */ + backwardExtrapolationDuration: number; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Sets the algorithm and degree to use when interpolating a value. + * @param [options] - Object with the following properties: + * @param [options.interpolationAlgorithm] - The new interpolation algorithm. If undefined, the existing property will be unchanged. + * @param [options.interpolationDegree] - The new interpolation degree. If undefined, the existing property will be unchanged. + */ + setInterpolationOptions(options?: { + interpolationAlgorithm?: InterpolationAlgorithm; + interpolationDegree?: number; + }): void; + /** + * Adds a new sample. + * @param time - The sample time. + * @param value - The value at the provided time. + * @param [derivatives] - The array of derivatives at the provided time. + */ + addSample(time: JulianDate, value: Packable, derivatives?: Packable[]): void; + /** + * Adds an array of samples. + * @param times - An array of JulianDate instances where each index is a sample time. + * @param values - The array of values, where each value corresponds to the provided times index. + * @param [derivativeValues] - An array where each item is the array of derivatives at the equivalent time index. + */ + addSamples(times: JulianDate[], values: Packable[], derivativeValues?: any[][]): void; + /** + * Adds samples as a single packed array where each new sample is represented as a date, + * followed by the packed representation of the corresponding value and derivatives. + * @param packedSamples - The array of packed samples. + * @param [epoch] - If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. + */ + addSamplesPackedArray(packedSamples: number[], epoch?: JulianDate): void; + /** + * Removes a sample at the given time, if present. + * @param time - The sample time. + * @returns true if a sample at time was removed, false otherwise. + */ + removeSample(time: JulianDate): boolean; + /** + * Removes all samples for the given time interval. + * @param time - The time interval for which to remove all samples. + */ + removeSamples(time: TimeInterval): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link MaterialProperty} that maps to stripe {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.orientation = StripeOrientation.HORIZONTAL] - A Property specifying the {@link StripeOrientation}. + * @param [options.evenColor = Color.WHITE] - A Property specifying the first {@link Color}. + * @param [options.oddColor = Color.BLACK] - A Property specifying the second {@link Color}. + * @param [options.offset = 0] - A numeric Property specifying how far into the pattern to start the material. + * @param [options.repeat = 1] - A numeric Property specifying how many times the stripes repeat. + */ +export class StripeMaterialProperty { + constructor(options?: { + orientation?: Property | StripeOrientation; + evenColor?: Property | Color; + oddColor?: Property | Color; + offset?: Property | number; + repeat?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link StripeOrientation}/ + */ + orientation: Property | undefined; + /** + * Gets or sets the Property specifying the first {@link Color}. + */ + evenColor: Property | undefined; + /** + * Gets or sets the Property specifying the second {@link Color}. + */ + oddColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the point into the pattern + * to begin drawing; with 0.0 being the beginning of the even color, 1.0 the beginning + * of the odd color, 2.0 being the even color again, and any multiple or fractional values + * being in between. + */ + offset: Property | undefined; + /** + * Gets or sets the numeric Property specifying how many times the stripes repeat. + */ + repeat: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * Defined the orientation of stripes in {@link StripeMaterialProperty}. + */ +export enum StripeOrientation { + /** + * Horizontal orientation. + */ + HORIZONTAL = 0, + /** + * Vertical orientation. + */ + VERTICAL = 1 +} + +/** + * A {@link TimeIntervalCollectionProperty} which is also a {@link PositionProperty}. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ +export class TimeIntervalCollectionPositionProperty { + constructor(referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame(time: JulianDate, referenceFrame: ReferenceFrame, result?: Cartesian3): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} which is defined by a {@link TimeIntervalCollection}, where the + * data property of each {@link TimeInterval} represents the value at time. + * @example + * //Create a Cartesian2 interval property which contains data on August 1st, 2012 + * //and uses a different value every 6 hours. + * var composite = new Cesium.TimeIntervalCollectionProperty(); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T00:00:00.00Z/2012-08-01T06:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : false, + * data : new Cesium.Cartesian2(2.0, 3.4) + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T06:00:00.00Z/2012-08-01T12:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : false, + * data : new Cesium.Cartesian2(12.0, 2.7) + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T12:00:00.00Z/2012-08-01T18:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : false, + * data : new Cesium.Cartesian2(5.0, 12.4) + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T18:00:00.00Z/2012-08-02T00:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : true, + * data : new Cesium.Cartesian2(85.0, 4.1) + * })); + */ +export class TimeIntervalCollectionProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets the value of the property at the provided time. + * @param time - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} which evaluates to a {@link Quaternion} rotation + * based on the velocity of the provided {@link PositionProperty}. + * @example + * //Create an entity with position and orientation. + * var position = new Cesium.SampledProperty(); + * position.addSamples(...); + * var entity = viewer.entities.add({ + * position : position, + * orientation : new Cesium.VelocityOrientationProperty(position) + * })); + * @param [position] - The position property used to compute the orientation. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid used to determine which way is up. + */ +export class VelocityOrientationProperty { + constructor(position?: PositionProperty, ellipsoid?: Ellipsoid); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the position property used to compute orientation. + */ + position: Property | undefined; + /** + * Gets or sets the ellipsoid used to determine which way is up. + */ + ellipsoid: Property | undefined; + /** + * Gets the value of the property at the provided time. + * @param [time] - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Quaternion): Quaternion; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * A {@link Property} which evaluates to a {@link Cartesian3} vector + * based on the velocity of the provided {@link PositionProperty}. + * @example + * //Create an entity with a billboard rotated to match its velocity. + * var position = new Cesium.SampledProperty(); + * position.addSamples(...); + * var entity = viewer.entities.add({ + * position : position, + * billboard : { + * image : 'image.png', + * alignedAxis : new Cesium.VelocityVectorProperty(position, true) // alignedAxis must be a unit vector + * } + * })); + * @param [position] - The position property used to compute the velocity. + * @param [normalize = true] - Whether to normalize the computed velocity vector. + */ +export class VelocityVectorProperty { + constructor(position?: PositionProperty, normalize?: boolean); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the position property used to compute the velocity vector. + */ + position: Property | undefined; + /** + * Gets or sets whether the vector produced by this property + * will be normalized or not. + */ + normalize: boolean; + /** + * Gets the value of the property at the provided time. + * @param [time] - The time for which to retrieve the value. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; +} + +/** + * Defines the interface for visualizers. Visualizers are plug-ins to + * {@link DataSourceDisplay} that render data associated with + * {@link DataSource} instances. + * This object is an interface for documentation purposes and is not intended + * to be instantiated directly. + */ +export class Visualizer { + constructor(); + /** + * Updates the visualization to the provided time. + * @param time - The time. + * @returns True if the display was updated to the provided time, + * false if the visualizer is waiting for an asynchronous operation to + * complete before data can be updated. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes all visualization and cleans up any resources associated with this instance. + */ + destroy(): void; +} + +/** + * A {@link GeometryUpdater} for walls. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ +export class WallGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; +} + +export namespace WallGraphics { + /** + * Initialization options for the WallGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the wall. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions which define the top of the wall. + * @property [minimumHeights] - A Property specifying an array of heights to be used for the bottom of the wall instead of the globe surface. + * @property [maximumHeights] - A Property specifying an array of heights to be used for the top of the wall instead of the height of each position. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude point. + * @property [fill = true] - A boolean Property specifying whether the wall is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the wall. + * @property [outline = false] - A boolean Property specifying whether the wall is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the wall casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this wall will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + minimumHeights?: Property | number[]; + maximumHeights?: Property | number[]; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; +} + +/** + * Describes a two dimensional wall defined as a line strip and optional maximum and minimum heights. + * The wall conforms to the curvature of the globe and can be placed along the surface or at altitude. + * @param [options] - Object describing initialization options + */ +export class WallGraphics { + constructor(options?: WallGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the wall. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} positions which define the top of the wall. + */ + positions: Property | undefined; + /** + * Gets or sets the Property specifying an array of heights to be used for the bottom of the wall instead of the surface of the globe. + * If defined, the array must be the same length as {@link Wall#positions}. + */ + minimumHeights: Property | undefined; + /** + * Gets or sets the Property specifying an array of heights to be used for the top of the wall instead of the height of each position. + * If defined, the array must be the same length as {@link Wall#positions}. + */ + maximumHeights: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the wall. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the wall is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the wall. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the wall is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the wall + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this wall will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: WallGraphics): WallGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: WallGraphics): void; +} + +/** + * @property kml - The generated KML. + * @property externalFiles - An object dictionary of external files + */ +export type exportKmlResultKml = { + kml: string; + externalFiles: { + [key: string]: Blob; + }; +}; + +/** + * @property kmz - The generated kmz file. + */ +export type exportKmlResultKmz = { + kmz: Blob; +}; + +/** + * Exports an EntityCollection as a KML document. Only Point, Billboard, Model, Path, Polygon, Polyline geometries + * will be exported. Note that there is not a 1 to 1 mapping of Entity properties to KML Feature properties. For + * example, entity properties that are time dynamic but cannot be dynamic in KML are exported with their values at + * options.time or the beginning of the EntityCollection's time interval if not specified. For time-dynamic properties + * that are supported in KML, we use the samples if it is a {@link SampledProperty} otherwise we sample the value using + * the options.sampleDuration. Point, Billboard, Model and Path geometries with time-dynamic positions will be exported + * as gx:Track Features. Not all Materials are representable in KML, so for more advanced Materials just the primary + * color is used. Canvas objects are exported as PNG images. + * @example + * Cesium.exportKml({ + * entities: entityCollection + * }) + * .then(function(result) { + * // The XML string is in result.kml + * + * var externalFiles = result.externalFiles + * for(var file in externalFiles) { + * // file is the name of the file used in the KML document as the href + * // externalFiles[file] is a blob with the contents of the file + * } + * }); + * @param options - An object with the following properties: + * @param options.entities - The EntityCollection to export as KML. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid for the output file. + * @param [options.modelCallback] - A callback that will be called with a {@link ModelGraphics} instance and should return the URI to use in the KML. Required if a model exists in the entity collection. + * @param [options.time = entities.computeAvailability().start] - The time value to use to get properties that are not time varying in KML. + * @param [options.defaultAvailability = entities.computeAvailability()] - The interval that will be sampled if an entity doesn't have an availability. + * @param [options.sampleDuration = 60] - The number of seconds to sample properties that are varying in KML. + * @param [options.kmz = false] - If true KML and external files will be compressed into a kmz file. + * @returns A promise that resolved to an object containing the KML string and a dictionary of external file blobs, or a kmz file as a blob if options.kmz is true. + */ +export function exportKml(options: { + entities: EntityCollection; + ellipsoid?: Ellipsoid; + modelCallback?: exportKmlModelCallback; + time?: JulianDate; + defaultAvailability?: TimeInterval; + sampleDuration?: number; + kmz?: boolean; +}): Promise; + +/** + * Since KML does not support glTF models, this callback is required to specify what URL to use for the model in the KML document. + * It can also be used to add additional files to the externalFiles object, which is the list of files embedded in the exported KMZ, + * or otherwise returned with the KML string when exporting. + * @param model - The ModelGraphics instance for an Entity. + * @param time - The time that any properties should use to get the value. + * @param externalFiles - An object that maps a filename to a Blob or a Promise that resolves to a Blob. + */ +export type exportKmlModelCallback = (model: ModelGraphics, time: JulianDate, externalFiles: any) => string; + +/** + * The data type of a pixel. + */ +export enum PixelDatatype { + UNSIGNED_BYTE = WebGLConstants.UNSIGNED_BYTE, + UNSIGNED_SHORT = WebGLConstants.UNSIGNED_SHORT, + UNSIGNED_INT = WebGLConstants.UNSIGNED_INT, + FLOAT = WebGLConstants.FLOAT, + HALF_FLOAT = WebGLConstants.HALF_FLOAT_OES, + UNSIGNED_INT_24_8 = WebGLConstants.UNSIGNED_INT_24_8, + UNSIGNED_SHORT_4_4_4_4 = WebGLConstants.UNSIGNED_SHORT_4_4_4_4, + UNSIGNED_SHORT_5_5_5_1 = WebGLConstants.UNSIGNED_SHORT_5_5_5_1, + UNSIGNED_SHORT_5_6_5 = WebGLConstants.UNSIGNED_SHORT_5_6_5 +} + +/** + * Enumerates all possible filters used when magnifying WebGL textures. + */ +export enum TextureMagnificationFilter { + /** + * Samples the texture by returning the closest pixel. + */ + NEAREST = WebGLConstants.NEAREST, + /** + * Samples the texture through bi-linear interpolation of the four nearest pixels. This produces smoother results than NEAREST filtering. + */ + LINEAR = WebGLConstants.LINEAR +} + +/** + * Enumerates all possible filters used when minifying WebGL textures. + */ +export enum TextureMinificationFilter { + /** + * Samples the texture by returning the closest pixel. + */ + NEAREST = WebGLConstants.NEAREST, + /** + * Samples the texture through bi-linear interpolation of the four nearest pixels. This produces smoother results than NEAREST filtering. + */ + LINEAR = WebGLConstants.LINEAR, + /** + * Selects the nearest mip level and applies nearest sampling within that level. + *

    + * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

    + */ + NEAREST_MIPMAP_NEAREST = WebGLConstants.NEAREST_MIPMAP_NEAREST, + /** + * Selects the nearest mip level and applies linear sampling within that level. + *

    + * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

    + */ + LINEAR_MIPMAP_NEAREST = WebGLConstants.LINEAR_MIPMAP_NEAREST, + /** + * Read texture values with nearest sampling from two adjacent mip levels and linearly interpolate the results. + *

    + * This option provides a good balance of visual quality and speed when sampling from a mipmapped texture. + *

    + *

    + * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

    + */ + NEAREST_MIPMAP_LINEAR = WebGLConstants.NEAREST_MIPMAP_LINEAR, + /** + * Read texture values with linear sampling from two adjacent mip levels and linearly interpolate the results. + *

    + * This option provides a good balance of visual quality and speed when sampling from a mipmapped texture. + *

    + *

    + * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

    + */ + LINEAR_MIPMAP_LINEAR = WebGLConstants.LINEAR_MIPMAP_LINEAR +} + +/** + * An appearance defines the full GLSL vertex and fragment shaders and the + * render state used to draw a {@link Primitive}. All appearances implement + * this base Appearance interface. + * @param [options] - Object with the following properties: + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link Appearance#renderState} has alpha blending enabled. + * @param [options.closed = false] - When true, the geometry is expected to be closed so {@link Appearance#renderState} has backface culling enabled. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class Appearance { + constructor(options?: { + translucent?: boolean; + closed?: boolean; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link Appearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account the {@link Appearance#material}. + * Use {@link Appearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed. + */ + readonly closed: boolean; + /** + * Procedurally creates the full GLSL fragment shader source for this appearance + * taking into account {@link Appearance#fragmentShaderSource} and {@link Appearance#material}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link Appearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +export namespace ArcGisMapServerImageryProvider { + /** + * Initialization options for the ArcGisMapServerImageryProvider constructor + * @property url - The URL of the ArcGIS MapServer service. + * @property [token] - The ArcGIS token used to authenticate with the ArcGIS MapServer service. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. If this value is not specified, a default + * {@link DiscardMissingTileImagePolicy} is used for tiled map servers, and a + * {@link NeverTileDiscardPolicy} is used for non-tiled map servers. In the former case, + * we request tile 0,0 at the maximum tile level and check pixels (0,0), (200,20), (20,200), + * (80,110), and (160, 130). If all of these pixels are transparent, the discard check is + * disabled and no tiles are discarded. If any of them have a non-transparent color, any + * tile that has the same values in these pixel locations is discarded. The end result of + * these defaults should be correct tile discarding for a standard ArcGIS Server. To ensure + * that no tiles are discarded, construct and pass a {@link NeverTileDiscardPolicy} for this + * parameter. + * @property [usePreCachedTilesIfAvailable = true] - If true, the server's pre-cached + * tiles are used if they are available. If false, any pre-cached tiles are ignored and the + * 'export' service is used. + * @property [layers] - A comma-separated list of the layers to show, or undefined if all layers should be shown. + * @property [enablePickFeatures = true] - If true, {@link ArcGisMapServerImageryProvider#pickFeatures} will invoke + * the Identify service on the MapServer and return the features included in the response. If false, + * {@link ArcGisMapServerImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) + * without communicating with the server. Set this property to false if you don't want this provider's features to + * be pickable. Can be overridden by setting the {@link ArcGisMapServerImageryProvider#enablePickFeatures} property on the object. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle of the layer. This parameter is ignored when accessing + * a tiled layer. + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme to use to divide the world into tiles. + * This parameter is ignored when accessing a tiled server. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified and used, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. This parameter is ignored when accessing a tiled server. + * @property [tileWidth = 256] - The width of each tile in pixels. This parameter is ignored when accessing a tiled server. + * @property [tileHeight = 256] - The height of each tile in pixels. This parameter is ignored when accessing a tiled server. + * @property [maximumLevel] - The maximum tile level to request, or undefined if there is no maximum. This parameter is ignored when accessing + * a tiled server. + */ + type ConstructorOptions = { + url: Resource | string; + token?: string; + tileDiscardPolicy?: TileDiscardPolicy; + usePreCachedTilesIfAvailable?: boolean; + layers?: string; + enablePickFeatures?: boolean; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + tileWidth?: number; + tileHeight?: number; + maximumLevel?: number; + }; +} + +/** + * Provides tiled imagery hosted by an ArcGIS MapServer. By default, the server's pre-cached tiles are + * used, if available. + * @example + * var esri = new Cesium.ArcGisMapServerImageryProvider({ + * url : 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' + * }); + * @param options - Object describing initialization options + */ +export class ArcGisMapServerImageryProvider { + constructor(options: ArcGisMapServerImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link ArcGisMapServerImageryProvider#pickFeatures} will + * invoke the "identify" operation on the ArcGIS server and return the features included in the response. If false, + * {@link ArcGisMapServerImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) + * without communicating with the server. + */ + enablePickFeatures: boolean; + /** + * Gets the URL of the ArcGIS MapServer. + */ + readonly url: string; + /** + * Gets the ArcGIS token used to authenticate with the ArcGis MapServer service. + */ + readonly token: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether this imagery provider is using pre-cached tiles from the + * ArcGIS MapServer. If the imagery provider is not yet ready ({@link ArcGisMapServerImageryProvider#ready}), this function + * will return the value of `options.usePreCachedTilesIfAvailable`, even if the MapServer does + * not have pre-cached tiles. + */ + readonly usingPrecachedTiles: boolean; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the comma-separated list of layer IDs to show. + */ + layers: string; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link ImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * An enum describing the x, y, and z axes and helper conversion functions. + */ +export enum Axis { + /** + * Denotes the x-axis. + */ + X = 0, + /** + * Denotes the y-axis. + */ + Y = 1, + /** + * Denotes the z-axis. + */ + Z = 2 +} + +/** + * A viewport-aligned image positioned in the 3D scene, that is created + * and rendered using a {@link BillboardCollection}. A billboard is created and its initial + * properties are set by calling {@link BillboardCollection#add}. + *

    + *
    + *
    + * Example billboards + *
    + */ +export class Billboard { + constructor(); + /** + * Determines if this billboard will be shown. Use this to hide or show a billboard, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this billboard. + */ + position: Cartesian3; + /** + * Gets or sets the height reference of this billboard. + */ + heightReference: HeightReference; + /** + * Gets or sets the pixel offset in screen space from the origin of this billboard. This is commonly used + * to align multiple billboards and labels at the same position, e.g., an image and text. The + * screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + *

    + *
    + * + * + * + *
    default
    b.pixeloffset = new Cartesian2(50, 25);
    + * The billboard's origin is indicated by the yellow point. + *
    + */ + pixelOffset: Cartesian2; + /** + * Gets or sets near and far scaling properties of a Billboard based on the billboard's distance from the camera. + * A billboard's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a billboard's scaleByDistance to scale by 1.5 when the + * // camera is 1500 meters from the billboard and disappear as + * // the camera distance approaches 8.0e6 meters. + * b.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable scaling by distance + * b.scaleByDistance = undefined; + */ + scaleByDistance: NearFarScalar; + /** + * Gets or sets near and far translucency properties of a Billboard based on the billboard's distance from the camera. + * A billboard's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @example + * // Example 1. + * // Set a billboard's translucency to 1.0 when the + * // camera is 1500 meters from the billboard and disappear as + * // the camera distance approaches 8.0e6 meters. + * b.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable translucency by distance + * b.translucencyByDistance = undefined; + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets near and far pixel offset scaling properties of a Billboard based on the billboard's distance from the camera. + * A billboard's pixel offset will be scaled between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's pixel offset scale remains clamped to the nearest bound. If undefined, + * pixelOffsetScaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a billboard's pixel offset scale to 0.0 when the + * // camera is 1500 meters from the billboard and scale pixel offset to 10.0 pixels + * // in the y direction the camera distance approaches 8.0e6 meters. + * b.pixelOffset = new Cesium.Cartesian2(0.0, 1.0); + * b.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(1.5e2, 0.0, 8.0e6, 10.0); + * @example + * // Example 2. + * // disable pixel offset by distance + * b.pixelOffsetScaleByDistance = undefined; + */ + pixelOffsetScaleByDistance: NearFarScalar; + /** + * Gets or sets the 3D Cartesian offset applied to this billboard in eye coordinates. Eye coordinates is a left-handed + * coordinate system, where x points towards the viewer's right, y points up, and + * z points into the screen. Eye coordinates use the same scale as world and model coordinates, + * which is typically meters. + *

    + * An eye offset is commonly used to arrange multiple billboards or objects at the same position, e.g., to + * arrange a billboard above its corresponding 3D model. + *

    + * Below, the billboard is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

    + *
    + * + * + * + *
    + * b.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

    + *
    + */ + eyeOffset: Cartesian3; + /** + * Gets or sets the horizontal origin of this billboard, which determines if the billboard is + * to the left, center, or right of its anchor position. + *

    + *
    + *
    + *
    + * @example + * // Use a bottom, left origin + * b.horizontalOrigin = Cesium.HorizontalOrigin.LEFT; + * b.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; + */ + horizontalOrigin: HorizontalOrigin; + /** + * Gets or sets the vertical origin of this billboard, which determines if the billboard is + * to the above, below, or at the center of its anchor position. + *

    + *
    + *
    + *
    + * @example + * // Use a bottom, left origin + * b.horizontalOrigin = Cesium.HorizontalOrigin.LEFT; + * b.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; + */ + verticalOrigin: VerticalOrigin; + /** + * Gets or sets the uniform scale that is multiplied with the billboard's image size in pixels. + * A scale of 1.0 does not change the size of the billboard; a scale greater than + * 1.0 enlarges the billboard; a positive scale less than 1.0 shrinks + * the billboard. + *

    + *
    + *
    + * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
    + */ + scale: number; + /** + * Gets or sets the color that is multiplied with the billboard's texture. This has two common use cases. First, + * the same white texture may be used by many different billboards, each with a different color, to create + * colored billboards. Second, the color's alpha component can be used to make the billboard translucent as shown below. + * An alpha of 0.0 makes the billboard transparent, and 1.0 makes the billboard opaque. + *

    + *
    + * + * + * + *
    default
    alpha : 0.5
    + *
    + *
    + * The red, green, blue, and alpha values are indicated by value's red, green, + * blue, and alpha properties as shown in Example 1. These components range from 0.0 + * (no intensity) to 1.0 (full intensity). + * @example + * // Example 1. Assign yellow. + * b.color = Cesium.Color.YELLOW; + * @example + * // Example 2. Make a billboard 50% translucent. + * b.color = new Cesium.Color(1.0, 1.0, 1.0, 0.5); + */ + color: Color; + /** + * Gets or sets the rotation angle in radians. + */ + rotation: number; + /** + * Gets or sets the aligned axis in world space. The aligned axis is the unit vector that the billboard up vector points towards. + * The default is the zero vector, which means the billboard is aligned to the screen up vector. + * @example + * // Example 1. + * // Have the billboard up vector point north + * billboard.alignedAxis = Cesium.Cartesian3.UNIT_Z; + * @example + * // Example 2. + * // Have the billboard point east. + * billboard.alignedAxis = Cesium.Cartesian3.UNIT_Z; + * billboard.rotation = -Cesium.Math.PI_OVER_TWO; + * @example + * // Example 3. + * // Reset the aligned axis + * billboard.alignedAxis = Cesium.Cartesian3.ZERO; + */ + alignedAxis: Cartesian3; + /** + * Gets or sets a width for the billboard. If undefined, the image width will be used. + */ + width: number; + /** + * Gets or sets a height for the billboard. If undefined, the image height will be used. + */ + height: number; + /** + * Gets or sets if the billboard size is in meters or pixels. true to size the billboard in meters; + * otherwise, the size is in pixels. + */ + sizeInMeters: boolean; + /** + * Gets or sets the condition specifying at what distance from the camera that this billboard will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the user-defined object returned when the billboard is picked. + */ + id: any; + /** + *

    + * Gets or sets the image to be used for this billboard. If a texture has already been created for the + * given image, the existing texture is used. + *

    + *

    + * This property can be set to a loaded Image, a URL which will be loaded as an Image automatically, + * a canvas, or another billboard's image property (from the same billboard collection). + *

    + * @example + * // load an image from a URL + * b.image = 'some/image/url.png'; + * + * // assuming b1 and b2 are billboards in the same billboard collection, + * // use the same image for both billboards. + * b2.image = b1.image; + */ + image: string; + /** + * When true, this billboard is ready to render, i.e., the image + * has been downloaded and the WebGL resources are created. + */ + readonly ready: boolean; + /** + *

    + * Sets the image to be used for this billboard. If a texture has already been created for the + * given id, the existing texture is used. + *

    + *

    + * This function is useful for dynamically creating textures that are shared across many billboards. + * Only the first billboard will actually call the function and create the texture, while subsequent + * billboards created with the same id will simply re-use the existing texture. + *

    + *

    + * To load an image from a URL, setting the {@link Billboard#image} property is more convenient. + *

    + * @example + * // create a billboard image dynamically + * function drawImage(id) { + * // create and draw an image using a canvas + * var canvas = document.createElement('canvas'); + * var context2D = canvas.getContext('2d'); + * // ... draw image + * return canvas; + * } + * // drawImage will be called to create the texture + * b.setImage('myImage', drawImage); + * + * // subsequent billboards created in the same collection using the same id will use the existing + * // texture, without the need to create the canvas or draw the image + * b2.setImage('myImage', drawImage); + * @param id - The id of the image. This can be any string that uniquely identifies the image. + * @param image - The image to load. This parameter + * can either be a loaded Image or Canvas, a URL which will be loaded as an Image automatically, + * or a function which will be called to create the image if it hasn't been loaded already. + */ + setImage(id: string, image: HTMLImageElement | HTMLCanvasElement | string | Resource | Billboard.CreateImageCallback): void; + /** + * Uses a sub-region of the image with the given id as the image for this billboard, + * measured in pixels from the bottom-left. + * @param id - The id of the image to use. + * @param subRegion - The sub-region of the image. + */ + setImageSubRegion(id: string, subRegion: BoundingRectangle): void; + /** + * Computes the screen-space position of the billboard's origin, taking into account eye and pixel offsets. + * The screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + * @example + * console.log(b.computeScreenSpacePosition(scene).toString()); + * @param scene - The scene. + * @param [result] - The object onto which to store the result. + * @returns The screen-space position of the billboard. + */ + computeScreenSpacePosition(scene: Scene, result?: Cartesian2): Cartesian2; + /** + * Determines if this billboard equals another billboard. Billboards are equal if all their properties + * are equal. Billboards in different collections can be equal. + * @param other - The billboard to compare for equality. + * @returns true if the billboards are equal; otherwise, false. + */ + equals(other: Billboard): boolean; +} + +export namespace Billboard { + /** + * A function that creates an image. + * @param id - The identifier of the image to load. + */ + type CreateImageCallback = (id: string) => HTMLImageElement | HTMLCanvasElement | Promise; +} + +/** + * A renderable collection of billboards. Billboards are viewport-aligned + * images positioned in the 3D scene. + *

    + *
    + *
    + * Example billboards + *
    + *

    + * Billboards are added and removed from the collection using {@link BillboardCollection#add} + * and {@link BillboardCollection#remove}. Billboards in a collection automatically share textures + * for images with the same identifier. + * @example + * // Create a billboard collection with two billboards + * var billboards = scene.primitives.add(new Cesium.BillboardCollection()); + * billboards.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * image : 'url/to/image' + * }); + * billboards.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * image : 'url/to/another/image' + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each billboard from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.scene] - Must be passed in for billboards that use the height reference property or will be depth tested against the globe. + * @param [options.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT] - The billboard blending option. The default + * is used for rendering both opaque and translucent billboards. However, if either all of the billboards are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve performance by up to 2x. + */ +export class BillboardCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + scene?: Scene; + blendOption?: BlendOption; + }); + /** + * The 4x4 transformation matrix that transforms each billboard in this collection from model to world coordinates. + * When this is the identity matrix, the billboards are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * var center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * billboards.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(0.0, 0.0, 0.0) // center + * }); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0) // east + * }); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0) // north + * }); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0) // up + * }); + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the texture atlas for this BillboardCollection as a fullscreen quad. + *

    + */ + debugShowTextureAtlas: boolean; + /** + * The billboard blending option. The default is used for rendering both opaque and translucent billboards. + * However, if either all of the billboards are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve + * performance by up to 2x. + */ + blendOption: BlendOption; + /** + * Returns the number of billboards in this collection. This is commonly used with + * {@link BillboardCollection#get} to iterate over all the billboards + * in the collection. + */ + length: number; + /** + * Creates and adds a billboard with the specified initial properties to the collection. + * The added billboard is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a billboard, specifying all the default values. + * var b = billboards.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * pixelOffset : Cesium.Cartesian2.ZERO, + * eyeOffset : Cesium.Cartesian3.ZERO, + * heightReference : Cesium.HeightReference.NONE, + * horizontalOrigin : Cesium.HorizontalOrigin.CENTER, + * verticalOrigin : Cesium.VerticalOrigin.CENTER, + * scale : 1.0, + * image : 'url/to/image', + * imageSubRegion : undefined, + * color : Cesium.Color.WHITE, + * id : undefined, + * rotation : 0.0, + * alignedAxis : Cesium.Cartesian3.ZERO, + * width : undefined, + * height : undefined, + * scaleByDistance : undefined, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * sizeInMeters : false, + * distanceDisplayCondition : undefined + * }); + * @example + * // Example 2: Specify only the billboard's cartographic position. + * var b = billboards.add({ + * position : Cesium.Cartesian3.fromDegrees(longitude, latitude, height) + * }); + * @param [options] - A template describing the billboard's properties as shown in Example 1. + * @returns The billboard that was added to the collection. + */ + add(options?: any): Billboard; + /** + * Removes a billboard from the collection. + * @example + * var b = billboards.add(...); + * billboards.remove(b); // Returns true + * @param billboard - The billboard to remove. + * @returns true if the billboard was removed; false if the billboard was not found in the collection. + */ + remove(billboard: Billboard): boolean; + /** + * Removes all billboards from the collection. + * @example + * billboards.add(...); + * billboards.add(...); + * billboards.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given billboard. + * @param [billboard] - The billboard to check for. + * @returns true if this collection contains the billboard, false otherwise. + */ + contains(billboard?: Billboard): boolean; + /** + * Returns the billboard in the collection at the specified index. Indices are zero-based + * and increase as billboards are added. Removing a billboard shifts all billboards after + * it to the left, changing their indices. This function is commonly used with + * {@link BillboardCollection#length} to iterate over all the billboards + * in the collection. + * @example + * // Toggle the show property of every billboard in the collection + * var len = billboards.length; + * for (var i = 0; i < len; ++i) { + * var b = billboards.get(i); + * b.show = !b.show; + * } + * @param index - The zero-based index of the billboard. + * @returns The billboard at the specified index. + */ + get(index: number): Billboard; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * billboards = billboards && billboards.destroy(); + */ + destroy(): void; +} + +export namespace BingMapsImageryProvider { + /** + * Initialization options for the BingMapsImageryProvider constructor + * @property url - The url of the Bing Maps server hosting the imagery. + * @property key - The Bing Maps key for your application, which can be + * created at {@link https://www.bingmapsportal.com/}. + * If this parameter is not provided, {@link BingMapsApi.defaultKey} is used, which is undefined by default. + * @property [tileProtocol] - The protocol to use when loading tiles, e.g. 'http' or 'https'. + * By default, tiles are loaded using the same protocol as the page. + * @property [mapStyle = BingMapsStyle.AERIAL] - The type of Bing Maps imagery to load. + * @property [culture = ''] - The culture to use when requesting Bing Maps imagery. Not + * all cultures are supported. See {@link http://msdn.microsoft.com/en-us/library/hh441729.aspx} + * for information on the supported cultures. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. By default, a {@link DiscardEmptyTileImagePolicy} + * will be used, with the expectation that the Bing Maps server will send a zero-length response for missing tiles. + * To ensure that no tiles are discarded, construct and pass a {@link NeverTileDiscardPolicy} for this parameter. + */ + type ConstructorOptions = { + url: Resource | string; + key: string; + tileProtocol?: string; + mapStyle?: BingMapsStyle; + culture?: string; + ellipsoid?: Ellipsoid; + tileDiscardPolicy?: TileDiscardPolicy; + }; +} + +/** + * Provides tiled imagery using the Bing Maps Imagery REST API. + * @example + * var bing = new Cesium.BingMapsImageryProvider({ + * url : 'https://dev.virtualearth.net', + * key : 'get-yours-at-https://www.bingmapsportal.com/', + * mapStyle : Cesium.BingMapsStyle.AERIAL + * }); + * @param options - Object describing initialization options + */ +export class BingMapsImageryProvider { + constructor(options: BingMapsImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the name of the BingMaps server url hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the Bing Maps key. + */ + readonly key: string; + /** + * Gets the type of Bing Maps imagery to load. + */ + readonly mapStyle: BingMapsStyle; + /** + * The culture to use when requesting Bing Maps imagery. Not + * all cultures are supported. See {@link http://msdn.microsoft.com/en-us/library/hh441729.aspx} + * for information on the supported cultures. + */ + readonly culture: string; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link BingMapsImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link BingMapsImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; + /** + * Converts a tiles (x, y, level) position into a quadkey used to request an image + * from a Bing Maps server. + * @param x - The tile's x coordinate. + * @param y - The tile's y coordinate. + * @param level - The tile's zoom level. + */ + static tileXYToQuadKey(x: number, y: number, level: number): void; + /** + * Converts a tile's quadkey used to request an image from a Bing Maps server into the + * (x, y, level) position. + * @param quadkey - The tile's quad key + */ + static quadKeyToTileXY(quadkey: string): void; + /** + * Gets or sets the URL to the Bing logo for display in the credit. + */ + static logoUrl: string; +} + +/** + * The types of imagery provided by Bing Maps. + */ +export enum BingMapsStyle { + /** + * Aerial imagery. + */ + AERIAL = "Aerial", + /** + * Aerial imagery with a road overlay. + */ + AERIAL_WITH_LABELS = "AerialWithLabels", + /** + * Aerial imagery with a road overlay. + */ + AERIAL_WITH_LABELS_ON_DEMAND = "AerialWithLabelsOnDemand", + /** + * Roads without additional imagery. + */ + ROAD = "Road", + /** + * Roads without additional imagery. + */ + ROAD_ON_DEMAND = "RoadOnDemand", + /** + * A dark version of the road maps. + */ + CANVAS_DARK = "CanvasDark", + /** + * A lighter version of the road maps. + */ + CANVAS_LIGHT = "CanvasLight", + /** + * A grayscale version of the road maps. + */ + CANVAS_GRAY = "CanvasGray", + /** + * Ordnance Survey imagery. This imagery is visible only for the London, UK area. + */ + ORDNANCE_SURVEY = "OrdnanceSurvey", + /** + * Collins Bart imagery. + */ + COLLINS_BART = "CollinsBart" +} + +/** + * Determines how two pixels' values are combined. + */ +export enum BlendEquation { + /** + * Pixel values are added componentwise. This is used in additive blending for translucency. + */ + ADD = WebGLConstants.FUNC_ADD, + /** + * Pixel values are subtracted componentwise (source - destination). This is used in alpha blending for translucency. + */ + SUBTRACT = WebGLConstants.FUNC_SUBTRACT, + /** + * Pixel values are subtracted componentwise (destination - source). + */ + REVERSE_SUBTRACT = WebGLConstants.FUNC_REVERSE_SUBTRACT, + /** + * Pixel values are given to the minimum function (min(source, destination)). + * + * This equation operates on each pixel color component. + */ + MIN = WebGLConstants.MIN, + /** + * Pixel values are given to the maximum function (max(source, destination)). + * + * This equation operates on each pixel color component. + */ + MAX = WebGLConstants.MAX +} + +/** + * Determines how blending factors are computed. + */ +export enum BlendFunction { + /** + * The blend factor is zero. + */ + ZERO = WebGLConstants.ZERO, + /** + * The blend factor is one. + */ + ONE = WebGLConstants.ONE, + /** + * The blend factor is the source color. + */ + SOURCE_COLOR = WebGLConstants.SRC_COLOR, + /** + * The blend factor is one minus the source color. + */ + ONE_MINUS_SOURCE_COLOR = WebGLConstants.ONE_MINUS_SRC_COLOR, + /** + * The blend factor is the destination color. + */ + DESTINATION_COLOR = WebGLConstants.DST_COLOR, + /** + * The blend factor is one minus the destination color. + */ + ONE_MINUS_DESTINATION_COLOR = WebGLConstants.ONE_MINUS_DST_COLOR, + /** + * The blend factor is the source alpha. + */ + SOURCE_ALPHA = WebGLConstants.SRC_ALPHA, + /** + * The blend factor is one minus the source alpha. + */ + ONE_MINUS_SOURCE_ALPHA = WebGLConstants.ONE_MINUS_SRC_ALPHA, + /** + * The blend factor is the destination alpha. + */ + DESTINATION_ALPHA = WebGLConstants.DST_ALPHA, + /** + * The blend factor is one minus the destination alpha. + */ + ONE_MINUS_DESTINATION_ALPHA = WebGLConstants.ONE_MINUS_DST_ALPHA, + /** + * The blend factor is the constant color. + */ + CONSTANT_COLOR = WebGLConstants.CONSTANT_COLOR, + /** + * The blend factor is one minus the constant color. + */ + ONE_MINUS_CONSTANT_COLOR = WebGLConstants.ONE_MINUS_CONSTANT_COLOR, + /** + * The blend factor is the constant alpha. + */ + CONSTANT_ALPHA = WebGLConstants.CONSTANT_ALPHA, + /** + * The blend factor is one minus the constant alpha. + */ + ONE_MINUS_CONSTANT_ALPHA = WebGLConstants.ONE_MINUS_CONSTANT_ALPHA, + /** + * The blend factor is the saturated source alpha. + */ + SOURCE_ALPHA_SATURATE = WebGLConstants.SRC_ALPHA_SATURATE +} + +/** + * Determines how opaque and translucent parts of billboards, points, and labels are blended with the scene. + */ +export enum BlendOption { + /** + * The billboards, points, or labels in the collection are completely opaque. + */ + OPAQUE = 0, + /** + * The billboards, points, or labels in the collection are completely translucent. + */ + TRANSLUCENT = 1, + /** + * The billboards, points, or labels in the collection are both opaque and translucent. + */ + OPAQUE_AND_TRANSLUCENT = 2 +} + +/** + * The blending state combines {@link BlendEquation} and {@link BlendFunction} and the + * enabled flag to define the full blending state for combining source and + * destination fragments when rendering. + *

    + * This is a helper when using custom render states with {@link Appearance#renderState}. + *

    + */ +export namespace BlendingState { + /** + * Blending is disabled. + */ + const DISABLED: any; + /** + * Blending is enabled using alpha blending, source(source.alpha) + destination(1 - source.alpha). + */ + const ALPHA_BLEND: any; + /** + * Blending is enabled using alpha blending with premultiplied alpha, source + destination(1 - source.alpha). + */ + const PRE_MULTIPLIED_ALPHA_BLEND: any; + /** + * Blending is enabled using additive blending, source(source.alpha) + destination. + */ + const ADDITIVE_BLEND: any; +} + +/** + * A ParticleEmitter that emits particles within a box. + * Particles will be positioned randomly within the box and have initial velocities emanating from the center of the box. + * @param dimensions - The width, height and depth dimensions of the box. + */ +export class BoxEmitter { + constructor(dimensions: Cartesian3); + /** + * The width, height and depth dimensions of the box in meters. + */ + dimensions: Cartesian3; +} + +/** + * The camera is defined by a position, orientation, and view frustum. + *

    + * The orientation forms an orthonormal basis with a view, up and right = view x up unit vectors. + *

    + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * // Create a camera looking down the negative z-axis, positioned at the origin, + * // with a field of view of 60 degrees, and 1:1 aspect ratio. + * var camera = new Cesium.Camera(scene); + * camera.position = new Cesium.Cartesian3(); + * camera.direction = Cesium.Cartesian3.negate(Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3()); + * camera.up = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_Y); + * camera.frustum.fov = Cesium.Math.PI_OVER_THREE; + * camera.frustum.near = 1.0; + * camera.frustum.far = 2.0; + * @param scene - The scene. + */ +export class Camera { + constructor(scene: Scene); + /** + * The position of the camera. + */ + position: Cartesian3; + /** + * The view direction of the camera. + */ + direction: Cartesian3; + /** + * The up direction of the camera. + */ + up: Cartesian3; + /** + * The right direction of the camera. + */ + right: Cartesian3; + /** + * The region of space in view. + */ + frustum: PerspectiveFrustum | PerspectiveOffCenterFrustum | OrthographicFrustum; + /** + * The default amount to move the camera when an argument is not + * provided to the move methods. + */ + defaultMoveAmount: number; + /** + * The default amount to rotate the camera when an argument is not + * provided to the look methods. + */ + defaultLookAmount: number; + /** + * The default amount to rotate the camera when an argument is not + * provided to the rotate methods. + */ + defaultRotateAmount: number; + /** + * The default amount to move the camera when an argument is not + * provided to the zoom methods. + */ + defaultZoomAmount: number; + /** + * If set, the camera will not be able to rotate past this axis in either direction. + */ + constrainedAxis: Cartesian3; + /** + * The factor multiplied by the the map size used to determine where to clamp the camera position + * when zooming out from the surface. The default is 1.5. Only valid for 2D and the map is rotatable. + */ + maximumZoomFactor: number; + /** + * The amount the camera has to change before the changed event is raised. The value is a percentage in the [0, 1] range. + */ + percentageChanged: number; + /** + * The default rectangle the camera will view on creation. + */ + static DEFAULT_VIEW_RECTANGLE: Rectangle; + /** + * A scalar to multiply to the camera position and add it back after setting the camera to view the rectangle. + * A value of zero means the camera will view the entire {@link Camera#DEFAULT_VIEW_RECTANGLE}, a value greater than zero + * will move it further away from the extent, and a value less than zero will move it close to the extent. + */ + static DEFAULT_VIEW_FACTOR: number; + /** + * The default heading/pitch/range that is used when the camera flies to a location that contains a bounding sphere. + */ + static DEFAULT_OFFSET: HeadingPitchRange; + /** + * Gets the camera's reference frame. The inverse of this transformation is appended to the view matrix. + */ + readonly transform: Matrix4; + /** + * Gets the inverse camera transform. + */ + readonly inverseTransform: Matrix4; + /** + * Gets the view matrix. + */ + readonly viewMatrix: Matrix4; + /** + * Gets the inverse view matrix. + */ + readonly inverseViewMatrix: Matrix4; + /** + * Gets the {@link Cartographic} position of the camera, with longitude and latitude + * expressed in radians and height in meters. In 2D and Columbus View, it is possible + * for the returned longitude and latitude to be outside the range of valid longitudes + * and latitudes when the camera is outside the map. + */ + readonly positionCartographic: Cartographic; + /** + * Gets the position of the camera in world coordinates. + */ + readonly positionWC: Cartesian3; + /** + * Gets the view direction of the camera in world coordinates. + */ + readonly directionWC: Cartesian3; + /** + * Gets the up direction of the camera in world coordinates. + */ + readonly upWC: Cartesian3; + /** + * Gets the right direction of the camera in world coordinates. + */ + readonly rightWC: Cartesian3; + /** + * Gets the camera heading in radians. + */ + readonly heading: number; + /** + * Gets the camera pitch in radians. + */ + readonly pitch: number; + /** + * Gets the camera roll in radians. + */ + readonly roll: number; + /** + * Gets the event that will be raised at when the camera starts to move. + */ + readonly moveStart: Event; + /** + * Gets the event that will be raised when the camera has stopped moving. + */ + readonly moveEnd: Event; + /** + * Gets the event that will be raised when the camera has changed by percentageChanged. + */ + readonly changed: Event; + /** + * Sets the camera position, orientation and transform. + * @example + * // 1. Set position with a top-down view + * viewer.camera.setView({ + * destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0) + * }); + * + * // 2 Set view with heading, pitch and roll + * viewer.camera.setView({ + * destination : cartesianPosition, + * orientation: { + * heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north) + * pitch : Cesium.Math.toRadians(-90), // default value (looking down) + * roll : 0.0 // default value + * } + * }); + * + * // 3. Change heading, pitch and roll with the camera position remaining the same. + * viewer.camera.setView({ + * orientation: { + * heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north) + * pitch : Cesium.Math.toRadians(-90), // default value (looking down) + * roll : 0.0 // default value + * } + * }); + * + * + * // 4. View rectangle with a top-down view + * viewer.camera.setView({ + * destination : Cesium.Rectangle.fromDegrees(west, south, east, north) + * }); + * + * // 5. Set position with an orientation using unit vectors. + * viewer.camera.setView({ + * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0), + * orientation : { + * direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734), + * up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339) + * } + * }); + * @param options - Object with the following properties: + * @param [options.destination] - The final position of the camera in WGS84 (world) coordinates or a rectangle that would be visible from a top-down view. + * @param [options.orientation] - An object that contains either direction and up properties or heading, pitch and roll properties. By default, the direction will point + * towards the center of the frame in 3D and in the negative z direction in Columbus view. The up direction will point towards local north in 3D and in the positive + * y direction in Columbus view. Orientation is not used in 2D when in infinite scrolling mode. + * @param [options.endTransform] - Transform matrix representing the reference frame of the camera. + * @param [options.convert] - Whether to convert the destination from world coordinates to scene coordinates (only relevant when not using 3D). Defaults to true. + */ + setView(options: { + destination?: Cartesian3 | Rectangle; + orientation?: any; + endTransform?: Matrix4; + convert?: boolean; + }): void; + /** + * Fly the camera to the home view. Use {@link Camera#.DEFAULT_VIEW_RECTANGLE} to set + * the default view for the 3D scene. The home view for 2D and columbus view shows the + * entire map. + * @param [duration] - The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight. See {@link Camera#flyTo} + */ + flyHome(duration?: number): void; + /** + * Transform a vector or point from world coordinates to the camera's reference frame. + * @param cartesian - The vector or point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector or point. + */ + worldToCameraCoordinates(cartesian: Cartesian4, result?: Cartesian4): Cartesian4; + /** + * Transform a point from world coordinates to the camera's reference frame. + * @param cartesian - The point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed point. + */ + worldToCameraCoordinatesPoint(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Transform a vector from world coordinates to the camera's reference frame. + * @param cartesian - The vector to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector. + */ + worldToCameraCoordinatesVector(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Transform a vector or point from the camera's reference frame to world coordinates. + * @param cartesian - The vector or point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector or point. + */ + cameraToWorldCoordinates(cartesian: Cartesian4, result?: Cartesian4): Cartesian4; + /** + * Transform a point from the camera's reference frame to world coordinates. + * @param cartesian - The point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed point. + */ + cameraToWorldCoordinatesPoint(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Transform a vector from the camera's reference frame to world coordinates. + * @param cartesian - The vector to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector. + */ + cameraToWorldCoordinatesVector(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Translates the camera's position by amount along direction. + * @param direction - The direction to move. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + move(direction: Cartesian3, amount?: number): void; + /** + * Translates the camera's position by amount along the camera's view vector. + * When in 2D mode, this will zoom in the camera instead of translating the camera's position. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveForward(amount?: number): void; + /** + * Translates the camera's position by amount along the opposite direction + * of the camera's view vector. + * When in 2D mode, this will zoom out the camera instead of translating the camera's position. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveBackward(amount?: number): void; + /** + * Translates the camera's position by amount along the camera's up vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveUp(amount?: number): void; + /** + * Translates the camera's position by amount along the opposite direction + * of the camera's up vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveDown(amount?: number): void; + /** + * Translates the camera's position by amount along the camera's right vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveRight(amount?: number): void; + /** + * Translates the camera's position by amount along the opposite direction + * of the camera's right vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveLeft(amount?: number): void; + /** + * Rotates the camera around its up vector by amount, in radians, in the opposite direction + * of its right vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookLeft(amount?: number): void; + /** + * Rotates the camera around its up vector by amount, in radians, in the direction + * of its right vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookRight(amount?: number): void; + /** + * Rotates the camera around its right vector by amount, in radians, in the direction + * of its up vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookUp(amount?: number): void; + /** + * Rotates the camera around its right vector by amount, in radians, in the opposite direction + * of its up vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookDown(amount?: number): void; + /** + * Rotate each of the camera's orientation vectors around axis by angle + * @param axis - The axis to rotate around. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultLookAmount. + */ + look(axis: Cartesian3, angle?: number): void; + /** + * Rotate the camera counter-clockwise around its direction vector by amount, in radians. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + twistLeft(amount?: number): void; + /** + * Rotate the camera clockwise around its direction vector by amount, in radians. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + twistRight(amount?: number): void; + /** + * Rotates the camera around axis by angle. The distance + * of the camera's position to the center of the camera's reference frame remains the same. + * @param axis - The axis to rotate around given in world coordinates. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotate(axis: Cartesian3, angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle downwards. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateDown(angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle upwards. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateUp(angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle to the right. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateRight(angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle to the left. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateLeft(angle?: number): void; + /** + * Zooms amount along the camera's view vector. + * @param [amount] - The amount to move. Defaults to defaultZoomAmount. + */ + zoomIn(amount?: number): void; + /** + * Zooms amount along the opposite direction of + * the camera's view vector. + * @param [amount] - The amount to move. Defaults to defaultZoomAmount. + */ + zoomOut(amount?: number): void; + /** + * Gets the magnitude of the camera position. In 3D, this is the vector magnitude. In 2D and + * Columbus view, this is the distance to the map. + * @returns The magnitude of the position. + */ + getMagnitude(): number; + /** + * Sets the camera position and orientation using a target and offset. The target must be given in + * world coordinates. The offset can be either a cartesian or heading/pitch/range in the local east-north-up reference frame centered at the target. + * If the offset is a cartesian, then it is an offset from the center of the reference frame defined by the transformation matrix. If the offset + * is heading/pitch/range, then the heading and the pitch angles are defined in the reference frame defined by the transformation matrix. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. + * + * In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the magnitude of the offset. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north. + * @example + * // 1. Using a cartesian offset + * var center = Cesium.Cartesian3.fromDegrees(-98.0, 40.0); + * viewer.camera.lookAt(center, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0)); + * + * // 2. Using a HeadingPitchRange offset + * var center = Cesium.Cartesian3.fromDegrees(-72.0, 40.0); + * var heading = Cesium.Math.toRadians(50.0); + * var pitch = Cesium.Math.toRadians(-20.0); + * var range = 5000.0; + * viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range)); + * @param target - The target position in world coordinates. + * @param offset - The offset from the target in the local east-north-up reference frame centered at the target. + */ + lookAt(target: Cartesian3, offset: Cartesian3 | HeadingPitchRange): void; + /** + * Sets the camera position and orientation using a target and transformation matrix. The offset can be either a cartesian or heading/pitch/range. + * If the offset is a cartesian, then it is an offset from the center of the reference frame defined by the transformation matrix. If the offset + * is heading/pitch/range, then the heading and the pitch angles are defined in the reference frame defined by the transformation matrix. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. + * + * In 2D, there must be a top down view. The camera will be placed above the center of the reference frame. The height above the + * target will be the magnitude of the offset. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north. + * @example + * // 1. Using a cartesian offset + * var transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-98.0, 40.0)); + * viewer.camera.lookAtTransform(transform, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0)); + * + * // 2. Using a HeadingPitchRange offset + * var transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-72.0, 40.0)); + * var heading = Cesium.Math.toRadians(50.0); + * var pitch = Cesium.Math.toRadians(-20.0); + * var range = 5000.0; + * viewer.camera.lookAtTransform(transform, new Cesium.HeadingPitchRange(heading, pitch, range)); + * @param transform - The transformation matrix defining the reference frame. + * @param [offset] - The offset from the target in a reference frame centered at the target. + */ + lookAtTransform(transform: Matrix4, offset?: Cartesian3 | HeadingPitchRange): void; + /** + * Get the camera position needed to view a rectangle on an ellipsoid or map + * @param rectangle - The rectangle to view. + * @param [result] - The camera position needed to view the rectangle + * @returns The camera position needed to view the rectangle + */ + getRectangleCameraCoordinates(rectangle: Rectangle, result?: Cartesian3): Cartesian3; + /** + * Pick an ellipsoid or map. + * @example + * var canvas = viewer.scene.canvas; + * var center = new Cesium.Cartesian2(canvas.clientWidth / 2.0, canvas.clientHeight / 2.0); + * var ellipsoid = viewer.scene.globe.ellipsoid; + * var result = viewer.camera.pickEllipsoid(center, ellipsoid); + * @param windowPosition - The x and y coordinates of a pixel. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid to pick. + * @param [result] - The object onto which to store the result. + * @returns If the ellipsoid or map was picked, + * returns the point on the surface of the ellipsoid or map in world + * coordinates. If the ellipsoid or map was not picked, returns undefined. + */ + pickEllipsoid(windowPosition: Cartesian2, ellipsoid?: Ellipsoid, result?: Cartesian3): Cartesian3 | undefined; + /** + * Create a ray from the camera position through the pixel at windowPosition + * in world coordinates. + * @param windowPosition - The x and y coordinates of a pixel. + * @param [result] - The object onto which to store the result. + * @returns Returns the {@link Cartesian3} position and direction of the ray. + */ + getPickRay(windowPosition: Cartesian2, result?: Ray): Ray; + /** + * Return the distance from the camera to the front of the bounding sphere. + * @param boundingSphere - The bounding sphere in world coordinates. + * @returns The distance to the bounding sphere. + */ + distanceToBoundingSphere(boundingSphere: BoundingSphere): number; + /** + * Return the pixel size in meters. + * @param boundingSphere - The bounding sphere in world coordinates. + * @param drawingBufferWidth - The drawing buffer width. + * @param drawingBufferHeight - The drawing buffer height. + * @returns The pixel size in meters. + */ + getPixelSize(boundingSphere: BoundingSphere, drawingBufferWidth: number, drawingBufferHeight: number): number; + /** + * Cancels the current camera flight and leaves the camera at its current location. + * If no flight is in progress, this this function does nothing. + */ + cancelFlight(): void; + /** + * Completes the current camera flight and moves the camera immediately to its final destination. + * If no flight is in progress, this this function does nothing. + */ + completeFlight(): void; + /** + * Flies the camera from its current position to a new position. + * @example + * // 1. Fly to a position with a top-down view + * viewer.camera.flyTo({ + * destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0) + * }); + * + * // 2. Fly to a Rectangle with a top-down view + * viewer.camera.flyTo({ + * destination : Cesium.Rectangle.fromDegrees(west, south, east, north) + * }); + * + * // 3. Fly to a position with an orientation using unit vectors. + * viewer.camera.flyTo({ + * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0), + * orientation : { + * direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734), + * up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339) + * } + * }); + * + * // 4. Fly to a position with an orientation using heading, pitch and roll. + * viewer.camera.flyTo({ + * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0), + * orientation : { + * heading : Cesium.Math.toRadians(175.0), + * pitch : Cesium.Math.toRadians(-35.0), + * roll : 0.0 + * } + * }); + * @param options - Object with the following properties: + * @param options.destination - The final position of the camera in WGS84 (world) coordinates or a rectangle that would be visible from a top-down view. + * @param [options.orientation] - An object that contains either direction and up properties or heading, pitch and roll properties. By default, the direction will point + * towards the center of the frame in 3D and in the negative z direction in Columbus view. The up direction will point towards local north in 3D and in the positive + * y direction in Columbus view. Orientation is not used in 2D when in infinite scrolling mode. + * @param [options.duration] - The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight. + * @param [options.complete] - The function to execute when the flight is complete. + * @param [options.cancel] - The function to execute if the flight is cancelled. + * @param [options.endTransform] - Transform matrix representing the reference frame the camera will be in when the flight is completed. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.pitchAdjustHeight] - If camera flyes higher than that value, adjust pitch duiring the flight to look down, and keep Earth in viewport. + * @param [options.flyOverLongitude] - There are always two ways between 2 points on globe. This option force camera to choose fight direction to fly over that longitude. + * @param [options.flyOverLongitudeWeight] - Fly over the lon specifyed via flyOverLongitude only if that way is not longer than short way times flyOverLongitudeWeight. + * @param [options.convert] - Whether to convert the destination from world coordinates to scene coordinates (only relevant when not using 3D). Defaults to true. + * @param [options.easingFunction] - Controls how the time is interpolated over the duration of the flight. + */ + flyTo(options: { + destination: Cartesian3 | Rectangle; + orientation?: any; + duration?: number; + complete?: Camera.FlightCompleteCallback; + cancel?: Camera.FlightCancelledCallback; + endTransform?: Matrix4; + maximumHeight?: number; + pitchAdjustHeight?: number; + flyOverLongitude?: number; + flyOverLongitudeWeight?: number; + convert?: boolean; + easingFunction?: EasingFunction.Callback; + }): void; + /** + * Sets the camera so that the current view contains the provided bounding sphere. + * + *

    The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

    + * + *

    In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

    + * @param boundingSphere - The bounding sphere to view, in world coordinates. + * @param [offset] - The offset from the target in the local east-north-up reference frame centered at the target. + */ + viewBoundingSphere(boundingSphere: BoundingSphere, offset?: HeadingPitchRange): void; + /** + * Flies the camera to a location where the current view contains the provided bounding sphere. + * + *

    The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

    + * + *

    In 2D and Columbus View, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be aligned to local north.

    + * @param boundingSphere - The bounding sphere to view, in world coordinates. + * @param [options] - Object with the following properties: + * @param [options.duration] - The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight. + * @param [options.offset] - The offset from the target in the local east-north-up reference frame centered at the target. + * @param [options.complete] - The function to execute when the flight is complete. + * @param [options.cancel] - The function to execute if the flight is cancelled. + * @param [options.endTransform] - Transform matrix representing the reference frame the camera will be in when the flight is completed. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.pitchAdjustHeight] - If camera flyes higher than that value, adjust pitch duiring the flight to look down, and keep Earth in viewport. + * @param [options.flyOverLongitude] - There are always two ways between 2 points on globe. This option force camera to choose fight direction to fly over that longitude. + * @param [options.flyOverLongitudeWeight] - Fly over the lon specifyed via flyOverLongitude only if that way is not longer than short way times flyOverLongitudeWeight. + * @param [options.easingFunction] - Controls how the time is interpolated over the duration of the flight. + */ + flyToBoundingSphere(boundingSphere: BoundingSphere, options?: { + duration?: number; + offset?: HeadingPitchRange; + complete?: Camera.FlightCompleteCallback; + cancel?: Camera.FlightCancelledCallback; + endTransform?: Matrix4; + maximumHeight?: number; + pitchAdjustHeight?: number; + flyOverLongitude?: number; + flyOverLongitudeWeight?: number; + easingFunction?: EasingFunction.Callback; + }): void; + /** + * Computes the approximate visible rectangle on the ellipsoid. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid that you want to know the visible region. + * @param [result] - The rectangle in which to store the result + * @returns The visible rectangle or undefined if the ellipsoid isn't visible at all. + */ + computeViewRectangle(ellipsoid?: Ellipsoid, result?: Rectangle): Rectangle | undefined; + /** + * Switches the frustum/projection to perspective. + * + * This function is a no-op in 2D which must always be orthographic. + */ + switchToPerspectiveFrustum(): void; + /** + * Switches the frustum/projection to orthographic. + * + * This function is a no-op in 2D which will always be orthographic. + */ + switchToOrthographicFrustum(): void; +} + +export namespace Camera { + /** + * A function that will execute when a flight completes. + */ + type FlightCompleteCallback = () => void; + /** + * A function that will execute when a flight is cancelled. + */ + type FlightCancelledCallback = () => void; +} + +/** + * Aggregates input events. For example, suppose the following inputs are received between frames: + * left mouse button down, mouse move, mouse move, left mouse button up. These events will be aggregated into + * one event with a start and end position of the mouse. + * @param [canvas = document] - The element to handle events for. + */ +export class CameraEventAggregator { + constructor(canvas?: HTMLCanvasElement); + /** + * Gets the current mouse position. + */ + currentMousePosition: Cartesian2; + /** + * Gets whether any mouse button is down, a touch has started, or the wheel has been moved. + */ + anyButtonDown: boolean; + /** + * Gets if a mouse button down or touch has started and has been moved. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns Returns true if a mouse button down or touch has started and has been moved; otherwise, false + */ + isMoving(type: CameraEventType, modifier?: KeyboardEventModifier): boolean; + /** + * Gets the aggregated start and end position of the current event. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns An object with two {@link Cartesian2} properties: startPosition and endPosition. + */ + getMovement(type: CameraEventType, modifier?: KeyboardEventModifier): any; + /** + * Gets the start and end position of the last move event (not the aggregated event). + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns An object with two {@link Cartesian2} properties: startPosition and endPosition or undefined. + */ + getLastMovement(type: CameraEventType, modifier?: KeyboardEventModifier): any | undefined; + /** + * Gets whether the mouse button is down or a touch has started. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns Whether the mouse button is down or a touch has started. + */ + isButtonDown(type: CameraEventType, modifier?: KeyboardEventModifier): boolean; + /** + * Gets the mouse position that started the aggregation. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns The mouse position. + */ + getStartMousePosition(type: CameraEventType, modifier?: KeyboardEventModifier): Cartesian2; + /** + * Gets the time the button was pressed or the touch was started. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns The time the button was pressed or the touch was started. + */ + getButtonPressTime(type: CameraEventType, modifier?: KeyboardEventModifier): Date; + /** + * Gets the time the button was released or the touch was ended. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns The time the button was released or the touch was ended. + */ + getButtonReleaseTime(type: CameraEventType, modifier?: KeyboardEventModifier): Date; + /** + * Signals that all of the events have been handled and the aggregator should be reset to handle new events. + */ + reset(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes mouse listeners held by this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * handler = handler && handler.destroy(); + */ + destroy(): void; +} + +/** + * Enumerates the available input for interacting with the camera. + */ +export enum CameraEventType { + /** + * A left mouse button press followed by moving the mouse and releasing the button. + */ + LEFT_DRAG = 0, + /** + * A right mouse button press followed by moving the mouse and releasing the button. + */ + RIGHT_DRAG = 1, + /** + * A middle mouse button press followed by moving the mouse and releasing the button. + */ + MIDDLE_DRAG = 2, + /** + * Scrolling the middle mouse button. + */ + WHEEL = 3, + /** + * A two-finger touch on a touch surface. + */ + PINCH = 4 +} + +/** + * A tile in a {@link Cesium3DTileset}. When a tile is first created, its content is not loaded; + * the content is loaded on-demand when needed based on the view. + *

    + * Do not construct this directly, instead access tiles through {@link Cesium3DTileset#tileVisible}. + *

    + */ +export class Cesium3DTile { + constructor(); + /** + * The local transform of this tile. + */ + transform: Matrix4; + /** + * The final computed transform of this tile. + */ + readonly computedTransform: Matrix4; + /** + * The error, in meters, introduced if this tile is rendered and its children are not. + * This is used to compute screen space error, i.e., the error measured in pixels. + */ + readonly geometricError: number; + /** + * Gets the tile's children. + */ + readonly children: Cesium3DTile[]; + /** + * This tile's parent or undefined if this tile is the root. + *

    + * When a tile's content points to an external tileset JSON file, the external tileset's + * root tile's parent is not undefined; instead, the parent references + * the tile (with its content pointing to an external tileset JSON file) as if the two tilesets were merged. + *

    + */ + readonly parent: Cesium3DTile; + /** + * The time in seconds after the tile's content is ready when the content expires and new content is requested. + */ + expireDuration: number; + /** + * The date when the content expires and new content is requested. + */ + expireDate: JulianDate; + /** + * The tileset containing this tile. + */ + readonly tileset: Cesium3DTileset; + /** + * The tile's content. This represents the actual tile's payload, + * not the content's metadata in the tileset JSON file. + */ + readonly content: Cesium3DTileContent; + /** + * Get the bounding sphere derived from the tile's bounding volume. + */ + readonly boundingSphere: BoundingSphere; + /** + * Returns the extras property in the tileset JSON for this tile, which contains application specific metadata. + * Returns undefined if extras does not exist. + */ + readonly extras: any; +} + +/** + * Defines how per-feature colors set from the Cesium API or declarative styling blend with the source colors from + * the original feature, e.g. glTF material or per-point color in the tile. + *

    + * When REPLACE or MIX are used and the source color is a glTF material, the technique must assign the + * _3DTILESDIFFUSE semantic to the diffuse color parameter. Otherwise only HIGHLIGHT is supported. + *

    + *

    + * A feature whose color evaluates to white (1.0, 1.0, 1.0) is always rendered without color blending, regardless of the + * tileset's color blend mode. + *

    + *
    
    + * "techniques": {
    + *   "technique0": {
    + *     "parameters": {
    + *       "diffuse": {
    + *         "semantic": "_3DTILESDIFFUSE",
    + *         "type": 35666
    + *       }
    + *     }
    + *   }
    + * }
    + * 
    + */ +export enum Cesium3DTileColorBlendMode { + /** + * Multiplies the source color by the feature color. + */ + HIGHLIGHT = 0, + /** + * Replaces the source color with the feature color. + */ + REPLACE = 1, + /** + * Blends the source color and feature color together. + */ + MIX = 2 +} + +/** + * The content of a tile in a {@link Cesium3DTileset}. + *

    + * Derived classes of this interface provide access to individual features in the tile. + * Access derived objects through {@link Cesium3DTile#content}. + *

    + *

    + * This type describes an interface and is not intended to be instantiated directly. + *

    + */ +export class Cesium3DTileContent { + constructor(); + /** + * Gets the number of features in the tile. + */ + readonly featuresLength: number; + /** + * Gets the number of points in the tile. + *

    + * Only applicable for tiles with Point Cloud content. This is different than {@link Cesium3DTileContent#featuresLength} which + * equals the number of groups of points as distinguished by the BATCH_ID feature table semantic. + *

    + */ + readonly pointsLength: number; + /** + * Gets the number of triangles in the tile. + */ + readonly trianglesLength: number; + /** + * Gets the tile's geometry memory in bytes. + */ + readonly geometryByteLength: number; + /** + * Gets the tile's texture memory in bytes. + */ + readonly texturesByteLength: number; + /** + * Gets the amount of memory used by the batch table textures, in bytes. + */ + readonly batchTableByteLength: number; + /** + * Gets the array of {@link Cesium3DTileContent} objects that represent the + * content a composite's inner tiles, which can also be composites. + */ + readonly innerContents: any[]; + /** + * Gets the promise that will be resolved when the tile's content is ready to render. + */ + readonly readyPromise: Promise; + /** + * Gets the tileset for this tile. + */ + readonly tileset: Cesium3DTileset; + /** + * Gets the tile containing this content. + */ + readonly tile: Cesium3DTile; + /** + * Gets the url of the tile's content. + */ + readonly url: string; + /** + * Determines if the tile's batch table has a property. If it does, each feature in + * the tile will have the property. + * @param batchId - The batchId for the feature. + * @param name - The case-sensitive name of the property. + * @returns true if the property exists; otherwise, false. + */ + hasProperty(batchId: number, name: string): boolean; + /** + * Returns the {@link Cesium3DTileFeature} object for the feature with the + * given batchId. This object is used to get and modify the + * feature's properties. + *

    + * Features in a tile are ordered by batchId, an index used to retrieve their metadata from the batch table. + *

    + * @param batchId - The batchId for the feature. + * @returns The corresponding {@link Cesium3DTileFeature} object. + */ + getFeature(batchId: number): Cesium3DTileFeature; +} + +/** + * A feature of a {@link Cesium3DTileset}. + *

    + * Provides access to a feature's properties stored in the tile's batch table, as well + * as the ability to show/hide a feature and change its highlight color via + * {@link Cesium3DTileFeature#show} and {@link Cesium3DTileFeature#color}, respectively. + *

    + *

    + * Modifications to a Cesium3DTileFeature object have the lifetime of the tile's + * content. If the tile's content is unloaded, e.g., due to it going out of view and needing + * to free space in the cache for visible tiles, listen to the {@link Cesium3DTileset#tileUnload} event to save any + * modifications. Also listen to the {@link Cesium3DTileset#tileVisible} event to reapply any modifications. + *

    + *

    + * Do not construct this directly. Access it through {@link Cesium3DTileContent#getFeature} + * or picking using {@link Scene#pick} and {@link Scene#pickPosition}. + *

    + * @example + * // On mouse over, display all the properties for a feature in the console log. + * handler.setInputAction(function(movement) { + * var feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.Cesium3DTileFeature) { + * var propertyNames = feature.getPropertyNames(); + * var length = propertyNames.length; + * for (var i = 0; i < length; ++i) { + * var propertyName = propertyNames[i]; + * console.log(propertyName + ': ' + feature.getProperty(propertyName)); + * } + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + */ +export class Cesium3DTileFeature { + constructor(); + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + */ + show: boolean; + /** + * Gets or sets the highlight color multiplied with the feature's color. When + * this is white, the feature's color is not changed. This is set for all features + * when a style's color is evaluated. + */ + color: Color; + /** + * Gets the tileset containing the feature. + */ + readonly tileset: Cesium3DTileset; + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the tileset containing the feature. + */ + readonly primitive: Cesium3DTileset; + /** + * Returns whether the feature contains this property. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param name - The case-sensitive name of the property. + * @returns Whether the feature contains this property. + */ + hasProperty(name: string): boolean; + /** + * Returns an array of property names for the feature. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param [results] - An array into which to store the results. + * @returns The names of the feature's properties. + */ + getPropertyNames(results?: string[]): string[]; + /** + * Returns a copy of the value of the feature's property with the given name. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @example + * // Display all the properties for a feature in the console log. + * var propertyNames = feature.getPropertyNames(); + * var length = propertyNames.length; + * for (var i = 0; i < length; ++i) { + * var propertyName = propertyNames[i]; + * console.log(propertyName + ': ' + feature.getProperty(propertyName)); + * } + * @param name - The case-sensitive name of the property. + * @returns The value of the property or undefined if the property does not exist. + */ + getProperty(name: string): any; + /** + * Sets the value of the feature's property with the given name. + *

    + * If a property with the given name doesn't exist, it is created. + *

    + * @example + * var height = feature.getProperty('Height'); // e.g., the height of a building + * @example + * var name = 'clicked'; + * if (feature.getProperty(name)) { + * console.log('already clicked'); + * } else { + * feature.setProperty(name, true); + * console.log('first click'); + * } + * @param name - The case-sensitive name of the property. + * @param value - The value of the property that will be copied. + */ + setProperty(name: string, value: any): void; +} + +/** + * A point feature of a {@link Cesium3DTileset}. + *

    + * Provides access to a feature's properties stored in the tile's batch table, as well + * as the ability to show/hide a feature and change its point properties + *

    + *

    + * Modifications to a Cesium3DTilePointFeature object have the lifetime of the tile's + * content. If the tile's content is unloaded, e.g., due to it going out of view and needing + * to free space in the cache for visible tiles, listen to the {@link Cesium3DTileset#tileUnload} event to save any + * modifications. Also listen to the {@link Cesium3DTileset#tileVisible} event to reapply any modifications. + *

    + *

    + * Do not construct this directly. Access it through {@link Cesium3DTileContent#getFeature} + * or picking using {@link Scene#pick} and {@link Scene#pickPosition}. + *

    + * @example + * // On mouse over, display all the properties for a feature in the console log. + * handler.setInputAction(function(movement) { + * var feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.Cesium3DTilePointFeature) { + * var propertyNames = feature.getPropertyNames(); + * var length = propertyNames.length; + * for (var i = 0; i < length; ++i) { + * var propertyName = propertyNames[i]; + * console.log(propertyName + ': ' + feature.getProperty(propertyName)); + * } + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + */ +export class Cesium3DTilePointFeature { + constructor(); + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + */ + show: boolean; + /** + * Gets or sets the color of the point of this feature. + *

    + * Only applied when image is undefined. + *

    + */ + color: Color; + /** + * Gets or sets the point size of this feature. + *

    + * Only applied when image is undefined. + *

    + */ + pointSize: number; + /** + * Gets or sets the point outline color of this feature. + *

    + * Only applied when image is undefined. + *

    + */ + pointOutlineColor: Color; + /** + * Gets or sets the point outline width in pixels of this feature. + *

    + * Only applied when image is undefined. + *

    + */ + pointOutlineWidth: number; + /** + * Gets or sets the label color of this feature. + *

    + * The color will be applied to the label if labelText is defined. + *

    + */ + labelColor: Color; + /** + * Gets or sets the label outline color of this feature. + *

    + * The outline color will be applied to the label if labelText is defined. + *

    + */ + labelOutlineColor: Color; + /** + * Gets or sets the outline width in pixels of this feature. + *

    + * The outline width will be applied to the point if labelText is defined. + *

    + */ + labelOutlineWidth: number; + /** + * Gets or sets the font of this feature. + *

    + * Only applied when the labelText is defined. + *

    + */ + font: string; + /** + * Gets or sets the fill and outline style of this feature. + *

    + * Only applied when labelText is defined. + *

    + */ + labelStyle: LabelStyle; + /** + * Gets or sets the text for this feature. + */ + labelText: string; + /** + * Gets or sets the background color of the text for this feature. + *

    + * Only applied when labelText is defined. + *

    + */ + backgroundColor: Color; + /** + * Gets or sets the background padding of the text for this feature. + *

    + * Only applied when labelText is defined. + *

    + */ + backgroundPadding: Cartesian2; + /** + * Gets or sets whether to display the background of the text for this feature. + *

    + * Only applied when labelText is defined. + *

    + */ + backgroundEnabled: boolean; + /** + * Gets or sets the near and far scaling properties for this feature. + */ + scaleByDistance: NearFarScalar; + /** + * Gets or sets the near and far translucency properties for this feature. + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets the condition specifying at what distance from the camera that this feature will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the height offset in meters of this feature. + */ + heightOffset: number; + /** + * Gets or sets whether the anchor line is displayed. + *

    + * Only applied when heightOffset is defined. + *

    + */ + anchorLineEnabled: boolean; + /** + * Gets or sets the color for the anchor line. + *

    + * Only applied when heightOffset is defined. + *

    + */ + anchorLineColor: Color; + /** + * Gets or sets the image of this feature. + */ + image: string; + /** + * Gets or sets the distance where depth testing will be disabled. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the horizontal origin of this point, which determines if the point is + * to the left, center, or right of its anchor position. + */ + horizontalOrigin: HorizontalOrigin; + /** + * Gets or sets the vertical origin of this point, which determines if the point is + * to the bottom, center, or top of its anchor position. + */ + verticalOrigin: VerticalOrigin; + /** + * Gets or sets the horizontal origin of this point's text, which determines if the point's text is + * to the left, center, or right of its anchor position. + */ + labelHorizontalOrigin: HorizontalOrigin; + /** + * Get or sets the vertical origin of this point's text, which determines if the point's text is + * to the bottom, center, top, or baseline of it's anchor point. + */ + labelVerticalOrigin: VerticalOrigin; + /** + * Gets the tileset containing the feature. + */ + readonly tileset: Cesium3DTileset; + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the tileset containing the feature. + */ + readonly primitive: Cesium3DTileset; + /** + * Returns whether the feature contains this property. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param name - The case-sensitive name of the property. + * @returns Whether the feature contains this property. + */ + hasProperty(name: string): boolean; + /** + * Returns an array of property names for the feature. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param [results] - An array into which to store the results. + * @returns The names of the feature's properties. + */ + getPropertyNames(results?: string[]): string[]; + /** + * Returns a copy of the value of the feature's property with the given name. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @example + * // Display all the properties for a feature in the console log. + * var propertyNames = feature.getPropertyNames(); + * var length = propertyNames.length; + * for (var i = 0; i < length; ++i) { + * var propertyName = propertyNames[i]; + * console.log(propertyName + ': ' + feature.getProperty(propertyName)); + * } + * @param name - The case-sensitive name of the property. + * @returns The value of the property or undefined if the property does not exist. + */ + getProperty(name: string): any; + /** + * Sets the value of the feature's property with the given name. + *

    + * If a property with the given name doesn't exist, it is created. + *

    + * @example + * var height = feature.getProperty('Height'); // e.g., the height of a building + * @example + * var name = 'clicked'; + * if (feature.getProperty(name)) { + * console.log('already clicked'); + * } else { + * feature.setProperty(name, true); + * console.log('first click'); + * } + * @param name - The case-sensitive name of the property. + * @param value - The value of the property that will be copied. + */ + setProperty(name: string, value: any): void; +} + +/** + * A style that is applied to a {@link Cesium3DTileset}. + *

    + * Evaluates an expression defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}. + *

    + * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Height} >= 100', 'color("purple", 0.5)'], + * ['${Height} >= 50', 'color("red")'], + * ['true', 'color("blue")'] + * ] + * }, + * show : '${Height} > 0', + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : 'vec4(${Temperature})', + * pointSize : '${Temperature} * 2.0' + * }); + * @param [style] - The url of a style or an object defining a style. + */ +export class Cesium3DTileStyle { + constructor(style?: Resource | string | any); + /** + * Gets the object defining the style using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}. + */ + readonly style: any; + /** + * When true, the style is ready and its expressions can be evaluated. When + * a style is constructed with an object, as opposed to a url, this is true immediately. + */ + readonly ready: boolean; + /** + * Gets the promise that will be resolved when the the style is ready and its expressions can be evaluated. + */ + readonly readyPromise: Promise; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's show property. Alternatively a boolean, string, or object defining a show style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return or convert to a Boolean. + *

    + *

    + * This expression is applicable to all tile formats. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * show : '(regExp("^Chest").test(${County})) && (${YearBuilt} >= 1970)' + * }); + * style.show.evaluate(feature); // returns true or false depending on the feature's properties + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a custom function + * style.show = { + * evaluate : function(feature) { + * return true; + * } + * }; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a boolean + * style.show = true; + * }; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a string + * style.show = '${Height} > 0'; + * }; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a condition + * style.show = { + * conditions: [ + * ['${height} > 2', 'false'], + * ['true', 'true'] + * ]; + * }; + */ + show: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's color property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Color. + *

    + *

    + * This expression is applicable to all tile formats. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * color : '(${Temperature} > 90) ? color("red") : color("white")' + * }); + * style.color.evaluateColor(feature, result); // returns a Cesium.Color object + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a custom function + * style.color = { + * evaluateColor : function(feature, result) { + * return Cesium.Color.clone(Cesium.Color.WHITE, result); + * } + * }; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a string + * style.color = 'color("blue")'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a condition + * style.color = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + color: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's pointSize property. Alternatively a string or object defining a point size style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Number. + *

    + *

    + * This expression is only applicable to point features in a Vector tile or a Point Cloud tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * pointSize : '(${Temperature} > 90) ? 2.0 : 1.0' + * }); + * style.pointSize.evaluate(feature); // returns a Number + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a custom function + * style.pointSize = { + * evaluate : function(feature) { + * return 1.0; + * } + * }; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a number + * style.pointSize = 1.0; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a string + * style.pointSize = '${height} / 10'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a condition + * style.pointSize = { + * conditions : [ + * ['${height} > 2', '1.0'], + * ['true', '2.0'] + * ] + * }; + */ + pointSize: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's pointOutlineColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Color. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineColor expression with a string + * style.pointOutlineColor = 'color("blue")'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineColor expression with a condition + * style.pointOutlineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + pointOutlineColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's pointOutlineWidth property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Number. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineWidth expression with a string + * style.pointOutlineWidth = '5'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineWidth expression with a condition + * style.pointOutlineWidth = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + pointOutlineWidth: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Color. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelColor expression with a string + * style.labelColor = 'color("blue")'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelColor expression with a condition + * style.labelColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + labelColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelOutlineColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Color. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineColor expression with a string + * style.labelOutlineColor = 'color("blue")'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineColor expression with a condition + * style.labelOutlineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + labelOutlineColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelOutlineWidth property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Number. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineWidth expression with a string + * style.labelOutlineWidth = '5'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineWidth expression with a condition + * style.labelOutlineWidth = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + labelOutlineWidth: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's font property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a String. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * font : '(${Temperature} > 90) ? "30px Helvetica" : "24px Helvetica"' + * }); + * style.font.evaluate(feature); // returns a String + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override font expression with a custom function + * style.font = { + * evaluate : function(feature) { + * return '24px Helvetica'; + * } + * }; + */ + font: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's label style property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a LabelStyle. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * labelStyle : '(${Temperature} > 90) ? ' + LabelStyle.FILL_AND_OUTLINE + ' : ' + LabelStyle.FILL + * }); + * style.labelStyle.evaluate(feature); // returns a LabelStyle + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelStyle expression with a custom function + * style.labelStyle = { + * evaluate : function(feature) { + * return LabelStyle.FILL; + * } + * }; + */ + labelStyle: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelText property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a String. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * labelText : '(${Temperature} > 90) ? ">90" : "<=90"' + * }); + * style.labelText.evaluate(feature); // returns a String + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelText expression with a custom function + * style.labelText = { + * evaluate : function(feature) { + * return 'Example label text'; + * } + * }; + */ + labelText: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's backgroundColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Color. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundColor expression with a string + * style.backgroundColor = 'color("blue")'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundColor expression with a condition + * style.backgroundColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + backgroundColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's backgroundPadding property. Alternatively a string or object defining a vec2 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Cartesian2. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundPadding expression with a string + * style.backgroundPadding = 'vec2(5.0, 7.0)'; + * style.backgroundPadding.evaluate(feature); // returns a Cartesian2 + */ + backgroundPadding: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's backgroundEnabled property. Alternatively a string or object defining a boolean style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Boolean. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundEnabled expression with a string + * style.backgroundEnabled = 'true'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundEnabled expression with a condition + * style.backgroundEnabled = { + * conditions : [ + * ['${height} > 2', 'true'], + * ['true', 'false'] + * ] + * }; + */ + backgroundEnabled: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's scaleByDistance property. Alternatively a string or object defining a vec4 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Cartesian4. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override scaleByDistance expression with a string + * style.scaleByDistance = 'vec4(1.5e2, 2.0, 1.5e7, 0.5)'; + * style.scaleByDistance.evaluate(feature); // returns a Cartesian4 + */ + scaleByDistance: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's translucencyByDistance property. Alternatively a string or object defining a vec4 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Cartesian4. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override translucencyByDistance expression with a string + * style.translucencyByDistance = 'vec4(1.5e2, 1.0, 1.5e7, 0.2)'; + * style.translucencyByDistance.evaluate(feature); // returns a Cartesian4 + */ + translucencyByDistance: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's distanceDisplayCondition property. Alternatively a string or object defining a vec2 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Cartesian2. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override distanceDisplayCondition expression with a string + * style.distanceDisplayCondition = 'vec2(0.0, 5.5e6)'; + * style.distanceDisplayCondition.evaluate(feature); // returns a Cartesian2 + */ + distanceDisplayCondition: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's heightOffset property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Number. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override heightOffset expression with a string + * style.heightOffset = '2.0'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override heightOffset expression with a condition + * style.heightOffset = { + * conditions : [ + * ['${height} > 2', '4.0'], + * ['true', '2.0'] + * ] + * }; + */ + heightOffset: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's anchorLineEnabled property. Alternatively a string or object defining a boolean style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Boolean. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineEnabled expression with a string + * style.anchorLineEnabled = 'true'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineEnabled expression with a condition + * style.anchorLineEnabled = { + * conditions : [ + * ['${height} > 2', 'true'], + * ['true', 'false'] + * ] + * }; + */ + anchorLineEnabled: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's anchorLineColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Color. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineColor expression with a string + * style.anchorLineColor = 'color("blue")'; + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineColor expression with a condition + * style.anchorLineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + anchorLineColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's image property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a String. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * image : '(${Temperature} > 90) ? "/url/to/image1" : "/url/to/image2"' + * }); + * style.image.evaluate(feature); // returns a String + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override image expression with a custom function + * style.image = { + * evaluate : function(feature) { + * return '/url/to/image'; + * } + * }; + */ + image: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's disableDepthTestDistance property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a Number. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override disableDepthTestDistance expression with a string + * style.disableDepthTestDistance = '1000.0'; + * style.disableDepthTestDistance.evaluate(feature); // returns a Number + */ + disableDepthTestDistance: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's horizontalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a HorizontalOrigin. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * horizontalOrigin : HorizontalOrigin.LEFT + * }); + * style.horizontalOrigin.evaluate(feature); // returns a HorizontalOrigin + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override horizontalOrigin expression with a custom function + * style.horizontalOrigin = { + * evaluate : function(feature) { + * return HorizontalOrigin.CENTER; + * } + * }; + */ + horizontalOrigin: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's verticalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a VerticalOrigin. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * verticalOrigin : VerticalOrigin.TOP + * }); + * style.verticalOrigin.evaluate(feature); // returns a VerticalOrigin + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override verticalOrigin expression with a custom function + * style.verticalOrigin = { + * evaluate : function(feature) { + * return VerticalOrigin.CENTER; + * } + * }; + */ + verticalOrigin: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelHorizontalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a HorizontalOrigin. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * labelHorizontalOrigin : HorizontalOrigin.LEFT + * }); + * style.labelHorizontalOrigin.evaluate(feature); // returns a HorizontalOrigin + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelHorizontalOrigin expression with a custom function + * style.labelHorizontalOrigin = { + * evaluate : function(feature) { + * return HorizontalOrigin.CENTER; + * } + * }; + */ + labelHorizontalOrigin: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelVerticalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

    + * The expression must return a VerticalOrigin. + *

    + *

    + * This expression is only applicable to point features in a Vector tile. + *

    + * @example + * var style = new Cesium3DTileStyle({ + * labelVerticalOrigin : VerticalOrigin.TOP + * }); + * style.labelVerticalOrigin.evaluate(feature); // returns a VerticalOrigin + * @example + * var style = new Cesium.Cesium3DTileStyle(); + * // Override labelVerticalOrigin expression with a custom function + * style.labelVerticalOrigin = { + * evaluate : function(feature) { + * return VerticalOrigin.CENTER; + * } + * }; + */ + labelVerticalOrigin: StyleExpression; + /** + * Gets or sets the object containing application-specific expression that can be explicitly + * evaluated, e.g., for display in a UI. + * @example + * var style = new Cesium3DTileStyle({ + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + * style.meta.description.evaluate(feature); // returns a String with the substituted variables + */ + meta: StyleExpression; +} + +/** + * A {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification|3D Tiles tileset}, + * used for streaming massive heterogeneous 3D geospatial datasets. + * @example + * var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({ + * url : 'http://localhost:8002/tilesets/Seattle/tileset.json' + * })); + * @example + * // Common setting for the skipLevelOfDetail optimization + * var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({ + * url : 'http://localhost:8002/tilesets/Seattle/tileset.json', + * skipLevelOfDetail : true, + * baseScreenSpaceError : 1024, + * skipScreenSpaceErrorFactor : 16, + * skipLevels : 1, + * immediatelyLoadDesiredLevelOfDetail : false, + * loadSiblings : false, + * cullWithChildrenBounds : true + * })); + * @example + * // Common settings for the dynamicScreenSpaceError optimization + * var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({ + * url : 'http://localhost:8002/tilesets/Seattle/tileset.json', + * dynamicScreenSpaceError : true, + * dynamicScreenSpaceErrorDensity : 0.00278, + * dynamicScreenSpaceErrorFactor : 4.0, + * dynamicScreenSpaceErrorHeightFalloff : 0.25 + * })); + * @param options - Object with the following properties: + * @param options.url - The url to a tileset JSON file. + * @param [options.show = true] - Determines if the tileset will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - A 4x4 transformation matrix that transforms the tileset's root tile. + * @param [options.shadows = ShadowMode.ENABLED] - Determines whether the tileset casts or receives shadows from light sources. + * @param [options.maximumScreenSpaceError = 16] - The maximum screen space error used to drive level of detail refinement. + * @param [options.maximumMemoryUsage = 512] - The maximum amount of memory in MB that can be used by the tileset. + * @param [options.cullWithChildrenBounds = true] - Optimization option. Whether to cull tiles using the union of their children bounding volumes. + * @param [options.cullRequestsWhileMoving = true] - Optimization option. Don't request tiles that will likely be unused when they come back because of the camera's movement. This optimization only applies to stationary tilesets. + * @param [options.cullRequestsWhileMovingMultiplier = 60.0] - Optimization option. Multiplier used in culling requests while moving. Larger is more aggressive culling, smaller less aggressive culling. + * @param [options.preloadWhenHidden = false] - Preload tiles when tileset.show is false. Loads tiles as if the tileset is visible but does not render them. + * @param [options.preloadFlightDestinations = true] - Optimization option. Preload tiles at the camera's flight destination while the camera is in flight. + * @param [options.preferLeaves = false] - Optimization option. Prefer loading of leaves first. + * @param [options.dynamicScreenSpaceError = false] - Optimization option. Reduce the screen space error for tiles that are further away from the camera. + * @param [options.dynamicScreenSpaceErrorDensity = 0.00278] - Density used to adjust the dynamic screen space error, similar to fog density. + * @param [options.dynamicScreenSpaceErrorFactor = 4.0] - A factor used to increase the computed dynamic screen space error. + * @param [options.dynamicScreenSpaceErrorHeightFalloff = 0.25] - A ratio of the tileset's height at which the density starts to falloff. + * @param [options.progressiveResolutionHeightFraction = 0.3] - Optimization option. If between (0.0, 0.5], tiles at or above the screen space error for the reduced screen resolution of progressiveResolutionHeightFraction*screenHeight will be prioritized first. This can help get a quick layer of tiles down while full resolution tiles continue to load. + * @param [options.foveatedScreenSpaceError = true] - Optimization option. Prioritize loading tiles in the center of the screen by temporarily raising the screen space error for tiles around the edge of the screen. Screen space error returns to normal once all the tiles in the center of the screen as determined by the {@link Cesium3DTileset#foveatedConeSize} are loaded. + * @param [options.foveatedConeSize = 0.1] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and their screen space error. This is controlled by {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, disabling the effect. + * @param [options.foveatedMinimumScreenSpaceErrorRelaxation = 0.0] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. The screen space error will be raised starting with tileset value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}. + * @param [options.foveatedInterpolationCallback = Math.lerp] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how much to raise the screen space error for tiles outside the foveated cone, interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError} + * @param [options.foveatedTimeDelay = 0.2] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how long in seconds to wait after the camera stops moving before deferred tiles start loading in. This time delay prevents requesting tiles around the edges of the screen when the camera is moving. Setting this to 0.0 will immediately request all tiles in any given view. + * @param [options.skipLevelOfDetail = false] - Optimization option. Determines if level of detail skipping should be applied during the traversal. + * @param [options.baseScreenSpaceError = 1024] - When skipLevelOfDetail is true, the screen space error that must be reached before skipping levels of detail. + * @param [options.skipScreenSpaceErrorFactor = 16] - When skipLevelOfDetail is true, a multiplier defining the minimum screen space error to skip. Used in conjunction with skipLevels to determine which tiles to load. + * @param [options.skipLevels = 1] - When skipLevelOfDetail is true, a constant defining the minimum number of levels to skip when loading tiles. When it is 0, no levels are skipped. Used in conjunction with skipScreenSpaceErrorFactor to determine which tiles to load. + * @param [options.immediatelyLoadDesiredLevelOfDetail = false] - When skipLevelOfDetail is true, only tiles that meet the maximum screen space error will ever be downloaded. Skipping factors are ignored and just the desired tiles are loaded. + * @param [options.loadSiblings = false] - When skipLevelOfDetail is true, determines whether siblings of visible tiles are always downloaded during traversal. + * @param [options.clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset. + * @param [options.classificationType] - Determines whether terrain, 3D Tiles or both will be classified by this tileset. See {@link Cesium3DTileset#classificationType} for details about restrictions and limitations. + * @param [options.ellipsoid = Ellipsoid.WGS84] - The ellipsoid determining the size and shape of the globe. + * @param [options.pointCloudShading] - Options for constructing a {@link PointCloudShading} object to control point attenuation based on geometric error and lighting. + * @param [options.imageBasedLightingFactor = new Cartesian2(1.0, 1.0)] - Scales the diffuse and specular image-based lighting from the earth, sky, atmosphere and star skybox. + * @param [options.lightColor] - The light color when shading models. When undefined the scene's light color is used instead. + * @param [options.luminanceAtZenith = 0.2] - The sun's luminance at the zenith in kilo candela per meter squared to use for this model's procedural environment map. + * @param [options.sphericalHarmonicCoefficients] - The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. + * @param [options.specularEnvironmentMaps] - A URL to a KTX file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + * @param [options.backFaceCulling = true] - Whether to cull back-facing geometry. When true, back face culling is determined by the glTF material's doubleSided property; when false, back face culling is disabled. + * @param [options.debugHeatmapTilePropertyName] - The tile variable to colorize as a heatmap. All rendered tiles will be colorized relative to each other's specified variable value. + * @param [options.debugFreezeFrame = false] - For debugging only. Determines if only the tiles from last frame should be used for rendering. + * @param [options.debugColorizeTiles = false] - For debugging only. When true, assigns a random color to each tile. + * @param [options.debugWireframe = false] - For debugging only. When true, render's each tile's content as a wireframe. + * @param [options.debugShowBoundingVolume = false] - For debugging only. When true, renders the bounding volume for each tile. + * @param [options.debugShowContentBoundingVolume = false] - For debugging only. When true, renders the bounding volume for each tile's content. + * @param [options.debugShowViewerRequestVolume = false] - For debugging only. When true, renders the viewer request volume for each tile. + * @param [options.debugShowGeometricError = false] - For debugging only. When true, draws labels to indicate the geometric error of each tile. + * @param [options.debugShowRenderingStatistics = false] - For debugging only. When true, draws labels to indicate the number of commands, points, triangles and features for each tile. + * @param [options.debugShowMemoryUsage = false] - For debugging only. When true, draws labels to indicate the texture and geometry memory in megabytes used by each tile. + * @param [options.debugShowUrl = false] - For debugging only. When true, draws labels to indicate the url of each tile. + */ +export class Cesium3DTileset { + constructor(options: { + url: Resource | string | Promise | Promise; + show?: boolean; + modelMatrix?: Matrix4; + shadows?: ShadowMode; + maximumScreenSpaceError?: number; + maximumMemoryUsage?: number; + cullWithChildrenBounds?: boolean; + cullRequestsWhileMoving?: boolean; + cullRequestsWhileMovingMultiplier?: number; + preloadWhenHidden?: boolean; + preloadFlightDestinations?: boolean; + preferLeaves?: boolean; + dynamicScreenSpaceError?: boolean; + dynamicScreenSpaceErrorDensity?: number; + dynamicScreenSpaceErrorFactor?: number; + dynamicScreenSpaceErrorHeightFalloff?: number; + progressiveResolutionHeightFraction?: number; + foveatedScreenSpaceError?: boolean; + foveatedConeSize?: number; + foveatedMinimumScreenSpaceErrorRelaxation?: number; + foveatedInterpolationCallback?: Cesium3DTileset.foveatedInterpolationCallback; + foveatedTimeDelay?: number; + skipLevelOfDetail?: boolean; + baseScreenSpaceError?: number; + skipScreenSpaceErrorFactor?: number; + skipLevels?: number; + immediatelyLoadDesiredLevelOfDetail?: boolean; + loadSiblings?: boolean; + clippingPlanes?: ClippingPlaneCollection; + classificationType?: ClassificationType; + ellipsoid?: Ellipsoid; + pointCloudShading?: any; + imageBasedLightingFactor?: Cartesian2; + lightColor?: Cartesian3; + luminanceAtZenith?: number; + sphericalHarmonicCoefficients?: Cartesian3[]; + specularEnvironmentMaps?: string; + backFaceCulling?: boolean; + debugHeatmapTilePropertyName?: string; + debugFreezeFrame?: boolean; + debugColorizeTiles?: boolean; + debugWireframe?: boolean; + debugShowBoundingVolume?: boolean; + debugShowContentBoundingVolume?: boolean; + debugShowViewerRequestVolume?: boolean; + debugShowGeometricError?: boolean; + debugShowRenderingStatistics?: boolean; + debugShowMemoryUsage?: boolean; + debugShowUrl?: boolean; + }); + /** + * Optimization option. Don't request tiles that will likely be unused when they come back because of the camera's movement. This optimization only applies to stationary tilesets. + */ + cullRequestsWhileMoving: boolean; + /** + * Optimization option. Multiplier used in culling requests while moving. Larger is more aggressive culling, smaller less aggressive culling. + */ + cullRequestsWhileMovingMultiplier: number; + /** + * Optimization option. If between (0.0, 0.5], tiles at or above the screen space error for the reduced screen resolution of progressiveResolutionHeightFraction*screenHeight will be prioritized first. This can help get a quick layer of tiles down while full resolution tiles continue to load. + */ + progressiveResolutionHeightFraction: number; + /** + * Optimization option. Prefer loading of leaves first. + */ + preferLeaves: boolean; + /** + * Preload tiles when tileset.show is false. Loads tiles as if the tileset is visible but does not render them. + */ + preloadWhenHidden: boolean; + /** + * Optimization option. Fetch tiles at the camera's flight destination while the camera is in flight. + */ + preloadFlightDestinations: boolean; + /** + * Optimization option. Whether the tileset should refine based on a dynamic screen space error. Tiles that are further + * away will be rendered with lower detail than closer tiles. This improves performance by rendering fewer + * tiles and making less requests, but may result in a slight drop in visual quality for tiles in the distance. + * The algorithm is biased towards "street views" where the camera is close to the ground plane of the tileset and looking + * at the horizon. In addition results are more accurate for tightly fitting bounding volumes like box and region. + */ + dynamicScreenSpaceError: boolean; + /** + * Optimization option. Prioritize loading tiles in the center of the screen by temporarily raising the + * screen space error for tiles around the edge of the screen. Screen space error returns to normal once all + * the tiles in the center of the screen as determined by the {@link Cesium3DTileset#foveatedConeSize} are loaded. + */ + foveatedScreenSpaceError: boolean; + /** + * Gets or sets a callback to control how much to raise the screen space error for tiles outside the foveated cone, + * interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError}. + */ + foveatedInterpolationCallback: Cesium3DTileset.foveatedInterpolationCallback; + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control + * how long in seconds to wait after the camera stops moving before deferred tiles start loading in. + * This time delay prevents requesting tiles around the edges of the screen when the camera is moving. + * Setting this to 0.0 will immediately request all tiles in any given view. + */ + foveatedTimeDelay: number; + /** + * A scalar that determines the density used to adjust the dynamic screen space error, similar to {@link Fog}. Increasing this + * value has the effect of increasing the maximum screen space error for all tiles, but in a non-linear fashion. + * The error starts at 0.0 and increases exponentially until a midpoint is reached, and then approaches 1.0 asymptotically. + * This has the effect of keeping high detail in the closer tiles and lower detail in the further tiles, with all tiles + * beyond a certain distance all roughly having an error of 1.0. + *

    + * The dynamic error is in the range [0.0, 1.0) and is multiplied by dynamicScreenSpaceErrorFactor to produce the + * final dynamic error. This dynamic error is then subtracted from the tile's actual screen space error. + *

    + *

    + * Increasing dynamicScreenSpaceErrorDensity has the effect of moving the error midpoint closer to the camera. + * It is analogous to moving fog closer to the camera. + *

    + */ + dynamicScreenSpaceErrorDensity: number; + /** + * A factor used to increase the screen space error of tiles for dynamic screen space error. As this value increases less tiles + * are requested for rendering and tiles in the distance will have lower detail. If set to zero, the feature will be disabled. + */ + dynamicScreenSpaceErrorFactor: number; + /** + * A ratio of the tileset's height at which the density starts to falloff. If the camera is below this height the + * full computed density is applied, otherwise the density falls off. This has the effect of higher density at + * street level views. + *

    + * Valid values are between 0.0 and 1.0. + *

    + */ + dynamicScreenSpaceErrorHeightFalloff: number; + /** + * Determines whether the tileset casts or receives shadows from light sources. + *

    + * Enabling shadows has a performance impact. A tileset that casts shadows must be rendered twice, once from the camera and again from the light's point of view. + *

    + *

    + * Shadows are rendered only when {@link Viewer#shadows} is true. + *

    + */ + shadows: ShadowMode; + /** + * Determines if the tileset will be shown. + */ + show: boolean; + /** + * Defines how per-feature colors set from the Cesium API or declarative styling blend with the source colors from + * the original feature, e.g. glTF material or per-point color in the tile. + */ + colorBlendMode: Cesium3DTileColorBlendMode; + /** + * Defines the value used to linearly interpolate between the source color and feature color when the {@link Cesium3DTileset#colorBlendMode} is MIX. + * A value of 0.0 results in the source color while a value of 1.0 results in the feature color, with any value in-between + * resulting in a mix of the source color and feature color. + */ + colorBlendAmount: number; + /** + * Options for controlling point size based on geometric error and eye dome lighting. + */ + pointCloudShading: PointCloudShading; + /** + * The event fired to indicate progress of loading new tiles. This event is fired when a new tile + * is requested, when a requested tile is finished downloading, and when a downloaded tile has been + * processed and is ready to render. + *

    + * The number of pending tile requests, numberOfPendingRequests, and number of tiles + * processing, numberOfTilesProcessing are passed to the event listener. + *

    + *

    + * This event is fired at the end of the frame after the scene is rendered. + *

    + * @example + * tileset.loadProgress.addEventListener(function(numberOfPendingRequests, numberOfTilesProcessing) { + * if ((numberOfPendingRequests === 0) && (numberOfTilesProcessing === 0)) { + * console.log('Stopped loading'); + * return; + * } + * + * console.log('Loading: requests: ' + numberOfPendingRequests + ', processing: ' + numberOfTilesProcessing); + * }); + */ + loadProgress: Event; + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. The tileset + * is completely loaded for this view. + *

    + * This event is fired at the end of the frame after the scene is rendered. + *

    + * @example + * tileset.allTilesLoaded.addEventListener(function() { + * console.log('All tiles are loaded'); + * }); + */ + allTilesLoaded: Event; + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. This event + * is fired once when all tiles in the initial view are loaded. + *

    + * This event is fired at the end of the frame after the scene is rendered. + *

    + * @example + * tileset.initialTilesLoaded.addEventListener(function() { + * console.log('Initial tiles are loaded'); + * }); + */ + initialTilesLoaded: Event; + /** + * The event fired to indicate that a tile's content was loaded. + *

    + * The loaded {@link Cesium3DTile} is passed to the event listener. + *

    + *

    + * This event is fired during the tileset traversal while the frame is being rendered + * so that updates to the tile take effect in the same frame. Do not create or modify + * Cesium entities or primitives during the event listener. + *

    + * @example + * tileset.tileLoad.addEventListener(function(tile) { + * console.log('A tile was loaded.'); + * }); + */ + tileLoad: Event; + /** + * The event fired to indicate that a tile's content was unloaded. + *

    + * The unloaded {@link Cesium3DTile} is passed to the event listener. + *

    + *

    + * This event is fired immediately before the tile's content is unloaded while the frame is being + * rendered so that the event listener has access to the tile's content. Do not create + * or modify Cesium entities or primitives during the event listener. + *

    + * @example + * tileset.tileUnload.addEventListener(function(tile) { + * console.log('A tile was unloaded from the cache.'); + * }); + */ + tileUnload: Event; + /** + * The event fired to indicate that a tile's content failed to load. + *

    + * If there are no event listeners, error messages will be logged to the console. + *

    + *

    + * The error object passed to the listener contains two properties: + *

      + *
    • url: the url of the failed tile.
    • + *
    • message: the error message.
    • + *
    + * @example + * tileset.tileFailed.addEventListener(function(error) { + * console.log('An error occurred loading tile: ' + error.url); + * console.log('Error: ' + error.message); + * }); + */ + tileFailed: Event; + /** + * This event fires once for each visible tile in a frame. This can be used to manually + * style a tileset. + *

    + * The visible {@link Cesium3DTile} is passed to the event listener. + *

    + *

    + * This event is fired during the tileset traversal while the frame is being rendered + * so that updates to the tile take effect in the same frame. Do not create or modify + * Cesium entities or primitives during the event listener. + *

    + * @example + * tileset.tileVisible.addEventListener(function(tile) { + * if (tile.content instanceof Cesium.Batched3DModel3DTileContent) { + * console.log('A Batched 3D Model tile is visible.'); + * } + * }); + * @example + * // Apply a red style and then manually set random colors for every other feature when the tile becomes visible. + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : 'color("red")' + * }); + * tileset.tileVisible.addEventListener(function(tile) { + * var content = tile.content; + * var featuresLength = content.featuresLength; + * for (var i = 0; i < featuresLength; i+=2) { + * content.getFeature(i).color = Cesium.Color.fromRandom(); + * } + * }); + */ + tileVisible: Event; + /** + * Optimization option. Determines if level of detail skipping should be applied during the traversal. + *

    + * The common strategy for replacement-refinement traversal is to store all levels of the tree in memory and require + * all children to be loaded before the parent can refine. With this optimization levels of the tree can be skipped + * entirely and children can be rendered alongside their parents. The tileset requires significantly less memory when + * using this optimization. + *

    + */ + skipLevelOfDetail: boolean; + /** + * The screen space error that must be reached before skipping levels of detail. + *

    + * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

    + */ + baseScreenSpaceError: number; + /** + * Multiplier defining the minimum screen space error to skip. + * For example, if a tile has screen space error of 100, no tiles will be loaded unless they + * are leaves or have a screen space error <= 100 / skipScreenSpaceErrorFactor. + *

    + * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

    + */ + skipScreenSpaceErrorFactor: number; + /** + * Constant defining the minimum number of levels to skip when loading tiles. When it is 0, no levels are skipped. + * For example, if a tile is level 1, no tiles will be loaded unless they are at level greater than 2. + *

    + * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

    + */ + skipLevels: number; + /** + * When true, only tiles that meet the maximum screen space error will ever be downloaded. + * Skipping factors are ignored and just the desired tiles are loaded. + *

    + * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

    + */ + immediatelyLoadDesiredLevelOfDetail: boolean; + /** + * Determines whether siblings of visible tiles are always downloaded during traversal. + * This may be useful for ensuring that tiles are already available when the viewer turns left/right. + *

    + * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

    + */ + loadSiblings: boolean; + /** + * The light color when shading models. When undefined the scene's light color is used instead. + *

    + * For example, disabling additional light sources by setting model.imageBasedLightingFactor = new Cartesian2(0.0, 0.0) will make the + * model much darker. Here, increasing the intensity of the light source will make the model brighter. + *

    + */ + lightColor: Cartesian3; + /** + * The sun's luminance at the zenith in kilo candela per meter squared to use for this model's procedural environment map. + * This is used when {@link Cesium3DTileset#specularEnvironmentMaps} and {@link Cesium3DTileset#sphericalHarmonicCoefficients} are not defined. + */ + luminanceAtZenith: number; + /** + * The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. When undefined, a diffuse irradiance + * computed from the atmosphere color is used. + *

    + * There are nine Cartesian3 coefficients. + * The order of the coefficients is: L00, L1-1, L10, L11, L2-2, L2-1, L20, L21, L22 + *

    + * + * These values can be obtained by preprocessing the environment map using the cmgen tool of + * {@link https://github.com/google/filament/releases|Google's Filament project}. This will also generate a KTX file that can be + * supplied to {@link Cesium3DTileset#specularEnvironmentMaps}. + */ + sphericalHarmonicCoefficients: Cartesian3[]; + /** + * A URL to a KTX file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + */ + specularEnvironmentMaps: string; + /** + * Whether to cull back-facing geometry. When true, back face culling is determined + * by the glTF material's doubleSided property; when false, back face culling is disabled. + */ + backFaceCulling: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * Determines if only the tiles from last frame should be used for rendering. This + * effectively "freezes" the tileset to the previous frame so it is possible to zoom + * out and see what was rendered. + *

    + */ + debugFreezeFrame: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, assigns a random color to each tile. This is useful for visualizing + * what features belong to what tiles, especially with additive refinement where features + * from parent tiles may be interleaved with features from child tiles. + *

    + */ + debugColorizeTiles: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, renders each tile's content as a wireframe. + *

    + */ + debugWireframe: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, renders the bounding volume for each visible tile. The bounding volume is + * white if the tile has a content bounding volume or is empty; otherwise, it is red. Tiles that don't meet the + * screen space error and are still refining to their descendants are yellow. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, renders the bounding volume for each visible tile's content. The bounding volume is + * blue if the tile has a content bounding volume; otherwise it is red. + *

    + */ + debugShowContentBoundingVolume: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, renders the viewer request volume for each tile. + *

    + */ + debugShowViewerRequestVolume: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, draws labels to indicate the geometric error of each tile. + *

    + */ + debugShowGeometricError: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, draws labels to indicate the number of commands, points, triangles and features of each tile. + *

    + */ + debugShowRenderingStatistics: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, draws labels to indicate the geometry and texture memory usage of each tile. + *

    + */ + debugShowMemoryUsage: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, draws labels to indicate the url of each tile. + *

    + */ + debugShowUrl: boolean; + /** + * Gets the tileset's asset object property, which contains metadata about the tileset. + *

    + * See the {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification#reference-asset|asset schema reference} + * in the 3D Tiles spec for the full set of properties. + *

    + */ + readonly asset: any; + /** + * Gets the tileset's extensions object property. + */ + readonly extensions: any; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * Gets the tileset's properties dictionary object, which contains metadata about per-feature properties. + *

    + * See the {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification#reference-properties|properties schema reference} + * in the 3D Tiles spec for the full set of properties. + *

    + * @example + * console.log('Maximum building height: ' + tileset.properties.height.maximum); + * console.log('Minimum building height: ' + tileset.properties.height.minimum); + */ + readonly properties: any; + /** + * When true, the tileset's root tile is loaded and the tileset is ready to render. + * This is set to true right before {@link Cesium3DTileset#readyPromise} is resolved. + */ + readonly ready: boolean; + /** + * Gets the promise that will be resolved when the tileset's root tile is loaded and the tileset is ready to render. + *

    + * This promise is resolved at the end of the frame before the first frame the tileset is rendered in. + *

    + * @example + * tileset.readyPromise.then(function(tileset) { + * // tile.properties is not defined until readyPromise resolves. + * var properties = tileset.properties; + * if (Cesium.defined(properties)) { + * for (var name in properties) { + * console.log(properties[name]); + * } + * } + * }); + */ + readonly readyPromise: Promise; + /** + * When true, all tiles that meet the screen space error this frame are loaded. The tileset is + * completely loaded for this view. + */ + readonly tilesLoaded: boolean; + /** + * The url to a tileset JSON file. + */ + readonly url: string; + /** + * The base path that non-absolute paths in tileset JSON file are relative to. + */ + readonly basePath: string; + /** + * The style, defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}, + * applied to each feature in the tileset. + *

    + * Assign undefined to remove the style, which will restore the visual + * appearance of the tileset to its default when no style was applied. + *

    + *

    + * The style is applied to a tile before the {@link Cesium3DTileset#tileVisible} + * event is raised, so code in tileVisible can manually set a feature's + * properties (e.g. color and show) after the style is applied. When + * a new style is assigned any manually set properties are overwritten. + *

    + * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Height} >= 100', 'color("purple", 0.5)'], + * ['${Height} >= 50', 'color("red")'], + * ['true', 'color("blue")'] + * ] + * }, + * show : '${Height} > 0', + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + */ + style: Cesium3DTileStyle | undefined; + /** + * The maximum screen space error used to drive level of detail refinement. This value helps determine when a tile + * refines to its descendants, and therefore plays a major role in balancing performance with visual quality. + *

    + * A tile's screen space error is roughly equivalent to the number of pixels wide that would be drawn if a sphere with a + * radius equal to the tile's geometric error were rendered at the tile's position. If this value exceeds + * maximumScreenSpaceError the tile refines to its descendants. + *

    + *

    + * Depending on the tileset, maximumScreenSpaceError may need to be tweaked to achieve the right balance. + * Higher values provide better performance but lower visual quality. + *

    + */ + maximumScreenSpaceError: number; + /** + * The maximum amount of GPU memory (in MB) that may be used to cache tiles. This value is estimated from + * geometry, textures, and batch table textures of loaded tiles. For point clouds, this value also + * includes per-point metadata. + *

    + * Tiles not in view are unloaded to enforce this. + *

    + *

    + * If decreasing this value results in unloading tiles, the tiles are unloaded the next frame. + *

    + *

    + * If tiles sized more than maximumMemoryUsage are needed + * to meet the desired screen space error, determined by {@link Cesium3DTileset#maximumScreenSpaceError}, + * for the current view, then the memory usage of the tiles loaded will exceed + * maximumMemoryUsage. For example, if the maximum is 256 MB, but + * 300 MB of tiles are needed to meet the screen space error, then 300 MB of tiles may be loaded. When + * these tiles go out of view, they will be unloaded. + *

    + */ + maximumMemoryUsage: number; + /** + * The root tile. + */ + readonly root: Cesium3DTile; + /** + * The tileset's bounding sphere. + * @example + * var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ + * url : 'http://localhost:8002/tilesets/Seattle/tileset.json' + * })); + * + * tileset.readyPromise.then(function(tileset) { + * // Set the camera to view the newly added tileset + * viewer.camera.viewBoundingSphere(tileset.boundingSphere, new Cesium.HeadingPitchRange(0, -0.5, 0)); + * }); + */ + readonly boundingSphere: BoundingSphere; + /** + * A 4x4 transformation matrix that transforms the entire tileset. + * @example + * // Adjust a tileset's height from the globe's surface. + * var heightOffset = 20.0; + * var boundingSphere = tileset.boundingSphere; + * var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center); + * var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); + * var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset); + * var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); + * tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + */ + modelMatrix: Matrix4; + /** + * Returns the time, in milliseconds, since the tileset was loaded and first updated. + */ + readonly timeSinceLoad: number; + /** + * The total amount of GPU memory in bytes used by the tileset. This value is estimated from + * geometry, texture, and batch table textures of loaded tiles. For point clouds, this value also + * includes per-point metadata. + */ + readonly totalMemoryUsageInBytes: number; + /** + * Determines whether terrain, 3D Tiles or both will be classified by this tileset. + *

    + * This option is only applied to tilesets containing batched 3D models, geometry data, or vector data. Even when undefined, vector data and geometry data + * must render as classifications and will default to rendering on both terrain and other 3D Tiles tilesets. + *

    + *

    + * When enabled for batched 3D model tilesets, there are a few requirements/limitations on the glTF: + *

      + *
    • POSITION and _BATCHID semantics are required.
    • + *
    • All indices with the same batch id must occupy contiguous sections of the index buffer.
    • + *
    • All shaders and techniques are ignored. The generated shader simply multiplies the position by the model-view-projection matrix.
    • + *
    • The only supported extensions are CESIUM_RTC and WEB3D_quantized_attributes.
    • + *
    • Only one node is supported.
    • + *
    • Only one mesh per node is supported.
    • + *
    • Only one primitive per mesh is supported.
    • + *
    + *

    + */ + readonly classificationType: ClassificationType; + /** + * Gets an ellipsoid describing the shape of the globe. + */ + readonly ellipsoid: Ellipsoid; + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. + * Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. + * Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, essentially disabling the effect. + */ + foveatedConeSize: number; + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. + * The screen space error will be raised starting with this value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}. + */ + foveatedMinimumScreenSpaceErrorRelaxation: number; + /** + * Returns the extras property at the top-level of the tileset JSON, which contains application specific metadata. + * Returns undefined if extras does not exist. + */ + readonly extras: any; + /** + * Cesium adds lighting from the earth, sky, atmosphere, and star skybox. This cartesian is used to scale the final + * diffuse and specular lighting contribution from those sources to the final color. A value of 0.0 will disable those light sources. + */ + imageBasedLightingFactor: Cartesian2; + /** + * Provides a hook to override the method used to request the tileset json + * useful when fetching tilesets from remote servers + * @param tilesetUrl - The url of the json file to be fetched + * @returns A promise that resolves with the fetched json data + */ + static loadJson(tilesetUrl: Resource | string): Promise; + /** + * Marks the tileset's {@link Cesium3DTileset#style} as dirty, which forces all + * features to re-evaluate the style in the next frame each is visible. + */ + makeStyleDirty(): void; + /** + * Unloads all tiles that weren't selected the previous frame. This can be used to + * explicitly manage the tile cache and reduce the total number of tiles loaded below + * {@link Cesium3DTileset#maximumMemoryUsage}. + *

    + * Tile unloads occur at the next frame to keep all the WebGL delete calls + * within the render loop. + *

    + */ + trimLoadedTiles(): void; + /** + * true if the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + * @param extensionName - The name of the extension to check. + * @returns true if the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + */ + hasExtension(extensionName: string): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * tileset = tileset && tileset.destroy(); + */ + destroy(): void; +} + +export namespace Cesium3DTileset { + /** + * Optimization option. Used as a callback when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how much to raise the screen space error for tiles outside the foveated cone, + * interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError}. + * @param p - The start value to interpolate. + * @param q - The end value to interpolate. + * @param time - The time of interpolation generally in the range [0.0, 1.0]. + */ + type foveatedInterpolationCallback = (p: number, q: number, time: number) => number; +} + +/** + * A ParticleEmitter that emits particles from a circle. + * Particles will be positioned within a circle and have initial velocities going along the z vector. + * @param [radius = 1.0] - The radius of the circle in meters. + */ +export class CircleEmitter { + constructor(radius?: number); + /** + * The radius of the circle in meters. + */ + radius: number; + /** + * The angle of the cone in radians. + */ + angle: number; +} + +/** + * A classification primitive represents a volume enclosing geometry in the {@link Scene} to be highlighted. + *

    + * A primitive combines geometry instances with an {@link Appearance} that describes the full shading, including + * {@link Material} and {@link RenderState}. Roughly, the geometry instance defines the structure and placement, + * and the appearance defines the visual characteristics. Decoupling geometry and appearance allows us to mix + * and match most of them and add a new geometry or appearance independently of each other. + * Only {@link PerInstanceColorAppearance} with the same color across all instances is supported at this time when using + * ClassificationPrimitive directly. + * For full {@link Appearance} support when classifying terrain or 3D Tiles use {@link GroundPrimitive} instead. + *

    + *

    + * For correct rendering, this feature requires the EXT_frag_depth WebGL extension. For hardware that do not support this extension, there + * will be rendering artifacts for some viewing angles. + *

    + *

    + * Valid geometries are {@link BoxGeometry}, {@link CylinderGeometry}, {@link EllipsoidGeometry}, {@link PolylineVolumeGeometry}, and {@link SphereGeometry}. + *

    + *

    + * Geometries that follow the surface of the ellipsoid, such as {@link CircleGeometry}, {@link CorridorGeometry}, {@link EllipseGeometry}, {@link PolygonGeometry}, and {@link RectangleGeometry}, + * are also valid if they are extruded volumes; otherwise, they will not be rendered. + *

    + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - The geometry instances to render. This can either be a single instance or an array of length one. + * @param [options.appearance] - The appearance used to render the primitive. Defaults to PerInstanceColorAppearance when GeometryInstances have a color attribute. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.vertexCacheOptimize = false] - When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.compressVertices = true] - When true, the geometry vertices are compressed, which will save memory. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. If false initializeTerrainHeights() must be called first. + * @param [options.classificationType = ClassificationType.BOTH] - Determines whether terrain, 3D Tiles or both will be classified. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.debugShowShadowVolume = false] - For debugging only. Determines if the shadow volume for each geometry in the primitive is drawn. Must be true on + * creation for the volumes to be created before the geometry is released or options.releaseGeometryInstance must be false. + */ +export class ClassificationPrimitive { + constructor(options?: { + geometryInstances?: any[] | GeometryInstance; + appearance?: Appearance; + show?: boolean; + vertexCacheOptimize?: boolean; + interleave?: boolean; + compressVertices?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + asynchronous?: boolean; + classificationType?: ClassificationType; + debugShowBoundingVolume?: boolean; + debugShowShadowVolume?: boolean; + }); + /** + * The geometry instance rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

    + * Changing this property after the primitive is rendered has no effect. + *

    + *

    + * Because of the rendering technique used, all geometry instances must be the same color. + * If there is an instance with a differing color, a DeveloperError will be thrown + * on the first attempt to render. + *

    + */ + readonly geometryInstances: any[] | GeometryInstance; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * Determines whether terrain, 3D Tiles or both will be classified. + */ + classificationType: ClassificationType; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the shadow volume for each geometry in the primitive. + *

    + */ + debugShowShadowVolume: boolean; + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + */ + readonly vertexCacheOptimize: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * When true, geometry vertices are compressed, which will save memory. + */ + readonly compressVertices: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link ClassificationPrimitive#update} + * is called. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves when the primitive is ready to render. + */ + readonly readyPromise: Promise; + /** + * Determines if ClassificationPrimitive rendering is supported. + * @param scene - The scene. + * @returns true if ClassificationPrimitives are supported; otherwise, returns false + */ + static isSupported(scene: Scene): boolean; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + * @example + * e = e && e.destroy(); + */ + destroy(): void; +} + +/** + * Whether a classification affects terrain, 3D Tiles or both. + */ +export enum ClassificationType { + /** + * Only terrain will be classified. + */ + TERRAIN = 0, + /** + * Only 3D Tiles will be classified. + */ + CESIUM_3D_TILE = 1, + /** + * Both terrain and 3D Tiles will be classified. + */ + BOTH = 2 +} + +/** + * A Plane in Hessian Normal form to be used with {@link ClippingPlaneCollection}. + * Compatible with mathematics functions in {@link Plane} + * @param normal - The plane's normal (normalized). + * @param distance - The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ +export class ClippingPlane { + constructor(normal: Cartesian3, distance: number); + /** + * The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ + distance: number; + /** + * The plane's normal. + */ + normal: Cartesian3; + /** + * Create a ClippingPlane from a Plane object. + * @param plane - The plane containing parameters to copy + * @param [result] - The object on which to store the result + * @returns The ClippingPlane generated from the plane's parameters. + */ + static fromPlane(plane: Plane, result?: ClippingPlane): ClippingPlane; + /** + * Clones the ClippingPlane without setting its ownership. + * @param clippingPlane - The ClippingPlane to be cloned + * @param [result] - The object on which to store the cloned parameters. + * @returns a clone of the input ClippingPlane + */ + static clone(clippingPlane: ClippingPlane, result?: ClippingPlane): ClippingPlane; +} + +/** + * Specifies a set of clipping planes. Clipping planes selectively disable rendering in a region on the + * outside of the specified list of {@link ClippingPlane} objects for a single gltf model, 3D Tileset, or the globe. + *

    + * In general the clipping planes' coordinates are relative to the object they're attached to, so a plane with distance set to 0 will clip + * through the center of the object. + *

    + *

    + * For 3D Tiles, the root tile's transform is used to position the clipping planes. If a transform is not defined, the root tile's {@link Cesium3DTile#boundingSphere} is used instead. + *

    + * @example + * // This clipping plane's distance is positive, which means its normal + * // is facing the origin. This will clip everything that is behind + * // the plane, which is anything with y coordinate < -5. + * var clippingPlanes = new Cesium.ClippingPlaneCollection({ + * planes : [ + * new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 1.0, 0.0), 5.0) + * ], + * }); + * // Create an entity and attach the ClippingPlaneCollection to the model. + * var entity = viewer.entities.add({ + * position : Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 10000), + * model : { + * uri : 'model.gltf', + * minimumPixelSize : 128, + * maximumScale : 20000, + * clippingPlanes : clippingPlanes + * } + * }); + * viewer.zoomTo(entity); + * @param [options] - Object with the following properties: + * @param [options.planes = []] - An array of {@link ClippingPlane} objects used to selectively disable rendering on the outside of each plane. + * @param [options.enabled = true] - Determines whether the clipping planes are active. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix specifying an additional transform relative to the clipping planes original coordinate system. + * @param [options.unionClippingRegions = false] - If true, a region will be clipped if it is on the outside of any plane in the collection. Otherwise, a region will only be clipped if it is on the outside of every plane. + * @param [options.edgeColor = Color.WHITE] - The color applied to highlight the edge along which an object is clipped. + * @param [options.edgeWidth = 0.0] - The width, in pixels, of the highlight applied to the edge along which an object is clipped. + */ +export class ClippingPlaneCollection { + constructor(options?: { + planes?: ClippingPlane[]; + enabled?: boolean; + modelMatrix?: Matrix4; + unionClippingRegions?: boolean; + edgeColor?: Color; + edgeWidth?: number; + }); + /** + * The 4x4 transformation matrix specifying an additional transform relative to the clipping planes + * original coordinate system. + */ + modelMatrix: Matrix4; + /** + * The color applied to highlight the edge along which an object is clipped. + */ + edgeColor: Color; + /** + * The width, in pixels, of the highlight applied to the edge along which an object is clipped. + */ + edgeWidth: number; + /** + * An event triggered when a new clipping plane is added to the collection. Event handlers + * are passed the new plane and the index at which it was added. + */ + planeAdded: Event; + /** + * An event triggered when a new clipping plane is removed from the collection. Event handlers + * are passed the new plane and the index from which it was removed. + */ + planeRemoved: Event; + /** + * Returns the number of planes in this collection. This is commonly used with + * {@link ClippingPlaneCollection#get} to iterate over all the planes + * in the collection. + */ + readonly length: number; + /** + * If true, a region will be clipped if it is on the outside of any plane in the + * collection. Otherwise, a region will only be clipped if it is on the + * outside of every plane. + */ + unionClippingRegions: boolean; + /** + * If true, clipping will be enabled. + */ + enabled: boolean; + /** + * Adds the specified {@link ClippingPlane} to the collection to be used to selectively disable rendering + * on the outside of each plane. Use {@link ClippingPlaneCollection#unionClippingRegions} to modify + * how modify the clipping behavior of multiple planes. + * @param plane - The ClippingPlane to add to the collection. + */ + add(plane: ClippingPlane): void; + /** + * Returns the plane in the collection at the specified index. Indices are zero-based + * and increase as planes are added. Removing a plane shifts all planes after + * it to the left, changing their indices. This function is commonly used with + * {@link ClippingPlaneCollection#length} to iterate over all the planes + * in the collection. + * @param index - The zero-based index of the plane. + * @returns The ClippingPlane at the specified index. + */ + get(index: number): ClippingPlane; + /** + * Checks whether this collection contains a ClippingPlane equal to the given ClippingPlane. + * @param [clippingPlane] - The ClippingPlane to check for. + * @returns true if this collection contains the ClippingPlane, false otherwise. + */ + contains(clippingPlane?: ClippingPlane): boolean; + /** + * Removes the first occurrence of the given ClippingPlane from the collection. + * @returns true if the plane was removed; false if the plane was not found in the collection. + */ + remove(clippingPlane: ClippingPlane): boolean; + /** + * Removes all planes from the collection. + */ + removeAll(): void; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * build the resources for clipping planes. + *

    + * Do not call this function directly. + *

    + */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * clippingPlanes = clippingPlanes && clippingPlanes .destroy(); + */ + destroy(): void; +} + +/** + * Defines different modes for blending between a target color and a primitive's source color. + * + * HIGHLIGHT multiplies the source color by the target color + * REPLACE replaces the source color with the target color + * MIX blends the source color and target color together + */ +export enum ColorBlendMode { + HIGHLIGHT = 0, + REPLACE = 1, + MIX = 2 +} + +/** + * An expression for a style applied to a {@link Cesium3DTileset}. + *

    + * Evaluates a conditions expression defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}. + *

    + *

    + * Implements the {@link StyleExpression} interface. + *

    + * @example + * var expression = new Cesium.ConditionsExpression({ + * conditions : [ + * ['${Area} > 10, 'color("#FF0000")'], + * ['${id} !== "1"', 'color("#00FF00")'], + * ['true', 'color("#FFFFFF")'] + * ] + * }); + * expression.evaluateColor(feature, result); // returns a Cesium.Color object + * @param [conditionsExpression] - The conditions expression defined using the 3D Tiles Styling language. + * @param [defines] - Defines in the style. + */ +export class ConditionsExpression { + constructor(conditionsExpression?: any, defines?: any); + /** + * Gets the conditions expression defined in the 3D Tiles Styling language. + */ + readonly conditionsExpression: any; + /** + * Evaluates the result of an expression, optionally using the provided feature's properties. If the result of + * the expression in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language} + * is of type Boolean, Number, or String, the corresponding JavaScript + * primitive type will be returned. If the result is a RegExp, a Javascript RegExp + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. If the result argument is + * a {@link Color}, the {@link Cartesian4} value is converted to a {@link Color} and then returned. + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object onto which to store the result. + * @returns The result of evaluating the expression. + */ + evaluate(feature: Cesium3DTileFeature, result?: any): boolean | number | string | RegExp | Cartesian2 | Cartesian3 | Cartesian4 | Color; + /** + * Evaluates the result of a Color expression, using the values defined by a feature. + *

    + * This is equivalent to {@link ConditionsExpression#evaluate} but always returns a {@link Color} object. + *

    + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object in which to store the result + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + evaluateColor(feature: Cesium3DTileFeature, result?: Color): Color; +} + +/** + * A ParticleEmitter that emits particles within a cone. + * Particles will be positioned at the tip of the cone and have initial velocities going towards the base. + * @param [angle = Cesium.Math.toRadians(30.0)] - The angle of the cone in radians. + */ +export class ConeEmitter { + constructor(angle?: number); +} + +/** + * The credit display is responsible for displaying credits on screen. + * @example + * var creditDisplay = new Cesium.CreditDisplay(creditContainer); + * @param container - The HTML element where credits will be displayed + * @param [delimiter = ' • '] - The string to separate text credits + * @param [viewport = document.body] - The HTML element that will contain the credits popup + */ +export class CreditDisplay { + constructor(container: HTMLElement, delimiter?: string, viewport?: HTMLElement); + /** + * The HTML element where credits will be displayed. + */ + container: HTMLElement; + /** + * Adds a credit to the list of current credits to be displayed in the credit container + * @param credit - The credit to display + */ + addCredit(credit: Credit): void; + /** + * Adds credits that will persist until they are removed + * @param credit - The credit to added to defaults + */ + addDefaultCredit(credit: Credit): void; + /** + * Removes a default credit + * @param credit - The credit to be removed from defaults + */ + removeDefaultCredit(credit: Credit): void; + /** + * Updates the credit display before a new frame is rendered. + */ + update(): void; + /** + * Resets the credit display to a beginning of frame state, clearing out current credits. + */ + beginFrame(): void; + /** + * Sets the credit display to the end of frame state, displaying credits from the last frame in the credit container. + */ + endFrame(): void; + /** + * Destroys the resources held by this object. Destroying an object allows for deterministic + * release of resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + */ + destroy(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Gets or sets the Cesium logo credit. + */ + static cesiumCredit: Credit; +} + +/** + * Determines which triangles, if any, are culled. + */ +export enum CullFace { + /** + * Front-facing triangles are culled. + */ + FRONT = WebGLConstants.FRONT, + /** + * Back-facing triangles are culled. + */ + BACK = WebGLConstants.BACK, + /** + * Both front-facing and back-facing triangles are culled. + */ + FRONT_AND_BACK = WebGLConstants.FRONT_AND_BACK +} + +/** + * Visualizes a vertex attribute by displaying it as a color for debugging. + *

    + * Components for well-known unit-length vectors, i.e., normal, + * tangent, and bitangent, are scaled and biased + * from [-1.0, 1.0] to (-1.0, 1.0). + *

    + * @example + * var primitive = new Cesium.Primitive({ + * geometryInstances : // ... + * appearance : new Cesium.DebugAppearance({ + * attributeName : 'normal' + * }) + * }); + * @param options - Object with the following properties: + * @param options.attributeName - The name of the attribute to visualize. + * @param [options.perInstanceAttribute = false] - Boolean that determines whether this attribute is a per-instance geometry attribute. + * @param [options.glslDatatype = 'vec3'] - The GLSL datatype of the attribute. Supported datatypes are float, vec2, vec3, and vec4. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class DebugAppearance { + constructor(options: { + attributeName: string; + perInstanceAttribute?: boolean; + glslDatatype?: string; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * This property is part of the {@link Appearance} interface, but is not + * used by {@link DebugAppearance} since a fully custom fragment shader is used. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account the {@link DebugAppearance#material}. + * Use {@link DebugAppearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed. + */ + readonly closed: boolean; + /** + * The name of the attribute being visualized. + */ + readonly attributeName: string; + /** + * The GLSL datatype of the attribute being visualized. + */ + readonly glslDatatype: string; + /** + * Returns the full GLSL fragment shader source, which for {@link DebugAppearance} is just + * {@link DebugAppearance#fragmentShaderSource}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link DebugAppearance#translucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +/** + * Draws the outline of the camera's view frustum. + * @example + * primitives.add(new Cesium.DebugCameraPrimitive({ + * camera : camera, + * color : Cesium.Color.YELLOW + * })); + * @param options - Object with the following properties: + * @param options.camera - The camera. + * @param [options.frustumSplits] - Distances to the near and far planes of the camera frustums. This overrides the camera's frustum near and far values. + * @param [options.color = Color.CYAN] - The color of the debug outline. + * @param [options.updateOnChange = true] - Whether the primitive updates when the underlying camera changes. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.id] - A user-defined object to return when the instance is picked with {@link Scene#pick}. + */ +export class DebugCameraPrimitive { + constructor(options: { + camera: Camera; + frustumSplits?: number[]; + color?: Color; + updateOnChange?: boolean; + show?: boolean; + id?: any; + }); + /** + * Determines if this primitive will be shown. + */ + show: boolean; + /** + * User-defined value returned when the primitive is picked. + */ + id: any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + * @example + * p = p && p.destroy(); + */ + destroy(): void; +} + +/** + * Draws the axes of a reference frame defined by a matrix that transforms to world + * coordinates, i.e., Earth's WGS84 coordinates. The most prominent example is + * a primitives modelMatrix. + *

    + * The X axis is red; Y is green; and Z is blue. + *

    + *

    + * This is for debugging only; it is not optimized for production use. + *

    + * @example + * primitives.add(new Cesium.DebugModelMatrixPrimitive({ + * modelMatrix : primitive.modelMatrix, // primitive to debug + * length : 100000.0, + * width : 10.0 + * })); + * @param [options] - Object with the following properties: + * @param [options.length = 10000000.0] - The length of the axes in meters. + * @param [options.width = 2.0] - The width of the axes in pixels. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 matrix that defines the reference frame, i.e., origin plus axes, to visualize. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.id] - A user-defined object to return when the instance is picked with {@link Scene#pick} + */ +export class DebugModelMatrixPrimitive { + constructor(options?: { + length?: number; + width?: number; + modelMatrix?: Matrix4; + show?: boolean; + id?: any; + }); + /** + * The length of the axes in meters. + */ + length: number; + /** + * The width of the axes in pixels. + */ + width: number; + /** + * Determines if this primitive will be shown. + */ + show: boolean; + /** + * The 4x4 matrix that defines the reference frame, i.e., origin plus axes, to visualize. + */ + modelMatrix: Matrix4; + /** + * User-defined value returned when the primitive is picked. + */ + id: any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + * @example + * p = p && p.destroy(); + */ + destroy(): void; +} + +/** + * Determines the function used to compare two depths for the depth test. + */ +export enum DepthFunction { + /** + * The depth test never passes. + */ + NEVER = WebGLConstants.NEVER, + /** + * The depth test passes if the incoming depth is less than the stored depth. + */ + LESS = WebGLConstants.LESS, + /** + * The depth test passes if the incoming depth is equal to the stored depth. + */ + EQUAL = WebGLConstants.EQUAL, + /** + * The depth test passes if the incoming depth is less than or equal to the stored depth. + */ + LESS_OR_EQUAL = WebGLConstants.LEQUAL, + /** + * The depth test passes if the incoming depth is greater than the stored depth. + */ + GREATER = WebGLConstants.GREATER, + /** + * The depth test passes if the incoming depth is not equal to the stored depth. + */ + NOT_EQUAL = WebGLConstants.NOTEQUAL, + /** + * The depth test passes if the incoming depth is greater than or equal to the stored depth. + */ + GREATER_OR_EQUAL = WebGLConstants.GEQUAL, + /** + * The depth test always passes. + */ + ALWAYS = WebGLConstants.ALWAYS +} + +/** + * A light that gets emitted in a single direction from infinitely far away. + * @param options - Object with the following properties: + * @param options.direction - The direction in which light gets emitted. + * @param [options.color = Color.WHITE] - The color of the light. + * @param [options.intensity = 1.0] - The intensity of the light. + */ +export class DirectionalLight { + constructor(options: { + direction: Cartesian3; + color?: Color; + intensity?: number; + }); + /** + * The direction in which light gets emitted. + */ + direction: Cartesian3; + /** + * The color of the light. + */ + color: Color; + /** + * The intensity of the light. + */ + intensity: number; +} + +/** + * A policy for discarding tile images that contain no data (and so aren't actually images). + * This policy discards {@link DiscardEmptyTileImagePolicy.EMPTY_IMAGE}, which is + * expected to be used in place of any empty tile images by the image loading code. + */ +export class DiscardEmptyTileImagePolicy { + constructor(); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; + /** + * Default value for representing an empty image. + */ + static readonly EMPTY_IMAGE: HTMLImageElement; +} + +/** + * A policy for discarding tile images that match a known image containing a + * "missing" image. + * @param options - Object with the following properties: + * @param options.missingImageUrl - The URL of the known missing image. + * @param options.pixelsToCheck - An array of {@link Cartesian2} pixel positions to + * compare against the missing image. + * @param [options.disableCheckIfAllPixelsAreTransparent = false] - If true, the discard check will be disabled + * if all of the pixelsToCheck in the missingImageUrl have an alpha value of 0. If false, the + * discard check will proceed no matter the values of the pixelsToCheck. + */ +export class DiscardMissingTileImagePolicy { + constructor(options: { + missingImageUrl: Resource | string; + pixelsToCheck: Cartesian2[]; + disableCheckIfAllPixelsAreTransparent?: boolean; + }); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; +} + +/** + * An appearance for geometry on the surface of the ellipsoid like {@link PolygonGeometry} + * and {@link RectangleGeometry}, which supports all materials like {@link MaterialAppearance} + * with {@link MaterialAppearance.MaterialSupport.ALL}. However, this appearance requires + * fewer vertex attributes since the fragment shader can procedurally compute normal, + * tangent, and bitangent. + * @example + * var primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.PolygonGeometry({ + * vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, + * // ... + * }) + * }), + * appearance : new Cesium.EllipsoidSurfaceAppearance({ + * material : Cesium.Material.fromType('Stripe') + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.flat = false] - When true, flat shading is used in the fragment shader, which means lighting is not taking into account. + * @param [options.faceForward = options.aboveGround] - When true, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots. This is useful when both sides of a geometry should be shaded like {@link WallGeometry}. + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link EllipsoidSurfaceAppearance#renderState} has alpha blending enabled. + * @param [options.aboveGround = false] - When true, the geometry is expected to be on the ellipsoid's surface - not at a constant height above it - so {@link EllipsoidSurfaceAppearance#renderState} has backface culling enabled. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class EllipsoidSurfaceAppearance { + constructor(options?: { + flat?: boolean; + faceForward?: boolean; + translucent?: boolean; + aboveGround?: boolean; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link EllipsoidSurfaceAppearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account {@link EllipsoidSurfaceAppearance#material}, + * {@link EllipsoidSurfaceAppearance#flat}, and {@link EllipsoidSurfaceAppearance#faceForward}. + * Use {@link EllipsoidSurfaceAppearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

    + * The render state can be explicitly defined when constructing a {@link EllipsoidSurfaceAppearance} + * instance, or it is set implicitly via {@link EllipsoidSurfaceAppearance#translucent} + * and {@link EllipsoidSurfaceAppearance#aboveGround}. + *

    + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link EllipsoidSurfaceAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + */ + readonly flat: boolean; + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + */ + readonly faceForward: boolean; + /** + * When true, the geometry is expected to be on the ellipsoid's + * surface - not at a constant height above it - so {@link EllipsoidSurfaceAppearance#renderState} + * has backface culling enabled. + */ + readonly aboveGround: boolean; + /** + * The {@link VertexFormat} that all {@link EllipsoidSurfaceAppearance} instances + * are compatible with, which requires only position and st + * attributes. Other attributes are procedurally computed in the fragment shader. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link EllipsoidSurfaceAppearance}, + * this is derived from {@link EllipsoidSurfaceAppearance#fragmentShaderSource}, {@link EllipsoidSurfaceAppearance#flat}, + * and {@link EllipsoidSurfaceAppearance#faceForward}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link EllipsoidSurfaceAppearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +/** + * An expression for a style applied to a {@link Cesium3DTileset}. + *

    + * Evaluates an expression defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}. + *

    + *

    + * Implements the {@link StyleExpression} interface. + *

    + * @example + * var expression = new Cesium.Expression('(regExp("^Chest").test(${County})) && (${YearBuilt} >= 1970)'); + * expression.evaluate(feature); // returns true or false depending on the feature's properties + * @example + * var expression = new Cesium.Expression('(${Temperature} > 90) ? color("red") : color("white")'); + * expression.evaluateColor(feature, result); // returns a Cesium.Color object + * @param [expression] - The expression defined using the 3D Tiles Styling language. + * @param [defines] - Defines in the style. + */ +export class Expression { + constructor(expression?: string, defines?: any); + /** + * Gets the expression defined in the 3D Tiles Styling language. + */ + readonly expression: string; + /** + * Evaluates the result of an expression, optionally using the provided feature's properties. If the result of + * the expression in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language} + * is of type Boolean, Number, or String, the corresponding JavaScript + * primitive type will be returned. If the result is a RegExp, a Javascript RegExp + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. If the result argument is + * a {@link Color}, the {@link Cartesian4} value is converted to a {@link Color} and then returned. + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object onto which to store the result. + * @returns The result of evaluating the expression. + */ + evaluate(feature: Cesium3DTileFeature, result?: any): boolean | number | string | RegExp | Cartesian2 | Cartesian3 | Cartesian4 | Color; + /** + * Evaluates the result of a Color expression, optionally using the provided feature's properties. + *

    + * This is equivalent to {@link Expression#evaluate} but always returns a {@link Color} object. + *

    + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object in which to store the result + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + evaluateColor(feature: Cesium3DTileFeature, result?: Color): Color; +} + +/** + * Blends the atmosphere to geometry far from the camera for horizon views. Allows for additional + * performance improvements by rendering less geometry and dispatching less terrain requests. + */ +export class Fog { + constructor(); + /** + * true if fog is enabled, false otherwise. + */ + enabled: boolean; + /** + * A scalar that determines the density of the fog. Terrain that is in full fog are culled. + * The density of the fog increases as this number approaches 1.0 and becomes less dense as it approaches zero. + * The more dense the fog is, the more aggressively the terrain is culled. For example, if the camera is a height of + * 1000.0m above the ellipsoid, increasing the value to 3.0e-3 will cause many tiles close to the viewer be culled. + * Decreasing the value will push the fog further from the viewer, but decrease performance as more of the terrain is rendered. + */ + density: number; + /** + * A factor used to increase the screen space error of terrain tiles when they are partially in fog. The effect is to reduce + * the number of terrain tiles requested for rendering. If set to zero, the feature will be disabled. If the value is increased + * for mountainous regions, less tiles will need to be requested, but the terrain meshes near the horizon may be a noticeably + * lower resolution. If the value is increased in a relatively flat area, there will be little noticeable change on the horizon. + */ + screenSpaceErrorFactor: number; + /** + * The minimum brightness of the fog color from lighting. A value of 0.0 can cause the fog to be completely black. A value of 1.0 will not affect + * the brightness at all. + */ + minimumBrightness: number; +} + +/** + * Monitors the frame rate (frames per second) in a {@link Scene} and raises an event if the frame rate is + * lower than a threshold. Later, if the frame rate returns to the required level, a separate event is raised. + * To avoid creating multiple FrameRateMonitors for a single {@link Scene}, use {@link FrameRateMonitor.fromScene} + * instead of constructing an instance explicitly. + * @param [options] - Object with the following properties: + * @param options.scene - The Scene instance for which to monitor performance. + * @param [options.samplingWindow = 5.0] - The length of the sliding window over which to compute the average frame rate, in seconds. + * @param [options.quietPeriod = 2.0] - The length of time to wait at startup and each time the page becomes visible (i.e. when the user + * switches back to the tab) before starting to measure performance, in seconds. + * @param [options.warmupPeriod = 5.0] - The length of the warmup period, in seconds. During the warmup period, a separate + * (usually lower) frame rate is required. + * @param [options.minimumFrameRateDuringWarmup = 4] - The minimum frames-per-second that are required for acceptable performance during + * the warmup period. If the frame rate averages less than this during any samplingWindow during the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + * @param [options.minimumFrameRateAfterWarmup = 8] - The minimum frames-per-second that are required for acceptable performance after + * the end of the warmup period. If the frame rate averages less than this during any samplingWindow after the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + */ +export class FrameRateMonitor { + constructor(options?: { + scene: Scene; + samplingWindow?: number; + quietPeriod?: number; + warmupPeriod?: number; + minimumFrameRateDuringWarmup?: number; + minimumFrameRateAfterWarmup?: number; + }); + /** + * Gets or sets the length of the sliding window over which to compute the average frame rate, in seconds. + */ + samplingWindow: number; + /** + * Gets or sets the length of time to wait at startup and each time the page becomes visible (i.e. when the user + * switches back to the tab) before starting to measure performance, in seconds. + */ + quietPeriod: number; + /** + * Gets or sets the length of the warmup period, in seconds. During the warmup period, a separate + * (usually lower) frame rate is required. + */ + warmupPeriod: number; + /** + * Gets or sets the minimum frames-per-second that are required for acceptable performance during + * the warmup period. If the frame rate averages less than this during any samplingWindow during the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + */ + minimumFrameRateDuringWarmup: number; + /** + * Gets or sets the minimum frames-per-second that are required for acceptable performance after + * the end of the warmup period. If the frame rate averages less than this during any samplingWindow after the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + */ + minimumFrameRateAfterWarmup: number; + /** + * The default frame rate monitoring settings. These settings are used when {@link FrameRateMonitor.fromScene} + * needs to create a new frame rate monitor, and for any settings that are not passed to the + * {@link FrameRateMonitor} constructor. + */ + static defaultSettings: any; + /** + * Gets the {@link FrameRateMonitor} for a given scene. If the scene does not yet have + * a {@link FrameRateMonitor}, one is created with the {@link FrameRateMonitor.defaultSettings}. + * @param scene - The scene for which to get the {@link FrameRateMonitor}. + * @returns The scene's {@link FrameRateMonitor}. + */ + static fromScene(scene: Scene): FrameRateMonitor; + /** + * Gets the {@link Scene} instance for which to monitor performance. + */ + scene: Scene; + /** + * Gets the event that is raised when a low frame rate is detected. The function will be passed + * the {@link Scene} instance as its first parameter and the average number of frames per second + * over the sampling window as its second parameter. + */ + lowFrameRate: Event; + /** + * Gets the event that is raised when the frame rate returns to a normal level after having been low. + * The function will be passed the {@link Scene} instance as its first parameter and the average + * number of frames per second over the sampling window as its second parameter. + */ + nominalFrameRate: Event; + /** + * Gets the most recently computed average frames-per-second over the last samplingWindow. + * This property may be undefined if the frame rate has not been computed. + */ + lastFramesPerSecond: number; + /** + * Pauses monitoring of the frame rate. To resume monitoring, {@link FrameRateMonitor#unpause} + * must be called once for each time this function is called. + */ + pause(): void; + /** + * Resumes monitoring of the frame rate. If {@link FrameRateMonitor#pause} was called + * multiple times, this function must be called the same number of times in order to + * actually resume monitoring. + */ + unpause(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Unsubscribes this instance from all events it is listening to. + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + */ + destroy(): void; +} + +/** + * Describes the format in which to request GetFeatureInfo from a Web Map Service (WMS) server. + * @param type - The type of response to expect from a GetFeatureInfo request. Valid + * values are 'json', 'xml', 'html', or 'text'. + * @param [format] - The info format to request from the WMS server. This is usually a + * MIME type such as 'application/json' or text/xml'. If this parameter is not specified, the provider will request 'json' + * using 'application/json', 'xml' using 'text/xml', 'html' using 'text/html', and 'text' using 'text/plain'. + * @param [callback] - A function to invoke with the GetFeatureInfo response from the WMS server + * in order to produce an array of picked {@link ImageryLayerFeatureInfo} instances. If this parameter is not specified, + * a default function for the type of response is used. + */ +export class GetFeatureInfoFormat { + constructor(type: string, format?: string, callback?: (...params: any[]) => any); +} + +/** + * The globe rendered in the scene, including its terrain ({@link Globe#terrainProvider}) + * and imagery layers ({@link Globe#imageryLayers}). Access the globe using {@link Scene#globe}. + * @param [ellipsoid = Ellipsoid.WGS84] - Determines the size and shape of the + * globe. + */ +export class Globe { + constructor(ellipsoid?: Ellipsoid); + /** + * Determines if the globe will be shown. + */ + show: boolean; + /** + * The maximum screen-space error used to drive level-of-detail refinement. Higher + * values will provide better performance but lower visual quality. + */ + maximumScreenSpaceError: number; + /** + * The size of the terrain tile cache, expressed as a number of tiles. Any additional + * tiles beyond this number will be freed, as long as they aren't needed for rendering + * this frame. A larger number will consume more memory but will show detail faster + * when, for example, zooming out and then back in. + */ + tileCacheSize: number; + /** + * Gets or sets the number of loading descendant tiles that is considered "too many". + * If a tile has too many loading descendants, that tile will be loaded and rendered before any of + * its descendants are loaded and rendered. This means more feedback for the user that something + * is happening at the cost of a longer overall load time. Setting this to 0 will cause each + * tile level to be loaded successively, significantly increasing load time. Setting it to a large + * number (e.g. 1000) will minimize the number of tiles that are loaded but tend to make + * detail appear all at once after a long wait. + */ + loadingDescendantLimit: number; + /** + * Gets or sets a value indicating whether the ancestors of rendered tiles should be preloaded. + * Setting this to true optimizes the zoom-out experience and provides more detail in + * newly-exposed areas when panning. The down side is that it requires loading more tiles. + */ + preloadAncestors: boolean; + /** + * Gets or sets a value indicating whether the siblings of rendered tiles should be preloaded. + * Setting this to true causes tiles with the same parent as a rendered tile to be loaded, even + * if they are culled. Setting this to true may provide a better panning experience at the + * cost of loading more tiles. + */ + preloadSiblings: boolean; + /** + * The color to use to highlight terrain fill tiles. If undefined, fill tiles are not + * highlighted at all. The alpha value is used to alpha blend with the tile's + * actual color. Because terrain fill tiles do not represent the actual terrain surface, + * it may be useful in some applications to indicate visually that they are not to be trusted. + */ + fillHighlightColor: Color; + /** + * Enable lighting the globe with the scene's light source. + */ + enableLighting: boolean; + /** + * Enable dynamic lighting effects on atmosphere and fog. This only takes effect + * when enableLighting is true. + */ + dynamicAtmosphereLighting: boolean; + /** + * Whether dynamic atmosphere lighting uses the sun direction instead of the scene's + * light direction. This only takes effect when enableLighting and + * dynamicAtmosphereLighting are true. + */ + dynamicAtmosphereLightingFromSun: boolean; + /** + * Enable the ground atmosphere, which is drawn over the globe when viewed from a distance between lightingFadeInDistance and lightingFadeOutDistance. + */ + showGroundAtmosphere: boolean; + /** + * The distance where everything becomes lit. This only takes effect + * when enableLighting or showGroundAtmosphere is true. + */ + lightingFadeOutDistance: number; + /** + * The distance where lighting resumes. This only takes effect + * when enableLighting or showGroundAtmosphere is true. + */ + lightingFadeInDistance: number; + /** + * The distance where the darkness of night from the ground atmosphere fades out to a lit ground atmosphere. + * This only takes effect when showGroundAtmosphere, enableLighting, and + * dynamicAtmosphereLighting are true. + */ + nightFadeOutDistance: number; + /** + * The distance where the darkness of night from the ground atmosphere fades in to an unlit ground atmosphere. + * This only takes effect when showGroundAtmosphere, enableLighting, and + * dynamicAtmosphereLighting are true. + */ + nightFadeInDistance: number; + /** + * True if an animated wave effect should be shown in areas of the globe + * covered by water; otherwise, false. This property is ignored if the + * terrainProvider does not provide a water mask. + */ + showWaterEffect: boolean; + /** + * True if primitives such as billboards, polylines, labels, etc. should be depth-tested + * against the terrain surface, or false if such primitives should always be drawn on top + * of terrain unless they're on the opposite side of the globe. The disadvantage of depth + * testing primitives against terrain is that slight numerical noise or terrain level-of-detail + * switched can sometimes make a primitive that should be on the surface disappear underneath it. + */ + depthTestAgainstTerrain: boolean; + /** + * Determines whether the globe casts or receives shadows from light sources. Setting the globe + * to cast shadows may impact performance since the terrain is rendered again from the light's perspective. + * Currently only terrain that is in view casts shadows. By default the globe does not cast shadows. + */ + shadows: ShadowMode; + /** + * The hue shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A hue shift of 1.0 indicates a complete rotation of the hues available. + */ + atmosphereHueShift: number; + /** + * The saturation shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A saturation shift of -1.0 is monochrome. + */ + atmosphereSaturationShift: number; + /** + * The brightness shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A brightness shift of -1.0 is complete darkness, which will let space show through. + */ + atmosphereBrightnessShift: number; + /** + * Whether to show terrain skirts. Terrain skirts are geometry extending downwards from a tile's edges used to hide seams between neighboring tiles. + * Skirts are always hidden when the camera is underground or translucency is enabled. + */ + showSkirts: boolean; + /** + * Whether to cull back-facing terrain. Back faces are not culled when the camera is underground or translucency is enabled. + */ + backFaceCulling: boolean; + /** + * Gets an ellipsoid describing the shape of this globe. + */ + ellipsoid: Ellipsoid; + /** + * Gets the collection of image layers that will be rendered on this globe. + */ + imageryLayers: ImageryLayerCollection; + /** + * Gets an event that's raised when an imagery layer is added, shown, hidden, moved, or removed. + */ + readonly imageryLayersUpdatedEvent: Event; + /** + * Returns true when the tile load queue is empty, false otherwise. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. + */ + readonly tilesLoaded: boolean; + /** + * Gets or sets the color of the globe when no imagery is available. + */ + baseColor: Color; + /** + * A property specifying a {@link ClippingPlaneCollection} used to selectively disable rendering on the outside of each plane. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * A property specifying a {@link Rectangle} used to limit globe rendering to a cartographic area. + * Defaults to the maximum extent of cartographic coordinates. + */ + cartographicLimitRectangle: Rectangle; + /** + * The normal map to use for rendering waves in the ocean. Setting this property will + * only have an effect if the configured terrain provider includes a water mask. + */ + oceanNormalMapUrl: string; + /** + * The terrain provider providing surface geometry for this globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets an event that's raised when the terrain provider is changed + */ + readonly terrainProviderChanged: Event; + /** + * Gets an event that's raised when the length of the tile load queue has changed since the last render frame. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. The event passes the new length of the tile load queue. + */ + tileLoadProgressEvent: Event; + /** + * Gets or sets the material appearance of the Globe. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + */ + material: Material; + /** + * The color to render the back side of the globe when the camera is underground or the globe is translucent, + * blended with the globe color based on the camera's distance. + *

    + * To disable underground coloring, set undergroundColor to undefined. + */ + undergroundColor: Color; + /** + * Gets or sets the near and far distance for blending {@link Globe#undergroundColor} with the globe color. + * The alpha will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the alpha remains clamped to the nearest bound. If undefined, + * the underground color will not be blended with the globe color. + *

    + * When the camera is above the ellipsoid the distance is computed from the nearest + * point on the ellipsoid instead of the camera's position. + */ + undergroundColorAlphaByDistance: NearFarScalar; + /** + * Properties for controlling globe translucency. + */ + translucency: GlobeTranslucency; + /** + * Find an intersection between a ray and the globe surface that was rendered. The ray must be given in world coordinates. + * @example + * // find intersection of ray through a pixel and the globe + * var ray = viewer.camera.getPickRay(windowCoordinates); + * var intersection = globe.pick(ray, scene); + * @param ray - The ray to test for intersection. + * @param scene - The scene. + * @param [result] - The object onto which to store the result. + * @returns The intersection or undefined if none was found. + */ + pick(ray: Ray, scene: Scene, result?: Cartesian3): Cartesian3 | undefined; + /** + * Get the height of the surface at a given cartographic. + * @param cartographic - The cartographic for which to find the height. + * @returns The height of the cartographic or undefined if it could not be found. + */ + getHeight(cartographic: Cartographic): number | undefined; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * globe = globe && globe.destroy(); + */ + destroy(): void; +} + +/** + * Properties for controlling globe translucency. + */ +export class GlobeTranslucency { + constructor(); + /** + * When true, the globe is rendered as a translucent surface. + *

    + * The alpha is computed by blending {@link Globe#material}, {@link Globe#imageryLayers}, + * and {@link Globe#baseColor}, all of which may contain translucency, and then multiplying by + * {@link GlobeTranslucency#frontFaceAlpha} and {@link GlobeTranslucency#frontFaceAlphaByDistance} for front faces and + * {@link GlobeTranslucency#backFaceAlpha} and {@link GlobeTranslucency#backFaceAlphaByDistance} for back faces. + * When the camera is underground back faces and front faces are swapped, i.e. back-facing geometry + * is considered front facing. + *

    + * Translucency is disabled by default. + */ + enabled: boolean; + /** + * A constant translucency to apply to front faces of the globe. + *

    + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Set front face translucency to 0.5. + * globe.translucency.frontFaceAlpha = 0.5; + * globe.translucency.enabled = true; + */ + frontFaceAlpha: number; + /** + * Gets or sets near and far translucency properties of front faces of the globe based on the distance to the camera. + * The translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, + * frontFaceAlphaByDistance will be disabled. + *

    + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Example 1. + * // Set front face translucency to 0.5 when the + * // camera is 1500 meters from the surface and 1.0 + * // as the camera distance approaches 8.0e6 meters. + * globe.translucency.frontFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); + * globe.translucency.enabled = true; + * @example + * // Example 2. + * // Disable front face translucency by distance + * globe.translucency.frontFaceAlphaByDistance = undefined; + */ + frontFaceAlphaByDistance: NearFarScalar; + /** + * A constant translucency to apply to back faces of the globe. + *

    + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Set back face translucency to 0.5. + * globe.translucency.backFaceAlpha = 0.5; + * globe.translucency.enabled = true; + */ + backFaceAlpha: number; + /** + * Gets or sets near and far translucency properties of back faces of the globe based on the distance to the camera. + * The translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, + * backFaceAlphaByDistance will be disabled. + *

    + * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Example 1. + * // Set back face translucency to 0.5 when the + * // camera is 1500 meters from the surface and 1.0 + * // as the camera distance approaches 8.0e6 meters. + * globe.translucency.backFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); + * globe.translucency.enabled = true; + * @example + * // Example 2. + * // Disable back face translucency by distance + * globe.translucency.backFaceAlphaByDistance = undefined; + */ + backFaceAlphaByDistance: NearFarScalar; + /** + * A property specifying a {@link Rectangle} used to limit translucency to a cartographic area. + * Defaults to the maximum extent of cartographic coordinates. + */ + rectangle: Rectangle; +} + +export namespace GoogleEarthEnterpriseImageryProvider { + /** + * Initialization options for the GoogleEarthEnterpriseImageryProvider constructor + * @property url - The url of the Google Earth Enterprise server hosting the imagery. + * @property metadata - A metadata object that can be used to share metadata requests with a GoogleEarthEnterpriseTerrainProvider. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. If this value is not specified, a default + * is to discard tiles that fail to download. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url: Resource | string; + metadata: GoogleEarthEnterpriseMetadata; + ellipsoid?: Ellipsoid; + tileDiscardPolicy?: TileDiscardPolicy; + credit?: Credit | string; + }; +} + +/** + * Provides tiled imagery using the Google Earth Enterprise REST API. + * + * Notes: This provider is for use with the 3D Earth API of Google Earth Enterprise, + * {@link GoogleEarthEnterpriseMapsProvider} should be used with 2D Maps API. + * @example + * var geeMetadata = new GoogleEarthEnterpriseMetadata('http://www.earthenterprise.org/3d'); + * var gee = new Cesium.GoogleEarthEnterpriseImageryProvider({ + * metadata : geeMetadata + * }); + * @param options - Object describing initialization options + */ +export class GoogleEarthEnterpriseImageryProvider { + constructor(options: GoogleEarthEnterpriseImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the name of the Google Earth Enterprise server url hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link GoogleEarthEnterpriseImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +export namespace GoogleEarthEnterpriseMapsProvider { + /** + * Initialization options for the GoogleEarthEnterpriseMapsProvider constructor + * @property url - The url of the Google Earth server hosting the imagery. + * @property channel - The channel (id) to be used when requesting data from the server. + * The channel number can be found by looking at the json file located at: + * earth.localdomain/default_map/query?request=Json&vars=geeServerDefs The /default_map path may + * differ depending on your Google Earth Enterprise server configuration. Look for the "id" that + * is associated with a "ImageryMaps" requestType. There may be more than one id available. + * Example: + * { + * layers: [ + * { + * id: 1002, + * requestType: "ImageryMaps" + * }, + * { + * id: 1007, + * requestType: "VectorMapsRaster" + * } + * ] + * } + * @property [path = "/default_map"] - The path of the Google Earth server hosting the imagery. + * @property [maximumLevel] - The maximum level-of-detail supported by the Google Earth + * Enterprise server, or undefined if there is no limit. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. To ensure that no tiles are discarded, construct and pass + * a {@link NeverTileDiscardPolicy} for this parameter. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + */ + type ConstructorOptions = { + url: Resource | string; + channel: number; + path?: string; + maximumLevel?: number; + tileDiscardPolicy?: TileDiscardPolicy; + ellipsoid?: Ellipsoid; + }; +} + +/** + * Provides tiled imagery using the Google Earth Imagery API. + * + * Notes: This imagery provider does not work with the public Google Earth servers. It works with the + * Google Earth Enterprise Server. + * + * By default the Google Earth Enterprise server does not set the + * {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} headers. You can either + * use a proxy server which adds these headers, or in the /opt/google/gehttpd/conf/gehttpd.conf + * and add the 'Header set Access-Control-Allow-Origin "*"' option to the '<Directory />' and + * '<Directory "/opt/google/gehttpd/htdocs">' directives. + * + * This provider is for use with 2D Maps API as part of Google Earth Enterprise. For 3D Earth API uses, it + * is necessary to use {@link GoogleEarthEnterpriseImageryProvider} + * @example + * var google = new Cesium.GoogleEarthEnterpriseMapsProvider({ + * url : 'https://earth.localdomain', + * channel : 1008 + * }); + * @param options - Object describing initialization options + */ +export class GoogleEarthEnterpriseMapsProvider { + constructor(options: GoogleEarthEnterpriseMapsProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the URL of the Google Earth MapServer. + */ + readonly url: string; + /** + * Gets the url path of the data on the Google Earth server. + */ + readonly path: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the imagery channel (id) currently being used. + */ + readonly channel: number; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the version of the data used by this provider. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly version: number; + /** + * Gets the type of data that is being requested from the provider. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly requestType: string; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link GoogleEarthEnterpriseMapsProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; + /** + * Gets or sets the URL to the Google Earth logo for display in the credit. + */ + static logoUrl: string; +} + +export namespace GridImageryProvider { + /** + * Initialization options for the GridImageryProvider constructor + * @param [tilingScheme = new GeographicTilingScheme()] - The tiling scheme for which to draw tiles. + * @param [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @param [cells = 8] - The number of grids cells. + * @param [color = Color(1.0, 1.0, 1.0, 0.4)] - The color to draw grid lines. + * @param [glowColor = Color(0.0, 1.0, 0.0, 0.05)] - The color to draw glow for grid lines. + * @param [glowWidth = 6] - The width of lines used for rendering the line glow effect. + * @param [backgroundColor = Color(0.0, 0.5, 0.0, 0.2)] - Background fill color. + * @param [tileWidth = 256] - The width of the tile for level-of-detail selection purposes. + * @param [tileHeight = 256] - The height of the tile for level-of-detail selection purposes. + * @param [canvasSize = 256] - The size of the canvas used for rendering. + */ + type ConstructorOptions = any; +} + +/** + * An {@link ImageryProvider} that draws a wireframe grid on every tile with controllable background and glow. + * May be useful for custom rendering effects or debugging terrain. + * @param options - Object describing initialization options + */ +export class GridImageryProvider { + constructor(options: GridImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link GridImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Draws a grid of lines into a canvas. + */ + _drawGrid(): void; + /** + * Render a grid into a canvas with background and glow + */ + _createGridCanvas(): void; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link GridImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * A GroundPolylinePrimitive represents a polyline draped over the terrain or 3D Tiles in the {@link Scene}. + *

    + * Only to be used with GeometryInstances containing {@link GroundPolylineGeometry}. + *

    + * @example + * // 1. Draw a polyline on terrain with a basic color material + * + * var instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.GroundPolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -112.1340164450331, 36.05494287836128, + * -112.08821010582645, 36.097804071380715 + * ]), + * width : 4.0 + * }), + * id : 'object returned when this instance is picked and to get/set per-instance attributes' + * }); + * + * scene.groundPrimitives.add(new Cesium.GroundPolylinePrimitive({ + * geometryInstances : instance, + * appearance : new Cesium.PolylineMaterialAppearance() + * })); + * + * // 2. Draw a looped polyline on terrain with per-instance color and a distance display condition. + * // Distance display conditions for polylines on terrain are based on an approximate terrain height + * // instead of true terrain height. + * + * var instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.GroundPolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -112.1340164450331, 36.05494287836128, + * -112.08821010582645, 36.097804071380715, + * -112.13296079730024, 36.168769146801104 + * ]), + * loop : true, + * width : 4.0 + * }), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('green').withAlpha(0.7)), + * distanceDisplayCondition : new Cesium.DistanceDisplayConditionGeometryInstanceAttribute(1000, 30000) + * }, + * id : 'object returned when this instance is picked and to get/set per-instance attributes' + * }); + * + * scene.groundPrimitives.add(new Cesium.GroundPolylinePrimitive({ + * geometryInstances : instance, + * appearance : new Cesium.PolylineColorAppearance() + * })); + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - GeometryInstances containing GroundPolylineGeometry + * @param [options.appearance] - The Appearance used to render the polyline. Defaults to a white color {@link Material} on a {@link PolylineMaterialAppearance}. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. If false initializeTerrainHeights() must be called first. + * @param [options.classificationType = ClassificationType.BOTH] - Determines whether terrain, 3D Tiles or both will be classified. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.debugShowShadowVolume = false] - For debugging only. Determines if the shadow volume for each geometry in the primitive is drawn. Must be true on creation to have effect. + */ +export class GroundPolylinePrimitive { + constructor(options?: { + geometryInstances?: any[] | GeometryInstance; + appearance?: Appearance; + show?: boolean; + interleave?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + asynchronous?: boolean; + classificationType?: ClassificationType; + debugShowBoundingVolume?: boolean; + debugShowShadowVolume?: boolean; + }); + /** + * The geometry instances rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

    + * Changing this property after the primitive is rendered has no effect. + *

    + */ + readonly geometryInstances: any[] | GeometryInstance; + /** + * The {@link Appearance} used to shade this primitive. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PolylineColorAppearance} allow giving each instance unique + * properties. + */ + appearance: Appearance; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * Determines whether terrain, 3D Tiles or both will be classified. + */ + classificationType: ClassificationType; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link GroundPolylinePrimitive#update} + * is called. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves when the primitive is ready to render. + */ + readonly readyPromise: Promise; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * If true, draws the shadow volume for each geometry in the primitive. + *

    + */ + readonly debugShowShadowVolume: boolean; + /** + * Initializes the minimum and maximum terrain heights. This only needs to be called if you are creating the + * GroundPolylinePrimitive synchronously. + * @returns A promise that will resolve once the terrain heights have been loaded. + */ + static initializeTerrainHeights(): Promise; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Checks if the given Scene supports GroundPolylinePrimitives. + * GroundPolylinePrimitives require support for the WEBGL_depth_texture extension. + * @param scene - The current scene. + * @returns Whether or not the current scene supports GroundPolylinePrimitives. + */ + static isSupported(scene: Scene): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + * @example + * e = e && e.destroy(); + */ + destroy(): void; +} + +/** + * A ground primitive represents geometry draped over terrain or 3D Tiles in the {@link Scene}. + *

    + * A primitive combines geometry instances with an {@link Appearance} that describes the full shading, including + * {@link Material} and {@link RenderState}. Roughly, the geometry instance defines the structure and placement, + * and the appearance defines the visual characteristics. Decoupling geometry and appearance allows us to mix + * and match most of them and add a new geometry or appearance independently of each other. + *

    + *

    + * Support for the WEBGL_depth_texture extension is required to use GeometryInstances with different PerInstanceColors + * or materials besides PerInstanceColorAppearance. + *

    + *

    + * Textured GroundPrimitives were designed for notional patterns and are not meant for precisely mapping + * textures to terrain - for that use case, use {@link SingleTileImageryProvider}. + *

    + *

    + * For correct rendering, this feature requires the EXT_frag_depth WebGL extension. For hardware that do not support this extension, there + * will be rendering artifacts for some viewing angles. + *

    + *

    + * Valid geometries are {@link CircleGeometry}, {@link CorridorGeometry}, {@link EllipseGeometry}, {@link PolygonGeometry}, and {@link RectangleGeometry}. + *

    + * @example + * // Example 1: Create primitive with a single instance + * var rectangleInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0) + * }), + * id : 'rectangle', + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5) + * } + * }); + * scene.primitives.add(new Cesium.GroundPrimitive({ + * geometryInstances : rectangleInstance + * })); + * + * // Example 2: Batch instances + * var color = new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5); // Both instances must have the same color. + * var rectangleInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0) + * }), + * id : 'rectangle', + * attributes : { + * color : color + * } + * }); + * var ellipseInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.EllipseGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-105.0, 40.0), + * semiMinorAxis : 300000.0, + * semiMajorAxis : 400000.0 + * }), + * id : 'ellipse', + * attributes : { + * color : color + * } + * }); + * scene.primitives.add(new Cesium.GroundPrimitive({ + * geometryInstances : [rectangleInstance, ellipseInstance] + * })); + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - The geometry instances to render. + * @param [options.appearance] - The appearance used to render the primitive. Defaults to a flat PerInstanceColorAppearance when GeometryInstances have a color attribute. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.vertexCacheOptimize = false] - When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.compressVertices = true] - When true, the geometry vertices are compressed, which will save memory. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. If false initializeTerrainHeights() must be called first. + * @param [options.classificationType = ClassificationType.BOTH] - Determines whether terrain, 3D Tiles or both will be classified. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.debugShowShadowVolume = false] - For debugging only. Determines if the shadow volume for each geometry in the primitive is drawn. Must be true on + * creation for the volumes to be created before the geometry is released or options.releaseGeometryInstance must be false. + */ +export class GroundPrimitive { + constructor(options?: { + geometryInstances?: any[] | GeometryInstance; + appearance?: Appearance; + show?: boolean; + vertexCacheOptimize?: boolean; + interleave?: boolean; + compressVertices?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + asynchronous?: boolean; + classificationType?: ClassificationType; + debugShowBoundingVolume?: boolean; + debugShowShadowVolume?: boolean; + }); + /** + * The {@link Appearance} used to shade this primitive. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PerInstanceColorAppearance} allow giving each instance unique + * properties. + */ + appearance: Appearance; + /** + * The geometry instances rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

    + * Changing this property after the primitive is rendered has no effect. + *

    + */ + readonly geometryInstances: any[] | GeometryInstance; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * Determines whether terrain, 3D Tiles or both will be classified. + */ + classificationType: ClassificationType; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the shadow volume for each geometry in the primitive. + *

    + */ + debugShowShadowVolume: boolean; + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + */ + readonly vertexCacheOptimize: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * When true, geometry vertices are compressed, which will save memory. + */ + readonly compressVertices: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link GroundPrimitive#update} + * is called. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves when the primitive is ready to render. + */ + readonly readyPromise: Promise; + /** + * Determines if GroundPrimitive rendering is supported. + * @param scene - The scene. + * @returns true if GroundPrimitives are supported; otherwise, returns false + */ + static isSupported(scene: Scene): boolean; + /** + * Initializes the minimum and maximum terrain heights. This only needs to be called if you are creating the + * GroundPrimitive synchronously. + * @returns A promise that will resolve once the terrain heights have been loaded. + */ + static initializeTerrainHeights(): Promise; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + * @example + * e = e && e.destroy(); + */ + destroy(): void; + /** + * Checks if the given Scene supports materials on GroundPrimitives. + * Materials on GroundPrimitives require support for the WEBGL_depth_texture extension. + * @param scene - The current scene. + * @returns Whether or not the current scene supports materials on GroundPrimitives. + */ + static supportsMaterials(scene: Scene): boolean; +} + +/** + * Represents the position relative to the terrain. + */ +export enum HeightReference { + /** + * The position is absolute. + */ + NONE = 0, + /** + * The position is clamped to the terrain. + */ + CLAMP_TO_GROUND = 1, + /** + * The position height is the height above the terrain. + */ + RELATIVE_TO_GROUND = 2 +} + +/** + * The horizontal location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the horizontal origin to LEFT + * or RIGHT will display a billboard to the left or right (in screen space) + * of the anchor position. + *

    + *
    + *
    + *
    + */ +export enum HorizontalOrigin { + /** + * The origin is at the horizontal center of the object. + */ + CENTER = 0, + /** + * The origin is on the left side of the object. + */ + LEFT = 1, + /** + * The origin is on the right side of the object. + */ + RIGHT = -1 +} + +/** + * An imagery layer that displays tiled image data from a single imagery provider + * on a {@link Globe}. + * @param imageryProvider - The imagery provider to use. + * @param [options] - Object with the following properties: + * @param [options.rectangle = imageryProvider.rectangle] - The rectangle of the layer. This rectangle + * can limit the visible portion of the imagery provider. + * @param [options.alpha = 1.0] - The alpha blending value of this layer, from 0.0 to 1.0. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the alpha is required, and it is expected to return + * the alpha value to use for the tile. + * @param [options.nightAlpha = 1.0] - The alpha blending value of this layer on the night side of the globe, from 0.0 to 1.0. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the alpha is required, and it is expected to return + * the alpha value to use for the tile. This only takes effect when enableLighting is true. + * @param [options.dayAlpha = 1.0] - The alpha blending value of this layer on the day side of the globe, from 0.0 to 1.0. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the alpha is required, and it is expected to return + * the alpha value to use for the tile. This only takes effect when enableLighting is true. + * @param [options.brightness = 1.0] - The brightness of this layer. 1.0 uses the unmodified imagery + * color. Less than 1.0 makes the imagery darker while greater than 1.0 makes it brighter. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the brightness is required, and it is expected to return + * the brightness value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @param [options.contrast = 1.0] - The contrast of this layer. 1.0 uses the unmodified imagery color. + * Less than 1.0 reduces the contrast while greater than 1.0 increases it. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the contrast is required, and it is expected to return + * the contrast value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @param [options.hue = 0.0] - The hue of this layer. 0.0 uses the unmodified imagery color. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates + * of the imagery tile for which the hue is required, and it is expected to return + * the contrast value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @param [options.saturation = 1.0] - The saturation of this layer. 1.0 uses the unmodified imagery color. + * Less than 1.0 reduces the saturation while greater than 1.0 increases it. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates + * of the imagery tile for which the saturation is required, and it is expected to return + * the contrast value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @param [options.gamma = 1.0] - The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the gamma is required, and it is expected to return + * the gamma value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @param [options.splitDirection = ImagerySplitDirection.NONE] - The {@link ImagerySplitDirection} split to apply to this layer. + * @param [options.minificationFilter = TextureMinificationFilter.LINEAR] - The + * texture minification filter to apply to this layer. Possible values + * are TextureMinificationFilter.LINEAR and + * TextureMinificationFilter.NEAREST. + * @param [options.magnificationFilter = TextureMagnificationFilter.LINEAR] - The + * texture minification filter to apply to this layer. Possible values + * are TextureMagnificationFilter.LINEAR and + * TextureMagnificationFilter.NEAREST. + * @param [options.show = true] - True if the layer is shown; otherwise, false. + * @param [options.maximumAnisotropy = maximum supported] - The maximum anisotropy level to use + * for texture filtering. If this parameter is not specified, the maximum anisotropy supported + * by the WebGL stack will be used. Larger values make the imagery look better in horizon + * views. + * @param [options.minimumTerrainLevel] - The minimum terrain level-of-detail at which to show this imagery layer, + * or undefined to show it at all levels. Level zero is the least-detailed level. + * @param [options.maximumTerrainLevel] - The maximum terrain level-of-detail at which to show this imagery layer, + * or undefined to show it at all levels. Level zero is the least-detailed level. + * @param [options.cutoutRectangle] - Cartographic rectangle for cutting out a portion of this ImageryLayer. + * @param [options.colorToAlpha] - Color to be used as alpha. + * @param [options.colorToAlphaThreshold = 0.004] - Threshold for color-to-alpha. + */ +export class ImageryLayer { + constructor(imageryProvider: ImageryProvider, options?: { + rectangle?: Rectangle; + alpha?: number | ((...params: any[]) => any); + nightAlpha?: number | ((...params: any[]) => any); + dayAlpha?: number | ((...params: any[]) => any); + brightness?: number | ((...params: any[]) => any); + contrast?: number | ((...params: any[]) => any); + hue?: number | ((...params: any[]) => any); + saturation?: number | ((...params: any[]) => any); + gamma?: number | ((...params: any[]) => any); + splitDirection?: ImagerySplitDirection | ((...params: any[]) => any); + minificationFilter?: TextureMinificationFilter; + magnificationFilter?: TextureMagnificationFilter; + show?: boolean; + maximumAnisotropy?: number; + minimumTerrainLevel?: number; + maximumTerrainLevel?: number; + cutoutRectangle?: Rectangle; + colorToAlpha?: Color; + colorToAlphaThreshold?: number; + }); + /** + * The alpha blending value of this layer, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + alpha: number; + /** + * The alpha blending value of this layer on the night side of the globe, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. This only takes effect when {@link Globe#enableLighting} is true. + */ + nightAlpha: number; + /** + * The alpha blending value of this layer on the day side of the globe, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. This only takes effect when {@link Globe#enableLighting} is true. + */ + dayAlpha: number; + /** + * The brightness of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + brightness: number; + /** + * The contrast of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + contrast: number; + /** + * The hue of this layer in radians. 0.0 uses the unmodified imagery color. + */ + hue: number; + /** + * The saturation of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + saturation: number; + /** + * The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color. + */ + gamma: number; + /** + * The {@link ImagerySplitDirection} to apply to this layer. + */ + splitDirection: ImagerySplitDirection; + /** + * The {@link TextureMinificationFilter} to apply to this layer. + * Possible values are {@link TextureMinificationFilter.LINEAR} (the default) + * and {@link TextureMinificationFilter.NEAREST}. + * + * To take effect, this property must be set immediately after adding the imagery layer. + * Once a texture is loaded it won't be possible to change the texture filter used. + */ + minificationFilter: TextureMinificationFilter; + /** + * The {@link TextureMagnificationFilter} to apply to this layer. + * Possible values are {@link TextureMagnificationFilter.LINEAR} (the default) + * and {@link TextureMagnificationFilter.NEAREST}. + * + * To take effect, this property must be set immediately after adding the imagery layer. + * Once a texture is loaded it won't be possible to change the texture filter used. + */ + magnificationFilter: TextureMagnificationFilter; + /** + * Determines if this layer is shown. + */ + show: boolean; + /** + * Rectangle cutout in this layer of imagery. + */ + cutoutRectangle: Rectangle; + /** + * Color value that should be set to transparent. + */ + colorToAlpha: Color; + /** + * Normalized (0-1) threshold for color-to-alpha. + */ + colorToAlphaThreshold: number; + /** + * Gets the imagery provider for this layer. + */ + readonly imageryProvider: ImageryProvider; + /** + * Gets the rectangle of this layer. If this rectangle is smaller than the rectangle of the + * {@link ImageryProvider}, only a portion of the imagery provider is shown. + */ + readonly rectangle: Rectangle; + /** + * This value is used as the default brightness for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the brightness of the imagery. + */ + static DEFAULT_BRIGHTNESS: number; + /** + * This value is used as the default contrast for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the contrast of the imagery. + */ + static DEFAULT_CONTRAST: number; + /** + * This value is used as the default hue for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the hue of the imagery. + */ + static DEFAULT_HUE: number; + /** + * This value is used as the default saturation for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the saturation of the imagery. + */ + static DEFAULT_SATURATION: number; + /** + * This value is used as the default gamma for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the gamma of the imagery. + */ + static DEFAULT_GAMMA: number; + /** + * This value is used as the default split for the imagery layer if one is not provided during construction + * or by the imagery provider. + */ + static DEFAULT_SPLIT: ImagerySplitDirection; + /** + * This value is used as the default texture minification filter for the imagery layer if one is not provided + * during construction or by the imagery provider. + */ + static DEFAULT_MINIFICATION_FILTER: TextureMinificationFilter; + /** + * This value is used as the default texture magnification filter for the imagery layer if one is not provided + * during construction or by the imagery provider. + */ + static DEFAULT_MAGNIFICATION_FILTER: TextureMagnificationFilter; + /** + * This value is used as the default threshold for color-to-alpha if one is not provided + * during construction or by the imagery provider. + */ + static DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD: number; + /** + * Gets a value indicating whether this layer is the base layer in the + * {@link ImageryLayerCollection}. The base layer is the one that underlies all + * others. It is special in that it is treated as if it has global rectangle, even if + * it actually does not, by stretching the texels at the edges over the entire + * globe. + * @returns true if this is the base layer; otherwise, false. + */ + isBaseLayer(): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * imageryLayer = imageryLayer && imageryLayer.destroy(); + */ + destroy(): void; + /** + * Computes the intersection of this layer's rectangle with the imagery provider's availability rectangle, + * producing the overall bounds of imagery that can be produced by this layer. + * @example + * // Zoom to an imagery layer. + * imageryLayer.getViewableRectangle().then(function (rectangle) { + * return camera.flyTo({ + * destination: rectangle + * }); + * }); + * @returns A promise to a rectangle which defines the overall bounds of imagery that can be produced by this layer. + */ + getViewableRectangle(): Promise; +} + +/** + * An ordered collection of imagery layers. + */ +export class ImageryLayerCollection { + constructor(); + /** + * An event that is raised when a layer is added to the collection. Event handlers are passed the layer that + * was added and the index at which it was added. + */ + layerAdded: Event; + /** + * An event that is raised when a layer is removed from the collection. Event handlers are passed the layer that + * was removed and the index from which it was removed. + */ + layerRemoved: Event; + /** + * An event that is raised when a layer changes position in the collection. Event handlers are passed the layer that + * was moved, its new index after the move, and its old index prior to the move. + */ + layerMoved: Event; + /** + * An event that is raised when a layer is shown or hidden by setting the + * {@link ImageryLayer#show} property. Event handlers are passed a reference to this layer, + * the index of the layer in the collection, and a flag that is true if the layer is now + * shown or false if it is now hidden. + */ + layerShownOrHidden: Event; + /** + * Gets the number of layers in this collection. + */ + length: number; + /** + * Adds a layer to the collection. + * @param layer - the layer to add. + * @param [index] - the index to add the layer at. If omitted, the layer will + * be added on top of all existing layers. + */ + add(layer: ImageryLayer, index?: number): void; + /** + * Creates a new layer using the given ImageryProvider and adds it to the collection. + * @param imageryProvider - the imagery provider to create a new layer for. + * @param [index] - the index to add the layer at. If omitted, the layer will + * added on top of all existing layers. + * @returns The newly created layer. + */ + addImageryProvider(imageryProvider: ImageryProvider, index?: number): ImageryLayer; + /** + * Removes a layer from this collection, if present. + * @param layer - The layer to remove. + * @param [destroy = true] - whether to destroy the layers in addition to removing them. + * @returns true if the layer was in the collection and was removed, + * false if the layer was not in the collection. + */ + remove(layer: ImageryLayer, destroy?: boolean): boolean; + /** + * Removes all layers from this collection. + * @param [destroy = true] - whether to destroy the layers in addition to removing them. + */ + removeAll(destroy?: boolean): void; + /** + * Checks to see if the collection contains a given layer. + * @param layer - the layer to check for. + * @returns true if the collection contains the layer, false otherwise. + */ + contains(layer: ImageryLayer): boolean; + /** + * Determines the index of a given layer in the collection. + * @param layer - The layer to find the index of. + * @returns The index of the layer in the collection, or -1 if the layer does not exist in the collection. + */ + indexOf(layer: ImageryLayer): number; + /** + * Gets a layer by index from the collection. + * @param index - the index to retrieve. + * @returns The imagery layer at the given index. + */ + get(index: number): ImageryLayer; + /** + * Raises a layer up one position in the collection. + * @param layer - the layer to move. + */ + raise(layer: ImageryLayer): void; + /** + * Lowers a layer down one position in the collection. + * @param layer - the layer to move. + */ + lower(layer: ImageryLayer): void; + /** + * Raises a layer to the top of the collection. + * @param layer - the layer to move. + */ + raiseToTop(layer: ImageryLayer): void; + /** + * Lowers a layer to the bottom of the collection. + * @param layer - the layer to move. + */ + lowerToBottom(layer: ImageryLayer): void; + /** + * Asynchronously determines the imagery layer features that are intersected by a pick ray. The intersected imagery + * layer features are found by invoking {@link ImageryProvider#pickFeatures} for each imagery layer tile intersected + * by the pick ray. To compute a pick ray from a location on the screen, use {@link Camera.getPickRay}. + * @example + * var pickRay = viewer.camera.getPickRay(windowPosition); + * var featuresPromise = viewer.imageryLayers.pickImageryLayerFeatures(pickRay, viewer.scene); + * if (!Cesium.defined(featuresPromise)) { + * console.log('No features picked.'); + * } else { + * Cesium.when(featuresPromise, function(features) { + * // This function is called asynchronously when the list if picked features is available. + * console.log('Number of features: ' + features.length); + * if (features.length > 0) { + * console.log('First feature name: ' + features[0].name); + * } + * }); + * } + * @param ray - The ray to test for intersection. + * @param scene - The scene. + * @returns A promise that resolves to an array of features intersected by the pick ray. + * If it can be quickly determined that no features are intersected (for example, + * because no active imagery providers support {@link ImageryProvider#pickFeatures} + * or because the pick ray does not intersect the surface), this function will + * return undefined. + */ + pickImageryLayerFeatures(ray: Ray, scene: Scene): Promise | undefined; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by all layers in this collection. Explicitly destroying this + * object allows for deterministic release of WebGL resources, instead of relying on the garbage + * collector. + *

    + * Once this object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * layerCollection = layerCollection && layerCollection.destroy(); + */ + destroy(): void; +} + +/** + * Describes a rasterized feature, such as a point, polygon, polyline, etc., in an imagery layer. + */ +export class ImageryLayerFeatureInfo { + constructor(); + /** + * Gets or sets the name of the feature. + */ + name: string | undefined; + /** + * Gets or sets an HTML description of the feature. The HTML is not trusted and should + * be sanitized before display to the user. + */ + description: string | undefined; + /** + * Gets or sets the position of the feature, or undefined if the position is not known. + */ + position: Cartographic | undefined; + /** + * Gets or sets the raw data describing the feature. The raw data may be in any + * number of formats, such as GeoJSON, KML, etc. + */ + data: any | undefined; + /** + * Gets or sets the image layer of the feature. + */ + imageryLayer: any | undefined; + /** + * Configures the name of this feature by selecting an appropriate property. The name will be obtained from + * one of the following sources, in this order: 1) the property with the name 'name', 2) the property with the name 'title', + * 3) the first property containing the word 'name', 4) the first property containing the word 'title'. If + * the name cannot be obtained from any of these sources, the existing name will be left unchanged. + * @param properties - An object literal containing the properties of the feature. + */ + configureNameFromProperties(properties: any): void; + /** + * Configures the description of this feature by creating an HTML table of properties and their values. + * @param properties - An object literal containing the properties of the feature. + */ + configureDescriptionFromProperties(properties: any): void; +} + +/** + * Provides imagery to be displayed on the surface of an ellipsoid. This type describes an + * interface and is not intended to be instantiated directly. + */ +export class ImageryProvider { + constructor(); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link ImageryProvider#ready} returns true. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link ImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link ImageryProvider#ready} returns true. + * This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; + /** + * Loads an image from a given URL. If the server referenced by the URL already has + * too many requests pending, this function will instead return undefined, indicating + * that the request should be retried later. + * @param imageryProvider - The imagery provider for the URL. + * @param url - The URL of the image. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + static loadImage(imageryProvider: ImageryProvider, url: Resource | string): Promise | undefined; +} + +/** + * The direction to display an ImageryLayer relative to the {@link Scene#imagerySplitPosition}. + */ +export enum ImagerySplitDirection { + /** + * Display the ImageryLayer to the left of the {@link Scene#imagerySplitPosition}. + */ + LEFT = -1, + /** + * Always display the ImageryLayer. + */ + NONE = 0, + /** + * Display the ImageryLayer to the right of the {@link Scene#imagerySplitPosition}. + */ + RIGHT = 1 +} + +export namespace IonImageryProvider { + /** + * Initialization options for the TileMapServiceImageryProvider constructor + * @property assetId - An ion imagery asset ID + * @property [accessToken = Ion.defaultAccessToken] - The access token to use. + * @property [server = Ion.defaultServer] - The resource to the Cesium ion API server. + */ + type ConstructorOptions = { + assetId: number; + accessToken?: string; + server?: string | Resource; + }; +} + +/** + * Provides tiled imagery using the Cesium ion REST API. + * @example + * viewer.imageryLayers.addImageryProvider(new Cesium.IonImageryProvider({ assetId : 23489024 })); + * @param options - Object describing initialization options + */ +export class IonImageryProvider { + constructor(options: IonImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link IonImageryProvider#ready} returns true. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link IonImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link IonImageryProvider#ready} returns true. + * This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * The types of imagery provided by {@link createWorldImagery}. + */ +export enum IonWorldImageryStyle { + /** + * Aerial imagery. + */ + AERIAL = 2, + /** + * Aerial imagery with a road overlay. + */ + AERIAL_WITH_LABELS = 3, + /** + * Roads without additional imagery. + */ + ROAD = 4 +} + +/** + * A Label draws viewport-aligned text positioned in the 3D scene. This constructor + * should not be used directly, instead create labels by calling {@link LabelCollection#add}. + */ +export class Label { + constructor(); + /** + * Determines if this label will be shown. Use this to hide or show a label, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this label. + */ + position: Cartesian3; + /** + * Gets or sets the height reference of this billboard. + */ + heightReference: HeightReference; + /** + * Gets or sets the text of this label. + */ + text: string; + /** + * Gets or sets the font used to draw this label. Fonts are specified using the same syntax as the CSS 'font' property. + */ + font: string; + /** + * Gets or sets the fill color of this label. + */ + fillColor: Color; + /** + * Gets or sets the outline color of this label. + */ + outlineColor: Color; + /** + * Gets or sets the outline width of this label. + */ + outlineWidth: number; + /** + * Determines if a background behind this label will be shown. + */ + showBackground: boolean; + /** + * Gets or sets the background color of this label. + */ + backgroundColor: Color; + /** + * Gets or sets the background padding, in pixels, of this label. The x value + * controls horizontal padding, and the y value controls vertical padding. + */ + backgroundPadding: Cartesian2; + /** + * Gets or sets the style of this label. + */ + style: LabelStyle; + /** + * Gets or sets the pixel offset in screen space from the origin of this label. This is commonly used + * to align multiple labels and billboards at the same position, e.g., an image and text. The + * screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + *

    + *
    + * + * + * + *
    default
    l.pixeloffset = new Cartesian2(25, 75);
    + * The label's origin is indicated by the yellow point. + *
    + */ + pixelOffset: Cartesian2; + /** + * Gets or sets near and far translucency properties of a Label based on the Label's distance from the camera. + * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @example + * // Example 1. + * // Set a label's translucencyByDistance to 1.0 when the + * // camera is 1500 meters from the label and disappear as + * // the camera distance approaches 8.0e6 meters. + * text.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable translucency by distance + * text.translucencyByDistance = undefined; + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets near and far pixel offset scaling properties of a Label based on the Label's distance from the camera. + * A label's pixel offset will be scaled between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's pixel offset scaling remains clamped to the nearest bound. If undefined, + * pixelOffsetScaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a label's pixel offset scale to 0.0 when the + * // camera is 1500 meters from the label and scale pixel offset to 10.0 pixels + * // in the y direction the camera distance approaches 8.0e6 meters. + * text.pixelOffset = new Cesium.Cartesian2(0.0, 1.0); + * text.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(1.5e2, 0.0, 8.0e6, 10.0); + * @example + * // Example 2. + * // disable pixel offset by distance + * text.pixelOffsetScaleByDistance = undefined; + */ + pixelOffsetScaleByDistance: NearFarScalar; + /** + * Gets or sets near and far scaling properties of a Label based on the label's distance from the camera. + * A label's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a label's scaleByDistance to scale by 1.5 when the + * // camera is 1500 meters from the label and disappear as + * // the camera distance approaches 8.0e6 meters. + * label.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable scaling by distance + * label.scaleByDistance = undefined; + */ + scaleByDistance: NearFarScalar; + /** + * Gets and sets the 3D Cartesian offset applied to this label in eye coordinates. Eye coordinates is a left-handed + * coordinate system, where x points towards the viewer's right, y points up, and + * z points into the screen. Eye coordinates use the same scale as world and model coordinates, + * which is typically meters. + *

    + * An eye offset is commonly used to arrange multiple label or objects at the same position, e.g., to + * arrange a label above its corresponding 3D model. + *

    + * Below, the label is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

    + *
    + * + * + * + *
    + * l.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

    + *
    + */ + eyeOffset: Cartesian3; + /** + * Gets or sets the horizontal origin of this label, which determines if the label is drawn + * to the left, center, or right of its anchor position. + *

    + *
    + *
    + *
    + * @example + * // Use a top, right origin + * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; + * l.verticalOrigin = Cesium.VerticalOrigin.TOP; + */ + horizontalOrigin: HorizontalOrigin; + /** + * Gets or sets the vertical origin of this label, which determines if the label is + * to the above, below, or at the center of its anchor position. + *

    + *
    + *
    + *
    + * @example + * // Use a top, right origin + * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; + * l.verticalOrigin = Cesium.VerticalOrigin.TOP; + */ + verticalOrigin: VerticalOrigin; + /** + * Gets or sets the uniform scale that is multiplied with the label's size in pixels. + * A scale of 1.0 does not change the size of the label; a scale greater than + * 1.0 enlarges the label; a positive scale less than 1.0 shrinks + * the label. + *

    + * Applying a large scale value may pixelate the label. To make text larger without pixelation, + * use a larger font size when calling {@link Label#font} instead. + *

    + *
    + *
    + * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
    + */ + scale: number; + /** + * Gets the total scale of the label, which is the label's scale multiplied by the computed relative size + * of the desired font compared to the generated glyph size. + */ + totalScale: number; + /** + * Gets or sets the condition specifying at what distance from the camera that this label will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the user-defined value returned when the label is picked. + */ + id: any; + /** + * Computes the screen-space position of the label's origin, taking into account eye and pixel offsets. + * The screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + * @example + * console.log(l.computeScreenSpacePosition(scene).toString()); + * @param scene - The scene the label is in. + * @param [result] - The object onto which to store the result. + * @returns The screen-space position of the label. + */ + computeScreenSpacePosition(scene: Scene, result?: Cartesian2): Cartesian2; + /** + * Determines if this label equals another label. Labels are equal if all their properties + * are equal. Labels in different collections can be equal. + * @param other - The label to compare for equality. + * @returns true if the labels are equal; otherwise, false. + */ + equals(other: Label): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Determines whether or not run the algorithm, that match the text of the label to right-to-left languages + * @example + * // Example 1. + * // Set a label's rightToLeft before init + * Cesium.Label.enableRightToLeftDetection = true; + * var myLabelEntity = viewer.entities.add({ + * label: { + * id: 'my label', + * text: 'זה טקסט בעברית \n ועכשיו יורדים שורה', + * } + * }); + * @example + * // Example 2. + * var myLabelEntity = viewer.entities.add({ + * label: { + * id: 'my label', + * text: 'English text' + * } + * }); + * // Set a label's rightToLeft after init + * Cesium.Label.enableRightToLeftDetection = true; + * myLabelEntity.text = 'טקסט חדש'; + */ + static enableRightToLeftDetection: boolean; +} + +/** + * A renderable collection of labels. Labels are viewport-aligned text positioned in the 3D scene. + * Each label can have a different font, color, scale, etc. + *

    + *
    + *
    + * Example labels + *
    + *

    + * Labels are added and removed from the collection using {@link LabelCollection#add} + * and {@link LabelCollection#remove}. + * @example + * // Create a label collection with two labels + * var labels = scene.primitives.add(new Cesium.LabelCollection()); + * labels.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * text : 'A label' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * text : 'Another label' + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each label from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.scene] - Must be passed in for labels that use the height reference property or will be depth tested against the globe. + * @param [options.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT] - The label blending option. The default + * is used for rendering both opaque and translucent labels. However, if either all of the labels are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve performance by up to 2x. + */ +export class LabelCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + scene?: Scene; + blendOption?: BlendOption; + }); + /** + * The 4x4 transformation matrix that transforms each label in this collection from model to world coordinates. + * When this is the identity matrix, the labels are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * var center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * labels.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * labels.add({ + * position : new Cesium.Cartesian3(0.0, 0.0, 0.0), + * text : 'Center' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0), + * text : 'East' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0), + * text : 'North' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0), + * text : 'Up' + * }); + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * The label blending option. The default is used for rendering both opaque and translucent labels. + * However, if either all of the labels are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve + * performance by up to 2x. + */ + blendOption: BlendOption; + /** + * Returns the number of labels in this collection. This is commonly used with + * {@link LabelCollection#get} to iterate over all the labels + * in the collection. + */ + length: number; + /** + * Creates and adds a label with the specified initial properties to the collection. + * The added label is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a label, specifying all the default values. + * var l = labels.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * text : '', + * font : '30px sans-serif', + * fillColor : Cesium.Color.WHITE, + * outlineColor : Cesium.Color.BLACK, + * outlineWidth : 1.0, + * showBackground : false, + * backgroundColor : new Cesium.Color(0.165, 0.165, 0.165, 0.8), + * backgroundPadding : new Cesium.Cartesian2(7, 5), + * style : Cesium.LabelStyle.FILL, + * pixelOffset : Cesium.Cartesian2.ZERO, + * eyeOffset : Cesium.Cartesian3.ZERO, + * horizontalOrigin : Cesium.HorizontalOrigin.LEFT, + * verticalOrigin : Cesium.VerticalOrigin.BASELINE, + * scale : 1.0, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * heightReference : HeightReference.NONE, + * distanceDisplayCondition : undefined + * }); + * @example + * // Example 2: Specify only the label's cartographic position, + * // text, and font. + * var l = labels.add({ + * position : Cesium.Cartesian3.fromRadians(longitude, latitude, height), + * text : 'Hello World', + * font : '24px Helvetica', + * }); + * @param [options] - A template describing the label's properties as shown in Example 1. + * @returns The label that was added to the collection. + */ + add(options?: any): Label; + /** + * Removes a label from the collection. Once removed, a label is no longer usable. + * @example + * var l = labels.add(...); + * labels.remove(l); // Returns true + * @param label - The label to remove. + * @returns true if the label was removed; false if the label was not found in the collection. + */ + remove(label: Label): boolean; + /** + * Removes all labels from the collection. + * @example + * labels.add(...); + * labels.add(...); + * labels.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given label. + * @param label - The label to check for. + * @returns true if this collection contains the label, false otherwise. + */ + contains(label: Label): boolean; + /** + * Returns the label in the collection at the specified index. Indices are zero-based + * and increase as labels are added. Removing a label shifts all labels after + * it to the left, changing their indices. This function is commonly used with + * {@link LabelCollection#length} to iterate over all the labels + * in the collection. + * @example + * // Toggle the show property of every label in the collection + * var len = labels.length; + * for (var i = 0; i < len; ++i) { + * var l = billboards.get(i); + * l.show = !l.show; + * } + * @param index - The zero-based index of the billboard. + * @returns The label at the specified index. + */ + get(index: number): Label; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * labels = labels && labels.destroy(); + */ + destroy(): void; +} + +/** + * Describes how to draw a label. + */ +export enum LabelStyle { + /** + * Fill the text of the label, but do not outline. + */ + FILL = 0, + /** + * Outline the text of the label, but do not fill. + */ + OUTLINE = 1, + /** + * Fill and outline the text of the label. + */ + FILL_AND_OUTLINE = 2 +} + +/** + * A light source. This type describes an interface and is not intended to be instantiated directly. + */ +export class Light { + constructor(); + /** + * The color of the light. + */ + color: Color; + /** + * The intensity of the light. + */ + intensity: number; +} + +/** + * Describes how the map will operate in 2D. + */ +export enum MapMode2D { + /** + * The 2D map can be rotated about the z axis. + */ + ROTATE = 0, + /** + * The 2D map can be scrolled infinitely in the horizontal direction. + */ + INFINITE_SCROLL = 1 +} + +export namespace MapboxImageryProvider { + /** + * Initialization options for the MapboxImageryProvider constructor + * @property [url = 'https://api.mapbox.com/v4/'] - The Mapbox server url. + * @property mapId - The Mapbox Map ID. + * @property accessToken - The public access token for the imagery. + * @property [format = 'png'] - The format of the image request. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url?: string; + mapId: string; + accessToken: string; + format?: string; + ellipsoid?: Ellipsoid; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + credit?: Credit | string; + }; +} + +/** + * Provides tiled imagery hosted by Mapbox. + * @example + * // Mapbox tile provider + * var mapbox = new Cesium.MapboxImageryProvider({ + * mapId: 'mapbox.streets', + * accessToken: 'thisIsMyAccessToken' + * }); + * @param options - Object describing initialization options + */ +export class MapboxImageryProvider { + constructor(options: MapboxImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the URL of the Mapbox server. + */ + readonly url: string; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link MapboxImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link MapboxImageryProvider#ready} returns true. + * This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +export namespace MapboxStyleImageryProvider { + /** + * Initialization options for the MapboxStyleImageryProvider constructor + * @property [url = 'https://api.mapbox.com/styles/v1/'] - The Mapbox server url. + * @property [username = 'mapbox'] - The username of the map account. + * @property styleId - The Mapbox Style ID. + * @property accessToken - The public access token for the imagery. + * @property [tilesize = 512] - The size of the image tiles. + * @property [scaleFactor] - Determines if tiles are rendered at a @2x scale factor. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url?: Resource | string; + username?: string; + styleId: string; + accessToken: string; + tilesize?: number; + scaleFactor?: boolean; + ellipsoid?: Ellipsoid; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + credit?: Credit | string; + }; +} + +/** + * Provides tiled imagery hosted by Mapbox. + * @example + * // Mapbox style provider + * var mapbox = new Cesium.MapboxStyleImageryProvider({ + * styleId: 'streets-v11', + * accessToken: 'thisIsMyAccessToken' + * }); + * @param options - Object describing initialization options + */ +export class MapboxStyleImageryProvider { + constructor(options: MapboxStyleImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the URL of the Mapbox server. + */ + readonly url: string; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link MapboxStyleImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link MapboxStyleImageryProvider#ready} returns true. + * This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * A Material defines surface appearance through a combination of diffuse, specular, + * normal, emission, and alpha components. These values are specified using a + * JSON schema called Fabric which gets parsed and assembled into glsl shader code + * behind-the-scenes. Check out the {@link https://github.com/CesiumGS/cesium/wiki/Fabric|wiki page} + * for more details on Fabric. + *

    + * + * + * Base material types and their uniforms: + *
    + *
      + *
    • Color
    • + *
        + *
      • color: rgba color object.
      • + *
      + *
    • Image
    • + *
        + *
      • image: path to image.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      + *
    • DiffuseMap
    • + *
        + *
      • image: path to image.
      • + *
      • channels: Three character string containing any combination of r, g, b, and a for selecting the desired image channels.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      + *
    • AlphaMap
    • + *
        + *
      • image: path to image.
      • + *
      • channel: One character string containing r, g, b, or a for selecting the desired image channel.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      + *
    • SpecularMap
    • + *
        + *
      • image: path to image.
      • + *
      • channel: One character string containing r, g, b, or a for selecting the desired image channel.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      + *
    • EmissionMap
    • + *
        + *
      • image: path to image.
      • + *
      • channels: Three character string containing any combination of r, g, b, and a for selecting the desired image channels.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      + *
    • BumpMap
    • + *
        + *
      • image: path to image.
      • + *
      • channel: One character string containing r, g, b, or a for selecting the desired image channel.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      • strength: Bump strength value between 0.0 and 1.0 where 0.0 is small bumps and 1.0 is large bumps.
      • + *
      + *
    • NormalMap
    • + *
        + *
      • image: path to image.
      • + *
      • channels: Three character string containing any combination of r, g, b, and a for selecting the desired image channels.
      • + *
      • repeat: Object with x and y values specifying the number of times to repeat the image.
      • + *
      • strength: Bump strength value between 0.0 and 1.0 where 0.0 is small bumps and 1.0 is large bumps.
      • + *
      + *
    • Grid
    • + *
        + *
      • color: rgba color object for the whole material.
      • + *
      • cellAlpha: Alpha value for the cells between grid lines. This will be combined with color.alpha.
      • + *
      • lineCount: Object with x and y values specifying the number of columns and rows respectively.
      • + *
      • lineThickness: Object with x and y values specifying the thickness of grid lines (in pixels where available).
      • + *
      • lineOffset: Object with x and y values specifying the offset of grid lines (range is 0 to 1).
      • + *
      + *
    • Stripe
    • + *
        + *
      • horizontal: Boolean that determines if the stripes are horizontal or vertical.
      • + *
      • evenColor: rgba color object for the stripe's first color.
      • + *
      • oddColor: rgba color object for the stripe's second color.
      • + *
      • offset: Number that controls at which point into the pattern to begin drawing; with 0.0 being the beginning of the even color, 1.0 the beginning of the odd color, 2.0 being the even color again, and any multiple or fractional values being in between.
      • + *
      • repeat: Number that controls the total number of stripes, half light and half dark.
      • + *
      + *
    • Checkerboard
    • + *
        + *
      • lightColor: rgba color object for the checkerboard's light alternating color.
      • + *
      • darkColor: rgba color object for the checkerboard's dark alternating color.
      • + *
      • repeat: Object with x and y values specifying the number of columns and rows respectively.
      • + *
      + *
    • Dot
    • + *
        + *
      • lightColor: rgba color object for the dot color.
      • + *
      • darkColor: rgba color object for the background color.
      • + *
      • repeat: Object with x and y values specifying the number of columns and rows of dots respectively.
      • + *
      + *
    • Water
    • + *
        + *
      • baseWaterColor: rgba color object base color of the water.
      • + *
      • blendColor: rgba color object used when blending from water to non-water areas.
      • + *
      • specularMap: Single channel texture used to indicate areas of water.
      • + *
      • normalMap: Normal map for water normal perturbation.
      • + *
      • frequency: Number that controls the number of waves.
      • + *
      • normalMap: Normal map for water normal perturbation.
      • + *
      • animationSpeed: Number that controls the animations speed of the water.
      • + *
      • amplitude: Number that controls the amplitude of water waves.
      • + *
      • specularIntensity: Number that controls the intensity of specular reflections.
      • + *
      + *
    • RimLighting
    • + *
        + *
      • color: diffuse color and alpha.
      • + *
      • rimColor: diffuse color and alpha of the rim.
      • + *
      • width: Number that determines the rim's width.
      • + *
      + *
    • Fade
    • + *
        + *
      • fadeInColor: diffuse color and alpha at time
      • + *
      • fadeOutColor: diffuse color and alpha at maximumDistance from time
      • + *
      • maximumDistance: Number between 0.0 and 1.0 where the fadeInColor becomes the fadeOutColor. A value of 0.0 gives the entire material a color of fadeOutColor and a value of 1.0 gives the the entire material a color of fadeInColor
      • + *
      • repeat: true if the fade should wrap around the texture coodinates.
      • + *
      • fadeDirection: Object with x and y values specifying if the fade should be in the x and y directions.
      • + *
      • time: Object with x and y values between 0.0 and 1.0 of the fadeInColor position
      • + *
      + *
    • PolylineArrow
    • + *
        + *
      • color: diffuse color and alpha.
      • + *
      + *
    • PolylineDash
    • + *
        + *
      • color: color for the line.
      • + *
      • gapColor: color for the gaps in the line.
      • + *
      • dashLength: Dash length in pixels.
      • + *
      • dashPattern: The 16 bit stipple pattern for the line..
      • + *
      + *
    • PolylineGlow
    • + *
        + *
      • color: color and maximum alpha for the glow on the line.
      • + *
      • glowPower: strength of the glow, as a percentage of the total line width (less than 1.0).
      • + *
      • taperPower: strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used.
      • + *
      + *
    • PolylineOutline
    • + *
        + *
      • color: diffuse color and alpha for the interior of the line.
      • + *
      • outlineColor: diffuse color and alpha for the outline.
      • + *
      • outlineWidth: width of the outline in pixels.
      • + *
      + *
    • ElevationContour
    • + *
        + *
      • color: color and alpha for the contour line.
      • + *
      • spacing: spacing for contour lines in meters.
      • + *
      • width: Number specifying the width of the grid lines in pixels.
      • + *
      + *
    • ElevationRamp
    • + *
        + *
      • image: color ramp image to use for coloring the terrain.
      • + *
      • minimumHeight: minimum height for the ramp.
      • + *
      • maximumHeight: maximum height for the ramp.
      • + *
      + *
    • SlopeRamp
    • + *
        + *
      • image: color ramp image to use for coloring the terrain by slope.
      • + *
      + *
    • AspectRamp
    • + *
        + *
      • image: color ramp image to use for color the terrain by aspect.
      • + *
      + *
    + * + *
    + * @example + * // Create a color material with fromType: + * polygon.material = Cesium.Material.fromType('Color'); + * polygon.material.uniforms.color = new Cesium.Color(1.0, 1.0, 0.0, 1.0); + * + * // Create the default material: + * polygon.material = new Cesium.Material(); + * + * // Create a color material with full Fabric notation: + * polygon.material = new Cesium.Material({ + * fabric : { + * type : 'Color', + * uniforms : { + * color : new Cesium.Color(1.0, 1.0, 0.0, 1.0) + * } + * } + * }); + * @param [options] - Object with the following properties: + * @param [options.strict = false] - Throws errors for issues that would normally be ignored, including unused uniforms or materials. + * @param [options.translucent = true] - When true or a function that returns true, the geometry + * with this material is expected to appear translucent. + * @param [options.minificationFilter = TextureMinificationFilter.LINEAR] - The {@link TextureMinificationFilter} to apply to this material's textures. + * @param [options.magnificationFilter = TextureMagnificationFilter.LINEAR] - The {@link TextureMagnificationFilter} to apply to this material's textures. + * @param options.fabric - The fabric JSON used to generate the material. + */ +export class Material { + constructor(options?: { + strict?: boolean; + translucent?: boolean | ((...params: any[]) => any); + minificationFilter?: TextureMinificationFilter; + magnificationFilter?: TextureMagnificationFilter; + fabric: any; + }); + /** + * The material type. Can be an existing type or a new type. If no type is specified in fabric, type is a GUID. + */ + type: string; + /** + * The glsl shader source for this material. + */ + shaderSource: string; + /** + * Maps sub-material names to Material objects. + */ + materials: any; + /** + * Maps uniform names to their values. + */ + uniforms: any; + /** + * When true or a function that returns true, + * the geometry is expected to appear translucent. + */ + translucent: boolean | ((...params: any[]) => any); + /** + * Creates a new material using an existing material type. + *

    + * Shorthand for: new Material({fabric : {type : type}}); + * @example + * var material = Cesium.Material.fromType('Color', { + * color : new Cesium.Color(1.0, 0.0, 0.0, 1.0) + * }); + * @param type - The base material type. + * @param [uniforms] - Overrides for the default uniforms. + * @returns New material object. + */ + static fromType(type: string, uniforms?: any): Material; + /** + * Gets whether or not this material is translucent. + * @returns true if this material is translucent, false otherwise. + */ + isTranslucent(): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * material = material && material.destroy(); + */ + destroy(): void; + /** + * Gets or sets the default texture uniform value. + */ + static DefaultImageId: string; + /** + * Gets or sets the default cube map texture uniform value. + */ + static DefaultCubeMapId: string; + /** + * Gets the name of the color material. + */ + static readonly ColorType: string; + /** + * Gets the name of the image material. + */ + static readonly ImageType: string; + /** + * Gets the name of the diffuce map material. + */ + static readonly DiffuseMapType: string; + /** + * Gets the name of the alpha map material. + */ + static readonly AlphaMapType: string; + /** + * Gets the name of the specular map material. + */ + static readonly SpecularMapType: string; + /** + * Gets the name of the emmision map material. + */ + static readonly EmissionMapType: string; + /** + * Gets the name of the bump map material. + */ + static readonly BumpMapType: string; + /** + * Gets the name of the normal map material. + */ + static readonly NormalMapType: string; + /** + * Gets the name of the grid material. + */ + static readonly GridType: string; + /** + * Gets the name of the stripe material. + */ + static readonly StripeType: string; + /** + * Gets the name of the checkerboard material. + */ + static readonly CheckerboardType: string; + /** + * Gets the name of the dot material. + */ + static readonly DotType: string; + /** + * Gets the name of the water material. + */ + static readonly WaterType: string; + /** + * Gets the name of the rim lighting material. + */ + static readonly RimLightingType: string; + /** + * Gets the name of the fade material. + */ + static readonly FadeType: string; + /** + * Gets the name of the polyline arrow material. + */ + static readonly PolylineArrowType: string; + /** + * Gets the name of the polyline glow material. + */ + static readonly PolylineDashType: string; + /** + * Gets the name of the polyline glow material. + */ + static readonly PolylineGlowType: string; + /** + * Gets the name of the polyline outline material. + */ + static readonly PolylineOutlineType: string; + /** + * Gets the name of the elevation contour material. + */ + static readonly ElevationContourType: string; + /** + * Gets the name of the elevation contour material. + */ + static readonly ElevationRampType: string; + /** + * Gets the name of the slope ramp material. + */ + static readonly SlopeRampMaterialType: string; + /** + * Gets the name of the aspect ramp material. + */ + static readonly AspectRampMaterialType: string; +} + +/** + * An appearance for arbitrary geometry (as opposed to {@link EllipsoidSurfaceAppearance}, for example) + * that supports shading with materials. + * @example + * var primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.WallGeometry({ + * materialSupport : Cesium.MaterialAppearance.MaterialSupport.BASIC.vertexFormat, + * // ... + * }) + * }), + * appearance : new Cesium.MaterialAppearance({ + * material : Cesium.Material.fromType('Color'), + * faceForward : true + * }) + * + * }); + * @param [options] - Object with the following properties: + * @param [options.flat = false] - When true, flat shading is used in the fragment shader, which means lighting is not taking into account. + * @param [options.faceForward = !options.closed] - When true, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots. This is useful when both sides of a geometry should be shaded like {@link WallGeometry}. + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link MaterialAppearance#renderState} has alpha blending enabled. + * @param [options.closed = false] - When true, the geometry is expected to be closed so {@link MaterialAppearance#renderState} has backface culling enabled. + * @param [options.materialSupport = MaterialAppearance.MaterialSupport.TEXTURED] - The type of materials that will be supported. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class MaterialAppearance { + constructor(options?: { + flat?: boolean; + faceForward?: boolean; + translucent?: boolean; + closed?: boolean; + materialSupport?: MaterialAppearance.MaterialSupportType; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link MaterialAppearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account {@link MaterialAppearance#material}, + * {@link MaterialAppearance#flat}, and {@link MaterialAppearance#faceForward}. + * Use {@link MaterialAppearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

    + * The render state can be explicitly defined when constructing a {@link MaterialAppearance} + * instance, or it is set implicitly via {@link MaterialAppearance#translucent} + * and {@link MaterialAppearance#closed}. + *

    + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link MaterialAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + */ + readonly closed: boolean; + /** + * The type of materials supported by this instance. This impacts the required + * {@link VertexFormat} and the complexity of the vertex and fragment shaders. + */ + readonly materialSupport: MaterialAppearance.MaterialSupportType; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + */ + readonly flat: boolean; + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + */ + readonly faceForward: boolean; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link MaterialAppearance}, + * this is derived from {@link MaterialAppearance#fragmentShaderSource}, {@link MaterialAppearance#material}, + * {@link MaterialAppearance#flat}, and {@link MaterialAppearance#faceForward}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link MaterialAppearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +export namespace MaterialAppearance { + type MaterialSupportType = { + vertexFormat: VertexFormat; + vertexShaderSource: string; + fragmentShaderSource: string; + }; + /** + * Determines the type of {@link Material} that is supported by a + * {@link MaterialAppearance} instance. This is a trade-off between + * flexibility (a wide array of materials) and memory/performance + * (required vertex format and GLSL shader complexity. + */ + namespace MaterialSupport { + /** + * Only basic materials, which require just position and + * normal vertex attributes, are supported. + */ + const BASIC: MaterialAppearance.MaterialSupportType; + /** + * Materials with textures, which require position, + * normal, and st vertex attributes, + * are supported. The vast majority of materials fall into this category. + */ + const TEXTURED: MaterialAppearance.MaterialSupportType; + /** + * All materials, including those that work in tangent space, are supported. + * This requires position, normal, st, + * tangent, and bitangent vertex attributes. + */ + const ALL: MaterialAppearance.MaterialSupportType; + } +} + +/** + * A 3D model based on glTF, the runtime asset format for WebGL, OpenGL ES, and OpenGL. + *

    + * Cesium includes support for geometry and materials, glTF animations, and glTF skinning. + * In addition, individual glTF nodes are pickable with {@link Scene#pick} and animatable + * with {@link Model#getNode}. glTF cameras and lights are not currently supported. + *

    + *

    + * An external glTF asset is created with {@link Model.fromGltf}. glTF JSON can also be + * created at runtime and passed to this constructor function. In either case, the + * {@link Model#readyPromise} is resolved when the model is ready to render, i.e., + * when the external binary, image, and shader files are downloaded and the WebGL + * resources are created. + *

    + *

    + * Cesium supports glTF assets with the following extensions: + *

      + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/README.md|KHR_binary_glTF (glTF 1.0)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_materials_common/README.md|KHR_materials_common (glTF 1.0)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Vendor/WEB3D_quantized_attributes/README.md|WEB3D_quantized_attributes (glTF 1.0)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/AGI_articulations/README.md|AGI_articulations} + *
    • + * {@link https://github.com/KhronosGroup/glTF/pull/1302|KHR_blend (draft)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_draco_mesh_compression/README.md|KHR_draco_mesh_compression} + *
    • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness/README.md|KHR_materials_pbrSpecularGlossiness} + *
    • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit/README.md|KHR_materials_unlit} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_techniques_webgl/README.md|KHR_techniques_webgl} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform/README.md|KHR_texture_transform} + *
    • + *
    + *

    + *

    + * For high-precision rendering, Cesium supports the {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Vendor/CESIUM_RTC/README.md|CESIUM_RTC} extension, which introduces the + * CESIUM_RTC_MODELVIEW parameter semantic that says the node is in WGS84 coordinates translated + * relative to a local origin. + *

    + * @param [options] - Object with the following properties: + * @param [options.gltf] - A glTF JSON object, or a binary glTF buffer. + * @param [options.basePath = ''] - The base path that paths in the glTF JSON are relative to. + * @param [options.show = true] - Determines if the model primitive will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the model from model to world coordinates. + * @param [options.scale = 1.0] - A uniform scale applied to this model. + * @param [options.minimumPixelSize = 0.0] - The approximate minimum pixel size of the model regardless of zoom. + * @param [options.maximumScale] - The maximum scale size of a model. An upper limit for minimumPixelSize. + * @param [options.id] - A user-defined object to return when the model is picked with {@link Scene#pick}. + * @param [options.allowPicking = true] - When true, each glTF mesh and primitive is pickable with {@link Scene#pick}. + * @param [options.incrementallyLoadTextures = true] - Determine if textures may continue to stream in after the model is loaded. + * @param [options.asynchronous = true] - Determines if model WebGL resource creation will be spread out over several frames or block until completion once all glTF files are loaded. + * @param [options.clampAnimations = true] - Determines if the model's animations should hold a pose over frames where no keyframes are specified. + * @param [options.shadows = ShadowMode.ENABLED] - Determines whether the model casts or receives shadows from light sources. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Draws the bounding sphere for each draw command in the model. + * @param [options.debugWireframe = false] - For debugging only. Draws the model in wireframe. + * @param [options.heightReference = HeightReference.NONE] - Determines how the model is drawn relative to terrain. + * @param [options.scene] - Must be passed in for models that use the height reference property. + * @param [options.distanceDisplayCondition] - The condition specifying at what distance from the camera that this model will be displayed. + * @param [options.color = Color.WHITE] - A color that blends with the model's rendered color. + * @param [options.colorBlendMode = ColorBlendMode.HIGHLIGHT] - Defines how the color blends with the model. + * @param [options.colorBlendAmount = 0.5] - Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @param [options.silhouetteColor = Color.RED] - The silhouette color. If more than 256 models have silhouettes enabled, there is a small chance that overlapping models will have minor artifacts. + * @param [options.silhouetteSize = 0.0] - The size of the silhouette in pixels. + * @param [options.clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the model. + * @param [options.dequantizeInShader = true] - Determines if a {@link https://github.com/google/draco|Draco} encoded model is dequantized on the GPU. This decreases total memory usage for encoded models. + * @param [options.imageBasedLightingFactor = Cartesian2(1.0, 1.0)] - Scales diffuse and specular image-based lighting from the earth, sky, atmosphere and star skybox. + * @param [options.lightColor] - The light color when shading the model. When undefined the scene's light color is used instead. + * @param [options.luminanceAtZenith = 0.2] - The sun's luminance at the zenith in kilo candela per meter squared to use for this model's procedural environment map. + * @param [options.sphericalHarmonicCoefficients] - The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. + * @param [options.specularEnvironmentMaps] - A URL to a KTX file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + * @param [options.backFaceCulling = true] - Whether to cull back-facing geometry. When true, back face culling is determined by the material's doubleSided property; when false, back face culling is disabled. Back faces are not culled if {@link Model#color} is translucent or {@link Model#silhouetteSize} is greater than 0.0. + */ +export class Model { + constructor(options?: { + gltf?: any | ArrayBuffer | Uint8Array; + basePath?: Resource | string; + show?: boolean; + modelMatrix?: Matrix4; + scale?: number; + minimumPixelSize?: number; + maximumScale?: number; + id?: any; + allowPicking?: boolean; + incrementallyLoadTextures?: boolean; + asynchronous?: boolean; + clampAnimations?: boolean; + shadows?: ShadowMode; + debugShowBoundingVolume?: boolean; + debugWireframe?: boolean; + heightReference?: HeightReference; + scene?: Scene; + distanceDisplayCondition?: DistanceDisplayCondition; + color?: Color; + colorBlendMode?: ColorBlendMode; + colorBlendAmount?: number; + silhouetteColor?: Color; + silhouetteSize?: number; + clippingPlanes?: ClippingPlaneCollection; + dequantizeInShader?: boolean; + imageBasedLightingFactor?: Cartesian2; + lightColor?: Cartesian3; + luminanceAtZenith?: number; + sphericalHarmonicCoefficients?: Cartesian3[]; + specularEnvironmentMaps?: string; + credit?: Credit | string; + backFaceCulling?: boolean; + }); + /** + * Determines if the model primitive will be shown. + */ + show: boolean; + /** + * The silhouette color. + */ + silhouetteColor: Color; + /** + * The size of the silhouette in pixels. + */ + silhouetteSize: number; + /** + * The 4x4 transformation matrix that transforms the model from model to world coordinates. + * When this is the identity matrix, the model is drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * var origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 200000.0); + * m.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin); + */ + modelMatrix: Matrix4; + /** + * A uniform scale applied to this model before the {@link Model#modelMatrix}. + * Values greater than 1.0 increase the size of the model; values + * less than 1.0 decrease. + */ + scale: number; + /** + * The approximate minimum pixel size of the model regardless of zoom. + * This can be used to ensure that a model is visible even when the viewer + * zooms out. When 0.0, no minimum size is enforced. + */ + minimumPixelSize: number; + /** + * The maximum scale size for a model. This can be used to give + * an upper limit to the {@link Model#minimumPixelSize}, ensuring that the model + * is never an unreasonable scale. + */ + maximumScale: number; + /** + * User-defined object returned when the model is picked. + */ + id: any; + /** + * Returns the height reference of the model + */ + heightReference: HeightReference; + /** + * The currently playing glTF animations. + */ + activeAnimations: ModelAnimationCollection; + /** + * Determines if the model's animations should hold a pose over frames where no keyframes are specified. + */ + clampAnimations: boolean; + /** + * Determines whether the model casts or receives shadows from light sources. + */ + shadows: ShadowMode; + /** + * A color that blends with the model's rendered color. + */ + color: Color; + /** + * Defines how the color blends with the model. + */ + colorBlendMode: ColorBlendMode; + /** + * Value used to determine the color strength when the colorBlendMode is MIX. + * A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with + * any value in-between resulting in a mix of the two. + */ + colorBlendAmount: number; + /** + * Whether to cull back-facing geometry. When true, back face culling is + * determined by the material's doubleSided property; when false, back face + * culling is disabled. Back faces are not culled if {@link Model#color} is + * translucent or {@link Model#silhouetteSize} is greater than 0.0. + */ + backFaceCulling: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the model. A glTF primitive corresponds + * to one draw command. A glTF mesh has an array of primitives, often of length one. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the model in wireframe. + *

    + */ + debugWireframe: boolean; + /** + * The object for the glTF JSON, including properties with default values omitted + * from the JSON provided to this model. + */ + readonly gltf: any; + /** + * The base path that paths in the glTF JSON are relative to. The base + * path is the same path as the path containing the .gltf file + * minus the .gltf file, when binary, image, and shader files are + * in the same directory as the .gltf. When this is '', + * the app's base path is used. + */ + readonly basePath: string; + /** + * The model's bounding sphere in its local coordinate system. This does not take into + * account glTF animations and skins nor does it take into account {@link Model#minimumPixelSize}. + * @example + * // Center in WGS84 coordinates + * var center = Cesium.Matrix4.multiplyByPoint(model.modelMatrix, model.boundingSphere.center, new Cesium.Cartesian3()); + */ + readonly boundingSphere: BoundingSphere; + /** + * When true, this model is ready to render, i.e., the external binary, image, + * and shader files were downloaded and the WebGL resources were created. This is set to + * true right before {@link Model#readyPromise} is resolved. + */ + readonly ready: boolean; + /** + * Gets the promise that will be resolved when this model is ready to render, i.e., when the external binary, image, + * and shader files were downloaded and the WebGL resources were created. + *

    + * This promise is resolved at the end of the frame before the first frame the model is rendered in. + *

    + * @example + * // Play all animations at half-speed when the model is ready to render + * Cesium.when(model.readyPromise).then(function(model) { + * model.activeAnimations.addAll({ + * multiplier : 0.5 + * }); + * }).otherwise(function(error){ + * window.alert(error); + * }); + */ + readonly readyPromise: Promise; + /** + * Determines if model WebGL resource creation will be spread out over several frames or + * block until completion once all glTF files are loaded. + */ + readonly asynchronous: boolean; + /** + * When true, each glTF mesh and primitive is pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determine if textures may continue to stream in after the model is loaded. + */ + readonly incrementallyLoadTextures: boolean; + /** + * Return the number of pending texture loads. + */ + readonly pendingTextureLoads: number; + /** + * Gets or sets the condition specifying at what distance from the camera that this model will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the model. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * Cesium adds lighting from the earth, sky, atmosphere, and star skybox. This cartesian is used to scale the final + * diffuse and specular lighting contribution from those sources to the final color. A value of 0.0 will disable those light sources. + */ + imageBasedLightingFactor: Cartesian2; + /** + * The light color when shading the model. When undefined the scene's light color is used instead. + *

    + * For example, disabling additional light sources by setting model.imageBasedLightingFactor = new Cesium.Cartesian2(0.0, 0.0) will make the + * model much darker. Here, increasing the intensity of the light source will make the model brighter. + *

    + */ + lightColor: Cartesian3; + /** + * The sun's luminance at the zenith in kilo candela per meter squared to use for this model's procedural environment map. + * This is used when {@link Model#specularEnvironmentMaps} and {@link Model#sphericalHarmonicCoefficients} are not defined. + */ + luminanceAtZenith: number; + /** + * The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. When undefined, a diffuse irradiance + * computed from the atmosphere color is used. + *

    + * There are nine Cartesian3 coefficients. + * The order of the coefficients is: L00, L1-1, L10, L11, L2-2, L2-1, L20, L21, L22 + *

    + * + * These values can be obtained by preprocessing the environment map using the cmgen tool of + * {@link https://github.com/google/filament/releases|Google's Filament project}. This will also generate a KTX file that can be + * supplied to {@link Model#specularEnvironmentMaps}. + */ + sphericalHarmonicCoefficients: Cartesian3[]; + /** + * A URL to a KTX file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + */ + specularEnvironmentMaps: string; + /** + * Gets the credit that will be displayed for the model + */ + credit: Credit; + /** + * Determines if silhouettes are supported. + * @param scene - The scene. + * @returns true if silhouettes are supported; otherwise, returns false + */ + static silhouetteSupported(scene: Scene): boolean; + /** + *

    + * Creates a model from a glTF asset. When the model is ready to render, i.e., when the external binary, image, + * and shader files are downloaded and the WebGL resources are created, the {@link Model#readyPromise} is resolved. + *

    + *

    + * The model can be a traditional glTF asset with a .gltf extension or a Binary glTF using the .glb extension. + *

    + *

    + * Cesium supports glTF assets with the following extensions: + *

      + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/README.md|KHR_binary_glTF (glTF 1.0)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_materials_common/README.md|KHR_materials_common (glTF 1.0)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Vendor/WEB3D_quantized_attributes/README.md|WEB3D_quantized_attributes (glTF 1.0)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/AGI_articulations/README.md|AGI_articulations} + *
    • + * {@link https://github.com/KhronosGroup/glTF/pull/1302|KHR_blend (draft)} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_draco_mesh_compression/README.md|KHR_draco_mesh_compression} + *
    • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness/README.md|KHR_materials_pbrSpecularGlossiness} + *
    • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit/README.md|KHR_materials_unlit} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_techniques_webgl/README.md|KHR_techniques_webgl} + *
    • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform/README.md|KHR_texture_transform} + *
    • + *
    + *

    + *

    + * For high-precision rendering, Cesium supports the {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Vendor/CESIUM_RTC/README.md|CESIUM_RTC} extension, which introduces the + * CESIUM_RTC_MODELVIEW parameter semantic that says the node is in WGS84 coordinates translated + * relative to a local origin. + *

    + * @example + * // Example 1. Create a model from a glTF asset + * var model = scene.primitives.add(Cesium.Model.fromGltf({ + * url : './duck/duck.gltf' + * })); + * @example + * // Example 2. Create model and provide all properties and events + * var origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 200000.0); + * var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin); + * + * var model = scene.primitives.add(Cesium.Model.fromGltf({ + * url : './duck/duck.gltf', + * show : true, // default + * modelMatrix : modelMatrix, + * scale : 2.0, // double size + * minimumPixelSize : 128, // never smaller than 128 pixels + * maximumScale: 20000, // never larger than 20000 * model size (overrides minimumPixelSize) + * allowPicking : false, // not pickable + * debugShowBoundingVolume : false, // default + * debugWireframe : false + * })); + * + * model.readyPromise.then(function(model) { + * // Play all animations when the model is ready to render + * model.activeAnimations.addAll(); + * }); + * @param options - Object with the following properties: + * @param options.url - The url to the .gltf file. + * @param [options.basePath] - The base path that paths in the glTF JSON are relative to. + * @param [options.show = true] - Determines if the model primitive will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the model from model to world coordinates. + * @param [options.scale = 1.0] - A uniform scale applied to this model. + * @param [options.minimumPixelSize = 0.0] - The approximate minimum pixel size of the model regardless of zoom. + * @param [options.maximumScale] - The maximum scale for the model. + * @param [options.id] - A user-defined object to return when the model is picked with {@link Scene#pick}. + * @param [options.allowPicking = true] - When true, each glTF mesh and primitive is pickable with {@link Scene#pick}. + * @param [options.incrementallyLoadTextures = true] - Determine if textures may continue to stream in after the model is loaded. + * @param [options.asynchronous = true] - Determines if model WebGL resource creation will be spread out over several frames or block until completion once all glTF files are loaded. + * @param [options.clampAnimations = true] - Determines if the model's animations should hold a pose over frames where no keyframes are specified. + * @param [options.shadows = ShadowMode.ENABLED] - Determines whether the model casts or receives shadows from light sources. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Draws the bounding sphere for each draw command in the model. + * @param [options.debugWireframe = false] - For debugging only. Draws the model in wireframe. + * @param [options.heightReference = HeightReference.NONE] - Determines how the model is drawn relative to terrain. + * @param [options.scene] - Must be passed in for models that use the height reference property. + * @param [options.distanceDisplayCondition] - The condition specifying at what distance from the camera that this model will be displayed. + * @param [options.color = Color.WHITE] - A color that blends with the model's rendered color. + * @param [options.colorBlendMode = ColorBlendMode.HIGHLIGHT] - Defines how the color blends with the model. + * @param [options.colorBlendAmount = 0.5] - Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @param [options.silhouetteColor = Color.RED] - The silhouette color. If more than 256 models have silhouettes enabled, there is a small chance that overlapping models will have minor artifacts. + * @param [options.silhouetteSize = 0.0] - The size of the silhouette in pixels. + * @param [options.clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the model. + * @param [options.dequantizeInShader = true] - Determines if a {@link https://github.com/google/draco|Draco} encoded model is dequantized on the GPU. This decreases total memory usage for encoded models. + * @param [options.credit] - A credit for the model, which is displayed on the canvas. + * @param [options.backFaceCulling = true] - Whether to cull back-facing geometry. When true, back face culling is determined by the material's doubleSided property; when false, back face culling is disabled. Back faces are not culled if {@link Model#color} is translucent or {@link Model#silhouetteSize} is greater than 0.0. + * @returns The newly created model. + */ + static fromGltf(options: { + url: Resource | string; + basePath?: Resource | string; + show?: boolean; + modelMatrix?: Matrix4; + scale?: number; + minimumPixelSize?: number; + maximumScale?: number; + id?: any; + allowPicking?: boolean; + incrementallyLoadTextures?: boolean; + asynchronous?: boolean; + clampAnimations?: boolean; + shadows?: ShadowMode; + debugShowBoundingVolume?: boolean; + debugWireframe?: boolean; + heightReference?: HeightReference; + scene?: Scene; + distanceDisplayCondition?: DistanceDisplayCondition; + color?: Color; + colorBlendMode?: ColorBlendMode; + colorBlendAmount?: number; + silhouetteColor?: Color; + silhouetteSize?: number; + clippingPlanes?: ClippingPlaneCollection; + dequantizeInShader?: boolean; + credit?: Credit | string; + backFaceCulling?: boolean; + }): Model; + /** + * Returns the glTF node with the given name property. This is used to + * modify a node's transform for animation outside of glTF animations. + * @example + * // Apply non-uniform scale to node LOD3sp + * var node = model.getNode('LOD3sp'); + * node.matrix = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(5.0, 1.0, 1.0), node.matrix); + * @param name - The glTF name of the node. + * @returns The node or undefined if no node with name exists. + */ + getNode(name: string): ModelNode; + /** + * Returns the glTF mesh with the given name property. + * @param name - The glTF name of the mesh. + * @returns The mesh or undefined if no mesh with name exists. + */ + getMesh(name: string): ModelMesh; + /** + * Returns the glTF material with the given name property. + * @param name - The glTF name of the material. + * @returns The material or undefined if no material with name exists. + */ + getMaterial(name: string): ModelMaterial; + /** + * Sets the current value of an articulation stage. After setting one or multiple stage values, call + * Model.applyArticulations() to cause the node matrices to be recalculated. + * @param articulationStageKey - The name of the articulation, a space, and the name of the stage. + * @param value - The numeric value of this stage of the articulation. + */ + setArticulationStage(articulationStageKey: string, value: number): void; + /** + * Applies any modified articulation stages to the matrix of each node that participates + * in any articulation. Note that this will overwrite any nodeTransformations on participating nodes. + */ + applyArticulations(): void; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * model = model && model.destroy(); + */ + destroy(): void; +} + +/** + * An active glTF animation. A glTF asset can contain animations. An active animation + * is an animation that is currently playing or scheduled to be played because it was + * added to a model's {@link ModelAnimationCollection}. An active animation is an + * instance of an animation; for example, there can be multiple active animations + * for the same glTF animation, each with a different start time. + *

    + * Create this by calling {@link ModelAnimationCollection#add}. + *

    + */ +export class ModelAnimation { + constructor(); + /** + * When true, the animation is removed after it stops playing. + * This is slightly more efficient that not removing it, but if, for example, + * time is reversed, the animation is not played again. + */ + removeOnStop: boolean; + /** + * The event fired when this animation is started. This can be used, for + * example, to play a sound or start a particle system, when the animation starts. + *

    + * This event is fired at the end of the frame after the scene is rendered. + *

    + * @example + * animation.start.addEventListener(function(model, animation) { + * console.log('Animation started: ' + animation.name); + * }); + */ + start: Event; + /** + * The event fired when on each frame when this animation is updated. The + * current time of the animation, relative to the glTF animation time span, is + * passed to the event, which allows, for example, starting new animations at a + * specific time relative to a playing animation. + *

    + * This event is fired at the end of the frame after the scene is rendered. + *

    + * @example + * animation.update.addEventListener(function(model, animation, time) { + * console.log('Animation updated: ' + animation.name + '. glTF animation time: ' + time); + * }); + */ + update: Event; + /** + * The event fired when this animation is stopped. This can be used, for + * example, to play a sound or start a particle system, when the animation stops. + *

    + * This event is fired at the end of the frame after the scene is rendered. + *

    + * @example + * animation.stop.addEventListener(function(model, animation) { + * console.log('Animation stopped: ' + animation.name); + * }); + */ + stop: Event; + /** + * The glTF animation name that identifies this animation. + */ + readonly name: string; + /** + * The scene time to start playing this animation. When this is undefined, + * the animation starts at the next frame. + */ + readonly startTime: JulianDate; + /** + * The delay, in seconds, from {@link ModelAnimation#startTime} to start playing. + */ + readonly delay: number; + /** + * The scene time to stop playing this animation. When this is undefined, + * the animation is played for its full duration and perhaps repeated depending on + * {@link ModelAnimation#loop}. + */ + readonly stopTime: JulianDate; + /** + * Values greater than 1.0 increase the speed that the animation is played relative + * to the scene clock speed; values less than 1.0 decrease the speed. A value of + * 1.0 plays the animation at the speed in the glTF animation mapped to the scene + * clock speed. For example, if the scene is played at 2x real-time, a two-second glTF animation + * will play in one second even if multiplier is 1.0. + */ + readonly multiplier: number; + /** + * When true, the animation is played in reverse. + */ + readonly reverse: boolean; + /** + * Determines if and how the animation is looped. + */ + readonly loop: ModelAnimationLoop; +} + +/** + * A collection of active model animations. Access this using {@link Model#activeAnimations}. + */ +export class ModelAnimationCollection { + constructor(); + /** + * The event fired when an animation is added to the collection. This can be used, for + * example, to keep a UI in sync. + * @example + * model.activeAnimations.animationAdded.addEventListener(function(model, animation) { + * console.log('Animation added: ' + animation.name); + * }); + */ + animationAdded: Event; + /** + * The event fired when an animation is removed from the collection. This can be used, for + * example, to keep a UI in sync. + * @example + * model.activeAnimations.animationRemoved.addEventListener(function(model, animation) { + * console.log('Animation removed: ' + animation.name); + * }); + */ + animationRemoved: Event; + /** + * The number of animations in the collection. + */ + readonly length: number; + /** + * Creates and adds an animation with the specified initial properties to the collection. + *

    + * This raises the {@link ModelAnimationCollection#animationAdded} event so, for example, a UI can stay in sync. + *

    + * @example + * // Example 1. Add an animation by name + * model.activeAnimations.add({ + * name : 'animation name' + * }); + * + * // Example 2. Add an animation by index + * model.activeAnimations.add({ + * index : 0 + * }); + * @example + * // Example 3. Add an animation and provide all properties and events + * var startTime = Cesium.JulianDate.now(); + * + * var animation = model.activeAnimations.add({ + * name : 'another animation name', + * startTime : startTime, + * delay : 0.0, // Play at startTime (default) + * stopTime : Cesium.JulianDate.addSeconds(startTime, 4.0, new Cesium.JulianDate()), + * removeOnStop : false, // Do not remove when animation stops (default) + * multiplier : 2.0, // Play at double speed + * reverse : true, // Play in reverse + * loop : Cesium.ModelAnimationLoop.REPEAT // Loop the animation + * }); + * + * animation.start.addEventListener(function(model, animation) { + * console.log('Animation started: ' + animation.name); + * }); + * animation.update.addEventListener(function(model, animation, time) { + * console.log('Animation updated: ' + animation.name + '. glTF animation time: ' + time); + * }); + * animation.stop.addEventListener(function(model, animation) { + * console.log('Animation stopped: ' + animation.name); + * }); + * @param options - Object with the following properties: + * @param [options.name] - The glTF animation name that identifies the animation. Must be defined if options.index is undefined. + * @param [options.index] - The glTF animation index that identifies the animation. Must be defined if options.name is undefined. + * @param [options.startTime] - The scene time to start playing the animation. When this is undefined, the animation starts at the next frame. + * @param [options.delay = 0.0] - The delay, in seconds, from startTime to start playing. + * @param [options.stopTime] - The scene time to stop playing the animation. When this is undefined, the animation is played for its full duration. + * @param [options.removeOnStop = false] - When true, the animation is removed after it stops playing. + * @param [options.multiplier = 1.0] - Values greater than 1.0 increase the speed that the animation is played relative to the scene clock speed; values less than 1.0 decrease the speed. + * @param [options.reverse = false] - When true, the animation is played in reverse. + * @param [options.loop = ModelAnimationLoop.NONE] - Determines if and how the animation is looped. + * @returns The animation that was added to the collection. + */ + add(options: { + name?: string; + index?: number; + startTime?: JulianDate; + delay?: number; + stopTime?: JulianDate; + removeOnStop?: boolean; + multiplier?: number; + reverse?: boolean; + loop?: ModelAnimationLoop; + }): ModelAnimation; + /** + * Creates and adds an animation with the specified initial properties to the collection + * for each animation in the model. + *

    + * This raises the {@link ModelAnimationCollection#animationAdded} event for each model so, for example, a UI can stay in sync. + *

    + * @example + * model.activeAnimations.addAll({ + * multiplier : 0.5, // Play at half-speed + * loop : Cesium.ModelAnimationLoop.REPEAT // Loop the animations + * }); + * @param [options] - Object with the following properties: + * @param [options.startTime] - The scene time to start playing the animations. When this is undefined, the animations starts at the next frame. + * @param [options.delay = 0.0] - The delay, in seconds, from startTime to start playing. + * @param [options.stopTime] - The scene time to stop playing the animations. When this is undefined, the animations are played for its full duration. + * @param [options.removeOnStop = false] - When true, the animations are removed after they stop playing. + * @param [options.multiplier = 1.0] - Values greater than 1.0 increase the speed that the animations play relative to the scene clock speed; values less than 1.0 decrease the speed. + * @param [options.reverse = false] - When true, the animations are played in reverse. + * @param [options.loop = ModelAnimationLoop.NONE] - Determines if and how the animations are looped. + * @returns An array of {@link ModelAnimation} objects, one for each animation added to the collection. If there are no glTF animations, the array is empty. + */ + addAll(options?: { + startTime?: JulianDate; + delay?: number; + stopTime?: JulianDate; + removeOnStop?: boolean; + multiplier?: number; + reverse?: boolean; + loop?: ModelAnimationLoop; + }): ModelAnimation[]; + /** + * Removes an animation from the collection. + *

    + * This raises the {@link ModelAnimationCollection#animationRemoved} event so, for example, a UI can stay in sync. + *

    + *

    + * An animation can also be implicitly removed from the collection by setting {@link ModelAnimation#removeOnStop} to + * true. The {@link ModelAnimationCollection#animationRemoved} event is still fired when the animation is removed. + *

    + * @example + * var a = model.activeAnimations.add({ + * name : 'animation name' + * }); + * model.activeAnimations.remove(a); // Returns true + * @param animation - The animation to remove. + * @returns true if the animation was removed; false if the animation was not found in the collection. + */ + remove(animation: ModelAnimation): boolean; + /** + * Removes all animations from the collection. + *

    + * This raises the {@link ModelAnimationCollection#animationRemoved} event for each + * animation so, for example, a UI can stay in sync. + *

    + */ + removeAll(): void; + /** + * Determines whether this collection contains a given animation. + * @param animation - The animation to check for. + * @returns true if this collection contains the animation, false otherwise. + */ + contains(animation: ModelAnimation): boolean; + /** + * Returns the animation in the collection at the specified index. Indices are zero-based + * and increase as animations are added. Removing an animation shifts all animations after + * it to the left, changing their indices. This function is commonly used to iterate over + * all the animations in the collection. + * @example + * // Output the names of all the animations in the collection. + * var animations = model.activeAnimations; + * var length = animations.length; + * for (var i = 0; i < length; ++i) { + * console.log(animations.get(i).name); + * } + * @param index - The zero-based index of the animation. + * @returns The animation at the specified index. + */ + get(index: number): ModelAnimation; +} + +/** + * Determines if and how a glTF animation is looped. + */ +export enum ModelAnimationLoop { + /** + * Play the animation once; do not loop it. + */ + NONE = 0, + /** + * Loop the animation playing it from the start immediately after it stops. + */ + REPEAT = 1, + /** + * Loop the animation. First, playing it forward, then in reverse, then forward, and so on. + */ + MIRRORED_REPEAT = 2 +} + +/** + * A model's material with modifiable parameters. A glTF material + * contains parameters defined by the material's technique with values + * defined by the technique and potentially overridden by the material. + * This class allows changing these values at runtime. + *

    + * Use {@link Model#getMaterial} to create an instance. + *

    + */ +export class ModelMaterial { + constructor(); + /** + * The value of the name property of this material. + */ + readonly name: string; + /** + * The index of the material. + */ + readonly id: string; + /** + * Assigns a value to a material parameter. The type for value + * depends on the glTF type of the parameter. It will be a floating-point + * number, Cartesian, or matrix. + * @example + * material.setValue('diffuse', new Cesium.Cartesian4(1.0, 0.0, 0.0, 1.0)); // vec4 + * material.setValue('shininess', 256.0); // scalar + * @param name - The name of the parameter. + * @param [value] - The value to assign to the parameter. + */ + setValue(name: string, value?: any): void; + /** + * Returns the value of the parameter with the given name. The type of the + * returned object depends on the glTF type of the parameter. It will be a floating-point + * number, Cartesian, or matrix. + * @param name - The name of the parameter. + * @returns The value of the parameter or undefined if the parameter does not exist. + */ + getValue(name: string): any; +} + +/** + * A model's mesh and its materials. + *

    + * Use {@link Model#getMesh} to create an instance. + *

    + */ +export class ModelMesh { + constructor(); + /** + * The value of the name property of this mesh. + */ + readonly name: string; + /** + * The index of the mesh. + */ + readonly id: string; + /** + * An array of {@link ModelMaterial} instances indexed by the mesh's + * primitive indices. + */ + readonly materials: ModelMaterial[]; +} + +/** + * A model node with a transform for user-defined animations. A glTF asset can + * contain animations that target a node's transform. This class allows + * changing a node's transform externally so animation can be driven by another + * source, not just an animation in the glTF asset. + *

    + * Use {@link Model#getNode} to create an instance. + *

    + * @example + * var node = model.getNode('LOD3sp'); + * node.matrix = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(5.0, 1.0, 1.0), node.matrix); + */ +export class ModelNode { + constructor(); + /** + * The value of the name property of this node. + */ + readonly name: string; + /** + * The index of the node. + */ + readonly id: string; + /** + * Determines if this node and its children will be shown. + */ + show: boolean; + /** + * The node's 4x4 matrix transform from its local coordinates to + * its parent's. + *

    + * For changes to take effect, this property must be assigned to; + * setting individual elements of the matrix will not work. + *

    + */ + matrix: Matrix4; + /** + * Gets the node's original 4x4 matrix transform from its local coordinates to + * its parent's, without any node transformations or articulations applied. + */ + originalMatrix: Matrix4; +} + +/** + * Draws the Moon in 3D. + * @example + * scene.moon = new Cesium.Moon(); + * @param [options] - Object with the following properties: + * @param [options.show = true] - Determines whether the moon will be rendered. + * @param [options.textureUrl = buildModuleUrl('Assets/Textures/moonSmall.jpg')] - The moon texture. + * @param [options.ellipsoid = Ellipsoid.MOON] - The moon ellipsoid. + * @param [options.onlySunLighting = true] - Use the sun as the only light source. + */ +export class Moon { + constructor(options?: { + show?: boolean; + textureUrl?: string; + ellipsoid?: Ellipsoid; + onlySunLighting?: boolean; + }); + /** + * Determines if the moon will be shown. + */ + show: boolean; + /** + * The moon texture. + */ + textureUrl: string; + /** + * Use the sun as the only light source. + */ + onlySunLighting: boolean; + /** + * Get the ellipsoid that defines the shape of the moon. + */ + readonly ellipsoid: Ellipsoid; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * moon = moon && moon.destroy(); + */ + destroy(): void; +} + +/** + * A {@link TileDiscardPolicy} specifying that tile images should never be discard. + */ +export class NeverTileDiscardPolicy { + constructor(); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; +} + +export namespace OpenStreetMapImageryProvider { + /** + * Initialization options for the OpenStreetMapImageryProvider constructor + * @property [url = 'https://a.tile.openstreetmap.org'] - The OpenStreetMap server url. + * @property [fileExtension = 'png'] - The file extension for images on the server. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle of the layer. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [credit = 'MapQuest, Open Street Map and contributors, CC-BY-SA'] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url?: string; + fileExtension?: string; + rectangle?: Rectangle; + minimumLevel?: number; + maximumLevel?: number; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }; +} + +/** + * An imagery provider that provides tiled imagery hosted by OpenStreetMap + * or another provider of Slippy tiles. The default url connects to OpenStreetMap's volunteer-run + * servers, so you must conform to their + * {@link http://wiki.openstreetmap.org/wiki/Tile_usage_policy|Tile Usage Policy}. + * @example + * var osm = new Cesium.OpenStreetMapImageryProvider({ + * url : 'https://a.tile.openstreetmap.org/' + * }); + * @param options - Object describing initialization options + */ +export class OpenStreetMapImageryProvider extends UrlTemplateImageryProvider { + constructor(options: OpenStreetMapImageryProvider.ConstructorOptions); +} + +/** + * A particle emitted by a {@link ParticleSystem}. + * @param options - An object with the following properties: + * @param [options.mass = 1.0] - The mass of the particle in kilograms. + * @param [options.position = Cartesian3.ZERO] - The initial position of the particle in world coordinates. + * @param [options.velocity = Cartesian3.ZERO] - The velocity vector of the particle in world coordinates. + * @param [options.life = Number.MAX_VALUE] - The life of the particle in seconds. + * @param [options.image] - The URI, HTMLImageElement, or HTMLCanvasElement to use for the billboard. + * @param [options.startColor = Color.WHITE] - The color of a particle when it is born. + * @param [options.endColor = Color.WHITE] - The color of a particle when it dies. + * @param [options.startScale = 1.0] - The scale of the particle when it is born. + * @param [options.endScale = 1.0] - The scale of the particle when it dies. + * @param [options.imageSize = new Cartesian2(1.0, 1.0)] - The dimensions, width by height, to scale the particle image in pixels. + */ +export class Particle { + constructor(options: { + mass?: number; + position?: Cartesian3; + velocity?: Cartesian3; + life?: number; + image?: any; + startColor?: Color; + endColor?: Color; + startScale?: number; + endScale?: number; + imageSize?: Cartesian2; + }); + /** + * The mass of the particle in kilograms. + */ + mass: number; + /** + * The positon of the particle in world coordinates. + */ + position: Cartesian3; + /** + * The velocity of the particle in world coordinates. + */ + velocity: Cartesian3; + /** + * The life of the particle in seconds. + */ + life: number; + /** + * The image to use for the particle. + */ + image: any; + /** + * The color of the particle when it is born. + */ + startColor: Color; + /** + * The color of the particle when it dies. + */ + endColor: Color; + /** + * the scale of the particle when it is born. + */ + startScale: number; + /** + * The scale of the particle when it dies. + */ + endScale: number; + /** + * The dimensions, width by height, to scale the particle image in pixels. + */ + imageSize: Cartesian2; + /** + * Gets the age of the particle in seconds. + */ + age: number; + /** + * Gets the age normalized to a value in the range [0.0, 1.0]. + */ + normalizedAge: number; +} + +/** + * Represents a burst of {@link Particle}s from a {@link ParticleSystem} at a given time in the systems lifetime. + * @param [options] - An object with the following properties: + * @param [options.time = 0.0] - The time in seconds after the beginning of the particle system's lifetime that the burst will occur. + * @param [options.minimum = 0.0] - The minimum number of particles emmitted in the burst. + * @param [options.maximum = 50.0] - The maximum number of particles emitted in the burst. + */ +export class ParticleBurst { + constructor(options?: { + time?: number; + minimum?: number; + maximum?: number; + }); + /** + * The time in seconds after the beginning of the particle system's lifetime that the burst will occur. + */ + time: number; + /** + * The minimum number of particles emitted. + */ + minimum: number; + /** + * The maximum number of particles emitted. + */ + maximum: number; + /** + * true if the burst has been completed; false otherwise. + */ + complete: boolean; +} + +/** + *

    + * An object that initializes a {@link Particle} from a {@link ParticleSystem}. + *

    + *

    + * This type describes an interface and is not intended to be instantiated directly. + *

    + */ +export class ParticleEmitter { + constructor(); +} + +/** + * A ParticleSystem manages the updating and display of a collection of particles. + * @param [options] - Object with the following properties: + * @param [options.show = true] - Whether to display the particle system. + * @param [options.updateCallback] - The callback function to be called each frame to update a particle. + * @param [options.emitter = new CircleEmitter(0.5)] - The particle emitter for this system. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the particle system from model to world coordinates. + * @param [options.emitterModelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the particle system emitter within the particle systems local coordinate system. + * @param [options.emissionRate = 5] - The number of particles to emit per second. + * @param [options.bursts] - An array of {@link ParticleBurst}, emitting bursts of particles at periodic times. + * @param [options.loop = true] - Whether the particle system should loop its bursts when it is complete. + * @param [options.scale = 1.0] - Sets the scale to apply to the image of the particle for the duration of its particleLife. + * @param [options.startScale] - The initial scale to apply to the image of the particle at the beginning of its life. + * @param [options.endScale] - The final scale to apply to the image of the particle at the end of its life. + * @param [options.color = Color.WHITE] - Sets the color of a particle for the duration of its particleLife. + * @param [options.startColor] - The color of the particle at the beginning of its life. + * @param [options.endColor] - The color of the particle at the end of its life. + * @param [options.image] - The URI, HTMLImageElement, or HTMLCanvasElement to use for the billboard. + * @param [options.imageSize = new Cartesian2(1.0, 1.0)] - If set, overrides the minimumImageSize and maximumImageSize inputs that scale the particle image's dimensions in pixels. + * @param [options.minimumImageSize] - Sets the minimum bound, width by height, above which to randomly scale the particle image's dimensions in pixels. + * @param [options.maximumImageSize] - Sets the maximum bound, width by height, below which to randomly scale the particle image's dimensions in pixels. + * @param [options.sizeInMeters] - Sets if the size of particles is in meters or pixels. true to size the particles in meters; otherwise, the size is in pixels. + * @param [options.speed = 1.0] - If set, overrides the minimumSpeed and maximumSpeed inputs with this value. + * @param [options.minimumSpeed] - Sets the minimum bound in meters per second above which a particle's actual speed will be randomly chosen. + * @param [options.maximumSpeed] - Sets the maximum bound in meters per second below which a particle's actual speed will be randomly chosen. + * @param [options.lifetime = Number.MAX_VALUE] - How long the particle system will emit particles, in seconds. + * @param [options.particleLife = 5.0] - If set, overrides the minimumParticleLife and maximumParticleLife inputs with this value. + * @param [options.minimumParticleLife] - Sets the minimum bound in seconds for the possible duration of a particle's life above which a particle's actual life will be randomly chosen. + * @param [options.maximumParticleLife] - Sets the maximum bound in seconds for the possible duration of a particle's life below which a particle's actual life will be randomly chosen. + * @param [options.mass = 1.0] - Sets the minimum and maximum mass of particles in kilograms. + * @param [options.minimumMass] - Sets the minimum bound for the mass of a particle in kilograms. A particle's actual mass will be chosen as a random amount above this value. + * @param [options.maximumMass] - Sets the maximum mass of particles in kilograms. A particle's actual mass will be chosen as a random amount below this value. + */ +export class ParticleSystem { + constructor(options?: { + show?: boolean; + updateCallback?: ParticleSystem.updateCallback; + emitter?: ParticleEmitter; + modelMatrix?: Matrix4; + emitterModelMatrix?: Matrix4; + emissionRate?: number; + bursts?: ParticleBurst[]; + loop?: boolean; + scale?: number; + startScale?: number; + endScale?: number; + color?: Color; + startColor?: Color; + endColor?: Color; + image?: any; + imageSize?: Cartesian2; + minimumImageSize?: Cartesian2; + maximumImageSize?: Cartesian2; + sizeInMeters?: boolean; + speed?: number; + minimumSpeed?: number; + maximumSpeed?: number; + lifetime?: number; + particleLife?: number; + minimumParticleLife?: number; + maximumParticleLife?: number; + mass?: number; + minimumMass?: number; + maximumMass?: number; + }); + /** + * Whether to display the particle system. + */ + show: boolean; + /** + * An array of force callbacks. The callback is passed a {@link Particle} and the difference from the last time + */ + updateCallback: ParticleSystem.updateCallback; + /** + * Whether the particle system should loop it's bursts when it is complete. + */ + loop: boolean; + /** + * The URI, HTMLImageElement, or HTMLCanvasElement to use for the billboard. + */ + image: any; + /** + * The particle emitter for this + */ + emitter: ParticleEmitter; + /** + * An array of {@link ParticleBurst}, emitting bursts of particles at periodic times. + */ + bursts: ParticleBurst[]; + /** + * The 4x4 transformation matrix that transforms the particle system from model to world coordinates. + */ + modelMatrix: Matrix4; + /** + * The 4x4 transformation matrix that transforms the particle system emitter within the particle systems local coordinate system. + */ + emitterModelMatrix: Matrix4; + /** + * The color of the particle at the beginning of its life. + */ + startColor: Color; + /** + * The color of the particle at the end of its life. + */ + endColor: Color; + /** + * The initial scale to apply to the image of the particle at the beginning of its life. + */ + startScale: number; + /** + * The final scale to apply to the image of the particle at the end of its life. + */ + endScale: number; + /** + * The number of particles to emit per second. + */ + emissionRate: number; + /** + * Sets the minimum bound in meters per second above which a particle's actual speed will be randomly chosen. + */ + minimumSpeed: number; + /** + * Sets the maximum bound in meters per second below which a particle's actual speed will be randomly chosen. + */ + maximumSpeed: number; + /** + * Sets the minimum bound in seconds for the possible duration of a particle's life above which a particle's actual life will be randomly chosen. + */ + minimumParticleLife: number; + /** + * Sets the maximum bound in seconds for the possible duration of a particle's life below which a particle's actual life will be randomly chosen. + */ + maximumParticleLife: number; + /** + * Sets the minimum mass of particles in kilograms. + */ + minimumMass: number; + /** + * Sets the maximum mass of particles in kilograms. + */ + maximumMass: number; + /** + * Sets the minimum bound, width by height, above which to randomly scale the particle image's dimensions in pixels. + */ + minimumImageSize: Cartesian2; + /** + * Sets the maximum bound, width by height, below which to randomly scale the particle image's dimensions in pixels. + */ + maximumImageSize: Cartesian2; + /** + * Gets or sets if the particle size is in meters or pixels. true to size particles in meters; otherwise, the size is in pixels. + */ + sizeInMeters: boolean; + /** + * How long the particle system will emit particles, in seconds. + */ + lifetime: number; + /** + * Fires an event when the particle system has reached the end of its lifetime. + */ + complete: Event; + /** + * When true, the particle system has reached the end of its lifetime; false otherwise. + */ + isComplete: boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + */ + destroy(): void; +} + +export namespace ParticleSystem { + /** + * A function used to modify attributes of the particle at each time step. This can include force modifications, + * color, sizing, etc. + * @example + * function applyGravity(particle, dt) { + * var position = particle.position; + * var gravityVector = Cesium.Cartesian3.normalize(position, new Cesium.Cartesian3()); + * Cesium.Cartesian3.multiplyByScalar(gravityVector, GRAVITATIONAL_CONSTANT * dt, gravityVector); + * particle.velocity = Cesium.Cartesian3.add(particle.velocity, gravityVector, particle.velocity); + * } + * @param particle - The particle being updated. + * @param dt - The time in seconds since the last update. + */ + type updateCallback = (particle: Particle, dt: number) => void; +} + +/** + * An appearance for {@link GeometryInstance} instances with color attributes. + * This allows several geometry instances, each with a different color, to + * be drawn with the same {@link Primitive} as shown in the second example below. + * @example + * // A solid white line segment + * var primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.SimplePolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0 + * ]) + * }), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(new Cesium.Color(1.0, 1.0, 1.0, 1.0)) + * } + * }), + * appearance : new Cesium.PerInstanceColorAppearance({ + * flat : true, + * translucent : false + * }) + * }); + * + * // Two rectangles in a primitive, each with a different color + * var instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(0.0, 20.0, 10.0, 30.0) + * }), + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(1.0, 0.0, 0.0, 0.5) + * } + * }); + * + * var anotherInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(0.0, 40.0, 10.0, 50.0) + * }), + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(0.0, 0.0, 1.0, 0.5) + * } + * }); + * + * var rectanglePrimitive = new Cesium.Primitive({ + * geometryInstances : [instance, anotherInstance], + * appearance : new Cesium.PerInstanceColorAppearance() + * }); + * @param [options] - Object with the following properties: + * @param [options.flat = false] - When true, flat shading is used in the fragment shader, which means lighting is not taking into account. + * @param [options.faceForward = !options.closed] - When true, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots. This is useful when both sides of a geometry should be shaded like {@link WallGeometry}. + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link PerInstanceColorAppearance#renderState} has alpha blending enabled. + * @param [options.closed = false] - When true, the geometry is expected to be closed so {@link PerInstanceColorAppearance#renderState} has backface culling enabled. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class PerInstanceColorAppearance { + constructor(options?: { + flat?: boolean; + faceForward?: boolean; + translucent?: boolean; + closed?: boolean; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * This property is part of the {@link Appearance} interface, but is not + * used by {@link PerInstanceColorAppearance} since a fully custom fragment shader is used. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent so + * {@link PerInstanceColorAppearance#renderState} has alpha blending enabled. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

    + * The render state can be explicitly defined when constructing a {@link PerInstanceColorAppearance} + * instance, or it is set implicitly via {@link PerInstanceColorAppearance#translucent} + * and {@link PerInstanceColorAppearance#closed}. + *

    + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link PerInstanceColorAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + */ + readonly flat: boolean; + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + */ + readonly faceForward: boolean; + /** + * The {@link VertexFormat} that all {@link PerInstanceColorAppearance} instances + * are compatible with. This requires only position and normal + * attributes. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * The {@link VertexFormat} that all {@link PerInstanceColorAppearance} instances + * are compatible with when {@link PerInstanceColorAppearance#flat} is true. + * This requires only a position attribute. + */ + static readonly FLAT_VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link PerInstanceColorAppearance}, + * this is derived from {@link PerInstanceColorAppearance#fragmentShaderSource}, {@link PerInstanceColorAppearance#flat}, + * and {@link PerInstanceColorAppearance#faceForward}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link PerInstanceColorAppearance#translucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +/** + * Options for performing point attenuation based on geometric error when rendering + * point clouds using 3D Tiles. + * @param [options] - Object with the following properties: + * @param [options.attenuation = false] - Perform point attenuation based on geometric error. + * @param [options.geometricErrorScale = 1.0] - Scale to be applied to each tile's geometric error. + * @param [options.maximumAttenuation] - Maximum attenuation in pixels. Defaults to the Cesium3DTileset's maximumScreenSpaceError. + * @param [options.baseResolution] - Average base resolution for the dataset in meters. Substitute for Geometric Error when not available. + * @param [options.eyeDomeLighting = true] - When true, use eye dome lighting when drawing with point attenuation. + * @param [options.eyeDomeLightingStrength = 1.0] - Increasing this value increases contrast on slopes and edges. + * @param [options.eyeDomeLightingRadius = 1.0] - Increase the thickness of contours from eye dome lighting. + * @param [options.backFaceCulling = false] - Determines whether back-facing points are hidden. This option works only if data has normals included. + * @param [options.normalShading = true] - Determines whether a point cloud that contains normals is shaded by the scene's light source. + */ +export class PointCloudShading { + constructor(options?: { + attenuation?: boolean; + geometricErrorScale?: number; + maximumAttenuation?: number; + baseResolution?: number; + eyeDomeLighting?: boolean; + eyeDomeLightingStrength?: number; + eyeDomeLightingRadius?: number; + backFaceCulling?: boolean; + normalShading?: boolean; + }); + /** + * Perform point attenuation based on geometric error. + */ + attenuation: boolean; + /** + * Scale to be applied to the geometric error before computing attenuation. + */ + geometricErrorScale: number; + /** + * Maximum point attenuation in pixels. If undefined, the Cesium3DTileset's maximumScreenSpaceError will be used. + */ + maximumAttenuation: number; + /** + * Average base resolution for the dataset in meters. + * Used in place of geometric error when geometric error is 0. + * If undefined, an approximation will be computed for each tile that has geometric error of 0. + */ + baseResolution: number; + /** + * Use eye dome lighting when drawing with point attenuation + * Requires support for EXT_frag_depth, OES_texture_float, and WEBGL_draw_buffers extensions in WebGL 1.0, + * otherwise eye dome lighting is ignored. + */ + eyeDomeLighting: boolean; + /** + * Eye dome lighting strength (apparent contrast) + */ + eyeDomeLightingStrength: number; + /** + * Thickness of contours from eye dome lighting + */ + eyeDomeLightingRadius: number; + /** + * Determines whether back-facing points are hidden. + * This option works only if data has normals included. + */ + backFaceCulling: boolean; + /** + * Determines whether a point cloud that contains normals is shaded by the scene's light source. + */ + normalShading: boolean; + /** + * Determines if point cloud shading is supported. + * @param scene - The scene. + * @returns true if point cloud shading is supported; otherwise, returns false + */ + static isSupported(scene: Scene): boolean; +} + +/** + * A graphical point positioned in the 3D scene, that is created + * and rendered using a {@link PointPrimitiveCollection}. A point is created and its initial + * properties are set by calling {@link PointPrimitiveCollection#add}. + */ +export class PointPrimitive { + constructor(); + /** + * Determines if this point will be shown. Use this to hide or show a point, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this point. + */ + position: Cartesian3; + /** + * Gets or sets near and far scaling properties of a point based on the point's distance from the camera. + * A point's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the point's scale remains clamped to the nearest bound. This scale + * multiplies the pixelSize and outlineWidth to affect the total size of the point. If undefined, + * scaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a pointPrimitive's scaleByDistance to scale to 15 when the + * // camera is 1500 meters from the pointPrimitive and disappear as + * // the camera distance approaches 8.0e6 meters. + * p.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 15, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable scaling by distance + * p.scaleByDistance = undefined; + */ + scaleByDistance: NearFarScalar; + /** + * Gets or sets near and far translucency properties of a point based on the point's distance from the camera. + * A point's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the point's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @example + * // Example 1. + * // Set a point's translucency to 1.0 when the + * // camera is 1500 meters from the point and disappear as + * // the camera distance approaches 8.0e6 meters. + * p.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable translucency by distance + * p.translucencyByDistance = undefined; + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets the inner size of the point in pixels. + */ + pixelSize: number; + /** + * Gets or sets the inner color of the point. + * The red, green, blue, and alpha values are indicated by value's red, green, + * blue, and alpha properties as shown in Example 1. These components range from 0.0 + * (no intensity) to 1.0 (full intensity). + * @example + * // Example 1. Assign yellow. + * p.color = Cesium.Color.YELLOW; + * @example + * // Example 2. Make a pointPrimitive 50% translucent. + * p.color = new Cesium.Color(1.0, 1.0, 1.0, 0.5); + */ + color: Color; + /** + * Gets or sets the outline color of the point. + */ + outlineColor: Color; + /** + * Gets or sets the outline width in pixels. This width adds to pixelSize, + * increasing the total size of the point. + */ + outlineWidth: number; + /** + * Gets or sets the condition specifying at what distance from the camera that this point will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the user-defined value returned when the point is picked. + */ + id: any; + /** + * Computes the screen-space position of the point's origin. + * The screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + * @example + * console.log(p.computeScreenSpacePosition(scene).toString()); + * @param scene - The scene. + * @param [result] - The object onto which to store the result. + * @returns The screen-space position of the point. + */ + computeScreenSpacePosition(scene: Scene, result?: Cartesian2): Cartesian2; + /** + * Determines if this point equals another point. Points are equal if all their properties + * are equal. Points in different collections can be equal. + * @param other - The point to compare for equality. + * @returns true if the points are equal; otherwise, false. + */ + equals(other: PointPrimitive): boolean; +} + +/** + * A renderable collection of points. + *

    + * Points are added and removed from the collection using {@link PointPrimitiveCollection#add} + * and {@link PointPrimitiveCollection#remove}. + * @example + * // Create a pointPrimitive collection with two points + * var points = scene.primitives.add(new Cesium.PointPrimitiveCollection()); + * points.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * color : Cesium.Color.YELLOW + * }); + * points.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * color : Cesium.Color.CYAN + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each point from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT] - The point blending option. The default + * is used for rendering both opaque and translucent points. However, if either all of the points are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve performance by up to 2x. + */ +export class PointPrimitiveCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + blendOption?: BlendOption; + }); + /** + * The 4x4 transformation matrix that transforms each point in this collection from model to world coordinates. + * When this is the identity matrix, the pointPrimitives are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * var center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * pointPrimitives.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * pointPrimitives.add({ + * color : Cesium.Color.ORANGE, + * position : new Cesium.Cartesian3(0.0, 0.0, 0.0) // center + * }); + * pointPrimitives.add({ + * color : Cesium.Color.YELLOW, + * position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0) // east + * }); + * pointPrimitives.add({ + * color : Cesium.Color.GREEN, + * position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0) // north + * }); + * pointPrimitives.add({ + * color : Cesium.Color.CYAN, + * position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0) // up + * }); + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * The point blending option. The default is used for rendering both opaque and translucent points. + * However, if either all of the points are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve + * performance by up to 2x. + */ + blendOption: BlendOption; + /** + * Returns the number of points in this collection. This is commonly used with + * {@link PointPrimitiveCollection#get} to iterate over all the points + * in the collection. + */ + length: number; + /** + * Creates and adds a point with the specified initial properties to the collection. + * The added point is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a point, specifying all the default values. + * var p = pointPrimitives.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * pixelSize : 10.0, + * color : Cesium.Color.WHITE, + * outlineColor : Cesium.Color.TRANSPARENT, + * outlineWidth : 0.0, + * id : undefined + * }); + * @example + * // Example 2: Specify only the point's cartographic position. + * var p = pointPrimitives.add({ + * position : Cesium.Cartesian3.fromDegrees(longitude, latitude, height) + * }); + * @param [options] - A template describing the point's properties as shown in Example 1. + * @returns The point that was added to the collection. + */ + add(options?: any): PointPrimitive; + /** + * Removes a point from the collection. + * @example + * var p = pointPrimitives.add(...); + * pointPrimitives.remove(p); // Returns true + * @param pointPrimitive - The point to remove. + * @returns true if the point was removed; false if the point was not found in the collection. + */ + remove(pointPrimitive: PointPrimitive): boolean; + /** + * Removes all points from the collection. + * @example + * pointPrimitives.add(...); + * pointPrimitives.add(...); + * pointPrimitives.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given point. + * @param [pointPrimitive] - The point to check for. + * @returns true if this collection contains the point, false otherwise. + */ + contains(pointPrimitive?: PointPrimitive): boolean; + /** + * Returns the point in the collection at the specified index. Indices are zero-based + * and increase as points are added. Removing a point shifts all points after + * it to the left, changing their indices. This function is commonly used with + * {@link PointPrimitiveCollection#length} to iterate over all the points + * in the collection. + * @example + * // Toggle the show property of every point in the collection + * var len = pointPrimitives.length; + * for (var i = 0; i < len; ++i) { + * var p = pointPrimitives.get(i); + * p.show = !p.show; + * } + * @param index - The zero-based index of the point. + * @returns The point at the specified index. + */ + get(index: number): PointPrimitive; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * pointPrimitives = pointPrimitives && pointPrimitives.destroy(); + */ + destroy(): void; +} + +/** + * A renderable polyline. Create this by calling {@link PolylineCollection#add} + * @param options - Object with the following properties: + * @param [options.show = true] - true if this polyline will be shown; otherwise, false. + * @param [options.width = 1.0] - The width of the polyline in pixels. + * @param [options.loop = false] - Whether a line segment will be added between the last and first line positions to make this line a loop. + * @param [options.material = Material.ColorType] - The material. + * @param [options.positions] - The positions. + * @param [options.id] - The user-defined object to be returned when this polyline is picked. + * @param [options.distanceDisplayCondition] - The condition specifying at what distance from the camera that this polyline will be displayed. + * @param polylineCollection - The renderable polyline collection. + */ +export class Polyline { + constructor(options: { + show?: boolean; + width?: number; + loop?: boolean; + material?: Material; + positions?: Cartesian3[]; + id?: any; + distanceDisplayCondition?: DistanceDisplayCondition; + }, polylineCollection: PolylineCollection); + /** + * Determines if this polyline will be shown. Use this to hide or show a polyline, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the positions of the polyline. + * @example + * polyline.positions = Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 10.0, 0.0, + * 0.0, 20.0 + * ]); + */ + positions: Cartesian3[]; + /** + * Gets or sets the surface appearance of the polyline. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + */ + material: Material; + /** + * Gets or sets the width of the polyline. + */ + width: number; + /** + * Gets or sets whether a line segment will be added between the first and last polyline positions. + */ + loop: boolean; + /** + * Gets or sets the user-defined value returned when the polyline is picked. + */ + id: any; + /** + * Gets or sets the condition specifying at what distance from the camera that this polyline will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; +} + +/** + * A renderable collection of polylines. + *

    + *
    + *
    + * Example polylines + *
    + *

    + * Polylines are added and removed from the collection using {@link PolylineCollection#add} + * and {@link PolylineCollection#remove}. + * @example + * // Create a polyline collection with two polylines + * var polylines = new Cesium.PolylineCollection(); + * polylines.add({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -75.10, 39.57, + * -77.02, 38.53, + * -80.50, 35.14, + * -80.12, 25.46]), + * width : 2 + * }); + * + * polylines.add({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -73.10, 37.57, + * -75.02, 36.53, + * -78.50, 33.14, + * -78.12, 23.46]), + * width : 4 + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each polyline from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + */ +export class PolylineCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + }); + /** + * The 4x4 transformation matrix that transforms each polyline in this collection from model to world coordinates. + * When this is the identity matrix, the polylines are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * Returns the number of polylines in this collection. This is commonly used with + * {@link PolylineCollection#get} to iterate over all the polylines + * in the collection. + */ + length: number; + /** + * Creates and adds a polyline with the specified initial properties to the collection. + * The added polyline is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a polyline, specifying all the default values. + * var p = polylines.add({ + * show : true, + * positions : ellipsoid.cartographicArrayToCartesianArray([ + * Cesium.Cartographic.fromDegrees(-75.10, 39.57), + * Cesium.Cartographic.fromDegrees(-77.02, 38.53)]), + * width : 1 + * }); + * @param [options] - A template describing the polyline's properties as shown in Example 1. + * @returns The polyline that was added to the collection. + */ + add(options?: any): Polyline; + /** + * Removes a polyline from the collection. + * @example + * var p = polylines.add(...); + * polylines.remove(p); // Returns true + * @param polyline - The polyline to remove. + * @returns true if the polyline was removed; false if the polyline was not found in the collection. + */ + remove(polyline: Polyline): boolean; + /** + * Removes all polylines from the collection. + * @example + * polylines.add(...); + * polylines.add(...); + * polylines.removeAll(); + */ + removeAll(): void; + /** + * Determines if this collection contains the specified polyline. + * @param polyline - The polyline to check for. + * @returns true if this collection contains the polyline, false otherwise. + */ + contains(polyline: Polyline): boolean; + /** + * Returns the polyline in the collection at the specified index. Indices are zero-based + * and increase as polylines are added. Removing a polyline shifts all polylines after + * it to the left, changing their indices. This function is commonly used with + * {@link PolylineCollection#length} to iterate over all the polylines + * in the collection. + * @example + * // Toggle the show property of every polyline in the collection + * var len = polylines.length; + * for (var i = 0; i < len; ++i) { + * var p = polylines.get(i); + * p.show = !p.show; + * } + * @param index - The zero-based index of the polyline. + * @returns The polyline at the specified index. + */ + get(index: number): Polyline; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * polylines = polylines && polylines.destroy(); + */ + destroy(): void; +} + +/** + * An appearance for {@link GeometryInstance} instances with color attributes and + * {@link PolylineGeometry} or {@link GroundPolylineGeometry}. + * This allows several geometry instances, each with a different color, to + * be drawn with the same {@link Primitive}. + * @example + * // A solid white line segment + * var primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.PolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0 + * ]), + * width : 10.0, + * vertexFormat : Cesium.PolylineColorAppearance.VERTEX_FORMAT + * }), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(new Cesium.Color(1.0, 1.0, 1.0, 1.0)) + * } + * }), + * appearance : new Cesium.PolylineColorAppearance({ + * translucent : false + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link PolylineColorAppearance#renderState} has alpha blending enabled. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class PolylineColorAppearance { + constructor(options?: { + translucent?: boolean; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * This property is part of the {@link Appearance} interface, but is not + * used by {@link PolylineColorAppearance} since a fully custom fragment shader is used. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent so + * {@link PolylineColorAppearance#renderState} has alpha blending enabled. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

    + * The render state can be explicitly defined when constructing a {@link PolylineColorAppearance} + * instance, or it is set implicitly via {@link PolylineColorAppearance#translucent}. + *

    + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link PolylineColorAppearance#renderState} has backface culling enabled. + * This is always false for PolylineColorAppearance. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * The {@link VertexFormat} that all {@link PolylineColorAppearance} instances + * are compatible with. This requires only a position attribute. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link PolylineColorAppearance#translucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +/** + * An appearance for {@link PolylineGeometry} that supports shading with materials. + * @example + * var primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.PolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0 + * ]), + * width : 10.0, + * vertexFormat : Cesium.PolylineMaterialAppearance.VERTEX_FORMAT + * }) + * }), + * appearance : new Cesium.PolylineMaterialAppearance({ + * material : Cesium.Material.fromType('Color') + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link PolylineMaterialAppearance#renderState} has alpha blending enabled. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ +export class PolylineMaterialAppearance { + constructor(options?: { + translucent?: boolean; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link PolylineMaterialAppearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent so + * {@link PolylineMaterialAppearance#renderState} has alpha blending enabled. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

    + * The render state can be explicitly defined when constructing a {@link PolylineMaterialAppearance} + * instance, or it is set implicitly via {@link PolylineMaterialAppearance#translucent} + * and {@link PolylineMaterialAppearance#closed}. + *

    + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link PolylineMaterialAppearance#renderState} has backface culling enabled. + * This is always false for PolylineMaterialAppearance. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * The {@link VertexFormat} that all {@link PolylineMaterialAppearance} instances + * are compatible with. This requires position and st attributes. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link PolylineMaterialAppearance}, + * this is derived from {@link PolylineMaterialAppearance#fragmentShaderSource} and {@link PolylineMaterialAppearance#material}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link PolylineMaterialAppearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; +} + +/** + * Runs a post-process stage on either the texture rendered by the scene or the output of a previous post-process stage. + * @example + * // Simple stage to change the color + * var fs = + * 'uniform sampler2D colorTexture;\n' + + * 'varying vec2 v_textureCoordinates;\n' + + * 'uniform float scale;\n' + + * 'uniform vec3 offset;\n' + + * 'void main() {\n' + + * ' vec4 color = texture2D(colorTexture, v_textureCoordinates);\n' + + * ' gl_FragColor = vec4(color.rgb * scale + offset, 1.0);\n' + + * '}\n'; + * scene.postProcessStages.add(new Cesium.PostProcessStage({ + * fragmentShader : fs, + * uniforms : { + * scale : 1.1, + * offset : function() { + * return new Cesium.Cartesian3(0.1, 0.2, 0.3); + * } + * } + * })); + * @example + * // Simple stage to change the color of what is selected. + * // If czm_selected returns true, the current fragment belongs to geometry in the selected array. + * var fs = + * 'uniform sampler2D colorTexture;\n' + + * 'varying vec2 v_textureCoordinates;\n' + + * 'uniform vec4 highlight;\n' + + * 'void main() {\n' + + * ' vec4 color = texture2D(colorTexture, v_textureCoordinates);\n' + + * ' if (czm_selected()) {\n' + + * ' vec3 highlighted = highlight.a * highlight.rgb + (1.0 - highlight.a) * color.rgb;\n' + + * ' gl_FragColor = vec4(highlighted, 1.0);\n' + + * ' } else { \n' + + * ' gl_FragColor = color;\n' + + * ' }\n' + + * '}\n'; + * var stage = scene.postProcessStages.add(new Cesium.PostProcessStage({ + * fragmentShader : fs, + * uniforms : { + * highlight : function() { + * return new Cesium.Color(1.0, 0.0, 0.0, 0.5); + * } + * } + * })); + * stage.selected = [cesium3DTileFeature]; + * @param options - An object with the following properties: + * @param options.fragmentShader - The fragment shader to use. The default sampler2D uniforms are colorTexture and depthTexture. The color texture is the output of rendering the scene or the previous stage. The depth texture is the output from rendering the scene. The shader should contain one or both uniforms. There is also a vec2 varying named v_textureCoordinates that can be used to sample the textures. + * @param [options.uniforms] - An object whose properties will be used to set the shaders uniforms. The properties can be constant values or a function. A constant value can also be a URI, data URI, or HTML element to use as a texture. + * @param [options.textureScale = 1.0] - A number in the range (0.0, 1.0] used to scale the texture dimensions. A scale of 1.0 will render this post-process stage to a texture the size of the viewport. + * @param [options.forcePowerOfTwo = false] - Whether or not to force the texture dimensions to be both equal powers of two. The power of two will be the next power of two of the minimum of the dimensions. + * @param [options.sampleMode = PostProcessStageSampleMode.NEAREST] - How to sample the input color texture. + * @param [options.pixelFormat = PixelFormat.RGBA] - The color pixel format of the output texture. + * @param [options.pixelDatatype = PixelDatatype.UNSIGNED_BYTE] - The pixel data type of the output texture. + * @param [options.clearColor = Color.BLACK] - The color to clear the output texture to. + * @param [options.scissorRectangle] - The rectangle to use for the scissor test. + * @param [options.name = createGuid()] - The unique name of this post-process stage for reference by other stages in a composite. If a name is not supplied, a GUID will be generated. + */ +export class PostProcessStage { + constructor(options: { + fragmentShader: string; + uniforms?: any; + textureScale?: number; + forcePowerOfTwo?: boolean; + sampleMode?: PostProcessStageSampleMode; + pixelFormat?: PixelFormat; + pixelDatatype?: PixelDatatype; + clearColor?: Color; + scissorRectangle?: BoundingRectangle; + name?: string; + }); + /** + * Whether or not to execute this post-process stage when ready. + */ + enabled: boolean; + /** + * Determines if this post-process stage is ready to be executed. A stage is only executed when both ready + * and {@link PostProcessStage#enabled} are true. A stage will not be ready while it is waiting on textures + * to load. + */ + readonly ready: boolean; + /** + * The unique name of this post-process stage for reference by other stages in a {@link PostProcessStageComposite}. + */ + readonly name: string; + /** + * The fragment shader to use when execute this post-process stage. + *

    + * The shader must contain a sampler uniform declaration for colorTexture, depthTexture, + * or both. + *

    + *

    + * The shader must contain a vec2 varying declaration for v_textureCoordinates for sampling + * the texture uniforms. + *

    + */ + readonly fragmentShader: string; + /** + * An object whose properties are used to set the uniforms of the fragment shader. + *

    + * The object property values can be either a constant or a function. The function will be called + * each frame before the post-process stage is executed. + *

    + *

    + * A constant value can also be a URI to an image, a data URI, or an HTML element that can be used as a texture, such as HTMLImageElement or HTMLCanvasElement. + *

    + *

    + * If this post-process stage is part of a {@link PostProcessStageComposite} that does not execute in series, the constant value can also be + * the name of another stage in a composite. This will set the uniform to the output texture the stage with that name. + *

    + */ + readonly uniforms: any; + /** + * A number in the range (0.0, 1.0] used to scale the output texture dimensions. A scale of 1.0 will render this post-process stage to a texture the size of the viewport. + */ + readonly textureScale: number; + /** + * Whether or not to force the output texture dimensions to be both equal powers of two. The power of two will be the next power of two of the minimum of the dimensions. + */ + readonly forcePowerOfTwo: number; + /** + * How to sample the input color texture. + */ + readonly sampleMode: PostProcessStageSampleMode; + /** + * The color pixel format of the output texture. + */ + readonly pixelFormat: PixelFormat; + /** + * The pixel data type of the output texture. + */ + readonly pixelDatatype: PixelDatatype; + /** + * The color to clear the output texture to. + */ + readonly clearColor: Color; + /** + * The {@link BoundingRectangle} to use for the scissor test. A default bounding rectangle will disable the scissor test. + */ + readonly scissorRectangle: BoundingRectangle; + /** + * The features selected for applying the post-process. + *

    + * In the fragment shader, use czm_selected to determine whether or not to apply the post-process + * stage to that fragment. For example: + * + * if (czm_selected(v_textureCoordinates)) { + * // apply post-process stage + * } else { + * gl_FragColor = texture2D(colorTexture, v_textureCordinates); + * } + * + *

    + */ + selected: any[]; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + */ + destroy(): void; +} + +/** + * A collection of {@link PostProcessStage}s and/or {@link PostProcessStageComposite}s. + *

    + * The input texture for each post-process stage is the texture rendered to by the scene or the texture rendered + * to by the previous stage in the collection. + *

    + *

    + * If the ambient occlusion or bloom stages are enabled, they will execute before all other stages. + *

    + *

    + * If the FXAA stage is enabled, it will execute after all other stages. + *

    + */ +export class PostProcessStageCollection { + constructor(); + /** + * Determines if all of the post-process stages in the collection are ready to be executed. + */ + readonly ready: boolean; + /** + * A post-process stage for Fast Approximate Anti-aliasing. + *

    + * When enabled, this stage will execute after all others. + *

    + */ + readonly fxaa: PostProcessStage; + /** + * A post-process stage that applies Horizon-based Ambient Occlusion (HBAO) to the input texture. + *

    + * Ambient occlusion simulates shadows from ambient light. These shadows would always be present when the + * surface receives light and regardless of the light's position. + *

    + *

    + * The uniforms have the following properties: intensity, bias, lengthCap, + * stepSize, frustumLength, ambientOcclusionOnly, + * delta, sigma, and blurStepSize. + *

    + *
      + *
    • intensity is a scalar value used to lighten or darken the shadows exponentially. Higher values make the shadows darker. The default value is 3.0.
    • + * + *
    • bias is a scalar value representing an angle in radians. If the dot product between the normal of the sample and the vector to the camera is less than this value, + * sampling stops in the current direction. This is used to remove shadows from near planar edges. The default value is 0.1.
    • + * + *
    • lengthCap is a scalar value representing a length in meters. If the distance from the current sample to first sample is greater than this value, + * sampling stops in the current direction. The default value is 0.26.
    • + * + *
    • stepSize is a scalar value indicating the distance to the next texel sample in the current direction. The default value is 1.95.
    • + * + *
    • frustumLength is a scalar value in meters. If the current fragment has a distance from the camera greater than this value, ambient occlusion is not computed for the fragment. + * The default value is 1000.0.
    • + * + *
    • ambientOcclusionOnly is a boolean value. When true, only the shadows generated are written to the output. When false, the input texture is modulated + * with the ambient occlusion. This is a useful debug option for seeing the effects of changing the uniform values. The default value is false.
    • + *
    + *

    + * delta, sigma, and blurStepSize are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the shadows generated from the image to make them smoother. + *

    + *

    + * When enabled, this stage will execute before all others. + *

    + */ + readonly ambientOcclusion: PostProcessStageComposite; + /** + * A post-process stage for a bloom effect. + *

    + * A bloom effect adds glow effect, makes bright areas brighter, and dark areas darker. + *

    + *

    + * This stage has the following uniforms: contrast, brightness, glowOnly, + * delta, sigma, and stepSize. + *

    + *
      + *
    • contrast is a scalar value in the range [-255.0, 255.0] and affects the contract of the effect. The default value is 128.0.
    • + * + *
    • brightness is a scalar value. The input texture RGB value is converted to hue, saturation, and brightness (HSB) then this value is + * added to the brightness. The default value is -0.3.
    • + * + *
    • glowOnly is a boolean value. When true, only the glow effect will be shown. When false, the glow will be added to the input texture. + * The default value is false. This is a debug option for viewing the effects when changing the other uniform values.
    • + *
    + *

    + * delta, sigma, and stepSize are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the shadows generated from the image to make them smoother. + *

    + *

    + * When enabled, this stage will execute before all others. + *

    + */ + readonly bloom: PostProcessStageComposite; + /** + * The number of post-process stages in this collection. + */ + readonly length: number; + /** + * Adds the post-process stage to the collection. + * @param stage - The post-process stage to add to the collection. + * @returns The post-process stage that was added to the collection. + */ + add(stage: PostProcessStage | PostProcessStageComposite): PostProcessStage | PostProcessStageComposite; + /** + * Removes a post-process stage from the collection and destroys it. + * @param stage - The post-process stage to remove from the collection. + * @returns Whether the post-process stage was removed. + */ + remove(stage: PostProcessStage | PostProcessStageComposite): boolean; + /** + * Returns whether the collection contains a post-process stage. + * @param stage - The post-process stage. + * @returns Whether the collection contains the post-process stage. + */ + contains(stage: PostProcessStage | PostProcessStageComposite): boolean; + /** + * Gets the post-process stage at index. + * @param index - The index of the post-process stage. + * @returns The post-process stage at index. + */ + get(index: number): PostProcessStage | PostProcessStageComposite; + /** + * Removes all post-process stages from the collection and destroys them. + */ + removeAll(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + */ + destroy(): void; +} + +/** + * A collection of {@link PostProcessStage}s or other post-process composite stages that execute together logically. + *

    + * All stages are executed in the order of the array. The input texture changes based on the value of inputPreviousStageTexture. + * If inputPreviousStageTexture is true, the input to each stage is the output texture rendered to by the scene or of the stage that executed before it. + * If inputPreviousStageTexture is false, the input texture is the same for each stage in the composite. The input texture is the texture rendered to by the scene + * or the output texture of the previous stage. + *

    + * @example + * // Example 1: separable blur filter + * // The input to blurXDirection is the texture rendered to by the scene or the output of the previous stage. + * // The input to blurYDirection is the texture rendered to by blurXDirection. + * scene.postProcessStages.add(new Cesium.PostProcessStageComposite({ + * stages : [blurXDirection, blurYDirection] + * })); + * @example + * // Example 2: referencing the output of another post-process stage + * scene.postProcessStages.add(new Cesium.PostProcessStageComposite({ + * inputPreviousStageTexture : false, + * stages : [ + * // The same as Example 1. + * new Cesium.PostProcessStageComposite({ + * inputPreviousStageTexture : true + * stages : [blurXDirection, blurYDirection], + * name : 'blur' + * }), + * // The input texture for this stage is the same input texture to blurXDirection since inputPreviousStageTexture is false + * new Cesium.PostProcessStage({ + * fragmentShader : compositeShader, + * uniforms : { + * blurTexture : 'blur' // The output of the composite with name 'blur' (the texture that blurYDirection rendered to). + * } + * }) + * ] + * }); + * @example + * // Example 3: create a uniform alias + * var uniforms = {}; + * Cesium.defineProperties(uniforms, { + * filterSize : { + * get : function() { + * return blurXDirection.uniforms.filterSize; + * }, + * set : function(value) { + * blurXDirection.uniforms.filterSize = blurYDirection.uniforms.filterSize = value; + * } + * } + * }); + * scene.postProcessStages.add(new Cesium.PostProcessStageComposite({ + * stages : [blurXDirection, blurYDirection], + * uniforms : uniforms + * })); + * @param options - An object with the following properties: + * @param options.stages - An array of {@link PostProcessStage}s or composites to be executed in order. + * @param [options.inputPreviousStageTexture = true] - Whether to execute each post-process stage where the input to one stage is the output of the previous. Otherwise, the input to each contained stage is the output of the stage that executed before the composite. + * @param [options.name = createGuid()] - The unique name of this post-process stage for reference by other composites. If a name is not supplied, a GUID will be generated. + * @param [options.uniforms] - An alias to the uniforms of post-process stages. + */ +export class PostProcessStageComposite { + constructor(options: { + stages: any[]; + inputPreviousStageTexture?: boolean; + name?: string; + uniforms?: any; + }); + /** + * Determines if this post-process stage is ready to be executed. + */ + readonly ready: boolean; + /** + * The unique name of this post-process stage for reference by other stages in a PostProcessStageComposite. + */ + readonly name: string; + /** + * Whether or not to execute this post-process stage when ready. + */ + enabled: boolean; + /** + * An alias to the uniform values of the post-process stages. May be undefined; in which case, get each stage to set uniform values. + */ + uniforms: any; + /** + * All post-process stages are executed in the order of the array. The input texture changes based on the value of inputPreviousStageTexture. + * If inputPreviousStageTexture is true, the input to each stage is the output texture rendered to by the scene or of the stage that executed before it. + * If inputPreviousStageTexture is false, the input texture is the same for each stage in the composite. The input texture is the texture rendered to by the scene + * or the output texture of the previous stage. + */ + readonly inputPreviousStageTexture: boolean; + /** + * The number of post-process stages in this composite. + */ + readonly length: number; + /** + * The features selected for applying the post-process. + */ + selected: any[]; + /** + * Gets the post-process stage at index + * @param index - The index of the post-process stage or composite. + * @returns The post-process stage or composite at index. + */ + get(index: number): PostProcessStage | PostProcessStageComposite; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + */ + destroy(): void; +} + +/** + * Contains functions for creating common post-process stages. + */ +export namespace PostProcessStageLibrary { + /** + * Creates a post-process stage that applies a Gaussian blur to the input texture. This stage is usually applied in conjunction with another stage. + *

    + * This stage has the following uniforms: delta, sigma, and stepSize. + *

    + *

    + * delta and sigma are used to compute the weights of a Gaussian filter. The equation is exp((-0.5 * delta * delta) / (sigma * sigma)). + * The default value for delta is 1.0. The default value for sigma is 2.0. + * stepSize is the distance to the next texel. The default is 1.0. + *

    + * @returns A post-process stage that applies a Gaussian blur to the input texture. + */ + function createBlurStage(): PostProcessStageComposite; + /** + * Creates a post-process stage that applies a depth of field effect. + *

    + * Depth of field simulates camera focus. Objects in the scene that are in focus + * will be clear whereas objects not in focus will be blurred. + *

    + *

    + * This stage has the following uniforms: focalDistance, delta, sigma, and stepSize. + *

    + *

    + * focalDistance is the distance in meters from the camera to set the camera focus. + *

    + *

    + * delta, sigma, and stepSize are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the areas out of focus. + *

    + * @returns A post-process stage that applies a depth of field effect. + */ + function createDepthOfFieldStage(): PostProcessStageComposite; + /** + * Whether or not a depth of field stage is supported. + *

    + * This stage requires the WEBGL_depth_texture extension. + *

    + * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isDepthOfFieldSupported(scene: Scene): boolean; + /** + * Creates a post-process stage that detects edges. + *

    + * Writes the color to the output texture with alpha set to 1.0 when it is on an edge. + *

    + *

    + * This stage has the following uniforms: color and length + *

    + *
      + *
    • color is the color of the highlighted edge. The default is {@link Color#BLACK}.
    • + *
    • length is the length of the edges in pixels. The default is 0.5.
    • + *
    + *

    + * This stage is not supported in 2D. + *

    + * @example + * // multiple silhouette effects + * var yellowEdge = Cesium.PostProcessLibrary.createEdgeDetectionStage(); + * yellowEdge.uniforms.color = Cesium.Color.YELLOW; + * yellowEdge.selected = [feature0]; + * + * var greenEdge = Cesium.PostProcessLibrary.createEdgeDetectionStage(); + * greenEdge.uniforms.color = Cesium.Color.LIME; + * greenEdge.selected = [feature1]; + * + * // draw edges around feature0 and feature1 + * postProcessStages.add(Cesium.PostProcessLibrary.createSilhouetteStage([yellowEdge, greenEdge]); + * @returns A post-process stage that applies an edge detection effect. + */ + function createEdgeDetectionStage(): PostProcessStageComposite; + /** + * Whether or not an edge detection stage is supported. + *

    + * This stage requires the WEBGL_depth_texture extension. + *

    + * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isEdgeDetectionSupported(scene: Scene): boolean; + /** + * Creates a post-process stage that applies a silhouette effect. + *

    + * A silhouette effect composites the color from the edge detection pass with input color texture. + *

    + *

    + * This stage has the following uniforms when edgeDetectionStages is undefined: color and length + *

    + *

    + * color is the color of the highlighted edge. The default is {@link Color#BLACK}. + * length is the length of the edges in pixels. The default is 0.5. + *

    + * @param [edgeDetectionStages] - An array of edge detection post process stages. + * @returns A post-process stage that applies a silhouette effect. + */ + function createSilhouetteStage(edgeDetectionStages?: PostProcessStage[]): PostProcessStageComposite; + /** + * Whether or not a silhouette stage is supported. + *

    + * This stage requires the WEBGL_depth_texture extension. + *

    + * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isSilhouetteSupported(scene: Scene): boolean; + /** + * Whether or not an ambient occlusion stage is supported. + *

    + * This stage requires the WEBGL_depth_texture extension. + *

    + * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isAmbientOcclusionSupported(scene: Scene): boolean; + /** + * Creates a post-process stage that renders the input texture with black and white gradations. + *

    + * This stage has one uniform value, gradations, which scales the luminance of each pixel. + *

    + * @returns A post-process stage that renders the input texture with black and white gradations. + */ + function createBlackAndWhiteStage(): PostProcessStage; + /** + * Creates a post-process stage that saturates the input texture. + *

    + * This stage has one uniform value, brightness, which scales the saturation of each pixel. + *

    + * @returns A post-process stage that saturates the input texture. + */ + function createBrightnessStage(): PostProcessStage; + /** + * Creates a post-process stage that adds a night vision effect to the input texture. + * @returns A post-process stage that adds a night vision effect to the input texture. + */ + function createNightVisionStage(): PostProcessStage; + /** + * Creates a post-process stage that applies an effect simulating light flaring a camera lens. + *

    + * This stage has the following uniforms: dirtTexture, starTexture, intensity, distortion, ghostDispersal, + * haloWidth, dirtAmount, and earthRadius. + *

      + *
    • dirtTexture is a texture sampled to simulate dirt on the lens.
    • + *
    • starTexture is the texture sampled for the star pattern of the flare.
    • + *
    • intensity is a scalar multiplied by the result of the lens flare. The default value is 2.0.
    • + *
    • distortion is a scalar value that affects the chromatic effect distortion. The default value is 10.0.
    • + *
    • ghostDispersal is a scalar indicating how far the halo effect is from the center of the texture. The default value is 0.4.
    • + *
    • haloWidth is a scalar representing the width of the halo from the ghost dispersal. The default value is 0.4.
    • + *
    • dirtAmount is a scalar representing the amount of dirt on the lens. The default value is 0.4.
    • + *
    • earthRadius is the maximum radius of the earth. The default value is Ellipsoid.WGS84.maximumRadius.
    • + *
    + *

    + * @returns A post-process stage for applying a lens flare effect. + */ + function createLensFlareStage(): PostProcessStage; +} + +/** + * Determines how input texture to a {@link PostProcessStage} is sampled. + */ +export enum PostProcessStageSampleMode { + /** + * Samples the texture by returning the closest texel. + */ + NEAREST = 0, + /** + * Samples the texture through bi-linear interpolation of the four nearest texels. + */ + LINEAR = 1 +} + +/** + * A primitive represents geometry in the {@link Scene}. The geometry can be from a single {@link GeometryInstance} + * as shown in example 1 below, or from an array of instances, even if the geometry is from different + * geometry types, e.g., an {@link RectangleGeometry} and an {@link EllipsoidGeometry} as shown in Code Example 2. + *

    + * A primitive combines geometry instances with an {@link Appearance} that describes the full shading, including + * {@link Material} and {@link RenderState}. Roughly, the geometry instance defines the structure and placement, + * and the appearance defines the visual characteristics. Decoupling geometry and appearance allows us to mix + * and match most of them and add a new geometry or appearance independently of each other. + *

    + *

    + * Combining multiple instances into one primitive is called batching, and significantly improves performance for static data. + * Instances can be individually picked; {@link Scene#pick} returns their {@link GeometryInstance#id}. Using + * per-instance appearances like {@link PerInstanceColorAppearance}, each instance can also have a unique color. + *

    + *

    + * {@link Geometry} can either be created and batched on a web worker or the main thread. The first two examples + * show geometry that will be created on a web worker by using the descriptions of the geometry. The third example + * shows how to create the geometry on the main thread by explicitly calling the createGeometry method. + *

    + * @example + * // 1. Draw a translucent ellipse on the surface with a checkerboard pattern + * var instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.EllipseGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-100.0, 20.0), + * semiMinorAxis : 500000.0, + * semiMajorAxis : 1000000.0, + * rotation : Cesium.Math.PI_OVER_FOUR, + * vertexFormat : Cesium.VertexFormat.POSITION_AND_ST + * }), + * id : 'object returned when this instance is picked and to get/set per-instance attributes' + * }); + * scene.primitives.add(new Cesium.Primitive({ + * geometryInstances : instance, + * appearance : new Cesium.EllipsoidSurfaceAppearance({ + * material : Cesium.Material.fromType('Checkerboard') + * }) + * })); + * @example + * // 2. Draw different instances each with a unique color + * var rectangleInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0), + * vertexFormat : Cesium.PerInstanceColorAppearance.VERTEX_FORMAT + * }), + * id : 'rectangle', + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5) + * } + * }); + * var ellipsoidInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.EllipsoidGeometry({ + * radii : new Cesium.Cartesian3(500000.0, 500000.0, 1000000.0), + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-95.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 500000.0), new Cesium.Matrix4()), + * id : 'ellipsoid', + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * } + * }); + * scene.primitives.add(new Cesium.Primitive({ + * geometryInstances : [rectangleInstance, ellipsoidInstance], + * appearance : new Cesium.PerInstanceColorAppearance() + * })); + * @example + * // 3. Create the geometry on the main thread. + * scene.primitives.add(new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : Cesium.EllipsoidGeometry.createGeometry(new Cesium.EllipsoidGeometry({ + * radii : new Cesium.Cartesian3(500000.0, 500000.0, 1000000.0), + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL + * })), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-95.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 500000.0), new Cesium.Matrix4()), + * id : 'ellipsoid', + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * } + * }), + * appearance : new Cesium.PerInstanceColorAppearance() + * })); + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - The geometry instances - or a single geometry instance - to render. + * @param [options.appearance] - The appearance used to render the primitive. + * @param [options.depthFailAppearance] - The appearance used to shade this primitive when it fails the depth test. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the primitive (all geometry instances) from model to world coordinates. + * @param [options.vertexCacheOptimize = false] - When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.compressVertices = true] - When true, the geometry vertices are compressed, which will save memory. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.cull = true] - When true, the renderer frustum culls and horizon culls the primitive's commands based on their bounding volume. Set this to false for a small performance gain if you are manually culling the primitive. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.shadows = ShadowMode.DISABLED] - Determines whether this primitive casts or receives shadows from light sources. + */ +export class Primitive { + constructor(options?: { + geometryInstances?: GeometryInstance[] | GeometryInstance; + appearance?: Appearance; + depthFailAppearance?: Appearance; + show?: boolean; + modelMatrix?: Matrix4; + vertexCacheOptimize?: boolean; + interleave?: boolean; + compressVertices?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + cull?: boolean; + asynchronous?: boolean; + debugShowBoundingVolume?: boolean; + shadows?: ShadowMode; + }); + /** + * The geometry instances rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

    + * Changing this property after the primitive is rendered has no effect. + *

    + */ + readonly geometryInstances: GeometryInstance[] | GeometryInstance; + /** + * The {@link Appearance} used to shade this primitive. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PerInstanceColorAppearance} allow giving each instance unique + * properties. + */ + appearance: Appearance; + /** + * The {@link Appearance} used to shade this primitive when it fails the depth test. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PerInstanceColorAppearance} allow giving each instance unique + * properties. + * + *

    + * When using an appearance that requires a color attribute, like PerInstanceColorAppearance, + * add a depthFailColor per-instance attribute instead. + *

    + * + *

    + * Requires the EXT_frag_depth WebGL extension to render properly. If the extension is not supported, + * there may be artifacts. + *

    + */ + depthFailAppearance: Appearance; + /** + * The 4x4 transformation matrix that transforms the primitive (all geometry instances) from model to world coordinates. + * When this is the identity matrix, the primitive is drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * + *

    + * This property is only supported in 3D mode. + *

    + * @example + * var origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 200000.0); + * p.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin); + */ + modelMatrix: Matrix4; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * When true, the renderer frustum culls and horizon culls the primitive's commands + * based on their bounding volume. Set this to false for a small performance gain + * if you are manually culling the primitive. + */ + cull: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

    + * Draws the bounding sphere for each draw command in the primitive. + *

    + */ + debugShowBoundingVolume: boolean; + /** + * Determines whether this primitive casts or receives shadows from light sources. + */ + shadows: ShadowMode; + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + */ + readonly vertexCacheOptimize: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. * + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * When true, geometry vertices are compressed, which will save memory. + */ + readonly compressVertices: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link Primitive#update} + * is called. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves when the primitive is ready to render. + */ + readonly readyPromise: Promise; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * var attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * attributes.distanceDisplayCondition = Cesium.DistanceDisplayConditionGeometryInstanceAttribute.toValue(100.0, 10000.0); + * attributes.offset = Cesium.OffsetGeometryInstanceAttribute.toValue(Cartesian3.IDENTITY); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

    + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

    + * @example + * e = e && e.destroy(); + */ + destroy(): void; +} + +/** + * A collection of primitives. This is most often used with {@link Scene#primitives}, + * but PrimitiveCollection is also a primitive itself so collections can + * be added to collections forming a hierarchy. + * @example + * var billboards = new Cesium.BillboardCollection(); + * var labels = new Cesium.LabelCollection(); + * + * var collection = new Cesium.PrimitiveCollection(); + * collection.add(billboards); + * + * scene.primitives.add(collection); // Add collection + * scene.primitives.add(labels); // Add regular primitive + * @param [options] - Object with the following properties: + * @param [options.show = true] - Determines if the primitives in the collection will be shown. + * @param [options.destroyPrimitives = true] - Determines if primitives in the collection are destroyed when they are removed. + */ +export class PrimitiveCollection { + constructor(options?: { + show?: boolean; + destroyPrimitives?: boolean; + }); + /** + * Determines if primitives in this collection will be shown. + */ + show: boolean; + /** + * Determines if primitives in the collection are destroyed when they are removed by + * {@link PrimitiveCollection#destroy} or {@link PrimitiveCollection#remove} or implicitly + * by {@link PrimitiveCollection#removeAll}. + * @example + * // Example 1. Primitives are destroyed by default. + * var primitives = new Cesium.PrimitiveCollection(); + * var labels = primitives.add(new Cesium.LabelCollection()); + * primitives = primitives.destroy(); + * var b = labels.isDestroyed(); // true + * @example + * // Example 2. Do not destroy primitives in a collection. + * var primitives = new Cesium.PrimitiveCollection(); + * primitives.destroyPrimitives = false; + * var labels = primitives.add(new Cesium.LabelCollection()); + * primitives = primitives.destroy(); + * var b = labels.isDestroyed(); // false + * labels = labels.destroy(); // explicitly destroy + */ + destroyPrimitives: boolean; + /** + * Gets the number of primitives in the collection. + */ + readonly length: number; + /** + * Adds a primitive to the collection. + * @example + * var billboards = scene.primitives.add(new Cesium.BillboardCollection()); + * @param primitive - The primitive to add. + * @param [index] - the index to add the layer at. If omitted, the primitive will + * added at the bottom of all existing primitives. + * @returns The primitive added to the collection. + */ + add(primitive: any, index?: number): any; + /** + * Removes a primitive from the collection. + * @example + * var billboards = scene.primitives.add(new Cesium.BillboardCollection()); + * scene.primitives.remove(billboards); // Returns true + * @param [primitive] - The primitive to remove. + * @returns true if the primitive was removed; false if the primitive is undefined or was not found in the collection. + */ + remove(primitive?: any): boolean; + /** + * Removes all primitives in the collection. + */ + removeAll(): void; + /** + * Determines if this collection contains a primitive. + * @param [primitive] - The primitive to check for. + * @returns true if the primitive is in the collection; false if the primitive is undefined or was not found in the collection. + */ + contains(primitive?: any): boolean; + /** + * Raises a primitive "up one" in the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive up one. + * @param [primitive] - The primitive to raise. + */ + raise(primitive?: any): void; + /** + * Raises a primitive to the "top" of the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive to the top. + * @param [primitive] - The primitive to raise the top. + */ + raiseToTop(primitive?: any): void; + /** + * Lowers a primitive "down one" in the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive down one. + * @param [primitive] - The primitive to lower. + */ + lower(primitive?: any): void; + /** + * Lowers a primitive to the "bottom" of the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive to the bottom. + * @param [primitive] - The primitive to lower to the bottom. + */ + lowerToBottom(primitive?: any): void; + /** + * Returns the primitive in the collection at the specified index. + * @example + * // Toggle the show property of every primitive in the collection. + * var primitives = scene.primitives; + * var length = primitives.length; + * for (var i = 0; i < length; ++i) { + * var p = primitives.get(i); + * p.show = !p.show; + * } + * @param index - The zero-based index of the primitive to return. + * @returns The primitive at the index. + */ + get(index: number): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by each primitive in this collection. Explicitly destroying this + * collection allows for deterministic release of WebGL resources, instead of relying on the garbage + * collector to destroy this collection. + *

    + * Since destroying a collection destroys all the contained primitives, only destroy a collection + * when you are sure no other code is still using any of the contained primitives. + *

    + * Once this collection is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * primitives = primitives && primitives.destroy(); + */ + destroy(): void; +} + +/** + * The container for all 3D graphical objects and state in a Cesium virtual scene. Generally, + * a scene is not created directly; instead, it is implicitly created by {@link CesiumWidget}. + *

    + * contextOptions parameter details: + *

    + *

    + * The default values are: + * + * { + * webgl : { + * alpha : false, + * depth : true, + * stencil : false, + * antialias : true, + * powerPreference: 'high-performance', + * premultipliedAlpha : true, + * preserveDrawingBuffer : false, + * failIfMajorPerformanceCaveat : false + * }, + * allowTextureFilterAnisotropic : true + * } + * + *

    + *

    + * The webgl property corresponds to the {@link http://www.khronos.org/registry/webgl/specs/latest/#5.2|WebGLContextAttributes} + * object used to create the WebGL context. + *

    + *

    + * webgl.alpha defaults to false, which can improve performance compared to the standard WebGL default + * of true. If an application needs to composite Cesium above other HTML elements using alpha-blending, set + * webgl.alpha to true. + *

    + *

    + * The other webgl properties match the WebGL defaults for {@link http://www.khronos.org/registry/webgl/specs/latest/#5.2|WebGLContextAttributes}. + *

    + *

    + * allowTextureFilterAnisotropic defaults to true, which enables anisotropic texture filtering when the + * WebGL extension is supported. Setting this to false will improve performance, but hurt visual quality, especially for horizon views. + *

    + * @example + * // Create scene without anisotropic texture filtering + * var scene = new Cesium.Scene({ + * canvas : canvas, + * contextOptions : { + * allowTextureFilterAnisotropic : false + * } + * }); + * @param [options] - Object with the following properties: + * @param options.canvas - The HTML canvas element to create the scene for. + * @param [options.contextOptions] - Context and WebGL creation properties. See details above. + * @param [options.creditContainer] - The HTML element in which the credits will be displayed. + * @param [options.creditViewport] - The HTML element in which to display the credit popup. If not specified, the viewport will be a added as a sibling of the canvas. + * @param [options.mapProjection = new GeographicProjection()] - The map projection to use in 2D and Columbus View modes. + * @param [options.orderIndependentTranslucency = true] - If true and the configuration supports it, use order independent translucency. + * @param [options.scene3DOnly = false] - If true, optimizes memory use and performance for 3D mode but disables the ability to use 2D or Columbus View. + * @param [options.terrainExaggeration = 1.0] - A scalar used to exaggerate the terrain. Note that terrain exaggeration will not modify any other primitive as they are positioned relative to the ellipsoid. + * @param [options.shadows = false] - Determines if shadows are cast by light sources. + * @param [options.mapMode2D = MapMode2D.INFINITE_SCROLL] - Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @param [options.requestRenderMode = false] - If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling improves performance of the application, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @param [options.maximumRenderTimeChange = 0.0] - If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + */ +export class Scene { + constructor(options?: { + canvas: HTMLCanvasElement; + contextOptions?: any; + creditContainer?: Element; + creditViewport?: Element; + mapProjection?: MapProjection; + orderIndependentTranslucency?: boolean; + scene3DOnly?: boolean; + terrainExaggeration?: number; + shadows?: boolean; + mapMode2D?: MapMode2D; + requestRenderMode?: boolean; + maximumRenderTimeChange?: number; + }); + /** + * Exceptions occurring in render are always caught in order to raise the + * renderError event. If this property is true, the error is rethrown + * after the event is raised. If this property is false, the render function + * returns normally after raising the event. + */ + rethrowRenderErrors: boolean; + /** + * Determines whether or not to instantly complete the + * scene transition animation on user input. + */ + completeMorphOnUserInput: boolean; + /** + * The event fired at the beginning of a scene transition. + */ + morphStart: Event; + /** + * The event fired at the completion of a scene transition. + */ + morphComplete: Event; + /** + * The {@link SkyBox} used to draw the stars. + */ + skyBox: SkyBox; + /** + * The sky atmosphere drawn around the globe. + */ + skyAtmosphere: SkyAtmosphere; + /** + * The {@link Sun}. + */ + sun: Sun; + /** + * Uses a bloom filter on the sun when enabled. + */ + sunBloom: boolean; + /** + * The {@link Moon} + */ + moon: Moon; + /** + * The background color, which is only visible if there is no sky box, i.e., {@link Scene#skyBox} is undefined. + */ + backgroundColor: Color; + /** + * The current morph transition time between 2D/Columbus View and 3D, + * with 0.0 being 2D or Columbus View and 1.0 being 3D. + */ + morphTime: number; + /** + * The far-to-near ratio of the multi-frustum when using a normal depth buffer. + *

    + * This value is used to create the near and far values for each frustum of the multi-frustum. It is only used + * when {@link Scene#logarithmicDepthBuffer} is false. When logarithmicDepthBuffer is + * true, use {@link Scene#logarithmicDepthFarToNearRatio}. + *

    + */ + farToNearRatio: number; + /** + * The far-to-near ratio of the multi-frustum when using a logarithmic depth buffer. + *

    + * This value is used to create the near and far values for each frustum of the multi-frustum. It is only used + * when {@link Scene#logarithmicDepthBuffer} is true. When logarithmicDepthBuffer is + * false, use {@link Scene#farToNearRatio}. + *

    + */ + logarithmicDepthFarToNearRatio: number; + /** + * Determines the uniform depth size in meters of each frustum of the multifrustum in 2D. If a primitive or model close + * to the surface shows z-fighting, decreasing this will eliminate the artifact, but decrease performance. On the + * other hand, increasing this will increase performance but may cause z-fighting among primitives close to the surface. + */ + nearToFarDistance2D: number; + /** + * This property is for debugging only; it is not for production use. + *

    + * A function that determines what commands are executed. As shown in the examples below, + * the function receives the command's owner as an argument, and returns a boolean indicating if the + * command should be executed. + *

    + *

    + * The default is undefined, indicating that all commands are executed. + *

    + * @example + * // Do not execute any commands. + * scene.debugCommandFilter = function(command) { + * return false; + * }; + * + * // Execute only the billboard's commands. That is, only draw the billboard. + * var billboards = new Cesium.BillboardCollection(); + * scene.debugCommandFilter = function(command) { + * return command.owner === billboards; + * }; + */ + debugCommandFilter: (...params: any[]) => any; + /** + * This property is for debugging only; it is not for production use. + *

    + * When true, commands are randomly shaded. This is useful + * for performance analysis to see what parts of a scene or model are + * command-dense and could benefit from batching. + *

    + */ + debugShowCommands: boolean; + /** + * This property is for debugging only; it is not for production use. + *

    + * When true, commands are shaded based on the frustums they + * overlap. Commands in the closest frustum are tinted red, commands in + * the next closest are green, and commands in the farthest frustum are + * blue. If a command overlaps more than one frustum, the color components + * are combined, e.g., a command overlapping the first two frustums is tinted + * yellow. + *

    + */ + debugShowFrustums: boolean; + /** + * This property is for debugging only; it is not for production use. + *

    + * Displays frames per second and time between frames. + *

    + */ + debugShowFramesPerSecond: boolean; + /** + * This property is for debugging only; it is not for production use. + *

    + * Displays depth information for the indicated frustum. + *

    + */ + debugShowGlobeDepth: boolean; + /** + * This property is for debugging only; it is not for production use. + *

    + * Indicates which frustum will have depth information displayed. + *

    + */ + debugShowDepthFrustum: number; + /** + * This property is for debugging only; it is not for production use. + *

    + * When true, draws outlines to show the boundaries of the camera frustums + *

    + */ + debugShowFrustumPlanes: boolean; + /** + * When true, enables picking using the depth buffer. + */ + useDepthPicking: boolean; + /** + * When true, enables picking translucent geometry using the depth buffer. Note that {@link Scene#useDepthPicking} must also be true for enabling this to work. + * + *

    + * Render must be called between picks. + *
    There is a decrease in performance when enabled. There are extra draw calls to write depth for + * translucent geometry. + *

    + * @example + * // picking the position of a translucent primitive + * viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) { + * var pickedFeature = viewer.scene.pick(movement.position); + * if (!Cesium.defined(pickedFeature)) { + * // nothing picked + * return; + * } + * viewer.scene.render(); + * var worldPosition = viewer.scene.pickPosition(movement.position); + * }, Cesium.ScreenSpaceEventType.LEFT_CLICK); + */ + pickTranslucentDepth: boolean; + /** + * Blends the atmosphere to geometry far from the camera for horizon views. Allows for additional + * performance improvements by rendering less geometry and dispatching less terrain requests. + */ + fog: Fog; + /** + * The shadow map for the scene's light source. When enabled, models, primitives, and the globe may cast and receive shadows. + */ + shadowMap: ShadowMap; + /** + * When false, 3D Tiles will render normally. When true, classified 3D Tile geometry will render normally and + * unclassified 3D Tile geometry will render with the color multiplied by {@link Scene#invertClassificationColor}. + */ + invertClassification: boolean; + /** + * The highlight color of unclassified 3D Tile geometry when {@link Scene#invertClassification} is true. + *

    When the color's alpha is less than 1.0, the unclassified portions of the 3D Tiles will not blend correctly with the classified positions of the 3D Tiles.

    + *

    Also, when the color's alpha is less than 1.0, the WEBGL_depth_texture and EXT_frag_depth WebGL extensions must be supported.

    + */ + invertClassificationColor: Color; + /** + * The focal length for use when with cardboard or WebVR. + */ + focalLength: number; + /** + * The eye separation distance in meters for use with cardboard or WebVR. + */ + eyeSeparation: number; + /** + * Post processing effects applied to the final render. + */ + postProcessStages: PostProcessStageCollection; + /** + * When true, rendering a frame will only occur when needed as determined by changes within the scene. + * Enabling improves performance of the application, but requires using {@link Scene#requestRender} + * to render a new frame explicitly in this mode. This will be necessary in many cases after making changes + * to the scene in other parts of the API. + */ + requestRenderMode: boolean; + /** + * If {@link Scene#requestRenderMode} is true, this value defines the maximum change in + * simulation time allowed before a render is requested. Lower values increase the number of frames rendered + * and higher values decrease the number of frames rendered. If undefined, changes to + * the simulation time will never request a render. + * This value impacts the rate of rendering for changes in the scene like lighting, entity property updates, + * and animations. + */ + maximumRenderTimeChange: number; + /** + * The spherical harmonic coefficients for image-based lighting of PBR models. + */ + sphericalHarmonicCoefficients: Cartesian3[]; + /** + * The url to the KTX file containing the specular environment map and convoluted mipmaps for image-based lighting of PBR models. + */ + specularEnvironmentMaps: string; + /** + * The light source for shading. Defaults to a directional light from the Sun. + */ + light: Light; + /** + * Gets the canvas element to which this scene is bound. + */ + readonly canvas: HTMLCanvasElement; + /** + * The drawingBufferHeight of the underlying GL context. + */ + readonly drawingBufferHeight: number; + /** + * The drawingBufferHeight of the underlying GL context. + */ + readonly drawingBufferWidth: number; + /** + * The maximum aliased line width, in pixels, supported by this WebGL implementation. It will be at least one. + */ + readonly maximumAliasedLineWidth: number; + /** + * The maximum length in pixels of one edge of a cube map, supported by this WebGL implementation. It will be at least 16. + */ + readonly maximumCubeMapSize: number; + /** + * Returns true if the {@link Scene#pickPosition} function is supported. + */ + readonly pickPositionSupported: boolean; + /** + * Returns true if the {@link Scene#sampleHeight} and {@link Scene#sampleHeightMostDetailed} functions are supported. + */ + readonly sampleHeightSupported: boolean; + /** + * Returns true if the {@link Scene#clampToHeight} and {@link Scene#clampToHeightMostDetailed} functions are supported. + */ + readonly clampToHeightSupported: boolean; + /** + * Returns true if the {@link Scene#invertClassification} is supported. + */ + readonly invertClassificationSupported: boolean; + /** + * Returns true if specular environment maps are supported. + */ + readonly specularEnvironmentMapsSupported: boolean; + /** + * Gets or sets the depth-test ellipsoid. + */ + globe: Globe; + /** + * Gets the collection of primitives. + */ + readonly primitives: PrimitiveCollection; + /** + * Gets the collection of ground primitives. + */ + readonly groundPrimitives: PrimitiveCollection; + /** + * Gets or sets the camera. + */ + readonly camera: Camera; + /** + * Gets the controller for camera input handling. + */ + readonly screenSpaceCameraController: ScreenSpaceCameraController; + /** + * Get the map projection to use in 2D and Columbus View modes. + */ + readonly mapProjection: MapProjection; + /** + * Gets the collection of image layers that will be rendered on the globe. + */ + readonly imageryLayers: ImageryLayerCollection; + /** + * The terrain provider providing surface geometry for the globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets an event that's raised when the terrain provider is changed + */ + readonly terrainProviderChanged: Event; + /** + * Gets the event that will be raised before the scene is updated or rendered. Subscribers to the event + * receive the Scene instance as the first parameter and the current time as the second parameter. + */ + readonly preUpdate: Event; + /** + * Gets the event that will be raised immediately after the scene is updated and before the scene is rendered. + * Subscribers to the event receive the Scene instance as the first parameter and the current time as the second + * parameter. + */ + readonly postUpdate: Event; + /** + * Gets the event that will be raised when an error is thrown inside the render function. + * The Scene instance and the thrown error are the only two parameters passed to the event handler. + * By default, errors are not rethrown after this event is raised, but that can be changed by setting + * the rethrowRenderErrors property. + */ + readonly renderError: Event; + /** + * Gets the event that will be raised after the scene is updated and immediately before the scene is rendered. + * Subscribers to the event receive the Scene instance as the first parameter and the current time as the second + * parameter. + */ + readonly preRender: Event; + /** + * Gets the event that will be raised immediately after the scene is rendered. Subscribers to the event + * receive the Scene instance as the first parameter and the current time as the second parameter. + */ + readonly postRender: Event; + /** + * Gets the simulation time when the scene was last rendered. Returns undefined if the scene has not yet been + * rendered. + */ + readonly lastRenderTime: JulianDate; + /** + * This property is for debugging only; it is not for production use. + *

    + * When {@link Scene.debugShowFrustums} is true, this contains + * properties with statistics about the number of command execute per frustum. + * totalCommands is the total number of commands executed, ignoring + * overlap. commandsInFrustums is an array with the number of times + * commands are executed redundantly, e.g., how many commands overlap two or + * three frustums. + *

    + */ + readonly debugFrustumStatistics: any; + /** + * Gets whether or not the scene is optimized for 3D only viewing. + */ + readonly scene3DOnly: boolean; + /** + * Gets whether or not the scene has order independent translucency enabled. + * Note that this only reflects the original construction option, and there are + * other factors that could prevent OIT from functioning on a given system configuration. + */ + readonly orderIndependentTranslucency: boolean; + /** + * Gets the unique identifier for this scene. + */ + readonly id: string; + /** + * Gets or sets the current mode of the scene. + */ + mode: SceneMode; + /** + * Gets the scalar used to exaggerate the terrain. + */ + readonly terrainExaggeration: number; + /** + * When true, splits the scene into two viewports with steroscopic views for the left and right eyes. + * Used for cardboard and WebVR. + */ + useWebVR: boolean; + /** + * Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + */ + readonly mapMode2D: MapMode2D; + /** + * Gets or sets the position of the Imagery splitter within the viewport. Valid values are between 0.0 and 1.0. + */ + imagerySplitPosition: number; + /** + * The distance from the camera at which to disable the depth test of billboards, labels and points + * to, for example, prevent clipping against terrain. When set to zero, the depth test should always + * be applied. When less than zero, the depth test should never be applied. Setting the disableDepthTestDistance + * property of a billboard, label or point will override this value. + */ + minimumDisableDepthTestDistance: number; + /** + * Whether or not to use a logarithmic depth buffer. Enabling this option will allow for less frustums in the multi-frustum, + * increasing performance. This property relies on fragmentDepth being supported. + */ + logarithmicDepthBuffer: boolean; + /** + * The value used for gamma correction. This is only used when rendering with high dynamic range. + */ + gamma: number; + /** + * Whether or not to use high dynamic range rendering. + */ + highDynamicRange: boolean; + /** + * Whether or not high dynamic range rendering is supported. + */ + readonly highDynamicRangeSupported: boolean; + /** + * Whether or not the camera is underneath the globe. + */ + readonly cameraUnderground: boolean; + /** + * Determines if a compressed texture format is supported. + * @param format - The texture format. May be the name of the format or the WebGL extension name, e.g. s3tc or WEBGL_compressed_texture_s3tc. + * @returns Whether or not the format is supported. + */ + getCompressedTextureFormatSupported(format: string): boolean; + /** + * Update and render the scene. It is usually not necessary to call this function + * directly because {@link CesiumWidget} or {@link Viewer} do it automatically. + * @param [time] - The simulation time at which to render. + */ + render(time?: JulianDate): void; + /** + * Requests a new rendered frame when {@link Scene#requestRenderMode} is set to true. + * The render rate will not exceed the {@link CesiumWidget#targetFrameRate}. + */ + requestRender(): void; + /** + * Returns an object with a `primitive` property that contains the first (top) primitive in the scene + * at a particular window coordinate or undefined if nothing is at the location. Other properties may + * potentially be set depending on the type of primitive and may be used to further identify the picked object. + *

    + * When a feature of a 3D Tiles tileset is picked, pick returns a {@link Cesium3DTileFeature} object. + *

    + * @example + * // On mouse over, color the feature yellow. + * handler.setInputAction(function(movement) { + * var feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.Cesium3DTileFeature) { + * feature.color = Cesium.Color.YELLOW; + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param windowPosition - Window coordinates to perform picking on. + * @param [width = 3] - Width of the pick rectangle. + * @param [height = 3] - Height of the pick rectangle. + * @returns Object containing the picked primitive. + */ + pick(windowPosition: Cartesian2, width?: number, height?: number): any; + /** + * Returns the cartesian position reconstructed from the depth buffer and window position. + *

    + * The position reconstructed from the depth buffer in 2D may be slightly different from those + * reconstructed in 3D and Columbus view. This is caused by the difference in the distribution + * of depth values of perspective and orthographic projection. + *

    + *

    + * Set {@link Scene#pickTranslucentDepth} to true to include the depth of + * translucent primitives; otherwise, this essentially picks through translucent primitives. + *

    + * @param windowPosition - Window coordinates to perform picking on. + * @param [result] - The object on which to restore the result. + * @returns The cartesian position. + */ + pickPosition(windowPosition: Cartesian2, result?: Cartesian3): Cartesian3; + /** + * Returns a list of objects, each containing a `primitive` property, for all primitives at + * a particular window coordinate position. Other properties may also be set depending on the + * type of primitive and may be used to further identify the picked object. The primitives in + * the list are ordered by their visual order in the scene (front to back). + * @example + * var pickedObjects = scene.drillPick(new Cesium.Cartesian2(100.0, 200.0)); + * @param windowPosition - Window coordinates to perform picking on. + * @param [limit] - If supplied, stop drilling after collecting this many picks. + * @param [width = 3] - Width of the pick rectangle. + * @param [height = 3] - Height of the pick rectangle. + * @returns Array of objects, each containing 1 picked primitives. + */ + drillPick(windowPosition: Cartesian2, limit?: number, width?: number, height?: number): any[]; + /** + * Returns the height of scene geometry at the given cartographic position or undefined if there was no + * scene geometry to sample height from. The height of the input position is ignored. May be used to clamp objects to + * the globe, 3D Tiles, or primitives in the scene. + *

    + * This function only samples height from globe tiles and 3D Tiles that are rendered in the current view. Samples height + * from all other primitives regardless of their visibility. + *

    + * @example + * var position = new Cesium.Cartographic(-1.31968, 0.698874); + * var height = viewer.scene.sampleHeight(position); + * console.log(height); + * @param position - The cartographic position to sample height from. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not sample height from. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @returns The height. This may be undefined if there was no scene geometry to sample height from. + */ + sampleHeight(position: Cartographic, objectsToExclude?: object[], width?: number): number; + /** + * Clamps the given cartesian position to the scene geometry along the geodetic surface normal. Returns the + * clamped position or undefined if there was no scene geometry to clamp to. May be used to clamp + * objects to the globe, 3D Tiles, or primitives in the scene. + *

    + * This function only clamps to globe tiles and 3D Tiles that are rendered in the current view. Clamps to + * all other primitives regardless of their visibility. + *

    + * @example + * // Clamp an entity to the underlying scene geometry + * var position = entity.position.getValue(Cesium.JulianDate.now()); + * entity.position = viewer.scene.clampToHeight(position); + * @param cartesian - The cartesian position. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not clamp to. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @param [result] - An optional object to return the clamped position. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. This may be undefined if there was no scene geometry to clamp to. + */ + clampToHeight(cartesian: Cartesian3, objectsToExclude?: object[], width?: number, result?: Cartesian3): Cartesian3; + /** + * Initiates an asynchronous {@link Scene#sampleHeight} query for an array of {@link Cartographic} positions + * using the maximum level of detail for 3D Tilesets in the scene. The height of the input positions is ignored. + * Returns a promise that is resolved when the query completes. Each point height is modified in place. + * If a height cannot be determined because no geometry can be sampled at that location, or another error occurs, + * the height is set to undefined. + * @example + * var positions = [ + * new Cesium.Cartographic(-1.31968, 0.69887), + * new Cesium.Cartographic(-1.10489, 0.83923) + * ]; + * var promise = viewer.scene.sampleHeightMostDetailed(positions); + * promise.then(function(updatedPosition) { + * // positions[0].height and positions[1].height have been updated. + * // updatedPositions is just a reference to positions. + * } + * @param positions - The cartographic positions to update with sampled heights. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not sample height from. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @returns A promise that resolves to the provided list of positions when the query has completed. + */ + sampleHeightMostDetailed(positions: Cartographic[], objectsToExclude?: object[], width?: number): Promise; + /** + * Initiates an asynchronous {@link Scene#clampToHeight} query for an array of {@link Cartesian3} positions + * using the maximum level of detail for 3D Tilesets in the scene. Returns a promise that is resolved when + * the query completes. Each position is modified in place. If a position cannot be clamped because no geometry + * can be sampled at that location, or another error occurs, the element in the array is set to undefined. + * @example + * var cartesians = [ + * entities[0].position.getValue(Cesium.JulianDate.now()), + * entities[1].position.getValue(Cesium.JulianDate.now()) + * ]; + * var promise = viewer.scene.clampToHeightMostDetailed(cartesians); + * promise.then(function(updatedCartesians) { + * entities[0].position = updatedCartesians[0]; + * entities[1].position = updatedCartesians[1]; + * } + * @param cartesians - The cartesian positions to update with clamped positions. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not clamp to. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @returns A promise that resolves to the provided list of positions when the query has completed. + */ + clampToHeightMostDetailed(cartesians: Cartesian3[], objectsToExclude?: object[], width?: number): Promise; + /** + * Transforms a position in cartesian coordinates to canvas coordinates. This is commonly used to place an + * HTML element at the same screen position as an object in the scene. + * @example + * // Output the canvas position of longitude/latitude (0, 0) every time the mouse moves. + * var scene = widget.scene; + * var ellipsoid = scene.globe.ellipsoid; + * var position = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); + * handler.setInputAction(function(movement) { + * console.log(scene.cartesianToCanvasCoordinates(position)); + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param position - The position in cartesian coordinates. + * @param [result] - An optional object to return the input position transformed to canvas coordinates. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. This may be undefined if the input position is near the center of the ellipsoid. + */ + cartesianToCanvasCoordinates(position: Cartesian3, result?: Cartesian2): Cartesian2; + /** + * Instantly completes an active transition. + */ + completeMorph(): void; + /** + * Asynchronously transitions the scene to 2D. + * @param [duration = 2.0] - The amount of time, in seconds, for transition animations to complete. + */ + morphTo2D(duration?: number): void; + /** + * Asynchronously transitions the scene to Columbus View. + * @param [duration = 2.0] - The amount of time, in seconds, for transition animations to complete. + */ + morphToColumbusView(duration?: number): void; + /** + * Asynchronously transitions the scene to 3D. + * @param [duration = 2.0] - The amount of time, in seconds, for transition animations to complete. + */ + morphTo3D(duration?: number): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * scene = scene && scene.destroy(); + */ + destroy(): void; +} + +/** + * Indicates if the scene is viewed in 3D, 2D, or 2.5D Columbus view. + */ +export enum SceneMode { + /** + * Morphing between mode, e.g., 3D to 2D. + */ + MORPHING = 0, + /** + * Columbus View mode. A 2.5D perspective view where the map is laid out + * flat and objects with non-zero height are drawn above it. + */ + COLUMBUS_VIEW = 1, + /** + * 2D mode. The map is viewed top-down with an orthographic projection. + */ + SCENE2D = 2, + /** + * 3D mode. A traditional 3D perspective view of the globe. + */ + SCENE3D = 3 +} + +/** + * Functions that do scene-dependent transforms between rendering-related coordinate systems. + */ +export namespace SceneTransforms { + /** + * Transforms a position in WGS84 coordinates to window coordinates. This is commonly used to place an + * HTML element at the same screen position as an object in the scene. + * @example + * // Output the window position of longitude/latitude (0, 0) every time the mouse moves. + * var scene = widget.scene; + * var ellipsoid = scene.globe.ellipsoid; + * var position = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); + * handler.setInputAction(function(movement) { + * console.log(Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position)); + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param scene - The scene. + * @param position - The position in WGS84 (world) coordinates. + * @param [result] - An optional object to return the input position transformed to window coordinates. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. This may be undefined if the input position is near the center of the ellipsoid. + */ + function wgs84ToWindowCoordinates(scene: Scene, position: Cartesian3, result?: Cartesian2): Cartesian2; + /** + * Transforms a position in WGS84 coordinates to drawing buffer coordinates. This may produce different + * results from SceneTransforms.wgs84ToWindowCoordinates when the browser zoom is not 100%, or on high-DPI displays. + * @example + * // Output the window position of longitude/latitude (0, 0) every time the mouse moves. + * var scene = widget.scene; + * var ellipsoid = scene.globe.ellipsoid; + * var position = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); + * handler.setInputAction(function(movement) { + * console.log(Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position)); + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param scene - The scene. + * @param position - The position in WGS84 (world) coordinates. + * @param [result] - An optional object to return the input position transformed to window coordinates. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. This may be undefined if the input position is near the center of the ellipsoid. + */ + function wgs84ToDrawingBufferCoordinates(scene: Scene, position: Cartesian3, result?: Cartesian2): Cartesian2; +} + +/** + * Modifies the camera position and orientation based on mouse input to a canvas. + * @param scene - The scene. + */ +export class ScreenSpaceCameraController { + constructor(scene: Scene); + /** + * If true, inputs are allowed conditionally with the flags enableTranslate, enableZoom, + * enableRotate, enableTilt, and enableLook. If false, all inputs are disabled. + * + * NOTE: This setting is for temporary use cases, such as camera flights and + * drag-selection of regions (see Picking demo). It is typically set to false at the + * start of such events, and set true on completion. To keep inputs disabled + * past the end of camera flights, you must use the other booleans (enableTranslate, + * enableZoom, enableRotate, enableTilt, and enableLook). + */ + enableInputs: boolean; + /** + * If true, allows the user to pan around the map. If false, the camera stays locked at the current position. + * This flag only applies in 2D and Columbus view modes. + */ + enableTranslate: boolean; + /** + * If true, allows the user to zoom in and out. If false, the camera is locked to the current distance from the ellipsoid. + */ + enableZoom: boolean; + /** + * If true, allows the user to rotate the world which translates the user's position. + * This flag only applies in 2D and 3D. + */ + enableRotate: boolean; + /** + * If true, allows the user to tilt the camera. If false, the camera is locked to the current heading. + * This flag only applies in 3D and Columbus view. + */ + enableTilt: boolean; + /** + * If true, allows the user to use free-look. If false, the camera view direction can only be changed through translating + * or rotating. This flag only applies in 3D and Columbus view modes. + */ + enableLook: boolean; + /** + * A parameter in the range [0, 1) used to determine how long + * the camera will continue to spin because of inertia. + * With value of zero, the camera will have no inertia. + */ + inertiaSpin: number; + /** + * A parameter in the range [0, 1) used to determine how long + * the camera will continue to translate because of inertia. + * With value of zero, the camera will have no inertia. + */ + inertiaTranslate: number; + /** + * A parameter in the range [0, 1) used to determine how long + * the camera will continue to zoom because of inertia. + * With value of zero, the camera will have no inertia. + */ + inertiaZoom: number; + /** + * A parameter in the range [0, 1) used to limit the range + * of various user inputs to a percentage of the window width/height per animation frame. + * This helps keep the camera under control in low-frame-rate situations. + */ + maximumMovementRatio: number; + /** + * Sets the duration, in seconds, of the bounce back animations in 2D and Columbus view. + */ + bounceAnimationTime: number; + /** + * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 1.0. + */ + minimumZoomDistance: number; + /** + * The maximum magnitude, in meters, of the camera position when zooming. Defaults to positive infinity. + */ + maximumZoomDistance: number; + /** + * The input that allows the user to pan around the map. This only applies in 2D and Columbus view modes. + *

    + * The type came be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

    + */ + translateEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to zoom in/out. + *

    + * The type came be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

    + */ + zoomEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to rotate around the globe or another object. This only applies in 3D and Columbus view modes. + *

    + * The type came be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

    + */ + rotateEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to tilt in 3D and Columbus view or twist in 2D. + *

    + * The type came be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

    + */ + tiltEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to change the direction the camera is viewing. This only applies in 3D and Columbus view modes. + *

    + * The type came be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

    + */ + lookEventTypes: CameraEventType | any[] | undefined; + /** + * The minimum height the camera must be before picking the terrain instead of the ellipsoid. + */ + minimumPickingTerrainHeight: number; + /** + * The minimum height the camera must be before testing for collision with terrain. + */ + minimumCollisionTerrainHeight: number; + /** + * The minimum height the camera must be before switching from rotating a track ball to + * free look when clicks originate on the sky or in space. + */ + minimumTrackBallHeight: number; + /** + * Enables or disables camera collision detection with terrain. + */ + enableCollisionDetection: boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes mouse listeners held by this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * controller = controller && controller.destroy(); + */ + destroy(): void; +} + +/** + * Use {@link Viewer#shadowMap} to get the scene's shadow map. Do not construct this directly. + * + *

    + * The normalOffset bias pushes the shadows forward slightly, and may be disabled + * for applications that require ultra precise shadows. + *

    + * @param options - An object containing the following properties: + * @param options.lightCamera - A camera representing the light source. + * @param [options.enabled = true] - Whether the shadow map is enabled. + * @param [options.isPointLight = false] - Whether the light source is a point light. Point light shadows do not use cascades. + * @param [options.pointLightRadius = 100.0] - Radius of the point light. + * @param [options.cascadesEnabled = true] - Use multiple shadow maps to cover different partitions of the view frustum. + * @param [options.numberOfCascades = 4] - The number of cascades to use for the shadow map. Supported values are one and four. + * @param [options.maximumDistance = 5000.0] - The maximum distance used for generating cascaded shadows. Lower values improve shadow quality. + * @param [options.size = 2048] - The width and height, in pixels, of each shadow map. + * @param [options.softShadows = false] - Whether percentage-closer-filtering is enabled for producing softer shadows. + * @param [options.darkness = 0.3] - The shadow darkness. + * @param [options.normalOffset = true] - Whether a normal bias is applied to shadows. + */ +export class ShadowMap { + constructor(options: { + lightCamera: Camera; + enabled?: boolean; + isPointLight?: boolean; + pointLightRadius?: boolean; + cascadesEnabled?: boolean; + numberOfCascades?: number; + maximumDistance?: number; + size?: number; + softShadows?: boolean; + darkness?: number; + normalOffset?: boolean; + }); + /** + * Determines the darkness of the shadows. + */ + darkness: number; + /** + * Determines the maximum distance of the shadow map. Only applicable for cascaded shadows. Larger distances may result in lower quality shadows. + */ + maximumDistance: number; + /** + * Determines if the shadow map will be shown. + */ + enabled: boolean; + /** + * Determines if a normal bias will be applied to shadows. + */ + normalOffset: boolean; + /** + * Determines if soft shadows are enabled. Uses pcf filtering which requires more texture reads and may hurt performance. + */ + softShadows: boolean; + /** + * The width and height, in pixels, of each shadow map. + */ + size: number; +} + +/** + * Specifies whether the object casts or receives shadows from light sources when + * shadows are enabled. + */ +export enum ShadowMode { + /** + * The object does not cast or receive shadows. + */ + DISABLED = 0, + /** + * The object casts and receives shadows. + */ + ENABLED = 1, + /** + * The object casts shadows only. + */ + CAST_ONLY = 2, + /** + * The object receives shadows only. + */ + RECEIVE_ONLY = 3 +} + +export namespace SingleTileImageryProvider { + /** + * Initialization options for the SingleTileImageryProvider constructor + * @property url - The url for the tile. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + */ + type ConstructorOptions = { + url: Resource | string; + rectangle?: Rectangle; + credit?: Credit | string; + ellipsoid?: Ellipsoid; + }; +} + +/** + * Provides a single, top-level imagery tile. The single image is assumed to use a + * {@link GeographicTilingScheme}. + * @param options - Object describing initialization options + */ +export class SingleTileImageryProvider { + constructor(options: SingleTileImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the URL of the single, top-level imagery tile. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link SingleTileImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link SingleTileImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * An atmosphere drawn around the limb of the provided ellipsoid. Based on + * {@link https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter16.html|Accurate Atmospheric Scattering} + * in GPU Gems 2. + *

    + * This is only supported in 3D. Atmosphere is faded out when morphing to 2D or Columbus view. + *

    + * @example + * scene.skyAtmosphere = new Cesium.SkyAtmosphere(); + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid that the atmosphere is drawn around. + */ +export class SkyAtmosphere { + constructor(ellipsoid?: Ellipsoid); + /** + * Determines if the atmosphere is shown. + */ + show: boolean; + /** + * Compute atmosphere per-fragment instead of per-vertex. + * This produces better looking atmosphere with a slight performance penalty. + */ + perFragmentAtmosphere: boolean; + /** + * The hue shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A hue shift of 1.0 indicates a complete rotation of the hues available. + */ + hueShift: number; + /** + * The saturation shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A saturation shift of -1.0 is monochrome. + */ + saturationShift: number; + /** + * The brightness shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A brightness shift of -1.0 is complete darkness, which will let space show through. + */ + brightnessShift: number; + /** + * Gets the ellipsoid the atmosphere is drawn around. + */ + readonly ellipsoid: Ellipsoid; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * skyAtmosphere = skyAtmosphere && skyAtmosphere.destroy(); + */ + destroy(): void; +} + +/** + * A sky box around the scene to draw stars. The sky box is defined using the True Equator Mean Equinox (TEME) axes. + *

    + * This is only supported in 3D. The sky box is faded out when morphing to 2D or Columbus view. The size of + * the sky box must not exceed {@link Scene#maximumCubeMapSize}. + *

    + * @example + * scene.skyBox = new Cesium.SkyBox({ + * sources : { + * positiveX : 'skybox_px.png', + * negativeX : 'skybox_nx.png', + * positiveY : 'skybox_py.png', + * negativeY : 'skybox_ny.png', + * positiveZ : 'skybox_pz.png', + * negativeZ : 'skybox_nz.png' + * } + * }); + * @param options - Object with the following properties: + * @param [options.sources] - The source URL or Image object for each of the six cube map faces. See the example below. + * @param [options.show = true] - Determines if this primitive will be shown. + */ +export class SkyBox { + constructor(options: { + sources?: any; + show?: boolean; + }); + /** + * The sources used to create the cube map faces: an object + * with positiveX, negativeX, positiveY, + * negativeY, positiveZ, and negativeZ properties. + * These can be either URLs or Image objects. + */ + sources: any; + /** + * Determines if the sky box will be shown. + */ + show: boolean; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * skyBox = skyBox && skyBox.destroy(); + */ + destroy(): void; +} + +/** + * A ParticleEmitter that emits particles within a sphere. + * Particles will be positioned randomly within the sphere and have initial velocities emanating from the center of the sphere. + * @param [radius = 1.0] - The radius of the sphere in meters. + */ +export class SphereEmitter { + constructor(radius?: number); + /** + * The radius of the sphere in meters. + */ + radius: number; +} + +/** + * Determines the function used to compare stencil values for the stencil test. + */ +export enum StencilFunction { + /** + * The stencil test never passes. + */ + NEVER = WebGLConstants.NEVER, + /** + * The stencil test passes when the masked reference value is less than the masked stencil value. + */ + LESS = WebGLConstants.LESS, + /** + * The stencil test passes when the masked reference value is equal to the masked stencil value. + */ + EQUAL = WebGLConstants.EQUAL, + /** + * The stencil test passes when the masked reference value is less than or equal to the masked stencil value. + */ + LESS_OR_EQUAL = WebGLConstants.LEQUAL, + /** + * The stencil test passes when the masked reference value is greater than the masked stencil value. + */ + GREATER = WebGLConstants.GREATER, + /** + * The stencil test passes when the masked reference value is not equal to the masked stencil value. + */ + NOT_EQUAL = WebGLConstants.NOTEQUAL, + /** + * The stencil test passes when the masked reference value is greater than or equal to the masked stencil value. + */ + GREATER_OR_EQUAL = WebGLConstants.GEQUAL, + /** + * The stencil test always passes. + */ + ALWAYS = WebGLConstants.ALWAYS +} + +/** + * Determines the action taken based on the result of the stencil test. + */ +export enum StencilOperation { + /** + * Sets the stencil buffer value to zero. + */ + ZERO = WebGLConstants.ZERO, + /** + * Does not change the stencil buffer. + */ + KEEP = WebGLConstants.KEEP, + /** + * Replaces the stencil buffer value with the reference value. + */ + REPLACE = WebGLConstants.REPLACE, + /** + * Increments the stencil buffer value, clamping to unsigned byte. + */ + INCREMENT = WebGLConstants.INCR, + /** + * Decrements the stencil buffer value, clamping to zero. + */ + DECREMENT = WebGLConstants.DECR, + /** + * Bitwise inverts the existing stencil buffer value. + */ + INVERT = WebGLConstants.INVERT, + /** + * Increments the stencil buffer value, wrapping to zero when exceeding the unsigned byte range. + */ + INCREMENT_WRAP = WebGLConstants.INCR_WRAP, + /** + * Decrements the stencil buffer value, wrapping to the maximum unsigned byte instead of going below zero. + */ + DECREMENT_WRAP = WebGLConstants.DECR_WRAP +} + +/** + * An expression for a style applied to a {@link Cesium3DTileset}. + *

    + * Derived classes of this interface evaluate expressions in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}. + *

    + *

    + * This type describes an interface and is not intended to be instantiated directly. + *

    + */ +export class StyleExpression { + constructor(); + /** + * Evaluates the result of an expression, optionally using the provided feature's properties. If the result of + * the expression in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language} + * is of type Boolean, Number, or String, the corresponding JavaScript + * primitive type will be returned. If the result is a RegExp, a Javascript RegExp + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. If the result argument is + * a {@link Color}, the {@link Cartesian4} value is converted to a {@link Color} and then returned. + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object onto which to store the result. + * @returns The result of evaluating the expression. + */ + evaluate(feature: Cesium3DTileFeature, result?: any): boolean | number | string | RegExp | Cartesian2 | Cartesian3 | Cartesian4 | Color; + /** + * Evaluates the result of a Color expression, optionally using the provided feature's properties. + *

    + * This is equivalent to {@link StyleExpression#evaluate} but always returns a {@link Color} object. + *

    + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object in which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + evaluateColor(feature: Cesium3DTileFeature, result?: Color): Color; +} + +/** + * Draws a sun billboard. + *

    This is only supported in 3D and Columbus view.

    + * @example + * scene.sun = new Cesium.Sun(); + */ +export class Sun { + constructor(); + /** + * Determines if the sun will be shown. + */ + show: boolean; + /** + * Gets or sets a number that controls how "bright" the Sun's lens flare appears + * to be. Zero shows just the Sun's disc without any flare. + * Use larger values for a more pronounced flare around the Sun. + */ + glowFactor: number; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * sun = sun && sun.destroy(); + * + * + */ + destroy(): void; +} + +/** + * A directional light source that originates from the Sun. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - The light's color. + * @param [options.intensity = 2.0] - The light's intensity. + */ +export class SunLight { + constructor(options?: { + color?: Color; + intensity?: number; + }); + /** + * The color of the light. + */ + color: Color; + /** + * The intensity of the light. + */ + intensity: number; +} + +export namespace TileCoordinatesImageryProvider { + /** + * Initialization options for the TileCoordinatesImageryProvider constructor + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme for which to draw tiles. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [color = Color.YELLOW] - The color to draw the tile box and label. + * @property [tileWidth = 256] - The width of the tile for level-of-detail selection purposes. + * @property [tileHeight = 256] - The height of the tile for level-of-detail selection purposes. + */ + type ConstructorOptions = { + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + color?: Color; + tileWidth?: number; + tileHeight?: number; + }; +} + +/** + * An {@link ImageryProvider} that draws a box around every rendered tile in the tiling scheme, and draws + * a label inside it indicating the X, Y, Level coordinates of the tile. This is mostly useful for + * debugging terrain and imagery rendering problems. + * @param [options] - Object describing initialization options + */ +export class TileCoordinatesImageryProvider { + constructor(options?: TileCoordinatesImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link TileCoordinatesImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * A policy for discarding tile images according to some criteria. This type describes an + * interface and is not intended to be instantiated directly. + */ +export class TileDiscardPolicy { + constructor(); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; +} + +export namespace TileMapServiceImageryProvider { + /** + * Initialization options for the TileMapServiceImageryProvider constructor + * @property [url = '.'] - Path to image tiles on server. + * @property [fileExtension = 'png'] - The file extension for images on the server. + * @property [credit = ''] - A credit for the data source, which is displayed on the canvas. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [tilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link WebMercatorTilingScheme} + * is used. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [tileWidth = 256] - Pixel width of image tiles. + * @property [tileHeight = 256] - Pixel height of image tiles. + * @property [flipXY] - Older versions of gdal2tiles.py flipped X and Y values in tilemapresource.xml. + * Specifying this option will do the same, allowing for loading of these incorrect tilesets. + */ + type ConstructorOptions = { + url?: Resource | string | Promise | Promise; + fileExtension?: string; + credit?: Credit | string; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + tileWidth?: number; + tileHeight?: number; + flipXY?: boolean; + }; +} + +/** + * An imagery provider that provides tiled imagery as generated by + * {@link http://www.maptiler.org/|MapTiler}, {@link http://www.klokan.cz/projects/gdal2tiles/|GDAL2Tiles}, etc. + * @example + * var tms = new Cesium.TileMapServiceImageryProvider({ + * url : '../images/cesium_maptiler/Cesium_Logo_Color', + * fileExtension: 'png', + * maximumLevel: 4, + * rectangle: new Cesium.Rectangle( + * Cesium.Math.toRadians(-120.0), + * Cesium.Math.toRadians(20.0), + * Cesium.Math.toRadians(-60.0), + * Cesium.Math.toRadians(40.0)) + * }); + * @param options - Object describing initialization options + */ +export class TileMapServiceImageryProvider extends UrlTemplateImageryProvider { + constructor(options: TileMapServiceImageryProvider.ConstructorOptions); +} + +/** + * Provides functionality for ImageryProviders that have time dynamic imagery + * @param options - Object with the following properties: + * @param options.clock - A Clock instance that is used when determining the value for the time dimension. Required when options.times is specified. + * @param options.times - TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. + * @param options.requestImageFunction - A function that will request imagery tiles. + * @param options.reloadFunction - A function that will be called when all imagery tiles need to be reloaded. + */ +export class TimeDynamicImagery { + constructor(options: { + clock: Clock; + times: TimeIntervalCollection; + requestImageFunction: (...params: any[]) => any; + reloadFunction: (...params: any[]) => any; + }); + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + */ + clock: Clock; + /** + * Gets or sets a time interval collection. + */ + times: TimeIntervalCollection; + /** + * Gets the current interval. + */ + currentInterval: TimeInterval; + /** + * Gets the tile from the cache if its available. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if the tile is not in the cache. + */ + getFromCache(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Checks if the next interval is approaching and will start preload the tile if necessary. Otherwise it will + * just add the tile to a list to preload when we approach the next interval. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + */ + checkApproachingInterval(x: number, y: number, level: number, request?: Request): void; +} + +/** + * Provides playback of time-dynamic point cloud data. + *

    + * Point cloud frames are prefetched in intervals determined by the average frame load time and the current clock speed. + * If intermediate frames cannot be loaded in time to meet playback speed, they will be skipped. If frames are sufficiently + * small or the clock is sufficiently slow then no frames will be skipped. + *

    + * @param options - Object with the following properties: + * @param options.clock - A {@link Clock} instance that is used when determining the value for the time dimension. + * @param options.intervals - A {@link TimeIntervalCollection} with its data property being an object containing a uri to a 3D Tiles Point Cloud tile and an optional transform. + * @param [options.show = true] - Determines if the point cloud will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - A 4x4 transformation matrix that transforms the point cloud. + * @param [options.shadows = ShadowMode.ENABLED] - Determines whether the point cloud casts or receives shadows from light sources. + * @param [options.maximumMemoryUsage = 256] - The maximum amount of memory in MB that can be used by the point cloud. + * @param [options.shading] - Options for constructing a {@link PointCloudShading} object to control point attenuation and eye dome lighting. + * @param [options.style] - The style, defined using the {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}, applied to each point in the point cloud. + * @param [options.clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the point cloud. + */ +export class TimeDynamicPointCloud { + constructor(options: { + clock: Clock; + intervals: TimeIntervalCollection; + show?: boolean; + modelMatrix?: Matrix4; + shadows?: ShadowMode; + maximumMemoryUsage?: number; + shading?: any; + style?: Cesium3DTileStyle; + clippingPlanes?: ClippingPlaneCollection; + }); + /** + * Determines if the point cloud will be shown. + */ + show: boolean; + /** + * A 4x4 transformation matrix that transforms the point cloud. + */ + modelMatrix: Matrix4; + /** + * Determines whether the point cloud casts or receives shadows from light sources. + *

    + * Enabling shadows has a performance impact. A point cloud that casts shadows must be rendered twice, once from the camera and again from the light's point of view. + *

    + *

    + * Shadows are rendered only when {@link Viewer#shadows} is true. + *

    + */ + shadows: ShadowMode; + /** + * The maximum amount of GPU memory (in MB) that may be used to cache point cloud frames. + *

    + * Frames that are not being loaded or rendered are unloaded to enforce this. + *

    + *

    + * If decreasing this value results in unloading tiles, the tiles are unloaded the next frame. + *

    + */ + maximumMemoryUsage: number; + /** + * Options for controlling point size based on geometric error and eye dome lighting. + */ + shading: PointCloudShading; + /** + * The style, defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling|3D Tiles Styling language}, + * applied to each point in the point cloud. + *

    + * Assign undefined to remove the style, which will restore the visual + * appearance of the point cloud to its default when no style was applied. + *

    + * @example + * pointCloud.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Classification} === 0', 'color("purple", 0.5)'], + * ['${Classification} === 1', 'color("red")'], + * ['true', '${COLOR}'] + * ] + * }, + * show : '${Classification} !== 2' + * }); + */ + style: Cesium3DTileStyle; + /** + * The event fired to indicate that a frame failed to load. A frame may fail to load if the + * request for its uri fails or processing fails due to invalid content. + *

    + * If there are no event listeners, error messages will be logged to the console. + *

    + *

    + * The error object passed to the listener contains two properties: + *

      + *
    • uri: the uri of the failed frame.
    • + *
    • message: the error message.
    • + *
    + * @example + * pointCloud.frameFailed.addEventListener(function(error) { + * console.log('An error occurred loading frame: ' + error.uri); + * console.log('Error: ' + error.message); + * }); + */ + frameFailed: Event; + /** + * The event fired to indicate that a new frame was rendered. + *

    + * The time dynamic point cloud {@link TimeDynamicPointCloud} is passed to the event listener. + *

    + * @example + * pointCloud.frameChanged.addEventListener(function(timeDynamicPointCloud) { + * viewer.camera.viewBoundingSphere(timeDynamicPointCloud.boundingSphere); + * }); + */ + frameChanged: Event; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the point cloud. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * The total amount of GPU memory in bytes used by the point cloud. + */ + readonly totalMemoryUsageInBytes: number; + /** + * The bounding sphere of the frame being rendered. Returns undefined if no frame is being rendered. + */ + readonly boundingSphere: BoundingSphere; + /** + * Gets the promise that will be resolved when the point cloud renders a frame for the first time. + */ + readonly readyPromise: Promise; + /** + * Marks the point cloud's {@link TimeDynamicPointCloud#style} as dirty, which forces all + * points to re-evaluate the style in the next frame. + */ + makeStyleDirty(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * pointCloud = pointCloud && pointCloud.destroy(); + */ + destroy(): void; +} + +export namespace UrlTemplateImageryProvider { + /** + * Initialization options for the UrlTemplateImageryProvider constructor + * @property [options] - Object with the following properties: + * @property url - The URL template to use to request tiles. It has the following keywords: + *
      + *
    • {z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.
    • + *
    • {x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.
    • + *
    • {y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.
    • + *
    • {s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.
    • + *
    • {reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.
    • + *
    • {reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.
    • + *
    • {reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.
    • + *
    • {westDegrees}: The Western edge of the tile in geodetic degrees.
    • + *
    • {southDegrees}: The Southern edge of the tile in geodetic degrees.
    • + *
    • {eastDegrees}: The Eastern edge of the tile in geodetic degrees.
    • + *
    • {northDegrees}: The Northern edge of the tile in geodetic degrees.
    • + *
    • {westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {width}: The width of each tile in pixels.
    • + *
    • {height}: The height of each tile in pixels.
    • + *
    + * @property [pickFeaturesUrl] - The URL template to use to pick features. If this property is not specified, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately returned undefined, indicating no + * features picked. The URL template supports all of the keywords supported by the url + * parameter, plus the following: + *
      + *
    • {i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.
    • + *
    • {j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.
    • + *
    • {reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.
    • + *
    • {reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.
    • + *
    • {longitudeDegrees}: The longitude of the picked position in degrees.
    • + *
    • {latitudeDegrees}: The latitude of the picked position in degrees.
    • + *
    • {longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.
    • + *
    • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
    • + *
    • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
    • + *
    + * @property [urlSchemeZeroPadding] - Gets the URL scheme zero padding for each tile coordinate. The format is '000' where + * each coordinate will be padded on the left with zeros to match the width of the passed string of zeros. e.g. Setting: + * urlSchemeZeroPadding : { '{x}' : '0000'} + * will cause an 'x' value of 12 to return the string '0012' for {x} in the generated URL. + * It the passed object has the following keywords: + *
      + *
    • {z}: The zero padding for the level of the tile in the tiling scheme.
    • + *
    • {x}: The zero padding for the tile X coordinate in the tiling scheme.
    • + *
    • {y}: The zero padding for the the tile Y coordinate in the tiling scheme.
    • + *
    • {reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.
    • + *
    • {reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.
    • + *
    • {reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.
    • + *
    + * @property [subdomains = 'abc'] - The subdomains to use for the {s} placeholder in the URL template. + * If this parameter is a single string, each character in the string is a subdomain. If it is + * an array, each element in the array is a subdomain. + * @property [credit = ''] - A credit for the data source, which is displayed on the canvas. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [tilingScheme = WebMercatorTilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link WebMercatorTilingScheme} + * is used. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [tileWidth = 256] - Pixel width of image tiles. + * @property [tileHeight = 256] - Pixel height of image tiles. + * @property [hasAlphaChannel = true] - true if the images provided by this imagery provider + * include an alpha channel; otherwise, false. If this property is false, an alpha channel, if + * present, will be ignored. If this property is true, any images without an alpha channel will + * be treated as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are potentially reduced. + * @property [getFeatureInfoFormats] - The formats in which to get feature information at a + * specific location when {@link UrlTemplateImageryProvider#pickFeatures} is invoked. If this + * parameter is not specified, feature picking is disabled. + * @property [enablePickFeatures = true] - If true, {@link UrlTemplateImageryProvider#pickFeatures} will + * request the pickFeaturesUrl and attempt to interpret the features included in the response. If false, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. Note + * that this can be dynamically overridden by modifying the {@link UriTemplateImageryProvider#enablePickFeatures} + * property. + * @property [customTags] - Allow to replace custom keywords in the URL template. The object must have strings as keys and functions as values. + */ + type ConstructorOptions = { + options?: Promise | any; + url: Resource | string; + pickFeaturesUrl?: Resource | string; + urlSchemeZeroPadding?: any; + subdomains?: string | string[]; + credit?: Credit | string; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + tileWidth?: number; + tileHeight?: number; + hasAlphaChannel?: boolean; + getFeatureInfoFormats?: GetFeatureInfoFormat[]; + enablePickFeatures?: boolean; + customTags?: any; + }; +} + +/** + * Provides imagery by requesting tiles using a specified URL template. + * @example + * // Access Natural Earth II imagery, which uses a TMS tiling scheme and Geographic (EPSG:4326) project + * var tms = new Cesium.UrlTemplateImageryProvider({ + * url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') + '/{z}/{x}/{reverseY}.jpg', + * credit : '© Analytical Graphics, Inc.', + * tilingScheme : new Cesium.GeographicTilingScheme(), + * maximumLevel : 5 + * }); + * // Access the CartoDB Positron basemap, which uses an OpenStreetMap-like tiling scheme. + * var positron = new Cesium.UrlTemplateImageryProvider({ + * url : 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', + * credit : 'Map tiles by CartoDB, under CC BY 3.0. Data by OpenStreetMap, under ODbL.' + * }); + * // Access a Web Map Service (WMS) server. + * var wms = new Cesium.UrlTemplateImageryProvider({ + * url : 'https://programs.communications.gov.au/geoserver/ows?tiled=true&' + + * 'transparent=true&format=image%2Fpng&exceptions=application%2Fvnd.ogc.se_xml&' + + * 'styles=&service=WMS&version=1.1.1&request=GetMap&' + + * 'layers=public%3AMyBroadband_Availability&srs=EPSG%3A3857&' + + * 'bbox={westProjected}%2C{southProjected}%2C{eastProjected}%2C{northProjected}&' + + * 'width=256&height=256', + * rectangle : Cesium.Rectangle.fromDegrees(96.799393, -43.598214999057824, 153.63925700000001, -9.2159219997013) + * }); + * // Using custom tags in your template url. + * var custom = new Cesium.UrlTemplateImageryProvider({ + * url : 'https://yoururl/{Time}/{z}/{y}/{x}.png', + * customTags : { + * Time: function(imageryProvider, x, y, level) { + * return '20171231' + * } + * } + * }); + * @param options - Object describing initialization options + */ +export class UrlTemplateImageryProvider { + constructor(options: UrlTemplateImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link UrlTemplateImageryProvider#pickFeatures} will + * request the options.pickFeaturesUrl and attempt to interpret the features included in the response. If false, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. + */ + enablePickFeatures: boolean; + /** + * Gets the URL template to use to request tiles. It has the following keywords: + *
      + *
    • {z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.
    • + *
    • {x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.
    • + *
    • {y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.
    • + *
    • {s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.
    • + *
    • {reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.
    • + *
    • {reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.
    • + *
    • {reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.
    • + *
    • {westDegrees}: The Western edge of the tile in geodetic degrees.
    • + *
    • {southDegrees}: The Southern edge of the tile in geodetic degrees.
    • + *
    • {eastDegrees}: The Eastern edge of the tile in geodetic degrees.
    • + *
    • {northDegrees}: The Northern edge of the tile in geodetic degrees.
    • + *
    • {westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.
    • + *
    • {width}: The width of each tile in pixels.
    • + *
    • {height}: The height of each tile in pixels.
    • + *
    + */ + readonly url: string; + /** + * Gets the URL scheme zero padding for each tile coordinate. The format is '000' where each coordinate will be padded on + * the left with zeros to match the width of the passed string of zeros. e.g. Setting: + * urlSchemeZeroPadding : { '{x}' : '0000'} + * will cause an 'x' value of 12 to return the string '0012' for {x} in the generated URL. + * It has the following keywords: + *
      + *
    • {z}: The zero padding for the level of the tile in the tiling scheme.
    • + *
    • {x}: The zero padding for the tile X coordinate in the tiling scheme.
    • + *
    • {y}: The zero padding for the the tile Y coordinate in the tiling scheme.
    • + *
    • {reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.
    • + *
    • {reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.
    • + *
    • {reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.
    • + *
    + */ + readonly urlSchemeZeroPadding: any; + /** + * Gets the URL template to use to use to pick features. If this property is not specified, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined, indicating no + * features picked. The URL template supports all of the keywords supported by the + * {@link UrlTemplateImageryProvider#url} property, plus the following: + *
      + *
    • {i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.
    • + *
    • {j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.
    • + *
    • {reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.
    • + *
    • {reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.
    • + *
    • {longitudeDegrees}: The longitude of the picked position in degrees.
    • + *
    • {latitudeDegrees}: The latitude of the picked position in degrees.
    • + *
    • {longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.
    • + *
    • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
    • + *
    • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
    • + *
    + */ + readonly pickFeaturesUrl: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested, or undefined if there is no limit. + * This function should not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link UrlTemplateImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. This function should + * not be called before {@link ImageryProvider#ready} returns true. + */ + readonly hasAlphaChannel: boolean; + /** + * Reinitializes this instance. Reinitializing an instance already in use is supported, but it is not + * recommended because existing tiles provided by the imagery provider will not be updated. + * @param options - Any of the options that may be passed to the {@link UrlTemplateImageryProvider} constructor. + */ + reinitialize(options: Promise | any): void; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link UrlTemplateImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link ImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * The vertical location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the vertical origin to TOP + * or BOTTOM will display a billboard above or below (in screen space) + * the anchor position. + *

    + *
    + *
    + *
    + */ +export enum VerticalOrigin { + /** + * The origin is at the vertical center between BASELINE and TOP. + */ + CENTER = 0, + /** + * The origin is at the bottom of the object. + */ + BOTTOM = 1, + /** + * If the object contains text, the origin is at the baseline of the text, else the origin is at the bottom of the object. + */ + BASELINE = 2, + /** + * The origin is at the top of the object. + */ + TOP = -1 +} + +/** + * A viewport aligned quad. + * @example + * var viewportQuad = new Cesium.ViewportQuad(new Cesium.BoundingRectangle(0, 0, 80, 40)); + * viewportQuad.material.uniforms.color = new Cesium.Color(1.0, 0.0, 0.0, 1.0); + * @param [rectangle] - The {@link BoundingRectangle} defining the quad's position within the viewport. + * @param [material] - The {@link Material} defining the surface appearance of the viewport quad. + */ +export class ViewportQuad { + constructor(rectangle?: BoundingRectangle, material?: Material); + /** + * Determines if the viewport quad primitive will be shown. + */ + show: boolean; + /** + * The BoundingRectangle defining the quad's position within the viewport. + * @example + * viewportQuad.rectangle = new Cesium.BoundingRectangle(0, 0, 80, 40); + */ + rectangle: BoundingRectangle; + /** + * The surface appearance of the viewport quad. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + *

    + * The default material is Material.ColorType. + *

    + * @example + * // 1. Change the color of the default material to yellow + * viewportQuad.material.uniforms.color = new Cesium.Color(1.0, 1.0, 0.0, 1.0); + * + * // 2. Change material to horizontal stripes + * viewportQuad.material = Cesium.Material.fromType(Cesium.Material.StripeType); + */ + material: Material; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

    + * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

    + */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

    + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

    + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * quad = quad && quad.destroy(); + */ + destroy(): void; +} + +export namespace WebMapServiceImageryProvider { + /** + * Initialization options for the WebMapServiceImageryProvider constructor + * @property url - The URL of the WMS service. The URL supports the same keywords as the {@link UrlTemplateImageryProvider}. + * @property layers - The layers to include, separated by commas. + * @property [parameters = WebMapServiceImageryProvider.DefaultParameters] - Additional parameters to pass to the WMS server in the GetMap URL. + * @property [getFeatureInfoParameters = WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters] - Additional parameters to pass to the WMS server in the GetFeatureInfo URL. + * @property [enablePickFeatures = true] - If true, {@link WebMapServiceImageryProvider#pickFeatures} will invoke + * the GetFeatureInfo operation on the WMS server and return the features included in the response. If false, + * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) + * without communicating with the server. Set this property to false if you know your WMS server does not support + * GetFeatureInfo or if you don't want this provider's features to be pickable. Note that this can be dynamically + * overridden by modifying the WebMapServiceImageryProvider#enablePickFeatures property. + * @property [getFeatureInfoFormats = WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats] - The formats + * in which to try WMS GetFeatureInfo requests. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle of the layer. + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme to use to divide the world into tiles. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [tileWidth = 256] - The width of each tile in pixels. + * @property [tileHeight = 256] - The height of each tile in pixels. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when + * specifying this that the number of tiles at the minimum level is small, such as four or less. A larger number is + * likely to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * If not specified, there is no limit. + * @property [crs] - CRS specification, for use with WMS specification >= 1.3.0. + * @property [srs] - SRS specification, for use with WMS specification 1.1.0 or 1.1.1 + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [subdomains = 'abc'] - The subdomains to use for the {s} placeholder in the URL template. + * If this parameter is a single string, each character in the string is a subdomain. If it is + * an array, each element in the array is a subdomain. + * @property [clock] - A Clock instance that is used when determining the value for the time dimension. Required when `times` is specified. + * @property [times] - TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. + */ + type ConstructorOptions = { + url: Resource | string; + layers: string; + parameters?: any; + getFeatureInfoParameters?: any; + enablePickFeatures?: boolean; + getFeatureInfoFormats?: GetFeatureInfoFormat[]; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + tileWidth?: number; + tileHeight?: number; + minimumLevel?: number; + maximumLevel?: number; + crs?: string; + srs?: string; + credit?: Credit | string; + subdomains?: string | string[]; + clock?: Clock; + times?: TimeIntervalCollection; + }; +} + +/** + * Provides tiled imagery hosted by a Web Map Service (WMS) server. + * @example + * var provider = new Cesium.WebMapServiceImageryProvider({ + * url : 'https://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer', + * layers : '0', + * proxy: new Cesium.DefaultProxy('/proxy/') + * }); + * + * viewer.imageryLayers.addImageryProvider(provider); + * @param options - Object describing initialization options + */ +export class WebMapServiceImageryProvider { + constructor(options: WebMapServiceImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the URL of the WMS server. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the names of the WMS layers, separated by commas. + */ + readonly layers: string; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link WebMapServiceImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link WebMapServiceImageryProvider#pickFeatures} will + * invoke the GetFeatureInfo service on the WMS server and attempt to interpret the features included in the response. If false, + * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. + */ + enablePickFeatures: boolean; + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + */ + clock: Clock; + /** + * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each + * TimeInterval is an object containing the keys and values of the properties that are used during + * tile requests. + */ + times: TimeIntervalCollection; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link WebMapServiceImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function should not be called before {@link ImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; + /** + * The default parameters to include in the WMS URL to obtain images. The values are as follows: + * service=WMS + * version=1.1.1 + * request=GetMap + * styles= + * format=image/jpeg + */ + static readonly DefaultParameters: any; + /** + * The default parameters to include in the WMS URL to get feature information. The values are as follows: + * service=WMS + * version=1.1.1 + * request=GetFeatureInfo + */ + static readonly GetFeatureInfoDefaultParameters: any; +} + +export namespace WebMapTileServiceImageryProvider { + /** + * Initialization options for the WebMapTileServiceImageryProvider constructor + * @property url - The base URL for the WMTS GetTile operation (for KVP-encoded requests) or the tile-URL template (for RESTful requests). The tile-URL template should contain the following variables: {style}, {TileMatrixSet}, {TileMatrix}, {TileRow}, {TileCol}. The first two are optional if actual values are hardcoded or not required by the server. The {s} keyword may be used to specify subdomains. + * @property [format = 'image/jpeg'] - The MIME type for images to retrieve from the server. + * @property layer - The layer name for WMTS requests. + * @property style - The style name for WMTS requests. + * @property tileMatrixSetID - The identifier of the TileMatrixSet to use for WMTS requests. + * @property [tileMatrixLabels] - A list of identifiers in the TileMatrix to use for WMTS requests, one per TileMatrix level. + * @property [clock] - A Clock instance that is used when determining the value for the time dimension. Required when `times` is specified. + * @property [times] - TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. + * @property [dimensions] - A object containing static dimensions and their values. + * @property [tileWidth = 256] - The tile width in pixels. + * @property [tileHeight = 256] - The tile height in pixels. + * @property [tilingScheme] - The tiling scheme corresponding to the organization of the tiles in the TileMatrixSet. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle covered by the layer. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [subdomains = 'abc'] - The subdomains to use for the {s} placeholder in the URL template. + * If this parameter is a single string, each character in the string is a subdomain. If it is + * an array, each element in the array is a subdomain. + */ + type ConstructorOptions = { + url: Resource | string; + format?: string; + layer: string; + style: string; + tileMatrixSetID: string; + tileMatrixLabels?: any[]; + clock?: Clock; + times?: TimeIntervalCollection; + dimensions?: any; + tileWidth?: number; + tileHeight?: number; + tilingScheme?: TilingScheme; + rectangle?: Rectangle; + minimumLevel?: number; + maximumLevel?: number; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + subdomains?: string | string[]; + }; +} + +/** + * Provides tiled imagery served by {@link http://www.opengeospatial.org/standards/wmts|WMTS 1.0.0} compliant servers. + * This provider supports HTTP KVP-encoded and RESTful GetTile requests, but does not yet support the SOAP encoding. + * @example + * // Example 1. USGS shaded relief tiles (KVP) + * var shadedRelief1 = new Cesium.WebMapTileServiceImageryProvider({ + * url : 'http://basemap.nationalmap.gov/arcgis/rest/services/USGSShadedReliefOnly/MapServer/WMTS', + * layer : 'USGSShadedReliefOnly', + * style : 'default', + * format : 'image/jpeg', + * tileMatrixSetID : 'default028mm', + * // tileMatrixLabels : ['default028mm:0', 'default028mm:1', 'default028mm:2' ...], + * maximumLevel: 19, + * credit : new Cesium.Credit('U. S. Geological Survey') + * }); + * viewer.imageryLayers.addImageryProvider(shadedRelief1); + * @example + * // Example 2. USGS shaded relief tiles (RESTful) + * var shadedRelief2 = new Cesium.WebMapTileServiceImageryProvider({ + * url : 'http://basemap.nationalmap.gov/arcgis/rest/services/USGSShadedReliefOnly/MapServer/WMTS/tile/1.0.0/USGSShadedReliefOnly/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpg', + * layer : 'USGSShadedReliefOnly', + * style : 'default', + * format : 'image/jpeg', + * tileMatrixSetID : 'default028mm', + * maximumLevel: 19, + * credit : new Cesium.Credit('U. S. Geological Survey') + * }); + * viewer.imageryLayers.addImageryProvider(shadedRelief2); + * @example + * // Example 3. NASA time dynamic weather data (RESTful) + * var times = Cesium.TimeIntervalCollection.fromIso8601({ + * iso8601: '2015-07-30/2017-06-16/P1D', + * dataCallback: function dataCallback(interval, index) { + * return { + * Time: Cesium.JulianDate.toIso8601(interval.start) + * }; + * } + * }); + * var weather = new Cesium.WebMapTileServiceImageryProvider({ + * url : 'https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/AMSR2_Snow_Water_Equivalent/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png', + * layer : 'AMSR2_Snow_Water_Equivalent', + * style : 'default', + * tileMatrixSetID : '2km', + * maximumLevel : 5, + * format : 'image/png', + * clock: clock, + * times: times, + * credit : new Cesium.Credit('NASA Global Imagery Browse Services for EOSDIS') + * }); + * viewer.imageryLayers.addImageryProvider(weather); + * @param options - Object describing initialization options + */ +export class WebMapTileServiceImageryProvider { + constructor(options: WebMapTileServiceImageryProvider.ConstructorOptions); + /** + * The default alpha blending value of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultAlpha: number | undefined; + /** + * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultNightAlpha: number | undefined; + /** + * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + defaultDayAlpha: number | undefined; + /** + * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + defaultBrightness: number | undefined; + /** + * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + defaultContrast: number | undefined; + /** + * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. + */ + defaultHue: number | undefined; + /** + * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + defaultSaturation: number | undefined; + /** + * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. + */ + defaultGamma: number | undefined; + /** + * The default texture minification filter to apply to this provider. + */ + defaultMinificationFilter: TextureMinificationFilter; + /** + * The default texture magnification filter to apply to this provider. + */ + defaultMagnificationFilter: TextureMagnificationFilter; + /** + * Gets the URL of the service hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the mime type of images returned by this imagery provider. + */ + readonly format: string; + /** + * Gets a value indicating whether or not the provider is ready for use. + */ + readonly ready: boolean; + /** + * Gets a promise that resolves to true when the provider is ready for use. + */ + readonly readyPromise: Promise; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. This function should not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + */ + clock: Clock; + /** + * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each + * TimeInterval is an object containing the keys and values of the properties that are used during + * tile requests. + */ + times: TimeIntervalCollection; + /** + * Gets or sets an object that contains static dimensions and their values. + */ + dimensions: any; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. This function should + * not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request + * should be retried later. The resolved image may be either an + * Image or a Canvas DOM object. + */ + requestImage(x: number, y: number, level: number, request?: Request): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures(x: number, y: number, level: number, longitude: number, latitude: number): Promise | undefined; +} + +/** + * Creates a {@link Cesium3DTileset} instance for the + * {@link https://cesium.com/content/cesium-osm-buildings/|Cesium OSM Buildings} + * tileset. + * @example + * // Create Cesium OSM Buildings with default styling + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.scene.primitives.add(Cesium.createOsmBuildings()); + * @example + * // Create Cesium OSM Buildings with a custom style highlighting + * // schools and hospitals. + * viewer.scene.primitives.add(Cesium.createOsmBuildings({ + * style: new Cesium.Cesium3DTileStyle({ + * color: { + * conditions: [ + * ["${feature['building']} === 'hospital'", "color('#0000FF')"], + * ["${feature['building']} === 'school'", "color('#00FF00')"], + * [true, "color('#ffffff')"] + * ] + * } + * }) + * })); + * @param [options] - Construction options. Any options allowed by the {@link Cesium3DTileset} constructor + * may be specified here. In addition to those, the following properties are supported: + * @param [options.defaultColor = Color.WHITE] - The default color to use for buildings + * that do not have a color. This parameter is ignored if options.style is specified. + * @param [options.style] - The style to use with the tileset. If not + * specified, a default style is used which gives each building or building part a + * color inferred from its OpenStreetMap tags. If no color can be inferred, + * options.defaultColor is used. + */ +export function createOsmBuildings(options?: { + defaultColor?: Color; + style?: Cesium3DTileStyle; +}): Cesium3DTileset; + +/** + * Creates a {@link Primitive} to visualize well-known vector vertex attributes: + * normal, tangent, and bitangent. Normal + * is red; tangent is green; and bitangent is blue. If an attribute is not + * present, it is not drawn. + * @example + * scene.primitives.add(Cesium.createTangentSpaceDebugPrimitive({ + * geometry : instance.geometry, + * length : 100000.0, + * modelMatrix : instance.modelMatrix + * })); + * @param options - Object with the following properties: + * @param options.geometry - The Geometry instance with the attribute. + * @param [options.length = 10000.0] - The length of each line segment in meters. This can be negative to point the vector in the opposite direction. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The model matrix that transforms to transform the geometry from model to world coordinates. + * @returns A new Primitive instance with geometry for the vectors. + */ +export function createTangentSpaceDebugPrimitive(options: { + geometry: Geometry; + length?: number; + modelMatrix?: Matrix4; +}): Primitive; + +/** + * Creates an {@link IonImageryProvider} instance for ion's default global base imagery layer, currently Bing Maps. + * @example + * // Create Cesium World Terrain with default settings + * var viewer = new Cesium.Viewer('cesiumContainer', { + * imageryProvider : Cesium.createWorldImagery(); + * }); + * @example + * // Create Cesium World Terrain with water and normals. + * var viewer = new Cesium.Viewer('cesiumContainer', { + * imageryProvider : Cesium.createWorldImagery({ + * style: Cesium.IonWorldImageryStyle.AERIAL_WITH_LABELS + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.style = IonWorldImageryStyle] - The style of base imagery, only AERIAL, AERIAL_WITH_LABELS, and ROAD are currently supported. + */ +export function createWorldImagery(options?: { + style?: IonWorldImageryStyle; +}): IonImageryProvider; + +/** + * + * + *
    Animation widget + *
    + *

    + * The Animation widget provides buttons for play, pause, and reverse, along with the + * current time and date, surrounded by a "shuttle ring" for controlling the speed of animation. + *

    + * The "shuttle ring" concept is borrowed from video editing, where typically a + * "jog wheel" can be rotated to move past individual animation frames very slowly, and + * a surrounding shuttle ring can be twisted to control direction and speed of fast playback. + * Cesium typically treats time as continuous (not broken into pre-defined animation frames), + * so this widget offers no jog wheel. Instead, the shuttle ring is capable of both fast and + * very slow playback. Click and drag the shuttle ring pointer itself (shown above in green), + * or click in the rest of the ring area to nudge the pointer to the next preset speed in that direction. + *

    + * The Animation widget also provides a "realtime" button (in the upper-left) that keeps + * animation time in sync with the end user's system clock, typically displaying + * "today" or "right now." This mode is not available in {@link ClockRange.CLAMPED} or + * {@link ClockRange.LOOP_STOP} mode if the current time is outside of {@link Clock}'s startTime and endTime. + * @example + * // In HTML head, include a link to Animation.css stylesheet, + * // and in the body, include:
    + * + * var clock = new Cesium.Clock(); + * var clockViewModel = new Cesium.ClockViewModel(clock); + * var viewModel = new Cesium.AnimationViewModel(clockViewModel); + * var widget = new Cesium.Animation('animationContainer', viewModel); + * + * function tick() { + * clock.tick(); + * Cesium.requestAnimationFrame(tick); + * } + * Cesium.requestAnimationFrame(tick); + * @param container - The DOM element or ID that will contain the widget. + * @param viewModel - The view model used by this widget. + */ +export class Animation { + constructor(container: Element | string, viewModel: AnimationViewModel); + /** + * Gets the parent container. + */ + readonly container: Element; + /** + * Gets the view model. + */ + readonly viewModel: AnimationViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the animation widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Resizes the widget to match the container size. + * This function should be called whenever the container size is changed. + */ + resize(): void; + /** + * Updates the widget to reflect any modified CSS rules for theming. + * @example + * //Switch to the cesium-lighter theme. + * document.body.className = 'cesium-lighter'; + * animation.applyThemeChanges(); + */ + applyThemeChanges(): void; +} + +/** + * The view model for the {@link Animation} widget. + * @param clockViewModel - The ClockViewModel instance to use. + */ +export class AnimationViewModel { + constructor(clockViewModel: ClockViewModel); + /** + * Gets or sets whether the shuttle ring is currently being dragged. This property is observable. + */ + shuttleRingDragging: boolean; + /** + * Gets or sets whether dragging the shuttle ring should cause the multiplier + * to snap to the defined tick values rather than interpolating between them. + * This property is observable. + */ + snapToTicks: boolean; + /** + * Gets the string representation of the current time. This property is observable. + */ + timeLabel: string; + /** + * Gets the string representation of the current date. This property is observable. + */ + dateLabel: string; + /** + * Gets the string representation of the current multiplier. This property is observable. + */ + multiplierLabel: string; + /** + * Gets or sets the current shuttle ring angle. This property is observable. + */ + shuttleRingAngle: number; + /** + * Gets or sets the default date formatter used by new instances. + */ + static defaultDateFormatter: AnimationViewModel.DateFormatter; + /** + * Gets or sets the default array of known clock multipliers associated with new instances of the shuttle ring. + */ + static defaultTicks: number[]; + /** + * Gets or sets the default time formatter used by new instances. + */ + static defaultTimeFormatter: AnimationViewModel.TimeFormatter; + /** + * Gets a copy of the array of positive known clock multipliers to associate with the shuttle ring. + * @returns The array of known clock multipliers associated with the shuttle ring. + */ + getShuttleRingTicks(): number[]; + /** + * Sets the array of positive known clock multipliers to associate with the shuttle ring. + * These values will have negative equivalents created for them and sets both the minimum + * and maximum range of values for the shuttle ring as well as the values that are snapped + * to when a single click is made. The values need not be in order, as they will be sorted + * automatically, and duplicate values will be removed. + * @param positiveTicks - The list of known positive clock multipliers to associate with the shuttle ring. + */ + setShuttleRingTicks(positiveTicks: number[]): void; + /** + * Gets a command that decreases the speed of animation. + */ + slower: Command; + /** + * Gets a command that increases the speed of animation. + */ + faster: Command; + /** + * Gets the clock view model. + */ + clockViewModel: ClockViewModel; + /** + * Gets the pause toggle button view model. + */ + pauseViewModel: ToggleButtonViewModel; + /** + * Gets the reverse toggle button view model. + */ + playReverseViewModel: ToggleButtonViewModel; + /** + * Gets the play toggle button view model. + */ + playForwardViewModel: ToggleButtonViewModel; + /** + * Gets the realtime toggle button view model. + */ + playRealtimeViewModel: ToggleButtonViewModel; + /** + * Gets or sets the function which formats a date for display. + */ + dateFormatter: AnimationViewModel.DateFormatter; + /** + * Gets or sets the function which formats a time for display. + */ + timeFormatter: AnimationViewModel.TimeFormatter; +} + +export namespace AnimationViewModel { + /** + * A function that formats a date for display. + * @param date - The date to be formatted + * @param viewModel - The AnimationViewModel instance requesting formatting. + */ + type DateFormatter = (date: JulianDate, viewModel: AnimationViewModel) => string; + /** + * A function that formats a time for display. + * @param date - The date to be formatted + * @param viewModel - The AnimationViewModel instance requesting formatting. + */ + type TimeFormatter = (date: JulianDate, viewModel: AnimationViewModel) => string; +} + +/** + * + * + *
    BaseLayerPicker with its drop-panel open. + *
    + *

    + * The BaseLayerPicker is a single button widget that displays a panel of available imagery and + * terrain providers. When imagery is selected, the corresponding imagery layer is created and inserted + * as the base layer of the imagery collection; removing the existing base. When terrain is selected, + * it replaces the current terrain provider. Each item in the available providers list contains a name, + * a representative icon, and a tooltip to display more information when hovered. The list is initially + * empty, and must be configured before use, as illustrated in the below example. + * @example + * // In HTML head, include a link to the BaseLayerPicker.css stylesheet, + * // and in the body, include:
    + * + * //Create the list of available providers we would like the user to select from. + * //This example uses 3, OpenStreetMap, The Black Marble, and a single, non-streaming world image. + * var imageryViewModels = []; + * imageryViewModels.push(new Cesium.ProviderViewModel({ + * name : 'Open\u00adStreet\u00adMap', + * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/openStreetMap.png'), + * tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable \ + * map of the world.\nhttp://www.openstreetmap.org', + * creationFunction : function() { + * return new Cesium.OpenStreetMapImageryProvider({ + * url : 'https://a.tile.openstreetmap.org/' + * }); + * } + * })); + * + * imageryViewModels.push(new Cesium.ProviderViewModel({ + * name : 'Earth at Night', + * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/blackMarble.png'), + * tooltip : 'The lights of cities and villages trace the outlines of civilization \ + * in this global view of the Earth at night as seen by NASA/NOAA\'s Suomi NPP satellite.', + * creationFunction : function() { + * return new Cesium.IonImageryProvider({ assetId: 3812 }); + * } + * })); + * + * imageryViewModels.push(new Cesium.ProviderViewModel({ + * name : 'Natural Earth\u00a0II', + * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/naturalEarthII.png'), + * tooltip : 'Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/', + * creationFunction : function() { + * return new Cesium.TileMapServiceImageryProvider({ + * url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') + * }); + * } + * })); + * + * //Create a CesiumWidget without imagery, if you haven't already done so. + * var cesiumWidget = new Cesium.CesiumWidget('cesiumContainer', { imageryProvider: false }); + * + * //Finally, create the baseLayerPicker widget using our view models. + * var layers = cesiumWidget.imageryLayers; + * var baseLayerPicker = new Cesium.BaseLayerPicker('baseLayerPickerContainer', { + * globe : cesiumWidget.scene.globe, + * imageryProviderViewModels : imageryViewModels + * }); + * @param container - The parent HTML container node or ID for this widget. + * @param options - Object with the following properties: + * @param options.globe - The Globe to use. + * @param [options.imageryProviderViewModels = []] - The array of ProviderViewModel instances to use for imagery. + * @param [options.selectedImageryProviderViewModel] - The view model for the current base imagery layer, if not supplied the first available imagery layer is used. + * @param [options.terrainProviderViewModels = []] - The array of ProviderViewModel instances to use for terrain. + * @param [options.selectedTerrainProviderViewModel] - The view model for the current base terrain layer, if not supplied the first available terrain layer is used. + */ +export class BaseLayerPicker { + constructor(container: Element | string, options: { + globe: Globe; + imageryProviderViewModels?: ProviderViewModel[]; + selectedImageryProviderViewModel?: ProviderViewModel; + terrainProviderViewModels?: ProviderViewModel[]; + selectedTerrainProviderViewModel?: ProviderViewModel; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: BaseLayerPickerViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link BaseLayerPicker}. + * @param options - Object with the following properties: + * @param options.globe - The Globe to use. + * @param [options.imageryProviderViewModels = []] - The array of ProviderViewModel instances to use for imagery. + * @param [options.selectedImageryProviderViewModel] - The view model for the current base imagery layer, if not supplied the first available imagery layer is used. + * @param [options.terrainProviderViewModels = []] - The array of ProviderViewModel instances to use for terrain. + * @param [options.selectedTerrainProviderViewModel] - The view model for the current base terrain layer, if not supplied the first available terrain layer is used. + */ +export class BaseLayerPickerViewModel { + constructor(options: { + globe: Globe; + imageryProviderViewModels?: ProviderViewModel[]; + selectedImageryProviderViewModel?: ProviderViewModel; + terrainProviderViewModels?: ProviderViewModel[]; + selectedTerrainProviderViewModel?: ProviderViewModel; + }); + /** + * Gets or sets an array of ProviderViewModel instances available for imagery selection. + * This property is observable. + */ + imageryProviderViewModels: ProviderViewModel[]; + /** + * Gets or sets an array of ProviderViewModel instances available for terrain selection. + * This property is observable. + */ + terrainProviderViewModels: ProviderViewModel[]; + /** + * Gets or sets whether the imagery selection drop-down is currently visible. + */ + dropDownVisible: boolean; + /** + * Gets the button tooltip. This property is observable. + */ + buttonTooltip: string; + /** + * Gets the button background image. This property is observable. + */ + buttonImageUrl: string; + /** + * Gets or sets the currently selected imagery. This property is observable. + */ + selectedImagery: ProviderViewModel; + /** + * Gets or sets the currently selected terrain. This property is observable. + */ + selectedTerrain: ProviderViewModel; + /** + * Gets the command to toggle the visibility of the drop down. + */ + toggleDropDown: Command; + /** + * Gets the globe. + */ + globe: Globe; +} + +/** + * A view model that represents each item in the {@link BaseLayerPicker}. + * @param options - The object containing all parameters. + * @param options.name - The name of the layer. + * @param options.tooltip - The tooltip to show when the item is moused over. + * @param options.iconUrl - An icon representing the layer. + * @param [options.category] - A category for the layer. + * @param options.creationFunction - A function or Command + * that creates one or more providers which will be added to the globe when this item is selected. + */ +export class ProviderViewModel { + constructor(options: { + name: string; + tooltip: string; + iconUrl: string; + category?: string; + creationFunction: ProviderViewModel.CreationFunction | Command; + }); + /** + * Gets the display name. This property is observable. + */ + name: string; + /** + * Gets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the icon. This property is observable. + */ + iconUrl: string; + /** + * Gets the Command that creates one or more providers which will be added to + * the globe when this item is selected. + */ + readonly creationCommand: Command; + /** + * Gets the category + */ + readonly category: string; +} + +export namespace ProviderViewModel { + /** + * A function which creates one or more providers. + */ + type CreationFunction = () => ImageryProvider | TerrainProvider | ImageryProvider[] | TerrainProvider[]; +} + +/** + * Inspector widget to aid in debugging 3D Tiles + * @param container - The DOM element or ID that will contain the widget. + * @param scene - the Scene instance to use. + */ +export class Cesium3DTilesInspector { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: Cesium3DTilesInspectorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link Cesium3DTilesInspector}. + * @param scene - The scene instance to use. + * @param performanceContainer - The container for the performance display + */ +export class Cesium3DTilesInspectorViewModel { + constructor(scene: Scene, performanceContainer: HTMLElement); + /** + * Gets or sets the flag to enable performance display. This property is observable. + */ + performance: boolean; + /** + * Gets or sets the flag to show statistics. This property is observable. + */ + showStatistics: boolean; + /** + * Gets or sets the flag to show pick statistics. This property is observable. + */ + showPickStatistics: boolean; + /** + * Gets or sets the flag to show the inspector. This property is observable. + */ + inspectorVisible: boolean; + /** + * Gets or sets the flag to show the tileset section. This property is observable. + */ + tilesetVisible: boolean; + /** + * Gets or sets the flag to show the display section. This property is observable. + */ + displayVisible: boolean; + /** + * Gets or sets the flag to show the update section. This property is observable. + */ + updateVisible: boolean; + /** + * Gets or sets the flag to show the logging section. This property is observable. + */ + loggingVisible: boolean; + /** + * Gets or sets the flag to show the style section. This property is observable. + */ + styleVisible: boolean; + /** + * Gets or sets the flag to show the tile info section. This property is observable. + */ + tileDebugLabelsVisible: boolean; + /** + * Gets or sets the flag to show the optimization info section. This property is observable. + */ + optimizationVisible: boolean; + /** + * Gets or sets the JSON for the tileset style. This property is observable. + */ + styleString: string; + /** + * Gets the names of the properties in the tileset. This property is observable. + */ + readonly properties: string[]; + /** + * Gets or sets the flag to enable dynamic screen space error. This property is observable. + */ + dynamicScreenSpaceError: boolean; + /** + * Gets or sets the color blend mode. This property is observable. + */ + colorBlendMode: Cesium3DTileColorBlendMode; + /** + * Gets or sets the flag to enable picking. This property is observable. + */ + picking: boolean; + /** + * Gets or sets the flag to colorize tiles. This property is observable. + */ + colorize: boolean; + /** + * Gets or sets the flag to draw with wireframe. This property is observable. + */ + wireframe: boolean; + /** + * Gets or sets the flag to show bounding volumes. This property is observable. + */ + showBoundingVolumes: boolean; + /** + * Gets or sets the flag to show content volumes. This property is observable. + */ + showContentBoundingVolumes: boolean; + /** + * Gets or sets the flag to show request volumes. This property is observable. + */ + showRequestVolumes: boolean; + /** + * Gets or sets the flag to suspend updates. This property is observable. + */ + freezeFrame: boolean; + /** + * Gets or sets the flag to show debug labels only for the currently picked tile. This property is observable. + */ + showOnlyPickedTileDebugLabel: boolean; + /** + * Gets or sets the flag to show tile geometric error. This property is observable. + */ + showGeometricError: boolean; + /** + * Displays the number of commands, points, triangles and features used per tile. This property is observable. + */ + showRenderingStatistics: boolean; + /** + * Displays the memory used per tile. This property is observable. + */ + showMemoryUsage: boolean; + /** + * Gets or sets the flag to show the tile url. This property is observable. + */ + showUrl: boolean; + /** + * Gets or sets the maximum screen space error. This property is observable. + */ + maximumScreenSpaceError: number; + /** + * Gets or sets the dynamic screen space error density. This property is observable. + */ + dynamicScreenSpaceErrorDensity: number; + /** + * Gets or sets the dynamic screen space error density slider value. + * This allows the slider to be exponential because values tend to be closer to 0 than 1. + * This property is observable. + */ + dynamicScreenSpaceErrorDensitySliderValue: number; + /** + * Gets or sets the dynamic screen space error factor. This property is observable. + */ + dynamicScreenSpaceErrorFactor: number; + /** + * Gets or sets the flag to enable point cloud shading. This property is observable. + */ + pointCloudShading: boolean; + /** + * Gets or sets the geometric error scale. This property is observable. + */ + geometricErrorScale: number; + /** + * Gets or sets the maximum attenuation. This property is observable. + */ + maximumAttenuation: number; + /** + * Gets or sets the base resolution. This property is observable. + */ + baseResolution: number; + /** + * Gets or sets the flag to enable eye dome lighting. This property is observable. + */ + eyeDomeLighting: boolean; + /** + * Gets or sets the eye dome lighting strength. This property is observable. + */ + eyeDomeLightingStrength: number; + /** + * Gets or sets the eye dome lighting radius. This property is observable. + */ + eyeDomeLightingRadius: number; + /** + * Gets or sets the pick state + */ + pickActive: boolean; + /** + * Gets or sets the flag to determine if level of detail skipping should be applied during the traversal. + * This property is observable. + */ + skipLevelOfDetail: boolean; + /** + * Gets or sets the multiplier defining the minimum screen space error to skip. This property is observable. + */ + skipScreenSpaceErrorFactor: number; + /** + * Gets or sets the screen space error that must be reached before skipping levels of detail. This property is observable. + */ + baseScreenSpaceError: number; + /** + * Gets or sets the constant defining the minimum number of levels to skip when loading tiles. This property is observable. + */ + skipLevels: number; + /** + * Gets or sets the flag which, when true, only tiles that meet the maximum screen space error will ever be downloaded. + * This property is observable. + */ + immediatelyLoadDesiredLevelOfDetail: boolean; + /** + * Gets or sets the flag which determines whether siblings of visible tiles are always downloaded during traversal. + * This property is observable + */ + loadSiblings: boolean; + /** + * Gets the scene + */ + readonly scene: Scene; + /** + * Gets the performance container + */ + readonly performanceContainer: HTMLElement; + /** + * Gets the statistics text. This property is observable. + */ + readonly statisticsText: string; + /** + * Gets the pick statistics text. This property is observable. + */ + readonly pickStatisticsText: string; + /** + * Gets the available blend modes + */ + readonly colorBlendModes: object[]; + /** + * Gets the editor error message + */ + readonly editorError: string; + /** + * Gets or sets the tileset of the view model. + */ + tileset: Cesium3DTileset; + /** + * Gets the current feature of the view model. + */ + feature: Cesium3DTileFeature; + /** + * Gets the current tile of the view model + */ + tile: Cesium3DTile; + /** + * Toggles the pick tileset mode + */ + togglePickTileset(): void; + /** + * Toggles the inspector visibility + */ + toggleInspector(): void; + /** + * Toggles the visibility of the tileset section + */ + toggleTileset(): void; + /** + * Toggles the visibility of the display section + */ + toggleDisplay(): void; + /** + * Toggles the visibility of the update section + */ + toggleUpdate(): void; + /** + * Toggles the visibility of the logging section + */ + toggleLogging(): void; + /** + * Toggles the visibility of the style section + */ + toggleStyle(): void; + /** + * Toggles the visibility of the tile Debug Info section + */ + toggleTileDebugLabels(): void; + /** + * Toggles the visibility of the optimization section + */ + toggleOptimization(): void; + /** + * Trims tile cache + */ + trimTilesCache(): void; + /** + * Compiles the style in the style editor. + */ + compileStyle(): void; + /** + * Handles key press events on the style editor. + */ + styleEditorKeyPress(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Generates an HTML string of the statistics + * @param tileset - The tileset + * @param isPick - Whether this is getting the statistics for the pick pass + * @returns The formatted statistics + */ + static getStatistics(tileset: Cesium3DTileset, isPick: boolean): string; +} + +/** + * Inspector widget to aid in debugging + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + */ +export class CesiumInspector { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: CesiumInspectorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link CesiumInspector}. + * @param scene - The scene instance to use. + * @param performanceContainer - The instance to use for performance container. + */ +export class CesiumInspectorViewModel { + constructor(scene: Scene, performanceContainer: Element); + /** + * Gets or sets the show frustums state. This property is observable. + */ + frustums: boolean; + /** + * Gets or sets the show frustum planes state. This property is observable. + */ + frustumPlanes: boolean; + /** + * Gets or sets the show performance display state. This property is observable. + */ + performance: boolean; + /** + * Gets or sets the shader cache text. This property is observable. + */ + shaderCacheText: string; + /** + * Gets or sets the show primitive bounding sphere state. This property is observable. + */ + primitiveBoundingSphere: boolean; + /** + * Gets or sets the show primitive reference frame state. This property is observable. + */ + primitiveReferenceFrame: boolean; + /** + * Gets or sets the filter primitive state. This property is observable. + */ + filterPrimitive: boolean; + /** + * Gets or sets the show tile bounding sphere state. This property is observable. + */ + tileBoundingSphere: boolean; + /** + * Gets or sets the filter tile state. This property is observable. + */ + filterTile: boolean; + /** + * Gets or sets the show wireframe state. This property is observable. + */ + wireframe: boolean; + /** + * Gets or sets the show globe depth state. This property is observable. + */ + globeDepth: boolean; + /** + * Gets or sets the show pick depth state. This property is observable. + */ + pickDepth: boolean; + /** + * Gets or sets the index of the depth frustum to display. This property is observable. + */ + depthFrustum: number; + /** + * Gets or sets the suspend updates state. This property is observable. + */ + suspendUpdates: boolean; + /** + * Gets or sets the show tile coordinates state. This property is observable. + */ + tileCoordinates: boolean; + /** + * Gets or sets the frustum statistic text. This property is observable. + */ + frustumStatisticText: string; + /** + * Gets or sets the selected tile information text. This property is observable. + */ + tileText: string; + /** + * Gets if a primitive has been selected. This property is observable. + */ + hasPickedPrimitive: boolean; + /** + * Gets if a tile has been selected. This property is observable + */ + hasPickedTile: boolean; + /** + * Gets if the picking primitive command is active. This property is observable. + */ + pickPrimitiveActive: boolean; + /** + * Gets if the picking tile command is active. This property is observable. + */ + pickTileActive: boolean; + /** + * Gets or sets if the cesium inspector drop down is visible. This property is observable. + */ + dropDownVisible: boolean; + /** + * Gets or sets if the general section is visible. This property is observable. + */ + generalVisible: boolean; + /** + * Gets or sets if the primitive section is visible. This property is observable. + */ + primitivesVisible: boolean; + /** + * Gets or sets if the terrain section is visible. This property is observable. + */ + terrainVisible: boolean; + /** + * Gets or sets the index of the depth frustum text. This property is observable. + */ + depthFrustumText: string; + /** + * Gets the scene to control. + */ + scene: Scene; + /** + * Gets the container of the PerformanceDisplay + */ + performanceContainer: Element; + /** + * Gets the command to toggle the visibility of the drop down. + */ + toggleDropDown: Command; + /** + * Gets the command to toggle the visibility of a BoundingSphere for a primitive + */ + showPrimitiveBoundingSphere: Command; + /** + * Gets the command to toggle the visibility of a {@link DebugModelMatrixPrimitive} for the model matrix of a primitive + */ + showPrimitiveReferenceFrame: Command; + /** + * Gets the command to toggle a filter that renders only a selected primitive + */ + doFilterPrimitive: Command; + /** + * Gets the command to increment the depth frustum index to be shown + */ + incrementDepthFrustum: Command; + /** + * Gets the command to decrement the depth frustum index to be shown + */ + decrementDepthFrustum: Command; + /** + * Gets the command to toggle the visibility of tile coordinates + */ + showTileCoordinates: Command; + /** + * Gets the command to toggle the visibility of a BoundingSphere for a selected tile + */ + showTileBoundingSphere: Command; + /** + * Gets the command to toggle a filter that renders only a selected tile + */ + doFilterTile: Command; + /** + * Gets the command to expand and collapse the general section + */ + toggleGeneral: Command; + /** + * Gets the command to expand and collapse the primitives section + */ + togglePrimitives: Command; + /** + * Gets the command to expand and collapse the terrain section + */ + toggleTerrain: Command; + /** + * Gets the command to pick a primitive + */ + pickPrimitive: Command; + /** + * Gets the command to pick a tile + */ + pickTile: Command; + /** + * Gets the command to pick a tile + */ + selectParent: Command; + /** + * Gets the command to pick a tile + */ + selectNW: Command; + /** + * Gets the command to pick a tile + */ + selectNE: Command; + /** + * Gets the command to pick a tile + */ + selectSW: Command; + /** + * Gets the command to pick a tile + */ + selectSE: Command; + /** + * Gets or sets the current selected primitive + */ + primitive: Command; + /** + * Gets or sets the current selected tile + */ + tile: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * A widget containing a Cesium scene. + * @example + * // For each example, include a link to CesiumWidget.css stylesheet in HTML head, + * // and in the body, include:
    + * + * //Widget with no terrain and default Bing Maps imagery provider. + * var widget = new Cesium.CesiumWidget('cesiumContainer'); + * + * //Widget with ion imagery and Cesium World Terrain. + * var widget = new Cesium.CesiumWidget('cesiumContainer', { + * imageryProvider : Cesium.createWorldImagery(), + * terrainProvider : Cesium.createWorldTerrain(), + * skyBox : new Cesium.SkyBox({ + * sources : { + * positiveX : 'stars/TychoSkymapII.t3_08192x04096_80_px.jpg', + * negativeX : 'stars/TychoSkymapII.t3_08192x04096_80_mx.jpg', + * positiveY : 'stars/TychoSkymapII.t3_08192x04096_80_py.jpg', + * negativeY : 'stars/TychoSkymapII.t3_08192x04096_80_my.jpg', + * positiveZ : 'stars/TychoSkymapII.t3_08192x04096_80_pz.jpg', + * negativeZ : 'stars/TychoSkymapII.t3_08192x04096_80_mz.jpg' + * } + * }), + * // Show Columbus View map with Web Mercator projection + * sceneMode : Cesium.SceneMode.COLUMBUS_VIEW, + * mapProjection : new Cesium.WebMercatorProjection() + * }); + * @param container - The DOM element or ID that will contain the widget. + * @param [options] - Object with the following properties: + * @param [options.clock = new Clock()] - The clock to use to control current time. + * @param [options.imageryProvider = createWorldImagery()] - The imagery provider to serve as the base layer. If set to false, no imagery provider will be added. + * @param [options.terrainProvider = new EllipsoidTerrainProvider] - The terrain provider. + * @param [options.skyBox] - The skybox used to render the stars. When undefined, the default stars are used. If set to false, no skyBox, Sun, or Moon will be added. + * @param [options.skyAtmosphere] - Blue sky, and the glow around the Earth's limb. Set to false to turn it off. + * @param [options.sceneMode = SceneMode.SCENE3D] - The initial scene mode. + * @param [options.scene3DOnly = false] - When true, each geometry instance will only be rendered in 3D to save GPU memory. + * @param [options.orderIndependentTranslucency = true] - If true and the configuration supports it, use order independent translucency. + * @param [options.mapProjection = new GeographicProjection()] - The map projection to use in 2D and Columbus View modes. + * @param [options.globe = new Globe(mapProjection.ellipsoid)] - The globe to use in the scene. If set to false, no globe will be added. + * @param [options.useDefaultRenderLoop = true] - True if this widget should control the render loop, false otherwise. + * @param [options.useBrowserRecommendedResolution = true] - If true, render at the browser's recommended resolution and ignore window.devicePixelRatio. + * @param [options.targetFrameRate] - The target frame rate when using the default render loop. + * @param [options.showRenderLoopErrors = true] - If true, this widget will automatically display an HTML panel to the user containing the error, if a render loop error occurs. + * @param [options.contextOptions] - Context and WebGL creation properties corresponding to options passed to {@link Scene}. + * @param [options.creditContainer] - The DOM element or ID that will contain the {@link CreditDisplay}. If not specified, the credits are added + * to the bottom of the widget itself. + * @param [options.creditViewport] - The DOM element or ID that will contain the credit pop up created by the {@link CreditDisplay}. If not specified, it will appear over the widget itself. + * @param [options.terrainExaggeration = 1.0] - A scalar used to exaggerate the terrain. Note that terrain exaggeration will not modify any other primitive as they are positioned relative to the ellipsoid. + * @param [options.shadows = false] - Determines if shadows are cast by light sources. + * @param [options.terrainShadows = ShadowMode.RECEIVE_ONLY] - Determines if the terrain casts or receives shadows from light sources. + * @param [options.mapMode2D = MapMode2D.INFINITE_SCROLL] - Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @param [options.requestRenderMode = false] - If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling improves performance of the application, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @param [options.maximumRenderTimeChange = 0.0] - If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + */ +export class CesiumWidget { + constructor(container: Element | string, options?: { + clock?: Clock; + imageryProvider?: ImageryProvider | false; + terrainProvider?: TerrainProvider; + skyBox?: SkyBox | false; + skyAtmosphere?: SkyAtmosphere | false; + sceneMode?: SceneMode; + scene3DOnly?: boolean; + orderIndependentTranslucency?: boolean; + mapProjection?: MapProjection; + globe?: Globe | false; + useDefaultRenderLoop?: boolean; + useBrowserRecommendedResolution?: boolean; + targetFrameRate?: number; + showRenderLoopErrors?: boolean; + contextOptions?: any; + creditContainer?: Element | string; + creditViewport?: Element | string; + terrainExaggeration?: number; + shadows?: boolean; + terrainShadows?: ShadowMode; + mapMode2D?: MapMode2D; + requestRenderMode?: boolean; + maximumRenderTimeChange?: number; + }); + /** + * Gets the parent container. + */ + readonly container: Element; + /** + * Gets the canvas. + */ + readonly canvas: HTMLCanvasElement; + /** + * Gets the credit container. + */ + readonly creditContainer: Element; + /** + * Gets the credit viewport + */ + readonly creditViewport: Element; + /** + * Gets the scene. + */ + readonly scene: Scene; + /** + * Gets the collection of image layers that will be rendered on the globe. + */ + readonly imageryLayers: ImageryLayerCollection; + /** + * The terrain provider providing surface geometry for the globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets the camera. + */ + readonly camera: Camera; + /** + * Gets the clock. + */ + readonly clock: Clock; + /** + * Gets the screen space event handler. + */ + readonly screenSpaceEventHandler: ScreenSpaceEventHandler; + /** + * Gets or sets the target frame rate of the widget when useDefaultRenderLoop + * is true. If undefined, the browser's {@link requestAnimationFrame} implementation + * determines the frame rate. If defined, this value must be greater than 0. A value higher + * than the underlying requestAnimationFrame implementation will have no effect. + */ + targetFrameRate: number; + /** + * Gets or sets whether or not this widget should control the render loop. + * If set to true the widget will use {@link requestAnimationFrame} to + * perform rendering and resizing of the widget, as well as drive the + * simulation clock. If set to false, you must manually call the + * resize, render methods as part of a custom + * render loop. If an error occurs during rendering, {@link Scene}'s + * renderError event will be raised and this property + * will be set to false. It must be set back to true to continue rendering + * after the error. + */ + useDefaultRenderLoop: boolean; + /** + * Gets or sets a scaling factor for rendering resolution. Values less than 1.0 can improve + * performance on less powerful devices while values greater than 1.0 will render at a higher + * resolution and then scale down, resulting in improved visual fidelity. + * For example, if the widget is laid out at a size of 640x480, setting this value to 0.5 + * will cause the scene to be rendered at 320x240 and then scaled up while setting + * it to 2.0 will cause the scene to be rendered at 1280x960 and then scaled down. + */ + resolutionScale: number; + /** + * Boolean flag indicating if the browser's recommended resolution is used. + * If true, the browser's device pixel ratio is ignored and 1.0 is used instead, + * effectively rendering based on CSS pixels instead of device pixels. This can improve + * performance on less powerful devices that have high pixel density. When false, rendering + * will be in device pixels. {@link CesiumWidget#resolutionScale} will still take effect whether + * this flag is true or false. + */ + useBrowserRecommendedResolution: boolean; + /** + * Show an error panel to the user containing a title and a longer error message, + * which can be dismissed using an OK button. This panel is displayed automatically + * when a render loop error occurs, if showRenderLoopErrors was not false when the + * widget was constructed. + * @param title - The title to be displayed on the error panel. This string is interpreted as text. + * @param [message] - A helpful, user-facing message to display prior to the detailed error information. This string is interpreted as HTML. + * @param [error] - The error to be displayed on the error panel. This string is formatted using {@link formatError} and then displayed as text. + */ + showErrorPanel(title: string, message?: string, error?: string): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Updates the canvas size, camera aspect ratio, and viewport size. + * This function is called automatically as needed unless + * useDefaultRenderLoop is set to false. + */ + resize(): void; + /** + * Renders the scene. This function is called automatically + * unless useDefaultRenderLoop is set to false; + */ + render(): void; +} + +/** + * A view model which exposes a {@link Clock} for user interfaces. + * @param [clock] - The clock object wrapped by this view model, if undefined a new instance will be created. + */ +export class ClockViewModel { + constructor(clock?: Clock); + /** + * Gets the current system time. + * This property is observable. + */ + systemTime: JulianDate; + /** + * Gets or sets the start time of the clock. + * See {@link Clock#startTime}. + * This property is observable. + */ + startTime: JulianDate; + /** + * Gets or sets the stop time of the clock. + * See {@link Clock#stopTime}. + * This property is observable. + */ + stopTime: JulianDate; + /** + * Gets or sets the current time. + * See {@link Clock#currentTime}. + * This property is observable. + */ + currentTime: JulianDate; + /** + * Gets or sets the clock multiplier. + * See {@link Clock#multiplier}. + * This property is observable. + */ + multiplier: number; + /** + * Gets or sets the clock step setting. + * See {@link Clock#clockStep}. + * This property is observable. + */ + clockStep: ClockStep; + /** + * Gets or sets the clock range setting. + * See {@link Clock#clockRange}. + * This property is observable. + */ + clockRange: ClockRange; + /** + * Gets or sets whether the clock can animate. + * See {@link Clock#canAnimate}. + * This property is observable. + */ + canAnimate: boolean; + /** + * Gets or sets whether the clock should animate. + * See {@link Clock#shouldAnimate}. + * This property is observable. + */ + shouldAnimate: boolean; + /** + * Gets the underlying Clock. + */ + clock: Clock; + /** + * Updates the view model with the contents of the underlying clock. + * Can be called to force an update of the viewModel if the underlying + * clock has changed and Clock.tick has not yet been called. + */ + synchronize(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. Should be called to + * properly clean up the view model when it is no longer needed. + */ + destroy(): void; +} + +/** + * A Command is a function with an extra canExecute observable property to determine + * whether the command can be executed. When executed, a Command function will check the + * value of canExecute and throw if false. + * + * This type describes an interface and is not intended to be instantiated directly. + * See {@link createCommand} to create a command from a function. + */ +export class Command { + constructor(); + /** + * Gets whether this command can currently be executed. This property is observable. + */ + canExecute: boolean; + /** + * Gets an event which is raised before the command executes, the event + * is raised with an object containing two properties: a cancel property, + * which if set to false by the listener will prevent the command from being executed, and + * an args property, which is the array of arguments being passed to the command. + */ + beforeExecute: Event; + /** + * Gets an event which is raised after the command executes, the event + * is raised with the return value of the command as its only parameter. + */ + afterExecute: Event; +} + +/** + * A single button widget for toggling fullscreen mode. + * @param container - The DOM element or ID that will contain the widget. + * @param [fullscreenElement = document.body] - The element or id to be placed into fullscreen mode. + */ +export class FullscreenButton { + constructor(container: Element | string, fullscreenElement?: Element | string); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: FullscreenButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link FullscreenButton}. + * @param [fullscreenElement = document.body] - The element or id to be placed into fullscreen mode. + * @param [container] - The DOM element or ID that will contain the widget. + */ +export class FullscreenButtonViewModel { + constructor(fullscreenElement?: Element | string, container?: Element | string); + /** + * Gets whether or not fullscreen mode is active. This property is observable. + */ + isFullscreen: boolean; + /** + * Gets or sets whether or not fullscreen functionality should be enabled. This property is observable. + */ + isFullscreenEnabled: boolean; + /** + * Gets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets or sets the HTML element to place into fullscreen mode when the + * corresponding button is pressed. + */ + fullscreenElement: Element; + /** + * Gets the Command to toggle fullscreen mode. + */ + command: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. Should be called to + * properly clean up the view model when it is no longer needed. + */ + destroy(): void; +} + +/** + * A widget for finding addresses and landmarks, and flying the camera to them. Geocoding is + * performed using {@link https://cesium.com/cesium-ion/|Cesium ion}. + * @param options - Object with the following properties: + * @param options.container - The DOM element or ID that will contain the widget. + * @param options.scene - The Scene instance to use. + * @param [options.geocoderServices] - The geocoder services to be used + * @param [options.autoComplete = true] - True if the geocoder should query as the user types to autocomplete + * @param [options.flightDuration = 1.5] - The duration of the camera flight to an entered location, in seconds. + * @param [options.destinationFound = GeocoderViewModel.flyToDestination] - A callback function that is called after a successful geocode. If not supplied, the default behavior is to fly the camera to the result destination. + */ +export class Geocoder { + constructor(options: { + container: Element | string; + scene: Scene; + geocoderServices?: GeocoderService[]; + autoComplete?: boolean; + flightDuration?: number; + destinationFound?: Geocoder.DestinationFoundFunction; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the parent container. + */ + searchSuggestionsContainer: Element; + /** + * Gets the view model. + */ + viewModel: GeocoderViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +export namespace Geocoder { + /** + * A function that handles the result of a successful geocode. + * @param viewModel - The view model. + * @param destination - The destination result of the geocode. + */ + type DestinationFoundFunction = (viewModel: GeocoderViewModel, destination: Cartesian3 | Rectangle) => void; +} + +/** + * The view model for the {@link Geocoder} widget. + * @param options - Object with the following properties: + * @param options.scene - The Scene instance to use. + * @param [options.geocoderServices] - Geocoder services to use for geocoding queries. + * If more than one are supplied, suggestions will be gathered for the geocoders that support it, + * and if no suggestion is selected the result from the first geocoder service wil be used. + * @param [options.flightDuration] - The duration of the camera flight to an entered location, in seconds. + * @param [options.destinationFound = GeocoderViewModel.flyToDestination] - A callback function that is called after a successful geocode. If not supplied, the default behavior is to fly the camera to the result destination. + */ +export class GeocoderViewModel { + constructor(options: { + scene: Scene; + geocoderServices?: GeocoderService[]; + flightDuration?: number; + destinationFound?: Geocoder.DestinationFoundFunction; + }); + /** + * Gets or sets a value indicating if this instance should always show its text input field. + */ + keepExpanded: boolean; + /** + * True if the geocoder should query as the user types to autocomplete + */ + autoComplete: boolean; + /** + * Gets and sets the command called when a geocode destination is found + */ + destinationFound: Geocoder.DestinationFoundFunction; + /** + * Gets a value indicating whether a search is currently in progress. This property is observable. + */ + isSearchInProgress: boolean; + /** + * Gets or sets the text to search for. The text can be an address, or longitude, latitude, + * and optional height, where longitude and latitude are in degrees and height is in meters. + */ + searchText: string; + /** + * Gets or sets the the duration of the camera flight in seconds. + * A value of zero causes the camera to instantly switch to the geocoding location. + * The duration will be computed based on the distance when undefined. + */ + flightDuration: number | undefined; + /** + * Gets the event triggered on flight completion. + */ + complete: Event; + /** + * Gets the scene to control. + */ + scene: Scene; + /** + * Gets the Command that is executed when the button is clicked. + */ + search: Command; + /** + * Gets the currently selected geocoder search suggestion + */ + selectedSuggestion: any; + /** + * Gets the list of geocoder search suggestions + */ + suggestions: object[]; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * A function to fly to the destination found by a successful geocode. + */ + static flyToDestination: Geocoder.DestinationFoundFunction; +} + +/** + * A single button widget for returning to the default camera view of the current scene. + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + * @param [duration] - The time, in seconds, it takes to complete the camera flight home. + */ +export class HomeButton { + constructor(container: Element | string, scene: Scene, duration?: number); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: HomeButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link HomeButton}. + * @param scene - The scene instance to use. + * @param [duration] - The duration of the camera flight in seconds. + */ +export class HomeButtonViewModel { + constructor(scene: Scene, duration?: number); + /** + * Gets or sets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the scene to control. + */ + scene: Scene; + /** + * Gets the Command that is executed when the button is clicked. + */ + command: Command; + /** + * Gets or sets the the duration of the camera flight in seconds. + * A value of zero causes the camera to instantly switch to home view. + * The duration will be computed based on the distance when undefined. + */ + duration: number | undefined; +} + +/** + * A widget for displaying information or a description. + * @param container - The DOM element or ID that will contain the widget. + */ +export class InfoBox { + constructor(container: Element | string); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: InfoBoxViewModel; + /** + * Gets the iframe used to display the description. + */ + frame: HTMLIFrameElement; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link InfoBox}. + */ +export class InfoBoxViewModel { + constructor(); + /** + * Gets or sets the maximum height of the info box in pixels. This property is observable. + */ + maxHeight: number; + /** + * Gets or sets whether the camera tracking icon is enabled. + */ + enableCamera: boolean; + /** + * Gets or sets the status of current camera tracking of the selected object. + */ + isCameraTracking: boolean; + /** + * Gets or sets the visibility of the info box. + */ + showInfo: boolean; + /** + * Gets or sets the title text in the info box. + */ + titleText: string; + /** + * Gets or sets the description HTML for the info box. + */ + description: string; + /** + * Gets the SVG path of the camera icon, which can change to be "crossed out" or not. + */ + cameraIconPath: string; + /** + * Gets the maximum height of sections within the info box, minus an offset, in CSS-ready form. + * @param offset - The offset in pixels. + */ + maxHeightOffset(offset: number): string; + /** + * Gets an {@link Event} that is fired when the user clicks the camera icon. + */ + cameraClicked: Event; + /** + * Gets an {@link Event} that is fired when the user closes the info box. + */ + closeClicked: Event; +} + +/** + *

    The NavigationHelpButton is a single button widget for displaying instructions for + * navigating the globe with the mouse.


    + * @example + * // In HTML head, include a link to the NavigationHelpButton.css stylesheet, + * // and in the body, include: + * + * var navigationHelpButton = new Cesium.NavigationHelpButton({ + * container : 'navigationHelpButtonContainer' + * }); + * @param options - Object with the following properties: + * @param options.container - The DOM element or ID that will contain the widget. + * @param [options.instructionsInitiallyVisible = false] - True if the navigation instructions should initially be visible; otherwise, false. + */ +export class NavigationHelpButton { + constructor(options: { + container: Element | string; + instructionsInitiallyVisible?: boolean; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: NavigationHelpButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link NavigationHelpButton}. + */ +export class NavigationHelpButtonViewModel { + constructor(); + /** + * Gets or sets whether the instructions are currently shown. This property is observable. + */ + showInstructions: boolean; + /** + * Gets or sets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the Command that is executed when the button is clicked. + */ + command: Command; + /** + * Gets the Command that is executed when the mouse instructions should be shown. + */ + showClick: Command; + /** + * Gets the Command that is executed when the touch instructions should be shown. + */ + showTouch: Command; +} + +/** + * Monitors performance of the application and displays a message if poor performance is detected. + * @param [options] - Object with the following properties: + * @param options.container - The DOM element or ID that will contain the widget. + * @param options.scene - The {@link Scene} for which to monitor performance. + * @param [options.lowFrameRateMessage = 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] - The + * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure + * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. + */ +export class PerformanceWatchdog { + constructor(options?: { + container: Element | string; + scene: Scene; + lowFrameRateMessage?: string; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: PerformanceWatchdogViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link PerformanceWatchdog}. + * @param [options] - Object with the following properties: + * @param options.scene - The Scene instance for which to monitor performance. + * @param [options.lowFrameRateMessage = 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] - The + * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure + * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. + */ +export class PerformanceWatchdogViewModel { + constructor(options?: { + scene: Scene; + lowFrameRateMessage?: string; + }); + /** + * Gets or sets the message to display when a low frame rate is detected. This string will be interpreted as HTML. + */ + lowFrameRateMessage: string; + /** + * Gets or sets a value indicating whether the low frame rate message has previously been dismissed by the user. If it has + * been dismissed, the message will not be redisplayed, no matter the frame rate. + */ + lowFrameRateMessageDismissed: boolean; + /** + * Gets or sets a value indicating whether the low frame rate message is currently being displayed. + */ + showingLowFrameRateMessage: boolean; + /** + * Gets the {@link Scene} instance for which to monitor performance. + */ + scene: Scene; + /** + * Gets a command that dismisses the low frame rate message. Once it is dismissed, the message + * will not be redisplayed. + */ + dismissMessage: Command; +} + +/** + * The ProjectionPicker is a single button widget for switching between perspective and orthographic projections. + * @example + * // In HTML head, include a link to the ProjectionPicker.css stylesheet, + * // and in the body, include:
    + * // Note: This code assumes you already have a Scene instance. + * + * var projectionPicker = new Cesium.ProjectionPicker('projectionPickerContainer', scene); + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + */ +export class ProjectionPicker { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: ProjectionPickerViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link ProjectionPicker}. + * @param scene - The Scene to switch projections. + */ +export class ProjectionPickerViewModel { + constructor(scene: Scene); + /** + * Gets or sets whether the button drop-down is currently visible. This property is observable. + */ + dropDownVisible: boolean; + /** + * Gets or sets the perspective projection tooltip. This property is observable. + */ + tooltipPerspective: string; + /** + * Gets or sets the orthographic projection tooltip. This property is observable. + */ + tooltipOrthographic: string; + /** + * Gets the currently active tooltip. This property is observable. + */ + selectedTooltip: string; + /** + * Gets or sets the current SceneMode. This property is observable. + */ + sceneMode: SceneMode; + /** + * Gets the scene + */ + scene: Scene; + /** + * Gets the command to toggle the drop down box. + */ + toggleDropDown: Command; + /** + * Gets the command to switch to a perspective projection. + */ + switchToPerspective: Command; + /** + * Gets the command to switch to orthographic projection. + */ + switchToOrthographic: Command; + /** + * Gets whether the scene is currently using an orthographic projection. + */ + isOrthographicProjection: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. + */ + destroy(): void; +} + +/** + * + *

    The SceneModePicker is a single button widget for switching between scene modes; + * shown to the left in its expanded state. Programatic switching of scene modes will + * be automatically reflected in the widget as long as the specified Scene + * is used to perform the change.


    + * @example + * // In HTML head, include a link to the SceneModePicker.css stylesheet, + * // and in the body, include:
    + * // Note: This code assumes you already have a Scene instance. + * + * var sceneModePicker = new Cesium.SceneModePicker('sceneModePickerContainer', scene); + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + * @param [duration = 2.0] - The time, in seconds, it takes for the scene to transition. + */ +export class SceneModePicker { + constructor(container: Element | string, scene: Scene, duration?: number); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: SceneModePickerViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link SceneModePicker}. + * @param scene - The Scene to morph + * @param [duration = 2.0] - The duration of scene morph animations, in seconds + */ +export class SceneModePickerViewModel { + constructor(scene: Scene, duration?: number); + /** + * Gets or sets the current SceneMode. This property is observable. + */ + sceneMode: SceneMode; + /** + * Gets or sets whether the button drop-down is currently visible. This property is observable. + */ + dropDownVisible: boolean; + /** + * Gets or sets the 2D tooltip. This property is observable. + */ + tooltip2D: string; + /** + * Gets or sets the 3D tooltip. This property is observable. + */ + tooltip3D: string; + /** + * Gets or sets the Columbus View tooltip. This property is observable. + */ + tooltipColumbusView: string; + /** + * Gets the currently active tooltip. This property is observable. + */ + selectedTooltip: string; + /** + * Gets the scene + */ + scene: Scene; + /** + * Gets or sets the the duration of scene mode transition animations in seconds. + * A value of zero causes the scene to instantly change modes. + */ + duration: number; + /** + * Gets the command to toggle the drop down box. + */ + toggleDropDown: Command; + /** + * Gets the command to morph to 2D. + */ + morphTo2D: Command; + /** + * Gets the command to morph to 3D. + */ + morphTo3D: Command; + /** + * Gets the command to morph to Columbus View. + */ + morphToColumbusView: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. + */ + destroy(): void; +} + +/** + * A widget for displaying an indicator on a selected object. + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + */ +export class SelectionIndicator { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: SelectionIndicatorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link SelectionIndicator}. + * @param scene - The scene instance to use for screen-space coordinate conversion. + * @param selectionIndicatorElement - The element containing all elements that make up the selection indicator. + * @param container - The DOM element that contains the widget. + */ +export class SelectionIndicatorViewModel { + constructor(scene: Scene, selectionIndicatorElement: Element, container: Element); + /** + * Gets or sets the world position of the object for which to display the selection indicator. + */ + position: Cartesian3; + /** + * Gets or sets the visibility of the selection indicator. + */ + showSelection: boolean; + /** + * Gets the visibility of the position indicator. This can be false even if an + * object is selected, when the selected object has no position. + */ + isVisible: boolean; + /** + * Gets or sets the function for converting the world position of the object to the screen space position. + * @example + * selectionIndicatorViewModel.computeScreenSpacePosition = function(position, result) { + * return Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position, result); + * }; + */ + computeScreenSpacePosition: SelectionIndicatorViewModel.ComputeScreenSpacePosition; + /** + * Updates the view of the selection indicator to match the position and content properties of the view model. + * This function should be called as part of the render loop. + */ + update(): void; + /** + * Animate the indicator to draw attention to the selection. + */ + animateAppear(): void; + /** + * Animate the indicator to release the selection. + */ + animateDepart(): void; + /** + * Gets the HTML element containing the selection indicator. + */ + container: Element; + /** + * Gets the HTML element that holds the selection indicator. + */ + selectionIndicatorElement: Element; + /** + * Gets the scene being used. + */ + scene: Scene; +} + +export namespace SelectionIndicatorViewModel { + /** + * A function that converts the world position of an object to a screen space position. + * @param position - The position in WGS84 (world) coordinates. + * @param result - An object to return the input position transformed to window coordinates. + */ + type ComputeScreenSpacePosition = (position: Cartesian3, result: Cartesian2) => Cartesian2; +} + +/** + * A Knockout binding handler that creates a DOM element for a single SVG path. + * This binding handler will be registered as cesiumSvgPath. + * + *

    + * The parameter to this binding is an object with the following properties: + *

    + * + *
      + *
    • path: The SVG path as a string.
    • + *
    • width: The width of the SVG path with no transformations applied.
    • + *
    • height: The height of the SVG path with no transformations applied.
    • + *
    • css: Optional. A string containing additional CSS classes to apply to the SVG. 'cesium-svgPath-svg' is always applied.
    • + *
    + * @example + * // Create an SVG as a child of a div + *
    + * + * // parameters can be observable from the view model + *
    + * + * // or the whole object can be observable from the view model + *
    + */ +export namespace SvgPathBindingHandler { + function register(): void; +} + +/** + * The Timeline is a widget for displaying and controlling the current scene time. + * @param container - The parent HTML container node for this widget. + * @param clock - The clock to use. + */ +export class Timeline { + constructor(container: Element, clock: Clock); + /** + * Gets the parent container. + */ + container: Element; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Sets the view to the provided times. + * @param startTime - The start time. + * @param stopTime - The stop time. + */ + zoomTo(startTime: JulianDate, stopTime: JulianDate): void; + /** + * Resizes the widget to match the container size. + */ + resize(): void; +} + +/** + * A view model which exposes the properties of a toggle button. + * @param command - The command which will be executed when the button is toggled. + * @param [options] - Object with the following properties: + * @param [options.toggled = false] - A boolean indicating whether the button should be initially toggled. + * @param [options.tooltip = ''] - A string containing the button's tooltip. + */ +export class ToggleButtonViewModel { + constructor(command: Command, options?: { + toggled?: boolean; + tooltip?: string; + }); + /** + * Gets or sets whether the button is currently toggled. This property is observable. + */ + toggled: boolean; + /** + * Gets or sets the button's tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the command which will be executed when the button is toggled. + */ + command: Command; +} + +/** + * A single button widget for toggling vr mode. + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The scene. + * @param [vrElement = document.body] - The element or id to be placed into vr mode. + */ +export class VRButton { + constructor(container: Element | string, scene: Scene, vrElement?: Element | string); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: VRButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; +} + +/** + * The view model for {@link VRButton}. + * @param scene - The scene. + * @param [vrElement = document.body] - The element or id to be placed into VR mode. + */ +export class VRButtonViewModel { + constructor(scene: Scene, vrElement?: Element | string); + /** + * Gets whether or not VR mode is active. + */ + isVRMode: boolean; + /** + * Gets or sets whether or not VR functionality should be enabled. + */ + isVREnabled: boolean; + /** + * Gets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets or sets the HTML element to place into VR mode when the + * corresponding button is pressed. + */ + vrElement: Element; + /** + * Gets the Command to toggle VR mode. + */ + command: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. Should be called to + * properly clean up the view model when it is no longer needed. + */ + destroy(): void; +} + +export namespace Viewer { + /** + * Initialization options for the Viewer constructor + * @property [animation = true] - If set to false, the Animation widget will not be created. + * @property [baseLayerPicker = true] - If set to false, the BaseLayerPicker widget will not be created. + * @property [fullscreenButton = true] - If set to false, the FullscreenButton widget will not be created. + * @property [vrButton = false] - If set to true, the VRButton widget will be created. + * @property [geocoder = true] - If set to false, the Geocoder widget will not be created. + * @property [homeButton = true] - If set to false, the HomeButton widget will not be created. + * @property [infoBox = true] - If set to false, the InfoBox widget will not be created. + * @property [sceneModePicker = true] - If set to false, the SceneModePicker widget will not be created. + * @property [selectionIndicator = true] - If set to false, the SelectionIndicator widget will not be created. + * @property [timeline = true] - If set to false, the Timeline widget will not be created. + * @property [navigationHelpButton = true] - If set to false, the navigation help button will not be created. + * @property [navigationInstructionsInitiallyVisible = true] - True if the navigation instructions should initially be visible, or false if the should not be shown until the user explicitly clicks the button. + * @property [scene3DOnly = false] - When true, each geometry instance will only be rendered in 3D to save GPU memory. + * @property [shouldAnimate = false] - true if the clock should attempt to advance simulation time by default, false otherwise. This option takes precedence over setting {@link Viewer#clockViewModel}. + * @property [clockViewModel = new ClockViewModel(clock)] - The clock view model to use to control current time. + * @property [selectedImageryProviderViewModel] - The view model for the current base imagery layer, if not supplied the first available base layer is used. This value is only valid if `baseLayerPicker` is set to true. + * @property [imageryProviderViewModels = createDefaultImageryProviderViewModels()] - The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if `baseLayerPicker` is set to true. + * @property [selectedTerrainProviderViewModel] - The view model for the current base terrain layer, if not supplied the first available base layer is used. This value is only valid if `baseLayerPicker` is set to true. + * @property [terrainProviderViewModels = createDefaultTerrainProviderViewModels()] - The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if `baseLayerPicker` is set to true. + * @property [imageryProvider = createWorldImagery()] - The imagery provider to use. This value is only valid if `baseLayerPicker` is set to false. + * @property [terrainProvider = new EllipsoidTerrainProvider()] - The terrain provider to use + * @property [skyBox] - The skybox used to render the stars. When undefined, the default stars are used. If set to false, no skyBox, Sun, or Moon will be added. + * @property [skyAtmosphere] - Blue sky, and the glow around the Earth's limb. Set to false to turn it off. + * @property [fullscreenElement = document.body] - The element or id to be placed into fullscreen mode when the full screen button is pressed. + * @property [useDefaultRenderLoop = true] - True if this widget should control the render loop, false otherwise. + * @property [targetFrameRate] - The target frame rate when using the default render loop. + * @property [showRenderLoopErrors = true] - If true, this widget will automatically display an HTML panel to the user containing the error, if a render loop error occurs. + * @property [useBrowserRecommendedResolution = true] - If true, render at the browser's recommended resolution and ignore window.devicePixelRatio. + * @property [automaticallyTrackDataSourceClocks = true] - If true, this widget will automatically track the clock settings of newly added DataSources, updating if the DataSource's clock changes. Set this to false if you want to configure the clock independently. + * @property [contextOptions] - Context and WebGL creation properties corresponding to options passed to {@link Scene}. + * @property [sceneMode = SceneMode.SCENE3D] - The initial scene mode. + * @property [mapProjection = new GeographicProjection()] - The map projection to use in 2D and Columbus View modes. + * @property [globe = new Globe(mapProjection.ellipsoid)] - The globe to use in the scene. If set to false, no globe will be added. + * @property [orderIndependentTranslucency = true] - If true and the configuration supports it, use order independent translucency. + * @property [creditContainer] - The DOM element or ID that will contain the {@link CreditDisplay}. If not specified, the credits are added to the bottom of the widget itself. + * @property [creditViewport] - The DOM element or ID that will contain the credit pop up created by the {@link CreditDisplay}. If not specified, it will appear over the widget itself. + * @property [dataSources = new DataSourceCollection()] - The collection of data sources visualized by the widget. If this parameter is provided, + * the instance is assumed to be owned by the caller and will not be destroyed when the viewer is destroyed. + * @property [terrainExaggeration = 1.0] - A scalar used to exaggerate the terrain. Note that terrain exaggeration will not modify any other primitive as they are positioned relative to the ellipsoid. + * @property [shadows = false] - Determines if shadows are cast by light sources. + * @property [terrainShadows = ShadowMode.RECEIVE_ONLY] - Determines if the terrain casts or receives shadows from light sources. + * @property [mapMode2D = MapMode2D.INFINITE_SCROLL] - Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @property [projectionPicker = false] - If set to true, the ProjectionPicker widget will be created. + * @property [requestRenderMode = false] - If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling reduces the CPU/GPU usage of your application and uses less battery on mobile, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @property [maximumRenderTimeChange = 0.0] - If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + */ + type ConstructorOptions = { + animation?: boolean; + baseLayerPicker?: boolean; + fullscreenButton?: boolean; + vrButton?: boolean; + geocoder?: boolean | GeocoderService[]; + homeButton?: boolean; + infoBox?: boolean; + sceneModePicker?: boolean; + selectionIndicator?: boolean; + timeline?: boolean; + navigationHelpButton?: boolean; + navigationInstructionsInitiallyVisible?: boolean; + scene3DOnly?: boolean; + shouldAnimate?: boolean; + clockViewModel?: ClockViewModel; + selectedImageryProviderViewModel?: ProviderViewModel; + imageryProviderViewModels?: ProviderViewModel[]; + selectedTerrainProviderViewModel?: ProviderViewModel; + terrainProviderViewModels?: ProviderViewModel[]; + imageryProvider?: ImageryProvider; + terrainProvider?: TerrainProvider; + skyBox?: SkyBox | false; + skyAtmosphere?: SkyAtmosphere | false; + fullscreenElement?: Element | string; + useDefaultRenderLoop?: boolean; + targetFrameRate?: number; + showRenderLoopErrors?: boolean; + useBrowserRecommendedResolution?: boolean; + automaticallyTrackDataSourceClocks?: boolean; + contextOptions?: any; + sceneMode?: SceneMode; + mapProjection?: MapProjection; + globe?: Globe; + orderIndependentTranslucency?: boolean; + creditContainer?: Element | string; + creditViewport?: Element | string; + dataSources?: DataSourceCollection; + terrainExaggeration?: number; + shadows?: boolean; + terrainShadows?: ShadowMode; + mapMode2D?: MapMode2D; + projectionPicker?: boolean; + requestRenderMode?: boolean; + maximumRenderTimeChange?: number; + }; + /** + * A function that augments a Viewer instance with additional functionality. + * @param viewer - The viewer instance. + * @param options - Options object to be passed to the mixin function. + */ + type ViewerMixin = (viewer: Viewer, options: any) => void; +} + +/** + * A base widget for building applications. It composites all of the standard Cesium widgets into one reusable package. + * The widget can always be extended by using mixins, which add functionality useful for a variety of applications. + * @example + * //Initialize the viewer widget with several custom options and mixins. + * var viewer = new Cesium.Viewer('cesiumContainer', { + * //Start in Columbus Viewer + * sceneMode : Cesium.SceneMode.COLUMBUS_VIEW, + * //Use Cesium World Terrain + * terrainProvider : Cesium.createWorldTerrain(), + * //Hide the base layer picker + * baseLayerPicker : false, + * //Use OpenStreetMaps + * imageryProvider : new Cesium.OpenStreetMapImageryProvider({ + * url : 'https://a.tile.openstreetmap.org/' + * }), + * skyBox : new Cesium.SkyBox({ + * sources : { + * positiveX : 'stars/TychoSkymapII.t3_08192x04096_80_px.jpg', + * negativeX : 'stars/TychoSkymapII.t3_08192x04096_80_mx.jpg', + * positiveY : 'stars/TychoSkymapII.t3_08192x04096_80_py.jpg', + * negativeY : 'stars/TychoSkymapII.t3_08192x04096_80_my.jpg', + * positiveZ : 'stars/TychoSkymapII.t3_08192x04096_80_pz.jpg', + * negativeZ : 'stars/TychoSkymapII.t3_08192x04096_80_mz.jpg' + * } + * }), + * // Show Columbus View map with Web Mercator projection + * mapProjection : new Cesium.WebMercatorProjection() + * }); + * + * //Add basic drag and drop functionality + * viewer.extend(Cesium.viewerDragDropMixin); + * + * //Show a pop-up alert if we encounter an error when processing a dropped file + * viewer.dropError.addEventListener(function(dropHandler, name, error) { + * console.log(error); + * window.alert(error); + * }); + * @param container - The DOM element or ID that will contain the widget. + * @param [options] - Object describing initialization options + */ +export class Viewer { + constructor(container: Element | string, options?: Viewer.ConstructorOptions); + /** + * Gets the parent container. + */ + readonly container: Element; + /** + * Gets the DOM element for the area at the bottom of the window containing the + * {@link CreditDisplay} and potentially other things. + */ + readonly bottomContainer: Element; + /** + * Gets the CesiumWidget. + */ + readonly cesiumWidget: CesiumWidget; + /** + * Gets the selection indicator. + */ + readonly selectionIndicator: SelectionIndicator; + /** + * Gets the info box. + */ + readonly infoBox: InfoBox; + /** + * Gets the Geocoder. + */ + readonly geocoder: Geocoder; + /** + * Gets the HomeButton. + */ + readonly homeButton: HomeButton; + /** + * Gets the SceneModePicker. + */ + readonly sceneModePicker: SceneModePicker; + /** + * Gets the ProjectionPicker. + */ + readonly projectionPicker: ProjectionPicker; + /** + * Gets the BaseLayerPicker. + */ + readonly baseLayerPicker: BaseLayerPicker; + /** + * Gets the NavigationHelpButton. + */ + readonly navigationHelpButton: NavigationHelpButton; + /** + * Gets the Animation widget. + */ + readonly animation: Animation; + /** + * Gets the Timeline widget. + */ + readonly timeline: Timeline; + /** + * Gets the FullscreenButton. + */ + readonly fullscreenButton: FullscreenButton; + /** + * Gets the VRButton. + */ + readonly vrButton: VRButton; + /** + * Gets the display used for {@link DataSource} visualization. + */ + readonly dataSourceDisplay: DataSourceDisplay; + /** + * Gets the collection of entities not tied to a particular data source. + * This is a shortcut to [dataSourceDisplay.defaultDataSource.entities]{@link Viewer#dataSourceDisplay}. + */ + readonly entities: EntityCollection; + /** + * Gets the set of {@link DataSource} instances to be visualized. + */ + readonly dataSources: DataSourceCollection; + /** + * Gets the canvas. + */ + readonly canvas: HTMLCanvasElement; + /** + * Gets the scene. + */ + readonly scene: Scene; + /** + * Determines if shadows are cast by light sources. + */ + shadows: boolean; + /** + * Determines if the terrain casts or shadows from light sources. + */ + terrainShadows: ShadowMode; + /** + * Get the scene's shadow map + */ + readonly shadowMap: ShadowMap; + /** + * Gets the collection of image layers that will be rendered on the globe. + */ + readonly imageryLayers: ImageryLayerCollection; + /** + * The terrain provider providing surface geometry for the globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets the camera. + */ + readonly camera: Camera; + /** + * Gets the post-process stages. + */ + readonly postProcessStages: PostProcessStageCollection; + /** + * Gets the clock. + */ + readonly clock: Clock; + /** + * Gets the clock view model. + */ + readonly clockViewModel: ClockViewModel; + /** + * Gets the screen space event handler. + */ + readonly screenSpaceEventHandler: ScreenSpaceEventHandler; + /** + * Gets or sets the target frame rate of the widget when useDefaultRenderLoop + * is true. If undefined, the browser's {@link requestAnimationFrame} implementation + * determines the frame rate. If defined, this value must be greater than 0. A value higher + * than the underlying requestAnimationFrame implementation will have no effect. + */ + targetFrameRate: number; + /** + * Gets or sets whether or not this widget should control the render loop. + * If set to true the widget will use {@link requestAnimationFrame} to + * perform rendering and resizing of the widget, as well as drive the + * simulation clock. If set to false, you must manually call the + * resize, render methods + * as part of a custom render loop. If an error occurs during rendering, {@link Scene}'s + * renderError event will be raised and this property + * will be set to false. It must be set back to true to continue rendering + * after the error. + */ + useDefaultRenderLoop: boolean; + /** + * Gets or sets a scaling factor for rendering resolution. Values less than 1.0 can improve + * performance on less powerful devices while values greater than 1.0 will render at a higher + * resolution and then scale down, resulting in improved visual fidelity. + * For example, if the widget is laid out at a size of 640x480, setting this value to 0.5 + * will cause the scene to be rendered at 320x240 and then scaled up while setting + * it to 2.0 will cause the scene to be rendered at 1280x960 and then scaled down. + */ + resolutionScale: number; + /** + * Boolean flag indicating if the browser's recommended resolution is used. + * If true, the browser's device pixel ratio is ignored and 1.0 is used instead, + * effectively rendering based on CSS pixels instead of device pixels. This can improve + * performance on less powerful devices that have high pixel density. When false, rendering + * will be in device pixels. {@link Viewer#resolutionScale} will still take effect whether + * this flag is true or false. + */ + useBrowserRecommendedResolution: boolean; + /** + * Gets or sets whether or not data sources can temporarily pause + * animation in order to avoid showing an incomplete picture to the user. + * For example, if asynchronous primitives are being processed in the + * background, the clock will not advance until the geometry is ready. + */ + allowDataSourcesToSuspendAnimation: boolean; + /** + * Gets or sets the Entity instance currently being tracked by the camera. + */ + trackedEntity: Entity | undefined; + /** + * Gets or sets the object instance for which to display a selection indicator. + */ + selectedEntity: Entity | undefined; + /** + * Gets the event that is raised when the selected entity changes. + */ + readonly selectedEntityChanged: Event; + /** + * Gets the event that is raised when the tracked entity changes. + */ + readonly trackedEntityChanged: Event; + /** + * Gets or sets the data source to track with the viewer's clock. + */ + clockTrackedDataSource: DataSource; + /** + * Extends the base viewer functionality with the provided mixin. + * A mixin may add additional properties, functions, or other behavior + * to the provided viewer instance. + * @param mixin - The Viewer mixin to add to this instance. + * @param [options] - The options object to be passed to the mixin function. + */ + extend(mixin: Viewer.ViewerMixin, options?: any): void; + /** + * Resizes the widget to match the container size. + * This function is called automatically as needed unless + * useDefaultRenderLoop is set to false. + */ + resize(): void; + /** + * This forces the widget to re-think its layout, including + * widget sizes and credit placement. + */ + forceResize(): void; + /** + * Renders the scene. This function is called automatically + * unless useDefaultRenderLoop is set to false; + */ + render(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Asynchronously sets the camera to view the provided entity, entities, or data source. + * If the data source is still in the process of loading or the visualization is otherwise still loading, + * this method waits for the data to be ready before performing the zoom. + * + *

    The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

    + * + *

    In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

    + * @param target - The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types. + * @param [offset] - The offset from the center of the entity in the local east-north-up reference frame. + * @returns A Promise that resolves to true if the zoom was successful or false if the target is not currently visualized in the scene or the zoom was cancelled. + */ + zoomTo(target: Entity | Entity[] | EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud | Promise, offset?: HeadingPitchRange): Promise; + /** + * Flies the camera to the provided entity, entities, or data source. + * If the data source is still in the process of loading or the visualization is otherwise still loading, + * this method waits for the data to be ready before performing the flight. + * + *

    The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

    + * + *

    In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

    + * @param target - The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types. + * @param [options] - Object with the following properties: + * @param [options.duration = 3.0] - The duration of the flight in seconds. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.offset] - The offset from the target in the local east-north-up reference frame centered at the target. + * @returns A Promise that resolves to true if the flight was successful or false if the target is not currently visualized in the scene or the flight was cancelled. //TODO: Cleanup entity mentions + */ + flyTo(target: Entity | Entity[] | EntityCollection | DataSource | ImageryLayer | Cesium3DTileset | TimeDynamicPointCloud | Promise, options?: { + duration?: number; + maximumHeight?: number; + offset?: HeadingPitchRange; + }): Promise; +} + +/** + * A mixin which adds the {@link Cesium3DTilesInspector} widget to the {@link Viewer} widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerCesium3DTilesInspectorMixin); + * @param viewer - The viewer instance. + */ +export function viewerCesium3DTilesInspectorMixin(viewer: Viewer): void; + +/** + * A mixin which adds the CesiumInspector widget to the Viewer widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerCesiumInspectorMixin); + * @param viewer - The viewer instance. + */ +export function viewerCesiumInspectorMixin(viewer: Viewer): void; + +/** + * A mixin which adds default drag and drop support for CZML files to the Viewer widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * // Add basic drag and drop support and pop up an alert window on error. + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerDragDropMixin); + * viewer.dropError.addEventListener(function(viewerArg, source, error) { + * window.alert('Error processing ' + source + ':' + error); + * }); + * @param viewer - The viewer instance. + * @param [options] - Object with the following properties: + * @param [options.dropTarget = viewer.container] - The DOM element which will serve as the drop target. + * @param [options.clearOnDrop = true] - When true, dropping files will clear all existing data sources first, when false, new data sources will be loaded after the existing ones. + * @param [options.flyToOnDrop = true] - When true, dropping files will fly to the data source once it is loaded. + * @param [options.clampToGround = true] - When true, datasources are clamped to the ground. + * @param [options.proxy] - The proxy to be used for KML network links. + */ +export function viewerDragDropMixin(viewer: Viewer, options?: { + dropTarget?: Element | string; + clearOnDrop?: boolean; + flyToOnDrop?: boolean; + clampToGround?: boolean; + proxy?: Proxy; +}): void; + +/** + * A mixin which adds the {@link PerformanceWatchdog} widget to the {@link Viewer} widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerPerformanceWatchdogMixin, { + * lowFrameRateMessage : 'Why is this going so slowly?' + * }); + * @param viewer - The viewer instance. + * @param [options] - An object with properties. + * @param [options.lowFrameRateMessage = 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] - The + * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure + * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. + */ +export function viewerPerformanceWatchdogMixin(viewer: Viewer, options?: { + lowFrameRateMessage?: string; +}): void; + +/** + * Create a Command from a given function, for use with ViewModels. + * + * A Command is a function with an extra canExecute observable property to determine + * whether the command can be executed. When executed, a Command function will check the + * value of canExecute and throw if false. It also provides events for when + * a command has been or is about to be executed. + * @param func - The function to execute. + * @param [canExecute = true] - A boolean indicating whether the function can currently be executed. + */ +export function createCommand(func: (...params: any[]) => any, canExecute?: boolean): void; + + + + +} + +declare module "cesium/Source/Core/ArcGISTiledElevationTerrainProvider" { import { ArcGISTiledElevationTerrainProvider } from 'cesium'; export default ArcGISTiledElevationTerrainProvider; } +declare module "cesium/Source/Core/ArcType" { import { ArcType } from 'cesium'; export default ArcType; } +declare module "cesium/Source/Core/AssociativeArray" { import { AssociativeArray } from 'cesium'; export default AssociativeArray; } +declare module "cesium/Source/Core/AxisAlignedBoundingBox" { import { AxisAlignedBoundingBox } from 'cesium'; export default AxisAlignedBoundingBox; } +declare module "cesium/Source/Core/BingMapsApi" { import { BingMapsApi } from 'cesium'; export default BingMapsApi; } +declare module "cesium/Source/Core/BingMapsGeocoderService" { import { BingMapsGeocoderService } from 'cesium'; export default BingMapsGeocoderService; } +declare module "cesium/Source/Core/BoundingRectangle" { import { BoundingRectangle } from 'cesium'; export default BoundingRectangle; } +declare module "cesium/Source/Core/BoundingSphere" { import { BoundingSphere } from 'cesium'; export default BoundingSphere; } +declare module "cesium/Source/Core/BoxGeometry" { import { BoxGeometry } from 'cesium'; export default BoxGeometry; } +declare module "cesium/Source/Core/BoxOutlineGeometry" { import { BoxOutlineGeometry } from 'cesium'; export default BoxOutlineGeometry; } +declare module "cesium/Source/Core/Cartesian2" { import { Cartesian2 } from 'cesium'; export default Cartesian2; } +declare module "cesium/Source/Core/Cartesian3" { import { Cartesian3 } from 'cesium'; export default Cartesian3; } +declare module "cesium/Source/Core/Cartesian4" { import { Cartesian4 } from 'cesium'; export default Cartesian4; } +declare module "cesium/Source/Core/Cartographic" { import { Cartographic } from 'cesium'; export default Cartographic; } +declare module "cesium/Source/Core/CartographicGeocoderService" { import { CartographicGeocoderService } from 'cesium'; export default CartographicGeocoderService; } +declare module "cesium/Source/Core/CatmullRomSpline" { import { CatmullRomSpline } from 'cesium'; export default CatmullRomSpline; } +declare module "cesium/Source/Core/CesiumTerrainProvider" { import { CesiumTerrainProvider } from 'cesium'; export default CesiumTerrainProvider; } +declare module "cesium/Source/Core/CircleGeometry" { import { CircleGeometry } from 'cesium'; export default CircleGeometry; } +declare module "cesium/Source/Core/CircleOutlineGeometry" { import { CircleOutlineGeometry } from 'cesium'; export default CircleOutlineGeometry; } +declare module "cesium/Source/Core/Clock" { import { Clock } from 'cesium'; export default Clock; } +declare module "cesium/Source/Core/ClockRange" { import { ClockRange } from 'cesium'; export default ClockRange; } +declare module "cesium/Source/Core/ClockStep" { import { ClockStep } from 'cesium'; export default ClockStep; } +declare module "cesium/Source/Core/Color" { import { Color } from 'cesium'; export default Color; } +declare module "cesium/Source/Core/ColorGeometryInstanceAttribute" { import { ColorGeometryInstanceAttribute } from 'cesium'; export default ColorGeometryInstanceAttribute; } +declare module "cesium/Source/Core/ComponentDatatype" { import { ComponentDatatype } from 'cesium'; export default ComponentDatatype; } +declare module "cesium/Source/Core/CompressedTextureBuffer" { import { CompressedTextureBuffer } from 'cesium'; export default CompressedTextureBuffer; } +declare module "cesium/Source/Core/CoplanarPolygonGeometry" { import { CoplanarPolygonGeometry } from 'cesium'; export default CoplanarPolygonGeometry; } +declare module "cesium/Source/Core/CoplanarPolygonOutlineGeometry" { import { CoplanarPolygonOutlineGeometry } from 'cesium'; export default CoplanarPolygonOutlineGeometry; } +declare module "cesium/Source/Core/CornerType" { import { CornerType } from 'cesium'; export default CornerType; } +declare module "cesium/Source/Core/CorridorGeometry" { import { CorridorGeometry } from 'cesium'; export default CorridorGeometry; } +declare module "cesium/Source/Core/CorridorOutlineGeometry" { import { CorridorOutlineGeometry } from 'cesium'; export default CorridorOutlineGeometry; } +declare module "cesium/Source/Core/Credit" { import { Credit } from 'cesium'; export default Credit; } +declare module "cesium/Source/Core/CubicRealPolynomial" { import { CubicRealPolynomial } from 'cesium'; export default CubicRealPolynomial; } +declare module "cesium/Source/Core/CullingVolume" { import { CullingVolume } from 'cesium'; export default CullingVolume; } +declare module "cesium/Source/Core/CylinderGeometry" { import { CylinderGeometry } from 'cesium'; export default CylinderGeometry; } +declare module "cesium/Source/Core/CylinderOutlineGeometry" { import { CylinderOutlineGeometry } from 'cesium'; export default CylinderOutlineGeometry; } +declare module "cesium/Source/Core/DefaultProxy" { import { DefaultProxy } from 'cesium'; export default DefaultProxy; } +declare module "cesium/Source/Core/DeveloperError" { import { DeveloperError } from 'cesium'; export default DeveloperError; } +declare module "cesium/Source/Core/DistanceDisplayCondition" { import { DistanceDisplayCondition } from 'cesium'; export default DistanceDisplayCondition; } +declare module "cesium/Source/Core/DistanceDisplayConditionGeometryInstanceAttribute" { import { DistanceDisplayConditionGeometryInstanceAttribute } from 'cesium'; export default DistanceDisplayConditionGeometryInstanceAttribute; } +declare module "cesium/Source/Core/EasingFunction" { import { EasingFunction } from 'cesium'; export default EasingFunction; } +declare module "cesium/Source/Core/EllipseGeometry" { import { EllipseGeometry } from 'cesium'; export default EllipseGeometry; } +declare module "cesium/Source/Core/EllipseOutlineGeometry" { import { EllipseOutlineGeometry } from 'cesium'; export default EllipseOutlineGeometry; } +declare module "cesium/Source/Core/Ellipsoid" { import { Ellipsoid } from 'cesium'; export default Ellipsoid; } +declare module "cesium/Source/Core/EllipsoidGeodesic" { import { EllipsoidGeodesic } from 'cesium'; export default EllipsoidGeodesic; } +declare module "cesium/Source/Core/EllipsoidGeometry" { import { EllipsoidGeometry } from 'cesium'; export default EllipsoidGeometry; } +declare module "cesium/Source/Core/EllipsoidOutlineGeometry" { import { EllipsoidOutlineGeometry } from 'cesium'; export default EllipsoidOutlineGeometry; } +declare module "cesium/Source/Core/EllipsoidRhumbLine" { import { EllipsoidRhumbLine } from 'cesium'; export default EllipsoidRhumbLine; } +declare module "cesium/Source/Core/EllipsoidTangentPlane" { import { EllipsoidTangentPlane } from 'cesium'; export default EllipsoidTangentPlane; } +declare module "cesium/Source/Core/EllipsoidTerrainProvider" { import { EllipsoidTerrainProvider } from 'cesium'; export default EllipsoidTerrainProvider; } +declare module "cesium/Source/Core/Event" { import { Event } from 'cesium'; export default Event; } +declare module "cesium/Source/Core/EventHelper" { import { EventHelper } from 'cesium'; export default EventHelper; } +declare module "cesium/Source/Core/ExtrapolationType" { import { ExtrapolationType } from 'cesium'; export default ExtrapolationType; } +declare module "cesium/Source/Core/FeatureDetection" { import { FeatureDetection } from 'cesium'; export default FeatureDetection; } +declare module "cesium/Source/Core/FrustumGeometry" { import { FrustumGeometry } from 'cesium'; export default FrustumGeometry; } +declare module "cesium/Source/Core/FrustumOutlineGeometry" { import { FrustumOutlineGeometry } from 'cesium'; export default FrustumOutlineGeometry; } +declare module "cesium/Source/Core/Fullscreen" { import { Fullscreen } from 'cesium'; export default Fullscreen; } +declare module "cesium/Source/Core/GeocodeType" { import { GeocodeType } from 'cesium'; export default GeocodeType; } +declare module "cesium/Source/Core/GeocoderService" { import { GeocoderService } from 'cesium'; export default GeocoderService; } +declare module "cesium/Source/Core/GeographicProjection" { import { GeographicProjection } from 'cesium'; export default GeographicProjection; } +declare module "cesium/Source/Core/GeographicTilingScheme" { import { GeographicTilingScheme } from 'cesium'; export default GeographicTilingScheme; } +declare module "cesium/Source/Core/Geometry" { import { Geometry } from 'cesium'; export default Geometry; } +declare module "cesium/Source/Core/GeometryAttribute" { import { GeometryAttribute } from 'cesium'; export default GeometryAttribute; } +declare module "cesium/Source/Core/GeometryAttributes" { import { GeometryAttributes } from 'cesium'; export default GeometryAttributes; } +declare module "cesium/Source/Core/GeometryFactory" { import { GeometryFactory } from 'cesium'; export default GeometryFactory; } +declare module "cesium/Source/Core/GeometryInstance" { import { GeometryInstance } from 'cesium'; export default GeometryInstance; } +declare module "cesium/Source/Core/GeometryInstanceAttribute" { import { GeometryInstanceAttribute } from 'cesium'; export default GeometryInstanceAttribute; } +declare module "cesium/Source/Core/GeometryPipeline" { import { GeometryPipeline } from 'cesium'; export default GeometryPipeline; } +declare module "cesium/Source/Core/GoogleEarthEnterpriseMetadata" { import { GoogleEarthEnterpriseMetadata } from 'cesium'; export default GoogleEarthEnterpriseMetadata; } +declare module "cesium/Source/Core/GoogleEarthEnterpriseTerrainData" { import { GoogleEarthEnterpriseTerrainData } from 'cesium'; export default GoogleEarthEnterpriseTerrainData; } +declare module "cesium/Source/Core/GoogleEarthEnterpriseTerrainProvider" { import { GoogleEarthEnterpriseTerrainProvider } from 'cesium'; export default GoogleEarthEnterpriseTerrainProvider; } +declare module "cesium/Source/Core/GregorianDate" { import { GregorianDate } from 'cesium'; export default GregorianDate; } +declare module "cesium/Source/Core/GroundPolylineGeometry" { import { GroundPolylineGeometry } from 'cesium'; export default GroundPolylineGeometry; } +declare module "cesium/Source/Core/HeadingPitchRange" { import { HeadingPitchRange } from 'cesium'; export default HeadingPitchRange; } +declare module "cesium/Source/Core/HeadingPitchRoll" { import { HeadingPitchRoll } from 'cesium'; export default HeadingPitchRoll; } +declare module "cesium/Source/Core/HeightmapEncoding" { import { HeightmapEncoding } from 'cesium'; export default HeightmapEncoding; } +declare module "cesium/Source/Core/HeightmapTerrainData" { import { HeightmapTerrainData } from 'cesium'; export default HeightmapTerrainData; } +declare module "cesium/Source/Core/HermitePolynomialApproximation" { import { HermitePolynomialApproximation } from 'cesium'; export default HermitePolynomialApproximation; } +declare module "cesium/Source/Core/HermiteSpline" { import { HermiteSpline } from 'cesium'; export default HermiteSpline; } +declare module "cesium/Source/Core/IndexDatatype" { import { IndexDatatype } from 'cesium'; export default IndexDatatype; } +declare module "cesium/Source/Core/InterpolationAlgorithm" { import { InterpolationAlgorithm } from 'cesium'; export default InterpolationAlgorithm; } +declare module "cesium/Source/Core/Intersect" { import { Intersect } from 'cesium'; export default Intersect; } +declare module "cesium/Source/Core/IntersectionTests" { import { IntersectionTests } from 'cesium'; export default IntersectionTests; } +declare module "cesium/Source/Core/Intersections2D" { import { Intersections2D } from 'cesium'; export default Intersections2D; } +declare module "cesium/Source/Core/Interval" { import { Interval } from 'cesium'; export default Interval; } +declare module "cesium/Source/Core/Ion" { import { Ion } from 'cesium'; export default Ion; } +declare module "cesium/Source/Core/IonGeocoderService" { import { IonGeocoderService } from 'cesium'; export default IonGeocoderService; } +declare module "cesium/Source/Core/IonResource" { import { IonResource } from 'cesium'; export default IonResource; } +declare module "cesium/Source/Core/Iso8601" { import { Iso8601 } from 'cesium'; export default Iso8601; } +declare module "cesium/Source/Core/JulianDate" { import { JulianDate } from 'cesium'; export default JulianDate; } +declare module "cesium/Source/Core/KeyboardEventModifier" { import { KeyboardEventModifier } from 'cesium'; export default KeyboardEventModifier; } +declare module "cesium/Source/Core/LagrangePolynomialApproximation" { import { LagrangePolynomialApproximation } from 'cesium'; export default LagrangePolynomialApproximation; } +declare module "cesium/Source/Core/LeapSecond" { import { LeapSecond } from 'cesium'; export default LeapSecond; } +declare module "cesium/Source/Core/LinearApproximation" { import { LinearApproximation } from 'cesium'; export default LinearApproximation; } +declare module "cesium/Source/Core/LinearSpline" { import { LinearSpline } from 'cesium'; export default LinearSpline; } +declare module "cesium/Source/Core/MapProjection" { import { MapProjection } from 'cesium'; export default MapProjection; } +declare module "cesium/Source/Core/MapboxApi" { import { MapboxApi } from 'cesium'; export default MapboxApi; } +declare module "cesium/Source/Core/Math" { import { Math } from 'cesium'; export default Math; } +declare module "cesium/Source/Core/Matrix2" { import { Matrix2 } from 'cesium'; export default Matrix2; } +declare module "cesium/Source/Core/Matrix3" { import { Matrix3 } from 'cesium'; export default Matrix3; } +declare module "cesium/Source/Core/Matrix4" { import { Matrix4 } from 'cesium'; export default Matrix4; } +declare module "cesium/Source/Core/NearFarScalar" { import { NearFarScalar } from 'cesium'; export default NearFarScalar; } +declare module "cesium/Source/Core/Occluder" { import { Occluder } from 'cesium'; export default Occluder; } +declare module "cesium/Source/Core/OpenCageGeocoderService" { import { OpenCageGeocoderService } from 'cesium'; export default OpenCageGeocoderService; } +declare module "cesium/Source/Core/OrientedBoundingBox" { import { OrientedBoundingBox } from 'cesium'; export default OrientedBoundingBox; } +declare module "cesium/Source/Core/OrthographicFrustum" { import { OrthographicFrustum } from 'cesium'; export default OrthographicFrustum; } +declare module "cesium/Source/Core/OrthographicOffCenterFrustum" { import { OrthographicOffCenterFrustum } from 'cesium'; export default OrthographicOffCenterFrustum; } +declare module "cesium/Source/Core/Packable" { import { Packable } from 'cesium'; export default Packable; } +declare module "cesium/Source/Core/PackableForInterpolation" { import { PackableForInterpolation } from 'cesium'; export default PackableForInterpolation; } +declare module "cesium/Source/Core/PeliasGeocoderService" { import { PeliasGeocoderService } from 'cesium'; export default PeliasGeocoderService; } +declare module "cesium/Source/Core/PerspectiveFrustum" { import { PerspectiveFrustum } from 'cesium'; export default PerspectiveFrustum; } +declare module "cesium/Source/Core/PerspectiveOffCenterFrustum" { import { PerspectiveOffCenterFrustum } from 'cesium'; export default PerspectiveOffCenterFrustum; } +declare module "cesium/Source/Core/PinBuilder" { import { PinBuilder } from 'cesium'; export default PinBuilder; } +declare module "cesium/Source/Core/PixelFormat" { import { PixelFormat } from 'cesium'; export default PixelFormat; } +declare module "cesium/Source/Core/Plane" { import { Plane } from 'cesium'; export default Plane; } +declare module "cesium/Source/Core/PlaneGeometry" { import { PlaneGeometry } from 'cesium'; export default PlaneGeometry; } +declare module "cesium/Source/Core/PlaneOutlineGeometry" { import { PlaneOutlineGeometry } from 'cesium'; export default PlaneOutlineGeometry; } +declare module "cesium/Source/Core/PolygonGeometry" { import { PolygonGeometry } from 'cesium'; export default PolygonGeometry; } +declare module "cesium/Source/Core/PolygonHierarchy" { import { PolygonHierarchy } from 'cesium'; export default PolygonHierarchy; } +declare module "cesium/Source/Core/PolygonOutlineGeometry" { import { PolygonOutlineGeometry } from 'cesium'; export default PolygonOutlineGeometry; } +declare module "cesium/Source/Core/PolylineGeometry" { import { PolylineGeometry } from 'cesium'; export default PolylineGeometry; } +declare module "cesium/Source/Core/PolylineVolumeGeometry" { import { PolylineVolumeGeometry } from 'cesium'; export default PolylineVolumeGeometry; } +declare module "cesium/Source/Core/PolylineVolumeOutlineGeometry" { import { PolylineVolumeOutlineGeometry } from 'cesium'; export default PolylineVolumeOutlineGeometry; } +declare module "cesium/Source/Core/PrimitiveType" { import { PrimitiveType } from 'cesium'; export default PrimitiveType; } +declare module "cesium/Source/Core/Proxy" { import { Proxy } from 'cesium'; export default Proxy; } +declare module "cesium/Source/Core/QuadraticRealPolynomial" { import { QuadraticRealPolynomial } from 'cesium'; export default QuadraticRealPolynomial; } +declare module "cesium/Source/Core/QuantizedMeshTerrainData" { import { QuantizedMeshTerrainData } from 'cesium'; export default QuantizedMeshTerrainData; } +declare module "cesium/Source/Core/QuarticRealPolynomial" { import { QuarticRealPolynomial } from 'cesium'; export default QuarticRealPolynomial; } +declare module "cesium/Source/Core/Quaternion" { import { Quaternion } from 'cesium'; export default Quaternion; } +declare module "cesium/Source/Core/QuaternionSpline" { import { QuaternionSpline } from 'cesium'; export default QuaternionSpline; } +declare module "cesium/Source/Core/Queue" { import { Queue } from 'cesium'; export default Queue; } +declare module "cesium/Source/Core/Ray" { import { Ray } from 'cesium'; export default Ray; } +declare module "cesium/Source/Core/Rectangle" { import { Rectangle } from 'cesium'; export default Rectangle; } +declare module "cesium/Source/Core/RectangleGeometry" { import { RectangleGeometry } from 'cesium'; export default RectangleGeometry; } +declare module "cesium/Source/Core/RectangleOutlineGeometry" { import { RectangleOutlineGeometry } from 'cesium'; export default RectangleOutlineGeometry; } +declare module "cesium/Source/Core/ReferenceFrame" { import { ReferenceFrame } from 'cesium'; export default ReferenceFrame; } +declare module "cesium/Source/Core/Request" { import { Request } from 'cesium'; export default Request; } +declare module "cesium/Source/Core/RequestErrorEvent" { import { RequestErrorEvent } from 'cesium'; export default RequestErrorEvent; } +declare module "cesium/Source/Core/RequestScheduler" { import { RequestScheduler } from 'cesium'; export default RequestScheduler; } +declare module "cesium/Source/Core/RequestState" { import { RequestState } from 'cesium'; export default RequestState; } +declare module "cesium/Source/Core/RequestType" { import { RequestType } from 'cesium'; export default RequestType; } +declare module "cesium/Source/Core/Resource" { import { Resource } from 'cesium'; export default Resource; } +declare module "cesium/Source/Core/RuntimeError" { import { RuntimeError } from 'cesium'; export default RuntimeError; } +declare module "cesium/Source/Core/ScreenSpaceEventHandler" { import { ScreenSpaceEventHandler } from 'cesium'; export default ScreenSpaceEventHandler; } +declare module "cesium/Source/Core/ScreenSpaceEventType" { import { ScreenSpaceEventType } from 'cesium'; export default ScreenSpaceEventType; } +declare module "cesium/Source/Core/ShowGeometryInstanceAttribute" { import { ShowGeometryInstanceAttribute } from 'cesium'; export default ShowGeometryInstanceAttribute; } +declare module "cesium/Source/Core/Simon1994PlanetaryPositions" { import { Simon1994PlanetaryPositions } from 'cesium'; export default Simon1994PlanetaryPositions; } +declare module "cesium/Source/Core/SimplePolylineGeometry" { import { SimplePolylineGeometry } from 'cesium'; export default SimplePolylineGeometry; } +declare module "cesium/Source/Core/SphereGeometry" { import { SphereGeometry } from 'cesium'; export default SphereGeometry; } +declare module "cesium/Source/Core/SphereOutlineGeometry" { import { SphereOutlineGeometry } from 'cesium'; export default SphereOutlineGeometry; } +declare module "cesium/Source/Core/Spherical" { import { Spherical } from 'cesium'; export default Spherical; } +declare module "cesium/Source/Core/Spline" { import { Spline } from 'cesium'; export default Spline; } +declare module "cesium/Source/Core/TaskProcessor" { import { TaskProcessor } from 'cesium'; export default TaskProcessor; } +declare module "cesium/Source/Core/TerrainData" { import { TerrainData } from 'cesium'; export default TerrainData; } +declare module "cesium/Source/Core/TerrainProvider" { import { TerrainProvider } from 'cesium'; export default TerrainProvider; } +declare module "cesium/Source/Core/TileAvailability" { import { TileAvailability } from 'cesium'; export default TileAvailability; } +declare module "cesium/Source/Core/TileProviderError" { import { TileProviderError } from 'cesium'; export default TileProviderError; } +declare module "cesium/Source/Core/TilingScheme" { import { TilingScheme } from 'cesium'; export default TilingScheme; } +declare module "cesium/Source/Core/TimeInterval" { import { TimeInterval } from 'cesium'; export default TimeInterval; } +declare module "cesium/Source/Core/TimeIntervalCollection" { import { TimeIntervalCollection } from 'cesium'; export default TimeIntervalCollection; } +declare module "cesium/Source/Core/TimeStandard" { import { TimeStandard } from 'cesium'; export default TimeStandard; } +declare module "cesium/Source/Core/Transforms" { import { Transforms } from 'cesium'; export default Transforms; } +declare module "cesium/Source/Core/TranslationRotationScale" { import { TranslationRotationScale } from 'cesium'; export default TranslationRotationScale; } +declare module "cesium/Source/Core/TridiagonalSystemSolver" { import { TridiagonalSystemSolver } from 'cesium'; export default TridiagonalSystemSolver; } +declare module "cesium/Source/Core/TrustedServers" { import { TrustedServers } from 'cesium'; export default TrustedServers; } +declare module "cesium/Source/Core/VRTheWorldTerrainProvider" { import { VRTheWorldTerrainProvider } from 'cesium'; export default VRTheWorldTerrainProvider; } +declare module "cesium/Source/Core/VertexFormat" { import { VertexFormat } from 'cesium'; export default VertexFormat; } +declare module "cesium/Source/Core/VideoSynchronizer" { import { VideoSynchronizer } from 'cesium'; export default VideoSynchronizer; } +declare module "cesium/Source/Core/Visibility" { import { Visibility } from 'cesium'; export default Visibility; } +declare module "cesium/Source/Core/WallGeometry" { import { WallGeometry } from 'cesium'; export default WallGeometry; } +declare module "cesium/Source/Core/WallOutlineGeometry" { import { WallOutlineGeometry } from 'cesium'; export default WallOutlineGeometry; } +declare module "cesium/Source/Core/WebGLConstants" { import { WebGLConstants } from 'cesium'; export default WebGLConstants; } +declare module "cesium/Source/Core/WebMercatorProjection" { import { WebMercatorProjection } from 'cesium'; export default WebMercatorProjection; } +declare module "cesium/Source/Core/WebMercatorTilingScheme" { import { WebMercatorTilingScheme } from 'cesium'; export default WebMercatorTilingScheme; } +declare module "cesium/Source/Core/WeightSpline" { import { WeightSpline } from 'cesium'; export default WeightSpline; } +declare module "cesium/Source/Core/WindingOrder" { import { WindingOrder } from 'cesium'; export default WindingOrder; } +declare module "cesium/Source/Core/barycentricCoordinates" { import { barycentricCoordinates } from 'cesium'; export default barycentricCoordinates; } +declare module "cesium/Source/Core/binarySearch" { import { binarySearch } from 'cesium'; export default binarySearch; } +declare module "cesium/Source/Core/buildModuleUrl" { import { buildModuleUrl } from 'cesium'; export default buildModuleUrl; } +declare module "cesium/Source/Core/cancelAnimationFrame" { import { cancelAnimationFrame } from 'cesium'; export default cancelAnimationFrame; } +declare module "cesium/Source/Core/clone" { import { clone } from 'cesium'; export default clone; } +declare module "cesium/Source/Core/combine" { import { combine } from 'cesium'; export default combine; } +declare module "cesium/Source/Core/createGuid" { import { createGuid } from 'cesium'; export default createGuid; } +declare module "cesium/Source/Core/createWorldTerrain" { import { createWorldTerrain } from 'cesium'; export default createWorldTerrain; } +declare module "cesium/Source/Core/defaultValue" { import { defaultValue } from 'cesium'; export default defaultValue; } +declare module "cesium/Source/Core/defined" { import { defined } from 'cesium'; export default defined; } +declare module "cesium/Source/Core/destroyObject" { import { destroyObject } from 'cesium'; export default destroyObject; } +declare module "cesium/Source/Core/formatError" { import { formatError } from 'cesium'; export default formatError; } +declare module "cesium/Source/Core/getAbsoluteUri" { import { getAbsoluteUri } from 'cesium'; export default getAbsoluteUri; } +declare module "cesium/Source/Core/getBaseUri" { import { getBaseUri } from 'cesium'; export default getBaseUri; } +declare module "cesium/Source/Core/getExtensionFromUri" { import { getExtensionFromUri } from 'cesium'; export default getExtensionFromUri; } +declare module "cesium/Source/Core/getFilenameFromUri" { import { getFilenameFromUri } from 'cesium'; export default getFilenameFromUri; } +declare module "cesium/Source/Core/getImagePixels" { import { getImagePixels } from 'cesium'; export default getImagePixels; } +declare module "cesium/Source/Core/getTimestamp" { import { getTimestamp } from 'cesium'; export default getTimestamp; } +declare module "cesium/Source/Core/isLeapYear" { import { isLeapYear } from 'cesium'; export default isLeapYear; } +declare module "cesium/Source/Core/loadCRN" { import { loadCRN } from 'cesium'; export default loadCRN; } +declare module "cesium/Source/Core/loadKTX" { import { loadKTX } from 'cesium'; export default loadKTX; } +declare module "cesium/Source/Core/mergeSort" { import { mergeSort } from 'cesium'; export default mergeSort; } +declare module "cesium/Source/Core/objectToQuery" { import { objectToQuery } from 'cesium'; export default objectToQuery; } +declare module "cesium/Source/Core/pointInsideTriangle" { import { pointInsideTriangle } from 'cesium'; export default pointInsideTriangle; } +declare module "cesium/Source/Core/queryToObject" { import { queryToObject } from 'cesium'; export default queryToObject; } +declare module "cesium/Source/Core/requestAnimationFrame" { import { requestAnimationFrame } from 'cesium'; export default requestAnimationFrame; } +declare module "cesium/Source/Core/sampleTerrain" { import { sampleTerrain } from 'cesium'; export default sampleTerrain; } +declare module "cesium/Source/Core/sampleTerrainMostDetailed" { import { sampleTerrainMostDetailed } from 'cesium'; export default sampleTerrainMostDetailed; } +declare module "cesium/Source/Core/subdivideArray" { import { subdivideArray } from 'cesium'; export default subdivideArray; } +declare module "cesium/Source/Core/writeTextToCanvas" { import { writeTextToCanvas } from 'cesium'; export default writeTextToCanvas; } +declare module "cesium/Source/DataSources/BillboardGraphics" { import { BillboardGraphics } from 'cesium'; export default BillboardGraphics; } +declare module "cesium/Source/DataSources/BillboardVisualizer" { import { BillboardVisualizer } from 'cesium'; export default BillboardVisualizer; } +declare module "cesium/Source/DataSources/BoxGeometryUpdater" { import { BoxGeometryUpdater } from 'cesium'; export default BoxGeometryUpdater; } +declare module "cesium/Source/DataSources/BoxGraphics" { import { BoxGraphics } from 'cesium'; export default BoxGraphics; } +declare module "cesium/Source/DataSources/CallbackProperty" { import { CallbackProperty } from 'cesium'; export default CallbackProperty; } +declare module "cesium/Source/DataSources/Cesium3DTilesetGraphics" { import { Cesium3DTilesetGraphics } from 'cesium'; export default Cesium3DTilesetGraphics; } +declare module "cesium/Source/DataSources/Cesium3DTilesetVisualizer" { import { Cesium3DTilesetVisualizer } from 'cesium'; export default Cesium3DTilesetVisualizer; } +declare module "cesium/Source/DataSources/CheckerboardMaterialProperty" { import { CheckerboardMaterialProperty } from 'cesium'; export default CheckerboardMaterialProperty; } +declare module "cesium/Source/DataSources/ColorMaterialProperty" { import { ColorMaterialProperty } from 'cesium'; export default ColorMaterialProperty; } +declare module "cesium/Source/DataSources/CompositeEntityCollection" { import { CompositeEntityCollection } from 'cesium'; export default CompositeEntityCollection; } +declare module "cesium/Source/DataSources/CompositeMaterialProperty" { import { CompositeMaterialProperty } from 'cesium'; export default CompositeMaterialProperty; } +declare module "cesium/Source/DataSources/CompositePositionProperty" { import { CompositePositionProperty } from 'cesium'; export default CompositePositionProperty; } +declare module "cesium/Source/DataSources/CompositeProperty" { import { CompositeProperty } from 'cesium'; export default CompositeProperty; } +declare module "cesium/Source/DataSources/ConstantPositionProperty" { import { ConstantPositionProperty } from 'cesium'; export default ConstantPositionProperty; } +declare module "cesium/Source/DataSources/ConstantProperty" { import { ConstantProperty } from 'cesium'; export default ConstantProperty; } +declare module "cesium/Source/DataSources/CorridorGeometryUpdater" { import { CorridorGeometryUpdater } from 'cesium'; export default CorridorGeometryUpdater; } +declare module "cesium/Source/DataSources/CorridorGraphics" { import { CorridorGraphics } from 'cesium'; export default CorridorGraphics; } +declare module "cesium/Source/DataSources/CustomDataSource" { import { CustomDataSource } from 'cesium'; export default CustomDataSource; } +declare module "cesium/Source/DataSources/CylinderGeometryUpdater" { import { CylinderGeometryUpdater } from 'cesium'; export default CylinderGeometryUpdater; } +declare module "cesium/Source/DataSources/CylinderGraphics" { import { CylinderGraphics } from 'cesium'; export default CylinderGraphics; } +declare module "cesium/Source/DataSources/CzmlDataSource" { import { CzmlDataSource } from 'cesium'; export default CzmlDataSource; } +declare module "cesium/Source/DataSources/DataSource" { import { DataSource } from 'cesium'; export default DataSource; } +declare module "cesium/Source/DataSources/DataSourceClock" { import { DataSourceClock } from 'cesium'; export default DataSourceClock; } +declare module "cesium/Source/DataSources/DataSourceCollection" { import { DataSourceCollection } from 'cesium'; export default DataSourceCollection; } +declare module "cesium/Source/DataSources/DataSourceDisplay" { import { DataSourceDisplay } from 'cesium'; export default DataSourceDisplay; } +declare module "cesium/Source/DataSources/EllipseGeometryUpdater" { import { EllipseGeometryUpdater } from 'cesium'; export default EllipseGeometryUpdater; } +declare module "cesium/Source/DataSources/EllipseGraphics" { import { EllipseGraphics } from 'cesium'; export default EllipseGraphics; } +declare module "cesium/Source/DataSources/EllipsoidGeometryUpdater" { import { EllipsoidGeometryUpdater } from 'cesium'; export default EllipsoidGeometryUpdater; } +declare module "cesium/Source/DataSources/EllipsoidGraphics" { import { EllipsoidGraphics } from 'cesium'; export default EllipsoidGraphics; } +declare module "cesium/Source/DataSources/Entity" { import { Entity } from 'cesium'; export default Entity; } +declare module "cesium/Source/DataSources/EntityCluster" { import { EntityCluster } from 'cesium'; export default EntityCluster; } +declare module "cesium/Source/DataSources/EntityCollection" { import { EntityCollection } from 'cesium'; export default EntityCollection; } +declare module "cesium/Source/DataSources/EntityView" { import { EntityView } from 'cesium'; export default EntityView; } +declare module "cesium/Source/DataSources/GeoJsonDataSource" { import { GeoJsonDataSource } from 'cesium'; export default GeoJsonDataSource; } +declare module "cesium/Source/DataSources/GeometryUpdater" { import { GeometryUpdater } from 'cesium'; export default GeometryUpdater; } +declare module "cesium/Source/DataSources/GeometryVisualizer" { import { GeometryVisualizer } from 'cesium'; export default GeometryVisualizer; } +declare module "cesium/Source/DataSources/GridMaterialProperty" { import { GridMaterialProperty } from 'cesium'; export default GridMaterialProperty; } +declare module "cesium/Source/DataSources/GroundGeometryUpdater" { import { GroundGeometryUpdater } from 'cesium'; export default GroundGeometryUpdater; } +declare module "cesium/Source/DataSources/ImageMaterialProperty" { import { ImageMaterialProperty } from 'cesium'; export default ImageMaterialProperty; } +declare module "cesium/Source/DataSources/KmlCamera" { import { KmlCamera } from 'cesium'; export default KmlCamera; } +declare module "cesium/Source/DataSources/KmlDataSource" { import { KmlDataSource } from 'cesium'; export default KmlDataSource; } +declare module "cesium/Source/DataSources/KmlLookAt" { import { KmlLookAt } from 'cesium'; export default KmlLookAt; } +declare module "cesium/Source/DataSources/KmlTour" { import { KmlTour } from 'cesium'; export default KmlTour; } +declare module "cesium/Source/DataSources/KmlTourFlyTo" { import { KmlTourFlyTo } from 'cesium'; export default KmlTourFlyTo; } +declare module "cesium/Source/DataSources/KmlTourWait" { import { KmlTourWait } from 'cesium'; export default KmlTourWait; } +declare module "cesium/Source/DataSources/LabelGraphics" { import { LabelGraphics } from 'cesium'; export default LabelGraphics; } +declare module "cesium/Source/DataSources/LabelVisualizer" { import { LabelVisualizer } from 'cesium'; export default LabelVisualizer; } +declare module "cesium/Source/DataSources/MaterialProperty" { import { MaterialProperty } from 'cesium'; export default MaterialProperty; } +declare module "cesium/Source/DataSources/ModelGraphics" { import { ModelGraphics } from 'cesium'; export default ModelGraphics; } +declare module "cesium/Source/DataSources/ModelVisualizer" { import { ModelVisualizer } from 'cesium'; export default ModelVisualizer; } +declare module "cesium/Source/DataSources/NodeTransformationProperty" { import { NodeTransformationProperty } from 'cesium'; export default NodeTransformationProperty; } +declare module "cesium/Source/DataSources/PathGraphics" { import { PathGraphics } from 'cesium'; export default PathGraphics; } +declare module "cesium/Source/DataSources/PathVisualizer" { import { PathVisualizer } from 'cesium'; export default PathVisualizer; } +declare module "cesium/Source/DataSources/PlaneGeometryUpdater" { import { PlaneGeometryUpdater } from 'cesium'; export default PlaneGeometryUpdater; } +declare module "cesium/Source/DataSources/PlaneGraphics" { import { PlaneGraphics } from 'cesium'; export default PlaneGraphics; } +declare module "cesium/Source/DataSources/PointGraphics" { import { PointGraphics } from 'cesium'; export default PointGraphics; } +declare module "cesium/Source/DataSources/PointVisualizer" { import { PointVisualizer } from 'cesium'; export default PointVisualizer; } +declare module "cesium/Source/DataSources/PolygonGeometryUpdater" { import { PolygonGeometryUpdater } from 'cesium'; export default PolygonGeometryUpdater; } +declare module "cesium/Source/DataSources/PolygonGraphics" { import { PolygonGraphics } from 'cesium'; export default PolygonGraphics; } +declare module "cesium/Source/DataSources/PolylineArrowMaterialProperty" { import { PolylineArrowMaterialProperty } from 'cesium'; export default PolylineArrowMaterialProperty; } +declare module "cesium/Source/DataSources/PolylineDashMaterialProperty" { import { PolylineDashMaterialProperty } from 'cesium'; export default PolylineDashMaterialProperty; } +declare module "cesium/Source/DataSources/PolylineGeometryUpdater" { import { PolylineGeometryUpdater } from 'cesium'; export default PolylineGeometryUpdater; } +declare module "cesium/Source/DataSources/PolylineGlowMaterialProperty" { import { PolylineGlowMaterialProperty } from 'cesium'; export default PolylineGlowMaterialProperty; } +declare module "cesium/Source/DataSources/PolylineGraphics" { import { PolylineGraphics } from 'cesium'; export default PolylineGraphics; } +declare module "cesium/Source/DataSources/PolylineOutlineMaterialProperty" { import { PolylineOutlineMaterialProperty } from 'cesium'; export default PolylineOutlineMaterialProperty; } +declare module "cesium/Source/DataSources/PolylineVisualizer" { import { PolylineVisualizer } from 'cesium'; export default PolylineVisualizer; } +declare module "cesium/Source/DataSources/PolylineVolumeGeometryUpdater" { import { PolylineVolumeGeometryUpdater } from 'cesium'; export default PolylineVolumeGeometryUpdater; } +declare module "cesium/Source/DataSources/PolylineVolumeGraphics" { import { PolylineVolumeGraphics } from 'cesium'; export default PolylineVolumeGraphics; } +declare module "cesium/Source/DataSources/PositionProperty" { import { PositionProperty } from 'cesium'; export default PositionProperty; } +declare module "cesium/Source/DataSources/PositionPropertyArray" { import { PositionPropertyArray } from 'cesium'; export default PositionPropertyArray; } +declare module "cesium/Source/DataSources/Property" { import { Property } from 'cesium'; export default Property; } +declare module "cesium/Source/DataSources/PropertyArray" { import { PropertyArray } from 'cesium'; export default PropertyArray; } +declare module "cesium/Source/DataSources/PropertyBag" { import { PropertyBag } from 'cesium'; export default PropertyBag; } +declare module "cesium/Source/DataSources/RectangleGeometryUpdater" { import { RectangleGeometryUpdater } from 'cesium'; export default RectangleGeometryUpdater; } +declare module "cesium/Source/DataSources/RectangleGraphics" { import { RectangleGraphics } from 'cesium'; export default RectangleGraphics; } +declare module "cesium/Source/DataSources/ReferenceProperty" { import { ReferenceProperty } from 'cesium'; export default ReferenceProperty; } +declare module "cesium/Source/DataSources/Rotation" { import { Rotation } from 'cesium'; export default Rotation; } +declare module "cesium/Source/DataSources/SampledPositionProperty" { import { SampledPositionProperty } from 'cesium'; export default SampledPositionProperty; } +declare module "cesium/Source/DataSources/SampledProperty" { import { SampledProperty } from 'cesium'; export default SampledProperty; } +declare module "cesium/Source/DataSources/StripeMaterialProperty" { import { StripeMaterialProperty } from 'cesium'; export default StripeMaterialProperty; } +declare module "cesium/Source/DataSources/StripeOrientation" { import { StripeOrientation } from 'cesium'; export default StripeOrientation; } +declare module "cesium/Source/DataSources/TimeIntervalCollectionPositionProperty" { import { TimeIntervalCollectionPositionProperty } from 'cesium'; export default TimeIntervalCollectionPositionProperty; } +declare module "cesium/Source/DataSources/TimeIntervalCollectionProperty" { import { TimeIntervalCollectionProperty } from 'cesium'; export default TimeIntervalCollectionProperty; } +declare module "cesium/Source/DataSources/VelocityOrientationProperty" { import { VelocityOrientationProperty } from 'cesium'; export default VelocityOrientationProperty; } +declare module "cesium/Source/DataSources/VelocityVectorProperty" { import { VelocityVectorProperty } from 'cesium'; export default VelocityVectorProperty; } +declare module "cesium/Source/DataSources/Visualizer" { import { Visualizer } from 'cesium'; export default Visualizer; } +declare module "cesium/Source/DataSources/WallGeometryUpdater" { import { WallGeometryUpdater } from 'cesium'; export default WallGeometryUpdater; } +declare module "cesium/Source/DataSources/WallGraphics" { import { WallGraphics } from 'cesium'; export default WallGraphics; } +declare module "cesium/Source/DataSources/exportKml" { import { exportKml } from 'cesium'; export default exportKml; } +declare module "cesium/Source/Renderer/PixelDatatype" { import { PixelDatatype } from 'cesium'; export default PixelDatatype; } +declare module "cesium/Source/Renderer/TextureMagnificationFilter" { import { TextureMagnificationFilter } from 'cesium'; export default TextureMagnificationFilter; } +declare module "cesium/Source/Renderer/TextureMinificationFilter" { import { TextureMinificationFilter } from 'cesium'; export default TextureMinificationFilter; } +declare module "cesium/Source/Scene/Appearance" { import { Appearance } from 'cesium'; export default Appearance; } +declare module "cesium/Source/Scene/ArcGisMapServerImageryProvider" { import { ArcGisMapServerImageryProvider } from 'cesium'; export default ArcGisMapServerImageryProvider; } +declare module "cesium/Source/Scene/Axis" { import { Axis } from 'cesium'; export default Axis; } +declare module "cesium/Source/Scene/Billboard" { import { Billboard } from 'cesium'; export default Billboard; } +declare module "cesium/Source/Scene/BillboardCollection" { import { BillboardCollection } from 'cesium'; export default BillboardCollection; } +declare module "cesium/Source/Scene/BingMapsImageryProvider" { import { BingMapsImageryProvider } from 'cesium'; export default BingMapsImageryProvider; } +declare module "cesium/Source/Scene/BingMapsStyle" { import { BingMapsStyle } from 'cesium'; export default BingMapsStyle; } +declare module "cesium/Source/Scene/BlendEquation" { import { BlendEquation } from 'cesium'; export default BlendEquation; } +declare module "cesium/Source/Scene/BlendFunction" { import { BlendFunction } from 'cesium'; export default BlendFunction; } +declare module "cesium/Source/Scene/BlendOption" { import { BlendOption } from 'cesium'; export default BlendOption; } +declare module "cesium/Source/Scene/BlendingState" { import { BlendingState } from 'cesium'; export default BlendingState; } +declare module "cesium/Source/Scene/BoxEmitter" { import { BoxEmitter } from 'cesium'; export default BoxEmitter; } +declare module "cesium/Source/Scene/Camera" { import { Camera } from 'cesium'; export default Camera; } +declare module "cesium/Source/Scene/CameraEventAggregator" { import { CameraEventAggregator } from 'cesium'; export default CameraEventAggregator; } +declare module "cesium/Source/Scene/CameraEventType" { import { CameraEventType } from 'cesium'; export default CameraEventType; } +declare module "cesium/Source/Scene/Cesium3DTile" { import { Cesium3DTile } from 'cesium'; export default Cesium3DTile; } +declare module "cesium/Source/Scene/Cesium3DTileColorBlendMode" { import { Cesium3DTileColorBlendMode } from 'cesium'; export default Cesium3DTileColorBlendMode; } +declare module "cesium/Source/Scene/Cesium3DTileContent" { import { Cesium3DTileContent } from 'cesium'; export default Cesium3DTileContent; } +declare module "cesium/Source/Scene/Cesium3DTileFeature" { import { Cesium3DTileFeature } from 'cesium'; export default Cesium3DTileFeature; } +declare module "cesium/Source/Scene/Cesium3DTilePointFeature" { import { Cesium3DTilePointFeature } from 'cesium'; export default Cesium3DTilePointFeature; } +declare module "cesium/Source/Scene/Cesium3DTileStyle" { import { Cesium3DTileStyle } from 'cesium'; export default Cesium3DTileStyle; } +declare module "cesium/Source/Scene/Cesium3DTileset" { import { Cesium3DTileset } from 'cesium'; export default Cesium3DTileset; } +declare module "cesium/Source/Scene/CircleEmitter" { import { CircleEmitter } from 'cesium'; export default CircleEmitter; } +declare module "cesium/Source/Scene/ClassificationPrimitive" { import { ClassificationPrimitive } from 'cesium'; export default ClassificationPrimitive; } +declare module "cesium/Source/Scene/ClassificationType" { import { ClassificationType } from 'cesium'; export default ClassificationType; } +declare module "cesium/Source/Scene/ClippingPlane" { import { ClippingPlane } from 'cesium'; export default ClippingPlane; } +declare module "cesium/Source/Scene/ClippingPlaneCollection" { import { ClippingPlaneCollection } from 'cesium'; export default ClippingPlaneCollection; } +declare module "cesium/Source/Scene/ColorBlendMode" { import { ColorBlendMode } from 'cesium'; export default ColorBlendMode; } +declare module "cesium/Source/Scene/ConditionsExpression" { import { ConditionsExpression } from 'cesium'; export default ConditionsExpression; } +declare module "cesium/Source/Scene/ConeEmitter" { import { ConeEmitter } from 'cesium'; export default ConeEmitter; } +declare module "cesium/Source/Scene/CreditDisplay" { import { CreditDisplay } from 'cesium'; export default CreditDisplay; } +declare module "cesium/Source/Scene/CullFace" { import { CullFace } from 'cesium'; export default CullFace; } +declare module "cesium/Source/Scene/DebugAppearance" { import { DebugAppearance } from 'cesium'; export default DebugAppearance; } +declare module "cesium/Source/Scene/DebugCameraPrimitive" { import { DebugCameraPrimitive } from 'cesium'; export default DebugCameraPrimitive; } +declare module "cesium/Source/Scene/DebugModelMatrixPrimitive" { import { DebugModelMatrixPrimitive } from 'cesium'; export default DebugModelMatrixPrimitive; } +declare module "cesium/Source/Scene/DepthFunction" { import { DepthFunction } from 'cesium'; export default DepthFunction; } +declare module "cesium/Source/Scene/DirectionalLight" { import { DirectionalLight } from 'cesium'; export default DirectionalLight; } +declare module "cesium/Source/Scene/DiscardEmptyTileImagePolicy" { import { DiscardEmptyTileImagePolicy } from 'cesium'; export default DiscardEmptyTileImagePolicy; } +declare module "cesium/Source/Scene/DiscardMissingTileImagePolicy" { import { DiscardMissingTileImagePolicy } from 'cesium'; export default DiscardMissingTileImagePolicy; } +declare module "cesium/Source/Scene/EllipsoidSurfaceAppearance" { import { EllipsoidSurfaceAppearance } from 'cesium'; export default EllipsoidSurfaceAppearance; } +declare module "cesium/Source/Scene/Expression" { import { Expression } from 'cesium'; export default Expression; } +declare module "cesium/Source/Scene/Fog" { import { Fog } from 'cesium'; export default Fog; } +declare module "cesium/Source/Scene/FrameRateMonitor" { import { FrameRateMonitor } from 'cesium'; export default FrameRateMonitor; } +declare module "cesium/Source/Scene/GetFeatureInfoFormat" { import { GetFeatureInfoFormat } from 'cesium'; export default GetFeatureInfoFormat; } +declare module "cesium/Source/Scene/Globe" { import { Globe } from 'cesium'; export default Globe; } +declare module "cesium/Source/Scene/GlobeTranslucency" { import { GlobeTranslucency } from 'cesium'; export default GlobeTranslucency; } +declare module "cesium/Source/Scene/GoogleEarthEnterpriseImageryProvider" { import { GoogleEarthEnterpriseImageryProvider } from 'cesium'; export default GoogleEarthEnterpriseImageryProvider; } +declare module "cesium/Source/Scene/GoogleEarthEnterpriseMapsProvider" { import { GoogleEarthEnterpriseMapsProvider } from 'cesium'; export default GoogleEarthEnterpriseMapsProvider; } +declare module "cesium/Source/Scene/GridImageryProvider" { import { GridImageryProvider } from 'cesium'; export default GridImageryProvider; } +declare module "cesium/Source/Scene/GroundPolylinePrimitive" { import { GroundPolylinePrimitive } from 'cesium'; export default GroundPolylinePrimitive; } +declare module "cesium/Source/Scene/GroundPrimitive" { import { GroundPrimitive } from 'cesium'; export default GroundPrimitive; } +declare module "cesium/Source/Scene/HeightReference" { import { HeightReference } from 'cesium'; export default HeightReference; } +declare module "cesium/Source/Scene/HorizontalOrigin" { import { HorizontalOrigin } from 'cesium'; export default HorizontalOrigin; } +declare module "cesium/Source/Scene/ImageryLayer" { import { ImageryLayer } from 'cesium'; export default ImageryLayer; } +declare module "cesium/Source/Scene/ImageryLayerCollection" { import { ImageryLayerCollection } from 'cesium'; export default ImageryLayerCollection; } +declare module "cesium/Source/Scene/ImageryLayerFeatureInfo" { import { ImageryLayerFeatureInfo } from 'cesium'; export default ImageryLayerFeatureInfo; } +declare module "cesium/Source/Scene/ImageryProvider" { import { ImageryProvider } from 'cesium'; export default ImageryProvider; } +declare module "cesium/Source/Scene/ImagerySplitDirection" { import { ImagerySplitDirection } from 'cesium'; export default ImagerySplitDirection; } +declare module "cesium/Source/Scene/IonImageryProvider" { import { IonImageryProvider } from 'cesium'; export default IonImageryProvider; } +declare module "cesium/Source/Scene/IonWorldImageryStyle" { import { IonWorldImageryStyle } from 'cesium'; export default IonWorldImageryStyle; } +declare module "cesium/Source/Scene/Label" { import { Label } from 'cesium'; export default Label; } +declare module "cesium/Source/Scene/LabelCollection" { import { LabelCollection } from 'cesium'; export default LabelCollection; } +declare module "cesium/Source/Scene/LabelStyle" { import { LabelStyle } from 'cesium'; export default LabelStyle; } +declare module "cesium/Source/Scene/Light" { import { Light } from 'cesium'; export default Light; } +declare module "cesium/Source/Scene/MapMode2D" { import { MapMode2D } from 'cesium'; export default MapMode2D; } +declare module "cesium/Source/Scene/MapboxImageryProvider" { import { MapboxImageryProvider } from 'cesium'; export default MapboxImageryProvider; } +declare module "cesium/Source/Scene/MapboxStyleImageryProvider" { import { MapboxStyleImageryProvider } from 'cesium'; export default MapboxStyleImageryProvider; } +declare module "cesium/Source/Scene/Material" { import { Material } from 'cesium'; export default Material; } +declare module "cesium/Source/Scene/MaterialAppearance" { import { MaterialAppearance } from 'cesium'; export default MaterialAppearance; } +declare module "cesium/Source/Scene/Model" { import { Model } from 'cesium'; export default Model; } +declare module "cesium/Source/Scene/ModelAnimation" { import { ModelAnimation } from 'cesium'; export default ModelAnimation; } +declare module "cesium/Source/Scene/ModelAnimationCollection" { import { ModelAnimationCollection } from 'cesium'; export default ModelAnimationCollection; } +declare module "cesium/Source/Scene/ModelAnimationLoop" { import { ModelAnimationLoop } from 'cesium'; export default ModelAnimationLoop; } +declare module "cesium/Source/Scene/ModelMaterial" { import { ModelMaterial } from 'cesium'; export default ModelMaterial; } +declare module "cesium/Source/Scene/ModelMesh" { import { ModelMesh } from 'cesium'; export default ModelMesh; } +declare module "cesium/Source/Scene/ModelNode" { import { ModelNode } from 'cesium'; export default ModelNode; } +declare module "cesium/Source/Scene/Moon" { import { Moon } from 'cesium'; export default Moon; } +declare module "cesium/Source/Scene/NeverTileDiscardPolicy" { import { NeverTileDiscardPolicy } from 'cesium'; export default NeverTileDiscardPolicy; } +declare module "cesium/Source/Scene/OpenStreetMapImageryProvider" { import { OpenStreetMapImageryProvider } from 'cesium'; export default OpenStreetMapImageryProvider; } +declare module "cesium/Source/Scene/Particle" { import { Particle } from 'cesium'; export default Particle; } +declare module "cesium/Source/Scene/ParticleBurst" { import { ParticleBurst } from 'cesium'; export default ParticleBurst; } +declare module "cesium/Source/Scene/ParticleEmitter" { import { ParticleEmitter } from 'cesium'; export default ParticleEmitter; } +declare module "cesium/Source/Scene/ParticleSystem" { import { ParticleSystem } from 'cesium'; export default ParticleSystem; } +declare module "cesium/Source/Scene/PerInstanceColorAppearance" { import { PerInstanceColorAppearance } from 'cesium'; export default PerInstanceColorAppearance; } +declare module "cesium/Source/Scene/PointCloudShading" { import { PointCloudShading } from 'cesium'; export default PointCloudShading; } +declare module "cesium/Source/Scene/PointPrimitive" { import { PointPrimitive } from 'cesium'; export default PointPrimitive; } +declare module "cesium/Source/Scene/PointPrimitiveCollection" { import { PointPrimitiveCollection } from 'cesium'; export default PointPrimitiveCollection; } +declare module "cesium/Source/Scene/Polyline" { import { Polyline } from 'cesium'; export default Polyline; } +declare module "cesium/Source/Scene/PolylineCollection" { import { PolylineCollection } from 'cesium'; export default PolylineCollection; } +declare module "cesium/Source/Scene/PolylineColorAppearance" { import { PolylineColorAppearance } from 'cesium'; export default PolylineColorAppearance; } +declare module "cesium/Source/Scene/PolylineMaterialAppearance" { import { PolylineMaterialAppearance } from 'cesium'; export default PolylineMaterialAppearance; } +declare module "cesium/Source/Scene/PostProcessStage" { import { PostProcessStage } from 'cesium'; export default PostProcessStage; } +declare module "cesium/Source/Scene/PostProcessStageCollection" { import { PostProcessStageCollection } from 'cesium'; export default PostProcessStageCollection; } +declare module "cesium/Source/Scene/PostProcessStageComposite" { import { PostProcessStageComposite } from 'cesium'; export default PostProcessStageComposite; } +declare module "cesium/Source/Scene/PostProcessStageLibrary" { import { PostProcessStageLibrary } from 'cesium'; export default PostProcessStageLibrary; } +declare module "cesium/Source/Scene/PostProcessStageSampleMode" { import { PostProcessStageSampleMode } from 'cesium'; export default PostProcessStageSampleMode; } +declare module "cesium/Source/Scene/Primitive" { import { Primitive } from 'cesium'; export default Primitive; } +declare module "cesium/Source/Scene/PrimitiveCollection" { import { PrimitiveCollection } from 'cesium'; export default PrimitiveCollection; } +declare module "cesium/Source/Scene/Scene" { import { Scene } from 'cesium'; export default Scene; } +declare module "cesium/Source/Scene/SceneMode" { import { SceneMode } from 'cesium'; export default SceneMode; } +declare module "cesium/Source/Scene/SceneTransforms" { import { SceneTransforms } from 'cesium'; export default SceneTransforms; } +declare module "cesium/Source/Scene/ScreenSpaceCameraController" { import { ScreenSpaceCameraController } from 'cesium'; export default ScreenSpaceCameraController; } +declare module "cesium/Source/Scene/ShadowMap" { import { ShadowMap } from 'cesium'; export default ShadowMap; } +declare module "cesium/Source/Scene/ShadowMode" { import { ShadowMode } from 'cesium'; export default ShadowMode; } +declare module "cesium/Source/Scene/SingleTileImageryProvider" { import { SingleTileImageryProvider } from 'cesium'; export default SingleTileImageryProvider; } +declare module "cesium/Source/Scene/SkyAtmosphere" { import { SkyAtmosphere } from 'cesium'; export default SkyAtmosphere; } +declare module "cesium/Source/Scene/SkyBox" { import { SkyBox } from 'cesium'; export default SkyBox; } +declare module "cesium/Source/Scene/SphereEmitter" { import { SphereEmitter } from 'cesium'; export default SphereEmitter; } +declare module "cesium/Source/Scene/StencilFunction" { import { StencilFunction } from 'cesium'; export default StencilFunction; } +declare module "cesium/Source/Scene/StencilOperation" { import { StencilOperation } from 'cesium'; export default StencilOperation; } +declare module "cesium/Source/Scene/StyleExpression" { import { StyleExpression } from 'cesium'; export default StyleExpression; } +declare module "cesium/Source/Scene/Sun" { import { Sun } from 'cesium'; export default Sun; } +declare module "cesium/Source/Scene/SunLight" { import { SunLight } from 'cesium'; export default SunLight; } +declare module "cesium/Source/Scene/TileCoordinatesImageryProvider" { import { TileCoordinatesImageryProvider } from 'cesium'; export default TileCoordinatesImageryProvider; } +declare module "cesium/Source/Scene/TileDiscardPolicy" { import { TileDiscardPolicy } from 'cesium'; export default TileDiscardPolicy; } +declare module "cesium/Source/Scene/TileMapServiceImageryProvider" { import { TileMapServiceImageryProvider } from 'cesium'; export default TileMapServiceImageryProvider; } +declare module "cesium/Source/Scene/TimeDynamicImagery" { import { TimeDynamicImagery } from 'cesium'; export default TimeDynamicImagery; } +declare module "cesium/Source/Scene/TimeDynamicPointCloud" { import { TimeDynamicPointCloud } from 'cesium'; export default TimeDynamicPointCloud; } +declare module "cesium/Source/Scene/UrlTemplateImageryProvider" { import { UrlTemplateImageryProvider } from 'cesium'; export default UrlTemplateImageryProvider; } +declare module "cesium/Source/Scene/VerticalOrigin" { import { VerticalOrigin } from 'cesium'; export default VerticalOrigin; } +declare module "cesium/Source/Scene/ViewportQuad" { import { ViewportQuad } from 'cesium'; export default ViewportQuad; } +declare module "cesium/Source/Scene/WebMapServiceImageryProvider" { import { WebMapServiceImageryProvider } from 'cesium'; export default WebMapServiceImageryProvider; } +declare module "cesium/Source/Scene/WebMapTileServiceImageryProvider" { import { WebMapTileServiceImageryProvider } from 'cesium'; export default WebMapTileServiceImageryProvider; } +declare module "cesium/Source/Scene/createOsmBuildings" { import { createOsmBuildings } from 'cesium'; export default createOsmBuildings; } +declare module "cesium/Source/Scene/createTangentSpaceDebugPrimitive" { import { createTangentSpaceDebugPrimitive } from 'cesium'; export default createTangentSpaceDebugPrimitive; } +declare module "cesium/Source/Scene/createWorldImagery" { import { createWorldImagery } from 'cesium'; export default createWorldImagery; } +declare module "cesium/Source/Widgets/ClockViewModel" { import { ClockViewModel } from 'cesium'; export default ClockViewModel; } +declare module "cesium/Source/Widgets/Command" { import { Command } from 'cesium'; export default Command; } +declare module "cesium/Source/Widgets/SvgPathBindingHandler" { import { SvgPathBindingHandler } from 'cesium'; export default SvgPathBindingHandler; } +declare module "cesium/Source/Widgets/ToggleButtonViewModel" { import { ToggleButtonViewModel } from 'cesium'; export default ToggleButtonViewModel; } +declare module "cesium/Source/Widgets/createCommand" { import { createCommand } from 'cesium'; export default createCommand; } +declare module "cesium/Source/Widgets/Animation/Animation" { import { Animation } from 'cesium'; export default Animation; } +declare module "cesium/Source/Widgets/Animation/AnimationViewModel" { import { AnimationViewModel } from 'cesium'; export default AnimationViewModel; } +declare module "cesium/Source/Widgets/BaseLayerPicker/BaseLayerPicker" { import { BaseLayerPicker } from 'cesium'; export default BaseLayerPicker; } +declare module "cesium/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel" { import { BaseLayerPickerViewModel } from 'cesium'; export default BaseLayerPickerViewModel; } +declare module "cesium/Source/Widgets/BaseLayerPicker/ProviderViewModel" { import { ProviderViewModel } from 'cesium'; export default ProviderViewModel; } +declare module "cesium/Source/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector" { import { Cesium3DTilesInspector } from 'cesium'; export default Cesium3DTilesInspector; } +declare module "cesium/Source/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspectorViewModel" { import { Cesium3DTilesInspectorViewModel } from 'cesium'; export default Cesium3DTilesInspectorViewModel; } +declare module "cesium/Source/Widgets/CesiumInspector/CesiumInspector" { import { CesiumInspector } from 'cesium'; export default CesiumInspector; } +declare module "cesium/Source/Widgets/CesiumInspector/CesiumInspectorViewModel" { import { CesiumInspectorViewModel } from 'cesium'; export default CesiumInspectorViewModel; } +declare module "cesium/Source/Widgets/CesiumWidget/CesiumWidget" { import { CesiumWidget } from 'cesium'; export default CesiumWidget; } +declare module "cesium/Source/Widgets/FullscreenButton/FullscreenButton" { import { FullscreenButton } from 'cesium'; export default FullscreenButton; } +declare module "cesium/Source/Widgets/FullscreenButton/FullscreenButtonViewModel" { import { FullscreenButtonViewModel } from 'cesium'; export default FullscreenButtonViewModel; } +declare module "cesium/Source/Widgets/Geocoder/Geocoder" { import { Geocoder } from 'cesium'; export default Geocoder; } +declare module "cesium/Source/Widgets/Geocoder/GeocoderViewModel" { import { GeocoderViewModel } from 'cesium'; export default GeocoderViewModel; } +declare module "cesium/Source/Widgets/HomeButton/HomeButton" { import { HomeButton } from 'cesium'; export default HomeButton; } +declare module "cesium/Source/Widgets/HomeButton/HomeButtonViewModel" { import { HomeButtonViewModel } from 'cesium'; export default HomeButtonViewModel; } +declare module "cesium/Source/Widgets/InfoBox/InfoBox" { import { InfoBox } from 'cesium'; export default InfoBox; } +declare module "cesium/Source/Widgets/InfoBox/InfoBoxViewModel" { import { InfoBoxViewModel } from 'cesium'; export default InfoBoxViewModel; } +declare module "cesium/Source/Widgets/NavigationHelpButton/NavigationHelpButton" { import { NavigationHelpButton } from 'cesium'; export default NavigationHelpButton; } +declare module "cesium/Source/Widgets/NavigationHelpButton/NavigationHelpButtonViewModel" { import { NavigationHelpButtonViewModel } from 'cesium'; export default NavigationHelpButtonViewModel; } +declare module "cesium/Source/Widgets/PerformanceWatchdog/PerformanceWatchdog" { import { PerformanceWatchdog } from 'cesium'; export default PerformanceWatchdog; } +declare module "cesium/Source/Widgets/PerformanceWatchdog/PerformanceWatchdogViewModel" { import { PerformanceWatchdogViewModel } from 'cesium'; export default PerformanceWatchdogViewModel; } +declare module "cesium/Source/Widgets/ProjectionPicker/ProjectionPicker" { import { ProjectionPicker } from 'cesium'; export default ProjectionPicker; } +declare module "cesium/Source/Widgets/ProjectionPicker/ProjectionPickerViewModel" { import { ProjectionPickerViewModel } from 'cesium'; export default ProjectionPickerViewModel; } +declare module "cesium/Source/Widgets/SceneModePicker/SceneModePicker" { import { SceneModePicker } from 'cesium'; export default SceneModePicker; } +declare module "cesium/Source/Widgets/SceneModePicker/SceneModePickerViewModel" { import { SceneModePickerViewModel } from 'cesium'; export default SceneModePickerViewModel; } +declare module "cesium/Source/Widgets/SelectionIndicator/SelectionIndicator" { import { SelectionIndicator } from 'cesium'; export default SelectionIndicator; } +declare module "cesium/Source/Widgets/SelectionIndicator/SelectionIndicatorViewModel" { import { SelectionIndicatorViewModel } from 'cesium'; export default SelectionIndicatorViewModel; } +declare module "cesium/Source/Widgets/Timeline/Timeline" { import { Timeline } from 'cesium'; export default Timeline; } +declare module "cesium/Source/Widgets/VRButton/VRButton" { import { VRButton } from 'cesium'; export default VRButton; } +declare module "cesium/Source/Widgets/VRButton/VRButtonViewModel" { import { VRButtonViewModel } from 'cesium'; export default VRButtonViewModel; } +declare module "cesium/Source/Widgets/Viewer/Viewer" { import { Viewer } from 'cesium'; export default Viewer; } +declare module "cesium/Source/Widgets/Viewer/viewerCesium3DTilesInspectorMixin" { import { viewerCesium3DTilesInspectorMixin } from 'cesium'; export default viewerCesium3DTilesInspectorMixin; } +declare module "cesium/Source/Widgets/Viewer/viewerCesiumInspectorMixin" { import { viewerCesiumInspectorMixin } from 'cesium'; export default viewerCesiumInspectorMixin; } +declare module "cesium/Source/Widgets/Viewer/viewerDragDropMixin" { import { viewerDragDropMixin } from 'cesium'; export default viewerDragDropMixin; } +declare module "cesium/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin" { import { viewerPerformanceWatchdogMixin } from 'cesium'; export default viewerPerformanceWatchdogMixin; } diff --git a/web/assets/Cesium/Cesium.js b/web/assets/Cesium/Cesium.js new file mode 100644 index 00000000..442f64fd --- /dev/null +++ b/web/assets/Cesium/Cesium.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Cesium={})}(this,function(exports){"use strict";function defined(e){return null!=e}function DeveloperError(e){var t;this.name="DeveloperError",this.message=e;try{throw new Error}catch(e){t=e.stack}this.stack=t}defined(Object.create)&&(DeveloperError.prototype=Object.create(Error.prototype),DeveloperError.prototype.constructor=DeveloperError),DeveloperError.prototype.toString=function(){var e=this.name+": "+this.message;return defined(this.stack)&&(e+="\n"+this.stack.toString()),e},DeveloperError.throwInstantiationError=function(){throw new DeveloperError("This function defines an interface and should not be called directly.")};var Check={};function getUndefinedErrorMessage(e){return e+" is required, actual value was undefined"}function getFailedTypeErrorMessage(e,t,i){return"Expected "+i+" to be typeof "+t+", actual typeof was "+e}function defaultValue(e,t){return null!=e?e:t}function MersenneTwister(e){null==e&&(e=(new Date).getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=new Array(this.N),this.mti=this.N+1,this.init_genrand(e)}Check.typeOf={},Check.defined=function(e,t){if(!defined(t))throw new DeveloperError(getUndefinedErrorMessage(e))},Check.typeOf.func=function(e,t){if("function"!=typeof t)throw new DeveloperError(getFailedTypeErrorMessage(typeof t,"function",e))},Check.typeOf.string=function(e,t){if("string"!=typeof t)throw new DeveloperError(getFailedTypeErrorMessage(typeof t,"string",e))},Check.typeOf.number=function(e,t){if("number"!=typeof t)throw new DeveloperError(getFailedTypeErrorMessage(typeof t,"number",e))},Check.typeOf.number.lessThan=function(e,t,i){if(Check.typeOf.number(e,t),i<=t)throw new DeveloperError("Expected "+e+" to be less than "+i+", actual value was "+t)},Check.typeOf.number.lessThanOrEquals=function(e,t,i){if(Check.typeOf.number(e,t),i>>0,this.mti=1;this.mti>>30;this.mt[this.mti]=(1812433253*((4294901760&e)>>>16)<<16)+1812433253*(65535&e)+this.mti,this.mt[this.mti]>>>=0}},MersenneTwister.prototype.genrand_int32=function(){var e,t,i=new Array(0,this.MATRIX_A);if(this.mti>=this.N){for(this.mti==this.N+1&&this.init_genrand(5489),t=0;t>>1^i[1&e];for(;t>>1^i[1&e];e=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^e>>>1^i[1&e],this.mti=0}return e=this.mt[this.mti++],e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,(e^=e>>>18)>>>0},MersenneTwister.prototype.random=function(){return this.genrand_int32()*(1/4294967296)};var CesiumMath={EPSILON1:.1,EPSILON2:.01,EPSILON3:.001,EPSILON4:1e-4,EPSILON5:1e-5,EPSILON6:1e-6,EPSILON7:1e-7,EPSILON8:1e-8,EPSILON9:1e-9,EPSILON10:1e-10,EPSILON11:1e-11,EPSILON12:1e-12,EPSILON13:1e-13,EPSILON14:1e-14,EPSILON15:1e-15,EPSILON16:1e-16,EPSILON17:1e-17,EPSILON18:1e-18,EPSILON19:1e-19,EPSILON20:1e-20,EPSILON21:1e-21,GRAVITATIONALPARAMETER:3986004418e5,SOLAR_RADIUS:6955e5,LUNAR_RADIUS:1737400,SIXTY_FOUR_KILOBYTES:65536,FOUR_GIGABYTES:4294967296};CesiumMath.sign=defaultValue(Math.sign,function(e){return 0===(e=+e)||e!=e?e:0=Math.PI?i-t:i},CesiumMath.clampToLatitudeRange=function(e){return CesiumMath.clamp(e,-1*CesiumMath.PI_OVER_TWO,CesiumMath.PI_OVER_TWO)},CesiumMath.negativePiToPi=function(e){return CesiumMath.zeroToTwoPi(e+CesiumMath.PI)-CesiumMath.PI},CesiumMath.zeroToTwoPi=function(e){var t=CesiumMath.mod(e,CesiumMath.TWO_PI);return Math.abs(t)CesiumMath.EPSILON14?CesiumMath.TWO_PI:t},CesiumMath.mod=function(e,t){return(e%t+t)%t},CesiumMath.equalsEpsilon=function(e,t,i,r){i=defaultValue(i,0),r=defaultValue(r,i);var n=Math.abs(e-t);return n<=r||n<=i*Math.max(Math.abs(e),Math.abs(t))},CesiumMath.lessThan=function(e,t,i){return e-t<-i},CesiumMath.lessThanOrEquals=function(e,t,i){return e-t>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e},CesiumMath.clamp=function(e,t,i){return eMath.abs(e)?CesiumMath.PI_OVER_TWO-i:i,i=e<0?CesiumMath.PI-i:i,i=t<0?-i:i},Cartesian3.fromSpherical=function(e,t){defined(t)||(t=new Cartesian3);var i=e.clock,r=e.cone,n=defaultValue(e.magnitude,1),a=n*Math.sin(r);return t.x=a*Math.cos(i),t.y=a*Math.sin(i),t.z=n*Math.cos(r),t},Cartesian3.fromElements=function(e,t,i,r){return defined(r)?(r.x=e,r.y=t,r.z=i,r):new Cartesian3(e,t,i)},Cartesian3.clone=function(e,t){if(defined(e))return defined(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t):new Cartesian3(e.x,e.y,e.z)},Cartesian3.fromCartesian4=Cartesian3.clone,Cartesian3.packedLength=3,Cartesian3.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.x,t[i++]=e.y,t[i]=e.z,t},Cartesian3.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new Cartesian3),i.x=e[t++],i.y=e[t++],i.z=e[t],i},Cartesian3.packArray=function(e,t){var i=e.length,r=3*i;if(defined(t)){if(!Array.isArray(t)&&t.length!==r)throw new DeveloperError("If result is a typed array, it must have exactly array.length * 3 elements");t.length!==r&&(t.length=r)}else t=new Array(r);for(var n=0;nCesiumMath.EPSILON12);return defined(n)?(n.x=a*T,n.y=o*x,n.z=s*b,n):new Cartesian3(a*T,o*x,s*b)}function Cartographic(e,t,i){this.longitude=defaultValue(e,0),this.latitude=defaultValue(t,0),this.height=defaultValue(i,0)}Cartographic.fromRadians=function(e,t,i,r){return i=defaultValue(i,0),defined(r)?(r.longitude=e,r.latitude=t,r.height=i,r):new Cartographic(e,t,i)},Cartographic.fromDegrees=function(e,t,i,r){return e=CesiumMath.toRadians(e),t=CesiumMath.toRadians(t),Cartographic.fromRadians(e,t,i,r)};var cartesianToCartographicN=new Cartesian3,cartesianToCartographicP=new Cartesian3,cartesianToCartographicH=new Cartesian3,wgs84OneOverRadii=new Cartesian3(1/6378137,1/6378137,1/6356752.314245179),wgs84OneOverRadiiSquared=new Cartesian3(1/40680631590769,1/40680631590769,1/40408299984661.445),wgs84CenterToleranceSquared=CesiumMath.EPSILON1;function initialize(e,t,i,r){t=defaultValue(t,0),i=defaultValue(i,0),r=defaultValue(r,0),e._radii=new Cartesian3(t,i,r),e._radiiSquared=new Cartesian3(t*t,i*i,r*r),e._radiiToTheFourth=new Cartesian3(t*t*t*t,i*i*i*i,r*r*r*r),e._oneOverRadii=new Cartesian3(0===t?0:1/t,0===i?0:1/i,0===r?0:1/r),e._oneOverRadiiSquared=new Cartesian3(0===t?0:1/(t*t),0===i?0:1/(i*i),0===r?0:1/(r*r)),e._minimumRadius=Math.min(t,i,r),e._maximumRadius=Math.max(t,i,r),e._centerToleranceSquared=CesiumMath.EPSILON1,0!==e._radiiSquared.z&&(e._squaredXOverSquaredZ=e._radiiSquared.x/e._radiiSquared.z)}function Ellipsoid(e,t,i){this._radii=void 0,this._radiiSquared=void 0,this._radiiToTheFourth=void 0,this._oneOverRadii=void 0,this._oneOverRadiiSquared=void 0,this._minimumRadius=void 0,this._maximumRadius=void 0,this._centerToleranceSquared=void 0,this._squaredXOverSquaredZ=void 0,initialize(this,e,t,i)}Cartographic.fromCartesian=function(e,t,i){var r=defined(t)?t.oneOverRadii:wgs84OneOverRadii,n=defined(t)?t.oneOverRadiiSquared:wgs84OneOverRadiiSquared,a=scaleToGeodeticSurface(e,r,n,defined(t)?t._centerToleranceSquared:wgs84CenterToleranceSquared,cartesianToCartographicP);if(defined(a)){var o=Cartesian3.multiplyComponents(a,n,cartesianToCartographicN),o=Cartesian3.normalize(o,o),s=Cartesian3.subtract(e,a,cartesianToCartographicH),l=Math.atan2(o.y,o.x),c=Math.asin(o.z),u=CesiumMath.sign(Cartesian3.dot(s,e))*Cartesian3.magnitude(s);return defined(i)?(i.longitude=l,i.latitude=c,i.height=u,i):new Cartographic(l,c,u)}},Cartographic.toCartesian=function(e,t,i){return Cartesian3.fromRadians(e.longitude,e.latitude,e.height,t,i)},Cartographic.clone=function(e,t){if(defined(e))return defined(t)?(t.longitude=e.longitude,t.latitude=e.latitude,t.height=e.height,t):new Cartographic(e.longitude,e.latitude,e.height)},Cartographic.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.longitude===t.longitude&&e.latitude===t.latitude&&e.height===t.height},Cartographic.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(e.longitude-t.longitude)<=i&&Math.abs(e.latitude-t.latitude)<=i&&Math.abs(e.height-t.height)<=i},Cartographic.ZERO=Object.freeze(new Cartographic(0,0,0)),Cartographic.prototype.clone=function(e){return Cartographic.clone(this,e)},Cartographic.prototype.equals=function(e){return Cartographic.equals(this,e)},Cartographic.prototype.equalsEpsilon=function(e,t){return Cartographic.equalsEpsilon(this,e,t)},Cartographic.prototype.toString=function(){return"("+this.longitude+", "+this.latitude+", "+this.height+")"},Object.defineProperties(Ellipsoid.prototype,{radii:{get:function(){return this._radii}},radiiSquared:{get:function(){return this._radiiSquared}},radiiToTheFourth:{get:function(){return this._radiiToTheFourth}},oneOverRadii:{get:function(){return this._oneOverRadii}},oneOverRadiiSquared:{get:function(){return this._oneOverRadiiSquared}},minimumRadius:{get:function(){return this._minimumRadius}},maximumRadius:{get:function(){return this._maximumRadius}}}),Ellipsoid.clone=function(e,t){if(defined(e)){var i=e._radii;return defined(t)?(Cartesian3.clone(i,t._radii),Cartesian3.clone(e._radiiSquared,t._radiiSquared),Cartesian3.clone(e._radiiToTheFourth,t._radiiToTheFourth),Cartesian3.clone(e._oneOverRadii,t._oneOverRadii),Cartesian3.clone(e._oneOverRadiiSquared,t._oneOverRadiiSquared),t._minimumRadius=e._minimumRadius,t._maximumRadius=e._maximumRadius,t._centerToleranceSquared=e._centerToleranceSquared,t):new Ellipsoid(i.x,i.y,i.z)}},Ellipsoid.fromCartesian3=function(e,t){return defined(t)||(t=new Ellipsoid),defined(e)&&initialize(t,e.x,e.y,e.z),t},Ellipsoid.WGS84=Object.freeze(new Ellipsoid(6378137,6378137,6356752.314245179)),Ellipsoid.UNIT_SPHERE=Object.freeze(new Ellipsoid(1,1,1)),Ellipsoid.MOON=Object.freeze(new Ellipsoid(CesiumMath.LUNAR_RADIUS,CesiumMath.LUNAR_RADIUS,CesiumMath.LUNAR_RADIUS)),Ellipsoid.prototype.clone=function(e){return Ellipsoid.clone(this,e)},Ellipsoid.packedLength=Cartesian3.packedLength,Ellipsoid.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._radii,t,i),t},Ellipsoid.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t);return Ellipsoid.fromCartesian3(r,i)},Ellipsoid.prototype.geocentricSurfaceNormal=Cartesian3.normalize,Ellipsoid.prototype.geodeticSurfaceNormalCartographic=function(e,t){var i=e.longitude,r=e.latitude,n=Math.cos(r),a=n*Math.cos(i),o=n*Math.sin(i),s=Math.sin(r);return defined(t)||(t=new Cartesian3),t.x=a,t.y=o,t.z=s,Cartesian3.normalize(t,t)},Ellipsoid.prototype.geodeticSurfaceNormal=function(e,t){if(!Cartesian3.equalsEpsilon(e,Cartesian3.ZERO,CesiumMath.EPSILON14))return defined(t)||(t=new Cartesian3),t=Cartesian3.multiplyComponents(e,this._oneOverRadiiSquared,t),Cartesian3.normalize(t,t)};var cartographicToCartesianNormal=new Cartesian3,cartographicToCartesianK=new Cartesian3;Ellipsoid.prototype.cartographicToCartesian=function(e,t){var i=cartographicToCartesianNormal,r=cartographicToCartesianK;this.geodeticSurfaceNormalCartographic(e,i),Cartesian3.multiplyComponents(this._radiiSquared,i,r);var n=Math.sqrt(Cartesian3.dot(i,r));return Cartesian3.divideByScalar(r,n,r),Cartesian3.multiplyByScalar(i,e.height,i),defined(t)||(t=new Cartesian3),Cartesian3.add(r,i,t)},Ellipsoid.prototype.cartographicArrayToCartesianArray=function(e,t){var i=e.length;defined(t)?t.length=i:t=new Array(i);for(var r=0;r=this._radii.z-t))return i};var abscissas=[.14887433898163,.43339539412925,.67940956829902,.86506336668898,.97390652851717,0],weights=[.29552422471475,.26926671930999,.21908636251598,.14945134915058,.066671344308684,0];function gaussLegendreQuadrature(e,t,i){for(var r=.5*(t+e),n=.5*(t-e),a=0,o=0;o<5;o++){var s=n*abscissas[o];a+=weights[o]*(i(r+s)+i(r-s))}return a*=n}function GeographicProjection(e){this._ellipsoid=defaultValue(e,Ellipsoid.WGS84),this._semimajorAxis=this._ellipsoid.maximumRadius,this._oneOverSemimajorAxis=1/this._semimajorAxis}Ellipsoid.prototype.surfaceArea=function(e){for(var t=e.west,i=e.east,r=e.south,n=e.north;ii&&(u=(l=(s=(e[Matrix3.getElementIndex(h,h)]-e[Matrix3.getElementIndex(d,d)])/2/e[Matrix3.getElementIndex(h,d)])<0?-1/(-s+Math.sqrt(1+s*s)):1/(s+Math.sqrt(1+s*s)))*(c=1/Math.sqrt(1+l*l))),(t=Matrix3.clone(Matrix3.IDENTITY,t))[Matrix3.getElementIndex(d,d)]=t[Matrix3.getElementIndex(h,h)]=c,t[Matrix3.getElementIndex(h,d)]=u,t[Matrix3.getElementIndex(d,h)]=-u,t}var jMatrix=new Matrix3,jMatrixTranspose=new Matrix3;function Cartesian4(e,t,i,r){this.x=defaultValue(e,0),this.y=defaultValue(t,0),this.z=defaultValue(i,0),this.w=defaultValue(r,0)}Matrix3.computeEigenDecomposition=function(e,t){var i=CesiumMath.EPSILON20,r=0,n=0;defined(t)||(t={});for(var a=t.unitary=Matrix3.clone(Matrix3.IDENTITY,t.unitary),o=t.diagonal=Matrix3.clone(e,t.diagonal),s=i*computeFrobeniusNorm(o);n<10&&offDiagonalFrobeniusNorm(o)>s;)shurDecomposition(o,jMatrix),Matrix3.transpose(jMatrix,jMatrixTranspose),Matrix3.multiply(o,jMatrix,o),Matrix3.multiply(jMatrixTranspose,o,o),Matrix3.multiply(a,jMatrix,a),2<++r&&(++n,r=0);return t},Matrix3.abs=function(e,t){return t[0]=Math.abs(e[0]),t[1]=Math.abs(e[1]),t[2]=Math.abs(e[2]),t[3]=Math.abs(e[3]),t[4]=Math.abs(e[4]),t[5]=Math.abs(e[5]),t[6]=Math.abs(e[6]),t[7]=Math.abs(e[7]),t[8]=Math.abs(e[8]),t},Matrix3.determinant=function(e){var t=e[0],i=e[3],r=e[6],n=e[1],a=e[4],o=e[7],s=e[2],l=e[5],c=e[8];return t*(a*c-l*o)+n*(l*r-i*c)+s*(i*o-a*r)},Matrix3.inverse=function(e,t){var i=e[0],r=e[1],n=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],d=Matrix3.determinant(e);t[0]=o*u-c*s,t[1]=c*n-r*u,t[2]=r*s-o*n,t[3]=l*s-a*u,t[4]=i*u-l*n,t[5]=a*n-i*s,t[6]=a*c-l*o,t[7]=l*r-i*c,t[8]=i*o-a*r;var h=1/d;return Matrix3.multiplyByScalar(t,h,t)},Matrix3.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[7]===t[7]&&e[8]===t[8]},Matrix3.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(e[0]-t[0])<=i&&Math.abs(e[1]-t[1])<=i&&Math.abs(e[2]-t[2])<=i&&Math.abs(e[3]-t[3])<=i&&Math.abs(e[4]-t[4])<=i&&Math.abs(e[5]-t[5])<=i&&Math.abs(e[6]-t[6])<=i&&Math.abs(e[7]-t[7])<=i&&Math.abs(e[8]-t[8])<=i},Matrix3.IDENTITY=Object.freeze(new Matrix3(1,0,0,0,1,0,0,0,1)),Matrix3.ZERO=Object.freeze(new Matrix3(0,0,0,0,0,0,0,0,0)),Matrix3.COLUMN0ROW0=0,Matrix3.COLUMN0ROW1=1,Matrix3.COLUMN0ROW2=2,Matrix3.COLUMN1ROW0=3,Matrix3.COLUMN1ROW1=4,Matrix3.COLUMN1ROW2=5,Matrix3.COLUMN2ROW0=6,Matrix3.COLUMN2ROW1=7,Matrix3.COLUMN2ROW2=8,Object.defineProperties(Matrix3.prototype,{length:{get:function(){return Matrix3.packedLength}}}),Matrix3.prototype.clone=function(e){return Matrix3.clone(this,e)},Matrix3.prototype.equals=function(e){return Matrix3.equals(this,e)},Matrix3.equalsArray=function(e,t,i){return e[0]===t[i]&&e[1]===t[i+1]&&e[2]===t[i+2]&&e[3]===t[i+3]&&e[4]===t[i+4]&&e[5]===t[i+5]&&e[6]===t[i+6]&&e[7]===t[i+7]&&e[8]===t[i+8]},Matrix3.prototype.equalsEpsilon=function(e,t){return Matrix3.equalsEpsilon(this,e,t)},Matrix3.prototype.toString=function(){return"("+this[0]+", "+this[3]+", "+this[6]+")\n("+this[1]+", "+this[4]+", "+this[7]+")\n("+this[2]+", "+this[5]+", "+this[8]+")"},Cartesian4.fromElements=function(e,t,i,r,n){return defined(n)?(n.x=e,n.y=t,n.z=i,n.w=r,n):new Cartesian4(e,t,i,r)},Cartesian4.fromColor=function(e,t){return defined(t)?(t.x=e.red,t.y=e.green,t.z=e.blue,t.w=e.alpha,t):new Cartesian4(e.red,e.green,e.blue,e.alpha)},Cartesian4.clone=function(e,t){if(defined(e))return defined(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t):new Cartesian4(e.x,e.y,e.z,e.w)},Cartesian4.packedLength=4,Cartesian4.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.x,t[i++]=e.y,t[i++]=e.z,t[i]=e.w,t},Cartesian4.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new Cartesian4),i.x=e[t++],i.y=e[t++],i.z=e[t++],i.w=e[t],i},Cartesian4.packArray=function(e,t){var i=e.length,r=4*i;if(defined(t)){if(!Array.isArray(t)&&t.length!==r)throw new DeveloperError("If result is a typed array, it must have exactly array.length * 4 elements");t.length!==r&&(t.length=r)}else t=new Array(r);for(var n=0;nCesiumMath.PI&&(r-=CesiumMath.TWO_PI),i>CesiumMath.PI&&(i-=CesiumMath.TWO_PI)),defined(t)?(t.west=i,t.south=o,t.east=r,t.north=s,t):new Rectangle(i,o,r,s)},Rectangle.fromCartesianArray=function(e,t,i){t=defaultValue(t,Ellipsoid.WGS84);for(var r=Number.MAX_VALUE,n=-Number.MAX_VALUE,a=Number.MAX_VALUE,o=-Number.MAX_VALUE,s=Number.MAX_VALUE,l=-Number.MAX_VALUE,c=0,u=e.length;cCesiumMath.PI&&(n-=CesiumMath.TWO_PI),r>CesiumMath.PI&&(r-=CesiumMath.TWO_PI)),defined(i)?(i.west=r,i.south=s,i.east=n,i.north=l,i):new Rectangle(r,s,n,l)},Rectangle.clone=function(e,t){if(defined(e))return defined(t)?(t.west=e.west,t.south=e.south,t.east=e.east,t.north=e.north,t):new Rectangle(e.west,e.south,e.east,e.north)},Rectangle.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(e.west-t.west)<=i&&Math.abs(e.south-t.south)<=i&&Math.abs(e.east-t.east)<=i&&Math.abs(e.north-t.north)<=i},Rectangle.prototype.clone=function(e){return Rectangle.clone(this,e)},Rectangle.prototype.equals=function(e){return Rectangle.equals(this,e)},Rectangle.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.west===t.west&&e.south===t.south&&e.east===t.east&&e.north===t.north},Rectangle.prototype.equalsEpsilon=function(e,t){return Rectangle.equalsEpsilon(this,e,t)},Rectangle.validate=function(e){},Rectangle.southwest=function(e,t){return defined(t)?(t.longitude=e.west,t.latitude=e.south,t.height=0,t):new Cartographic(e.west,e.south)},Rectangle.northwest=function(e,t){return defined(t)?(t.longitude=e.west,t.latitude=e.north,t.height=0,t):new Cartographic(e.west,e.north)},Rectangle.northeast=function(e,t){return defined(t)?(t.longitude=e.east,t.latitude=e.north,t.height=0,t):new Cartographic(e.east,e.north)},Rectangle.southeast=function(e,t){return defined(t)?(t.longitude=e.east,t.latitude=e.south,t.height=0,t):new Cartographic(e.east,e.south)},Rectangle.center=function(e,t){var i=e.east,r=e.west;i=e.south&&r<=e.north};var subsampleLlaScratch=new Cartographic;function BoundingSphere(e,t){this.center=Cartesian3.clone(defaultValue(e,Cartesian3.ZERO)),this.radius=defaultValue(t,0)}Rectangle.subsample=function(e,t,i,r){t=defaultValue(t,Ellipsoid.WGS84),i=defaultValue(i,0),defined(r)||(r=[]);var n=0,a=e.north,o=e.south,s=e.east,l=e.west,c=subsampleLlaScratch;c.height=i,c.longitude=l,c.latitude=a,r[n]=t.cartographicToCartesian(c,r[n]),n++,c.longitude=s,r[n]=t.cartographicToCartesian(c,r[n]),n++,c.latitude=o,r[n]=t.cartographicToCartesian(c,r[n]),n++,c.longitude=l,r[n]=t.cartographicToCartesian(c,r[n]),n++,c.latitude=a<0?a:0o.x&&Cartesian3.clone(i,o),hs.y&&Cartesian3.clone(i,s),pl.z&&Cartesian3.clone(i,l)}var m=Cartesian3.magnitudeSquared(Cartesian3.subtract(o,r,fromPointsScratch)),f=Cartesian3.magnitudeSquared(Cartesian3.subtract(s,n,fromPointsScratch)),g=Cartesian3.magnitudeSquared(Cartesian3.subtract(l,a,fromPointsScratch)),_=r,y=o,v=m;vl.x&&Cartesian3.clone(n,l),mc.y&&Cartesian3.clone(n,c),fu.z&&Cartesian3.clone(n,u)}var g=Cartesian3.magnitudeSquared(Cartesian3.subtract(l,a,fromPointsScratch)),_=Cartesian3.magnitudeSquared(Cartesian3.subtract(c,o,fromPointsScratch)),y=Cartesian3.magnitudeSquared(Cartesian3.subtract(u,s,fromPointsScratch)),v=a,C=l,S=g;S<_&&(S=_,v=o,C=c),Ss.x&&Cartesian3.clone(r,s),pl.y&&Cartesian3.clone(r,l),mc.z&&Cartesian3.clone(r,c)}var f=Cartesian3.magnitudeSquared(Cartesian3.subtract(s,n,fromPointsScratch)),g=Cartesian3.magnitudeSquared(Cartesian3.subtract(l,a,fromPointsScratch)),_=Cartesian3.magnitudeSquared(Cartesian3.subtract(c,o,fromPointsScratch)),y=n,v=s,C=f;Ci.radius&&(i.radius=r),i},BoundingSphere.intersectPlane=function(e,t){var i=e.center,r=e.radius,n=t.normal,a=Cartesian3.dot(n,i)+t.distance;return a<-r?Intersect$1.OUTSIDE:a>>0,o=Math.max(0,Math.min(p,a)),s=[],l=a-o+1,c=[],u=defer();if(o)for(r=u.progress,i=function(e){c.push(e),--l||(t=i=noop,u.reject(c))},t=function(e){s.push(e),--o||(t=i=noop,u.resolve(s))},n=0;n>>0,a=[],o=defer();if(n)for(i=function(e,t){when(e,s).then(function(e){a[t]=e,--n||o.resolve(a)},o.reject)},r=0;r>>0,a=arguments;if(a.length<=1)for(;;){if(i in r){t=r[i++];break}if(++i>=n)throw new TypeError}else t=a[1];for(;in&&(t=i[n],this._length=n),t},Heap.prototype.pop=function(e){if(e=defaultValue(e,0),0!==this._length){var t=this._array,i=t[e];return swap(t,e,--this._length),this.heapify(e),t[this._length]=void 0,i}};var statistics={numberOfAttemptedRequests:0,numberOfActiveRequests:0,numberOfCancelledRequests:0,numberOfCancelledActiveRequests:0,numberOfFailedRequests:0,numberOfActiveRequestsEver:0,lastNumberOfActiveRequests:0},priorityHeapLength=20,requestHeap=new Heap({comparator:sortRequests});requestHeap.maximumLength=priorityHeapLength,requestHeap.reserve(priorityHeapLength);var activeRequests=[],numberOfActiveRequestsByServer={},pageUri="undefined"!=typeof document?new URI(document.location.href):new URI,requestCompletedEvent=new Event;function RequestScheduler(){}function updatePriority(e){defined(e.priorityFunction)&&(e.priority=e.priorityFunction())}function serverHasOpenSlots(e){var t=defaultValue(RequestScheduler.requestsByServer[e],RequestScheduler.maximumRequestsPerServer);return numberOfActiveRequestsByServer[e]e;){cancelRequest(requestHeap.pop())}priorityHeapLength=e,requestHeap.maximumLength=e,requestHeap.reserve(e)}}}),RequestScheduler.update=function(){for(var e,t=0,i=activeRequests.length,r=0;r=RequestScheduler.maximumRequests)){updatePriority(e);var t=requestHeap.insert(e);if(defined(t)){if(t===e)return;cancelRequest(t)}return issueRequest(e)}}},RequestScheduler.clearForSpecs=function(){for(;0=this.retryAttempts)return when(!1);var i=this;return when(t(this,e)).then(function(e){return++i._retryCount,e})},Resource.prototype.clone=function(e){return defined(e)||(e=new Resource({url:this._url})),e._url=this._url,e._queryParameters=clone(this._queryParameters),e._templateValues=clone(this._templateValues),e.headers=clone(this.headers),e.proxy=this.proxy,e.retryCallback=this.retryCallback,e.retryAttempts=this.retryAttempts,e._retryCount=0,e.request=this.request.clone(),e},Resource.prototype.getBaseUri=function(e){return getBaseUri(this.getUrlComponent(e),e)},Resource.prototype.appendForwardSlash=function(){this._url=appendForwardSlash(this._url)},Resource.prototype.fetchArrayBuffer=function(){return this.fetch({responseType:"arraybuffer"})},Resource.fetchArrayBuffer=function(e){return new Resource(e).fetchArrayBuffer()},Resource.prototype.fetchBlob=function(){return this.fetch({responseType:"blob"})},Resource.fetchBlob=function(e){return new Resource(e).fetchBlob()},Resource.prototype.fetchImage=function(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.preferImageBitmap,!1),i=defaultValue(e.preferBlob,!1),r=defaultValue(e.flipY,!1);if(checkAndResetRequest(this.request),!xhrBlobSupported||this.isDataUri||this.isBlobUri||!this.hasHeaders&&!i)return fetchImage({resource:this,flipY:r,preferImageBitmap:t});var n,a,o,s=this.fetchBlob();return defined(s)?Resource.supportsImageBitmapOptions().then(function(e){return n=e&&t,s}).then(function(e){if(defined(e)){if(o=e,n)return Resource.createImageBitmapFromBlob(e,{flipY:r,premultiplyAlpha:!1});var t=window.URL.createObjectURL(e);return fetchImage({resource:a=new Resource({url:t}),flipY:r,preferImageBitmap:!1})}}).then(function(e){if(defined(e))return e.blob=o,n||window.URL.revokeObjectURL(a.url),e}).otherwise(function(e){return defined(a)&&window.URL.revokeObjectURL(a.url),e.blob=o,when.reject(e)}):void 0},Resource.fetchImage=function(e){return new Resource(e).fetchImage({flipY:e.flipY,preferBlob:e.preferBlob,preferImageBitmap:e.preferImageBitmap})},Resource.prototype.fetchText=function(){return this.fetch({responseType:"text"})},Resource.fetchText=function(e){return new Resource(e).fetchText()},Resource.prototype.fetchJson=function(){var e=this.fetch({responseType:"text",headers:{Accept:"application/json,*/*;q=0.01"}});if(defined(e))return e.then(function(e){if(defined(e))return JSON.parse(e)})},Resource.fetchJson=function(e){return new Resource(e).fetchJson()},Resource.prototype.fetchXML=function(){return this.fetch({responseType:"document",overrideMimeType:"text/xml"})},Resource.fetchXML=function(e){return new Resource(e).fetchXML()},Resource.prototype.fetchJsonp=function(e){var t;for(e=defaultValue(e,"callback"),checkAndResetRequest(this.request);t="loadJsonp"+Math.random().toString().substring(2,8),defined(window[t]););return fetchJsonp(this,e,t)},Resource.fetchJsonp=function(e){return new Resource(e).fetchJsonp(e.callbackParameterName)},Resource.prototype._makeRequest=function(s){var l=this;checkAndResetRequest(l.request);var c=l.request;c.url=l.url,c.requestFunction=function(){var e=s.responseType,t=combine(s.headers,l.headers),i=s.overrideMimeType,r=s.method,n=s.data,a=when.defer(),o=Resource._Implementations.loadWithXhr(l.url,e,r,n,t,a,i);return defined(o)&&defined(o.abort)&&(c.cancelFunction=function(){o.abort()}),a.promise};var e=RequestScheduler.request(c);if(defined(e))return e.then(function(e){return c.cancelFunction=void 0,e}).otherwise(function(t){return c.cancelFunction=void 0,c.state!==RequestState$1.FAILED?when.reject(t):l.retryOnError(t).then(function(e){return e?(c.state=RequestState$1.UNISSUED,c.deferred=void 0,l.fetch(s)):when.reject(t)})})};var dataUriRegex$1=/^data:(.*?)(;base64)?,(.*)$/;function decodeDataUriText(e,t){var i=decodeURIComponent(t);return e?atob(i):i}function decodeDataUriArrayBuffer(e,t){for(var i=decodeDataUriText(e,t),r=new ArrayBuffer(i.length),n=new Uint8Array(r),a=0;a/gm,DATA_ATTR=/^data-[\-\w.\u00B7-\uFFFF]/,ARIA_ATTR=/^aria-[\-\w]+$/,IS_ALLOWED_URI=/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,IS_SCRIPT_OR_DATA=/^(?:\w+script|data):/i,ATTR_WHITESPACE=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t

    ').querySelector("svg img")&&(a=!0)}catch(e){}}(),function(){try{E("</title><img>").querySelector("title").textContent.match(/<\/title/)&&(o=!0)}catch(e){}}());function ae(e){return _.call(e.ownerDocument||e,e,i.SHOW_ELEMENT|i.SHOW_COMMENT|i.SHOW_TEXT,function(){return i.FILTER_ACCEPT},!1)}function oe(e){return"object"===(void 0===h?"undefined":_typeof(h))?e instanceof h:e&&"object"===(void 0===e?"undefined":_typeof(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName}function se(e,t,i){S[e]&&S[e].forEach(function(e){e.call(d,t,i,re)})}function le(e){var t,i=void 0;if(se("beforeSanitizeElements",e,null),!((t=e)instanceof p||t instanceof m||"string"==typeof t.nodeName&&"string"==typeof t.textContent&&"function"==typeof t.removeChild&&t.attributes instanceof n&&"function"==typeof t.removeAttribute&&"function"==typeof t.setAttribute))return x(e),1;var r=e.nodeName.toLowerCase();if(se("uponSanitizeElement",e,{tagName:r,allowedTags:L}),L[r]&&!V[r])return!G||e.firstElementChild||e.content&&e.content.firstElementChild||!/</g.test(e.textContent)||(d.removed.push({element:e.cloneNode()}),e.innerHTML?e.innerHTML=e.innerHTML.replace(/</g,"<"):e.innerHTML=e.textContent.replace(/</g,"<")),H&&3===e.nodeType&&(i=(i=(i=e.textContent).replace(A," ")).replace(w," "),e.textContent!==i&&(d.removed.push({element:e.cloneNode()}),e.textContent=i)),se("afterSanitizeElements",e,null),0;if(Z&&!ee[r]&&"function"==typeof e.insertAdjacentHTML)try{e.insertAdjacentHTML("AfterEnd",e.innerHTML)}catch(e){}return x(e),1}function ce(e,t,i){if(J&&("id"===t||"name"===t)&&(i in s||i in ne))return!1;if(H&&(i=(i=i.replace(A," ")).replace(w," ")),!($&&D.test(t)||z&&M.test(t))){if(!N[t]||k[t])return!1;if(!ie[t]&&!O.test(i.replace(R,"")))if("src"!==t&&"xlink:href"!==t||"script"===e||0!==i.indexOf("data:")||!te[e]){if((!U||I.test(i.replace(R,"")))&&i)return!1}else;}return!0}function ue(e){var t,i=void 0,r=void 0;se("beforeSanitizeAttributes",e,null);var n=e.attributes;if(n){for(var a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:N},r=n.length;r--;){var o=(i=n[r]).name,s=i.namespaceURI,l=i.value.trim(),c=o.toLowerCase();if(a.attrName=c,a.attrValue=l,a.keepAttr=!0,se("uponSanitizeAttribute",e,a),l=a.attrValue,"name"===c&&"IMG"===e.nodeName&&n.id)t=n.id,n=Array.prototype.slice.apply(n),b("id",e),b(o,e),n.indexOf(t)>r&&e.setAttribute("id",t.value);else{if("INPUT"===e.nodeName&&"type"===c&&"file"===l&&(N[c]||!k[c]))continue;"id"===o&&e.setAttribute(o,""),b(o,e)}if(a.keepAttr){var u=e.nodeName.toLowerCase();if(ce(u,c,l))try{s?e.setAttributeNS(s,o,l):e.setAttribute(o,l),d.removed.pop()}catch(e){}}}se("afterSanitizeAttributes",e,null)}}return d.sanitize=function(e,t){var i,r,n=void 0,a=void 0,o=void 0;if("string"!=typeof(e=e||"\x3c!--\x3e")&&!oe(e)){if("function"!=typeof e.toString)throw new TypeError("toString is not a function");if("string"!=typeof(e=e.toString()))throw new TypeError("dirty is not a string, aborting")}if(!d.isSupported){if("object"===_typeof(l.toStaticHTML)||"function"==typeof l.toStaticHTML){if("string"==typeof e)return l.toStaticHTML(e);if(oe(e))return l.toStaticHTML(e.outerHTML)}return e}if(q||T(t),d.removed=[],!K)if(e instanceof h)1===(i=(n=E("\x3c!--\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===i.nodeName?n=i:n.appendChild(i);else{if(!Y&&!W&&-1===e.indexOf("<"))return e;if(!(n=E(e)))return Y?null:""}n&&j&&x(n.firstChild);for(var s=ae(K?e:n);r=s.nextNode();)3===r.nodeType&&r===a||le(r)||(r.content instanceof u&&!function e(t){var i,r=ae(t);for(se("beforeSanitizeShadowDOM",t,null);i=r.nextNode();)se("uponSanitizeShadowNode",i,null),le(i)||(i.content instanceof u&&e(i.content),ue(i));se("afterSanitizeShadowDOM",t,null)}(r.content),ue(r),a=r);if(K)return e;if(Y){if(X)for(o=v.call(n.ownerDocument);n.firstChild;)o.appendChild(n.firstChild);else o=n;return Q&&(o=C.call(c,o,!0)),o}return W?n.outerHTML:n.innerHTML},d.setConfig=function(e){T(e),q=!0},d.clearConfig=function(){re=null,q=!1},d.isValidAttribute=function(e,t,i){re||T({});var r=e.toLowerCase(),n=t.toLowerCase();return ce(r,n,i)},d.addHook=function(e,t){"function"==typeof t&&(S[e]=S[e]||[],S[e].push(t))},d.removeHook=function(e){S[e]&&S[e].pop()},d.removeHooks=function(e){S[e]&&(S[e]=[])},d.removeAllHooks=function(){S={}},d}var purify=createDOMPurify(),nextCreditId=0,creditToId={};function Credit(e,t){var i,r=e;defined(creditToId[r])?i=creditToId[r]:(i=nextCreditId++,creditToId[r]=i),t=defaultValue(t,!1),this._id=i,this._html=e,this._showOnScreen=t,this._element=void 0}Object.defineProperties(Credit.prototype,{html:{get:function(){return this._html}},id:{get:function(){return this._id}},showOnScreen:{get:function(){return this._showOnScreen}},element:{get:function(){if(!defined(this._element)){var e=purify.sanitize(this._html),t=document.createElement("div");t._creditId=this._id,t.style.display="inline",t.innerHTML=e;for(var i=t.querySelectorAll("a"),r=0;r<i.length;r++)i[r].setAttribute("target","_blank");this._element=t}return this._element}}}),Credit.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e._id===t._id},Credit.prototype.equals=function(e){return Credit.equals(this,e)},Credit.getIonCredit=function(e){var t=defined(e.collapsible)&&!e.collapsible,i=new Credit(e.html,t);return i._isIon=-1!==i.html.indexOf("ion-credit.png"),i},Credit.clone=function(e){if(defined(e))return new Credit(e.html,e.showOnScreen)};var HeightmapEncoding={NONE:0,LERC:1},HeightmapEncoding$1=Object.freeze(HeightmapEncoding);function AxisAlignedBoundingBox(e,t,i){this.minimum=Cartesian3.clone(defaultValue(e,Cartesian3.ZERO)),this.maximum=Cartesian3.clone(defaultValue(t,Cartesian3.ZERO)),i=defined(i)?Cartesian3.clone(i):Cartesian3.midpoint(this.minimum,this.maximum,new Cartesian3),this.center=i}AxisAlignedBoundingBox.fromPoints=function(e,t){if(defined(t)||(t=new AxisAlignedBoundingBox),!defined(e)||0===e.length)return t.minimum=Cartesian3.clone(Cartesian3.ZERO,t.minimum),t.maximum=Cartesian3.clone(Cartesian3.ZERO,t.maximum),t.center=Cartesian3.clone(Cartesian3.ZERO,t.center),t;for(var i=e[0].x,r=e[0].y,n=e[0].z,a=e[0].x,o=e[0].y,s=e[0].z,l=e.length,c=1;c<l;c++)var u=e[c],d=u.x,h=u.y,p=u.z,i=Math.min(d,i),a=Math.max(d,a),r=Math.min(h,r),o=Math.max(h,o),n=Math.min(p,n),s=Math.max(p,s);var m=t.minimum;m.x=i,m.y=r,m.z=n;var f=t.maximum;return f.x=a,f.y=o,f.z=s,t.center=Cartesian3.midpoint(m,f,t.center),t},AxisAlignedBoundingBox.clone=function(e,t){if(defined(e))return defined(t)?(t.minimum=Cartesian3.clone(e.minimum,t.minimum),t.maximum=Cartesian3.clone(e.maximum,t.maximum),t.center=Cartesian3.clone(e.center,t.center),t):new AxisAlignedBoundingBox(e.minimum,e.maximum,e.center)},AxisAlignedBoundingBox.equals=function(e,t){return e===t||defined(e)&&defined(t)&&Cartesian3.equals(e.center,t.center)&&Cartesian3.equals(e.minimum,t.minimum)&&Cartesian3.equals(e.maximum,t.maximum)};var intersectScratch=new Cartesian3;function EllipsoidalOccluder(e,t){this._ellipsoid=e,this._cameraPosition=new Cartesian3,this._cameraPositionInScaledSpace=new Cartesian3,this._distanceToLimbInScaledSpaceSquared=0,defined(t)&&(this.cameraPosition=t)}AxisAlignedBoundingBox.intersectPlane=function(e,t){intersectScratch=Cartesian3.subtract(e.maximum,e.minimum,intersectScratch);var i=Cartesian3.multiplyByScalar(intersectScratch,.5,intersectScratch),r=t.normal,n=i.x*Math.abs(r.x)+i.y*Math.abs(r.y)+i.z*Math.abs(r.z),a=Cartesian3.dot(e.center,r)+t.distance;return 0<a-n?Intersect$1.INSIDE:a+n<0?Intersect$1.OUTSIDE:Intersect$1.INTERSECTING},AxisAlignedBoundingBox.prototype.clone=function(e){return AxisAlignedBoundingBox.clone(this,e)},AxisAlignedBoundingBox.prototype.intersectPlane=function(e){return AxisAlignedBoundingBox.intersectPlane(this,e)},AxisAlignedBoundingBox.prototype.equals=function(e){return AxisAlignedBoundingBox.equals(this,e)},Object.defineProperties(EllipsoidalOccluder.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},cameraPosition:{get:function(){return this._cameraPosition},set:function(e){var t=this._ellipsoid.transformPositionToScaledSpace(e,this._cameraPositionInScaledSpace),i=Cartesian3.magnitudeSquared(t)-1;Cartesian3.clone(e,this._cameraPosition),this._cameraPositionInScaledSpace=t,this._distanceToLimbInScaledSpaceSquared=i}}});var scratchCartesian=new Cartesian3;EllipsoidalOccluder.prototype.isPointVisible=function(e){return isScaledSpacePointVisible(this._ellipsoid.transformPositionToScaledSpace(e,scratchCartesian),this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared)},EllipsoidalOccluder.prototype.isScaledSpacePointVisible=function(e){return isScaledSpacePointVisible(e,this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared)};var scratchCameraPositionInScaledSpaceShrunk=new Cartesian3;EllipsoidalOccluder.prototype.isScaledSpacePointVisiblePossiblyUnderEllipsoid=function(e,t){var i,r=this._ellipsoid,n=defined(t)&&t<0&&r.minimumRadius>-t?((i=scratchCameraPositionInScaledSpaceShrunk).x=this._cameraPosition.x/(r.radii.x+t),i.y=this._cameraPosition.y/(r.radii.y+t),i.z=this._cameraPosition.z/(r.radii.z+t),i.x*i.x+i.y*i.y+i.z*i.z-1):(i=this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared);return isScaledSpacePointVisible(e,i,n)},EllipsoidalOccluder.prototype.computeHorizonCullingPoint=function(e,t,i){return computeHorizonCullingPointFromPositions(this._ellipsoid,e,t,i)};var scratchEllipsoidShrunk=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE);EllipsoidalOccluder.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid=function(e,t,i,r){return computeHorizonCullingPointFromPositions(getPossiblyShrunkEllipsoid(this._ellipsoid,i,scratchEllipsoidShrunk),e,t,r)},EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVertices=function(e,t,i,r,n){return computeHorizonCullingPointFromVertices(this._ellipsoid,e,t,i,r,n)},EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid=function(e,t,i,r,n,a){return computeHorizonCullingPointFromVertices(getPossiblyShrunkEllipsoid(this._ellipsoid,n,scratchEllipsoidShrunk),e,t,i,r,a)};var subsampleScratch=[];EllipsoidalOccluder.prototype.computeHorizonCullingPointFromRectangle=function(e,t,i){var r=Rectangle.subsample(e,t,0,subsampleScratch),n=BoundingSphere.fromPoints(r);if(!(Cartesian3.magnitude(n.center)<.1*t.minimumRadius))return this.computeHorizonCullingPoint(n.center,r,i)};var scratchEllipsoidShrunkRadii=new Cartesian3;function getPossiblyShrunkEllipsoid(e,t,i){var r;return defined(t)&&t<0&&e.minimumRadius>-t&&(r=Cartesian3.fromElements(e.radii.x+t,e.radii.y+t,e.radii.z+t,scratchEllipsoidShrunkRadii),e=Ellipsoid.fromCartesian3(r,i)),e}function computeHorizonCullingPointFromPositions(e,t,i,r){defined(r)||(r=new Cartesian3);for(var n=computeScaledSpaceDirectionToPoint(e,t),a=0,o=0,s=i.length;o<s;++o){var l=computeMagnitude(e,i[o],n);if(l<0)return;a=Math.max(a,l)}return magnitudeToPoint(n,a,r)}var positionScratch=new Cartesian3;function computeHorizonCullingPointFromVertices(e,t,i,r,n,a){defined(a)||(a=new Cartesian3),r=defaultValue(r,3),n=defaultValue(n,Cartesian3.ZERO);for(var o=computeScaledSpaceDirectionToPoint(e,t),s=0,l=0,c=i.length;l<c;l+=r){positionScratch.x=i[l]+n.x,positionScratch.y=i[l+1]+n.y,positionScratch.z=i[l+2]+n.z;var u=computeMagnitude(e,positionScratch,o);if(u<0)return;s=Math.max(s,u)}return magnitudeToPoint(o,s,a)}function isScaledSpacePointVisible(e,t,i){var r=t,n=i,a=Cartesian3.subtract(e,r,scratchCartesian),o=-Cartesian3.dot(a,r);return!(n<0?0<o:n<o&&o*o/Cartesian3.magnitudeSquared(a)>n)}var scaledSpaceScratch=new Cartesian3,directionScratch=new Cartesian3;function computeMagnitude(e,t,i){var r=e.transformPositionToScaledSpace(t,scaledSpaceScratch),n=Cartesian3.magnitudeSquared(r),a=Math.sqrt(n),o=Cartesian3.divideByScalar(r,a,directionScratch),n=Math.max(1,n),s=1/(a=Math.max(1,a));return 1/(Cartesian3.dot(o,i)*s-Cartesian3.magnitude(Cartesian3.cross(o,i,o))*(Math.sqrt(n-1)*s))}function magnitudeToPoint(e,t,i){if(!(t<=0||t===1/0||t!=t))return Cartesian3.multiplyByScalar(e,t,i)}var directionToPointScratch=new Cartesian3;function computeScaledSpaceDirectionToPoint(e,t){return Cartesian3.equals(t,Cartesian3.ZERO)?t:(e.transformPositionToScaledSpace(t,directionToPointScratch),Cartesian3.normalize(directionToPointScratch,directionToPointScratch))}var QuadraticRealPolynomial={};function addWithCancellationCheck(e,t,i){var r=e+t;return CesiumMath.sign(e)!==CesiumMath.sign(t)&&Math.abs(r/Math.max(Math.abs(e),Math.abs(t)))<i?0:r}QuadraticRealPolynomial.computeDiscriminant=function(e,t,i){return t*t-4*e*i},QuadraticRealPolynomial.computeRealRoots=function(e,t,i){var r;if(0===e)return 0===t?[]:[-i/t];if(0===t){if(0===i)return[0,0];var n=Math.abs(i),a=Math.abs(e);if(n<a&&n/a<CesiumMath.EPSILON14)return[0,0];if(a<n&&a/n<CesiumMath.EPSILON14)return[];if((r=-i/e)<0)return[];var o=Math.sqrt(r);return[-o,o]}if(0===i)return(r=-t/e)<0?[r,0]:[0,r];var s=addWithCancellationCheck(t*t,-(4*e*i),CesiumMath.EPSILON14);if(s<0)return[];var l=-.5*addWithCancellationCheck(t,CesiumMath.sign(t)*Math.sqrt(s),CesiumMath.EPSILON14);return 0<t?[l/e,i/l]:[i/l,l/e]};var CubicRealPolynomial={};function computeRealRoots(e,t,i,r){var n=e,a=t/3,o=i/3,s=r,l=n*o,c=a*s,u=a*a,d=o*o,h=n*o-u,p=n*s-a*o,m=a*s-d,f=4*h*m-p*p;if(f<0){var g,_,y,v=l*d<=u*c?-2*a*(_=h)+(g=n)*p:-(g=s)*p+2*o*(_=m),C=-(v<0?-1:1)*Math.abs(g)*Math.sqrt(-f),S=(y=C-v)/2,T=S<0?-Math.pow(-S,1/3):Math.pow(S,1/3),x=y===C?-T:-_/T,b=_<=0?T+x:-v/(T*T+x*x+_);return l*d<=u*c?[(b-a)/n]:[-s/(b+o)]}var E=h,P=-2*a*h+n*p,A=m,w=-s*p+2*o*m,D=Math.sqrt(f),M=Math.sqrt(3)/2,I=Math.abs(Math.atan2(n*D,-P)/3);b=2*Math.sqrt(-E);var R=Math.cos(I);y=b*R;var O=b*(-R/2-M*Math.sin(I)),L=2*a<y+O?y-a:O-a,F=n,N=L/F,I=Math.abs(Math.atan2(s*D,-w)/3),B=-s,V=(y=(b=2*Math.sqrt(-A))*(R=Math.cos(I)))+(O=b*(-R/2-M*Math.sin(I)))<2*o?y+o:O+o,k=B/V,z=-L*V-F*B,$=(o*z-a*(L*B))/(-a*z+o*(F*V));return N<=$?N<=k?$<=k?[N,$,k]:[N,k,$]:[k,N,$]:N<=k?[$,N,k]:$<=k?[$,k,N]:[k,$,N]}CubicRealPolynomial.computeDiscriminant=function(e,t,i,r){var n=t*t,a=i*i;return 18*e*t*i*r+n*a-27*(e*e)*(r*r)-4*(e*a*i+n*t*r)},CubicRealPolynomial.computeRealRoots=function(e,t,i,r){var n,a;if(0===e)return QuadraticRealPolynomial.computeRealRoots(t,i,r);if(0!==t)return 0===i?0===r?(a=-t/e)<0?[a,0,0]:[0,0,a]:computeRealRoots(e,t,0,r):0===r?0===(n=QuadraticRealPolynomial.computeRealRoots(e,t,i)).length?[0]:n[1]<=0?[n[0],n[1],0]:0<=n[0]?[0,n[0],n[1]]:[n[0],0,n[1]]:computeRealRoots(e,t,i,r);if(0!==i)return 0===r?0===(n=QuadraticRealPolynomial.computeRealRoots(e,0,i)).Length?[0]:[n[0],0,n[1]]:computeRealRoots(e,0,i,r);if(0===r)return[0,0,0];var o=(a=-r/e)<0?-Math.pow(-a,1/3):Math.pow(a,1/3);return[o,o,o]};var QuarticRealPolynomial={};function original(e,t,i,r){var n=e*e,a=t-3*n/8,o=i-t*e/2+n*e/8,s=r-i*e/4+t*n/16-3*n*n/256,l=CubicRealPolynomial.computeRealRoots(1,2*a,a*a-4*s,-o*o);if(0<l.length){var c=-e/4,u=l[l.length-1];if(Math.abs(u)<CesiumMath.EPSILON14){var d=QuadraticRealPolynomial.computeRealRoots(1,a,s);if(2===d.length){var h,p=d[0],m=d[1];if(0<=p&&0<=m){var f=Math.sqrt(p),g=Math.sqrt(m);return[c-g,c-f,c+f,c+g]}if(0<=p&&m<0)return[c-(h=Math.sqrt(p)),c+h];if(p<0&&0<=m)return[c-(h=Math.sqrt(m)),c+h]}return[]}if(0<u){var _=Math.sqrt(u),y=(a+u-o/_)/2,v=(a+u+o/_)/2,C=QuadraticRealPolynomial.computeRealRoots(1,_,y),S=QuadraticRealPolynomial.computeRealRoots(1,-_,v);return 0!==C.length?(C[0]+=c,C[1]+=c,0!==S.length?(S[0]+=c,S[1]+=c,C[1]<=S[0]?[C[0],C[1],S[0],S[1]]:S[1]<=C[0]?[S[0],S[1],C[0],C[1]]:C[0]>=S[0]&&C[1]<=S[1]?[S[0],C[0],C[1],S[1]]:S[0]>=C[0]&&S[1]<=C[1]?[C[0],S[0],S[1],C[1]]:C[0]>S[0]&&C[0]<S[1]?[S[0],C[0],S[1],C[1]]:[C[0],S[0],C[1],S[1]]):C):0!==S.length?(S[0]+=c,S[1]+=c,S):[]}}return[]}function neumark(e,t,i,r){var n=e*e,a=-2*t,o=i*e+t*t-4*r,s=n*r-i*t*e+i*i,l=CubicRealPolynomial.computeRealRoots(1,a,o,s);if(0<l.length){var c,u,d,h,p,m,f,g,_=l[0],y=t-_,v=y*y,C=e/2,S=y/2,T=v-4*r,x=v+4*Math.abs(r),b=n-4*_,E=n+4*Math.abs(_);d=_<0||T*E<b*x?(u=(c=Math.sqrt(b))/2,0===c?0:(e*S-i)/c):(u=0===(h=Math.sqrt(T))?0:(e*S-i)/h,h/2),0==C&&0===u?m=p=0:CesiumMath.sign(C)===CesiumMath.sign(u)?m=_/(p=C+u):p=_/(m=C-u),0==S&&0===d?g=f=0:CesiumMath.sign(S)===CesiumMath.sign(d)?g=r/(f=S+d):f=r/(g=S-d);var P=QuadraticRealPolynomial.computeRealRoots(1,p,f),A=QuadraticRealPolynomial.computeRealRoots(1,m,g);if(0!==P.length)return 0!==A.length?P[1]<=A[0]?[P[0],P[1],A[0],A[1]]:A[1]<=P[0]?[A[0],A[1],P[0],P[1]]:P[0]>=A[0]&&P[1]<=A[1]?[A[0],P[0],P[1],A[1]]:A[0]>=P[0]&&A[1]<=P[1]?[P[0],A[0],A[1],P[1]]:P[0]>A[0]&&P[0]<A[1]?[A[0],P[0],A[1],P[1]]:[P[0],A[0],P[1],A[1]]:P;if(0!==A.length)return A}return[]}function Ray(e,t){t=Cartesian3.clone(defaultValue(t,Cartesian3.ZERO)),Cartesian3.equals(t,Cartesian3.ZERO)||Cartesian3.normalize(t,t),this.origin=Cartesian3.clone(defaultValue(e,Cartesian3.ZERO)),this.direction=t}QuarticRealPolynomial.computeDiscriminant=function(e,t,i,r,n){var a=e*e,o=t*t,s=o*t,l=i*i,c=l*i,u=r*r,d=u*r,h=n*n;return o*l*u-4*s*d-4*e*c*u+18*e*t*i*d-27*a*u*u+256*(a*e)*(h*n)+n*(18*s*i*r-4*o*c+16*e*l*l-80*e*t*l*r-6*e*o*u+144*a*i*u)+h*(144*e*o*i-27*o*o-128*a*l-192*a*t*r)},QuarticRealPolynomial.computeRealRoots=function(e,t,i,r,n){if(Math.abs(e)<CesiumMath.EPSILON15)return CubicRealPolynomial.computeRealRoots(t,i,r,n);var a=t/e,o=i/e,s=r/e,l=n/e,c=a<0?1:0;switch(c+=o<0?c+1:c,c+=s<0?c+1:c,c+=l<0?c+1:c){case 0:return original(a,o,s,l);case 1:case 2:return neumark(a,o,s,l);case 3:case 4:return original(a,o,s,l);case 5:return neumark(a,o,s,l);case 6:case 7:return original(a,o,s,l);case 8:return neumark(a,o,s,l);case 9:case 10:return original(a,o,s,l);case 11:return neumark(a,o,s,l);case 12:case 13:case 14:case 15:return original(a,o,s,l);default:return}},Ray.clone=function(e,t){if(defined(e))return defined(t)?(t.origin=Cartesian3.clone(e.origin),t.direction=Cartesian3.clone(e.direction),t):new Ray(e.origin,e.direction)},Ray.getPoint=function(e,t,i){return defined(i)||(i=new Cartesian3),i=Cartesian3.multiplyByScalar(e.direction,t,i),Cartesian3.add(e.origin,i,i)};var IntersectionTests={rayPlane:function(e,t,i){defined(i)||(i=new Cartesian3);var r=e.origin,n=e.direction,a=t.normal,o=Cartesian3.dot(a,n);if(!(Math.abs(o)<CesiumMath.EPSILON15)){var s=(-t.distance-Cartesian3.dot(a,r))/o;if(!(s<0))return i=Cartesian3.multiplyByScalar(n,s,i),Cartesian3.add(r,i,i)}}},scratchEdge0=new Cartesian3,scratchEdge1=new Cartesian3,scratchPVec=new Cartesian3,scratchTVec=new Cartesian3,scratchQVec=new Cartesian3;IntersectionTests.rayTriangleParametric=function(e,t,i,r,n){n=defaultValue(n,!1);var a,o,s,l=e.origin,c=e.direction,u=Cartesian3.subtract(i,t,scratchEdge0),d=Cartesian3.subtract(r,t,scratchEdge1),h=Cartesian3.cross(c,d,scratchPVec),p=Cartesian3.dot(u,h);if(n){if(p<CesiumMath.EPSILON6)return;if(g=Cartesian3.subtract(l,t,scratchTVec),(m=Cartesian3.dot(g,h))<0||p<m)return;if(a=Cartesian3.cross(g,u,scratchQVec),(o=Cartesian3.dot(c,a))<0||p<m+o)return;s=Cartesian3.dot(d,a)/p}else{if(Math.abs(p)<CesiumMath.EPSILON6)return;var m,f=1/p,g=Cartesian3.subtract(l,t,scratchTVec);if((m=Cartesian3.dot(g,h)*f)<0||1<m)return;if(a=Cartesian3.cross(g,u,scratchQVec),(o=Cartesian3.dot(c,a)*f)<0||1<m+o)return;s=Cartesian3.dot(d,a)*f}return s},IntersectionTests.rayTriangle=function(e,t,i,r,n,a){var o=IntersectionTests.rayTriangleParametric(e,t,i,r,n);if(defined(o)&&!(o<0))return defined(a)||(a=new Cartesian3),Cartesian3.multiplyByScalar(e.direction,o,a),Cartesian3.add(e.origin,a,a)};var scratchLineSegmentTriangleRay=new Ray;function solveQuadratic(e,t,i,r){var n=t*t-4*e*i;if(!(n<0)){if(0<n){var a=1/(2*e),o=Math.sqrt(n),s=(-t+o)*a,l=(-t-o)*a;return s<l?(r.root0=s,r.root1=l):(r.root0=l,r.root1=s),r}var c=-t/(2*e);if(0!=c)return r.root0=r.root1=c,r}}IntersectionTests.lineSegmentTriangle=function(e,t,i,r,n,a,o){var s=scratchLineSegmentTriangleRay;Cartesian3.clone(e,s.origin),Cartesian3.subtract(t,e,s.direction),Cartesian3.normalize(s.direction,s.direction);var l=IntersectionTests.rayTriangleParametric(s,i,r,n,a);if(!(!defined(l)||l<0||l>Cartesian3.distance(e,t)))return defined(o)||(o=new Cartesian3),Cartesian3.multiplyByScalar(s.direction,l,o),Cartesian3.add(s.origin,o,o)};var raySphereRoots={root0:0,root1:0};function raySphere(e,t,i){defined(i)||(i=new Interval);var r=e.origin,n=e.direction,a=t.center,o=t.radius*t.radius,s=Cartesian3.subtract(r,a,scratchPVec),l=solveQuadratic(Cartesian3.dot(n,n),2*Cartesian3.dot(n,s),Cartesian3.magnitudeSquared(s)-o,raySphereRoots);if(defined(l))return i.start=l.root0,i.stop=l.root1,i}IntersectionTests.raySphere=function(e,t,i){if(defined(i=raySphere(e,t,i))&&!(i.stop<0))return i.start=Math.max(i.start,0),i};var scratchLineSegmentRay=new Ray;IntersectionTests.lineSegmentSphere=function(e,t,i,r){var n=scratchLineSegmentRay;Cartesian3.clone(e,n.origin);var a=Cartesian3.subtract(t,e,n.direction),o=Cartesian3.magnitude(a);if(Cartesian3.normalize(a,a),!(!defined(r=raySphere(n,i,r))||r.stop<0||r.start>o))return r.start=Math.max(r.start,0),r.stop=Math.min(r.stop,o),r};var scratchQ=new Cartesian3,scratchW=new Cartesian3;function addWithCancellationCheck$1(e,t,i){var r=e+t;return CesiumMath.sign(e)!==CesiumMath.sign(t)&&Math.abs(r/Math.max(Math.abs(e),Math.abs(t)))<i?0:r}function quadraticVectorExpression(e,t,i,r,n){var a,o=r*r,s=n*n,l=(e[Matrix3.COLUMN1ROW1]-e[Matrix3.COLUMN2ROW2])*s,c=n*(r*addWithCancellationCheck$1(e[Matrix3.COLUMN1ROW0],e[Matrix3.COLUMN0ROW1],CesiumMath.EPSILON15)+t.y),u=e[Matrix3.COLUMN0ROW0]*o+e[Matrix3.COLUMN2ROW2]*s+r*t.x+i,d=s*addWithCancellationCheck$1(e[Matrix3.COLUMN2ROW1],e[Matrix3.COLUMN1ROW2],CesiumMath.EPSILON15),h=n*(r*addWithCancellationCheck$1(e[Matrix3.COLUMN2ROW0],e[Matrix3.COLUMN0ROW2])+t.z),p=[];if(0==h&&0==d){if(0===(a=QuadraticRealPolynomial.computeRealRoots(l,c,u)).length)return p;var m,f,g=a[0],_=Math.sqrt(Math.max(1-g*g,0));return p.push(new Cartesian3(r,n*g,n*-_)),p.push(new Cartesian3(r,n*g,n*_)),2===a.length&&(m=a[1],f=Math.sqrt(Math.max(1-m*m,0)),p.push(new Cartesian3(r,n*m,n*-f)),p.push(new Cartesian3(r,n*m,n*f))),p}var y=h*h,v=d*d,C=h*d,S=l*l+v,T=2*(c*l+C),x=2*u*l+c*c-v+y,b=2*(u*c-C),E=u*u-y;if(0==S&&0==T&&0==x&&0==b)return p;var P=(a=QuarticRealPolynomial.computeRealRoots(S,T,x,b,E)).length;if(0===P)return p;for(var A=0;A<P;++A){var w=a[A],D=w*w,M=Math.max(1-D,0),I=Math.sqrt(M),R=CesiumMath.sign(l)===CesiumMath.sign(u)?addWithCancellationCheck$1(l*D+u,c*w,CesiumMath.EPSILON12):CesiumMath.sign(u)===CesiumMath.sign(c*w)?addWithCancellationCheck$1(l*D,c*w+u,CesiumMath.EPSILON12):addWithCancellationCheck$1(l*D+c*w,u,CesiumMath.EPSILON12),O=R*addWithCancellationCheck$1(d*w,h,CesiumMath.EPSILON15);O<0?p.push(new Cartesian3(r,n*w,n*I)):0<O?p.push(new Cartesian3(r,n*w,n*-I)):0!==I?(p.push(new Cartesian3(r,n*w,n*-I)),p.push(new Cartesian3(r,n*w,n*I)),++A):p.push(new Cartesian3(r,n*w,n*I))}return p}IntersectionTests.rayEllipsoid=function(e,t){var i,r,n=t.oneOverRadii,a=Cartesian3.multiplyComponents(n,e.origin,scratchQ),o=Cartesian3.multiplyComponents(n,e.direction,scratchW),s=Cartesian3.magnitudeSquared(a),l=Cartesian3.dot(a,o);if(1<s){if(0<=l)return;var c,u,d=l*l,h=s-1;if(d<(u=(c=Cartesian3.magnitudeSquared(o))*h))return;if(u<d){i=l*l-u;var p=(r=-l+Math.sqrt(i))/c,m=h/r;return p<m?new Interval(p,m):{start:m,stop:p}}var f=Math.sqrt(h/c);return new Interval(f,f)}return s<1?(h=s-1,i=l*l-(u=(c=Cartesian3.magnitudeSquared(o))*h),new Interval(0,(r=-l+Math.sqrt(i))/c)):l<0?new Interval(0,-l/(c=Cartesian3.magnitudeSquared(o))):void 0};var firstAxisScratch=new Cartesian3,secondAxisScratch=new Cartesian3,thirdAxisScratch=new Cartesian3,referenceScratch=new Cartesian3,bCart=new Cartesian3,bScratch=new Matrix3,btScratch=new Matrix3,diScratch=new Matrix3,dScratch=new Matrix3,cScratch=new Matrix3,tempMatrix=new Matrix3,aScratch=new Matrix3,sScratch=new Cartesian3,closestScratch=new Cartesian3,surfPointScratch=new Cartographic;IntersectionTests.grazingAltitudeLocation=function(e,t){var i=e.origin,r=e.direction;if(!Cartesian3.equals(i,Cartesian3.ZERO)){var n=t.geodeticSurfaceNormal(i,firstAxisScratch);if(0<=Cartesian3.dot(r,n))return i}var a=defined(this.rayEllipsoid(e,t)),o=t.transformPositionToScaledSpace(r,firstAxisScratch),s=Cartesian3.normalize(o,o),l=Cartesian3.mostOrthogonalAxis(o,referenceScratch),c=Cartesian3.normalize(Cartesian3.cross(l,s,secondAxisScratch),secondAxisScratch),u=Cartesian3.normalize(Cartesian3.cross(s,c,thirdAxisScratch),thirdAxisScratch),d=bScratch;d[0]=s.x,d[1]=s.y,d[2]=s.z,d[3]=c.x,d[4]=c.y,d[5]=c.z,d[6]=u.x,d[7]=u.y,d[8]=u.z;var h=Matrix3.transpose(d,btScratch),p=Matrix3.fromScale(t.radii,diScratch),m=Matrix3.fromScale(t.oneOverRadii,dScratch),f=cScratch;f[0]=0,f[1]=-r.z,f[2]=r.y,f[3]=r.z,f[4]=0,f[5]=-r.x,f[6]=-r.y,f[7]=r.x,f[8]=0;var g,_=Matrix3.multiply(Matrix3.multiply(h,m,tempMatrix),f,tempMatrix),y=Matrix3.multiply(Matrix3.multiply(_,p,aScratch),d,aScratch),v=Matrix3.multiplyByVector(_,i,bCart),C=quadraticVectorExpression(y,Cartesian3.negate(v,firstAxisScratch),0,0,1),S=C.length;if(0<S){for(var T=Cartesian3.clone(Cartesian3.ZERO,closestScratch),x=Number.NEGATIVE_INFINITY,b=0;b<S;++b){g=Matrix3.multiplyByVector(p,Matrix3.multiplyByVector(d,C[b],sScratch),sScratch);var E=Cartesian3.normalize(Cartesian3.subtract(g,i,referenceScratch),referenceScratch),P=Cartesian3.dot(E,r);x<P&&(x=P,T=Cartesian3.clone(g,T))}var A=t.cartesianToCartographic(T,surfPointScratch),x=CesiumMath.clamp(x,0,1),w=Cartesian3.magnitude(Cartesian3.subtract(T,i,referenceScratch))*Math.sqrt(1-x*x);return w=a?-w:w,A.height=w,t.cartographicToCartesian(A,new Cartesian3)}};var lineSegmentPlaneDifference=new Cartesian3;function Plane(e,t){this.normal=Cartesian3.clone(e),this.distance=t}IntersectionTests.lineSegmentPlane=function(e,t,i,r){defined(r)||(r=new Cartesian3);var n=Cartesian3.subtract(t,e,lineSegmentPlaneDifference),a=i.normal,o=Cartesian3.dot(a,n);if(!(Math.abs(o)<CesiumMath.EPSILON6)){var s=Cartesian3.dot(a,e),l=-(i.distance+s)/o;if(!(l<0||1<l))return Cartesian3.multiplyByScalar(n,l,r),Cartesian3.add(e,r,r),r}},IntersectionTests.trianglePlaneIntersection=function(e,t,i,r){var n,a,o=r.normal,s=r.distance,l=Cartesian3.dot(o,e)+s<0,c=Cartesian3.dot(o,t)+s<0,u=Cartesian3.dot(o,i)+s<0,d=0;if(d+=l?1:0,d+=c?1:0,1!=(d+=u?1:0)&&2!=d||(n=new Cartesian3,a=new Cartesian3),1==d){if(l)return IntersectionTests.lineSegmentPlane(e,t,r,n),IntersectionTests.lineSegmentPlane(e,i,r,a),{positions:[e,t,i,n,a],indices:[0,3,4,1,2,4,1,4,3]};if(c)return IntersectionTests.lineSegmentPlane(t,i,r,n),IntersectionTests.lineSegmentPlane(t,e,r,a),{positions:[e,t,i,n,a],indices:[1,3,4,2,0,4,2,4,3]};if(u)return IntersectionTests.lineSegmentPlane(i,e,r,n),IntersectionTests.lineSegmentPlane(i,t,r,a),{positions:[e,t,i,n,a],indices:[2,3,4,0,1,4,0,4,3]}}else if(2==d){if(!l)return IntersectionTests.lineSegmentPlane(t,e,r,n),IntersectionTests.lineSegmentPlane(i,e,r,a),{positions:[e,t,i,n,a],indices:[1,2,4,1,4,3,0,3,4]};if(!c)return IntersectionTests.lineSegmentPlane(i,t,r,n),IntersectionTests.lineSegmentPlane(e,t,r,a),{positions:[e,t,i,n,a],indices:[2,0,4,2,4,3,1,3,4]};if(!u)return IntersectionTests.lineSegmentPlane(e,i,r,n),IntersectionTests.lineSegmentPlane(t,i,r,a),{positions:[e,t,i,n,a],indices:[0,1,4,0,4,3,2,3,4]}}},Plane.fromPointNormal=function(e,t,i){var r=-Cartesian3.dot(t,e);return defined(i)?(Cartesian3.clone(t,i.normal),i.distance=r,i):new Plane(t,r)};var scratchNormal=new Cartesian3;Plane.fromCartesian4=function(e,t){var i=Cartesian3.fromCartesian4(e,scratchNormal),r=e.w;return defined(t)?(Cartesian3.clone(i,t.normal),t.distance=r,t):new Plane(i,r)},Plane.getPointDistance=function(e,t){return Cartesian3.dot(e.normal,t)+e.distance};var scratchCartesian$1=new Cartesian3;Plane.projectPointOntoPlane=function(e,t,i){defined(i)||(i=new Cartesian3);var r=Plane.getPointDistance(e,t),n=Cartesian3.multiplyByScalar(e.normal,r,scratchCartesian$1);return Cartesian3.subtract(t,n,i)};var scratchPosition=new Cartesian3;function binarySearch(e,t,i){for(var r,n,a=0,o=e.length-1;a<=o;)if((n=i(e[r=~~((a+o)/2)],t))<0)a=1+r;else{if(!(0<n))return r;o=r-1}return~(o+1)}function EarthOrientationParametersSample(e,t,i,r,n){this.xPoleWander=e,this.yPoleWander=t,this.xPoleOffset=i,this.yPoleOffset=r,this.ut1MinusUtc=n}function sprintf(){function v(e,t,i,r){i=i||" ";var n=e.length>=t?"":Array(1+t-e.length>>>0).join(i);return r?e+n:n+e}function C(e,t,i,r,n,a){var o=r-e.length;return 0<o&&(e=i||!n?v(e,r,a,i):e.slice(0,t.length)+v("",o,"0",!0)+e.slice(t.length)),e}function S(e,t,i,r,n,a,o){var s=e>>>0;return e=(i=i&&s&&{2:"0b",8:"0",16:"0x"}[t]||"")+v(s.toString(t),a||0,"0",!1),C(e,i,r,n,o)}function T(e,t,i,r,n,a){return null!=r&&(e=e.slice(0,r)),C(e,"",t,i,n,a)}var x=arguments,b=0,e=x[b++];return e.replace(/%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g,function(e,t,i,r,n,a,o){var s,l,c,u,d;if("%%"==e)return"%";for(var h=!1,p="",m=!1,f=!1,g=" ",_=i.length,y=0;i&&y<_;y++)switch(i.charAt(y)){case" ":p=" ";break;case"+":p="+";break;case"-":h=!0;break;case"'":g=i.charAt(y+1);break;case"0":m=!0;break;case"#":f=!0}if((r=r?"*"==r?+x[b++]:"*"==r.charAt(0)?+x[r.slice(1,-1)]:+r:0)<0&&(r=-r,h=!0),!isFinite(r))throw new Error("sprintf: (minimum-)width must be finite");switch(a=a?"*"==a?+x[b++]:"*"==a.charAt(0)?+x[a.slice(1,-1)]:+a:-1<"fFeE".indexOf(o)?6:"d"==o?0:void 0,d=t?x[t.slice(0,-1)]:x[b++],o){case"s":return T(String(d),h,r,a,m,g);case"c":return T(String.fromCharCode(+d),h,r,a,m);case"b":return S(d,2,f,h,r,a,m);case"o":return S(d,8,f,h,r,a,m);case"x":return S(d,16,f,h,r,a,m);case"X":return S(d,16,f,h,r,a,m).toUpperCase();case"u":return S(d,10,f,h,r,a,m);case"i":case"d":return s=+d||0,d=(l=(s=Math.round(s-s%1))<0?"-":p)+v(String(Math.abs(s)),a,"0",!1),C(d,l,h,r,m);case"e":case"E":case"f":case"F":case"g":case"G":return l=(s=+d)<0?"-":p,c=["toExponential","toFixed","toPrecision"]["efg".indexOf(o.toLowerCase())],u=["toString","toUpperCase"]["eEfFgG".indexOf(o)%2],d=l+Math.abs(s)[c](a),C(d,l,h,r,m)[u]();default:return e}})}function GregorianDate(e,t,i,r,n,a,o,s){this.year=e,this.month=t,this.day=i,this.hour=r,this.minute=n,this.second=a,this.millisecond=o,this.isLeapSecond=s}function isLeapYear(e){return e%4==0&&e%100!=0||e%400==0}function LeapSecond(e,t){this.julianDate=e,this.offset=t}Plane.transform=function(e,t,i){return Matrix4.multiplyByPointAsVector(t,e.normal,scratchNormal),Cartesian3.normalize(scratchNormal,scratchNormal),Cartesian3.multiplyByScalar(e.normal,-e.distance,scratchPosition),Matrix4.multiplyByPoint(t,scratchPosition,scratchPosition),Plane.fromPointNormal(scratchPosition,scratchNormal,i)},Plane.clone=function(e,t){return defined(t)?(Cartesian3.clone(e.normal,t.normal),t.distance=e.distance,t):new Plane(e.normal,e.distance)},Plane.equals=function(e,t){return e.distance===t.distance&&Cartesian3.equals(e.normal,t.normal)},Plane.ORIGIN_XY_PLANE=Object.freeze(new Plane(Cartesian3.UNIT_Z,0)),Plane.ORIGIN_YZ_PLANE=Object.freeze(new Plane(Cartesian3.UNIT_X,0)),Plane.ORIGIN_ZX_PLANE=Object.freeze(new Plane(Cartesian3.UNIT_Y,0));var TimeConstants={SECONDS_PER_MILLISECOND:.001,SECONDS_PER_MINUTE:60,MINUTES_PER_HOUR:60,HOURS_PER_DAY:24,SECONDS_PER_HOUR:3600,MINUTES_PER_DAY:1440,SECONDS_PER_DAY:86400,DAYS_PER_JULIAN_CENTURY:36525,PICOSECOND:1e-9,MODIFIED_JULIAN_DATE_DIFFERENCE:2400000.5},TimeConstants$1=Object.freeze(TimeConstants),TimeStandard={UTC:0,TAI:1},TimeStandard$1=Object.freeze(TimeStandard),gregorianDateScratch=new GregorianDate,daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31],daysInLeapFeburary=29;function compareLeapSecondDates(e,t){return JulianDate.compare(e.julianDate,t.julianDate)}var binarySearchScratchLeapSecond=new LeapSecond;function convertUtcToTai(e){binarySearchScratchLeapSecond.julianDate=e;var t=JulianDate.leapSeconds,i=binarySearch(t,binarySearchScratchLeapSecond,compareLeapSecondDates);i<0&&(i=~i),i>=t.length&&(i=t.length-1);var r=t[i].offset;0<i&&r<JulianDate.secondsDifference(t[i].julianDate,e)&&(r=t[--i].offset),JulianDate.addSeconds(e,r,e)}function convertTaiToUtc(e,t){binarySearchScratchLeapSecond.julianDate=e;var i=JulianDate.leapSeconds,r=binarySearch(i,binarySearchScratchLeapSecond,compareLeapSecondDates);if(r<0&&(r=~r),0===r)return JulianDate.addSeconds(e,-i[0].offset,t);if(r>=i.length)return JulianDate.addSeconds(e,-i[r-1].offset,t);var n=JulianDate.secondsDifference(i[r].julianDate,e);return 0===n?JulianDate.addSeconds(e,-i[r].offset,t):n<=1?void 0:JulianDate.addSeconds(e,-i[--r].offset,t)}function setComponents(e,t,i){var r=t/TimeConstants$1.SECONDS_PER_DAY|0;return e+=r,(t-=TimeConstants$1.SECONDS_PER_DAY*r)<0&&(e--,t+=TimeConstants$1.SECONDS_PER_DAY),i.dayNumber=e,i.secondsOfDay=t,i}function computeJulianDateComponents(e,t,i,r,n,a,o){var s=(t-14)/12|0,l=e+4800+s,c=(1461*l/4|0)+(367*(t-2-12*s)/12|0)-(3*((l+100)/100|0)/4|0)+i-32075;(r-=12)<0&&(r+=24);var u=a+(r*TimeConstants$1.SECONDS_PER_HOUR+n*TimeConstants$1.SECONDS_PER_MINUTE+o*TimeConstants$1.SECONDS_PER_MILLISECOND);return 43200<=u&&--c,[c,u]}var matchCalendarYear=/^(\d{4})$/,matchCalendarMonth=/^(\d{4})-(\d{2})$/,matchOrdinalDate=/^(\d{4})-?(\d{3})$/,matchWeekDate=/^(\d{4})-?W(\d{2})-?(\d{1})?$/,matchCalendarDate=/^(\d{4})-?(\d{2})-?(\d{2})$/,utcOffset=/([Z+\-])?(\d{2})?:?(\d{2})?$/,matchHours=/^(\d{2})(\.\d+)?/.source+utcOffset.source,matchHoursMinutes=/^(\d{2}):?(\d{2})(\.\d+)?/.source+utcOffset.source,matchHoursMinutesSeconds=/^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source+utcOffset.source;function JulianDate(e,t,i){this.dayNumber=void 0,this.secondsOfDay=void 0,e=defaultValue(e,0),t=defaultValue(t,0),i=defaultValue(i,TimeStandard$1.UTC);var r=0|e;setComponents(r,t+=(e-r)*TimeConstants$1.SECONDS_PER_DAY,this),i===TimeStandard$1.UTC&&convertUtcToTai(this)}JulianDate.fromGregorianDate=function(e,t){var i=computeJulianDateComponents(e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond);return defined(t)?(setComponents(i[0],i[1],t),convertUtcToTai(t),t):new JulianDate(i[0],i[1],TimeStandard$1.UTC)},JulianDate.fromDate=function(e,t){var i=computeJulianDateComponents(e.getUTCFullYear(),e.getUTCMonth()+1,e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds());return defined(t)?(setComponents(i[0],i[1],t),convertUtcToTai(t),t):new JulianDate(i[0],i[1],TimeStandard$1.UTC)},JulianDate.fromIso8601=function(e,t){var i,r,n,a,o,s=(e=e.replace(",",".")).split("T"),l=1,c=1,u=0,d=0,h=0,p=0,m=s[0],f=s[1];if(null!==(s=m.match(matchCalendarDate))?(i=+s[1],l=+s[2],c=+s[3]):null!==(s=m.match(matchCalendarMonth))?(i=+s[1],l=+s[2]):null!==(s=m.match(matchCalendarYear))?i=+s[1]:(null!==(s=m.match(matchOrdinalDate))?(i=+s[1],a=+s[2],n=isLeapYear(i)):null!==(s=m.match(matchWeekDate))&&(i=+s[1],a=7*+s[2]+(+s[3]||0)-new Date(Date.UTC(i,0,4)).getUTCDay()-3),(r=new Date(Date.UTC(i,0,1))).setUTCDate(a),l=r.getUTCMonth()+1,c=r.getUTCDate()),n=isLeapYear(i),defined(f)){null!==(s=f.match(matchHoursMinutesSeconds))?(u=+s[1],d=+s[2],h=+s[3],p=1e3*(s[4]||0),o=5):null!==(s=f.match(matchHoursMinutes))?(u=+s[1],d=+s[2],h=60*(s[3]||0),o=4):null!==(s=f.match(matchHours))&&(u=+s[1],d=60*(s[2]||0),o=3);var g=s[o],_=+s[o+1],y=+(s[o+2]||0);switch(g){case"+":u-=_,d-=y;break;case"-":u+=_,d+=y;break;case"Z":break;default:d+=new Date(Date.UTC(i,l-1,c,u,d)).getTimezoneOffset()}}var v=60===h;for(v&&h--;60<=d;)d-=60,u++;for(;24<=u;)u-=24,c++;for(r=n&&2===l?daysInLeapFeburary:daysInMonth[l-1];r<c;)c-=r,12<++l&&(l-=12,i++),r=n&&2===l?daysInLeapFeburary:daysInMonth[l-1];for(;d<0;)d+=60,u--;for(;u<0;)u+=24,c--;for(;c<1;)--l<1&&(l+=12,i--),c+=r=n&&2===l?daysInLeapFeburary:daysInMonth[l-1];var C=computeJulianDateComponents(i,l,c,u,d,h,p);return defined(t)?(setComponents(C[0],C[1],t),convertUtcToTai(t)):t=new JulianDate(C[0],C[1],TimeStandard$1.UTC),v&&JulianDate.addSeconds(t,1,t),t},JulianDate.now=function(e){return JulianDate.fromDate(new Date,e)};var toGregorianDateScratch=new JulianDate(0,0,TimeStandard$1.TAI);function EarthOrientationParameters(e){var t,i;e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._dates=void 0,this._samples=void 0,this._dateColumn=-1,this._xPoleWanderRadiansColumn=-1,this._yPoleWanderRadiansColumn=-1,this._ut1MinusUtcSecondsColumn=-1,this._xCelestialPoleOffsetRadiansColumn=-1,this._yCelestialPoleOffsetRadiansColumn=-1,this._taiMinusUtcSecondsColumn=-1,this._columnCount=0,this._lastIndex=-1,this._downloadPromise=void 0,this._dataError=void 0,this._addNewLeapSeconds=defaultValue(e.addNewLeapSeconds,!0),defined(e.data)?onDataReady(this,e.data):defined(e.url)?(t=Resource.createIfNeeded(e.url),(i=this)._downloadPromise=t.fetchJson().then(function(e){onDataReady(i,e)}).otherwise(function(){i._dataError="An error occurred while retrieving the EOP data from the URL "+t.url+"."})):onDataReady(this,{columnNames:["dateIso8601","modifiedJulianDateUtc","xPoleWanderRadians","yPoleWanderRadians","ut1MinusUtcSeconds","lengthOfDayCorrectionSeconds","xCelestialPoleOffsetRadians","yCelestialPoleOffsetRadians","taiMinusUtcSeconds"],samples:[]})}function compareLeapSecondDates$1(e,t){return JulianDate.compare(e.julianDate,t)}function onDataReady(e,t){if(defined(t.columnNames))if(defined(t.samples)){var i=t.columnNames.indexOf("modifiedJulianDateUtc"),r=t.columnNames.indexOf("xPoleWanderRadians"),n=t.columnNames.indexOf("yPoleWanderRadians"),a=t.columnNames.indexOf("ut1MinusUtcSeconds"),o=t.columnNames.indexOf("xCelestialPoleOffsetRadians"),s=t.columnNames.indexOf("yCelestialPoleOffsetRadians"),l=t.columnNames.indexOf("taiMinusUtcSeconds");if(i<0||r<0||n<0||a<0||o<0||s<0||l<0)e._dataError="Error in loaded EOP data: The columnNames property must include modifiedJulianDateUtc, xPoleWanderRadians, yPoleWanderRadians, ut1MinusUtcSeconds, xCelestialPoleOffsetRadians, yCelestialPoleOffsetRadians, and taiMinusUtcSeconds columns";else{var c,u=e._samples=t.samples,d=e._dates=[];e._dateColumn=i,e._xPoleWanderRadiansColumn=r,e._yPoleWanderRadiansColumn=n,e._ut1MinusUtcSecondsColumn=a,e._xCelestialPoleOffsetRadiansColumn=o,e._yCelestialPoleOffsetRadiansColumn=s,e._taiMinusUtcSecondsColumn=l,e._columnCount=t.columnNames.length,e._lastIndex=void 0;for(var h=e._addNewLeapSeconds,p=0,m=u.length;p<m;p+=e._columnCount){var f,g,_,y=u[p+i],v=u[p+l],C=new JulianDate(y+TimeConstants$1.MODIFIED_JULIAN_DATE_DIFFERENCE,v,TimeStandard$1.TAI);d.push(C),h&&(v===c||!defined(c)||(g=binarySearch(f=JulianDate.leapSeconds,C,compareLeapSecondDates$1))<0&&(_=new LeapSecond(C,v),f.splice(~g,0,_)),c=v)}}}else e._dataError="Error in loaded EOP data: The samples property is required.";else e._dataError="Error in loaded EOP data: The columnNames property is required."}function fillResultFromIndex(e,t,i,r,n){var a=i*r;n.xPoleWander=t[a+e._xPoleWanderRadiansColumn],n.yPoleWander=t[a+e._yPoleWanderRadiansColumn],n.xPoleOffset=t[a+e._xCelestialPoleOffsetRadiansColumn],n.yPoleOffset=t[a+e._yCelestialPoleOffsetRadiansColumn],n.ut1MinusUtc=t[a+e._ut1MinusUtcSecondsColumn]}function linearInterp(e,t,i){return t+e*(i-t)}function interpolate(e,t,i,r,n,a,o){var s=e._columnCount;if(a>t.length-1)return o.xPoleWander=0,o.yPoleWander=0,o.xPoleOffset=0,o.yPoleOffset=0,o.ut1MinusUtc=0,o;var l=t[n],c=t[a];if(l.equals(c)||r.equals(l))return fillResultFromIndex(e,i,n,s,o),o;if(r.equals(c))return fillResultFromIndex(e,i,a,s,o),o;var u,d,h=JulianDate.secondsDifference(r,l)/JulianDate.secondsDifference(c,l),p=n*s,m=a*s,f=i[p+e._ut1MinusUtcSecondsColumn],g=i[m+e._ut1MinusUtcSecondsColumn],_=g-f;return!(.5<_||_<-.5)||(u=i[p+e._taiMinusUtcSecondsColumn])!==(d=i[m+e._taiMinusUtcSecondsColumn])&&(c.equals(r)?f=g:g-=d-u),o.xPoleWander=linearInterp(h,i[p+e._xPoleWanderRadiansColumn],i[m+e._xPoleWanderRadiansColumn]),o.yPoleWander=linearInterp(h,i[p+e._yPoleWanderRadiansColumn],i[m+e._yPoleWanderRadiansColumn]),o.xPoleOffset=linearInterp(h,i[p+e._xCelestialPoleOffsetRadiansColumn],i[m+e._xCelestialPoleOffsetRadiansColumn]),o.yPoleOffset=linearInterp(h,i[p+e._yCelestialPoleOffsetRadiansColumn],i[m+e._yCelestialPoleOffsetRadiansColumn]),o.ut1MinusUtc=linearInterp(h,f,g),o}function HeadingPitchRoll(e,t,i){this.heading=defaultValue(e,0),this.pitch=defaultValue(t,0),this.roll=defaultValue(i,0)}function Iau2006XysSample(e,t,i){this.x=e,this.y=t,this.s=i}function Iau2006XysData(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._xysFileUrlTemplate=Resource.createIfNeeded(e.xysFileUrlTemplate),this._interpolationOrder=defaultValue(e.interpolationOrder,9),this._sampleZeroJulianEphemerisDate=defaultValue(e.sampleZeroJulianEphemerisDate,2442396.5),this._sampleZeroDateTT=new JulianDate(this._sampleZeroJulianEphemerisDate,0,TimeStandard$1.TAI),this._stepSizeDays=defaultValue(e.stepSizeDays,1),this._samplesPerXysFile=defaultValue(e.samplesPerXysFile,1e3),this._totalSamples=defaultValue(e.totalSamples,27426),this._samples=new Array(3*this._totalSamples),this._chunkDownloadsInProgress=[];for(var t=this._interpolationOrder,i=this._denominators=new Array(t+1),r=this._xTable=new Array(t+1),n=Math.pow(this._stepSizeDays,t),a=0;a<=t;++a){i[a]=n,r[a]=a*this._stepSizeDays;for(var o=0;o<=t;++o)o!==a&&(i[a]*=a-o);i[a]=1/i[a]}this._work=new Array(t+1),this._coef=new Array(t+1)}JulianDate.toGregorianDate=function(e,t){var i=!1,r=convertTaiToUtc(e,toGregorianDateScratch);defined(r)||(JulianDate.addSeconds(e,-1,toGregorianDateScratch),r=convertTaiToUtc(toGregorianDateScratch,toGregorianDateScratch),i=!0);var n=r.dayNumber,a=r.secondsOfDay;43200<=a&&(n+=1);var o=n+68569|0,s=4*o/146097|0,l=4e3*(1+(o=o-((146097*s+3)/4|0)|0))/1461001|0,c=80*(o=o-(1461*l/4|0)+31|0)/2447|0,u=o-(2447*c/80|0)|0,d=2+c-12*(o=c/11|0)|0,h=100*(s-49)+l+o|0,p=a/TimeConstants$1.SECONDS_PER_HOUR|0,m=a-p*TimeConstants$1.SECONDS_PER_HOUR,f=m/TimeConstants$1.SECONDS_PER_MINUTE|0,g=0|(m-=f*TimeConstants$1.SECONDS_PER_MINUTE),_=(m-g)/TimeConstants$1.SECONDS_PER_MILLISECOND;return 23<(p+=12)&&(p-=24),i&&(g+=1),defined(t)?(t.year=h,t.month=d,t.day=u,t.hour=p,t.minute=f,t.second=g,t.millisecond=_,t.isLeapSecond=i,t):new GregorianDate(h,d,u,p,f,g,_,i)},JulianDate.toDate=function(e){var t=JulianDate.toGregorianDate(e,gregorianDateScratch),i=t.second;return t.isLeapSecond&&--i,new Date(Date.UTC(t.year,t.month-1,t.day,t.hour,t.minute,i,t.millisecond))},JulianDate.toIso8601=function(e,t){var i=JulianDate.toGregorianDate(e,gregorianDateScratch),r=i.year,n=i.month,a=i.day,o=i.hour,s=i.minute,l=i.second,c=i.millisecond;return 1e4===r&&1===n&&1===a&&0===o&&0===s&&0===l&&0===c&&(r=9999,n=12,a=31,o=24),defined(t)||0===c?defined(t)&&0!==t?sprintf("%04d-%02d-%02dT%02d:%02d:%02d.%sZ",r,n,a,o,s,l,(.01*c).toFixed(t).replace(".","").slice(0,t)):sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ",r,n,a,o,s,l):sprintf("%04d-%02d-%02dT%02d:%02d:%02d.%sZ",r,n,a,o,s,l,(.01*c).toString().replace(".",""))},JulianDate.clone=function(e,t){if(defined(e))return defined(t)?(t.dayNumber=e.dayNumber,t.secondsOfDay=e.secondsOfDay,t):new JulianDate(e.dayNumber,e.secondsOfDay,TimeStandard$1.TAI)},JulianDate.compare=function(e,t){var i=e.dayNumber-t.dayNumber;return 0!=i?i:e.secondsOfDay-t.secondsOfDay},JulianDate.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.dayNumber===t.dayNumber&&e.secondsOfDay===t.secondsOfDay},JulianDate.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(JulianDate.secondsDifference(e,t))<=i},JulianDate.totalDays=function(e){return e.dayNumber+e.secondsOfDay/TimeConstants$1.SECONDS_PER_DAY},JulianDate.secondsDifference=function(e,t){return(e.dayNumber-t.dayNumber)*TimeConstants$1.SECONDS_PER_DAY+(e.secondsOfDay-t.secondsOfDay)},JulianDate.daysDifference=function(e,t){return e.dayNumber-t.dayNumber+(e.secondsOfDay-t.secondsOfDay)/TimeConstants$1.SECONDS_PER_DAY},JulianDate.computeTaiMinusUtc=function(e){binarySearchScratchLeapSecond.julianDate=e;var t=JulianDate.leapSeconds,i=binarySearch(t,binarySearchScratchLeapSecond,compareLeapSecondDates);return i<0&&(i=~i,--i<0&&(i=0)),t[i].offset},JulianDate.addSeconds=function(e,t,i){return setComponents(e.dayNumber,e.secondsOfDay+t,i)},JulianDate.addMinutes=function(e,t,i){var r=e.secondsOfDay+t*TimeConstants$1.SECONDS_PER_MINUTE;return setComponents(e.dayNumber,r,i)},JulianDate.addHours=function(e,t,i){var r=e.secondsOfDay+t*TimeConstants$1.SECONDS_PER_HOUR;return setComponents(e.dayNumber,r,i)},JulianDate.addDays=function(e,t,i){return setComponents(e.dayNumber+t,e.secondsOfDay,i)},JulianDate.lessThan=function(e,t){return JulianDate.compare(e,t)<0},JulianDate.lessThanOrEquals=function(e,t){return JulianDate.compare(e,t)<=0},JulianDate.greaterThan=function(e,t){return 0<JulianDate.compare(e,t)},JulianDate.greaterThanOrEquals=function(e,t){return 0<=JulianDate.compare(e,t)},JulianDate.prototype.clone=function(e){return JulianDate.clone(this,e)},JulianDate.prototype.equals=function(e){return JulianDate.equals(this,e)},JulianDate.prototype.equalsEpsilon=function(e,t){return JulianDate.equalsEpsilon(this,e,t)},JulianDate.prototype.toString=function(){return JulianDate.toIso8601(this)},JulianDate.leapSeconds=[new LeapSecond(new JulianDate(2441317,43210,TimeStandard$1.TAI),10),new LeapSecond(new JulianDate(2441499,43211,TimeStandard$1.TAI),11),new LeapSecond(new JulianDate(2441683,43212,TimeStandard$1.TAI),12),new LeapSecond(new JulianDate(2442048,43213,TimeStandard$1.TAI),13),new LeapSecond(new JulianDate(2442413,43214,TimeStandard$1.TAI),14),new LeapSecond(new JulianDate(2442778,43215,TimeStandard$1.TAI),15),new LeapSecond(new JulianDate(2443144,43216,TimeStandard$1.TAI),16),new LeapSecond(new JulianDate(2443509,43217,TimeStandard$1.TAI),17),new LeapSecond(new JulianDate(2443874,43218,TimeStandard$1.TAI),18),new LeapSecond(new JulianDate(2444239,43219,TimeStandard$1.TAI),19),new LeapSecond(new JulianDate(2444786,43220,TimeStandard$1.TAI),20),new LeapSecond(new JulianDate(2445151,43221,TimeStandard$1.TAI),21),new LeapSecond(new JulianDate(2445516,43222,TimeStandard$1.TAI),22),new LeapSecond(new JulianDate(2446247,43223,TimeStandard$1.TAI),23),new LeapSecond(new JulianDate(2447161,43224,TimeStandard$1.TAI),24),new LeapSecond(new JulianDate(2447892,43225,TimeStandard$1.TAI),25),new LeapSecond(new JulianDate(2448257,43226,TimeStandard$1.TAI),26),new LeapSecond(new JulianDate(2448804,43227,TimeStandard$1.TAI),27),new LeapSecond(new JulianDate(2449169,43228,TimeStandard$1.TAI),28),new LeapSecond(new JulianDate(2449534,43229,TimeStandard$1.TAI),29),new LeapSecond(new JulianDate(2450083,43230,TimeStandard$1.TAI),30),new LeapSecond(new JulianDate(2450630,43231,TimeStandard$1.TAI),31),new LeapSecond(new JulianDate(2451179,43232,TimeStandard$1.TAI),32),new LeapSecond(new JulianDate(2453736,43233,TimeStandard$1.TAI),33),new LeapSecond(new JulianDate(2454832,43234,TimeStandard$1.TAI),34),new LeapSecond(new JulianDate(2456109,43235,TimeStandard$1.TAI),35),new LeapSecond(new JulianDate(2457204,43236,TimeStandard$1.TAI),36),new LeapSecond(new JulianDate(2457754,43237,TimeStandard$1.TAI),37)],EarthOrientationParameters.NONE=Object.freeze({getPromiseToLoad:function(){return when.resolve()},compute:function(e,t){return defined(t)?(t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0):t=new EarthOrientationParametersSample(0,0,0,0,0),t}}),EarthOrientationParameters.prototype.getPromiseToLoad=function(){return when(this._downloadPromise)},EarthOrientationParameters.prototype.compute=function(e,t){if(defined(this._samples)){if(defined(t)||(t=new EarthOrientationParametersSample(0,0,0,0,0)),0===this._samples.length)return t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0,t;var i=this._dates,r=this._lastIndex,n=0,a=0;if(defined(r)){var o=i[r],s=i[r+1],l=JulianDate.lessThanOrEquals(o,e),c=!defined(s),u=c||JulianDate.greaterThanOrEquals(s,e);if(l&&u)return n=r,!c&&s.equals(e)&&++n,a=n+1,interpolate(this,i,this._samples,e,n,a,t),t}var d=binarySearch(i,e,JulianDate.compare,this._dateColumn);return 0<=d?(d<i.length-1&&i[d+1].equals(e)&&++d,a=n=d):(n=(a=~d)-1)<0&&(n=0),this._lastIndex=n,interpolate(this,i,this._samples,e,n,a,t),t}if(defined(this._dataError))throw new RuntimeError(this._dataError)},HeadingPitchRoll.fromQuaternion=function(e,t){defined(t)||(t=new HeadingPitchRoll);var i=2*(e.w*e.y-e.z*e.x),r=1-2*(e.x*e.x+e.y*e.y),n=2*(e.w*e.x+e.y*e.z),a=1-2*(e.y*e.y+e.z*e.z),o=2*(e.w*e.z+e.x*e.y);return t.heading=-Math.atan2(o,a),t.roll=Math.atan2(n,r),t.pitch=-CesiumMath.asinClamped(i),t},HeadingPitchRoll.fromDegrees=function(e,t,i,r){return defined(r)||(r=new HeadingPitchRoll),r.heading=e*CesiumMath.RADIANS_PER_DEGREE,r.pitch=t*CesiumMath.RADIANS_PER_DEGREE,r.roll=i*CesiumMath.RADIANS_PER_DEGREE,r},HeadingPitchRoll.clone=function(e,t){if(defined(e))return defined(t)?(t.heading=e.heading,t.pitch=e.pitch,t.roll=e.roll,t):new HeadingPitchRoll(e.heading,e.pitch,e.roll)},HeadingPitchRoll.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.heading===t.heading&&e.pitch===t.pitch&&e.roll===t.roll},HeadingPitchRoll.equalsEpsilon=function(e,t,i,r){return e===t||defined(e)&&defined(t)&&CesiumMath.equalsEpsilon(e.heading,t.heading,i,r)&&CesiumMath.equalsEpsilon(e.pitch,t.pitch,i,r)&&CesiumMath.equalsEpsilon(e.roll,t.roll,i,r)},HeadingPitchRoll.prototype.clone=function(e){return HeadingPitchRoll.clone(this,e)},HeadingPitchRoll.prototype.equals=function(e){return HeadingPitchRoll.equals(this,e)},HeadingPitchRoll.prototype.equalsEpsilon=function(e,t,i){return HeadingPitchRoll.equalsEpsilon(this,e,t,i)},HeadingPitchRoll.prototype.toString=function(){return"("+this.heading+", "+this.pitch+", "+this.roll+")"};var julianDateScratch=new JulianDate(0,0,TimeStandard$1.TAI),_supportsFullscreen;function getDaysSinceEpoch(e,t,i){var r=julianDateScratch;return r.dayNumber=t,r.secondsOfDay=i,JulianDate.daysDifference(r,e._sampleZeroDateTT)}function requestXysChunk(o,s){if(o._chunkDownloadsInProgress[s])return o._chunkDownloadsInProgress[s];var l=when.defer();o._chunkDownloadsInProgress[s]=l;var e=o._xysFileUrlTemplate;return when((defined(e)?e.getDerivedResource({templateValues:{0:s}}):new Resource({url:buildModuleUrl("Assets/IAU2006_XYS/IAU2006_XYS_"+s+".json")})).fetchJson(),function(e){o._chunkDownloadsInProgress[s]=!1;for(var t=o._samples,i=e.samples,r=s*o._samplesPerXysFile*3,n=0,a=i.length;n<a;++n)t[r+n]=i[n];l.resolve()}),l.promise}Iau2006XysData.prototype.preload=function(e,t,i,r){var n=getDaysSinceEpoch(this,e,t),a=getDaysSinceEpoch(this,i,r),o=n/this._stepSizeDays-this._interpolationOrder/2|0;o<0&&(o=0);var s=a/this._stepSizeDays-this._interpolationOrder/2|0+this._interpolationOrder;s>=this._totalSamples&&(s=this._totalSamples-1);for(var l=o/this._samplesPerXysFile|0,c=s/this._samplesPerXysFile|0,u=[],d=l;d<=c;++d)u.push(requestXysChunk(this,d));return when.all(u)},Iau2006XysData.prototype.computeXysRadians=function(e,t,i){var r=getDaysSinceEpoch(this,e,t);if(!(r<0)){var n=r/this._stepSizeDays|0;if(!(n>=this._totalSamples)){var a=this._interpolationOrder,o=n-(a/2|0);o<0&&(o=0);var s=o+a;s>=this._totalSamples&&(o=(s=this._totalSamples-1)-a)<0&&(o=0);var l=!1,c=this._samples;if(defined(c[3*o])||(requestXysChunk(this,o/this._samplesPerXysFile|0),l=!0),defined(c[3*s])||(requestXysChunk(this,s/this._samplesPerXysFile|0),l=!0),!l){defined(i)?(i.x=0,i.y=0,i.s=0):i=new Iau2006XysSample(0,0,0);for(var u,d=r-o*this._stepSizeDays,h=this._work,p=this._denominators,m=this._coef,f=this._xTable,g=0;g<=a;++g)h[g]=d-f[g];for(g=0;g<=a;++g){for(m[g]=1,u=0;u<=a;++u)u!==g&&(m[g]*=h[u]);m[g]*=p[g];var _=3*(o+g);i.x+=m[g]*c[_++],i.y+=m[g]*c[_++],i.s+=m[g]*c[_]}return i}}}};var _names={requestFullscreen:void 0,exitFullscreen:void 0,fullscreenEnabled:void 0,fullscreenElement:void 0,fullscreenchange:void 0,fullscreenerror:void 0},Fullscreen={},theNavigator,isChromeResult,chromeVersionResult,isSafariResult,safariVersionResult,isWebkitResult,webkitVersionResult,isInternetExplorerResult,internetExplorerVersionResult,isEdgeResult,edgeVersionResult,isFirefoxResult,firefoxVersionResult,isWindowsResult,hasPointerEvents,imageRenderingValueResult,supportsImageRenderingPixelatedResult;function extractVersion(e){for(var t=e.split("."),i=0,r=t.length;i<r;++i)t[i]=parseInt(t[i],10);return t}function isChrome(){var e;return defined(isChromeResult)||(isChromeResult=!1,isEdge()||null!==(e=/ Chrome\/([\.0-9]+)/.exec(theNavigator.userAgent))&&(isChromeResult=!0,chromeVersionResult=extractVersion(e[1]))),isChromeResult}function chromeVersion(){return isChrome()&&chromeVersionResult}function isSafari(){var e;return defined(isSafariResult)||(isSafariResult=!1,isChrome()||isEdge()||!/ Safari\/[\.0-9]+/.test(theNavigator.userAgent)||null!==(e=/ Version\/([\.0-9]+)/.exec(theNavigator.userAgent))&&(isSafariResult=!0,safariVersionResult=extractVersion(e[1]))),isSafariResult}function safariVersion(){return isSafari()&&safariVersionResult}function isWebkit(){var e;return defined(isWebkitResult)||(isWebkitResult=!1,null!==(e=/ AppleWebKit\/([\.0-9]+)(\+?)/.exec(theNavigator.userAgent))&&(isWebkitResult=!0,(webkitVersionResult=extractVersion(e[1])).isNightly=!!e[2])),isWebkitResult}function webkitVersion(){return isWebkit()&&webkitVersionResult}function isInternetExplorer(){var e;return defined(isInternetExplorerResult)||(isInternetExplorerResult=!1,"Microsoft Internet Explorer"===theNavigator.appName?null!==(e=/MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent))&&(isInternetExplorerResult=!0,internetExplorerVersionResult=extractVersion(e[1])):"Netscape"===theNavigator.appName&&null!==(e=/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent))&&(isInternetExplorerResult=!0,internetExplorerVersionResult=extractVersion(e[1]))),isInternetExplorerResult}function internetExplorerVersion(){return isInternetExplorer()&&internetExplorerVersionResult}function isEdge(){var e;return defined(isEdgeResult)||(isEdgeResult=!1,null!==(e=/ Edge\/([\.0-9]+)/.exec(theNavigator.userAgent))&&(isEdgeResult=!0,edgeVersionResult=extractVersion(e[1]))),isEdgeResult}function edgeVersion(){return isEdge()&&edgeVersionResult}function isFirefox(){var e;return defined(isFirefoxResult)||(isFirefoxResult=!1,null!==(e=/Firefox\/([\.0-9]+)/.exec(theNavigator.userAgent))&&(isFirefoxResult=!0,firefoxVersionResult=extractVersion(e[1]))),isFirefoxResult}function isWindows(){return defined(isWindowsResult)||(isWindowsResult=/Windows/i.test(theNavigator.appVersion)),isWindowsResult}function firefoxVersion(){return isFirefox()&&firefoxVersionResult}function supportsPointerEvents(){return defined(hasPointerEvents)||(hasPointerEvents=!isFirefox()&&"undefined"!=typeof PointerEvent&&(!defined(theNavigator.pointerEnabled)||theNavigator.pointerEnabled)),hasPointerEvents}function supportsImageRenderingPixelated(){var e,t;return defined(supportsImageRenderingPixelatedResult)||((e=document.createElement("canvas")).setAttribute("style","image-rendering: -moz-crisp-edges;image-rendering: pixelated;"),t=e.style.imageRendering,(supportsImageRenderingPixelatedResult=defined(t)&&""!==t)&&(imageRenderingValueResult=t)),supportsImageRenderingPixelatedResult}function imageRenderingValue(){return supportsImageRenderingPixelated()?imageRenderingValueResult:void 0}function supportsWebP(){return supportsWebP._result}Object.defineProperties(Fullscreen,{element:{get:function(){if(Fullscreen.supportsFullscreen())return document[_names.fullscreenElement]}},changeEventName:{get:function(){if(Fullscreen.supportsFullscreen())return _names.fullscreenchange}},errorEventName:{get:function(){if(Fullscreen.supportsFullscreen())return _names.fullscreenerror}},enabled:{get:function(){if(Fullscreen.supportsFullscreen())return document[_names.fullscreenEnabled]}},fullscreen:{get:function(){if(Fullscreen.supportsFullscreen())return null!==Fullscreen.element}}}),Fullscreen.supportsFullscreen=function(){if(defined(_supportsFullscreen))return _supportsFullscreen;_supportsFullscreen=!1;var e=document.body;if("function"==typeof e.requestFullscreen)return _names.requestFullscreen="requestFullscreen",_names.exitFullscreen="exitFullscreen",_names.fullscreenEnabled="fullscreenEnabled",_names.fullscreenElement="fullscreenElement",_names.fullscreenchange="fullscreenchange",_names.fullscreenerror="fullscreenerror",_supportsFullscreen=!0;for(var t=["webkit","moz","o","ms","khtml"],i=0,r=t.length;i<r;++i){var n,a=t[i];"function"!=typeof e[n=a+"RequestFullscreen"]&&"function"!=typeof e[n=a+"RequestFullScreen"]||(_names.requestFullscreen=n,_supportsFullscreen=!0),n=a+"ExitFullscreen","function"==typeof document[n]?_names.exitFullscreen=n:(n=a+"CancelFullScreen","function"==typeof document[n]&&(_names.exitFullscreen=n)),n=a+"FullscreenEnabled",void 0!==document[n]?_names.fullscreenEnabled=n:(n=a+"FullScreenEnabled",void 0!==document[n]&&(_names.fullscreenEnabled=n)),n=a+"FullscreenElement",void 0!==document[n]?_names.fullscreenElement=n:(n=a+"FullScreenElement",void 0!==document[n]&&(_names.fullscreenElement=n)),n=a+"fullscreenchange",void 0!==document["on"+n]&&("ms"===a&&(n="MSFullscreenChange"),_names.fullscreenchange=n),n=a+"fullscreenerror",void 0!==document["on"+n]&&("ms"===a&&(n="MSFullscreenError"),_names.fullscreenerror=n)}return _supportsFullscreen},Fullscreen.requestFullscreen=function(e,t){Fullscreen.supportsFullscreen()&&e[_names.requestFullscreen]({vrDisplay:t})},Fullscreen.exitFullscreen=function(){Fullscreen.supportsFullscreen()&&document[_names.exitFullscreen]()},Fullscreen._names=_names,theNavigator="undefined"!=typeof navigator?navigator:{},supportsWebP._promise=void 0,supportsWebP._result=void 0,supportsWebP.initialize=function(){if(defined(supportsWebP._promise))return supportsWebP._promise;var e=when.defer();if(supportsWebP._promise=e.promise,isEdge())return supportsWebP._result=!1,e.resolve(supportsWebP._result),e.promise;var t=new Image;return t.onload=function(){supportsWebP._result=0<t.width&&0<t.height,e.resolve(supportsWebP._result)},t.onerror=function(){supportsWebP._result=!1,e.resolve(supportsWebP._result)},t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",e.promise},Object.defineProperties(supportsWebP,{initialized:{get:function(){return defined(supportsWebP._result)}}});var typedArrayTypes=[];"undefined"!=typeof ArrayBuffer&&(typedArrayTypes.push(Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array),"undefined"!=typeof Uint8ClampedArray&&typedArrayTypes.push(Uint8ClampedArray),"undefined"!=typeof Uint8ClampedArray&&typedArrayTypes.push(Uint8ClampedArray));var FeatureDetection={isChrome:isChrome,chromeVersion:chromeVersion,isSafari:isSafari,safariVersion:safariVersion,isWebkit:isWebkit,webkitVersion:webkitVersion,isInternetExplorer:isInternetExplorer,internetExplorerVersion:internetExplorerVersion,isEdge:isEdge,edgeVersion:edgeVersion,isFirefox:isFirefox,firefoxVersion:firefoxVersion,isWindows:isWindows,hardwareConcurrency:defaultValue(theNavigator.hardwareConcurrency,3),supportsPointerEvents:supportsPointerEvents,supportsImageRenderingPixelated:supportsImageRenderingPixelated,supportsWebP:supportsWebP,imageRenderingValue:imageRenderingValue,typedArrayTypes:typedArrayTypes};function Quaternion(e,t,i,r){this.x=defaultValue(e,0),this.y=defaultValue(t,0),this.z=defaultValue(i,0),this.w=defaultValue(r,0)}FeatureDetection.supportsFullscreen=function(){return Fullscreen.supportsFullscreen()},FeatureDetection.supportsTypedArrays=function(){return"undefined"!=typeof ArrayBuffer},FeatureDetection.supportsWebWorkers=function(){return"undefined"!=typeof Worker},FeatureDetection.supportsWebAssembly=function(){return"undefined"!=typeof WebAssembly&&!FeatureDetection.isEdge()};var fromAxisAngleScratch=new Cartesian3;Quaternion.fromAxisAngle=function(e,t,i){var r=t/2,n=Math.sin(r),a=(fromAxisAngleScratch=Cartesian3.normalize(e,fromAxisAngleScratch)).x*n,o=fromAxisAngleScratch.y*n,s=fromAxisAngleScratch.z*n,l=Math.cos(r);return defined(i)?(i.x=a,i.y=o,i.z=s,i.w=l,i):new Quaternion(a,o,s,l)};var fromRotationMatrixNext=[1,2,0],fromRotationMatrixQuat=new Array(3);Quaternion.fromRotationMatrix=function(e,t){var i,r,n,a,o,s,l,c,u=e[Matrix3.COLUMN0ROW0],d=e[Matrix3.COLUMN1ROW1],h=e[Matrix3.COLUMN2ROW2],p=u+d+h,m=0<p?(n=.5*(l=Math.sqrt(p+1)),l=.5/l,i=(e[Matrix3.COLUMN1ROW2]-e[Matrix3.COLUMN2ROW1])*l,r=(e[Matrix3.COLUMN2ROW0]-e[Matrix3.COLUMN0ROW2])*l,(e[Matrix3.COLUMN0ROW1]-e[Matrix3.COLUMN1ROW0])*l):(o=fromRotationMatrixNext[a=u<h&&d<h?2:u<d?1:0],s=fromRotationMatrixNext[o],l=Math.sqrt(e[Matrix3.getElementIndex(a,a)]-e[Matrix3.getElementIndex(o,o)]-e[Matrix3.getElementIndex(s,s)]+1),(c=fromRotationMatrixQuat)[a]=.5*l,l=.5/l,n=(e[Matrix3.getElementIndex(s,o)]-e[Matrix3.getElementIndex(o,s)])*l,c[o]=(e[Matrix3.getElementIndex(o,a)]+e[Matrix3.getElementIndex(a,o)])*l,c[s]=(e[Matrix3.getElementIndex(s,a)]+e[Matrix3.getElementIndex(a,s)])*l,i=-c[0],r=-c[1],-c[2]);return defined(t)?(t.x=i,t.y=r,t.z=m,t.w=n,t):new Quaternion(i,r,m,n)};var scratchHPRQuaternion=new Quaternion,scratchHeadingQuaternion=new Quaternion,scratchPitchQuaternion=new Quaternion,scratchRollQuaternion=new Quaternion;Quaternion.fromHeadingPitchRoll=function(e,t){return scratchRollQuaternion=Quaternion.fromAxisAngle(Cartesian3.UNIT_X,e.roll,scratchHPRQuaternion),scratchPitchQuaternion=Quaternion.fromAxisAngle(Cartesian3.UNIT_Y,-e.pitch,t),t=Quaternion.multiply(scratchPitchQuaternion,scratchRollQuaternion,scratchPitchQuaternion),scratchHeadingQuaternion=Quaternion.fromAxisAngle(Cartesian3.UNIT_Z,-e.heading,scratchHPRQuaternion),Quaternion.multiply(scratchHeadingQuaternion,t,t)};var sampledQuaternionAxis=new Cartesian3,sampledQuaternionRotation=new Cartesian3,sampledQuaternionTempQuaternion=new Quaternion,sampledQuaternionQuaternion0=new Quaternion,sampledQuaternionQuaternion0Conjugate=new Quaternion;Quaternion.packedLength=4,Quaternion.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.x,t[i++]=e.y,t[i++]=e.z,t[i]=e.w,t},Quaternion.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new Quaternion),i.x=e[t],i.y=e[t+1],i.z=e[t+2],i.w=e[t+3],i},Quaternion.packedInterpolationLength=3,Quaternion.convertPackedArrayForInterpolation=function(e,t,i,r){Quaternion.unpack(e,4*i,sampledQuaternionQuaternion0Conjugate),Quaternion.conjugate(sampledQuaternionQuaternion0Conjugate,sampledQuaternionQuaternion0Conjugate);for(var n=0,a=i-t+1;n<a;n++){var o=3*n;Quaternion.unpack(e,4*(t+n),sampledQuaternionTempQuaternion),Quaternion.multiply(sampledQuaternionTempQuaternion,sampledQuaternionQuaternion0Conjugate,sampledQuaternionTempQuaternion),sampledQuaternionTempQuaternion.w<0&&Quaternion.negate(sampledQuaternionTempQuaternion,sampledQuaternionTempQuaternion),Quaternion.computeAxis(sampledQuaternionTempQuaternion,sampledQuaternionAxis);var s=Quaternion.computeAngle(sampledQuaternionTempQuaternion);defined(r)||(r=[]),r[o]=sampledQuaternionAxis.x*s,r[1+o]=sampledQuaternionAxis.y*s,r[2+o]=sampledQuaternionAxis.z*s}},Quaternion.unpackInterpolationResult=function(e,t,i,r,n){defined(n)||(n=new Quaternion),Cartesian3.fromArray(e,0,sampledQuaternionRotation);var a=Cartesian3.magnitude(sampledQuaternionRotation);return Quaternion.unpack(t,4*r,sampledQuaternionQuaternion0),0===a?Quaternion.clone(Quaternion.IDENTITY,sampledQuaternionTempQuaternion):Quaternion.fromAxisAngle(sampledQuaternionRotation,a,sampledQuaternionTempQuaternion),Quaternion.multiply(sampledQuaternionTempQuaternion,sampledQuaternionQuaternion0,n)},Quaternion.clone=function(e,t){if(defined(e))return defined(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t):new Quaternion(e.x,e.y,e.z,e.w)},Quaternion.conjugate=function(e,t){return t.x=-e.x,t.y=-e.y,t.z=-e.z,t.w=e.w,t},Quaternion.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y+e.z*e.z+e.w*e.w},Quaternion.magnitude=function(e){return Math.sqrt(Quaternion.magnitudeSquared(e))},Quaternion.normalize=function(e,t){var i=1/Quaternion.magnitude(e),r=e.x*i,n=e.y*i,a=e.z*i,o=e.w*i;return t.x=r,t.y=n,t.z=a,t.w=o,t},Quaternion.inverse=function(e,t){var i=Quaternion.magnitudeSquared(e);return t=Quaternion.conjugate(e,t),Quaternion.multiplyByScalar(t,1/i,t)},Quaternion.add=function(e,t,i){return i.x=e.x+t.x,i.y=e.y+t.y,i.z=e.z+t.z,i.w=e.w+t.w,i},Quaternion.subtract=function(e,t,i){return i.x=e.x-t.x,i.y=e.y-t.y,i.z=e.z-t.z,i.w=e.w-t.w,i},Quaternion.negate=function(e,t){return t.x=-e.x,t.y=-e.y,t.z=-e.z,t.w=-e.w,t},Quaternion.dot=function(e,t){return e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},Quaternion.multiply=function(e,t,i){var r=e.x,n=e.y,a=e.z,o=e.w,s=t.x,l=t.y,c=t.z,u=t.w,d=o*s+r*u+n*c-a*l,h=o*l-r*c+n*u+a*s,p=o*c+r*l-n*s+a*u,m=o*u-r*s-n*l-a*c;return i.x=d,i.y=h,i.z=p,i.w=m,i},Quaternion.multiplyByScalar=function(e,t,i){return i.x=e.x*t,i.y=e.y*t,i.z=e.z*t,i.w=e.w*t,i},Quaternion.divideByScalar=function(e,t,i){return i.x=e.x/t,i.y=e.y/t,i.z=e.z/t,i.w=e.w/t,i},Quaternion.computeAxis=function(e,t){var i=e.w;if(Math.abs(i-1)<CesiumMath.EPSILON6)return t.x=t.y=t.z=0,t;var r=1/Math.sqrt(1-i*i);return t.x=e.x*r,t.y=e.y*r,t.z=e.z*r,t},Quaternion.computeAngle=function(e){return Math.abs(e.w-1)<CesiumMath.EPSILON6?0:2*Math.acos(e.w)};var lerpScratch$3=new Quaternion;Quaternion.lerp=function(e,t,i,r){return lerpScratch$3=Quaternion.multiplyByScalar(t,i,lerpScratch$3),r=Quaternion.multiplyByScalar(e,1-i,r),Quaternion.add(lerpScratch$3,r,r)};var slerpEndNegated=new Quaternion,slerpScaledP=new Quaternion,slerpScaledR=new Quaternion;Quaternion.slerp=function(e,t,i,r){var n=Quaternion.dot(e,t),a=t;if(n<0&&(n=-n,a=slerpEndNegated=Quaternion.negate(t,slerpEndNegated)),1-n<CesiumMath.EPSILON6)return Quaternion.lerp(e,a,i,r);var o=Math.acos(n);return slerpScaledP=Quaternion.multiplyByScalar(e,Math.sin((1-i)*o),slerpScaledP),slerpScaledR=Quaternion.multiplyByScalar(a,Math.sin(i*o),slerpScaledR),r=Quaternion.add(slerpScaledP,slerpScaledR,r),Quaternion.multiplyByScalar(r,1/Math.sin(o),r)},Quaternion.log=function(e,t){var i=CesiumMath.acosClamped(e.w),r=0;return 0!==i&&(r=i/Math.sin(i)),Cartesian3.multiplyByScalar(e,r,t)},Quaternion.exp=function(e,t){var i=Cartesian3.magnitude(e),r=0;return 0!==i&&(r=Math.sin(i)/i),t.x=e.x*r,t.y=e.y*r,t.z=e.z*r,t.w=Math.cos(i),t};var squadScratchCartesian0=new Cartesian3,squadScratchCartesian1=new Cartesian3,squadScratchQuaternion0=new Quaternion,squadScratchQuaternion1=new Quaternion;Quaternion.computeInnerQuadrangle=function(e,t,i,r){var n=Quaternion.conjugate(t,squadScratchQuaternion0);Quaternion.multiply(n,i,squadScratchQuaternion1);var a=Quaternion.log(squadScratchQuaternion1,squadScratchCartesian0);Quaternion.multiply(n,e,squadScratchQuaternion1);var o=Quaternion.log(squadScratchQuaternion1,squadScratchCartesian1);return Cartesian3.add(a,o,a),Cartesian3.multiplyByScalar(a,.25,a),Cartesian3.negate(a,a),Quaternion.exp(a,squadScratchQuaternion0),Quaternion.multiply(t,squadScratchQuaternion0,r)},Quaternion.squad=function(e,t,i,r,n,a){var o=Quaternion.slerp(e,t,n,squadScratchQuaternion0),s=Quaternion.slerp(i,r,n,squadScratchQuaternion1);return Quaternion.slerp(o,s,2*n*(1-n),a)};for(var fastSlerpScratchQuaternion=new Quaternion,opmu=1.9011074535173003,u=FeatureDetection.supportsTypedArrays()?new Float32Array(8):[],v=FeatureDetection.supportsTypedArrays()?new Float32Array(8):[],bT=FeatureDetection.supportsTypedArrays()?new Float32Array(8):[],bD=FeatureDetection.supportsTypedArrays()?new Float32Array(8):[],i=0;i<7;++i){var s=i+1,t=2*s+1;u[i]=1/(s*t),v[i]=s/t}u[7]=opmu/136,v[7]=8*opmu/17,Quaternion.fastSlerp=function(e,t,i,r){var n,a=Quaternion.dot(e,t);0<=a?n=1:(n=-1,a=-a);for(var o=a-1,s=1-i,l=i*i,c=s*s,d=7;0<=d;--d)bT[d]=(u[d]*l-v[d])*o,bD[d]=(u[d]*c-v[d])*o;var h=n*i*(1+bT[0]*(1+bT[1]*(1+bT[2]*(1+bT[3]*(1+bT[4]*(1+bT[5]*(1+bT[6]*(1+bT[7])))))))),p=s*(1+bD[0]*(1+bD[1]*(1+bD[2]*(1+bD[3]*(1+bD[4]*(1+bD[5]*(1+bD[6]*(1+bD[7])))))))),m=Quaternion.multiplyByScalar(e,p,fastSlerpScratchQuaternion);return Quaternion.multiplyByScalar(t,h,r),Quaternion.add(m,r,r)},Quaternion.fastSquad=function(e,t,i,r,n,a){var o=Quaternion.fastSlerp(e,t,n,squadScratchQuaternion0),s=Quaternion.fastSlerp(i,r,n,squadScratchQuaternion1);return Quaternion.fastSlerp(o,s,2*n*(1-n),a)},Quaternion.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w},Quaternion.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(e.x-t.x)<=i&&Math.abs(e.y-t.y)<=i&&Math.abs(e.z-t.z)<=i&&Math.abs(e.w-t.w)<=i},Quaternion.ZERO=Object.freeze(new Quaternion(0,0,0,0)),Quaternion.IDENTITY=Object.freeze(new Quaternion(0,0,0,1)),Quaternion.prototype.clone=function(e){return Quaternion.clone(this,e)},Quaternion.prototype.equals=function(e){return Quaternion.equals(this,e)},Quaternion.prototype.equalsEpsilon=function(e,t){return Quaternion.equalsEpsilon(this,e,t)},Quaternion.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+", "+this.w+")"};var Transforms={},vectorProductLocalFrame={up:{south:"east",north:"west",west:"south",east:"north"},down:{south:"west",north:"east",west:"north",east:"south"},south:{up:"west",down:"east",west:"down",east:"up"},north:{up:"east",down:"west",west:"up",east:"down"},west:{up:"north",down:"south",north:"down",south:"up"},east:{up:"south",down:"north",north:"up",south:"down"}},degeneratePositionLocalFrame={north:[-1,0,0],east:[0,1,0],up:[0,0,1],south:[1,0,0],west:[0,-1,0],down:[0,0,-1]},localFrameToFixedFrameCache={},scratchCalculateCartesian={east:new Cartesian3,north:new Cartesian3,up:new Cartesian3,west:new Cartesian3,south:new Cartesian3,down:new Cartesian3},scratchFirstCartesian=new Cartesian3,scratchSecondCartesian=new Cartesian3,scratchThirdCartesian=new Cartesian3;Transforms.localFrameToFixedFrameGenerator=function(o,s){if(!vectorProductLocalFrame.hasOwnProperty(o)||!vectorProductLocalFrame[o].hasOwnProperty(s))throw new DeveloperError("firstAxis and secondAxis must be east, north, up, west, south or down.");var e,l=vectorProductLocalFrame[o][s],t=o+s;return defined(localFrameToFixedFrameCache[t])?e=localFrameToFixedFrameCache[t]:(e=function(e,t,i){var r,n,a;return defined(i)||(i=new Matrix4),Cartesian3.equalsEpsilon(e,Cartesian3.ZERO,CesiumMath.EPSILON14)?(Cartesian3.unpack(degeneratePositionLocalFrame[o],0,scratchFirstCartesian),Cartesian3.unpack(degeneratePositionLocalFrame[s],0,scratchSecondCartesian),Cartesian3.unpack(degeneratePositionLocalFrame[l],0,scratchThirdCartesian)):CesiumMath.equalsEpsilon(e.x,0,CesiumMath.EPSILON14)&&CesiumMath.equalsEpsilon(e.y,0,CesiumMath.EPSILON14)?(r=CesiumMath.sign(e.z),Cartesian3.unpack(degeneratePositionLocalFrame[o],0,scratchFirstCartesian),"east"!==o&&"west"!==o&&Cartesian3.multiplyByScalar(scratchFirstCartesian,r,scratchFirstCartesian),Cartesian3.unpack(degeneratePositionLocalFrame[s],0,scratchSecondCartesian),"east"!==s&&"west"!==s&&Cartesian3.multiplyByScalar(scratchSecondCartesian,r,scratchSecondCartesian),Cartesian3.unpack(degeneratePositionLocalFrame[l],0,scratchThirdCartesian),"east"!==l&&"west"!==l&&Cartesian3.multiplyByScalar(scratchThirdCartesian,r,scratchThirdCartesian)):((t=defaultValue(t,Ellipsoid.WGS84)).geodeticSurfaceNormal(e,scratchCalculateCartesian.up),n=scratchCalculateCartesian.up,(a=scratchCalculateCartesian.east).x=-e.y,a.y=e.x,a.z=0,Cartesian3.normalize(a,scratchCalculateCartesian.east),Cartesian3.cross(n,a,scratchCalculateCartesian.north),Cartesian3.multiplyByScalar(scratchCalculateCartesian.up,-1,scratchCalculateCartesian.down),Cartesian3.multiplyByScalar(scratchCalculateCartesian.east,-1,scratchCalculateCartesian.west),Cartesian3.multiplyByScalar(scratchCalculateCartesian.north,-1,scratchCalculateCartesian.south),scratchFirstCartesian=scratchCalculateCartesian[o],scratchSecondCartesian=scratchCalculateCartesian[s],scratchThirdCartesian=scratchCalculateCartesian[l]),i[0]=scratchFirstCartesian.x,i[1]=scratchFirstCartesian.y,i[2]=scratchFirstCartesian.z,i[3]=0,i[4]=scratchSecondCartesian.x,i[5]=scratchSecondCartesian.y,i[6]=scratchSecondCartesian.z,i[7]=0,i[8]=scratchThirdCartesian.x,i[9]=scratchThirdCartesian.y,i[10]=scratchThirdCartesian.z,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,i},localFrameToFixedFrameCache[t]=e),e},Transforms.eastNorthUpToFixedFrame=Transforms.localFrameToFixedFrameGenerator("east","north"),Transforms.northEastDownToFixedFrame=Transforms.localFrameToFixedFrameGenerator("north","east"),Transforms.northUpEastToFixedFrame=Transforms.localFrameToFixedFrameGenerator("north","up"),Transforms.northWestUpToFixedFrame=Transforms.localFrameToFixedFrameGenerator("north","west");var scratchHPRQuaternion$1=new Quaternion,scratchScale$2=new Cartesian3(1,1,1),scratchHPRMatrix4=new Matrix4;Transforms.headingPitchRollToFixedFrame=function(e,t,i,r,n){r=defaultValue(r,Transforms.eastNorthUpToFixedFrame);var a=Quaternion.fromHeadingPitchRoll(t,scratchHPRQuaternion$1),o=Matrix4.fromTranslationQuaternionRotationScale(Cartesian3.ZERO,a,scratchScale$2,scratchHPRMatrix4);return n=r(e,i,n),Matrix4.multiply(n,o,n)};var scratchENUMatrix4=new Matrix4,scratchHPRMatrix3=new Matrix3;Transforms.headingPitchRollQuaternion=function(e,t,i,r,n){var a=Transforms.headingPitchRollToFixedFrame(e,t,i,r,scratchENUMatrix4),o=Matrix4.getMatrix3(a,scratchHPRMatrix3);return Quaternion.fromRotationMatrix(o,n)};var noScale=new Cartesian3(1,1,1),hprCenterScratch=new Cartesian3,ffScratch=new Matrix4,hprTransformScratch=new Matrix4,hprRotationScratch=new Matrix3,hprQuaternionScratch=new Quaternion;Transforms.fixedFrameToHeadingPitchRoll=function(e,t,i,r){t=defaultValue(t,Ellipsoid.WGS84),i=defaultValue(i,Transforms.eastNorthUpToFixedFrame),defined(r)||(r=new HeadingPitchRoll);var n=Matrix4.getTranslation(e,hprCenterScratch);if(Cartesian3.equals(n,Cartesian3.ZERO))return r.heading=0,r.pitch=0,r.roll=0,r;var a=Matrix4.inverseTransformation(i(n,t,ffScratch),ffScratch),o=Matrix4.setScale(e,noScale,hprTransformScratch),o=Matrix4.setTranslation(o,Cartesian3.ZERO,o),a=Matrix4.multiply(a,o,a),s=Quaternion.fromRotationMatrix(Matrix4.getMatrix3(a,hprRotationScratch),hprQuaternionScratch),s=Quaternion.normalize(s,s);return HeadingPitchRoll.fromQuaternion(s,r)};var gmstConstant0=24110.54841,gmstConstant1=8640184.812866,gmstConstant2=.093104,gmstConstant3=-62e-7,rateCoef=11772758384668e-32,wgs84WRPrecessing=72921158553e-15,twoPiOverSecondsInDay=CesiumMath.TWO_PI/86400,dateInUtc=new JulianDate;Transforms.computeTemeToPseudoFixedMatrix=function(e,t){var i=(dateInUtc=JulianDate.addSeconds(e,-JulianDate.computeTaiMinusUtc(e),dateInUtc)).dayNumber,r=dateInUtc.secondsOfDay,n=i-2451545,a=43200<=r?(.5+n)/TimeConstants$1.DAYS_PER_JULIAN_CENTURY:(n-.5)/TimeConstants$1.DAYS_PER_JULIAN_CENTURY,o=(gmstConstant0+a*(gmstConstant1+a*(gmstConstant2+a*gmstConstant3)))*twoPiOverSecondsInDay%CesiumMath.TWO_PI+(wgs84WRPrecessing+rateCoef*(i-2451545.5))*((r+.5*TimeConstants$1.SECONDS_PER_DAY)%TimeConstants$1.SECONDS_PER_DAY),s=Math.cos(o),l=Math.sin(o);return defined(t)?(t[0]=s,t[1]=-l,t[2]=0,t[3]=l,t[4]=s,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t):new Matrix3(s,l,0,-l,s,0,0,0,1)},Transforms.iau2006XysData=new Iau2006XysData,Transforms.earthOrientationParameters=EarthOrientationParameters.NONE;var ttMinusTai=32.184,j2000ttDays=2451545;Transforms.preloadIcrfFixed=function(e){var t=e.start.dayNumber,i=e.start.secondsOfDay+ttMinusTai,r=e.stop.dayNumber,n=e.stop.secondsOfDay+ttMinusTai,a=Transforms.iau2006XysData.preload(t,i,r,n),o=Transforms.earthOrientationParameters.getPromiseToLoad();return when.all([a,o])},Transforms.computeIcrfToFixedMatrix=function(e,t){defined(t)||(t=new Matrix3);var i=Transforms.computeFixedToIcrfMatrix(e,t);if(defined(i))return Matrix3.transpose(i,t)};var xysScratch=new Iau2006XysSample(0,0,0),eopScratch=new EarthOrientationParametersSample(0,0,0,0,0,0),rotation1Scratch=new Matrix3,rotation2Scratch=new Matrix3;Transforms.computeFixedToIcrfMatrix=function(e,t){defined(t)||(t=new Matrix3);var i=Transforms.earthOrientationParameters.compute(e,eopScratch);if(defined(i)){var r=e.dayNumber,n=e.secondsOfDay+ttMinusTai,a=Transforms.iau2006XysData.computeXysRadians(r,n,xysScratch);if(defined(a)){var o=a.x+i.xPoleOffset,s=a.y+i.yPoleOffset,l=1/(1+Math.sqrt(1-o*o-s*s)),c=rotation1Scratch;c[0]=1-l*o*o,c[3]=-l*o*s,c[6]=o,c[1]=-l*o*s,c[4]=1-l*s*s,c[7]=s,c[2]=-o,c[5]=-s,c[8]=1-l*(o*o+s*s);var u=Matrix3.fromRotationZ(-a.s,rotation2Scratch),d=Matrix3.multiply(c,u,rotation1Scratch),h=e.dayNumber-2451545,p=(e.secondsOfDay-JulianDate.computeTaiMinusUtc(e)+i.ut1MinusUtc)/TimeConstants$1.SECONDS_PER_DAY,m=(m=.779057273264+p+.00273781191135448*(h+p))%1*CesiumMath.TWO_PI,f=Matrix3.fromRotationZ(m,rotation2Scratch),g=Matrix3.multiply(d,f,rotation1Scratch),_=Math.cos(i.xPoleWander),y=Math.cos(i.yPoleWander),v=Math.sin(i.xPoleWander),C=Math.sin(i.yPoleWander),S=r-j2000ttDays+n/TimeConstants$1.SECONDS_PER_DAY,T=-47e-6*(S/=36525)*CesiumMath.RADIANS_PER_DEGREE/3600,x=Math.cos(T),b=Math.sin(T),E=rotation2Scratch;return E[0]=_*x,E[1]=_*b,E[2]=v,E[3]=-y*b+C*v*x,E[4]=y*x+C*v*b,E[5]=-C*_,E[6]=-C*b-y*v*x,E[7]=C*x-y*v*b,E[8]=y*_,Matrix3.multiply(g,E,t)}}};var pointToWindowCoordinatesTemp=new Cartesian4;Transforms.pointToWindowCoordinates=function(e,t,i,r){return(r=Transforms.pointToGLWindowCoordinates(e,t,i,r)).y=2*t[5]-r.y,r},Transforms.pointToGLWindowCoordinates=function(e,t,i,r){defined(r)||(r=new Cartesian2);var n=pointToWindowCoordinatesTemp;return Matrix4.multiplyByVector(e,Cartesian4.fromElements(i.x,i.y,i.z,1,n),n),Cartesian4.multiplyByScalar(n,1/n.w,n),Matrix4.multiplyByVector(t,n,n),Cartesian2.fromCartesian4(n,r)};var normalScratch=new Cartesian3,rightScratch=new Cartesian3,upScratch=new Cartesian3;Transforms.rotationMatrixFromPositionVelocity=function(e,t,i,r){var n=defaultValue(i,Ellipsoid.WGS84).geodeticSurfaceNormal(e,normalScratch),a=Cartesian3.cross(t,n,rightScratch);Cartesian3.equalsEpsilon(a,Cartesian3.ZERO,CesiumMath.EPSILON6)&&(a=Cartesian3.clone(Cartesian3.UNIT_X,a));var o=Cartesian3.cross(a,t,upScratch);return Cartesian3.normalize(o,o),Cartesian3.cross(t,o,a),Cartesian3.negate(a,a),Cartesian3.normalize(a,a),defined(r)||(r=new Matrix3),r[0]=t.x,r[1]=t.y,r[2]=t.z,r[3]=a.x,r[4]=a.y,r[5]=a.z,r[6]=o.x,r[7]=o.y,r[8]=o.z,r};var swizzleMatrix=new Matrix4(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1),scratchCartographic=new Cartographic,scratchCartesian3Projection=new Cartesian3,scratchCenter=new Cartesian3,scratchRotation=new Matrix3,scratchFromENU=new Matrix4,scratchToENU=new Matrix4;Transforms.basisTo2D=function(e,t,i){var r=Matrix4.getTranslation(t,scratchCenter),n=e.ellipsoid,a=n.cartesianToCartographic(r,scratchCartographic),o=e.project(a,scratchCartesian3Projection);Cartesian3.fromElements(o.z,o.x,o.y,o);var s=Transforms.eastNorthUpToFixedFrame(r,n,scratchFromENU),l=Matrix4.inverseTransformation(s,scratchToENU),c=Matrix4.getMatrix3(t,scratchRotation),u=Matrix4.multiplyByMatrix3(l,c,i);return Matrix4.multiply(swizzleMatrix,u,i),Matrix4.setTranslation(i,o,i),i},Transforms.wgs84To2DModelMatrix=function(e,t,i){var r=e.ellipsoid,n=Transforms.eastNorthUpToFixedFrame(t,r,scratchFromENU),a=Matrix4.inverseTransformation(n,scratchToENU),o=r.cartesianToCartographic(t,scratchCartographic),s=e.project(o,scratchCartesian3Projection);Cartesian3.fromElements(s.z,s.x,s.y,s);var l=Matrix4.fromTranslation(s,scratchFromENU);return Matrix4.multiply(swizzleMatrix,a,i),Matrix4.multiply(l,i,i),i};var scratchCart4=new Cartesian4;function EllipsoidTangentPlane(e,t){e=(t=defaultValue(t,Ellipsoid.WGS84)).scaleToGeodeticSurface(e);var i=Transforms.eastNorthUpToFixedFrame(e,t);this._ellipsoid=t,this._origin=e,this._xAxis=Cartesian3.fromCartesian4(Matrix4.getColumn(i,0,scratchCart4)),this._yAxis=Cartesian3.fromCartesian4(Matrix4.getColumn(i,1,scratchCart4));var r=Cartesian3.fromCartesian4(Matrix4.getColumn(i,2,scratchCart4));this._plane=Plane.fromPointNormal(e,r)}Object.defineProperties(EllipsoidTangentPlane.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},origin:{get:function(){return this._origin}},plane:{get:function(){return this._plane}},xAxis:{get:function(){return this._xAxis}},yAxis:{get:function(){return this._yAxis}},zAxis:{get:function(){return this._plane.normal}}});var tmp=new AxisAlignedBoundingBox;EllipsoidTangentPlane.fromPoints=function(e,t){return new EllipsoidTangentPlane(AxisAlignedBoundingBox.fromPoints(e,tmp).center,t)};var scratchProjectPointOntoPlaneRay=new Ray,scratchProjectPointOntoPlaneCartesian3=new Cartesian3;EllipsoidTangentPlane.prototype.projectPointOntoPlane=function(e,t){var i=scratchProjectPointOntoPlaneRay;i.origin=e,Cartesian3.normalize(e,i.direction);var r=IntersectionTests.rayPlane(i,this._plane,scratchProjectPointOntoPlaneCartesian3);if(defined(r)||(Cartesian3.negate(i.direction,i.direction),r=IntersectionTests.rayPlane(i,this._plane,scratchProjectPointOntoPlaneCartesian3)),defined(r)){var n=Cartesian3.subtract(r,this._origin,r),a=Cartesian3.dot(this._xAxis,n),o=Cartesian3.dot(this._yAxis,n);return defined(t)?(t.x=a,t.y=o,t):new Cartesian2(a,o)}},EllipsoidTangentPlane.prototype.projectPointsOntoPlane=function(e,t){defined(t)||(t=[]);for(var i=0,r=e.length,n=0;n<r;n++){var a=this.projectPointOntoPlane(e[n],t[i]);defined(a)&&(t[i]=a,i++)}return t.length=i,t},EllipsoidTangentPlane.prototype.projectPointToNearestOnPlane=function(e,t){defined(t)||(t=new Cartesian2);var i=scratchProjectPointOntoPlaneRay;i.origin=e,Cartesian3.clone(this._plane.normal,i.direction);var r=IntersectionTests.rayPlane(i,this._plane,scratchProjectPointOntoPlaneCartesian3);defined(r)||(Cartesian3.negate(i.direction,i.direction),r=IntersectionTests.rayPlane(i,this._plane,scratchProjectPointOntoPlaneCartesian3));var n=Cartesian3.subtract(r,this._origin,r),a=Cartesian3.dot(this._xAxis,n),o=Cartesian3.dot(this._yAxis,n);return t.x=a,t.y=o,t},EllipsoidTangentPlane.prototype.projectPointsToNearestOnPlane=function(e,t){defined(t)||(t=[]);var i=e.length;t.length=i;for(var r=0;r<i;r++)t[r]=this.projectPointToNearestOnPlane(e[r],t[r]);return t};var projectPointsOntoEllipsoidScratch=new Cartesian3;function OrientedBoundingBox(e,t){this.center=Cartesian3.clone(defaultValue(e,Cartesian3.ZERO)),this.halfAxes=Matrix3.clone(defaultValue(t,Matrix3.ZERO))}EllipsoidTangentPlane.prototype.projectPointOntoEllipsoid=function(e,t){defined(t)||(t=new Cartesian3);var i=this._ellipsoid,r=this._origin,n=this._xAxis,a=this._yAxis,o=projectPointsOntoEllipsoidScratch;return Cartesian3.multiplyByScalar(n,e.x,o),t=Cartesian3.add(r,o,t),Cartesian3.multiplyByScalar(a,e.y,o),Cartesian3.add(t,o,t),i.scaleToGeocentricSurface(t,t),t},EllipsoidTangentPlane.prototype.projectPointsOntoEllipsoid=function(e,t){var i=e.length;defined(t)?t.length=i:t=new Array(i);for(var r=0;r<i;++r)t[r]=this.projectPointOntoEllipsoid(e[r],t[r]);return t},OrientedBoundingBox.packedLength=Cartesian3.packedLength+Matrix3.packedLength,OrientedBoundingBox.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e.center,t,i),Matrix3.pack(e.halfAxes,t,i+Cartesian3.packedLength),t},OrientedBoundingBox.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new OrientedBoundingBox),Cartesian3.unpack(e,t,i.center),Matrix3.unpack(e,t+Cartesian3.packedLength,i.halfAxes),i};var scratchCartesian1=new Cartesian3,scratchCartesian2=new Cartesian3,scratchCartesian3$1=new Cartesian3,scratchCartesian4=new Cartesian3,scratchCartesian5=new Cartesian3,scratchCartesian6=new Cartesian3,scratchCovarianceResult=new Matrix3,scratchEigenResult={unitary:new Matrix3,diagonal:new Matrix3};OrientedBoundingBox.fromPoints=function(e,t){if(defined(t)||(t=new OrientedBoundingBox),!defined(e)||0===e.length)return t.halfAxes=Matrix3.ZERO,t.center=Cartesian3.ZERO,t;for(var i=e.length,r=Cartesian3.clone(e[0],scratchCartesian1),n=1;n<i;n++)Cartesian3.add(r,e[n],r);var a=1/i;Cartesian3.multiplyByScalar(r,a,r);var o,s=0,l=0,c=0,u=0,d=0,h=0;for(n=0;n<i;n++)s+=(o=Cartesian3.subtract(e[n],r,scratchCartesian2)).x*o.x,l+=o.x*o.y,c+=o.x*o.z,u+=o.y*o.y,d+=o.y*o.z,h+=o.z*o.z;s*=a,l*=a,c*=a,u*=a,d*=a,h*=a;var p=scratchCovarianceResult;p[0]=s,p[1]=l,p[2]=c,p[3]=l,p[4]=u,p[5]=d,p[6]=c,p[7]=d,p[8]=h;var m=Matrix3.computeEigenDecomposition(p,scratchEigenResult),f=Matrix3.clone(m.unitary,t.halfAxes),g=Matrix3.getColumn(f,0,scratchCartesian4),_=Matrix3.getColumn(f,1,scratchCartesian5),y=Matrix3.getColumn(f,2,scratchCartesian6),v=-Number.MAX_VALUE,C=-Number.MAX_VALUE,S=-Number.MAX_VALUE,T=Number.MAX_VALUE,x=Number.MAX_VALUE,b=Number.MAX_VALUE;for(n=0;n<i;n++)o=e[n],v=Math.max(Cartesian3.dot(g,o),v),C=Math.max(Cartesian3.dot(_,o),C),S=Math.max(Cartesian3.dot(y,o),S),T=Math.min(Cartesian3.dot(g,o),T),x=Math.min(Cartesian3.dot(_,o),x),b=Math.min(Cartesian3.dot(y,o),b);g=Cartesian3.multiplyByScalar(g,.5*(T+v),g),_=Cartesian3.multiplyByScalar(_,.5*(x+C),_),y=Cartesian3.multiplyByScalar(y,.5*(b+S),y);var E=Cartesian3.add(g,_,t.center);Cartesian3.add(E,y,E);var P=scratchCartesian3$1;return P.x=v-T,P.y=C-x,P.z=S-b,Cartesian3.multiplyByScalar(P,.5,P),Matrix3.multiplyByScale(t.halfAxes,P,t.halfAxes),t};var scratchOffset=new Cartesian3,scratchScale$3=new Cartesian3;function fromPlaneExtents(e,t,i,r,n,a,o,s,l,c,u){defined(u)||(u=new OrientedBoundingBox);var d=u.halfAxes;Matrix3.setColumn(d,0,t,d),Matrix3.setColumn(d,1,i,d),Matrix3.setColumn(d,2,r,d),(m=scratchOffset).x=(n+a)/2,m.y=(o+s)/2,m.z=(l+c)/2;var h=scratchScale$3;h.x=(a-n)/2,h.y=(s-o)/2,h.z=(c-l)/2;var p=u.center,m=Matrix3.multiplyByVector(d,m,m);return Cartesian3.add(e,m,p),Matrix3.multiplyByScale(d,h,d),u}var scratchRectangleCenterCartographic=new Cartographic,scratchRectangleCenter=new Cartesian3,scratchPerimeterCartographicNC=new Cartographic,scratchPerimeterCartographicNW=new Cartographic,scratchPerimeterCartographicCW=new Cartographic,scratchPerimeterCartographicSW=new Cartographic,scratchPerimeterCartographicSC=new Cartographic,scratchPerimeterCartesianNC=new Cartesian3,scratchPerimeterCartesianNW=new Cartesian3,scratchPerimeterCartesianCW=new Cartesian3,scratchPerimeterCartesianSW=new Cartesian3,scratchPerimeterCartesianSC=new Cartesian3,scratchPerimeterProjectedNC=new Cartesian2,scratchPerimeterProjectedNW=new Cartesian2,scratchPerimeterProjectedCW=new Cartesian2,scratchPerimeterProjectedSW=new Cartesian2,scratchPerimeterProjectedSC=new Cartesian2,scratchPlaneOrigin=new Cartesian3,scratchPlaneNormal=new Cartesian3,scratchPlaneXAxis=new Cartesian3,scratchHorizonCartesian=new Cartesian3,scratchHorizonProjected=new Cartesian2,scratchMaxY=new Cartesian3,scratchMinY=new Cartesian3,scratchZ=new Cartesian3,scratchPlane=new Plane(Cartesian3.UNIT_X,0);OrientedBoundingBox.fromRectangle=function(e,t,i,r,n){if(t=defaultValue(t,0),i=defaultValue(i,0),r=defaultValue(r,Ellipsoid.WGS84),e.width<=CesiumMath.PI){var a,o=Rectangle.center(e,scratchRectangleCenterCartographic),s=new EllipsoidTangentPlane(r.cartographicToCartesian(o,scratchRectangleCenter),r),l=s.plane,c=o.longitude,u=e.south<0&&0<e.north?0:o.latitude,d=Cartographic.fromRadians(c,e.north,i,scratchPerimeterCartographicNC),h=Cartographic.fromRadians(e.west,e.north,i,scratchPerimeterCartographicNW),p=Cartographic.fromRadians(e.west,u,i,scratchPerimeterCartographicCW),m=Cartographic.fromRadians(e.west,e.south,i,scratchPerimeterCartographicSW),f=Cartographic.fromRadians(c,e.south,i,scratchPerimeterCartographicSC),g=r.cartographicToCartesian(d,scratchPerimeterCartesianNC),_=r.cartographicToCartesian(h,scratchPerimeterCartesianNW),y=r.cartographicToCartesian(p,scratchPerimeterCartesianCW),v=r.cartographicToCartesian(m,scratchPerimeterCartesianSW),C=r.cartographicToCartesian(f,scratchPerimeterCartesianSC),S=s.projectPointToNearestOnPlane(g,scratchPerimeterProjectedNC),T=s.projectPointToNearestOnPlane(_,scratchPerimeterProjectedNW),x=s.projectPointToNearestOnPlane(y,scratchPerimeterProjectedCW),b=s.projectPointToNearestOnPlane(v,scratchPerimeterProjectedSW),E=s.projectPointToNearestOnPlane(C,scratchPerimeterProjectedSC),P=-(a=Math.min(T.x,x.x,b.x)),A=Math.max(T.y,S.y),w=Math.min(b.y,E.y);return h.height=m.height=t,_=r.cartographicToCartesian(h,scratchPerimeterCartesianNW),v=r.cartographicToCartesian(m,scratchPerimeterCartesianSW),V=Math.min(Plane.getPointDistance(l,_),Plane.getPointDistance(l,v)),k=i,fromPlaneExtents(s.origin,s.xAxis,s.yAxis,s.zAxis,a,P,w,A,V,k,n)}var D=0<e.south,M=e.north<0,I=D?e.south:M?e.north:0,R=Rectangle.center(e,scratchRectangleCenterCartographic).longitude,O=Cartesian3.fromRadians(R,I,i,r,scratchPlaneOrigin);O.z=0;var L=Math.abs(O.x)<CesiumMath.EPSILON10&&Math.abs(O.y)<CesiumMath.EPSILON10?Cartesian3.UNIT_X:Cartesian3.normalize(O,scratchPlaneNormal),F=Cartesian3.UNIT_Z,N=Cartesian3.cross(L,F,scratchPlaneXAxis);l=Plane.fromPointNormal(O,L,scratchPlane);var B=Cartesian3.fromRadians(R+CesiumMath.PI_OVER_TWO,I,i,r,scratchHorizonCartesian);a=-(P=Cartesian3.dot(Plane.projectPointOntoPlane(l,B,scratchHorizonProjected),N)),A=Cartesian3.fromRadians(0,e.north,M?t:i,r,scratchMaxY).z,w=Cartesian3.fromRadians(0,e.south,D?t:i,r,scratchMinY).z;var V,k,z=Cartesian3.fromRadians(e.east,I,i,r,scratchZ);return fromPlaneExtents(O,N,F,L,a,P,w,A,V=Plane.getPointDistance(l,z),k=0,n)},OrientedBoundingBox.clone=function(e,t){if(defined(e))return defined(t)?(Cartesian3.clone(e.center,t.center),Matrix3.clone(e.halfAxes,t.halfAxes),t):new OrientedBoundingBox(e.center,e.halfAxes)},OrientedBoundingBox.intersectPlane=function(e,t){var i=e.center,r=t.normal,n=e.halfAxes,a=r.x,o=r.y,s=r.z,l=Math.abs(a*n[Matrix3.COLUMN0ROW0]+o*n[Matrix3.COLUMN0ROW1]+s*n[Matrix3.COLUMN0ROW2])+Math.abs(a*n[Matrix3.COLUMN1ROW0]+o*n[Matrix3.COLUMN1ROW1]+s*n[Matrix3.COLUMN1ROW2])+Math.abs(a*n[Matrix3.COLUMN2ROW0]+o*n[Matrix3.COLUMN2ROW1]+s*n[Matrix3.COLUMN2ROW2]),c=Cartesian3.dot(r,i)+t.distance;return c<=-l?Intersect$1.OUTSIDE:l<=c?Intersect$1.INSIDE:Intersect$1.INTERSECTING};var scratchCartesianU=new Cartesian3,scratchCartesianV=new Cartesian3,scratchCartesianW=new Cartesian3,scratchPPrime=new Cartesian3;OrientedBoundingBox.distanceSquaredTo=function(e,t){var i=Cartesian3.subtract(t,e.center,scratchOffset),r=e.halfAxes,n=Matrix3.getColumn(r,0,scratchCartesianU),a=Matrix3.getColumn(r,1,scratchCartesianV),o=Matrix3.getColumn(r,2,scratchCartesianW),s=Cartesian3.magnitude(n),l=Cartesian3.magnitude(a),c=Cartesian3.magnitude(o);Cartesian3.normalize(n,n),Cartesian3.normalize(a,a),Cartesian3.normalize(o,o);var u=scratchPPrime;u.x=Cartesian3.dot(i,n),u.y=Cartesian3.dot(i,a),u.z=Cartesian3.dot(i,o);var d,h=0;return u.x<-s?h+=(d=u.x+s)*d:u.x>s&&(h+=(d=u.x-s)*d),u.y<-l?h+=(d=u.y+l)*d:u.y>l&&(h+=(d=u.y-l)*d),u.z<-c?h+=(d=u.z+c)*d:u.z>c&&(h+=(d=u.z-c)*d),h};var scratchCorner=new Cartesian3,scratchToCenter=new Cartesian3;OrientedBoundingBox.computePlaneDistances=function(e,t,i,r){defined(r)||(r=new Interval);var n=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,o=e.center,s=e.halfAxes,l=Matrix3.getColumn(s,0,scratchCartesianU),c=Matrix3.getColumn(s,1,scratchCartesianV),u=Matrix3.getColumn(s,2,scratchCartesianW),d=Cartesian3.add(l,c,scratchCorner);Cartesian3.add(d,u,d),Cartesian3.add(d,o,d);var h=Cartesian3.subtract(d,t,scratchToCenter),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a);return Cartesian3.add(o,l,d),Cartesian3.add(d,c,d),Cartesian3.subtract(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),Cartesian3.add(o,l,d),Cartesian3.subtract(d,c,d),Cartesian3.add(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),Cartesian3.add(o,l,d),Cartesian3.subtract(d,c,d),Cartesian3.subtract(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),Cartesian3.subtract(o,l,d),Cartesian3.add(d,c,d),Cartesian3.add(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),Cartesian3.subtract(o,l,d),Cartesian3.add(d,c,d),Cartesian3.subtract(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),Cartesian3.subtract(o,l,d),Cartesian3.subtract(d,c,d),Cartesian3.add(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),Cartesian3.subtract(o,l,d),Cartesian3.subtract(d,c,d),Cartesian3.subtract(d,u,d),Cartesian3.subtract(d,t,h),p=Cartesian3.dot(i,h),n=Math.min(p,n),a=Math.max(p,a),r.start=n,r.stop=a,r};var scratchBoundingSphere$1=new BoundingSphere;OrientedBoundingBox.isOccluded=function(e,t){var i=BoundingSphere.fromOrientedBoundingBox(e,scratchBoundingSphere$1);return!t.isBoundingSphereVisible(i)},OrientedBoundingBox.prototype.intersectPlane=function(e){return OrientedBoundingBox.intersectPlane(this,e)},OrientedBoundingBox.prototype.distanceSquaredTo=function(e){return OrientedBoundingBox.distanceSquaredTo(this,e)},OrientedBoundingBox.prototype.computePlaneDistances=function(e,t,i){return OrientedBoundingBox.computePlaneDistances(this,e,t,i)},OrientedBoundingBox.prototype.isOccluded=function(e){return OrientedBoundingBox.isOccluded(this,e)},OrientedBoundingBox.equals=function(e,t){return e===t||defined(e)&&defined(t)&&Cartesian3.equals(e.center,t.center)&&Matrix3.equals(e.halfAxes,t.halfAxes)},OrientedBoundingBox.prototype.clone=function(e){return OrientedBoundingBox.clone(this,e)},OrientedBoundingBox.prototype.equals=function(e){return OrientedBoundingBox.equals(this,e)};var RIGHT_SHIFT=1/256,LEFT_SHIFT=256,AttributeCompression={octEncodeInRange:function(e,t,i){var r,n;return i.x=e.x/(Math.abs(e.x)+Math.abs(e.y)+Math.abs(e.z)),i.y=e.y/(Math.abs(e.x)+Math.abs(e.y)+Math.abs(e.z)),e.z<0&&(r=i.x,n=i.y,i.x=(1-Math.abs(n))*CesiumMath.signNotZero(r),i.y=(1-Math.abs(r))*CesiumMath.signNotZero(n)),i.x=CesiumMath.toSNorm(i.x,t),i.y=CesiumMath.toSNorm(i.y,t),i},octEncode:function(e,t){return AttributeCompression.octEncodeInRange(e,255,t)}},octEncodeScratch=new Cartesian2,uint8ForceArray=new Uint8Array(1);function forceUint8(e){return uint8ForceArray[0]=e,uint8ForceArray[0]}AttributeCompression.octEncodeToCartesian4=function(e,t){return AttributeCompression.octEncodeInRange(e,65535,octEncodeScratch),t.x=forceUint8(octEncodeScratch.x*RIGHT_SHIFT),t.y=forceUint8(octEncodeScratch.x),t.z=forceUint8(octEncodeScratch.y*RIGHT_SHIFT),t.w=forceUint8(octEncodeScratch.y),t},AttributeCompression.octDecodeInRange=function(e,t,i,r){var n;return r.x=CesiumMath.fromSNorm(e,i),r.y=CesiumMath.fromSNorm(t,i),r.z=1-(Math.abs(r.x)+Math.abs(r.y)),r.z<0&&(n=r.x,r.x=(1-Math.abs(r.y))*CesiumMath.signNotZero(n),r.y=(1-Math.abs(n))*CesiumMath.signNotZero(r.y)),Cartesian3.normalize(r,r)},AttributeCompression.octDecode=function(e,t,i){return AttributeCompression.octDecodeInRange(e,t,255,i)},AttributeCompression.octDecodeFromCartesian4=function(e,t){var i=e.x,r=e.y,n=e.z,a=e.w,o=i*LEFT_SHIFT+r,s=n*LEFT_SHIFT+a;return AttributeCompression.octDecodeInRange(o,s,65535,t)},AttributeCompression.octPackFloat=function(e){return 256*e.x+e.y};var scratchEncodeCart2=new Cartesian2;function zigZagDecode(e){return e>>1^-(1&e)}AttributeCompression.octEncodeFloat=function(e){return AttributeCompression.octEncode(e,scratchEncodeCart2),AttributeCompression.octPackFloat(scratchEncodeCart2)},AttributeCompression.octDecodeFloat=function(e,t){var i=e/256,r=Math.floor(i),n=256*(i-r);return AttributeCompression.octDecode(r,n,t)},AttributeCompression.octPack=function(e,t,i,r){var n=AttributeCompression.octEncodeFloat(e),a=AttributeCompression.octEncodeFloat(t),o=AttributeCompression.octEncode(i,scratchEncodeCart2);return r.x=65536*o.x+n,r.y=65536*o.y+a,r},AttributeCompression.octUnpack=function(e,t,i,r){var n=e.x/65536,a=Math.floor(n),o=65536*(n-a),n=e.y/65536,s=Math.floor(n),l=65536*(n-s);AttributeCompression.octDecodeFloat(o,t),AttributeCompression.octDecodeFloat(l,i),AttributeCompression.octDecode(a,s,r)},AttributeCompression.compressTextureCoordinates=function(e){return 4096*(4095*e.x|0)+(4095*e.y|0)},AttributeCompression.decompressTextureCoordinates=function(e,t){var i=e/4096,r=Math.floor(i);return t.x=r/4095,t.y=(e-4096*r)/4095,t},AttributeCompression.zigZagDeltaDecode=function(e,t,i){for(var r=e.length,n=0,a=0,o=0,s=0;s<r;++s)n+=zigZagDecode(e[s]),a+=zigZagDecode(t[s]),e[s]=n,t[s]=a,defined(i)&&(o+=zigZagDecode(i[s]),i[s]=o)};var WebGLConstants={DEPTH_BUFFER_BIT:256,STENCIL_BUFFER_BIT:1024,COLOR_BUFFER_BIT:16384,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,ZERO:0,ONE:1,SRC_COLOR:768,ONE_MINUS_SRC_COLOR:769,SRC_ALPHA:770,ONE_MINUS_SRC_ALPHA:771,DST_ALPHA:772,ONE_MINUS_DST_ALPHA:773,DST_COLOR:774,ONE_MINUS_DST_COLOR:775,SRC_ALPHA_SATURATE:776,FUNC_ADD:32774,BLEND_EQUATION:32777,BLEND_EQUATION_RGB:32777,BLEND_EQUATION_ALPHA:34877,FUNC_SUBTRACT:32778,FUNC_REVERSE_SUBTRACT:32779,BLEND_DST_RGB:32968,BLEND_SRC_RGB:32969,BLEND_DST_ALPHA:32970,BLEND_SRC_ALPHA:32971,CONSTANT_COLOR:32769,ONE_MINUS_CONSTANT_COLOR:32770,CONSTANT_ALPHA:32771,ONE_MINUS_CONSTANT_ALPHA:32772,BLEND_COLOR:32773,ARRAY_BUFFER:34962,ELEMENT_ARRAY_BUFFER:34963,ARRAY_BUFFER_BINDING:34964,ELEMENT_ARRAY_BUFFER_BINDING:34965,STREAM_DRAW:35040,STATIC_DRAW:35044,DYNAMIC_DRAW:35048,BUFFER_SIZE:34660,BUFFER_USAGE:34661,CURRENT_VERTEX_ATTRIB:34342,FRONT:1028,BACK:1029,FRONT_AND_BACK:1032,CULL_FACE:2884,BLEND:3042,DITHER:3024,STENCIL_TEST:2960,DEPTH_TEST:2929,SCISSOR_TEST:3089,POLYGON_OFFSET_FILL:32823,SAMPLE_ALPHA_TO_COVERAGE:32926,SAMPLE_COVERAGE:32928,NO_ERROR:0,INVALID_ENUM:1280,INVALID_VALUE:1281,INVALID_OPERATION:1282,OUT_OF_MEMORY:1285,CW:2304,CCW:2305,LINE_WIDTH:2849,ALIASED_POINT_SIZE_RANGE:33901,ALIASED_LINE_WIDTH_RANGE:33902,CULL_FACE_MODE:2885,FRONT_FACE:2886,DEPTH_RANGE:2928,DEPTH_WRITEMASK:2930,DEPTH_CLEAR_VALUE:2931,DEPTH_FUNC:2932,STENCIL_CLEAR_VALUE:2961,STENCIL_FUNC:2962,STENCIL_FAIL:2964,STENCIL_PASS_DEPTH_FAIL:2965,STENCIL_PASS_DEPTH_PASS:2966,STENCIL_REF:2967,STENCIL_VALUE_MASK:2963,STENCIL_WRITEMASK:2968,STENCIL_BACK_FUNC:34816,STENCIL_BACK_FAIL:34817,STENCIL_BACK_PASS_DEPTH_FAIL:34818,STENCIL_BACK_PASS_DEPTH_PASS:34819,STENCIL_BACK_REF:36003,STENCIL_BACK_VALUE_MASK:36004,STENCIL_BACK_WRITEMASK:36005,VIEWPORT:2978,SCISSOR_BOX:3088,COLOR_CLEAR_VALUE:3106,COLOR_WRITEMASK:3107,UNPACK_ALIGNMENT:3317,PACK_ALIGNMENT:3333,MAX_TEXTURE_SIZE:3379,MAX_VIEWPORT_DIMS:3386,SUBPIXEL_BITS:3408,RED_BITS:3410,GREEN_BITS:3411,BLUE_BITS:3412,ALPHA_BITS:3413,DEPTH_BITS:3414,STENCIL_BITS:3415,POLYGON_OFFSET_UNITS:10752,POLYGON_OFFSET_FACTOR:32824,TEXTURE_BINDING_2D:32873,SAMPLE_BUFFERS:32936,SAMPLES:32937,SAMPLE_COVERAGE_VALUE:32938,SAMPLE_COVERAGE_INVERT:32939,COMPRESSED_TEXTURE_FORMATS:34467,DONT_CARE:4352,FASTEST:4353,NICEST:4354,GENERATE_MIPMAP_HINT:33170,BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,DEPTH_COMPONENT:6402,ALPHA:6406,RGB:6407,RGBA:6408,LUMINANCE:6409,LUMINANCE_ALPHA:6410,UNSIGNED_SHORT_4_4_4_4:32819,UNSIGNED_SHORT_5_5_5_1:32820,UNSIGNED_SHORT_5_6_5:33635,FRAGMENT_SHADER:35632,VERTEX_SHADER:35633,MAX_VERTEX_ATTRIBS:34921,MAX_VERTEX_UNIFORM_VECTORS:36347,MAX_VARYING_VECTORS:36348,MAX_COMBINED_TEXTURE_IMAGE_UNITS:35661,MAX_VERTEX_TEXTURE_IMAGE_UNITS:35660,MAX_TEXTURE_IMAGE_UNITS:34930,MAX_FRAGMENT_UNIFORM_VECTORS:36349,SHADER_TYPE:35663,DELETE_STATUS:35712,LINK_STATUS:35714,VALIDATE_STATUS:35715,ATTACHED_SHADERS:35717,ACTIVE_UNIFORMS:35718,ACTIVE_ATTRIBUTES:35721,SHADING_LANGUAGE_VERSION:35724,CURRENT_PROGRAM:35725,NEVER:512,LESS:513,EQUAL:514,LEQUAL:515,GREATER:516,NOTEQUAL:517,GEQUAL:518,ALWAYS:519,KEEP:7680,REPLACE:7681,INCR:7682,DECR:7683,INVERT:5386,INCR_WRAP:34055,DECR_WRAP:34056,VENDOR:7936,RENDERER:7937,VERSION:7938,NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987,TEXTURE_MAG_FILTER:10240,TEXTURE_MIN_FILTER:10241,TEXTURE_WRAP_S:10242,TEXTURE_WRAP_T:10243,TEXTURE_2D:3553,TEXTURE:5890,TEXTURE_CUBE_MAP:34067,TEXTURE_BINDING_CUBE_MAP:34068,TEXTURE_CUBE_MAP_POSITIVE_X:34069,TEXTURE_CUBE_MAP_NEGATIVE_X:34070,TEXTURE_CUBE_MAP_POSITIVE_Y:34071,TEXTURE_CUBE_MAP_NEGATIVE_Y:34072,TEXTURE_CUBE_MAP_POSITIVE_Z:34073,TEXTURE_CUBE_MAP_NEGATIVE_Z:34074,MAX_CUBE_MAP_TEXTURE_SIZE:34076,TEXTURE0:33984,TEXTURE1:33985,TEXTURE2:33986,TEXTURE3:33987,TEXTURE4:33988,TEXTURE5:33989,TEXTURE6:33990,TEXTURE7:33991,TEXTURE8:33992,TEXTURE9:33993,TEXTURE10:33994,TEXTURE11:33995,TEXTURE12:33996,TEXTURE13:33997,TEXTURE14:33998,TEXTURE15:33999,TEXTURE16:34e3,TEXTURE17:34001,TEXTURE18:34002,TEXTURE19:34003,TEXTURE20:34004,TEXTURE21:34005,TEXTURE22:34006,TEXTURE23:34007,TEXTURE24:34008,TEXTURE25:34009,TEXTURE26:34010,TEXTURE27:34011,TEXTURE28:34012,TEXTURE29:34013,TEXTURE30:34014,TEXTURE31:34015,ACTIVE_TEXTURE:34016,REPEAT:10497,CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,INT_VEC2:35667,INT_VEC3:35668,INT_VEC4:35669,BOOL:35670,BOOL_VEC2:35671,BOOL_VEC3:35672,BOOL_VEC4:35673,FLOAT_MAT2:35674,FLOAT_MAT3:35675,FLOAT_MAT4:35676,SAMPLER_2D:35678,SAMPLER_CUBE:35680,VERTEX_ATTRIB_ARRAY_ENABLED:34338,VERTEX_ATTRIB_ARRAY_SIZE:34339,VERTEX_ATTRIB_ARRAY_STRIDE:34340,VERTEX_ATTRIB_ARRAY_TYPE:34341,VERTEX_ATTRIB_ARRAY_NORMALIZED:34922,VERTEX_ATTRIB_ARRAY_POINTER:34373,VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:34975,IMPLEMENTATION_COLOR_READ_TYPE:35738,IMPLEMENTATION_COLOR_READ_FORMAT:35739,COMPILE_STATUS:35713,LOW_FLOAT:36336,MEDIUM_FLOAT:36337,HIGH_FLOAT:36338,LOW_INT:36339,MEDIUM_INT:36340,HIGH_INT:36341,FRAMEBUFFER:36160,RENDERBUFFER:36161,RGBA4:32854,RGB5_A1:32855,RGB565:36194,DEPTH_COMPONENT16:33189,STENCIL_INDEX:6401,STENCIL_INDEX8:36168,DEPTH_STENCIL:34041,RENDERBUFFER_WIDTH:36162,RENDERBUFFER_HEIGHT:36163,RENDERBUFFER_INTERNAL_FORMAT:36164,RENDERBUFFER_RED_SIZE:36176,RENDERBUFFER_GREEN_SIZE:36177,RENDERBUFFER_BLUE_SIZE:36178,RENDERBUFFER_ALPHA_SIZE:36179,RENDERBUFFER_DEPTH_SIZE:36180,RENDERBUFFER_STENCIL_SIZE:36181,FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:36048,FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:36049,FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:36050,FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:36051,COLOR_ATTACHMENT0:36064,DEPTH_ATTACHMENT:36096,STENCIL_ATTACHMENT:36128,DEPTH_STENCIL_ATTACHMENT:33306,NONE:0,FRAMEBUFFER_COMPLETE:36053,FRAMEBUFFER_INCOMPLETE_ATTACHMENT:36054,FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:36055,FRAMEBUFFER_INCOMPLETE_DIMENSIONS:36057,FRAMEBUFFER_UNSUPPORTED:36061,FRAMEBUFFER_BINDING:36006,RENDERBUFFER_BINDING:36007,MAX_RENDERBUFFER_SIZE:34024,INVALID_FRAMEBUFFER_OPERATION:1286,UNPACK_FLIP_Y_WEBGL:37440,UNPACK_PREMULTIPLY_ALPHA_WEBGL:37441,CONTEXT_LOST_WEBGL:37442,UNPACK_COLORSPACE_CONVERSION_WEBGL:37443,BROWSER_DEFAULT_WEBGL:37444,COMPRESSED_RGB_S3TC_DXT1_EXT:33776,COMPRESSED_RGBA_S3TC_DXT1_EXT:33777,COMPRESSED_RGBA_S3TC_DXT3_EXT:33778,COMPRESSED_RGBA_S3TC_DXT5_EXT:33779,COMPRESSED_RGB_PVRTC_4BPPV1_IMG:35840,COMPRESSED_RGB_PVRTC_2BPPV1_IMG:35841,COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:35842,COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:35843,COMPRESSED_RGB_ETC1_WEBGL:36196,HALF_FLOAT_OES:36193,DOUBLE:5130,READ_BUFFER:3074,UNPACK_ROW_LENGTH:3314,UNPACK_SKIP_ROWS:3315,UNPACK_SKIP_PIXELS:3316,PACK_ROW_LENGTH:3330,PACK_SKIP_ROWS:3331,PACK_SKIP_PIXELS:3332,COLOR:6144,DEPTH:6145,STENCIL:6146,RED:6403,RGB8:32849,RGBA8:32856,RGB10_A2:32857,TEXTURE_BINDING_3D:32874,UNPACK_SKIP_IMAGES:32877,UNPACK_IMAGE_HEIGHT:32878,TEXTURE_3D:32879,TEXTURE_WRAP_R:32882,MAX_3D_TEXTURE_SIZE:32883,UNSIGNED_INT_2_10_10_10_REV:33640,MAX_ELEMENTS_VERTICES:33e3,MAX_ELEMENTS_INDICES:33001,TEXTURE_MIN_LOD:33082,TEXTURE_MAX_LOD:33083,TEXTURE_BASE_LEVEL:33084,TEXTURE_MAX_LEVEL:33085,MIN:32775,MAX:32776,DEPTH_COMPONENT24:33190,MAX_TEXTURE_LOD_BIAS:34045,TEXTURE_COMPARE_MODE:34892,TEXTURE_COMPARE_FUNC:34893,CURRENT_QUERY:34917,QUERY_RESULT:34918,QUERY_RESULT_AVAILABLE:34919,STREAM_READ:35041,STREAM_COPY:35042,STATIC_READ:35045,STATIC_COPY:35046,DYNAMIC_READ:35049,DYNAMIC_COPY:35050,MAX_DRAW_BUFFERS:34852,DRAW_BUFFER0:34853,DRAW_BUFFER1:34854,DRAW_BUFFER2:34855,DRAW_BUFFER3:34856,DRAW_BUFFER4:34857,DRAW_BUFFER5:34858,DRAW_BUFFER6:34859,DRAW_BUFFER7:34860,DRAW_BUFFER8:34861,DRAW_BUFFER9:34862,DRAW_BUFFER10:34863,DRAW_BUFFER11:34864,DRAW_BUFFER12:34865,DRAW_BUFFER13:34866,DRAW_BUFFER14:34867,DRAW_BUFFER15:34868,MAX_FRAGMENT_UNIFORM_COMPONENTS:35657,MAX_VERTEX_UNIFORM_COMPONENTS:35658,SAMPLER_3D:35679,SAMPLER_2D_SHADOW:35682,FRAGMENT_SHADER_DERIVATIVE_HINT:35723,PIXEL_PACK_BUFFER:35051,PIXEL_UNPACK_BUFFER:35052,PIXEL_PACK_BUFFER_BINDING:35053,PIXEL_UNPACK_BUFFER_BINDING:35055,FLOAT_MAT2x3:35685,FLOAT_MAT2x4:35686,FLOAT_MAT3x2:35687,FLOAT_MAT3x4:35688,FLOAT_MAT4x2:35689,FLOAT_MAT4x3:35690,SRGB:35904,SRGB8:35905,SRGB8_ALPHA8:35907,COMPARE_REF_TO_TEXTURE:34894,RGBA32F:34836,RGB32F:34837,RGBA16F:34842,RGB16F:34843,VERTEX_ATTRIB_ARRAY_INTEGER:35069,MAX_ARRAY_TEXTURE_LAYERS:35071,MIN_PROGRAM_TEXEL_OFFSET:35076,MAX_PROGRAM_TEXEL_OFFSET:35077,MAX_VARYING_COMPONENTS:35659,TEXTURE_2D_ARRAY:35866,TEXTURE_BINDING_2D_ARRAY:35869,R11F_G11F_B10F:35898,UNSIGNED_INT_10F_11F_11F_REV:35899,RGB9_E5:35901,UNSIGNED_INT_5_9_9_9_REV:35902,TRANSFORM_FEEDBACK_BUFFER_MODE:35967,MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:35968,TRANSFORM_FEEDBACK_VARYINGS:35971,TRANSFORM_FEEDBACK_BUFFER_START:35972,TRANSFORM_FEEDBACK_BUFFER_SIZE:35973,TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:35976,RASTERIZER_DISCARD:35977,MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:35978,MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:35979,INTERLEAVED_ATTRIBS:35980,SEPARATE_ATTRIBS:35981,TRANSFORM_FEEDBACK_BUFFER:35982,TRANSFORM_FEEDBACK_BUFFER_BINDING:35983,RGBA32UI:36208,RGB32UI:36209,RGBA16UI:36214,RGB16UI:36215,RGBA8UI:36220,RGB8UI:36221,RGBA32I:36226,RGB32I:36227,RGBA16I:36232,RGB16I:36233,RGBA8I:36238,RGB8I:36239,RED_INTEGER:36244,RGB_INTEGER:36248,RGBA_INTEGER:36249,SAMPLER_2D_ARRAY:36289,SAMPLER_2D_ARRAY_SHADOW:36292,SAMPLER_CUBE_SHADOW:36293,UNSIGNED_INT_VEC2:36294,UNSIGNED_INT_VEC3:36295,UNSIGNED_INT_VEC4:36296,INT_SAMPLER_2D:36298,INT_SAMPLER_3D:36299,INT_SAMPLER_CUBE:36300,INT_SAMPLER_2D_ARRAY:36303,UNSIGNED_INT_SAMPLER_2D:36306,UNSIGNED_INT_SAMPLER_3D:36307,UNSIGNED_INT_SAMPLER_CUBE:36308,UNSIGNED_INT_SAMPLER_2D_ARRAY:36311,DEPTH_COMPONENT32F:36012,DEPTH32F_STENCIL8:36013,FLOAT_32_UNSIGNED_INT_24_8_REV:36269,FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:33296,FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:33297,FRAMEBUFFER_ATTACHMENT_RED_SIZE:33298,FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:33299,FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:33300,FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:33301,FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:33302,FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:33303,FRAMEBUFFER_DEFAULT:33304,UNSIGNED_INT_24_8:34042,DEPTH24_STENCIL8:35056,UNSIGNED_NORMALIZED:35863,DRAW_FRAMEBUFFER_BINDING:36006,READ_FRAMEBUFFER:36008,DRAW_FRAMEBUFFER:36009,READ_FRAMEBUFFER_BINDING:36010,RENDERBUFFER_SAMPLES:36011,FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:36052,MAX_COLOR_ATTACHMENTS:36063,COLOR_ATTACHMENT1:36065,COLOR_ATTACHMENT2:36066,COLOR_ATTACHMENT3:36067,COLOR_ATTACHMENT4:36068,COLOR_ATTACHMENT5:36069,COLOR_ATTACHMENT6:36070,COLOR_ATTACHMENT7:36071,COLOR_ATTACHMENT8:36072,COLOR_ATTACHMENT9:36073,COLOR_ATTACHMENT10:36074,COLOR_ATTACHMENT11:36075,COLOR_ATTACHMENT12:36076,COLOR_ATTACHMENT13:36077,COLOR_ATTACHMENT14:36078,COLOR_ATTACHMENT15:36079,FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:36182,MAX_SAMPLES:36183,HALF_FLOAT:5131,RG:33319,RG_INTEGER:33320,R8:33321,RG8:33323,R16F:33325,R32F:33326,RG16F:33327,RG32F:33328,R8I:33329,R8UI:33330,R16I:33331,R16UI:33332,R32I:33333,R32UI:33334,RG8I:33335,RG8UI:33336,RG16I:33337,RG16UI:33338,RG32I:33339,RG32UI:33340,VERTEX_ARRAY_BINDING:34229,R8_SNORM:36756,RG8_SNORM:36757,RGB8_SNORM:36758,RGBA8_SNORM:36759,SIGNED_NORMALIZED:36764,COPY_READ_BUFFER:36662,COPY_WRITE_BUFFER:36663,COPY_READ_BUFFER_BINDING:36662,COPY_WRITE_BUFFER_BINDING:36663,UNIFORM_BUFFER:35345,UNIFORM_BUFFER_BINDING:35368,UNIFORM_BUFFER_START:35369,UNIFORM_BUFFER_SIZE:35370,MAX_VERTEX_UNIFORM_BLOCKS:35371,MAX_FRAGMENT_UNIFORM_BLOCKS:35373,MAX_COMBINED_UNIFORM_BLOCKS:35374,MAX_UNIFORM_BUFFER_BINDINGS:35375,MAX_UNIFORM_BLOCK_SIZE:35376,MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:35377,MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:35379,UNIFORM_BUFFER_OFFSET_ALIGNMENT:35380,ACTIVE_UNIFORM_BLOCKS:35382,UNIFORM_TYPE:35383,UNIFORM_SIZE:35384,UNIFORM_BLOCK_INDEX:35386,UNIFORM_OFFSET:35387,UNIFORM_ARRAY_STRIDE:35388,UNIFORM_MATRIX_STRIDE:35389,UNIFORM_IS_ROW_MAJOR:35390,UNIFORM_BLOCK_BINDING:35391,UNIFORM_BLOCK_DATA_SIZE:35392,UNIFORM_BLOCK_ACTIVE_UNIFORMS:35394,UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:35395,UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:35396,UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:35398,INVALID_INDEX:4294967295,MAX_VERTEX_OUTPUT_COMPONENTS:37154,MAX_FRAGMENT_INPUT_COMPONENTS:37157,MAX_SERVER_WAIT_TIMEOUT:37137,OBJECT_TYPE:37138,SYNC_CONDITION:37139,SYNC_STATUS:37140,SYNC_FLAGS:37141,SYNC_FENCE:37142,SYNC_GPU_COMMANDS_COMPLETE:37143,UNSIGNALED:37144,SIGNALED:37145,ALREADY_SIGNALED:37146,TIMEOUT_EXPIRED:37147,CONDITION_SATISFIED:37148,WAIT_FAILED:37149,SYNC_FLUSH_COMMANDS_BIT:1,VERTEX_ATTRIB_ARRAY_DIVISOR:35070,ANY_SAMPLES_PASSED:35887,ANY_SAMPLES_PASSED_CONSERVATIVE:36202,SAMPLER_BINDING:35097,RGB10_A2UI:36975,INT_2_10_10_10_REV:36255,TRANSFORM_FEEDBACK:36386,TRANSFORM_FEEDBACK_PAUSED:36387,TRANSFORM_FEEDBACK_ACTIVE:36388,TRANSFORM_FEEDBACK_BINDING:36389,COMPRESSED_R11_EAC:37488,COMPRESSED_SIGNED_R11_EAC:37489,COMPRESSED_RG11_EAC:37490,COMPRESSED_SIGNED_RG11_EAC:37491,COMPRESSED_RGB8_ETC2:37492,COMPRESSED_SRGB8_ETC2:37493,COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:37494,COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:37495,COMPRESSED_RGBA8_ETC2_EAC:37496,COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:37497,TEXTURE_IMMUTABLE_FORMAT:37167,MAX_ELEMENT_INDEX:36203,TEXTURE_IMMUTABLE_LEVELS:33503,MAX_TEXTURE_MAX_ANISOTROPY_EXT:34047},WebGLConstants$1=Object.freeze(WebGLConstants),ComponentDatatype={BYTE:WebGLConstants$1.BYTE,UNSIGNED_BYTE:WebGLConstants$1.UNSIGNED_BYTE,SHORT:WebGLConstants$1.SHORT,UNSIGNED_SHORT:WebGLConstants$1.UNSIGNED_SHORT,INT:WebGLConstants$1.INT,UNSIGNED_INT:WebGLConstants$1.UNSIGNED_INT,FLOAT:WebGLConstants$1.FLOAT,DOUBLE:WebGLConstants$1.DOUBLE,getSizeInBytes:function(e){switch(e){case ComponentDatatype.BYTE:return Int8Array.BYTES_PER_ELEMENT;case ComponentDatatype.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case ComponentDatatype.SHORT:return Int16Array.BYTES_PER_ELEMENT;case ComponentDatatype.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case ComponentDatatype.INT:return Int32Array.BYTES_PER_ELEMENT;case ComponentDatatype.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT;case ComponentDatatype.FLOAT:return Float32Array.BYTES_PER_ELEMENT;case ComponentDatatype.DOUBLE:return Float64Array.BYTES_PER_ELEMENT}},fromTypedArray:function(e){return e instanceof Int8Array?ComponentDatatype.BYTE:e instanceof Uint8Array?ComponentDatatype.UNSIGNED_BYTE:e instanceof Int16Array?ComponentDatatype.SHORT:e instanceof Uint16Array?ComponentDatatype.UNSIGNED_SHORT:e instanceof Int32Array?ComponentDatatype.INT:e instanceof Uint32Array?ComponentDatatype.UNSIGNED_INT:e instanceof Float32Array?ComponentDatatype.FLOAT:e instanceof Float64Array?ComponentDatatype.DOUBLE:void 0},validate:function(e){return defined(e)&&(e===ComponentDatatype.BYTE||e===ComponentDatatype.UNSIGNED_BYTE||e===ComponentDatatype.SHORT||e===ComponentDatatype.UNSIGNED_SHORT||e===ComponentDatatype.INT||e===ComponentDatatype.UNSIGNED_INT||e===ComponentDatatype.FLOAT||e===ComponentDatatype.DOUBLE)},createTypedArray:function(e,t){switch(e){case ComponentDatatype.BYTE:return new Int8Array(t);case ComponentDatatype.UNSIGNED_BYTE:return new Uint8Array(t);case ComponentDatatype.SHORT:return new Int16Array(t);case ComponentDatatype.UNSIGNED_SHORT:return new Uint16Array(t);case ComponentDatatype.INT:return new Int32Array(t);case ComponentDatatype.UNSIGNED_INT:return new Uint32Array(t);case ComponentDatatype.FLOAT:return new Float32Array(t);case ComponentDatatype.DOUBLE:return new Float64Array(t)}},createArrayBufferView:function(e,t,i,r){switch(i=defaultValue(i,0),r=defaultValue(r,(t.byteLength-i)/ComponentDatatype.getSizeInBytes(e)),e){case ComponentDatatype.BYTE:return new Int8Array(t,i,r);case ComponentDatatype.UNSIGNED_BYTE:return new Uint8Array(t,i,r);case ComponentDatatype.SHORT:return new Int16Array(t,i,r);case ComponentDatatype.UNSIGNED_SHORT:return new Uint16Array(t,i,r);case ComponentDatatype.INT:return new Int32Array(t,i,r);case ComponentDatatype.UNSIGNED_INT:return new Uint32Array(t,i,r);case ComponentDatatype.FLOAT:return new Float32Array(t,i,r);case ComponentDatatype.DOUBLE:return new Float64Array(t,i,r)}},fromName:function(e){switch(e){case"BYTE":return ComponentDatatype.BYTE;case"UNSIGNED_BYTE":return ComponentDatatype.UNSIGNED_BYTE;case"SHORT":return ComponentDatatype.SHORT;case"UNSIGNED_SHORT":return ComponentDatatype.UNSIGNED_SHORT;case"INT":return ComponentDatatype.INT;case"UNSIGNED_INT":return ComponentDatatype.UNSIGNED_INT;case"FLOAT":return ComponentDatatype.FLOAT;case"DOUBLE":return ComponentDatatype.DOUBLE}}},ComponentDatatype$1=Object.freeze(ComponentDatatype),TerrainQuantization={NONE:0,BITS12:1},TerrainQuantization$1=Object.freeze(TerrainQuantization),cartesian3Scratch=new Cartesian3,cartesian3DimScratch=new Cartesian3,cartesian2Scratch=new Cartesian2,matrix4Scratch=new Matrix4,matrix4Scratch2=new Matrix4,SHIFT_LEFT_12=Math.pow(2,12);function TerrainEncoding(e,t,i,r,n,a){var o,s,l,c,u,d,h,p,m,f,g,_,y=TerrainQuantization$1.NONE;defined(e)&&defined(t)&&defined(i)&&defined(r)&&(s=e.minimum,l=e.maximum,c=Cartesian3.subtract(l,s,cartesian3DimScratch),u=i-t,y=Math.max(Cartesian3.maximumComponent(c),u)<SHIFT_LEFT_12-1?TerrainQuantization$1.BITS12:TerrainQuantization$1.NONE,d=e.center,h=Matrix4.inverseTransformation(r,new Matrix4),p=Cartesian3.negate(s,cartesian3Scratch),Matrix4.multiply(Matrix4.fromTranslation(p,matrix4Scratch),h,h),(m=cartesian3Scratch).x=1/c.x,m.y=1/c.y,m.z=1/c.z,Matrix4.multiply(Matrix4.fromScale(m,matrix4Scratch),h,h),o=Matrix4.clone(r),Matrix4.setTranslation(o,Cartesian3.ZERO,o),r=Matrix4.clone(r,new Matrix4),f=Matrix4.fromTranslation(s,matrix4Scratch),g=Matrix4.fromScale(c,matrix4Scratch2),_=Matrix4.multiply(f,g,matrix4Scratch),Matrix4.multiply(r,_,r),Matrix4.multiply(o,_,o)),this.quantization=y,this.minimumHeight=t,this.maximumHeight=i,this.center=d,this.toScaledENU=h,this.fromScaledENU=r,this.matrix=o,this.hasVertexNormals=n,this.hasWebMercatorT=defaultValue(a,!1)}TerrainEncoding.prototype.encode=function(e,t,i,r,n,a,o){var s,l,c,u,d,h,p=r.x,m=r.y;return this.quantization===TerrainQuantization$1.BITS12?((i=Matrix4.multiplyByPoint(this.toScaledENU,i,cartesian3Scratch)).x=CesiumMath.clamp(i.x,0,1),i.y=CesiumMath.clamp(i.y,0,1),i.z=CesiumMath.clamp(i.z,0,1),s=this.maximumHeight-this.minimumHeight,l=CesiumMath.clamp((n-this.minimumHeight)/s,0,1),Cartesian2.fromElements(i.x,i.y,cartesian2Scratch),c=AttributeCompression.compressTextureCoordinates(cartesian2Scratch),Cartesian2.fromElements(i.z,l,cartesian2Scratch),u=AttributeCompression.compressTextureCoordinates(cartesian2Scratch),Cartesian2.fromElements(p,m,cartesian2Scratch),d=AttributeCompression.compressTextureCoordinates(cartesian2Scratch),e[t++]=c,e[t++]=u,e[t++]=d,this.hasWebMercatorT&&(Cartesian2.fromElements(o,0,cartesian2Scratch),h=AttributeCompression.compressTextureCoordinates(cartesian2Scratch),e[t++]=h)):(Cartesian3.subtract(i,this.center,cartesian3Scratch),e[t++]=cartesian3Scratch.x,e[t++]=cartesian3Scratch.y,e[t++]=cartesian3Scratch.z,e[t++]=n,e[t++]=p,e[t++]=m,this.hasWebMercatorT&&(e[t++]=o)),this.hasVertexNormals&&(e[t++]=AttributeCompression.octPackFloat(a)),t},TerrainEncoding.prototype.decodePosition=function(e,t,i){if(defined(i)||(i=new Cartesian3),t*=this.getStride(),this.quantization!==TerrainQuantization$1.BITS12)return i.x=e[t],i.y=e[t+1],i.z=e[t+2],Cartesian3.add(i,this.center,i);var r=AttributeCompression.decompressTextureCoordinates(e[t],cartesian2Scratch);i.x=r.x,i.y=r.y;var n=AttributeCompression.decompressTextureCoordinates(e[t+1],cartesian2Scratch);return i.z=n.x,Matrix4.multiplyByPoint(this.fromScaledENU,i,i)},TerrainEncoding.prototype.decodeTextureCoordinates=function(e,t,i){return defined(i)||(i=new Cartesian2),t*=this.getStride(),this.quantization===TerrainQuantization$1.BITS12?AttributeCompression.decompressTextureCoordinates(e[t+2],i):Cartesian2.fromElements(e[t+4],e[t+5],i)},TerrainEncoding.prototype.decodeHeight=function(e,t){return t*=this.getStride(),this.quantization!==TerrainQuantization$1.BITS12?e[t+3]:AttributeCompression.decompressTextureCoordinates(e[t+1],cartesian2Scratch).y*(this.maximumHeight-this.minimumHeight)+this.minimumHeight},TerrainEncoding.prototype.decodeWebMercatorT=function(e,t){return t*=this.getStride(),this.quantization===TerrainQuantization$1.BITS12?AttributeCompression.decompressTextureCoordinates(e[t+3],cartesian2Scratch).x:e[t+6]},TerrainEncoding.prototype.getOctEncodedNormal=function(e,t,i){var r=e[t=(t+1)*this.getStride()-1]/256,n=Math.floor(r),a=256*(r-n);return Cartesian2.fromElements(n,a,i)},TerrainEncoding.prototype.getStride=function(){var e;switch(this.quantization){case TerrainQuantization$1.BITS12:e=3;break;default:e=6}return this.hasWebMercatorT&&++e,this.hasVertexNormals&&++e,e};var attributesNone={position3DAndHeight:0,textureCoordAndEncodedNormals:1},attributes={compressed0:0,compressed1:1};function WebMercatorProjection(e){this._ellipsoid=defaultValue(e,Ellipsoid.WGS84),this._semimajorAxis=this._ellipsoid.maximumRadius,this._oneOverSemimajorAxis=1/this._semimajorAxis}TerrainEncoding.prototype.getAttributes=function(e){var t,i=ComponentDatatype$1.FLOAT,r=ComponentDatatype$1.getSizeInBytes(i);if(this.quantization===TerrainQuantization$1.NONE){var n=2;return this.hasWebMercatorT&&++n,this.hasVertexNormals&&++n,t=(4+n)*r,[{index:attributesNone.position3DAndHeight,vertexBuffer:e,componentDatatype:i,componentsPerAttribute:4,offsetInBytes:0,strideInBytes:t},{index:attributesNone.textureCoordAndEncodedNormals,vertexBuffer:e,componentDatatype:i,componentsPerAttribute:n,offsetInBytes:4*r,strideInBytes:t}]}var a=3;return(this.hasWebMercatorT||this.hasVertexNormals)&&++a,this.hasWebMercatorT&&this.hasVertexNormals?(t=(a+1)*r,[{index:attributes.compressed0,vertexBuffer:e,componentDatatype:i,componentsPerAttribute:a,offsetInBytes:0,strideInBytes:t},{index:attributes.compressed1,vertexBuffer:e,componentDatatype:i,componentsPerAttribute:1,offsetInBytes:a*r,strideInBytes:t}]):[{index:attributes.compressed0,vertexBuffer:e,componentDatatype:i,componentsPerAttribute:a}]},TerrainEncoding.prototype.getAttributeLocations=function(){return this.quantization===TerrainQuantization$1.NONE?attributesNone:attributes},TerrainEncoding.clone=function(e,t){return defined(t)||(t=new TerrainEncoding),t.quantization=e.quantization,t.minimumHeight=e.minimumHeight,t.maximumHeight=e.maximumHeight,t.center=Cartesian3.clone(e.center),t.toScaledENU=Matrix4.clone(e.toScaledENU),t.fromScaledENU=Matrix4.clone(e.fromScaledENU),t.matrix=Matrix4.clone(e.matrix),t.hasVertexNormals=e.hasVertexNormals,t.hasWebMercatorT=e.hasWebMercatorT,t},Object.defineProperties(WebMercatorProjection.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}}),WebMercatorProjection.mercatorAngleToGeodeticLatitude=function(e){return CesiumMath.PI_OVER_TWO-2*Math.atan(Math.exp(-e))},WebMercatorProjection.geodeticLatitudeToMercatorAngle=function(e){e>WebMercatorProjection.MaximumLatitude?e=WebMercatorProjection.MaximumLatitude:e<-WebMercatorProjection.MaximumLatitude&&(e=-WebMercatorProjection.MaximumLatitude);var t=Math.sin(e);return.5*Math.log((1+t)/(1-t))},WebMercatorProjection.MaximumLatitude=WebMercatorProjection.mercatorAngleToGeodeticLatitude(Math.PI),WebMercatorProjection.prototype.project=function(e,t){var i=this._semimajorAxis,r=e.longitude*i,n=WebMercatorProjection.geodeticLatitudeToMercatorAngle(e.latitude)*i,a=e.height;return defined(t)?(t.x=r,t.y=n,t.z=a,t):new Cartesian3(r,n,a)},WebMercatorProjection.prototype.unproject=function(e,t){var i=this._oneOverSemimajorAxis,r=e.x*i,n=WebMercatorProjection.mercatorAngleToGeodeticLatitude(e.y*i),a=e.z;return defined(t)?(t.longitude=r,t.latitude=n,t.height=a,t):new Cartographic(r,n,a)};var HeightmapTessellator={};HeightmapTessellator.DEFAULT_STRUCTURE=Object.freeze({heightScale:1,heightOffset:0,elementsPerHeight:1,stride:1,elementMultiplier:256,isBigEndian:!1});var cartesian3Scratch$1=new Cartesian3,matrix4Scratch$1=new Matrix4,minimumScratch=new Cartesian3,maximumScratch=new Cartesian3;function returnTrue(){return!0}function destroyObject(e,t){function i(){}for(var r in e)"function"==typeof e[r]&&(e[r]=i);e.isDestroyed=returnTrue}function canTransferArrayBuffer(){if(!defined(TaskProcessor._canTransferArrayBuffer)){var r=new Worker(getWorkerUrl("Workers/transferTypedArrayTest.js"));r.postMessage=defaultValue(r.webkitPostMessage,r.postMessage);var e=new Int8Array([99]);try{r.postMessage({array:e},[e.buffer])}catch(e){return TaskProcessor._canTransferArrayBuffer=!1,TaskProcessor._canTransferArrayBuffer}var n=when.defer();r.onmessage=function(e){var t=e.data.array,i=defined(t)&&99===t[0];n.resolve(i),r.terminate(),TaskProcessor._canTransferArrayBuffer=i},TaskProcessor._canTransferArrayBuffer=n.promise}return TaskProcessor._canTransferArrayBuffer}HeightmapTessellator.computeVertices=function(e){var t,i,r,n=Math.cos,a=Math.sin,o=Math.sqrt,s=Math.atan,l=Math.exp,c=CesiumMath.PI_OVER_TWO,u=CesiumMath.toRadians,d=e.heightmap,h=e.width,p=e.height,m=e.skirtHeight,f=defaultValue(e.isGeographic,!0),g=defaultValue(e.ellipsoid,Ellipsoid.WGS84),_=1/g.maximumRadius,y=e.nativeRectangle,v=e.rectangle,C=defined(v)?(t=v.west,i=v.south,r=v.east,v.north):f?(t=u(y.west),i=u(y.south),r=u(y.east),u(y.north)):(t=y.west*_,i=c-2*s(l(-y.south*_)),r=y.east*_,c-2*s(l(-y.north*_))),S=defined(T=e.relativeToCenter),T=S?T:Cartesian3.ZERO,x=defaultValue(e.exaggeration,1),b=defaultValue(e.includeWebMercatorT,!1),E=defaultValue(e.structure,HeightmapTessellator.DEFAULT_STRUCTURE),P=defaultValue(E.heightScale,HeightmapTessellator.DEFAULT_STRUCTURE.heightScale),A=defaultValue(E.heightOffset,HeightmapTessellator.DEFAULT_STRUCTURE.heightOffset),w=defaultValue(E.elementsPerHeight,HeightmapTessellator.DEFAULT_STRUCTURE.elementsPerHeight),D=defaultValue(E.stride,HeightmapTessellator.DEFAULT_STRUCTURE.stride),M=defaultValue(E.elementMultiplier,HeightmapTessellator.DEFAULT_STRUCTURE.elementMultiplier),I=defaultValue(E.isBigEndian,HeightmapTessellator.DEFAULT_STRUCTURE.isBigEndian),R=Rectangle.computeWidth(y),O=Rectangle.computeHeight(y),L=R/(h-1),F=O/(p-1);f||(R*=_,O*=_);var N,B,V=g.radiiSquared,k=V.x,z=V.y,$=V.z,U=65536,G=-65536,H=Transforms.eastNorthUpToFixedFrame(T,g),W=Matrix4.inverseTransformation(H,matrix4Scratch$1);b&&(N=WebMercatorProjection.geodeticLatitudeToMercatorAngle(i),B=1/(WebMercatorProjection.geodeticLatitudeToMercatorAngle(C)-N));var q=minimumScratch;q.x=Number.POSITIVE_INFINITY,q.y=Number.POSITIVE_INFINITY,q.z=Number.POSITIVE_INFINITY;var j=maximumScratch;j.x=Number.NEGATIVE_INFINITY,j.y=Number.NEGATIVE_INFINITY,j.z=Number.NEGATIVE_INFINITY;var Y=Number.POSITIVE_INFINITY,X=h*p,Q=X+(0<m?2*h+2*p:0),J=new Array(Q),Z=new Array(Q),K=new Array(Q),ee=b?new Array(Q):[],te=0,ie=p,re=0,ne=h;0<m&&(--te,++ie,--re,++ne);for(var ae=te;ae<ie;++ae){var oe=ae;oe<0&&(oe=0),p<=oe&&(oe=p-1);var se=y.north-F*oe,le=((se=f?u(se):c-2*s(l(-se*_)))-i)/(C-i),le=CesiumMath.clamp(le,0,1),ce=ae===te,ue=ae===ie-1;0<m&&(ce?se+=1e-5*O:ue&&(se-=1e-5*O));var de,he=n(se),pe=a(se),me=$*pe;b&&(de=(WebMercatorProjection.geodeticLatitudeToMercatorAngle(se)-N)*B);for(var fe=re;fe<ne;++fe){var ge=fe;ge<0&&(ge=0),h<=ge&&(ge=h-1);var _e=oe*(h*D)+ge*D;if(1===w)ve=d[_e];else{var ye,ve=0;if(I)for(ye=0;ye<w;++ye)ve=ve*M+d[_e+ye];else for(ye=w-1;0<=ye;--ye)ve=ve*M+d[_e+ye]}ve=(ve*P+A)*x,G=Math.max(G,ve),U=Math.min(U,ve);var Ce=y.west+L*ge;f?Ce=u(Ce):Ce*=_;var Se=(Ce-t)/(r-t),Se=CesiumMath.clamp(Se,0,1),Te=oe*h+ge;if(0<m){var xe=fe===re,be=fe===ne-1,Ee=ce||ue||xe||be;if((ce||ue)&&(xe||be))continue;Ee&&(ve-=m,xe?(Te=p-oe-1+X,Ce-=1e-5*R):ue?Te=X+p+(h-ge-1):be?(Te=X+p+h+oe,Ce+=1e-5*R):ce&&(Te=X+p+h+p+ge))}var Pe=he*n(Ce),Ae=he*a(Ce),we=k*Pe,De=z*Ae,Me=1/o(we*Pe+De*Ae+me*pe),Ie=we*Me,Re=De*Me,Oe=me*Me,Le=new Cartesian3;Le.x=Ie+Pe*ve,Le.y=Re+Ae*ve,Le.z=Oe+pe*ve,J[Te]=Le,Z[Te]=ve,K[Te]=new Cartesian2(Se,le),b&&(ee[Te]=de),Matrix4.multiplyByPoint(W,Le,cartesian3Scratch$1),Cartesian3.minimumByComponent(cartesian3Scratch$1,q,q),Cartesian3.maximumByComponent(cartesian3Scratch$1,j,j),Y=Math.min(Y,ve)}}var Fe,Ne,Be=BoundingSphere.fromPoints(J);defined(v)&&(Fe=OrientedBoundingBox.fromRectangle(v,U,G,g)),S&&(Ne=new EllipsoidalOccluder(g).computeHorizonCullingPointPossiblyUnderEllipsoid(T,J,U));for(var Ve=new TerrainEncoding(new AxisAlignedBoundingBox(q,j,T),Y,G,H,!1,b),ke=new Float32Array(Q*Ve.getStride()),ze=0,$e=0;$e<Q;++$e)ze=Ve.encode(ke,ze,J[$e],K[$e],Z[$e],void 0,ee[$e]);return{vertices:ke,maximumHeight:G,minimumHeight:U,encoding:Ve,boundingSphere3D:Be,orientedBoundingBox:Fe,occludeePointInScaledSpace:Ne}};var taskCompletedEvent=new Event,bootstrapperUrlResult;function completeTask(e,t){--e._activeTasks;var i,r,n,a=t.id;defined(a)&&(r=(i=e._deferreds)[a],defined(t.error)?("RuntimeError"===(n=t.error).name?(n=new RuntimeError(t.error.message)).stack=t.error.stack:"DeveloperError"===n.name&&((n=new DeveloperError(t.error.message)).stack=t.error.stack),taskCompletedEvent.raiseEvent(n),r.reject(n)):(taskCompletedEvent.raiseEvent(),r.resolve(t.result)),delete i[a])}function getWorkerUrl(e){if(isCrossOriginUrl(n=buildModuleUrl(e))){var t,i='importScripts("'+n+'");';try{t=new Blob([i],{type:"application/javascript"})}catch(e){var r=new(window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder);r.append(i),t=r.getBlob("application/javascript")}var n=(window.URL||window.webkitURL).createObjectURL(t)}return n}function getBootstrapperUrl(){return defined(bootstrapperUrlResult)||(bootstrapperUrlResult=getWorkerUrl("Workers/cesiumWorkerBootstrapper.js")),bootstrapperUrlResult}function createWorker(t){var e=new Worker(getBootstrapperUrl());e.postMessage=defaultValue(e.webkitPostMessage,e.postMessage);var i={loaderConfig:{paths:{Workers:buildModuleUrl("Workers")},baseUrl:buildModuleUrl.getCesiumBaseUrl().url},workerModule:TaskProcessor._workerModulePrefix+t._workerName};return e.postMessage(i),e.onmessage=function(e){completeTask(t,e.data)},e}function getWebAssemblyLoaderConfig(e,t){var i={modulePath:void 0,wasmBinaryFile:void 0,wasmBinary:void 0};if(FeatureDetection.supportsWebAssembly())return i.modulePath=buildModuleUrl(t.modulePath),i.wasmBinaryFile=buildModuleUrl(t.wasmBinaryFile),Resource.fetchArrayBuffer({url:i.wasmBinaryFile}).then(function(e){return i.wasmBinary=e,i});if(!defined(t.fallbackModulePath))throw new RuntimeError("This browser does not support Web Assembly, and no backup module was provided for "+e._workerName);return i.modulePath=buildModuleUrl(t.fallbackModulePath),when.resolve(i)}function TaskProcessor(e,t){this._workerName=e,this._maximumActiveTasks=defaultValue(t,5),this._activeTasks=0,this._deferreds={},this._nextID=0}var emptyTransferableObjectArray=[];function TerrainMesh(e,t,i,r,n,a,o,s,l,c,u,d,h,p,m,f,g){this.center=e,this.vertices=t,this.stride=defaultValue(c,6),this.indices=i,this.indexCountWithoutSkirts=r,this.vertexCountWithoutSkirts=n,this.minimumHeight=a,this.maximumHeight=o,this.boundingSphere3D=s,this.occludeePointInScaledSpace=l,this.orientedBoundingBox=u,this.encoding=d,this.exaggeration=h,this.westIndicesSouthToNorth=p,this.southIndicesEastToWest=m,this.eastIndicesNorthToSouth=f,this.northIndicesWestToEast=g}TaskProcessor.prototype.scheduleTask=function(r,n){if(defined(this._worker)||(this._worker=createWorker(this)),!(this._activeTasks>=this._maximumActiveTasks)){++this._activeTasks;var a=this;return when(canTransferArrayBuffer(),function(e){defined(n)?e||(n.length=0):n=emptyTransferableObjectArray;var t=a._nextID++,i=when.defer();return a._deferreds[t]=i,a._worker.postMessage({id:t,parameters:r,canTransferArrayBuffer:e},n),i.promise})}},TaskProcessor.prototype.initWebAssemblyModule=function(e){defined(this._worker)||(this._worker=createWorker(this));var n=when.defer(),a=this,o=this._worker;return getWebAssemblyLoaderConfig(this,e).then(function(r){return when(canTransferArrayBuffer(),function(e){var t,i=r.wasmBinary;defined(i)&&e&&(t=[i]),o.onmessage=function(e){o.onmessage=function(e){completeTask(a,e.data)},n.resolve(e.data)},o.postMessage({webAssemblyConfig:r},t)})}),n},TaskProcessor.prototype.isDestroyed=function(){return!1},TaskProcessor.prototype.destroy=function(){return defined(this._worker)&&this._worker.terminate(),destroyObject(this)},TaskProcessor.taskCompletedEvent=taskCompletedEvent,TaskProcessor._defaultWorkerModulePrefix="Workers/",TaskProcessor._workerModulePrefix=TaskProcessor._defaultWorkerModulePrefix,TaskProcessor._canTransferArrayBuffer=void 0;var IndexDatatype={UNSIGNED_BYTE:WebGLConstants$1.UNSIGNED_BYTE,UNSIGNED_SHORT:WebGLConstants$1.UNSIGNED_SHORT,UNSIGNED_INT:WebGLConstants$1.UNSIGNED_INT,getSizeInBytes:function(e){switch(e){case IndexDatatype.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case IndexDatatype.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case IndexDatatype.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT}},fromSizeInBytes:function(e){switch(e){case 2:return IndexDatatype.UNSIGNED_SHORT;case 4:return IndexDatatype.UNSIGNED_INT;case 1:return IndexDatatype.UNSIGNED_BYTE}},validate:function(e){return defined(e)&&(e===IndexDatatype.UNSIGNED_BYTE||e===IndexDatatype.UNSIGNED_SHORT||e===IndexDatatype.UNSIGNED_INT)},createTypedArray:function(e,t){return new(e>=CesiumMath.SIXTY_FOUR_KILOBYTES?Uint32Array:Uint16Array)(t)},createTypedArrayFromArrayBuffer:function(e,t,i,r){return new(e>=CesiumMath.SIXTY_FOUR_KILOBYTES?Uint32Array:Uint16Array)(t,i,r)}},IndexDatatype$1=Object.freeze(IndexDatatype);function TerrainProvider(){DeveloperError.throwInstantiationError()}Object.defineProperties(TerrainProvider.prototype,{errorEvent:{get:DeveloperError.throwInstantiationError},credit:{get:DeveloperError.throwInstantiationError},tilingScheme:{get:DeveloperError.throwInstantiationError},ready:{get:DeveloperError.throwInstantiationError},readyPromise:{get:DeveloperError.throwInstantiationError},hasWaterMask:{get:DeveloperError.throwInstantiationError},hasVertexNormals:{get:DeveloperError.throwInstantiationError},availability:{get:DeveloperError.throwInstantiationError}});var regularGridIndicesCache=[];TerrainProvider.getRegularGridIndices=function(e,t){var i=regularGridIndicesCache[e];defined(i)||(regularGridIndicesCache[e]=i=[]);var r=i[t];return defined(r)||addRegularGridIndices(e,t,r=e*t<CesiumMath.SIXTY_FOUR_KILOBYTES?i[t]=new Uint16Array((e-1)*(t-1)*6):i[t]=new Uint32Array((e-1)*(t-1)*6),0),r};var regularGridAndEdgeIndicesCache=[];TerrainProvider.getRegularGridIndicesAndEdgeIndices=function(e,t){var i=regularGridAndEdgeIndicesCache[e];defined(i)||(regularGridAndEdgeIndicesCache[e]=i=[]);var r,n,a,o,s,l,c=i[t];return defined(c)||(r=TerrainProvider.getRegularGridIndices(e,t),a=(n=getEdgeIndices(e,t)).westIndicesSouthToNorth,o=n.southIndicesEastToWest,s=n.eastIndicesNorthToSouth,l=n.northIndicesWestToEast,c=i[t]={indices:r,westIndicesSouthToNorth:a,southIndicesEastToWest:o,eastIndicesNorthToSouth:s,northIndicesWestToEast:l}),c};var regularGridAndSkirtAndEdgeIndicesCache=[];function getEdgeIndices(e,t){for(var i=new Array(t),r=new Array(e),n=new Array(t),a=new Array(e),o=0;o<e;++o)r[a[o]=o]=e*t-1-o;for(o=0;o<t;++o)n[o]=(o+1)*e-1,i[o]=(t-o-1)*e;return{westIndicesSouthToNorth:i,southIndicesEastToWest:r,eastIndicesNorthToSouth:n,northIndicesWestToEast:a}}function addRegularGridIndices(e,t,i,r){for(var n=0,a=0;a<t-1;++a){for(var o=0;o<e-1;++o){var s=n+e,l=s+1,c=n+1;i[r++]=n,i[r++]=s,i[r++]=c,i[r++]=c,i[r++]=s,i[r++]=l,++n}++n}}function addSkirtIndices(e,t,i,r){for(var n=e[0],a=e.length,o=1;o<a;++o){var s=e[o];i[r++]=n,i[r++]=s,i[r++]=t,i[r++]=t,i[r++]=s,i[r++]=t+1,n=s,++t}return r}function HeightmapTerrainData(e){this._buffer=e.buffer,this._width=e.width,this._height=e.height,this._childTileMask=defaultValue(e.childTileMask,15),this._encoding=defaultValue(e.encoding,HeightmapEncoding$1.NONE);var t=HeightmapTessellator.DEFAULT_STRUCTURE,i=e.structure;defined(i)?i!==t&&(i.heightScale=defaultValue(i.heightScale,t.heightScale),i.heightOffset=defaultValue(i.heightOffset,t.heightOffset),i.elementsPerHeight=defaultValue(i.elementsPerHeight,t.elementsPerHeight),i.stride=defaultValue(i.stride,t.stride),i.elementMultiplier=defaultValue(i.elementMultiplier,t.elementMultiplier),i.isBigEndian=defaultValue(i.isBigEndian,t.isBigEndian)):i=t,this._structure=i,this._createdByUpsampling=defaultValue(e.createdByUpsampling,!1),this._waterMask=e.waterMask,this._skirtHeight=void 0,this._bufferType=this._encoding===HeightmapEncoding$1.LERC?Float32Array:this._buffer.constructor,this._mesh=void 0}TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices=function(e,t){var i=regularGridAndSkirtAndEdgeIndicesCache[e];defined(i)||(regularGridAndSkirtAndEdgeIndicesCache[e]=i=[]);var r,n,a,o,s,l,c,u,d,h,p,m=i[t];return defined(m)||(o=(r=e*t)+(a=2*e+2*t),s=(n=(e-1)*(t-1)*6)+6*Math.max(0,a-4),c=(l=getEdgeIndices(e,t)).westIndicesSouthToNorth,u=l.southIndicesEastToWest,d=l.eastIndicesNorthToSouth,h=l.northIndicesWestToEast,addRegularGridIndices(e,t,p=IndexDatatype$1.createTypedArray(o,s),0),TerrainProvider.addSkirtIndices(c,u,d,h,r,p,n),m=i[t]={indices:p,westIndicesSouthToNorth:c,southIndicesEastToWest:u,eastIndicesNorthToSouth:d,northIndicesWestToEast:h,indexCountWithoutSkirts:n}),m},TerrainProvider.addSkirtIndices=function(e,t,i,r,n,a,o){var s=n;o=addSkirtIndices(e,s,a,o),o=addSkirtIndices(t,s+=e.length,a,o),o=addSkirtIndices(i,s+=t.length,a,o),addSkirtIndices(r,s+=i.length,a,o)},TerrainProvider.heightmapTerrainQuality=.25,TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap=function(e,t,i){return 2*e.maximumRadius*Math.PI*TerrainProvider.heightmapTerrainQuality/(t*i)},TerrainProvider.prototype.requestTileGeometry=DeveloperError.throwInstantiationError,TerrainProvider.prototype.getLevelMaximumGeometricError=DeveloperError.throwInstantiationError,TerrainProvider.prototype.getTileDataAvailable=DeveloperError.throwInstantiationError,TerrainProvider.prototype.loadTileDataAvailability=DeveloperError.throwInstantiationError,Object.defineProperties(HeightmapTerrainData.prototype,{credits:{get:function(){}},waterMask:{get:function(){return this._waterMask}},childTileMask:{get:function(){return this._childTileMask}}});var taskProcessor=new TaskProcessor("createVerticesFromHeightmap");function interpolateHeight(e,t,i,r,n,a,o,s,l,c){var u=(l-a.west)*(o-1)/(a.east-a.west),d=(c-a.south)*(s-1)/(a.north-a.south),h=0|u,p=h+1;o<=p&&(p=o-1,h=o-2);var m=0|d;s<=(f=m+1)&&(f=s-1,m=s-2);var f=s-1-f;return triangleInterpolateHeight(u-h,d-m,getHeight(e,t,i,r,n,(m=s-1-m)*o+h),getHeight(e,t,i,r,n,m*o+p),getHeight(e,t,i,r,n,f*o+h),getHeight(e,t,i,r,n,f*o+p))}function interpolateMeshHeight(e,t,i,r,n,a,o,s,l,c){var u=(s-n.west)*(a-1)/(n.east-n.west),d=(l-n.south)*(o-1)/(n.north-n.south),h=0|u,p=h+1;a<=p&&(p=a-1,h=a-2),o<=(g=(f=0|d)+1)&&(g=o-1,f=o-2);var m=d-f,f=o-1-f,g=o-1-g;return triangleInterpolateHeight(u-h,m,(t.decodeHeight(e,f*a+h)/c-i)/r,(t.decodeHeight(e,f*a+p)/c-i)/r,(t.decodeHeight(e,g*a+h)/c-i)/r,(t.decodeHeight(e,g*a+p)/c-i)/r)}function triangleInterpolateHeight(e,t,i,r,n,a){return t<e?i+e*(r-i)+t*(a-r):i+e*(a-n)+t*(n-i)}function getHeight(e,t,i,r,n,a){a*=r;var o,s=0;if(n)for(o=0;o<t;++o)s=s*i+e[a+o];else for(o=t-1;0<=o;--o)s=s*i+e[a+o];return s}function setHeight(e,t,i,r,n,a,o,s){var l;if(o*=n,a)for(l=0;l<t-1;++l)e[o+l]=s/r|0,s-=e[o+l]*r,r/=i;else for(l=t-1;0<l;--l)e[o+l]=s/r|0,s-=e[o+l]*r,r/=i;e[o+l]=s}function TileAvailability(e,t){this._tilingScheme=e,this._maximumLevel=t,this._rootNodes=[]}HeightmapTerrainData.prototype.createMesh=function(e,t,i,r,n){var a=e.ellipsoid,o=e.tileXYToNativeRectangle(t,i,r),s=e.tileXYToRectangle(t,i,r);n=defaultValue(n,1);var l=a.cartographicToCartesian(Rectangle.center(s)),c=this._structure,u=TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(a,this._width,e.getNumberOfXTilesAtLevel(0))/(1<<r);this._skirtHeight=Math.min(4*u,1e3);var d=taskProcessor.scheduleTask({heightmap:this._buffer,structure:c,includeWebMercatorT:!0,width:this._width,height:this._height,nativeRectangle:o,rectangle:s,relativeToCenter:l,ellipsoid:a,skirtHeight:this._skirtHeight,isGeographic:e.projection instanceof GeographicProjection,exaggeration:n,encoding:this._encoding});if(defined(d)){var h=this;return when(d,function(e){var t=0<h._skirtHeight?TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices(e.gridWidth,e.gridHeight):TerrainProvider.getRegularGridIndicesAndEdgeIndices(e.gridWidth,e.gridHeight),i=e.gridWidth*e.gridHeight;return h._mesh=new TerrainMesh(l,new Float32Array(e.vertices),t.indices,t.indexCountWithoutSkirts,i,e.minimumHeight,e.maximumHeight,BoundingSphere.clone(e.boundingSphere3D),Cartesian3.clone(e.occludeePointInScaledSpace),e.numberOfAttributes,OrientedBoundingBox.clone(e.orientedBoundingBox),TerrainEncoding.clone(e.encoding),n,t.westIndicesSouthToNorth,t.southIndicesEastToWest,t.eastIndicesNorthToSouth,t.northIndicesWestToEast),h._buffer=void 0,h._mesh})}},HeightmapTerrainData.prototype._createMeshSync=function(e,t,i,r,n){var a=e.ellipsoid,o=e.tileXYToNativeRectangle(t,i,r),s=e.tileXYToRectangle(t,i,r);n=defaultValue(n,1);var l=a.cartographicToCartesian(Rectangle.center(s)),c=this._structure,u=TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(a,this._width,e.getNumberOfXTilesAtLevel(0))/(1<<r);this._skirtHeight=Math.min(4*u,1e3);var d,h=HeightmapTessellator.computeVertices({heightmap:this._buffer,structure:c,includeWebMercatorT:!0,width:this._width,height:this._height,nativeRectangle:o,rectangle:s,relativeToCenter:l,ellipsoid:a,skirtHeight:this._skirtHeight,isGeographic:e.projection instanceof GeographicProjection,exaggeration:n});this._buffer=void 0,d=0<this._skirtHeight?TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices(this._width,this._height):TerrainProvider.getRegularGridIndicesAndEdgeIndices(this._width,this._height);var p=h.gridWidth*h.gridHeight;return new TerrainMesh(l,h.vertices,d.indices,d.indexCountWithoutSkirts,p,h.minimumHeight,h.maximumHeight,h.boundingSphere3D,h.occludeePointInScaledSpace,h.encoding.getStride(),h.orientedBoundingBox,h.encoding,n,d.westIndicesSouthToNorth,d.southIndicesEastToWest,d.eastIndicesNorthToSouth,d.northIndicesWestToEast)},HeightmapTerrainData.prototype.interpolateHeight=function(e,t,i){var r=this._width,n=this._height,a=this._structure,o=a.stride,s=a.elementsPerHeight,l=a.elementMultiplier,c=a.isBigEndian,u=a.heightOffset,d=a.heightScale;return defined(this._mesh)?interpolateMeshHeight(this._mesh.vertices,this._mesh.encoding,u,d,e,r,n,t,i,this._mesh.exaggeration):interpolateHeight(this._buffer,s,l,o,c,e,r,n,t,i)*d+u},HeightmapTerrainData.prototype.upsample=function(e,t,i,r,n,a,o){var s=this._mesh;if(defined(s)){for(var l=this._width,c=this._height,u=this._structure,d=u.stride,h=new this._bufferType(l*c*d),p=s.vertices,m=s.encoding,f=e.tileXYToRectangle(t,i,r),g=e.tileXYToRectangle(n,a,o),_=u.heightOffset,y=u.heightScale,v=s.exaggeration,C=u.elementsPerHeight,S=u.elementMultiplier,T=u.isBigEndian,x=Math.pow(S,C-1),b=0;b<c;++b)for(var E=CesiumMath.lerp(g.north,g.south,b/(c-1)),P=0;P<l;++P){var A=interpolateMeshHeight(p,m,_,y,f,l,c,CesiumMath.lerp(g.west,g.east,P/(l-1)),E,v);setHeight(h,C,S,x,d,T,b*l+P,A=(A=A<u.lowestEncodedHeight?u.lowestEncodedHeight:A)>u.highestEncodedHeight?u.highestEncodedHeight:A)}return new HeightmapTerrainData({buffer:h,width:l,height:c,childTileMask:0,structure:this._structure,createdByUpsampling:!0})}},HeightmapTerrainData.prototype.isChildAvailable=function(e,t,i,r){var n=2;return i!==2*e&&++n,r!==2*t&&(n-=2),0!=(this._childTileMask&1<<n)},HeightmapTerrainData.prototype.wasCreatedByUpsampling=function(){return this._createdByUpsampling};var rectangleScratch=new Rectangle;function findNode(e,t,i,r){for(var n=r.length,a=0;a<n;++a){var o=r[a];if(o.x===t&&o.y===i&&o.level===e)return 1}}TileAvailability.prototype.addAvailableTileRange=function(e,t,i,r,n){var a=this._tilingScheme,o=this._rootNodes;if(0===e)for(var s=i;s<=n;++s)for(var l=t;l<=r;++l)findNode(e,l,s,o)||o.push(new QuadtreeNode(a,void 0,0,l,s));a.tileXYToRectangle(t,i,e,rectangleScratch);var c=rectangleScratch.west,u=rectangleScratch.north;a.tileXYToRectangle(r,n,e,rectangleScratch);for(var d=rectangleScratch.east,h=new RectangleWithLevel(e,c,rectangleScratch.south,d,u),p=0;p<o.length;++p){var m=o[p];rectanglesOverlap(m.extent,h)&&putRectangleInQuadtree(this._maximumLevel,m,h)}},TileAvailability.prototype.computeMaximumLevelAtPosition=function(e){for(var t,i=0;i<this._rootNodes.length;++i){var r=this._rootNodes[i];if(rectangleContainsPosition(r.extent,e)){t=r;break}}return defined(t)?findMaxLevelFromNode(void 0,t,e):-1};var rectanglesScratch=[],remainingToCoverByLevelScratch=[],westScratch=new Rectangle,eastScratch=new Rectangle;TileAvailability.prototype.computeBestAvailableLevelOverRectangle=function(e){var t=rectanglesScratch;t.length=0,e.east<e.west?(t.push(Rectangle.fromRadians(-Math.PI,e.south,e.east,e.north,westScratch)),t.push(Rectangle.fromRadians(e.west,e.south,Math.PI,e.north,eastScratch))):t.push(e);for(var i=remainingToCoverByLevelScratch,r=i.length=0;r<this._rootNodes.length;++r)updateCoverageWithNode(i,this._rootNodes[r],t);for(r=i.length-1;0<=r;--r)if(defined(i[r])&&0===i[r].length)return r;return 0};var cartographicScratch=new Cartographic;function QuadtreeNode(e,t,i,r,n){this.tilingScheme=e,this.parent=t,this.level=i,this.x=r,this.y=n,this.extent=e.tileXYToRectangle(r,n,i),this.rectangles=[],this._sw=void 0,this._se=void 0,this._nw=void 0,this._ne=void 0}function RectangleWithLevel(e,t,i,r,n){this.level=e,this.west=t,this.south=i,this.east=r,this.north=n}function rectanglesOverlap(e,t){var i=Math.max(e.west,t.west),r=Math.max(e.south,t.south),n=Math.min(e.east,t.east);return r<Math.min(e.north,t.north)&&i<n}function putRectangleInQuadtree(e,t,i){for(;t.level<e;)if(rectangleFullyContainsRectangle(t.nw.extent,i))t=t.nw;else if(rectangleFullyContainsRectangle(t.ne.extent,i))t=t.ne;else if(rectangleFullyContainsRectangle(t.sw.extent,i))t=t.sw;else{if(!rectangleFullyContainsRectangle(t.se.extent,i))break;t=t.se}var r;0===t.rectangles.length||t.rectangles[t.rectangles.length-1].level<=i.level?t.rectangles.push(i):((r=binarySearch(t.rectangles,i.level,rectangleLevelComparator))<=0&&(r=~r),t.rectangles.splice(r,0,i))}function rectangleLevelComparator(e,t){return e.level-t}function rectangleFullyContainsRectangle(e,t){return t.west>=e.west&&t.east<=e.east&&t.south>=e.south&&t.north<=e.north}function rectangleContainsPosition(e,t){return t.longitude>=e.west&&t.longitude<=e.east&&t.latitude>=e.south&&t.latitude<=e.north}function findMaxLevelFromNode(e,t,i){for(var r=0,n=!1;!n;){var a=t._nw&&rectangleContainsPosition(t._nw.extent,i),o=t._ne&&rectangleContainsPosition(t._ne.extent,i),s=t._sw&&rectangleContainsPosition(t._sw.extent,i),l=t._se&&rectangleContainsPosition(t._se.extent,i);if(1<a+o+s+l){a&&(r=Math.max(r,findMaxLevelFromNode(t,t._nw,i))),o&&(r=Math.max(r,findMaxLevelFromNode(t,t._ne,i))),s&&(r=Math.max(r,findMaxLevelFromNode(t,t._sw,i))),l&&(r=Math.max(r,findMaxLevelFromNode(t,t._se,i)));break}a?t=t._nw:o?t=t._ne:s?t=t._sw:l?t=t._se:n=!0}for(;t!==e;){for(var c=t.rectangles,u=c.length-1;0<=u&&c[u].level>r;--u){var d=c[u];rectangleContainsPosition(d,i)&&(r=d.level)}t=t.parent}return r}function updateCoverageWithNode(e,t,i){if(t){var r=!1;for(a=0;a<i.length;++a)r=r||rectanglesOverlap(t.extent,i[a]);if(r){for(var n=t.rectangles,a=0;a<n.length;++a){var o=n[a];e[o.level]||(e[o.level]=i),e[o.level]=subtractRectangle(e[o.level],o)}updateCoverageWithNode(e,t._nw,i),updateCoverageWithNode(e,t._ne,i),updateCoverageWithNode(e,t._sw,i),updateCoverageWithNode(e,t._se,i)}}}function subtractRectangle(e,t){for(var i=[],r=0;r<e.length;++r){var n=e[r];rectanglesOverlap(n,t)?(n.west<t.west&&i.push(new Rectangle(n.west,n.south,t.west,n.north)),n.east>t.east&&i.push(new Rectangle(t.east,n.south,n.east,n.north)),n.south<t.south&&i.push(new Rectangle(Math.max(t.west,n.west),n.south,Math.min(t.east,n.east),t.south)),n.north>t.north&&i.push(new Rectangle(Math.max(t.west,n.west),t.north,Math.min(t.east,n.east),n.north))):i.push(n)}return i}function formatError(e){var t=e.name,i=e.message,r=defined(t)&&defined(i)?t+": "+i:e.toString(),n=e.stack;return defined(n)&&(r+="\n"+n),r}function TileProviderError(e,t,i,r,n,a,o){this.provider=e,this.message=t,this.x=i,this.y=r,this.level=n,this.timesRetried=defaultValue(a,0),this.retry=!1,this.error=o}function WebMercatorTilingScheme(e){var t;e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.WGS84),this._numberOfLevelZeroTilesX=defaultValue(e.numberOfLevelZeroTilesX,1),this._numberOfLevelZeroTilesY=defaultValue(e.numberOfLevelZeroTilesY,1),this._projection=new WebMercatorProjection(this._ellipsoid),defined(e.rectangleSouthwestInMeters)&&defined(e.rectangleNortheastInMeters)?(this._rectangleSouthwestInMeters=e.rectangleSouthwestInMeters,this._rectangleNortheastInMeters=e.rectangleNortheastInMeters):(t=this._ellipsoid.maximumRadius*Math.PI,this._rectangleSouthwestInMeters=new Cartesian2(-t,-t),this._rectangleNortheastInMeters=new Cartesian2(t,t));var i=this._projection.unproject(this._rectangleSouthwestInMeters),r=this._projection.unproject(this._rectangleNortheastInMeters);this._rectangle=new Rectangle(i.longitude,i.latitude,r.longitude,r.latitude)}TileAvailability.prototype.isTileAvailable=function(e,t,i){var r=this._tilingScheme.tileXYToRectangle(t,i,e,rectangleScratch);return Rectangle.center(r,cartographicScratch),this.computeMaximumLevelAtPosition(cartographicScratch)>=e},TileAvailability.prototype.computeChildMaskForTile=function(e,t,i){var r=e+1;if(r>=this._maximumLevel)return 0;var n=0;return n|=this.isTileAvailable(r,2*t,2*i+1)?1:0,n|=this.isTileAvailable(r,2*t+1,2*i+1)?2:0,n|=this.isTileAvailable(r,2*t,2*i)?4:0,n|=this.isTileAvailable(r,2*t+1,2*i)?8:0},Object.defineProperties(QuadtreeNode.prototype,{nw:{get:function(){return this._nw||(this._nw=new QuadtreeNode(this.tilingScheme,this,this.level+1,2*this.x,2*this.y)),this._nw}},ne:{get:function(){return this._ne||(this._ne=new QuadtreeNode(this.tilingScheme,this,this.level+1,2*this.x+1,2*this.y)),this._ne}},sw:{get:function(){return this._sw||(this._sw=new QuadtreeNode(this.tilingScheme,this,this.level+1,2*this.x,2*this.y+1)),this._sw}},se:{get:function(){return this._se||(this._se=new QuadtreeNode(this.tilingScheme,this,this.level+1,2*this.x+1,2*this.y+1)),this._se}}}),TileProviderError.handleError=function(e,t,i,r,n,a,o,s,l){var c=e;return defined(e)?(c.provider=t,c.message=r,c.x=n,c.y=a,c.level=o,c.retry=!1,c.error=l,++c.timesRetried):c=new TileProviderError(t,r,n,a,o,0,l),0<i.numberOfListeners?i.raiseEvent(c):console.log('An error occurred in "'+t.constructor.name+'": '+formatError(r)),c.retry&&defined(s)&&s(),c},TileProviderError.handleSuccess=function(e){defined(e)&&(e.timesRetried=-1)},Object.defineProperties(WebMercatorTilingScheme.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},rectangle:{get:function(){return this._rectangle}},projection:{get:function(){return this._projection}}}),WebMercatorTilingScheme.prototype.getNumberOfXTilesAtLevel=function(e){return this._numberOfLevelZeroTilesX<<e},WebMercatorTilingScheme.prototype.getNumberOfYTilesAtLevel=function(e){return this._numberOfLevelZeroTilesY<<e},WebMercatorTilingScheme.prototype.rectangleToNativeRectangle=function(e,t){var i=this._projection,r=i.project(Rectangle.southwest(e)),n=i.project(Rectangle.northeast(e));return defined(t)?(t.west=r.x,t.south=r.y,t.east=n.x,t.north=n.y,t):new Rectangle(r.x,r.y,n.x,n.y)},WebMercatorTilingScheme.prototype.tileXYToNativeRectangle=function(e,t,i,r){var n=this.getNumberOfXTilesAtLevel(i),a=this.getNumberOfYTilesAtLevel(i),o=(this._rectangleNortheastInMeters.x-this._rectangleSouthwestInMeters.x)/n,s=this._rectangleSouthwestInMeters.x+e*o,l=this._rectangleSouthwestInMeters.x+(e+1)*o,c=(this._rectangleNortheastInMeters.y-this._rectangleSouthwestInMeters.y)/a,u=this._rectangleNortheastInMeters.y-t*c,d=this._rectangleNortheastInMeters.y-(t+1)*c;return defined(r)?(r.west=s,r.south=d,r.east=l,r.north=u,r):new Rectangle(s,d,l,u)},WebMercatorTilingScheme.prototype.tileXYToRectangle=function(e,t,i,r){var n=this.tileXYToNativeRectangle(e,t,i,r),a=this._projection,o=a.unproject(new Cartesian2(n.west,n.south)),s=a.unproject(new Cartesian2(n.east,n.north));return n.west=o.longitude,n.south=o.latitude,n.east=s.longitude,n.north=s.latitude,n},WebMercatorTilingScheme.prototype.positionToTileXY=function(e,t,i){var r=this._rectangle;if(Rectangle.contains(r,e)){var n=this.getNumberOfXTilesAtLevel(t),a=this.getNumberOfYTilesAtLevel(t),o=(this._rectangleNortheastInMeters.x-this._rectangleSouthwestInMeters.x)/n,s=(this._rectangleNortheastInMeters.y-this._rectangleSouthwestInMeters.y)/a,l=this._projection.project(e),c=(l.x-this._rectangleSouthwestInMeters.x)/o|0;n<=c&&(c=n-1);var u=(this._rectangleNortheastInMeters.y-l.y)/s|0;return(a<=u&&(u=a-1),defined(i))?(i.x=c,i.y=u,i):new Cartesian2(c,u)}};var ALL_CHILDREN=15;function ArcGISTiledElevationTerrainProvider(e){this._resource=void 0,this._credit=void 0,this._tilingScheme=void 0,this._levelZeroMaximumGeometricError=void 0,this._maxLevel=void 0,this._terrainDataStructure=void 0,this._ready=!1,this._width=void 0,this._height=void 0,this._encoding=void 0;var i=e.token;this._hasAvailability=!1,this._tilesAvailable=void 0,this._tilesAvailablityLoaded=void 0,this._availableCache={};var s=this,l=defaultValue(e.ellipsoid,Ellipsoid.WGS84);this._readyPromise=when(e.url).then(function(e){var t=Resource.createIfNeeded(e);return t.appendForwardSlash(),defined(i)&&(t=t.getDerivedResource({queryParameters:{token:i}})),(s._resource=t).getDerivedResource({queryParameters:{f:"pjson"}}).fetchJson()}).then(function(e){var t=e.copyrightText;defined(t)&&(s._credit=new Credit(t));var i=e.spatialReference,r=defaultValue(i.latestWkid,i.wkid),n=e.extent,a={ellipsoid:l};if(4326===r)a.rectangle=Rectangle.fromDegrees(n.xmin,n.ymin,n.xmax,n.ymax),s._tilingScheme=new GeographicTilingScheme(a);else{if(3857!==r)return when.reject(new RuntimeError("Invalid spatial reference"));a.rectangleSouthwestInMeters=new Cartesian2(n.xmin,n.ymin),a.rectangleNortheastInMeters=new Cartesian2(n.xmax,n.ymax),s._tilingScheme=new WebMercatorTilingScheme(a)}var o=e.tileInfo;return defined(o)?(s._width=o.rows+1,s._height=o.cols+1,s._encoding="LERC"===o.format?HeightmapEncoding$1.LERC:HeightmapEncoding$1.NONE,s._lodCount=o.lods.length-1,(s._hasAvailability=-1!==e.capabilities.indexOf("Tilemap"))&&(s._tilesAvailable=new TileAvailability(s._tilingScheme,s._lodCount),s._tilesAvailable.addAvailableTileRange(0,0,0,s._tilingScheme.getNumberOfXTilesAtLevel(0),s._tilingScheme.getNumberOfYTilesAtLevel(0)),s._tilesAvailablityLoaded=new TileAvailability(s._tilingScheme,s._lodCount)),s._levelZeroMaximumGeometricError=TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(s._tilingScheme.ellipsoid,s._width,s._tilingScheme.getNumberOfXTilesAtLevel(0)),1<e.bandCount&&console.log("ArcGISTiledElevationTerrainProvider: Terrain data has more than 1 band. Using the first one."),s._terrainDataStructure={elementMultiplier:1,lowestEncodedHeight:e.minValues[0],highestEncodedHeight:e.maxValues[0]},s._ready=!0):when.reject(new RuntimeError("tileInfo is required"))}).otherwise(function(e){var t="An error occurred while accessing "+s._resource.url+".";return TileProviderError.handleError(void 0,s,s._errorEvent,t),when.reject(e)}),this._errorEvent=new Event}function isTileAvailable(e,t,i,r){if(e._hasAvailability){var n=e._tilesAvailablityLoaded,a=e._tilesAvailable;return!(t>e._lodCount)&&(!!a.isTileAvailable(t,i,r)||!n.isTileAvailable(t,i,r)&&void 0)}}function findRange(e,t,i,r){for(var n=t-1,a=i-1,o=r[e.y*t+e.x],s=[],l={startX:e.x,startY:e.y,endX:0,endY:0},c=new Cartesian2(e.x+1,e.y+1),u=!1,d=!1;!u||!d;){var h=c.x,p=d?c.y+1:c.y;if(!u){for(var m=e.y;m<p;++m)if(r[m*t+c.x]!==o){u=!0;break}u?(s.push(new Cartesian2(c.x,e.y)),--c.x,--h,l.endX=c.x):c.x===n?(l.endX=c.x,u=!0):++c.x}if(!d){for(var f=c.y*t,g=e.x;g<=h;++g)if(r[f+g]!==o){d=!0;break}d?(s.push(new Cartesian2(e.x,c.y)),--c.y,l.endY=c.y):c.y===a?(l.endY=c.y,d=!0):++c.y}}return{endingIndices:s,range:l,value:o}}function computeAvailability(e,t,i,r,n){var a=[];if(n.every(function(e){return e===n[0]}))return 1===n[0]&&a.push({startX:e,startY:t,endX:e+i-1,endY:t+r-1}),a;for(var o=[new Cartesian2(0,0)];0<o.length;){var s,l=findRange(o.pop(),i,r,n);1===l.value&&((s=l.range).startX+=e,s.endX+=e,s.startY+=t,s.endY+=t,a.push(s));var c=l.endingIndices;0<c.length&&(o=o.concat(c))}return a}function requestAvailability(a,o,s,l){if(!a._hasAvailability)return{};var c=128*Math.floor(s/128),u=128*Math.floor(l/128),d=Math.min(1<<o,128),t="tilemap/"+o+"/"+u+"/"+c+"/"+d+"/"+d,i=a._availableCache;if(defined(i[t]))return i[t];var e=new Request({throttle:!0,throttleByServer:!0,type:RequestType$1.TERRAIN}),r=a._resource.getDerivedResource({url:t,request:e}).fetchJson();return defined(r)?(r=r.then(function(e){var t=computeAvailability(c,u,d,d,e.data);a._tilesAvailablityLoaded.addAvailableTileRange(c,u,c+d,u+d);for(var i=a._tilesAvailable,r=0;r<t.length;++r){var n=t[r];i.addAvailableTileRange(o,n.startX,n.startY,n.endX,n.endY)}return isTileAvailable(a,o,s,l)}),i[t]={promise:r,request:e},{promise:r=r.always(function(e){return delete i[t],e}),request:e}):{}}Object.defineProperties(ArcGISTiledElevationTerrainProvider.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}}),ArcGISTiledElevationTerrainProvider.prototype.requestTileGeometry=function(t,i,r,n){var e,a,o=this._resource.getDerivedResource({url:"tile/"+r+"/"+i+"/"+t,request:n}),s=this._hasAvailability,l=when.resolve(!0);s&&!defined(isTileAvailable(this,r+1,2*t,2*i))&&(l=(e=requestAvailability(this,r+1,2*t,2*i)).promise,a=e.request);var c=o.fetchArrayBuffer();if(defined(c)&&defined(l)){var u=this,d=this._tilesAvailable;return when.join(c,l).then(function(e){return new HeightmapTerrainData({buffer:e[0],width:u._width,height:u._height,childTileMask:s?d.computeChildMaskForTile(r,t,i):ALL_CHILDREN,structure:u._terrainDataStructure,encoding:u._encoding})}).otherwise(function(e){return defined(a)&&a.state===RequestState$1.CANCELLED?(n.cancel(),n.deferred.promise.always(function(){return n.state=RequestState$1.CANCELLED,when.reject(e)})):when.reject(e)})}},ArcGISTiledElevationTerrainProvider.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)},ArcGISTiledElevationTerrainProvider.prototype.getTileDataAvailable=function(e,t,i){if(this._hasAvailability){var r=isTileAvailable(this,i,e,t);if(defined(r))return r;requestAvailability(this,i,e,t)}},ArcGISTiledElevationTerrainProvider.prototype.loadTileDataAvailability=function(e,t,i){};var ArcType={NONE:0,GEODESIC:1,RHUMB:2},ArcType$1=Object.freeze(ArcType);function AssociativeArray(){this._array=[],this._hash={}}Object.defineProperties(AssociativeArray.prototype,{length:{get:function(){return this._array.length}},values:{get:function(){return this._array}}}),AssociativeArray.prototype.contains=function(e){return defined(this._hash[e])},AssociativeArray.prototype.set=function(e,t){t!==this._hash[e]&&(this.remove(e),this._hash[e]=t,this._array.push(t))},AssociativeArray.prototype.get=function(e){return this._hash[e]},AssociativeArray.prototype.remove=function(e){var t,i=this._hash[e],r=defined(i);return r&&((t=this._array).splice(t.indexOf(i),1),delete this._hash[e]),r},AssociativeArray.prototype.removeAll=function(){var e=this._array;0<e.length&&(this._hash={},e.length=0)};var warnings={},defaultKey;function oneTimeWarning(e,t){defined(warnings[e])||(warnings[e]=!0,console.warn(defaultValue(t,e)))}function deprecationWarning(e,t){oneTimeWarning(e,t)}oneTimeWarning.geometryOutlines="Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0.",oneTimeWarning.geometryZIndex="Entity geometry with zIndex are unsupported when height or extrudedHeight are defined. zIndex will be ignored",oneTimeWarning.geometryHeightReference="Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height. heightReference will be ignored",oneTimeWarning.geometryExtrudedHeightReference="Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight. extrudedHeightReference will be ignored";var BingMapsApi={};Object.defineProperties(BingMapsApi,{defaultKey:{set:function(e){defaultKey=e,deprecationWarning("bing-maps-api-default-key","BingMapsApi.defaultKey is deprecated and will be removed in CesiumJS 1.73. Pass your access token directly to the BingMapsGeocoderService or BingMapsImageryProvider constructors.")},get:function(){return defaultKey}}}),BingMapsApi.getKey=function(e){return deprecationWarning("bing-maps-api-get-key","BingMapsApi.getKey is deprecated and will be removed in CesiumJS 1.73. Pass your access token directly to the BingMapsGeocoderService or BingMapsImageryProvider constructors."),BingMapsApi._getKeyNoDeprecate(e)},BingMapsApi._getKeyNoDeprecate=function(e){return defined(e)?e:BingMapsApi.defaultKey};var url="https://dev.virtualearth.net/REST/v1/Locations";function BingMapsGeocoderService(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=BingMapsApi._getKeyNoDeprecate(e.key);this._key=t,this._resource=new Resource({url:url,queryParameters:{key:t}})}function BoundingRectangle(e,t,i,r){this.x=defaultValue(e,0),this.y=defaultValue(t,0),this.width=defaultValue(i,0),this.height=defaultValue(r,0)}Object.defineProperties(BingMapsGeocoderService.prototype,{url:{get:function(){return url}},key:{get:function(){return this._key}}}),BingMapsGeocoderService.prototype.geocode=function(e){return this._resource.getDerivedResource({queryParameters:{query:e}}).fetchJsonp("jsonp").then(function(e){return 0===e.resourceSets.length?[]:e.resourceSets[0].resources.map(function(e){var t=e.bbox,i=t[0],r=t[1],n=t[2],a=t[3];return{displayName:e.name,destination:Rectangle.fromDegrees(r,i,a,n)}})})},BoundingRectangle.packedLength=4,BoundingRectangle.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.x,t[i++]=e.y,t[i++]=e.width,t[i]=e.height,t},BoundingRectangle.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new BoundingRectangle),i.x=e[t++],i.y=e[t++],i.width=e[t++],i.height=e[t],i},BoundingRectangle.fromPoints=function(e,t){if(defined(t)||(t=new BoundingRectangle),!defined(e)||0===e.length)return t.x=0,t.y=0,t.width=0,t.height=0,t;for(var i=e.length,r=e[0].x,n=e[0].y,a=e[0].x,o=e[0].y,s=1;s<i;s++)var l=e[s],c=l.x,u=l.y,r=Math.min(c,r),a=Math.max(c,a),n=Math.min(u,n),o=Math.max(u,o);return t.x=r,t.y=n,t.width=a-r,t.height=o-n,t};var defaultProjection$1=new GeographicProjection,fromRectangleLowerLeft=new Cartographic,fromRectangleUpperRight=new Cartographic;function arrayFill(e,t,i,r){if("function"==typeof e.fill)return e.fill(t,i,r);for(var n=e.length>>>0,a=defaultValue(i,0),o=a<0?Math.max(n+a,0):Math.min(a,n),s=defaultValue(r,n),l=s<0?Math.max(n+s,0):Math.min(s,n);o<l;)e[o]=t,o++;return e}BoundingRectangle.fromRectangle=function(e,t,i){if(defined(i)||(i=new BoundingRectangle),!defined(e))return i.x=0,i.y=0,i.width=0,i.height=0,i;var r=(t=defaultValue(t,defaultProjection$1)).project(Rectangle.southwest(e,fromRectangleLowerLeft)),n=t.project(Rectangle.northeast(e,fromRectangleUpperRight));return Cartesian2.subtract(n,r,n),i.x=r.x,i.y=r.y,i.width=n.x,i.height=n.y,i},BoundingRectangle.clone=function(e,t){if(defined(e))return defined(t)?(t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height,t):new BoundingRectangle(e.x,e.y,e.width,e.height)},BoundingRectangle.union=function(e,t,i){defined(i)||(i=new BoundingRectangle);var r=Math.min(e.x,t.x),n=Math.min(e.y,t.y),a=Math.max(e.x+e.width,t.x+t.width),o=Math.max(e.y+e.height,t.y+t.height);return i.x=r,i.y=n,i.width=a-r,i.height=o-n,i},BoundingRectangle.expand=function(e,t,i){i=BoundingRectangle.clone(e,i);var r=t.x-i.x,n=t.y-i.y;return r>i.width?i.width=r:r<0&&(i.width-=r,i.x=t.x),n>i.height?i.height=n:n<0&&(i.height-=n,i.y=t.y),i},BoundingRectangle.intersect=function(e,t){var i=e.x,r=e.y,n=t.x,a=t.y;return i>n+t.width||i+e.width<n||r+e.height<a||r>a+t.height?Intersect$1.OUTSIDE:Intersect$1.INTERSECTING},BoundingRectangle.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height},BoundingRectangle.prototype.clone=function(e){return BoundingRectangle.clone(this,e)},BoundingRectangle.prototype.intersect=function(e){return BoundingRectangle.intersect(this,e)},BoundingRectangle.prototype.equals=function(e){return BoundingRectangle.equals(this,e)};var GeometryType={NONE:0,TRIANGLES:1,LINES:2,POLYLINES:3},GeometryType$1=Object.freeze(GeometryType);function Matrix2(e,t,i,r){this[0]=defaultValue(e,0),this[1]=defaultValue(i,0),this[2]=defaultValue(t,0),this[3]=defaultValue(r,0)}Matrix2.packedLength=4,Matrix2.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e[0],t[i++]=e[1],t[i++]=e[2],t[i++]=e[3],t},Matrix2.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new Matrix2),i[0]=e[t++],i[1]=e[t++],i[2]=e[t++],i[3]=e[t++],i},Matrix2.clone=function(e,t){if(defined(e))return defined(t)?(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t):new Matrix2(e[0],e[2],e[1],e[3])},Matrix2.fromArray=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new Matrix2),i[0]=e[t],i[1]=e[t+1],i[2]=e[t+2],i[3]=e[t+3],i},Matrix2.fromColumnMajorArray=function(e,t){return Matrix2.clone(e,t)},Matrix2.fromRowMajorArray=function(e,t){return defined(t)?(t[0]=e[0],t[1]=e[2],t[2]=e[1],t[3]=e[3],t):new Matrix2(e[0],e[1],e[2],e[3])},Matrix2.fromScale=function(e,t){return defined(t)?(t[0]=e.x,t[1]=0,t[2]=0,t[3]=e.y,t):new Matrix2(e.x,0,0,e.y)},Matrix2.fromUniformScale=function(e,t){return defined(t)?(t[0]=e,t[1]=0,t[2]=0,t[3]=e,t):new Matrix2(e,0,0,e)},Matrix2.fromRotation=function(e,t){var i=Math.cos(e),r=Math.sin(e);return defined(t)?(t[0]=i,t[1]=r,t[2]=-r,t[3]=i,t):new Matrix2(i,-r,r,i)},Matrix2.toArray=function(e,t){return defined(t)?(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t):[e[0],e[1],e[2],e[3]]},Matrix2.getElementIndex=function(e,t){return 2*e+t},Matrix2.getColumn=function(e,t,i){var r=2*t,n=e[r],a=e[1+r];return i.x=n,i.y=a,i},Matrix2.setColumn=function(e,t,i,r){var n=2*t;return(r=Matrix2.clone(e,r))[n]=i.x,r[1+n]=i.y,r},Matrix2.getRow=function(e,t,i){var r=e[t],n=e[t+2];return i.x=r,i.y=n,i},Matrix2.setRow=function(e,t,i,r){return(r=Matrix2.clone(e,r))[t]=i.x,r[t+2]=i.y,r};var scratchColumn$2=new Cartesian2;Matrix2.getScale=function(e,t){return t.x=Cartesian2.magnitude(Cartesian2.fromElements(e[0],e[1],scratchColumn$2)),t.y=Cartesian2.magnitude(Cartesian2.fromElements(e[2],e[3],scratchColumn$2)),t};var scratchScale$4=new Cartesian2;Matrix2.getMaximumScale=function(e){return Matrix2.getScale(e,scratchScale$4),Cartesian2.maximumComponent(scratchScale$4)},Matrix2.multiply=function(e,t,i){var r=e[0]*t[0]+e[2]*t[1],n=e[0]*t[2]+e[2]*t[3],a=e[1]*t[0]+e[3]*t[1],o=e[1]*t[2]+e[3]*t[3];return i[0]=r,i[1]=a,i[2]=n,i[3]=o,i},Matrix2.add=function(e,t,i){return i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i[3]=e[3]+t[3],i},Matrix2.subtract=function(e,t,i){return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i[3]=e[3]-t[3],i},Matrix2.multiplyByVector=function(e,t,i){var r=e[0]*t.x+e[2]*t.y,n=e[1]*t.x+e[3]*t.y;return i.x=r,i.y=n,i},Matrix2.multiplyByScalar=function(e,t,i){return i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i[3]=e[3]*t,i},Matrix2.multiplyByScale=function(e,t,i){return i[0]=e[0]*t.x,i[1]=e[1]*t.x,i[2]=e[2]*t.y,i[3]=e[3]*t.y,i},Matrix2.negate=function(e,t){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t},Matrix2.transpose=function(e,t){var i=e[0],r=e[2],n=e[1],a=e[3];return t[0]=i,t[1]=r,t[2]=n,t[3]=a,t},Matrix2.abs=function(e,t){return t[0]=Math.abs(e[0]),t[1]=Math.abs(e[1]),t[2]=Math.abs(e[2]),t[3]=Math.abs(e[3]),t},Matrix2.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},Matrix2.equalsArray=function(e,t,i){return e[0]===t[i]&&e[1]===t[i+1]&&e[2]===t[i+2]&&e[3]===t[i+3]},Matrix2.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(e[0]-t[0])<=i&&Math.abs(e[1]-t[1])<=i&&Math.abs(e[2]-t[2])<=i&&Math.abs(e[3]-t[3])<=i},Matrix2.IDENTITY=Object.freeze(new Matrix2(1,0,0,1)),Matrix2.ZERO=Object.freeze(new Matrix2(0,0,0,0)),Matrix2.COLUMN0ROW0=0,Matrix2.COLUMN0ROW1=1,Matrix2.COLUMN1ROW0=2,Matrix2.COLUMN1ROW1=3,Object.defineProperties(Matrix2.prototype,{length:{get:function(){return Matrix2.packedLength}}}),Matrix2.prototype.clone=function(e){return Matrix2.clone(this,e)},Matrix2.prototype.equals=function(e){return Matrix2.equals(this,e)},Matrix2.prototype.equalsEpsilon=function(e,t){return Matrix2.equalsEpsilon(this,e,t)},Matrix2.prototype.toString=function(){return"("+this[0]+", "+this[2]+")\n("+this[1]+", "+this[3]+")"};var PrimitiveType={POINTS:WebGLConstants$1.POINTS,LINES:WebGLConstants$1.LINES,LINE_LOOP:WebGLConstants$1.LINE_LOOP,LINE_STRIP:WebGLConstants$1.LINE_STRIP,TRIANGLES:WebGLConstants$1.TRIANGLES,TRIANGLE_STRIP:WebGLConstants$1.TRIANGLE_STRIP,TRIANGLE_FAN:WebGLConstants$1.TRIANGLE_FAN,validate:function(e){return e===PrimitiveType.POINTS||e===PrimitiveType.LINES||e===PrimitiveType.LINE_LOOP||e===PrimitiveType.LINE_STRIP||e===PrimitiveType.TRIANGLES||e===PrimitiveType.TRIANGLE_STRIP||e===PrimitiveType.TRIANGLE_FAN}},PrimitiveType$1=Object.freeze(PrimitiveType);function Geometry(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.attributes=e.attributes,this.indices=e.indices,this.primitiveType=defaultValue(e.primitiveType,PrimitiveType$1.TRIANGLES),this.boundingSphere=e.boundingSphere,this.geometryType=defaultValue(e.geometryType,GeometryType$1.NONE),this.boundingSphereCV=e.boundingSphereCV,this.offsetAttribute=e.offsetAttribute}Geometry.computeNumberOfVertices=function(e){var t,i=-1;for(var r in e.attributes){e.attributes.hasOwnProperty(r)&&defined(e.attributes[r])&&defined(e.attributes[r].values)&&(i=(t=e.attributes[r]).values.length/t.componentsPerAttribute)}return i};var rectangleCenterScratch=new Cartographic,enuCenterScratch=new Cartesian3,fixedFrameToEnuScratch=new Matrix4,boundingRectanglePointsCartographicScratch=[new Cartographic,new Cartographic,new Cartographic],boundingRectanglePointsEnuScratch=[new Cartesian2,new Cartesian2,new Cartesian2],points2DScratch=[new Cartesian2,new Cartesian2,new Cartesian2],pointEnuScratch=new Cartesian3,enuRotationScratch=new Quaternion,enuRotationMatrixScratch=new Matrix4,rotation2DScratch=new Matrix2;function GeometryAttribute(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.componentDatatype=e.componentDatatype,this.componentsPerAttribute=e.componentsPerAttribute,this.normalize=defaultValue(e.normalize,!1),this.values=e.values}function GeometryAttributes(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.position=e.position,this.normal=e.normal,this.st=e.st,this.bitangent=e.bitangent,this.tangent=e.tangent,this.color=e.color}Geometry._textureCoordinateRotationPoints=function(e,t,i,r){var n=Rectangle.center(r,rectangleCenterScratch),a=Cartographic.toCartesian(n,i,enuCenterScratch),o=Transforms.eastNorthUpToFixedFrame(a,i,fixedFrameToEnuScratch),s=Matrix4.inverse(o,fixedFrameToEnuScratch),l=boundingRectanglePointsEnuScratch,c=boundingRectanglePointsCartographicScratch;c[0].longitude=r.west,c[0].latitude=r.south,c[1].longitude=r.west,c[1].latitude=r.north,c[2].longitude=r.east,c[2].latitude=r.south;for(var u=pointEnuScratch,d=0;d<3;d++)Cartographic.toCartesian(c[d],i,u),u=Matrix4.multiplyByPointAsVector(s,u,u),l[d].x=u.x,l[d].y=u.y;var h=Quaternion.fromAxisAngle(Cartesian3.UNIT_Z,-t,enuRotationScratch),p=Matrix3.fromQuaternion(h,enuRotationMatrixScratch),m=e.length,f=Number.POSITIVE_INFINITY,g=Number.POSITIVE_INFINITY,_=Number.NEGATIVE_INFINITY,y=Number.NEGATIVE_INFINITY;for(d=0;d<m;d++)u=Matrix4.multiplyByPointAsVector(s,e[d],u),u=Matrix3.multiplyByVector(p,u,u),f=Math.min(f,u.x),g=Math.min(g,u.y),_=Math.max(_,u.x),y=Math.max(y,u.y);var v=Matrix2.fromRotation(t,rotation2DScratch),C=points2DScratch;C[0].x=f,C[0].y=g,C[1].x=f,C[1].y=y,C[2].x=_,C[2].y=g;var S=l[0],T=l[2].x-S.x,x=l[1].y-S.y;for(d=0;d<3;d++){var b=C[d];Matrix2.multiplyByVector(v,b,b),b.x=(b.x-S.x)/T,b.y=(b.y-S.y)/x}var E=C[0],P=C[1],A=C[2],w=new Array(6);return Cartesian2.pack(E,w),Cartesian2.pack(P,w,2),Cartesian2.pack(A,w,4),w};var GeometryOffsetAttribute={NONE:0,TOP:1,ALL:2},GeometryOffsetAttribute$1=Object.freeze(GeometryOffsetAttribute);function VertexFormat(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.position=defaultValue(e.position,!1),this.normal=defaultValue(e.normal,!1),this.st=defaultValue(e.st,!1),this.bitangent=defaultValue(e.bitangent,!1),this.tangent=defaultValue(e.tangent,!1),this.color=defaultValue(e.color,!1)}VertexFormat.POSITION_ONLY=Object.freeze(new VertexFormat({position:!0})),VertexFormat.POSITION_AND_NORMAL=Object.freeze(new VertexFormat({position:!0,normal:!0})),VertexFormat.POSITION_NORMAL_AND_ST=Object.freeze(new VertexFormat({position:!0,normal:!0,st:!0})),VertexFormat.POSITION_AND_ST=Object.freeze(new VertexFormat({position:!0,st:!0})),VertexFormat.POSITION_AND_COLOR=Object.freeze(new VertexFormat({position:!0,color:!0})),VertexFormat.ALL=Object.freeze(new VertexFormat({position:!0,normal:!0,st:!0,tangent:!0,bitangent:!0})),VertexFormat.DEFAULT=VertexFormat.POSITION_NORMAL_AND_ST,VertexFormat.packedLength=6,VertexFormat.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.position?1:0,t[i++]=e.normal?1:0,t[i++]=e.st?1:0,t[i++]=e.tangent?1:0,t[i++]=e.bitangent?1:0,t[i]=e.color?1:0,t},VertexFormat.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new VertexFormat),i.position=1===e[t++],i.normal=1===e[t++],i.st=1===e[t++],i.tangent=1===e[t++],i.bitangent=1===e[t++],i.color=1===e[t],i},VertexFormat.clone=function(e,t){if(defined(e))return defined(t)||(t=new VertexFormat),t.position=e.position,t.normal=e.normal,t.st=e.st,t.tangent=e.tangent,t.bitangent=e.bitangent,t.color=e.color,t};var diffScratch=new Cartesian3;function BoxGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).minimum,i=e.maximum,r=defaultValue(e.vertexFormat,VertexFormat.DEFAULT);this._minimum=Cartesian3.clone(t),this._maximum=Cartesian3.clone(i),this._vertexFormat=r,this._offsetAttribute=e.offsetAttribute,this._workerName="createBoxGeometry"}BoxGeometry.fromDimensions=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).dimensions,i=Cartesian3.multiplyByScalar(t,.5,new Cartesian3);return new BoxGeometry({minimum:Cartesian3.negate(i,new Cartesian3),maximum:i,vertexFormat:e.vertexFormat,offsetAttribute:e.offsetAttribute})},BoxGeometry.fromAxisAlignedBoundingBox=function(e){return new BoxGeometry({minimum:e.minimum,maximum:e.maximum})},BoxGeometry.packedLength=2*Cartesian3.packedLength+VertexFormat.packedLength+1,BoxGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._minimum,t,i),Cartesian3.pack(e._maximum,t,i+Cartesian3.packedLength),VertexFormat.pack(e._vertexFormat,t,i+2*Cartesian3.packedLength),t[i+2*Cartesian3.packedLength+VertexFormat.packedLength]=defaultValue(e._offsetAttribute,-1),t};var scratchMin=new Cartesian3,scratchMax=new Cartesian3,scratchVertexFormat=new VertexFormat,scratchOptions={minimum:scratchMin,maximum:scratchMax,vertexFormat:scratchVertexFormat,offsetAttribute:void 0},unitBoxGeometry;BoxGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t,scratchMin),n=Cartesian3.unpack(e,t+Cartesian3.packedLength,scratchMax),a=VertexFormat.unpack(e,t+2*Cartesian3.packedLength,scratchVertexFormat),o=e[t+2*Cartesian3.packedLength+VertexFormat.packedLength];return defined(i)?(i._minimum=Cartesian3.clone(r,i._minimum),i._maximum=Cartesian3.clone(n,i._maximum),i._vertexFormat=VertexFormat.clone(a,i._vertexFormat),i._offsetAttribute=-1===o?void 0:o,i):(scratchOptions.offsetAttribute=-1===o?void 0:o,new BoxGeometry(scratchOptions))},BoxGeometry.createGeometry=function(e){var t=e._minimum,i=e._maximum,r=e._vertexFormat;if(!Cartesian3.equals(t,i)){var n,a,o,s,l,c,u=new GeometryAttributes;r.position&&(r.st||r.normal||r.tangent||r.bitangent)?(r.position&&((a=new Float64Array(72))[0]=t.x,a[1]=t.y,a[2]=i.z,a[3]=i.x,a[4]=t.y,a[5]=i.z,a[6]=i.x,a[7]=i.y,a[8]=i.z,a[9]=t.x,a[10]=i.y,a[11]=i.z,a[12]=t.x,a[13]=t.y,a[14]=t.z,a[15]=i.x,a[16]=t.y,a[17]=t.z,a[18]=i.x,a[19]=i.y,a[20]=t.z,a[21]=t.x,a[22]=i.y,a[23]=t.z,a[24]=i.x,a[25]=t.y,a[26]=t.z,a[27]=i.x,a[28]=i.y,a[29]=t.z,a[30]=i.x,a[31]=i.y,a[32]=i.z,a[33]=i.x,a[34]=t.y,a[35]=i.z,a[36]=t.x,a[37]=t.y,a[38]=t.z,a[39]=t.x,a[40]=i.y,a[41]=t.z,a[42]=t.x,a[43]=i.y,a[44]=i.z,a[45]=t.x,a[46]=t.y,a[47]=i.z,a[48]=t.x,a[49]=i.y,a[50]=t.z,a[51]=i.x,a[52]=i.y,a[53]=t.z,a[54]=i.x,a[55]=i.y,a[56]=i.z,a[57]=t.x,a[58]=i.y,a[59]=i.z,a[60]=t.x,a[61]=t.y,a[62]=t.z,a[63]=i.x,a[64]=t.y,a[65]=t.z,a[66]=i.x,a[67]=t.y,a[68]=i.z,a[69]=t.x,a[70]=t.y,a[71]=i.z,u.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:a})),r.normal&&((o=new Float32Array(72))[0]=0,o[1]=0,o[2]=1,o[3]=0,o[4]=0,o[5]=1,o[6]=0,o[7]=0,o[8]=1,o[9]=0,o[10]=0,o[11]=1,o[12]=0,o[13]=0,o[14]=-1,o[15]=0,o[16]=0,o[17]=-1,o[18]=0,o[19]=0,o[20]=-1,o[21]=0,o[22]=0,o[23]=-1,o[24]=1,o[25]=0,o[26]=0,o[27]=1,o[28]=0,o[29]=0,o[30]=1,o[31]=0,o[32]=0,o[33]=1,o[34]=0,o[35]=0,o[36]=-1,o[37]=0,o[38]=0,o[39]=-1,o[40]=0,o[41]=0,o[42]=-1,o[43]=0,o[44]=0,o[45]=-1,o[46]=0,o[47]=0,o[48]=0,o[49]=1,o[50]=0,o[51]=0,o[52]=1,o[53]=0,o[54]=0,o[55]=1,o[56]=0,o[57]=0,o[58]=1,o[59]=0,o[60]=0,o[61]=-1,o[62]=0,o[63]=0,o[64]=-1,o[65]=0,o[66]=0,o[67]=-1,o[68]=0,o[69]=0,o[70]=-1,o[71]=0,u.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:o})),r.st&&((s=new Float32Array(48))[0]=0,s[1]=0,s[2]=1,s[3]=0,s[4]=1,s[5]=1,s[6]=0,s[7]=1,s[8]=1,s[9]=0,s[10]=0,s[11]=0,s[12]=0,s[13]=1,s[14]=1,s[15]=1,s[16]=0,s[17]=0,s[18]=1,s[19]=0,s[20]=1,s[21]=1,s[22]=0,s[23]=1,s[24]=1,s[25]=0,s[26]=0,s[27]=0,s[28]=0,s[29]=1,s[30]=1,s[31]=1,s[32]=1,s[33]=0,s[34]=0,s[35]=0,s[36]=0,s[37]=1,s[38]=1,s[39]=1,s[40]=0,s[41]=0,s[42]=1,s[43]=0,s[44]=1,s[45]=1,s[46]=0,s[47]=1,u.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:s})),r.tangent&&((l=new Float32Array(72))[0]=1,l[1]=0,l[2]=0,l[3]=1,l[4]=0,l[5]=0,l[6]=1,l[7]=0,l[8]=0,l[9]=1,l[10]=0,l[11]=0,l[12]=-1,l[13]=0,l[14]=0,l[15]=-1,l[16]=0,l[17]=0,l[18]=-1,l[19]=0,l[20]=0,l[21]=-1,l[22]=0,l[23]=0,l[24]=0,l[25]=1,l[26]=0,l[27]=0,l[28]=1,l[29]=0,l[30]=0,l[31]=1,l[32]=0,l[33]=0,l[34]=1,l[35]=0,l[36]=0,l[37]=-1,l[38]=0,l[39]=0,l[40]=-1,l[41]=0,l[42]=0,l[43]=-1,l[44]=0,l[45]=0,l[46]=-1,l[47]=0,l[48]=-1,l[49]=0,l[50]=0,l[51]=-1,l[52]=0,l[53]=0,l[54]=-1,l[55]=0,l[56]=0,l[57]=-1,l[58]=0,l[59]=0,l[60]=1,l[61]=0,l[62]=0,l[63]=1,l[64]=0,l[65]=0,l[66]=1,l[67]=0,l[68]=0,l[69]=1,l[70]=0,l[71]=0,u.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:l})),r.bitangent&&((c=new Float32Array(72))[0]=0,c[1]=1,c[2]=0,c[3]=0,c[4]=1,c[5]=0,c[6]=0,c[7]=1,c[8]=0,c[9]=0,c[10]=1,c[11]=0,c[12]=0,c[13]=1,c[14]=0,c[15]=0,c[16]=1,c[17]=0,c[18]=0,c[19]=1,c[20]=0,c[21]=0,c[22]=1,c[23]=0,c[24]=0,c[25]=0,c[26]=1,c[27]=0,c[28]=0,c[29]=1,c[30]=0,c[31]=0,c[32]=1,c[33]=0,c[34]=0,c[35]=1,c[36]=0,c[37]=0,c[38]=1,c[39]=0,c[40]=0,c[41]=1,c[42]=0,c[43]=0,c[44]=1,c[45]=0,c[46]=0,c[47]=1,c[48]=0,c[49]=0,c[50]=1,c[51]=0,c[52]=0,c[53]=1,c[54]=0,c[55]=0,c[56]=1,c[57]=0,c[58]=0,c[59]=1,c[60]=0,c[61]=0,c[62]=1,c[63]=0,c[64]=0,c[65]=1,c[66]=0,c[67]=0,c[68]=1,c[69]=0,c[70]=0,c[71]=1,u.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:c})),(n=new Uint16Array(36))[0]=0,n[1]=1,n[2]=2,n[3]=0,n[4]=2,n[5]=3,n[6]=6,n[7]=5,n[8]=4,n[9]=7,n[10]=6,n[11]=4,n[12]=8,n[13]=9,n[14]=10,n[15]=8,n[16]=10,n[17]=11,n[18]=14,n[19]=13,n[20]=12,n[21]=15,n[22]=14,n[23]=12,n[24]=18,n[25]=17,n[26]=16,n[27]=19,n[28]=18,n[29]=16,n[30]=20,n[31]=21,n[32]=22,n[33]=20,n[34]=22,n[35]=23):((a=new Float64Array(24))[0]=t.x,a[1]=t.y,a[2]=t.z,a[3]=i.x,a[4]=t.y,a[5]=t.z,a[6]=i.x,a[7]=i.y,a[8]=t.z,a[9]=t.x,a[10]=i.y,a[11]=t.z,a[12]=t.x,a[13]=t.y,a[14]=i.z,a[15]=i.x,a[16]=t.y,a[17]=i.z,a[18]=i.x,a[19]=i.y,a[20]=i.z,a[21]=t.x,a[22]=i.y,a[23]=i.z,u.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:a}),(n=new Uint16Array(36))[0]=4,n[1]=5,n[2]=6,n[3]=4,n[4]=6,n[5]=7,n[6]=1,n[7]=0,n[8]=3,n[9]=1,n[10]=3,n[11]=2,n[12]=1,n[13]=6,n[14]=5,n[15]=1,n[16]=2,n[17]=6,n[18]=2,n[19]=3,n[20]=7,n[21]=2,n[22]=7,n[23]=6,n[24]=3,n[25]=0,n[26]=4,n[27]=3,n[28]=4,n[29]=7,n[30]=0,n[31]=1,n[32]=5,n[33]=0,n[34]=5,n[35]=4);var d,h,p=Cartesian3.subtract(i,t,diffScratch),m=.5*Cartesian3.magnitude(p);return defined(e._offsetAttribute)&&(d=a.length,arrayFill(h=new Uint8Array(d/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),u.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:h})),new Geometry({attributes:u,indices:n,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:new BoundingSphere(Cartesian3.ZERO,m),offsetAttribute:e._offsetAttribute})}},BoxGeometry.getUnitBox=function(){return defined(unitBoxGeometry)||(unitBoxGeometry=BoxGeometry.createGeometry(BoxGeometry.fromDimensions({dimensions:new Cartesian3(1,1,1),vertexFormat:VertexFormat.POSITION_ONLY}))),unitBoxGeometry};var diffScratch$1=new Cartesian3;function BoxOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).minimum,i=e.maximum;this._min=Cartesian3.clone(t),this._max=Cartesian3.clone(i),this._offsetAttribute=e.offsetAttribute,this._workerName="createBoxOutlineGeometry"}BoxOutlineGeometry.fromDimensions=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).dimensions,i=Cartesian3.multiplyByScalar(t,.5,new Cartesian3);return new BoxOutlineGeometry({minimum:Cartesian3.negate(i,new Cartesian3),maximum:i,offsetAttribute:e.offsetAttribute})},BoxOutlineGeometry.fromAxisAlignedBoundingBox=function(e){return new BoxOutlineGeometry({minimum:e.minimum,maximum:e.maximum})},BoxOutlineGeometry.packedLength=2*Cartesian3.packedLength+1,BoxOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._min,t,i),Cartesian3.pack(e._max,t,i+Cartesian3.packedLength),t[i+2*Cartesian3.packedLength]=defaultValue(e._offsetAttribute,-1),t};var scratchMin$1=new Cartesian3,scratchMax$1=new Cartesian3,scratchOptions$1={minimum:scratchMin$1,maximum:scratchMax$1,offsetAttribute:void 0};function CartographicGeocoderService(){}function Spline(){this.times=void 0,this.points=void 0,DeveloperError.throwInstantiationError()}function LinearSpline(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).points,i=e.times;this._times=i,this._points=t,this._lastTimeIndex=0}BoxOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t,scratchMin$1),n=Cartesian3.unpack(e,t+Cartesian3.packedLength,scratchMax$1),a=e[t+2*Cartesian3.packedLength];return defined(i)?(i._min=Cartesian3.clone(r,i._min),i._max=Cartesian3.clone(n,i._max),i._offsetAttribute=-1===a?void 0:a,i):(scratchOptions$1.offsetAttribute=-1===a?void 0:a,new BoxOutlineGeometry(scratchOptions$1))},BoxOutlineGeometry.createGeometry=function(e){var t=e._min,i=e._max;if(!Cartesian3.equals(t,i)){var r=new GeometryAttributes,n=new Uint16Array(24),a=new Float64Array(24);a[0]=t.x,a[1]=t.y,a[2]=t.z,a[3]=i.x,a[4]=t.y,a[5]=t.z,a[6]=i.x,a[7]=i.y,a[8]=t.z,a[9]=t.x,a[10]=i.y,a[11]=t.z,a[12]=t.x,a[13]=t.y,a[14]=i.z,a[15]=i.x,a[16]=t.y,a[17]=i.z,a[18]=i.x,a[19]=i.y,a[20]=i.z,a[21]=t.x,a[22]=i.y,a[23]=i.z,r.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:a}),n[0]=4,n[1]=5,n[2]=5,n[3]=6,n[4]=6,n[5]=7,n[6]=7,n[7]=4,n[8]=0,n[9]=1,n[10]=1,n[11]=2,n[12]=2,n[13]=3,n[14]=3,n[15]=0,n[16]=0,n[17]=4,n[18]=1,n[19]=5,n[20]=2,n[21]=6,n[22]=3,n[23]=7;var o,s,l=Cartesian3.subtract(i,t,diffScratch$1),c=.5*Cartesian3.magnitude(l);return defined(e._offsetAttribute)&&(o=a.length,arrayFill(s=new Uint8Array(o/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),r.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:s})),new Geometry({attributes:r,indices:n,primitiveType:PrimitiveType$1.LINES,boundingSphere:new BoundingSphere(Cartesian3.ZERO,c),offsetAttribute:e._offsetAttribute})}},CartographicGeocoderService.prototype.geocode=function(e){var t=e.match(/[^\s,\n]+/g);if(2===t.length||3===t.length){var i=+t[0],r=+t[1],n=3===t.length?+t[2]:300;if(isNaN(i)&&isNaN(r))for(var a=/^(\d+.?\d*)([nsew])/i,o=0;o<t.length;++o){var s=t[o].match(a);a.test(t[o])&&3===s.length&&(/^[ns]/i.test(s[2])?r=/^[n]/i.test(s[2])?+s[1]:-s[1]:/^[ew]/i.test(s[2])&&(i=/^[e]/i.test(s[2])?+s[1]:-s[1]))}if(!isNaN(i)&&!isNaN(r)&&!isNaN(n)){var l={displayName:e,destination:Cartesian3.fromDegrees(i,r,n)};return when.resolve([l])}}return when.resolve([])},Spline.prototype.evaluate=DeveloperError.throwInstantiationError,Spline.prototype.findTimeInterval=function(e,t){var i,r=this.times,n=r.length;if(e>=r[t=defaultValue(t,0)]){if(t+1<n&&e<r[t+1])return t;if(t+2<n&&e<r[t+2])return t+1}else if(0<=t-1&&e>=r[t-1])return t-1;if(e>r[t])for(i=t;i<n-1&&!(e>=r[i]&&e<r[i+1]);++i);else for(i=t-1;0<=i&&!(e>=r[i]&&e<r[i+1]);--i);return i===n-1&&(i=n-2),i},Spline.prototype.wrapTime=function(e){var t=this.times,i=t[t.length-1],r=t[0],n=i-r;return e<r&&(e+=(Math.floor((r-e)/n)+1)*n),i<e&&(e-=(Math.floor((e-i)/n)+1)*n),e},Spline.prototype.clampTime=function(e){var t=this.times;return CesiumMath.clamp(e,t[0],t[t.length-1])},Object.defineProperties(LinearSpline.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}}}),LinearSpline.prototype.findTimeInterval=Spline.prototype.findTimeInterval,LinearSpline.prototype.wrapTime=Spline.prototype.wrapTime,LinearSpline.prototype.clampTime=Spline.prototype.clampTime,LinearSpline.prototype.evaluate=function(e,t){var i=this.points,r=this.times,n=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),a=(e-r[n])/(r[n+1]-r[n]);return defined(t)||(t=new Cartesian3),Cartesian3.lerp(i[n],i[n+1],a,t)};var TridiagonalSystemSolver={solve:function(e,t,i,r){for(var n,a=new Array(i.length),o=new Array(r.length),s=new Array(r.length),l=0;l<o.length;l++)o[l]=new Cartesian3,s[l]=new Cartesian3;for(a[0]=i[0]/t[0],o[0]=Cartesian3.multiplyByScalar(r[0],1/t[0],o[0]),l=1;l<a.length;++l)n=1/(t[l]-a[l-1]*e[l-1]),a[l]=i[l]*n,o[l]=Cartesian3.subtract(r[l],Cartesian3.multiplyByScalar(o[l-1],e[l-1],o[l]),o[l]),o[l]=Cartesian3.multiplyByScalar(o[l],n,o[l]);for(n=1/(t[l]-a[l-1]*e[l-1]),o[l]=Cartesian3.subtract(r[l],Cartesian3.multiplyByScalar(o[l-1],e[l-1],o[l]),o[l]),o[l]=Cartesian3.multiplyByScalar(o[l],n,o[l]),s[s.length-1]=o[o.length-1],l=s.length-2;0<=l;--l)s[l]=Cartesian3.subtract(o[l],Cartesian3.multiplyByScalar(s[l+1],a[l],s[l]),s[l]);return s}},scratchLower=[],scratchDiagonal=[],scratchUpper=[],scratchRight=[];function generateClamped(e,t,i){var r,n=scratchLower,a=scratchUpper,o=scratchDiagonal,s=scratchRight;n.length=a.length=e.length-1,o.length=s.length=e.length,n[0]=o[0]=1;var l=s[a[0]=0];for(defined(l)||(l=s[0]=new Cartesian3),Cartesian3.clone(t,l),r=1;r<n.length-1;++r)n[r]=a[r]=1,o[r]=4,defined(l=s[r])||(l=s[r]=new Cartesian3),Cartesian3.subtract(e[r+1],e[r-1],l),Cartesian3.multiplyByScalar(l,3,l);return n[r]=0,a[r]=1,o[r]=4,defined(l=s[r])||(l=s[r]=new Cartesian3),Cartesian3.subtract(e[r+1],e[r-1],l),Cartesian3.multiplyByScalar(l,3,l),defined(l=s[r+(o[r+1]=1)])||(l=s[r+1]=new Cartesian3),Cartesian3.clone(i,l),TridiagonalSystemSolver.solve(n,o,a,s)}function generateNatural(e){var t,i=scratchLower,r=scratchUpper,n=scratchDiagonal,a=scratchRight;i.length=r.length=e.length-1,n.length=a.length=e.length,i[0]=r[0]=1,n[0]=2;var o=a[0];for(defined(o)||(o=a[0]=new Cartesian3),Cartesian3.subtract(e[1],e[0],o),Cartesian3.multiplyByScalar(o,3,o),t=1;t<i.length;++t)i[t]=r[t]=1,n[t]=4,defined(o=a[t])||(o=a[t]=new Cartesian3),Cartesian3.subtract(e[t+1],e[t-1],o),Cartesian3.multiplyByScalar(o,3,o);return n[t]=2,defined(o=a[t])||(o=a[t]=new Cartesian3),Cartesian3.subtract(e[t],e[t-1],o),Cartesian3.multiplyByScalar(o,3,o),TridiagonalSystemSolver.solve(i,n,r,a)}function HermiteSpline(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).points,i=e.times,r=e.inTangents,n=e.outTangents;this._times=i,this._points=t,this._inTangents=r,this._outTangents=n,this._lastTimeIndex=0}Object.defineProperties(HermiteSpline.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}},inTangents:{get:function(){return this._inTangents}},outTangents:{get:function(){return this._outTangents}}}),HermiteSpline.createC1=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).times,i=e.points,r=e.tangents,n=r.slice(0,r.length-1);return new HermiteSpline({times:t,points:i,inTangents:r.slice(1,r.length),outTangents:n})},HermiteSpline.createNaturalCubic=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).times,i=e.points;if(i.length<3)return new LinearSpline({points:i,times:t});var r=generateNatural(i),n=r.slice(0,r.length-1);return new HermiteSpline({times:t,points:i,inTangents:r.slice(1,r.length),outTangents:n})},HermiteSpline.createClampedCubic=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).times,i=e.points,r=e.firstTangent,n=e.lastTangent;if(i.length<3)return new LinearSpline({points:i,times:t});var a=generateClamped(i,r,n),o=a.slice(0,a.length-1);return new HermiteSpline({times:t,points:i,inTangents:a.slice(1,a.length),outTangents:o})},HermiteSpline.hermiteCoefficientMatrix=new Matrix4(2,-3,0,1,-2,3,0,0,1,-2,1,0,1,-1,0,0),HermiteSpline.prototype.findTimeInterval=Spline.prototype.findTimeInterval;var scratchTimeVec=new Cartesian4,scratchTemp=new Cartesian3;HermiteSpline.prototype.wrapTime=Spline.prototype.wrapTime,HermiteSpline.prototype.clampTime=Spline.prototype.clampTime,HermiteSpline.prototype.evaluate=function(e,t){defined(t)||(t=new Cartesian3);var i=this.points,r=this.times,n=this.inTangents,a=this.outTangents,o=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),s=(e-r[o])/(r[o+1]-r[o]),l=scratchTimeVec;l.z=s,l.y=s*s,l.x=l.y*s,l.w=1;var c=Matrix4.multiplyByVector(HermiteSpline.hermiteCoefficientMatrix,l,l);return t=Cartesian3.multiplyByScalar(i[o],c.x,t),Cartesian3.multiplyByScalar(i[o+1],c.y,scratchTemp),Cartesian3.add(t,scratchTemp,t),Cartesian3.multiplyByScalar(a[o],c.z,scratchTemp),Cartesian3.add(t,scratchTemp,t),Cartesian3.multiplyByScalar(n[o],c.w,scratchTemp),Cartesian3.add(t,scratchTemp,t)};var scratchTimeVec$1=new Cartesian4,scratchTemp0=new Cartesian3,scratchTemp1=new Cartesian3;function createEvaluateFunction(u){var d=u.points,h=u.times;if(d.length<3){var r=h[0],n=1/(h[1]-r),a=d[0],o=d[1];return function(e,t){defined(t)||(t=new Cartesian3);var i=(e-r)*n;return Cartesian3.lerp(a,o,i,t)}}return function(e,t){defined(t)||(t=new Cartesian3);var i,r,n,a,o,s=u._lastTimeIndex=u.findTimeInterval(e,u._lastTimeIndex),l=(e-h[s])/(h[s+1]-h[s]),c=scratchTimeVec$1;return c.z=l,c.y=l*l,c.x=c.y*l,c.w=1,o=0===s?(i=d[0],r=d[1],n=u.firstTangent,a=Cartesian3.subtract(d[2],i,scratchTemp0),Cartesian3.multiplyByScalar(a,.5,a),Matrix4.multiplyByVector(HermiteSpline.hermiteCoefficientMatrix,c,c)):s===d.length-2?(i=d[s],r=d[s+1],a=u.lastTangent,n=Cartesian3.subtract(r,d[s-1],scratchTemp0),Cartesian3.multiplyByScalar(n,.5,n),Matrix4.multiplyByVector(HermiteSpline.hermiteCoefficientMatrix,c,c)):(i=d[s-1],r=d[s],n=d[s+1],a=d[s+2],Matrix4.multiplyByVector(CatmullRomSpline.catmullRomCoefficientMatrix,c,c)),t=Cartesian3.multiplyByScalar(i,o.x,t),Cartesian3.multiplyByScalar(r,o.y,scratchTemp1),Cartesian3.add(t,scratchTemp1,t),Cartesian3.multiplyByScalar(n,o.z,scratchTemp1),Cartesian3.add(t,scratchTemp1,t),Cartesian3.multiplyByScalar(a,o.w,scratchTemp1),Cartesian3.add(t,scratchTemp1,t)}}var firstTangentScratch=new Cartesian3,lastTangentScratch=new Cartesian3;function CatmullRomSpline(e){var t,i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).points,r=e.times,n=e.firstTangent,a=e.lastTangent;2<i.length&&(defined(n)||(n=firstTangentScratch,Cartesian3.multiplyByScalar(i[1],2,n),Cartesian3.subtract(n,i[2],n),Cartesian3.subtract(n,i[0],n),Cartesian3.multiplyByScalar(n,.5,n)),defined(a)||(t=i.length-1,a=lastTangentScratch,Cartesian3.multiplyByScalar(i[t-1],2,a),Cartesian3.subtract(i[t],a,a),Cartesian3.add(a,i[t-2],a),Cartesian3.multiplyByScalar(a,.5,a))),this._times=r,this._points=i,this._firstTangent=Cartesian3.clone(n),this._lastTangent=Cartesian3.clone(a),this._evaluateFunction=createEvaluateFunction(this),this._lastTimeIndex=0}function getStringFromTypedArray(e,t,i){return t=defaultValue(t,0),i=defaultValue(i,e.byteLength-t),e=e.subarray(t,t+i),getStringFromTypedArray.decode(e)}function inRange(e,t,i){return t<=e&&e<=i}function utf8Handler(e){for(var t=0,i=0,r=0,n=128,a=191,o=[],s=e.length,l=0;l<s;++l){var c=e[l];if(0===r){if(inRange(c,0,127)){o.push(c);continue}if(inRange(c,194,223)){r=1,t=31&c;continue}if(inRange(c,224,239)){224===c&&(n=160),237===c&&(a=159),r=2,t=15&c;continue}if(inRange(c,240,244)){240===c&&(n=144),244===c&&(a=143),r=3,t=7&c;continue}throw new RuntimeError("String decoding failed.")}inRange(c,n,a)?(n=128,a=191,t=t<<6|63&c,++i===r&&(o.push(t),t=r=i=0)):(t=r=i=0,n=128,a=191,--l)}return o}Object.defineProperties(CatmullRomSpline.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}},firstTangent:{get:function(){return this._firstTangent}},lastTangent:{get:function(){return this._lastTangent}}}),CatmullRomSpline.catmullRomCoefficientMatrix=new Matrix4(-.5,1,-.5,0,1.5,-2.5,0,1,-1.5,2,.5,0,.5,-.5,0,0),CatmullRomSpline.prototype.findTimeInterval=Spline.prototype.findTimeInterval,CatmullRomSpline.prototype.wrapTime=Spline.prototype.wrapTime,CatmullRomSpline.prototype.clampTime=Spline.prototype.clampTime,CatmullRomSpline.prototype.evaluate=function(e,t){return this._evaluateFunction(e,t)},getStringFromTypedArray.decodeWithTextDecoder=function(e){return new TextDecoder("utf-8").decode(e)},getStringFromTypedArray.decodeWithFromCharCode=function(e){for(var t="",i=utf8Handler(e),r=i.length,n=0;n<r;++n){var a=i[n];a<=65535?t+=String.fromCharCode(a):(a-=65536,t+=String.fromCharCode(55296+(a>>10),56320+(1023&a)))}return t},"undefined"!=typeof TextDecoder?getStringFromTypedArray.decode=getStringFromTypedArray.decodeWithTextDecoder:getStringFromTypedArray.decode=getStringFromTypedArray.decodeWithFromCharCode;var Intersections2D={};function QuantizedMeshTerrainData(e){this._quantizedVertices=e.quantizedVertices,this._encodedNormals=e.encodedNormals,this._indices=e.indices,this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._boundingSphere=e.boundingSphere,this._orientedBoundingBox=e.orientedBoundingBox,this._horizonOcclusionPoint=e.horizonOcclusionPoint,this._credits=e.credits;var t=this._quantizedVertices.length/3,i=this._uValues=this._quantizedVertices.subarray(0,t),r=this._vValues=this._quantizedVertices.subarray(t,2*t);function n(e,t){return r[e]-r[t]}function a(e,t){return i[e]-i[t]}this._heightValues=this._quantizedVertices.subarray(2*t,3*t),this._westIndices=sortIndicesIfNecessary(e.westIndices,n,t),this._southIndices=sortIndicesIfNecessary(e.southIndices,a,t),this._eastIndices=sortIndicesIfNecessary(e.eastIndices,n,t),this._northIndices=sortIndicesIfNecessary(e.northIndices,a,t),this._westSkirtHeight=e.westSkirtHeight,this._southSkirtHeight=e.southSkirtHeight,this._eastSkirtHeight=e.eastSkirtHeight,this._northSkirtHeight=e.northSkirtHeight,this._childTileMask=defaultValue(e.childTileMask,15),this._createdByUpsampling=defaultValue(e.createdByUpsampling,!1),this._waterMask=e.waterMask,this._mesh=void 0}Intersections2D.clipTriangleAtAxisAlignedThreshold=function(e,t,i,r,n,a){var o,s,l;defined(a)?a.length=0:a=[],l=t?(o=i<e,s=r<e,n<e):(o=e<i,s=e<r,e<n);var c,u,d,h,p,m,f=o+s+l;return 1===f?o?(c=(e-i)/(r-i),u=(e-i)/(n-i),a.push(1),a.push(2),1!==u&&(a.push(-1),a.push(0),a.push(2),a.push(u)),1!==c&&(a.push(-1),a.push(0),a.push(1),a.push(c))):s?(d=(e-r)/(n-r),h=(e-r)/(i-r),a.push(2),a.push(0),1!==h&&(a.push(-1),a.push(1),a.push(0),a.push(h)),1!==d&&(a.push(-1),a.push(1),a.push(2),a.push(d))):l&&(p=(e-n)/(i-n),m=(e-n)/(r-n),a.push(0),a.push(1),1!==m&&(a.push(-1),a.push(2),a.push(1),a.push(m)),1!==p&&(a.push(-1),a.push(2),a.push(0),a.push(p))):2===f?o||i===e?s||r===e?l||n===e||(u=(e-i)/(n-i),d=(e-r)/(n-r),a.push(2),a.push(-1),a.push(0),a.push(2),a.push(u),a.push(-1),a.push(1),a.push(2),a.push(d)):(m=(e-n)/(r-n),c=(e-i)/(r-i),a.push(1),a.push(-1),a.push(2),a.push(1),a.push(m),a.push(-1),a.push(0),a.push(1),a.push(c)):(h=(e-r)/(i-r),p=(e-n)/(i-n),a.push(0),a.push(-1),a.push(1),a.push(0),a.push(h),a.push(-1),a.push(2),a.push(0),a.push(p)):3!==f&&(a.push(0),a.push(1),a.push(2)),a},Intersections2D.computeBarycentricCoordinates=function(e,t,i,r,n,a,o,s,l){var c=i-o,u=o-n,d=a-s,h=r-s,p=1/(d*c+u*h),m=t-s,f=e-o,g=(d*f+u*m)*p,_=(-h*f+c*m)*p,y=1-g-_;return defined(l)?(l.x=g,l.y=_,l.z=y,l):new Cartesian3(g,_,y)},Intersections2D.computeLineSegmentLineSegmentIntersection=function(e,t,i,r,n,a,o,s,l){var c=(s-a)*(i-e)-(o-n)*(r-t);if(0!=c){var u=((o-n)*(t-a)-(s-a)*(e-n))/c,d=((i-e)*(t-a)-(r-t)*(e-n))/c;return 0<=u&&u<=1&&0<=d&&d<=1?(defined(l)||(l=new Cartesian2),l.x=e+u*(i-e),l.y=t+u*(r-t),l):void 0}},Object.defineProperties(QuantizedMeshTerrainData.prototype,{credits:{get:function(){return this._credits}},waterMask:{get:function(){return this._waterMask}},childTileMask:{get:function(){return this._childTileMask}},canUpsample:{get:function(){return defined(this._mesh)}}});var arrayScratch=[];function sortIndicesIfNecessary(e,t,i){arrayScratch.length=e.length;for(var r=!1,n=0,a=e.length;n<a;++n)arrayScratch[n]=e[n],r=r||0<n&&0<t(e[n-1],e[n]);return r?(arrayScratch.sort(t),IndexDatatype$1.createTypedArray(i,arrayScratch)):e}var createMeshTaskProcessor=new TaskProcessor("createVerticesFromQuantizedTerrainMesh");QuantizedMeshTerrainData.prototype.createMesh=function(e,t,i,r,p){var n=e.ellipsoid,a=e.tileXYToRectangle(t,i,r);p=defaultValue(p,1);var o=createMeshTaskProcessor.scheduleTask({minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,quantizedVertices:this._quantizedVertices,octEncodedNormals:this._encodedNormals,includeWebMercatorT:!0,indices:this._indices,westIndices:this._westIndices,southIndices:this._southIndices,eastIndices:this._eastIndices,northIndices:this._northIndices,westSkirtHeight:this._westSkirtHeight,southSkirtHeight:this._southSkirtHeight,eastSkirtHeight:this._eastSkirtHeight,northSkirtHeight:this._northSkirtHeight,rectangle:a,relativeToCenter:this._boundingSphere.center,ellipsoid:n,exaggeration:p});if(defined(o)){var m=this;return when(o,function(e){var t=m._quantizedVertices.length/3,i=t+m._westIndices.length+m._southIndices.length+m._eastIndices.length+m._northIndices.length,r=IndexDatatype$1.createTypedArray(i,e.indices),n=new Float32Array(e.vertices),a=e.center,o=e.minimumHeight,s=e.maximumHeight,l=defaultValue(BoundingSphere.clone(e.boundingSphere),m._boundingSphere),c=defaultValue(OrientedBoundingBox.clone(e.orientedBoundingBox),m._orientedBoundingBox),u=defaultValue(Cartesian3.clone(e.occludeePointInScaledSpace),m._horizonOcclusionPoint),d=e.vertexStride,h=TerrainEncoding.clone(e.encoding);return m._mesh=new TerrainMesh(a,n,r,e.indexCountWithoutSkirts,t,o,s,l,u,d,c,h,p,e.westIndicesSouthToNorth,e.southIndicesEastToWest,e.eastIndicesNorthToSouth,e.northIndicesWestToEast),m._quantizedVertices=void 0,m._encodedNormals=void 0,m._indices=void 0,m._uValues=void 0,m._vValues=void 0,m._heightValues=void 0,m._westIndices=void 0,m._southIndices=void 0,m._eastIndices=void 0,m._northIndices=void 0,m._mesh})}};var upsampleTaskProcessor=new TaskProcessor("upsampleQuantizedTerrainMesh");QuantizedMeshTerrainData.prototype.upsample=function(e,t,i,r,n,a,o){var s=this._mesh;if(defined(this._mesh)){var l=2*t!==n,c=2*i===a,u=e.ellipsoid,d=e.tileXYToRectangle(n,a,o),h=upsampleTaskProcessor.scheduleTask({vertices:s.vertices,vertexCountWithoutSkirts:s.vertexCountWithoutSkirts,indices:s.indices,indexCountWithoutSkirts:s.indexCountWithoutSkirts,encoding:s.encoding,minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,isEastChild:l,isNorthChild:c,childRectangle:d,ellipsoid:u,exaggeration:s.exaggeration});if(defined(h)){var p=Math.min(this._westSkirtHeight,this._eastSkirtHeight),p=Math.min(p,this._southSkirtHeight);p=Math.min(p,this._northSkirtHeight);var m=l?.5*p:this._westSkirtHeight,f=c?.5*p:this._southSkirtHeight,g=l?this._eastSkirtHeight:.5*p,_=c?this._northSkirtHeight:.5*p,y=this._credits;return when(h).then(function(e){var t,i=new Uint16Array(e.vertices),r=IndexDatatype$1.createTypedArray(i.length/3,e.indices);return defined(e.encodedNormals)&&(t=new Uint8Array(e.encodedNormals)),new QuantizedMeshTerrainData({quantizedVertices:i,indices:r,encodedNormals:t,minimumHeight:e.minimumHeight,maximumHeight:e.maximumHeight,boundingSphere:BoundingSphere.clone(e.boundingSphere),orientedBoundingBox:OrientedBoundingBox.clone(e.orientedBoundingBox),horizonOcclusionPoint:Cartesian3.clone(e.horizonOcclusionPoint),westIndices:e.westIndices,southIndices:e.southIndices,eastIndices:e.eastIndices,northIndices:e.northIndices,westSkirtHeight:m,southSkirtHeight:f,eastSkirtHeight:g,northSkirtHeight:_,childTileMask:0,credits:y,createdByUpsampling:!0})})}}};var maxShort=32767,barycentricCoordinateScratch=new Cartesian3;function pointInBoundingBox(e,t,i,r,n,a,o,s){var l=Math.min(i,n,o),c=Math.max(i,n,o),u=Math.min(r,a,s),d=Math.max(r,a,s);return l<=e&&e<=c&&u<=t&&t<=d}QuantizedMeshTerrainData.prototype.interpolateHeight=function(e,t,i){var r=CesiumMath.clamp((t-e.west)/e.width,0,1);r*=maxShort;var n=CesiumMath.clamp((i-e.south)/e.height,0,1);return n*=maxShort,(defined(this._mesh)?interpolateMeshHeight$1:interpolateHeight$1)(this,r,n)};var texCoordScratch0=new Cartesian2,texCoordScratch1=new Cartesian2,texCoordScratch2=new Cartesian2;function interpolateMeshHeight$1(e,t,i){for(var r=e._mesh,n=r.vertices,a=r.encoding,o=r.indices,s=0,l=o.length;s<l;s+=3){var c=o[s],u=o[s+1],d=o[s+2],h=a.decodeTextureCoordinates(n,c,texCoordScratch0),p=a.decodeTextureCoordinates(n,u,texCoordScratch1),m=a.decodeTextureCoordinates(n,d,texCoordScratch2);if(pointInBoundingBox(t,i,h.x,h.y,p.x,p.y,m.x,m.y)){var f=Intersections2D.computeBarycentricCoordinates(t,i,h.x,h.y,p.x,p.y,m.x,m.y,barycentricCoordinateScratch);if(-1e-15<=f.x&&-1e-15<=f.y&&-1e-15<=f.z){var g=a.decodeHeight(n,c),_=a.decodeHeight(n,u),y=a.decodeHeight(n,d);return f.x*g+f.y*_+f.z*y}}}}function interpolateHeight$1(e,t,i){for(var r=e._uValues,n=e._vValues,a=e._heightValues,o=e._indices,s=0,l=o.length;s<l;s+=3){var c=o[s],u=o[s+1],d=o[s+2],h=r[c],p=r[u],m=r[d],f=n[c],g=n[u],_=n[d];if(pointInBoundingBox(t,i,h,f,p,g,m,_)){var y=Intersections2D.computeBarycentricCoordinates(t,i,h,f,p,g,m,_,barycentricCoordinateScratch);if(-1e-15<=y.x&&-1e-15<=y.y&&-1e-15<=y.z){var v=y.x*a[c]+y.y*a[u]+y.z*a[d];return CesiumMath.lerp(e._minimumHeight,e._maximumHeight,v/maxShort)}}}}function LayerInformation(e){this.resource=e.resource,this.version=e.version,this.isHeightmap=e.isHeightmap,this.tileUrlTemplates=e.tileUrlTemplates,this.availability=e.availability,this.hasVertexNormals=e.hasVertexNormals,this.hasWaterMask=e.hasWaterMask,this.hasMetadata=e.hasMetadata,this.availabilityLevels=e.availabilityLevels,this.availabilityTilesLoaded=e.availabilityTilesLoaded,this.littleEndianExtensionSize=e.littleEndianExtensionSize,this.availabilityTilesLoaded=e.availabilityTilesLoaded,this.availabilityPromiseCache={}}function CesiumTerrainProvider(e){this._heightmapWidth=65,this._heightmapStructure=void 0,this._hasWaterMask=!1,this._hasVertexNormals=!1,this._ellipsoid=e.ellipsoid,this._requestVertexNormals=defaultValue(e.requestVertexNormals,!1),this._requestWaterMask=defaultValue(e.requestWaterMask,!1),this._requestMetadata=defaultValue(e.requestMetadata,!0),this._errorEvent=new Event;var t=e.credit;"string"==typeof t&&(t=new Credit(t)),this._credit=t,this._availability=void 0;var i=when.defer();this._ready=!1,this._readyPromise=i,this._tileCredits=void 0;var S,T,x,b=this,E=this._layers=[],P="",A=[],w=0;function D(e){var t;if(!e.format)return t="The tile format is not specified in the layer.json file.",void(x=TileProviderError.handleError(x,b,b._errorEvent,t,void 0,void 0,void 0,I));if(!e.tiles||0===e.tiles.length)return t="The layer.json file does not specify any tile URL templates.",void(x=TileProviderError.handleError(x,b,b._errorEvent,t,void 0,void 0,void 0,I));var i=!1,r=!1,n=!1,a=!0,o=!1;if("heightmap-1.0"===e.format)o=!0,defined(b._heightmapStructure)||(b._heightmapStructure={heightScale:.2,heightOffset:-1e3,elementsPerHeight:1,stride:1,elementMultiplier:256,isBigEndian:!1,lowestEncodedHeight:0,highestEncodedHeight:65535}),r=!0,b._requestWaterMask=!0;else if(0!==e.format.indexOf("quantized-mesh-1."))return t='The tile format "'+e.format+'" is invalid or not supported.',void(x=TileProviderError.handleError(x,b,b._errorEvent,t,void 0,void 0,void 0,I));var s,l=e.tiles,c=e.maxzoom;if(w=Math.max(w,c),e.projection&&"EPSG:4326"!==e.projection){if("EPSG:3857"!==e.projection)return t='The projection "'+e.projection+'" is invalid or not supported.',void(x=TileProviderError.handleError(x,b,b._errorEvent,t,void 0,void 0,void 0,I));b._tilingScheme=new WebMercatorTilingScheme({numberOfLevelZeroTilesX:1,numberOfLevelZeroTilesY:1,ellipsoid:b._ellipsoid})}else b._tilingScheme=new GeographicTilingScheme({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:1,ellipsoid:b._ellipsoid});if(b._levelZeroMaximumGeometricError=TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(b._tilingScheme.ellipsoid,b._heightmapWidth,b._tilingScheme.getNumberOfXTilesAtLevel(0)),e.scheme&&"tms"!==e.scheme&&"slippyMap"!==e.scheme)return t='The scheme "'+e.scheme+'" is invalid or not supported.',void(x=TileProviderError.handleError(x,b,b._errorEvent,t,void 0,void 0,void 0,I));b._scheme=e.scheme,defined(e.extensions)&&-1!==e.extensions.indexOf("octvertexnormals")?i=!0:defined(e.extensions)&&-1!==e.extensions.indexOf("vertexnormals")&&(a=!(i=!0)),defined(e.extensions)&&-1!==e.extensions.indexOf("watermask")&&(r=!0),defined(e.extensions)&&-1!==e.extensions.indexOf("metadata")&&(n=!0);var u,d=e.metadataAvailability,h=e.available;if(defined(h)&&!defined(d)){u=new TileAvailability(b._tilingScheme,h.length);for(var p=0;p<h.length;++p){var m=h[p],f=b._tilingScheme.getNumberOfYTilesAtLevel(p);defined(A[p])||(A[p]=[]);for(var g=0;g<m.length;++g){var _=m[g],y=f-_.endY-1,v=f-_.startY-1;A[p].push([_.startX,y,_.endX,v]),u.addAvailableTileRange(p,_.startX,y,_.endX,v)}}}else defined(d)&&(s=new TileAvailability(b._tilingScheme,c),u=new TileAvailability(b._tilingScheme,c),A[0]=[[0,0,1,0]],u.addAvailableTileRange(0,0,0,1,0));b._hasWaterMask=b._hasWaterMask||r,b._hasVertexNormals=b._hasVertexNormals||i,b._hasMetadata=b._hasMetadata||n,defined(e.attribution)&&(0<P.length&&(P+=" "),P+=e.attribution),E.push(new LayerInformation({resource:S,version:e.version,isHeightmap:o,tileUrlTemplates:l,availability:u,hasVertexNormals:i,hasWaterMask:r,hasMetadata:n,availabilityLevels:d,availabilityTilesLoaded:s,littleEndianExtensionSize:a}));var C=e.parentUrl;return defined(C)?defined(u)?((S=S.getDerivedResource({url:C})).appendForwardSlash(),when((T=S.getDerivedResource({url:"layer.json"})).fetchJson(),D,M)):(console.log("A layer.json can't have a parentUrl if it does't have an available array."),when.resolve()):when.resolve()}function M(e){var t="An error occurred while accessing "+T.url+".";x=TileProviderError.handleError(x,b,b._errorEvent,t,void 0,void 0,void 0,I)}function r(e){D(e).then(function(){if(!defined(x)){var e,t=A.length;if(0<t)for(var i=b._availability=new TileAvailability(b._tilingScheme,w),r=0;r<t;++r)for(var n=A[r],a=0;a<n.length;++a){var o=n[a];i.addAvailableTileRange(r,o[0],o[1],o[2],o[3])}0<P.length&&(e=new Credit(P),defined(b._tileCredits)?b._tileCredits.push(e):b._tileCredits=[e]),b._ready=!0,b._readyPromise.resolve(!0)}})}function n(e){defined(e)&&404===e.statusCode?r({tilejson:"2.1.0",format:"heightmap-1.0",version:"1.0.0",scheme:"tms",tiles:["{z}/{x}/{y}.terrain?v={version}"]}):M()}function I(){when(T.fetchJson()).then(r).otherwise(n)}when(e.url).then(function(e){var t=Resource.createIfNeeded(e);t.appendForwardSlash(),T=(S=t).getDerivedResource({url:"layer.json"}),b._tileCredits=t.credits,I()}).otherwise(function(e){i.reject(e)})}QuantizedMeshTerrainData.prototype.isChildAvailable=function(e,t,i,r){var n=2;return i!==2*e&&++n,r!==2*t&&(n-=2),0!=(this._childTileMask&1<<n)},QuantizedMeshTerrainData.prototype.wasCreatedByUpsampling=function(){return this._createdByUpsampling};var QuantizedMeshExtensionIds={OCT_VERTEX_NORMALS:1,WATER_MASK:2,METADATA:4};function getRequestHeader(e){return defined(e)&&0!==e.length?{Accept:"application/vnd.quantized-mesh;extensions="+e.join("-")+",application/octet-stream;q=0.9,*/*;q=0.01"}:{Accept:"application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"}}function createHeightmapTerrainData(e,t,i,r,n){var a=new Uint16Array(t,0,e._heightmapWidth*e._heightmapWidth);return new HeightmapTerrainData({buffer:a,childTileMask:new Uint8Array(t,a.byteLength,1)[0],waterMask:new Uint8Array(t,a.byteLength+1,t.byteLength-a.byteLength-1),width:e._heightmapWidth,height:e._heightmapWidth,structure:e._heightmapStructure,credits:e._tileCredits})}function createQuantizedMeshTerrainData(e,t,i,r,n,a){var o=a.littleEndianExtensionSize,s=0,l=3*Float64Array.BYTES_PER_ELEMENT,c=4*Float64Array.BYTES_PER_ELEMENT,u=3*Uint16Array.BYTES_PER_ELEMENT,d=Uint16Array.BYTES_PER_ELEMENT,h=3*d,p=new DataView(t),m=new Cartesian3(p.getFloat64(s,!0),p.getFloat64(s+8,!0),p.getFloat64(s+16,!0));s+=l;var f=p.getFloat32(s,!0);s+=Float32Array.BYTES_PER_ELEMENT;var g=p.getFloat32(s,!0);s+=Float32Array.BYTES_PER_ELEMENT;var _=new BoundingSphere(new Cartesian3(p.getFloat64(s,!0),p.getFloat64(s+8,!0),p.getFloat64(s+16,!0)),p.getFloat64(s+l,!0));s+=c;var y=new Cartesian3(p.getFloat64(s,!0),p.getFloat64(s+8,!0),p.getFloat64(s+16,!0));s+=l;var v=p.getUint32(s,!0);s+=Uint32Array.BYTES_PER_ELEMENT;var C=new Uint16Array(t,s,3*v);s+=v*u,65536<v&&(h=3*(d=Uint32Array.BYTES_PER_ELEMENT));var S=C.subarray(0,v),T=C.subarray(v,2*v),x=C.subarray(2*v,3*v);AttributeCompression.zigZagDeltaDecode(S,T,x),s%d!=0&&(s+=d-s%d);var b=p.getUint32(s,!0);s+=Uint32Array.BYTES_PER_ELEMENT;var E=IndexDatatype$1.createTypedArrayFromArrayBuffer(v,t,s,3*b);s+=b*h;for(var P=0,A=E.length,w=0;w<A;++w){var D=E[w];E[w]=P-D,0===D&&++P}var M=p.getUint32(s,!0);s+=Uint32Array.BYTES_PER_ELEMENT;var I=IndexDatatype$1.createTypedArrayFromArrayBuffer(v,t,s,M);s+=M*d;var R=p.getUint32(s,!0);s+=Uint32Array.BYTES_PER_ELEMENT;var O=IndexDatatype$1.createTypedArrayFromArrayBuffer(v,t,s,R);s+=R*d;var L=p.getUint32(s,!0);s+=Uint32Array.BYTES_PER_ELEMENT;var F=IndexDatatype$1.createTypedArrayFromArrayBuffer(v,t,s,L);s+=L*d;var N=p.getUint32(s,!0);s+=Uint32Array.BYTES_PER_ELEMENT;var B,V,k=IndexDatatype$1.createTypedArrayFromArrayBuffer(v,t,s,N);for(s+=N*d;s<p.byteLength;){var z=p.getUint8(s,!0);s+=Uint8Array.BYTES_PER_ELEMENT;var $=p.getUint32(s,o);if(s+=Uint32Array.BYTES_PER_ELEMENT,z===QuantizedMeshExtensionIds.OCT_VERTEX_NORMALS&&e._requestVertexNormals)B=new Uint8Array(t,s,2*v);else if(z===QuantizedMeshExtensionIds.WATER_MASK&&e._requestWaterMask)V=new Uint8Array(t,s,$);else if(z===QuantizedMeshExtensionIds.METADATA&&e._requestMetadata){var U=p.getUint32(s,!0);if(0<U){var G=getStringFromTypedArray(new Uint8Array(t),s+Uint32Array.BYTES_PER_ELEMENT,U),H=JSON.parse(G).available;if(defined(H))for(var W=0;W<H.length;++W)for(var q=i+W+1,j=H[W],Y=e._tilingScheme.getNumberOfYTilesAtLevel(q),X=0;X<j.length;++X){var Q=j[X],J=Y-Q.endY-1,Z=Y-Q.startY-1;e.availability.addAvailableTileRange(q,Q.startX,J,Q.endX,Z),a.availability.addAvailableTileRange(q,Q.startX,J,Q.endX,Z)}}a.availabilityTilesLoaded.addAvailableTileRange(i,r,n,r,n)}s+=$}var K=5*e.getLevelMaximumGeometricError(i),ee=e._tilingScheme.tileXYToRectangle(r,n,i);return new QuantizedMeshTerrainData({center:m,minimumHeight:f,maximumHeight:g,boundingSphere:_,orientedBoundingBox:OrientedBoundingBox.fromRectangle(ee,f,g,e._tilingScheme.ellipsoid),horizonOcclusionPoint:y,quantizedVertices:C,encodedNormals:B,indices:E,westIndices:I,southIndices:O,eastIndices:F,northIndices:k,westSkirtHeight:K,southSkirtHeight:K,eastSkirtHeight:K,northSkirtHeight:K,childTileMask:e.availability.computeChildMaskForTile(i,r,n),waterMask:V,credits:e._tileCredits})}function requestTileGeometry(t,i,r,n,a,e){if(!defined(a))return when.reject(new RuntimeError("Terrain tile doesn't exist"));var o,s=a.tileUrlTemplates;if(0!==s.length){o=t._scheme&&"tms"!==t._scheme?r:t._tilingScheme.getNumberOfYTilesAtLevel(n)-r-1;var l,c=[];t._requestVertexNormals&&a.hasVertexNormals&&c.push(a.littleEndianExtensionSize?"octvertexnormals":"vertexnormals"),t._requestWaterMask&&a.hasWaterMask&&c.push("watermask"),t._requestMetadata&&a.hasMetadata&&c.push("metadata");var u=s[(i+o+n)%s.length],d=a.resource,h=defined(d._ionEndpoint)&&!defined(d._ionEndpoint.externalType)?(0!==c.length&&(l={extensions:c.join("-")}),getRequestHeader(void 0)):getRequestHeader(c),p=d.getDerivedResource({url:u,templateValues:{version:a.version,z:n,x:i,y:o},queryParameters:l,headers:h,request:e}).fetchArrayBuffer();if(defined(p))return p.then(function(e){return defined(t._heightmapStructure)?createHeightmapTerrainData(t,e):createQuantizedMeshTerrainData(t,e,n,i,r,a)})}}function getAvailabilityTile(e,t,i,r){if(0!==r){var n=e.availabilityLevels,a=r%n==0?r-n:(r/n|0)*n,o=1<<r-a;return{level:a,x:t/o|0,y:i/o|0}}}function checkLayer(e,t,i,r,n,a){if(!defined(n.availabilityLevels))return{result:!1};for(var o,s,l,c=function(){delete n.availabilityPromiseCache[l]},u=n.availabilityTilesLoaded,d=n.availability,h=getAvailabilityTile(n,t,i,r);defined(h);){if(d.isTileAvailable(h.level,h.x,h.y)&&!u.isTileAvailable(h.level,h.x,h.y))return a||(l=h.level+"-"+h.x+"-"+h.y,defined(s=n.availabilityPromiseCache[l])||(o=new Request({throttle:!0,throttleByServer:!0,type:RequestType$1.TERRAIN}),defined(s=requestTileGeometry(e,h.x,h.y,h.level,n,o))&&(n.availabilityPromiseCache[l]=s).then(c))),{result:!0,promise:s};h=getAvailabilityTile(n,h.x,h.y,h.level)}return{result:!1}}CesiumTerrainProvider.prototype.requestTileGeometry=function(e,t,i,r){var n,a=this._layers,o=a.length;if(1===o)n=a[0];else for(var s=0;s<o;++s){var l=a[s];if(!defined(l.availability)||l.availability.isTileAvailable(i,e,t)){n=l;break}}return requestTileGeometry(this,e,t,i,n,r)},Object.defineProperties(CesiumTerrainProvider.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},hasWaterMask:{get:function(){return this._hasWaterMask&&this._requestWaterMask}},hasVertexNormals:{get:function(){return this._hasVertexNormals&&this._requestVertexNormals}},hasMetadata:{get:function(){return this._hasMetadata&&this._requestMetadata}},requestVertexNormals:{get:function(){return this._requestVertexNormals}},requestWaterMask:{get:function(){return this._requestWaterMask}},requestMetadata:{get:function(){return this._requestMetadata}},availability:{get:function(){return this._availability}}}),CesiumTerrainProvider.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)},CesiumTerrainProvider.prototype.getTileDataAvailable=function(e,t,i){if(defined(this._availability)){if(i>this._availability._maximumLevel)return!1;if(this._availability.isTileAvailable(i,e,t))return!0;if(!this._hasMetadata)return!1;for(var r=this._layers,n=r.length,a=0;a<n;++a){if(checkLayer(this,e,t,i,r[a],0===a).result)return}return!1}},CesiumTerrainProvider.prototype.loadTileDataAvailability=function(e,t,i){if(!(!defined(this._availability)||i>this._availability._maximumLevel||this._availability.isTileAvailable(i,e,t))&&this._hasMetadata)for(var r=this._layers,n=r.length,a=0;a<n;++a){var o=checkLayer(this,e,t,i,r[a],0===a);if(defined(o.promise))return o.promise}},CesiumTerrainProvider._getAvailabilityTile=getAvailabilityTile;var EllipseGeometryLibrary={},rotAxis=new Cartesian3,tempVec=new Cartesian3,unitQuat=new Quaternion,rotMtx=new Matrix3;function pointOnEllipsoid(e,t,i,r,n,a,o,s,l,c){var u=e+t;Cartesian3.multiplyByScalar(r,Math.cos(u),rotAxis),Cartesian3.multiplyByScalar(i,Math.sin(u),tempVec),Cartesian3.add(rotAxis,tempVec,rotAxis);var d=Math.cos(e);d*=d;var h=Math.sin(e);h*=h;var p=a/Math.sqrt(o*d+n*h)/s;return Quaternion.fromAxisAngle(rotAxis,p,unitQuat),Matrix3.fromQuaternion(unitQuat,rotMtx),Matrix3.multiplyByVector(rotMtx,l,c),Cartesian3.normalize(c,c),Cartesian3.multiplyByScalar(c,s,c),c}var scratchCartesian1$1=new Cartesian3,scratchCartesian2$1=new Cartesian3,scratchCartesian3$2=new Cartesian3,scratchNormal$1=new Cartesian3;EllipseGeometryLibrary.raisePositionsToHeight=function(e,t,i){for(var r=t.ellipsoid,n=t.height,a=t.extrudedHeight,o=i?e.length/3*2:e.length/3,s=new Float64Array(3*o),l=e.length,c=i?l:0,u=0;u<l;u+=3){var d=u+1,h=u+2,p=Cartesian3.fromArray(e,u,scratchCartesian1$1);r.scaleToGeodeticSurface(p,p);var m=Cartesian3.clone(p,scratchCartesian2$1),f=r.geodeticSurfaceNormal(p,scratchNormal$1),g=Cartesian3.multiplyByScalar(f,n,scratchCartesian3$2);Cartesian3.add(p,g,p),i&&(Cartesian3.multiplyByScalar(f,a,g),Cartesian3.add(m,g,m),s[u+c]=m.x,s[d+c]=m.y,s[h+c]=m.z),s[u]=p.x,s[d]=p.y,s[h]=p.z}return s};var unitPosScratch=new Cartesian3,eastVecScratch=new Cartesian3,northVecScratch=new Cartesian3;function GeometryInstance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.geometry=e.geometry,this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this.id=e.id,this.pickPrimitive=e.pickPrimitive,this.attributes=defaultValue(e.attributes,{}),this.westHemisphereGeometry=void 0,this.eastHemisphereGeometry=void 0}EllipseGeometryLibrary.computeEllipsePositions=function(e,t,i){var r=e.semiMinorAxis,n=e.semiMajorAxis,a=e.rotation,o=e.center,s=8*e.granularity,l=r*r,c=n*n,u=n*r,d=Cartesian3.magnitude(o),h=Cartesian3.normalize(o,unitPosScratch),p=Cartesian3.cross(Cartesian3.UNIT_Z,o,eastVecScratch),p=Cartesian3.normalize(p,p),m=Cartesian3.cross(h,p,northVecScratch),f=1+Math.ceil(CesiumMath.PI_OVER_TWO/s),g=CesiumMath.PI_OVER_TWO/(f-1),_=CesiumMath.PI_OVER_TWO-f*g;_<0&&(f-=Math.ceil(Math.abs(_)/g));var y,v,C,S,T,x=t?new Array(3*(f*(f+2)*2)):void 0,b=0,E=scratchCartesian1$1,P=scratchCartesian2$1,A=4*f*3,w=A-1,D=0,M=i?new Array(A):void 0,E=pointOnEllipsoid(_=CesiumMath.PI_OVER_TWO,a,m,p,l,u,c,d,h,E);for(t&&(x[b++]=E.x,x[b++]=E.y,x[b++]=E.z),i&&(M[w--]=E.z,M[w--]=E.y,M[w--]=E.x),_=CesiumMath.PI_OVER_TWO-g,y=1;y<f+1;++y){if(E=pointOnEllipsoid(_,a,m,p,l,u,c,d,h,E),P=pointOnEllipsoid(Math.PI-_,a,m,p,l,u,c,d,h,P),t){for(x[b++]=E.x,x[b++]=E.y,x[b++]=E.z,C=2*y+2,v=1;v<C-1;++v)S=v/(C-1),T=Cartesian3.lerp(E,P,S,scratchCartesian3$2),x[b++]=T.x,x[b++]=T.y,x[b++]=T.z;x[b++]=P.x,x[b++]=P.y,x[b++]=P.z}i&&(M[w--]=E.z,M[w--]=E.y,M[w--]=E.x,M[D++]=P.x,M[D++]=P.y,M[D++]=P.z),_=CesiumMath.PI_OVER_TWO-(y+1)*g}for(y=f;1<y;--y){if(E=pointOnEllipsoid(-(_=CesiumMath.PI_OVER_TWO-(y-1)*g),a,m,p,l,u,c,d,h,E),P=pointOnEllipsoid(_+Math.PI,a,m,p,l,u,c,d,h,P),t){for(x[b++]=E.x,x[b++]=E.y,x[b++]=E.z,C=2*(y-1)+2,v=1;v<C-1;++v)S=v/(C-1),T=Cartesian3.lerp(E,P,S,scratchCartesian3$2),x[b++]=T.x,x[b++]=T.y,x[b++]=T.z;x[b++]=P.x,x[b++]=P.y,x[b++]=P.z}i&&(M[w--]=E.z,M[w--]=E.y,M[w--]=E.x,M[D++]=P.x,M[D++]=P.y,M[D++]=P.z)}E=pointOnEllipsoid(-(_=CesiumMath.PI_OVER_TWO),a,m,p,l,u,c,d,h,E);var I={};return t&&(x[b++]=E.x,x[b++]=E.y,x[b++]=E.z,I.positions=x,I.numPts=f),i&&(M[w--]=E.z,M[w--]=E.y,M[w--]=E.x,I.outerPositions=M),I};var scratchCartesian1$2=new Cartesian3,scratchCartesian2$2=new Cartesian3,scratchCartesian3$3=new Cartesian3;function barycentricCoordinates(e,t,i,r,n){var a,o,s,l,c,u,d,h;if(defined(n)||(n=new Cartesian3),defined(t.z)){if(Cartesian3.equalsEpsilon(e,t,CesiumMath.EPSILON14))return Cartesian3.clone(Cartesian3.UNIT_X,n);if(Cartesian3.equalsEpsilon(e,i,CesiumMath.EPSILON14))return Cartesian3.clone(Cartesian3.UNIT_Y,n);if(Cartesian3.equalsEpsilon(e,r,CesiumMath.EPSILON14))return Cartesian3.clone(Cartesian3.UNIT_Z,n);a=Cartesian3.subtract(i,t,scratchCartesian1$2),o=Cartesian3.subtract(r,t,scratchCartesian2$2),s=Cartesian3.subtract(e,t,scratchCartesian3$3),l=Cartesian3.dot(a,a),c=Cartesian3.dot(a,o),u=Cartesian3.dot(a,s),d=Cartesian3.dot(o,o),h=Cartesian3.dot(o,s)}else{if(Cartesian2.equalsEpsilon(e,t,CesiumMath.EPSILON14))return Cartesian3.clone(Cartesian3.UNIT_X,n);if(Cartesian2.equalsEpsilon(e,i,CesiumMath.EPSILON14))return Cartesian3.clone(Cartesian3.UNIT_Y,n);if(Cartesian2.equalsEpsilon(e,r,CesiumMath.EPSILON14))return Cartesian3.clone(Cartesian3.UNIT_Z,n);a=Cartesian2.subtract(i,t,scratchCartesian1$2),o=Cartesian2.subtract(r,t,scratchCartesian2$2),s=Cartesian2.subtract(e,t,scratchCartesian3$3),l=Cartesian2.dot(a,a),c=Cartesian2.dot(a,o),u=Cartesian2.dot(a,s),d=Cartesian2.dot(o,o),h=Cartesian2.dot(o,s)}n.y=d*u-c*h,n.z=l*h-c*u;var p=l*d-c*c;return 0!==n.y&&(n.y/=p),0!==n.z&&(n.z/=p),n.x=1-n.y-n.z,n}function EncodedCartesian3(){this.high=Cartesian3.clone(Cartesian3.ZERO),this.low=Cartesian3.clone(Cartesian3.ZERO)}EncodedCartesian3.encode=function(e,t){var i;return defined(t)||(t={high:0,low:0}),0<=e?(i=65536*Math.floor(e/65536),t.high=i,t.low=e-i):(i=65536*Math.floor(-e/65536),t.high=-i,t.low=e+i),t};var scratchEncode={high:0,low:0};EncodedCartesian3.fromCartesian=function(e,t){defined(t)||(t=new EncodedCartesian3);var i=t.high,r=t.low;return EncodedCartesian3.encode(e.x,scratchEncode),i.x=scratchEncode.high,r.x=scratchEncode.low,EncodedCartesian3.encode(e.y,scratchEncode),i.y=scratchEncode.high,r.y=scratchEncode.low,EncodedCartesian3.encode(e.z,scratchEncode),i.z=scratchEncode.high,r.z=scratchEncode.low,t};var encodedP=new EncodedCartesian3;EncodedCartesian3.writeElements=function(e,t,i){EncodedCartesian3.fromCartesian(e,encodedP);var r=encodedP.high,n=encodedP.low;t[i]=r.x,t[i+1]=r.y,t[i+2]=r.z,t[i+3]=n.x,t[i+4]=n.y,t[i+5]=n.z};var Tipsify={calculateACMR:function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).indices,i=e.maximumIndex,r=defaultValue(e.cacheSize,24),n=t.length;if(!defined(i))for(var a=i=0,o=t[a];a<n;)i<o&&(i=o),o=t[++a];for(var s=[],l=0;l<i+1;l++)s[l]=0;for(var c=r+1,u=0;u<n;++u)c-s[t[u]]>r&&(s[t[u]]=c,++c);return(c-r+1)/(n/3)}};Tipsify.tipsify=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).indices,i=e.maximumIndex,r=defaultValue(e.cacheSize,24);function n(e,t,i,r,n,a,o){for(var s,l=-1,c=-1,u=0;u<i.length;){var d=i[u];r[d].numLiveTriangles&&(s=0,n-r[d].timeStamp+2*r[d].numLiveTriangles<=t&&(s=n-r[d].timeStamp),(c<s||-1===c)&&(c=s,l=d)),++u}return-1===l?function(e,t,i){for(;1<=t.length;){var r=t[t.length-1];if(t.splice(t.length-1,1),0<e[r].numLiveTriangles)return r}for(;v<i;){if(0<e[v].numLiveTriangles)return++v-1;++v}return-1}(r,a,o):l}var a=t.length,o=0,s=0,l=t[s],c=a;if(defined(i))o=i+1;else{for(;s<c;)o<l&&(o=l),l=t[++s];if(-1===o)return 0;++o}for(var u=[],d=0;d<o;d++)u[d]={numLiveTriangles:0,timeStamp:0,vertexTriangles:[]};for(var h=s=0;s<c;)u[t[s]].vertexTriangles.push(h),++u[t[s]].numLiveTriangles,u[t[s+1]].vertexTriangles.push(h),++u[t[s+1]].numLiveTriangles,u[t[s+2]].vertexTriangles.push(h),++u[t[s+2]].numLiveTriangles,++h,s+=3;var p,m,f,g,_=0,y=r+1,v=1,C=[],S=[],T=0,x=[],b=a/3,E=[];for(d=0;d<b;d++)E[d]=!1;for(;-1!==_;){C=[],g=(m=u[_]).vertexTriangles.length;for(var P=0;P<g;++P)if(!E[h=m.vertexTriangles[P]]){E[h]=!0,s=h+h+h;for(var A=0;A<3;++A)f=t[s],C.push(f),S.push(f),x[T]=f,++T,--(p=u[f]).numLiveTriangles,y-p.timeStamp>r&&(p.timeStamp=y,++y),++s}_=n(0,r,C,u,y,S,o)}return x};var GeometryPipeline={};function addTriangle(e,t,i,r,n){e[t++]=i,e[t++]=r,e[t++]=r,e[t++]=n,e[t++]=n,e[t]=i}function trianglesToLines(e){for(var t=e.length,i=t/3*6,r=IndexDatatype$1.createTypedArray(t,i),n=0,a=0;a<t;a+=3,n+=6)addTriangle(r,n,e[a],e[a+1],e[a+2]);return r}function triangleStripToLines(e){var t=e.length;if(3<=t){var i=6*(t-2),r=IndexDatatype$1.createTypedArray(t,i);addTriangle(r,0,e[0],e[1],e[2]);for(var n=6,a=3;a<t;++a,n+=6)addTriangle(r,n,e[a-1],e[a],e[a-2]);return r}return new Uint16Array}function triangleFanToLines(e){if(0<e.length){for(var t=e.length-1,i=6*(t-1),r=IndexDatatype$1.createTypedArray(t,i),n=e[0],a=0,o=1;o<t;++o,a+=6)addTriangle(r,a,n,e[o],e[o+1]);return r}return new Uint16Array}function copyAttributesDescriptions(e){var t,i={};for(var r in e){e.hasOwnProperty(r)&&defined(e[r])&&defined(e[r].values)&&(t=e[r],i[r]=new GeometryAttribute({componentDatatype:t.componentDatatype,componentsPerAttribute:t.componentsPerAttribute,normalize:t.normalize,values:[]}))}return i}function copyVertex(e,t,i){for(var r in t)if(t.hasOwnProperty(r)&&defined(t[r])&&defined(t[r].values))for(var n=t[r],a=0;a<n.componentsPerAttribute;++a)e[r].values.push(n.values[i*n.componentsPerAttribute+a])}GeometryPipeline.toWireframe=function(e){var t=e.indices;if(defined(t)){switch(e.primitiveType){case PrimitiveType$1.TRIANGLES:e.indices=trianglesToLines(t);break;case PrimitiveType$1.TRIANGLE_STRIP:e.indices=triangleStripToLines(t);break;case PrimitiveType$1.TRIANGLE_FAN:e.indices=triangleFanToLines(t)}e.primitiveType=PrimitiveType$1.LINES}return e},GeometryPipeline.createLineSegmentsForVectors=function(e,t,i){t=defaultValue(t,"normal"),i=defaultValue(i,1e4);for(var r,n=e.attributes.position.values,a=e.attributes[t].values,o=n.length,s=new Float64Array(2*o),l=0,c=0;c<o;c+=3)s[l++]=n[c],s[l++]=n[c+1],s[l++]=n[c+2],s[l++]=n[c]+a[c]*i,s[l++]=n[c+1]+a[c+1]*i,s[l++]=n[c+2]+a[c+2]*i;var u=e.boundingSphere;return defined(u)&&(r=new BoundingSphere(u.center,u.radius+i)),new Geometry({attributes:{position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:s})},primitiveType:PrimitiveType$1.LINES,boundingSphere:r})},GeometryPipeline.createAttributeLocations=function(e){for(var t=["position","positionHigh","positionLow","position3DHigh","position3DLow","position2DHigh","position2DLow","pickColor","normal","st","tangent","bitangent","extrudeDirection","compressedAttributes"],i=e.attributes,r={},n=0,a=t.length,o=0;o<a;++o){var s=t[o];defined(i[s])&&(r[s]=n++)}for(var l in i)i.hasOwnProperty(l)&&!defined(r[l])&&(r[l]=n++);return r},GeometryPipeline.reorderForPreVertexCache=function(e){var t=Geometry.computeNumberOfVertices(e),i=e.indices;if(defined(i)){for(var r=new Int32Array(t),n=0;n<t;n++)r[n]=-1;for(var a,o=i,s=o.length,l=IndexDatatype$1.createTypedArray(t,s),c=0,u=0,d=0;c<s;)-1!==(a=r[o[c]])?l[u]=a:(r[a=o[c]]=d,l[u]=d,++d),++c,++u;e.indices=l;var h=e.attributes;for(var p in h)if(h.hasOwnProperty(p)&&defined(h[p])&&defined(h[p].values)){for(var m=h[p],f=m.values,g=0,_=m.componentsPerAttribute,y=ComponentDatatype$1.createTypedArray(m.componentDatatype,d*_);g<t;){var v=r[g];if(-1!==v)for(var C=0;C<_;C++)y[_*v+C]=f[_*g+C];++g}m.values=y}}return e},GeometryPipeline.reorderForPostVertexCache=function(e,t){var i=e.indices;if(e.primitiveType===PrimitiveType$1.TRIANGLES&&defined(i)){for(var r=i.length,n=0,a=0;a<r;a++)i[a]>n&&(n=i[a]);e.indices=Tipsify.tipsify({indices:i,maximumIndex:n,cacheSize:t})}return e},GeometryPipeline.fitToUnsignedShortIndices=function(e){var t=[],i=Geometry.computeNumberOfVertices(e);if(defined(e.indices)&&i>=CesiumMath.SIXTY_FOUR_KILOBYTES){var r,n=[],a=[],o=0,s=copyAttributesDescriptions(e.attributes),l=e.indices,c=l.length;e.primitiveType===PrimitiveType$1.TRIANGLES?r=3:e.primitiveType===PrimitiveType$1.LINES?r=2:e.primitiveType===PrimitiveType$1.POINTS&&(r=1);for(var u=0;u<c;u+=r){for(var d=0;d<r;++d){var h=l[u+d],p=n[h];defined(p)||(p=o++,n[h]=p,copyVertex(s,e.attributes,h)),a.push(p)}o+r>=CesiumMath.SIXTY_FOUR_KILOBYTES&&(t.push(new Geometry({attributes:s,indices:a,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV})),n=[],a=[],o=0,s=copyAttributesDescriptions(e.attributes))}0!==a.length&&t.push(new Geometry({attributes:s,indices:a,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV}))}else t.push(e);return t};var scratchProjectTo2DCartesian3=new Cartesian3,scratchProjectTo2DCartographic=new Cartographic;GeometryPipeline.projectTo2D=function(e,t,i,r,n){for(var a=e.attributes[t],o=(n=defined(n)?n:new GeographicProjection).ellipsoid,s=a.values,l=new Float64Array(s.length),c=0,u=0;u<s.length;u+=3){var d=Cartesian3.fromArray(s,u,scratchProjectTo2DCartesian3),h=o.cartesianToCartographic(d,scratchProjectTo2DCartographic),p=n.project(h,scratchProjectTo2DCartesian3);l[c++]=p.x,l[c++]=p.y,l[c++]=p.z}return e.attributes[i]=a,e.attributes[r]=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:l}),delete e.attributes[t],e};var encodedResult={high:0,low:0};GeometryPipeline.encodeAttribute=function(e,t,i,r){for(var n=e.attributes[t],a=n.values,o=a.length,s=new Float32Array(o),l=new Float32Array(o),c=0;c<o;++c)EncodedCartesian3.encode(a[c],encodedResult),s[c]=encodedResult.high,l[c]=encodedResult.low;var u=n.componentsPerAttribute;return e.attributes[i]=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:u,values:s}),e.attributes[r]=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:u,values:l}),delete e.attributes[t],e};var scratchCartesian3$4=new Cartesian3;function transformPoint(e,t){if(defined(t))for(var i=t.values,r=i.length,n=0;n<r;n+=3)Cartesian3.unpack(i,n,scratchCartesian3$4),Matrix4.multiplyByPoint(e,scratchCartesian3$4,scratchCartesian3$4),Cartesian3.pack(scratchCartesian3$4,i,n)}function transformVector(e,t){if(defined(t))for(var i=t.values,r=i.length,n=0;n<r;n+=3)Cartesian3.unpack(i,n,scratchCartesian3$4),Matrix3.multiplyByVector(e,scratchCartesian3$4,scratchCartesian3$4),scratchCartesian3$4=Cartesian3.normalize(scratchCartesian3$4,scratchCartesian3$4),Cartesian3.pack(scratchCartesian3$4,i,n)}var inverseTranspose=new Matrix4,normalMatrix=new Matrix3;function findAttributesInAllGeometries(e,t){var i,r=e.length,n={},a=e[0][t].attributes;for(i in a)if(a.hasOwnProperty(i)&&defined(a[i])&&defined(a[i].values)){for(var o=a[i],s=o.values.length,l=!0,c=1;c<r;++c){var u=e[c][t].attributes[i];if(!defined(u)||o.componentDatatype!==u.componentDatatype||o.componentsPerAttribute!==u.componentsPerAttribute||o.normalize!==u.normalize){l=!1;break}s+=u.values.length}l&&(n[i]=new GeometryAttribute({componentDatatype:o.componentDatatype,componentsPerAttribute:o.componentsPerAttribute,normalize:o.normalize,values:ComponentDatatype$1.createTypedArray(o.componentDatatype,s)}))}return n}GeometryPipeline.transformToWorldCoordinates=function(e){var t=e.modelMatrix;if(Matrix4.equals(t,Matrix4.IDENTITY))return e;var i=e.geometry.attributes;transformPoint(t,i.position),transformPoint(t,i.prevPosition),transformPoint(t,i.nextPosition),(defined(i.normal)||defined(i.tangent)||defined(i.bitangent))&&(Matrix4.inverse(t,inverseTranspose),Matrix4.transpose(inverseTranspose,inverseTranspose),Matrix4.getMatrix3(inverseTranspose,normalMatrix),transformVector(normalMatrix,i.normal),transformVector(normalMatrix,i.tangent),transformVector(normalMatrix,i.bitangent));var r=e.geometry.boundingSphere;return defined(r)&&(e.geometry.boundingSphere=BoundingSphere.transform(r,t,r)),e.modelMatrix=Matrix4.clone(Matrix4.IDENTITY),e};var tempScratch=new Cartesian3;function combineGeometries(e,t){var i,r,n,a,o,s,l=e.length,c=(e[0].modelMatrix,defined(e[0][t].indices)),u=e[0][t].primitiveType,d=findAttributesInAllGeometries(e,t);for(i in d)if(d.hasOwnProperty(i))for(n=d[i].values,p=C=0;p<l;++p)for(o=(a=e[p][t].attributes[i].values).length,r=0;r<o;++r)n[C++]=a[r];if(c){for(var h=0,p=0;p<l;++p)h+=e[p][t].indices.length;var m=Geometry.computeNumberOfVertices(new Geometry({attributes:d,primitiveType:PrimitiveType$1.POINTS})),f=IndexDatatype$1.createTypedArray(m,h),g=0,_=0;for(p=0;p<l;++p){for(var y=e[p][t].indices,v=y.length,C=0;C<v;++C)f[g++]=_+y[C];_+=Geometry.computeNumberOfVertices(e[p][t])}s=f}var S,T=new Cartesian3,x=0;for(p=0;p<l;++p){if(!defined(S=e[p][t].boundingSphere)){T=void 0;break}Cartesian3.add(S.center,T,T)}if(defined(T))for(Cartesian3.divideByScalar(T,l,T),p=0;p<l;++p){S=e[p][t].boundingSphere;var b=Cartesian3.magnitude(Cartesian3.subtract(S.center,T,tempScratch))+S.radius;x<b&&(x=b)}return new Geometry({attributes:d,indices:s,primitiveType:u,boundingSphere:defined(T)?new BoundingSphere(T,x):void 0})}GeometryPipeline.combineInstances=function(e){for(var t=[],i=[],r=e.length,n=0;n<r;++n){var a=e[n];defined(a.geometry)?t.push(a):defined(a.westHemisphereGeometry)&&defined(a.eastHemisphereGeometry)&&i.push(a)}var o=[];return 0<t.length&&o.push(combineGeometries(t,"geometry")),0<i.length&&(o.push(combineGeometries(i,"westHemisphereGeometry")),o.push(combineGeometries(i,"eastHemisphereGeometry"))),o};var normal=new Cartesian3,v0=new Cartesian3,v1=new Cartesian3,v2=new Cartesian3;GeometryPipeline.computeNormal=function(e){for(var t=e.indices,i=e.attributes,r=i.position.values,n=i.position.values.length/3,a=t.length,o=new Array(n),s=new Array(a/3),l=new Array(a),c=0;c<n;c++)o[c]={indexOffset:0,count:0,currentCount:0};var u=0;for(c=0;c<a;c+=3){var d=t[c],h=t[c+1],p=t[c+2],m=3*d,f=3*h,g=3*p;v0.x=r[m],v0.y=r[1+m],v0.z=r[2+m],v1.x=r[f],v1.y=r[1+f],v1.z=r[2+f],v2.x=r[g],v2.y=r[1+g],v2.z=r[2+g],o[d].count++,o[h].count++,o[p].count++,Cartesian3.subtract(v1,v0,v1),Cartesian3.subtract(v2,v0,v2),s[u]=Cartesian3.cross(v1,v2,new Cartesian3),u++}var _=0;for(c=0;c<n;c++)o[c].indexOffset+=_,_+=o[c].count;for(c=u=0;c<a;c+=3){var y=(S=o[t[c]]).indexOffset+S.currentCount;l[y]=u,S.currentCount++,l[(S=o[t[c+1]]).indexOffset+S.currentCount]=u,S.currentCount++,l[(S=o[t[c+2]]).indexOffset+S.currentCount]=u,S.currentCount++,u++}var v=new Float32Array(3*n);for(c=0;c<n;c++){var C=3*c,S=o[c];if(Cartesian3.clone(Cartesian3.ZERO,normal),0<S.count){for(u=0;u<S.count;u++)Cartesian3.add(normal,s[l[S.indexOffset+u]],normal);Cartesian3.equalsEpsilon(Cartesian3.ZERO,normal,CesiumMath.EPSILON10)&&Cartesian3.clone(s[l[S.indexOffset]],normal)}Cartesian3.equalsEpsilon(Cartesian3.ZERO,normal,CesiumMath.EPSILON10)&&(normal.z=1),Cartesian3.normalize(normal,normal),v[C]=normal.x,v[1+C]=normal.y,v[2+C]=normal.z}return e.attributes.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:v}),e};var normalScratch$1=new Cartesian3,normalScale=new Cartesian3,tScratch=new Cartesian3;GeometryPipeline.computeTangentAndBitangent=function(e){e.attributes;for(var t=e.indices,i=e.attributes.position.values,r=e.attributes.normal.values,n=e.attributes.st.values,a=e.attributes.position.values.length/3,o=t.length,s=new Array(3*a),l=0;l<s.length;l++)s[l]=0;for(l=0;l<o;l+=3){var c,u=t[l],d=t[l+1],h=t[l+2],p=3*d,m=3*h,f=2*u,g=2*d,_=2*h,y=i[c=3*u],v=i[c+1],C=i[c+2],S=n[f],T=n[1+f],x=n[1+g]-T,b=n[1+_]-T,E=1/((n[g]-S)*b-(n[_]-S)*x),P=(b*(i[p]-y)-x*(i[m]-y))*E,A=(b*(i[p+1]-v)-x*(i[m+1]-v))*E,w=(b*(i[p+2]-C)-x*(i[m+2]-C))*E;s[c]+=P,s[c+1]+=A,s[c+2]+=w,s[p]+=P,s[p+1]+=A,s[p+2]+=w,s[m]+=P,s[m+1]+=A,s[m+2]+=w}var D=new Float32Array(3*a),M=new Float32Array(3*a);for(l=0;l<a;l++){p=(c=3*l)+1,m=c+2;var I=Cartesian3.fromArray(r,c,normalScratch$1),R=Cartesian3.fromArray(s,c,tScratch),O=Cartesian3.dot(I,R);Cartesian3.multiplyByScalar(I,O,normalScale),Cartesian3.normalize(Cartesian3.subtract(R,normalScale,R),R),D[c]=R.x,D[p]=R.y,D[m]=R.z,Cartesian3.normalize(Cartesian3.cross(I,R,R),R),M[c]=R.x,M[p]=R.y,M[m]=R.z}return e.attributes.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:D}),e.attributes.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:M}),e};var scratchCartesian2$3=new Cartesian2,toEncode1=new Cartesian3,toEncode2=new Cartesian3,toEncode3=new Cartesian3,encodeResult2=new Cartesian2;function indexTriangles(e){if(defined(e.indices))return e;for(var t=Geometry.computeNumberOfVertices(e),i=IndexDatatype$1.createTypedArray(t,t),r=0;r<t;++r)i[r]=r;return e.indices=i,e}function indexTriangleFan(e){var t=Geometry.computeNumberOfVertices(e),i=IndexDatatype$1.createTypedArray(t,3*(t-2));i[0]=1,i[1]=0,i[2]=2;for(var r=3,n=3;n<t;++n)i[r++]=n-1,i[r++]=0,i[r++]=n;return e.indices=i,e.primitiveType=PrimitiveType$1.TRIANGLES,e}function indexTriangleStrip(e){var t=Geometry.computeNumberOfVertices(e),i=IndexDatatype$1.createTypedArray(t,3*(t-2));i[0]=0,i[1]=1,i[2]=2,3<t&&(i[3]=0,i[4]=2,i[5]=3);for(var r=6,n=3;n<t-1;n+=2)i[r++]=n,i[r++]=n-1,i[r++]=n+1,n+2<t&&(i[r++]=n,i[r++]=n+1,i[r++]=n+2);return e.indices=i,e.primitiveType=PrimitiveType$1.TRIANGLES,e}function indexLines(e){if(defined(e.indices))return e;for(var t=Geometry.computeNumberOfVertices(e),i=IndexDatatype$1.createTypedArray(t,t),r=0;r<t;++r)i[r]=r;return e.indices=i,e}function indexLineStrip(e){var t=Geometry.computeNumberOfVertices(e),i=IndexDatatype$1.createTypedArray(t,2*(t-1));i[0]=0,i[1]=1;for(var r=2,n=2;n<t;++n)i[r++]=n-1,i[r++]=n;return e.indices=i,e.primitiveType=PrimitiveType$1.LINES,e}function indexLineLoop(e){var t=Geometry.computeNumberOfVertices(e),i=IndexDatatype$1.createTypedArray(t,2*t);i[0]=0,i[1]=1;for(var r=2,n=2;n<t;++n)i[r++]=n-1,i[r++]=n;return i[r++]=t-1,i[r]=0,e.indices=i,e.primitiveType=PrimitiveType$1.LINES,e}function indexPrimitive(e){switch(e.primitiveType){case PrimitiveType$1.TRIANGLE_FAN:return indexTriangleFan(e);case PrimitiveType$1.TRIANGLE_STRIP:return indexTriangleStrip(e);case PrimitiveType$1.TRIANGLES:return indexTriangles(e);case PrimitiveType$1.LINE_STRIP:return indexLineStrip(e);case PrimitiveType$1.LINE_LOOP:return indexLineLoop(e);case PrimitiveType$1.LINES:return indexLines(e)}return e}function offsetPointFromXZPlane(e,t){Math.abs(e.y)<CesiumMath.EPSILON6&&(e.y=t?-CesiumMath.EPSILON6:CesiumMath.EPSILON6)}function offsetTriangleFromXZPlane(e,t,i){if(0!==e.y&&0!==t.y&&0!==i.y)return offsetPointFromXZPlane(e,e.y<0),offsetPointFromXZPlane(t,t.y<0),void offsetPointFromXZPlane(i,i.y<0);var r=Math.abs(e.y),n=Math.abs(t.y),a=Math.abs(i.y),o=n<r?a<r?CesiumMath.sign(e.y):CesiumMath.sign(i.y):a<n?CesiumMath.sign(t.y):CesiumMath.sign(i.y),s=o<0;offsetPointFromXZPlane(e,s),offsetPointFromXZPlane(t,s),offsetPointFromXZPlane(i,s)}GeometryPipeline.compressVertices=function(e){var t=e.attributes.extrudeDirection;if(defined(t)){for(var i=t.values,r=i.length/3,n=new Float32Array(2*r),a=0,o=0;o<r;++o)Cartesian3.fromArray(i,3*o,toEncode1),Cartesian3.equals(toEncode1,Cartesian3.ZERO)?a+=2:(encodeResult2=AttributeCompression.octEncodeInRange(toEncode1,65535,encodeResult2),n[a++]=encodeResult2.x,n[a++]=encodeResult2.y);return e.attributes.compressedAttributes=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:n}),delete e.attributes.extrudeDirection,e}var s=e.attributes.normal,l=e.attributes.st,c=defined(s),u=defined(l);if(!c&&!u)return e;var d,h,p,m,f=e.attributes.tangent,g=e.attributes.bitangent,_=defined(f),y=defined(g);c&&(d=s.values),u&&(h=l.values),_&&(p=f.values),y&&(m=g.values);var v=r=(c?d.length:h.length)/(c?3:2),C=u&&c?2:1;v*=C+=_||y?1:0;var S=new Float32Array(v),T=0;for(o=0;o<r;++o){u&&(Cartesian2.fromArray(h,2*o,scratchCartesian2$3),S[T++]=AttributeCompression.compressTextureCoordinates(scratchCartesian2$3));var x=3*o;c&&defined(p)&&defined(m)?(Cartesian3.fromArray(d,x,toEncode1),Cartesian3.fromArray(p,x,toEncode2),Cartesian3.fromArray(m,x,toEncode3),AttributeCompression.octPack(toEncode1,toEncode2,toEncode3,scratchCartesian2$3),S[T++]=scratchCartesian2$3.x,S[T++]=scratchCartesian2$3.y):(c&&(Cartesian3.fromArray(d,x,toEncode1),S[T++]=AttributeCompression.octEncodeFloat(toEncode1)),_&&(Cartesian3.fromArray(p,x,toEncode1),S[T++]=AttributeCompression.octEncodeFloat(toEncode1)),y&&(Cartesian3.fromArray(m,x,toEncode1),S[T++]=AttributeCompression.octEncodeFloat(toEncode1)))}return e.attributes.compressedAttributes=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:C,values:S}),c&&delete e.attributes.normal,u&&delete e.attributes.st,y&&delete e.attributes.bitangent,_&&delete e.attributes.tangent,e};var c3=new Cartesian3;function getXZIntersectionOffsetPoints(e,t,i,r){Cartesian3.add(e,Cartesian3.multiplyByScalar(Cartesian3.subtract(t,e,c3),e.y/(e.y-t.y),c3),i),Cartesian3.clone(i,r),offsetPointFromXZPlane(i,!0),offsetPointFromXZPlane(r,!1)}var u1=new Cartesian3,u2=new Cartesian3,q1=new Cartesian3,q2=new Cartesian3,splitTriangleResult={positions:new Array(7),indices:new Array(9)};function splitTriangle(e,t,i){if(!(0<=e.x||0<=t.x||0<=i.x)){offsetTriangleFromXZPlane(e,t,i);var r=e.y<0,n=t.y<0,a=i.y<0,o=0;o+=r?1:0,o+=n?1:0,o+=a?1:0;var s=splitTriangleResult.indices;1==o?(s[1]=3,s[2]=4,s[5]=6,s[7]=6,s[8]=5,r?(getXZIntersectionOffsetPoints(e,t,u1,q1),getXZIntersectionOffsetPoints(e,i,u2,q2),s[0]=0,s[3]=1,s[4]=2,s[6]=1):n?(getXZIntersectionOffsetPoints(t,i,u1,q1),getXZIntersectionOffsetPoints(t,e,u2,q2),s[0]=1,s[3]=2,s[4]=0,s[6]=2):a&&(getXZIntersectionOffsetPoints(i,e,u1,q1),getXZIntersectionOffsetPoints(i,t,u2,q2),s[0]=2,s[3]=0,s[4]=1,s[6]=0)):2==o&&(s[2]=4,s[4]=4,s[5]=3,s[7]=5,s[8]=6,r?n?a||(getXZIntersectionOffsetPoints(i,e,u1,q1),getXZIntersectionOffsetPoints(i,t,u2,q2),s[0]=0,s[1]=1,s[3]=0,s[6]=2):(getXZIntersectionOffsetPoints(t,i,u1,q1),getXZIntersectionOffsetPoints(t,e,u2,q2),s[0]=2,s[1]=0,s[3]=2,s[6]=1):(getXZIntersectionOffsetPoints(e,t,u1,q1),getXZIntersectionOffsetPoints(e,i,u2,q2),s[0]=1,s[1]=2,s[3]=1,s[6]=0));var l=splitTriangleResult.positions;return l[0]=e,l[1]=t,l[2]=i,l.length=3,1!=o&&2!=o||(l[3]=u1,l[4]=u2,l[5]=q1,l[6]=q2,l.length=7),splitTriangleResult}}function updateGeometryAfterSplit(e,t){var i,r=e.attributes;if(0!==r.position.values.length){for(var n in r){r.hasOwnProperty(n)&&defined(r[n])&&defined(r[n].values)&&((i=r[n]).values=ComponentDatatype$1.createTypedArray(i.componentDatatype,i.values))}var a=Geometry.computeNumberOfVertices(e);return e.indices=IndexDatatype$1.createTypedArray(a,e.indices),t&&(e.boundingSphere=BoundingSphere.fromVertices(r.position.values)),e}}function copyGeometryForSplit(e){var t,i=e.attributes,r={};for(var n in i){i.hasOwnProperty(n)&&defined(i[n])&&defined(i[n].values)&&(t=i[n],r[n]=new GeometryAttribute({componentDatatype:t.componentDatatype,componentsPerAttribute:t.componentsPerAttribute,normalize:t.normalize,values:[]}))}return new Geometry({attributes:r,indices:[],primitiveType:e.primitiveType})}function updateInstanceAfterSplit(e,t,i){var r=defined(e.geometry.boundingSphere);t=updateGeometryAfterSplit(t,r),defined(i=updateGeometryAfterSplit(i,r))&&!defined(t)?e.geometry=i:!defined(i)&&defined(t)?e.geometry=t:(e.westHemisphereGeometry=t,e.eastHemisphereGeometry=i,e.geometry=void 0)}function generateBarycentricInterpolateFunction(h,p){var m=new h,f=new h,g=new h;return function(e,t,i,r,n,a,o,s){var l=h.fromArray(n,e*p,m),c=h.fromArray(n,t*p,f),u=h.fromArray(n,i*p,g);h.multiplyByScalar(l,r.x,l),h.multiplyByScalar(c,r.y,c),h.multiplyByScalar(u,r.z,u);var d=h.add(l,c,l);h.add(d,u,d),s&&h.normalize(d,d),h.pack(d,a,o*p)}}var interpolateAndPackCartesian4=generateBarycentricInterpolateFunction(Cartesian4,4),interpolateAndPackCartesian3=generateBarycentricInterpolateFunction(Cartesian3,3),interpolateAndPackCartesian2=generateBarycentricInterpolateFunction(Cartesian2,2),interpolateAndPackBoolean=function(e,t,i,r,n,a,o){var s=n[e]*r.x,l=n[t]*r.y,c=n[i]*r.z;a[o]=s+l+c>CesiumMath.EPSILON6?1:0},p0Scratch=new Cartesian3,p1Scratch=new Cartesian3,p2Scratch=new Cartesian3,barycentricScratch=new Cartesian3;function computeTriangleAttributes(e,t,i,r,n,a,o,s,l,c,u,d,h,p,m,f){if(defined(a)||defined(o)||defined(s)||defined(l)||defined(c)||0!==p){var g,_,y,v,C=barycentricCoordinates(r,Cartesian3.fromArray(n,3*e,p0Scratch),Cartesian3.fromArray(n,3*t,p1Scratch),Cartesian3.fromArray(n,3*i,p2Scratch),barycentricScratch);if(defined(a)&&interpolateAndPackCartesian3(e,t,i,C,a,d.normal.values,f,!0),defined(c)&&(g=Cartesian3.fromArray(c,3*e,p0Scratch),_=Cartesian3.fromArray(c,3*t,p1Scratch),y=Cartesian3.fromArray(c,3*i,p2Scratch),Cartesian3.multiplyByScalar(g,C.x,g),Cartesian3.multiplyByScalar(_,C.y,_),Cartesian3.multiplyByScalar(y,C.z,y),Cartesian3.equals(g,Cartesian3.ZERO)&&Cartesian3.equals(_,Cartesian3.ZERO)&&Cartesian3.equals(y,Cartesian3.ZERO)?((v=p0Scratch).x=0,v.y=0,v.z=0):(v=Cartesian3.add(g,_,g),Cartesian3.add(v,y,v),Cartesian3.normalize(v,v)),Cartesian3.pack(v,d.extrudeDirection.values,3*f)),defined(u)&&interpolateAndPackBoolean(e,t,i,C,u,d.applyOffset.values,f),defined(o)&&interpolateAndPackCartesian3(e,t,i,C,o,d.tangent.values,f,!0),defined(s)&&interpolateAndPackCartesian3(e,t,i,C,s,d.bitangent.values,f,!0),defined(l)&&interpolateAndPackCartesian2(e,t,i,C,l,d.st.values,f),0<p)for(var S=0;S<p;S++){var T=h[S];genericInterpolate(e,t,i,C,f,m[T],d[T])}}}function genericInterpolate(e,t,i,r,n,a,o){var s=a.componentsPerAttribute,l=a.values,c=o.values;switch(s){case 4:interpolateAndPackCartesian4(e,t,i,r,l,c,n,!1);break;case 3:interpolateAndPackCartesian3(e,t,i,r,l,c,n,!1);break;case 2:interpolateAndPackCartesian2(e,t,i,r,l,c,n,!1);break;default:c[n]=l[e]*r.x+l[t]*r.y+l[i]*r.z}}function insertSplitPoint(e,t,i,r,n,a){var o=e.position.values.length/3;if(-1===n)return e.position.values.push(a.x,a.y,a.z),t.push(o),o;var s=r[n],l=i[s];return-1===l?(i[s]=o,e.position.values.push(a.x,a.y,a.z),t.push(o),o):(t.push(l),l)}var NAMED_ATTRIBUTES={position:!0,normal:!0,bitangent:!0,tangent:!0,st:!0,extrudeDirection:!0,applyOffset:!0};function splitLongitudeTriangles(e){var t=e.geometry,i=t.attributes,r=i.position.values,n=defined(i.normal)?i.normal.values:void 0,a=defined(i.bitangent)?i.bitangent.values:void 0,o=defined(i.tangent)?i.tangent.values:void 0,s=defined(i.st)?i.st.values:void 0,l=defined(i.extrudeDirection)?i.extrudeDirection.values:void 0,c=defined(i.applyOffset)?i.applyOffset.values:void 0,u=t.indices,d=[];for(var h in i)i.hasOwnProperty(h)&&!NAMED_ATTRIBUTES[h]&&defined(i[h])&&d.push(h);var p,m,f=d.length,g=copyGeometryForSplit(t),_=copyGeometryForSplit(t),y=[];y.length=r.length/3;var v=[];for(v.length=r.length/3,S=0;S<y.length;++S)y[S]=-1,v[S]=-1;for(var C=u.length,S=0;S<C;S+=3){var T=u[S],x=u[S+1],b=u[S+2],E=Cartesian3.fromArray(r,3*T),P=Cartesian3.fromArray(r,3*x),A=Cartesian3.fromArray(r,3*b),w=splitTriangle(E,P,A);if(defined(w)&&3<w.positions.length)for(var D=w.positions,M=w.indices,I=M.length,R=0;R<I;++R){var O=M[R],L=D[O],F=L.y<0?(p=_.attributes,m=_.indices,y):(p=g.attributes,m=g.indices,v);computeTriangleAttributes(T,x,b,L,r,n,o,a,s,l,c,p,d,f,i,insertSplitPoint(p,m,F,u,O<3?S+O:-1,L))}else defined(w)&&(E=w.positions[0],P=w.positions[1],A=w.positions[2]),F=E.y<0?(p=_.attributes,m=_.indices,y):(p=g.attributes,m=g.indices,v),computeTriangleAttributes(T,x,b,E,r,n,o,a,s,l,c,p,d,f,i,insertSplitPoint(p,m,F,u,S,E)),computeTriangleAttributes(T,x,b,P,r,n,o,a,s,l,c,p,d,f,i,insertSplitPoint(p,m,F,u,S+1,P)),computeTriangleAttributes(T,x,b,A,r,n,o,a,s,l,c,p,d,f,i,insertSplitPoint(p,m,F,u,S+2,A))}updateInstanceAfterSplit(e,_,g)}var xzPlane=Plane.fromPointNormal(Cartesian3.ZERO,Cartesian3.UNIT_Y),offsetScratch=new Cartesian3,offsetPointScratch=new Cartesian3;function computeLineAttributes(e,t,i,r,n,a,o){var s;defined(o)&&(s=Cartesian3.fromArray(r,3*e,p0Scratch),Cartesian3.equalsEpsilon(s,i,CesiumMath.EPSILON10)?a.applyOffset.values[n]=o[e]:a.applyOffset.values[n]=o[t])}function splitLongitudeLines(e){var t,i=e.geometry,r=i.attributes,n=r.position.values,a=defined(r.applyOffset)?r.applyOffset.values:void 0,o=i.indices,s=copyGeometryForSplit(i),l=copyGeometryForSplit(i),c=o.length,u=[];u.length=n.length/3;var d=[];for(d.length=n.length/3,t=0;t<u.length;++t)u[t]=-1,d[t]=-1;for(t=0;t<c;t+=2){var h=o[t],p=o[t+1],m=Cartesian3.fromArray(n,3*h,p0Scratch),f=Cartesian3.fromArray(n,3*p,p1Scratch);Math.abs(m.y)<CesiumMath.EPSILON6&&(m.y<0?m.y=-CesiumMath.EPSILON6:m.y=CesiumMath.EPSILON6),Math.abs(f.y)<CesiumMath.EPSILON6&&(f.y<0?f.y=-CesiumMath.EPSILON6:f.y=CesiumMath.EPSILON6);var g,_,y,v,C,S=s.attributes,T=s.indices,x=d,b=l.attributes,E=l.indices,P=u,A=IntersectionTests.lineSegmentPlane(m,f,xzPlane,p2Scratch);defined(A)?(g=Cartesian3.multiplyByScalar(Cartesian3.UNIT_Y,5*CesiumMath.EPSILON9,offsetScratch),m.y<0&&(Cartesian3.negate(g,g),S=l.attributes,T=l.indices,x=u,b=s.attributes,E=s.indices,P=d),_=Cartesian3.add(A,g,offsetPointScratch),computeLineAttributes(h,p,m,n,insertSplitPoint(S,T,x,o,t,m),S,a),computeLineAttributes(h,p,_,n,insertSplitPoint(S,T,x,o,-1,_),S,a),Cartesian3.negate(g,g),Cartesian3.add(A,g,_),computeLineAttributes(h,p,_,n,insertSplitPoint(b,E,P,o,-1,_),b,a),computeLineAttributes(h,p,f,n,insertSplitPoint(b,E,P,o,t+1,f),b,a)):(C=m.y<0?(y=l.attributes,v=l.indices,u):(y=s.attributes,v=s.indices,d),computeLineAttributes(h,p,m,n,insertSplitPoint(y,v,C,o,t,m),y,a),computeLineAttributes(h,p,f,n,insertSplitPoint(y,v,C,o,t+1,f),y,a))}updateInstanceAfterSplit(e,l,s)}var cartesian2Scratch0=new Cartesian2,cartesian2Scratch1=new Cartesian2,cartesian3Scratch0=new Cartesian3,cartesian3Scratch2=new Cartesian3,cartesian3Scratch3=new Cartesian3,cartesian3Scratch4=new Cartesian3,cartesian3Scratch5=new Cartesian3,cartesian3Scratch6=new Cartesian3,cartesian4Scratch0=new Cartesian4;function updateAdjacencyAfterSplit(e){for(var t=e.attributes,i=t.position.values,r=t.prevPosition.values,n=t.nextPosition.values,a=i.length,o=0;o<a;o+=3){var s,l,c=Cartesian3.unpack(i,o,cartesian3Scratch0);0<c.x||(s=Cartesian3.unpack(r,o,cartesian3Scratch2),(c.y<0&&0<s.y||0<c.y&&s.y<0)&&(0<o-3?(r[o]=i[o-3],r[o+1]=i[o-2],r[o+2]=i[o-1]):Cartesian3.pack(c,r,o)),l=Cartesian3.unpack(n,o,cartesian3Scratch3),(c.y<0&&0<l.y||0<c.y&&l.y<0)&&(o+3<a?(n[o]=i[o+3],n[o+1]=i[o+4],n[o+2]=i[o+5]):Cartesian3.pack(c,n,o)))}}var offsetScalar=5*CesiumMath.EPSILON9,coplanarOffset=CesiumMath.EPSILON6;function splitLongitudePolyline(e){for(var t,i=e.geometry,r=i.attributes,n=r.position.values,a=r.prevPosition.values,o=r.nextPosition.values,s=r.expandAndWidth.values,l=defined(r.st)?r.st.values:void 0,c=defined(r.color)?r.color.values:void 0,u=copyGeometryForSplit(i),d=copyGeometryForSplit(i),h=!1,p=n.length/3,m=0;m<p;m+=4){var f=m,g=m+2,_=Cartesian3.fromArray(n,3*f,cartesian3Scratch0),y=Cartesian3.fromArray(n,3*g,cartesian3Scratch2);if(Math.abs(_.y)<coplanarOffset)for(_.y=coplanarOffset*(y.y<0?-1:1),n[3*m+1]=_.y,n[3*(m+1)+1]=_.y,F=3*f;F<3*f+12;F+=3)a[F]=n[3*m],a[F+1]=n[3*m+1],a[F+2]=n[3*m+2];if(Math.abs(y.y)<coplanarOffset)for(y.y=coplanarOffset*(_.y<0?-1:1),n[3*(m+2)+1]=y.y,n[3*(m+3)+1]=y.y,F=3*f;F<3*f+12;F+=3)o[F]=n[3*(m+2)],o[F+1]=n[3*(m+2)+1],o[F+2]=n[3*(m+2)+2];var v=u.attributes,C=u.indices,S=d.attributes,T=d.indices,x=IntersectionTests.lineSegmentPlane(_,y,xzPlane,cartesian3Scratch4);if(defined(x)){h=!0;var b=Cartesian3.multiplyByScalar(Cartesian3.UNIT_Y,offsetScalar,cartesian3Scratch5);_.y<0&&(Cartesian3.negate(b,b),v=d.attributes,C=d.indices,S=u.attributes,T=u.indices);var E=Cartesian3.add(x,b,cartesian3Scratch6);v.position.values.push(_.x,_.y,_.z,_.x,_.y,_.z),v.position.values.push(E.x,E.y,E.z),v.position.values.push(E.x,E.y,E.z),v.prevPosition.values.push(a[3*f],a[3*f+1],a[3*f+2]),v.prevPosition.values.push(a[3*f+3],a[3*f+4],a[3*f+5]),v.prevPosition.values.push(_.x,_.y,_.z,_.x,_.y,_.z),v.nextPosition.values.push(E.x,E.y,E.z),v.nextPosition.values.push(E.x,E.y,E.z),v.nextPosition.values.push(E.x,E.y,E.z),v.nextPosition.values.push(E.x,E.y,E.z),Cartesian3.negate(b,b),Cartesian3.add(x,b,E),S.position.values.push(E.x,E.y,E.z),S.position.values.push(E.x,E.y,E.z),S.position.values.push(y.x,y.y,y.z,y.x,y.y,y.z),S.prevPosition.values.push(E.x,E.y,E.z),S.prevPosition.values.push(E.x,E.y,E.z),S.prevPosition.values.push(E.x,E.y,E.z),S.prevPosition.values.push(E.x,E.y,E.z),S.nextPosition.values.push(y.x,y.y,y.z,y.x,y.y,y.z),S.nextPosition.values.push(o[3*g],o[3*g+1],o[3*g+2]),S.nextPosition.values.push(o[3*g+3],o[3*g+4],o[3*g+5]);var P=Cartesian2.fromArray(s,2*f,cartesian2Scratch0),A=Math.abs(P.y);v.expandAndWidth.values.push(-1,A,1,A),v.expandAndWidth.values.push(-1,-A,1,-A),S.expandAndWidth.values.push(-1,A,1,A),S.expandAndWidth.values.push(-1,-A,1,-A);var w=Cartesian3.magnitudeSquared(Cartesian3.subtract(x,_,cartesian3Scratch3));if(w/=Cartesian3.magnitudeSquared(Cartesian3.subtract(y,_,cartesian3Scratch3)),defined(c)){for(var D=Cartesian4.fromArray(c,4*f,cartesian4Scratch0),M=Cartesian4.fromArray(c,4*g,cartesian4Scratch0),I=CesiumMath.lerp(D.x,M.x,w),R=CesiumMath.lerp(D.y,M.y,w),O=CesiumMath.lerp(D.z,M.z,w),L=CesiumMath.lerp(D.w,M.w,w),F=4*f;F<4*f+8;++F)v.color.values.push(c[F]);for(v.color.values.push(I,R,O,L),v.color.values.push(I,R,O,L),S.color.values.push(I,R,O,L),S.color.values.push(I,R,O,L),F=4*g;F<4*g+8;++F)S.color.values.push(c[F])}if(defined(l)){var N=Cartesian2.fromArray(l,2*f,cartesian2Scratch0),B=Cartesian2.fromArray(l,2*(m+3),cartesian2Scratch1),V=CesiumMath.lerp(N.x,B.x,w);for(F=2*f;F<2*f+4;++F)v.st.values.push(l[F]);for(v.st.values.push(V,N.y),v.st.values.push(V,B.y),S.st.values.push(V,N.y),S.st.values.push(V,B.y),F=2*g;F<2*g+4;++F)S.st.values.push(l[F])}t=v.position.values.length/3-4,C.push(t,t+2,t+1),C.push(t+1,t+2,t+3),t=S.position.values.length/3-4,T.push(t,t+2,t+1),T.push(t+1,t+2,t+3)}else{var k,z=_.y<0?(k=d.attributes,d.indices):(k=u.attributes,u.indices);for(k.position.values.push(_.x,_.y,_.z),k.position.values.push(_.x,_.y,_.z),k.position.values.push(y.x,y.y,y.z),k.position.values.push(y.x,y.y,y.z),F=3*m;F<3*m+12;++F)k.prevPosition.values.push(a[F]),k.nextPosition.values.push(o[F]);for(F=2*m;F<2*m+8;++F)k.expandAndWidth.values.push(s[F]),defined(l)&&k.st.values.push(l[F]);if(defined(c))for(F=4*m;F<4*m+16;++F)k.color.values.push(c[F]);t=k.position.values.length/3-4,z.push(t,t+2,t+1),z.push(t+1,t+2,t+3)}}h&&(updateAdjacencyAfterSplit(d),updateAdjacencyAfterSplit(u)),updateInstanceAfterSplit(e,d,u)}GeometryPipeline.splitLongitude=function(e){var t=e.geometry,i=t.boundingSphere;if(defined(i)&&(0<i.center.x-i.radius||BoundingSphere.intersectPlane(i,Plane.ORIGIN_ZX_PLANE)!==Intersect$1.INTERSECTING))return e;if(t.geometryType!==GeometryType$1.NONE)switch(t.geometryType){case GeometryType$1.POLYLINES:splitLongitudePolyline(e);break;case GeometryType$1.TRIANGLES:splitLongitudeTriangles(e);break;case GeometryType$1.LINES:splitLongitudeLines(e)}else indexPrimitive(t),t.primitiveType===PrimitiveType$1.TRIANGLES?splitLongitudeTriangles(e):t.primitiveType===PrimitiveType$1.LINES&&splitLongitudeLines(e);return e};var scratchCartesian1$3=new Cartesian3,scratchCartesian2$4=new Cartesian3,scratchCartesian3$5=new Cartesian3,scratchCartesian4$1=new Cartesian3,texCoordScratch=new Cartesian2,textureMatrixScratch=new Matrix3,tangentMatrixScratch=new Matrix3,quaternionScratch=new Quaternion,scratchNormal$2=new Cartesian3,scratchTangent=new Cartesian3,scratchBitangent=new Cartesian3,scratchCartographic$1=new Cartographic,projectedCenterScratch=new Cartesian3,scratchMinTexCoord=new Cartesian2,scratchMaxTexCoord=new Cartesian2;function computeTopBottomAttributes(e,t,i){var r=t.vertexFormat,n=t.center,a=t.semiMajorAxis,o=t.semiMinorAxis,s=t.ellipsoid,l=t.stRotation,c=i?e.length/3*2:e.length/3,u=t.shadowVolume,d=r.st?new Float32Array(2*c):void 0,h=r.normal?new Float32Array(3*c):void 0,p=r.tangent?new Float32Array(3*c):void 0,m=r.bitangent?new Float32Array(3*c):void 0,f=u?new Float32Array(3*c):void 0,g=0,_=scratchNormal$2,y=scratchTangent,v=scratchBitangent,C=new GeographicProjection(s),S=C.project(s.cartesianToCartographic(n,scratchCartographic$1),projectedCenterScratch),T=s.scaleToGeodeticSurface(n,scratchCartesian1$3);s.geodeticSurfaceNormal(T,T);var x,b=textureMatrixScratch,E=tangentMatrixScratch;E=0!==l?(x=Quaternion.fromAxisAngle(T,l,quaternionScratch),b=Matrix3.fromQuaternion(x,b),x=Quaternion.fromAxisAngle(T,-l,quaternionScratch),Matrix3.fromQuaternion(x,E)):(b=Matrix3.clone(Matrix3.IDENTITY,b),Matrix3.clone(Matrix3.IDENTITY,E));for(var P=Cartesian2.fromElements(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,scratchMinTexCoord),A=Cartesian2.fromElements(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,scratchMaxTexCoord),w=e.length,D=i?w:0,M=D/3*2,I=0;I<w;I+=3){var R,O,L=I+1,F=I+2,N=Cartesian3.fromArray(e,I,scratchCartesian1$3);r.st&&(R=Matrix3.multiplyByVector(b,N,scratchCartesian2$4),O=C.project(s.cartesianToCartographic(R,scratchCartographic$1),scratchCartesian3$5),Cartesian3.subtract(O,S,O),texCoordScratch.x=(O.x+a)/(2*a),texCoordScratch.y=(O.y+o)/(2*o),P.x=Math.min(texCoordScratch.x,P.x),P.y=Math.min(texCoordScratch.y,P.y),A.x=Math.max(texCoordScratch.x,A.x),A.y=Math.max(texCoordScratch.y,A.y),i&&(d[g+M]=texCoordScratch.x,d[g+1+M]=texCoordScratch.y),d[g++]=texCoordScratch.x,d[g++]=texCoordScratch.y),(r.normal||r.tangent||r.bitangent||u)&&(_=s.geodeticSurfaceNormal(N,_),u&&(f[I+D]=-_.x,f[L+D]=-_.y,f[F+D]=-_.z),(r.normal||r.tangent||r.bitangent)&&((r.tangent||r.bitangent)&&(y=Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z,_,y),y),Matrix3.multiplyByVector(E,y,y)),r.normal&&(h[I]=_.x,h[L]=_.y,h[F]=_.z,i&&(h[I+D]=-_.x,h[L+D]=-_.y,h[F+D]=-_.z)),r.tangent&&(p[I]=y.x,p[L]=y.y,p[F]=y.z,i&&(p[I+D]=-y.x,p[L+D]=-y.y,p[F+D]=-y.z)),r.bitangent&&(v=Cartesian3.normalize(Cartesian3.cross(_,y,v),v),m[I]=v.x,m[L]=v.y,m[F]=v.z,i&&(m[I+D]=v.x,m[L+D]=v.y,m[F+D]=v.z))))}if(r.st){w=d.length;for(var B=0;B<w;B+=2)d[B]=(d[B]-P.x)/(A.x-P.x),d[B+1]=(d[B+1]-P.y)/(A.y-P.y)}var V,k,z=new GeometryAttributes;return r.position&&(V=EllipseGeometryLibrary.raisePositionsToHeight(e,t,i),z.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:V})),r.st&&(z.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:d})),r.normal&&(z.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:h})),r.tangent&&(z.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:p})),r.bitangent&&(z.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:m})),u&&(z.extrudeDirection=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:f})),i&&defined(t.offsetAttribute)&&(k=new Uint8Array(c),k=t.offsetAttribute===GeometryOffsetAttribute$1.TOP?arrayFill(k,1,0,c/2):arrayFill(k,t.offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),z.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:k})),z}function topIndices(e){for(var t,i,r=new Array(e*(e+1)*12-6),n=0,a=0,o=1,s=0;s<3;s++)r[n++]=o++,r[n++]=a,r[n++]=o;for(s=2;s<e+1;++s){for(o=s*(s+1)-1,a=(s-1)*s-1,r[n++]=o++,r[n++]=a,r[n++]=o,t=2*s,i=0;i<t-1;++i)r[n++]=o,r[n++]=a++,r[n++]=a,r[n++]=o++,r[n++]=a,r[n++]=o;r[n++]=o++,r[n++]=a,r[n++]=o}for(t=2*e,++o,++a,s=0;s<t-1;++s)r[n++]=o,r[n++]=a++,r[n++]=a,r[n++]=o++,r[n++]=a,r[n++]=o;for(r[n++]=o,r[n++]=a++,r[n++]=a,r[n++]=o++,r[n++]=a++,r[n++]=a,++a,s=e-1;1<s;--s){for(r[n++]=a++,r[n++]=a,r[n++]=o,t=2*s,i=0;i<t-1;++i)r[n++]=o,r[n++]=a++,r[n++]=a,r[n++]=o++,r[n++]=a,r[n++]=o;r[n++]=a++,r[n++]=a++,r[n++]=o++}for(s=0;s<3;s++)r[n++]=a++,r[n++]=a,r[n++]=o;return r}var boundingSphereCenter=new Cartesian3;function computeEllipse(e){var t=e.center;boundingSphereCenter=Cartesian3.multiplyByScalar(e.ellipsoid.geodeticSurfaceNormal(t,boundingSphereCenter),e.height,boundingSphereCenter);var i=new BoundingSphere(boundingSphereCenter=Cartesian3.add(t,boundingSphereCenter,boundingSphereCenter),e.semiMajorAxis),r=EllipseGeometryLibrary.computeEllipsePositions(e,!0,!1),n=r.positions,a=r.numPts,o=computeTopBottomAttributes(n,e,!1),s=topIndices(a);return{boundingSphere:i,attributes:o,indices:s=IndexDatatype$1.createTypedArray(n.length/3,s)}}function computeWallAttributes(e,t){var i=t.vertexFormat,r=t.center,n=t.semiMajorAxis,a=t.semiMinorAxis,o=t.ellipsoid,s=t.height,l=t.extrudedHeight,c=t.stRotation,u=e.length/3*2,d=new Float64Array(3*u),h=i.st?new Float32Array(2*u):void 0,p=i.normal?new Float32Array(3*u):void 0,m=i.tangent?new Float32Array(3*u):void 0,f=i.bitangent?new Float32Array(3*u):void 0,g=t.shadowVolume,_=g?new Float32Array(3*u):void 0,y=0,v=scratchNormal$2,C=scratchTangent,S=scratchBitangent,T=new GeographicProjection(o),x=T.project(o.cartesianToCartographic(r,scratchCartographic$1),projectedCenterScratch),b=o.scaleToGeodeticSurface(r,scratchCartesian1$3);o.geodeticSurfaceNormal(b,b);for(var E=Quaternion.fromAxisAngle(b,c,quaternionScratch),P=Matrix3.fromQuaternion(E,textureMatrixScratch),A=Cartesian2.fromElements(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,scratchMinTexCoord),w=Cartesian2.fromElements(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,scratchMaxTexCoord),D=e.length,M=D/3*2,I=0;I<D;I+=3){var R,O,L=I+1,F=I+2,N=Cartesian3.fromArray(e,I,scratchCartesian1$3);i.st&&(R=Matrix3.multiplyByVector(P,N,scratchCartesian2$4),O=T.project(o.cartesianToCartographic(R,scratchCartographic$1),scratchCartesian3$5),Cartesian3.subtract(O,x,O),texCoordScratch.x=(O.x+n)/(2*n),texCoordScratch.y=(O.y+a)/(2*a),A.x=Math.min(texCoordScratch.x,A.x),A.y=Math.min(texCoordScratch.y,A.y),w.x=Math.max(texCoordScratch.x,w.x),w.y=Math.max(texCoordScratch.y,w.y),h[y+M]=texCoordScratch.x,h[y+1+M]=texCoordScratch.y,h[y++]=texCoordScratch.x,h[y++]=texCoordScratch.y),N=o.scaleToGeodeticSurface(N,N),z=Cartesian3.clone(N,scratchCartesian2$4),v=o.geodeticSurfaceNormal(N,v),g&&(_[I+D]=-v.x,_[L+D]=-v.y,_[F+D]=-v.z);var B,V,k=Cartesian3.multiplyByScalar(v,s,scratchCartesian4$1),N=Cartesian3.add(N,k,N),k=Cartesian3.multiplyByScalar(v,l,k),z=Cartesian3.add(z,k,z);i.position&&(d[I+D]=z.x,d[L+D]=z.y,d[F+D]=z.z,d[I]=N.x,d[L]=N.y,d[F]=N.z),(i.normal||i.tangent||i.bitangent)&&(S=Cartesian3.clone(v,S),B=Cartesian3.fromArray(e,(I+3)%D,scratchCartesian4$1),Cartesian3.subtract(B,N,B),V=Cartesian3.subtract(z,N,scratchCartesian3$5),v=Cartesian3.normalize(Cartesian3.cross(V,B,v),v),i.normal&&(p[I]=v.x,p[L]=v.y,p[F]=v.z,p[I+D]=v.x,p[L+D]=v.y,p[F+D]=v.z),i.tangent&&(C=Cartesian3.normalize(Cartesian3.cross(S,v,C),C),m[I]=C.x,m[L]=C.y,m[F]=C.z,m[I+D]=C.x,m[I+1+D]=C.y,m[I+2+D]=C.z),i.bitangent&&(f[I]=S.x,f[L]=S.y,f[F]=S.z,f[I+D]=S.x,f[L+D]=S.y,f[F+D]=S.z))}if(i.st){D=h.length;for(var $=0;$<D;$+=2)h[$]=(h[$]-A.x)/(w.x-A.x),h[$+1]=(h[$+1]-A.y)/(w.y-A.y)}var U,G=new GeometryAttributes;return i.position&&(G.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:d})),i.st&&(G.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:h})),i.normal&&(G.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:p})),i.tangent&&(G.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:m})),i.bitangent&&(G.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:f})),g&&(G.extrudeDirection=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:_})),defined(t.offsetAttribute)&&(U=new Uint8Array(u),U=t.offsetAttribute===GeometryOffsetAttribute$1.TOP?arrayFill(U,1,0,u/2):arrayFill(U,t.offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),G.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:U})),G}function computeWallIndices(e){for(var t=e.length/3,i=IndexDatatype$1.createTypedArray(t,6*t),r=0,n=0;n<t;n++){var a=n+t,o=(n+1)%t,s=o+t;i[r++]=n,i[r++]=a,i[r++]=o,i[r++]=o,i[r++]=a,i[r++]=s}return i}var topBoundingSphere=new BoundingSphere,bottomBoundingSphere=new BoundingSphere;function computeExtrudedEllipse(e){var t=e.center,i=e.ellipsoid,r=e.semiMajorAxis,n=Cartesian3.multiplyByScalar(i.geodeticSurfaceNormal(t,scratchCartesian1$3),e.height,scratchCartesian1$3);topBoundingSphere.center=Cartesian3.add(t,n,topBoundingSphere.center),topBoundingSphere.radius=r,n=Cartesian3.multiplyByScalar(i.geodeticSurfaceNormal(t,n),e.extrudedHeight,n),bottomBoundingSphere.center=Cartesian3.add(t,n,bottomBoundingSphere.center),bottomBoundingSphere.radius=r;var a=EllipseGeometryLibrary.computeEllipsePositions(e,!0,!0),o=a.positions,s=a.numPts,l=a.outerPositions,c=BoundingSphere.union(topBoundingSphere,bottomBoundingSphere),u=computeTopBottomAttributes(o,e,!0),d=(g=topIndices(s)).length;g.length=2*d;for(var h=o.length/3,p=0;p<d;p+=3)g[p+d]=g[p+2]+h,g[p+1+d]=g[p+1]+h,g[p+2+d]=g[p]+h;var m=new Geometry({attributes:u,indices:IndexDatatype$1.createTypedArray(2*h/3,g),primitiveType:PrimitiveType$1.TRIANGLES}),f=computeWallAttributes(l,e),g=computeWallIndices(l),_=new Geometry({attributes:f,indices:IndexDatatype$1.createTypedArray(2*l.length/3,g),primitiveType:PrimitiveType$1.TRIANGLES}),y=GeometryPipeline.combineInstances([new GeometryInstance({geometry:m}),new GeometryInstance({geometry:_})]);return{boundingSphere:c,attributes:y[0].attributes,indices:y[0].indices}}function computeRectangle(e,t,i,r,n,a,o){for(var s=EllipseGeometryLibrary.computeEllipsePositions({center:e,semiMajorAxis:t,semiMinorAxis:i,rotation:r,granularity:n},!1,!0).outerPositions,l=s.length/3,c=new Array(l),u=0;u<l;++u)c[u]=Cartesian3.fromArray(s,3*u);var d=Rectangle.fromCartesianArray(c,a,o);return d.width>CesiumMath.PI&&(d.north=0<d.north?CesiumMath.PI_OVER_TWO-CesiumMath.EPSILON7:d.north,d.south=d.south<0?CesiumMath.EPSILON7-CesiumMath.PI_OVER_TWO:d.south,d.east=CesiumMath.PI,d.west=-CesiumMath.PI),d}function EllipseGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).center,i=defaultValue(e.ellipsoid,Ellipsoid.WGS84),r=e.semiMajorAxis,n=e.semiMinorAxis,a=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),o=defaultValue(e.vertexFormat,VertexFormat.DEFAULT),s=defaultValue(e.height,0),l=defaultValue(e.extrudedHeight,s);this._center=Cartesian3.clone(t),this._semiMajorAxis=r,this._semiMinorAxis=n,this._ellipsoid=Ellipsoid.clone(i),this._rotation=defaultValue(e.rotation,0),this._stRotation=defaultValue(e.stRotation,0),this._height=Math.max(l,s),this._granularity=a,this._vertexFormat=VertexFormat.clone(o),this._extrudedHeight=Math.min(l,s),this._shadowVolume=defaultValue(e.shadowVolume,!1),this._workerName="createEllipseGeometry",this._offsetAttribute=e.offsetAttribute,this._rectangle=void 0,this._textureCoordinateRotationPoints=void 0}EllipseGeometry.packedLength=Cartesian3.packedLength+Ellipsoid.packedLength+VertexFormat.packedLength+9,EllipseGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._center,t,i),i+=Cartesian3.packedLength,Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._semiMajorAxis,t[i++]=e._semiMinorAxis,t[i++]=e._rotation,t[i++]=e._stRotation,t[i++]=e._height,t[i++]=e._granularity,t[i++]=e._extrudedHeight,t[i++]=e._shadowVolume?1:0,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchCenter$1=new Cartesian3,scratchEllipsoid=new Ellipsoid,scratchVertexFormat$1=new VertexFormat,scratchOptions$2={center:scratchCenter$1,ellipsoid:scratchEllipsoid,vertexFormat:scratchVertexFormat$1,semiMajorAxis:void 0,semiMinorAxis:void 0,rotation:void 0,stRotation:void 0,height:void 0,granularity:void 0,extrudedHeight:void 0,shadowVolume:void 0,offsetAttribute:void 0};function textureCoordinateRotationPoints(e){var t=-e._stRotation;if(0==t)return[0,0,0,1,1,0];for(var i=EllipseGeometryLibrary.computeEllipsePositions({center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,rotation:e._rotation,granularity:e._granularity},!1,!0).outerPositions,r=i.length/3,n=new Array(r),a=0;a<r;++a)n[a]=Cartesian3.fromArray(i,3*a);var o=e._ellipsoid,s=e.rectangle;return Geometry._textureCoordinateRotationPoints(n,t,o,s)}function CircleGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).radius,i={center:e.center,semiMajorAxis:t,semiMinorAxis:t,ellipsoid:e.ellipsoid,height:e.height,extrudedHeight:e.extrudedHeight,granularity:e.granularity,vertexFormat:e.vertexFormat,stRotation:e.stRotation,shadowVolume:e.shadowVolume};this._ellipseGeometry=new EllipseGeometry(i),this._workerName="createCircleGeometry"}EllipseGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t,scratchCenter$1);t+=Cartesian3.packedLength;var n=Ellipsoid.unpack(e,t,scratchEllipsoid);t+=Ellipsoid.packedLength;var a=VertexFormat.unpack(e,t,scratchVertexFormat$1);t+=VertexFormat.packedLength;var o=e[t++],s=e[t++],l=e[t++],c=e[t++],u=e[t++],d=e[t++],h=e[t++],p=1===e[t++],m=e[t];return defined(i)?(i._center=Cartesian3.clone(r,i._center),i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._vertexFormat=VertexFormat.clone(a,i._vertexFormat),i._semiMajorAxis=o,i._semiMinorAxis=s,i._rotation=l,i._stRotation=c,i._height=u,i._granularity=d,i._extrudedHeight=h,i._shadowVolume=p,i._offsetAttribute=-1===m?void 0:m,i):(scratchOptions$2.height=u,scratchOptions$2.extrudedHeight=h,scratchOptions$2.granularity=d,scratchOptions$2.stRotation=c,scratchOptions$2.rotation=l,scratchOptions$2.semiMajorAxis=o,scratchOptions$2.semiMinorAxis=s,scratchOptions$2.shadowVolume=p,scratchOptions$2.offsetAttribute=-1===m?void 0:m,new EllipseGeometry(scratchOptions$2))},EllipseGeometry.computeRectangle=function(e,t){var i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).center,r=defaultValue(e.ellipsoid,Ellipsoid.WGS84),n=e.semiMajorAxis,a=e.semiMinorAxis,o=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE);return computeRectangle(i,n,a,defaultValue(e.rotation,0),o,r,t)},EllipseGeometry.createGeometry=function(e){if(!(e._semiMajorAxis<=0||e._semiMinorAxis<=0)){var t=e._height,i=e._extrudedHeight,r=!CesiumMath.equalsEpsilon(t,i,0,CesiumMath.EPSILON2);e._center=e._ellipsoid.scaleToGeodeticSurface(e._center,e._center);var n,a,o,s={center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:e._ellipsoid,rotation:e._rotation,height:t,granularity:e._granularity,vertexFormat:e._vertexFormat,stRotation:e._stRotation};return r?(s.extrudedHeight=i,s.shadowVolume=e._shadowVolume,s.offsetAttribute=e._offsetAttribute,o=computeExtrudedEllipse(s)):(o=computeEllipse(s),defined(e._offsetAttribute)&&(n=o.attributes.position.values.length,arrayFill(a=new Uint8Array(n/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),o.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:a}))),new Geometry({attributes:o.attributes,indices:o.indices,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:o.boundingSphere,offsetAttribute:e._offsetAttribute})}},EllipseGeometry.createShadowVolume=function(e,t,i){var r=e._granularity,n=e._ellipsoid,a=t(r,n),o=i(r,n);return new EllipseGeometry({center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:n,rotation:e._rotation,stRotation:e._stRotation,granularity:r,extrudedHeight:a,height:o,vertexFormat:VertexFormat.POSITION_ONLY,shadowVolume:!0})},Object.defineProperties(EllipseGeometry.prototype,{rectangle:{get:function(){return defined(this._rectangle)||(this._rectangle=computeRectangle(this._center,this._semiMajorAxis,this._semiMinorAxis,this._rotation,this._granularity,this._ellipsoid)),this._rectangle}},textureCoordinateRotationPoints:{get:function(){return defined(this._textureCoordinateRotationPoints)||(this._textureCoordinateRotationPoints=textureCoordinateRotationPoints(this)),this._textureCoordinateRotationPoints}}}),CircleGeometry.packedLength=EllipseGeometry.packedLength,CircleGeometry.pack=function(e,t,i){return EllipseGeometry.pack(e._ellipseGeometry,t,i)};var scratchEllipseGeometry=new EllipseGeometry({center:new Cartesian3,semiMajorAxis:1,semiMinorAxis:1}),scratchOptions$3={center:new Cartesian3,radius:void 0,ellipsoid:Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),height:void 0,extrudedHeight:void 0,granularity:void 0,vertexFormat:new VertexFormat,stRotation:void 0,semiMajorAxis:void 0,semiMinorAxis:void 0,shadowVolume:void 0};CircleGeometry.unpack=function(e,t,i){var r=EllipseGeometry.unpack(e,t,scratchEllipseGeometry);return scratchOptions$3.center=Cartesian3.clone(r._center,scratchOptions$3.center),scratchOptions$3.ellipsoid=Ellipsoid.clone(r._ellipsoid,scratchOptions$3.ellipsoid),scratchOptions$3.height=r._height,scratchOptions$3.extrudedHeight=r._extrudedHeight,scratchOptions$3.granularity=r._granularity,scratchOptions$3.vertexFormat=VertexFormat.clone(r._vertexFormat,scratchOptions$3.vertexFormat),scratchOptions$3.stRotation=r._stRotation,scratchOptions$3.shadowVolume=r._shadowVolume,defined(i)?(scratchOptions$3.semiMajorAxis=r._semiMajorAxis,scratchOptions$3.semiMinorAxis=r._semiMinorAxis,i._ellipseGeometry=new EllipseGeometry(scratchOptions$3),i):(scratchOptions$3.radius=r._semiMajorAxis,new CircleGeometry(scratchOptions$3))},CircleGeometry.createGeometry=function(e){return EllipseGeometry.createGeometry(e._ellipseGeometry)},CircleGeometry.createShadowVolume=function(e,t,i){var r=e._ellipseGeometry._granularity,n=e._ellipseGeometry._ellipsoid,a=t(r,n),o=i(r,n);return new CircleGeometry({center:e._ellipseGeometry._center,radius:e._ellipseGeometry._semiMajorAxis,ellipsoid:n,stRotation:e._ellipseGeometry._stRotation,granularity:r,extrudedHeight:a,height:o,vertexFormat:VertexFormat.POSITION_ONLY,shadowVolume:!0})},Object.defineProperties(CircleGeometry.prototype,{rectangle:{get:function(){return this._ellipseGeometry.rectangle}},textureCoordinateRotationPoints:{get:function(){return this._ellipseGeometry.textureCoordinateRotationPoints}}});var scratchCartesian1$4=new Cartesian3,boundingSphereCenter$1=new Cartesian3;function computeEllipse$1(e){var t=e.center;boundingSphereCenter$1=Cartesian3.multiplyByScalar(e.ellipsoid.geodeticSurfaceNormal(t,boundingSphereCenter$1),e.height,boundingSphereCenter$1);for(var i=new BoundingSphere(boundingSphereCenter$1=Cartesian3.add(t,boundingSphereCenter$1,boundingSphereCenter$1),e.semiMajorAxis),r=EllipseGeometryLibrary.computeEllipsePositions(e,!1,!0).outerPositions,n=new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:EllipseGeometryLibrary.raisePositionsToHeight(r,e,!1)})}),a=r.length/3,o=IndexDatatype$1.createTypedArray(a,2*a),s=0,l=0;l<a;++l)o[s++]=l,o[s++]=(l+1)%a;return{boundingSphere:i,attributes:n,indices:o}}var topBoundingSphere$1=new BoundingSphere,bottomBoundingSphere$1=new BoundingSphere;function computeExtrudedEllipse$1(e){var t=e.center,i=e.ellipsoid,r=e.semiMajorAxis,n=Cartesian3.multiplyByScalar(i.geodeticSurfaceNormal(t,scratchCartesian1$4),e.height,scratchCartesian1$4);topBoundingSphere$1.center=Cartesian3.add(t,n,topBoundingSphere$1.center),topBoundingSphere$1.radius=r,n=Cartesian3.multiplyByScalar(i.geodeticSurfaceNormal(t,n),e.extrudedHeight,n),bottomBoundingSphere$1.center=Cartesian3.add(t,n,bottomBoundingSphere$1.center),bottomBoundingSphere$1.radius=r;var a,o=EllipseGeometryLibrary.computeEllipsePositions(e,!1,!0).outerPositions,s=new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:EllipseGeometryLibrary.raisePositionsToHeight(o,e,!0)})}),o=s.position.values,l=BoundingSphere.union(topBoundingSphere$1,bottomBoundingSphere$1),c=o.length/3;defined(e.offsetAttribute)&&(a=new Uint8Array(c),a=e.offsetAttribute===GeometryOffsetAttribute$1.TOP?arrayFill(a,1,0,c/2):arrayFill(a,e.offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),s.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:a}));var u=defaultValue(e.numberOfVerticalLines,16),u=CesiumMath.clamp(u,0,c/2),d=IndexDatatype$1.createTypedArray(c,2*c+2*u);c/=2;var h=0;for(g=0;g<c;++g)d[h++]=g,d[h++]=(g+1)%c,d[h++]=g+c,d[h++]=(g+1)%c+c;if(0<u)for(var p=Math.min(u,c),m=Math.round(c/p),f=Math.min(m*u,c),g=0;g<f;g+=m)d[h++]=g,d[h++]=g+c;return{boundingSphere:l,attributes:s,indices:d}}function EllipseOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).center,i=defaultValue(e.ellipsoid,Ellipsoid.WGS84),r=e.semiMajorAxis,n=e.semiMinorAxis,a=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),o=defaultValue(e.height,0),s=defaultValue(e.extrudedHeight,o);this._center=Cartesian3.clone(t),this._semiMajorAxis=r,this._semiMinorAxis=n,this._ellipsoid=Ellipsoid.clone(i),this._rotation=defaultValue(e.rotation,0),this._height=Math.max(s,o),this._granularity=a,this._extrudedHeight=Math.min(s,o),this._numberOfVerticalLines=Math.max(defaultValue(e.numberOfVerticalLines,16),0),this._offsetAttribute=e.offsetAttribute,this._workerName="createEllipseOutlineGeometry"}EllipseOutlineGeometry.packedLength=Cartesian3.packedLength+Ellipsoid.packedLength+8,EllipseOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._center,t,i),i+=Cartesian3.packedLength,Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,t[i++]=e._semiMajorAxis,t[i++]=e._semiMinorAxis,t[i++]=e._rotation,t[i++]=e._height,t[i++]=e._granularity,t[i++]=e._extrudedHeight,t[i++]=e._numberOfVerticalLines,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchCenter$2=new Cartesian3,scratchEllipsoid$1=new Ellipsoid,scratchOptions$4={center:scratchCenter$2,ellipsoid:scratchEllipsoid$1,semiMajorAxis:void 0,semiMinorAxis:void 0,rotation:void 0,height:void 0,granularity:void 0,extrudedHeight:void 0,numberOfVerticalLines:void 0,offsetAttribute:void 0};function CircleOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).radius,i={center:e.center,semiMajorAxis:t,semiMinorAxis:t,ellipsoid:e.ellipsoid,height:e.height,extrudedHeight:e.extrudedHeight,granularity:e.granularity,numberOfVerticalLines:e.numberOfVerticalLines};this._ellipseGeometry=new EllipseOutlineGeometry(i),this._workerName="createCircleOutlineGeometry"}EllipseOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t,scratchCenter$2);t+=Cartesian3.packedLength;var n=Ellipsoid.unpack(e,t,scratchEllipsoid$1);t+=Ellipsoid.packedLength;var a=e[t++],o=e[t++],s=e[t++],l=e[t++],c=e[t++],u=e[t++],d=e[t++],h=e[t];return defined(i)?(i._center=Cartesian3.clone(r,i._center),i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._semiMajorAxis=a,i._semiMinorAxis=o,i._rotation=s,i._height=l,i._granularity=c,i._extrudedHeight=u,i._numberOfVerticalLines=d,i._offsetAttribute=-1===h?void 0:h,i):(scratchOptions$4.height=l,scratchOptions$4.extrudedHeight=u,scratchOptions$4.granularity=c,scratchOptions$4.rotation=s,scratchOptions$4.semiMajorAxis=a,scratchOptions$4.semiMinorAxis=o,scratchOptions$4.numberOfVerticalLines=d,scratchOptions$4.offsetAttribute=-1===h?void 0:h,new EllipseOutlineGeometry(scratchOptions$4))},EllipseOutlineGeometry.createGeometry=function(e){if(!(e._semiMajorAxis<=0||e._semiMinorAxis<=0)){var t=e._height,i=e._extrudedHeight,r=!CesiumMath.equalsEpsilon(t,i,0,CesiumMath.EPSILON2);e._center=e._ellipsoid.scaleToGeodeticSurface(e._center,e._center);var n,a,o,s={center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:e._ellipsoid,rotation:e._rotation,height:t,granularity:e._granularity,numberOfVerticalLines:e._numberOfVerticalLines};return r?(s.extrudedHeight=i,s.offsetAttribute=e._offsetAttribute,o=computeExtrudedEllipse$1(s)):(o=computeEllipse$1(s),defined(e._offsetAttribute)&&(n=o.attributes.position.values.length,arrayFill(a=new Uint8Array(n/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),o.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:a}))),new Geometry({attributes:o.attributes,indices:o.indices,primitiveType:PrimitiveType$1.LINES,boundingSphere:o.boundingSphere,offsetAttribute:e._offsetAttribute})}},CircleOutlineGeometry.packedLength=EllipseOutlineGeometry.packedLength,CircleOutlineGeometry.pack=function(e,t,i){return EllipseOutlineGeometry.pack(e._ellipseGeometry,t,i)};var scratchEllipseGeometry$1=new EllipseOutlineGeometry({center:new Cartesian3,semiMajorAxis:1,semiMinorAxis:1}),scratchOptions$5={center:new Cartesian3,radius:void 0,ellipsoid:Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),height:void 0,extrudedHeight:void 0,granularity:void 0,numberOfVerticalLines:void 0,semiMajorAxis:void 0,semiMinorAxis:void 0};CircleOutlineGeometry.unpack=function(e,t,i){var r=EllipseOutlineGeometry.unpack(e,t,scratchEllipseGeometry$1);return scratchOptions$5.center=Cartesian3.clone(r._center,scratchOptions$5.center),scratchOptions$5.ellipsoid=Ellipsoid.clone(r._ellipsoid,scratchOptions$5.ellipsoid),scratchOptions$5.height=r._height,scratchOptions$5.extrudedHeight=r._extrudedHeight,scratchOptions$5.granularity=r._granularity,scratchOptions$5.numberOfVerticalLines=r._numberOfVerticalLines,defined(i)?(scratchOptions$5.semiMajorAxis=r._semiMajorAxis,scratchOptions$5.semiMinorAxis=r._semiMinorAxis,i._ellipseGeometry=new EllipseOutlineGeometry(scratchOptions$5),i):(scratchOptions$5.radius=r._semiMajorAxis,new CircleOutlineGeometry(scratchOptions$5))},CircleOutlineGeometry.createGeometry=function(e){return EllipseOutlineGeometry.createGeometry(e._ellipseGeometry)};var ClockRange={UNBOUNDED:0,CLAMPED:1,LOOP_STOP:2},ClockRange$1=Object.freeze(ClockRange),ClockStep={TICK_DEPENDENT:0,SYSTEM_CLOCK_MULTIPLIER:1,SYSTEM_CLOCK:2},ClockStep$1=Object.freeze(ClockStep),getTimestamp,getTimestamp="undefined"!=typeof performance&&"function"==typeof performance.now&&isFinite(performance.now())?function(){return performance.now()}:function(){return Date.now()},getTimestamp$1=getTimestamp,scratchArrayBuffer,scratchUint32Array,scratchUint8Array;function Clock(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).currentTime,i=e.startTime,r=e.stopTime,t=defined(t)?JulianDate.clone(t):defined(i)?JulianDate.clone(i):defined(r)?JulianDate.addDays(r,-1,new JulianDate):JulianDate.now(),i=defined(i)?JulianDate.clone(i):JulianDate.clone(t),r=defined(r)?JulianDate.clone(r):JulianDate.addDays(i,1,new JulianDate);this.startTime=i,this.stopTime=r,this.clockRange=defaultValue(e.clockRange,ClockRange$1.UNBOUNDED),this.canAnimate=defaultValue(e.canAnimate,!0),this.onTick=new Event,this.onStop=new Event,this._currentTime=void 0,this._multiplier=void 0,this._clockStep=void 0,this._shouldAnimate=void 0,this._lastSystemTime=getTimestamp$1(),this.currentTime=t,this.multiplier=defaultValue(e.multiplier,1),this.shouldAnimate=defaultValue(e.shouldAnimate,!1),this.clockStep=defaultValue(e.clockStep,ClockStep$1.SYSTEM_CLOCK_MULTIPLIER)}function hue2rgb(e,t,i){return i<0&&(i+=1),1<i&&--i,6*i<1?e+6*(t-e)*i:2*i<1?t:3*i<2?e+(t-e)*(2/3-i)*6:e}function Color(e,t,i,r){this.red=defaultValue(e,1),this.green=defaultValue(t,1),this.blue=defaultValue(i,1),this.alpha=defaultValue(r,1)}Object.defineProperties(Clock.prototype,{currentTime:{get:function(){return this._currentTime},set:function(e){JulianDate.equals(this._currentTime,e)||(this._clockStep===ClockStep$1.SYSTEM_CLOCK&&(this._clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER),this._currentTime=e)}},multiplier:{get:function(){return this._multiplier},set:function(e){this._multiplier!==e&&(this._clockStep===ClockStep$1.SYSTEM_CLOCK&&(this._clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER),this._multiplier=e)}},clockStep:{get:function(){return this._clockStep},set:function(e){e===ClockStep$1.SYSTEM_CLOCK&&(this._multiplier=1,this._shouldAnimate=!0,this._currentTime=JulianDate.now()),this._clockStep=e}},shouldAnimate:{get:function(){return this._shouldAnimate},set:function(e){this._shouldAnimate!==e&&(this._clockStep===ClockStep$1.SYSTEM_CLOCK&&(this._clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER),this._shouldAnimate=e)}}}),Clock.prototype.tick=function(){var e=getTimestamp$1(),t=JulianDate.clone(this._currentTime);if(this.canAnimate&&this._shouldAnimate){var i=this._clockStep;if(i===ClockStep$1.SYSTEM_CLOCK)t=JulianDate.now(t);else{var r,n=this._multiplier;t=i===ClockStep$1.TICK_DEPENDENT?JulianDate.addSeconds(t,n,t):(r=e-this._lastSystemTime,JulianDate.addSeconds(t,n*(r/1e3),t));var a=this.clockRange,o=this.startTime,s=this.stopTime;if(a===ClockRange$1.CLAMPED)JulianDate.lessThan(t,o)?t=JulianDate.clone(o,t):JulianDate.greaterThan(t,s)&&(t=JulianDate.clone(s,t),this.onStop.raiseEvent(this));else if(a===ClockRange$1.LOOP_STOP)for(JulianDate.lessThan(t,o)&&(t=JulianDate.clone(o,t));JulianDate.greaterThan(t,s);)t=JulianDate.addSeconds(o,JulianDate.secondsDifference(t,s),t),this.onStop.raiseEvent(this)}}return this._currentTime=t,this._lastSystemTime=e,this.onTick.raiseEvent(this),t},Color.fromCartesian4=function(e,t){return defined(t)?(t.red=e.x,t.green=e.y,t.blue=e.z,t.alpha=e.w,t):new Color(e.x,e.y,e.z,e.w)},Color.fromBytes=function(e,t,i,r,n){return e=Color.byteToFloat(defaultValue(e,255)),t=Color.byteToFloat(defaultValue(t,255)),i=Color.byteToFloat(defaultValue(i,255)),r=Color.byteToFloat(defaultValue(r,255)),defined(n)?(n.red=e,n.green=t,n.blue=i,n.alpha=r,n):new Color(e,t,i,r)},Color.fromAlpha=function(e,t,i){return defined(i)?(i.red=e.red,i.green=e.green,i.blue=e.blue,i.alpha=t,i):new Color(e.red,e.green,e.blue,t)},FeatureDetection.supportsTypedArrays()&&(scratchArrayBuffer=new ArrayBuffer(4),scratchUint32Array=new Uint32Array(scratchArrayBuffer),scratchUint8Array=new Uint8Array(scratchArrayBuffer)),Color.fromRgba=function(e,t){return scratchUint32Array[0]=e,Color.fromBytes(scratchUint8Array[0],scratchUint8Array[1],scratchUint8Array[2],scratchUint8Array[3],t)},Color.fromHsl=function(e,t,i,r,n){e=defaultValue(e,0)%1,t=defaultValue(t,0),i=defaultValue(i,0),r=defaultValue(r,1);var a,o,s=i,l=i,c=i;return 0!==t&&(s=hue2rgb(o=2*i-(a=i<.5?i*(1+t):i+t-i*t),a,e+1/3),l=hue2rgb(o,a,e),c=hue2rgb(o,a,e-1/3)),defined(n)?(n.red=s,n.green=l,n.blue=c,n.alpha=r,n):new Color(s,l,c,r)},Color.fromRandom=function(e,t){var i,r,n=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).red;defined(n)||(i=defaultValue(e.minimumRed,0),r=defaultValue(e.maximumRed,1),n=i+CesiumMath.nextRandomNumber()*(r-i));var a,o,s=e.green;defined(s)||(a=defaultValue(e.minimumGreen,0),o=defaultValue(e.maximumGreen,1),s=a+CesiumMath.nextRandomNumber()*(o-a));var l,c,u=e.blue;defined(u)||(l=defaultValue(e.minimumBlue,0),c=defaultValue(e.maximumBlue,1),u=l+CesiumMath.nextRandomNumber()*(c-l));var d,h,p=e.alpha;return defined(p)||(d=defaultValue(e.minimumAlpha,0),h=defaultValue(e.maximumAlpha,1),p=d+CesiumMath.nextRandomNumber()*(h-d)),defined(t)?(t.red=n,t.green=s,t.blue=u,t.alpha=p,t):new Color(n,s,u,p)};var rgbaMatcher=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,rrggbbaaMatcher=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,rgbParenthesesMatcher=/^rgba?\(\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)(?:\s*,\s*([0-9.]+))?\s*\)$/i,hslParenthesesMatcher=/^hsla?\(\s*([0-9.]+)\s*,\s*([0-9.]+%)\s*,\s*([0-9.]+%)(?:\s*,\s*([0-9.]+))?\s*\)$/i;function ColorGeometryInstanceAttribute(e,t,i,r){e=defaultValue(e,1),t=defaultValue(t,1),i=defaultValue(i,1),r=defaultValue(r,1),this.value=new Uint8Array([Color.floatToByte(e),Color.floatToByte(t),Color.floatToByte(i),Color.floatToByte(r)])}function CompressedTextureBuffer(e,t,i,r){this._format=e,this._width=t,this._height=i,this._buffer=r}Color.fromCssColorString=function(e,t){defined(t)||(t=new Color);var i=Color[(e=e.replace(/\s/g,"")).toUpperCase()];if(defined(i))return Color.clone(i,t),t;var r=rgbaMatcher.exec(e);return null!==r?(t.red=parseInt(r[1],16)/15,t.green=parseInt(r[2],16)/15,t.blue=parseInt(r[3],16)/15,t.alpha=parseInt(defaultValue(r[4],"f"),16)/15,t):null!==(r=rrggbbaaMatcher.exec(e))?(t.red=parseInt(r[1],16)/255,t.green=parseInt(r[2],16)/255,t.blue=parseInt(r[3],16)/255,t.alpha=parseInt(defaultValue(r[4],"ff"),16)/255,t):null!==(r=rgbParenthesesMatcher.exec(e))?(t.red=parseFloat(r[1])/("%"===r[1].substr(-1)?100:255),t.green=parseFloat(r[2])/("%"===r[2].substr(-1)?100:255),t.blue=parseFloat(r[3])/("%"===r[3].substr(-1)?100:255),t.alpha=parseFloat(defaultValue(r[4],"1.0")),t):null!==(r=hslParenthesesMatcher.exec(e))?Color.fromHsl(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,parseFloat(defaultValue(r[4],"1.0")),t):t=void 0},Color.packedLength=4,Color.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.red,t[i++]=e.green,t[i++]=e.blue,t[i]=e.alpha,t},Color.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new Color),i.red=e[t++],i.green=e[t++],i.blue=e[t++],i.alpha=e[t],i},Color.byteToFloat=function(e){return e/255},Color.floatToByte=function(e){return 1===e?255:256*e|0},Color.clone=function(e,t){if(defined(e))return defined(t)?(t.red=e.red,t.green=e.green,t.blue=e.blue,t.alpha=e.alpha,t):new Color(e.red,e.green,e.blue,e.alpha)},Color.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.red===t.red&&e.green===t.green&&e.blue===t.blue&&e.alpha===t.alpha},Color.equalsArray=function(e,t,i){return e.red===t[i]&&e.green===t[i+1]&&e.blue===t[i+2]&&e.alpha===t[i+3]},Color.prototype.clone=function(e){return Color.clone(this,e)},Color.prototype.equals=function(e){return Color.equals(this,e)},Color.prototype.equalsEpsilon=function(e,t){return this===e||defined(e)&&Math.abs(this.red-e.red)<=t&&Math.abs(this.green-e.green)<=t&&Math.abs(this.blue-e.blue)<=t&&Math.abs(this.alpha-e.alpha)<=t},Color.prototype.toString=function(){return"("+this.red+", "+this.green+", "+this.blue+", "+this.alpha+")"},Color.prototype.toCssColorString=function(){var e=Color.floatToByte(this.red),t=Color.floatToByte(this.green),i=Color.floatToByte(this.blue);return 1===this.alpha?"rgb("+e+","+t+","+i+")":"rgba("+e+","+t+","+i+","+this.alpha+")"},Color.prototype.toCssHexString=function(){var e=Color.floatToByte(this.red).toString(16);e.length<2&&(e="0"+e);var t=Color.floatToByte(this.green).toString(16);t.length<2&&(t="0"+t);var i=Color.floatToByte(this.blue).toString(16);if(i.length<2&&(i="0"+i),this.alpha<1){var r=Color.floatToByte(this.alpha).toString(16);return r.length<2&&(r="0"+r),"#"+e+t+i+r}return"#"+e+t+i},Color.prototype.toBytes=function(e){var t=Color.floatToByte(this.red),i=Color.floatToByte(this.green),r=Color.floatToByte(this.blue),n=Color.floatToByte(this.alpha);return defined(e)?(e[0]=t,e[1]=i,e[2]=r,e[3]=n,e):[t,i,r,n]},Color.prototype.toRgba=function(){return scratchUint8Array[0]=Color.floatToByte(this.red),scratchUint8Array[1]=Color.floatToByte(this.green),scratchUint8Array[2]=Color.floatToByte(this.blue),scratchUint8Array[3]=Color.floatToByte(this.alpha),scratchUint32Array[0]},Color.prototype.brighten=function(e,t){return e=1-e,t.red=1-(1-this.red)*e,t.green=1-(1-this.green)*e,t.blue=1-(1-this.blue)*e,t.alpha=this.alpha,t},Color.prototype.darken=function(e,t){return e=1-e,t.red=this.red*e,t.green=this.green*e,t.blue=this.blue*e,t.alpha=this.alpha,t},Color.prototype.withAlpha=function(e,t){return Color.fromAlpha(this,e,t)},Color.add=function(e,t,i){return i.red=e.red+t.red,i.green=e.green+t.green,i.blue=e.blue+t.blue,i.alpha=e.alpha+t.alpha,i},Color.subtract=function(e,t,i){return i.red=e.red-t.red,i.green=e.green-t.green,i.blue=e.blue-t.blue,i.alpha=e.alpha-t.alpha,i},Color.multiply=function(e,t,i){return i.red=e.red*t.red,i.green=e.green*t.green,i.blue=e.blue*t.blue,i.alpha=e.alpha*t.alpha,i},Color.divide=function(e,t,i){return i.red=e.red/t.red,i.green=e.green/t.green,i.blue=e.blue/t.blue,i.alpha=e.alpha/t.alpha,i},Color.mod=function(e,t,i){return i.red=e.red%t.red,i.green=e.green%t.green,i.blue=e.blue%t.blue,i.alpha=e.alpha%t.alpha,i},Color.lerp=function(e,t,i,r){return r.red=CesiumMath.lerp(e.red,t.red,i),r.green=CesiumMath.lerp(e.green,t.green,i),r.blue=CesiumMath.lerp(e.blue,t.blue,i),r.alpha=CesiumMath.lerp(e.alpha,t.alpha,i),r},Color.multiplyByScalar=function(e,t,i){return i.red=e.red*t,i.green=e.green*t,i.blue=e.blue*t,i.alpha=e.alpha*t,i},Color.divideByScalar=function(e,t,i){return i.red=e.red/t,i.green=e.green/t,i.blue=e.blue/t,i.alpha=e.alpha/t,i},Color.ALICEBLUE=Object.freeze(Color.fromCssColorString("#F0F8FF")),Color.ANTIQUEWHITE=Object.freeze(Color.fromCssColorString("#FAEBD7")),Color.AQUA=Object.freeze(Color.fromCssColorString("#00FFFF")),Color.AQUAMARINE=Object.freeze(Color.fromCssColorString("#7FFFD4")),Color.AZURE=Object.freeze(Color.fromCssColorString("#F0FFFF")),Color.BEIGE=Object.freeze(Color.fromCssColorString("#F5F5DC")),Color.BISQUE=Object.freeze(Color.fromCssColorString("#FFE4C4")),Color.BLACK=Object.freeze(Color.fromCssColorString("#000000")),Color.BLANCHEDALMOND=Object.freeze(Color.fromCssColorString("#FFEBCD")),Color.BLUE=Object.freeze(Color.fromCssColorString("#0000FF")),Color.BLUEVIOLET=Object.freeze(Color.fromCssColorString("#8A2BE2")),Color.BROWN=Object.freeze(Color.fromCssColorString("#A52A2A")),Color.BURLYWOOD=Object.freeze(Color.fromCssColorString("#DEB887")),Color.CADETBLUE=Object.freeze(Color.fromCssColorString("#5F9EA0")),Color.CHARTREUSE=Object.freeze(Color.fromCssColorString("#7FFF00")),Color.CHOCOLATE=Object.freeze(Color.fromCssColorString("#D2691E")),Color.CORAL=Object.freeze(Color.fromCssColorString("#FF7F50")),Color.CORNFLOWERBLUE=Object.freeze(Color.fromCssColorString("#6495ED")),Color.CORNSILK=Object.freeze(Color.fromCssColorString("#FFF8DC")),Color.CRIMSON=Object.freeze(Color.fromCssColorString("#DC143C")),Color.CYAN=Object.freeze(Color.fromCssColorString("#00FFFF")),Color.DARKBLUE=Object.freeze(Color.fromCssColorString("#00008B")),Color.DARKCYAN=Object.freeze(Color.fromCssColorString("#008B8B")),Color.DARKGOLDENROD=Object.freeze(Color.fromCssColorString("#B8860B")),Color.DARKGRAY=Object.freeze(Color.fromCssColorString("#A9A9A9")),Color.DARKGREEN=Object.freeze(Color.fromCssColorString("#006400")),Color.DARKGREY=Color.DARKGRAY,Color.DARKKHAKI=Object.freeze(Color.fromCssColorString("#BDB76B")),Color.DARKMAGENTA=Object.freeze(Color.fromCssColorString("#8B008B")),Color.DARKOLIVEGREEN=Object.freeze(Color.fromCssColorString("#556B2F")),Color.DARKORANGE=Object.freeze(Color.fromCssColorString("#FF8C00")),Color.DARKORCHID=Object.freeze(Color.fromCssColorString("#9932CC")),Color.DARKRED=Object.freeze(Color.fromCssColorString("#8B0000")),Color.DARKSALMON=Object.freeze(Color.fromCssColorString("#E9967A")),Color.DARKSEAGREEN=Object.freeze(Color.fromCssColorString("#8FBC8F")),Color.DARKSLATEBLUE=Object.freeze(Color.fromCssColorString("#483D8B")),Color.DARKSLATEGRAY=Object.freeze(Color.fromCssColorString("#2F4F4F")),Color.DARKSLATEGREY=Color.DARKSLATEGRAY,Color.DARKTURQUOISE=Object.freeze(Color.fromCssColorString("#00CED1")),Color.DARKVIOLET=Object.freeze(Color.fromCssColorString("#9400D3")),Color.DEEPPINK=Object.freeze(Color.fromCssColorString("#FF1493")),Color.DEEPSKYBLUE=Object.freeze(Color.fromCssColorString("#00BFFF")),Color.DIMGRAY=Object.freeze(Color.fromCssColorString("#696969")),Color.DIMGREY=Color.DIMGRAY,Color.DODGERBLUE=Object.freeze(Color.fromCssColorString("#1E90FF")),Color.FIREBRICK=Object.freeze(Color.fromCssColorString("#B22222")),Color.FLORALWHITE=Object.freeze(Color.fromCssColorString("#FFFAF0")),Color.FORESTGREEN=Object.freeze(Color.fromCssColorString("#228B22")),Color.FUCHSIA=Object.freeze(Color.fromCssColorString("#FF00FF")),Color.GAINSBORO=Object.freeze(Color.fromCssColorString("#DCDCDC")),Color.GHOSTWHITE=Object.freeze(Color.fromCssColorString("#F8F8FF")),Color.GOLD=Object.freeze(Color.fromCssColorString("#FFD700")),Color.GOLDENROD=Object.freeze(Color.fromCssColorString("#DAA520")),Color.GRAY=Object.freeze(Color.fromCssColorString("#808080")),Color.GREEN=Object.freeze(Color.fromCssColorString("#008000")),Color.GREENYELLOW=Object.freeze(Color.fromCssColorString("#ADFF2F")),Color.GREY=Color.GRAY,Color.HONEYDEW=Object.freeze(Color.fromCssColorString("#F0FFF0")),Color.HOTPINK=Object.freeze(Color.fromCssColorString("#FF69B4")),Color.INDIANRED=Object.freeze(Color.fromCssColorString("#CD5C5C")),Color.INDIGO=Object.freeze(Color.fromCssColorString("#4B0082")),Color.IVORY=Object.freeze(Color.fromCssColorString("#FFFFF0")),Color.KHAKI=Object.freeze(Color.fromCssColorString("#F0E68C")),Color.LAVENDER=Object.freeze(Color.fromCssColorString("#E6E6FA")),Color.LAVENDAR_BLUSH=Object.freeze(Color.fromCssColorString("#FFF0F5")),Color.LAWNGREEN=Object.freeze(Color.fromCssColorString("#7CFC00")),Color.LEMONCHIFFON=Object.freeze(Color.fromCssColorString("#FFFACD")),Color.LIGHTBLUE=Object.freeze(Color.fromCssColorString("#ADD8E6")),Color.LIGHTCORAL=Object.freeze(Color.fromCssColorString("#F08080")),Color.LIGHTCYAN=Object.freeze(Color.fromCssColorString("#E0FFFF")),Color.LIGHTGOLDENRODYELLOW=Object.freeze(Color.fromCssColorString("#FAFAD2")),Color.LIGHTGRAY=Object.freeze(Color.fromCssColorString("#D3D3D3")),Color.LIGHTGREEN=Object.freeze(Color.fromCssColorString("#90EE90")),Color.LIGHTGREY=Color.LIGHTGRAY,Color.LIGHTPINK=Object.freeze(Color.fromCssColorString("#FFB6C1")),Color.LIGHTSEAGREEN=Object.freeze(Color.fromCssColorString("#20B2AA")),Color.LIGHTSKYBLUE=Object.freeze(Color.fromCssColorString("#87CEFA")),Color.LIGHTSLATEGRAY=Object.freeze(Color.fromCssColorString("#778899")),Color.LIGHTSLATEGREY=Color.LIGHTSLATEGRAY,Color.LIGHTSTEELBLUE=Object.freeze(Color.fromCssColorString("#B0C4DE")),Color.LIGHTYELLOW=Object.freeze(Color.fromCssColorString("#FFFFE0")),Color.LIME=Object.freeze(Color.fromCssColorString("#00FF00")),Color.LIMEGREEN=Object.freeze(Color.fromCssColorString("#32CD32")),Color.LINEN=Object.freeze(Color.fromCssColorString("#FAF0E6")),Color.MAGENTA=Object.freeze(Color.fromCssColorString("#FF00FF")),Color.MAROON=Object.freeze(Color.fromCssColorString("#800000")),Color.MEDIUMAQUAMARINE=Object.freeze(Color.fromCssColorString("#66CDAA")),Color.MEDIUMBLUE=Object.freeze(Color.fromCssColorString("#0000CD")),Color.MEDIUMORCHID=Object.freeze(Color.fromCssColorString("#BA55D3")),Color.MEDIUMPURPLE=Object.freeze(Color.fromCssColorString("#9370DB")),Color.MEDIUMSEAGREEN=Object.freeze(Color.fromCssColorString("#3CB371")),Color.MEDIUMSLATEBLUE=Object.freeze(Color.fromCssColorString("#7B68EE")),Color.MEDIUMSPRINGGREEN=Object.freeze(Color.fromCssColorString("#00FA9A")),Color.MEDIUMTURQUOISE=Object.freeze(Color.fromCssColorString("#48D1CC")),Color.MEDIUMVIOLETRED=Object.freeze(Color.fromCssColorString("#C71585")),Color.MIDNIGHTBLUE=Object.freeze(Color.fromCssColorString("#191970")),Color.MINTCREAM=Object.freeze(Color.fromCssColorString("#F5FFFA")),Color.MISTYROSE=Object.freeze(Color.fromCssColorString("#FFE4E1")),Color.MOCCASIN=Object.freeze(Color.fromCssColorString("#FFE4B5")),Color.NAVAJOWHITE=Object.freeze(Color.fromCssColorString("#FFDEAD")),Color.NAVY=Object.freeze(Color.fromCssColorString("#000080")),Color.OLDLACE=Object.freeze(Color.fromCssColorString("#FDF5E6")),Color.OLIVE=Object.freeze(Color.fromCssColorString("#808000")),Color.OLIVEDRAB=Object.freeze(Color.fromCssColorString("#6B8E23")),Color.ORANGE=Object.freeze(Color.fromCssColorString("#FFA500")),Color.ORANGERED=Object.freeze(Color.fromCssColorString("#FF4500")),Color.ORCHID=Object.freeze(Color.fromCssColorString("#DA70D6")),Color.PALEGOLDENROD=Object.freeze(Color.fromCssColorString("#EEE8AA")),Color.PALEGREEN=Object.freeze(Color.fromCssColorString("#98FB98")),Color.PALETURQUOISE=Object.freeze(Color.fromCssColorString("#AFEEEE")),Color.PALEVIOLETRED=Object.freeze(Color.fromCssColorString("#DB7093")),Color.PAPAYAWHIP=Object.freeze(Color.fromCssColorString("#FFEFD5")),Color.PEACHPUFF=Object.freeze(Color.fromCssColorString("#FFDAB9")),Color.PERU=Object.freeze(Color.fromCssColorString("#CD853F")),Color.PINK=Object.freeze(Color.fromCssColorString("#FFC0CB")),Color.PLUM=Object.freeze(Color.fromCssColorString("#DDA0DD")),Color.POWDERBLUE=Object.freeze(Color.fromCssColorString("#B0E0E6")),Color.PURPLE=Object.freeze(Color.fromCssColorString("#800080")),Color.RED=Object.freeze(Color.fromCssColorString("#FF0000")),Color.ROSYBROWN=Object.freeze(Color.fromCssColorString("#BC8F8F")),Color.ROYALBLUE=Object.freeze(Color.fromCssColorString("#4169E1")),Color.SADDLEBROWN=Object.freeze(Color.fromCssColorString("#8B4513")),Color.SALMON=Object.freeze(Color.fromCssColorString("#FA8072")),Color.SANDYBROWN=Object.freeze(Color.fromCssColorString("#F4A460")),Color.SEAGREEN=Object.freeze(Color.fromCssColorString("#2E8B57")),Color.SEASHELL=Object.freeze(Color.fromCssColorString("#FFF5EE")),Color.SIENNA=Object.freeze(Color.fromCssColorString("#A0522D")),Color.SILVER=Object.freeze(Color.fromCssColorString("#C0C0C0")),Color.SKYBLUE=Object.freeze(Color.fromCssColorString("#87CEEB")),Color.SLATEBLUE=Object.freeze(Color.fromCssColorString("#6A5ACD")),Color.SLATEGRAY=Object.freeze(Color.fromCssColorString("#708090")),Color.SLATEGREY=Color.SLATEGRAY,Color.SNOW=Object.freeze(Color.fromCssColorString("#FFFAFA")),Color.SPRINGGREEN=Object.freeze(Color.fromCssColorString("#00FF7F")),Color.STEELBLUE=Object.freeze(Color.fromCssColorString("#4682B4")),Color.TAN=Object.freeze(Color.fromCssColorString("#D2B48C")),Color.TEAL=Object.freeze(Color.fromCssColorString("#008080")),Color.THISTLE=Object.freeze(Color.fromCssColorString("#D8BFD8")),Color.TOMATO=Object.freeze(Color.fromCssColorString("#FF6347")),Color.TURQUOISE=Object.freeze(Color.fromCssColorString("#40E0D0")),Color.VIOLET=Object.freeze(Color.fromCssColorString("#EE82EE")),Color.WHEAT=Object.freeze(Color.fromCssColorString("#F5DEB3")),Color.WHITE=Object.freeze(Color.fromCssColorString("#FFFFFF")),Color.WHITESMOKE=Object.freeze(Color.fromCssColorString("#F5F5F5")),Color.YELLOW=Object.freeze(Color.fromCssColorString("#FFFF00")),Color.YELLOWGREEN=Object.freeze(Color.fromCssColorString("#9ACD32")),Color.TRANSPARENT=Object.freeze(new Color(0,0,0,0)),Object.defineProperties(ColorGeometryInstanceAttribute.prototype,{componentDatatype:{get:function(){return ComponentDatatype$1.UNSIGNED_BYTE}},componentsPerAttribute:{get:function(){return 4}},normalize:{get:function(){return!0}}}),ColorGeometryInstanceAttribute.fromColor=function(e){return new ColorGeometryInstanceAttribute(e.red,e.green,e.blue,e.alpha)},ColorGeometryInstanceAttribute.toValue=function(e,t){return defined(t)?e.toBytes(t):new Uint8Array(e.toBytes())},ColorGeometryInstanceAttribute.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.value[0]===t.value[0]&&e.value[1]===t.value[1]&&e.value[2]===t.value[2]&&e.value[3]===t.value[3]},Object.defineProperties(CompressedTextureBuffer.prototype,{internalFormat:{get:function(){return this._format}},width:{get:function(){return this._width}},height:{get:function(){return this._height}},bufferView:{get:function(){return this._buffer}}}),CompressedTextureBuffer.clone=function(e){if(defined(e))return new CompressedTextureBuffer(e._format,e._width,e._height,e._buffer)},CompressedTextureBuffer.prototype.clone=function(){return CompressedTextureBuffer.clone(this)};var removeDuplicatesEpsilon=CesiumMath.EPSILON10;function arrayRemoveDuplicates(e,t,i){if(defined(e)){i=defaultValue(i,!1);var r,n,a,o=e.length;if(o<2)return e;for(r=1;r<o&&!t(n=e[r-1],a=e[r],removeDuplicatesEpsilon);++r);if(r===o)return i&&t(e[0],e[e.length-1],removeDuplicatesEpsilon)?e.slice(1):e;for(var s=e.slice(0,r);r<o;++r)t(n,a=e[r],removeDuplicatesEpsilon)||(s.push(a),n=a);return i&&1<s.length&&t(s[0],s[s.length-1],removeDuplicatesEpsilon)&&s.shift(),s}}var CoplanarPolygonGeometryLibrary={},scratchIntersectionPoint=new Cartesian3,scratchXAxis=new Cartesian3,scratchYAxis=new Cartesian3,scratchZAxis=new Cartesian3,obbScratch=new OrientedBoundingBox;function projectTo2D(e,t,i,r,n){var a=Cartesian3.subtract(e,t,scratchIntersectionPoint),o=Cartesian3.dot(i,a),s=Cartesian3.dot(r,a);return Cartesian2.fromElements(o,s,n)}function calculateM(e,t,i){if(0===e)return t*i;var r=e*e,n=r*r,a=n*r,o=a*r,s=o*r,l=s*r,c=i;return t*((1-r/4-3*n/64-5*a/256-175*o/16384-441*s/65536-4851*l/1048576)*c-(3*r/8+3*n/32+45*a/1024+105*o/4096+2205*s/131072+6237*l/524288)*Math.sin(2*c)+(15*n/256+45*a/1024+525*o/16384+1575*s/65536+155925*l/8388608)*Math.sin(4*c)-(35*a/3072+175*o/12288+3675*s/262144+13475*l/1048576)*Math.sin(6*c)+(315*o/131072+2205*s/524288+43659*l/8388608)*Math.sin(8*c)-(693*s/1310720+6237*l/5242880)*Math.sin(10*c)+1001*l/8388608*Math.sin(12*c))}function calculateInverseM(e,t,i){var r=e/i;if(0===t)return r;var n=r*r,a=n*r,o=a*r,s=t*t,l=s*s,c=l*s,u=c*s,d=u*s,h=d*s,p=Math.sin(2*r),m=Math.cos(2*r),f=Math.sin(4*r),g=Math.cos(4*r),_=Math.sin(6*r),y=Math.cos(6*r),v=Math.sin(8*r),C=Math.cos(8*r),S=Math.sin(10*r);return r+r*s/4+7*r*l/64+15*r*c/256+579*r*u/16384+1515*r*d/65536+16837*r*h/1048576+(3*r*l/16+45*r*c/256-r*(32*n-561)*u/4096-r*(232*n-1677)*d/16384+r*(399985-90560*n+512*o)*h/5242880)*m+(21*r*c/256+483*r*u/4096-r*(224*n-1969)*d/16384-r*(33152*n-112599)*h/1048576)*g+(151*r*u/4096+4681*r*d/65536+1479*r*h/16384-453*a*h/32768)*y+(1097*r*d/65536+42783*r*h/1048576)*C+8011*r*h/1048576*Math.cos(10*r)+(3*s/8+3*l/16+213*c/2048-3*n*c/64+255*u/4096-33*n*u/512+20861*d/524288-33*n*d/512+o*d/1024+28273*h/1048576-471*n*h/8192+9*o*h/4096)*p+(21*l/256+21*c/256+533*u/8192-21*n*u/512+197*d/4096-315*n*d/4096+584039*h/16777216-12517*n*h/131072+7*o*h/2048)*f+(151*c/6144+151*u/4096+5019*d/131072-453*n*d/16384+26965*h/786432-8607*n*h/131072)*_+(1097*u/131072+1097*d/65536+225797*h/10485760-1097*n*h/65536)*v+(8011*d/2621440+8011*h/1048576)*S+293393*h/251658240*Math.sin(12*r)}function calculateSigma(e,t){if(0===e)return Math.log(Math.tan(.5*(CesiumMath.PI_OVER_TWO+t)));var i=e*Math.sin(t);return Math.log(Math.tan(.5*(CesiumMath.PI_OVER_TWO+t)))-e/2*Math.log((1+i)/(1-i))}function calculateHeading(e,t,i,r,n){var a=calculateSigma(e._ellipticity,i),o=calculateSigma(e._ellipticity,n);return Math.atan2(CesiumMath.negativePiToPi(r-t),o-a)}function calculateArcLength(e,t,i,r,n,a,o){var s,l,c=e._heading,u=a-r,d=0;return d=CesiumMath.equalsEpsilon(Math.abs(c),CesiumMath.PI_OVER_TWO,CesiumMath.EPSILON8)?t===i?t*Math.cos(n)*CesiumMath.negativePiToPi(u):(s=Math.sin(n),t*Math.cos(n)*CesiumMath.negativePiToPi(u)/Math.sqrt(1-e._ellipticitySquared*s*s)):(l=calculateM(e._ellipticity,t,n),(calculateM(e._ellipticity,t,o)-l)/Math.cos(c)),Math.abs(d)}CoplanarPolygonGeometryLibrary.validOutline=function(e){var t=OrientedBoundingBox.fromPoints(e,obbScratch).halfAxes,i=Matrix3.getColumn(t,0,scratchXAxis),r=Matrix3.getColumn(t,1,scratchYAxis),n=Matrix3.getColumn(t,2,scratchZAxis),a=Cartesian3.magnitude(i),o=Cartesian3.magnitude(r),s=Cartesian3.magnitude(n);return!(0===a&&(0===o||0===s)||0===o&&0===s)},CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments=function(e,t,i,r){var n,a,o=OrientedBoundingBox.fromPoints(e,obbScratch),s=o.halfAxes,l=Matrix3.getColumn(s,0,scratchXAxis),c=Matrix3.getColumn(s,1,scratchYAxis),u=Matrix3.getColumn(s,2,scratchZAxis),d=Cartesian3.magnitude(l),h=Cartesian3.magnitude(c),p=Cartesian3.magnitude(u),m=Math.min(d,h,p);return(0!==d||0!==h&&0!==p)&&(0!==h||0!==p)&&(m!==h&&m!==p||(n=l),m===d?n=c:m===p&&(a=c),m!==d&&m!==h||(a=u),Cartesian3.normalize(n,i),Cartesian3.normalize(a,r),Cartesian3.clone(o.center,t),!0)},CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction=function(r,n,a){return function(e){for(var t=new Array(e.length),i=0;i<e.length;i++)t[i]=projectTo2D(e[i],r,n,a);return t}},CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction=function(i,r,n){return function(e,t){return projectTo2D(e,i,r,n,t)}};var scratchCart1=new Cartesian3,scratchCart2=new Cartesian3;function computeProperties(e,t,i,r){Cartesian3.normalize(r.cartographicToCartesian(t,scratchCart2),scratchCart1),Cartesian3.normalize(r.cartographicToCartesian(i,scratchCart2),scratchCart2);var n=r.maximumRadius,a=r.minimumRadius,o=n*n,s=a*a;e._ellipticitySquared=(o-s)/o,e._ellipticity=Math.sqrt(e._ellipticitySquared),e._start=Cartographic.clone(t,e._start),e._start.height=0,e._end=Cartographic.clone(i,e._end),e._end.height=0,e._heading=calculateHeading(e,t.longitude,t.latitude,i.longitude,i.latitude),e._distance=calculateArcLength(e,r.maximumRadius,r.minimumRadius,t.longitude,t.latitude,i.longitude,i.latitude)}function interpolateUsingSurfaceDistance(e,t,i,r,n,a){var o,s,l,c,u,d,h=n*n;return u=Math.abs(CesiumMath.PI_OVER_TWO-Math.abs(t))>CesiumMath.EPSILON8?(o=calculateInverseM(calculateM(n,r,e.latitude)+i*Math.cos(t),n,r),s=calculateSigma(n,e.latitude),l=calculateSigma(n,o),c=Math.tan(t)*(l-s),CesiumMath.negativePiToPi(e.longitude+c)):(o=e.latitude,c=i/(0===n?r*Math.cos(e.latitude):(d=Math.sin(e.latitude),r*Math.cos(e.latitude)/Math.sqrt(1-h*d*d))),0<t?CesiumMath.negativePiToPi(e.longitude+c):CesiumMath.negativePiToPi(e.longitude-c)),defined(a)?(a.longitude=u,a.latitude=o,a.height=0,a):new Cartographic(u,o,0)}function EllipsoidRhumbLine(e,t,i){var r=defaultValue(i,Ellipsoid.WGS84);this._ellipsoid=r,this._start=new Cartographic,this._end=new Cartographic,this._heading=void 0,this._distance=void 0,this._ellipticity=void 0,this._ellipticitySquared=void 0,defined(e)&&defined(t)&&computeProperties(this,e,t,r)}function earcut(e,t,i){i=i||2;var r,n,a,o,s,l,c,u=t&&t.length,d=u?t[0]*i:e.length,h=linkedList(e,0,d,i,!0),p=[];if(!h||h.next===h.prev)return p;if(u&&(h=eliminateHoles(e,t,h,i)),e.length>80*i){r=a=e[0],n=o=e[1];for(var m=i;m<d;m+=i)(s=e[m])<r&&(r=s),(l=e[m+1])<n&&(n=l),a<s&&(a=s),o<l&&(o=l);c=0!==(c=Math.max(a-r,o-n))?1/c:0}return earcutLinked(h,p,i,r,n,c),p}function linkedList(e,t,i,r,n){var a,o;if(n===0<signedArea(e,t,i,r))for(a=t;a<i;a+=r)o=insertNode(a,e[a],e[a+1],o);else for(a=i-r;t<=a;a-=r)o=insertNode(a,e[a],e[a+1],o);return o&&equals(o,o.next)&&(removeNode(o),o=o.next),o}function filterPoints(e,t){if(!e)return e;t=t||e;var i,r=e;do{if(i=!1,r.steiner||!equals(r,r.next)&&0!==area(r.prev,r,r.next))r=r.next;else{if(removeNode(r),(r=t=r.prev)===r.next)break;i=!0}}while(i||r!==t);return t}function earcutLinked(e,t,i,r,n,a,o){if(e){!o&&a&&indexCurve(e,r,n,a);for(var s,l,c=e;e.prev!==e.next;)if(s=e.prev,l=e.next,a?isEarHashed(e,r,n,a):isEar(e))t.push(s.i/i),t.push(e.i/i),t.push(l.i/i),removeNode(e),e=l.next,c=l.next;else if((e=l)===c){o?1===o?earcutLinked(e=cureLocalIntersections(filterPoints(e),t,i),t,i,r,n,a,2):2===o&&splitEarcut(e,t,i,r,n,a):earcutLinked(filterPoints(e),t,i,r,n,a,1);break}}}function isEar(e){var t=e.prev,i=e,r=e.next;if(!(0<=area(t,i,r))){for(var n=e.next.next;n!==e.prev;){if(pointInTriangle(t.x,t.y,i.x,i.y,r.x,r.y,n.x,n.y)&&0<=area(n.prev,n,n.next))return;n=n.next}return 1}}function isEarHashed(e,t,i,r){var n=e.prev,a=e,o=e.next;if(!(0<=area(n,a,o))){for(var s=n.x<a.x?n.x<o.x?n.x:o.x:a.x<o.x?a.x:o.x,l=n.y<a.y?n.y<o.y?n.y:o.y:a.y<o.y?a.y:o.y,c=n.x>a.x?n.x>o.x?n.x:o.x:a.x>o.x?a.x:o.x,u=n.y>a.y?n.y>o.y?n.y:o.y:a.y>o.y?a.y:o.y,d=zOrder(s,l,t,i,r),h=zOrder(c,u,t,i,r),p=e.prevZ,m=e.nextZ;p&&p.z>=d&&m&&m.z<=h;){if(p!==e.prev&&p!==e.next&&pointInTriangle(n.x,n.y,a.x,a.y,o.x,o.y,p.x,p.y)&&0<=area(p.prev,p,p.next))return;if(p=p.prevZ,m!==e.prev&&m!==e.next&&pointInTriangle(n.x,n.y,a.x,a.y,o.x,o.y,m.x,m.y)&&0<=area(m.prev,m,m.next))return;m=m.nextZ}for(;p&&p.z>=d;){if(p!==e.prev&&p!==e.next&&pointInTriangle(n.x,n.y,a.x,a.y,o.x,o.y,p.x,p.y)&&0<=area(p.prev,p,p.next))return;p=p.prevZ}for(;m&&m.z<=h;){if(m!==e.prev&&m!==e.next&&pointInTriangle(n.x,n.y,a.x,a.y,o.x,o.y,m.x,m.y)&&0<=area(m.prev,m,m.next))return;m=m.nextZ}return 1}}function cureLocalIntersections(e,t,i){var r=e;do{var n=r.prev,a=r.next.next;!equals(n,a)&&intersects(n,r,r.next,a)&&locallyInside(n,a)&&locallyInside(a,n)&&(t.push(n.i/i),t.push(r.i/i),t.push(a.i/i),removeNode(r),removeNode(r.next),r=e=a),r=r.next}while(r!==e);return filterPoints(r)}function splitEarcut(e,t,i,r,n,a){var o=e;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&isValidDiagonal(o,s)){var l=splitPolygon(o,s),o=filterPoints(o,o.next),l=filterPoints(l,l.next);return earcutLinked(o,t,i,r,n,a),void earcutLinked(l,t,i,r,n,a)}s=s.next}o=o.next}while(o!==e)}function eliminateHoles(e,t,i,r){for(var n,a=[],o=0,s=t.length;o<s;o++)(n=linkedList(e,t[o]*r,o<s-1?t[o+1]*r:e.length,r,!1))===n.next&&(n.steiner=!0),a.push(getLeftmost(n));for(a.sort(compareX),o=0;o<a.length;o++)eliminateHole(a[o],i),i=filterPoints(i,i.next);return i}function compareX(e,t){return e.x-t.x}function eliminateHole(e,t){var i;(t=findHoleBridge(e,t))&&filterPoints(i=splitPolygon(t,e),i.next)}function findHoleBridge(e,t){var i,r=t,n=e.x,a=e.y,o=-1/0;do{if(a<=r.y&&a>=r.next.y&&r.next.y!==r.y){var s=r.x+(a-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=n&&o<s){if((o=s)===n){if(a===r.y)return r;if(a===r.next.y)return r.next}i=r.x<r.next.x?r:r.next}}r=r.next}while(r!==t);if(!i)return null;if(n===o)return i;for(var l,c=i,u=i.x,d=i.y,h=1/0,r=i;n>=r.x&&r.x>=u&&n!==r.x&&pointInTriangle(a<d?n:o,a,u,d,a<d?o:n,a,r.x,r.y)&&(l=Math.abs(a-r.y)/(n-r.x),locallyInside(r,e)&&(l<h||l===h&&(r.x>i.x||r.x===i.x&§orContainsSector(i,r)))&&(i=r,h=l)),(r=r.next)!==c;);return i}function sectorContainsSector(e,t){return area(e.prev,e,t.prev)<0&&area(t.next,e,e.next)<0}function indexCurve(e,t,i,r){for(var n=e;null===n.z&&(n.z=zOrder(n.x,n.y,t,i,r)),n.prevZ=n.prev,n.nextZ=n.next,(n=n.next)!==e;);n.prevZ.nextZ=null,n.prevZ=null,sortLinked(n)}function sortLinked(e){var t,i,r,n,a,o,s,l,c=1;do{for(i=e,a=e=null,o=0;i;){for(o++,r=i,t=s=0;t<c&&(s++,r=r.nextZ);t++);for(l=c;0<s||0<l&&r;)0!==s&&(0===l||!r||i.z<=r.z)?(i=(n=i).nextZ,s--):(r=(n=r).nextZ,l--),a?a.nextZ=n:e=n,n.prevZ=a,a=n;i=r}a.nextZ=null,c*=2}while(1<o);return e}function zOrder(e,t,i,r,n){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*n)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*n)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function getLeftmost(e){for(var t=e,i=e;(t.x<i.x||t.x===i.x&&t.y<i.y)&&(i=t),(t=t.next)!==e;);return i}function pointInTriangle(e,t,i,r,n,a,o,s){return 0<=(n-o)*(t-s)-(e-o)*(a-s)&&0<=(e-o)*(r-s)-(i-o)*(t-s)&&0<=(i-o)*(a-s)-(n-o)*(r-s)}function isValidDiagonal(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!intersectsPolygon(e,t)&&(locallyInside(e,t)&&locallyInside(t,e)&&middleInside(e,t)&&(area(e.prev,e,t.prev)||area(e,t.prev,t))||equals(e,t)&&0<area(e.prev,e,e.next)&&0<area(t.prev,t,t.next))}function area(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function equals(e,t){return e.x===t.x&&e.y===t.y}function intersects(e,t,i,r){var n=sign(area(e,t,i)),a=sign(area(e,t,r)),o=sign(area(i,r,e)),s=sign(area(i,r,t));return n!==a&&o!==s||(0===n&&onSegment(e,i,t)||(0===a&&onSegment(e,r,t)||(0===o&&onSegment(i,e,r)||!(0!==s||!onSegment(i,t,r)))))}function onSegment(e,t,i){return t.x<=Math.max(e.x,i.x)&&t.x>=Math.min(e.x,i.x)&&t.y<=Math.max(e.y,i.y)&&t.y>=Math.min(e.y,i.y)}function sign(e){return 0<e?1:e<0?-1:0}function intersectsPolygon(e,t){var i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&intersects(i,i.next,e,t))return 1;i=i.next}while(i!==e)}function locallyInside(e,t){return area(e.prev,e,e.next)<0?0<=area(e,t,e.next)&&0<=area(e,e.prev,t):area(e,t,e.prev)<0||area(e,e.next,t)<0}function middleInside(e,t){for(var i=e,r=!1,n=(e.x+t.x)/2,a=(e.y+t.y)/2;i.y>a!=i.next.y>a&&i.next.y!==i.y&&n<(i.next.x-i.x)*(a-i.y)/(i.next.y-i.y)+i.x&&(r=!r),(i=i.next)!==e;);return r}function splitPolygon(e,t){var i=new Node$1(e.i,e.x,e.y),r=new Node$1(t.i,t.x,t.y),n=e.next,a=t.prev;return(e.next=t).prev=e,(i.next=n).prev=i,(r.next=i).prev=r,(a.next=r).prev=a,r}function insertNode(e,t,i,r){var n=new Node$1(e,t,i);return r?(n.next=r.next,(n.prev=r).next.prev=n,r.next=n):(n.prev=n).next=n,n}function removeNode(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Node$1(e,t,i){this.i=e,this.x=t,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function signedArea(e,t,i,r){for(var n=0,a=t,o=i-r;a<i;a+=r)n+=(e[o]-e[a])*(e[a+1]+e[o+1]),o=a;return n}Object.defineProperties(EllipsoidRhumbLine.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},heading:{get:function(){return this._heading}}}),EllipsoidRhumbLine.fromStartHeadingDistance=function(e,t,i,r,n){var a=defaultValue(r,Ellipsoid.WGS84),o=a.maximumRadius,s=a.minimumRadius,l=o*o,c=s*s,u=Math.sqrt((l-c)/l),d=interpolateUsingSurfaceDistance(e,t=CesiumMath.negativePiToPi(t),i,a.maximumRadius,u);return!defined(n)||defined(r)&&!r.equals(n.ellipsoid)?new EllipsoidRhumbLine(e,d,a):(n.setEndPoints(e,d),n)},EllipsoidRhumbLine.prototype.setEndPoints=function(e,t){computeProperties(this,e,t,this._ellipsoid)},EllipsoidRhumbLine.prototype.interpolateUsingFraction=function(e,t){return this.interpolateUsingSurfaceDistance(e*this._distance,t)},EllipsoidRhumbLine.prototype.interpolateUsingSurfaceDistance=function(e,t){return interpolateUsingSurfaceDistance(this._start,this._heading,e,this._ellipsoid.maximumRadius,this._ellipticity,t)},EllipsoidRhumbLine.prototype.findIntersectionWithLongitude=function(e,t){var i=this._ellipticity,r=this._heading,n=Math.abs(r),a=this._start;if(e=CesiumMath.negativePiToPi(e),CesiumMath.equalsEpsilon(Math.abs(e),Math.PI,CesiumMath.EPSILON14)&&(e=CesiumMath.sign(a.longitude)*Math.PI),defined(t)||(t=new Cartographic),Math.abs(CesiumMath.PI_OVER_TWO-n)<=CesiumMath.EPSILON8)return t.longitude=e,t.latitude=a.latitude,t.height=0,t;if(CesiumMath.equalsEpsilon(Math.abs(CesiumMath.PI_OVER_TWO-n),CesiumMath.PI_OVER_TWO,CesiumMath.EPSILON8)){if(CesiumMath.equalsEpsilon(e,a.longitude,CesiumMath.EPSILON12))return;return t.longitude=e,t.latitude=CesiumMath.PI_OVER_TWO*CesiumMath.sign(CesiumMath.PI_OVER_TWO-r),t.height=0,t}var o,s=a.latitude,l=i*Math.sin(s),c=Math.tan(.5*(CesiumMath.PI_OVER_TWO+s))*Math.exp((e-a.longitude)/Math.tan(r)),u=(1+l)/(1-l),d=a.latitude;do{o=d;var h=i*Math.sin(o),p=(1+h)/(1-h),d=2*Math.atan(c*Math.pow(p/u,i/2))-CesiumMath.PI_OVER_TWO}while(!CesiumMath.equalsEpsilon(d,o,CesiumMath.EPSILON12));return t.longitude=e,t.latitude=d,t.height=0,t},EllipsoidRhumbLine.prototype.findIntersectionWithLatitude=function(e,t){var i=this._ellipticity,r=this._heading,n=this._start;if(!CesiumMath.equalsEpsilon(Math.abs(r),CesiumMath.PI_OVER_TWO,CesiumMath.EPSILON8)){var a=calculateSigma(i,n.latitude),o=calculateSigma(i,e),s=Math.tan(r)*(o-a),l=CesiumMath.negativePiToPi(n.longitude+s);return defined(t)?(t.longitude=l,t.latitude=e,t.height=0,t):new Cartographic(l,e,0)}},earcut.deviation=function(e,t,i,r){var n=t&&t.length,a=n?t[0]*i:e.length,o=Math.abs(signedArea(e,0,a,i));if(n)for(var s=0,l=t.length;s<l;s++){var c=t[s]*i,u=s<l-1?t[s+1]*i:e.length;o-=Math.abs(signedArea(e,c,u,i))}for(var d=0,s=0;s<r.length;s+=3){var h=r[s]*i,p=r[s+1]*i,m=r[s+2]*i;d+=Math.abs((e[h]-e[m])*(e[1+p]-e[1+h])-(e[h]-e[p])*(e[1+m]-e[1+h]))}return 0===o&&0===d?0:Math.abs((d-o)/o)},earcut.flatten=function(e){for(var t=e[0][0].length,i={vertices:[],holes:[],dimensions:t},r=0,n=0;n<e.length;n++){for(var a=0;a<e[n].length;a++)for(var o=0;o<t;o++)i.vertices.push(e[n][a][o]);0<n&&(r+=e[n-1].length,i.holes.push(r))}return i};var WindingOrder={CLOCKWISE:WebGLConstants$1.CW,COUNTER_CLOCKWISE:WebGLConstants$1.CCW,validate:function(e){return e===WindingOrder.CLOCKWISE||e===WindingOrder.COUNTER_CLOCKWISE}},WindingOrder$1=Object.freeze(WindingOrder),scaleToGeodeticHeightN=new Cartesian3,scaleToGeodeticHeightP=new Cartesian3,PolygonPipeline={computeArea2D:function(e){for(var t=e.length,i=0,r=t-1,n=0;n<t;r=n++){var a=e[r],o=e[n];i+=a.x*o.y-o.x*a.y}return.5*i},computeWindingOrder2D:function(e){return 0<PolygonPipeline.computeArea2D(e)?WindingOrder$1.COUNTER_CLOCKWISE:WindingOrder$1.CLOCKWISE},triangulate:function(e,t){return earcut(Cartesian2.packArray(e),t,2)}},subdivisionV0Scratch=new Cartesian3,subdivisionV1Scratch=new Cartesian3,subdivisionV2Scratch=new Cartesian3,subdivisionS0Scratch=new Cartesian3,subdivisionS1Scratch=new Cartesian3,subdivisionS2Scratch=new Cartesian3,subdivisionMidScratch=new Cartesian3;PolygonPipeline.computeSubdivision=function(e,t,i,r){r=defaultValue(r,CesiumMath.RADIANS_PER_DEGREE);for(var n=i.slice(0),a=t.length,o=new Array(3*a),s=0,l=0;l<a;l++){var c=t[l];o[s++]=c.x,o[s++]=c.y,o[s++]=c.z}for(var u=[],d={},h=e.maximumRadius,p=CesiumMath.chordLength(r,h),m=p*p;0<n.length;){var f,g,_=n.pop(),y=n.pop(),v=n.pop(),C=Cartesian3.fromArray(o,3*v,subdivisionV0Scratch),S=Cartesian3.fromArray(o,3*y,subdivisionV1Scratch),T=Cartesian3.fromArray(o,3*_,subdivisionV2Scratch),x=Cartesian3.multiplyByScalar(Cartesian3.normalize(C,subdivisionS0Scratch),h,subdivisionS0Scratch),b=Cartesian3.multiplyByScalar(Cartesian3.normalize(S,subdivisionS1Scratch),h,subdivisionS1Scratch),E=Cartesian3.multiplyByScalar(Cartesian3.normalize(T,subdivisionS2Scratch),h,subdivisionS2Scratch),P=Cartesian3.magnitudeSquared(Cartesian3.subtract(x,b,subdivisionMidScratch)),A=Cartesian3.magnitudeSquared(Cartesian3.subtract(b,E,subdivisionMidScratch)),w=Cartesian3.magnitudeSquared(Cartesian3.subtract(E,x,subdivisionMidScratch)),D=Math.max(P,A,w);m<D?P===D?(defined(l=d[f=Math.min(v,y)+" "+Math.max(v,y)])||(g=Cartesian3.add(C,S,subdivisionMidScratch),Cartesian3.multiplyByScalar(g,.5,g),o.push(g.x,g.y,g.z),l=o.length/3-1,d[f]=l),n.push(v,l,_),n.push(l,y,_)):A===D?(defined(l=d[f=Math.min(y,_)+" "+Math.max(y,_)])||(g=Cartesian3.add(S,T,subdivisionMidScratch),Cartesian3.multiplyByScalar(g,.5,g),o.push(g.x,g.y,g.z),l=o.length/3-1,d[f]=l),n.push(y,l,v),n.push(l,_,v)):w===D&&(defined(l=d[f=Math.min(_,v)+" "+Math.max(_,v)])||(g=Cartesian3.add(T,C,subdivisionMidScratch),Cartesian3.multiplyByScalar(g,.5,g),o.push(g.x,g.y,g.z),l=o.length/3-1,d[f]=l),n.push(_,l,y),n.push(l,v,y)):(u.push(v),u.push(y),u.push(_))}return new Geometry({attributes:{position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:o})},indices:u,primitiveType:PrimitiveType$1.TRIANGLES})};var subdivisionC0Scratch=new Cartographic,subdivisionC1Scratch=new Cartographic,subdivisionC2Scratch=new Cartographic,subdivisionCartographicScratch=new Cartographic;function Queue(){this._array=[],this._offset=0,this._length=0}PolygonPipeline.computeRhumbLineSubdivision=function(e,t,i,r){r=defaultValue(r,CesiumMath.RADIANS_PER_DEGREE);for(var n=i.slice(0),a=t.length,o=new Array(3*a),s=0,l=0;l<a;l++){var c=t[l];o[s++]=c.x,o[s++]=c.y,o[s++]=c.z}for(var u=[],d={},h=e.maximumRadius,p=CesiumMath.chordLength(r,h),m=new EllipsoidRhumbLine(void 0,void 0,e),f=new EllipsoidRhumbLine(void 0,void 0,e),g=new EllipsoidRhumbLine(void 0,void 0,e);0<n.length;){var _=n.pop(),y=n.pop(),v=n.pop(),C=Cartesian3.fromArray(o,3*v,subdivisionV0Scratch),S=Cartesian3.fromArray(o,3*y,subdivisionV1Scratch),T=Cartesian3.fromArray(o,3*_,subdivisionV2Scratch),x=e.cartesianToCartographic(C,subdivisionC0Scratch),b=e.cartesianToCartographic(S,subdivisionC1Scratch),E=e.cartesianToCartographic(T,subdivisionC2Scratch);m.setEndPoints(x,b);var P=m.surfaceDistance;f.setEndPoints(b,E);var A=f.surfaceDistance;g.setEndPoints(E,x);var w,D,M,I,R=g.surfaceDistance,O=Math.max(P,A,R);p<O?P===O?(defined(l=d[w=Math.min(v,y)+" "+Math.max(v,y)])||(D=m.interpolateUsingFraction(.5,subdivisionCartographicScratch),M=.5*(x.height+b.height),I=Cartesian3.fromRadians(D.longitude,D.latitude,M,e,subdivisionMidScratch),o.push(I.x,I.y,I.z),l=o.length/3-1,d[w]=l),n.push(v,l,_),n.push(l,y,_)):A===O?(defined(l=d[w=Math.min(y,_)+" "+Math.max(y,_)])||(D=f.interpolateUsingFraction(.5,subdivisionCartographicScratch),M=.5*(b.height+E.height),I=Cartesian3.fromRadians(D.longitude,D.latitude,M,e,subdivisionMidScratch),o.push(I.x,I.y,I.z),l=o.length/3-1,d[w]=l),n.push(y,l,v),n.push(l,_,v)):R===O&&(defined(l=d[w=Math.min(_,v)+" "+Math.max(_,v)])||(D=g.interpolateUsingFraction(.5,subdivisionCartographicScratch),M=.5*(E.height+x.height),I=Cartesian3.fromRadians(D.longitude,D.latitude,M,e,subdivisionMidScratch),o.push(I.x,I.y,I.z),l=o.length/3-1,d[w]=l),n.push(_,l,y),n.push(l,v,y)):(u.push(v),u.push(y),u.push(_))}return new Geometry({attributes:{position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:o})},indices:u,primitiveType:PrimitiveType$1.TRIANGLES})},PolygonPipeline.scaleToGeodeticHeight=function(e,t,i,r){i=defaultValue(i,Ellipsoid.WGS84);var n=scaleToGeodeticHeightN,a=scaleToGeodeticHeightP;if(t=defaultValue(t,0),r=defaultValue(r,!0),defined(e))for(var o=e.length,s=0;s<o;s+=3)Cartesian3.fromArray(e,s,a),r&&(a=i.scaleToGeodeticSurface(a,a)),0!==t&&(n=i.geodeticSurfaceNormal(a,n),Cartesian3.multiplyByScalar(n,t,n),Cartesian3.add(a,n,a)),e[s]=a.x,e[s+1]=a.y,e[s+2]=a.z;return e},Object.defineProperties(Queue.prototype,{length:{get:function(){return this._length}}}),Queue.prototype.enqueue=function(e){this._array.push(e),this._length++},Queue.prototype.dequeue=function(){if(0!==this._length){var e=this._array,t=this._offset,i=e[t];return e[t]=void 0,10<++t&&2*t>e.length&&(this._array=e.slice(t),t=0),this._offset=t,this._length--,i}},Queue.prototype.peek=function(){if(0!==this._length)return this._array[this._offset]},Queue.prototype.contains=function(e){return-1!==this._array.indexOf(e)},Queue.prototype.clear=function(){this._array.length=this._offset=this._length=0},Queue.prototype.sort=function(e){0<this._offset&&(this._array=this._array.slice(this._offset),this._offset=0),this._array.sort(e)};var PolygonGeometryLibrary={computeHierarchyPackedLength:function(e){for(var t=0,i=[e];0<i.length;){var r=i.pop();if(defined(r)){t+=2;var n=r.positions,a=r.holes;if(defined(n)&&(t+=n.length*Cartesian3.packedLength),defined(a))for(var o=a.length,s=0;s<o;++s)i.push(a[s])}}return t},packPolygonHierarchy:function(e,t,i){for(var r=[e];0<r.length;){var n=r.pop();if(defined(n)){var a=n.positions,o=n.holes;if(t[i++]=defined(a)?a.length:0,t[i++]=defined(o)?o.length:0,defined(a))for(var s=a.length,l=0;l<s;++l,i+=3)Cartesian3.pack(a[l],t,i);if(defined(o))for(var c=o.length,u=0;u<c;++u)r.push(o[u])}}return i},unpackPolygonHierarchy:function(e,t){for(var i=e[t++],r=e[t++],n=new Array(i),a=0<r?new Array(r):void 0,o=0;o<i;++o,t+=Cartesian3.packedLength)n[o]=Cartesian3.unpack(e,t);for(var s=0;s<r;++s)a[s]=PolygonGeometryLibrary.unpackPolygonHierarchy(e,t),t=a[s].startingIndex,delete a[s].startingIndex;return{positions:n,holes:a,startingIndex:t}}},distanceScratch$3=new Cartesian3;function getPointAtDistance(e,t,i,r){return Cartesian3.subtract(t,e,distanceScratch$3),Cartesian3.multiplyByScalar(distanceScratch$3,i/r,distanceScratch$3),Cartesian3.add(e,distanceScratch$3,distanceScratch$3),[distanceScratch$3.x,distanceScratch$3.y,distanceScratch$3.z]}PolygonGeometryLibrary.subdivideLineCount=function(e,t,i){var r=Cartesian3.distance(e,t)/i,n=Math.max(0,Math.ceil(CesiumMath.log2(r)));return Math.pow(2,n)};var scratchCartographic0=new Cartographic,scratchCartographic1=new Cartographic,scratchCartographic2=new Cartographic,scratchCartesian0=new Cartesian3;PolygonGeometryLibrary.subdivideRhumbLineCount=function(e,t,i,r){var n=new EllipsoidRhumbLine(e.cartesianToCartographic(t,scratchCartographic0),e.cartesianToCartographic(i,scratchCartographic1),e).surfaceDistance/r,a=Math.max(0,Math.ceil(CesiumMath.log2(n)));return Math.pow(2,a)},PolygonGeometryLibrary.subdivideLine=function(e,t,i,r){var n=PolygonGeometryLibrary.subdivideLineCount(e,t,i),a=Cartesian3.distance(e,t),o=a/n;defined(r)||(r=[]);var s=r;s.length=3*n;for(var l=0,c=0;c<n;c++){var u=getPointAtDistance(e,t,c*o,a);s[l++]=u[0],s[l++]=u[1],s[l++]=u[2]}return s},PolygonGeometryLibrary.subdivideRhumbLine=function(e,t,i,r,n){var a=new EllipsoidRhumbLine(e.cartesianToCartographic(t,scratchCartographic0),e.cartesianToCartographic(i,scratchCartographic1),e),o=a.surfaceDistance/r,s=Math.max(0,Math.ceil(CesiumMath.log2(o))),l=Math.pow(2,s),c=a.surfaceDistance/l;defined(n)||(n=[]);var u=n;u.length=3*l;for(var d=0,h=0;h<l;h++){var p=a.interpolateUsingSurfaceDistance(h*c,scratchCartographic2),m=e.cartographicToCartesian(p,scratchCartesian0);u[d++]=m.x,u[d++]=m.y,u[d++]=m.z}return u};var scaleToGeodeticHeightN1=new Cartesian3,scaleToGeodeticHeightN2=new Cartesian3,scaleToGeodeticHeightP1=new Cartesian3,scaleToGeodeticHeightP2=new Cartesian3;PolygonGeometryLibrary.scaleToGeodeticHeightExtruded=function(e,t,i,r,n){r=defaultValue(r,Ellipsoid.WGS84);var a=scaleToGeodeticHeightN1,o=scaleToGeodeticHeightN2,s=scaleToGeodeticHeightP1,l=scaleToGeodeticHeightP2;if(defined(e)&&defined(e.attributes)&&defined(e.attributes.position))for(var c=e.attributes.position.values,u=c.length/2,d=0;d<u;d+=3)Cartesian3.fromArray(c,d,s),r.geodeticSurfaceNormal(s,a),l=r.scaleToGeodeticSurface(s,l),o=Cartesian3.multiplyByScalar(a,i,o),o=Cartesian3.add(l,o,o),c[d+u]=o.x,c[d+1+u]=o.y,c[d+2+u]=o.z,n&&(l=Cartesian3.clone(s,l)),o=Cartesian3.multiplyByScalar(a,t,o),o=Cartesian3.add(l,o,o),c[d]=o.x,c[d+1]=o.y,c[d+2]=o.z;return e},PolygonGeometryLibrary.polygonOutlinesFromHierarchy=function(e,t,i){var r,n,a=[],o=new Queue;for(o.enqueue(e);0!==o.length;){var s=o.dequeue(),l=s.positions;if(t)for(n=l.length,u=0;u<n;u++)i.scaleToGeodeticSurface(l[u],l[u]);if(!((l=arrayRemoveDuplicates(l,Cartesian3.equalsEpsilon,!0)).length<3)){for(var c=s.holes?s.holes.length:0,u=0;u<c;u++){var d=s.holes[u],h=d.positions;if(t)for(n=h.length,r=0;r<n;++r)i.scaleToGeodeticSurface(h[r],h[r]);if(!((h=arrayRemoveDuplicates(h,Cartesian3.equalsEpsilon,!0)).length<3)){a.push(h);var p=0;for(defined(d.holes)&&(p=d.holes.length),r=0;r<p;r++)o.enqueue(d.holes[r])}}a.push(l)}}return a},PolygonGeometryLibrary.polygonsFromHierarchy=function(e,t,i,r){var n=[],a=[],o=new Queue;for(o.enqueue(e);0!==o.length;){var s,l=o.dequeue(),c=l.positions,u=l.holes;if(i)for(s=c.length,y=0;y<s;y++)r.scaleToGeodeticSurface(c[y],c[y]);if(!((c=arrayRemoveDuplicates(c,Cartesian3.equalsEpsilon,!0)).length<3)){var d=t(c);if(defined(d)){var h=[],p=PolygonPipeline.computeWindingOrder2D(d);p===WindingOrder$1.CLOCKWISE&&(d.reverse(),c=c.slice().reverse());for(var m,f=c.slice(),g=defined(u)?u.length:0,_=[],y=0;y<g;y++){var v=u[y],C=v.positions;if(i)for(s=C.length,m=0;m<s;++m)r.scaleToGeodeticSurface(C[m],C[m]);if(!((C=arrayRemoveDuplicates(C,Cartesian3.equalsEpsilon,!0)).length<3)){var S=t(C);if(defined(S)){PolygonPipeline.computeWindingOrder2D(S)===WindingOrder$1.CLOCKWISE&&(S.reverse(),C=C.slice().reverse()),_.push(C),h.push(f.length),f=f.concat(C),d=d.concat(S);var T=0;for(defined(v.holes)&&(T=v.holes.length),m=0;m<T;m++)o.enqueue(v.holes[m])}}}n.push({outerRing:c,holes:_}),a.push({positions:f,positions2D:d,holes:h})}}}return{hierarchy:n,polygons:a}};var computeBoundingRectangleCartesian2=new Cartesian2,computeBoundingRectangleCartesian3=new Cartesian3,computeBoundingRectangleQuaternion=new Quaternion,computeBoundingRectangleMatrix3=new Matrix3;PolygonGeometryLibrary.computeBoundingRectangle=function(e,t,i,r,n){for(var a=Quaternion.fromAxisAngle(e,r,computeBoundingRectangleQuaternion),o=Matrix3.fromQuaternion(a,computeBoundingRectangleMatrix3),s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=i.length,h=0;h<d;++h){var p=Cartesian3.clone(i[h],computeBoundingRectangleCartesian3);Matrix3.multiplyByVector(o,p,p);var m=t(p,computeBoundingRectangleCartesian2);defined(m)&&(s=Math.min(s,m.x),l=Math.max(l,m.x),c=Math.min(c,m.y),u=Math.max(u,m.y))}return n.x=s,n.y=c,n.width=l-s,n.height=u-c,n},PolygonGeometryLibrary.createGeometryFromPositions=function(e,t,i,r,n,a){var o=PolygonPipeline.triangulate(t.positions2D,t.holes);o.length<3&&(o=[0,1,2]);var s=t.positions;if(r){for(var l=s.length,c=new Array(3*l),u=0,d=0;d<l;d++){var h=s[d];c[u++]=h.x,c[u++]=h.y,c[u++]=h.z}var p=new Geometry({attributes:{position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:c})},indices:o,primitiveType:PrimitiveType$1.TRIANGLES});return n.normal?GeometryPipeline.computeNormal(p):p}return a===ArcType$1.GEODESIC?PolygonPipeline.computeSubdivision(e,s,o,i):a===ArcType$1.RHUMB?PolygonPipeline.computeRhumbLineSubdivision(e,s,o,i):void 0};var computeWallIndicesSubdivided=[],p1Scratch$1=new Cartesian3,p2Scratch$1=new Cartesian3;PolygonGeometryLibrary.computeWallGeometry=function(e,t,i,r,n){var a,o,s,l=e.length,c=0;if(r)for(o=3*l*2,a=new Array(2*o),s=0;s<l;s++)p=e[s],m=e[(s+1)%l],a[c]=a[c+o]=p.x,a[++c]=a[c+o]=p.y,a[++c]=a[c+o]=p.z,a[++c]=a[c+o]=m.x,a[++c]=a[c+o]=m.y,a[++c]=a[c+o]=m.z,++c;else{var u=CesiumMath.chordLength(i,t.maximumRadius),d=0;if(n===ArcType$1.GEODESIC)for(s=0;s<l;s++)d+=PolygonGeometryLibrary.subdivideLineCount(e[s],e[(s+1)%l],u);else if(n===ArcType$1.RHUMB)for(s=0;s<l;s++)d+=PolygonGeometryLibrary.subdivideRhumbLineCount(t,e[s],e[(s+1)%l],u);for(o=3*(d+l),a=new Array(2*o),s=0;s<l;s++){var h,p=e[s],m=e[(s+1)%l];n===ArcType$1.GEODESIC?h=PolygonGeometryLibrary.subdivideLine(p,m,u,computeWallIndicesSubdivided):n===ArcType$1.RHUMB&&(h=PolygonGeometryLibrary.subdivideRhumbLine(t,p,m,u,computeWallIndicesSubdivided));for(var f=h.length,g=0;g<f;++g,++c)a[c]=h[g],a[c+o]=h[g];a[c]=m.x,a[c+o]=m.x,a[++c]=m.y,a[c+o]=m.y,a[++c]=m.z,a[c+o]=m.z,++c}}l=a.length;var _=IndexDatatype$1.createTypedArray(l/3,l-6*e.length),y=0;for(l/=6,s=0;s<l;s++){var v=s,C=v+1,S=v+l,T=S+1;p=Cartesian3.fromArray(a,3*v,p1Scratch$1),m=Cartesian3.fromArray(a,3*C,p2Scratch$1),Cartesian3.equalsEpsilon(p,m,CesiumMath.EPSILON10,CesiumMath.EPSILON10)||(_[y++]=v,_[y++]=S,_[y++]=C,_[y++]=C,_[y++]=S,_[y++]=T)}return new Geometry({attributes:new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:a})}),indices:_,primitiveType:PrimitiveType$1.TRIANGLES})};var scratchPosition$1=new Cartesian3,scratchBR=new BoundingRectangle,stScratch=new Cartesian2,textureCoordinatesOrigin=new Cartesian2,scratchNormal$3=new Cartesian3,scratchTangent$1=new Cartesian3,scratchBitangent$1=new Cartesian3,centerScratch=new Cartesian3,axis1Scratch=new Cartesian3,axis2Scratch=new Cartesian3,quaternionScratch$1=new Quaternion,textureMatrixScratch$1=new Matrix3,tangentRotationScratch=new Matrix3,surfaceNormalScratch=new Cartesian3;function createGeometryFromPolygon(e,t,i,r,n,a,o,s){var l=e.positions,c=PolygonPipeline.triangulate(e.positions2D,e.holes);c.length<3&&(c=[0,1,2]);var u=IndexDatatype$1.createTypedArray(l.length,c.length);u.set(c);var d,h,p=textureMatrixScratch$1;0!==r?(d=Quaternion.fromAxisAngle(a,r,quaternionScratch$1),p=Matrix3.fromQuaternion(d,p),(t.tangent||t.bitangent)&&(d=Quaternion.fromAxisAngle(a,-r,quaternionScratch$1),h=Matrix3.fromQuaternion(d,tangentRotationScratch),o=Cartesian3.normalize(Matrix3.multiplyByVector(h,o,o),o),t.bitangent&&(s=Cartesian3.normalize(Cartesian3.cross(a,o,s),s)))):p=Matrix3.clone(Matrix3.IDENTITY,p);var m=textureCoordinatesOrigin;t.st&&(m.x=i.x,m.y=i.y);for(var f=l.length,g=3*f,_=new Float64Array(g),y=t.normal?new Float32Array(g):void 0,v=t.tangent?new Float32Array(g):void 0,C=t.bitangent?new Float32Array(g):void 0,S=t.st?new Float32Array(2*f):void 0,T=0,x=0,b=0,E=0,P=0,A=0;A<f;A++){var w,D,M,I=l[A];_[T++]=I.x,_[T++]=I.y,_[T++]=I.z,t.st&&(w=n(Matrix3.multiplyByVector(p,I,scratchPosition$1),stScratch),Cartesian2.subtract(w,m,w),D=CesiumMath.clamp(w.x/i.width,0,1),M=CesiumMath.clamp(w.y/i.height,0,1),S[P++]=D,S[P++]=M),t.normal&&(y[x++]=a.x,y[x++]=a.y,y[x++]=a.z),t.tangent&&(v[E++]=o.x,v[E++]=o.y,v[E++]=o.z),t.bitangent&&(C[b++]=s.x,C[b++]=s.y,C[b++]=s.z)}var R=new GeometryAttributes;return t.position&&(R.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:_})),t.normal&&(R.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:y})),t.tangent&&(R.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:v})),t.bitangent&&(R.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:C})),t.st&&(R.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:S})),new Geometry({attributes:R,indices:u,primitiveType:PrimitiveType$1.TRIANGLES})}function CoplanarPolygonGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).polygonHierarchy,i=defaultValue(e.vertexFormat,VertexFormat.DEFAULT);this._vertexFormat=VertexFormat.clone(i),this._polygonHierarchy=t,this._stRotation=defaultValue(e.stRotation,0),this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._workerName="createCoplanarPolygonGeometry",this.packedLength=PolygonGeometryLibrary.computeHierarchyPackedLength(t)+VertexFormat.packedLength+Ellipsoid.packedLength+2}CoplanarPolygonGeometry.fromPositions=function(e){return new CoplanarPolygonGeometry({polygonHierarchy:{positions:(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions},vertexFormat:e.vertexFormat,stRotation:e.stRotation,ellipsoid:e.ellipsoid})},CoplanarPolygonGeometry.pack=function(e,t,i){return i=defaultValue(i,0),i=PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,i),Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._stRotation,t[i]=e.packedLength,t};var scratchEllipsoid$2=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchVertexFormat$2=new VertexFormat,scratchOptions$6={polygonHierarchy:{}};function createGeometryFromPositions(e){for(var t=e.length,i=new Float64Array(3*t),r=IndexDatatype$1.createTypedArray(t,2*t),n=0,a=0,o=0;o<t;o++){var s=e[o];i[n++]=s.x,i[n++]=s.y,i[n++]=s.z,r[a++]=o,r[a++]=(o+1)%t}return new Geometry({attributes:new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:i})}),indices:r,primitiveType:PrimitiveType$1.LINES})}function CoplanarPolygonOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).polygonHierarchy;this._polygonHierarchy=t,this._workerName="createCoplanarPolygonOutlineGeometry",this.packedLength=PolygonGeometryLibrary.computeHierarchyPackedLength(t)+1}CoplanarPolygonGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=r.startingIndex,delete r.startingIndex;var n=Ellipsoid.unpack(e,t,scratchEllipsoid$2);t+=Ellipsoid.packedLength;var a=VertexFormat.unpack(e,t,scratchVertexFormat$2);t+=VertexFormat.packedLength;var o=e[t++],s=e[t];return defined(i)||(i=new CoplanarPolygonGeometry(scratchOptions$6)),i._polygonHierarchy=r,i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._vertexFormat=VertexFormat.clone(a,i._vertexFormat),i._stRotation=o,i.packedLength=s,i},CoplanarPolygonGeometry.createGeometry=function(e){var t=e._vertexFormat,i=e._polygonHierarchy,r=e._stRotation,n=i.positions;if(!((n=arrayRemoveDuplicates(n,Cartesian3.equalsEpsilon,!0)).length<3)){var a=scratchNormal$3,o=scratchTangent$1,s=scratchBitangent$1,l=axis1Scratch,c=axis2Scratch;if(CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments(n,centerScratch,l,c)){var u,a=Cartesian3.cross(l,c,a);a=Cartesian3.normalize(a,a),Cartesian3.equalsEpsilon(centerScratch,Cartesian3.ZERO,CesiumMath.EPSILON6)||(u=e._ellipsoid.geodeticSurfaceNormal(centerScratch,surfaceNormalScratch),Cartesian3.dot(a,u)<0&&(a=Cartesian3.negate(a,a),l=Cartesian3.negate(l,l)));var d=CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction(centerScratch,l,c),h=CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction(centerScratch,l,c);t.tangent&&(o=Cartesian3.clone(l,o)),t.bitangent&&(s=Cartesian3.clone(c,s));var p=PolygonGeometryLibrary.polygonsFromHierarchy(i,d,!1),m=p.hierarchy,f=p.polygons;if(0!==m.length){n=m[0].outerRing;for(var g=BoundingSphere.fromPoints(n),_=PolygonGeometryLibrary.computeBoundingRectangle(a,h,n,r,scratchBR),y=[],v=0;v<f.length;v++){var C=new GeometryInstance({geometry:createGeometryFromPolygon(f[v],t,_,r,h,a,o,s)});y.push(C)}var S=GeometryPipeline.combineInstances(y)[0];S.attributes.position.values=new Float64Array(S.attributes.position.values),S.indices=IndexDatatype$1.createTypedArray(S.attributes.position.values.length/3,S.indices);var T=S.attributes;return t.position||delete T.position,new Geometry({attributes:T,indices:S.indices,primitiveType:S.primitiveType,boundingSphere:g})}}}},CoplanarPolygonOutlineGeometry.fromPositions=function(e){return new CoplanarPolygonOutlineGeometry({polygonHierarchy:{positions:(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions}})},CoplanarPolygonOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),t[i=PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,i)]=e.packedLength,t};var scratchOptions$7={polygonHierarchy:{}};CoplanarPolygonOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=r.startingIndex,delete r.startingIndex;var n=e[t];return defined(i)||(i=new CoplanarPolygonOutlineGeometry(scratchOptions$7)),i._polygonHierarchy=r,i.packedLength=n,i},CoplanarPolygonOutlineGeometry.createGeometry=function(e){var t=e._polygonHierarchy,i=t.positions;if(!((i=arrayRemoveDuplicates(i,Cartesian3.equalsEpsilon,!0)).length<3)&&CoplanarPolygonGeometryLibrary.validOutline(i)){var r=PolygonGeometryLibrary.polygonOutlinesFromHierarchy(t,!1);if(0!==r.length){for(var n=[],a=0;a<r.length;a++){var o=new GeometryInstance({geometry:createGeometryFromPositions(r[a])});n.push(o)}var s=GeometryPipeline.combineInstances(n)[0],l=BoundingSphere.fromPoints(t.positions);return new Geometry({attributes:s.attributes,indices:s.indices,primitiveType:s.primitiveType,boundingSphere:l})}}};var CornerType={ROUNDED:0,MITERED:1,BEVELED:2},CornerType$1=Object.freeze(CornerType);function setConstants(e){var t=e._uSquared,i=e._ellipsoid.maximumRadius,r=e._ellipsoid.minimumRadius,n=(i-r)/i,a=Math.cos(e._startHeading),o=Math.sin(e._startHeading),s=(1-n)*Math.tan(e._start.latitude),l=1/Math.sqrt(1+s*s),c=l*s,u=Math.atan2(s,a),d=l*o,h=d*d,p=1-h,m=Math.sqrt(p),f=t/4,g=f*f,_=g*f,y=g*g,v=1+f-3*g/4+5*_/4-175*y/64,C=1-f+15*g/8-35*_/8,S=1-3*f+35*g/4,T=1-5*f,x=v*u-C*Math.sin(2*u)*f/2-S*Math.sin(4*u)*g/16-T*Math.sin(6*u)*_/48-5*Math.sin(8*u)*y/512,b=e._constants;b.a=i,b.b=r,b.f=n,b.cosineHeading=a,b.sineHeading=o,b.tanU=s,b.cosineU=l,b.sineU=c,b.sigma=u,b.sineAlpha=d,b.sineSquaredAlpha=h,b.cosineSquaredAlpha=p,b.cosineAlpha=m,b.u2Over4=f,b.u4Over16=g,b.u6Over64=_,b.u8Over256=y,b.a0=v,b.a1=C,b.a2=S,b.a3=T,b.distanceRatio=x}function computeC(e,t){return e*t*(4+e*(4-3*t))/16}function computeDeltaLambda(e,t,i,r,n,a,o){var s=computeC(e,i);return(1-s)*e*t*(r+s*n*(o+s*a*(2*o*o-1)))}function vincentyInverseFormula(e,t,i,r,n,a,o){var s=(t-i)/t,l=a-r,c=Math.atan((1-s)*Math.tan(n)),u=Math.atan((1-s)*Math.tan(o)),d=Math.cos(c),h=Math.sin(c),p=Math.cos(u),m=Math.sin(u),f=d*p,g=d*m,_=h*m,y=h*p,v=l,C=CesiumMath.TWO_PI,S=Math.cos(v),T=Math.sin(v);do{S=Math.cos(v),T=Math.sin(v);var x,b,E=g-y*S,P=Math.sqrt(p*p*T*T+E*E),A=_+f*S,w=Math.atan2(P,A),C=v,D=A-2*_/(b=0===P?(x=0,1):1-(x=f*T/P)*x);isNaN(D)&&(D=0),v=l+computeDeltaLambda(s,x,b,w,P,A,D)}while(Math.abs(v-C)>CesiumMath.EPSILON12);var M=b*(t*t-i*i)/(i*i),I=M*(256+M*(M*(74-47*M)-128))/1024,R=D*D,O=i*(1+M*(4096+M*(M*(320-175*M)-768))/16384)*(w-I*P*(D+I*(A*(2*R-1)-I*D*(4*P*P-3)*(4*R-3)/6)/4)),L=Math.atan2(p*T,g-y*S),F=Math.atan2(d*T,g*S-y);e._distance=O,e._startHeading=L,e._endHeading=F,e._uSquared=M}var scratchCart1$1=new Cartesian3,scratchCart2$1=new Cartesian3;function computeProperties$1(e,t,i,r){Cartesian3.normalize(r.cartographicToCartesian(t,scratchCart2$1),scratchCart1$1),Cartesian3.normalize(r.cartographicToCartesian(i,scratchCart2$1),scratchCart2$1);vincentyInverseFormula(e,r.maximumRadius,r.minimumRadius,t.longitude,t.latitude,i.longitude,i.latitude),e._start=Cartographic.clone(t,e._start),e._end=Cartographic.clone(i,e._end),e._start.height=0,e._end.height=0,setConstants(e)}function EllipsoidGeodesic(e,t,i){var r=defaultValue(i,Ellipsoid.WGS84);this._ellipsoid=r,this._start=new Cartographic,this._end=new Cartographic,this._constants={},this._startHeading=void 0,this._endHeading=void 0,this._distance=void 0,this._uSquared=void 0,defined(e)&&defined(t)&&computeProperties$1(this,e,t,r)}Object.defineProperties(EllipsoidGeodesic.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},startHeading:{get:function(){return this._startHeading}},endHeading:{get:function(){return this._endHeading}}}),EllipsoidGeodesic.prototype.setEndPoints=function(e,t){computeProperties$1(this,e,t,this._ellipsoid)},EllipsoidGeodesic.prototype.interpolateUsingFraction=function(e,t){return this.interpolateUsingSurfaceDistance(this._distance*e,t)},EllipsoidGeodesic.prototype.interpolateUsingSurfaceDistance=function(e,t){var i=this._constants,r=i.distanceRatio+e/i.b,n=Math.cos(2*r),a=Math.cos(4*r),o=Math.cos(6*r),s=Math.sin(2*r),l=Math.sin(4*r),c=Math.sin(6*r),u=Math.sin(8*r),d=r*r,h=r*d,p=i.u8Over256,m=i.u2Over4,f=i.u6Over64,g=i.u4Over16,_=2*h*p*n/3+r*(1-m+7*g/4-15*f/4+579*p/64-(g-15*f/4+187*p/16)*n-(5*f/4-115*p/16)*a-29*p*o/16)+(m/2-g+71*f/32-85*p/16)*s+(5*g/16-5*f/4+383*p/96)*l-d*((f-11*p/2)*s+5*p*l/2)+(29*f/96-29*p/16)*c+539*p*u/1536,y=Math.asin(Math.sin(_)*i.cosineAlpha),v=Math.atan(i.a/i.b*Math.tan(y));_-=i.sigma;var C=Math.cos(2*i.sigma+_),S=Math.sin(_),T=Math.cos(_),x=i.cosineU*T,b=i.sineU*S,E=Math.atan2(S*i.sineHeading,x-b*i.cosineHeading)-computeDeltaLambda(i.f,i.sineAlpha,i.cosineSquaredAlpha,_,S,T,C);return defined(t)?(t.longitude=this._start.longitude+E,t.latitude=v,t.height=0,t):new Cartographic(this._start.longitude+E,v,0)};var PolylinePipeline={numberOfPoints:function(e,t,i){var r=Cartesian3.distance(e,t);return Math.ceil(r/i)},numberOfPointsRhumbLine:function(e,t,i){var r=Math.pow(e.longitude-t.longitude,2)+Math.pow(e.latitude-t.latitude,2);return Math.max(1,Math.ceil(Math.sqrt(r/(i*i))))}},cartoScratch=new Cartographic;PolylinePipeline.extractHeights=function(e,t){for(var i=e.length,r=new Array(i),n=0;n<i;n++){var a=e[n];r[n]=t.cartesianToCartographic(a,cartoScratch).height}return r};var wrapLongitudeInversMatrix=new Matrix4,wrapLongitudeOrigin=new Cartesian3,wrapLongitudeXZNormal=new Cartesian3,wrapLongitudeXZPlane=new Plane(Cartesian3.UNIT_X,0),wrapLongitudeYZNormal=new Cartesian3,wrapLongitudeYZPlane=new Plane(Cartesian3.UNIT_X,0),wrapLongitudeIntersection=new Cartesian3,wrapLongitudeOffset=new Cartesian3,subdivideHeightsScratchArray=[];function subdivideHeights(e,t,i){var r=subdivideHeightsScratchArray;if(r.length=e,t===i){for(a=0;a<e;a++)r[a]=t;return r}for(var n=(i-t)/e,a=0;a<e;a++){var o=t+a*n;r[a]=o}return r}var carto1=new Cartographic,carto2=new Cartographic,cartesian=new Cartesian3,scaleFirst=new Cartesian3,scaleLast=new Cartesian3,ellipsoidGeodesic=new EllipsoidGeodesic,ellipsoidRhumb=new EllipsoidRhumbLine;function generateCartesianArc(e,t,i,r,n,a,o,s){var l=r.scaleToGeodeticSurface(e,scaleFirst),c=r.scaleToGeodeticSurface(t,scaleLast),u=PolylinePipeline.numberOfPoints(e,t,i),d=r.cartesianToCartographic(l,carto1),h=r.cartesianToCartographic(c,carto2),p=subdivideHeights(u,n,a);ellipsoidGeodesic.setEndPoints(d,h);var m=ellipsoidGeodesic.surfaceDistance/u,f=s;d.height=n;var g=r.cartographicToCartesian(d,cartesian);Cartesian3.pack(g,o,f),f+=3;for(var _=1;_<u;_++){var y=ellipsoidGeodesic.interpolateUsingSurfaceDistance(_*m,carto2);y.height=p[_],g=r.cartographicToCartesian(y,cartesian),Cartesian3.pack(g,o,f),f+=3}return f}function generateCartesianRhumbArc(e,t,i,r,n,a,o,s){var l=r.cartesianToCartographic(e,carto1),c=r.cartesianToCartographic(t,carto2),u=PolylinePipeline.numberOfPointsRhumbLine(l,c,i);l.height=0,c.height=0;var d=subdivideHeights(u,n,a);ellipsoidRhumb.ellipsoid.equals(r)||(ellipsoidRhumb=new EllipsoidRhumbLine(void 0,void 0,r)),ellipsoidRhumb.setEndPoints(l,c);var h=ellipsoidRhumb.surfaceDistance/u,p=s;l.height=n;var m=r.cartographicToCartesian(l,cartesian);Cartesian3.pack(m,o,p),p+=3;for(var f=1;f<u;f++){var g=ellipsoidRhumb.interpolateUsingSurfaceDistance(f*h,carto2);g.height=d[f],m=r.cartographicToCartesian(g,cartesian),Cartesian3.pack(m,o,p),p+=3}return p}PolylinePipeline.wrapLongitude=function(e,t){var i=[],r=[];if(defined(e)&&0<e.length){t=defaultValue(t,Matrix4.IDENTITY);var n=Matrix4.inverseTransformation(t,wrapLongitudeInversMatrix),a=Matrix4.multiplyByPoint(n,Cartesian3.ZERO,wrapLongitudeOrigin),o=Cartesian3.normalize(Matrix4.multiplyByPointAsVector(n,Cartesian3.UNIT_Y,wrapLongitudeXZNormal),wrapLongitudeXZNormal),s=Plane.fromPointNormal(a,o,wrapLongitudeXZPlane),l=Cartesian3.normalize(Matrix4.multiplyByPointAsVector(n,Cartesian3.UNIT_X,wrapLongitudeYZNormal),wrapLongitudeYZNormal),c=Plane.fromPointNormal(a,l,wrapLongitudeYZPlane),u=1;i.push(Cartesian3.clone(e[0]));for(var d=i[0],h=e.length,p=1;p<h;++p){var m,f,g=e[p];!(Plane.getPointDistance(c,d)<0||Plane.getPointDistance(c,g)<0)||defined(m=IntersectionTests.lineSegmentPlane(d,g,s,wrapLongitudeIntersection))&&(f=Cartesian3.multiplyByScalar(o,5e-9,wrapLongitudeOffset),Plane.getPointDistance(s,d)<0&&Cartesian3.negate(f,f),i.push(Cartesian3.add(m,f,new Cartesian3)),r.push(u+1),Cartesian3.negate(f,f),i.push(Cartesian3.add(m,f,new Cartesian3)),u=1),i.push(Cartesian3.clone(e[p])),u++,d=g}r.push(u)}return{positions:i,lengths:r}},PolylinePipeline.generateArc=function(e){defined(e)||(e={});var t=e.positions,i=t.length,r=defaultValue(e.ellipsoid,Ellipsoid.WGS84),n=defaultValue(e.height,0),a=Array.isArray(n);if(i<1)return[];if(1===i){var o,s=r.scaleToGeodeticSurface(t[0],scaleFirst);return 0!==(n=a?n[0]:n)&&(o=r.geodeticSurfaceNormal(s,cartesian),Cartesian3.multiplyByScalar(o,n,o),Cartesian3.add(s,o,s)),[s.x,s.y,s.z]}var l,c=e.minDistance;defined(c)||(l=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),c=CesiumMath.chordLength(l,r.maximumRadius));for(var u=0,d=0;d<i-1;d++)u+=PolylinePipeline.numberOfPoints(t[d],t[d+1],c);var h=3*(u+1),p=new Array(h),m=0;for(d=0;d<i-1;d++)m=generateCartesianArc(t[d],t[d+1],c,r,a?n[d]:n,a?n[d+1]:n,p,m);subdivideHeightsScratchArray.length=0;var f=t[i-1],g=r.cartesianToCartographic(f,carto1);g.height=a?n[i-1]:n;var _=r.cartographicToCartesian(g,cartesian);return Cartesian3.pack(_,p,h-3),p};var scratchCartographic0$1=new Cartographic,scratchCartographic1$1=new Cartographic;PolylinePipeline.generateRhumbArc=function(e){defined(e)||(e={});var t=e.positions,i=t.length,r=defaultValue(e.ellipsoid,Ellipsoid.WGS84),n=defaultValue(e.height,0),a=Array.isArray(n);if(i<1)return[];if(1===i){var o,s=r.scaleToGeodeticSurface(t[0],scaleFirst);return 0!==(n=a?n[0]:n)&&(o=r.geodeticSurfaceNormal(s,cartesian),Cartesian3.multiplyByScalar(o,n,o),Cartesian3.add(s,o,s)),[s.x,s.y,s.z]}for(var l,c=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),u=0,d=r.cartesianToCartographic(t[0],scratchCartographic0$1),h=0;h<i-1;h++)l=r.cartesianToCartographic(t[h+1],scratchCartographic1$1),u+=PolylinePipeline.numberOfPointsRhumbLine(d,l,c),d=Cartographic.clone(l,scratchCartographic0$1);var p=3*(u+1),m=new Array(p),f=0;for(h=0;h<i-1;h++)f=generateCartesianRhumbArc(t[h],t[h+1],c,r,a?n[h]:n,a?n[h+1]:n,m,f);subdivideHeightsScratchArray.length=0;var g=t[i-1],_=r.cartesianToCartographic(g,carto1);_.height=a?n[i-1]:n;var y=r.cartographicToCartesian(_,cartesian);return Cartesian3.pack(y,m,p-3),m},PolylinePipeline.generateCartesianArc=function(e){for(var t=PolylinePipeline.generateArc(e),i=t.length/3,r=new Array(i),n=0;n<i;n++)r[n]=Cartesian3.unpack(t,3*n);return r},PolylinePipeline.generateCartesianRhumbArc=function(e){for(var t=PolylinePipeline.generateRhumbArc(e),i=t.length/3,r=new Array(i),n=0;n<i;n++)r[n]=Cartesian3.unpack(t,3*n);return r};var scratch2Array=[new Cartesian3,new Cartesian3],scratchCartesian1$5=new Cartesian3,scratchCartesian2$5=new Cartesian3,scratchCartesian3$6=new Cartesian3,scratchCartesian4$2=new Cartesian3,scratchCartesian5$1=new Cartesian3,scratchCartesian6$1=new Cartesian3,scratchCartesian7=new Cartesian3,scratchCartesian8=new Cartesian3,scratchCartesian9=new Cartesian3,scratch1=new Cartesian3,scratch2=new Cartesian3,PolylineVolumeGeometryLibrary={},cartographic=new Cartographic;function scaleToSurface(e,t){for(var i=new Array(e.length),r=0;r<e.length;r++){var n=e[r];cartographic=t.cartesianToCartographic(n,cartographic),i[r]=cartographic.height,e[r]=t.scaleToGeodeticSurface(n,n)}return i}function subdivideHeights$1(e,t,i,r){var n=e[0],a=e[1],o=Cartesian3.angleBetween(n,a),s=Math.ceil(o/r),l=new Array(s);if(t===i){for(u=0;u<s;u++)l[u]=t;return l.push(i),l}for(var c=(i-t)/s,u=1;u<s;u++){var d=t+u*c;l[u]=d}return l[0]=t,l.push(i),l}var nextScratch=new Cartesian3,prevScratch=new Cartesian3;function computeRotationAngle(e,t,i,r){var n=new EllipsoidTangentPlane(i,r),a=n.projectPointOntoPlane(Cartesian3.add(i,e,nextScratch),nextScratch),o=n.projectPointOntoPlane(Cartesian3.add(i,t,prevScratch),prevScratch),s=Cartesian2.angleBetween(a,o);return 0<=o.x*a.y-o.y*a.x?-s:s}var negativeX=new Cartesian3(-1,0,0),transform=new Matrix4,translation=new Matrix4,rotationZ=new Matrix3,scaleMatrix=Matrix3.IDENTITY.clone(),westScratch$1=new Cartesian3,finalPosScratch=new Cartesian4,heightCartesian=new Cartesian3;function addPosition(e,t,i,r,n,a,o,s){var l=westScratch$1,c=finalPosScratch;transform=Transforms.eastNorthUpToFixedFrame(e,n,transform),l=Matrix4.multiplyByPointAsVector(transform,negativeX,l);var u=computeRotationAngle(Cartesian3.normalize(l,l),t,e,n);rotationZ=Matrix3.fromRotationZ(u,rotationZ),heightCartesian.z=a,transform=Matrix4.multiplyTransformation(transform,Matrix4.fromRotationTranslation(rotationZ,heightCartesian,translation),transform);var d=scaleMatrix;d[0]=o;for(var h=0;h<s;h++)for(var p=0;p<i.length;p+=3)c=Cartesian3.fromArray(i,p,c),c=Matrix3.multiplyByVector(d,c,c),c=Matrix4.multiplyByPoint(transform,c,c),r.push(c.x,c.y,c.z);return r}var centerScratch$1=new Cartesian3;function addPositions(e,t,i,r,n,a,o){for(var s=0;s<e.length;s+=3){r=addPosition(Cartesian3.fromArray(e,s,centerScratch$1),t,i,r,n,a[s/3],o,1)}return r}function convertShapeTo3DDuplicate(e,t){var i=e.length,r=new Array(6*i),n=0,a=t.x+t.width/2,o=t.y+t.height/2,s=e[0];r[n++]=s.x-a,r[n++]=0,r[n++]=s.y-o;for(var l=1;l<i;l++){var c=(s=e[l]).x-a,u=s.y-o;r[n++]=c,r[n++]=0,r[n++]=u,r[n++]=c,r[n++]=0,r[n++]=u}return s=e[0],r[n++]=s.x-a,r[n++]=0,r[n++]=s.y-o,r}function convertShapeTo3D(e,t){for(var i=e.length,r=new Array(3*i),n=0,a=t.x+t.width/2,o=t.y+t.height/2,s=0;s<i;s++)r[n++]=e[s].x-a,r[n++]=0,r[n++]=e[s].y-o;return r}var quaterion=new Quaternion,startPointScratch=new Cartesian3,rotMatrix=new Matrix3;function computeRoundCorner(e,t,i,r,n,a,o,s,l,c){var u,d=Cartesian3.angleBetween(Cartesian3.subtract(t,e,scratch1),Cartesian3.subtract(i,e,scratch2)),h=r===CornerType$1.BEVELED?0:Math.ceil(d/CesiumMath.toRadians(5)),p=n?Matrix3.fromQuaternion(Quaternion.fromAxisAngle(Cartesian3.negate(e,scratch1),d/(h+1),quaterion),rotMatrix):Matrix3.fromQuaternion(Quaternion.fromAxisAngle(e,d/(h+1),quaterion),rotMatrix);if(t=Cartesian3.clone(t,startPointScratch),0<h)for(var m=c?2:1,f=0;f<h;f++)t=Matrix3.multiplyByVector(p,t,t),u=Cartesian3.subtract(t,e,scratch1),u=Cartesian3.normalize(u,u),n||(u=Cartesian3.negate(u,u)),o=addPosition(a.scaleToGeodeticSurface(t,scratch2),u,s,o,a,l,1,m);else u=Cartesian3.subtract(t,e,scratch1),u=Cartesian3.normalize(u,u),n||(u=Cartesian3.negate(u,u)),o=addPosition(a.scaleToGeodeticSurface(t,scratch2),u,s,o,a,l,1,1),i=Cartesian3.clone(i,startPointScratch),u=Cartesian3.subtract(i,e,scratch1),u=Cartesian3.normalize(u,u),n||(u=Cartesian3.negate(u,u)),o=addPosition(a.scaleToGeodeticSurface(i,scratch2),u,s,o,a,l,1,1);return o}PolylineVolumeGeometryLibrary.removeDuplicatesFromShape=function(e){for(var t=e.length,i=[],r=t-1,n=0;n<t;r=n++){var a=e[r],o=e[n];Cartesian2.equals(a,o)||i.push(o)}return i},PolylineVolumeGeometryLibrary.angleIsGreaterThanPi=function(e,t,i,r){var n=new EllipsoidTangentPlane(i,r),a=n.projectPointOntoPlane(Cartesian3.add(i,e,nextScratch),nextScratch),o=n.projectPointOntoPlane(Cartesian3.add(i,t,prevScratch),prevScratch);return 0<=o.x*a.y-o.y*a.x};var scratchForwardProjection=new Cartesian3,scratchBackwardProjection=new Cartesian3;PolylineVolumeGeometryLibrary.computePositions=function(e,t,i,r,n){var a=r._ellipsoid,o=scaleToSurface(e,a),s=r._granularity,l=r._cornerType,c=(n?convertShapeTo3DDuplicate:convertShapeTo3D)(t,i),u=n?convertShapeTo3D(t,i):void 0,d=i.height/2,h=i.width/2,p=e.length,m=[],f=n?[]:void 0,g=scratchCartesian1$5,_=scratchCartesian2$5,y=scratchCartesian3$6,v=scratchCartesian4$2,C=scratchCartesian5$1,S=scratchCartesian6$1,T=scratchCartesian7,x=scratchCartesian8,b=scratchCartesian9,E=e[0],P=e[1],v=a.geodeticSurfaceNormal(E,v);g=Cartesian3.subtract(P,E,g),g=Cartesian3.normalize(g,g),x=Cartesian3.cross(v,g,x),x=Cartesian3.normalize(x,x);var A,w=o[0],D=o[1];n&&(f=addPosition(E,x,u,f,a,w+d,1,1)),b=Cartesian3.clone(E,b),E=P,_=Cartesian3.negate(g,_);for(var M=1;M<p-1;M++){var I=n?2:1,P=e[M+1],g=Cartesian3.subtract(P,E,g);g=Cartesian3.normalize(g,g),y=Cartesian3.add(g,_,y),y=Cartesian3.normalize(y,y),v=a.geodeticSurfaceNormal(E,v);var R=Cartesian3.multiplyByScalar(v,Cartesian3.dot(g,v),scratchForwardProjection);Cartesian3.subtract(g,R,R),Cartesian3.normalize(R,R);var O,L,F=Cartesian3.multiplyByScalar(v,Cartesian3.dot(_,v),scratchBackwardProjection);Cartesian3.subtract(_,F,F),Cartesian3.normalize(F,F),!CesiumMath.equalsEpsilon(Math.abs(Cartesian3.dot(R,F)),1,CesiumMath.EPSILON7)?(y=Cartesian3.cross(y,v,y),y=Cartesian3.cross(v,y,y),y=Cartesian3.normalize(y,y),O=1/Math.max(.25,Cartesian3.magnitude(Cartesian3.cross(y,_,scratch1))),(L=PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(g,_,E,a))?(C=Cartesian3.add(E,Cartesian3.multiplyByScalar(y,O*h,y),C),S=Cartesian3.add(C,Cartesian3.multiplyByScalar(x,h,S),S),scratch2Array[0]=Cartesian3.clone(b,scratch2Array[0]),scratch2Array[1]=Cartesian3.clone(S,scratch2Array[1]),A=subdivideHeights$1(scratch2Array,w+d,D+d,s),m=addPositions(PolylinePipeline.generateArc({positions:scratch2Array,granularity:s,ellipsoid:a}),x,c,m,a,A,1),x=Cartesian3.cross(v,g,x),x=Cartesian3.normalize(x,x),T=Cartesian3.add(C,Cartesian3.multiplyByScalar(x,h,T),T),l===CornerType$1.ROUNDED||l===CornerType$1.BEVELED?computeRoundCorner(C,S,T,l,L,a,m,c,D+d,n):m=addPosition(E,y=Cartesian3.negate(y,y),c,m,a,D+d,O,I)):(C=Cartesian3.add(E,Cartesian3.multiplyByScalar(y,O*h,y),C),S=Cartesian3.add(C,Cartesian3.multiplyByScalar(x,-h,S),S),scratch2Array[0]=Cartesian3.clone(b,scratch2Array[0]),scratch2Array[1]=Cartesian3.clone(S,scratch2Array[1]),A=subdivideHeights$1(scratch2Array,w+d,D+d,s),m=addPositions(PolylinePipeline.generateArc({positions:scratch2Array,granularity:s,ellipsoid:a}),x,c,m,a,A,1),x=Cartesian3.cross(v,g,x),x=Cartesian3.normalize(x,x),T=Cartesian3.add(C,Cartesian3.multiplyByScalar(x,-h,T),T),l===CornerType$1.ROUNDED||l===CornerType$1.BEVELED?computeRoundCorner(C,S,T,l,L,a,m,c,D+d,n):m=addPosition(E,y,c,m,a,D+d,O,I)),b=Cartesian3.clone(T,b),_=Cartesian3.negate(g,_)):(m=addPosition(b,x,c,m,a,w+d,1,1),b=E),w=D,D=o[M+1],E=P}scratch2Array[0]=Cartesian3.clone(b,scratch2Array[0]),scratch2Array[1]=Cartesian3.clone(E,scratch2Array[1]),A=subdivideHeights$1(scratch2Array,w+d,D+d,s),m=addPositions(PolylinePipeline.generateArc({positions:scratch2Array,granularity:s,ellipsoid:a}),x,c,m,a,A,1),n&&(f=addPosition(E,x,u,f,a,D+d,1,1)),p=m.length;var N=n?p+f.length:p,B=new Float64Array(N);return B.set(m),n&&B.set(f,p),B};var CorridorGeometryLibrary={},scratch1$1=new Cartesian3,scratch2$1=new Cartesian3,scratch3=new Cartesian3,scratch4=new Cartesian3,scaleArray2=[new Cartesian3,new Cartesian3],cartesian1=new Cartesian3,cartesian2=new Cartesian3,cartesian3=new Cartesian3,cartesian4=new Cartesian3,cartesian5=new Cartesian3,cartesian6=new Cartesian3,cartesian7=new Cartesian3,cartesian8=new Cartesian3,cartesian9=new Cartesian3,cartesian10=new Cartesian3,quaterion$1=new Quaternion,rotMatrix$1=new Matrix3;function computeRoundCorner$1(e,t,i,r,n){var a,o=Cartesian3.angleBetween(Cartesian3.subtract(t,e,scratch1$1),Cartesian3.subtract(i,e,scratch2$1)),s=r===CornerType$1.BEVELED?1:Math.ceil(o/CesiumMath.toRadians(5))+1,l=3*s,c=new Array(l);c[l-3]=i.x,c[l-2]=i.y,c[l-1]=i.z,a=n?Matrix3.fromQuaternion(Quaternion.fromAxisAngle(Cartesian3.negate(e,scratch1$1),o/s,quaterion$1),rotMatrix$1):Matrix3.fromQuaternion(Quaternion.fromAxisAngle(e,o/s,quaterion$1),rotMatrix$1);var u=0;t=Cartesian3.clone(t,scratch1$1);for(var d=0;d<s;d++)t=Matrix3.multiplyByVector(a,t,t),c[u++]=t.x,c[u++]=t.y,c[u++]=t.z;return c}function addEndCaps(e){var t=cartesian1,i=cartesian2,r=cartesian3,n=e[1],i=Cartesian3.fromArray(e[1],n.length-3,i),r=Cartesian3.fromArray(e[0],0,r),a=computeRoundCorner$1(t=Cartesian3.midpoint(i,r,t),i,r,CornerType$1.ROUNDED,!1),o=e.length-1,s=e[o-1],n=e[o];return i=Cartesian3.fromArray(s,s.length-3,i),r=Cartesian3.fromArray(n,0,r),[a,computeRoundCorner$1(t=Cartesian3.midpoint(i,r,t),i,r,CornerType$1.ROUNDED,!1)]}function computeMiteredCorner(e,t,i,r){var n=scratch1$1;return[(n=(r||(t=Cartesian3.negate(t,t)),Cartesian3.add(e,t,n))).x,n.y,n.z,i.x,i.y,i.z]}function addShiftedPositions(e,t,i,r){for(var n=new Array(e.length),a=new Array(e.length),o=Cartesian3.multiplyByScalar(t,i,scratch1$1),s=Cartesian3.negate(o,scratch2$1),l=0,c=e.length-1,u=0;u<e.length;u+=3){var d=Cartesian3.fromArray(e,u,scratch3),h=Cartesian3.add(d,s,scratch4);n[l++]=h.x,n[l++]=h.y,n[l++]=h.z;var p=Cartesian3.add(d,o,scratch4);a[c--]=p.z,a[c--]=p.y,a[c--]=p.x}return r.push(n,a),r}CorridorGeometryLibrary.addAttribute=function(e,t,i,r){var n=t.x,a=t.y,o=t.z;defined(i)&&(e[i]=n,e[i+1]=a,e[i+2]=o),defined(r)&&(e[r]=o,e[r-1]=a,e[r-2]=n)};var scratchForwardProjection$1=new Cartesian3,scratchBackwardProjection$1=new Cartesian3;CorridorGeometryLibrary.computePositions=function(e){var t=e.granularity,i=e.positions,r=e.ellipsoid,n=e.width/2,a=e.cornerType,o=e.saveAttributes,s=cartesian1,l=cartesian2,c=cartesian3,u=cartesian4,d=cartesian5,h=cartesian6,p=cartesian7,m=cartesian8,f=cartesian9,g=cartesian10,_=[],y=o?[]:void 0,v=o?[]:void 0,C=i[0],S=i[1],l=Cartesian3.normalize(Cartesian3.subtract(S,C,l),l),s=r.geodeticSurfaceNormal(C,s),u=Cartesian3.normalize(Cartesian3.cross(s,l,u),u);o&&(y.push(u.x,u.y,u.z),v.push(s.x,s.y,s.z)),p=Cartesian3.clone(C,p),C=S,c=Cartesian3.negate(l,c);for(var T,x=[],b=i.length,E=1;E<b-1;E++){s=r.geodeticSurfaceNormal(C,s),S=i[E+1],l=Cartesian3.normalize(Cartesian3.subtract(S,C,l),l),d=Cartesian3.normalize(Cartesian3.add(l,c,d),d);var P=Cartesian3.multiplyByScalar(s,Cartesian3.dot(l,s),scratchForwardProjection$1);Cartesian3.subtract(l,P,P),Cartesian3.normalize(P,P);var A,w,D=Cartesian3.multiplyByScalar(s,Cartesian3.dot(c,s),scratchBackwardProjection$1);Cartesian3.subtract(c,D,D),Cartesian3.normalize(D,D),CesiumMath.equalsEpsilon(Math.abs(Cartesian3.dot(P,D)),1,CesiumMath.EPSILON7)||(d=Cartesian3.cross(d,s,d),d=Cartesian3.cross(s,d,d),d=Cartesian3.normalize(d,d),A=n/Math.max(.25,Cartesian3.magnitude(Cartesian3.cross(d,c,scratch1$1))),w=PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(l,c,C,r),d=Cartesian3.multiplyByScalar(d,A,d),w?(m=Cartesian3.add(C,d,m),g=Cartesian3.add(m,Cartesian3.multiplyByScalar(u,n,g),g),f=Cartesian3.add(m,Cartesian3.multiplyByScalar(u,2*n,f),f),scaleArray2[0]=Cartesian3.clone(p,scaleArray2[0]),scaleArray2[1]=Cartesian3.clone(g,scaleArray2[1]),_=addShiftedPositions(PolylinePipeline.generateArc({positions:scaleArray2,granularity:t,ellipsoid:r}),u,n,_),o&&(y.push(u.x,u.y,u.z),v.push(s.x,s.y,s.z)),h=Cartesian3.clone(f,h),u=Cartesian3.normalize(Cartesian3.cross(s,l,u),u),f=Cartesian3.add(m,Cartesian3.multiplyByScalar(u,2*n,f),f),p=Cartesian3.add(m,Cartesian3.multiplyByScalar(u,n,p),p),a===CornerType$1.ROUNDED||a===CornerType$1.BEVELED?x.push({leftPositions:computeRoundCorner$1(m,h,f,a,w)}):x.push({leftPositions:computeMiteredCorner(C,Cartesian3.negate(d,d),f,w)})):(f=Cartesian3.add(C,d,f),g=Cartesian3.add(f,Cartesian3.negate(Cartesian3.multiplyByScalar(u,n,g),g),g),m=Cartesian3.add(f,Cartesian3.negate(Cartesian3.multiplyByScalar(u,2*n,m),m),m),scaleArray2[0]=Cartesian3.clone(p,scaleArray2[0]),scaleArray2[1]=Cartesian3.clone(g,scaleArray2[1]),_=addShiftedPositions(PolylinePipeline.generateArc({positions:scaleArray2,granularity:t,ellipsoid:r}),u,n,_),o&&(y.push(u.x,u.y,u.z),v.push(s.x,s.y,s.z)),h=Cartesian3.clone(m,h),u=Cartesian3.normalize(Cartesian3.cross(s,l,u),u),m=Cartesian3.add(f,Cartesian3.negate(Cartesian3.multiplyByScalar(u,2*n,m),m),m),p=Cartesian3.add(f,Cartesian3.negate(Cartesian3.multiplyByScalar(u,n,p),p),p),a===CornerType$1.ROUNDED||a===CornerType$1.BEVELED?x.push({rightPositions:computeRoundCorner$1(f,h,m,a,w)}):x.push({rightPositions:computeMiteredCorner(C,d,m,w)})),c=Cartesian3.negate(l,c)),C=S}return s=r.geodeticSurfaceNormal(C,s),scaleArray2[0]=Cartesian3.clone(p,scaleArray2[0]),scaleArray2[1]=Cartesian3.clone(C,scaleArray2[1]),_=addShiftedPositions(PolylinePipeline.generateArc({positions:scaleArray2,granularity:t,ellipsoid:r}),u,n,_),o&&(y.push(u.x,u.y,u.z),v.push(s.x,s.y,s.z)),a===CornerType$1.ROUNDED&&(T=addEndCaps(_)),{positions:_,corners:x,lefts:y,normals:v,endPositions:T}};var cartesian1$1=new Cartesian3,cartesian2$1=new Cartesian3,cartesian3$1=new Cartesian3,cartesian4$1=new Cartesian3,cartesian5$1=new Cartesian3,cartesian6$1=new Cartesian3,scratch1$2=new Cartesian3,scratch2$2=new Cartesian3;function scaleToSurface$1(e,t){for(var i=0;i<e.length;i++)e[i]=t.scaleToGeodeticSurface(e[i],e[i]);return e}function addNormals(e,t,i,r,n,a){var o=e.normals,s=e.tangents,l=e.bitangents,c=Cartesian3.normalize(Cartesian3.cross(i,t,scratch1$2),scratch1$2);a.normal&&CorridorGeometryLibrary.addAttribute(o,t,r,n),a.tangent&&CorridorGeometryLibrary.addAttribute(s,c,r,n),a.bitangent&&CorridorGeometryLibrary.addAttribute(l,i,r,n)}function combine$1(e,t,i){var r,n=e.positions,a=e.corners,o=e.endPositions,s=e.lefts,l=e.normals,c=new GeometryAttributes,u=0,d=0,h=0;for(O=0;O<n.length;O+=2)u+=r=n[O].length-3,h+=2*r,d+=n[O+1].length-3;for(u+=3,d+=3,O=0;O<a.length;O++){$=a[O];var p=a[O].leftPositions;defined(p)?u+=r=p.length:d+=r=a[O].rightPositions.length,h+=r}var m,f=defined(o);f&&(u+=m=o[0].length-3,d+=m,h+=6*(m/=3));var g,_,y,v,C,S,T=u+d,x=new Float64Array(T),b={normals:t.normal?new Float32Array(T):void 0,tangents:t.tangent?new Float32Array(T):void 0,bitangents:t.bitangent?new Float32Array(T):void 0},E=0,P=T-1,A=cartesian1$1,w=cartesian2$1,D=m/2,M=IndexDatatype$1.createTypedArray(T/3,h),I=0;if(f){S=cartesian3$1,C=cartesian4$1;for(var R=o[0],A=Cartesian3.fromArray(l,0,A),w=Cartesian3.fromArray(s,0,w),O=0;O<D;O++)S=Cartesian3.fromArray(R,3*(D-1-O),S),C=Cartesian3.fromArray(R,3*(D+O),C),CorridorGeometryLibrary.addAttribute(x,C,E),CorridorGeometryLibrary.addAttribute(x,S,void 0,P),addNormals(b,A,w,E,P,t),v=(_=E/3)+1,y=(g=(P-2)/3)-1,M[I++]=g,M[I++]=_,M[I++]=y,M[I++]=y,M[I++]=_,M[I++]=v,E+=3,P-=3}var L,F,N=0,B=0,V=n[N++],k=n[N++];for(x.set(V,E),x.set(k,P-k.length+1),w=Cartesian3.fromArray(s,B,w),r=k.length-3,O=0;O<r;O+=3)L=i.geodeticSurfaceNormal(Cartesian3.fromArray(V,O,scratch1$2),scratch1$2),F=i.geodeticSurfaceNormal(Cartesian3.fromArray(k,r-O,scratch2$2),scratch2$2),addNormals(b,A=Cartesian3.normalize(Cartesian3.add(L,F,A),A),w,E,P,t),v=(_=E/3)+1,y=(g=(P-2)/3)-1,M[I++]=g,M[I++]=_,M[I++]=y,M[I++]=y,M[I++]=_,M[I++]=v,E+=3,P-=3;for(L=i.geodeticSurfaceNormal(Cartesian3.fromArray(V,r,scratch1$2),scratch1$2),F=i.geodeticSurfaceNormal(Cartesian3.fromArray(k,r,scratch2$2),scratch2$2),A=Cartesian3.normalize(Cartesian3.add(L,F,A),A),B+=3,O=0;O<a.length;O++){var z,$,U,G,H=($=a[O]).leftPositions,W=$.rightPositions,q=cartesian6$1,j=cartesian3$1,Y=cartesian4$1;if(A=Cartesian3.fromArray(l,B,A),defined(H)){for(addNormals(b,A,w,void 0,P,t),P-=3,U=v,G=y,z=0;z<H.length/3;z++)q=Cartesian3.fromArray(H,3*z,q),M[I++]=U,M[I++]=G-z-1,M[I++]=G-z,CorridorGeometryLibrary.addAttribute(x,q,void 0,P),j=Cartesian3.fromArray(x,3*(G-z-1),j),Y=Cartesian3.fromArray(x,3*U,Y),addNormals(b,A,w=Cartesian3.normalize(Cartesian3.subtract(j,Y,w),w),void 0,P,t),P-=3;q=Cartesian3.fromArray(x,3*U,q),j=Cartesian3.subtract(Cartesian3.fromArray(x,3*G,j),q,j),Y=Cartesian3.subtract(Cartesian3.fromArray(x,3*(G-z),Y),q,Y),addNormals(b,A,w=Cartesian3.normalize(Cartesian3.add(j,Y,w),w),E,void 0,t),E+=3}else{for(addNormals(b,A,w,E,void 0,t),E+=3,U=y,G=v,z=0;z<W.length/3;z++)q=Cartesian3.fromArray(W,3*z,q),M[I++]=U,M[I++]=G+z,M[I++]=G+z+1,CorridorGeometryLibrary.addAttribute(x,q,E),j=Cartesian3.fromArray(x,3*U,j),Y=Cartesian3.fromArray(x,3*(G+z),Y),addNormals(b,A,w=Cartesian3.normalize(Cartesian3.subtract(j,Y,w),w),E,void 0,t),E+=3;q=Cartesian3.fromArray(x,3*U,q),j=Cartesian3.subtract(Cartesian3.fromArray(x,3*(G+z),j),q,j),Y=Cartesian3.subtract(Cartesian3.fromArray(x,3*G,Y),q,Y),addNormals(b,A,w=Cartesian3.normalize(Cartesian3.negate(Cartesian3.add(Y,j,w),w),w),void 0,P,t),P-=3}for(V=n[N++],k=n[N++],V.splice(0,3),k.splice(k.length-3,3),x.set(V,E),x.set(k,P-k.length+1),r=k.length-3,B+=3,w=Cartesian3.fromArray(s,B,w),z=0;z<k.length;z+=3)L=i.geodeticSurfaceNormal(Cartesian3.fromArray(V,z,scratch1$2),scratch1$2),F=i.geodeticSurfaceNormal(Cartesian3.fromArray(k,r-z,scratch2$2),scratch2$2),addNormals(b,A=Cartesian3.normalize(Cartesian3.add(L,F,A),A),w,E,P,t),_=(v=E/3)-1,g=(y=(P-2)/3)+1,M[I++]=g,M[I++]=_,M[I++]=y,M[I++]=y,M[I++]=_,M[I++]=v,E+=3,P-=3;E-=3,P+=3}if(addNormals(b,A=Cartesian3.fromArray(l,l.length-3,A),w,E,P,t),f){E+=3,P-=3,S=cartesian3$1,C=cartesian4$1;var X=o[1];for(O=0;O<D;O++)S=Cartesian3.fromArray(X,3*(m-O-1),S),C=Cartesian3.fromArray(X,3*O,C),CorridorGeometryLibrary.addAttribute(x,S,void 0,P),CorridorGeometryLibrary.addAttribute(x,C,E),addNormals(b,A,w,E,P,t),_=(v=E/3)-1,g=(y=(P-2)/3)+1,M[I++]=g,M[I++]=_,M[I++]=y,M[I++]=y,M[I++]=_,M[I++]=v,E+=3,P-=3}if(c.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:x}),t.st){var Q=new Float32Array(T/3*2),J=0;if(f){u/=3,d/=3;var Z,K=Math.PI/(m+1),ee=1/(u-m+1),te=1/(d-m+1),ie=m/2;for(O=1+ie;O<m+1;O++)Z=CesiumMath.PI_OVER_TWO+K*O,Q[J++]=te*(1+Math.cos(Z)),Q[J++]=.5*(1+Math.sin(Z));for(O=1;O<d-m+1;O++)Q[J++]=O*te,Q[J++]=0;for(O=m;ie<O;O--)Z=CesiumMath.PI_OVER_TWO-O*K,Q[J++]=1-te*(1+Math.cos(Z)),Q[J++]=.5*(1+Math.sin(Z));for(O=ie;0<O;O--)Z=CesiumMath.PI_OVER_TWO-K*O,Q[J++]=1-ee*(1+Math.cos(Z)),Q[J++]=.5*(1+Math.sin(Z));for(O=u-m;0<O;O--)Q[J++]=O*ee,Q[J++]=1;for(O=1;O<1+ie;O++)Z=CesiumMath.PI_OVER_TWO+K*O,Q[J++]=ee*(1+Math.cos(Z)),Q[J++]=.5*(1+Math.sin(Z))}else{for(ee=1/((u/=3)-1),te=1/((d/=3)-1),O=0;O<d;O++)Q[J++]=O*te,Q[J++]=0;for(O=u;0<O;O--)Q[J++]=(O-1)*ee,Q[J++]=1}c.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:Q})}return t.normal&&(c.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:b.normals})),t.tangent&&(c.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:b.tangents})),t.bitangent&&(c.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:b.bitangents})),{attributes:c,indices:M}}function extrudedAttributes(e,t){if(!(t.normal||t.tangent||t.bitangent||t.st))return e;var i,r,n=e.position.values;(t.normal||t.bitangent)&&(i=e.normal.values,r=e.bitangent.values);var a=e.position.values.length/18,o=3*a,s=2*a,l=2*o;if(t.normal||t.bitangent||t.tangent){for(var c,u=t.normal?new Float32Array(6*o):void 0,d=t.tangent?new Float32Array(6*o):void 0,h=t.bitangent?new Float32Array(6*o):void 0,p=cartesian1$1,m=cartesian2$1,f=cartesian3$1,g=cartesian4$1,_=cartesian5$1,y=cartesian6$1,v=l,C=0;C<o;C+=3){var S=v+l,p=Cartesian3.fromArray(n,C,p),m=Cartesian3.fromArray(n,C+o,m),f=Cartesian3.fromArray(n,(C+3)%o,f);m=Cartesian3.subtract(m,p,m),f=Cartesian3.subtract(f,p,f),g=Cartesian3.normalize(Cartesian3.cross(m,f,g),g),t.normal&&(CorridorGeometryLibrary.addAttribute(u,g,S),CorridorGeometryLibrary.addAttribute(u,g,S+3),CorridorGeometryLibrary.addAttribute(u,g,v),CorridorGeometryLibrary.addAttribute(u,g,v+3)),(t.tangent||t.bitangent)&&(y=Cartesian3.fromArray(i,C,y),t.bitangent&&(CorridorGeometryLibrary.addAttribute(h,y,S),CorridorGeometryLibrary.addAttribute(h,y,S+3),CorridorGeometryLibrary.addAttribute(h,y,v),CorridorGeometryLibrary.addAttribute(h,y,v+3)),t.tangent&&(_=Cartesian3.normalize(Cartesian3.cross(y,g,_),_),CorridorGeometryLibrary.addAttribute(d,_,S),CorridorGeometryLibrary.addAttribute(d,_,S+3),CorridorGeometryLibrary.addAttribute(d,_,v),CorridorGeometryLibrary.addAttribute(d,_,v+3))),v+=6}if(t.normal){for(u.set(i),C=0;C<o;C+=3)u[C+o]=-i[C],u[C+o+1]=-i[C+1],u[C+o+2]=-i[C+2];e.normal.values=u}else e.normal=void 0;t.bitangent?(h.set(r),h.set(r,o),e.bitangent.values=h):e.bitangent=void 0,t.tangent&&(c=e.tangent.values,d.set(c),d.set(c,o),e.tangent.values=d)}if(t.st){var T=e.st.values,x=new Float32Array(6*s);x.set(T),x.set(T,s);for(var b=2*s,E=0;E<2;E++){for(x[b++]=T[0],x[b++]=T[1],C=2;C<s;C+=2){var P=T[C],A=T[C+1];x[b++]=P,x[b++]=A,x[b++]=P,x[b++]=A}x[b++]=T[0],x[b++]=T[1]}e.st.values=x}return e}function addWallPositions(e,t,i){i[t++]=e[0],i[t++]=e[1],i[t++]=e[2];for(var r=3;r<e.length;r+=3){var n=e[r],a=e[r+1],o=e[r+2];i[t++]=n,i[t++]=a,i[t++]=o,i[t++]=n,i[t++]=a,i[t++]=o}return i[t++]=e[0],i[t++]=e[1],i[t++]=e[2],i}function computePositionsExtruded(e,t){var i=new VertexFormat({position:t.position,normal:t.normal||t.bitangent||e.shadowVolume,tangent:t.tangent,bitangent:t.normal||t.bitangent,st:t.st}),r=e.ellipsoid,n=combine$1(CorridorGeometryLibrary.computePositions(e),i,r),a=e.height,o=e.extrudedHeight,s=n.attributes,l=n.indices,c=s.position.values,u=c.length,d=new Float64Array(6*u),h=new Float64Array(u);h.set(c);var p=new Float64Array(4*u),p=addWallPositions(c=PolygonPipeline.scaleToGeodeticHeight(c,a,r),0,p);p=addWallPositions(h=PolygonPipeline.scaleToGeodeticHeight(h,o,r),2*u,p),d.set(c),d.set(h,u),d.set(p,2*u),s.position.values=d,s=extrudedAttributes(s,t);var m,f=u/3;if(e.shadowVolume){for(var g=s.normal.values,u=g.length,_=new Float32Array(6*u),y=0;y<u;y++)g[y]=-g[y];_.set(g,u),_=addWallPositions(g,4*u,_),s.extrudeDirection=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:_}),t.normal||(s.normal=void 0)}defined(e.offsetAttribute)&&(m=new Uint8Array(6*f),m=e.offsetAttribute===GeometryOffsetAttribute$1.TOP?(m=arrayFill(m,1,0,f),arrayFill(m,1,2*f,4*f)):arrayFill(m,e.offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),s.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:m}));var v=l.length,C=f+f,S=IndexDatatype$1.createTypedArray(d.length/3,2*v+3*C);S.set(l);var T,x,b,E,P=v;for(y=0;y<v;y+=3){var A=l[y],w=l[y+1],D=l[y+2];S[P++]=D+f,S[P++]=w+f,S[P++]=A+f}for(y=0;y<C;y+=2)b=(T=y+C)+1,E=(x=T+C)+1,S[P++]=T,S[P++]=x,S[P++]=b,S[P++]=b,S[P++]=x,S[P++]=E;return{attributes:s,indices:S}}var scratchCartesian1$6=new Cartesian3,scratchCartesian2$6=new Cartesian3,scratchCartographic$2=new Cartographic;function computeOffsetPoints(e,t,i,r,n,a){var o=Cartesian3.subtract(t,e,scratchCartesian1$6);Cartesian3.normalize(o,o);var s=i.geodeticSurfaceNormal(e,scratchCartesian2$6),l=Cartesian3.cross(o,s,scratchCartesian1$6);Cartesian3.multiplyByScalar(l,r,l);var c=n.latitude,u=n.longitude,d=a.latitude,h=a.longitude;Cartesian3.add(e,l,scratchCartesian2$6),i.cartesianToCartographic(scratchCartesian2$6,scratchCartographic$2);var p=scratchCartographic$2.latitude,m=scratchCartographic$2.longitude,c=Math.min(c,p),u=Math.min(u,m),d=Math.max(d,p),h=Math.max(h,m);Cartesian3.subtract(e,l,scratchCartesian2$6),i.cartesianToCartographic(scratchCartesian2$6,scratchCartographic$2),p=scratchCartographic$2.latitude,m=scratchCartographic$2.longitude,c=Math.min(c,p),u=Math.min(u,m),d=Math.max(d,p),h=Math.max(h,m),n.latitude=c,n.longitude=u,a.latitude=d,a.longitude=h}var scratchCartesianOffset=new Cartesian3,scratchCartesianEnds=new Cartesian3,scratchCartographicMin=new Cartographic,scratchCartographicMax=new Cartographic;function computeRectangle$1(e,t,i,r,n){var a=arrayRemoveDuplicates(e=scaleToSurface$1(e,t),Cartesian3.equalsEpsilon),o=a.length;if(o<2||i<=0)return new Rectangle;var s,l,c,u=.5*i;scratchCartographicMin.latitude=Number.POSITIVE_INFINITY,scratchCartographicMin.longitude=Number.POSITIVE_INFINITY,scratchCartographicMax.latitude=Number.NEGATIVE_INFINITY,scratchCartographicMax.longitude=Number.NEGATIVE_INFINITY,r===CornerType$1.ROUNDED&&(c=a[0],Cartesian3.subtract(c,a[1],scratchCartesianOffset),Cartesian3.normalize(scratchCartesianOffset,scratchCartesianOffset),Cartesian3.multiplyByScalar(scratchCartesianOffset,u,scratchCartesianOffset),Cartesian3.add(c,scratchCartesianOffset,scratchCartesianEnds),t.cartesianToCartographic(scratchCartesianEnds,scratchCartographic$2),s=scratchCartographic$2.latitude,l=scratchCartographic$2.longitude,scratchCartographicMin.latitude=Math.min(scratchCartographicMin.latitude,s),scratchCartographicMin.longitude=Math.min(scratchCartographicMin.longitude,l),scratchCartographicMax.latitude=Math.max(scratchCartographicMax.latitude,s),scratchCartographicMax.longitude=Math.max(scratchCartographicMax.longitude,l));for(var d=0;d<o-1;++d)computeOffsetPoints(a[d],a[d+1],t,u,scratchCartographicMin,scratchCartographicMax);var h=a[o-1];Cartesian3.subtract(h,a[o-2],scratchCartesianOffset),Cartesian3.normalize(scratchCartesianOffset,scratchCartesianOffset),Cartesian3.multiplyByScalar(scratchCartesianOffset,u,scratchCartesianOffset),Cartesian3.add(h,scratchCartesianOffset,scratchCartesianEnds),computeOffsetPoints(h,scratchCartesianEnds,t,u,scratchCartographicMin,scratchCartographicMax),r===CornerType$1.ROUNDED&&(t.cartesianToCartographic(scratchCartesianEnds,scratchCartographic$2),s=scratchCartographic$2.latitude,l=scratchCartographic$2.longitude,scratchCartographicMin.latitude=Math.min(scratchCartographicMin.latitude,s),scratchCartographicMin.longitude=Math.min(scratchCartographicMin.longitude,l),scratchCartographicMax.latitude=Math.max(scratchCartographicMax.latitude,s),scratchCartographicMax.longitude=Math.max(scratchCartographicMax.longitude,l));var p=defined(n)?n:new Rectangle;return p.north=scratchCartographicMax.latitude,p.south=scratchCartographicMin.latitude,p.east=scratchCartographicMax.longitude,p.west=scratchCartographicMin.longitude,p}function CorridorGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.width,r=defaultValue(e.height,0),n=defaultValue(e.extrudedHeight,r);this._positions=t,this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._vertexFormat=VertexFormat.clone(defaultValue(e.vertexFormat,VertexFormat.DEFAULT)),this._width=i,this._height=Math.max(r,n),this._extrudedHeight=Math.min(r,n),this._cornerType=defaultValue(e.cornerType,CornerType$1.ROUNDED),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._shadowVolume=defaultValue(e.shadowVolume,!1),this._workerName="createCorridorGeometry",this._offsetAttribute=e.offsetAttribute,this._rectangle=void 0,this.packedLength=1+t.length*Cartesian3.packedLength+Ellipsoid.packedLength+VertexFormat.packedLength+7}CorridorGeometry.pack=function(e,t,i){i=defaultValue(i,0);var r=e._positions,n=r.length;t[i++]=n;for(var a=0;a<n;++a,i+=Cartesian3.packedLength)Cartesian3.pack(r[a],t,i);return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._width,t[i++]=e._height,t[i++]=e._extrudedHeight,t[i++]=e._cornerType,t[i++]=e._granularity,t[i++]=e._shadowVolume?1:0,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchEllipsoid$3=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchVertexFormat$3=new VertexFormat,scratchOptions$8={positions:void 0,ellipsoid:scratchEllipsoid$3,vertexFormat:scratchVertexFormat$3,width:void 0,height:void 0,extrudedHeight:void 0,cornerType:void 0,granularity:void 0,shadowVolume:void 0,offsetAttribute:void 0};CorridorGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r=e[t++],n=new Array(r),a=0;a<r;++a,t+=Cartesian3.packedLength)n[a]=Cartesian3.unpack(e,t);var o=Ellipsoid.unpack(e,t,scratchEllipsoid$3);t+=Ellipsoid.packedLength;var s=VertexFormat.unpack(e,t,scratchVertexFormat$3);t+=VertexFormat.packedLength;var l=e[t++],c=e[t++],u=e[t++],d=e[t++],h=e[t++],p=1===e[t++],m=e[t];return defined(i)?(i._positions=n,i._ellipsoid=Ellipsoid.clone(o,i._ellipsoid),i._vertexFormat=VertexFormat.clone(s,i._vertexFormat),i._width=l,i._height=c,i._extrudedHeight=u,i._cornerType=d,i._granularity=h,i._shadowVolume=p,i._offsetAttribute=-1===m?void 0:m,i):(scratchOptions$8.positions=n,scratchOptions$8.width=l,scratchOptions$8.height=c,scratchOptions$8.extrudedHeight=u,scratchOptions$8.cornerType=d,scratchOptions$8.granularity=h,scratchOptions$8.shadowVolume=p,scratchOptions$8.offsetAttribute=-1===m?void 0:m,new CorridorGeometry(scratchOptions$8))},CorridorGeometry.computeRectangle=function(e,t){var i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,r=e.width;return computeRectangle$1(i,defaultValue(e.ellipsoid,Ellipsoid.WGS84),r,defaultValue(e.cornerType,CornerType$1.ROUNDED),t)},CorridorGeometry.createGeometry=function(e){var t=e._positions,i=e._width,r=e._ellipsoid,n=arrayRemoveDuplicates(t=scaleToSurface$1(t,r),Cartesian3.equalsEpsilon);if(!(n.length<2||i<=0)){var a,o,s,l,c=e._height,u=e._extrudedHeight,d=!CesiumMath.equalsEpsilon(c,u,0,CesiumMath.EPSILON2),h=e._vertexFormat,p={ellipsoid:r,positions:n,width:i,cornerType:e._cornerType,granularity:e._granularity,saveAttributes:!0};d?(p.height=c,p.extrudedHeight=u,p.shadowVolume=e._shadowVolume,p.offsetAttribute=e._offsetAttribute,l=computePositionsExtruded(p,h)):((l=combine$1(CorridorGeometryLibrary.computePositions(p),h,r)).attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(l.attributes.position.values,c,r),defined(e._offsetAttribute)&&(a=e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1,o=l.attributes.position.values.length,arrayFill(s=new Uint8Array(o/3),a),l.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:s})));var m=l.attributes,f=BoundingSphere.fromVertices(m.position.values,void 0,3);return h.position||(l.attributes.position.values=void 0),new Geometry({attributes:m,indices:l.indices,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:f,offsetAttribute:e._offsetAttribute})}},CorridorGeometry.createShadowVolume=function(e,t,i){var r=e._granularity,n=e._ellipsoid,a=t(r,n),o=i(r,n);return new CorridorGeometry({positions:e._positions,width:e._width,cornerType:e._cornerType,ellipsoid:n,granularity:r,extrudedHeight:a,height:o,vertexFormat:VertexFormat.POSITION_ONLY,shadowVolume:!0})},Object.defineProperties(CorridorGeometry.prototype,{rectangle:{get:function(){return defined(this._rectangle)||(this._rectangle=computeRectangle$1(this._positions,this._ellipsoid,this._width,this._cornerType)),this._rectangle}},textureCoordinateRotationPoints:{get:function(){return[0,0,0,1,1,0]}}});var cartesian1$2=new Cartesian3,cartesian2$2=new Cartesian3,cartesian3$2=new Cartesian3;function scaleToSurface$2(e,t){for(var i=0;i<e.length;i++)e[i]=t.scaleToGeodeticSurface(e[i],e[i]);return e}function combine$2(e,t){var i,r=[],n=e.positions,a=e.corners,o=e.endPositions,s=new GeometryAttributes,l=0,c=0,u=0;for(w=0;w<n.length;w+=2)l+=i=n[w].length-3,u+=i/3*4,c+=n[w+1].length-3;for(l+=3,c+=3,w=0;w<a.length;w++){O=a[w];var d=a[w].leftPositions;defined(d)?l+=i=d.length:c+=i=a[w].rightPositions.length,u+=i/3*2}var h,p=defined(o);p&&(l+=h=o[0].length-3,c+=h,u+=4*(h/=3));var m,f,g,_,y,v,C=l+c,S=new Float64Array(C),T=0,x=C-1,b=h/2,E=IndexDatatype$1.createTypedArray(C/3,u+4),P=0;if(E[P++]=T/3,E[P++]=(x-2)/3,p){r.push(T/3),v=cartesian1$2,y=cartesian2$2;for(var A=o[0],w=0;w<b;w++)v=Cartesian3.fromArray(A,3*(b-1-w),v),y=Cartesian3.fromArray(A,3*(b+w),y),CorridorGeometryLibrary.addAttribute(S,y,T),CorridorGeometryLibrary.addAttribute(S,v,void 0,x),_=(f=T/3)+1,g=(m=(x-2)/3)-1,E[P++]=m,E[P++]=g,E[P++]=f,E[P++]=_,T+=3,x-=3}var D=0,M=n[D++],I=n[D++];for(S.set(M,T),S.set(I,x-I.length+1),i=I.length-3,r.push(T/3,(x-2)/3),w=0;w<i;w+=3)_=(f=T/3)+1,g=(m=(x-2)/3)-1,E[P++]=m,E[P++]=g,E[P++]=f,E[P++]=_,T+=3,x-=3;for(w=0;w<a.length;w++){var R,O,L,F=(O=a[w]).leftPositions,N=O.rightPositions,B=cartesian3$2;if(defined(F)){for(x-=3,L=g,r.push(_),R=0;R<F.length/3;R++)B=Cartesian3.fromArray(F,3*R,B),E[P++]=L-R-1,E[P++]=L-R,CorridorGeometryLibrary.addAttribute(S,B,void 0,x),x-=3;r.push(L-Math.floor(F.length/6)),t===CornerType$1.BEVELED&&r.push((x-2)/3+1),T+=3}else{for(T+=3,L=_,r.push(g),R=0;R<N.length/3;R++)B=Cartesian3.fromArray(N,3*R,B),E[P++]=L+R,E[P++]=L+R+1,CorridorGeometryLibrary.addAttribute(S,B,T),T+=3;r.push(L+Math.floor(N.length/6)),t===CornerType$1.BEVELED&&r.push(T/3-1),x-=3}for(M=n[D++],I=n[D++],M.splice(0,3),I.splice(I.length-3,3),S.set(M,T),S.set(I,x-I.length+1),i=I.length-3,R=0;R<I.length;R+=3)f=(_=T/3)-1,m=(g=(x-2)/3)+1,E[P++]=m,E[P++]=g,E[P++]=f,E[P++]=_,T+=3,x-=3;T-=3,x+=3,r.push(T/3,(x-2)/3)}if(p){T+=3,x-=3,v=cartesian1$2,y=cartesian2$2;var V=o[1];for(w=0;w<b;w++)v=Cartesian3.fromArray(V,3*(h-w-1),v),y=Cartesian3.fromArray(V,3*w,y),CorridorGeometryLibrary.addAttribute(S,v,void 0,x),CorridorGeometryLibrary.addAttribute(S,y,T),f=(_=T/3)-1,m=(g=(x-2)/3)+1,E[P++]=m,E[P++]=g,E[P++]=f,E[P++]=_,T+=3,x-=3;r.push(T/3)}else r.push(T/3,(x-2)/3);return E[P++]=T/3,E[P++]=(x-2)/3,s.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:S}),{attributes:s,indices:E,wallIndices:r}}function computePositionsExtruded$1(e){var t=e.ellipsoid,i=combine$2(CorridorGeometryLibrary.computePositions(e),e.cornerType),r=i.wallIndices,n=e.height,a=e.extrudedHeight,o=i.attributes,s=i.indices,l=(d=o.position.values).length;(h=new Float64Array(l)).set(d);var c,u=new Float64Array(2*l),d=PolygonPipeline.scaleToGeodeticHeight(d,n,t),h=PolygonPipeline.scaleToGeodeticHeight(h,a,t);u.set(d),u.set(h,l),o.position.values=u,l/=3,defined(e.offsetAttribute)&&(c=new Uint8Array(2*l),c=e.offsetAttribute===GeometryOffsetAttribute$1.TOP?arrayFill(c,1,0,l):arrayFill(c,e.offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),o.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:c}));var p=s.length,m=IndexDatatype$1.createTypedArray(u.length/3,2*(p+r.length));m.set(s);for(var f,g,_=p,y=0;y<p;y+=2){var v=s[y],C=s[y+1];m[_++]=v+l,m[_++]=C+l}for(y=0;y<r.length;y++)g=(f=r[y])+l,m[_++]=f,m[_++]=g;return{attributes:o,indices:m}}function CorridorOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.width,r=defaultValue(e.height,0),n=defaultValue(e.extrudedHeight,r);this._positions=t,this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._width=i,this._height=Math.max(r,n),this._extrudedHeight=Math.min(r,n),this._cornerType=defaultValue(e.cornerType,CornerType$1.ROUNDED),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._offsetAttribute=e.offsetAttribute,this._workerName="createCorridorOutlineGeometry",this.packedLength=1+t.length*Cartesian3.packedLength+Ellipsoid.packedLength+6}CorridorOutlineGeometry.pack=function(e,t,i){i=defaultValue(i,0);var r=e._positions,n=r.length;t[i++]=n;for(var a=0;a<n;++a,i+=Cartesian3.packedLength)Cartesian3.pack(r[a],t,i);return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,t[i++]=e._width,t[i++]=e._height,t[i++]=e._extrudedHeight,t[i++]=e._cornerType,t[i++]=e._granularity,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchEllipsoid$4=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchOptions$9={positions:void 0,ellipsoid:scratchEllipsoid$4,width:void 0,height:void 0,extrudedHeight:void 0,cornerType:void 0,granularity:void 0,offsetAttribute:void 0};function CullingVolume(e){this.planes=defaultValue(e,[])}CorridorOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r=e[t++],n=new Array(r),a=0;a<r;++a,t+=Cartesian3.packedLength)n[a]=Cartesian3.unpack(e,t);var o=Ellipsoid.unpack(e,t,scratchEllipsoid$4);t+=Ellipsoid.packedLength;var s=e[t++],l=e[t++],c=e[t++],u=e[t++],d=e[t++],h=e[t];return defined(i)?(i._positions=n,i._ellipsoid=Ellipsoid.clone(o,i._ellipsoid),i._width=s,i._height=l,i._extrudedHeight=c,i._cornerType=u,i._granularity=d,i._offsetAttribute=-1===h?void 0:h,i):(scratchOptions$9.positions=n,scratchOptions$9.width=s,scratchOptions$9.height=l,scratchOptions$9.extrudedHeight=c,scratchOptions$9.cornerType=u,scratchOptions$9.granularity=d,scratchOptions$9.offsetAttribute=-1===h?void 0:h,new CorridorOutlineGeometry(scratchOptions$9))},CorridorOutlineGeometry.createGeometry=function(e){var t=e._positions,i=e._width,r=e._ellipsoid,n=arrayRemoveDuplicates(t=scaleToSurface$2(t,r),Cartesian3.equalsEpsilon);if(!(n.length<2||i<=0)){var a,o,s,l=e._height,c=e._extrudedHeight,u=!CesiumMath.equalsEpsilon(l,c,0,CesiumMath.EPSILON2),d={ellipsoid:r,positions:n,width:i,cornerType:e._cornerType,granularity:e._granularity,saveAttributes:!1};u?(d.height=l,d.extrudedHeight=c,d.offsetAttribute=e._offsetAttribute,s=computePositionsExtruded$1(d)):((s=combine$2(CorridorGeometryLibrary.computePositions(d),d.cornerType)).attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(s.attributes.position.values,l,r),defined(e._offsetAttribute)&&(a=s.attributes.position.values.length,arrayFill(o=new Uint8Array(a/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),s.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:o})));var h=s.attributes,p=BoundingSphere.fromVertices(h.position.values,void 0,3);return new Geometry({attributes:h,indices:s.indices,primitiveType:PrimitiveType$1.LINES,boundingSphere:p,offsetAttribute:e._offsetAttribute})}};var faces=[new Cartesian3,new Cartesian3,new Cartesian3];Cartesian3.clone(Cartesian3.UNIT_X,faces[0]),Cartesian3.clone(Cartesian3.UNIT_Y,faces[1]),Cartesian3.clone(Cartesian3.UNIT_Z,faces[2]);var scratchPlaneCenter=new Cartesian3,scratchPlaneNormal$1=new Cartesian3,scratchPlane$1=new Plane(new Cartesian3(1,0,0),0);CullingVolume.fromBoundingSphere=function(e,t){defined(t)||(t=new CullingVolume);var i=faces.length,r=t.planes;r.length=2*i;for(var n=e.center,a=e.radius,o=0,s=0;s<i;++s){var l=faces[s],c=r[o],u=r[o+1];defined(c)||(c=r[o]=new Cartesian4),defined(u)||(u=r[o+1]=new Cartesian4),Cartesian3.multiplyByScalar(l,-a,scratchPlaneCenter),Cartesian3.add(n,scratchPlaneCenter,scratchPlaneCenter),c.x=l.x,c.y=l.y,c.z=l.z,c.w=-Cartesian3.dot(l,scratchPlaneCenter),Cartesian3.multiplyByScalar(l,a,scratchPlaneCenter),Cartesian3.add(n,scratchPlaneCenter,scratchPlaneCenter),u.x=-l.x,u.y=-l.y,u.z=-l.z,u.w=-Cartesian3.dot(Cartesian3.negate(l,scratchPlaneNormal$1),scratchPlaneCenter),o+=2}return t},CullingVolume.prototype.computeVisibility=function(e){for(var t=this.planes,i=!1,r=0,n=t.length;r<n;++r){var a=e.intersectPlane(Plane.fromCartesian4(t[r],scratchPlane$1));if(a===Intersect$1.OUTSIDE)return Intersect$1.OUTSIDE;a===Intersect$1.INTERSECTING&&(i=!0)}return i?Intersect$1.INTERSECTING:Intersect$1.INSIDE},CullingVolume.prototype.computeVisibilityWithPlaneMask=function(e,t){if(t===CullingVolume.MASK_OUTSIDE||t===CullingVolume.MASK_INSIDE)return t;for(var i=CullingVolume.MASK_INSIDE,r=this.planes,n=0,a=r.length;n<a;++n){var o=n<31?1<<n:0;if(!(n<31&&0==(t&o))){var s=e.intersectPlane(Plane.fromCartesian4(r[n],scratchPlane$1));if(s===Intersect$1.OUTSIDE)return CullingVolume.MASK_OUTSIDE;s===Intersect$1.INTERSECTING&&(i|=o)}}return i},CullingVolume.MASK_OUTSIDE=4294967295,CullingVolume.MASK_INSIDE=0,CullingVolume.MASK_INDETERMINATE=2147483647;var CylinderGeometryLibrary={computePositions:function(e,t,i,r,n){for(var a=.5*e,o=-a,s=r+r,l=new Float64Array(3*(n?2*s:s)),c=0,u=0,d=n?3*s:0,h=n?3*(s+r):3*r,p=0;p<r;p++){var m=p/r*CesiumMath.TWO_PI,f=Math.cos(m),g=Math.sin(m),_=f*i,y=g*i,v=f*t,C=g*t;l[u+d]=_,l[u+d+1]=y,l[u+d+2]=o,l[u+h]=v,l[u+h+1]=C,l[u+h+2]=a,u+=3,n&&(l[c++]=_,l[c++]=y,l[c++]=o,l[c++]=v,l[c++]=C,l[c++]=a)}return l}},radiusScratch=new Cartesian2,normalScratch$2=new Cartesian3,bitangentScratch=new Cartesian3,tangentScratch=new Cartesian3,positionScratch$1=new Cartesian3;function CylinderGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).length,i=e.topRadius,r=e.bottomRadius,n=defaultValue(e.vertexFormat,VertexFormat.DEFAULT),a=defaultValue(e.slices,128);this._length=t,this._topRadius=i,this._bottomRadius=r,this._vertexFormat=VertexFormat.clone(n),this._slices=a,this._offsetAttribute=e.offsetAttribute,this._workerName="createCylinderGeometry"}CylinderGeometry.packedLength=VertexFormat.packedLength+5,CylinderGeometry.pack=function(e,t,i){return i=defaultValue(i,0),VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._length,t[i++]=e._topRadius,t[i++]=e._bottomRadius,t[i++]=e._slices,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchVertexFormat$4=new VertexFormat,scratchOptions$a={vertexFormat:scratchVertexFormat$4,length:void 0,topRadius:void 0,bottomRadius:void 0,slices:void 0,offsetAttribute:void 0},unitCylinderGeometry;CylinderGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=VertexFormat.unpack(e,t,scratchVertexFormat$4);t+=VertexFormat.packedLength;var n=e[t++],a=e[t++],o=e[t++],s=e[t++],l=e[t];return defined(i)?(i._vertexFormat=VertexFormat.clone(r,i._vertexFormat),i._length=n,i._topRadius=a,i._bottomRadius=o,i._slices=s,i._offsetAttribute=-1===l?void 0:l,i):(scratchOptions$a.length=n,scratchOptions$a.topRadius=a,scratchOptions$a.bottomRadius=o,scratchOptions$a.slices=s,scratchOptions$a.offsetAttribute=-1===l?void 0:l,new CylinderGeometry(scratchOptions$a))},CylinderGeometry.createGeometry=function(e){var t=e._length,i=e._topRadius,r=e._bottomRadius,n=e._vertexFormat,a=e._slices;if(!(t<=0||i<0||r<0||0===i&&0===r)){var o=a+a,s=a+o,l=o+o,c=CylinderGeometryLibrary.computePositions(t,i,r,a,!0),u=n.st?new Float32Array(2*l):void 0,d=n.normal?new Float32Array(3*l):void 0,h=n.tangent?new Float32Array(3*l):void 0,p=n.bitangent?new Float32Array(3*l):void 0,m=n.normal||n.tangent||n.bitangent;if(m){var f=n.tangent||n.bitangent,g=0,_=0,y=0,v=Math.atan2(r-i,t),C=normalScratch$2;C.z=Math.sin(v);for(var S=Math.cos(v),T=tangentScratch,x=bitangentScratch,b=0;b<a;b++){var E=b/a*CesiumMath.TWO_PI,P=S*Math.cos(E),A=S*Math.sin(E);m&&(C.x=P,C.y=A,f&&(T=Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z,C,T),T)),n.normal&&(d[g++]=C.x,d[g++]=C.y,d[g++]=C.z,d[g++]=C.x,d[g++]=C.y,d[g++]=C.z),n.tangent&&(h[_++]=T.x,h[_++]=T.y,h[_++]=T.z,h[_++]=T.x,h[_++]=T.y,h[_++]=T.z),n.bitangent&&(x=Cartesian3.normalize(Cartesian3.cross(C,T,x),x),p[y++]=x.x,p[y++]=x.y,p[y++]=x.z,p[y++]=x.x,p[y++]=x.y,p[y++]=x.z))}for(b=0;b<a;b++)n.normal&&(d[g++]=0,d[g++]=0,d[g++]=-1),n.tangent&&(h[_++]=1,h[_++]=0,h[_++]=0),n.bitangent&&(p[y++]=0,p[y++]=-1,p[y++]=0);for(b=0;b<a;b++)n.normal&&(d[g++]=0,d[g++]=0,d[g++]=1),n.tangent&&(h[_++]=1,h[_++]=0,h[_++]=0),n.bitangent&&(p[y++]=0,p[y++]=1,p[y++]=0)}var w=12*a-12,D=IndexDatatype$1.createTypedArray(l,w),M=0,I=0;for(b=0;b<a-1;b++)D[M++]=I,D[M++]=I+2,D[M++]=I+3,D[M++]=I,D[M++]=I+3,D[M++]=I+1,I+=2;for(D[M++]=o-2,D[M++]=0,D[M++]=1,D[M++]=o-2,D[M++]=1,D[M++]=o-1,b=1;b<a-1;b++)D[M++]=o+b+1,D[M++]=o+b,D[M++]=o;for(b=1;b<a-1;b++)D[M++]=s,D[M++]=s+b,D[M++]=s+b+1;var R=0;if(n.st){var O=Math.max(i,r);for(b=0;b<l;b++){var L=Cartesian3.fromArray(c,3*b,positionScratch$1);u[R++]=(L.x+O)/(2*O),u[R++]=(L.y+O)/(2*O)}}var F=new GeometryAttributes;n.position&&(F.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:c})),n.normal&&(F.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:d})),n.tangent&&(F.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:h})),n.bitangent&&(F.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:p})),n.st&&(F.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:u})),radiusScratch.x=.5*t,radiusScratch.y=Math.max(r,i);var N,B=new BoundingSphere(Cartesian3.ZERO,Cartesian2.magnitude(radiusScratch));return defined(e._offsetAttribute)&&(t=c.length,arrayFill(N=new Uint8Array(t/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),F.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:N})),new Geometry({attributes:F,indices:D,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:B,offsetAttribute:e._offsetAttribute})}},CylinderGeometry.getUnitCylinder=function(){return defined(unitCylinderGeometry)||(unitCylinderGeometry=CylinderGeometry.createGeometry(new CylinderGeometry({topRadius:1,bottomRadius:1,length:1,vertexFormat:VertexFormat.POSITION_ONLY}))),unitCylinderGeometry};var radiusScratch$1=new Cartesian2;function CylinderOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).length,i=e.topRadius,r=e.bottomRadius,n=defaultValue(e.slices,128),a=Math.max(defaultValue(e.numberOfVerticalLines,16),0);this._length=t,this._topRadius=i,this._bottomRadius=r,this._slices=n,this._numberOfVerticalLines=a,this._offsetAttribute=e.offsetAttribute,this._workerName="createCylinderOutlineGeometry"}CylinderOutlineGeometry.packedLength=6,CylinderOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e._length,t[i++]=e._topRadius,t[i++]=e._bottomRadius,t[i++]=e._slices,t[i++]=e._numberOfVerticalLines,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchOptions$b={length:void 0,topRadius:void 0,bottomRadius:void 0,slices:void 0,numberOfVerticalLines:void 0,offsetAttribute:void 0};function DefaultProxy(e){this.proxy=e}function DistanceDisplayCondition(e,t){e=defaultValue(e,0),this._near=e,t=defaultValue(t,Number.MAX_VALUE),this._far=t}function DistanceDisplayConditionGeometryInstanceAttribute(e,t){e=defaultValue(e,0),t=defaultValue(t,Number.MAX_VALUE),this.value=new Float32Array([e,t])}function DoublyLinkedList(){this.head=void 0,this.tail=void 0,this._length=0}function DoublyLinkedListNode(e,t,i){this.item=e,this.previous=t,this.next=i}function remove(e,t){defined(t.previous)&&defined(t.next)?(t.previous.next=t.next,t.next.previous=t.previous):defined(t.previous)?(t.previous.next=void 0,e.tail=t.previous):defined(t.next)?(t.next.previous=void 0,e.head=t.next):(e.head=void 0,e.tail=void 0),t.next=void 0,t.previous=void 0}CylinderOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=e[t++],n=e[t++],a=e[t++],o=e[t++],s=e[t++],l=e[t];return defined(i)?(i._length=r,i._topRadius=n,i._bottomRadius=a,i._slices=o,i._numberOfVerticalLines=s,i._offsetAttribute=-1===l?void 0:l,i):(scratchOptions$b.length=r,scratchOptions$b.topRadius=n,scratchOptions$b.bottomRadius=a,scratchOptions$b.slices=o,scratchOptions$b.numberOfVerticalLines=s,scratchOptions$b.offsetAttribute=-1===l?void 0:l,new CylinderOutlineGeometry(scratchOptions$b))},CylinderOutlineGeometry.createGeometry=function(e){var t=e._length,i=e._topRadius,r=e._bottomRadius,n=e._slices,a=e._numberOfVerticalLines;if(!(t<=0||i<0||r<0||0===i&&0===r)){var o,s,l=2*n,c=CylinderGeometryLibrary.computePositions(t,i,r,n,!1),u=2*n;0<a&&(o=Math.min(a,n),s=Math.round(n/o),u+=o);for(var d=IndexDatatype$1.createTypedArray(l,2*u),h=0,p=0;p<n-1;p++)d[h++]=p,d[h++]=p+1,d[h++]=p+n,d[h++]=p+1+n;if(d[h++]=n-1,d[h++]=0,d[h++]=n+n-1,d[h++]=n,0<a)for(p=0;p<n;p+=s)d[h++]=p,d[h++]=p+n;var m=new GeometryAttributes;m.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:c}),radiusScratch$1.x=.5*t,radiusScratch$1.y=Math.max(r,i);var f,g=new BoundingSphere(Cartesian3.ZERO,Cartesian2.magnitude(radiusScratch$1));return defined(e._offsetAttribute)&&(t=c.length,arrayFill(f=new Uint8Array(t/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),m.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:f})),new Geometry({attributes:m,indices:d,primitiveType:PrimitiveType$1.LINES,boundingSphere:g,offsetAttribute:e._offsetAttribute})}},DefaultProxy.prototype.getURL=function(e){var t=-1===this.proxy.indexOf("?")?"?":"";return this.proxy+t+encodeURIComponent(e)},Object.defineProperties(DistanceDisplayCondition.prototype,{near:{get:function(){return this._near},set:function(e){this._near=e}},far:{get:function(){return this._far},set:function(e){this._far=e}}}),DistanceDisplayCondition.packedLength=2,DistanceDisplayCondition.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.near,t[i]=e.far,t},DistanceDisplayCondition.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new DistanceDisplayCondition),i.near=e[t++],i.far=e[t],i},DistanceDisplayCondition.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.near===t.near&&e.far===t.far},DistanceDisplayCondition.clone=function(e,t){if(defined(e))return defined(t)||(t=new DistanceDisplayCondition),t.near=e.near,t.far=e.far,t},DistanceDisplayCondition.prototype.clone=function(e){return DistanceDisplayCondition.clone(this,e)},DistanceDisplayCondition.prototype.equals=function(e){return DistanceDisplayCondition.equals(this,e)},Object.defineProperties(DistanceDisplayConditionGeometryInstanceAttribute.prototype,{componentDatatype:{get:function(){return ComponentDatatype$1.FLOAT}},componentsPerAttribute:{get:function(){return 2}},normalize:{get:function(){return!1}}}),DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition=function(e){return new DistanceDisplayConditionGeometryInstanceAttribute(e.near,e.far)},DistanceDisplayConditionGeometryInstanceAttribute.toValue=function(e,t){return defined(t)?(t[0]=e.near,t[1]=e.far,t):new Float32Array([e.near,e.far])},Object.defineProperties(DoublyLinkedList.prototype,{length:{get:function(){return this._length}}}),DoublyLinkedList.prototype.add=function(e){var t=new DoublyLinkedListNode(e,this.tail,void 0);return defined(this.tail)?this.tail.next=t:this.head=t,this.tail=t,++this._length,t},DoublyLinkedList.prototype.remove=function(e){defined(e)&&(remove(this,e),--this._length)},DoublyLinkedList.prototype.splice=function(e,t){var i;e!==t&&(remove(this,t),i=e.next,e.next=t,this.tail===e?this.tail=t:i.previous=t,t.next=i,t.previous=e)},void 0===Date.now&&(Date.now=function(){return(new Date).valueOf()});var TWEEN=TWEEN||(qzb=[],{REVISION:"13",getAll:function(){return qzb},removeAll:function(){qzb=[]},add:function(e){qzb.push(e)},remove:function(e){var t=qzb.indexOf(e);-1!==t&&qzb.splice(t,1)},update:function(e){if(0===qzb.length)return!1;var t=0;for(e=void 0!==e?e:"undefined"!=typeof window&&void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now();t<qzb.length;)qzb[t].update(e)?t++:qzb.splice(t,1);return!0}}),qzb,ABb;TWEEN.Tween=function(e){var c=e,u={},d={},h={},p=1e3,m=0,f=!1,i=!1,g=0,_=null,y=TWEEN.Easing.Linear.None,v=TWEEN.Interpolation.Linear,C=[],S=null,T=!1,x=null,b=null,t=null;for(var r in e)u[r]=parseFloat(e[r],10);this.to=function(e,t){return void 0!==t&&(p=t),d=e,this},this.start=function(e){for(var t in TWEEN.add(this),T=!(i=!0),_=void 0!==e?e:"undefined"!=typeof window&&void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now(),_+=g,d){if(d[t]instanceof Array){if(0===d[t].length)continue;d[t]=[c[t]].concat(d[t])}u[t]=c[t],u[t]instanceof Array==!1&&(u[t]*=1),h[t]=u[t]||0}return this},this.stop=function(){return i&&(TWEEN.remove(this),i=!1,null!==t&&t.call(c),this.stopChainedTweens()),this},this.stopChainedTweens=function(){for(var e=0,t=C.length;e<t;e++)C[e].stop()},this.delay=function(e){return g=e,this},this.repeat=function(e){return m=e,this},this.yoyo=function(e){return f=e,this},this.easing=function(e){return y=e,this},this.interpolation=function(e){return v=e,this},this.chain=function(){return C=arguments,this},this.onStart=function(e){return S=e,this},this.onUpdate=function(e){return x=e,this},this.onComplete=function(e){return b=e,this},this.onStop=function(e){return t=e,this},this.update=function(e){var t;if(e<_)return!0;!1===T&&(null!==S&&S.call(c),T=!0);var i,r=(e-_)/p,n=y(r=1<r?1:r);for(t in d){var a=u[t]||0,o=d[t];o instanceof Array?c[t]=v(o,n):("string"==typeof o&&(o=a+parseFloat(o,10)),"number"==typeof o&&(c[t]=a+(o-a)*n))}if(null!==x&&x.call(c,n),1!=r)return!0;if(0<m){for(t in isFinite(m)&&m--,h){"string"==typeof d[t]&&(h[t]=h[t]+parseFloat(d[t],10)),f&&(i=h[t],h[t]=d[t],d[t]=i),u[t]=h[t]}return _=e+g,!0}null!==b&&b.call(c);for(var s=0,l=C.length;s<l;s++)C[s].start(e);return!1}},TWEEN.Easing={Linear:{None:function(e){return e}},Quadratic:{In:function(e){return e*e},Out:function(e){return e*(2-e)},InOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)}},Cubic:{In:function(e){return e*e*e},Out:function(e){return--e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)}},Quartic:{In:function(e){return e*e*e*e},Out:function(e){return 1- --e*e*e*e},InOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)}},Quintic:{In:function(e){return e*e*e*e*e},Out:function(e){return--e*e*e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)}},Sinusoidal:{In:function(e){return 1-Math.cos(e*Math.PI/2)},Out:function(e){return Math.sin(e*Math.PI/2)},InOut:function(e){return.5*(1-Math.cos(Math.PI*e))}},Exponential:{In:function(e){return 0===e?0:Math.pow(1024,e-1)},Out:function(e){return 1===e?1:1-Math.pow(2,-10*e)},InOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(2-Math.pow(2,-10*(e-1)))}},Circular:{In:function(e){return 1-Math.sqrt(1-e*e)},Out:function(e){return Math.sqrt(1- --e*e)},InOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)}},Elastic:{In:function(e){var t,i=.1;return 0===e?0:1===e?1:(t=!i||i<1?(i=1,.1):.4*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*--e)*Math.sin((e-t)*(2*Math.PI)/.4)))},Out:function(e){var t,i=.1;return 0===e?0:1===e?1:(t=!i||i<1?(i=1,.1):.4*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*e)*Math.sin((e-t)*(2*Math.PI)/.4)+1)},InOut:function(e){var t,i=.1;return 0===e?0:1===e?1:(t=!i||i<1?(i=1,.1):.4*Math.asin(1/i)/(2*Math.PI),(e*=2)<1?i*Math.pow(2,10*--e)*Math.sin((e-t)*(2*Math.PI)/.4)*-.5:i*Math.pow(2,-10*--e)*Math.sin((e-t)*(2*Math.PI)/.4)*.5+1)}},Back:{In:function(e){return e*e*(2.70158*e-1.70158)},Out:function(e){return--e*e*(2.70158*e+1.70158)+1},InOut:function(e){var t=2.5949095;return(e*=2)<1?e*e*((1+t)*e-t)*.5:.5*((e-=2)*e*((1+t)*e+t)+2)}},Bounce:{In:function(e){return 1-TWEEN.Easing.Bounce.Out(1-e)},Out:function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},InOut:function(e){return e<.5?.5*TWEEN.Easing.Bounce.In(2*e):.5*TWEEN.Easing.Bounce.Out(2*e-1)+.5}}},TWEEN.Interpolation={Linear:function(e,t){var i=e.length-1,r=i*t,n=Math.floor(r),a=TWEEN.Interpolation.Utils.Linear;return t<0?a(e[0],e[1],r):1<t?a(e[i],e[i-1],i-r):a(e[n],e[i<n+1?i:n+1],r-n)},Bezier:function(e,t){for(var i=0,r=e.length-1,n=Math.pow,a=TWEEN.Interpolation.Utils.Bernstein,o=0;o<=r;o++)i+=n(1-t,r-o)*n(t,o)*e[o]*a(r,o);return i},CatmullRom:function(e,t){var i=e.length-1,r=i*t,n=Math.floor(r),a=TWEEN.Interpolation.Utils.CatmullRom;return e[0]===e[i]?(t<0&&(n=Math.floor(r=i*(1+t))),a(e[(n-1+i)%i],e[n],e[(n+1)%i],e[(n+2)%i],r-n)):t<0?e[0]-(a(e[0],e[0],e[1],e[1],-r)-e[0]):1<t?e[i]-(a(e[i],e[i],e[i-1],e[i-1],r-i)-e[i]):a(e[n?n-1:0],e[n],e[i<n+1?i:n+1],e[i<n+2?i:n+2],r-n)},Utils:{Linear:function(e,t,i){return(t-e)*i+e},Bernstein:function(e,t){var i=TWEEN.Interpolation.Utils.Factorial;return i(e)/i(t)/i(e-t)},Factorial:(ABb=[1],function(e){var t,i=1;if(ABb[e])return ABb[e];for(t=e;1<t;t--)i*=t;return ABb[e]=i}),CatmullRom:function(e,t,i,r,n){var a=.5*(i-e),o=.5*(r-t),s=n*n;return(2*t-2*i+a+o)*(n*s)+(-3*t+3*i-2*a-o)*s+a*n+t}}};var EasingFunction={LINEAR_NONE:TWEEN.Easing.Linear.None,QUADRACTIC_IN:TWEEN.Easing.Quadratic.In,QUADRACTIC_OUT:TWEEN.Easing.Quadratic.Out,QUADRACTIC_IN_OUT:TWEEN.Easing.Quadratic.InOut,CUBIC_IN:TWEEN.Easing.Cubic.In,CUBIC_OUT:TWEEN.Easing.Cubic.Out,CUBIC_IN_OUT:TWEEN.Easing.Cubic.InOut,QUARTIC_IN:TWEEN.Easing.Quartic.In,QUARTIC_OUT:TWEEN.Easing.Quartic.Out,QUARTIC_IN_OUT:TWEEN.Easing.Quartic.InOut,QUINTIC_IN:TWEEN.Easing.Quintic.In,QUINTIC_OUT:TWEEN.Easing.Quintic.Out,QUINTIC_IN_OUT:TWEEN.Easing.Quintic.InOut,SINUSOIDAL_IN:TWEEN.Easing.Sinusoidal.In,SINUSOIDAL_OUT:TWEEN.Easing.Sinusoidal.Out,SINUSOIDAL_IN_OUT:TWEEN.Easing.Sinusoidal.InOut,EXPONENTIAL_IN:TWEEN.Easing.Exponential.In,EXPONENTIAL_OUT:TWEEN.Easing.Exponential.Out,EXPONENTIAL_IN_OUT:TWEEN.Easing.Exponential.InOut,CIRCULAR_IN:TWEEN.Easing.Circular.In,CIRCULAR_OUT:TWEEN.Easing.Circular.Out,CIRCULAR_IN_OUT:TWEEN.Easing.Circular.InOut,ELASTIC_IN:TWEEN.Easing.Elastic.In,ELASTIC_OUT:TWEEN.Easing.Elastic.Out,ELASTIC_IN_OUT:TWEEN.Easing.Elastic.InOut,BACK_IN:TWEEN.Easing.Back.In,BACK_OUT:TWEEN.Easing.Back.Out,BACK_IN_OUT:TWEEN.Easing.Back.InOut,BOUNCE_IN:TWEEN.Easing.Bounce.In,BOUNCE_OUT:TWEEN.Easing.Bounce.Out,BOUNCE_IN_OUT:TWEEN.Easing.Bounce.InOut},EasingFunction$1=Object.freeze(EasingFunction),scratchPosition$2=new Cartesian3,scratchNormal$4=new Cartesian3,scratchTangent$2=new Cartesian3,scratchBitangent$2=new Cartesian3,scratchNormalST=new Cartesian3,defaultRadii=new Cartesian3(1,1,1),cos=Math.cos,sin=Math.sin;function EllipsoidGeometry(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.radii,defaultRadii),i=defaultValue(e.innerRadii,t),r=defaultValue(e.minimumClock,0),n=defaultValue(e.maximumClock,CesiumMath.TWO_PI),a=defaultValue(e.minimumCone,0),o=defaultValue(e.maximumCone,CesiumMath.PI),s=Math.round(defaultValue(e.stackPartitions,64)),l=Math.round(defaultValue(e.slicePartitions,64)),c=defaultValue(e.vertexFormat,VertexFormat.DEFAULT);this._radii=Cartesian3.clone(t),this._innerRadii=Cartesian3.clone(i),this._minimumClock=r,this._maximumClock=n,this._minimumCone=a,this._maximumCone=o,this._stackPartitions=s,this._slicePartitions=l,this._vertexFormat=VertexFormat.clone(c),this._offsetAttribute=e.offsetAttribute,this._workerName="createEllipsoidGeometry"}EllipsoidGeometry.packedLength=2*Cartesian3.packedLength+VertexFormat.packedLength+7,EllipsoidGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._radii,t,i),i+=Cartesian3.packedLength,Cartesian3.pack(e._innerRadii,t,i),i+=Cartesian3.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._minimumClock,t[i++]=e._maximumClock,t[i++]=e._minimumCone,t[i++]=e._maximumCone,t[i++]=e._stackPartitions,t[i++]=e._slicePartitions,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchRadii=new Cartesian3,scratchInnerRadii=new Cartesian3,scratchVertexFormat$5=new VertexFormat,scratchOptions$c={radii:scratchRadii,innerRadii:scratchInnerRadii,vertexFormat:scratchVertexFormat$5,minimumClock:void 0,maximumClock:void 0,minimumCone:void 0,maximumCone:void 0,stackPartitions:void 0,slicePartitions:void 0,offsetAttribute:void 0},unitEllipsoidGeometry;EllipsoidGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t,scratchRadii);t+=Cartesian3.packedLength;var n=Cartesian3.unpack(e,t,scratchInnerRadii);t+=Cartesian3.packedLength;var a=VertexFormat.unpack(e,t,scratchVertexFormat$5);t+=VertexFormat.packedLength;var o=e[t++],s=e[t++],l=e[t++],c=e[t++],u=e[t++],d=e[t++],h=e[t];return defined(i)?(i._radii=Cartesian3.clone(r,i._radii),i._innerRadii=Cartesian3.clone(n,i._innerRadii),i._vertexFormat=VertexFormat.clone(a,i._vertexFormat),i._minimumClock=o,i._maximumClock=s,i._minimumCone=l,i._maximumCone=c,i._stackPartitions=u,i._slicePartitions=d,i._offsetAttribute=-1===h?void 0:h,i):(scratchOptions$c.minimumClock=o,scratchOptions$c.maximumClock=s,scratchOptions$c.minimumCone=l,scratchOptions$c.maximumCone=c,scratchOptions$c.stackPartitions=u,scratchOptions$c.slicePartitions=d,scratchOptions$c.offsetAttribute=-1===h?void 0:h,new EllipsoidGeometry(scratchOptions$c))},EllipsoidGeometry.createGeometry=function(e){var t=e._radii;if(!(t.x<=0||t.y<=0||t.z<=0)){var i=e._innerRadii;if(!(i.x<=0||i.y<=0||i.z<=0)){var r=e._minimumClock,n=e._maximumClock,a=e._minimumCone,o=e._maximumCone,s=e._vertexFormat,l=e._slicePartitions+1,c=e._stackPartitions+1;(l=Math.round(l*Math.abs(n-r)/CesiumMath.TWO_PI))<2&&(l=2),(c=Math.round(c*Math.abs(o-a)/CesiumMath.PI))<2&&(c=2);var u=0,d=[a],h=[r];for(G=0;G<c;G++)d.push(a+G*(o-a)/(c-1));for(d.push(o),N=0;N<l;N++)h.push(r+N*(n-r)/(l-1));h.push(n);var p=d.length,m=h.length,f=0,g=1,_=i.x!==t.x||i.y!==t.y||i.z!==t.z,y=!1,v=!1,C=!1;_&&(g=2,0<a&&(y=!0,f+=l-1),o<Math.PI&&(v=!0,f+=l-1),(n-r)%CesiumMath.TWO_PI?(C=!0,f+=2*(c-1)+1):f+=1);var S=m*p*g,T=new Float64Array(3*S),x=arrayFill(new Array(S),!1),b=arrayFill(new Array(S),!1),E=l*c*g,P=6*(E+f+1-(l+c)*g),A=IndexDatatype$1.createTypedArray(E,P),w=s.normal?new Float32Array(3*S):void 0,D=s.tangent?new Float32Array(3*S):void 0,M=s.bitangent?new Float32Array(3*S):void 0,I=s.st?new Float32Array(2*S):void 0,R=new Array(p),O=new Array(p);for(G=0;G<p;G++)R[G]=sin(d[G]),O[G]=cos(d[G]);for(var L=new Array(m),F=new Array(m),N=0;N<m;N++)F[N]=cos(h[N]),L[N]=sin(h[N]);for(G=0;G<p;G++)for(N=0;N<m;N++)T[u++]=t.x*R[G]*F[N],T[u++]=t.y*R[G]*L[N],T[u++]=t.z*O[G];var B,V,k,z,$=S/2;if(_)for(G=0;G<p;G++)for(N=0;N<m;N++)T[u++]=i.x*R[G]*F[N],T[u++]=i.y*R[G]*L[N],T[u++]=i.z*O[G],x[$]=!0,0<G&&G!==p-1&&0!==N&&N!==m-1&&(b[$]=!0),$++;for(u=0,G=1;G<p-2;G++)for(B=G*m,V=(G+1)*m,N=1;N<m-2;N++)A[u++]=V+N,A[u++]=V+N+1,A[u++]=B+N+1,A[u++]=V+N,A[u++]=B+N+1,A[u++]=B+N;if(_)for(var U=p*m,G=1;G<p-2;G++)for(B=U+G*m,V=U+(G+1)*m,N=1;N<m-2;N++)A[u++]=V+N,A[u++]=B+N,A[u++]=B+N+1,A[u++]=V+N,A[u++]=B+N+1,A[u++]=V+N+1;if(_){if(y)for(z=p*m,G=1;G<m-2;G++)A[u++]=G,A[u++]=G+1,A[u++]=z+G+1,A[u++]=G,A[u++]=z+G+1,A[u++]=z+G;if(v)for(k=p*m-m,z=p*m*g-m,G=1;G<m-2;G++)A[u++]=k+G+1,A[u++]=k+G,A[u++]=z+G,A[u++]=k+G+1,A[u++]=z+G,A[u++]=z+G+1}if(C){for(G=1;G<p-2;G++)z=m*p+m*G,k=m*G,A[u++]=z,A[u++]=k+m,A[u++]=k,A[u++]=z,A[u++]=z+m,A[u++]=k+m;for(G=1;G<p-2;G++)z=m*p+m*(G+1)-1,k=m*(G+1)-1,A[u++]=k+m,A[u++]=z,A[u++]=k,A[u++]=k+m,A[u++]=z+m,A[u++]=z}var H=new GeometryAttributes;s.position&&(H.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:T}));var W,q,j,Y=0,X=0,Q=0,J=0,Z=S/2,K=Ellipsoid.fromCartesian3(t),ee=Ellipsoid.fromCartesian3(i);if(s.st||s.normal||s.tangent||s.bitangent){for(G=0;G<S;G++){W=x[G]?ee:K;var te,ie,re,ne,ae,oe=Cartesian3.fromArray(T,3*G,scratchPosition$2),se=W.geodeticSurfaceNormal(oe,scratchNormal$4);b[G]&&Cartesian3.negate(se,se),s.st&&(te=Cartesian2.negate(se,scratchNormalST),I[Y++]=Math.atan2(te.y,te.x)/CesiumMath.TWO_PI+.5,I[Y++]=Math.asin(se.z)/Math.PI+.5),s.normal&&(w[X++]=se.x,w[X++]=se.y,w[X++]=se.z),(s.tangent||s.bitangent)&&(ie=scratchTangent$2,re=0,x[G]&&(re=Z),ne=!y&&re<=G&&G<re+2*m?Cartesian3.UNIT_X:Cartesian3.UNIT_Z,Cartesian3.cross(ne,se,ie),Cartesian3.normalize(ie,ie),s.tangent&&(D[Q++]=ie.x,D[Q++]=ie.y,D[Q++]=ie.z),s.bitangent&&(ae=Cartesian3.cross(se,ie,scratchBitangent$2),Cartesian3.normalize(ae,ae),M[J++]=ae.x,M[J++]=ae.y,M[J++]=ae.z))}s.st&&(H.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:I})),s.normal&&(H.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:w})),s.tangent&&(H.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:D})),s.bitangent&&(H.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:M}))}return defined(e._offsetAttribute)&&(q=T.length,arrayFill(j=new Uint8Array(q/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),H.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:j})),new Geometry({attributes:H,indices:A,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:BoundingSphere.fromEllipsoid(K),offsetAttribute:e._offsetAttribute})}}},EllipsoidGeometry.getUnitEllipsoid=function(){return defined(unitEllipsoidGeometry)||(unitEllipsoidGeometry=EllipsoidGeometry.createGeometry(new EllipsoidGeometry({radii:new Cartesian3(1,1,1),vertexFormat:VertexFormat.POSITION_ONLY}))),unitEllipsoidGeometry};var defaultRadii$1=new Cartesian3(1,1,1),cos$1=Math.cos,sin$1=Math.sin;function EllipsoidOutlineGeometry(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.radii,defaultRadii$1),i=defaultValue(e.innerRadii,t),r=defaultValue(e.minimumClock,0),n=defaultValue(e.maximumClock,CesiumMath.TWO_PI),a=defaultValue(e.minimumCone,0),o=defaultValue(e.maximumCone,CesiumMath.PI),s=Math.round(defaultValue(e.stackPartitions,10)),l=Math.round(defaultValue(e.slicePartitions,8)),c=Math.round(defaultValue(e.subdivisions,128));this._radii=Cartesian3.clone(t),this._innerRadii=Cartesian3.clone(i),this._minimumClock=r,this._maximumClock=n,this._minimumCone=a,this._maximumCone=o,this._stackPartitions=s,this._slicePartitions=l,this._subdivisions=c,this._offsetAttribute=e.offsetAttribute,this._workerName="createEllipsoidOutlineGeometry"}EllipsoidOutlineGeometry.packedLength=2*Cartesian3.packedLength+8,EllipsoidOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Cartesian3.pack(e._radii,t,i),i+=Cartesian3.packedLength,Cartesian3.pack(e._innerRadii,t,i),i+=Cartesian3.packedLength,t[i++]=e._minimumClock,t[i++]=e._maximumClock,t[i++]=e._minimumCone,t[i++]=e._maximumCone,t[i++]=e._stackPartitions,t[i++]=e._slicePartitions,t[i++]=e._subdivisions,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchRadii$1=new Cartesian3,scratchInnerRadii$1=new Cartesian3,scratchOptions$d={radii:scratchRadii$1,innerRadii:scratchInnerRadii$1,minimumClock:void 0,maximumClock:void 0,minimumCone:void 0,maximumCone:void 0,stackPartitions:void 0,slicePartitions:void 0,subdivisions:void 0,offsetAttribute:void 0};function EllipsoidTerrainProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._tilingScheme=e.tilingScheme,defined(this._tilingScheme)||(this._tilingScheme=new GeographicTilingScheme({ellipsoid:defaultValue(e.ellipsoid,Ellipsoid.WGS84)})),this._levelZeroMaximumGeometricError=TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this._tilingScheme.ellipsoid,64,this._tilingScheme.getNumberOfXTilesAtLevel(0)),this._errorEvent=new Event,this._readyPromise=when.resolve(!0)}function EventHelper(){this._removalFunctions=[]}EllipsoidOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Cartesian3.unpack(e,t,scratchRadii$1);t+=Cartesian3.packedLength;var n=Cartesian3.unpack(e,t,scratchInnerRadii$1);t+=Cartesian3.packedLength;var a=e[t++],o=e[t++],s=e[t++],l=e[t++],c=e[t++],u=e[t++],d=e[t++],h=e[t];return defined(i)?(i._radii=Cartesian3.clone(r,i._radii),i._innerRadii=Cartesian3.clone(n,i._innerRadii),i._minimumClock=a,i._maximumClock=o,i._minimumCone=s,i._maximumCone=l,i._stackPartitions=c,i._slicePartitions=u,i._subdivisions=d,i._offsetAttribute=-1===h?void 0:h,i):(scratchOptions$d.minimumClock=a,scratchOptions$d.maximumClock=o,scratchOptions$d.minimumCone=s,scratchOptions$d.maximumCone=l,scratchOptions$d.stackPartitions=c,scratchOptions$d.slicePartitions=u,scratchOptions$d.subdivisions=d,scratchOptions$d.offsetAttribute=-1===h?void 0:h,new EllipsoidOutlineGeometry(scratchOptions$d))},EllipsoidOutlineGeometry.createGeometry=function(e){var t=e._radii;if(!(t.x<=0||t.y<=0||t.z<=0)){var i=e._innerRadii;if(!(i.x<=0||i.y<=0||i.z<=0)){var r=e._minimumClock,n=e._maximumClock,a=e._minimumCone,o=e._maximumCone,s=e._subdivisions,l=Ellipsoid.fromCartesian3(t),c=e._slicePartitions+1,u=e._stackPartitions+1;(c=Math.round(c*Math.abs(n-r)/CesiumMath.TWO_PI))<2&&(c=2),(u=Math.round(u*Math.abs(o-a)/CesiumMath.PI))<2&&(u=2);var d=0,h=1,p=i.x!==t.x||i.y!==t.y||i.z!==t.z,m=!1,f=!1;p&&(h=2,0<a&&(m=!0,d+=c),o<Math.PI&&(f=!0,d+=c));for(var g,_,y=s*h*(u+c),v=new Float64Array(3*y),C=2*(y+d-(c+u)*h),S=IndexDatatype$1.createTypedArray(y,C),T=0,x=new Array(u),b=new Array(u),E=0;E<u;E++)_=a+E*(o-a)/(u-1),x[E]=sin$1(_),b[E]=cos$1(_);var P=new Array(s),A=new Array(s);for(E=0;E<s;E++)g=r+E*(n-r)/(s-1),P[E]=sin$1(g),A[E]=cos$1(g);for(E=0;E<u;E++)for(D=0;D<s;D++)v[T++]=t.x*x[E]*A[D],v[T++]=t.y*x[E]*P[D],v[T++]=t.z*b[E];if(p)for(E=0;E<u;E++)for(D=0;D<s;D++)v[T++]=i.x*x[E]*A[D],v[T++]=i.y*x[E]*P[D],v[T++]=i.z*b[E];for(x.length=s,b.length=s,E=0;E<s;E++)_=a+E*(o-a)/(s-1),x[E]=sin$1(_),b[E]=cos$1(_);for(P.length=c,A.length=c,E=0;E<c;E++)g=r+E*(n-r)/(c-1),P[E]=sin$1(g),A[E]=cos$1(g);for(E=0;E<s;E++)for(D=0;D<c;D++)v[T++]=t.x*x[E]*A[D],v[T++]=t.y*x[E]*P[D],v[T++]=t.z*b[E];if(p)for(E=0;E<s;E++)for(D=0;D<c;D++)v[T++]=i.x*x[E]*A[D],v[T++]=i.y*x[E]*P[D],v[T++]=i.z*b[E];for(E=T=0;E<u*h;E++)for(var w=E*s,D=0;D<s-1;D++)S[T++]=w+D,S[T++]=w+D+1;var M=u*s*h;for(E=0;E<c;E++)for(D=0;D<s-1;D++)S[T++]=M+E+D*c,S[T++]=M+E+(D+1)*c;if(p)for(M=u*s*h+c*s,E=0;E<c;E++)for(D=0;D<s-1;D++)S[T++]=M+E+D*c,S[T++]=M+E+(D+1)*c;if(p){var I=u*s*h,R=I+s*c;if(m)for(E=0;E<c;E++)S[T++]=I+E,S[T++]=R+E;if(f)for(I+=s*c-c,R+=s*c-c,E=0;E<c;E++)S[T++]=I+E,S[T++]=R+E}var O,L,F=new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:v})});return defined(e._offsetAttribute)&&(O=v.length,arrayFill(L=new Uint8Array(O/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),F.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:L})),new Geometry({attributes:F,indices:S,primitiveType:PrimitiveType$1.LINES,boundingSphere:BoundingSphere.fromEllipsoid(l),offsetAttribute:e._offsetAttribute})}}},Object.defineProperties(EllipsoidTerrainProvider.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},ready:{get:function(){return!0}},readyPromise:{get:function(){return this._readyPromise}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}}),EllipsoidTerrainProvider.prototype.requestTileGeometry=function(e,t,i,r){return when.resolve(new HeightmapTerrainData({buffer:new Uint8Array(256),width:16,height:16}))},EllipsoidTerrainProvider.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)},EllipsoidTerrainProvider.prototype.getTileDataAvailable=function(e,t,i){},EllipsoidTerrainProvider.prototype.loadTileDataAvailability=function(e,t,i){},EventHelper.prototype.add=function(e,t,i){var r=e.addEventListener(t,i);this._removalFunctions.push(r);var n=this;return function(){r();var e=n._removalFunctions;e.splice(e.indexOf(r),1)}},EventHelper.prototype.removeAll=function(){for(var e=this._removalFunctions,t=0,i=e.length;t<i;++t)e[t]();e.length=0};var ExtrapolationType={NONE:0,HOLD:1,EXTRAPOLATE:2},ExtrapolationType$1=Object.freeze(ExtrapolationType);function OrthographicOffCenterFrustum(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.left=e.left,this._left=void 0,this.right=e.right,this._right=void 0,this.top=e.top,this._top=void 0,this.bottom=e.bottom,this._bottom=void 0,this.near=defaultValue(e.near,1),this._near=this.near,this.far=defaultValue(e.far,5e8),this._far=this.far,this._cullingVolume=new CullingVolume,this._orthographicMatrix=new Matrix4}function update(e){e.top===e._top&&e.bottom===e._bottom&&e.left===e._left&&e.right===e._right&&e.near===e._near&&e.far===e._far||(e._left=e.left,e._right=e.right,e._top=e.top,e._bottom=e.bottom,e._near=e.near,e._far=e.far,e._orthographicMatrix=Matrix4.computeOrthographicOffCenter(e.left,e.right,e.bottom,e.top,e.near,e.far,e._orthographicMatrix))}Object.defineProperties(OrthographicOffCenterFrustum.prototype,{projectionMatrix:{get:function(){return update(this),this._orthographicMatrix}}});var getPlanesRight=new Cartesian3,getPlanesNearCenter=new Cartesian3,getPlanesPoint=new Cartesian3,negateScratch=new Cartesian3;function OrthographicFrustum(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._offCenterFrustum=new OrthographicOffCenterFrustum,this.width=e.width,this._width=void 0,this.aspectRatio=e.aspectRatio,this._aspectRatio=void 0,this.near=defaultValue(e.near,1),this._near=this.near,this.far=defaultValue(e.far,5e8),this._far=this.far}function update$1(e){var t,i=e._offCenterFrustum;e.width===e._width&&e.aspectRatio===e._aspectRatio&&e.near===e._near&&e.far===e._far||(e._aspectRatio=e.aspectRatio,e._width=e.width,e._near=e.near,e._far=e.far,t=1/e.aspectRatio,i.right=.5*e.width,i.left=-i.right,i.top=t*i.right,i.bottom=-i.top,i.near=e.near,i.far=e.far)}function PerspectiveOffCenterFrustum(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.left=e.left,this._left=void 0,this.right=e.right,this._right=void 0,this.top=e.top,this._top=void 0,this.bottom=e.bottom,this._bottom=void 0,this.near=defaultValue(e.near,1),this._near=this.near,this.far=defaultValue(e.far,5e8),this._far=this.far,this._cullingVolume=new CullingVolume,this._perspectiveMatrix=new Matrix4,this._infinitePerspective=new Matrix4}function update$2(e){var t=e.top,i=e.bottom,r=e.right,n=e.left,a=e.near,o=e.far;t===e._top&&i===e._bottom&&n===e._left&&r===e._right&&a===e._near&&o===e._far||(e._left=n,e._right=r,e._top=t,e._bottom=i,e._near=a,e._far=o,e._perspectiveMatrix=Matrix4.computePerspectiveOffCenter(n,r,i,t,a,o,e._perspectiveMatrix),e._infinitePerspective=Matrix4.computeInfinitePerspectiveOffCenter(n,r,i,t,a,e._infinitePerspective))}OrthographicOffCenterFrustum.prototype.computeCullingVolume=function(e,t,i){var r=this._cullingVolume.planes,n=this.top,a=this.bottom,o=this.right,s=this.left,l=this.near,c=this.far,u=Cartesian3.cross(t,i,getPlanesRight);Cartesian3.normalize(u,u);var d=getPlanesNearCenter;Cartesian3.multiplyByScalar(t,l,d),Cartesian3.add(e,d,d);var h=getPlanesPoint;Cartesian3.multiplyByScalar(u,s,h),Cartesian3.add(d,h,h);var p=r[0];return defined(p)||(p=r[0]=new Cartesian4),p.x=u.x,p.y=u.y,p.z=u.z,p.w=-Cartesian3.dot(u,h),Cartesian3.multiplyByScalar(u,o,h),Cartesian3.add(d,h,h),defined(p=r[1])||(p=r[1]=new Cartesian4),p.x=-u.x,p.y=-u.y,p.z=-u.z,p.w=-Cartesian3.dot(Cartesian3.negate(u,negateScratch),h),Cartesian3.multiplyByScalar(i,a,h),Cartesian3.add(d,h,h),defined(p=r[2])||(p=r[2]=new Cartesian4),p.x=i.x,p.y=i.y,p.z=i.z,p.w=-Cartesian3.dot(i,h),Cartesian3.multiplyByScalar(i,n,h),Cartesian3.add(d,h,h),defined(p=r[3])||(p=r[3]=new Cartesian4),p.x=-i.x,p.y=-i.y,p.z=-i.z,p.w=-Cartesian3.dot(Cartesian3.negate(i,negateScratch),h),defined(p=r[4])||(p=r[4]=new Cartesian4),p.x=t.x,p.y=t.y,p.z=t.z,p.w=-Cartesian3.dot(t,d),Cartesian3.multiplyByScalar(t,c,h),Cartesian3.add(e,h,h),defined(p=r[5])||(p=r[5]=new Cartesian4),p.x=-t.x,p.y=-t.y,p.z=-t.z,p.w=-Cartesian3.dot(Cartesian3.negate(t,negateScratch),h),this._cullingVolume},OrthographicOffCenterFrustum.prototype.getPixelDimensions=function(e,t,i,r,n){update(this);var a=r*(this.right-this.left)/e,o=r*(this.top-this.bottom)/t;return n.x=a,n.y=o,n},OrthographicOffCenterFrustum.prototype.clone=function(e){return defined(e)||(e=new OrthographicOffCenterFrustum),e.left=this.left,e.right=this.right,e.top=this.top,e.bottom=this.bottom,e.near=this.near,e.far=this.far,e._left=void 0,e._right=void 0,e._top=void 0,e._bottom=void 0,e._near=void 0,e._far=void 0,e},OrthographicOffCenterFrustum.prototype.equals=function(e){return defined(e)&&e instanceof OrthographicOffCenterFrustum&&this.right===e.right&&this.left===e.left&&this.top===e.top&&this.bottom===e.bottom&&this.near===e.near&&this.far===e.far},OrthographicOffCenterFrustum.prototype.equalsEpsilon=function(e,t,i){return e===this||defined(e)&&e instanceof OrthographicOffCenterFrustum&&CesiumMath.equalsEpsilon(this.right,e.right,t,i)&&CesiumMath.equalsEpsilon(this.left,e.left,t,i)&&CesiumMath.equalsEpsilon(this.top,e.top,t,i)&&CesiumMath.equalsEpsilon(this.bottom,e.bottom,t,i)&&CesiumMath.equalsEpsilon(this.near,e.near,t,i)&&CesiumMath.equalsEpsilon(this.far,e.far,t,i)},OrthographicFrustum.packedLength=4,OrthographicFrustum.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.width,t[i++]=e.aspectRatio,t[i++]=e.near,t[i]=e.far,t},OrthographicFrustum.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new OrthographicFrustum),i.width=e[t++],i.aspectRatio=e[t++],i.near=e[t++],i.far=e[t],i},Object.defineProperties(OrthographicFrustum.prototype,{projectionMatrix:{get:function(){return update$1(this),this._offCenterFrustum.projectionMatrix}}}),OrthographicFrustum.prototype.computeCullingVolume=function(e,t,i){return update$1(this),this._offCenterFrustum.computeCullingVolume(e,t,i)},OrthographicFrustum.prototype.getPixelDimensions=function(e,t,i,r,n){return update$1(this),this._offCenterFrustum.getPixelDimensions(e,t,i,r,n)},OrthographicFrustum.prototype.clone=function(e){return defined(e)||(e=new OrthographicFrustum),e.aspectRatio=this.aspectRatio,e.width=this.width,e.near=this.near,e.far=this.far,e._aspectRatio=void 0,e._width=void 0,e._near=void 0,e._far=void 0,this._offCenterFrustum.clone(e._offCenterFrustum),e},OrthographicFrustum.prototype.equals=function(e){return!!(defined(e)&&e instanceof OrthographicFrustum)&&(update$1(this),update$1(e),this.width===e.width&&this.aspectRatio===e.aspectRatio&&this._offCenterFrustum.equals(e._offCenterFrustum))},OrthographicFrustum.prototype.equalsEpsilon=function(e,t,i){return!!(defined(e)&&e instanceof OrthographicFrustum)&&(update$1(this),update$1(e),CesiumMath.equalsEpsilon(this.width,e.width,t,i)&&CesiumMath.equalsEpsilon(this.aspectRatio,e.aspectRatio,t,i)&&this._offCenterFrustum.equalsEpsilon(e._offCenterFrustum,t,i))},Object.defineProperties(PerspectiveOffCenterFrustum.prototype,{projectionMatrix:{get:function(){return update$2(this),this._perspectiveMatrix}},infiniteProjectionMatrix:{get:function(){return update$2(this),this._infinitePerspective}}});var getPlanesRight$1=new Cartesian3,getPlanesNearCenter$1=new Cartesian3,getPlanesFarCenter=new Cartesian3,getPlanesNormal=new Cartesian3;function PerspectiveFrustum(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._offCenterFrustum=new PerspectiveOffCenterFrustum,this.fov=e.fov,this._fov=void 0,this._fovy=void 0,this._sseDenominator=void 0,this.aspectRatio=e.aspectRatio,this._aspectRatio=void 0,this.near=defaultValue(e.near,1),this._near=this.near,this.far=defaultValue(e.far,5e8),this._far=this.far,this.xOffset=defaultValue(e.xOffset,0),this._xOffset=this.xOffset,this.yOffset=defaultValue(e.yOffset,0),this._yOffset=this.yOffset}function update$3(e){var t=e._offCenterFrustum;e.fov===e._fov&&e.aspectRatio===e._aspectRatio&&e.near===e._near&&e.far===e._far&&e.xOffset===e._xOffset&&e.yOffset===e._yOffset||(e._aspectRatio=e.aspectRatio,e._fov=e.fov,e._fovy=e.aspectRatio<=1?e.fov:2*Math.atan(Math.tan(.5*e.fov)/e.aspectRatio),e._near=e.near,e._far=e.far,e._sseDenominator=2*Math.tan(.5*e._fovy),e._xOffset=e.xOffset,e._yOffset=e.yOffset,t.top=e.near*Math.tan(.5*e._fovy),t.bottom=-t.top,t.right=e.aspectRatio*t.top,t.left=-t.right,t.near=e.near,t.far=e.far,t.right+=e.xOffset,t.left+=e.xOffset,t.top+=e.yOffset,t.bottom+=e.yOffset)}PerspectiveOffCenterFrustum.prototype.computeCullingVolume=function(e,t,i){var r=this._cullingVolume.planes,n=this.top,a=this.bottom,o=this.right,s=this.left,l=this.near,c=this.far,u=Cartesian3.cross(t,i,getPlanesRight$1),d=getPlanesNearCenter$1;Cartesian3.multiplyByScalar(t,l,d),Cartesian3.add(e,d,d);var h=getPlanesFarCenter;Cartesian3.multiplyByScalar(t,c,h),Cartesian3.add(e,h,h);var p=getPlanesNormal;Cartesian3.multiplyByScalar(u,s,p),Cartesian3.add(d,p,p),Cartesian3.subtract(p,e,p),Cartesian3.normalize(p,p),Cartesian3.cross(p,i,p),Cartesian3.normalize(p,p);var m=r[0];return defined(m)||(m=r[0]=new Cartesian4),m.x=p.x,m.y=p.y,m.z=p.z,m.w=-Cartesian3.dot(p,e),Cartesian3.multiplyByScalar(u,o,p),Cartesian3.add(d,p,p),Cartesian3.subtract(p,e,p),Cartesian3.cross(i,p,p),Cartesian3.normalize(p,p),defined(m=r[1])||(m=r[1]=new Cartesian4),m.x=p.x,m.y=p.y,m.z=p.z,m.w=-Cartesian3.dot(p,e),Cartesian3.multiplyByScalar(i,a,p),Cartesian3.add(d,p,p),Cartesian3.subtract(p,e,p),Cartesian3.cross(u,p,p),Cartesian3.normalize(p,p),defined(m=r[2])||(m=r[2]=new Cartesian4),m.x=p.x,m.y=p.y,m.z=p.z,m.w=-Cartesian3.dot(p,e),Cartesian3.multiplyByScalar(i,n,p),Cartesian3.add(d,p,p),Cartesian3.subtract(p,e,p),Cartesian3.cross(p,u,p),Cartesian3.normalize(p,p),defined(m=r[3])||(m=r[3]=new Cartesian4),m.x=p.x,m.y=p.y,m.z=p.z,m.w=-Cartesian3.dot(p,e),defined(m=r[4])||(m=r[4]=new Cartesian4),m.x=t.x,m.y=t.y,m.z=t.z,m.w=-Cartesian3.dot(t,d),Cartesian3.negate(t,p),defined(m=r[5])||(m=r[5]=new Cartesian4),m.x=p.x,m.y=p.y,m.z=p.z,m.w=-Cartesian3.dot(p,h),this._cullingVolume},PerspectiveOffCenterFrustum.prototype.getPixelDimensions=function(e,t,i,r,n){update$2(this);var a=1/this.near,o=2*r*i*(this.top*a)/t,s=2*r*i*(this.right*a)/e;return n.x=s,n.y=o,n},PerspectiveOffCenterFrustum.prototype.clone=function(e){return defined(e)||(e=new PerspectiveOffCenterFrustum),e.right=this.right,e.left=this.left,e.top=this.top,e.bottom=this.bottom,e.near=this.near,e.far=this.far,e._left=void 0,e._right=void 0,e._top=void 0,e._bottom=void 0,e._near=void 0,e._far=void 0,e},PerspectiveOffCenterFrustum.prototype.equals=function(e){return defined(e)&&e instanceof PerspectiveOffCenterFrustum&&this.right===e.right&&this.left===e.left&&this.top===e.top&&this.bottom===e.bottom&&this.near===e.near&&this.far===e.far},PerspectiveOffCenterFrustum.prototype.equalsEpsilon=function(e,t,i){return e===this||defined(e)&&e instanceof PerspectiveOffCenterFrustum&&CesiumMath.equalsEpsilon(this.right,e.right,t,i)&&CesiumMath.equalsEpsilon(this.left,e.left,t,i)&&CesiumMath.equalsEpsilon(this.top,e.top,t,i)&&CesiumMath.equalsEpsilon(this.bottom,e.bottom,t,i)&&CesiumMath.equalsEpsilon(this.near,e.near,t,i)&&CesiumMath.equalsEpsilon(this.far,e.far,t,i)},PerspectiveFrustum.packedLength=6,PerspectiveFrustum.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.fov,t[i++]=e.aspectRatio,t[i++]=e.near,t[i++]=e.far,t[i++]=e.xOffset,t[i]=e.yOffset,t},PerspectiveFrustum.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new PerspectiveFrustum),i.fov=e[t++],i.aspectRatio=e[t++],i.near=e[t++],i.far=e[t++],i.xOffset=e[t++],i.yOffset=e[t],i},Object.defineProperties(PerspectiveFrustum.prototype,{projectionMatrix:{get:function(){return update$3(this),this._offCenterFrustum.projectionMatrix}},infiniteProjectionMatrix:{get:function(){return update$3(this),this._offCenterFrustum.infiniteProjectionMatrix}},fovy:{get:function(){return update$3(this),this._fovy}},sseDenominator:{get:function(){return update$3(this),this._sseDenominator}}}),PerspectiveFrustum.prototype.computeCullingVolume=function(e,t,i){return update$3(this),this._offCenterFrustum.computeCullingVolume(e,t,i)},PerspectiveFrustum.prototype.getPixelDimensions=function(e,t,i,r,n){return update$3(this),this._offCenterFrustum.getPixelDimensions(e,t,i,r,n)},PerspectiveFrustum.prototype.clone=function(e){return defined(e)||(e=new PerspectiveFrustum),e.aspectRatio=this.aspectRatio,e.fov=this.fov,e.near=this.near,e.far=this.far,e._aspectRatio=void 0,e._fov=void 0,e._near=void 0,e._far=void 0,this._offCenterFrustum.clone(e._offCenterFrustum),e},PerspectiveFrustum.prototype.equals=function(e){return!!(defined(e)&&e instanceof PerspectiveFrustum)&&(update$3(this),update$3(e),this.fov===e.fov&&this.aspectRatio===e.aspectRatio&&this._offCenterFrustum.equals(e._offCenterFrustum))},PerspectiveFrustum.prototype.equalsEpsilon=function(e,t,i){return!!(defined(e)&&e instanceof PerspectiveFrustum)&&(update$3(this),update$3(e),CesiumMath.equalsEpsilon(this.fov,e.fov,t,i)&&CesiumMath.equalsEpsilon(this.aspectRatio,e.aspectRatio,t,i)&&this._offCenterFrustum.equalsEpsilon(e._offCenterFrustum,t,i))};var PERSPECTIVE=0,ORTHOGRAPHIC=1;function FrustumGeometry(e){var t,i,r=e.frustum,n=e.orientation,a=e.origin,o=defaultValue(e.vertexFormat,VertexFormat.DEFAULT),s=defaultValue(e._drawNearPlane,!0);r instanceof PerspectiveFrustum?(t=PERSPECTIVE,i=PerspectiveFrustum.packedLength):r instanceof OrthographicFrustum&&(t=ORTHOGRAPHIC,i=OrthographicFrustum.packedLength),this._frustumType=t,this._frustum=r.clone(),this._origin=Cartesian3.clone(a),this._orientation=Quaternion.clone(n),this._drawNearPlane=s,this._vertexFormat=o,this._workerName="createFrustumGeometry",this.packedLength=2+i+Cartesian3.packedLength+Quaternion.packedLength+VertexFormat.packedLength}FrustumGeometry.pack=function(e,t,i){i=defaultValue(i,0);var r=e._frustumType,n=e._frustum;return(t[i++]=r)===PERSPECTIVE?(PerspectiveFrustum.pack(n,t,i),i+=PerspectiveFrustum.packedLength):(OrthographicFrustum.pack(n,t,i),i+=OrthographicFrustum.packedLength),Cartesian3.pack(e._origin,t,i),i+=Cartesian3.packedLength,Quaternion.pack(e._orientation,t,i),i+=Quaternion.packedLength,VertexFormat.pack(e._vertexFormat,t,i),t[i+=VertexFormat.packedLength]=e._drawNearPlane?1:0,t};var scratchPackPerspective=new PerspectiveFrustum,scratchPackOrthographic=new OrthographicFrustum,scratchPackQuaternion=new Quaternion,scratchPackorigin=new Cartesian3,scratchVertexFormat$6=new VertexFormat;function getAttributes(e,t,i,r,n,a,o,s){for(var l=e/3*2,c=0;c<4;++c)defined(t)&&(t[e]=a.x,t[e+1]=a.y,t[e+2]=a.z),defined(i)&&(i[e]=o.x,i[e+1]=o.y,i[e+2]=o.z),defined(r)&&(r[e]=s.x,r[e+1]=s.y,r[e+2]=s.z),e+=3;n[l]=0,n[1+l]=0,n[2+l]=1,n[3+l]=0,n[4+l]=1,n[5+l]=1,n[6+l]=0,n[7+l]=1}FrustumGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r,n=e[t++];n===PERSPECTIVE?(r=PerspectiveFrustum.unpack(e,t,scratchPackPerspective),t+=PerspectiveFrustum.packedLength):(r=OrthographicFrustum.unpack(e,t,scratchPackOrthographic),t+=OrthographicFrustum.packedLength);var a=Cartesian3.unpack(e,t,scratchPackorigin);t+=Cartesian3.packedLength;var o=Quaternion.unpack(e,t,scratchPackQuaternion);t+=Quaternion.packedLength;var s=VertexFormat.unpack(e,t,scratchVertexFormat$6),l=1===e[t+=VertexFormat.packedLength];if(!defined(i))return new FrustumGeometry({frustum:r,origin:a,orientation:o,vertexFormat:s,_drawNearPlane:l});var c=n===i._frustumType?i._frustum:void 0;return i._frustum=r.clone(c),i._frustumType=n,i._origin=Cartesian3.clone(a,i._origin),i._orientation=Quaternion.clone(o,i._orientation),i._vertexFormat=VertexFormat.clone(s,i._vertexFormat),i._drawNearPlane=l,i};var scratchRotationMatrix=new Matrix3,scratchViewMatrix=new Matrix4,scratchInverseMatrix=new Matrix4,scratchXDirection=new Cartesian3,scratchYDirection=new Cartesian3,scratchZDirection=new Cartesian3,scratchNegativeX=new Cartesian3,scratchNegativeY=new Cartesian3,scratchNegativeZ=new Cartesian3,frustumSplits=new Array(3),frustumCornersNDC=new Array(4);frustumCornersNDC[0]=new Cartesian4(-1,-1,1,1),frustumCornersNDC[1]=new Cartesian4(1,-1,1,1),frustumCornersNDC[2]=new Cartesian4(1,1,1,1),frustumCornersNDC[3]=new Cartesian4(-1,1,1,1);for(var scratchFrustumCorners=new Array(4),i$1=0;i$1<4;++i$1)scratchFrustumCorners[i$1]=new Cartesian4;FrustumGeometry._computeNearFarPlanes=function(e,t,i,r,n,a,o,s){var l=Matrix3.fromQuaternion(t,scratchRotationMatrix),c=defaultValue(a,scratchXDirection),u=defaultValue(o,scratchYDirection),d=defaultValue(s,scratchZDirection),c=Matrix3.getColumn(l,0,c),u=Matrix3.getColumn(l,1,u),d=Matrix3.getColumn(l,2,d);Cartesian3.normalize(c,c),Cartesian3.normalize(u,u),Cartesian3.normalize(d,d),Cartesian3.negate(c,c);var h,p,m,f,g=Matrix4.computeView(e,d,u,c,scratchViewMatrix);i===PERSPECTIVE?(p=r.projectionMatrix,m=Matrix4.multiply(p,g,scratchInverseMatrix),f=Matrix4.inverse(m,scratchInverseMatrix)):h=Matrix4.inverseTransformation(g,scratchInverseMatrix),defined(f)?(frustumSplits[0]=r.near,frustumSplits[1]=r.far):(frustumSplits[0]=0,frustumSplits[1]=r.near,frustumSplits[2]=r.far);for(var _=0;_<2;++_)for(var y=0;y<4;++y){var v,C,S,T,x=Cartesian4.clone(frustumCornersNDC[y],scratchFrustumCorners[y]);defined(f)?(v=1/(x=Matrix4.multiplyByVector(f,x,x)).w,Cartesian3.multiplyByScalar(x,v,x),Cartesian3.subtract(x,e,x),Cartesian3.normalize(x,x),C=Cartesian3.dot(d,x),Cartesian3.multiplyByScalar(x,frustumSplits[_]/C,x),Cartesian3.add(x,e,x)):(defined(r._offCenterFrustum)&&(r=r._offCenterFrustum),S=frustumSplits[_],T=frustumSplits[_+1],x.x=.5*(x.x*(r.right-r.left)+r.left+r.right),x.y=.5*(x.y*(r.top-r.bottom)+r.bottom+r.top),x.z=.5*(x.z*(S-T)-S-T),x.w=1,Matrix4.multiplyByVector(h,x,x)),n[12*_+3*y]=x.x,n[12*_+3*y+1]=x.y,n[12*_+3*y+2]=x.z}},FrustumGeometry.createGeometry=function(e){var t=e._frustumType,i=e._frustum,r=e._origin,n=e._orientation,a=e._drawNearPlane,o=e._vertexFormat,s=a?6:5,l=new Float64Array(72);FrustumGeometry._computeNearFarPlanes(r,n,t,i,l);var c=24;l[c]=l[12],l[c+1]=l[13],l[c+2]=l[14],l[c+3]=l[0],l[c+4]=l[1],l[c+5]=l[2],l[c+6]=l[9],l[c+7]=l[10],l[c+8]=l[11],l[c+9]=l[21],l[c+10]=l[22],l[c+11]=l[23],l[c+=12]=l[15],l[c+1]=l[16],l[c+2]=l[17],l[c+3]=l[3],l[c+4]=l[4],l[c+5]=l[5],l[c+6]=l[0],l[c+7]=l[1],l[c+8]=l[2],l[c+9]=l[12],l[c+10]=l[13],l[c+11]=l[14],l[c+=12]=l[3],l[c+1]=l[4],l[c+2]=l[5],l[c+3]=l[15],l[c+4]=l[16],l[c+5]=l[17],l[c+6]=l[18],l[c+7]=l[19],l[c+8]=l[20],l[c+9]=l[6],l[c+10]=l[7],l[c+11]=l[8],l[c+=12]=l[6],l[c+1]=l[7],l[c+2]=l[8],l[c+3]=l[18],l[c+4]=l[19],l[c+5]=l[20],l[c+6]=l[21],l[c+7]=l[22],l[c+8]=l[23],l[c+9]=l[9],l[c+10]=l[10],l[c+11]=l[11],a||(l=l.subarray(12));var u,d,h,p,m,f,g,_,y,v,C=new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:l})});(defined(o.normal)||defined(o.tangent)||defined(o.bitangent)||defined(o.st))&&(u=defined(o.normal)?new Float32Array(12*s):void 0,d=defined(o.tangent)?new Float32Array(12*s):void 0,h=defined(o.bitangent)?new Float32Array(12*s):void 0,p=defined(o.st)?new Float32Array(8*s):void 0,m=scratchXDirection,f=scratchYDirection,g=scratchZDirection,_=Cartesian3.negate(m,scratchNegativeX),y=Cartesian3.negate(f,scratchNegativeY),v=Cartesian3.negate(g,scratchNegativeZ),c=0,a&&(getAttributes(c,u,d,h,p,v,m,f),c+=12),getAttributes(c,u,d,h,p,g,_,f),getAttributes(c+=12,u,d,h,p,_,v,f),getAttributes(c+=12,u,d,h,p,y,v,_),getAttributes(c+=12,u,d,h,p,m,g,f),getAttributes(c+=12,u,d,h,p,f,g,_),defined(u)&&(C.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:u})),defined(d)&&(C.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:d})),defined(h)&&(C.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:h})),defined(p)&&(C.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:p})));for(var S=new Uint16Array(6*s),T=0;T<s;++T){var x=6*T,b=4*T;S[x]=b,S[1+x]=1+b,S[2+x]=2+b,S[3+x]=b,S[4+x]=2+b,S[5+x]=3+b}return new Geometry({attributes:C,indices:S,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:BoundingSphere.fromVertices(l)})};var PERSPECTIVE$1=0,ORTHOGRAPHIC$1=1;function FrustumOutlineGeometry(e){var t,i,r=e.frustum,n=e.orientation,a=e.origin,o=defaultValue(e._drawNearPlane,!0);r instanceof PerspectiveFrustum?(t=PERSPECTIVE$1,i=PerspectiveFrustum.packedLength):r instanceof OrthographicFrustum&&(t=ORTHOGRAPHIC$1,i=OrthographicFrustum.packedLength),this._frustumType=t,this._frustum=r.clone(),this._origin=Cartesian3.clone(a),this._orientation=Quaternion.clone(n),this._drawNearPlane=o,this._workerName="createFrustumOutlineGeometry",this.packedLength=2+i+Cartesian3.packedLength+Quaternion.packedLength}FrustumOutlineGeometry.pack=function(e,t,i){i=defaultValue(i,0);var r=e._frustumType,n=e._frustum;return(t[i++]=r)===PERSPECTIVE$1?(PerspectiveFrustum.pack(n,t,i),i+=PerspectiveFrustum.packedLength):(OrthographicFrustum.pack(n,t,i),i+=OrthographicFrustum.packedLength),Cartesian3.pack(e._origin,t,i),i+=Cartesian3.packedLength,Quaternion.pack(e._orientation,t,i),t[i+=Quaternion.packedLength]=e._drawNearPlane?1:0,t};var scratchPackPerspective$1=new PerspectiveFrustum,scratchPackOrthographic$1=new OrthographicFrustum,scratchPackQuaternion$1=new Quaternion,scratchPackorigin$1=new Cartesian3;FrustumOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r,n=e[t++];n===PERSPECTIVE$1?(r=PerspectiveFrustum.unpack(e,t,scratchPackPerspective$1),t+=PerspectiveFrustum.packedLength):(r=OrthographicFrustum.unpack(e,t,scratchPackOrthographic$1),t+=OrthographicFrustum.packedLength);var a=Cartesian3.unpack(e,t,scratchPackorigin$1);t+=Cartesian3.packedLength;var o=Quaternion.unpack(e,t,scratchPackQuaternion$1),s=1===e[t+=Quaternion.packedLength];if(!defined(i))return new FrustumOutlineGeometry({frustum:r,origin:a,orientation:o,_drawNearPlane:s});var l=n===i._frustumType?i._frustum:void 0;return i._frustum=r.clone(l),i._frustumType=n,i._origin=Cartesian3.clone(a,i._origin),i._orientation=Quaternion.clone(o,i._orientation),i._drawNearPlane=s,i},FrustumOutlineGeometry.createGeometry=function(e){var t=e._frustumType,i=e._frustum,r=e._origin,n=e._orientation,a=e._drawNearPlane,o=new Float64Array(24);FrustumGeometry._computeNearFarPlanes(r,n,t,i,o);for(var s,l,c=new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:o})}),u=a?2:1,d=new Uint16Array(8*(1+u)),h=a?0:1;h<2;++h)l=4*h,d[s=a?8*h:0]=l,d[s+1]=l+1,d[s+2]=l+1,d[s+3]=l+2,d[s+4]=l+2,d[s+5]=l+3,d[s+6]=l+3,d[s+7]=l;for(h=0;h<2;++h)l=4*h,d[s=8*(u+h)]=l,d[s+1]=l+4,d[s+2]=l+1,d[s+3]=l+5,d[s+4]=l+2,d[s+5]=l+6,d[s+6]=l+3,d[s+7]=l+7;return new Geometry({attributes:c,indices:d,primitiveType:PrimitiveType$1.LINES,boundingSphere:BoundingSphere.fromVertices(o)})};var GeocodeType={SEARCH:0,AUTOCOMPLETE:1},GeocodeType$1=Object.freeze(GeocodeType);function GeocoderService(){}function GeometryFactory(){DeveloperError.throwInstantiationError()}function GeometryInstanceAttribute(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.componentDatatype=e.componentDatatype,this.componentsPerAttribute=e.componentsPerAttribute,this.normalize=defaultValue(e.normalize,!1),this.value=e.value}GeocoderService.prototype.geocode=DeveloperError.throwInstantiationError,GeometryFactory.createGeometry=function(e){DeveloperError.throwInstantiationError()};var tmp$1={};!function(global,undefined$1){var nJb,oJb,pJb;nJb={1:[function(e,t,i){t.exports=function(e,t){for(var i=[],r=2;r<arguments.length;)i.push(arguments[r++]);var a=!0;return new Promise(function(r,n){i.push(function(e){if(a)if(a=!1,e)n(e);else{for(var t=[],i=1;i<arguments.length;)t.push(arguments[i++]);r.apply(null,t)}});try{e.apply(t||this,i)}catch(e){a&&(a=!1,n(e))}})}},{}],2:[function(e,t,i){var r=i;r.length=function(e){var t=e.length;if(!t)return 0;for(var i=0;1<--t%4&&"="===e.charAt(t);)++i;return Math.ceil(3*e.length)/4-i};for(var l=new Array(64),c=new Array(123),n=0;n<64;)c[l[n]=n<26?n+65:n<52?n+71:n<62?n-4:n-59|43]=n++;r.encode=function(e,t,i){for(var r,n=[],a=0,o=0;t<i;){var s=e[t++];switch(o){case 0:n[a++]=l[s>>2],r=(3&s)<<4,o=1;break;case 1:n[a++]=l[r|s>>4],r=(15&s)<<2,o=2;break;case 2:n[a++]=l[r|s>>6],n[a++]=l[63&s],o=0}}return o&&(n[a++]=l[r],n[a]=61,1===o&&(n[a+1]=61)),String.fromCharCode.apply(String,n)};var u="invalid encoding";r.decode=function(e,t,i){for(var r,n=i,a=0,o=0;o<e.length;){var s=e.charCodeAt(o++);if(61===s&&1<a)break;if((s=c[s])===undefined$1)throw Error(u);switch(a){case 0:r=s,a=1;break;case 1:t[i++]=r<<2|(48&s)>>4,r=s,a=2;break;case 2:t[i++]=(15&r)<<4|(60&s)>>2,r=s,a=3;break;case 3:t[i++]=(3&r)<<6|s,a=0}}if(1===a)throw Error(u);return i-n},r.test=function(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)}},{}],3:[function(e,t,i){function r(){this._listeners={}}(t.exports=r).prototype.on=function(e,t,i){return(this._listeners[e]||(this._listeners[e]=[])).push({fn:t,ctx:i||this}),this},r.prototype.off=function(e,t){if(e===undefined$1)this._listeners={};else if(t===undefined$1)this._listeners[e]=[];else for(var i=this._listeners[e],r=0;r<i.length;)i[r].fn===t?i.splice(r,1):++r;return this},r.prototype.emit=function(e){var t=this._listeners[e];if(t){for(var i=[],r=1;r<arguments.length;)i.push(arguments[r++]);for(r=0;r<t.length;)t[r].fn.apply(t[r++].ctx,i)}return this}},{}],4:[function(require,module,exports){function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(e){}return null}module.exports=inquire},{}],5:[function(e,t,i){t.exports=function(i,r,e){var n=e||8192,a=n>>>1,o=null,s=n;return function(e){if(e<1||a<e)return i(e);n<s+e&&(o=i(n),s=0);var t=r.call(o,s,s+=e);return 7&s&&(s=1+(7|s)),t}}},{}],6:[function(e,t,i){var r=i;r.length=function(e){for(var t,i=0,r=0;r<e.length;++r)(t=e.charCodeAt(r))<128?i+=1:t<2048?i+=2:55296==(64512&t)&&56320==(64512&e.charCodeAt(r+1))?(++r,i+=4):i+=3;return i},r.read=function(e,t,i){if(i-t<1)return"";for(var r,n=null,a=[],o=0;t<i;)(r=e[t++])<128?a[o++]=r:191<r&&r<224?a[o++]=(31&r)<<6|63&e[t++]:239<r&&r<365?(r=((7&r)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++])-65536,a[o++]=55296+(r>>10),a[o++]=56320+(1023&r)):a[o++]=(15&r)<<12|(63&e[t++])<<6|63&e[t++],8191<o&&((n=n||[]).push(String.fromCharCode.apply(String,a)),o=0);return n?(o&&n.push(String.fromCharCode.apply(String,a.slice(0,o))),n.join("")):String.fromCharCode.apply(String,a.slice(0,o))},r.write=function(e,t,i){for(var r,n,a=i,o=0;o<e.length;++o)(r=e.charCodeAt(o))<128?t[i++]=r:(r<2048?t[i++]=r>>6|192:(55296==(64512&r)&&56320==(64512&(n=e.charCodeAt(o+1)))?(r=65536+((1023&r)<<10)+(1023&n),++o,t[i++]=r>>18|240,t[i++]=r>>12&63|128):t[i++]=r>>12|224,t[i++]=r>>6&63|128),t[i++]=63&r|128);return i-a}},{}],7:[function(e,t,i){var r=i;function n(){r.Reader._configure(r.BufferReader),r.util._configure()}r.build="minimal",r.roots={},r.Writer=e(14),r.BufferWriter=e(15),r.Reader=e(8),r.BufferReader=e(9),r.util=e(13),r.rpc=e(10),r.configure=n,r.Writer._configure(r.BufferWriter),n()},{10:10,13:13,14:14,15:15,8:8,9:9}],8:[function(e,t,i){t.exports=l;var r,n=e(13),a=n.LongBits,o=n.utf8;function s(e,t){return RangeError("index out of range: "+e.pos+" + "+(t||1)+" > "+e.len)}function l(e){this.buf=e,this.pos=0,this.len=e.length}var c,u="undefined"!=typeof Uint8Array?function(e){if(e instanceof Uint8Array||Array.isArray(e))return new l(e);throw Error("illegal buffer")}:function(e){if(Array.isArray(e))return new l(e);throw Error("illegal buffer")};function d(){var e=new a(0,0),t=0;if(!(4<this.len-this.pos)){for(;t<3;++t){if(this.pos>=this.len)throw s(this);if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(127&this.buf[this.pos++])<<7*t)>>>0,e}for(;t<4;++t)if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(127&this.buf[this.pos])<<28)>>>0,e.hi=(e.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return e;if(t=0,4<this.len-this.pos){for(;t<5;++t)if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw s(this);if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}throw Error("invalid varint encoding")}function h(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}function p(){if(this.pos+8>this.len)throw s(this,8);return new a(h(this.buf,this.pos+=4),h(this.buf,this.pos+=4))}l.create=n.Buffer?function(e){return(l.create=function(e){return n.Buffer.isBuffer(e)?new r(e):u(e)})(e)}:u,l.prototype._slice=n.Array.prototype.subarray||n.Array.prototype.slice,l.prototype.uint32=(c=4294967295,function(){if(c=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return c;if(c=(c|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return c;if(c=(c|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return c;if(c=(c|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return c;if(c=(c|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return c;if((this.pos+=5)>this.len)throw this.pos=this.len,s(this,10);return c}),l.prototype.int32=function(){return 0|this.uint32()},l.prototype.sint32=function(){var e=this.uint32();return e>>>1^-(1&e)|0},l.prototype.bool=function(){return 0!==this.uint32()},l.prototype.fixed32=function(){if(this.pos+4>this.len)throw s(this,4);return h(this.buf,this.pos+=4)},l.prototype.sfixed32=function(){if(this.pos+4>this.len)throw s(this,4);return 0|h(this.buf,this.pos+=4)};var m,f,g="undefined"!=typeof Float32Array?(m=new Float32Array(1),f=new Uint8Array(m.buffer),m[0]=-0,f[3]?function(e,t){return f[0]=e[t],f[1]=e[t+1],f[2]=e[t+2],f[3]=e[t+3],m[0]}:function(e,t){return f[0]=e[t+3],f[1]=e[t+2],f[2]=e[t+1],f[3]=e[t],m[0]}):function(e,t){var i=h(e,t+4),r=2*(i>>31)+1,n=i>>>23&255,a=8388607&i;return 255==n?a?NaN:1/0*r:0==n?1401298464324817e-60*r*a:r*Math.pow(2,n-150)*(8388608+a)};l.prototype.float=function(){if(this.pos+4>this.len)throw s(this,4);var e=g(this.buf,this.pos);return this.pos+=4,e};var _,y,v="undefined"!=typeof Float64Array?(_=new Float64Array(1),y=new Uint8Array(_.buffer),_[0]=-0,y[7]?function(e,t){return y[0]=e[t],y[1]=e[t+1],y[2]=e[t+2],y[3]=e[t+3],y[4]=e[t+4],y[5]=e[t+5],y[6]=e[t+6],y[7]=e[t+7],_[0]}:function(e,t){return y[0]=e[t+7],y[1]=e[t+6],y[2]=e[t+5],y[3]=e[t+4],y[4]=e[t+3],y[5]=e[t+2],y[6]=e[t+1],y[7]=e[t],_[0]}):function(e,t){var i=h(e,t+4),r=h(e,t+8),n=2*(r>>31)+1,a=r>>>20&2047,o=4294967296*(1048575&r)+i;return 2047==a?o?NaN:1/0*n:0==a?5e-324*n*o:n*Math.pow(2,a-1075)*(o+4503599627370496)};l.prototype.double=function(){if(this.pos+8>this.len)throw s(this,4);var e=v(this.buf,this.pos);return this.pos+=8,e},l.prototype.bytes=function(){var e=this.uint32(),t=this.pos,i=this.pos+e;if(i>this.len)throw s(this,e);return this.pos+=e,t===i?new this.buf.constructor(0):this._slice.call(this.buf,t,i)},l.prototype.string=function(){var e=this.bytes();return o.read(e,0,e.length)},l.prototype.skip=function(e){if("number"==typeof e){if(this.pos+e>this.len)throw s(this,e);this.pos+=e}else do{if(this.pos>=this.len)throw s(this)}while(128&this.buf[this.pos++]);return this},l.prototype.skipType=function(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;;){if(4==(e=7&this.uint32()))break;this.skipType(e)}break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+e+" at offset "+this.pos)}return this},l._configure=function(e){r=e;var t=n.Long?"toLong":"toNumber";n.merge(l.prototype,{int64:function(){return d.call(this)[t](!1)},uint64:function(){return d.call(this)[t](!0)},sint64:function(){return d.call(this).zzDecode()[t](!1)},fixed64:function(){return p.call(this)[t](!0)},sfixed64:function(){return p.call(this)[t](!1)}})}},{13:13}],9:[function(e,t,i){t.exports=a;var r=e(8);(a.prototype=Object.create(r.prototype)).constructor=a;var n=e(13);function a(e){r.call(this,e)}n.Buffer&&(a.prototype._slice=n.Buffer.prototype.slice),a.prototype.string=function(){var e=this.uint32();return this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+e,this.len))}},{13:13,8:8}],10:[function(e,t,i){i.Service=e(11)},{11:11}],11:[function(e,t,i){t.exports=r;var s=e(13);function r(e,t,i){if("function"!=typeof e)throw TypeError("rpcImpl must be a function");s.EventEmitter.call(this),this.rpcImpl=e,this.requestDelimited=Boolean(t),this.responseDelimited=Boolean(i)}((r.prototype=Object.create(s.EventEmitter.prototype)).constructor=r).prototype.rpcCall=function e(i,t,r,n,a){if(!n)throw TypeError("request must be specified");var o=this;if(!a)return s.asPromise(e,o,i,t,r,n);if(!o.rpcImpl)return setTimeout(function(){a(Error("already ended"))},0),undefined$1;try{return o.rpcImpl(i,t[o.requestDelimited?"encodeDelimited":"encode"](n).finish(),function(e,t){if(e)return o.emit("error",e,i),a(e);if(null===t)return o.end(!0),undefined$1;if(!(t instanceof r))try{t=r[o.responseDelimited?"decodeDelimited":"decode"](t)}catch(e){return o.emit("error",e,i),a(e)}return o.emit("data",t,i),a(null,t)})}catch(e){return o.emit("error",e,i),setTimeout(function(){a(e)},0),undefined$1}},r.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}},{13:13}],12:[function(e,t,i){t.exports=n;var r=e(13);function n(e,t){this.lo=e>>>0,this.hi=t>>>0}var a=n.zero=new n(0,0);a.toNumber=function(){return 0},a.zzEncode=a.zzDecode=function(){return this},a.length=function(){return 1};n.zeroHash="\0\0\0\0\0\0\0\0";n.fromNumber=function(e){if(0===e)return a;var t=e<0;t&&(e=-e);var i=e>>>0,r=(e-i)/4294967296>>>0;return t&&(r=~r>>>0,i=~i>>>0,4294967295<++i&&(i=0,4294967295<++r&&(r=0))),new n(i,r)},n.from=function(e){if("number"==typeof e)return n.fromNumber(e);if(r.isString(e)){if(!r.Long)return n.fromNumber(parseInt(e,10));e=r.Long.fromString(e)}return e.low||e.high?new n(e.low>>>0,e.high>>>0):a},n.prototype.toNumber=function(e){if(!e&&this.hi>>>31){var t=1+~this.lo>>>0,i=~this.hi>>>0;return t||(i=i+1>>>0),-(t+4294967296*i)}return this.lo+4294967296*this.hi},n.prototype.toLong=function(e){return r.Long?new r.Long(0|this.lo,0|this.hi,Boolean(e)):{low:0|this.lo,high:0|this.hi,unsigned:Boolean(e)}};var o=String.prototype.charCodeAt;n.fromHash=function(e){return"\0\0\0\0\0\0\0\0"===e?a:new n((o.call(e,0)|o.call(e,1)<<8|o.call(e,2)<<16|o.call(e,3)<<24)>>>0,(o.call(e,4)|o.call(e,5)<<8|o.call(e,6)<<16|o.call(e,7)<<24)>>>0)},n.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},n.prototype.zzEncode=function(){var e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this},n.prototype.zzDecode=function(){var e=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this},n.prototype.length=function(){var e=this.lo,t=(this.lo>>>28|this.hi<<4)>>>0,i=this.hi>>>24;return 0==i?0==t?e<16384?e<128?1:2:e<2097152?3:4:t<16384?t<128?5:6:t<2097152?7:8:i<128?9:10}},{13:13}],13:[function(e,t,i){var r=i;function n(e,t,i){for(var r=Object.keys(t),n=0;n<r.length;++n)e[r[n]]!==undefined$1&&i||(e[r[n]]=t[r[n]]);return e}function a(e){function i(e,t){if(!(this instanceof i))return new i(e,t);Object.defineProperty(this,"message",{get:function(){return e}}),Error.captureStackTrace?Error.captureStackTrace(this,i):Object.defineProperty(this,"stack",{value:(new Error).stack||""}),t&&n(this,t)}return(i.prototype=Object.create(Error.prototype)).constructor=i,Object.defineProperty(i.prototype,"name",{get:function(){return e}}),i.prototype.toString=function(){return this.name+": "+this.message},i}r.asPromise=e(1),r.base64=e(2),r.EventEmitter=e(3),r.inquire=e(4),r.utf8=e(6),r.pool=e(5),r.LongBits=e(12),r.emptyArray=Object.freeze?Object.freeze([]):[],r.emptyObject=Object.freeze?Object.freeze({}):{},r.isNode=Boolean(global.process&&global.process.versions&&global.process.versions.node),r.isInteger=Number.isInteger||function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e},r.isString=function(e){return"string"==typeof e||e instanceof String},r.isObject=function(e){return e&&"object"==typeof e},r.Buffer=function(){try{var e=r.inquire("buffer").Buffer;return e.prototype.utf8Write?e:null}catch(e){return null}}(),r._Buffer_from=null,r._Buffer_allocUnsafe=null,r.newBuffer=function(e){return"number"==typeof e?r.Buffer?r._Buffer_allocUnsafe(e):new r.Array(e):r.Buffer?r._Buffer_from(e):"undefined"==typeof Uint8Array?e:new Uint8Array(e)},r.Array="undefined"!=typeof Uint8Array?Uint8Array:Array,r.Long=global.dcodeIO&&global.dcodeIO.Long||r.inquire("long"),r.key2Re=/^true|false|0|1$/,r.key32Re=/^-?(?:0|[1-9][0-9]*)$/,r.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,r.longToHash=function(e){return e?r.LongBits.from(e).toHash():r.LongBits.zeroHash},r.longFromHash=function(e,t){var i=r.LongBits.fromHash(e);return r.Long?r.Long.fromBits(i.lo,i.hi,t):i.toNumber(Boolean(t))},r.merge=n,r.lcFirst=function(e){return e.charAt(0).toLowerCase()+e.substring(1)},r.newError=a,r.ProtocolError=a("ProtocolError"),r.oneOfGetter=function(e){for(var i={},t=0;t<e.length;++t)i[e[t]]=1;return function(){for(var e=Object.keys(this),t=e.length-1;-1<t;--t)if(1===i[e[t]]&&this[e[t]]!==undefined$1&&null!==this[e[t]])return e[t]}},r.oneOfSetter=function(i){return function(e){for(var t=0;t<i.length;++t)i[t]!==e&&delete this[i[t]]}},r.lazyResolve=function(e,t){for(var i=0;i<t.length;++i)for(var r=Object.keys(t[i]),n=0;n<r.length;++n){for(var a=t[i][r[n]].split("."),o=e;a.length;)o=o[a.shift()];t[i][r[n]]=o}},r.toJSONOptions={longs:String,enums:String,bytes:String},r._configure=function(){var i=r.Buffer;i?(r._Buffer_from=i.from!==Uint8Array.from&&i.from||function(e,t){return new i(e,t)},r._Buffer_allocUnsafe=i.allocUnsafe||function(e){return new i(e)}):r._Buffer_from=r._Buffer_allocUnsafe=null}},{1:1,12:12,2:2,3:3,4:4,5:5,6:6}],14:[function(e,t,i){t.exports=d;var r,n=e(13),a=n.LongBits,o=n.base64,s=n.utf8;function l(e,t,i){this.fn=e,this.len=t,this.next=undefined$1,this.val=i}function c(){}function u(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}function d(){this.len=0,this.head=new l(c,0,0),this.tail=this.head,this.states=null}function h(e,t,i){t[i]=255&e}function p(e,t){this.len=e,this.next=undefined$1,this.val=t}function m(e,t,i){for(;e.hi;)t[i++]=127&e.lo|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;127<e.lo;)t[i++]=127&e.lo|128,e.lo=e.lo>>>7;t[i++]=e.lo}function f(e,t,i){t[i++]=255&e,t[i++]=e>>>8&255,t[i++]=e>>>16&255,t[i]=e>>>24}d.create=n.Buffer?function(){return(d.create=function(){return new r})()}:function(){return new d},d.alloc=function(e){return new n.Array(e)},n.Array!==Array&&(d.alloc=n.pool(d.alloc,n.Array.prototype.subarray)),d.prototype.push=function(e,t,i){return this.tail=this.tail.next=new l(e,t,i),this.len+=t,this},(p.prototype=Object.create(l.prototype)).fn=function(e,t,i){for(;127<e;)t[i++]=127&e|128,e>>>=7;t[i]=e},d.prototype.uint32=function(e){return this.len+=(this.tail=this.tail.next=new p((e>>>=0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this},d.prototype.int32=function(e){return e<0?this.push(m,10,a.fromNumber(e)):this.uint32(e)},d.prototype.sint32=function(e){return this.uint32((e<<1^e>>31)>>>0)},d.prototype.int64=d.prototype.uint64=function(e){var t=a.from(e);return this.push(m,t.length(),t)},d.prototype.sint64=function(e){var t=a.from(e).zzEncode();return this.push(m,t.length(),t)},d.prototype.bool=function(e){return this.push(h,1,e?1:0)},d.prototype.sfixed32=d.prototype.fixed32=function(e){return this.push(f,4,e>>>0)},d.prototype.sfixed64=d.prototype.fixed64=function(e){var t=a.from(e);return this.push(f,4,t.lo).push(f,4,t.hi)};var g,_,y="undefined"!=typeof Float32Array?(g=new Float32Array(1),_=new Uint8Array(g.buffer),g[0]=-0,_[3]?function(e,t,i){g[0]=e,t[i++]=_[0],t[i++]=_[1],t[i++]=_[2],t[i]=_[3]}:function(e,t,i){g[0]=e,t[i++]=_[3],t[i++]=_[2],t[i++]=_[1],t[i]=_[0]}):function(e,t,i){var r,n=e<0?1:0;n&&(e=-e),0===e?f(0<1/e?0:2147483648,t,i):isNaN(e)?f(2147483647,t,i):f(34028234663852886e22<e?(n<<31|2139095040)>>>0:e<11754943508222875e-54?(n<<31|Math.round(e/1401298464324817e-60))>>>0:(n<<31|(r=Math.floor(Math.log(e)/Math.LN2))+127<<23|8388607&Math.round(e*Math.pow(2,-r)*8388608))>>>0,t,i)};d.prototype.float=function(e){return this.push(y,4,e)};var v,C,S="undefined"!=typeof Float64Array?(v=new Float64Array(1),C=new Uint8Array(v.buffer),v[0]=-0,C[7]?function(e,t,i){v[0]=e,t[i++]=C[0],t[i++]=C[1],t[i++]=C[2],t[i++]=C[3],t[i++]=C[4],t[i++]=C[5],t[i++]=C[6],t[i]=C[7]}:function(e,t,i){v[0]=e,t[i++]=C[7],t[i++]=C[6],t[i++]=C[5],t[i++]=C[4],t[i++]=C[3],t[i++]=C[2],t[i++]=C[1],t[i]=C[0]}):function(e,t,i){var r,n,a=e<0?1:0;a&&(e=-e),0===e?(f(0,t,i),f(0<1/e?0:2147483648,t,i+4)):isNaN(e)?(f(4294967295,t,i),f(2147483647,t,i+4)):17976931348623157e292<e?(f(0,t,i),f((a<<31|2146435072)>>>0,t,i+4)):e<22250738585072014e-324?(f((r=e/5e-324)>>>0,t,i),f((a<<31|r/4294967296)>>>0,t,i+4)):(1024===(n=Math.floor(Math.log(e)/Math.LN2))&&(n=1023),f(4503599627370496*(r=e*Math.pow(2,-n))>>>0,t,i),f((a<<31|n+1023<<20|1048576*r&1048575)>>>0,t,i+4))};d.prototype.double=function(e){return this.push(S,8,e)};var T=n.Array.prototype.set?function(e,t,i){t.set(e,i)}:function(e,t,i){for(var r=0;r<e.length;++r)t[i+r]=e[r]};d.prototype.bytes=function(e){var t,i=e.length>>>0;return i?(n.isString(e)&&(t=d.alloc(i=o.length(e)),o.decode(e,t,0),e=t),this.uint32(i).push(T,i,e)):this.push(h,1,0)},d.prototype.string=function(e){var t=s.length(e);return t?this.uint32(t).push(s.write,t,e):this.push(h,1,0)},d.prototype.fork=function(){return this.states=new u(this),this.head=this.tail=new l(c,0,0),this.len=0,this},d.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new l(c,0,0),this.len=0),this},d.prototype.ldelim=function(){var e=this.head,t=this.tail,i=this.len;return this.reset().uint32(i),i&&(this.tail.next=e.next,this.tail=t,this.len+=i),this},d.prototype.finish=function(){for(var e=this.head.next,t=this.constructor.alloc(this.len),i=0;e;)e.fn(e.val,t,i),i+=e.len,e=e.next;return t},d._configure=function(e){r=e}},{13:13}],15:[function(e,t,i){t.exports=o;var r=e(14);(o.prototype=Object.create(r.prototype)).constructor=o;var n=e(13),a=n.Buffer;function o(){r.call(this)}o.alloc=function(e){return(o.alloc=n._Buffer_allocUnsafe)(e)};var s=a&&a.prototype instanceof Uint8Array&&"set"===a.prototype.set.name?function(e,t,i){t.set(e,i)}:function(e,t,i){if(e.copy)e.copy(t,i,0,e.length);else for(var r=0;r<e.length;)t[i++]=e[r++]};function l(e,t,i){e.length<40?n.utf8.write(e,t,i):t.utf8Write(e,i)}o.prototype.bytes=function(e){n.isString(e)&&(e=n._Buffer_from(e,"base64"));var t=e.length>>>0;return this.uint32(t),t&&this.push(s,t,e),this},o.prototype.string=function(e){var t=a.byteLength(e);return this.uint32(t),t&&this.push(l,t,e),this}},{13:13,14:14}]},oJb={},pJb=[7],global.protobuf=function e(t){var i=oJb[t];return i||nJb[t][0].call(i=oJb[t]={exports:{}},e,i,i.exports),i.exports}(pJb[0])}(tmp$1);var protobuf=tmp$1.protobuf;function isBitSet(e,t){return 0!=(e&t)}var childrenBitmasks=[1,2,4,8],anyChildBitmask=15,cacheFlagBitmask=16,imageBitmask=64,terrainBitmask=128;function GoogleEarthEnterpriseTileInformation(e,t,i,r,n,a){this._bits=e,this.cnodeVersion=t,this.imageryVersion=i,this.terrainVersion=r,this.imageryProvider=n,this.terrainProvider=a,this.ancestorHasTerrain=!1,this.terrainState=void 0}function stringToBuffer(e){for(var t=e.length,i=new ArrayBuffer(t),r=new Uint8Array(i),n=0;n<t;++n)r[n]=e.charCodeAt(n);return i}GoogleEarthEnterpriseTileInformation.clone=function(e,t){return defined(t)?(t._bits=e._bits,t.cnodeVersion=e.cnodeVersion,t.imageryVersion=e.imageryVersion,t.terrainVersion=e.terrainVersion,t.imageryProvider=e.imageryProvider,t.terrainProvider=e.terrainProvider):t=new GoogleEarthEnterpriseTileInformation(e._bits,e.cnodeVersion,e.imageryVersion,e.terrainVersion,e.imageryProvider,e.terrainProvider),t.ancestorHasTerrain=e.ancestorHasTerrain,t.terrainState=e.terrainState,t},GoogleEarthEnterpriseTileInformation.prototype.setParent=function(e){this.ancestorHasTerrain=e.ancestorHasTerrain||this.hasTerrain()},GoogleEarthEnterpriseTileInformation.prototype.hasSubtree=function(){return isBitSet(this._bits,cacheFlagBitmask)},GoogleEarthEnterpriseTileInformation.prototype.hasImagery=function(){return isBitSet(this._bits,imageBitmask)},GoogleEarthEnterpriseTileInformation.prototype.hasTerrain=function(){return isBitSet(this._bits,terrainBitmask)},GoogleEarthEnterpriseTileInformation.prototype.hasChildren=function(){return isBitSet(this._bits,anyChildBitmask)},GoogleEarthEnterpriseTileInformation.prototype.hasChild=function(e){return isBitSet(this._bits,childrenBitmasks[e])},GoogleEarthEnterpriseTileInformation.prototype.getChildBitmask=function(){return this._bits&anyChildBitmask};var defaultKey$1=stringToBuffer('Eô½\vyâjE"’,ÍqøIFgQ\0B%Æèa,f)\bÆ4Üjb%y\nwmiÖðœk“¡½NuàA[ß@V\fÙ»r›|3SîOlÔq°{ÀEVZ­wUe\v3’*¬l5Å0sø3>mF8J´Ýð.ÝuڌDt"úa"\f3"So¯9D\vŒ9Ù9L¹¿«\\ŒP_Ÿ"uxéq‘h;Áěð<VqH‚\'UfYNe˜u£aF}a?A\0Ÿ×´4M·F°Õ¸Š\'{‹Ü+»Mg0ÈÑö\\Pú[/F›n5/\'C.ë\n\f^¥se4ål.jC\'c#U©?q{gC}:¯ÍâTUœýKÆâŸ/(íË\\Æ-fˆ§;/*"N°k.Ý\r•}}GºC²²+>Mª>}æÎI‰Ææx\fa1-¤O¥~q ˆì\r1èN\v\0nPh}=\b\r•¦n£h—$[kó#ó¶s³\r\v@ÀŸØQ]ú".jßI\0¹ wUÆïj¿{GLƒîÜÜF…©­S+S4ÿ”Yä8è1ƒN¹XFkË-#†’p\x005ˆ"Ï1²&/çÃu-6,rt°#G·ÓÑ&…7râ\0ŒDÏÚ3-Þ`†i#i*|ÍKQ\r•T9w.)ê¦P¢joP™\\>TûïP[\vE‰m(w7ێJfJo™ åpâ¹q~\fmI-zþrÇòY0»]såÉ êxì ðŠB|G`°½&·q¶ÇŸÑ3‚=Ó«îc™È+S D\\qÆÌD2O<ÊÀ)=RÓaX©}e´ÜÏ\rô=ñ\b©BÚ#\tØ¿^PIøMÀËGLO÷{+ØÅ1’;µoÜl\r’ˆўÛ?âéÚ_ԄâFaZÞUϤ\0¾ýÎgñJi—æ HØ]~®q N®ÀV©‘<‚rçvì)IÖ]-ƒãÛ6©;f—‡jÕ¶=P^R¹KÇsWxÉô.Y•“oÐKW>\'\'Ç`Û;íšSD>?’mw¢\në?R¨ÆU^1I7…ôÅ&-©¿‹\'TÚÃj å*x°Öprª‹h½ˆ÷_H±~ÀXL?fù>áeÀp§Ï8i¯ðVldIœ\'­xtO‡ÞV9\0Úw\vË-‰û5Oõ\bQ`Á\nZGM&30xÚÀœFGâ[y`In7gS\n>éìF9²ñ4\rƄSuná\fYÙÞ)…{II¥wy¾IV.6ç\v:»Ob{ÒM1•/½8{¨O!áìFpv•})"xˆ\nÝ\\ÚÞQÏðüYRe|3ßóHÚ»*uÛ`²Ôüíì5¨ÿ(1-È܈F|Š["');function GoogleEarthEnterpriseMetadata(e){var t=e;"string"==typeof t||t instanceof Resource||(t=e.url);var i=Resource.createIfNeeded(t);i.appendForwardSlash(),this._resource=i,this.imageryPresent=!0,this.protoImagery=void 0,this.terrainPresent=!0,this.negativeAltitudeExponentBias=32,this.negativeAltitudeThreshold=CesiumMath.EPSILON12,this.providers={},this.key=void 0,this._quadPacketVersion=1,this._tileInfo={},this._subtreePromises={};var r=this;this._readyPromise=requestDbRoot(this).then(function(){return r.getQuadTreePacket("",r._quadPacketVersion)}).then(function(){return!0}).otherwise(function(e){var t="An error occurred while accessing "+getMetadataResource(r,"",1).url+".";return when.reject(new RuntimeError(t))})}Object.defineProperties(GoogleEarthEnterpriseMetadata.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},resource:{get:function(){return this._resource}},readyPromise:{get:function(){return this._readyPromise}}}),GoogleEarthEnterpriseMetadata.tileXYToQuadKey=function(e,t,i){for(var r="",n=i;0<=n;--n){var a=1<<n,o=0;isBitSet(t,a)?isBitSet(e,a)&&(o|=1):(o|=2,isBitSet(e,a)||(o|=1)),r+=o}return r},GoogleEarthEnterpriseMetadata.quadKeyToTileXY=function(e){for(var t=0,i=0,r=e.length-1,n=r;0<=n;--n){var a=1<<n,o=+e[r-n];isBitSet(o,2)?isBitSet(o,1)||(t|=a):(i|=a,isBitSet(o,1)&&(t|=a))}return{x:t,y:i,level:r}},GoogleEarthEnterpriseMetadata.prototype.isValid=function(e){var t=this.getTileInformationFromQuadKey(e);if(defined(t))return null!==t;for(var i,r=!0,n=e;1<n.length;){if(i=n.substring(n.length-1),n=n.substring(0,n.length-1),defined(t=this.getTileInformationFromQuadKey(n))){t.hasSubtree()||t.hasChild(parseInt(i))||(r=!1);break}if(null===t){r=!1;break}}return r};var taskProcessor$1=new TaskProcessor("decodeGoogleEarthEnterprisePacket",Number.POSITIVE_INFINITY),dbrootParser,dbrootParserPromise;function populateSubtree(e,t,i){var r,n=e._tileInfo,a=t,o=n[a];if(defined(o)&&(!o.hasSubtree()||o.hasChildren()))return o;for(;void 0===o&&1<a.length;)o=n[a=a.substring(0,a.length-1)];var s=e._subtreePromises,l=s[a];return defined(l)?l.then(function(){return r=new Request({throttle:i.throttle,throttleByServer:i.throttleByServer,type:i.type,priorityFunction:i.priorityFunction}),populateSubtree(e,t,r)}):defined(o)&&o.hasSubtree()?defined(l=e.getQuadTreePacket(a,o.cnodeVersion,i))?(s[a]=l).then(function(){return r=new Request({throttle:i.throttle,throttleByServer:i.throttleByServer,type:i.type,priorityFunction:i.priorityFunction}),populateSubtree(e,t,r)}).always(function(){delete s[a]}):void 0:when.reject(new RuntimeError("Couldn't load metadata for tile "+t))}function getMetadataResource(e,t,i,r){return e._resource.getDerivedResource({url:"flatfile?q2-0"+t+"-q."+i.toString(),request:r})}function requestDbRoot(c){var e,t,i=c._resource.getDerivedResource({url:"dbRoot.v5",queryParameters:{output:"proto"}});return defined(dbrootParserPromise)||(e=buildModuleUrl("ThirdParty/google-earth-dbroot-parser.js"),t=window.cesiumGoogleEarthDbRootParser,dbrootParserPromise=loadAndExecuteScript(e).then(function(){dbrootParser=window.cesiumGoogleEarthDbRootParser(protobuf),defined(t)?window.cesiumGoogleEarthDbRootParser=t:delete window.cesiumGoogleEarthDbRootParser})),dbrootParserPromise.then(function(){return i.fetchArrayBuffer()}).then(function(e){var t=dbrootParser.EncryptedDbRootProto.decode(new Uint8Array(e)),i=t.encryptionData,r=i.byteOffset,n=r+i.byteLength,a=c.key=i.buffer.slice(r,n),n=(r=(i=t.dbrootData).byteOffset)+i.byteLength,o=i.buffer.slice(r,n);return taskProcessor$1.scheduleTask({buffer:o,type:"DbRoot",key:a},[o])}).then(function(e){var t,i=dbrootParser.DbRootProto.decode(new Uint8Array(e.buffer));c.imageryPresent=defaultValue(i.imageryPresent,c.imageryPresent),c.protoImagery=i.protoImagery,c.terrainPresent=defaultValue(i.terrainPresent,c.terrainPresent),defined(i.endSnippet)&&defined(i.endSnippet.model)&&(t=i.endSnippet.model,c.negativeAltitudeExponentBias=defaultValue(t.negativeAltitudeExponentBias,c.negativeAltitudeExponentBias),c.negativeAltitudeThreshold=defaultValue(t.compressedNegativeAltitudeThreshold,c.negativeAltitudeThreshold)),defined(i.databaseVersion)&&(c._quadPacketVersion=defaultValue(i.databaseVersion.quadtreeVersion,c._quadPacketVersion));for(var r=c.providers,n=defaultValue(i.providerInfo,[]),a=n.length,o=0;o<a;++o){var s=n[o],l=s.copyrightString;defined(l)&&(r[s.providerId]=new Credit(l.value))}}).otherwise(function(){console.log("Failed to retrieve "+i.url+". Using defaults."),c.key=defaultKey$1})}function GoogleEarthEnterpriseTerrainData(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._buffer=e.buffer,this._credits=e.credits,this._negativeAltitudeExponentBias=e.negativeAltitudeExponentBias,this._negativeElevationThreshold=e.negativeElevationThreshold;var t=defaultValue(e.childTileMask,15),i=3&t;i|=4&t?8:0,i|=8&t?4:0,this._childTileMask=i,this._createdByUpsampling=defaultValue(e.createdByUpsampling,!1),this._skirtHeight=void 0,this._bufferType=this._buffer.constructor,this._mesh=void 0,this._minimumHeight=void 0,this._maximumHeight=void 0}GoogleEarthEnterpriseMetadata.prototype.getQuadTreePacket=function(d,e,t){e=defaultValue(e,1);var i=getMetadataResource(this,d=defaultValue(d,""),e,t).fetchArrayBuffer();if(defined(i)){var h=this._tileInfo,r=this.key;return i.then(function(e){return taskProcessor$1.scheduleTask({buffer:e,quadKey:d,type:"Metadata",key:r},[e]).then(function(e){var t,i,r=-1;""!==d&&(r=d.length+1,t=e[d],(i=h[d])._bits|=t._bits,delete e[d]);var n=Object.keys(e);n.sort(function(e,t){return e.length-t.length});for(var a=n.length,o=0;o<a;++o){var s,l,c,u=n[o];null!==e[u]?(s=GoogleEarthEnterpriseTileInformation.clone(e[u]),(l=u.length)===r?s.setParent(i):1<l&&(c=h[u.substring(0,u.length-1)],s.setParent(c)),h[u]=s):h[u]=null}})})}},GoogleEarthEnterpriseMetadata.prototype.populateSubtree=function(e,t,i,r){return populateSubtree(this,GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e,t,i),r)},GoogleEarthEnterpriseMetadata.prototype.getTileInformation=function(e,t,i){var r=GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e,t,i);return this._tileInfo[r]},GoogleEarthEnterpriseMetadata.prototype.getTileInformationFromQuadKey=function(e){return this._tileInfo[e]},Object.defineProperties(GoogleEarthEnterpriseTerrainData.prototype,{credits:{get:function(){return this._credits}},waterMask:{get:function(){}}});var taskProcessor$2=new TaskProcessor("createVerticesFromGoogleEarthEnterpriseBuffer"),nativeRectangleScratch=new Rectangle,rectangleScratch$1=new Rectangle;GoogleEarthEnterpriseTerrainData.prototype.createMesh=function(e,t,i,r,n){var a=e.ellipsoid;e.tileXYToNativeRectangle(t,i,r,nativeRectangleScratch),e.tileXYToRectangle(t,i,r,rectangleScratch$1),n=defaultValue(n,1);var o=a.cartographicToCartesian(Rectangle.center(rectangleScratch$1)),s=40075.16/(1<<r);this._skirtHeight=Math.min(8*s,1e3);var l=taskProcessor$2.scheduleTask({buffer:this._buffer,nativeRectangle:nativeRectangleScratch,rectangle:rectangleScratch$1,relativeToCenter:o,ellipsoid:a,skirtHeight:this._skirtHeight,exaggeration:n,includeWebMercatorT:!0,negativeAltitudeExponentBias:this._negativeAltitudeExponentBias,negativeElevationThreshold:this._negativeElevationThreshold});if(defined(l)){var c=this;return l.then(function(e){return c._mesh=new TerrainMesh(o,new Float32Array(e.vertices),new Uint16Array(e.indices),e.indexCountWithoutSkirts,e.vertexCountWithoutSkirts,e.minimumHeight,e.maximumHeight,BoundingSphere.clone(e.boundingSphere3D),Cartesian3.clone(e.occludeePointInScaledSpace),e.numberOfAttributes,OrientedBoundingBox.clone(e.orientedBoundingBox),TerrainEncoding.clone(e.encoding),n,e.westIndicesSouthToNorth,e.southIndicesEastToWest,e.eastIndicesNorthToSouth,e.northIndicesWestToEast),c._minimumHeight=e.minimumHeight,c._maximumHeight=e.maximumHeight,c._buffer=void 0,c._mesh})}},GoogleEarthEnterpriseTerrainData.prototype.interpolateHeight=function(e,t,i){var r=CesiumMath.clamp((t-e.west)/e.width,0,1),n=CesiumMath.clamp((i-e.south)/e.height,0,1);return defined(this._mesh)?interpolateMeshHeight$2(this,r,n):interpolateHeight$2(this,r,n,e)};var upsampleTaskProcessor$1=new TaskProcessor("upsampleQuantizedTerrainMesh");GoogleEarthEnterpriseTerrainData.prototype.upsample=function(e,t,i,r,n,a,o){var s=this._mesh;if(defined(this._mesh)){var l=2*t!==n,c=2*i===a,u=e.ellipsoid,d=e.tileXYToRectangle(n,a,o),h=upsampleTaskProcessor$1.scheduleTask({vertices:s.vertices,indices:s.indices,indexCountWithoutSkirts:s.indexCountWithoutSkirts,vertexCountWithoutSkirts:s.vertexCountWithoutSkirts,encoding:s.encoding,minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,isEastChild:l,isNorthChild:c,childRectangle:d,ellipsoid:u,exaggeration:s.exaggeration});if(defined(h)){var p=this;return h.then(function(e){var t=new Uint16Array(e.vertices),i=IndexDatatype$1.createTypedArray(t.length/3,e.indices),r=p._skirtHeight;return new QuantizedMeshTerrainData({quantizedVertices:t,indices:i,minimumHeight:e.minimumHeight,maximumHeight:e.maximumHeight,boundingSphere:BoundingSphere.clone(e.boundingSphere),orientedBoundingBox:OrientedBoundingBox.clone(e.orientedBoundingBox),horizonOcclusionPoint:Cartesian3.clone(e.horizonOcclusionPoint),westIndices:e.westIndices,southIndices:e.southIndices,eastIndices:e.eastIndices,northIndices:e.northIndices,westSkirtHeight:r,southSkirtHeight:r,eastSkirtHeight:r,northSkirtHeight:r,childTileMask:0,createdByUpsampling:!0,credits:p._credits})})}}},GoogleEarthEnterpriseTerrainData.prototype.isChildAvailable=function(e,t,i,r){var n=2;return i!==2*e&&++n,r!==2*t&&(n-=2),0!=(this._childTileMask&1<<n)},GoogleEarthEnterpriseTerrainData.prototype.wasCreatedByUpsampling=function(){return this._createdByUpsampling};var texCoordScratch0$1=new Cartesian2,texCoordScratch1$1=new Cartesian2,texCoordScratch2$1=new Cartesian2,barycentricCoordinateScratch$1=new Cartesian3;function interpolateMeshHeight$2(e,t,i){for(var r=e._mesh,n=r.vertices,a=r.encoding,o=r.indices,s=0,l=o.length;s<l;s+=3){var c=o[s],u=o[s+1],d=o[s+2],h=a.decodeTextureCoordinates(n,c,texCoordScratch0$1),p=a.decodeTextureCoordinates(n,u,texCoordScratch1$1),m=a.decodeTextureCoordinates(n,d,texCoordScratch2$1),f=Intersections2D.computeBarycentricCoordinates(t,i,h.x,h.y,p.x,p.y,m.x,m.y,barycentricCoordinateScratch$1);if(-1e-15<=f.x&&-1e-15<=f.y&&-1e-15<=f.z){var g=a.decodeHeight(n,c),_=a.decodeHeight(n,u),y=a.decodeHeight(n,d);return f.x*g+f.y*_+f.z*y}}}var sizeOfUint16=Uint16Array.BYTES_PER_ELEMENT,sizeOfUint32=Uint32Array.BYTES_PER_ELEMENT,sizeOfInt32=Int32Array.BYTES_PER_ELEMENT,sizeOfFloat=Float32Array.BYTES_PER_ELEMENT,sizeOfDouble=Float64Array.BYTES_PER_ELEMENT;function interpolateHeight$2(e,t,i,r){var n=e._buffer,a=0,o=0,s=0;.5<i?(.5<t?(a=2,o=.5):a=3,s=.5):.5<t&&(a=1,o=.5);for(var l=new DataView(n),c=0,u=0;u<a;++u)c+=l.getUint32(c,!0),c+=sizeOfUint32;c+=sizeOfUint32,c+=2*sizeOfDouble;var d=CesiumMath.toRadians(180*l.getFloat64(c,!0));c+=sizeOfDouble;var h=CesiumMath.toRadians(180*l.getFloat64(c,!0));c+=sizeOfDouble;var p=r.width/d/2,m=r.height/h/2,f=l.getInt32(c,!0);c+=sizeOfInt32;var g=3*l.getInt32(c,!0);c+=sizeOfInt32,c+=sizeOfInt32;for(var _=new Array(f),y=new Array(f),v=new Array(f),C=0;C<f;++C)_[C]=o+l.getUint8(c++)*p,y[C]=s+l.getUint8(c++)*m,v[C]=6371010*l.getFloat32(c,!0),c+=sizeOfFloat;var S=new Array(g);for(C=0;C<g;++C)S[C]=l.getUint16(c,!0),c+=sizeOfUint16;for(C=0;C<g;C+=3){var T=S[C],x=S[C+1],b=S[C+2],E=_[T],P=_[x],A=_[b],w=y[T],D=y[x],M=y[b],I=Intersections2D.computeBarycentricCoordinates(t,i,E,w,P,D,A,M,barycentricCoordinateScratch$1);if(-1e-15<=I.x&&-1e-15<=I.y&&-1e-15<=I.z)return I.x*v[T]+I.y*v[x]+I.z*v[b]}}var TerrainState={UNKNOWN:0,NONE:1,SELF:2,PARENT:3},julianDateScratch$1=new JulianDate;function TerrainCache(){this._terrainCache={},this._lastTidy=JulianDate.now()}function GoogleEarthEnterpriseTerrainProvider(e){var i;e=defaultValue(e,defaultValue.EMPTY_OBJECT),i=defined(e.metadata)?e.metadata:new GoogleEarthEnterpriseMetadata(Resource.createIfNeeded(e.url)),this._metadata=i,this._tilingScheme=new GeographicTilingScheme({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new Rectangle(-CesiumMath.PI,-CesiumMath.PI,CesiumMath.PI,CesiumMath.PI),ellipsoid:e.ellipsoid});var t=e.credit;"string"==typeof t&&(t=new Credit(t)),this._credit=t,this._levelZeroMaximumGeometricError=40075.16,this._terrainCache=new TerrainCache,this._terrainPromises={},this._terrainRequests={},this._errorEvent=new Event,this._ready=!1;var r,n=this;this._readyPromise=i.readyPromise.then(function(e){if(i.terrainPresent)return TileProviderError.handleSuccess(r),n._ready=e;var t=new RuntimeError("The server "+i.url+" doesn't have terrain");return r=TileProviderError.handleError(r,n,n._errorEvent,t.message,void 0,void 0,void 0,t),when.reject(t)}).otherwise(function(e){return r=TileProviderError.handleError(r,n,n._errorEvent,e.message,void 0,void 0,void 0,e),when.reject(e)})}TerrainCache.prototype.add=function(e,t){this._terrainCache[e]={buffer:t,timestamp:JulianDate.now()}},TerrainCache.prototype.get=function(e){var t=this._terrainCache[e];if(defined(t))return delete this._terrainCache[e],t.buffer},TerrainCache.prototype.tidy=function(){if(JulianDate.now(julianDateScratch$1),10<JulianDate.secondsDifference(julianDateScratch$1,this._lastTidy)){for(var e=this._terrainCache,t=Object.keys(e),i=t.length,r=0;r<i;++r){var n=t[r],a=e[n];10<JulianDate.secondsDifference(julianDateScratch$1,a.timestamp)&&delete e[n]}JulianDate.clone(julianDateScratch$1,this._lastTidy)}},Object.defineProperties(GoogleEarthEnterpriseTerrainProvider.prototype,{url:{get:function(){return this._metadata.url}},proxy:{get:function(){return this._metadata.proxy}},tilingScheme:{get:function(){return this._tilingScheme}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise}},credit:{get:function(){return this._credit}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}});var taskProcessor$3=new TaskProcessor("decodeGoogleEarthEnterprisePacket",Number.POSITIVE_INFINITY);function computeChildMask(e,t,i){var r=t.getChildBitmask();if(t.terrainState===TerrainState.PARENT)for(var n=r=0;n<4;++n){var a=i.getTileInformationFromQuadKey(e+n.toString());defined(a)&&a.hasTerrain()&&(r|=1<<n)}return r}function buildTerrainResource(e,t,i,r){return i=defined(i)&&0<i?i:1,e._metadata.resource.getDerivedResource({url:"flatfile?f1c-0"+t+"-t."+i.toString(),request:r})}GoogleEarthEnterpriseTerrainProvider.prototype.requestTileGeometry=function(e,t,i,r){var n=GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e,t,i),s=this._terrainCache,l=this._metadata,a=l.getTileInformationFromQuadKey(n);if(!defined(a))return when.reject(new RuntimeError("Terrain tile doesn't exist"));var o=a.terrainState;defined(o)||(o=a.terrainState=TerrainState.UNKNOWN);var c,u=s.get(n);if(defined(u)){var d=l.providers[a.terrainProvider];return when.resolve(new GoogleEarthEnterpriseTerrainData({buffer:u,childTileMask:computeChildMask(n,a,l),credits:defined(d)?[d]:void 0,negativeAltitudeExponentBias:l.negativeAltitudeExponentBias,negativeElevationThreshold:l.negativeAltitudeThreshold}))}if(s.tidy(),!a.ancestorHasTerrain)return when.resolve(new HeightmapTerrainData({buffer:new Uint8Array(256),width:16,height:16}));if(o===TerrainState.NONE)return when.reject(new RuntimeError("Terrain tile doesn't exist"));var h=n,p=-1;switch(o){case TerrainState.SELF:p=a.terrainVersion;break;case TerrainState.PARENT:h=h.substring(0,h.length-1),p=(c=l.getTileInformationFromQuadKey(h)).terrainVersion;break;case TerrainState.UNKNOWN:a.hasTerrain()?p=a.terrainVersion:(h=h.substring(0,h.length-1),defined(c=l.getTileInformationFromQuadKey(h))&&c.hasTerrain()&&(p=c.terrainVersion))}if(p<0)return when.reject(new RuntimeError("Terrain tile doesn't exist"));var m,f,g=this._terrainPromises,_=this._terrainRequests;if(defined(g[h]))m=g[h],f=_[h];else{var y=buildTerrainResource(this,h,p,f=r).fetchArrayBuffer();if(!defined(y))return;m=y.then(function(e){return defined(e)?taskProcessor$3.scheduleTask({buffer:e,type:"Terrain",key:l.key},[e]).then(function(e){var t=l.getTileInformationFromQuadKey(h);t.terrainState=TerrainState.SELF,s.add(h,e[0]);for(var i=t.terrainProvider,r=e.length-1,n=0;n<r;++n){var a=h+n.toString(),o=l.getTileInformationFromQuadKey(a);defined(o)&&(s.add(a,e[n+1]),o.terrainState=TerrainState.PARENT,0===o.terrainProvider&&(o.terrainProvider=i))}}):when.reject(new RuntimeError("Failed to load terrain."))}),g[h]=m,_[h]=f,m=m.always(function(){delete g[h],delete _[h]})}return m.then(function(){var e=s.get(n);if(defined(e)){var t=l.providers[a.terrainProvider];return new GoogleEarthEnterpriseTerrainData({buffer:e,childTileMask:computeChildMask(n,a,l),credits:defined(t)?[t]:void 0,negativeAltitudeExponentBias:l.negativeAltitudeExponentBias,negativeElevationThreshold:l.negativeAltitudeThreshold})}return when.reject(new RuntimeError("Failed to load terrain."))}).otherwise(function(e){return f.state===RequestState$1.CANCELLED?r.state=f.state:a.terrainState=TerrainState.NONE,when.reject(e)})},GoogleEarthEnterpriseTerrainProvider.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)},GoogleEarthEnterpriseTerrainProvider.prototype.getTileDataAvailable=function(e,t,i){var r,n=this._metadata,a=GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e,t,i),o=n.getTileInformation(e,t,i);if(null===o)return!1;if(defined(o)){if(!o.ancestorHasTerrain)return!0;var s=o.terrainState;if(s===TerrainState.NONE)return!1;if(!(defined(s)&&s!==TerrainState.UNKNOWN||(o.terrainState=TerrainState.UNKNOWN,o.hasTerrain()))){a=a.substring(0,a.length-1);var l=n.getTileInformationFromQuadKey(a);if(!defined(l)||!l.hasTerrain())return!1}return!0}return n.isValid(a)&&(r=new Request({throttle:!0,throttleByServer:!0,type:RequestType$1.TERRAIN}),n.populateSubtree(e,t,i,r)),!1},GoogleEarthEnterpriseTerrainProvider.prototype.loadTileDataAvailability=function(e,t,i){};var PROJECTIONS=[GeographicProjection,WebMercatorProjection],PROJECTION_COUNT=PROJECTIONS.length,MITER_BREAK_SMALL=Math.cos(CesiumMath.toRadians(30)),MITER_BREAK_LARGE=Math.cos(CesiumMath.toRadians(150)),WALL_INITIAL_MIN_HEIGHT=0,WALL_INITIAL_MAX_HEIGHT=1e3;function GroundPolylineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions;this.width=defaultValue(e.width,1),this._positions=t,this.granularity=defaultValue(e.granularity,9999),this.loop=defaultValue(e.loop,!1),this.arcType=defaultValue(e.arcType,ArcType$1.GEODESIC),this._ellipsoid=Ellipsoid.WGS84,this._projectionIndex=0,this._workerName="createGroundPolylineGeometry",this._scene3DOnly=!1}Object.defineProperties(GroundPolylineGeometry.prototype,{packedLength:{get:function(){return 1+3*this._positions.length+1+1+1+Ellipsoid.packedLength+1+1}}}),GroundPolylineGeometry.setProjectionAndEllipsoid=function(e,t){for(var i=0,r=0;r<PROJECTION_COUNT;r++)if(t instanceof PROJECTIONS[r]){i=r;break}e._projectionIndex=i,e._ellipsoid=t.ellipsoid};var cart3Scratch1=new Cartesian3,cart3Scratch2=new Cartesian3,cart3Scratch3=new Cartesian3;function computeRightNormal(e,t,i,r,n){var a=getPosition(r,e,0,cart3Scratch1),o=getPosition(r,e,i,cart3Scratch2),s=getPosition(r,t,0,cart3Scratch3),l=direction(o,a,cart3Scratch2),c=direction(s,a,cart3Scratch3);return Cartesian3.cross(c,l,n),Cartesian3.normalize(n,n)}var interpolatedCartographicScratch=new Cartographic,interpolatedBottomScratch=new Cartesian3,interpolatedTopScratch=new Cartesian3,interpolatedNormalScratch=new Cartesian3;function interpolateSegment(e,t,i,r,n,a,o,s,l,c,u){if(0!==n){var d;a===ArcType$1.GEODESIC?d=new EllipsoidGeodesic(e,t,o):a===ArcType$1.RHUMB&&(d=new EllipsoidRhumbLine(e,t,o));var h=d.surfaceDistance;if(!(h<n))for(var p=computeRightNormal(e,t,r,o,interpolatedNormalScratch),m=Math.ceil(h/n),f=h/m,g=f,_=m-1,y=s.length,v=0;v<_;v++){var C=d.interpolateUsingSurfaceDistance(g,interpolatedCartographicScratch),S=getPosition(o,C,i,interpolatedBottomScratch),T=getPosition(o,C,r,interpolatedTopScratch);Cartesian3.pack(p,s,y),Cartesian3.pack(S,l,y),Cartesian3.pack(T,c,y),u.push(C.latitude),u.push(C.longitude),y+=3,g+=f}}}var heightlessCartographicScratch=new Cartographic;function getPosition(e,t,i,r){return Cartographic.clone(t,heightlessCartographicScratch),heightlessCartographicScratch.height=i,Cartographic.toCartesian(heightlessCartographicScratch,e,r)}function direction(e,t,i){return Cartesian3.subtract(e,t,i),Cartesian3.normalize(i,i),i}function tangentDirection(e,t,i,r){return r=direction(e,t,r),r=Cartesian3.cross(r,i,r),r=Cartesian3.normalize(r,r),r=Cartesian3.cross(i,r,r)}GroundPolylineGeometry.pack=function(e,t,i){var r=defaultValue(i,0),n=e._positions,a=n.length;t[r++]=a;for(var o=0;o<a;++o){var s=n[o];Cartesian3.pack(s,t,r),r+=3}return t[r++]=e.granularity,t[r++]=e.loop?1:0,t[r++]=e.arcType,Ellipsoid.pack(e._ellipsoid,t,r),r+=Ellipsoid.packedLength,t[r++]=e._projectionIndex,t[r++]=e._scene3DOnly?1:0,t},GroundPolylineGeometry.unpack=function(e,t,i){for(var r=defaultValue(t,0),n=e[r++],a=new Array(n),o=0;o<n;o++)a[o]=Cartesian3.unpack(e,r),r+=3;var s=e[r++],l=1===e[r++],c=e[r++],u=Ellipsoid.unpack(e,r);r+=Ellipsoid.packedLength;var d=e[r++],h=1===e[r++];return defined(i)||(i=new GroundPolylineGeometry({positions:a})),i._positions=a,i.granularity=s,i.loop=l,i.arcType=c,i._ellipsoid=u,i._projectionIndex=d,i._scene3DOnly=h,i};var toPreviousScratch=new Cartesian3,toNextScratch=new Cartesian3,forwardScratch=new Cartesian3,vertexUpScratch=new Cartesian3,cosine90=0,cosine180=-1;function computeVertexMiterNormal(e,t,i,r,n){var a=direction(i,t,vertexUpScratch),o=tangentDirection(e,t,a,toPreviousScratch),s=tangentDirection(r,t,a,toNextScratch);if(CesiumMath.equalsEpsilon(Cartesian3.dot(o,s),cosine180,CesiumMath.EPSILON5))return n=Cartesian3.cross(a,o,n),n=Cartesian3.normalize(n,n);n=Cartesian3.add(s,o,n),n=Cartesian3.normalize(n,n);var l=Cartesian3.cross(a,n,forwardScratch);return Cartesian3.dot(s,l)<cosine90&&(n=Cartesian3.negate(n,n)),n}var XZ_PLANE=Plane.fromPointNormal(Cartesian3.ZERO,Cartesian3.UNIT_Y),previousBottomScratch=new Cartesian3,vertexBottomScratch=new Cartesian3,vertexTopScratch=new Cartesian3,nextBottomScratch=new Cartesian3,vertexNormalScratch=new Cartesian3,intersectionScratch=new Cartesian3,cartographicScratch0=new Cartographic,cartographicScratch1=new Cartographic,cartographicIntersectionScratch=new Cartographic;GroundPolylineGeometry.createGeometry=function(e){var t,i,r,n,a,o=!e._scene3DOnly,s=e.loop,l=e._ellipsoid,c=e.granularity,u=e.arcType,d=new PROJECTIONS[e._projectionIndex](l),h=WALL_INITIAL_MIN_HEIGHT,p=WALL_INITIAL_MAX_HEIGHT,m=e._positions,f=m.length;2===f&&(s=!1);for(var g,_,y,v=new EllipsoidRhumbLine(void 0,void 0,l),C=[m[0]],S=0;S<f-1;S++)i=m[S],r=m[S+1],!defined(g=IntersectionTests.lineSegmentPlane(i,r,XZ_PLANE,intersectionScratch))||Cartesian3.equalsEpsilon(g,i,CesiumMath.EPSILON7)||Cartesian3.equalsEpsilon(g,r,CesiumMath.EPSILON7)||(e.arcType===ArcType$1.GEODESIC?C.push(Cartesian3.clone(g)):e.arcType===ArcType$1.RHUMB&&(y=l.cartesianToCartographic(g,cartographicScratch0).longitude,n=l.cartesianToCartographic(i,cartographicScratch0),a=l.cartesianToCartographic(r,cartographicScratch1),v.setEndPoints(n,a),_=v.findIntersectionWithLongitude(y,cartographicIntersectionScratch),!defined(g=l.cartographicToCartesian(_,intersectionScratch))||Cartesian3.equalsEpsilon(g,i,CesiumMath.EPSILON7)||Cartesian3.equalsEpsilon(g,r,CesiumMath.EPSILON7)||C.push(Cartesian3.clone(g)))),C.push(r);s&&(i=m[f-1],r=m[0],!defined(g=IntersectionTests.lineSegmentPlane(i,r,XZ_PLANE,intersectionScratch))||Cartesian3.equalsEpsilon(g,i,CesiumMath.EPSILON7)||Cartesian3.equalsEpsilon(g,r,CesiumMath.EPSILON7)||(e.arcType===ArcType$1.GEODESIC?C.push(Cartesian3.clone(g)):e.arcType===ArcType$1.RHUMB&&(y=l.cartesianToCartographic(g,cartographicScratch0).longitude,n=l.cartesianToCartographic(i,cartographicScratch0),a=l.cartesianToCartographic(r,cartographicScratch1),v.setEndPoints(n,a),_=v.findIntersectionWithLongitude(y,cartographicIntersectionScratch),!defined(g=l.cartographicToCartesian(_,intersectionScratch))||Cartesian3.equalsEpsilon(g,i,CesiumMath.EPSILON7)||Cartesian3.equalsEpsilon(g,r,CesiumMath.EPSILON7)||C.push(Cartesian3.clone(g)))));var T=C.length,x=new Array(T);for(S=0;S<T;S++){var b=Cartographic.fromCartesian(C[S],l);b.height=0,x[S]=b}if(!((T=(x=arrayRemoveDuplicates(x,Cartographic.equalsEpsilon)).length)<2)){var E=[],P=[],A=[],w=[],D=previousBottomScratch,M=vertexBottomScratch,I=vertexTopScratch,R=nextBottomScratch,O=vertexNormalScratch,L=x[0],F=x[1];for(D=getPosition(l,x[T-1],h,D),R=getPosition(l,F,h,R),M=getPosition(l,L,h,M),I=getPosition(l,L,p,I),O=s?computeVertexMiterNormal(D,M,I,R,O):computeRightNormal(L,F,p,l,O),Cartesian3.pack(O,P,0),Cartesian3.pack(M,A,0),Cartesian3.pack(I,w,0),E.push(L.latitude),E.push(L.longitude),interpolateSegment(L,F,h,p,c,u,l,P,A,w,E),S=1;S<T-1;++S){D=Cartesian3.clone(M,D),M=Cartesian3.clone(R,M);var N=x[S];getPosition(l,N,p,I),getPosition(l,x[S+1],h,R),computeVertexMiterNormal(D,M,I,R,O),t=P.length,Cartesian3.pack(O,P,t),Cartesian3.pack(M,A,t),Cartesian3.pack(I,w,t),E.push(N.latitude),E.push(N.longitude),interpolateSegment(x[S],x[S+1],h,p,c,u,l,P,A,w,E)}var B,V=x[T-1],k=x[T-2],M=getPosition(l,V,h,M),I=getPosition(l,V,p,I);if(O=s?(B=x[0],computeVertexMiterNormal(D=getPosition(l,k,h,D),M,I,R=getPosition(l,B,h,R),O)):computeRightNormal(k,V,p,l,O),t=P.length,Cartesian3.pack(O,P,t),Cartesian3.pack(M,A,t),Cartesian3.pack(I,w,t),E.push(V.latitude),E.push(V.longitude),s){for(interpolateSegment(V,L,h,p,c,u,l,P,A,w,E),t=P.length,S=0;S<3;++S)P[t+S]=P[S],A[t+S]=A[S],w[t+S]=w[S];E.push(L.latitude),E.push(L.longitude)}return generateGeometryAttributes(s,d,A,w,P,E,o)}};var lineDirectionScratch=new Cartesian3,matrix3Scratch=new Matrix3,quaternionScratch$2=new Quaternion;function breakMiter(e,t,i,r){var n=direction(i,t,lineDirectionScratch),a=Cartesian3.dot(n,e);if(MITER_BREAK_SMALL<a||a<MITER_BREAK_LARGE){var o=direction(r,i,vertexUpScratch),s=a<MITER_BREAK_LARGE?CesiumMath.PI_OVER_TWO:-CesiumMath.PI_OVER_TWO,l=Quaternion.fromAxisAngle(o,s,quaternionScratch$2),c=Matrix3.fromQuaternion(l,matrix3Scratch);return Matrix3.multiplyByVector(c,e,e),!0}return!1}var endPosCartographicScratch=new Cartographic,normalStartpointScratch=new Cartesian3,normalEndpointScratch=new Cartesian3;function projectNormal(e,t,i,r,n){var a=Cartographic.toCartesian(t,e._ellipsoid,normalStartpointScratch),o=Cartesian3.add(a,i,normalEndpointScratch),s=!1,l=e._ellipsoid,c=l.cartesianToCartographic(o,endPosCartographicScratch);Math.abs(t.longitude-c.longitude)>CesiumMath.PI_OVER_TWO&&(s=!0,o=Cartesian3.subtract(a,i,normalEndpointScratch),c=l.cartesianToCartographic(o,endPosCartographicScratch)),c.height=0;var u=e.project(c,n);return(n=Cartesian3.subtract(u,r,n)).z=0,n=Cartesian3.normalize(n,n),s&&Cartesian3.negate(n,n),n}var adjustHeightNormalScratch=new Cartesian3,adjustHeightOffsetScratch=new Cartesian3;function adjustHeights(e,t,i,r,n,a){var o=Cartesian3.subtract(t,e,adjustHeightNormalScratch);Cartesian3.normalize(o,o);var s=i-WALL_INITIAL_MIN_HEIGHT,l=Cartesian3.multiplyByScalar(o,s,adjustHeightOffsetScratch);Cartesian3.add(e,l,n);var c=r-WALL_INITIAL_MAX_HEIGHT,l=Cartesian3.multiplyByScalar(o,c,adjustHeightOffsetScratch);Cartesian3.add(t,l,a)}var nudgeDirectionScratch=new Cartesian3;function nudgeXZ(e,t){var i=Plane.getPointDistance(XZ_PLANE,e),r=Plane.getPointDistance(XZ_PLANE,t),n=nudgeDirectionScratch;CesiumMath.equalsEpsilon(i,0,CesiumMath.EPSILON2)?(n=direction(t,e,n),Cartesian3.multiplyByScalar(n,CesiumMath.EPSILON2,n),Cartesian3.add(e,n,e)):CesiumMath.equalsEpsilon(r,0,CesiumMath.EPSILON2)&&(n=direction(e,t,n),Cartesian3.multiplyByScalar(n,CesiumMath.EPSILON2,n),Cartesian3.add(t,n,t))}function nudgeCartographic(e,t){var i=Math.abs(e.longitude),r=Math.abs(t.longitude);if(CesiumMath.equalsEpsilon(i,CesiumMath.PI,CesiumMath.EPSILON11)){var n=CesiumMath.sign(t.longitude);return e.longitude=n*(i-CesiumMath.EPSILON11),1}if(CesiumMath.equalsEpsilon(r,CesiumMath.PI,CesiumMath.EPSILON11)){var a=CesiumMath.sign(e.longitude);return t.longitude=a*(r-CesiumMath.EPSILON11),2}return 0}var startCartographicScratch=new Cartographic,endCartographicScratch=new Cartographic,segmentStartTopScratch=new Cartesian3,segmentEndTopScratch=new Cartesian3,segmentStartBottomScratch=new Cartesian3,segmentEndBottomScratch=new Cartesian3,segmentStartNormalScratch=new Cartesian3,segmentEndNormalScratch=new Cartesian3,getHeightCartographics=[startCartographicScratch,endCartographicScratch],getHeightRectangleScratch=new Rectangle,adjustHeightStartTopScratch=new Cartesian3,adjustHeightEndTopScratch=new Cartesian3,adjustHeightStartBottomScratch=new Cartesian3,adjustHeightEndBottomScratch=new Cartesian3,segmentStart2DScratch=new Cartesian3,segmentEnd2DScratch=new Cartesian3,segmentStartNormal2DScratch=new Cartesian3,segmentEndNormal2DScratch=new Cartesian3,offsetScratch$1=new Cartesian3,startUpScratch=new Cartesian3,endUpScratch=new Cartesian3,rightScratch$1=new Cartesian3,startPlaneNormalScratch=new Cartesian3,endPlaneNormalScratch=new Cartesian3,encodeScratch=new EncodedCartesian3,encodeScratch2D=new EncodedCartesian3,forwardOffset2DScratch=new Cartesian3,right2DScratch=new Cartesian3,normalNudgeScratch=new Cartesian3,scratchBoundingSpheres=[new BoundingSphere,new BoundingSphere],REFERENCE_INDICES=[0,2,1,0,3,2,0,7,3,0,4,7,0,5,4,0,1,5,5,7,4,5,6,7,5,2,6,5,1,2,3,6,2,3,7,6],REFERENCE_INDICES_LENGTH=REFERENCE_INDICES.length;function generateGeometryAttributes(e,t,i,r,n,a,o){var s,l,c,u,d=t._ellipsoid,h=i.length/3-1,p=8*h,m=4*p,f=36*h,g=new(65535<p?Uint32Array:Uint16Array)(f),_=new Float64Array(3*p),y=new Float32Array(m),v=new Float32Array(m),C=new Float32Array(m),S=new Float32Array(m),T=new Float32Array(m);o&&(s=new Float32Array(m),l=new Float32Array(m),c=new Float32Array(m),u=new Float32Array(2*p));var x=a.length/2,b=0,E=startCartographicScratch;E.height=0;var P=endCartographicScratch;P.height=0;var A=segmentStartTopScratch,w=segmentEndTopScratch;if(o)for(R=0,O=1;O<x;O++)E.latitude=a[R],E.longitude=a[R+1],P.latitude=a[R+2],P.longitude=a[R+3],A=t.project(E,A),w=t.project(P,w),b+=Cartesian3.distance(A,w),R+=2;for(var D,M=r.length/3,w=Cartesian3.unpack(r,0,w),I=0,R=3,O=1;O<M;O++)A=Cartesian3.clone(w,A),w=Cartesian3.unpack(r,R,w),I+=Cartesian3.distance(A,w),R+=3;var L=0,F=0,N=0,B=0,V=!(R=3),k=Cartesian3.unpack(i,0,segmentEndBottomScratch),z=Cartesian3.unpack(r,0,segmentEndTopScratch),$=Cartesian3.unpack(n,0,segmentEndNormalScratch);e&&breakMiter($,Cartesian3.unpack(i,i.length-6,segmentStartBottomScratch),k,z)&&($=Cartesian3.negate($,$));var U=0,G=0,H=0;for(O=0;O<h;O++){var W,q,j,Y,X,Q,J=Cartesian3.clone(k,segmentStartBottomScratch),Z=Cartesian3.clone(z,segmentStartTopScratch),K=Cartesian3.clone($,segmentStartNormalScratch);V&&(K=Cartesian3.negate(K,K)),k=Cartesian3.unpack(i,R,segmentEndBottomScratch),z=Cartesian3.unpack(r,R,segmentEndTopScratch),V=breakMiter($=Cartesian3.unpack(n,R,segmentEndNormalScratch),J,k,z),E.latitude=a[L],E.longitude=a[L+1],P.latitude=a[L+2],P.longitude=a[L+3],o&&(j=nudgeCartographic(E,P),Y=t.project(E,segmentStart2DScratch),(Q=direction(X=t.project(P,segmentEnd2DScratch),Y,forwardOffset2DScratch)).y=Math.abs(Q.y),W=segmentStartNormal2DScratch,q=segmentEndNormal2DScratch,0===j||Cartesian3.dot(Q,Cartesian3.UNIT_Y)>MITER_BREAK_SMALL?(W=projectNormal(t,E,K,Y,segmentStartNormal2DScratch),q=projectNormal(t,P,$,X,segmentEndNormal2DScratch)):1===j?(q=projectNormal(t,P,$,X,segmentEndNormal2DScratch),W.x=0,W.y=CesiumMath.sign(E.longitude-Math.abs(P.longitude)),W.z=0):(W=projectNormal(t,E,K,Y,segmentStartNormal2DScratch),q.x=0,q.y=CesiumMath.sign(E.longitude-P.longitude),q.z=0));var ee,te,ie,re,ne=Cartesian3.distance(Z,z),ae=EncodedCartesian3.fromCartesian(J,encodeScratch),oe=Cartesian3.subtract(k,J,offsetScratch$1),se=Cartesian3.normalize(oe,rightScratch$1),le=Cartesian3.subtract(Z,J,startUpScratch),le=Cartesian3.normalize(le,le),ce=Cartesian3.cross(se,le,rightScratch$1),ce=Cartesian3.normalize(ce,ce),ue=Cartesian3.cross(le,K,startPlaneNormalScratch),ue=Cartesian3.normalize(ue,ue),de=Cartesian3.subtract(z,k,endUpScratch),de=Cartesian3.normalize(de,de),he=Cartesian3.cross($,de,endPlaneNormalScratch),he=Cartesian3.normalize(he,he),pe=ne/I,me=U/I,fe=0,ge=0,_e=0;for(o&&(fe=Cartesian3.distance(Y,X),ee=EncodedCartesian3.fromCartesian(Y,encodeScratch2D),te=Cartesian3.subtract(X,Y,forwardOffset2DScratch),re=(ie=Cartesian3.normalize(te,right2DScratch)).x,ie.x=ie.y,ie.y=-re,ge=fe/b,_e=G/b),D=0;D<8;D++){var ye=B+4*D,ve=F+2*D,Ce=ye+3,Se=D<4?1:-1,Te=2===D||3===D||6===D||7===D?1:-1;Cartesian3.pack(ae.high,y,ye),y[Ce]=oe.x,Cartesian3.pack(ae.low,v,ye),v[Ce]=oe.y,Cartesian3.pack(ue,C,ye),C[Ce]=oe.z,Cartesian3.pack(he,S,ye),S[Ce]=pe*Se,Cartesian3.pack(ce,T,ye);var xe=me*Te;0===xe&&Te<0&&(xe=9),T[Ce]=xe,o&&(s[ye]=ee.high.x,s[ye+1]=ee.high.y,s[ye+2]=ee.low.x,s[ye+3]=ee.low.y,c[ye]=-W.y,c[ye+1]=W.x,c[ye+2]=q.y,c[ye+3]=-q.x,l[ye]=te.x,l[ye+1]=te.y,l[ye+2]=ie.x,l[ye+3]=ie.y,u[ve]=ge*Se,0===(xe=_e*Te)&&Te<0&&(xe=9),u[ve+1]=xe)}var be=adjustHeightStartBottomScratch,Ee=adjustHeightEndBottomScratch,Pe=adjustHeightStartTopScratch,Ae=adjustHeightEndTopScratch,we=Rectangle.fromCartographicArray(getHeightCartographics,getHeightRectangleScratch),De=ApproximateTerrainHeights.getMinimumMaximumHeights(we,d),Me=De.minimumTerrainHeight,Ie=De.maximumTerrainHeight;H+=Me,H+=Ie,adjustHeights(J,Z,Me,Ie,be,Pe),adjustHeights(k,z,Me,Ie,Ee,Ae);var Re=Cartesian3.multiplyByScalar(ce,CesiumMath.EPSILON5,normalNudgeScratch);Cartesian3.add(be,Re,be),Cartesian3.add(Ee,Re,Ee),Cartesian3.add(Pe,Re,Pe),Cartesian3.add(Ae,Re,Ae),nudgeXZ(be,Ee),nudgeXZ(Pe,Ae),Cartesian3.pack(be,_,N),Cartesian3.pack(Ee,_,N+3),Cartesian3.pack(Ae,_,N+6),Cartesian3.pack(Pe,_,N+9),Re=Cartesian3.multiplyByScalar(ce,-2*CesiumMath.EPSILON5,normalNudgeScratch),Cartesian3.add(be,Re,be),Cartesian3.add(Ee,Re,Ee),Cartesian3.add(Pe,Re,Pe),Cartesian3.add(Ae,Re,Ae),nudgeXZ(be,Ee),nudgeXZ(Pe,Ae),Cartesian3.pack(be,_,N+12),Cartesian3.pack(Ee,_,N+15),Cartesian3.pack(Ae,_,N+18),Cartesian3.pack(Pe,_,N+21),L+=2,R+=3,F+=16,N+=24,B+=32,U+=ne,G+=fe}var Oe=R=0;for(O=0;O<h;O++){for(D=0;D<REFERENCE_INDICES_LENGTH;D++)g[R+D]=REFERENCE_INDICES[D]+Oe;Oe+=8,R+=REFERENCE_INDICES_LENGTH}var Le=scratchBoundingSpheres;BoundingSphere.fromVertices(i,Cartesian3.ZERO,3,Le[0]),BoundingSphere.fromVertices(r,Cartesian3.ZERO,3,Le[1]);var Fe=BoundingSphere.fromBoundingSpheres(Le);Fe.radius+=H/(2*h);var Ne={position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,normalize:!1,values:_}),startHiAndForwardOffsetX:getVec4GeometryAttribute(y),startLoAndForwardOffsetY:getVec4GeometryAttribute(v),startNormalAndForwardOffsetZ:getVec4GeometryAttribute(C),endNormalAndTextureCoordinateNormalizationX:getVec4GeometryAttribute(S),rightNormalAndTextureCoordinateNormalizationY:getVec4GeometryAttribute(T)};return o&&(Ne.startHiLo2D=getVec4GeometryAttribute(s),Ne.offsetAndRight2D=getVec4GeometryAttribute(l),Ne.startEndNormals2D=getVec4GeometryAttribute(c),Ne.texcoordNormalization2D=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,normalize:!1,values:u})),new Geometry({attributes:Ne,indices:g,boundingSphere:Fe})}function getVec4GeometryAttribute(e){return new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4,normalize:!1,values:e})}function HeadingPitchRange(e,t,i){this.heading=defaultValue(e,0),this.pitch=defaultValue(t,0),this.range=defaultValue(i,0)}GroundPolylineGeometry._projectNormal=projectNormal,HeadingPitchRange.clone=function(e,t){if(defined(e))return defined(t)||(t=new HeadingPitchRange),t.heading=e.heading,t.pitch=e.pitch,t.range=e.range,t};var factorial=CesiumMath.factorial;function calculateCoefficientTerm(e,t,i,r,n,a){var o,s,l,c=0;if(0<r){for(s=0;s<n;s++){for(o=!1,l=0;l<a.length&&!o;l++)s===a[l]&&(o=!0);o||(a.push(s),c+=calculateCoefficientTerm(e,t,i,r-1,n,a),a.splice(a.length-1,1))}return c}for(c=1,s=0;s<n;s++){for(o=!1,l=0;l<a.length&&!o;l++)s===a[l]&&(o=!0);o||(c*=e-i[t[s]])}return c}var HermitePolynomialApproximation={type:"Hermite",getRequiredDataPoints:function(e,t){return t=defaultValue(t,0),Math.max(Math.floor((e+1)/(t+1)),2)},interpolateOrderZero:function(e,t,i,r,n){var a,o;defined(n)||(n=new Array(r));for(var s=t.length,l=new Array(r),c=0;c<r;c++){n[c]=0;var u=new Array(s);for(l[c]=u,f=0;f<s;f++)u[f]=[]}var d=s,h=new Array(d);for(c=0;c<d;c++)h[c]=c;var p=s-1;for(C=0;C<r;C++){for(f=0;f<d;f++)o=h[f]*r+C,l[C][0].push(i[o]);for(c=1;c<d;c++){for(var m=!1,f=0;f<d-c;f++){var g,_=t[h[f]],y=t[h[f+c]];y-_<=0?(g=i[o=h[f]*r+r*c+C],l[C][c].push(g/factorial(c))):(g=l[C][c-1][f+1]-l[C][c-1][f],l[C][c].push(g/(y-_))),m=m||0!==g}m||(p=c-1)}}for(a=0;a<=0;a++)for(c=a;c<=p;c++)for(var v=calculateCoefficientTerm(e,h,t,a,c,[]),C=0;C<r;C++){var S=l[C][c][0];n[C+a*r]+=S*v}return n}},arrayScratch$1=[];function fillCoefficientList(e,t,i,r,n,a){for(var o,s=-1,l=t.length,c=l*(l+1)/2,u=0;u<n;u++){var d=Math.floor(u*c);for(g=0;g<l;g++)o=t[g]*n*(a+1)+u,e[d+g]=r[o];for(var h=1;h<l;h++){for(var p=0,m=Math.floor(h*(1-h)/2)+l*h,f=!1,g=0;g<l-h;g++){var _,y,v,C=i[t[g]],S=i[t[g+h]];v=S-C<=0?(y=r[o=t[g]*n*(a+1)+n*h+u])/CesiumMath.factorial(h):(y=e[d+(_=Math.floor((h-1)*(2-h)/2)+l*(h-1))+g+1]-e[d+_+g])/(S-C),e[d+m+p]=v,p++,f=f||0!==y}f&&(s=Math.max(s,h))}}return s}function IauOrientationParameters(e,t,i,r){this.rightAscension=e,this.declination=t,this.rotation=i,this.rotationRate=r}HermitePolynomialApproximation.interpolate=function(e,t,i,r,n,a,o){var s=r*(a+1);defined(o)||(o=new Array(s));for(var l=0;l<s;l++)o[l]=0;for(var c=t.length,u=new Array(c*(n+1)),d=0;d<c;d++)for(var h=0;h<n+1;h++)u[d*(n+1)+h]=d;for(var p=u.length,m=arrayScratch$1,f=fillCoefficientList(m,u,t,i,r,n),g=[],_=p*(p+1)/2,y=Math.min(f,a),v=0;v<=y;v++)for(d=v;d<=f;d++){g.length=0;for(var C=calculateCoefficientTerm(e,u,t,v,d,g),S=Math.floor(d*(1-d)/2)+p*d,T=0;T<r;T++){var x=m[Math.floor(T*_)+S];o[T+v*r]+=x*C}}return o};var Iau2000Orientation={},TdtMinusTai=32.184,J2000d=2451545,c1=-.0529921,c2=-.1059842,c3$1=13.0120009,c4=13.3407154,c5=.9856003,c6=26.4057084,c7=13.064993,c8=.3287146,c9=1.7484877,c10=-.1589763,c11=.0036096,c12=.1643573,c13=12.9590088,dateTT=new JulianDate;function IauOrientationAxes(e){defined(e)&&"function"==typeof e||(e=Iau2000Orientation.ComputeMoon),this._computeFunction=e}Iau2000Orientation.ComputeMoon=function(e,t){defined(e)||(e=JulianDate.now()),dateTT=JulianDate.addSeconds(e,TdtMinusTai,dateTT);var i=JulianDate.totalDays(dateTT)-J2000d,r=i/TimeConstants$1.DAYS_PER_JULIAN_CENTURY,n=(125.045+c1*i)*CesiumMath.RADIANS_PER_DEGREE,a=(250.089+c2*i)*CesiumMath.RADIANS_PER_DEGREE,o=(260.008+c3$1*i)*CesiumMath.RADIANS_PER_DEGREE,s=(176.625+c4*i)*CesiumMath.RADIANS_PER_DEGREE,l=(357.529+c5*i)*CesiumMath.RADIANS_PER_DEGREE,c=(311.589+c6*i)*CesiumMath.RADIANS_PER_DEGREE,u=(134.963+c7*i)*CesiumMath.RADIANS_PER_DEGREE,d=(276.617+c8*i)*CesiumMath.RADIANS_PER_DEGREE,h=(34.226+c9*i)*CesiumMath.RADIANS_PER_DEGREE,p=(15.134+c10*i)*CesiumMath.RADIANS_PER_DEGREE,m=(119.743+c11*i)*CesiumMath.RADIANS_PER_DEGREE,f=(239.961+c12*i)*CesiumMath.RADIANS_PER_DEGREE,g=(25.053+c13*i)*CesiumMath.RADIANS_PER_DEGREE,_=Math.sin(n),y=Math.sin(a),v=Math.sin(o),C=Math.sin(s),S=Math.sin(l),T=Math.sin(c),x=Math.sin(u),b=Math.sin(d),E=Math.sin(h),P=Math.sin(p),A=Math.sin(m),w=Math.sin(f),D=Math.sin(g),M=Math.cos(n),I=Math.cos(a),R=Math.cos(o),O=Math.cos(s),L=Math.cos(l),F=Math.cos(c),N=Math.cos(u),B=Math.cos(d),V=Math.cos(h),k=Math.cos(p),z=Math.cos(m),$=Math.cos(f),U=Math.cos(g),G=(269.9949+.0031*r-3.8787*_-.1204*y+.07*v-.0172*C+.0072*T-.0052*P+.0043*D)*CesiumMath.RADIANS_PER_DEGREE,H=(66.5392+.013*r+1.5419*M+.0239*I-.0278*R+.0068*O-.0029*F+9e-4*N+8e-4*k-9e-4*U)*CesiumMath.RADIANS_PER_DEGREE,W=(38.3213+13.17635815*i-14e-13*i*i+3.561*_+.1208*y-.0642*v+.0158*C+.0252*S-.0066*T-.0047*x-.0046*b+.0028*E+.0052*P+.004*A+.0019*w-.0044*D)*CesiumMath.RADIANS_PER_DEGREE,q=(13.17635815-2*i*14e-13+3.561*M*c1+.1208*I*c2-.0642*R*c3$1+.0158*O*c4+.0252*L*c5-.0066*F*c6-.0047*N*c7-.0046*B*c8+.0028*V*c9+.0052*k*c10+.004*z*c11+.0019*$*c12-.0044*U*c13)/86400*CesiumMath.RADIANS_PER_DEGREE;return defined(t)||(t=new IauOrientationParameters),t.rightAscension=G,t.declination=H,t.rotation=W,t.rotationRate=q,t};var xAxisScratch=new Cartesian3,yAxisScratch=new Cartesian3,zAxisScratch=new Cartesian3;function computeRotationMatrix(e,t,i){var r=xAxisScratch;r.x=Math.cos(e+CesiumMath.PI_OVER_TWO),r.y=Math.sin(e+CesiumMath.PI_OVER_TWO),r.z=0;var n=Math.cos(t),a=zAxisScratch;a.x=n*Math.cos(e),a.y=n*Math.sin(e),a.z=Math.sin(t);var o=Cartesian3.cross(a,r,yAxisScratch);return defined(i)||(i=new Matrix3),i[0]=r.x,i[1]=o.x,i[2]=a.x,i[3]=r.y,i[4]=o.y,i[5]=a.y,i[6]=r.z,i[7]=o.z,i[8]=a.z,i}var rotMtxScratch=new Matrix3,quatScratch=new Quaternion;IauOrientationAxes.prototype.evaluate=function(e,t){defined(e)||(e=JulianDate.now());var i=this._computeFunction(e),r=computeRotationMatrix(i.rightAscension,i.declination,t),n=CesiumMath.zeroToTwoPi(i.rotation),a=Quaternion.fromAxisAngle(Cartesian3.UNIT_Z,n,quatScratch),o=Matrix3.fromQuaternion(Quaternion.conjugate(a,a),rotMtxScratch);return Matrix3.multiply(o,r,r)};var InterpolationAlgorithm={type:void 0},defaultTokenCredit;InterpolationAlgorithm.getRequiredDataPoints=DeveloperError.throwInstantiationError,InterpolationAlgorithm.interpolateOrderZero=DeveloperError.throwInstantiationError,InterpolationAlgorithm.interpolate=DeveloperError.throwInstantiationError;var defaultAccessToken="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3N2JjMzBlOC1hZTdjLTQwZDItOTkxYi05M2JhMTI5ZGM0YWYiLCJpZCI6MjU5LCJzY29wZXMiOlsiYXNyIiwiZ2MiXSwiaWF0IjoxNTk2NDY1OTgyfQ.5YL6fQO9PaD4pomg0ivU1sD1FbFt1aCqzNXUcfk1eZw",Ion={};function PeliasGeocoderService(e){this._url=Resource.createIfNeeded(e),this._url.appendForwardSlash()}function IonGeocoderService(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.accessToken,Ion.defaultAccessToken),i=Resource.createIfNeeded(defaultValue(e.server,Ion.defaultServer));i.appendForwardSlash();var r=Ion.getDefaultTokenCredit(t);defined(r)&&e.scene.frameState.creditDisplay.addDefaultCredit(Credit.clone(r));var n=i.getDerivedResource({url:"v1/geocode"});defined(t)&&n.appendQueryParameters({access_token:t}),this._accessToken=t,this._server=i,this._pelias=new PeliasGeocoderService(n)}function IonResource(e,t){var i,r=e.externalType,n=defined(r);if(n){if("3DTILES"!==r&&"STK_TERRAIN_SERVER"!==r)throw new RuntimeError("Ion.createResource does not support external imagery assets; use IonImageryProvider instead.");i={url:e.options.url}}else i={url:e.url,retryAttempts:1,retryCallback:retryCallback};Resource.call(this,i),this._ionEndpoint=e,this._ionEndpointDomain=n?void 0:new URI(e.url).authority,this._ionEndpointResource=t,this._ionRoot=void 0,this._pendingPromise=void 0,this._credits=void 0,this._isExternal=n}function retryCallback(t,e){var i=defaultValue(t._ionRoot,t),r=i._ionEndpointResource;return defined(e)&&(401===e.statusCode||e.target instanceof Image)?(defined(i._pendingPromise)||(i._pendingPromise=r.fetchJson().then(function(e){return i._ionEndpoint=e}).always(function(e){return i._pendingPromise=void 0,e})),i._pendingPromise.then(function(e){return t._ionEndpoint=e,!0})):when.resolve(!1)}function TimeInterval(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.start=defined(e.start)?JulianDate.clone(e.start):new JulianDate,this.stop=defined(e.stop)?JulianDate.clone(e.stop):new JulianDate,this.data=e.data,this.isStartIncluded=defaultValue(e.isStartIncluded,!0),this.isStopIncluded=defaultValue(e.isStopIncluded,!0)}Ion.defaultAccessToken=defaultAccessToken,Ion.defaultServer=new Resource({url:"https://api.cesium.com/"}),Ion.getDefaultTokenCredit=function(e){if(e===defaultAccessToken)return defined(defaultTokenCredit)||(defaultTokenCredit=new Credit('<b> This application is using Cesium\'s default ion access token. Please assign <i>Cesium.Ion.defaultAccessToken</i> with an access token from your ion account before making any Cesium API calls. You can sign up for a free ion account at <a href="https://cesium.com">https://cesium.com</a>.</b>',!0)),defaultTokenCredit},Object.defineProperties(PeliasGeocoderService.prototype,{url:{get:function(){return this._url}}}),PeliasGeocoderService.prototype.geocode=function(e,t){return this._url.getDerivedResource({url:t===GeocodeType$1.AUTOCOMPLETE?"autocomplete":"search",queryParameters:{text:e}}).fetchJson().then(function(e){return e.features.map(function(e){var t,i,r,n=e.bbox;return r=defined(n)?Rectangle.fromDegrees(n[0],n[1],n[2],n[3]):(t=e.geometry.coordinates[0],i=e.geometry.coordinates[1],Cartesian3.fromDegrees(t,i)),{displayName:e.properties.label,destination:r}})})},IonGeocoderService.prototype.geocode=function(e,t){return this._pelias.geocode(e,t)},defined(Object.create)&&(IonResource.prototype=Object.create(Resource.prototype),IonResource.prototype.constructor=IonResource),IonResource.fromAssetId=function(e,t){var i=IonResource._createEndpointResource(e,t);return i.fetchJson().then(function(e){return new IonResource(e,i)})},Object.defineProperties(IonResource.prototype,{credits:{get:function(){return defined(this._ionRoot)?this._ionRoot.credits:(defined(this._credits)||(this._credits=IonResource.getCreditsFromEndpoint(this._ionEndpoint,this._ionEndpointResource)),this._credits)}}}),IonResource.getCreditsFromEndpoint=function(e,t){var i=e.attributions.map(Credit.getIonCredit),r=Ion.getDefaultTokenCredit(t.queryParameters.access_token);return defined(r)&&i.push(Credit.clone(r)),i},IonResource.prototype.clone=function(e){var t=defaultValue(this._ionRoot,this);return defined(e)||(e=new IonResource(t._ionEndpoint,t._ionEndpointResource)),(e=Resource.prototype.clone.call(this,e))._ionRoot=t,e._isExternal=this._isExternal,e},IonResource.prototype.fetchImage=function(e){var t;return this._isExternal||(t=e,e={preferBlob:!0},defined(t)&&(e.flipY=t.flipY,e.preferImageBitmap=t.preferImageBitmap)),Resource.prototype.fetchImage.call(this,e)},IonResource.prototype._makeRequest=function(e){return this._isExternal||new URI(this.url).authority!==this._ionEndpointDomain||(defined(e.headers)||(e.headers={}),e.headers.Authorization="Bearer "+this._ionEndpoint.accessToken),Resource.prototype._makeRequest.call(this,e)},IonResource._createEndpointResource=function(e,t){t=defaultValue(t,defaultValue.EMPTY_OBJECT);var i=defaultValue(t.server,Ion.defaultServer),r=defaultValue(t.accessToken,Ion.defaultAccessToken),i=Resource.createIfNeeded(i),n={url:"v1/assets/"+e+"/endpoint"};return defined(r)&&(n.queryParameters={access_token:r}),i.getDerivedResource(n)},Object.defineProperties(TimeInterval.prototype,{isEmpty:{get:function(){var e=JulianDate.compare(this.stop,this.start);return e<0||0===e&&(!this.isStartIncluded||!this.isStopIncluded)}}});var scratchInterval={start:void 0,stop:void 0,isStartIncluded:void 0,isStopIncluded:void 0,data:void 0};TimeInterval.fromIso8601=function(e,t){var i=e.iso8601.split("/");if(2!==i.length)throw new DeveloperError("options.iso8601 is an invalid ISO 8601 interval.");var r=JulianDate.fromIso8601(i[0]),n=JulianDate.fromIso8601(i[1]),a=defaultValue(e.isStartIncluded,!0),o=defaultValue(e.isStopIncluded,!0),s=e.data;return defined(t)?(t.start=r,t.stop=n,t.isStartIncluded=a,t.isStopIncluded=o,t.data=s,t):(scratchInterval.start=r,scratchInterval.stop=n,scratchInterval.isStartIncluded=a,scratchInterval.isStopIncluded=o,scratchInterval.data=s,new TimeInterval(scratchInterval))},TimeInterval.toIso8601=function(e,t){return JulianDate.toIso8601(e.start,t)+"/"+JulianDate.toIso8601(e.stop,t)},TimeInterval.clone=function(e,t){if(defined(e))return defined(t)?(t.start=e.start,t.stop=e.stop,t.isStartIncluded=e.isStartIncluded,t.isStopIncluded=e.isStopIncluded,t.data=e.data,t):new TimeInterval(e)},TimeInterval.equals=function(e,t,i){return e===t||defined(e)&&defined(t)&&(e.isEmpty&&t.isEmpty||e.isStartIncluded===t.isStartIncluded&&e.isStopIncluded===t.isStopIncluded&&JulianDate.equals(e.start,t.start)&&JulianDate.equals(e.stop,t.stop)&&(e.data===t.data||defined(i)&&i(e.data,t.data)))},TimeInterval.equalsEpsilon=function(e,t,i,r){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&(e.isEmpty&&t.isEmpty||e.isStartIncluded===t.isStartIncluded&&e.isStopIncluded===t.isStopIncluded&&JulianDate.equalsEpsilon(e.start,t.start,i)&&JulianDate.equalsEpsilon(e.stop,t.stop,i)&&(e.data===t.data||defined(r)&&r(e.data,t.data)))},TimeInterval.intersect=function(e,t,i,r){if(!defined(t))return TimeInterval.clone(TimeInterval.EMPTY,i);var n=e.start,a=e.stop,o=t.start,s=t.stop,l=JulianDate.greaterThanOrEquals(o,n)&&JulianDate.greaterThanOrEquals(a,o),c=!l&&JulianDate.lessThanOrEquals(o,n)&&JulianDate.lessThanOrEquals(n,s);if(!l&&!c)return TimeInterval.clone(TimeInterval.EMPTY,i);var u=e.isStartIncluded,d=e.isStopIncluded,h=t.isStartIncluded,p=t.isStopIncluded,m=JulianDate.lessThan(a,s);return defined(i)||(i=new TimeInterval),i.start=l?o:n,i.isStartIncluded=u&&h||!JulianDate.equals(o,n)&&(l&&h||c&&u),i.stop=m?a:s,i.isStopIncluded=m?d:d&&p||!JulianDate.equals(s,a)&&p,i.data=defined(r)?r(e.data,t.data):e.data,i},TimeInterval.contains=function(e,t){if(e.isEmpty)return!1;var i=JulianDate.compare(e.start,t);if(0===i)return e.isStartIncluded;var r=JulianDate.compare(t,e.stop);return 0===r?e.isStopIncluded:i<0&&r<0},TimeInterval.prototype.clone=function(e){return TimeInterval.clone(this,e)},TimeInterval.prototype.equals=function(e,t){return TimeInterval.equals(this,e,t)},TimeInterval.prototype.equalsEpsilon=function(e,t,i){return TimeInterval.equalsEpsilon(this,e,t,i)},TimeInterval.prototype.toString=function(){return TimeInterval.toIso8601(this)},TimeInterval.EMPTY=Object.freeze(new TimeInterval({start:new JulianDate,stop:new JulianDate,isStartIncluded:!1,isStopIncluded:!1}));var MINIMUM_VALUE=Object.freeze(JulianDate.fromIso8601("0000-01-01T00:00:00Z")),MAXIMUM_VALUE=Object.freeze(JulianDate.fromIso8601("9999-12-31T24:00:00Z")),MAXIMUM_INTERVAL=Object.freeze(new TimeInterval({start:MINIMUM_VALUE,stop:MAXIMUM_VALUE})),Iso8601={MINIMUM_VALUE:MINIMUM_VALUE,MAXIMUM_VALUE:MAXIMUM_VALUE,MAXIMUM_INTERVAL:MAXIMUM_INTERVAL},KeyboardEventModifier={SHIFT:0,CTRL:1,ALT:2},KeyboardEventModifier$1=Object.freeze(KeyboardEventModifier),LagrangePolynomialApproximation={type:"Lagrange",getRequiredDataPoints:function(e){return Math.max(e+1,2)},interpolateOrderZero:function(e,t,i,r,n){defined(n)||(n=new Array(r));for(var a=t.length,o=0;o<r;o++)n[o]=0;for(o=0;o<a;o++){for(var s,l=1,c=0;c<a;c++){c!==o&&(s=t[o]-t[c],l*=(e-t[c])/s)}for(c=0;c<r;c++)n[c]+=l*i[o*r+c]}return n}},LinearApproximation={type:"Linear"},defaultAccessToken$1;function ManagedArray(e){e=defaultValue(e,0),this._array=new Array(e),this._length=e}function MapProjection(){DeveloperError.throwInstantiationError()}LinearApproximation.getRequiredDataPoints=function(e){return 2},LinearApproximation.interpolateOrderZero=function(e,t,i,r,n){var a,o;defined(n)||(n=new Array(r));for(var s=t[0],l=t[1],c=0;c<r;c++)a=i[c],o=i[c+r],n[c]=((o-a)*e+l*a-s*o)/(l-s);return n},Object.defineProperties(ManagedArray.prototype,{length:{get:function(){return this._length},set:function(e){var t=this._array,i=this._length;if(e<i)for(var r=e;r<i;++r)t[r]=void 0;else e>t.length&&(t.length=e);this._length=e}},values:{get:function(){return this._array}}}),ManagedArray.prototype.get=function(e){return this._array[e]},ManagedArray.prototype.set=function(e,t){e>=this._length&&(this.length=e+1),this._array[e]=t},ManagedArray.prototype.peek=function(){return this._array[this._length-1]},ManagedArray.prototype.push=function(e){var t=this.length++;this._array[t]=e},ManagedArray.prototype.pop=function(){if(0!==this._length){var e=this._array[this._length-1];return--this.length,e}},ManagedArray.prototype.reserve=function(e){e>this._array.length&&(this._array.length=e)},ManagedArray.prototype.resize=function(e){this.length=e},ManagedArray.prototype.trim=function(e){e=defaultValue(e,this._length),this._array.length=e},Object.defineProperties(MapProjection.prototype,{ellipsoid:{get:DeveloperError.throwInstantiationError}}),MapProjection.prototype.project=DeveloperError.throwInstantiationError,MapProjection.prototype.unproject=DeveloperError.throwInstantiationError;var MapboxApi={};function NearFarScalar(e,t,i,r){this.near=defaultValue(e,0),this.nearValue=defaultValue(t,0),this.far=defaultValue(i,1),this.farValue=defaultValue(r,0)}Object.defineProperties(MapboxApi,{defaultAccessToken:{set:function(e){defaultAccessToken$1=e,deprecationWarning("mapbox-token","MapboxApi.defaultAccessToken is deprecated and will be removed in CesiumJS 1.73. Pass your access token directly to the MapboxImageryProvider or MapboxStyleImageryProvider constructors.")},get:function(){return defaultAccessToken$1}}}),MapboxApi.getAccessToken=function(e){return defined(e)?e:MapboxApi.defaultAccessToken},NearFarScalar.clone=function(e,t){if(defined(e))return defined(t)?(t.near=e.near,t.nearValue=e.nearValue,t.far=e.far,t.farValue=e.farValue,t):new NearFarScalar(e.near,e.nearValue,e.far,e.farValue)},NearFarScalar.packedLength=4,NearFarScalar.pack=function(e,t,i){return i=defaultValue(i,0),t[i++]=e.near,t[i++]=e.nearValue,t[i++]=e.far,t[i]=e.farValue,t},NearFarScalar.unpack=function(e,t,i){return t=defaultValue(t,0),defined(i)||(i=new NearFarScalar),i.near=e[t++],i.nearValue=e[t++],i.far=e[t++],i.farValue=e[t],i},NearFarScalar.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.near===t.near&&e.nearValue===t.nearValue&&e.far===t.far&&e.farValue===t.farValue},NearFarScalar.prototype.clone=function(e){return NearFarScalar.clone(this,e)},NearFarScalar.prototype.equals=function(e){return NearFarScalar.equals(this,e)};var Visibility={NONE:-1,PARTIAL:0,FULL:1},Visibility$1=Object.freeze(Visibility);function Occluder(e,t){this._occluderPosition=Cartesian3.clone(e.center),this._occluderRadius=e.radius,this._horizonDistance=0,this._horizonPlaneNormal=void 0,this._horizonPlanePosition=void 0,this._cameraPosition=void 0,this.cameraPosition=t}var scratchCartesian3$7=new Cartesian3;Object.defineProperties(Occluder.prototype,{position:{get:function(){return this._occluderPosition}},radius:{get:function(){return this._occluderRadius}},cameraPosition:{set:function(e){e=Cartesian3.clone(e,this._cameraPosition);var t,i,r,n,a=Cartesian3.subtract(this._occluderPosition,e,scratchCartesian3$7),o=Cartesian3.magnitudeSquared(a),s=this._occluderRadius*this._occluderRadius;s<o?(t=Math.sqrt(o-s),o=1/Math.sqrt(o),i=Cartesian3.multiplyByScalar(a,o,scratchCartesian3$7),r=t*t*o,n=Cartesian3.add(e,Cartesian3.multiplyByScalar(i,r,scratchCartesian3$7),scratchCartesian3$7)):t=Number.MAX_VALUE,this._horizonDistance=t,this._horizonPlaneNormal=i,this._horizonPlanePosition=n,this._cameraPosition=e}}}),Occluder.fromBoundingSphere=function(e,t,i){return defined(i)?(Cartesian3.clone(e.center,i._occluderPosition),i._occluderRadius=e.radius,i.cameraPosition=t,i):new Occluder(e,t)};var tempVecScratch=new Cartesian3;Occluder.prototype.isPointVisible=function(e){if(this._horizonDistance!==Number.MAX_VALUE){var t=Cartesian3.subtract(e,this._occluderPosition,tempVecScratch),i=this._occluderRadius;if(0<(i=Cartesian3.magnitudeSquared(t)-i*i))return i=Math.sqrt(i)+this._horizonDistance,t=Cartesian3.subtract(e,this._cameraPosition,t),i*i>Cartesian3.magnitudeSquared(t)}return!1};var occludeePositionScratch=new Cartesian3;Occluder.prototype.isBoundingSphereVisible=function(e){var t=Cartesian3.clone(e.center,occludeePositionScratch),i=e.radius;if(this._horizonDistance===Number.MAX_VALUE)return!1;var r=Cartesian3.subtract(t,this._occluderPosition,tempVecScratch),n=this._occluderRadius-i,n=Cartesian3.magnitudeSquared(r)-n*n;if(i<this._occluderRadius)return 0<n&&(n=Math.sqrt(n)+this._horizonDistance,r=Cartesian3.subtract(t,this._cameraPosition,r),n*n+i*i>Cartesian3.magnitudeSquared(r));if(0<n){r=Cartesian3.subtract(t,this._cameraPosition,r);var a=Cartesian3.magnitudeSquared(r),o=this._occluderRadius*this._occluderRadius,s=i*i;return(this._horizonDistance*this._horizonDistance+o)*s>a*o?!0:a<(n=Math.sqrt(n)+this._horizonDistance)*n+s}return!0};var tempScratch$1=new Cartesian3;Occluder.prototype.computeVisibility=function(e){var t=Cartesian3.clone(e.center),i=e.radius;if(i>this._occluderRadius)return Visibility$1.FULL;if(this._horizonDistance!==Number.MAX_VALUE){var r=Cartesian3.subtract(t,this._occluderPosition,tempScratch$1),n=this._occluderRadius-i,a=Cartesian3.magnitudeSquared(r);if(0<(n=a-n*n)){n=Math.sqrt(n)+this._horizonDistance,r=Cartesian3.subtract(t,this._cameraPosition,r);var o=Cartesian3.magnitudeSquared(r);return n*n+i*i<o?Visibility$1.NONE:0<(n=a-(n=this._occluderRadius+i)*n)?o<(n=Math.sqrt(n)+this._horizonDistance)*n+i*i?Visibility$1.FULL:Visibility$1.PARTIAL:(r=Cartesian3.subtract(t,this._horizonPlanePosition,r),Cartesian3.dot(r,this._horizonPlaneNormal)>-i?Visibility$1.PARTIAL:Visibility$1.FULL)}}return Visibility$1.NONE};var occludeePointScratch=new Cartesian3;Occluder.computeOccludeePoint=function(e,t,i){var r=Cartesian3.clone(t),n=Cartesian3.clone(e.center),a=e.radius,o=i.length,s=Cartesian3.normalize(Cartesian3.subtract(r,n,occludeePointScratch),occludeePointScratch),l=-Cartesian3.dot(s,n),c=Occluder._anyRotationVector(n,s,l),u=Occluder._horizonToPlaneNormalDotProduct(e,s,l,c,i[0]);if(u){for(var d,h=1;h<o;++h){if(!(d=Occluder._horizonToPlaneNormalDotProduct(e,s,l,c,i[h])))return;d<u&&(u=d)}if(!(u<.0017453283658983088)){var p=a/u;return Cartesian3.add(n,Cartesian3.multiplyByScalar(s,p,occludeePointScratch),occludeePointScratch)}}};var computeOccludeePointFromRectangleScratch=[];Occluder.computeOccludeePointFromRectangle=function(e,t){t=defaultValue(t,Ellipsoid.WGS84);var i=Rectangle.subsample(e,t,0,computeOccludeePointFromRectangleScratch),r=BoundingSphere.fromPoints(i),n=Cartesian3.ZERO;if(!Cartesian3.equals(n,r.center))return Occluder.computeOccludeePoint(new BoundingSphere(n,t.minimumRadius),r.center,i)};var tempVec0Scratch=new Cartesian3;Occluder._anyRotationVector=function(e,t,i){var r=Cartesian3.abs(t,tempVec0Scratch),n=r.x>r.y?0:1;(0===n&&r.z>r.x||1===n&&r.z>r.y)&&(n=2);var a=new Cartesian3,o=0===n?(r.x=e.x,r.y=e.y+1,r.z=e.z+1,Cartesian3.UNIT_X):1===n?(r.x=e.x+1,r.y=e.y,r.z=e.z+1,Cartesian3.UNIT_Y):(r.x=e.x+1,r.y=e.y+1,r.z=e.z,Cartesian3.UNIT_Z),s=(Cartesian3.dot(t,r)+i)/-Cartesian3.dot(t,o);return Cartesian3.normalize(Cartesian3.subtract(Cartesian3.add(r,Cartesian3.multiplyByScalar(o,s,a),r),e,r),r)};var posDirectionScratch=new Cartesian3;Occluder._rotationVector=function(e,t,i,r,n){var a=Cartesian3.subtract(r,e,posDirectionScratch),a=Cartesian3.normalize(a,a);if(Cartesian3.dot(t,a)<.9999999847691291){var o=Cartesian3.cross(t,a,a);if(Cartesian3.magnitude(o)>CesiumMath.EPSILON13)return Cartesian3.normalize(o,new Cartesian3)}return n};var posScratch1=new Cartesian3,occluerPosScratch=new Cartesian3,posScratch2=new Cartesian3,horizonPlanePosScratch=new Cartesian3;function OffsetGeometryInstanceAttribute(e,t,i){e=defaultValue(e,0),t=defaultValue(t,0),i=defaultValue(i,0),this.value=new Float32Array([e,t,i])}function OpenCageGeocoderService(e,t,i){(e=Resource.createIfNeeded(e)).appendForwardSlash(),e.setQueryParameters({key:t}),this._url=e,this._params=defaultValue(i,{})}Occluder._horizonToPlaneNormalDotProduct=function(e,t,i,r,n){var a=Cartesian3.clone(n,posScratch1),o=Cartesian3.clone(e.center,occluerPosScratch),s=e.radius,l=Cartesian3.subtract(o,a,posScratch2),c=Cartesian3.magnitudeSquared(l),u=s*s;if(c<u)return!1;var d=c-u,h=Math.sqrt(d),p=h*(1/Math.sqrt(c))*h,l=Cartesian3.normalize(l,l),m=Cartesian3.add(a,Cartesian3.multiplyByScalar(l,p,horizonPlanePosScratch),horizonPlanePosScratch),f=Math.sqrt(d-p*p),g=this._rotationVector(o,t,i,a,r),_=Cartesian3.fromElements(g.x*g.x*l.x+(g.x*g.y-g.z)*l.y+(g.x*g.z+g.y)*l.z,(g.x*g.y+g.z)*l.x+g.y*g.y*l.y+(g.y*g.z-g.x)*l.z,(g.x*g.z-g.y)*l.x+(g.y*g.z+g.x)*l.y+g.z*g.z*l.z,posScratch1),_=Cartesian3.normalize(_,_),y=Cartesian3.multiplyByScalar(_,f,posScratch1),g=Cartesian3.normalize(Cartesian3.subtract(Cartesian3.add(m,y,posScratch2),o,posScratch2),posScratch2),v=Cartesian3.dot(t,g);g=Cartesian3.normalize(Cartesian3.subtract(Cartesian3.subtract(m,y,g),o,g),g);var C=Cartesian3.dot(t,g);return v<C?v:C},Object.defineProperties(OffsetGeometryInstanceAttribute.prototype,{componentDatatype:{get:function(){return ComponentDatatype$1.FLOAT}},componentsPerAttribute:{get:function(){return 3}},normalize:{get:function(){return!1}}}),OffsetGeometryInstanceAttribute.fromCartesian3=function(e){return new OffsetGeometryInstanceAttribute(e.x,e.y,e.z)},OffsetGeometryInstanceAttribute.toValue=function(e,t){return defined(t)||(t=new Float32Array([e.x,e.y,e.z])),t[0]=e.x,t[1]=e.y,t[2]=e.z,t},Object.defineProperties(OpenCageGeocoderService.prototype,{url:{get:function(){return this._url}},params:{get:function(){return this._params}}}),OpenCageGeocoderService.prototype.geocode=function(e){return this._url.getDerivedResource({url:"json",queryParameters:combine(this._params,{q:e})}).fetchJson().then(function(e){return e.results.map(function(e){var t,i,r,n=e.bounds;return r=defined(n)?Rectangle.fromDegrees(n.southwest.lng,n.southwest.lat,n.northeast.lng,n.northeast.lat):(t=e.geometry.lat,i=e.geometry.lng,Cartesian3.fromDegrees(t,i)),{displayName:e.formatted,destination:r}})})};var Packable={packedLength:void 0,pack:DeveloperError.throwInstantiationError,unpack:DeveloperError.throwInstantiationError},PackableForInterpolation={packedInterpolationLength:void 0,convertPackedArrayForInterpolation:DeveloperError.throwInstantiationError,unpackInterpolationResult:DeveloperError.throwInstantiationError},getCSSValue=function(e,t){return document.defaultView.getComputedStyle(e,null).getPropertyValue(t)},measureText=function(e,t,i,r){var n=e.measureText(t),a=getCSSValue(e.canvas,"font-family"),o=getCSSValue(e.canvas,"font-size").replace("px",""),s=getCSSValue(e.canvas,"font-style"),l=getCSSValue(e.canvas,"font-weight"),c=!/\S/.test(t);n.fontsize=o;var u=document.createElement("div");u.style.position="absolute",u.style.opacity=0,u.style.font=s+" "+l+" "+o+"px "+a,u.innerHTML=t+"<br/>"+t,document.body.appendChild(u),n.leading=1.2*o;var d=getCSSValue(u,"height");if(2*o<=(d=d.replace("px",""))&&(n.leading=d/2|0),document.body.removeChild(u),c)n.ascent=0,n.descent=0,n.bounds={minx:0,maxx:n.width,miny:0,maxy:0},n.height=0;else{var h=document.createElement("canvas");h.width=n.width+100,h.height=3*o,h.style.opacity=1,h.style.fontFamily=a,h.style.fontSize=o,h.style.fontStyle=s,h.style.fontWeight=l;var p=h.getContext("2d");p.font=s+" "+l+" "+o+"px "+a;var m=h.width,f=h.height,g=f/2;p.fillStyle="white",p.fillRect(-1,-1,m+2,f+2),i&&(p.strokeStyle="black",p.lineWidth=e.lineWidth,p.strokeText(t,50,g)),r&&(p.fillStyle="black",p.fillText(t,50,g));for(var _=p.getImageData(0,0,m,f).data,y=0,v=4*m,C=_.length;++y<C&&255===_[y];);for(var S=y/v|0,y=C-1;0<--y&&255===_[y];);var T=y/v|0;for(y=0;y<C&&255===_[y];)C<=(y+=v)&&(y=y-C+4);var x=y%v/4|0,b=1;for(y=C-3;0<=y&&255===_[y];)(y-=v)<0&&(y=C-3-4*b++);var E=y%v/4+1|0;n.ascent=g-S,n.descent=T-g,n.bounds={minx:x-50,maxx:E-50,miny:0,maxy:T-S},n.height=T-S+1}return n},imageSmoothingEnabledName;function writeTextToCanvas(e,t){if(""!==e){t=defaultValue(t,defaultValue.EMPTY_OBJECT);var i=defaultValue(t.font,"10px sans-serif"),r=defaultValue(t.stroke,!1),n=defaultValue(t.fill,!0),a=defaultValue(t.strokeWidth,1),o=defaultValue(t.backgroundColor,Color.TRANSPARENT),s=defaultValue(t.padding,0),l=2*s,c=document.createElement("canvas");c.width=1,c.height=1,c.style.font=i;var u=c.getContext("2d");defined(imageSmoothingEnabledName)||(defined(u.imageSmoothingEnabled)?imageSmoothingEnabledName="imageSmoothingEnabled":defined(u.mozImageSmoothingEnabled)?imageSmoothingEnabledName="mozImageSmoothingEnabled":defined(u.webkitImageSmoothingEnabled)?imageSmoothingEnabledName="webkitImageSmoothingEnabled":defined(u.msImageSmoothingEnabled)&&(imageSmoothingEnabledName="msImageSmoothingEnabled")),u.font=i,u.lineJoin="round",u.lineWidth=a,u[imageSmoothingEnabledName]=!1,u.textBaseline=defaultValue(t.textBaseline,"bottom"),c.style.visibility="hidden",document.body.appendChild(c);var d=measureText(u,e,r,n);c.dimensions=d,document.body.removeChild(c),c.style.visibility="";var h,p,m=-d.bounds.minx,f=Math.ceil(d.width)+m+l,g=d.height+l,_=g-(g-d.ascent+s)+l;return c.width=f,c.height=g,u.font=i,u.lineJoin="round",u.lineWidth=a,u[imageSmoothingEnabledName]=!1,o!==Color.TRANSPARENT&&(u.fillStyle=o.toCssColorString(),u.fillRect(0,0,c.width,c.height)),r&&(h=defaultValue(t.strokeColor,Color.BLACK),u.strokeStyle=h.toCssColorString(),u.strokeText(e,m+s,_)),n&&(p=defaultValue(t.fillColor,Color.WHITE),u.fillStyle=p.toCssColorString(),u.fillText(e,m+s,_)),c}}function PinBuilder(){this._cache={}}PinBuilder.prototype.fromColor=function(e,t){return createPin(void 0,void 0,e,t,this._cache)},PinBuilder.prototype.fromUrl=function(e,t,i){return createPin(e,void 0,t,i,this._cache)},PinBuilder.prototype.fromMakiIconId=function(e,t,i){return createPin(buildModuleUrl("Assets/Textures/maki/"+encodeURIComponent(e)+".png"),void 0,t,i,this._cache)},PinBuilder.prototype.fromText=function(e,t,i){return createPin(void 0,e,t,i,this._cache)};var colorScratch=new Color;function drawPin(e,t,i){e.save(),e.scale(i/24,i/24),e.fillStyle=t.toCssColorString(),e.strokeStyle=t.brighten(.6,colorScratch).toCssColorString(),e.lineWidth=.846,e.beginPath(),e.moveTo(6.72,.422),e.lineTo(17.28,.422),e.bezierCurveTo(18.553,.422,19.577,1.758,19.577,3.415),e.lineTo(19.577,10.973),e.bezierCurveTo(19.577,12.63,18.553,13.966,17.282,13.966),e.lineTo(14.386,14.008),e.lineTo(11.826,23.578),e.lineTo(9.614,14.008),e.lineTo(6.719,13.965),e.bezierCurveTo(5.446,13.983,4.422,12.629,4.422,10.972),e.lineTo(4.422,3.416),e.bezierCurveTo(4.423,1.76,5.447,.423,6.718,.423),e.closePath(),e.fill(),e.stroke(),e.restore()}function drawIcon(e,t,i){var r=i/2.5,n=r,a=r;t.width>t.height?a=r*(t.height/t.width):t.width<t.height&&(n=r*(t.width/t.height));var o=Math.round((i-n)/2),s=Math.round(7/24*i-a/2);e.globalCompositeOperation="destination-out",e.drawImage(t,o-1,s,n,a),e.drawImage(t,o,s-1,n,a),e.drawImage(t,o+1,s,n,a),e.drawImage(t,o,s+1,n,a),e.globalCompositeOperation="destination-over",e.fillStyle=Color.BLACK.toCssColorString(),e.fillRect(o-1,s-1,n+2,a+2),e.globalCompositeOperation="destination-out",e.drawImage(t,o,s,n,a),e.globalCompositeOperation="destination-over",e.fillStyle=Color.WHITE.toCssColorString(),e.fillRect(o-1,s-2,n+2,a+2)}var stringifyScratch=new Array(4);function createPin(e,t,i,r,n){stringifyScratch[0]=e,stringifyScratch[1]=t,stringifyScratch[2]=i,stringifyScratch[3]=r;var a=JSON.stringify(stringifyScratch),o=n[a];if(defined(o))return o;var s=document.createElement("canvas");s.width=r,s.height=r;var l,c=s.getContext("2d");if(drawPin(c,i,r),defined(e)){var u=Resource.createIfNeeded(e).fetchImage().then(function(e){return drawIcon(c,e,r),n[a]=s});return n[a]=u}return defined(t)&&(l=writeTextToCanvas(t,{font:"bold "+r+"px sans-serif"}),drawIcon(c,l,r)),n[a]=s}var PixelDatatype={UNSIGNED_BYTE:WebGLConstants$1.UNSIGNED_BYTE,UNSIGNED_SHORT:WebGLConstants$1.UNSIGNED_SHORT,UNSIGNED_INT:WebGLConstants$1.UNSIGNED_INT,FLOAT:WebGLConstants$1.FLOAT,HALF_FLOAT:WebGLConstants$1.HALF_FLOAT_OES,UNSIGNED_INT_24_8:WebGLConstants$1.UNSIGNED_INT_24_8,UNSIGNED_SHORT_4_4_4_4:WebGLConstants$1.UNSIGNED_SHORT_4_4_4_4,UNSIGNED_SHORT_5_5_5_1:WebGLConstants$1.UNSIGNED_SHORT_5_5_5_1,UNSIGNED_SHORT_5_6_5:WebGLConstants$1.UNSIGNED_SHORT_5_6_5,toWebGLConstant:function(e,t){switch(e){case PixelDatatype.UNSIGNED_BYTE:return WebGLConstants$1.UNSIGNED_BYTE;case PixelDatatype.UNSIGNED_SHORT:return WebGLConstants$1.UNSIGNED_SHORT;case PixelDatatype.UNSIGNED_INT:return WebGLConstants$1.UNSIGNED_INT;case PixelDatatype.FLOAT:return WebGLConstants$1.FLOAT;case PixelDatatype.HALF_FLOAT:return t.webgl2?WebGLConstants$1.HALF_FLOAT:WebGLConstants$1.HALF_FLOAT_OES;case PixelDatatype.UNSIGNED_INT_24_8:return WebGLConstants$1.UNSIGNED_INT_24_8;case PixelDatatype.UNSIGNED_SHORT_4_4_4_4:return WebGLConstants$1.UNSIGNED_SHORT_4_4_4_4;case PixelDatatype.UNSIGNED_SHORT_5_5_5_1:return WebGLConstants$1.UNSIGNED_SHORT_5_5_5_1;case PixelDatatype.UNSIGNED_SHORT_5_6_5:return PixelDatatype.UNSIGNED_SHORT_5_6_5}},isPacked:function(e){return e===PixelDatatype.UNSIGNED_INT_24_8||e===PixelDatatype.UNSIGNED_SHORT_4_4_4_4||e===PixelDatatype.UNSIGNED_SHORT_5_5_5_1||e===PixelDatatype.UNSIGNED_SHORT_5_6_5},sizeInBytes:function(e){switch(e){case PixelDatatype.UNSIGNED_BYTE:return 1;case PixelDatatype.UNSIGNED_SHORT:case PixelDatatype.UNSIGNED_SHORT_4_4_4_4:case PixelDatatype.UNSIGNED_SHORT_5_5_5_1:case PixelDatatype.UNSIGNED_SHORT_5_6_5:case PixelDatatype.HALF_FLOAT:return 2;case PixelDatatype.UNSIGNED_INT:case PixelDatatype.FLOAT:case PixelDatatype.UNSIGNED_INT_24_8:return 4}},validate:function(e){return e===PixelDatatype.UNSIGNED_BYTE||e===PixelDatatype.UNSIGNED_SHORT||e===PixelDatatype.UNSIGNED_INT||e===PixelDatatype.FLOAT||e===PixelDatatype.HALF_FLOAT||e===PixelDatatype.UNSIGNED_INT_24_8||e===PixelDatatype.UNSIGNED_SHORT_4_4_4_4||e===PixelDatatype.UNSIGNED_SHORT_5_5_5_1||e===PixelDatatype.UNSIGNED_SHORT_5_6_5}},PixelDatatype$1=Object.freeze(PixelDatatype),PixelFormat={DEPTH_COMPONENT:WebGLConstants$1.DEPTH_COMPONENT,DEPTH_STENCIL:WebGLConstants$1.DEPTH_STENCIL,ALPHA:WebGLConstants$1.ALPHA,RGB:WebGLConstants$1.RGB,RGBA:WebGLConstants$1.RGBA,LUMINANCE:WebGLConstants$1.LUMINANCE,LUMINANCE_ALPHA:WebGLConstants$1.LUMINANCE_ALPHA,RGB_DXT1:WebGLConstants$1.COMPRESSED_RGB_S3TC_DXT1_EXT,RGBA_DXT1:WebGLConstants$1.COMPRESSED_RGBA_S3TC_DXT1_EXT,RGBA_DXT3:WebGLConstants$1.COMPRESSED_RGBA_S3TC_DXT3_EXT,RGBA_DXT5:WebGLConstants$1.COMPRESSED_RGBA_S3TC_DXT5_EXT,RGB_PVRTC_4BPPV1:WebGLConstants$1.COMPRESSED_RGB_PVRTC_4BPPV1_IMG,RGB_PVRTC_2BPPV1:WebGLConstants$1.COMPRESSED_RGB_PVRTC_2BPPV1_IMG,RGBA_PVRTC_4BPPV1:WebGLConstants$1.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,RGBA_PVRTC_2BPPV1:WebGLConstants$1.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,RGB_ETC1:WebGLConstants$1.COMPRESSED_RGB_ETC1_WEBGL,componentsLength:function(e){switch(e){case PixelFormat.RGB:return 3;case PixelFormat.RGBA:return 4;case PixelFormat.LUMINANCE_ALPHA:return 2;case PixelFormat.ALPHA:case PixelFormat.LUMINANCE:default:return 1}},validate:function(e){return e===PixelFormat.DEPTH_COMPONENT||e===PixelFormat.DEPTH_STENCIL||e===PixelFormat.ALPHA||e===PixelFormat.RGB||e===PixelFormat.RGBA||e===PixelFormat.LUMINANCE||e===PixelFormat.LUMINANCE_ALPHA||e===PixelFormat.RGB_DXT1||e===PixelFormat.RGBA_DXT1||e===PixelFormat.RGBA_DXT3||e===PixelFormat.RGBA_DXT5||e===PixelFormat.RGB_PVRTC_4BPPV1||e===PixelFormat.RGB_PVRTC_2BPPV1||e===PixelFormat.RGBA_PVRTC_4BPPV1||e===PixelFormat.RGBA_PVRTC_2BPPV1||e===PixelFormat.RGB_ETC1},isColorFormat:function(e){return e===PixelFormat.ALPHA||e===PixelFormat.RGB||e===PixelFormat.RGBA||e===PixelFormat.LUMINANCE||e===PixelFormat.LUMINANCE_ALPHA},isDepthFormat:function(e){return e===PixelFormat.DEPTH_COMPONENT||e===PixelFormat.DEPTH_STENCIL},isCompressedFormat:function(e){return e===PixelFormat.RGB_DXT1||e===PixelFormat.RGBA_DXT1||e===PixelFormat.RGBA_DXT3||e===PixelFormat.RGBA_DXT5||e===PixelFormat.RGB_PVRTC_4BPPV1||e===PixelFormat.RGB_PVRTC_2BPPV1||e===PixelFormat.RGBA_PVRTC_4BPPV1||e===PixelFormat.RGBA_PVRTC_2BPPV1||e===PixelFormat.RGB_ETC1},isDXTFormat:function(e){return e===PixelFormat.RGB_DXT1||e===PixelFormat.RGBA_DXT1||e===PixelFormat.RGBA_DXT3||e===PixelFormat.RGBA_DXT5},isPVRTCFormat:function(e){return e===PixelFormat.RGB_PVRTC_4BPPV1||e===PixelFormat.RGB_PVRTC_2BPPV1||e===PixelFormat.RGBA_PVRTC_4BPPV1||e===PixelFormat.RGBA_PVRTC_2BPPV1},isETC1Format:function(e){return e===PixelFormat.RGB_ETC1},compressedTextureSizeInBytes:function(e,t,i){switch(e){case PixelFormat.RGB_DXT1:case PixelFormat.RGBA_DXT1:case PixelFormat.RGB_ETC1:return Math.floor((t+3)/4)*Math.floor((i+3)/4)*8;case PixelFormat.RGBA_DXT3:case PixelFormat.RGBA_DXT5:return Math.floor((t+3)/4)*Math.floor((i+3)/4)*16;case PixelFormat.RGB_PVRTC_4BPPV1:case PixelFormat.RGBA_PVRTC_4BPPV1:return Math.floor((Math.max(t,8)*Math.max(i,8)*4+7)/8);case PixelFormat.RGB_PVRTC_2BPPV1:case PixelFormat.RGBA_PVRTC_2BPPV1:return Math.floor((Math.max(t,16)*Math.max(i,8)*2+7)/8);default:return 0}},textureSizeInBytes:function(e,t,i,r){var n=PixelFormat.componentsLength(e);return PixelDatatype$1.isPacked(t)&&(n=1),n*PixelDatatype$1.sizeInBytes(t)*i*r},alignmentInBytes:function(e,t,i){var r=PixelFormat.textureSizeInBytes(e,t,i,1)%4;return 0==r?4:2==r?2:1},createTypedArray:function(e,t,i,r){var n=PixelDatatype$1.sizeInBytes(t),a=n===Uint8Array.BYTES_PER_ELEMENT?Uint8Array:n===Uint16Array.BYTES_PER_ELEMENT?Uint16Array:n===Float32Array.BYTES_PER_ELEMENT&&t===PixelDatatype$1.FLOAT?Float32Array:Uint32Array;return new a(PixelFormat.componentsLength(e)*i*r)},flipY:function(e,t,i,r,n){if(1===n)return e;for(var a=PixelFormat.createTypedArray(t,i,r,n),o=PixelFormat.componentsLength(t),s=r*o,l=0;l<n;++l)for(var c=l*r*o,u=(n-l-1)*r*o,d=0;d<s;++d)a[u+d]=e[c+d];return a},toInternalFormat:function(e,t,i){if(!i.webgl2)return e;if(e===PixelFormat.DEPTH_STENCIL)return WebGLConstants$1.DEPTH24_STENCIL8;if(e===PixelFormat.DEPTH_COMPONENT){if(t===PixelDatatype$1.UNSIGNED_SHORT)return WebGLConstants$1.DEPTH_COMPONENT16;if(t===PixelDatatype$1.UNSIGNED_INT)return WebGLConstants$1.DEPTH_COMPONENT24}if(t===PixelDatatype$1.FLOAT)switch(e){case PixelFormat.RGBA:return WebGLConstants$1.RGBA32F;case PixelFormat.RGB:return WebGLConstants$1.RGB32F;case PixelFormat.RG:return WebGLConstants$1.RG32F;case PixelFormat.R:return WebGLConstants$1.R32F}if(t===PixelDatatype$1.HALF_FLOAT)switch(e){case PixelFormat.RGBA:return WebGLConstants$1.RGBA16F;case PixelFormat.RGB:return WebGLConstants$1.RGB16F;case PixelFormat.RG:return WebGLConstants$1.RG16F;case PixelFormat.R:return WebGLConstants$1.R16F}return e}},PixelFormat$1=Object.freeze(PixelFormat);function PlaneGeometry(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.vertexFormat,VertexFormat.DEFAULT);this._vertexFormat=t,this._workerName="createPlaneGeometry"}PlaneGeometry.packedLength=VertexFormat.packedLength,PlaneGeometry.pack=function(e,t,i){return i=defaultValue(i,0),VertexFormat.pack(e._vertexFormat,t,i),t};var scratchVertexFormat$7=new VertexFormat,scratchOptions$e={vertexFormat:scratchVertexFormat$7};PlaneGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=VertexFormat.unpack(e,t,scratchVertexFormat$7);return defined(i)?(i._vertexFormat=VertexFormat.clone(r,i._vertexFormat),i):new PlaneGeometry(scratchOptions$e)};var min=new Cartesian3(-.5,-.5,0),max=new Cartesian3(.5,.5,0);function PlaneOutlineGeometry(){this._workerName="createPlaneOutlineGeometry"}PlaneGeometry.createGeometry=function(e){var t,i,r,n,a,o,s=e._vertexFormat,l=new GeometryAttributes;return s.position&&((o=new Float64Array(12))[0]=min.x,o[1]=min.y,o[2]=0,o[3]=max.x,o[4]=min.y,o[5]=0,o[6]=max.x,o[7]=max.y,o[8]=0,o[9]=min.x,o[10]=max.y,o[11]=0,l.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:o}),s.normal&&((i=new Float32Array(12))[0]=0,i[1]=0,i[2]=1,i[3]=0,i[4]=0,i[5]=1,i[6]=0,i[7]=0,i[8]=1,i[9]=0,i[10]=0,i[11]=1,l.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:i})),s.st&&((r=new Float32Array(8))[0]=0,r[1]=0,r[2]=1,r[3]=0,r[4]=1,r[5]=1,r[6]=0,r[7]=1,l.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:r})),s.tangent&&((n=new Float32Array(12))[0]=1,n[1]=0,n[2]=0,n[3]=1,n[4]=0,n[5]=0,n[6]=1,n[7]=0,n[8]=0,n[9]=1,n[10]=0,n[11]=0,l.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:n})),s.bitangent&&((a=new Float32Array(12))[0]=0,a[1]=1,a[2]=0,a[3]=0,a[4]=1,a[5]=0,a[6]=0,a[7]=1,a[8]=0,a[9]=0,a[10]=1,a[11]=0,l.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:a})),(t=new Uint16Array(6))[0]=0,t[1]=1,t[2]=2,t[3]=0,t[4]=2,t[5]=3),new Geometry({attributes:l,indices:t,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:new BoundingSphere(Cartesian3.ZERO,Math.sqrt(2))})},PlaneOutlineGeometry.packedLength=0,PlaneOutlineGeometry.pack=function(e,t){return t},PlaneOutlineGeometry.unpack=function(e,t,i){return defined(i)?i:new PlaneOutlineGeometry};var min$1=new Cartesian3(-.5,-.5,0),max$1=new Cartesian3(.5,.5,0);PlaneOutlineGeometry.createGeometry=function(){var e=new GeometryAttributes,t=new Uint16Array(8),i=new Float64Array(12);return i[0]=min$1.x,i[1]=min$1.y,i[2]=min$1.z,i[3]=max$1.x,i[4]=min$1.y,i[5]=min$1.z,i[6]=max$1.x,i[7]=max$1.y,i[8]=min$1.z,i[9]=min$1.x,i[10]=max$1.y,i[11]=min$1.z,e.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:i}),t[0]=0,t[1]=1,t[2]=1,t[3]=2,t[4]=2,t[5]=3,t[6]=3,t[7]=0,new Geometry({attributes:e,indices:t,primitiveType:PrimitiveType$1.LINES,boundingSphere:new BoundingSphere(Cartesian3.ZERO,Math.sqrt(2))})};var scratchCarto1=new Cartographic,scratchCarto2=new Cartographic;function adjustPosHeightsForNormal(e,t,i,r){var n=r.cartesianToCartographic(e,scratchCarto1).height,a=r.cartesianToCartographic(t,scratchCarto2);a.height=n,r.cartographicToCartesian(a,t);var o=r.cartesianToCartographic(i,scratchCarto2);o.height=n-100,r.cartographicToCartesian(o,i)}var scratchBoundingRectangle=new BoundingRectangle,scratchPosition$3=new Cartesian3,scratchNormal$5=new Cartesian3,scratchTangent$3=new Cartesian3,scratchBitangent$3=new Cartesian3,p1Scratch$2=new Cartesian3,p2Scratch$2=new Cartesian3,scratchPerPosNormal=new Cartesian3,scratchPerPosTangent=new Cartesian3,scratchPerPosBitangent=new Cartesian3,appendTextureCoordinatesOrigin=new Cartesian2,appendTextureCoordinatesCartesian2=new Cartesian2,appendTextureCoordinatesCartesian3=new Cartesian3,appendTextureCoordinatesQuaternion=new Quaternion,appendTextureCoordinatesMatrix3=new Matrix3,tangentMatrixScratch$1=new Matrix3;function computeAttributes(e){var t,i,r=e.vertexFormat,n=e.geometry,a=e.shadowVolume,o=n.attributes.position.values,s=o.length,l=e.wall,c=e.top||l,u=e.bottom||l;if(r.st||r.normal||r.tangent||r.bitangent||a){var d=e.boundingRectangle,h=e.tangentPlane,p=e.ellipsoid,m=e.stRotation,f=e.perPositionHeight,g=appendTextureCoordinatesOrigin;g.x=d.x,g.y=d.y;var _,y=r.st?new Float32Array(s/3*2):void 0;r.normal&&(_=f&&c&&!l?n.attributes.normal.values:new Float32Array(s));var v,C=r.tangent?new Float32Array(s):void 0,S=r.bitangent?new Float32Array(s):void 0,T=a?new Float32Array(s):void 0,x=0,b=0,E=scratchNormal$5,P=scratchTangent$3,A=scratchBitangent$3,w=!0,D=appendTextureCoordinatesMatrix3,M=tangentMatrixScratch$1;M=0!==m?(v=Quaternion.fromAxisAngle(h._plane.normal,m,appendTextureCoordinatesQuaternion),D=Matrix3.fromQuaternion(v,D),v=Quaternion.fromAxisAngle(h._plane.normal,-m,appendTextureCoordinatesQuaternion),Matrix3.fromQuaternion(v,M)):(D=Matrix3.clone(Matrix3.IDENTITY,D),Matrix3.clone(Matrix3.IDENTITY,M));var I=0,R=0;c&&u&&(I=s/2,R=s/3,s/=2);for(var O=0;O<s;O+=3){var L,F,N,B,V,k,z,$,U=Cartesian3.fromArray(o,O,appendTextureCoordinatesCartesian3);r.st&&(L=Matrix3.multiplyByVector(D,U,scratchPosition$3),L=p.scaleToGeodeticSurface(L,L),F=h.projectPointOntoPlane(L,appendTextureCoordinatesCartesian2),Cartesian2.subtract(F,g,F),N=CesiumMath.clamp(F.x/d.width,0,1),B=CesiumMath.clamp(F.y/d.height,0,1),u&&(y[x+R]=N,y[x+1+R]=B),c&&(y[x]=N,y[x+1]=B),x+=2),(r.normal||r.tangent||r.bitangent||a)&&(V=b+1,k=b+2,l?(O+3<s&&(z=Cartesian3.fromArray(o,O+3,p1Scratch$2),w&&($=Cartesian3.fromArray(o,O+s,p2Scratch$2),f&&adjustPosHeightsForNormal(U,z,$,p),Cartesian3.subtract(z,U,z),Cartesian3.subtract($,U,$),E=Cartesian3.normalize(Cartesian3.cross($,z,E),E),w=!1),Cartesian3.equalsEpsilon(z,U,CesiumMath.EPSILON10)&&(w=!0)),(r.tangent||r.bitangent)&&(A=p.geodeticSurfaceNormal(U,A),r.tangent&&(P=Cartesian3.normalize(Cartesian3.cross(A,E,P),P)))):(E=p.geodeticSurfaceNormal(U,E),(r.tangent||r.bitangent)&&(f&&(scratchPerPosNormal=Cartesian3.fromArray(_,b,scratchPerPosNormal),scratchPerPosTangent=Cartesian3.cross(Cartesian3.UNIT_Z,scratchPerPosNormal,scratchPerPosTangent),scratchPerPosTangent=Cartesian3.normalize(Matrix3.multiplyByVector(M,scratchPerPosTangent,scratchPerPosTangent),scratchPerPosTangent),r.bitangent&&(scratchPerPosBitangent=Cartesian3.normalize(Cartesian3.cross(scratchPerPosNormal,scratchPerPosTangent,scratchPerPosBitangent),scratchPerPosBitangent))),P=Cartesian3.cross(Cartesian3.UNIT_Z,E,P),P=Cartesian3.normalize(Matrix3.multiplyByVector(M,P,P),P),r.bitangent&&(A=Cartesian3.normalize(Cartesian3.cross(E,P,A),A)))),r.normal&&(e.wall?(_[b+I]=E.x,_[V+I]=E.y,_[k+I]=E.z):u&&(_[b+I]=-E.x,_[V+I]=-E.y,_[k+I]=-E.z),(c&&!f||l)&&(_[b]=E.x,_[V]=E.y,_[k]=E.z)),a&&(l&&(E=p.geodeticSurfaceNormal(U,E)),T[b+I]=-E.x,T[V+I]=-E.y,T[k+I]=-E.z),r.tangent&&(e.wall?(C[b+I]=P.x,C[V+I]=P.y,C[k+I]=P.z):u&&(C[b+I]=-P.x,C[V+I]=-P.y,C[k+I]=-P.z),c&&(f?(C[b]=scratchPerPosTangent.x,C[V]=scratchPerPosTangent.y,C[k]=scratchPerPosTangent.z):(C[b]=P.x,C[V]=P.y,C[k]=P.z))),r.bitangent&&(u&&(S[b+I]=A.x,S[V+I]=A.y,S[k+I]=A.z),c&&(f?(S[b]=scratchPerPosBitangent.x,S[V]=scratchPerPosBitangent.y,S[k]=scratchPerPosBitangent.z):(S[b]=A.x,S[V]=A.y,S[k]=A.z))),b+=3)}r.st&&(n.attributes.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:y})),r.normal&&(n.attributes.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:_})),r.tangent&&(n.attributes.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:C})),r.bitangent&&(n.attributes.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:S})),a&&(n.attributes.extrudeDirection=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:T}))}return e.extrude&&defined(e.offsetAttribute)&&(t=o.length/3,i=new Uint8Array(t),e.offsetAttribute===GeometryOffsetAttribute$1.TOP?c&&u||l?i=arrayFill(i,1,0,t/2):c&&(i=arrayFill(i,1)):i=arrayFill(i,e.offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),n.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:i})),n}var startCartographicScratch$1=new Cartographic,endCartographicScratch$1=new Cartographic,idlCross={westOverIDL:0,eastOverIDL:0},ellipsoidGeodesic$1=new EllipsoidGeodesic;function computeRectangle$2(e,t,i,r,n){if(n=defaultValue(n,new Rectangle),!defined(e)||e.length<3)return n.west=0,n.north=0,n.south=0,n.east=0,n;if(i===ArcType$1.RHUMB)return Rectangle.fromCartesianArray(e,t,n);ellipsoidGeodesic$1.ellipsoid.equals(t)||(ellipsoidGeodesic$1=new EllipsoidGeodesic(void 0,void 0,t)),n.west=Number.POSITIVE_INFINITY,n.east=Number.NEGATIVE_INFINITY,n.south=Number.POSITIVE_INFINITY,n.north=Number.NEGATIVE_INFINITY,idlCross.westOverIDL=Number.POSITIVE_INFINITY,idlCross.eastOverIDL=Number.NEGATIVE_INFINITY;for(var a,o=1/CesiumMath.chordLength(r,t.maximumRadius),s=e.length,l=t.cartesianToCartographic(e[0],endCartographicScratch$1),c=startCartographicScratch$1,u=1;u<s;u++)a=c,c=l,l=t.cartesianToCartographic(e[u],a),ellipsoidGeodesic$1.setEndPoints(c,l),interpolateAndGrowRectangle(ellipsoidGeodesic$1,o,n,idlCross);return a=c,c=l,l=t.cartesianToCartographic(e[0],a),ellipsoidGeodesic$1.setEndPoints(c,l),interpolateAndGrowRectangle(ellipsoidGeodesic$1,o,n,idlCross),n.east-n.west>idlCross.eastOverIDL-idlCross.westOverIDL&&(n.west=idlCross.westOverIDL,n.east=idlCross.eastOverIDL,n.east>CesiumMath.PI&&(n.east=n.east-CesiumMath.TWO_PI),n.west>CesiumMath.PI&&(n.west=n.west-CesiumMath.TWO_PI)),n}var interpolatedCartographicScratch$1=new Cartographic;function interpolateAndGrowRectangle(e,t,i,r){for(var n=e.surfaceDistance,a=Math.ceil(n*t),o=0<a?n/(a-1):Number.POSITIVE_INFINITY,s=0,l=0;l<a;l++){var c=e.interpolateUsingSurfaceDistance(s,interpolatedCartographicScratch$1);s+=o;var u=c.longitude,d=c.latitude;i.west=Math.min(i.west,u),i.east=Math.max(i.east,u),i.south=Math.min(i.south,d),i.north=Math.max(i.north,d);var h=0<=u?u:u+CesiumMath.TWO_PI;r.westOverIDL=Math.min(r.westOverIDL,h),r.eastOverIDL=Math.max(r.eastOverIDL,h)}}var createGeometryFromPositionsExtrudedPositions=[];function createGeometryFromPositionsExtruded(e,t,i,r,n,a,o,s,l){var c={walls:[]};if(a||o){var u=PolygonGeometryLibrary.createGeometryFromPositions(e,t,i,n,s,l),d=u.attributes.position.values,h=u.indices;if(a&&o){var p,m=d.concat(d),f=m.length/3;(p=IndexDatatype$1.createTypedArray(f,2*h.length)).set(h);for(var g,_=h.length,y=f/2,v=0;v<_;v+=3){var C=p[v]+y,S=p[v+1]+y,T=p[v+2]+y;p[v+_]=T,p[v+1+_]=S,p[v+2+_]=C}u.attributes.position.values=m,n&&s.normal&&(g=u.attributes.normal.values,u.attributes.normal.values=new Float32Array(m.length),u.attributes.normal.values.set(g)),u.indices=p}else if(o){for(f=d.length/3,p=IndexDatatype$1.createTypedArray(f,h.length),v=0;v<h.length;v+=3)p[v]=h[v+2],p[v+1]=h[v+1],p[v+2]=h[v];u.indices=p}c.topAndBottom=new GeometryInstance({geometry:u})}var x=r.outerRing,b=EllipsoidTangentPlane.fromPoints(x,e).projectPointsOntoPlane(x,createGeometryFromPositionsExtrudedPositions);PolygonPipeline.computeWindingOrder2D(b)===WindingOrder$1.CLOCKWISE&&(x=x.slice().reverse());var E=PolygonGeometryLibrary.computeWallGeometry(x,e,i,n,l);c.walls.push(new GeometryInstance({geometry:E}));var P=r.holes;for(v=0;v<P.length;v++){var A=P[v],b=EllipsoidTangentPlane.fromPoints(A,e).projectPointsOntoPlane(A,createGeometryFromPositionsExtrudedPositions);PolygonPipeline.computeWindingOrder2D(b)===WindingOrder$1.COUNTER_CLOCKWISE&&(A=A.slice().reverse()),E=PolygonGeometryLibrary.computeWallGeometry(A,e,i,n,l),c.walls.push(new GeometryInstance({geometry:E}))}return c}function PolygonGeometry(e){var t,i=e.polygonHierarchy,r=defaultValue(e.vertexFormat,VertexFormat.DEFAULT),n=defaultValue(e.ellipsoid,Ellipsoid.WGS84),a=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),o=defaultValue(e.stRotation,0),s=defaultValue(e.perPositionHeight,!1),l=s&&defined(e.extrudedHeight),c=defaultValue(e.height,0),u=defaultValue(e.extrudedHeight,c);l||(t=Math.max(c,u),u=Math.min(c,u),c=t),this._vertexFormat=VertexFormat.clone(r),this._ellipsoid=Ellipsoid.clone(n),this._granularity=a,this._stRotation=o,this._height=c,this._extrudedHeight=u,this._closeTop=defaultValue(e.closeTop,!0),this._closeBottom=defaultValue(e.closeBottom,!0),this._polygonHierarchy=i,this._perPositionHeight=s,this._perPositionHeightExtrude=l,this._shadowVolume=defaultValue(e.shadowVolume,!1),this._workerName="createPolygonGeometry",this._offsetAttribute=e.offsetAttribute,this._arcType=defaultValue(e.arcType,ArcType$1.GEODESIC),this._rectangle=void 0,this._textureCoordinateRotationPoints=void 0,this.packedLength=PolygonGeometryLibrary.computeHierarchyPackedLength(i)+Ellipsoid.packedLength+VertexFormat.packedLength+12}PolygonGeometry.fromPositions=function(e){return new PolygonGeometry({polygonHierarchy:{positions:(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions},height:e.height,extrudedHeight:e.extrudedHeight,vertexFormat:e.vertexFormat,stRotation:e.stRotation,ellipsoid:e.ellipsoid,granularity:e.granularity,perPositionHeight:e.perPositionHeight,closeTop:e.closeTop,closeBottom:e.closeBottom,offsetAttribute:e.offsetAttribute,arcType:e.arcType})},PolygonGeometry.pack=function(e,t,i){return i=defaultValue(i,0),i=PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,i),Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._height,t[i++]=e._extrudedHeight,t[i++]=e._granularity,t[i++]=e._stRotation,t[i++]=e._perPositionHeightExtrude?1:0,t[i++]=e._perPositionHeight?1:0,t[i++]=e._closeTop?1:0,t[i++]=e._closeBottom?1:0,t[i++]=e._shadowVolume?1:0,t[i++]=defaultValue(e._offsetAttribute,-1),t[i++]=e._arcType,t[i]=e.packedLength,t};var scratchEllipsoid$5=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchVertexFormat$8=new VertexFormat,dummyOptions={polygonHierarchy:{}};function textureCoordinateRotationPoints$1(e){var t=-e._stRotation;if(0==t)return[0,0,0,1,1,0];var i=e._ellipsoid,r=e._polygonHierarchy.positions,n=e.rectangle;return Geometry._textureCoordinateRotationPoints(r,t,i,n)}function PolygonHierarchy(e,t){this.positions=defined(e)?e:[],this.holes=defined(t)?t:[]}PolygonGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=r.startingIndex,delete r.startingIndex;var n=Ellipsoid.unpack(e,t,scratchEllipsoid$5);t+=Ellipsoid.packedLength;var a=VertexFormat.unpack(e,t,scratchVertexFormat$8);t+=VertexFormat.packedLength;var o=e[t++],s=e[t++],l=e[t++],c=e[t++],u=1===e[t++],d=1===e[t++],h=1===e[t++],p=1===e[t++],m=1===e[t++],f=e[t++],g=e[t++],_=e[t];return defined(i)||(i=new PolygonGeometry(dummyOptions)),i._polygonHierarchy=r,i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._vertexFormat=VertexFormat.clone(a,i._vertexFormat),i._height=o,i._extrudedHeight=s,i._granularity=l,i._stRotation=c,i._perPositionHeightExtrude=u,i._perPositionHeight=d,i._closeTop=h,i._closeBottom=p,i._shadowVolume=m,i._offsetAttribute=-1===f?void 0:f,i._arcType=g,i.packedLength=_,i},PolygonGeometry.computeRectangle=function(e,t){var i=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),r=defaultValue(e.arcType,ArcType$1.GEODESIC),n=e.polygonHierarchy,a=defaultValue(e.ellipsoid,Ellipsoid.WGS84);return computeRectangle$2(n.positions,a,r,i,t)},PolygonGeometry.createGeometry=function(e){var t=e._vertexFormat,i=e._ellipsoid,r=e._granularity,n=e._stRotation,a=e._polygonHierarchy,o=e._perPositionHeight,s=e._closeTop,l=e._closeBottom,c=e._arcType,u=a.positions;if(!(u.length<3)){var d=EllipsoidTangentPlane.fromPoints(u,i),h=PolygonGeometryLibrary.polygonsFromHierarchy(a,d.projectPointsOntoPlane.bind(d),!o,i),p=h.hierarchy,m=h.polygons;if(0!==p.length){u=p[0].outerRing;var f,g=PolygonGeometryLibrary.computeBoundingRectangle(d.plane.normal,d.projectPointOntoPlane.bind(d),u,n,scratchBoundingRectangle),_=[],y=e._height,v=e._extrudedHeight,C={perPositionHeight:o,vertexFormat:t,geometry:void 0,tangentPlane:d,boundingRectangle:g,ellipsoid:i,stRotation:n,bottom:!1,top:!0,wall:!1,extrude:!1,arcType:c};if(e._perPositionHeightExtrude||!CesiumMath.equalsEpsilon(y,v,0,CesiumMath.EPSILON2))for(C.extrude=!0,C.top=s,C.bottom=l,C.shadowVolume=e._shadowVolume,C.offsetAttribute=e._offsetAttribute,f=0;f<m.length;f++){var S,T=createGeometryFromPositionsExtruded(i,m[f],r,p[f],o,s,l,t,c);s&&l?(S=T.topAndBottom,C.geometry=PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(S.geometry,y,v,i,o)):s?((S=T.topAndBottom).geometry.attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(S.geometry.attributes.position.values,y,i,!o),C.geometry=S.geometry):l&&((S=T.topAndBottom).geometry.attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(S.geometry.attributes.position.values,v,i,!0),C.geometry=S.geometry),(s||l)&&(C.wall=!1,S.geometry=computeAttributes(C),_.push(S));var x=T.walls;C.wall=!0;for(var b=0;b<x.length;b++){var E=x[b];C.geometry=PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(E.geometry,y,v,i,o),E.geometry=computeAttributes(C),_.push(E)}}else for(f=0;f<m.length;f++){var P,A,w=new GeometryInstance({geometry:PolygonGeometryLibrary.createGeometryFromPositions(i,m[f],r,o,t,c)});w.geometry.attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(w.geometry.attributes.position.values,y,i,!o),C.geometry=w.geometry,w.geometry=computeAttributes(C),defined(e._offsetAttribute)&&(P=w.geometry.attributes.position.values.length,arrayFill(A=new Uint8Array(P/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),w.geometry.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:A})),_.push(w)}var D=GeometryPipeline.combineInstances(_)[0];D.attributes.position.values=new Float64Array(D.attributes.position.values),D.indices=IndexDatatype$1.createTypedArray(D.attributes.position.values.length/3,D.indices);var M=D.attributes,I=BoundingSphere.fromVertices(M.position.values);return t.position||delete M.position,new Geometry({attributes:M,indices:D.indices,primitiveType:D.primitiveType,boundingSphere:I,offsetAttribute:e._offsetAttribute})}}},PolygonGeometry.createShadowVolume=function(e,t,i){var r=e._granularity,n=e._ellipsoid,a=t(r,n),o=i(r,n);return new PolygonGeometry({polygonHierarchy:e._polygonHierarchy,ellipsoid:n,stRotation:e._stRotation,granularity:r,perPositionHeight:!1,extrudedHeight:a,height:o,vertexFormat:VertexFormat.POSITION_ONLY,shadowVolume:!0,arcType:e._arcType})},Object.defineProperties(PolygonGeometry.prototype,{rectangle:{get:function(){var e;return defined(this._rectangle)||(e=this._polygonHierarchy.positions,this._rectangle=computeRectangle$2(e,this._ellipsoid,this._arcType,this._granularity)),this._rectangle}},textureCoordinateRotationPoints:{get:function(){return defined(this._textureCoordinateRotationPoints)||(this._textureCoordinateRotationPoints=textureCoordinateRotationPoints$1(this)),this._textureCoordinateRotationPoints}}});var createGeometryFromPositionsPositions=[],createGeometryFromPositionsSubdivided=[];function createGeometryFromPositions$1(e,t,i,r,n){var a,o=EllipsoidTangentPlane.fromPoints(t,e).projectPointsOntoPlane(t,createGeometryFromPositionsPositions);PolygonPipeline.computeWindingOrder2D(o)===WindingOrder$1.CLOCKWISE&&(o.reverse(),t=t.slice().reverse());var s=t.length,l=0;if(r)for(a=new Float64Array(2*s*3),_=0;_<s;_++){var c=t[_],u=t[(_+1)%s];a[l++]=c.x,a[l++]=c.y,a[l++]=c.z,a[l++]=u.x,a[l++]=u.y,a[l++]=u.z}else{var d,h=0;if(n===ArcType$1.GEODESIC)for(_=0;_<s;_++)h+=PolygonGeometryLibrary.subdivideLineCount(t[_],t[(_+1)%s],i);else if(n===ArcType$1.RHUMB)for(_=0;_<s;_++)h+=PolygonGeometryLibrary.subdivideRhumbLineCount(e,t[_],t[(_+1)%s],i);for(a=new Float64Array(3*h),_=0;_<s;_++){n===ArcType$1.GEODESIC?d=PolygonGeometryLibrary.subdivideLine(t[_],t[(_+1)%s],i,createGeometryFromPositionsSubdivided):n===ArcType$1.RHUMB&&(d=PolygonGeometryLibrary.subdivideRhumbLine(e,t[_],t[(_+1)%s],i,createGeometryFromPositionsSubdivided));for(var p=d.length,m=0;m<p;++m)a[l++]=d[m]}}for(var f=2*(s=a.length/3),g=IndexDatatype$1.createTypedArray(s,f),l=0,_=0;_<s-1;_++)g[l++]=_,g[l++]=_+1;return g[l++]=s-1,g[l++]=0,new GeometryInstance({geometry:new Geometry({attributes:new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:a})}),indices:g,primitiveType:PrimitiveType$1.LINES})})}function createGeometryFromPositionsExtruded$1(e,t,i,r,n){var a,o=EllipsoidTangentPlane.fromPoints(t,e).projectPointsOntoPlane(t,createGeometryFromPositionsPositions);PolygonPipeline.computeWindingOrder2D(o)===WindingOrder$1.CLOCKWISE&&(o.reverse(),t=t.slice().reverse());var s=t.length,l=new Array(s),c=0;if(r)for(a=new Float64Array(2*s*3*2),v=0;v<s;++v){l[v]=c/3;var u=t[v],d=t[(v+1)%s];a[c++]=u.x,a[c++]=u.y,a[c++]=u.z,a[c++]=d.x,a[c++]=d.y,a[c++]=d.z}else{var h,p=0;if(n===ArcType$1.GEODESIC)for(v=0;v<s;v++)p+=PolygonGeometryLibrary.subdivideLineCount(t[v],t[(v+1)%s],i);else if(n===ArcType$1.RHUMB)for(v=0;v<s;v++)p+=PolygonGeometryLibrary.subdivideRhumbLineCount(e,t[v],t[(v+1)%s],i);for(a=new Float64Array(3*p*2),v=0;v<s;++v){l[v]=c/3,n===ArcType$1.GEODESIC?h=PolygonGeometryLibrary.subdivideLine(t[v],t[(v+1)%s],i,createGeometryFromPositionsSubdivided):n===ArcType$1.RHUMB&&(h=PolygonGeometryLibrary.subdivideRhumbLine(e,t[v],t[(v+1)%s],i,createGeometryFromPositionsSubdivided));for(var m=h.length,f=0;f<m;++f)a[c++]=h[f]}}s=a.length/6;for(var g=l.length,_=2*(2*s+g),y=IndexDatatype$1.createTypedArray(s+g,_),c=0,v=0;v<s;++v)y[c++]=v,y[c++]=(v+1)%s,y[c++]=v+s,y[c++]=(v+1)%s+s;for(v=0;v<g;v++){var C=l[v];y[c++]=C,y[c++]=C+s}return new GeometryInstance({geometry:new Geometry({attributes:new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:a})}),indices:y,primitiveType:PrimitiveType$1.LINES})})}function PolygonOutlineGeometry(e){var t,i=e.polygonHierarchy,r=defaultValue(e.ellipsoid,Ellipsoid.WGS84),n=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),a=defaultValue(e.perPositionHeight,!1),o=a&&defined(e.extrudedHeight),s=defaultValue(e.arcType,ArcType$1.GEODESIC),l=defaultValue(e.height,0),c=defaultValue(e.extrudedHeight,l);o||(t=Math.max(l,c),c=Math.min(l,c),l=t),this._ellipsoid=Ellipsoid.clone(r),this._granularity=n,this._height=l,this._extrudedHeight=c,this._arcType=s,this._polygonHierarchy=i,this._perPositionHeight=a,this._perPositionHeightExtrude=o,this._offsetAttribute=e.offsetAttribute,this._workerName="createPolygonOutlineGeometry",this.packedLength=PolygonGeometryLibrary.computeHierarchyPackedLength(i)+Ellipsoid.packedLength+8}PolygonOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),i=PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,i),Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,t[i++]=e._height,t[i++]=e._extrudedHeight,t[i++]=e._granularity,t[i++]=e._perPositionHeightExtrude?1:0,t[i++]=e._perPositionHeight?1:0,t[i++]=e._arcType,t[i++]=defaultValue(e._offsetAttribute,-1),t[i]=e.packedLength,t};var scratchEllipsoid$6=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),dummyOptions$1={polygonHierarchy:{}};PolygonOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=r.startingIndex,delete r.startingIndex;var n=Ellipsoid.unpack(e,t,scratchEllipsoid$6);t+=Ellipsoid.packedLength;var a=e[t++],o=e[t++],s=e[t++],l=1===e[t++],c=1===e[t++],u=e[t++],d=e[t++],h=e[t];return defined(i)||(i=new PolygonOutlineGeometry(dummyOptions$1)),i._polygonHierarchy=r,i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._height=a,i._extrudedHeight=o,i._granularity=s,i._perPositionHeight=c,i._perPositionHeightExtrude=l,i._arcType=u,i._offsetAttribute=-1===d?void 0:d,i.packedLength=h,i},PolygonOutlineGeometry.fromPositions=function(e){return new PolygonOutlineGeometry({polygonHierarchy:{positions:(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions},height:e.height,extrudedHeight:e.extrudedHeight,ellipsoid:e.ellipsoid,granularity:e.granularity,perPositionHeight:e.perPositionHeight,arcType:e.arcType,offsetAttribute:e.offsetAttribute})},PolygonOutlineGeometry.createGeometry=function(e){var t=e._ellipsoid,i=e._granularity,r=e._polygonHierarchy,n=e._perPositionHeight,a=e._arcType,o=PolygonGeometryLibrary.polygonOutlinesFromHierarchy(r,!n,t);if(0!==o.length){var s,l,c,u,d,h,p=[],m=CesiumMath.chordLength(i,t.maximumRadius),f=e._height,g=e._extrudedHeight;if(e._perPositionHeightExtrude||!CesiumMath.equalsEpsilon(f,g,0,CesiumMath.EPSILON2))for(s=0;s<o.length;s++){(u=createGeometryFromPositionsExtruded$1(t,o[s],m,n,a)).geometry=PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(u.geometry,f,g,t,n),defined(e._offsetAttribute)&&(l=u.geometry.attributes.position.values.length/3,c=new Uint8Array(l),c=e._offsetAttribute===GeometryOffsetAttribute$1.TOP?arrayFill(c,1,0,l/2):arrayFill(c,e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),u.geometry.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:c})),p.push(u)}else for(s=0;s<o.length;s++){(u=createGeometryFromPositions$1(t,o[s],m,n,a)).geometry.attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(u.geometry.attributes.position.values,f,t,!n),defined(e._offsetAttribute)&&(d=u.geometry.attributes.position.values.length,arrayFill(h=new Uint8Array(d/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),u.geometry.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:h})),p.push(u)}var _=GeometryPipeline.combineInstances(p)[0],y=BoundingSphere.fromVertices(_.attributes.position.values);return new Geometry({attributes:_.attributes,indices:_.indices,primitiveType:_.primitiveType,boundingSphere:y,offsetAttribute:e._offsetAttribute})}};var scratchInterpolateColorsArray=[];function interpolateColors(e,t,i,r,n){var a=scratchInterpolateColorsArray;a.length=n;var o=i.red,s=i.green,l=i.blue,c=i.alpha,u=r.red,d=r.green,h=r.blue,p=r.alpha;if(Color.equals(i,r)){for(y=0;y<n;y++)a[y]=Color.clone(i);return a}for(var m=(u-o)/n,f=(d-s)/n,g=(h-l)/n,_=(p-c)/n,y=0;y<n;y++)a[y]=new Color(o+y*m,s+y*f,l+y*g,c+y*_);return a}function PolylineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.colors,r=defaultValue(e.width,1),n=defaultValue(e.colorsPerVertex,!1);this._positions=t,this._colors=i,this._width=r,this._colorsPerVertex=n,this._vertexFormat=VertexFormat.clone(defaultValue(e.vertexFormat,VertexFormat.DEFAULT)),this._arcType=defaultValue(e.arcType,ArcType$1.GEODESIC),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._workerName="createPolylineGeometry";var a=1+t.length*Cartesian3.packedLength;a+=defined(i)?1+i.length*Color.packedLength:1,this.packedLength=a+Ellipsoid.packedLength+VertexFormat.packedLength+4}PolylineGeometry.pack=function(e,t,i){var r;i=defaultValue(i,0);var n=e._positions,a=n.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian3.packedLength)Cartesian3.pack(n[r],t,i);var o=e._colors,a=defined(o)?o.length:0;for(t[i++]=a,r=0;r<a;++r,i+=Color.packedLength)Color.pack(o[r],t,i);return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._width,t[i++]=e._colorsPerVertex?1:0,t[i++]=e._arcType,t[i]=e._granularity,t};var scratchEllipsoid$7=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchVertexFormat$9=new VertexFormat,scratchOptions$f={positions:void 0,colors:void 0,ellipsoid:scratchEllipsoid$7,vertexFormat:scratchVertexFormat$9,width:void 0,colorsPerVertex:void 0,arcType:void 0,granularity:void 0};PolylineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r=e[t++],n=new Array(r),a=0;a<r;++a,t+=Cartesian3.packedLength)n[a]=Cartesian3.unpack(e,t);var o=0<(r=e[t++])?new Array(r):void 0;for(a=0;a<r;++a,t+=Color.packedLength)o[a]=Color.unpack(e,t);var s=Ellipsoid.unpack(e,t,scratchEllipsoid$7);t+=Ellipsoid.packedLength;var l=VertexFormat.unpack(e,t,scratchVertexFormat$9);t+=VertexFormat.packedLength;var c=e[t++],u=1===e[t++],d=e[t++],h=e[t];return defined(i)?(i._positions=n,i._colors=o,i._ellipsoid=Ellipsoid.clone(s,i._ellipsoid),i._vertexFormat=VertexFormat.clone(l,i._vertexFormat),i._width=c,i._colorsPerVertex=u,i._arcType=d,i._granularity=h,i):(scratchOptions$f.positions=n,scratchOptions$f.colors=o,scratchOptions$f.width=c,scratchOptions$f.colorsPerVertex=u,scratchOptions$f.arcType=d,scratchOptions$f.granularity=h,new PolylineGeometry(scratchOptions$f))};var scratchCartesian3$8=new Cartesian3,scratchPosition$4=new Cartesian3,scratchPrevPosition=new Cartesian3,scratchNextPosition=new Cartesian3;function computeAttributes$1(e,t,i,r){var n=new GeometryAttributes;r.position&&(n.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:e}));var a,o,s,l,c,u=t.length,d=e.length/3,h=(d-2*u)/(2*u),p=PolygonPipeline.triangulate(t),m=(h-1)*u*6+2*p.length,f=IndexDatatype$1.createTypedArray(d,m),g=2*u,_=0;for(E=0;E<h-1;E++){for(a=0;a<u-1;a++)c=(o=2*a+E*u*2)+g,l=(s=o+1)+g,f[_++]=s,f[_++]=o,f[_++]=l,f[_++]=l,f[_++]=o,f[_++]=c;l=(s=(o=2*u-2+E*u*2)+1)+g,c=o+g,f[_++]=s,f[_++]=o,f[_++]=l,f[_++]=l,f[_++]=o,f[_++]=c}if(r.st||r.tangent||r.bitangent){for(var y,v,C=new Float32Array(2*d),S=1/(h-1),T=1/i.height,x=i.height/2,b=0,E=0;E<h;E++){for(y=E*S,v=T*(t[0].y+x),C[b++]=y,C[b++]=v,a=1;a<u;a++)v=T*(t[a].y+x),C[b++]=y,C[b++]=v,C[b++]=y,C[b++]=v;v=T*(t[0].y+x),C[b++]=y,C[b++]=v}for(a=0;a<u;a++)y=0,v=T*(t[a].y+x),C[b++]=y,C[b++]=v;for(a=0;a<u;a++)y=(h-1)*S,v=T*(t[a].y+x),C[b++]=y,C[b++]=v;n.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:new Float32Array(C)})}var P=d-2*u;for(E=0;E<p.length;E+=3){var A=p[E]+P,w=p[E+1]+P,D=p[E+2]+P;f[_++]=A,f[_++]=w,f[_++]=D,f[_++]=D+u,f[_++]=w+u,f[_++]=A+u}var M=new Geometry({attributes:n,indices:f,boundingSphere:BoundingSphere.fromVertices(e),primitiveType:PrimitiveType$1.TRIANGLES});if(r.normal&&(M=GeometryPipeline.computeNormal(M)),r.tangent||r.bitangent){try{M=GeometryPipeline.computeTangentAndBitangent(M)}catch(e){oneTimeWarning("polyline-volume-tangent-bitangent","Unable to compute tangents and bitangents for polyline volume geometry")}r.tangent||(M.attributes.tangent=void 0),r.bitangent||(M.attributes.bitangent=void 0),r.st||(M.attributes.st=void 0)}return M}function PolylineVolumeGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).polylinePositions,i=e.shapePositions;this._positions=t,this._shape=i,this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._cornerType=defaultValue(e.cornerType,CornerType$1.ROUNDED),this._vertexFormat=VertexFormat.clone(defaultValue(e.vertexFormat,VertexFormat.DEFAULT)),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._workerName="createPolylineVolumeGeometry";var r=1+t.length*Cartesian3.packedLength;r+=1+i.length*Cartesian2.packedLength,this.packedLength=r+Ellipsoid.packedLength+VertexFormat.packedLength+2}PolylineGeometry.createGeometry=function(e){var t=e._width,i=e._vertexFormat,r=e._colors,n=e._colorsPerVertex,a=e._arcType,o=e._granularity,s=e._ellipsoid,l=arrayRemoveDuplicates(e._positions,Cartesian3.equalsEpsilon),c=l.length;if(!(c<2||t<=0)){if(a===ArcType$1.GEODESIC||a===ArcType$1.RHUMB){var u,d=a===ArcType$1.GEODESIC?(u=CesiumMath.chordLength(o,s.maximumRadius),PolylinePipeline.numberOfPoints):(u=o,PolylinePipeline.numberOfPointsRhumbLine),h=PolylinePipeline.extractHeights(l,s);if(defined(r)){for(var p=1,m=0;m<c-1;++m)p+=d(l[m],l[m+1],u);var f=new Array(p),g=0;for(m=0;m<c-1;++m){var _=l[m],y=l[m+1],v=r[m],C=d(_,y,u);if(n&&m<p)for(var S=interpolateColors(_,y,v,r[m+1],C),T=S.length,x=0;x<T;++x)f[g++]=S[x];else for(x=0;x<C;++x)f[g++]=Color.clone(v)}f[g]=Color.clone(r[r.length-1]),r=f,scratchInterpolateColorsArray.length=0}l=a===ArcType$1.GEODESIC?PolylinePipeline.generateCartesianArc({positions:l,minDistance:u,ellipsoid:s,height:h}):PolylinePipeline.generateCartesianRhumbArc({positions:l,granularity:u,ellipsoid:s,height:h})}var b,E,P,A=4*(c=l.length)-4,w=new Float64Array(3*A),D=new Float64Array(3*A),M=new Float64Array(3*A),I=new Float32Array(2*A),R=i.st?new Float32Array(2*A):void 0,O=defined(r)?new Uint8Array(4*A):void 0,L=0,F=0,N=0,B=0;for(x=0;x<c;++x){0===x?(b=scratchCartesian3$8,Cartesian3.subtract(l[0],l[1],b),Cartesian3.add(l[0],b,b)):b=l[x-1],Cartesian3.clone(b,scratchPrevPosition),Cartesian3.clone(l[x],scratchPosition$4),x===c-1?(b=scratchCartesian3$8,Cartesian3.subtract(l[c-1],l[c-2],b),Cartesian3.add(l[c-1],b,b)):b=l[x+1],Cartesian3.clone(b,scratchNextPosition),defined(O)&&(E=0===x||n?r[x]:r[x-1],x!==c-1&&(P=r[x]));for(var V=x===c-1?2:4,k=0===x?2:0;k<V;++k){Cartesian3.pack(scratchPosition$4,w,L),Cartesian3.pack(scratchPrevPosition,D,L),Cartesian3.pack(scratchNextPosition,M,L),L+=3;var z,$=k-2<0?-1:1;I[F++]=k%2*2-1,I[F++]=$*t,i.st&&(R[N++]=x/(c-1),R[N++]=Math.max(I[F-2],0)),defined(O)&&(z=k<2?E:P,O[B++]=Color.floatToByte(z.red),O[B++]=Color.floatToByte(z.green),O[B++]=Color.floatToByte(z.blue),O[B++]=Color.floatToByte(z.alpha))}}var U=new GeometryAttributes;U.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:w}),U.prevPosition=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:D}),U.nextPosition=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:M}),U.expandAndWidth=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:I}),i.st&&(U.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:R})),defined(O)&&(U.color=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:4,values:O,normalize:!0}));var G=IndexDatatype$1.createTypedArray(A,6*c-6),H=0,W=0,q=c-1;for(x=0;x<q;++x)G[W++]=H,G[W++]=H+2,G[W++]=H+1,G[W++]=H+1,G[W++]=H+2,G[W++]=H+3,H+=4;return new Geometry({attributes:U,indices:G,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:BoundingSphere.fromPoints(l),geometryType:GeometryType$1.POLYLINES})}},PolylineVolumeGeometry.pack=function(e,t,i){var r;i=defaultValue(i,0);var n=e._positions,a=n.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian3.packedLength)Cartesian3.pack(n[r],t,i);var o=e._shape,a=o.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian2.packedLength)Cartesian2.pack(o[r],t,i);return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._cornerType,t[i]=e._granularity,t};var scratchEllipsoid$8=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchVertexFormat$a=new VertexFormat,scratchOptions$g={polylinePositions:void 0,shapePositions:void 0,ellipsoid:scratchEllipsoid$8,vertexFormat:scratchVertexFormat$a,cornerType:void 0,granularity:void 0};PolylineVolumeGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r=e[t++],n=new Array(r),a=0;a<r;++a,t+=Cartesian3.packedLength)n[a]=Cartesian3.unpack(e,t);r=e[t++];var o=new Array(r);for(a=0;a<r;++a,t+=Cartesian2.packedLength)o[a]=Cartesian2.unpack(e,t);var s=Ellipsoid.unpack(e,t,scratchEllipsoid$8);t+=Ellipsoid.packedLength;var l=VertexFormat.unpack(e,t,scratchVertexFormat$a);t+=VertexFormat.packedLength;var c=e[t++],u=e[t];return defined(i)?(i._positions=n,i._shape=o,i._ellipsoid=Ellipsoid.clone(s,i._ellipsoid),i._vertexFormat=VertexFormat.clone(l,i._vertexFormat),i._cornerType=c,i._granularity=u,i):(scratchOptions$g.polylinePositions=n,scratchOptions$g.shapePositions=o,scratchOptions$g.cornerType=c,scratchOptions$g.granularity=u,new PolylineVolumeGeometry(scratchOptions$g))};var brScratch=new BoundingRectangle;function computeAttributes$2(e,t){var i=new GeometryAttributes;i.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:e});var r=t.length,n=i.position.values.length/3,a=e.length/3/r,o=IndexDatatype$1.createTypedArray(n,2*r*(1+a)),s=0,l=0,c=l*r;for(h=0;h<r-1;h++)o[s++]=h+c,o[s++]=h+c+1;for(o[s++]=r-1+c,o[s++]=c,c=(l=a-1)*r,h=0;h<r-1;h++)o[s++]=h+c,o[s++]=h+c+1;for(o[s++]=r-1+c,o[s++]=c,l=0;l<a-1;l++)for(var u=r*l,d=u+r,h=0;h<r;h++)o[s++]=h+u,o[s++]=h+d;return new Geometry({attributes:i,indices:IndexDatatype$1.createTypedArray(n,o),boundingSphere:BoundingSphere.fromVertices(e),primitiveType:PrimitiveType$1.LINES})}function PolylineVolumeOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).polylinePositions,i=e.shapePositions;this._positions=t,this._shape=i,this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._cornerType=defaultValue(e.cornerType,CornerType$1.ROUNDED),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._workerName="createPolylineVolumeOutlineGeometry";var r=1+t.length*Cartesian3.packedLength;r+=1+i.length*Cartesian2.packedLength,this.packedLength=r+Ellipsoid.packedLength+2}PolylineVolumeGeometry.createGeometry=function(e){var t=arrayRemoveDuplicates(e._positions,Cartesian3.equalsEpsilon),i=e._shape,i=PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(i);if(!(t.length<2||i.length<3)){PolygonPipeline.computeWindingOrder2D(i)===WindingOrder$1.CLOCKWISE&&i.reverse();var r=BoundingRectangle.fromPoints(i,brScratch);return computeAttributes$1(PolylineVolumeGeometryLibrary.computePositions(t,i,r,e,!0),i,r,e._vertexFormat)}},PolylineVolumeOutlineGeometry.pack=function(e,t,i){var r;i=defaultValue(i,0);var n=e._positions,a=n.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian3.packedLength)Cartesian3.pack(n[r],t,i);var o=e._shape,a=o.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian2.packedLength)Cartesian2.pack(o[r],t,i);return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,t[i++]=e._cornerType,t[i]=e._granularity,t};var scratchEllipsoid$9=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchOptions$h={polylinePositions:void 0,shapePositions:void 0,ellipsoid:scratchEllipsoid$9,height:void 0,cornerType:void 0,granularity:void 0};PolylineVolumeOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r=e[t++],n=new Array(r),a=0;a<r;++a,t+=Cartesian3.packedLength)n[a]=Cartesian3.unpack(e,t);r=e[t++];var o=new Array(r);for(a=0;a<r;++a,t+=Cartesian2.packedLength)o[a]=Cartesian2.unpack(e,t);var s=Ellipsoid.unpack(e,t,scratchEllipsoid$9);t+=Ellipsoid.packedLength;var l=e[t++],c=e[t];return defined(i)?(i._positions=n,i._shape=o,i._ellipsoid=Ellipsoid.clone(s,i._ellipsoid),i._cornerType=l,i._granularity=c,i):(scratchOptions$h.polylinePositions=n,scratchOptions$h.shapePositions=o,scratchOptions$h.cornerType=l,scratchOptions$h.granularity=c,new PolylineVolumeOutlineGeometry(scratchOptions$h))};var brScratch$1=new BoundingRectangle;function Proxy(){DeveloperError.throwInstantiationError()}function createEvaluateFunction$1(o){var s=o.points,l=o.times;return function(e,t){defined(t)||(t=new Quaternion);var i=o._lastTimeIndex=o.findTimeInterval(e,o._lastTimeIndex),r=(e-l[i])/(l[i+1]-l[i]),n=s[i],a=s[i+1];return Quaternion.fastSlerp(n,a,r,t)}}function QuaternionSpline(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).points,i=e.times;this._times=i,this._points=t,this._evaluateFunction=createEvaluateFunction$1(this),this._lastTimeIndex=0}function quickselect(e,t,i,r,n){quickselectStep(e,t,i||0,r||e.length-1,n||defaultCompare)}function quickselectStep(e,t,i,r,n){for(;i<r;){var a,o,s,l,c;600<r-i&&(a=r-i+1,o=t-i+1,s=Math.log(a),l=.5*Math.exp(2*s/3),c=.5*Math.sqrt(s*l*(a-l)/a)*(o-a/2<0?-1:1),quickselectStep(e,t,Math.max(i,Math.floor(t-o*l/a+c)),Math.min(r,Math.floor(t+(a-o)*l/a+c)),n));var u=e[t],d=i,h=r;for(swap$1(e,i,t),0<n(e[r],u)&&swap$1(e,i,r);d<h;){for(swap$1(e,d,h),d++,h--;n(e[d],u)<0;)d++;for(;0<n(e[h],u);)h--}0===n(e[i],u)?swap$1(e,i,h):swap$1(e,++h,r),h<=t&&(i=h+1),t<=h&&(r=h-1)}}function swap$1(e,t,i){var r=e[t];e[t]=e[i],e[i]=r}function defaultCompare(e,t){return e<t?-1:t<e?1:0}function RBush(e){void 0===e&&(e=9),this._maxEntries=Math.max(4,e),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}function findItem(e,t,i){if(!i)return t.indexOf(e);for(var r=0;r<t.length;r++)if(i(e,t[r]))return r;return-1}function calcBBox(e,t){distBBox(e,0,e.children.length,t,e)}function distBBox(e,t,i,r,n){(n=n||createNode(null)).minX=1/0,n.minY=1/0,n.maxX=-1/0,n.maxY=-1/0;for(var a=t;a<i;a++){var o=e.children[a];extend(n,e.leaf?r(o):o)}return n}function extend(e,t){return e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e}function compareNodeMinX(e,t){return e.minX-t.minX}function compareNodeMinY(e,t){return e.minY-t.minY}function bboxArea(e){return(e.maxX-e.minX)*(e.maxY-e.minY)}function bboxMargin(e){return e.maxX-e.minX+(e.maxY-e.minY)}function enlargedArea(e,t){return(Math.max(t.maxX,e.maxX)-Math.min(t.minX,e.minX))*(Math.max(t.maxY,e.maxY)-Math.min(t.minY,e.minY))}function intersectionArea(e,t){var i=Math.max(e.minX,t.minX),r=Math.max(e.minY,t.minY),n=Math.min(e.maxX,t.maxX),a=Math.min(e.maxY,t.maxY);return Math.max(0,n-i)*Math.max(0,a-r)}function contains(e,t){return e.minX<=t.minX&&e.minY<=t.minY&&t.maxX<=e.maxX&&t.maxY<=e.maxY}function intersects$1(e,t){return t.minX<=e.maxX&&t.minY<=e.maxY&&t.maxX>=e.minX&&t.maxY>=e.minY}function createNode(e){return{children:e,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function multiSelect(e,t,i,r,n){for(var a,o=[t,i];o.length;){(i=o.pop())-(t=o.pop())<=r||(quickselect(e,a=t+Math.ceil((i-t)/r/2)*r,t,i,n),o.push(t,a,a,i))}}function RectangleCollisionChecker(){this._tree=new RBush}function RectangleWithId(){this.minX=0,this.minY=0,this.maxX=0,this.maxY=0,this.id=""}function idCompare(e,t){return e.id===t.id}PolylineVolumeOutlineGeometry.createGeometry=function(e){var t=arrayRemoveDuplicates(e._positions,Cartesian3.equalsEpsilon),i=e._shape,i=PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(i);if(!(t.length<2||i.length<3)){PolygonPipeline.computeWindingOrder2D(i)===WindingOrder$1.CLOCKWISE&&i.reverse();var r=BoundingRectangle.fromPoints(i,brScratch$1);return computeAttributes$2(PolylineVolumeGeometryLibrary.computePositions(t,i,r,e,!1),i)}},Proxy.prototype.getURL=DeveloperError.throwInstantiationError,Object.defineProperties(QuaternionSpline.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}}}),QuaternionSpline.prototype.findTimeInterval=Spline.prototype.findTimeInterval,QuaternionSpline.prototype.wrapTime=Spline.prototype.wrapTime,QuaternionSpline.prototype.clampTime=Spline.prototype.clampTime,QuaternionSpline.prototype.evaluate=function(e,t){return this._evaluateFunction(e,t)},RBush.prototype.all=function(){return this._all(this.data,[])},RBush.prototype.search=function(e){var t=this.data,i=[];if(!intersects$1(e,t))return i;for(var r=this.toBBox,n=[];t;){for(var a=0;a<t.children.length;a++){var o=t.children[a],s=t.leaf?r(o):o;intersects$1(e,s)&&(t.leaf?i.push(o):contains(e,s)?this._all(o,i):n.push(o))}t=n.pop()}return i},RBush.prototype.collides=function(e){var t=this.data;if(!intersects$1(e,t))return!1;for(var i=[];t;){for(var r=0;r<t.children.length;r++){var n=t.children[r],a=t.leaf?this.toBBox(n):n;if(intersects$1(e,a)){if(t.leaf||contains(e,a))return!0;i.push(n)}}t=i.pop()}return!1},RBush.prototype.load=function(e){if(!e||!e.length)return this;if(e.length<this._minEntries){for(var t=0;t<e.length;t++)this.insert(e[t]);return this}var i,r=this._build(e.slice(),0,e.length-1,0);return this.data.children.length?this.data.height===r.height?this._splitRoot(this.data,r):(this.data.height<r.height&&(i=this.data,this.data=r,r=i),this._insert(r,this.data.height-r.height-1,!0)):this.data=r,this},RBush.prototype.insert=function(e){return e&&this._insert(e,this.data.height-1),this},RBush.prototype.clear=function(){return this.data=createNode([]),this},RBush.prototype.remove=function(e,t){if(!e)return this;for(var i,r,n,a=this.data,o=this.toBBox(e),s=[],l=[];a||s.length;){if(a||(a=s.pop(),r=s[s.length-1],i=l.pop(),n=!0),a.leaf){var c=findItem(e,a.children,t);if(-1!==c)return a.children.splice(c,1),s.push(a),this._condense(s),this}n||a.leaf||!contains(a,o)?r?(i++,a=r.children[i],n=!1):a=null:(s.push(a),l.push(i),i=0,a=(r=a).children[0])}return this},RBush.prototype.toBBox=function(e){return e},RBush.prototype.compareMinX=function(e,t){return e.minX-t.minX},RBush.prototype.compareMinY=function(e,t){return e.minY-t.minY},RBush.prototype.toJSON=function(){return this.data},RBush.prototype.fromJSON=function(e){return this.data=e,this},RBush.prototype._all=function(e,t){for(var i=[];e;)e.leaf?t.push.apply(t,e.children):i.push.apply(i,e.children),e=i.pop();return t},RBush.prototype._build=function(e,t,i,r){var n,a=i-t+1,o=this._maxEntries;if(a<=o)return calcBBox(n=createNode(e.slice(t,i+1)),this.toBBox),n;r||(r=Math.ceil(Math.log(a)/Math.log(o)),o=Math.ceil(a/Math.pow(o,r-1))),(n=createNode([])).leaf=!1,n.height=r;var s=Math.ceil(a/o),l=s*Math.ceil(Math.sqrt(o));multiSelect(e,t,i,l,this.compareMinX);for(var c=t;c<=i;c+=l){var u=Math.min(c+l-1,i);multiSelect(e,c,u,s,this.compareMinY);for(var d=c;d<=u;d+=s){var h=Math.min(d+s-1,u);n.children.push(this._build(e,d,h,r-1))}}return calcBBox(n,this.toBBox),n},RBush.prototype._chooseSubtree=function(e,t,i,r){for(;r.push(t),!t.leaf&&r.length-1!==i;){for(var n=1/0,a=1/0,o=void 0,s=0;s<t.children.length;s++){var l=t.children[s],c=bboxArea(l),u=enlargedArea(e,l)-c;u<a?(a=u,n=c<n?c:n,o=l):u===a&&c<n&&(n=c,o=l)}t=o||t.children[0]}return t},RBush.prototype._insert=function(e,t,i){var r=i?e:this.toBBox(e),n=[],a=this._chooseSubtree(r,this.data,t,n);for(a.children.push(e),extend(a,r);0<=t&&n[t].children.length>this._maxEntries;)this._split(n,t),t--;this._adjustParentBBoxes(r,n,t)},RBush.prototype._split=function(e,t){var i=e[t],r=i.children.length,n=this._minEntries;this._chooseSplitAxis(i,n,r);var a=this._chooseSplitIndex(i,n,r),o=createNode(i.children.splice(a,i.children.length-a));o.height=i.height,o.leaf=i.leaf,calcBBox(i,this.toBBox),calcBBox(o,this.toBBox),t?e[t-1].children.push(o):this._splitRoot(i,o)},RBush.prototype._splitRoot=function(e,t){this.data=createNode([e,t]),this.data.height=e.height+1,this.data.leaf=!1,calcBBox(this.data,this.toBBox)},RBush.prototype._chooseSplitIndex=function(e,t,i){for(var r,n=1/0,a=1/0,o=t;o<=i-t;o++){var s=distBBox(e,0,o,this.toBBox),l=distBBox(e,o,i,this.toBBox),c=intersectionArea(s,l),u=bboxArea(s)+bboxArea(l);c<n?(n=c,r=o,a=u<a?u:a):c===n&&u<a&&(a=u,r=o)}return r||i-t},RBush.prototype._chooseSplitAxis=function(e,t,i){var r=e.leaf?this.compareMinX:compareNodeMinX,n=e.leaf?this.compareMinY:compareNodeMinY;this._allDistMargin(e,t,i,r)<this._allDistMargin(e,t,i,n)&&e.children.sort(r)},RBush.prototype._allDistMargin=function(e,t,i,r){e.children.sort(r);for(var n=this.toBBox,a=distBBox(e,0,t,n),o=distBBox(e,i-t,i,n),s=bboxMargin(a)+bboxMargin(o),l=t;l<i-t;l++){var c=e.children[l];extend(a,e.leaf?n(c):c),s+=bboxMargin(a)}for(var u=i-t-1;t<=u;u--){var d=e.children[u];extend(o,e.leaf?n(d):d),s+=bboxMargin(o)}return s},RBush.prototype._adjustParentBBoxes=function(e,t,i){for(var r=i;0<=r;r--)extend(t[r],e)},RBush.prototype._condense=function(e){for(var t=e.length-1,i=void 0;0<=t;t--)0===e[t].children.length?0<t?(i=e[t-1].children).splice(i.indexOf(e[t]),1):this.clear():calcBBox(e[t],this.toBBox)},RectangleWithId.fromRectangleAndId=function(e,t,i){return i.minX=t.west,i.minY=t.south,i.maxX=t.east,i.maxY=t.north,i.id=e,i},RectangleCollisionChecker.prototype.insert=function(e,t){var i=RectangleWithId.fromRectangleAndId(e,t,new RectangleWithId);this._tree.insert(i)};var removalScratch=new RectangleWithId;RectangleCollisionChecker.prototype.remove=function(e,t){var i=RectangleWithId.fromRectangleAndId(e,t,removalScratch);this._tree.remove(i,idCompare)};var collisionScratch=new RectangleWithId;RectangleCollisionChecker.prototype.collides=function(e){var t=RectangleWithId.fromRectangleAndId("",e,collisionScratch);return this._tree.collides(t)};var cos$2=Math.cos,sin$2=Math.sin,sqrt=Math.sqrt,RectangleGeometryLibrary={computePosition:function(e,t,i,r,n,a,o){var s,l=t.radiiSquared,c=e.nwCorner,u=e.boundingRectangle,d=c.latitude-e.granYCos*r+n*e.granXSin,h=cos$2(d),p=sin$2(d),m=l.z*p,f=c.longitude+r*e.granYSin+n*e.granXCos,g=h*cos$2(f),_=h*sin$2(f),y=l.x*g,v=l.y*_,C=sqrt(y*g+v*_+m*p);a.x=y/C,a.y=v/C,a.z=m/C,i&&(defined(s=e.stNwCorner)?(d=s.latitude-e.stGranYCos*r+n*e.stGranXSin,f=s.longitude+r*e.stGranYSin+n*e.stGranXCos,o.x=(f-e.stWest)*e.lonScalar,o.y=(d-e.stSouth)*e.latScalar):(o.x=(f-u.west)*e.lonScalar,o.y=(d-u.south)*e.latScalar))}},rotationMatrixScratch=new Matrix2,nwCartesian=new Cartesian3,centerScratch$2=new Cartographic,centerCartesian=new Cartesian3,proj=new GeographicProjection;function getRotationOptions(e,t,i,r,n,a,o){var s=Math.cos(t),l=r*s,c=i*s,u=Math.sin(t),d=r*u,h=i*u;nwCartesian=proj.project(e,nwCartesian),nwCartesian=Cartesian3.subtract(nwCartesian,centerCartesian,nwCartesian);var p=Matrix2.fromRotation(t,rotationMatrixScratch);nwCartesian=Matrix2.multiplyByVector(p,nwCartesian,nwCartesian),nwCartesian=Cartesian3.add(nwCartesian,centerCartesian,nwCartesian),--a,--o;var m=(e=proj.unproject(nwCartesian,e)).latitude,f=m+a*h,g=m-l*o,_=m-l*o+a*h,y=Math.max(m,f,g,_),v=Math.min(m,f,g,_),C=e.longitude,S=C+a*c,T=C+o*d,x=C+o*d+a*c;return{north:y,south:v,east:Math.max(C,S,T,x),west:Math.min(C,S,T,x),granYCos:l,granYSin:d,granXCos:c,granXSin:h,nwCorner:e}}RectangleGeometryLibrary.computeOptions=function(e,t,i,r,n,a,o){var s=e.east,l=e.west,c=e.north,u=e.south,d=!1,h=!1;c===CesiumMath.PI_OVER_TWO&&(d=!0),u===-CesiumMath.PI_OVER_TWO&&(h=!0);var p,m,f,g=c-u,_=(p=s<l?CesiumMath.TWO_PI-l+s:s-l)/((m=Math.ceil(p/t)+1)-1),y=g/((f=Math.ceil(g/t)+1)-1),v=Rectangle.northwest(e,a),C=Rectangle.center(e,centerScratch$2);0===i&&0===r||(C.longitude<v.longitude&&(C.longitude+=CesiumMath.TWO_PI),centerCartesian=proj.project(C,centerCartesian));var S,T,x,b=y,E=_,P=Rectangle.clone(e,n),A={granYCos:b,granYSin:0,granXCos:E,granXSin:0,nwCorner:v,boundingRectangle:P,width:m,height:f,northCap:d,southCap:h};return 0!==i&&(c=(S=getRotationOptions(v,i,_,y,C,m,f)).north,u=S.south,s=S.east,l=S.west,A.granYCos=S.granYCos,A.granYSin=S.granYSin,A.granXCos=S.granXCos,A.granXSin=S.granXSin,P.north=c,P.south=u,P.east=s,P.west=l),0!==r&&(i-=r,x=getRotationOptions(T=Rectangle.northwest(P,o),i,_,y,C,m,f),A.stGranYCos=x.granYCos,A.stGranXCos=x.granXCos,A.stGranYSin=x.granYSin,A.stGranXSin=x.granXSin,A.stNwCorner=T,A.stWest=x.west,A.stSouth=x.south),A};var positionScratch$2=new Cartesian3,normalScratch$3=new Cartesian3,tangentScratch$1=new Cartesian3,bitangentScratch$1=new Cartesian3,rectangleScratch$2=new Rectangle,stScratch$1=new Cartesian2,bottomBoundingSphere$2=new BoundingSphere,topBoundingSphere$2=new BoundingSphere;function createAttributes(e,t){var i=new Geometry({attributes:new GeometryAttributes,primitiveType:PrimitiveType$1.TRIANGLES});return i.attributes.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:t.positions}),e.normal&&(i.attributes.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:t.normals})),e.tangent&&(i.attributes.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:t.tangents})),e.bitangent&&(i.attributes.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:t.bitangents})),i}function calculateAttributes(e,t,i,r){var n=e.length,a=t.normal?new Float32Array(n):void 0,o=t.tangent?new Float32Array(n):void 0,s=t.bitangent?new Float32Array(n):void 0,l=0,c=bitangentScratch$1,u=tangentScratch$1,d=normalScratch$3;if(t.normal||t.tangent||t.bitangent)for(var h=0;h<n;h+=3){var p=Cartesian3.fromArray(e,h,positionScratch$2),m=l+1,f=l+2,d=i.geodeticSurfaceNormal(p,d);(t.tangent||t.bitangent)&&(Cartesian3.cross(Cartesian3.UNIT_Z,d,u),Matrix3.multiplyByVector(r,u,u),Cartesian3.normalize(u,u),t.bitangent&&Cartesian3.normalize(Cartesian3.cross(d,u,c),c)),t.normal&&(a[l]=d.x,a[m]=d.y,a[f]=d.z),t.tangent&&(o[l]=u.x,o[m]=u.y,o[f]=u.z),t.bitangent&&(s[l]=c.x,s[m]=c.y,s[f]=c.z),l+=3}return createAttributes(t,{positions:e,normals:a,tangents:o,bitangents:s})}var v1Scratch=new Cartesian3,v2Scratch=new Cartesian3;function calculateAttributesWall(e,t,i){var r=e.length,n=t.normal?new Float32Array(r):void 0,a=t.tangent?new Float32Array(r):void 0,o=t.bitangent?new Float32Array(r):void 0,s=0,l=0,c=0,u=!0,d=bitangentScratch$1,h=tangentScratch$1,p=normalScratch$3;if(t.normal||t.tangent||t.bitangent)for(var m=0;m<r;m+=6){var f,g=Cartesian3.fromArray(e,m,positionScratch$2),_=Cartesian3.fromArray(e,(m+6)%r,v1Scratch);u&&(f=Cartesian3.fromArray(e,(m+3)%r,v2Scratch),Cartesian3.subtract(_,g,_),Cartesian3.subtract(f,g,f),p=Cartesian3.normalize(Cartesian3.cross(f,_,p),p),u=!1),Cartesian3.equalsEpsilon(_,g,CesiumMath.EPSILON10)&&(u=!0),(t.tangent||t.bitangent)&&(d=i.geodeticSurfaceNormal(g,d),t.tangent&&(h=Cartesian3.normalize(Cartesian3.cross(d,p,h),h))),t.normal&&(n[s++]=p.x,n[s++]=p.y,n[s++]=p.z,n[s++]=p.x,n[s++]=p.y,n[s++]=p.z),t.tangent&&(a[l++]=h.x,a[l++]=h.y,a[l++]=h.z,a[l++]=h.x,a[l++]=h.y,a[l++]=h.z),t.bitangent&&(o[c++]=d.x,o[c++]=d.y,o[c++]=d.z,o[c++]=d.x,o[c++]=d.y,o[c++]=d.z)}return createAttributes(t,{positions:e,normals:n,tangents:a,bitangents:o})}function constructRectangle(e,t){var i=e._vertexFormat,r=e._ellipsoid,n=t.height,a=t.width,o=t.northCap,s=t.southCap,l=0,c=n,u=n,d=0;o&&(--u,d+=l=1),s&&(--c,--u,d+=1),d+=a*u;for(var h=i.position?new Float64Array(3*d):void 0,p=i.st?new Float32Array(2*d):void 0,m=0,f=0,g=positionScratch$2,_=stScratch$1,y=Number.MAX_VALUE,v=Number.MAX_VALUE,C=-Number.MAX_VALUE,S=-Number.MAX_VALUE,T=l;T<c;++T)for(var x=0;x<a;++x)RectangleGeometryLibrary.computePosition(t,r,i.st,T,x,g,_),h[m++]=g.x,h[m++]=g.y,h[m++]=g.z,i.st&&(p[f++]=_.x,p[f++]=_.y,y=Math.min(y,_.x),v=Math.min(v,_.y),C=Math.max(C,_.x),S=Math.max(S,_.y));if(o&&(RectangleGeometryLibrary.computePosition(t,r,i.st,0,0,g,_),h[m++]=g.x,h[m++]=g.y,h[m++]=g.z,i.st&&(p[f++]=_.x,p[f++]=_.y,y=_.x,v=_.y,C=_.x,S=_.y)),s&&(RectangleGeometryLibrary.computePosition(t,r,i.st,n-1,0,g,_),h[m++]=g.x,h[m++]=g.y,h[m]=g.z,i.st&&(p[f++]=_.x,p[f]=_.y,y=Math.min(y,_.x),v=Math.min(v,_.y),C=Math.max(C,_.x),S=Math.max(S,_.y))),i.st&&(y<0||v<0||1<C||1<S))for(var b=0;b<p.length;b+=2)p[b]=(p[b]-y)/(C-y),p[b+1]=(p[b+1]-v)/(S-v);var E=calculateAttributes(h,i,r,t.tangentRotationMatrix),P=6*(a-1)*(u-1);o&&(P+=3*(a-1)),s&&(P+=3*(a-1));for(var A=IndexDatatype$1.createTypedArray(d,P),w=0,D=0,M=0;M<u-1;++M){for(var I=0;I<a-1;++I){var R=w+a,O=R+1,L=w+1;A[D++]=w,A[D++]=R,A[D++]=L,A[D++]=L,A[D++]=R,A[D++]=O,++w}++w}if(o||s){var F,N,B=d-1,V=d-1;if(o&&s&&(B=d-2),w=0,o)for(M=0;M<a-1;M++)N=(F=w)+1,A[D++]=B,A[D++]=F,A[D++]=N,++w;if(s)for(w=(u-1)*a,M=0;M<a-1;M++)N=(F=w)+1,A[D++]=F,A[D++]=V,A[D++]=N,++w}return E.indices=A,i.st&&(E.attributes.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:p})),E}function addWallPositions$1(e,t,i,r,n){return e[t++]=r[i],e[t++]=r[i+1],e[t++]=r[i+2],e[t++]=n[i],e[t++]=n[i+1],e[t]=n[i+2],e}function addWallTextureCoordinates(e,t,i,r){return e[t++]=r[i],e[t++]=r[i+1],e[t++]=r[i],e[t]=r[i+1],e}var scratchVertexFormat$b=new VertexFormat;function constructExtrudedRectangle(e,t){var i,r=e._shadowVolume,n=e._offsetAttribute,a=e._vertexFormat,o=e._extrudedHeight,s=e._surfaceHeight,l=e._ellipsoid,c=t.height,u=t.width;r&&((i=VertexFormat.clone(a,scratchVertexFormat$b)).normal=!0,e._vertexFormat=i);var d=constructRectangle(e,t);r&&(e._vertexFormat=a);var h=PolygonPipeline.scaleToGeodeticHeight(d.attributes.position.values,s,l,!1),p=2*(oe=(h=new Float64Array(h)).length),m=new Float64Array(p);m.set(h);var f=PolygonPipeline.scaleToGeodeticHeight(d.attributes.position.values,o,l);m.set(f,oe),d.attributes.position.values=m;var g,_,y=a.normal?new Float32Array(p):void 0,v=a.tangent?new Float32Array(p):void 0,C=a.bitangent?new Float32Array(p):void 0,S=a.st?new Float32Array(p/3*2):void 0;if(a.normal){for(_=d.attributes.normal.values,y.set(_),x=0;x<oe;x++)_[x]=-_[x];y.set(_,oe),d.attributes.normal.values=y}if(r){_=d.attributes.normal.values,a.normal||(d.attributes.normal=void 0);for(var T=new Float32Array(p),x=0;x<oe;x++)_[x]=-_[x];T.set(_,oe),d.attributes.extrudeDirection=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:T})}var b,E,P,A=defined(n);if(A&&(b=oe/3*2,E=new Uint8Array(b),E=n===GeometryOffsetAttribute$1.TOP?arrayFill(E,1,0,b/2):arrayFill(E,n===GeometryOffsetAttribute$1.NONE?0:1),d.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:E})),a.tangent){var w=d.attributes.tangent.values;for(v.set(w),x=0;x<oe;x++)w[x]=-w[x];v.set(w,oe),d.attributes.tangent.values=v}a.bitangent&&(P=d.attributes.bitangent.values,C.set(P),C.set(P,oe),d.attributes.bitangent.values=C),a.st&&(g=d.attributes.st.values,S.set(g),S.set(g,oe/3*2),d.attributes.st.values=S);var D=d.indices,M=D.length,I=oe/3,R=IndexDatatype$1.createTypedArray(p/3,2*M);for(R.set(D),x=0;x<M;x+=3)R[x+M]=D[x+2]+I,R[x+1+M]=D[x+1]+I,R[x+2+M]=D[x]+I;d.indices=R;var O=t.northCap,L=t.southCap,F=c,N=2,B=0,V=4,k=4;O&&(--N,--F,B+=1,V-=2,--k),L&&(--N,--F,B+=1,V-=2,--k);var z=2*((B+=N*u+2*F-V)+k),$=new Float64Array(3*z),U=r?new Float32Array(3*z):void 0,G=A?new Uint8Array(z):void 0,H=a.st?new Float32Array(2*z):void 0,W=n===GeometryOffsetAttribute$1.TOP;A&&!W&&(G=arrayFill(G,n===GeometryOffsetAttribute$1.ALL?1:0));var q=0,j=0,Y=0,X=0,Q=u*F;for(x=0;x<Q;x+=u)$=addWallPositions$1($,q,Z=3*x,h,f),q+=6,a.st&&(H=addWallTextureCoordinates(H,j,2*x,g),j+=4),r&&(Y+=3,U[Y++]=_[Z],U[Y++]=_[Z+1],U[Y++]=_[Z+2]),W&&(G[X++]=1,X+=1);if(L){var J=O?1+Q:Q,Z=3*J;for(x=0;x<2;x++)$=addWallPositions$1($,q,Z,h,f),q+=6,a.st&&(H=addWallTextureCoordinates(H,j,2*J,g),j+=4),r&&(Y+=3,U[Y++]=_[Z],U[Y++]=_[Z+1],U[Y++]=_[Z+2]),W&&(G[X++]=1,X+=1)}else for(x=Q-u;x<Q;x++)$=addWallPositions$1($,q,Z=3*x,h,f),q+=6,a.st&&(H=addWallTextureCoordinates(H,j,2*x,g),j+=4),r&&(Y+=3,U[Y++]=_[Z],U[Y++]=_[Z+1],U[Y++]=_[Z+2]),W&&(G[X++]=1,X+=1);for(x=Q-1;0<x;x-=u)$=addWallPositions$1($,q,Z=3*x,h,f),q+=6,a.st&&(H=addWallTextureCoordinates(H,j,2*x,g),j+=4),r&&(Y+=3,U[Y++]=_[Z],U[Y++]=_[Z+1],U[Y++]=_[Z+2]),W&&(G[X++]=1,X+=1);if(O){var K=Q;for(Z=3*K,x=0;x<2;x++)$=addWallPositions$1($,q,Z,h,f),q+=6,a.st&&(H=addWallTextureCoordinates(H,j,2*K,g),j+=4),r&&(Y+=3,U[Y++]=_[Z],U[Y++]=_[Z+1],U[Y++]=_[Z+2]),W&&(G[X++]=1,X+=1)}else for(x=u-1;0<=x;x--)$=addWallPositions$1($,q,Z=3*x,h,f),q+=6,a.st&&(H=addWallTextureCoordinates(H,j,2*x,g),j+=4),r&&(Y+=3,U[Y++]=_[Z],U[Y++]=_[Z+1],U[Y++]=_[Z+2]),W&&(G[X++]=1,X+=1);var ee=calculateAttributesWall($,a,l);a.st&&(ee.attributes.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:H})),r&&(ee.attributes.extrudeDirection=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:U})),A&&(ee.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:G}));var te,ie,re,ne,ae=IndexDatatype$1.createTypedArray(z,6*B),oe=$.length/3,se=0;for(x=0;x<oe-1;x+=2){ne=((te=x)+2)%oe;var le=Cartesian3.fromArray($,3*te,v1Scratch),ce=Cartesian3.fromArray($,3*ne,v2Scratch);Cartesian3.equalsEpsilon(le,ce,CesiumMath.EPSILON10)||(re=(2+(ie=(te+1)%oe))%oe,ae[se++]=te,ae[se++]=ie,ae[se++]=ne,ae[se++]=ne,ae[se++]=ie,ae[se++]=re)}return ee.indices=ae,(ee=GeometryPipeline.combineInstances([new GeometryInstance({geometry:d}),new GeometryInstance({geometry:ee})]))[0]}var scratchRectanglePoints=[new Cartesian3,new Cartesian3,new Cartesian3,new Cartesian3],nwScratch=new Cartographic,stNwScratch=new Cartographic;function computeRectangle$3(e,t,i,r,n){if(0===i)return Rectangle.clone(e,n);var a=RectangleGeometryLibrary.computeOptions(e,t,i,0,rectangleScratch$2,nwScratch),o=a.height,s=a.width,l=scratchRectanglePoints;return RectangleGeometryLibrary.computePosition(a,r,!1,0,0,l[0]),RectangleGeometryLibrary.computePosition(a,r,!1,0,s-1,l[1]),RectangleGeometryLibrary.computePosition(a,r,!1,o-1,0,l[2]),RectangleGeometryLibrary.computePosition(a,r,!1,o-1,s-1,l[3]),Rectangle.fromCartesianArray(l,r,n)}function RectangleGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).rectangle,i=defaultValue(e.height,0),r=defaultValue(e.extrudedHeight,i);this._rectangle=Rectangle.clone(t),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._ellipsoid=Ellipsoid.clone(defaultValue(e.ellipsoid,Ellipsoid.WGS84)),this._surfaceHeight=Math.max(i,r),this._rotation=defaultValue(e.rotation,0),this._stRotation=defaultValue(e.stRotation,0),this._vertexFormat=VertexFormat.clone(defaultValue(e.vertexFormat,VertexFormat.DEFAULT)),this._extrudedHeight=Math.min(i,r),this._shadowVolume=defaultValue(e.shadowVolume,!1),this._workerName="createRectangleGeometry",this._offsetAttribute=e.offsetAttribute,this._rotatedRectangle=void 0,this._textureCoordinateRotationPoints=void 0}RectangleGeometry.packedLength=Rectangle.packedLength+Ellipsoid.packedLength+VertexFormat.packedLength+7,RectangleGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Rectangle.pack(e._rectangle,t,i),i+=Rectangle.packedLength,Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),i+=VertexFormat.packedLength,t[i++]=e._granularity,t[i++]=e._surfaceHeight,t[i++]=e._rotation,t[i++]=e._stRotation,t[i++]=e._extrudedHeight,t[i++]=e._shadowVolume?1:0,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchRectangle=new Rectangle,scratchEllipsoid$a=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchOptions$i={rectangle:scratchRectangle,ellipsoid:scratchEllipsoid$a,vertexFormat:scratchVertexFormat$b,granularity:void 0,height:void 0,rotation:void 0,stRotation:void 0,extrudedHeight:void 0,shadowVolume:void 0,offsetAttribute:void 0};RectangleGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Rectangle.unpack(e,t,scratchRectangle);t+=Rectangle.packedLength;var n=Ellipsoid.unpack(e,t,scratchEllipsoid$a);t+=Ellipsoid.packedLength;var a=VertexFormat.unpack(e,t,scratchVertexFormat$b);t+=VertexFormat.packedLength;var o=e[t++],s=e[t++],l=e[t++],c=e[t++],u=e[t++],d=1===e[t++],h=e[t];return defined(i)?(i._rectangle=Rectangle.clone(r,i._rectangle),i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._vertexFormat=VertexFormat.clone(a,i._vertexFormat),i._granularity=o,i._surfaceHeight=s,i._rotation=l,i._stRotation=c,i._extrudedHeight=u,i._shadowVolume=d,i._offsetAttribute=-1===h?void 0:h,i):(scratchOptions$i.granularity=o,scratchOptions$i.height=s,scratchOptions$i.rotation=l,scratchOptions$i.stRotation=c,scratchOptions$i.extrudedHeight=u,scratchOptions$i.shadowVolume=d,scratchOptions$i.offsetAttribute=-1===h?void 0:h,new RectangleGeometry(scratchOptions$i))},RectangleGeometry.computeRectangle=function(e,t){var i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).rectangle,r=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),n=defaultValue(e.ellipsoid,Ellipsoid.WGS84);return computeRectangle$3(i,r,defaultValue(e.rotation,0),n,t)};var tangentRotationMatrixScratch=new Matrix3,quaternionScratch$3=new Quaternion,centerScratch$3=new Cartographic;RectangleGeometry.createGeometry=function(e){if(!CesiumMath.equalsEpsilon(e._rectangle.north,e._rectangle.south,CesiumMath.EPSILON10)&&!CesiumMath.equalsEpsilon(e._rectangle.east,e._rectangle.west,CesiumMath.EPSILON10)){var t,i,r=e._rectangle,n=e._ellipsoid,a=e._rotation,o=e._stRotation,s=e._vertexFormat,l=RectangleGeometryLibrary.computeOptions(r,e._granularity,a,o,rectangleScratch$2,nwScratch,stNwScratch),c=tangentRotationMatrixScratch;0!==o||0!==a?(t=Rectangle.center(r,centerScratch$3),i=n.geodeticSurfaceNormalCartographic(t,v1Scratch),Quaternion.fromAxisAngle(i,-o,quaternionScratch$3),Matrix3.fromQuaternion(quaternionScratch$3,c)):Matrix3.clone(Matrix3.IDENTITY,c);var u,d,h,p,m,f,g=e._surfaceHeight,_=e._extrudedHeight,y=!CesiumMath.equalsEpsilon(g,_,0,CesiumMath.EPSILON2);return l.lonScalar=1/e._rectangle.width,l.latScalar=1/e._rectangle.height,l.tangentRotationMatrix=c,r=e._rectangle,h=y?(f=constructExtrudedRectangle(e,l),u=BoundingSphere.fromRectangle3D(r,n,g,topBoundingSphere$2),d=BoundingSphere.fromRectangle3D(r,n,_,bottomBoundingSphere$2),BoundingSphere.union(u,d)):((f=constructRectangle(e,l)).attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(f.attributes.position.values,g,n,!1),defined(e._offsetAttribute)&&(p=f.attributes.position.values.length,arrayFill(m=new Uint8Array(p/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),f.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:m})),BoundingSphere.fromRectangle3D(r,n,g)),s.position||delete f.attributes.position,new Geometry({attributes:f.attributes,indices:f.indices,primitiveType:f.primitiveType,boundingSphere:h,offsetAttribute:e._offsetAttribute})}},RectangleGeometry.createShadowVolume=function(e,t,i){var r=e._granularity,n=e._ellipsoid,a=t(r,n),o=i(r,n);return new RectangleGeometry({rectangle:e._rectangle,rotation:e._rotation,ellipsoid:n,stRotation:e._stRotation,granularity:r,extrudedHeight:o,height:a,vertexFormat:VertexFormat.POSITION_ONLY,shadowVolume:!0})};var unrotatedTextureRectangleScratch=new Rectangle,points2DScratch$1=[new Cartesian2,new Cartesian2,new Cartesian2],rotation2DScratch$1=new Matrix2,rectangleCenterScratch$1=new Cartographic;function textureCoordinateRotationPoints$2(e){if(0===e._stRotation)return[0,0,0,1,1,0];var t=Rectangle.clone(e._rectangle,unrotatedTextureRectangleScratch),i=e._granularity,r=e._ellipsoid,n=computeRectangle$3(t,i,e._rotation-e._stRotation,r,unrotatedTextureRectangleScratch),a=points2DScratch$1;a[0].x=n.west,a[0].y=n.south,a[1].x=n.west,a[1].y=n.north,a[2].x=n.east,a[2].y=n.south;for(var o=e.rectangle,s=Matrix2.fromRotation(e._stRotation,rotation2DScratch$1),l=Rectangle.center(o,rectangleCenterScratch$1),c=0;c<3;++c){var u=a[c];u.x-=l.longitude,u.y-=l.latitude,Matrix2.multiplyByVector(s,u,u),u.x+=l.longitude,u.y+=l.latitude,u.x=(u.x-o.west)/o.width,u.y=(u.y-o.south)/o.height}var d=a[0],h=a[1],p=a[2],m=new Array(6);return Cartesian2.pack(d,m),Cartesian2.pack(h,m,2),Cartesian2.pack(p,m,4),m}Object.defineProperties(RectangleGeometry.prototype,{rectangle:{get:function(){return defined(this._rotatedRectangle)||(this._rotatedRectangle=computeRectangle$3(this._rectangle,this._granularity,this._rotation,this._ellipsoid)),this._rotatedRectangle}},textureCoordinateRotationPoints:{get:function(){return defined(this._textureCoordinateRotationPoints)||(this._textureCoordinateRotationPoints=textureCoordinateRotationPoints$2(this)),this._textureCoordinateRotationPoints}}});var bottomBoundingSphere$3=new BoundingSphere,topBoundingSphere$3=new BoundingSphere,positionScratch$3=new Cartesian3,rectangleScratch$3=new Rectangle;function constructRectangle$1(e,t){var i=e._ellipsoid,r=t.height,n=t.width,a=t.northCap,o=t.southCap,s=r,l=2,c=0,u=4;a&&(--l,--s,c+=1,u-=2),o&&(--l,--s,c+=1,u-=2),c+=l*n+2*s-u;var d,h=new Float64Array(3*c),p=0,m=0,f=positionScratch$3;if(a)RectangleGeometryLibrary.computePosition(t,i,!1,m,0,f),h[p++]=f.x,h[p++]=f.y,h[p++]=f.z;else for(d=0;d<n;d++)RectangleGeometryLibrary.computePosition(t,i,!1,m,d,f),h[p++]=f.x,h[p++]=f.y,h[p++]=f.z;for(d=n-1,m=1;m<r;m++)RectangleGeometryLibrary.computePosition(t,i,!1,m,d,f),h[p++]=f.x,h[p++]=f.y,h[p++]=f.z;if(m=r-1,!o)for(d=n-2;0<=d;d--)RectangleGeometryLibrary.computePosition(t,i,!1,m,d,f),h[p++]=f.x,h[p++]=f.y,h[p++]=f.z;for(d=0,m=r-2;0<m;m--)RectangleGeometryLibrary.computePosition(t,i,!1,m,d,f),h[p++]=f.x,h[p++]=f.y,h[p++]=f.z;for(var g=h.length/3*2,_=IndexDatatype$1.createTypedArray(h.length/3,g),y=0,v=0;v<h.length/3-1;v++)_[y++]=v,_[y++]=v+1;_[y++]=h.length/3-1,_[y++]=0;var C=new Geometry({attributes:new GeometryAttributes,primitiveType:PrimitiveType$1.LINES});return C.attributes.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:h}),C.indices=_,C}function constructExtrudedRectangle$1(e,t){var i=e._surfaceHeight,r=e._extrudedHeight,n=e._ellipsoid,a=r,o=i,s=constructRectangle$1(e,t),l=t.height,c=t.width,u=PolygonPipeline.scaleToGeodeticHeight(s.attributes.position.values,o,n,!1),d=u.length,h=new Float64Array(2*d);h.set(u);var p=PolygonPipeline.scaleToGeodeticHeight(s.attributes.position.values,a,n);h.set(p,d),s.attributes.position.values=h;var m=t.northCap,f=t.southCap,g=4;m&&--g,f&&--g;for(var _,y,v,C=2*(h.length/3+g),S=IndexDatatype$1.createTypedArray(h.length/3,C),d=h.length/6,T=0,x=0;x<d-1;x++)S[T++]=x,S[T++]=x+1,S[T++]=x+d,S[T++]=x+d+1;return S[T++]=d-1,S[T++]=0,S[T++]=d+d-1,S[T++]=d,S[T++]=0,S[T++]=d,_=m?l-1:(y=c-1,S[T++]=y,S[T++]=y+d,c+l-2),S[T++]=_,S[T++]=_+d,f||(v=c+_-1,S[T++]=v,S[T]=v+d),s.indices=S,s}function RectangleOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).rectangle,i=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),r=defaultValue(e.ellipsoid,Ellipsoid.WGS84),n=defaultValue(e.rotation,0),a=defaultValue(e.height,0),o=defaultValue(e.extrudedHeight,a);this._rectangle=Rectangle.clone(t),this._granularity=i,this._ellipsoid=r,this._surfaceHeight=Math.max(a,o),this._rotation=n,this._extrudedHeight=Math.min(a,o),this._offsetAttribute=e.offsetAttribute,this._workerName="createRectangleOutlineGeometry"}RectangleOutlineGeometry.packedLength=Rectangle.packedLength+Ellipsoid.packedLength+5,RectangleOutlineGeometry.pack=function(e,t,i){return i=defaultValue(i,0),Rectangle.pack(e._rectangle,t,i),i+=Rectangle.packedLength,Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,t[i++]=e._granularity,t[i++]=e._surfaceHeight,t[i++]=e._rotation,t[i++]=e._extrudedHeight,t[i]=defaultValue(e._offsetAttribute,-1),t};var scratchRectangle$1=new Rectangle,scratchEllipsoid$b=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchOptions$j={rectangle:scratchRectangle$1,ellipsoid:scratchEllipsoid$b,granularity:void 0,height:void 0,rotation:void 0,extrudedHeight:void 0,offsetAttribute:void 0};RectangleOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);var r=Rectangle.unpack(e,t,scratchRectangle$1);t+=Rectangle.packedLength;var n=Ellipsoid.unpack(e,t,scratchEllipsoid$b);t+=Ellipsoid.packedLength;var a=e[t++],o=e[t++],s=e[t++],l=e[t++],c=e[t];return defined(i)?(i._rectangle=Rectangle.clone(r,i._rectangle),i._ellipsoid=Ellipsoid.clone(n,i._ellipsoid),i._surfaceHeight=o,i._rotation=s,i._extrudedHeight=l,i._offsetAttribute=-1===c?void 0:c,i):(scratchOptions$j.granularity=a,scratchOptions$j.height=o,scratchOptions$j.rotation=s,scratchOptions$j.extrudedHeight=l,scratchOptions$j.offsetAttribute=-1===c?void 0:c,new RectangleOutlineGeometry(scratchOptions$j))};var nwScratch$1=new Cartographic;RectangleOutlineGeometry.createGeometry=function(e){var t=e._rectangle,i=e._ellipsoid,r=RectangleGeometryLibrary.computeOptions(t,e._granularity,e._rotation,0,rectangleScratch$3,nwScratch$1);if(!CesiumMath.equalsEpsilon(t.north,t.south,CesiumMath.EPSILON10)&&!CesiumMath.equalsEpsilon(t.east,t.west,CesiumMath.EPSILON10)){var n,a,o,s,l,c,u,d,h=e._surfaceHeight,p=e._extrudedHeight;return c=!CesiumMath.equalsEpsilon(h,p,0,CesiumMath.EPSILON2)?(o=constructExtrudedRectangle$1(e,r),defined(e._offsetAttribute)&&(n=o.attributes.position.values.length/3,a=new Uint8Array(n),a=e._offsetAttribute===GeometryOffsetAttribute$1.TOP?arrayFill(a,1,0,n/2):arrayFill(a,e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),o.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:a})),s=BoundingSphere.fromRectangle3D(t,i,h,topBoundingSphere$3),l=BoundingSphere.fromRectangle3D(t,i,p,bottomBoundingSphere$3),BoundingSphere.union(s,l)):((o=constructRectangle$1(e,r)).attributes.position.values=PolygonPipeline.scaleToGeodeticHeight(o.attributes.position.values,h,i,!1),defined(e._offsetAttribute)&&(u=o.attributes.position.values.length,arrayFill(d=new Uint8Array(u/3),e._offsetAttribute===GeometryOffsetAttribute$1.NONE?0:1),o.attributes.applyOffset=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,values:d})),BoundingSphere.fromRectangle3D(t,i,h)),new Geometry({attributes:o.attributes,indices:o.indices,primitiveType:PrimitiveType$1.LINES,boundingSphere:c,offsetAttribute:e._offsetAttribute})}};var ReferenceFrame={FIXED:0,INERTIAL:1},ReferenceFrame$1=Object.freeze(ReferenceFrame),ScreenSpaceEventType={LEFT_DOWN:0,LEFT_UP:1,LEFT_CLICK:2,LEFT_DOUBLE_CLICK:3,RIGHT_DOWN:5,RIGHT_UP:6,RIGHT_CLICK:7,MIDDLE_DOWN:10,MIDDLE_UP:11,MIDDLE_CLICK:12,MOUSE_MOVE:15,WHEEL:16,PINCH_START:17,PINCH_END:18,PINCH_MOVE:19},ScreenSpaceEventType$1=Object.freeze(ScreenSpaceEventType);function getPosition$1(e,t,i){var r=e._element;if(r===document)return i.x=t.clientX,i.y=t.clientY,i;var n=r.getBoundingClientRect();return i.x=t.clientX-n.left,i.y=t.clientY-n.top,i}function getInputEventKey(e,t){var i=e;return defined(t)&&(i+="+"+t),i}function getModifier(e){return e.shiftKey?KeyboardEventModifier$1.SHIFT:e.ctrlKey?KeyboardEventModifier$1.CTRL:e.altKey?KeyboardEventModifier$1.ALT:void 0}var MouseButton={LEFT:0,MIDDLE:1,RIGHT:2};function registerListener(t,e,i,r){function n(e){r(t,e)}FeatureDetection.isInternetExplorer()?i.addEventListener(e,n,!1):i.addEventListener(e,n,{capture:!1,passive:!1}),t._removalFunctions.push(function(){i.removeEventListener(e,n,!1)})}function registerListeners(e){var t=e._element,i=defined(t.disableRootEvents)?t:document;FeatureDetection.supportsPointerEvents()?(registerListener(e,"pointerdown",t,handlePointerDown),registerListener(e,"pointerup",t,handlePointerUp),registerListener(e,"pointermove",t,handlePointerMove),registerListener(e,"pointercancel",t,handlePointerUp)):(registerListener(e,"mousedown",t,handleMouseDown),registerListener(e,"mouseup",i,handleMouseUp),registerListener(e,"mousemove",i,handleMouseMove),registerListener(e,"touchstart",t,handleTouchStart),registerListener(e,"touchend",i,handleTouchEnd),registerListener(e,"touchmove",i,handleTouchMove),registerListener(e,"touchcancel",i,handleTouchEnd)),registerListener(e,"dblclick",t,handleDblClick),registerListener(e,"onwheel"in t?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll",t,handleWheel)}function unregisterListeners(e){for(var t=e._removalFunctions,i=0;i<t.length;++i)t[i]()}var mouseDownEvent={position:new Cartesian2};function gotTouchEvent(e){e._lastSeenTouchEvent=getTimestamp$1()}function canProcessMouseEvent(e){return getTimestamp$1()-e._lastSeenTouchEvent>ScreenSpaceEventHandler.mouseEmulationIgnoreMilliseconds}function checkPixelTolerance(e,t,i){var r=e.x-t.x,n=e.y-t.y;return Math.sqrt(r*r+n*n)<i}function handleMouseDown(e,t){if(canProcessMouseEvent(e)){var i,r=t.button;if(e._buttonDown[r]=!0,r===MouseButton.LEFT)i=ScreenSpaceEventType$1.LEFT_DOWN;else if(r===MouseButton.MIDDLE)i=ScreenSpaceEventType$1.MIDDLE_DOWN;else{if(r!==MouseButton.RIGHT)return;i=ScreenSpaceEventType$1.RIGHT_DOWN}var n=getPosition$1(e,t,e._primaryPosition);Cartesian2.clone(n,e._primaryStartPosition),Cartesian2.clone(n,e._primaryPreviousPosition);var a=getModifier(t),o=e.getInputAction(i,a);defined(o)&&(Cartesian2.clone(n,mouseDownEvent.position),o(mouseDownEvent),t.preventDefault())}}var mouseUpEvent={position:new Cartesian2},mouseClickEvent={position:new Cartesian2};function cancelMouseEvent(e,t,i,r){var n,a=getModifier(r),o=e.getInputAction(t,a),s=e.getInputAction(i,a);(defined(o)||defined(s))&&(n=getPosition$1(e,r,e._primaryPosition),defined(o)&&(Cartesian2.clone(n,mouseUpEvent.position),o(mouseUpEvent)),defined(s)&&checkPixelTolerance(e._primaryStartPosition,n,e._clickPixelTolerance)&&(Cartesian2.clone(n,mouseClickEvent.position),s(mouseClickEvent)))}function handleMouseUp(e,t){var i;canProcessMouseEvent(e)&&((i=t.button)!==MouseButton.LEFT&&i!==MouseButton.MIDDLE&&i!==MouseButton.RIGHT||(e._buttonDown[MouseButton.LEFT]&&(cancelMouseEvent(e,ScreenSpaceEventType$1.LEFT_UP,ScreenSpaceEventType$1.LEFT_CLICK,t),e._buttonDown[MouseButton.LEFT]=!1),e._buttonDown[MouseButton.MIDDLE]&&(cancelMouseEvent(e,ScreenSpaceEventType$1.MIDDLE_UP,ScreenSpaceEventType$1.MIDDLE_CLICK,t),e._buttonDown[MouseButton.MIDDLE]=!1),e._buttonDown[MouseButton.RIGHT]&&(cancelMouseEvent(e,ScreenSpaceEventType$1.RIGHT_UP,ScreenSpaceEventType$1.RIGHT_CLICK,t),e._buttonDown[MouseButton.RIGHT]=!1)))}var mouseMoveEvent={startPosition:new Cartesian2,endPosition:new Cartesian2};function handleMouseMove(e,t){var i,r,n,a;canProcessMouseEvent(e)&&(i=getModifier(t),r=getPosition$1(e,t,e._primaryPosition),n=e._primaryPreviousPosition,defined(a=e.getInputAction(ScreenSpaceEventType$1.MOUSE_MOVE,i))&&(Cartesian2.clone(n,mouseMoveEvent.startPosition),Cartesian2.clone(r,mouseMoveEvent.endPosition),a(mouseMoveEvent)),Cartesian2.clone(r,n),(e._buttonDown[MouseButton.LEFT]||e._buttonDown[MouseButton.MIDDLE]||e._buttonDown[MouseButton.RIGHT])&&t.preventDefault())}var mouseDblClickEvent={position:new Cartesian2};function handleDblClick(e,t){var i,r,n;t.button===MouseButton.LEFT&&(i=ScreenSpaceEventType$1.LEFT_DOUBLE_CLICK,r=getModifier(t),defined(n=e.getInputAction(i,r))&&(getPosition$1(e,t,mouseDblClickEvent.position),n(mouseDblClickEvent)))}function handleWheel(e,t){var i,r,n,a;r=defined(t.deltaY)?(i=t.deltaMode)===t.DOM_DELTA_PIXEL?-t.deltaY:i===t.DOM_DELTA_LINE?40*-t.deltaY:120*-t.deltaY:0<t.detail?-120*t.detail:t.wheelDelta,defined(r)&&(n=getModifier(t),defined(a=e.getInputAction(ScreenSpaceEventType$1.WHEEL,n))&&(a(r),t.preventDefault()))}function handleTouchStart(e,t){gotTouchEvent(e);for(var i,r,n=t.changedTouches,a=n.length,o=e._positions,s=0;s<a;++s)r=(i=n[s]).identifier,o.set(r,getPosition$1(e,i,new Cartesian2));fireTouchEvents(e,t);var l=e._previousPositions;for(s=0;s<a;++s)r=(i=n[s]).identifier,l.set(r,Cartesian2.clone(o.get(r)))}function handleTouchEnd(e,t){gotTouchEvent(e);for(var i,r=t.changedTouches,n=r.length,a=e._positions,o=0;o<n;++o)i=r[o].identifier,a.remove(i);fireTouchEvents(e,t);var s=e._previousPositions;for(o=0;o<n;++o)i=r[o].identifier,s.remove(i)}var touchStartEvent={position:new Cartesian2},touch2StartEvent={position1:new Cartesian2,position2:new Cartesian2},touchEndEvent={position:new Cartesian2},touchClickEvent={position:new Cartesian2},touchHoldEvent={position:new Cartesian2};function fireTouchEvents(e,t){var i,r,n,a=getModifier(t),o=e._positions,s=o.length,l=e._isPinching;1!==s&&e._buttonDown[MouseButton.LEFT]&&(e._buttonDown[MouseButton.LEFT]=!1,defined(e._touchHoldTimer)&&(clearTimeout(e._touchHoldTimer),e._touchHoldTimer=void 0),defined(i=e.getInputAction(ScreenSpaceEventType$1.LEFT_UP,a))&&(Cartesian2.clone(e._primaryPosition,touchEndEvent.position),i(touchEndEvent)),0!==s||e._isTouchHolding||defined(r=e.getInputAction(ScreenSpaceEventType$1.LEFT_CLICK,a))&&checkPixelTolerance(e._primaryStartPosition,e._previousPositions.values[0],e._clickPixelTolerance)&&(Cartesian2.clone(e._primaryPosition,touchClickEvent.position),r(touchClickEvent)),e._isTouchHolding=!1),0===s&&l&&(e._isPinching=!1,defined(i=e.getInputAction(ScreenSpaceEventType$1.PINCH_END,a))&&i()),1!==s||l||(n=o.values[0],Cartesian2.clone(n,e._primaryPosition),Cartesian2.clone(n,e._primaryStartPosition),Cartesian2.clone(n,e._primaryPreviousPosition),e._buttonDown[MouseButton.LEFT]=!0,defined(i=e.getInputAction(ScreenSpaceEventType$1.LEFT_DOWN,a))&&(Cartesian2.clone(n,touchStartEvent.position),i(touchStartEvent)),e._touchHoldTimer=setTimeout(function(){e.isDestroyed()||(e._touchHoldTimer=void 0,e._isTouchHolding=!0,defined(r=e.getInputAction(ScreenSpaceEventType$1.RIGHT_CLICK,a))&&checkPixelTolerance(e._primaryStartPosition,e._previousPositions.values[0],e._holdPixelTolerance)&&(Cartesian2.clone(e._primaryPosition,touchHoldEvent.position),r(touchHoldEvent)))},ScreenSpaceEventHandler.touchHoldDelayMilliseconds),t.preventDefault()),2!==s||l||(e._isPinching=!0,defined(i=e.getInputAction(ScreenSpaceEventType$1.PINCH_START,a))&&(Cartesian2.clone(o.values[0],touch2StartEvent.position1),Cartesian2.clone(o.values[1],touch2StartEvent.position2),i(touch2StartEvent),t.preventDefault()))}function handleTouchMove(e,t){gotTouchEvent(e);for(var i,r,n=t.changedTouches,a=n.length,o=e._positions,s=0;s<a;++s){r=(i=n[s]).identifier;var l=o.get(r);defined(l)&&getPosition$1(e,i,l)}fireTouchMoveEvents(e,t);var c=e._previousPositions;for(s=0;s<a;++s)r=(i=n[s]).identifier,Cartesian2.clone(o.get(r),c.get(r))}var touchMoveEvent={startPosition:new Cartesian2,endPosition:new Cartesian2},touchPinchMovementEvent={distance:{startPosition:new Cartesian2,endPosition:new Cartesian2},angleAndHeight:{startPosition:new Cartesian2,endPosition:new Cartesian2}};function fireTouchMoveEvents(e,t){var i,r,n,a,o,s,l,c,u,d,h,p,m,f,g,_,y,v=getModifier(t),C=e._positions,S=e._previousPositions,T=C.length;1===T&&e._buttonDown[MouseButton.LEFT]?(i=C.values[0],Cartesian2.clone(i,e._primaryPosition),r=e._primaryPreviousPosition,defined(n=e.getInputAction(ScreenSpaceEventType$1.MOUSE_MOVE,v))&&(Cartesian2.clone(r,touchMoveEvent.startPosition),Cartesian2.clone(i,touchMoveEvent.endPosition),n(touchMoveEvent)),Cartesian2.clone(i,r),t.preventDefault()):2===T&&e._isPinching&&defined(n=e.getInputAction(ScreenSpaceEventType$1.PINCH_MOVE,v))&&(a=C.values[0],o=C.values[1],s=S.values[0],l=S.values[1],c=o.x-a.x,u=o.y-a.y,d=.25*Math.sqrt(c*c+u*u),h=l.x-s.x,p=l.y-s.y,m=.25*Math.sqrt(h*h+p*p),f=.125*(o.y+a.y),g=.125*(l.y+s.y),_=Math.atan2(u,c),y=Math.atan2(p,h),Cartesian2.fromElements(0,m,touchPinchMovementEvent.distance.startPosition),Cartesian2.fromElements(0,d,touchPinchMovementEvent.distance.endPosition),Cartesian2.fromElements(y,g,touchPinchMovementEvent.angleAndHeight.startPosition),Cartesian2.fromElements(_,f,touchPinchMovementEvent.angleAndHeight.endPosition),n(touchPinchMovementEvent))}function handlePointerDown(e,t){var i,r;t.target.setPointerCapture(t.pointerId),"touch"===t.pointerType?(i=e._positions,r=t.pointerId,i.set(r,getPosition$1(e,t,new Cartesian2)),fireTouchEvents(e,t),e._previousPositions.set(r,Cartesian2.clone(i.get(r)))):handleMouseDown(e,t)}function handlePointerUp(e,t){var i,r;"touch"===t.pointerType?(i=e._positions,r=t.pointerId,i.remove(r),fireTouchEvents(e,t),e._previousPositions.remove(r)):handleMouseUp(e,t)}function handlePointerMove(e,t){if("touch"===t.pointerType){var i=e._positions,r=t.pointerId,n=i.get(r);if(!defined(n))return;getPosition$1(e,t,n),fireTouchMoveEvents(e,t);var a=e._previousPositions;Cartesian2.clone(i.get(r),a.get(r))}else handleMouseMove(e,t)}function ScreenSpaceEventHandler(e){this._inputEvents={},this._buttonDown={LEFT:!1,MIDDLE:!1,RIGHT:!1},this._isPinching=!1,this._isTouchHolding=!1,this._lastSeenTouchEvent=-ScreenSpaceEventHandler.mouseEmulationIgnoreMilliseconds,this._primaryStartPosition=new Cartesian2,this._primaryPosition=new Cartesian2,this._primaryPreviousPosition=new Cartesian2,this._positions=new AssociativeArray,this._previousPositions=new AssociativeArray,this._removalFunctions=[],this._touchHoldTimer=void 0,this._clickPixelTolerance=5,this._holdPixelTolerance=25,this._element=defaultValue(e,document),registerListeners(this)}function ShowGeometryInstanceAttribute(e){e=defaultValue(e,!0),this.value=ShowGeometryInstanceAttribute.toValue(e)}ScreenSpaceEventHandler.prototype.setInputAction=function(e,t,i){var r=getInputEventKey(t,i);this._inputEvents[r]=e},ScreenSpaceEventHandler.prototype.getInputAction=function(e,t){var i=getInputEventKey(e,t);return this._inputEvents[i]},ScreenSpaceEventHandler.prototype.removeInputAction=function(e,t){var i=getInputEventKey(e,t);delete this._inputEvents[i]},ScreenSpaceEventHandler.prototype.isDestroyed=function(){return!1},ScreenSpaceEventHandler.prototype.destroy=function(){return unregisterListeners(this),destroyObject(this)},ScreenSpaceEventHandler.mouseEmulationIgnoreMilliseconds=800,ScreenSpaceEventHandler.touchHoldDelayMilliseconds=1500,Object.defineProperties(ShowGeometryInstanceAttribute.prototype,{componentDatatype:{get:function(){return ComponentDatatype$1.UNSIGNED_BYTE}},componentsPerAttribute:{get:function(){return 1}},normalize:{get:function(){return!1}}}),ShowGeometryInstanceAttribute.toValue=function(e,t){return defined(t)?(t[0]=e,t):new Uint8Array([e])};var Simon1994PlanetaryPositions={};function computeTdbMinusTtSpice(e){var t=6.239996+.0172019696544*e;return.001657*Math.sin(t+.01671*Math.sin(t))}var TdtMinusTai$1=32.184,J2000d$1=2451545;function taiToTdb(e,t){t=JulianDate.addSeconds(e,TdtMinusTai$1,t);var i=JulianDate.totalDays(t)-J2000d$1;return t=JulianDate.addSeconds(t,computeTdbMinusTtSpice(i),t)}var epoch=new JulianDate(2451545,0,TimeStandard$1.TAI),MetersPerKilometer=1e3,RadiansPerDegree=CesiumMath.RADIANS_PER_DEGREE,RadiansPerArcSecond=CesiumMath.RADIANS_PER_ARCSECOND,MetersPerAstronomicalUnit=14959787e4,perifocalToEquatorial=new Matrix3;function elementsToCartesian(e,t,i,r,n,a,o){i<0&&(i=-i,n+=CesiumMath.PI);var s=e*(1-t),l=r-n,c=n,u=meanAnomalyToTrueAnomaly(a-r,t);perifocalToCartesianMatrix(l,i,c,perifocalToEquatorial);var d=s*(1+t),h=Math.cos(u),p=Math.sin(u),m=d/(1+t*h);return defined(o)?(o.x=m*h,o.y=m*p,o.z=0):o=new Cartesian3(m*h,m*p,0),Matrix3.multiplyByVector(perifocalToEquatorial,o,o)}function meanAnomalyToTrueAnomaly(e,t){return eccentricAnomalyToTrueAnomaly(meanAnomalyToEccentricAnomaly(e,t),t)}var maxIterationCount=50,keplerEqConvergence=CesiumMath.EPSILON8;function meanAnomalyToEccentricAnomaly(e,t){for(var i=Math.floor(e/CesiumMath.TWO_PI),r=(e-=i*CesiumMath.TWO_PI)+t*Math.sin(e)/(1-Math.sin(e+t)+Math.sin(e)),n=Number.MAX_VALUE,a=0;a<maxIterationCount&&Math.abs(n-r)>keplerEqConvergence;++a)r=(n=r)-(n-t*Math.sin(n)-e)/(1-t*Math.cos(n));return n=r+i*CesiumMath.TWO_PI}function eccentricAnomalyToTrueAnomaly(e,t){var i=Math.floor(e/CesiumMath.TWO_PI);e-=i*CesiumMath.TWO_PI;var r=Math.cos(e)-t,n=Math.sin(e)*Math.sqrt(1-t*t),a=Math.atan2(n,r),a=CesiumMath.zeroToTwoPi(a);return e<0&&(a-=CesiumMath.TWO_PI),a+=i*CesiumMath.TWO_PI}function perifocalToCartesianMatrix(e,t,i,r){var n=Math.cos(e),a=Math.sin(e),o=Math.cos(t),s=Math.sin(t),l=Math.cos(i),c=Math.sin(i);return defined(r)?(r[0]=l*n-c*a*o,r[1]=c*n+l*a*o,r[2]=a*s,r[3]=-l*a-c*n*o,r[4]=-c*a+l*n*o,r[5]=n*s,r[6]=c*s,r[7]=-l*s,r[8]=o):r=new Matrix3(l*n-c*a*o,-l*a-c*n*o,c*s,c*n+l*a*o,-c*a+l*n*o,-l*s,a*s,n*s,o),r}var semiMajorAxis0=1.0000010178*MetersPerAstronomicalUnit,meanLongitude0=100.46645683*RadiansPerDegree,meanLongitude1=1295977422.83429*RadiansPerArcSecond,p1u=16002,p2u=21863,p3u=32004,p4u=10931,p5u=14529,p6u=16368,p7u=15318,p8u=32794,Ca1=64e-7*MetersPerAstronomicalUnit,Ca2=-152e-7*MetersPerAstronomicalUnit,Ca3=62e-7*MetersPerAstronomicalUnit,Ca4=-8e-7*MetersPerAstronomicalUnit,Ca5=32e-7*MetersPerAstronomicalUnit,Ca6=-41e-7*MetersPerAstronomicalUnit,Ca7=19e-7*MetersPerAstronomicalUnit,Ca8=-11e-7*MetersPerAstronomicalUnit,Sa1=1e-7*-150*MetersPerAstronomicalUnit,Sa2=-46e-7*MetersPerAstronomicalUnit,Sa3=68*1e-7*MetersPerAstronomicalUnit,Sa4=54e-7*MetersPerAstronomicalUnit,Sa5=14e-7*MetersPerAstronomicalUnit,Sa6=24e-7*MetersPerAstronomicalUnit,Sa7=-28e-7*MetersPerAstronomicalUnit,Sa8=22e-7*MetersPerAstronomicalUnit,q1u=10,q2u=16002,q3u=21863,q4u=10931,q5u=1473,q6u=32004,q7u=4387,q8u=73,Cl1=-325e-7,Cl2=-322e-7,Cl3=1e-7*-79,Cl4=232*1e-7,Cl5=1e-7*-52,Cl6=97e-7,Cl7=55e-7,Cl8=-41e-7,Sl1=-105e-7,Sl2=-137e-7,Sl3=258e-7,Sl4=35e-7,Sl5=1e-7*-116,Sl6=-88e-7,Sl7=-112e-7,Sl8=-8e-6,scratchDate=new JulianDate(0,0,TimeStandard$1.TAI);function computeSimonEarthMoonBarycenter(e,t){taiToTdb(e,scratchDate);var i=(scratchDate.dayNumber-epoch.dayNumber+(scratchDate.secondsOfDay-epoch.secondsOfDay)/TimeConstants$1.SECONDS_PER_DAY)/(10*TimeConstants$1.DAYS_PER_JULIAN_CENTURY),r=.3595362*i,n=semiMajorAxis0+Ca1*Math.cos(p1u*r)+Sa1*Math.sin(p1u*r)+Ca2*Math.cos(p2u*r)+Sa2*Math.sin(p2u*r)+Ca3*Math.cos(p3u*r)+Sa3*Math.sin(p3u*r)+Ca4*Math.cos(p4u*r)+Sa4*Math.sin(p4u*r)+Ca5*Math.cos(p5u*r)+Sa5*Math.sin(p5u*r)+Ca6*Math.cos(p6u*r)+Sa6*Math.sin(p6u*r)+Ca7*Math.cos(p7u*r)+Sa7*Math.sin(p7u*r)+Ca8*Math.cos(p8u*r)+Sa8*Math.sin(p8u*r),a=meanLongitude0+meanLongitude1*i+Cl1*Math.cos(q1u*r)+Sl1*Math.sin(q1u*r)+Cl2*Math.cos(q2u*r)+Sl2*Math.sin(q2u*r)+Cl3*Math.cos(q3u*r)+Sl3*Math.sin(q3u*r)+Cl4*Math.cos(q4u*r)+Sl4*Math.sin(q4u*r)+Cl5*Math.cos(q5u*r)+Sl5*Math.sin(q5u*r)+Cl6*Math.cos(q6u*r)+Sl6*Math.sin(q6u*r)+Cl7*Math.cos(q7u*r)+Sl7*Math.sin(q7u*r)+Cl8*Math.cos(q8u*r)+Sl8*Math.sin(q8u*r);return elementsToCartesian(n,.0167086342-.0004203654*i,469.97289*RadiansPerArcSecond*i,102.93734808*RadiansPerDegree+11612.3529*RadiansPerArcSecond*i,174.87317577*RadiansPerDegree-8679.27034*RadiansPerArcSecond*i,a,t)}function computeSimonMoon(e,t){taiToTdb(e,scratchDate);var i=(scratchDate.dayNumber-epoch.dayNumber+(scratchDate.secondsOfDay-epoch.secondsOfDay)/TimeConstants$1.SECONDS_PER_DAY)/TimeConstants$1.DAYS_PER_JULIAN_CENTURY,r=i*i,n=r*i,a=n*i,o=383397.7725+.004*i,s=.055545526-16e-9*i,l=5.15668983*RadiansPerDegree,c=-8e-5*i+.02966*r-42e-6*n-13e-8*a,u=83.35324312*RadiansPerDegree,d=14643420.2669*i-38.2702*r-.045047*n+21301e-8*a,h=125.04455501*RadiansPerDegree,p=-6967919.3631*i+6.3602*r+.007625*n-3586e-8*a,m=218.31664563*RadiansPerDegree,f=1732559343.4847*i-6.391*r+.006588*n-3169e-8*a,g=297.85019547*RadiansPerDegree+RadiansPerArcSecond*(1602961601.209*i-6.3706*r+.006593*n-3169e-8*a),_=134.96340251*RadiansPerDegree+RadiansPerArcSecond*(1717915923.2178*i+31.8792*r+.051635*n-2447e-7*a),y=357.52910918*RadiansPerDegree+RadiansPerArcSecond*(129596581.0481*i-.5532*r+136e-6*n-1149e-8*a),v=310.17137918*RadiansPerDegree-RadiansPerArcSecond*(6967051.436*i+6.2068*r+.007618*n-3219e-8*a),C=2*g,S=4*g,T=6*g,x=2*_,b=3*_,E=4*_,P=2*(93.27209062*RadiansPerDegree+RadiansPerArcSecond*(1739527262.8478*i-12.7512*r-.001037*n+417e-8*a));o+=3400.4*Math.cos(C)-635.6*Math.cos(C-_)-235.6*Math.cos(_)+218.1*Math.cos(C-y)+181*Math.cos(C+_),s+=.014216*Math.cos(C-_)+.008551*Math.cos(C-x)-.001383*Math.cos(_)+.001356*Math.cos(C+_)-.001147*Math.cos(S-b)-914e-6*Math.cos(S-x)+869e-6*Math.cos(C-y-_)-627e-6*Math.cos(C)-394e-6*Math.cos(S-E)+282e-6*Math.cos(C-y-x)-279e-6*Math.cos(g-_)-236e-6*Math.cos(x)+231e-6*Math.cos(S)+229e-6*Math.cos(T-E)-201e-6*Math.cos(x-P),c+=486.26*Math.cos(C-P)-40.13*Math.cos(C)+37.51*Math.cos(P)+25.73*Math.cos(x-P)+19.97*Math.cos(C-y-P),d+=-55609*Math.sin(C-_)-34711*Math.sin(C-x)-9792*Math.sin(_)+9385*Math.sin(S-b)+7505*Math.sin(S-x)+5318*Math.sin(C+_)+3484*Math.sin(S-E)-3417*Math.sin(C-y-_)-2530*Math.sin(T-E)-2376*Math.sin(C)-2075*Math.sin(C-b)-1883*Math.sin(x)-1736*Math.sin(T-5*_)+1626*Math.sin(y)-1370*Math.sin(T-b),p+=-5392*Math.sin(C-P)-540*Math.sin(y)-441*Math.sin(C)+423*Math.sin(P)-288*Math.sin(x-P),f+=-3332.9*Math.sin(C)+1197.4*Math.sin(C-_)-662.5*Math.sin(y)+396.3*Math.sin(_)-218*Math.sin(C-y);var A=2*v,w=3*v;c+=46.997*Math.cos(v)*i-.614*Math.cos(C-P+v)*i+.614*Math.cos(C-P-v)*i-.0297*Math.cos(A)*r-.0335*Math.cos(v)*r+.0012*Math.cos(C-P+A)*r-16e-5*Math.cos(v)*n+4e-5*Math.cos(w)*n+4e-5*Math.cos(A)*n;var D=2.116*Math.sin(v)*i-.111*Math.sin(C-P-v)*i-.0015*Math.sin(v)*r;return d+=D,f+=D,p+=-520.77*Math.sin(v)*i+13.66*Math.sin(C-P+v)*i+1.12*Math.sin(C-v)*i-1.06*Math.sin(P-v)*i+.66*Math.sin(A)*r+.371*Math.sin(v)*r-.035*Math.sin(C-P+A)*r-.015*Math.sin(C-P+v)*r+.0014*Math.sin(v)*n-.0011*Math.sin(w)*n-9e-4*Math.sin(A)*n,elementsToCartesian(o*=MetersPerKilometer,s,l+c*RadiansPerArcSecond,u+d*RadiansPerArcSecond,h+p*RadiansPerArcSecond,m+f*RadiansPerArcSecond,t)}var moonEarthMassRatio=.012300034,factor=moonEarthMassRatio/(moonEarthMassRatio+1)*-1;function computeSimonEarth(e,t){return t=computeSimonMoon(e,t),Cartesian3.multiplyByScalar(t,factor,t)}var axesTransformation=new Matrix3(1.0000000000000002,5619723173785822e-31,4690511510146299e-34,-5154129427414611e-31,.9174820620691819,-.39777715593191376,-223970096136568e-30,.39777715593191376,.9174820620691819),translation$1=new Cartesian3;function interpolateColors$1(e,t,i,r,n,a,o){var s=PolylinePipeline.numberOfPoints(e,t,n),l=i.red,c=i.green,u=i.blue,d=i.alpha,h=r.red,p=r.green,m=r.blue,f=r.alpha;if(Color.equals(i,r)){for(S=0;S<s;S++)a[o++]=Color.floatToByte(l),a[o++]=Color.floatToByte(c),a[o++]=Color.floatToByte(u),a[o++]=Color.floatToByte(d);return o}for(var g=(h-l)/s,_=(p-c)/s,y=(m-u)/s,v=(f-d)/s,C=o,S=0;S<s;S++)a[C++]=Color.floatToByte(l+S*g),a[C++]=Color.floatToByte(c+S*_),a[C++]=Color.floatToByte(u+S*y),a[C++]=Color.floatToByte(d+S*v);return C}function SimplePolylineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.colors,r=defaultValue(e.colorsPerVertex,!1);this._positions=t,this._colors=i,this._colorsPerVertex=r,this._arcType=defaultValue(e.arcType,ArcType$1.GEODESIC),this._granularity=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.WGS84),this._workerName="createSimplePolylineGeometry";var n=1+t.length*Cartesian3.packedLength;n+=defined(i)?1+i.length*Color.packedLength:1,this.packedLength=n+Ellipsoid.packedLength+3}Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame=function(e,t){return defined(e)||(e=JulianDate.now()),defined(t)||(t=new Cartesian3),translation$1=computeSimonEarthMoonBarycenter(e,translation$1),t=Cartesian3.negate(translation$1,t),computeSimonEarth(e,translation$1),Cartesian3.subtract(t,translation$1,t),Matrix3.multiplyByVector(axesTransformation,t,t),t},Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame=function(e,t){return defined(e)||(e=JulianDate.now()),t=computeSimonMoon(e,t),Matrix3.multiplyByVector(axesTransformation,t,t),t},SimplePolylineGeometry.pack=function(e,t,i){var r;i=defaultValue(i,0);var n=e._positions,a=n.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian3.packedLength)Cartesian3.pack(n[r],t,i);var o=e._colors,a=defined(o)?o.length:0;for(t[i++]=a,r=0;r<a;++r,i+=Color.packedLength)Color.pack(o[r],t,i);return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,t[i++]=e._colorsPerVertex?1:0,t[i++]=e._arcType,t[i]=e._granularity,t},SimplePolylineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r=e[t++],n=new Array(r),a=0;a<r;++a,t+=Cartesian3.packedLength)n[a]=Cartesian3.unpack(e,t);var o=0<(r=e[t++])?new Array(r):void 0;for(a=0;a<r;++a,t+=Color.packedLength)o[a]=Color.unpack(e,t);var s=Ellipsoid.unpack(e,t);t+=Ellipsoid.packedLength;var l=1===e[t++],c=e[t++],u=e[t];return defined(i)?(i._positions=n,i._colors=o,i._ellipsoid=s,i._colorsPerVertex=l,i._arcType=c,i._granularity=u,i):new SimplePolylineGeometry({positions:n,colors:o,ellipsoid:s,colorsPerVertex:l,arcType:c,granularity:u})};var scratchArray1=new Array(2),scratchArray2=new Array(2),generateArcOptionsScratch={positions:scratchArray1,height:scratchArray2,ellipsoid:void 0,minDistance:void 0,granularity:void 0};function SphereGeometry(e){var t=defaultValue(e.radius,1),i={radii:new Cartesian3(t,t,t),stackPartitions:e.stackPartitions,slicePartitions:e.slicePartitions,vertexFormat:e.vertexFormat};this._ellipsoidGeometry=new EllipsoidGeometry(i),this._workerName="createSphereGeometry"}SimplePolylineGeometry.createGeometry=function(e){var t,i,r,n=e._positions,a=e._colors,o=e._colorsPerVertex,s=e._arcType,l=e._granularity,c=e._ellipsoid,u=CesiumMath.chordLength(l,c.maximumRadius),d=defined(a)&&!o,h=n.length,p=0;if(s===ArcType$1.GEODESIC||s===ArcType$1.RHUMB){var m,f,g=s===ArcType$1.GEODESIC?(m=CesiumMath.chordLength(l,c.maximumRadius),f=PolylinePipeline.numberOfPoints,PolylinePipeline.generateArc):(m=l,f=PolylinePipeline.numberOfPointsRhumbLine,PolylinePipeline.generateRhumbArc),_=PolylinePipeline.extractHeights(n,c),y=generateArcOptionsScratch;if(s===ArcType$1.GEODESIC?y.minDistance=u:y.granularity=l,y.ellipsoid=c,d){for(var v=0,C=0;C<h-1;C++)v+=f(n[C],n[C+1],m)+1;t=new Float64Array(3*v),r=new Uint8Array(4*v),y.positions=scratchArray1,y.height=scratchArray2;var S=0;for(C=0;C<h-1;++C){scratchArray1[0]=n[C],scratchArray1[1]=n[C+1],scratchArray2[0]=_[C],scratchArray2[1]=_[C+1];var T=g(y);if(defined(a))for(var x=T.length/3,b=a[C],E=0;E<x;++E)r[S++]=Color.floatToByte(b.red),r[S++]=Color.floatToByte(b.green),r[S++]=Color.floatToByte(b.blue),r[S++]=Color.floatToByte(b.alpha);t.set(T,p),p+=T.length}}else if(y.positions=n,y.height=_,t=new Float64Array(g(y)),defined(a)){for(r=new Uint8Array(t.length/3*4),C=0;C<h-1;++C)p=interpolateColors$1(n[C],n[C+1],a[C],a[C+1],u,r,p);var P=a[h-1];r[p++]=Color.floatToByte(P.red),r[p++]=Color.floatToByte(P.green),r[p++]=Color.floatToByte(P.blue),r[p++]=Color.floatToByte(P.alpha)}}else{i=d?2*h-2:h,t=new Float64Array(3*i),r=defined(a)?new Uint8Array(4*i):void 0;var A=0,w=0;for(C=0;C<h;++C){var D=n[C];if(d&&0<C&&(Cartesian3.pack(D,t,A),A+=3,b=a[C-1],r[w++]=Color.floatToByte(b.red),r[w++]=Color.floatToByte(b.green),r[w++]=Color.floatToByte(b.blue),r[w++]=Color.floatToByte(b.alpha)),d&&C===h-1)break;Cartesian3.pack(D,t,A),A+=3,defined(a)&&(b=a[C],r[w++]=Color.floatToByte(b.red),r[w++]=Color.floatToByte(b.green),r[w++]=Color.floatToByte(b.blue),r[w++]=Color.floatToByte(b.alpha))}}var M=new GeometryAttributes;M.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:t}),defined(a)&&(M.color=new GeometryAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:4,values:r,normalize:!0}));var I=2*((i=t.length/3)-1),R=IndexDatatype$1.createTypedArray(i,I),O=0;for(C=0;C<i-1;++C)R[O++]=C,R[O++]=C+1;return new Geometry({attributes:M,indices:R,primitiveType:PrimitiveType$1.LINES,boundingSphere:BoundingSphere.fromPoints(n)})},SphereGeometry.packedLength=EllipsoidGeometry.packedLength,SphereGeometry.pack=function(e,t,i){return EllipsoidGeometry.pack(e._ellipsoidGeometry,t,i)};var scratchEllipsoidGeometry=new EllipsoidGeometry,scratchOptions$k={radius:void 0,radii:new Cartesian3,vertexFormat:new VertexFormat,stackPartitions:void 0,slicePartitions:void 0};function SphereOutlineGeometry(e){var t=defaultValue(e.radius,1),i={radii:new Cartesian3(t,t,t),stackPartitions:e.stackPartitions,slicePartitions:e.slicePartitions,subdivisions:e.subdivisions};this._ellipsoidGeometry=new EllipsoidOutlineGeometry(i),this._workerName="createSphereOutlineGeometry"}SphereGeometry.unpack=function(e,t,i){var r=EllipsoidGeometry.unpack(e,t,scratchEllipsoidGeometry);return scratchOptions$k.vertexFormat=VertexFormat.clone(r._vertexFormat,scratchOptions$k.vertexFormat),scratchOptions$k.stackPartitions=r._stackPartitions,scratchOptions$k.slicePartitions=r._slicePartitions,defined(i)?(Cartesian3.clone(r._radii,scratchOptions$k.radii),i._ellipsoidGeometry=new EllipsoidGeometry(scratchOptions$k),i):(scratchOptions$k.radius=r._radii.x,new SphereGeometry(scratchOptions$k))},SphereGeometry.createGeometry=function(e){return EllipsoidGeometry.createGeometry(e._ellipsoidGeometry)},SphereOutlineGeometry.packedLength=EllipsoidOutlineGeometry.packedLength,SphereOutlineGeometry.pack=function(e,t,i){return EllipsoidOutlineGeometry.pack(e._ellipsoidGeometry,t,i)};var scratchEllipsoidGeometry$1=new EllipsoidOutlineGeometry,scratchOptions$l={radius:void 0,radii:new Cartesian3,stackPartitions:void 0,slicePartitions:void 0,subdivisions:void 0};function Spherical(e,t,i){this.clock=defaultValue(e,0),this.cone=defaultValue(t,0),this.magnitude=defaultValue(i,1)}function TerrainData(){DeveloperError.throwInstantiationError()}SphereOutlineGeometry.unpack=function(e,t,i){var r=EllipsoidOutlineGeometry.unpack(e,t,scratchEllipsoidGeometry$1);return scratchOptions$l.stackPartitions=r._stackPartitions,scratchOptions$l.slicePartitions=r._slicePartitions,scratchOptions$l.subdivisions=r._subdivisions,defined(i)?(Cartesian3.clone(r._radii,scratchOptions$l.radii),i._ellipsoidGeometry=new EllipsoidOutlineGeometry(scratchOptions$l),i):(scratchOptions$l.radius=r._radii.x,new SphereOutlineGeometry(scratchOptions$l))},SphereOutlineGeometry.createGeometry=function(e){return EllipsoidOutlineGeometry.createGeometry(e._ellipsoidGeometry)},Spherical.fromCartesian3=function(e,t){var i=e.x,r=e.y,n=e.z,a=i*i+r*r;return defined(t)||(t=new Spherical),t.clock=Math.atan2(r,i),t.cone=Math.atan2(Math.sqrt(a),n),t.magnitude=Math.sqrt(a+n*n),t},Spherical.clone=function(e,t){if(defined(e))return defined(t)?(t.clock=e.clock,t.cone=e.cone,t.magnitude=e.magnitude,t):new Spherical(e.clock,e.cone,e.magnitude)},Spherical.normalize=function(e,t){return defined(t)?(t.clock=e.clock,t.cone=e.cone,t.magnitude=1,t):new Spherical(e.clock,e.cone,1)},Spherical.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e.clock===t.clock&&e.cone===t.cone&&e.magnitude===t.magnitude},Spherical.equalsEpsilon=function(e,t,i){return i=defaultValue(i,0),e===t||defined(e)&&defined(t)&&Math.abs(e.clock-t.clock)<=i&&Math.abs(e.cone-t.cone)<=i&&Math.abs(e.magnitude-t.magnitude)<=i},Spherical.prototype.equals=function(e){return Spherical.equals(this,e)},Spherical.prototype.clone=function(e){return Spherical.clone(this,e)},Spherical.prototype.equalsEpsilon=function(e,t){return Spherical.equalsEpsilon(this,e,t)},Spherical.prototype.toString=function(){return"("+this.clock+", "+this.cone+", "+this.magnitude+")"},Object.defineProperties(TerrainData.prototype,{credits:{get:DeveloperError.throwInstantiationError},waterMask:{get:DeveloperError.throwInstantiationError}}),TerrainData.prototype.interpolateHeight=DeveloperError.throwInstantiationError,TerrainData.prototype.isChildAvailable=DeveloperError.throwInstantiationError,TerrainData.prototype.createMesh=DeveloperError.throwInstantiationError,TerrainData.prototype.upsample=DeveloperError.throwInstantiationError,TerrainData.prototype.wasCreatedByUpsampling=DeveloperError.throwInstantiationError;var TileEdge={WEST:0,NORTH:1,EAST:2,SOUTH:3,NORTHWEST:4,NORTHEAST:5,SOUTHWEST:6,SOUTHEAST:7};function TilingScheme(e){}function compareIntervalStartTimes(e,t){return JulianDate.compare(e.start,t.start)}function TimeIntervalCollection(e){if(this._intervals=[],this._changedEvent=new Event,defined(e))for(var t=e.length,i=0;i<t;i++)this.addInterval(e[i])}Object.defineProperties(TilingScheme.prototype,{ellipsoid:{get:DeveloperError.throwInstantiationError},rectangle:{get:DeveloperError.throwInstantiationError},projection:{get:DeveloperError.throwInstantiationError}}),TilingScheme.prototype.getNumberOfXTilesAtLevel=DeveloperError.throwInstantiationError,TilingScheme.prototype.getNumberOfYTilesAtLevel=DeveloperError.throwInstantiationError,TilingScheme.prototype.rectangleToNativeRectangle=DeveloperError.throwInstantiationError,TilingScheme.prototype.tileXYToNativeRectangle=DeveloperError.throwInstantiationError,TilingScheme.prototype.tileXYToRectangle=DeveloperError.throwInstantiationError,TilingScheme.prototype.positionToTileXY=DeveloperError.throwInstantiationError,Object.defineProperties(TimeIntervalCollection.prototype,{changedEvent:{get:function(){return this._changedEvent}},start:{get:function(){var e=this._intervals;return 0===e.length?void 0:e[0].start}},isStartIncluded:{get:function(){var e=this._intervals;return 0!==e.length&&e[0].isStartIncluded}},stop:{get:function(){var e=this._intervals,t=e.length;return 0===t?void 0:e[t-1].stop}},isStopIncluded:{get:function(){var e=this._intervals,t=e.length;return 0!==t&&e[t-1].isStopIncluded}},length:{get:function(){return this._intervals.length}},isEmpty:{get:function(){return 0===this._intervals.length}}}),TimeIntervalCollection.prototype.equals=function(e,t){if(this===e)return!0;if(!(e instanceof TimeIntervalCollection))return!1;var i=this._intervals,r=e._intervals,n=i.length;if(n!==r.length)return!1;for(var a=0;a<n;a++)if(!TimeInterval.equals(i[a],r[a],t))return!1;return!0},TimeIntervalCollection.prototype.get=function(e){return this._intervals[e]},TimeIntervalCollection.prototype.removeAll=function(){0<this._intervals.length&&(this._intervals.length=0,this._changedEvent.raiseEvent(this))},TimeIntervalCollection.prototype.findIntervalContainingDate=function(e){var t=this.indexOf(e);return 0<=t?this._intervals[t]:void 0},TimeIntervalCollection.prototype.findDataForIntervalContainingDate=function(e){var t=this.indexOf(e);return 0<=t?this._intervals[t].data:void 0},TimeIntervalCollection.prototype.contains=function(e){return 0<=this.indexOf(e)};var indexOfScratch=new TimeInterval;TimeIntervalCollection.prototype.indexOf=function(e){var t=this._intervals;indexOfScratch.start=e,indexOfScratch.stop=e;var i=binarySearch(t,indexOfScratch,compareIntervalStartTimes);return 0<=i?t[i].isStartIncluded?i:0<i&&t[i-1].stop.equals(e)&&t[i-1].isStopIncluded?i-1:~i:0<(i=~i)&&i-1<t.length&&TimeInterval.contains(t[i-1],e)?i-1:~i},TimeIntervalCollection.prototype.findInterval=function(e){for(var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).start,i=e.stop,r=e.isStartIncluded,n=e.isStopIncluded,a=this._intervals,o=0,s=a.length;o<s;o++){var l=a[o];if((!defined(t)||l.start.equals(t))&&(!defined(i)||l.stop.equals(i))&&(!defined(r)||l.isStartIncluded===r)&&(!defined(n)||l.isStopIncluded===n))return a[o]}},TimeIntervalCollection.prototype.addInterval=function(e,t){if(!e.isEmpty){var i=this._intervals;if(0===i.length||JulianDate.greaterThan(e.start,i[i.length-1].stop))return i.push(e),void this._changedEvent.raiseEvent(this);var r,n=binarySearch(i,e,compareIntervalStartTimes);for(n<0?n=~n:0<n&&e.isStartIncluded&&i[n-1].isStartIncluded&&i[n-1].start.equals(e.start)?--n:n<i.length&&!e.isStartIncluded&&i[n].isStartIncluded&&i[n].start.equals(e.start)&&++n,0<n&&(0<(r=JulianDate.compare(i[n-1].stop,e.start))||0===r&&(i[n-1].isStopIncluded||e.isStartIncluded))&&((defined(t)?t(i[n-1].data,e.data):i[n-1].data===e.data)?(e=JulianDate.greaterThan(e.stop,i[n-1].stop)?new TimeInterval({start:i[n-1].start,stop:e.stop,isStartIncluded:i[n-1].isStartIncluded,isStopIncluded:e.isStopIncluded,data:e.data}):new TimeInterval({start:i[n-1].start,stop:i[n-1].stop,isStartIncluded:i[n-1].isStartIncluded,isStopIncluded:i[n-1].isStopIncluded||e.stop.equals(i[n-1].stop)&&e.isStopIncluded,data:e.data}),i.splice(n-1,1),--n):((0<(r=JulianDate.compare(i[n-1].stop,e.stop))||0===r&&i[n-1].isStopIncluded&&!e.isStopIncluded)&&i.splice(n,0,new TimeInterval({start:e.stop,stop:i[n-1].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:i[n-1].isStopIncluded,data:i[n-1].data})),i[n-1]=new TimeInterval({start:i[n-1].start,stop:e.start,isStartIncluded:i[n-1].isStartIncluded,isStopIncluded:!e.isStartIncluded,data:i[n-1].data})));n<i.length&&(0<(r=JulianDate.compare(e.stop,i[n].start))||0===r&&(e.isStopIncluded||i[n].isStartIncluded));)if(defined(t)?t(i[n].data,e.data):i[n].data===e.data)e=new TimeInterval({start:e.start,stop:JulianDate.greaterThan(i[n].stop,e.stop)?i[n].stop:e.stop,isStartIncluded:e.isStartIncluded,isStopIncluded:JulianDate.greaterThan(i[n].stop,e.stop)?i[n].isStopIncluded:e.isStopIncluded,data:e.data}),i.splice(n,1);else{if(i[n]=new TimeInterval({start:e.stop,stop:i[n].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:i[n].isStopIncluded,data:i[n].data}),!i[n].isEmpty)break;i.splice(n,1)}i.splice(n,0,e),this._changedEvent.raiseEvent(this)}},TimeIntervalCollection.prototype.removeInterval=function(e){if(e.isEmpty)return!1;var t=this._intervals,i=binarySearch(t,e,compareIntervalStartTimes);i<0&&(i=~i);var r=!1;for(0<i&&(JulianDate.greaterThan(t[i-1].stop,e.start)||t[i-1].stop.equals(e.start)&&t[i-1].isStopIncluded&&e.isStartIncluded)&&(r=!0,(JulianDate.greaterThan(t[i-1].stop,e.stop)||t[i-1].isStopIncluded&&!e.isStopIncluded&&t[i-1].stop.equals(e.stop))&&t.splice(i,0,new TimeInterval({start:e.stop,stop:t[i-1].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:t[i-1].isStopIncluded,data:t[i-1].data})),t[i-1]=new TimeInterval({start:t[i-1].start,stop:e.start,isStartIncluded:t[i-1].isStartIncluded,isStopIncluded:!e.isStartIncluded,data:t[i-1].data})),i<t.length&&!e.isStartIncluded&&t[i].isStartIncluded&&e.start.equals(t[i].start)&&(r=!0,t.splice(i,0,new TimeInterval({start:t[i].start,stop:t[i].start,isStartIncluded:!0,isStopIncluded:!0,data:t[i].data})),++i);i<t.length&&JulianDate.greaterThan(e.stop,t[i].stop);)r=!0,t.splice(i,1);return i<t.length&&e.stop.equals(t[i].stop)&&(r=!0,!e.isStopIncluded&&t[i].isStopIncluded?i+1<t.length&&t[i+1].start.equals(e.stop)&&t[i].data===t[i+1].data?(t.splice(i,1),t[i]=new TimeInterval({start:t[i].start,stop:t[i].stop,isStartIncluded:!0,isStopIncluded:t[i].isStopIncluded,data:t[i].data})):t[i]=new TimeInterval({start:e.stop,stop:e.stop,isStartIncluded:!0,isStopIncluded:!0,data:t[i].data}):t.splice(i,1)),i<t.length&&(JulianDate.greaterThan(e.stop,t[i].start)||e.stop.equals(t[i].start)&&e.isStopIncluded&&t[i].isStartIncluded)&&(r=!0,t[i]=new TimeInterval({start:e.stop,stop:t[i].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:t[i].isStopIncluded,data:t[i].data})),r&&this._changedEvent.raiseEvent(this),r},TimeIntervalCollection.prototype.intersect=function(e,t,i){for(var r=new TimeIntervalCollection,n=0,a=0,o=this._intervals,s=e._intervals;n<o.length&&a<s.length;){var l,c=o[n],u=s[a];JulianDate.lessThan(c.stop,u.start)?++n:JulianDate.lessThan(u.stop,c.start)?++a:((defined(i)||defined(t)&&t(c.data,u.data)||!defined(t)&&u.data===c.data)&&((l=TimeInterval.intersect(c,u,new TimeInterval,i)).isEmpty||r.addInterval(l,t)),JulianDate.lessThan(c.stop,u.stop)||c.stop.equals(u.stop)&&!c.isStopIncluded&&u.isStopIncluded?++n:++a)}return r},TimeIntervalCollection.fromJulianDateArray=function(e,t){defined(t)||(t=new TimeIntervalCollection);var i=e.julianDates,r=i.length,n=e.dataCallback,a=defaultValue(e.isStartIncluded,!0),o=defaultValue(e.isStopIncluded,!0),s=defaultValue(e.leadingInterval,!1),l=defaultValue(e.trailingInterval,!1),c=0;s&&(++c,(d=new TimeInterval({start:Iso8601.MINIMUM_VALUE,stop:i[0],isStartIncluded:!0,isStopIncluded:!a})).data=defined(n)?n(d,t.length):t.length,t.addInterval(d));for(var u=0;u<r-1;++u){var d,h=i[u],p=i[u+1];(d=new TimeInterval({start:h,stop:p,isStartIncluded:t.length!==c||a,isStopIncluded:u===r-2&&o})).data=defined(n)?n(d,t.length):t.length,t.addInterval(d),0}return l&&((d=new TimeInterval({start:i[r-1],stop:Iso8601.MAXIMUM_VALUE,isStartIncluded:!o,isStopIncluded:!0})).data=defined(n)?n(d,t.length):t.length,t.addInterval(d)),t};var scratchGregorianDate=new GregorianDate,monthLengths=[0,31,28,31,30,31,30,31,31,30,31,30,31];function addToDate(e,t,i){defined(i)||(i=new JulianDate),JulianDate.toGregorianDate(e,scratchGregorianDate);var r=scratchGregorianDate.millisecond+t.millisecond,n=scratchGregorianDate.second+t.second,a=scratchGregorianDate.minute+t.minute,o=scratchGregorianDate.hour+t.hour,s=scratchGregorianDate.day+t.day,l=scratchGregorianDate.month+t.month,c=scratchGregorianDate.year+t.year;for(1e3<=r&&(n+=Math.floor(r/1e3),r%=1e3),60<=n&&(a+=Math.floor(n/60),n%=60),60<=a&&(o+=Math.floor(a/60),a%=60),24<=o&&(s+=Math.floor(o/24),o%=24),monthLengths[2]=isLeapYear(c)?29:28;s>monthLengths[l]||13<=l;)s>monthLengths[l]&&(s-=monthLengths[l],++l),13<=l&&(--l,c+=Math.floor(l/12),l%=12,++l),monthLengths[2]=isLeapYear(c)?29:28;return scratchGregorianDate.millisecond=r,scratchGregorianDate.second=n,scratchGregorianDate.minute=a,scratchGregorianDate.hour=o,scratchGregorianDate.day=s,scratchGregorianDate.month=l,scratchGregorianDate.year=c,JulianDate.fromGregorianDate(scratchGregorianDate,i)}var scratchJulianDate=new JulianDate,durationRegex=/P(?:([\d.,]+)Y)?(?:([\d.,]+)M)?(?:([\d.,]+)W)?(?:([\d.,]+)D)?(?:T(?:([\d.,]+)H)?(?:([\d.,]+)M)?(?:([\d.,]+)S)?)?/;function parseDuration(e,t){if(defined(e)&&0!==e.length){if(t.year=0,t.month=0,t.day=0,t.hour=0,t.minute=0,t.second=0,"P"===e[t.millisecond=0]){var i,r=e.match(durationRegex);if(!defined(r))return;defined(r[1])&&(t.year=Number(r[1].replace(",","."))),defined(r[2])&&(t.month=Number(r[2].replace(",","."))),defined(r[3])&&(t.day=7*Number(r[3].replace(",","."))),defined(r[4])&&(t.day+=Number(r[4].replace(",","."))),defined(r[5])&&(t.hour=Number(r[5].replace(",","."))),defined(r[6])&&(t.minute=Number(r[6].replace(",","."))),defined(r[7])&&(i=Number(r[7].replace(",",".")),t.second=Math.floor(i),t.millisecond=i%1*1e3)}else"Z"!==e[e.length-1]&&(e+="Z"),JulianDate.toGregorianDate(JulianDate.fromIso8601(e,scratchJulianDate),t);return t.year||t.month||t.day||t.hour||t.minute||t.second||t.millisecond}}var scratchDuration=new GregorianDate;TimeIntervalCollection.fromIso8601=function(e,t){var i=e.iso8601.split("/"),r=JulianDate.fromIso8601(i[0]),n=JulianDate.fromIso8601(i[1]),a=[];if(parseDuration(i[2],scratchDuration)){var o=JulianDate.clone(r);for(a.push(o);JulianDate.compare(o,n)<0;){o=addToDate(o,scratchDuration);JulianDate.compare(n,o)<=0&&JulianDate.clone(n,o),a.push(o)}}else a.push(r,n);return TimeIntervalCollection.fromJulianDateArray({julianDates:a,isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)},TimeIntervalCollection.fromIso8601DateArray=function(e,t){return TimeIntervalCollection.fromJulianDateArray({julianDates:e.iso8601Dates.map(function(e){return JulianDate.fromIso8601(e)}),isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)},TimeIntervalCollection.fromIso8601DurationArray=function(e,t){for(var i,r,n=e.epoch,a=e.iso8601Durations,o=defaultValue(e.relativeToPrevious,!1),s=[],l=a.length,c=0;c<l;++c)!parseDuration(a[c],scratchDuration)&&0!==c||(i=o&&defined(r)?addToDate(r,scratchDuration):addToDate(n,scratchDuration),s.push(i),r=i);return TimeIntervalCollection.fromJulianDateArray({julianDates:s,isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)};var defaultScale=new Cartesian3(1,1,1),defaultTranslation=Cartesian3.ZERO,defaultRotation=Quaternion.IDENTITY;function TranslationRotationScale(e,t,i){this.translation=Cartesian3.clone(defaultValue(e,defaultTranslation)),this.rotation=Quaternion.clone(defaultValue(t,defaultRotation)),this.scale=Cartesian3.clone(defaultValue(i,defaultScale))}TranslationRotationScale.prototype.equals=function(e){return this===e||defined(e)&&Cartesian3.equals(this.translation,e.translation)&&Quaternion.equals(this.rotation,e.rotation)&&Cartesian3.equals(this.scale,e.scale)};var context2DsByWidthAndHeight={};function getImagePixels(e,t,i){defined(t)||(t=e.width),defined(i)||(i=e.height);var r=context2DsByWidthAndHeight[t];defined(r)||(r={},context2DsByWidthAndHeight[t]=r);var n,a=r[i];return defined(a)||((n=document.createElement("canvas")).width=t,n.height=i,(a=n.getContext("2d")).globalCompositeOperation="copy",r[i]=a),a.drawImage(e,0,0,t,i),a.getImageData(0,0,t,i).data}function DataRectangle(e,t){this.rectangle=e,this.maxLevel=t}function VRTheWorldTerrainProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=Resource.createIfNeeded(e.url);this._resource=t,this._errorEvent=new Event,this._ready=!1,this._readyPromise=when.defer(),this._terrainDataStructure={heightScale:.001,heightOffset:-1e3,elementsPerHeight:3,stride:4,elementMultiplier:256,isBigEndian:!0,lowestEncodedHeight:0,highestEncodedHeight:16777215};var i=e.credit;"string"==typeof i&&(i=new Credit(i)),this._credit=i,this._tilingScheme=void 0,this._rectangles=[];var r,d=this,h=defaultValue(e.ellipsoid,Ellipsoid.WGS84);function n(e){var t=e.getElementsByTagName("SRS")[0].textContent;if("EPSG:4326"===t){d._tilingScheme=new GeographicTilingScheme({ellipsoid:h});var i=e.getElementsByTagName("TileFormat")[0];d._heightmapWidth=parseInt(i.getAttribute("width"),10),d._heightmapHeight=parseInt(i.getAttribute("height"),10),d._levelZeroMaximumGeometricError=TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(h,Math.min(d._heightmapWidth,d._heightmapHeight),d._tilingScheme.getNumberOfXTilesAtLevel(0));for(var r=e.getElementsByTagName("DataExtent"),n=0;n<r.length;++n){var a=r[n],o=CesiumMath.toRadians(parseFloat(a.getAttribute("minx"))),s=CesiumMath.toRadians(parseFloat(a.getAttribute("miny"))),l=CesiumMath.toRadians(parseFloat(a.getAttribute("maxx"))),c=CesiumMath.toRadians(parseFloat(a.getAttribute("maxy"))),u=parseInt(a.getAttribute("maxlevel"),10);d._rectangles.push(new DataRectangle(new Rectangle(o,s,l,c),u))}d._ready=!0,d._readyPromise.resolve(!0)}else p("SRS "+t+" is not supported.")}function p(e){var t=defaultValue(e,"An error occurred while accessing "+d._resource.url+".");r=TileProviderError.handleError(r,d,d._errorEvent,t,void 0,void 0,void 0,a)}function a(){when(d._resource.fetchXML(),n,p)}a()}Object.defineProperties(VRTheWorldTerrainProvider.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}}),VRTheWorldTerrainProvider.prototype.requestTileGeometry=function(t,i,r,e){var n=this._tilingScheme.getNumberOfYTilesAtLevel(r),a=this._resource.getDerivedResource({url:r+"/"+t+"/"+(n-i-1)+".tif",queryParameters:{cesium:!0},request:e}).fetchImage({preferImageBitmap:!0});if(defined(a)){var o=this;return when(a).then(function(e){return new HeightmapTerrainData({buffer:getImagePixels(e),width:o._heightmapWidth,height:o._heightmapHeight,childTileMask:getChildMask(o,t,i,r),structure:o._terrainDataStructure})})}},VRTheWorldTerrainProvider.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)};var rectangleScratch$4=new Rectangle;function getChildMask(e,t,i,r){for(var n=e._tilingScheme,a=e._rectangles,o=n.tileXYToRectangle(t,i,r),s=0,l=0;l<a.length&&15!==s;++l){var c,u=a[l];u.maxLevel<=r||(c=u.rectangle,defined(Rectangle.intersection(c,o,rectangleScratch$4))&&(isTileInRectangle(n,c,2*t,2*i,r+1)&&(s|=4),isTileInRectangle(n,c,2*t+1,2*i,r+1)&&(s|=8),isTileInRectangle(n,c,2*t,2*i+1,r+1)&&(s|=1),isTileInRectangle(n,c,2*t+1,2*i+1,r+1)&&(s|=2)))}return s}function isTileInRectangle(e,t,i,r,n){var a=e.tileXYToRectangle(i,r,n);return defined(Rectangle.intersection(a,t,rectangleScratch$4))}function VideoSynchronizer(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._clock=void 0,this._element=void 0,this._clockSubscription=void 0,this._seekFunction=void 0,this._lastPlaybackRate=void 0,this.clock=e.clock,this.element=e.element,this.epoch=defaultValue(e.epoch,Iso8601.MINIMUM_VALUE),this.tolerance=defaultValue(e.tolerance,1),this._seeking=!1,this._seekFunction=void 0,this._firstTickAfterSeek=!1}function createSeekFunction(e){return function(){e._seeking=!1,e._firstTickAfterSeek=!0}}VRTheWorldTerrainProvider.prototype.getTileDataAvailable=function(e,t,i){},VRTheWorldTerrainProvider.prototype.loadTileDataAvailability=function(e,t,i){},Object.defineProperties(VideoSynchronizer.prototype,{clock:{get:function(){return this._clock},set:function(e){var t=this._clock;t!==e&&(defined(t)&&(this._clockSubscription(),this._clockSubscription=void 0),defined(e)&&(this._clockSubscription=e.onTick.addEventListener(VideoSynchronizer.prototype._onTick,this)),this._clock=e)}},element:{get:function(){return this._element},set:function(e){var t=this._element;t!==e&&(defined(t)&&t.removeEventListener("seeked",this._seekFunction,!1),defined(e)&&(this._seeking=!1,this._seekFunction=createSeekFunction(this),e.addEventListener("seeked",this._seekFunction,!1)),this._element=e,this._seeking=!1,this._firstTickAfterSeek=!1)}}}),VideoSynchronizer.prototype.destroy=function(){return this.element=void 0,this.clock=void 0,destroyObject(this)},VideoSynchronizer.prototype.isDestroyed=function(){return!1},VideoSynchronizer.prototype._trySetPlaybackRate=function(e){if(this._lastPlaybackRate!==e.multiplier){var t=this._element;try{t.playbackRate=e.multiplier}catch(e){t.playbackRate=0}this._lastPlaybackRate=e.multiplier}},VideoSynchronizer.prototype._onTick=function(e){var t,i,r,n,a,o,s,l,c,u=this._element;!defined(u)||u.readyState<2||(t=u.paused,(i=e.shouldAnimate)===t&&(i?u.play():u.pause()),this._seeking||this._firstTickAfterSeek?this._firstTickAfterSeek=!1:(this._trySetPlaybackRate(e),r=e.currentTime,n=defaultValue(this.epoch,Iso8601.MINIMUM_VALUE),a=JulianDate.secondsDifference(r,n),o=u.duration,s=u.currentTime,l=u.loop?((a%=o)<0&&(a=o-a),a):o<a?o:a<0?0:a,c=i?defaultValue(this.tolerance,1):.001,Math.abs(l-s)>c&&(this._seeking=!0,u.currentTime=l)))};var WallGeometryLibrary={};function latLonEquals(e,t){return CesiumMath.equalsEpsilon(e.latitude,t.latitude,CesiumMath.EPSILON10)&&CesiumMath.equalsEpsilon(e.longitude,t.longitude,CesiumMath.EPSILON10)}var scratchCartographic1$2=new Cartographic,scratchCartographic2$1=new Cartographic;function removeDuplicates(e,t,i,r){var n=(t=arrayRemoveDuplicates(t,Cartesian3.equalsEpsilon)).length;if(!(n<2)){var a=defined(r),o=defined(i),s=new Array(n),l=new Array(n),c=new Array(n),u=t[0];s[0]=u;var d=e.cartesianToCartographic(u,scratchCartographic1$2);o&&(d.height=i[0]),l[0]=d.height,c[0]=a?r[0]:0;for(var h=l[0]===c[0],p=1,m=1;m<n;++m){var f=t[m],g=e.cartesianToCartographic(f,scratchCartographic2$1);o&&(g.height=i[m]),h=h&&0===g.height,latLonEquals(d,g)?d.height<g.height&&(l[p-1]=g.height):(s[p]=f,l[p]=g.height,c[p]=a?r[m]:0,h=h&&l[p]===c[p],Cartographic.clone(g,d),++p)}if(!(h||p<2))return s.length=p,l.length=p,c.length=p,{positions:s,topHeights:l,bottomHeights:c}}}var positionsArrayScratch=new Array(2),heightsArrayScratch=new Array(2),generateArcOptionsScratch$1={positions:void 0,height:void 0,granularity:void 0,ellipsoid:void 0};WallGeometryLibrary.computePositions=function(e,t,i,r,n,a){var o=removeDuplicates(e,t,i,r);if(defined(o)){t=o.positions,i=o.topHeights,r=o.bottomHeights;var s,l,c=t.length,u=c-2,d=CesiumMath.chordLength(n,e.maximumRadius),h=generateArcOptionsScratch$1;if(h.minDistance=d,h.ellipsoid=e,a){for(var p=0,m=0;m<c-1;m++)p+=PolylinePipeline.numberOfPoints(t[m],t[m+1],d)+1;s=new Float64Array(3*p),l=new Float64Array(3*p);var f=positionsArrayScratch,g=heightsArrayScratch;h.positions=f,h.height=g;var _=0;for(m=0;m<c-1;m++){f[0]=t[m],f[1]=t[m+1],g[0]=i[m],g[1]=i[m+1];var y=PolylinePipeline.generateArc(h);s.set(y,_),g[0]=r[m],g[1]=r[m+1],l.set(PolylinePipeline.generateArc(h),_),_+=y.length}}else h.positions=t,h.height=i,s=new Float64Array(PolylinePipeline.generateArc(h)),h.height=r,l=new Float64Array(PolylinePipeline.generateArc(h));return{bottomPositions:l,topPositions:s,numCorners:u}}};var scratchCartesian3Position1=new Cartesian3,scratchCartesian3Position2=new Cartesian3,scratchCartesian3Position4=new Cartesian3,scratchCartesian3Position5=new Cartesian3,scratchBitangent$4=new Cartesian3,scratchTangent$4=new Cartesian3,scratchNormal$6=new Cartesian3;function WallGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.maximumHeights,r=e.minimumHeights,n=defaultValue(e.vertexFormat,VertexFormat.DEFAULT),a=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),o=defaultValue(e.ellipsoid,Ellipsoid.WGS84);this._positions=t,this._minimumHeights=r,this._maximumHeights=i,this._vertexFormat=VertexFormat.clone(n),this._granularity=a,this._ellipsoid=Ellipsoid.clone(o),this._workerName="createWallGeometry";var s=1+t.length*Cartesian3.packedLength+2;defined(r)&&(s+=r.length),defined(i)&&(s+=i.length),this.packedLength=s+Ellipsoid.packedLength+VertexFormat.packedLength+1}WallGeometry.pack=function(e,t,i){var r;i=defaultValue(i,0);var n=e._positions,a=n.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian3.packedLength)Cartesian3.pack(n[r],t,i);var o=e._minimumHeights,a=defined(o)?o.length:0;if(t[i++]=a,defined(o))for(r=0;r<a;++r)t[i++]=o[r];var s=e._maximumHeights;if(a=defined(s)?s.length:0,t[i++]=a,defined(s))for(r=0;r<a;++r)t[i++]=s[r];return Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,VertexFormat.pack(e._vertexFormat,t,i),t[i+=VertexFormat.packedLength]=e._granularity,t};var scratchEllipsoid$c=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchVertexFormat$c=new VertexFormat,scratchOptions$m={positions:void 0,minimumHeights:void 0,maximumHeights:void 0,ellipsoid:scratchEllipsoid$c,vertexFormat:scratchVertexFormat$c,granularity:void 0};WallGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r,n,a=e[t++],o=new Array(a),s=0;s<a;++s,t+=Cartesian3.packedLength)o[s]=Cartesian3.unpack(e,t);if(0<(a=e[t++]))for(r=new Array(a),s=0;s<a;++s)r[s]=e[t++];if(0<(a=e[t++]))for(n=new Array(a),s=0;s<a;++s)n[s]=e[t++];var l=Ellipsoid.unpack(e,t,scratchEllipsoid$c);t+=Ellipsoid.packedLength;var c=VertexFormat.unpack(e,t,scratchVertexFormat$c),u=e[t+=VertexFormat.packedLength];return defined(i)?(i._positions=o,i._minimumHeights=r,i._maximumHeights=n,i._ellipsoid=Ellipsoid.clone(l,i._ellipsoid),i._vertexFormat=VertexFormat.clone(c,i._vertexFormat),i._granularity=u,i):(scratchOptions$m.positions=o,scratchOptions$m.minimumHeights=r,scratchOptions$m.maximumHeights=n,scratchOptions$m.granularity=u,new WallGeometry(scratchOptions$m))},WallGeometry.fromConstantHeights=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.minimumHeight,r=e.maximumHeight,n=defined(i),a=defined(r);if(n||a)for(var o=t.length,s=n?new Array(o):void 0,l=a?new Array(o):void 0,c=0;c<o;++c)n&&(s[c]=i),a&&(l[c]=r);return new WallGeometry({positions:t,maximumHeights:l,minimumHeights:s,ellipsoid:e.ellipsoid,vertexFormat:e.vertexFormat})},WallGeometry.createGeometry=function(e){var t=e._positions,i=e._minimumHeights,r=e._maximumHeights,n=e._vertexFormat,a=e._granularity,o=e._ellipsoid,s=WallGeometryLibrary.computePositions(o,t,r,i,a,!0);if(defined(s)){for(var l=s.bottomPositions,c=s.topPositions,u=s.numCorners,d=c.length,h=2*d,p=n.position?new Float64Array(h):void 0,m=n.normal?new Float32Array(h):void 0,f=n.tangent?new Float32Array(h):void 0,g=n.bitangent?new Float32Array(h):void 0,_=n.st?new Float32Array(h/3*2):void 0,y=0,v=0,C=0,S=0,T=0,x=scratchNormal$6,b=scratchTangent$4,E=scratchBitangent$4,P=!0,A=0,w=1/((d/=3)-u-1),D=0;D<d;++D){var M,I,R,O,L=3*D,F=Cartesian3.fromArray(c,L,scratchCartesian3Position1),N=Cartesian3.fromArray(l,L,scratchCartesian3Position2);n.position&&(p[y++]=N.x,p[y++]=N.y,p[y++]=N.z,p[y++]=F.x,p[y++]=F.y,p[y++]=F.z),n.st&&(_[T++]=A,_[T++]=0,_[T++]=A,_[T++]=1),(n.normal||n.tangent||n.bitangent)&&(M=Cartesian3.clone(Cartesian3.ZERO,scratchCartesian3Position5),I=Cartesian3.subtract(F,o.geodeticSurfaceNormal(F,scratchCartesian3Position2),scratchCartesian3Position2),D+1<d&&(M=Cartesian3.fromArray(c,3+L,scratchCartesian3Position5)),P&&(R=Cartesian3.subtract(M,F,scratchCartesian3Position4),O=Cartesian3.subtract(I,F,scratchCartesian3Position1),x=Cartesian3.normalize(Cartesian3.cross(O,R,x),x),P=!1),Cartesian3.equalsEpsilon(F,M,CesiumMath.EPSILON10)?P=!0:(A+=w,n.tangent&&(b=Cartesian3.normalize(Cartesian3.subtract(M,F,b),b)),n.bitangent&&(E=Cartesian3.normalize(Cartesian3.cross(x,b,E),E))),n.normal&&(m[v++]=x.x,m[v++]=x.y,m[v++]=x.z,m[v++]=x.x,m[v++]=x.y,m[v++]=x.z),n.tangent&&(f[S++]=b.x,f[S++]=b.y,f[S++]=b.z,f[S++]=b.x,f[S++]=b.y,f[S++]=b.z),n.bitangent&&(g[C++]=E.x,g[C++]=E.y,g[C++]=E.z,g[C++]=E.x,g[C++]=E.y,g[C++]=E.z))}var B=new GeometryAttributes;n.position&&(B.position=new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:p})),n.normal&&(B.normal=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:m})),n.tangent&&(B.tangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:f})),n.bitangent&&(B.bitangent=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:g})),n.st&&(B.st=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:_}));var V=h/3;h-=6*(u+1);var k=IndexDatatype$1.createTypedArray(V,h),z=0;for(D=0;D<V-2;D+=2){var $,U,G=D,H=D+2,W=Cartesian3.fromArray(p,3*G,scratchCartesian3Position1),q=Cartesian3.fromArray(p,3*H,scratchCartesian3Position2);Cartesian3.equalsEpsilon(W,q,CesiumMath.EPSILON10)||($=D+1,U=D+3,k[z++]=$,k[z++]=G,k[z++]=U,k[z++]=U,k[z++]=G,k[z++]=H)}return new Geometry({attributes:B,indices:k,primitiveType:PrimitiveType$1.TRIANGLES,boundingSphere:new BoundingSphere.fromVertices(p)})}};var scratchCartesian3Position1$1=new Cartesian3,scratchCartesian3Position2$1=new Cartesian3;function WallOutlineGeometry(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.maximumHeights,r=e.minimumHeights,n=defaultValue(e.granularity,CesiumMath.RADIANS_PER_DEGREE),a=defaultValue(e.ellipsoid,Ellipsoid.WGS84);this._positions=t,this._minimumHeights=r,this._maximumHeights=i,this._granularity=n,this._ellipsoid=Ellipsoid.clone(a),this._workerName="createWallOutlineGeometry";var o=1+t.length*Cartesian3.packedLength+2;defined(r)&&(o+=r.length),defined(i)&&(o+=i.length),this.packedLength=o+Ellipsoid.packedLength+1}WallOutlineGeometry.pack=function(e,t,i){var r;i=defaultValue(i,0);var n=e._positions,a=n.length;for(t[i++]=a,r=0;r<a;++r,i+=Cartesian3.packedLength)Cartesian3.pack(n[r],t,i);var o=e._minimumHeights,a=defined(o)?o.length:0;if(t[i++]=a,defined(o))for(r=0;r<a;++r)t[i++]=o[r];var s=e._maximumHeights;if(a=defined(s)?s.length:0,t[i++]=a,defined(s))for(r=0;r<a;++r)t[i++]=s[r];return Ellipsoid.pack(e._ellipsoid,t,i),t[i+=Ellipsoid.packedLength]=e._granularity,t};var scratchEllipsoid$d=Ellipsoid.clone(Ellipsoid.UNIT_SPHERE),scratchOptions$n={positions:void 0,minimumHeights:void 0,maximumHeights:void 0,ellipsoid:scratchEllipsoid$d,granularity:void 0},implementation$1;function WeightSpline(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).weights,i=e.times;this._times=i,this._weights=t,this._count=t.length/i.length,this._lastTimeIndex=0}function arraySlice(e,t,i){if("function"==typeof e.slice)return e.slice(t,i);for(var r=Array.prototype.slice.call(e,t,i),n=FeatureDetection.typedArrayTypes,a=n.length,o=0;o<a;++o)if(e instanceof n[o]){r=new n[o](r);break}return r}function cancelAnimationFramePolyfill(e){implementation$1(e)}function createGuid(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}function createWorldTerrain(e){return e=defaultValue(e,defaultValue.EMPTY_OBJECT),new CesiumTerrainProvider({url:IonResource.fromAssetId(1),requestVertexNormals:defaultValue(e.requestVertexNormals,!1),requestWaterMask:defaultValue(e.requestWaterMask,!1)})}WallOutlineGeometry.unpack=function(e,t,i){t=defaultValue(t,0);for(var r,n,a=e[t++],o=new Array(a),s=0;s<a;++s,t+=Cartesian3.packedLength)o[s]=Cartesian3.unpack(e,t);if(0<(a=e[t++]))for(r=new Array(a),s=0;s<a;++s)r[s]=e[t++];if(0<(a=e[t++]))for(n=new Array(a),s=0;s<a;++s)n[s]=e[t++];var l=Ellipsoid.unpack(e,t,scratchEllipsoid$d),c=e[t+=Ellipsoid.packedLength];return defined(i)?(i._positions=o,i._minimumHeights=r,i._maximumHeights=n,i._ellipsoid=Ellipsoid.clone(l,i._ellipsoid),i._granularity=c,i):(scratchOptions$n.positions=o,scratchOptions$n.minimumHeights=r,scratchOptions$n.maximumHeights=n,scratchOptions$n.granularity=c,new WallOutlineGeometry(scratchOptions$n))},WallOutlineGeometry.fromConstantHeights=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).positions,i=e.minimumHeight,r=e.maximumHeight,n=defined(i),a=defined(r);if(n||a)for(var o=t.length,s=n?new Array(o):void 0,l=a?new Array(o):void 0,c=0;c<o;++c)n&&(s[c]=i),a&&(l[c]=r);return new WallOutlineGeometry({positions:t,maximumHeights:l,minimumHeights:s,ellipsoid:e.ellipsoid})},WallOutlineGeometry.createGeometry=function(e){var t=e._positions,i=e._minimumHeights,r=e._maximumHeights,n=e._granularity,a=e._ellipsoid,o=WallGeometryLibrary.computePositions(a,t,r,i,n,!1);if(defined(o)){var s=o.bottomPositions,l=o.topPositions,c=l.length,u=2*c,d=new Float64Array(u),h=0;for(c/=3,C=0;C<c;++C){var p=3*C,m=Cartesian3.fromArray(l,p,scratchCartesian3Position1$1),f=Cartesian3.fromArray(s,p,scratchCartesian3Position2$1);d[h++]=f.x,d[h++]=f.y,d[h++]=f.z,d[h++]=m.x,d[h++]=m.y,d[h++]=m.z}for(var g=new GeometryAttributes({position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.DOUBLE,componentsPerAttribute:3,values:d})}),_=u/3,u=2*_-4+_,y=IndexDatatype$1.createTypedArray(_,u),v=0,C=0;C<_-2;C+=2){var S,T,x=C,b=C+2,E=Cartesian3.fromArray(d,3*x,scratchCartesian3Position1$1),P=Cartesian3.fromArray(d,3*b,scratchCartesian3Position2$1);Cartesian3.equalsEpsilon(E,P,CesiumMath.EPSILON10)||(S=C+1,T=C+3,y[v++]=S,y[v++]=x,y[v++]=S,y[v++]=T,y[v++]=x,y[v++]=b)}return y[v++]=_-2,y[v++]=_-1,new Geometry({attributes:g,indices:y,primitiveType:PrimitiveType$1.LINES,boundingSphere:new BoundingSphere.fromVertices(d)})}},Object.defineProperties(WeightSpline.prototype,{times:{get:function(){return this._times}},weights:{get:function(){return this._weights}}}),WeightSpline.prototype.findTimeInterval=Spline.prototype.findTimeInterval,WeightSpline.prototype.wrapTime=Spline.prototype.wrapTime,WeightSpline.prototype.clampTime=Spline.prototype.clampTime,WeightSpline.prototype.evaluate=function(e,t){var i=this.weights,r=this.times,n=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),a=(e-r[n])/(r[n+1]-r[n]);defined(t)||(t=new Array(this._count));for(var o=0;o<this._count;o++){var s=n*this._count+o;t[o]=i[s]*(1-a)+i[s+this._count]*a}return t},"undefined"!=typeof cancelAnimationFrame&&(implementation$1=cancelAnimationFrame),function(){if(!defined(implementation$1)&&"undefined"!=typeof window)for(var e=["webkit","moz","ms","o"],t=0,i=e.length;t<i&&!defined(implementation$1);)defined(implementation$1=window[e[t]+"CancelAnimationFrame"])||(implementation$1=window[e[t]+"CancelRequestAnimationFrame"]),++t;defined(implementation$1)||(implementation$1=clearTimeout)}();var compressedMagic=1953029805,compressedMagicSwap=2917034100;function decodeGoogleEarthEnterpriseData(e,t){if(decodeGoogleEarthEnterpriseData.passThroughDataForTesting)return t;var i=e.byteLength;if(0===i||i%4!=0)throw new RuntimeError("The length of key must be greater than 0 and a multiple of 4.");var r=new DataView(t),n=r.getUint32(0,!0);if(n===compressedMagic||n===compressedMagicSwap)return t;for(var a,o=new DataView(e),s=0,l=t.byteLength,c=l-l%8,u=i,d=8;s<c;)for(a=d=(d+8)%24;s<c&&a<u;)r.setUint32(s,r.getUint32(s,!0)^o.getUint32(a,!0),!0),r.setUint32(s+4,r.getUint32(s+4,!0)^o.getUint32(a+4,!0),!0),s+=8,a+=24;if(s<l)for(u<=a&&(a=d=(d+8)%24);s<l;)r.setUint8(s,r.getUint8(s)^o.getUint8(a)),s++,a++}function getFilenameFromUri(e){var t=new URI(e);t.normalize();var i=t.path,r=i.lastIndexOf("/");return-1!==r&&(i=i.substr(r+1)),i}function getMagic(e,t){return getStringFromTypedArray(e,t=defaultValue(t,0),Math.min(4,e.length))}decodeGoogleEarthEnterpriseData.passThroughDataForTesting=!1;var transcodeTaskProcessor=new TaskProcessor("transcodeCRNToDXT",Number.POSITIVE_INFINITY);function loadCRN(e){var t;if(defined(t=e instanceof ArrayBuffer||ArrayBuffer.isView(e)?when.resolve(e):Resource.createIfNeeded(e).fetchArrayBuffer()))return t.then(function(e){if(defined(e)){var t=[];return e instanceof ArrayBuffer?t.push(e):(0===e.byteOffset&&e.byteLength===e.buffer.byteLength||(e=e.slice(0,e.length)),t.push(e.buffer)),transcodeTaskProcessor.scheduleTask(e,t)}}).then(function(e){return CompressedTextureBuffer.clone(e)})}function loadImageFromTypedArray(e){var t,i=e.uint8Array,r=e.format,n=e.request,a=defaultValue(e.flipY,!1),o=new Blob([i],{type:r});return Resource.supportsImageBitmapOptions().then(function(e){return e?when(Resource.createImageBitmapFromBlob(o,{flipY:a,premultiplyAlpha:!1})):new Resource({url:t=window.URL.createObjectURL(o),request:n}).fetchImage({flipY:a})}).then(function(e){return defined(t)&&window.URL.revokeObjectURL(t),e}).otherwise(function(e){return defined(t)&&window.URL.revokeObjectURL(t),when.reject(e)})}function loadKTX(e){var t;if(defined(t=e instanceof ArrayBuffer||ArrayBuffer.isView(e)?when.resolve(e):Resource.createIfNeeded(e).fetchArrayBuffer()))return t.then(function(e){if(defined(e))return parseKTX(e)})}var fileIdentifier=[171,75,84,88,32,49,49,187,13,10,26,10],endiannessTest=67305985,faceOrder=["positiveX","negativeX","positiveY","negativeY","positiveZ","negativeZ"],sizeOfUint32$1=4;function parseKTX(e){for(var t,i,r=new Uint8Array(e),n=!0,a=0;a<fileIdentifier.length;++a)if(fileIdentifier[a]!==r[a]){n=!1;break}if(!n)throw new RuntimeError("Invalid KTX file.");i=defined(e.buffer)?(t=new DataView(e.buffer),e.byteOffset):(t=new DataView(e),0),i+=12;var o=t.getUint32(i,!0);if(i+=sizeOfUint32$1,o!==endiannessTest)throw new RuntimeError("File is the wrong endianness.");var s=t.getUint32(i,!0);i+=sizeOfUint32$1;var l=t.getUint32(i,!0);i+=sizeOfUint32$1;var c=t.getUint32(i,!0);i+=sizeOfUint32$1;var u=t.getUint32(i,!0);i+=sizeOfUint32$1;var d=t.getUint32(i,!0);i+=sizeOfUint32$1;var h=t.getUint32(i,!0);i+=sizeOfUint32$1;var p=t.getUint32(i,!0);i+=sizeOfUint32$1;var m=t.getUint32(i,!0);i+=sizeOfUint32$1;var f=t.getUint32(i,!0);i+=sizeOfUint32$1;var g=t.getUint32(i,!0);i+=sizeOfUint32$1;var _=t.getUint32(i,!0);i+=sizeOfUint32$1;var y=t.getUint32(i,!0);i+=sizeOfUint32$1,i+=y;var v,C=t.getUint32(i,!0);if(i+=sizeOfUint32$1,v=defined(e.buffer)?new Uint8Array(e.buffer,i,C):new Uint8Array(e,i,C),u===WebGLConstants$1.RGB8?u=PixelFormat$1.RGB:u===WebGLConstants$1.RGBA8&&(u=PixelFormat$1.RGBA),!PixelFormat$1.validate(u))throw new RuntimeError("glInternalFormat is not a valid format.");if(PixelFormat$1.isCompressedFormat(u)){if(0!==s)throw new RuntimeError("glType must be zero when the texture is compressed.");if(1!==l)throw new RuntimeError("The type size for compressed textures must be 1.");if(0!==c)throw new RuntimeError("glFormat must be zero when the texture is compressed.")}else{if(s!==WebGLConstants$1.UNSIGNED_BYTE)throw new RuntimeError("Only unsigned byte buffers are supported.");if(d!==c)throw new RuntimeError("The base internal format must be the same as the format for uncompressed textures.")}if(0!==m)throw new RuntimeError("3D textures are unsupported.");if(0!==f)throw new RuntimeError("Texture arrays are unsupported.");var S=v.byteOffset,T=new Array(_);for(a=0;a<_;++a){for(var x=T[a]={},b=0;b<g;++b){var E=h>>a,P=p>>a,A=PixelFormat$1.isCompressedFormat(u)?PixelFormat$1.compressedTextureSizeInBytes(u,E,P):PixelFormat$1.textureSizeInBytes(u,s,E,P),w=new Uint8Array(v.buffer,S,A);x[faceOrder[b]]=new CompressedTextureBuffer(u,E,P,w),S+=A}S+=3-(S+3)%4+4}var D=T;if(1===g)for(a=0;a<_;++a)D[a]=D[a][faceOrder[0]];return 1===_&&(D=D[0]),D}var leftScratchArray=[],rightScratchArray=[];function merge(e,t,i,r,n,a){for(var o,s=n-r+1,l=a-n,c=leftScratchArray,u=rightScratchArray,d=0;d<s;++d)c[d]=e[r+d];for(o=0;o<l;++o)u[o]=e[n+o+1];o=d=0;for(var h=r;h<=a;++h){var p=c[d],m=u[o];d<s&&(l<=o||t(p,m,i)<=0)?(e[h]=p,++d):o<l&&(e[h]=m,++o)}}function sort(e,t,i,r,n){var a;n<=r||(sort(e,t,i,r,a=Math.floor(.5*(r+n))),sort(e,t,i,a+1,n),merge(e,t,i,r,a,n))}function mergeSort(e,t,i){var r=e.length,n=Math.ceil(.5*r);leftScratchArray.length=n,rightScratchArray.length=n,sort(e,t,i,0,r-1),leftScratchArray.length=0,rightScratchArray.length=0}var coords=new Cartesian3,implementation$2;function pointInsideTriangle(e,t,i,r){return barycentricCoordinates(e,t,i,r,coords),0<coords.x&&0<coords.y&&0<coords.z}function requestAnimationFramePolyFill(e){return implementation$2(e)}function sampleTerrain(e,t,i){return e.readyPromise.then(function(){return doSampling(e,t,i)})}function doSampling(e,t,i){for(var r=e.tilingScheme,n=[],a={},o=0;o<i.length;++o){var s,l=r.positionToTileXY(i[o],t),c=l.toString();a.hasOwnProperty(c)||(s={x:l.x,y:l.y,level:t,tilingScheme:r,terrainProvider:e,positions:[]},a[c]=s,n.push(s)),a[c].positions.push(i[o])}var u=[];for(o=0;o<n.length;++o){var d=n[o],h=d.terrainProvider.requestTileGeometry(d.x,d.y,d.level).then(createInterpolateFunction(d)).otherwise(createMarkFailedFunction(d));u.push(h)}return when.all(u,function(){return i})}function createInterpolateFunction(e){var r=e.positions,n=e.tilingScheme.tileXYToRectangle(e.x,e.y,e.level);return function(e){for(var t=0;t<r.length;++t){var i=r[t];i.height=e.interpolateHeight(n,i.longitude,i.latitude)}}}function createMarkFailedFunction(e){var t=e.positions;return function(){for(var e=0;e<t.length;++e){t[e].height=void 0}}}"undefined"!=typeof requestAnimationFrame&&(implementation$2=requestAnimationFrame),function(){if(!defined(implementation$2)&&"undefined"!=typeof window)for(var e=["webkit","moz","ms","o"],t=0,i=e.length;t<i&&!defined(implementation$2);)implementation$2=window[e[t]+"RequestAnimationFrame"],++t;var r;defined(implementation$2)||(r=0,implementation$2=function(e){var t=getTimestamp$1(),i=Math.max(1e3/60-(t-r),0);return r=t+i,setTimeout(function(){e(r)},i)})}();var scratchCartesian2$7=new Cartesian2;function sampleTerrainMostDetailed(c,u){return c.readyPromise.then(function(){for(var e=[],r=[],n=c.availability,t=[],i=0;i<u.length;++i){var a,o=u[i],s=n.computeMaximumLevelAtPosition(o);0===(r[i]=s)&&(c.tilingScheme.positionToTileXY(o,1,scratchCartesian2$7),defined(a=c.loadTileDataAvailability(scratchCartesian2$7.x,scratchCartesian2$7.y,1))&&t.push(a));var l=e[s];defined(l)||(e[s]=l=[]),l.push(o)}return when.all(t).then(function(){return when.all(e.map(function(e,t){if(defined(e))return sampleTerrain(c,t,e)}))}).then(function(){for(var e=[],t=0;t<u.length;++t){var i=u[t];n.computeMaximumLevelAtPosition(i)!==r[t]&&e.push(i)}if(0<e.length)return sampleTerrainMostDetailed(c,e)}).then(function(){return u})})}function subdivideArray(e,t){for(var i=[],r=e.length,n=0;n<r;){var a=Math.ceil((r-n)/t--);i.push(e.slice(n,n+a)),n+=a}return i}function webGLConstantToGlslType(e){switch(e){case WebGLConstants$1.FLOAT:return"float";case WebGLConstants$1.FLOAT_VEC2:return"vec2";case WebGLConstants$1.FLOAT_VEC3:return"vec3";case WebGLConstants$1.FLOAT_VEC4:return"vec4";case WebGLConstants$1.FLOAT_MAT2:return"mat2";case WebGLConstants$1.FLOAT_MAT3:return"mat3";case WebGLConstants$1.FLOAT_MAT4:return"mat4";case WebGLConstants$1.SAMPLER_2D:return"sampler2D";case WebGLConstants$1.BOOL:return"bool"}}function wrapFunction(e,t,i){return function(){i.apply(e,arguments),t.apply(e,arguments)}}function ConstantProperty(e){this._value=void 0,this._hasClone=!1,this._hasEquals=!1,this._definitionChanged=new Event,this.setValue(e)}function createProperty(r,n,a,e,o){return{configurable:e,get:function(){return this[n]},set:function(e){var t=this[n],i=this[a];defined(i)&&(i(),this[a]=void 0),!(void 0!==e)||defined(e)&&defined(e.getValue)||!defined(o)||(e=o(e)),t!==e&&(this[n]=e,this._definitionChanged.raiseEvent(this,r,e,t)),defined(e)&&defined(e.definitionChanged)&&(this[a]=e.definitionChanged.addEventListener(function(){this._definitionChanged.raiseEvent(this,r,e,e)},this))}}}function createConstantProperty(e){return new ConstantProperty(e)}function createPropertyDescriptor(e,t,i){return createProperty(e,"_"+e.toString(),"_"+e.toString()+"Subscription",defaultValue(t,!1),defaultValue(i,createConstantProperty))}function BillboardGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._image=void 0,this._imageSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this._pixelOffset=void 0,this._pixelOffsetSubscription=void 0,this._eyeOffset=void 0,this._eyeOffsetSubscription=void 0,this._horizontalOrigin=void 0,this._horizontalOriginSubscription=void 0,this._verticalOrigin=void 0,this._verticalOriginSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._color=void 0,this._colorSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._alignedAxis=void 0,this._alignedAxisSubscription=void 0,this._sizeInMeters=void 0,this._sizeInMetersSubscription=void 0,this._width=void 0,this._widthSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._scaleByDistance=void 0,this._scaleByDistanceSubscription=void 0,this._translucencyByDistance=void 0,this._translucencyByDistanceSubscription=void 0,this._pixelOffsetScaleByDistance=void 0,this._pixelOffsetScaleByDistanceSubscription=void 0,this._imageSubRegion=void 0,this._imageSubRegionSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._disableDepthTestDistance=void 0,this._disableDepthTestDistanceSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}Object.defineProperties(ConstantProperty.prototype,{isConstant:{value:!0},definitionChanged:{get:function(){return this._definitionChanged}}}),ConstantProperty.prototype.getValue=function(e,t){return this._hasClone?this._value.clone(t):this._value},ConstantProperty.prototype.setValue=function(e){var t,i,r,n=this._value;n!==e&&(i=(t=defined(e))&&"function"==typeof e.clone,(r=t&&"function"==typeof e.equals)&&e.equals(n)||(this._hasClone=i,this._hasEquals=r,this._value=i?e.clone(this._value):e,this._definitionChanged.raiseEvent(this)))},ConstantProperty.prototype.equals=function(e){return this===e||e instanceof ConstantProperty&&(!this._hasEquals&&this._value===e._value||this._hasEquals&&this._value.equals(e._value))},ConstantProperty.prototype.valueOf=function(){return this._value},ConstantProperty.prototype.toString=function(){return String(this._value)},Object.defineProperties(BillboardGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),image:createPropertyDescriptor("image"),scale:createPropertyDescriptor("scale"),pixelOffset:createPropertyDescriptor("pixelOffset"),eyeOffset:createPropertyDescriptor("eyeOffset"),horizontalOrigin:createPropertyDescriptor("horizontalOrigin"),verticalOrigin:createPropertyDescriptor("verticalOrigin"),heightReference:createPropertyDescriptor("heightReference"),color:createPropertyDescriptor("color"),rotation:createPropertyDescriptor("rotation"),alignedAxis:createPropertyDescriptor("alignedAxis"),sizeInMeters:createPropertyDescriptor("sizeInMeters"),width:createPropertyDescriptor("width"),height:createPropertyDescriptor("height"),scaleByDistance:createPropertyDescriptor("scaleByDistance"),translucencyByDistance:createPropertyDescriptor("translucencyByDistance"),pixelOffsetScaleByDistance:createPropertyDescriptor("pixelOffsetScaleByDistance"),imageSubRegion:createPropertyDescriptor("imageSubRegion"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),disableDepthTestDistance:createPropertyDescriptor("disableDepthTestDistance")}),BillboardGraphics.prototype.clone=function(e){return defined(e)?(e.show=this._show,e.image=this._image,e.scale=this._scale,e.pixelOffset=this._pixelOffset,e.eyeOffset=this._eyeOffset,e.horizontalOrigin=this._horizontalOrigin,e.verticalOrigin=this._verticalOrigin,e.heightReference=this._heightReference,e.color=this._color,e.rotation=this._rotation,e.alignedAxis=this._alignedAxis,e.sizeInMeters=this._sizeInMeters,e.width=this._width,e.height=this._height,e.scaleByDistance=this._scaleByDistance,e.translucencyByDistance=this._translucencyByDistance,e.pixelOffsetScaleByDistance=this._pixelOffsetScaleByDistance,e.imageSubRegion=this._imageSubRegion,e.distanceDisplayCondition=this._distanceDisplayCondition,e.disableDepthTestDistance=this._disableDepthTestDistance,e):new BillboardGraphics(this)},BillboardGraphics.prototype.merge=function(e){this.show=defaultValue(this._show,e.show),this.image=defaultValue(this._image,e.image),this.scale=defaultValue(this._scale,e.scale),this.pixelOffset=defaultValue(this._pixelOffset,e.pixelOffset),this.eyeOffset=defaultValue(this._eyeOffset,e.eyeOffset),this.horizontalOrigin=defaultValue(this._horizontalOrigin,e.horizontalOrigin),this.verticalOrigin=defaultValue(this._verticalOrigin,e.verticalOrigin),this.heightReference=defaultValue(this._heightReference,e.heightReference),this.color=defaultValue(this._color,e.color),this.rotation=defaultValue(this._rotation,e.rotation),this.alignedAxis=defaultValue(this._alignedAxis,e.alignedAxis),this.sizeInMeters=defaultValue(this._sizeInMeters,e.sizeInMeters),this.width=defaultValue(this._width,e.width),this.height=defaultValue(this._height,e.height),this.scaleByDistance=defaultValue(this._scaleByDistance,e.scaleByDistance),this.translucencyByDistance=defaultValue(this._translucencyByDistance,e.translucencyByDistance),this.pixelOffsetScaleByDistance=defaultValue(this._pixelOffsetScaleByDistance,e.pixelOffsetScaleByDistance),this.imageSubRegion=defaultValue(this._imageSubRegion,e.imageSubRegion),this.distanceDisplayCondition=defaultValue(this._distanceDisplayCondition,e.distanceDisplayCondition),this.disableDepthTestDistance=defaultValue(this._disableDepthTestDistance,e.disableDepthTestDistance)};var HeightReference={NONE:0,CLAMP_TO_GROUND:1,RELATIVE_TO_GROUND:2},HeightReference$1=Object.freeze(HeightReference),HorizontalOrigin={CENTER:0,LEFT:1,RIGHT:-1},HorizontalOrigin$1=Object.freeze(HorizontalOrigin),VerticalOrigin={CENTER:0,BOTTOM:1,BASELINE:2,TOP:-1},VerticalOrigin$1=Object.freeze(VerticalOrigin),BoundingSphereState={DONE:0,PENDING:1,FAILED:2},BoundingSphereState$1=Object.freeze(BoundingSphereState);function Property(){DeveloperError.throwInstantiationError()}Object.defineProperties(Property.prototype,{isConstant:{get:DeveloperError.throwInstantiationError},definitionChanged:{get:DeveloperError.throwInstantiationError}}),Property.prototype.getValue=DeveloperError.throwInstantiationError,Property.prototype.equals=DeveloperError.throwInstantiationError,Property.equals=function(e,t){return e===t||defined(e)&&e.equals(t)},Property.arrayEquals=function(e,t){if(e===t)return!0;if(!defined(e)||!defined(t)||e.length!==t.length)return!1;for(var i=e.length,r=0;r<i;r++)if(!Property.equals(e[r],t[r]))return!1;return!0},Property.isConstant=function(e){return!defined(e)||e.isConstant},Property.getValueOrUndefined=function(e,t,i){return defined(e)?e.getValue(t,i):void 0},Property.getValueOrDefault=function(e,t,i,r){return defined(e)?defaultValue(e.getValue(t,r),i):i},Property.getValueOrClonedDefault=function(e,t,i,r){var n;return defined(e)&&(n=e.getValue(t,r)),defined(n)||(n=i.clone(n)),n};var defaultColor=Color.WHITE,defaultEyeOffset=Cartesian3.ZERO,defaultHeightReference=HeightReference$1.NONE,defaultPixelOffset=Cartesian2.ZERO,defaultScale$1=1,defaultRotation$1=0,defaultAlignedAxis=Cartesian3.ZERO,defaultHorizontalOrigin=HorizontalOrigin$1.CENTER,defaultVerticalOrigin=VerticalOrigin$1.CENTER,defaultSizeInMeters=!1,positionScratch$4=new Cartesian3,colorScratch$1=new Color,eyeOffsetScratch=new Cartesian3,pixelOffsetScratch=new Cartesian2,scaleByDistanceScratch=new NearFarScalar,translucencyByDistanceScratch=new NearFarScalar,pixelOffsetScaleByDistanceScratch=new NearFarScalar,boundingRectangleScratch=new BoundingRectangle,distanceDisplayConditionScratch=new DistanceDisplayCondition;function EntityData(e){this.entity=e,this.billboard=void 0,this.textureValue=void 0}function BillboardVisualizer(e,t){t.collectionChanged.addEventListener(BillboardVisualizer.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new AssociativeArray,this._onCollectionChanged(t,t.values,[],[])}function returnPrimitive(e,t,i){defined(e)&&(e.billboard=void 0,i.removeBillboard(t))}BillboardVisualizer.prototype.update=function(e){for(var t=this._items.values,i=this._cluster,r=0,n=t.length;r<n;r++){var a,o,s,l=t[r],c=l.entity,u=c._billboard,d=l.billboard,h=c.isShowing&&c.isAvailable(e)&&Property.getValueOrDefault(u._show,e,!0);h&&(o=Property.getValueOrUndefined(c._position,e,positionScratch$4),a=Property.getValueOrUndefined(u._image,e),h=defined(o)&&defined(a)),h?(Property.isConstant(c._position)||(i._clusterDirty=!0),defined(d)||((d=i.getBillboard(c)).id=c,d.image=void 0,l.billboard=d),d.show=h,defined(d.image)&&l.textureValue===a||(d.image=a,l.textureValue=a),d.position=o,d.color=Property.getValueOrDefault(u._color,e,defaultColor,colorScratch$1),d.eyeOffset=Property.getValueOrDefault(u._eyeOffset,e,defaultEyeOffset,eyeOffsetScratch),d.heightReference=Property.getValueOrDefault(u._heightReference,e,defaultHeightReference),d.pixelOffset=Property.getValueOrDefault(u._pixelOffset,e,defaultPixelOffset,pixelOffsetScratch),d.scale=Property.getValueOrDefault(u._scale,e,defaultScale$1),d.rotation=Property.getValueOrDefault(u._rotation,e,defaultRotation$1),d.alignedAxis=Property.getValueOrDefault(u._alignedAxis,e,defaultAlignedAxis),d.horizontalOrigin=Property.getValueOrDefault(u._horizontalOrigin,e,defaultHorizontalOrigin),d.verticalOrigin=Property.getValueOrDefault(u._verticalOrigin,e,defaultVerticalOrigin),d.width=Property.getValueOrUndefined(u._width,e),d.height=Property.getValueOrUndefined(u._height,e),d.scaleByDistance=Property.getValueOrUndefined(u._scaleByDistance,e,scaleByDistanceScratch),d.translucencyByDistance=Property.getValueOrUndefined(u._translucencyByDistance,e,translucencyByDistanceScratch),d.pixelOffsetScaleByDistance=Property.getValueOrUndefined(u._pixelOffsetScaleByDistance,e,pixelOffsetScaleByDistanceScratch),d.sizeInMeters=Property.getValueOrDefault(u._sizeInMeters,e,defaultSizeInMeters),d.distanceDisplayCondition=Property.getValueOrUndefined(u._distanceDisplayCondition,e,distanceDisplayConditionScratch),d.disableDepthTestDistance=Property.getValueOrUndefined(u._disableDepthTestDistance,e),defined(s=Property.getValueOrUndefined(u._imageSubRegion,e,boundingRectangleScratch))&&d.setImageSubRegion(d._imageId,s)):returnPrimitive(l,c,i)}return!0},BillboardVisualizer.prototype.getBoundingSphere=function(e,t){var i=this._items.get(e.id);if(!defined(i)||!defined(i.billboard))return BoundingSphereState$1.FAILED;var r=i.billboard;if(r.heightReference===HeightReference$1.NONE)t.center=Cartesian3.clone(r.position,t.center);else{if(!defined(r._clampedPosition))return BoundingSphereState$1.PENDING;t.center=Cartesian3.clone(r._clampedPosition,t.center)}return t.radius=0,BoundingSphereState$1.DONE},BillboardVisualizer.prototype.isDestroyed=function(){return!1},BillboardVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(BillboardVisualizer.prototype._onCollectionChanged,this);for(var e=this._entityCollection.values,t=0;t<e.length;t++)this._cluster.removeBillboard(e[t]);return destroyObject(this)},BillboardVisualizer.prototype._onCollectionChanged=function(e,t,i,r){for(var n,a=this._items,o=this._cluster,s=t.length-1;-1<s;s--)defined((n=t[s])._billboard)&&defined(n._position)&&a.set(n.id,new EntityData(n));for(s=r.length-1;-1<s;s--)defined((n=r[s])._billboard)&&defined(n._position)?a.contains(n.id)||a.set(n.id,new EntityData(n)):(returnPrimitive(a.get(n.id),n,o),a.remove(n.id));for(s=i.length-1;-1<s;s--)n=i[s],returnPrimitive(a.get(n.id),n,o),a.remove(n.id)};var AllMaterialAppearanceFS="varying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvarying vec3 v_tangentEC;\nvarying vec3 v_bitangentEC;\nvarying vec2 v_st;\nvoid main()\n{\nvec3 positionToEyeEC = -v_positionEC;\nmat3 tangentToEyeMatrix = czm_tangentToEyeSpaceMatrix(v_normalEC, v_tangentEC, v_bitangentEC);\nvec3 normalEC = normalize(v_normalEC);\n#ifdef FACE_FORWARD\nnormalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n#endif\nczm_materialInput materialInput;\nmaterialInput.normalEC = normalEC;\nmaterialInput.tangentToEyeMatrix = tangentToEyeMatrix;\nmaterialInput.positionToEyeEC = positionToEyeEC;\nmaterialInput.st = v_st;\nczm_material material = czm_getMaterial(materialInput);\n#ifdef FLAT\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#else\ngl_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);\n#endif\n}\n",AllMaterialAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 normal;\nattribute vec3 tangent;\nattribute vec3 bitangent;\nattribute vec2 st;\nattribute float batchId;\nvarying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvarying vec3 v_tangentEC;\nvarying vec3 v_bitangentEC;\nvarying vec2 v_st;\nvoid main()\n{\nvec4 p = czm_computePosition();\nv_positionEC = (czm_modelViewRelativeToEye * p).xyz;\nv_normalEC = czm_normal * normal;\nv_tangentEC = czm_normal * tangent;\nv_bitangentEC = czm_normal * bitangent;\nv_st = st;\ngl_Position = czm_modelViewProjectionRelativeToEye * p;\n}\n",BasicMaterialAppearanceFS="varying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvoid main()\n{\nvec3 positionToEyeEC = -v_positionEC;\nvec3 normalEC = normalize(v_normalEC);\n#ifdef FACE_FORWARD\nnormalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n#endif\nczm_materialInput materialInput;\nmaterialInput.normalEC = normalEC;\nmaterialInput.positionToEyeEC = positionToEyeEC;\nczm_material material = czm_getMaterial(materialInput);\n#ifdef FLAT\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#else\ngl_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);\n#endif\n}\n",BasicMaterialAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 normal;\nattribute float batchId;\nvarying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvoid main()\n{\nvec4 p = czm_computePosition();\nv_positionEC = (czm_modelViewRelativeToEye * p).xyz;\nv_normalEC = czm_normal * normal;\ngl_Position = czm_modelViewProjectionRelativeToEye * p;\n}\n",TexturedMaterialAppearanceFS="varying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvarying vec2 v_st;\nvoid main()\n{\nvec3 positionToEyeEC = -v_positionEC;\nvec3 normalEC = normalize(v_normalEC);\n#ifdef FACE_FORWARD\nnormalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n#endif\nczm_materialInput materialInput;\nmaterialInput.normalEC = normalEC;\nmaterialInput.positionToEyeEC = positionToEyeEC;\nmaterialInput.st = v_st;\nczm_material material = czm_getMaterial(materialInput);\n#ifdef FLAT\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#else\ngl_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);\n#endif\n}\n",TexturedMaterialAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 normal;\nattribute vec2 st;\nattribute float batchId;\nvarying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvarying vec2 v_st;\nvoid main()\n{\nvec4 p = czm_computePosition();\nv_positionEC = (czm_modelViewRelativeToEye * p).xyz;\nv_normalEC = czm_normal * normal;\nv_st = st;\ngl_Position = czm_modelViewProjectionRelativeToEye * p;\n}\n",BlendEquation={ADD:WebGLConstants$1.FUNC_ADD,SUBTRACT:WebGLConstants$1.FUNC_SUBTRACT,REVERSE_SUBTRACT:WebGLConstants$1.FUNC_REVERSE_SUBTRACT,MIN:WebGLConstants$1.MIN,MAX:WebGLConstants$1.MAX},BlendEquation$1=Object.freeze(BlendEquation),BlendFunction={ZERO:WebGLConstants$1.ZERO,ONE:WebGLConstants$1.ONE,SOURCE_COLOR:WebGLConstants$1.SRC_COLOR,ONE_MINUS_SOURCE_COLOR:WebGLConstants$1.ONE_MINUS_SRC_COLOR,DESTINATION_COLOR:WebGLConstants$1.DST_COLOR,ONE_MINUS_DESTINATION_COLOR:WebGLConstants$1.ONE_MINUS_DST_COLOR,SOURCE_ALPHA:WebGLConstants$1.SRC_ALPHA,ONE_MINUS_SOURCE_ALPHA:WebGLConstants$1.ONE_MINUS_SRC_ALPHA,DESTINATION_ALPHA:WebGLConstants$1.DST_ALPHA,ONE_MINUS_DESTINATION_ALPHA:WebGLConstants$1.ONE_MINUS_DST_ALPHA,CONSTANT_COLOR:WebGLConstants$1.CONSTANT_COLOR,ONE_MINUS_CONSTANT_COLOR:WebGLConstants$1.ONE_MINUS_CONSTANT_COLOR,CONSTANT_ALPHA:WebGLConstants$1.CONSTANT_ALPHA,ONE_MINUS_CONSTANT_ALPHA:WebGLConstants$1.ONE_MINUS_CONSTANT_ALPHA,SOURCE_ALPHA_SATURATE:WebGLConstants$1.SRC_ALPHA_SATURATE},BlendFunction$1=Object.freeze(BlendFunction),BlendingState={DISABLED:Object.freeze({enabled:!1}),ALPHA_BLEND:Object.freeze({enabled:!0,equationRgb:BlendEquation$1.ADD,equationAlpha:BlendEquation$1.ADD,functionSourceRgb:BlendFunction$1.SOURCE_ALPHA,functionSourceAlpha:BlendFunction$1.ONE,functionDestinationRgb:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA,functionDestinationAlpha:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA}),PRE_MULTIPLIED_ALPHA_BLEND:Object.freeze({enabled:!0,equationRgb:BlendEquation$1.ADD,equationAlpha:BlendEquation$1.ADD,functionSourceRgb:BlendFunction$1.ONE,functionSourceAlpha:BlendFunction$1.ONE,functionDestinationRgb:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA,functionDestinationAlpha:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA}),ADDITIVE_BLEND:Object.freeze({enabled:!0,equationRgb:BlendEquation$1.ADD,equationAlpha:BlendEquation$1.ADD,functionSourceRgb:BlendFunction$1.SOURCE_ALPHA,functionSourceAlpha:BlendFunction$1.ONE,functionDestinationRgb:BlendFunction$1.ONE,functionDestinationAlpha:BlendFunction$1.ONE})},BlendingState$1=Object.freeze(BlendingState),CullFace={FRONT:WebGLConstants$1.FRONT,BACK:WebGLConstants$1.BACK,FRONT_AND_BACK:WebGLConstants$1.FRONT_AND_BACK},CullFace$1=Object.freeze(CullFace);function Appearance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.material=e.material,this.translucent=defaultValue(e.translucent,!0),this._vertexShaderSource=e.vertexShaderSource,this._fragmentShaderSource=e.fragmentShaderSource,this._renderState=e.renderState,this._closed=defaultValue(e.closed,!1)}Object.defineProperties(Appearance.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}}}),Appearance.prototype.getFragmentShaderSource=function(){var e=[];return this.flat&&e.push("#define FLAT"),this.faceForward&&e.push("#define FACE_FORWARD"),defined(this.material)&&e.push(this.material.shaderSource),e.push(this.fragmentShaderSource),e.join("\n")},Appearance.prototype.isTranslucent=function(){return defined(this.material)&&this.material.isTranslucent()||!defined(this.material)&&this.translucent},Appearance.prototype.getRenderState=function(){var e=this.isTranslucent(),t=clone(this.renderState,!1);return e?(t.depthMask=!1,t.blending=BlendingState$1.ALPHA_BLEND):t.depthMask=!0,t},Appearance.getDefaultRenderState=function(e,t,i){var r={depthTest:{enabled:!0}};return e&&(r.depthMask=!1,r.blending=BlendingState$1.ALPHA_BLEND),t&&(r.cull={enabled:!0,face:CullFace$1.BACK}),defined(i)&&(r=combine(i,r,!0)),r};var ContextLimits={_maximumCombinedTextureImageUnits:0,_maximumCubeMapSize:0,_maximumFragmentUniformVectors:0,_maximumTextureImageUnits:0,_maximumRenderbufferSize:0,_maximumTextureSize:0,_maximumVaryingVectors:0,_maximumVertexAttributes:0,_maximumVertexTextureImageUnits:0,_maximumVertexUniformVectors:0,_minimumAliasedLineWidth:0,_maximumAliasedLineWidth:0,_minimumAliasedPointSize:0,_maximumAliasedPointSize:0,_maximumViewportWidth:0,_maximumViewportHeight:0,_maximumTextureFilterAnisotropy:0,_maximumDrawBuffers:0,_maximumColorAttachments:0,_highpFloatSupported:!1,_highpIntSupported:!1};function CubeMapFace(e,t,i,r,n,a,o,s,l,c,u){this._context=e,this._texture=t,this._textureTarget=i,this._targetFace=r,this._pixelDatatype=o,this._internalFormat=n,this._pixelFormat=a,this._size=s,this._preMultiplyAlpha=l,this._flipY=c,this._initialized=u}Object.defineProperties(ContextLimits,{maximumCombinedTextureImageUnits:{get:function(){return ContextLimits._maximumCombinedTextureImageUnits}},maximumCubeMapSize:{get:function(){return ContextLimits._maximumCubeMapSize}},maximumFragmentUniformVectors:{get:function(){return ContextLimits._maximumFragmentUniformVectors}},maximumTextureImageUnits:{get:function(){return ContextLimits._maximumTextureImageUnits}},maximumRenderbufferSize:{get:function(){return ContextLimits._maximumRenderbufferSize}},maximumTextureSize:{get:function(){return ContextLimits._maximumTextureSize}},maximumVaryingVectors:{get:function(){return ContextLimits._maximumVaryingVectors}},maximumVertexAttributes:{get:function(){return ContextLimits._maximumVertexAttributes}},maximumVertexTextureImageUnits:{get:function(){return ContextLimits._maximumVertexTextureImageUnits}},maximumVertexUniformVectors:{get:function(){return ContextLimits._maximumVertexUniformVectors}},minimumAliasedLineWidth:{get:function(){return ContextLimits._minimumAliasedLineWidth}},maximumAliasedLineWidth:{get:function(){return ContextLimits._maximumAliasedLineWidth}},minimumAliasedPointSize:{get:function(){return ContextLimits._minimumAliasedPointSize}},maximumAliasedPointSize:{get:function(){return ContextLimits._maximumAliasedPointSize}},maximumViewportWidth:{get:function(){return ContextLimits._maximumViewportWidth}},maximumViewportHeight:{get:function(){return ContextLimits._maximumViewportHeight}},maximumTextureFilterAnisotropy:{get:function(){return ContextLimits._maximumTextureFilterAnisotropy}},maximumDrawBuffers:{get:function(){return ContextLimits._maximumDrawBuffers}},maximumColorAttachments:{get:function(){return ContextLimits._maximumColorAttachments}},highpFloatSupported:{get:function(){return ContextLimits._highpFloatSupported}},highpIntSupported:{get:function(){return ContextLimits._highpIntSupported}}}),Object.defineProperties(CubeMapFace.prototype,{pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},_target:{get:function(){return this._targetFace}}}),CubeMapFace.prototype.copyFrom=function(e,t,i){t=defaultValue(t,0),i=defaultValue(i,0);var r=this._context._gl,n=this._textureTarget,a=this._targetFace;r.activeTexture(r.TEXTURE0),r.bindTexture(n,this._texture);var o=e.width,s=e.height,l=e.arrayBufferView,c=this._size,u=this._pixelFormat,d=this._internalFormat,h=this._pixelDatatype,p=this._preMultiplyAlpha,m=this._flipY,f=4;defined(l)&&(f=PixelFormat$1.alignmentInBytes(u,h,o)),r.pixelStorei(r.UNPACK_ALIGNMENT,f);var g,_=!1;this._initialized||(0===t&&0===i&&o===c&&s===c?(defined(l)?(r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),m&&(l=PixelFormat$1.flipY(l,u,h,c,c)),r.texImage2D(a,0,d,c,c,0,u,PixelDatatype$1.toWebGLConstant(h,this._context),l)):(r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,p),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,m),r.texImage2D(a,0,d,u,PixelDatatype$1.toWebGLConstant(h,this._context),e)),_=!0):(r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),g=PixelFormat$1.createTypedArray(u,h,c,c),r.texImage2D(a,0,d,c,c,0,u,PixelDatatype$1.toWebGLConstant(h,this._context),g)),this._initialized=!0),_||(defined(l)?(r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),m&&(l=PixelFormat$1.flipY(l,u,h,o,s)),r.texSubImage2D(a,0,t,i,o,s,u,PixelDatatype$1.toWebGLConstant(h,this._context),l)):(r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,p),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,m),r.texSubImage2D(a,0,t,i,u,PixelDatatype$1.toWebGLConstant(h,this._context),e))),r.bindTexture(n,null)},CubeMapFace.prototype.copyFromFramebuffer=function(e,t,i,r,n,a){e=defaultValue(e,0),t=defaultValue(t,0),i=defaultValue(i,0),r=defaultValue(r,0),n=defaultValue(n,this._size),a=defaultValue(a,this._size);var o=this._context._gl,s=this._textureTarget;o.activeTexture(o.TEXTURE0),o.bindTexture(s,this._texture),o.copyTexSubImage2D(this._targetFace,0,e,t,i,r,n,a),o.bindTexture(s,null),this._initialized=!0};var MipmapHint={DONT_CARE:WebGLConstants$1.DONT_CARE,FASTEST:WebGLConstants$1.FASTEST,NICEST:WebGLConstants$1.NICEST,validate:function(e){return e===MipmapHint.DONT_CARE||e===MipmapHint.FASTEST||e===MipmapHint.NICEST}},MipmapHint$1=Object.freeze(MipmapHint),TextureMagnificationFilter={NEAREST:WebGLConstants$1.NEAREST,LINEAR:WebGLConstants$1.LINEAR,validate:function(e){return e===TextureMagnificationFilter.NEAREST||e===TextureMagnificationFilter.LINEAR}},TextureMagnificationFilter$1=Object.freeze(TextureMagnificationFilter),TextureMinificationFilter={NEAREST:WebGLConstants$1.NEAREST,LINEAR:WebGLConstants$1.LINEAR,NEAREST_MIPMAP_NEAREST:WebGLConstants$1.NEAREST_MIPMAP_NEAREST,LINEAR_MIPMAP_NEAREST:WebGLConstants$1.LINEAR_MIPMAP_NEAREST,NEAREST_MIPMAP_LINEAR:WebGLConstants$1.NEAREST_MIPMAP_LINEAR,LINEAR_MIPMAP_LINEAR:WebGLConstants$1.LINEAR_MIPMAP_LINEAR,validate:function(e){return e===TextureMinificationFilter.NEAREST||e===TextureMinificationFilter.LINEAR||e===TextureMinificationFilter.NEAREST_MIPMAP_NEAREST||e===TextureMinificationFilter.LINEAR_MIPMAP_NEAREST||e===TextureMinificationFilter.NEAREST_MIPMAP_LINEAR||e===TextureMinificationFilter.LINEAR_MIPMAP_LINEAR}},TextureMinificationFilter$1=Object.freeze(TextureMinificationFilter),TextureWrap={CLAMP_TO_EDGE:WebGLConstants$1.CLAMP_TO_EDGE,REPEAT:WebGLConstants$1.REPEAT,MIRRORED_REPEAT:WebGLConstants$1.MIRRORED_REPEAT,validate:function(e){return e===TextureWrap.CLAMP_TO_EDGE||e===TextureWrap.REPEAT||e===TextureWrap.MIRRORED_REPEAT}},TextureWrap$1=Object.freeze(TextureWrap);function Sampler(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.wrapS,TextureWrap$1.CLAMP_TO_EDGE),i=defaultValue(e.wrapT,TextureWrap$1.CLAMP_TO_EDGE),r=defaultValue(e.minificationFilter,TextureMinificationFilter$1.LINEAR),n=defaultValue(e.magnificationFilter,TextureMagnificationFilter$1.LINEAR),a=defined(e.maximumAnisotropy)?e.maximumAnisotropy:1;this._wrapS=t,this._wrapT=i,this._minificationFilter=r,this._magnificationFilter=n,this._maximumAnisotropy=a}function CubeMap(e){var t,o,s=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context,i=e.source;defined(i)?(t=[i.positiveX,i.negativeX,i.positiveY,i.negativeY,i.positiveZ,i.negativeZ],o=t[0].width,t[0].height):(o=e.width,e.height);var l=o,c=defaultValue(e.pixelDatatype,PixelDatatype$1.UNSIGNED_BYTE),u=defaultValue(e.pixelFormat,PixelFormat$1.RGBA),d=PixelFormat$1.toInternalFormat(u,c,s),r=6*PixelFormat$1.textureSizeInBytes(u,c,l,l),n=e.preMultiplyAlpha||u===PixelFormat$1.RGB||u===PixelFormat$1.LUMINANCE,a=defaultValue(e.flipY,!0),h=s._gl,p=h.TEXTURE_CUBE_MAP,m=h.createTexture();function f(e,t,i,r){var n=t.arrayBufferView;defined(n)||(n=t.bufferView);var a=4;defined(n)&&(a=PixelFormat$1.alignmentInBytes(u,c,o)),h.pixelStorei(h.UNPACK_ALIGNMENT,a),defined(n)?(h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,!1),r&&(n=PixelFormat$1.flipY(n,u,c,l,l)),h.texImage2D(e,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),n)):(h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,i),h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,r),h.texImage2D(e,0,d,u,PixelDatatype$1.toWebGLConstant(c,s),t))}h.activeTexture(h.TEXTURE0),h.bindTexture(p,m),defined(i)?(f(h.TEXTURE_CUBE_MAP_POSITIVE_X,i.positiveX,n,a),f(h.TEXTURE_CUBE_MAP_NEGATIVE_X,i.negativeX,n,a),f(h.TEXTURE_CUBE_MAP_POSITIVE_Y,i.positiveY,n,a),f(h.TEXTURE_CUBE_MAP_NEGATIVE_Y,i.negativeY,n,a),f(h.TEXTURE_CUBE_MAP_POSITIVE_Z,i.positiveZ,n,a),f(h.TEXTURE_CUBE_MAP_NEGATIVE_Z,i.negativeZ,n,a)):(h.texImage2D(h.TEXTURE_CUBE_MAP_POSITIVE_X,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),null),h.texImage2D(h.TEXTURE_CUBE_MAP_NEGATIVE_X,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),null),h.texImage2D(h.TEXTURE_CUBE_MAP_POSITIVE_Y,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),null),h.texImage2D(h.TEXTURE_CUBE_MAP_NEGATIVE_Y,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),null),h.texImage2D(h.TEXTURE_CUBE_MAP_POSITIVE_Z,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),null),h.texImage2D(h.TEXTURE_CUBE_MAP_NEGATIVE_Z,0,d,l,l,0,u,PixelDatatype$1.toWebGLConstant(c,s),null)),h.bindTexture(p,null),this._context=s,this._textureFilterAnisotropic=s._textureFilterAnisotropic,this._textureTarget=p,this._texture=m,this._pixelFormat=u,this._pixelDatatype=c,this._size=l,this._hasMipmap=!1,this._sizeInBytes=r,this._preMultiplyAlpha=n,this._flipY=a,this._sampler=void 0;var g=defined(i);this._positiveX=new CubeMapFace(s,m,p,h.TEXTURE_CUBE_MAP_POSITIVE_X,d,u,c,l,n,a,g),this._negativeX=new CubeMapFace(s,m,p,h.TEXTURE_CUBE_MAP_NEGATIVE_X,d,u,c,l,n,a,g),this._positiveY=new CubeMapFace(s,m,p,h.TEXTURE_CUBE_MAP_POSITIVE_Y,d,u,c,l,n,a,g),this._negativeY=new CubeMapFace(s,m,p,h.TEXTURE_CUBE_MAP_NEGATIVE_Y,d,u,c,l,n,a,g),this._positiveZ=new CubeMapFace(s,m,p,h.TEXTURE_CUBE_MAP_POSITIVE_Z,d,u,c,l,n,a,g),this._negativeZ=new CubeMapFace(s,m,p,h.TEXTURE_CUBE_MAP_NEGATIVE_Z,d,u,c,l,n,a,g),this.sampler=defined(e.sampler)?e.sampler:new Sampler}function Texture(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context,i=e.width,r=e.height,n=e.source;defined(n)&&(defined(i)||(i=defaultValue(n.videoWidth,n.width)),defined(r)||(r=defaultValue(n.videoHeight,n.height)));var a=defaultValue(e.pixelFormat,PixelFormat$1.RGBA),o=defaultValue(e.pixelDatatype,PixelDatatype$1.UNSIGNED_BYTE),s=PixelFormat$1.toInternalFormat(a,o,t),l=PixelFormat$1.isCompressedFormat(s),c=e.preMultiplyAlpha||a===PixelFormat$1.RGB||a===PixelFormat$1.LUMINANCE,u=defaultValue(e.flipY,!0),d=!0,h=t._gl,p=h.TEXTURE_2D,m=h.createTexture();h.activeTexture(h.TEXTURE0),h.bindTexture(p,m);var f,g=4;if(defined(n)&&defined(n.arrayBufferView)&&!l&&(g=PixelFormat$1.alignmentInBytes(a,o,i)),h.pixelStorei(h.UNPACK_ALIGNMENT,g),defined(n))if(defined(n.arrayBufferView)){h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,!1);var _=n.arrayBufferView;if(l)h.compressedTexImage2D(p,0,s,i,r,0,_);else if(u&&(_=PixelFormat$1.flipY(_,a,o,i,r)),h.texImage2D(p,0,s,i,r,0,a,PixelDatatype$1.toWebGLConstant(o,t),_),defined(n.mipLevels))for(var y=i,v=r,C=0;C<n.mipLevels.length;++C)(y=0|Math.floor(y/2))<1&&(y=1),(v=0|Math.floor(v/2))<1&&(v=1),h.texImage2D(p,C+1,s,y,v,0,a,PixelDatatype$1.toWebGLConstant(o,t),n.mipLevels[C])}else defined(n.framebuffer)?(h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,!1),n.framebuffer!==t.defaultFramebuffer&&n.framebuffer._bind(),h.copyTexImage2D(p,0,s,n.xOffset,n.yOffset,i,r,0),n.framebuffer!==t.defaultFramebuffer&&n.framebuffer._unBind()):(h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,c),h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,u),h.texImage2D(p,0,s,a,PixelDatatype$1.toWebGLConstant(o,t),n));else h.texImage2D(p,0,s,i,r,0,a,PixelDatatype$1.toWebGLConstant(o,t),null),d=!1;h.bindTexture(p,null),f=l?PixelFormat$1.compressedTextureSizeInBytes(a,i,r):PixelFormat$1.textureSizeInBytes(a,o,i,r),this._id=createGuid(),this._context=t,this._textureFilterAnisotropic=t._textureFilterAnisotropic,this._textureTarget=p,this._texture=m,this._internalFormat=s,this._pixelFormat=a,this._pixelDatatype=o,this._width=i,this._height=r,this._dimensions=new Cartesian2(i,r),this._hasMipmap=!1,this._sizeInBytes=f,this._preMultiplyAlpha=c,this._flipY=u,this._initialized=d,this._sampler=void 0,this.sampler=defined(e.sampler)?e.sampler:new Sampler}Object.defineProperties(Sampler.prototype,{wrapS:{get:function(){return this._wrapS}},wrapT:{get:function(){return this._wrapT}},minificationFilter:{get:function(){return this._minificationFilter}},magnificationFilter:{get:function(){return this._magnificationFilter}},maximumAnisotropy:{get:function(){return this._maximumAnisotropy}}}),Sampler.equals=function(e,t){return e===t||defined(e)&&defined(t)&&e._wrapS===t._wrapS&&e._wrapT===t._wrapT&&e._minificationFilter===t._minificationFilter&&e._magnificationFilter===t._magnificationFilter&&e._maximumAnisotropy===t._maximumAnisotropy},Sampler.NEAREST=Object.freeze(new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:TextureMinificationFilter$1.NEAREST,magnificationFilter:TextureMagnificationFilter$1.NEAREST})),Object.defineProperties(CubeMap.prototype,{positiveX:{get:function(){return this._positiveX}},negativeX:{get:function(){return this._negativeX}},positiveY:{get:function(){return this._positiveY}},negativeY:{get:function(){return this._negativeY}},positiveZ:{get:function(){return this._positiveZ}},negativeZ:{get:function(){return this._negativeZ}},sampler:{get:function(){return this._sampler},set:function(e){var t=e.minificationFilter,i=e.magnificationFilter,r=t===TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST||t===TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR||t===TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST||t===TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR,n=this._context,a=this._pixelDatatype;(a===PixelDatatype$1.FLOAT&&!n.textureFloatLinear||a===PixelDatatype$1.HALF_FLOAT&&!n.textureHalfFloatLinear)&&(t=r?TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST:TextureMinificationFilter$1.NEAREST,i=TextureMagnificationFilter$1.NEAREST);var o=n._gl,s=this._textureTarget;o.activeTexture(o.TEXTURE0),o.bindTexture(s,this._texture),o.texParameteri(s,o.TEXTURE_MIN_FILTER,t),o.texParameteri(s,o.TEXTURE_MAG_FILTER,i),o.texParameteri(s,o.TEXTURE_WRAP_S,e.wrapS),o.texParameteri(s,o.TEXTURE_WRAP_T,e.wrapT),defined(this._textureFilterAnisotropic)&&o.texParameteri(s,this._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,e.maximumAnisotropy),o.bindTexture(s,null),this._sampler=e}},pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},width:{get:function(){return this._size}},height:{get:function(){return this._size}},sizeInBytes:{get:function(){return this._hasMipmap?Math.floor(4*this._sizeInBytes/3):this._sizeInBytes}},preMultiplyAlpha:{get:function(){return this._preMultiplyAlpha}},flipY:{get:function(){return this._flipY}},_target:{get:function(){return this._textureTarget}}}),CubeMap.prototype.generateMipmap=function(e){e=defaultValue(e,MipmapHint$1.DONT_CARE),this._hasMipmap=!0;var t=this._context._gl,i=this._textureTarget;t.hint(t.GENERATE_MIPMAP_HINT,e),t.activeTexture(t.TEXTURE0),t.bindTexture(i,this._texture),t.generateMipmap(i),t.bindTexture(i,null)},CubeMap.prototype.isDestroyed=function(){return!1},CubeMap.prototype.destroy=function(){return this._context._gl.deleteTexture(this._texture),this._positiveX=destroyObject(this._positiveX),this._negativeX=destroyObject(this._negativeX),this._positiveY=destroyObject(this._positiveY),this._negativeY=destroyObject(this._negativeY),this._positiveZ=destroyObject(this._positiveZ),this._negativeZ=destroyObject(this._negativeZ),destroyObject(this)},Texture.create=function(e){return new Texture(e)},Texture.fromFramebuffer=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context,i=t._gl,r=defaultValue(e.pixelFormat,PixelFormat$1.RGB),n=defaultValue(e.framebufferXOffset,0),a=defaultValue(e.framebufferYOffset,0),o=defaultValue(e.width,i.drawingBufferWidth),s=defaultValue(e.height,i.drawingBufferHeight),l=e.framebuffer;return new Texture({context:t,width:o,height:s,pixelFormat:r,source:{framebuffer:defined(l)?l:t.defaultFramebuffer,xOffset:n,yOffset:a,width:o,height:s}})},Object.defineProperties(Texture.prototype,{id:{get:function(){return this._id}},sampler:{get:function(){return this._sampler},set:function(e){var t=e.minificationFilter,i=e.magnificationFilter,r=this._context,n=this._pixelFormat,a=this._pixelDatatype,o=t===TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST||t===TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR||t===TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST||t===TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR;(a===PixelDatatype$1.FLOAT&&!r.textureFloatLinear||a===PixelDatatype$1.HALF_FLOAT&&!r.textureHalfFloatLinear)&&(t=o?TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST:TextureMinificationFilter$1.NEAREST,i=TextureMagnificationFilter$1.NEAREST),r.webgl2&&PixelFormat$1.isDepthFormat(n)&&(t=TextureMinificationFilter$1.NEAREST,i=TextureMagnificationFilter$1.NEAREST);var s=r._gl,l=this._textureTarget;s.activeTexture(s.TEXTURE0),s.bindTexture(l,this._texture),s.texParameteri(l,s.TEXTURE_MIN_FILTER,t),s.texParameteri(l,s.TEXTURE_MAG_FILTER,i),s.texParameteri(l,s.TEXTURE_WRAP_S,e.wrapS),s.texParameteri(l,s.TEXTURE_WRAP_T,e.wrapT),defined(this._textureFilterAnisotropic)&&s.texParameteri(l,this._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,e.maximumAnisotropy),s.bindTexture(l,null),this._sampler=e}},pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},dimensions:{get:function(){return this._dimensions}},preMultiplyAlpha:{get:function(){return this._preMultiplyAlpha}},flipY:{get:function(){return this._flipY}},width:{get:function(){return this._width}},height:{get:function(){return this._height}},sizeInBytes:{get:function(){return this._hasMipmap?Math.floor(4*this._sizeInBytes/3):this._sizeInBytes}},_target:{get:function(){return this._textureTarget}}}),Texture.prototype.copyFrom=function(e,t,i){t=defaultValue(t,0),i=defaultValue(i,0);var r=this._context,n=r._gl,a=this._textureTarget;n.activeTexture(n.TEXTURE0),n.bindTexture(a,this._texture);var o=e.width,s=e.height,l=e.arrayBufferView,c=this._width,u=this._height,d=this._internalFormat,h=this._pixelFormat,p=this._pixelDatatype,m=this._preMultiplyAlpha,f=this._flipY,g=4;defined(l)&&(g=PixelFormat$1.alignmentInBytes(h,p,o)),n.pixelStorei(n.UNPACK_ALIGNMENT,g);var _,y=!1;this._initialized||(0===t&&0===i&&o===c&&s===u?(defined(l)?(n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1),f&&(l=PixelFormat$1.flipY(l,h,p,c,u)),n.texImage2D(a,0,d,c,u,0,h,PixelDatatype$1.toWebGLConstant(p,r),l)):(n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,m),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,f),n.texImage2D(a,0,d,h,PixelDatatype$1.toWebGLConstant(p,r),e)),y=!0):(n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1),_=PixelFormat$1.createTypedArray(h,p,c,u),n.texImage2D(a,0,d,c,u,0,h,PixelDatatype$1.toWebGLConstant(p,r),_)),this._initialized=!0),y||(defined(l)?(n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1),f&&(l=PixelFormat$1.flipY(l,h,p,o,s)),n.texSubImage2D(a,0,t,i,o,s,h,PixelDatatype$1.toWebGLConstant(p,r),l)):(n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,m),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,f),n.texSubImage2D(a,0,t,i,h,PixelDatatype$1.toWebGLConstant(p,r),e))),n.bindTexture(a,null)},Texture.prototype.copyFromFramebuffer=function(e,t,i,r,n,a){e=defaultValue(e,0),t=defaultValue(t,0),i=defaultValue(i,0),r=defaultValue(r,0),n=defaultValue(n,this._width),a=defaultValue(a,this._height);var o=this._context._gl,s=this._textureTarget;o.activeTexture(o.TEXTURE0),o.bindTexture(s,this._texture),o.copyTexSubImage2D(s,0,e,t,i,r,n,a),o.bindTexture(s,null),this._initialized=!0},Texture.prototype.generateMipmap=function(e){e=defaultValue(e,MipmapHint$1.DONT_CARE),this._hasMipmap=!0;var t=this._context._gl,i=this._textureTarget;t.hint(t.GENERATE_MIPMAP_HINT,e),t.activeTexture(t.TEXTURE0),t.bindTexture(i,this._texture),t.generateMipmap(i),t.bindTexture(i,null)},Texture.prototype.isDestroyed=function(){return!1},Texture.prototype.destroy=function(){return this._context._gl.deleteTexture(this._texture),destroyObject(this)};var AspectRampMaterial="uniform sampler2D image;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec4 rampColor = texture2D(image, vec2(materialInput.aspect / (2.0 * czm_pi), 0.5));\nrampColor = czm_gammaCorrect(rampColor);\nmaterial.diffuse = rampColor.rgb;\nmaterial.alpha = rampColor.a;\nreturn material;\n}\n",BumpMapMaterial="uniform sampler2D image;\nuniform float strength;\nuniform vec2 repeat;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\nvec2 centerPixel = fract(repeat * st);\nfloat centerBump = texture2D(image, centerPixel).channel;\nfloat imageWidth = float(imageDimensions.x);\nvec2 rightPixel = fract(repeat * (st + vec2(1.0 / imageWidth, 0.0)));\nfloat rightBump = texture2D(image, rightPixel).channel;\nfloat imageHeight = float(imageDimensions.y);\nvec2 leftPixel = fract(repeat * (st + vec2(0.0, 1.0 / imageHeight)));\nfloat topBump = texture2D(image, leftPixel).channel;\nvec3 normalTangentSpace = normalize(vec3(centerBump - rightBump, centerBump - topBump, clamp(1.0 - strength, 0.1, 1.0)));\nvec3 normalEC = materialInput.tangentToEyeMatrix * normalTangentSpace;\nmaterial.normal = normalEC;\nmaterial.diffuse = vec3(0.01);\nreturn material;\n}\n",CheckerboardMaterial="uniform vec4 lightColor;\nuniform vec4 darkColor;\nuniform vec2 repeat;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\nfloat b = mod(floor(repeat.s * st.s) + floor(repeat.t * st.t), 2.0);\nfloat scaledWidth = fract(repeat.s * st.s);\nscaledWidth = abs(scaledWidth - floor(scaledWidth + 0.5));\nfloat scaledHeight = fract(repeat.t * st.t);\nscaledHeight = abs(scaledHeight - floor(scaledHeight + 0.5));\nfloat value = min(scaledWidth, scaledHeight);\nvec4 currentColor = mix(lightColor, darkColor, b);\nvec4 color = czm_antialias(lightColor, darkColor, currentColor, value, 0.03);\ncolor = czm_gammaCorrect(color);\nmaterial.diffuse = color.rgb;\nmaterial.alpha = color.a;\nreturn material;\n}\n",DotMaterial="uniform vec4 lightColor;\nuniform vec4 darkColor;\nuniform vec2 repeat;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nfloat b = smoothstep(0.3, 0.32, length(fract(repeat * materialInput.st) - 0.5));\nvec4 color = mix(lightColor, darkColor, b);\ncolor = czm_gammaCorrect(color);\nmaterial.diffuse = color.rgb;\nmaterial.alpha = color.a;\nreturn material;\n}\n",ElevationContourMaterial="#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\nuniform vec4 color;\nuniform float spacing;\nuniform float width;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nfloat distanceToContour = mod(materialInput.height, spacing);\n#ifdef GL_OES_standard_derivatives\nfloat dxc = abs(dFdx(materialInput.height));\nfloat dyc = abs(dFdy(materialInput.height));\nfloat dF = max(dxc, dyc) * czm_pixelRatio * width;\nfloat alpha = (distanceToContour < dF) ? 1.0 : 0.0;\n#else\nfloat alpha = (distanceToContour < (czm_pixelRatio * width)) ? 1.0 : 0.0;\n#endif\nvec4 outColor = czm_gammaCorrect(vec4(color.rgb, alpha * color.a));\nmaterial.diffuse = outColor.rgb;\nmaterial.alpha = outColor.a;\nreturn material;\n}\n",ElevationRampMaterial="uniform sampler2D image;\nuniform float minimumHeight;\nuniform float maximumHeight;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nfloat scaledHeight = clamp((materialInput.height - minimumHeight) / (maximumHeight - minimumHeight), 0.0, 1.0);\nvec4 rampColor = texture2D(image, vec2(scaledHeight, 0.5));\nrampColor = czm_gammaCorrect(rampColor);\nmaterial.diffuse = rampColor.rgb;\nmaterial.alpha = rampColor.a;\nreturn material;\n}\n",FadeMaterial="uniform vec4 fadeInColor;\nuniform vec4 fadeOutColor;\nuniform float maximumDistance;\nuniform bool repeat;\nuniform vec2 fadeDirection;\nuniform vec2 time;\nfloat getTime(float t, float coord)\n{\nfloat scalar = 1.0 / maximumDistance;\nfloat q = distance(t, coord) * scalar;\nif (repeat)\n{\nfloat r = distance(t, coord + 1.0) * scalar;\nfloat s = distance(t, coord - 1.0) * scalar;\nq = min(min(r, s), q);\n}\nreturn clamp(q, 0.0, 1.0);\n}\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\nfloat s = getTime(time.x, st.s) * fadeDirection.s;\nfloat t = getTime(time.y, st.t) * fadeDirection.t;\nfloat u = length(vec2(s, t));\nvec4 color = mix(fadeInColor, fadeOutColor, u);\ncolor = czm_gammaCorrect(color);\nmaterial.emission = color.rgb;\nmaterial.alpha = color.a;\nreturn material;\n}\n",GridMaterial="#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\nuniform vec4 color;\nuniform float cellAlpha;\nuniform vec2 lineCount;\nuniform vec2 lineThickness;\nuniform vec2 lineOffset;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\nfloat scaledWidth = fract(lineCount.s * st.s - lineOffset.s);\nscaledWidth = abs(scaledWidth - floor(scaledWidth + 0.5));\nfloat scaledHeight = fract(lineCount.t * st.t - lineOffset.t);\nscaledHeight = abs(scaledHeight - floor(scaledHeight + 0.5));\nfloat value;\n#ifdef GL_OES_standard_derivatives\nconst float fuzz = 1.2;\nvec2 thickness = (lineThickness * czm_pixelRatio) - 1.0;\nvec2 dx = abs(dFdx(st));\nvec2 dy = abs(dFdy(st));\nvec2 dF = vec2(max(dx.s, dy.s), max(dx.t, dy.t)) * lineCount;\nvalue = min(\nsmoothstep(dF.s * thickness.s, dF.s * (fuzz + thickness.s), scaledWidth),\nsmoothstep(dF.t * thickness.t, dF.t * (fuzz + thickness.t), scaledHeight));\n#else\nconst float fuzz = 0.05;\nvec2 range = 0.5 - (lineThickness * 0.05);\nvalue = min(\n1.0 - smoothstep(range.s, range.s + fuzz, scaledWidth),\n1.0 - smoothstep(range.t, range.t + fuzz, scaledHeight));\n#endif\nfloat dRim = 1.0 - abs(dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC)));\nfloat sRim = smoothstep(0.8, 1.0, dRim);\nvalue *= (1.0 - sRim);\nvec4 halfColor;\nhalfColor.rgb = color.rgb * 0.5;\nhalfColor.a = color.a * (1.0 - ((1.0 - cellAlpha) * value));\nhalfColor = czm_gammaCorrect(halfColor);\nmaterial.diffuse = halfColor.rgb;\nmaterial.emission = halfColor.rgb;\nmaterial.alpha = halfColor.a;\nreturn material;\n}\n",NormalMapMaterial="uniform sampler2D image;\nuniform float strength;\nuniform vec2 repeat;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec4 textureValue = texture2D(image, fract(repeat * materialInput.st));\nvec3 normalTangentSpace = textureValue.channels;\nnormalTangentSpace.xy = normalTangentSpace.xy * 2.0 - 1.0;\nnormalTangentSpace.z = clamp(1.0 - strength, 0.1, 1.0);\nnormalTangentSpace = normalize(normalTangentSpace);\nvec3 normalEC = materialInput.tangentToEyeMatrix * normalTangentSpace;\nmaterial.normal = normalEC;\nreturn material;\n}\n",PolylineArrowMaterial="#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\nuniform vec4 color;\nfloat getPointOnLine(vec2 p0, vec2 p1, float x)\n{\nfloat slope = (p0.y - p1.y) / (p0.x - p1.x);\nreturn slope * (x - p0.x) + p0.y;\n}\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\n#ifdef GL_OES_standard_derivatives\nfloat base = 1.0 - abs(fwidth(st.s)) * 10.0 * czm_pixelRatio;\n#else\nfloat base = 0.975;\n#endif\nvec2 center = vec2(1.0, 0.5);\nfloat ptOnUpperLine = getPointOnLine(vec2(base, 1.0), center, st.s);\nfloat ptOnLowerLine = getPointOnLine(vec2(base, 0.0), center, st.s);\nfloat halfWidth = 0.15;\nfloat s = step(0.5 - halfWidth, st.t);\ns *= 1.0 - step(0.5 + halfWidth, st.t);\ns *= 1.0 - step(base, st.s);\nfloat t = step(base, materialInput.st.s);\nt *= 1.0 - step(ptOnUpperLine, st.t);\nt *= step(ptOnLowerLine, st.t);\nfloat dist;\nif (st.s < base)\n{\nfloat d1 = abs(st.t - (0.5 - halfWidth));\nfloat d2 = abs(st.t - (0.5 + halfWidth));\ndist = min(d1, d2);\n}\nelse\n{\nfloat d1 = czm_infinity;\nif (st.t < 0.5 - halfWidth && st.t > 0.5 + halfWidth)\n{\nd1 = abs(st.s - base);\n}\nfloat d2 = abs(st.t - ptOnUpperLine);\nfloat d3 = abs(st.t - ptOnLowerLine);\ndist = min(min(d1, d2), d3);\n}\nvec4 outsideColor = vec4(0.0);\nvec4 currentColor = mix(outsideColor, color, clamp(s + t, 0.0, 1.0));\nvec4 outColor = czm_antialias(outsideColor, color, currentColor, dist);\noutColor = czm_gammaCorrect(outColor);\nmaterial.diffuse = outColor.rgb;\nmaterial.alpha = outColor.a;\nreturn material;\n}\n",PolylineDashMaterial="uniform vec4 color;\nuniform vec4 gapColor;\nuniform float dashLength;\nuniform float dashPattern;\nvarying float v_polylineAngle;\nconst float maskLength = 16.0;\nmat2 rotate(float rad) {\nfloat c = cos(rad);\nfloat s = sin(rad);\nreturn mat2(\nc, s,\n-s, c\n);\n}\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 pos = rotate(v_polylineAngle) * gl_FragCoord.xy;\nfloat dashPosition = fract(pos.x / (dashLength * czm_pixelRatio));\nfloat maskIndex = floor(dashPosition * maskLength);\nfloat maskTest = floor(dashPattern / pow(2.0, maskIndex));\nvec4 fragColor = (mod(maskTest, 2.0) < 1.0) ? gapColor : color;\nif (fragColor.a < 0.005) {\ndiscard;\n}\nfragColor = czm_gammaCorrect(fragColor);\nmaterial.emission = fragColor.rgb;\nmaterial.alpha = fragColor.a;\nreturn material;\n}\n",PolylineGlowMaterial="uniform vec4 color;\nuniform float glowPower;\nuniform float taperPower;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\nfloat glow = glowPower / abs(st.t - 0.5) - (glowPower / 0.5);\nif (taperPower <= 0.99999) {\nglow *= min(1.0, taperPower / (0.5 - st.s * 0.5) - (taperPower / 0.5));\n}\nvec4 fragColor;\nfragColor.rgb = max(vec3(glow - 1.0 + color.rgb), color.rgb);\nfragColor.a = clamp(0.0, 1.0, glow) * color.a;\nfragColor = czm_gammaCorrect(fragColor);\nmaterial.emission = fragColor.rgb;\nmaterial.alpha = fragColor.a;\nreturn material;\n}\n",PolylineOutlineMaterial="uniform vec4 color;\nuniform vec4 outlineColor;\nuniform float outlineWidth;\nvarying float v_width;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec2 st = materialInput.st;\nfloat halfInteriorWidth = 0.5 * (v_width - outlineWidth) / v_width;\nfloat b = step(0.5 - halfInteriorWidth, st.t);\nb *= 1.0 - step(0.5 + halfInteriorWidth, st.t);\nfloat d1 = abs(st.t - (0.5 - halfInteriorWidth));\nfloat d2 = abs(st.t - (0.5 + halfInteriorWidth));\nfloat dist = min(d1, d2);\nvec4 currentColor = mix(outlineColor, color, b);\nvec4 outColor = czm_antialias(outlineColor, color, currentColor, dist);\noutColor = czm_gammaCorrect(outColor);\nmaterial.diffuse = outColor.rgb;\nmaterial.alpha = outColor.a;\nreturn material;\n}\n",RimLightingMaterial="uniform vec4 color;\nuniform vec4 rimColor;\nuniform float width;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nfloat d = 1.0 - dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC));\nfloat s = smoothstep(1.0 - width, 1.0, d);\nvec4 outColor = czm_gammaCorrect(color);\nvec4 outRimColor = czm_gammaCorrect(rimColor);\nmaterial.diffuse = outColor.rgb;\nmaterial.emission = outRimColor.rgb * s;\nmaterial.alpha = mix(outColor.a, outRimColor.a, s);\nreturn material;\n}\n",SlopeRampMaterial="uniform sampler2D image;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nvec4 rampColor = texture2D(image, vec2(materialInput.slope / (czm_pi / 2.0), 0.5));\nrampColor = czm_gammaCorrect(rampColor);\nmaterial.diffuse = rampColor.rgb;\nmaterial.alpha = rampColor.a;\nreturn material;\n}\n",StripeMaterial="uniform vec4 evenColor;\nuniform vec4 oddColor;\nuniform float offset;\nuniform float repeat;\nuniform bool horizontal;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nfloat coord = mix(materialInput.st.s, materialInput.st.t, float(horizontal));\nfloat value = fract((coord - offset) * (repeat * 0.5));\nfloat dist = min(value, min(abs(value - 0.5), 1.0 - value));\nvec4 currentColor = mix(evenColor, oddColor, step(0.5, value));\nvec4 color = czm_antialias(evenColor, oddColor, currentColor, dist);\ncolor = czm_gammaCorrect(color);\nmaterial.diffuse = color.rgb;\nmaterial.alpha = color.a;\nreturn material;\n}\n",WaterMaterial="uniform sampler2D specularMap;\nuniform sampler2D normalMap;\nuniform vec4 baseWaterColor;\nuniform vec4 blendColor;\nuniform float frequency;\nuniform float animationSpeed;\nuniform float amplitude;\nuniform float specularIntensity;\nuniform float fadeFactor;\nczm_material czm_getMaterial(czm_materialInput materialInput)\n{\nczm_material material = czm_getDefaultMaterial(materialInput);\nfloat time = czm_frameNumber * animationSpeed;\nfloat fade = max(1.0, (length(materialInput.positionToEyeEC) / 10000000000.0) * frequency * fadeFactor);\nfloat specularMapValue = texture2D(specularMap, materialInput.st).r;\nvec4 noise = czm_getWaterNoise(normalMap, materialInput.st * frequency, time, 0.0);\nvec3 normalTangentSpace = noise.xyz * vec3(1.0, 1.0, (1.0 / amplitude));\nnormalTangentSpace.xy /= fade;\nnormalTangentSpace = mix(vec3(0.0, 0.0, 50.0), normalTangentSpace, specularMapValue);\nnormalTangentSpace = normalize(normalTangentSpace);\nfloat tsPerturbationRatio = clamp(dot(normalTangentSpace, vec3(0.0, 0.0, 1.0)), 0.0, 1.0);\nmaterial.alpha = mix(blendColor.a, baseWaterColor.a, specularMapValue) * specularMapValue;\nmaterial.diffuse = mix(blendColor.rgb, baseWaterColor.rgb, specularMapValue);\nmaterial.diffuse += (0.1 * tsPerturbationRatio);\nmaterial.diffuse = material.diffuse;\nmaterial.normal = normalize(materialInput.tangentToEyeMatrix * normalTangentSpace);\nmaterial.specular = specularIntensity;\nmaterial.shininess = 10.0;\nreturn material;\n}\n";function Material(e){this.type=void 0,this.shaderSource=void 0,this.materials=void 0,this.uniforms=void 0,this._uniforms=void 0,this.translucent=void 0,this._minificationFilter=defaultValue(e.minificationFilter,TextureMinificationFilter$1.LINEAR),this._magnificationFilter=defaultValue(e.magnificationFilter,TextureMagnificationFilter$1.LINEAR),this._strict=void 0,this._template=void 0,this._count=void 0,this._texturePaths={},this._loadedImages=[],this._loadedCubeMaps=[],this._textures={},this._updateFunctions=[],this._defaultTexture=void 0,initializeMaterial(e,this),Object.defineProperties(this,{type:{value:this.type,writable:!1}}),defined(Material._uniformList[this.type])||(Material._uniformList[this.type]=Object.keys(this._uniforms))}function initializeMaterial(e,t){e=defaultValue(e,defaultValue.EMPTY_OBJECT),t._strict=defaultValue(e.strict,!1),t._count=defaultValue(e.count,0),t._template=clone(defaultValue(e.fabric,defaultValue.EMPTY_OBJECT)),t._template.uniforms=clone(defaultValue(t._template.uniforms,defaultValue.EMPTY_OBJECT)),t._template.materials=clone(defaultValue(t._template.materials,defaultValue.EMPTY_OBJECT)),t.type=defined(t._template.type)?t._template.type:createGuid(),t.shaderSource="",t.materials={},t.uniforms={},t._uniforms={},t._translucentFunctions=[];var i,r=Material._materialCache.getMaterial(t.type);defined(r)&&(i=clone(r.fabric,!0),t._template=combine(t._template,i,!0),a=r.translucent),checkForTemplateErrors(t),defined(r)||Material._materialCache.addMaterial(t.type,t),createMethodDefinition(t),createUniforms(t),createSubMaterials(t);var n=0===t._translucentFunctions.length||void 0,a=defaultValue(a,n);defined(a=defaultValue(e.translucent,a))&&("function"==typeof a?t._translucentFunctions.push(function(){return a(t)}):t._translucentFunctions.push(a))}function checkForValidProperties(e,t,i,r){if(defined(e))for(var n in e){var a;e.hasOwnProperty(n)&&(a=-1!==t.indexOf(n),(r&&!a||!r&&a)&&i(n,t))}}function invalidNameError(e,t){}function duplicateNameError(e,t){}Material._uniformList={},Material.fromType=function(e,t){var i=new Material({fabric:{type:e}});if(defined(t))for(var r in t)t.hasOwnProperty(r)&&(i.uniforms[r]=t[r]);return i},Material.prototype.isTranslucent=function(){if(defined(this.translucent))return"function"==typeof this.translucent?this.translucent():this.translucent;for(var e=!0,t=this._translucentFunctions,i=t.length,r=0;r<i;++r){var n=t[r];if(!(e="function"==typeof n?e&&n():e&&n))break}return e},Material.prototype.update=function(e){for(var t=this._loadedImages,i=t.length,r=0;r<i;++r){var n=t[r],a=n.id,o=n.image,s=new Sampler({minificationFilter:this._minificationFilter,magnificationFilter:this._magnificationFilter}),l=defined(o.internalFormat)?new Texture({context:e,pixelFormat:o.internalFormat,width:o.width,height:o.height,source:{arrayBufferView:o.bufferView},sampler:s}):new Texture({context:e,source:o,sampler:s});this._textures[a]=l;var c,u=a+"Dimensions";this.uniforms.hasOwnProperty(u)&&((c=this.uniforms[u]).x=l._width,c.y=l._height)}t.length=0;var d=this._loadedCubeMaps,i=d.length;for(r=0;r<i;++r){var h=d[r];a=h.id;var p=h.images,m=new CubeMap({context:e,source:{positiveX:p[0],negativeX:p[1],positiveY:p[2],negativeY:p[3],positiveZ:p[4],negativeZ:p[5]},sampler:new Sampler({minificationFilter:this._minificationFilter,magnificationFilter:this._magnificationFilter})});this._textures[a]=m}d.length=0;var f=this._updateFunctions;for(i=f.length,r=0;r<i;++r)f[r](this,e);var g=this.materials;for(var _ in g)g.hasOwnProperty(_)&&g[_].update(e)},Material.prototype.isDestroyed=function(){return!1},Material.prototype.destroy=function(){var e,t=this._textures;for(var i in t){!t.hasOwnProperty(i)||(e=t[i])!==this._defaultTexture&&e.destroy()}var r=this.materials;for(var n in r)r.hasOwnProperty(n)&&r[n].destroy();return destroyObject(this)};var templateProperties=["type","materials","uniforms","components","source"],componentProperties=["diffuse","specular","shininess","normal","emission","alpha"];function checkForTemplateErrors(e){var t=e._template,i=t.uniforms,r=t.materials,n=t.components;checkForValidProperties(t,templateProperties,invalidNameError,!0),checkForValidProperties(n,componentProperties,invalidNameError,!0);var a=[];for(var o in r)r.hasOwnProperty(o)&&a.push(o);checkForValidProperties(i,a,duplicateNameError,!1)}function isMaterialFused(e,t){var i=t._template.materials;for(var r in i)if(i.hasOwnProperty(r)&&-1<e.indexOf(r))return!0;return!1}function createMethodDefinition(e){var t=e._template.components,i=e._template.source;if(defined(i))e.shaderSource+=i+"\n";else{if(e.shaderSource+="czm_material czm_getMaterial(czm_materialInput materialInput)\n{\n",e.shaderSource+="czm_material material = czm_getDefaultMaterial(materialInput);\n",defined(t)){var r,n=0<Object.keys(e._template.materials).length;for(var a in t){t.hasOwnProperty(a)&&("diffuse"===a||"emission"===a?(r=n&&isMaterialFused(t[a],e)?t[a]:"czm_gammaCorrect("+t[a]+")",e.shaderSource+="material."+a+" = "+r+"; \n"):e.shaderSource+="alpha"===a?"material.alpha = "+t.alpha+"; \n":"material."+a+" = "+t[a]+";\n")}}e.shaderSource+="return material;\n}\n"}}var matrixMap={mat2:Matrix2,mat3:Matrix3,mat4:Matrix4},ktxRegex=/\.ktx$/i,crnRegex=/\.crn$/i;function createTexture2DUpdateFunction(d){var h;return function(t,e){var i=t.uniforms,r=i[d],n=h!==r;h=r;var a,o,s,l,c=t._textures[d];if(r instanceof HTMLVideoElement)if(2<=r.readyState){if(n&&defined(c)&&(c!==e.defaultTexture&&c.destroy(),c=void 0),!defined(c)||c===e.defaultTexture){c=new Texture({context:e,source:r,sampler:new Sampler({minificationFilter:t._minificationFilter,magnificationFilter:t._magnificationFilter})});return void(t._textures[d]=c)}c.copyFrom(r)}else defined(c)||(t._textures[d]=e.defaultTexture);else{if(r instanceof Texture&&r!==c){t._texturePaths[d]=void 0;var u=t._textures[d];return u!==t._defaultTexture&&u.destroy(),t._textures[d]=r,a=d+"Dimensions",void(i.hasOwnProperty(a)&&((o=i[a]).x=r._width,o.y=r._height))}defined(c)||(t._texturePaths[d]=void 0,defined(t._defaultTexture)||(t._defaultTexture=e.defaultTexture),c=t._textures[d]=t._defaultTexture,a=d+"Dimensions",i.hasOwnProperty(a)&&((o=i[a]).x=c._width,o.y=c._height)),r!==Material.DefaultImageId&&(s=r instanceof Resource,(!defined(t._texturePaths[d])||s&&r.url!==t._texturePaths[d].url||!s&&r!==t._texturePaths[d])&&("string"==typeof r||s?(l=s?r:Resource.createIfNeeded(r),when(ktxRegex.test(l.url)?loadKTX(l):crnRegex.test(l.url)?loadCRN(l):l.fetchImage(),function(e){t._loadedImages.push({id:d,image:e})})):(r instanceof HTMLCanvasElement||r instanceof HTMLImageElement)&&t._loadedImages.push({id:d,image:r}),t._texturePaths[d]=r))}}}function createCubeMapUpdateFunction(o){return function(t,e){var i,r,n=t.uniforms[o];if(n instanceof CubeMap){var a=t._textures[o];return a!==t._defaultTexture&&a.destroy(),t._texturePaths[o]=void 0,void(t._textures[o]=n)}defined(t._textures[o])||(t._texturePaths[o]=void 0,t._textures[o]=e.defaultCubeMap),n===Material.DefaultCubeMapId||(i=n.positiveX+n.negativeX+n.positiveY+n.negativeY+n.positiveZ+n.negativeZ)!==t._texturePaths[o]&&(r=[Resource.createIfNeeded(n.positiveX).fetchImage(),Resource.createIfNeeded(n.negativeX).fetchImage(),Resource.createIfNeeded(n.positiveY).fetchImage(),Resource.createIfNeeded(n.negativeY).fetchImage(),Resource.createIfNeeded(n.positiveZ).fetchImage(),Resource.createIfNeeded(n.negativeZ).fetchImage()],when.all(r).then(function(e){t._loadedCubeMaps.push({id:o,images:e})}),t._texturePaths[o]=i)}}function createUniforms(e){var t=e._template.uniforms;for(var i in t)t.hasOwnProperty(i)&&createUniform(e,i)}function createUniform(e,t){e._strict;var i,r,n,a,o=e._template.uniforms,s=o[t],l=getUniformType(s);"channels"===l?replaceToken(e,t,s,!1):("sampler2D"!==l||0<getNumberOfTokens(e,i=t+"Dimensions")&&(o[i]={type:"ivec3",x:1,y:1},createUniform(e,i)),new RegExp("uniform\\s+"+l+"\\s+"+t+"\\s*;").test(e.shaderSource)||(r="uniform "+l+" "+t+";",e.shaderSource=r+e.shaderSource),n=t+"_"+e._count++,replaceToken(e,t,n),e.uniforms[t]=s,"sampler2D"===l?(e._uniforms[n]=function(){return e._textures[t]},e._updateFunctions.push(createTexture2DUpdateFunction(t))):"samplerCube"===l?(e._uniforms[n]=function(){return e._textures[t]},e._updateFunctions.push(createCubeMapUpdateFunction(t))):-1!==l.indexOf("mat")?(a=new matrixMap[l],e._uniforms[n]=function(){return matrixMap[l].fromColumnMajorArray(e.uniforms[t],a)}):e._uniforms[n]=function(){return e.uniforms[t]})}function getUniformType(e){var t=e.type;if(!defined(t)){var i=typeof e;if("number"==i)t="float";else if("boolean"==i)t="bool";else if("string"==i||e instanceof Resource||e instanceof HTMLCanvasElement||e instanceof HTMLImageElement)t=/^([rgba]){1,4}$/i.test(e)?"channels":e===Material.DefaultCubeMapId?"samplerCube":"sampler2D";else if("object"==i)if(Array.isArray(e))4!==e.length&&9!==e.length&&16!==e.length||(t="mat"+Math.sqrt(e.length));else{var r=0;for(var n in e)e.hasOwnProperty(n)&&(r+=1);2<=r&&r<=4?t="vec"+r:6===r&&(t="samplerCube")}}return t}function createSubMaterials(e){var t,i,r,n=e._strict,a=e._template.materials;for(var o in a){a.hasOwnProperty(o)&&(t=new Material({strict:n,fabric:a[o],count:e._count}),e._count=t._count,e._uniforms=combine(e._uniforms,t._uniforms,!0),e.materials[o]=t,e._translucentFunctions=e._translucentFunctions.concat(t._translucentFunctions),replaceToken(t,i="czm_getMaterial",r=i+"_"+e._count++),e.shaderSource=t.shaderSource+e.shaderSource,replaceToken(e,o,r+"(materialInput)"))}}function replaceToken(e,t,r,i){i=defaultValue(i,!0);var n=0,a=new RegExp("([\\w"+(i?".":"")+"])?"+t+"([\\w])?","g");return e.shaderSource=e.shaderSource.replace(a,function(e,t,i){return t||i?e:(n+=1,r)}),n}function getNumberOfTokens(e,t,i){return replaceToken(e,t,t,i)}function MaterialAppearance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.translucent,!0),i=defaultValue(e.closed,!1),r=defaultValue(e.materialSupport,MaterialAppearance.MaterialSupport.TEXTURED);this.material=defined(e.material)?e.material:Material.fromType(Material.ColorType),this.translucent=t,this._vertexShaderSource=defaultValue(e.vertexShaderSource,r.vertexShaderSource),this._fragmentShaderSource=defaultValue(e.fragmentShaderSource,r.fragmentShaderSource),this._renderState=Appearance.getDefaultRenderState(t,i,e.renderState),this._closed=i,this._materialSupport=r,this._vertexFormat=r.vertexFormat,this._flat=defaultValue(e.flat,!1),this._faceForward=defaultValue(e.faceForward,!i)}Material._materialCache={_materials:{},addMaterial:function(e,t){this._materials[e]=t},getMaterial:function(e){return this._materials[e]}},Material.DefaultImageId="czm_defaultImage",Material.DefaultCubeMapId="czm_defaultCubeMap",Material.ColorType="Color",Material._materialCache.addMaterial(Material.ColorType,{fabric:{type:Material.ColorType,uniforms:{color:new Color(1,0,0,.5)},components:{diffuse:"color.rgb",alpha:"color.a"}},translucent:function(e){return e.uniforms.color.alpha<1}}),Material.ImageType="Image",Material._materialCache.addMaterial(Material.ImageType,{fabric:{type:Material.ImageType,uniforms:{image:Material.DefaultImageId,repeat:new Cartesian2(1,1),color:new Color(1,1,1,1)},components:{diffuse:"texture2D(image, fract(repeat * materialInput.st)).rgb * color.rgb",alpha:"texture2D(image, fract(repeat * materialInput.st)).a * color.a"}},translucent:function(e){return e.uniforms.color.alpha<1}}),Material.DiffuseMapType="DiffuseMap",Material._materialCache.addMaterial(Material.DiffuseMapType,{fabric:{type:Material.DiffuseMapType,uniforms:{image:Material.DefaultImageId,channels:"rgb",repeat:new Cartesian2(1,1)},components:{diffuse:"texture2D(image, fract(repeat * materialInput.st)).channels"}},translucent:!1}),Material.AlphaMapType="AlphaMap",Material._materialCache.addMaterial(Material.AlphaMapType,{fabric:{type:Material.AlphaMapType,uniforms:{image:Material.DefaultImageId,channel:"a",repeat:new Cartesian2(1,1)},components:{alpha:"texture2D(image, fract(repeat * materialInput.st)).channel"}},translucent:!0}),Material.SpecularMapType="SpecularMap",Material._materialCache.addMaterial(Material.SpecularMapType,{fabric:{type:Material.SpecularMapType,uniforms:{image:Material.DefaultImageId,channel:"r",repeat:new Cartesian2(1,1)},components:{specular:"texture2D(image, fract(repeat * materialInput.st)).channel"}},translucent:!1}),Material.EmissionMapType="EmissionMap",Material._materialCache.addMaterial(Material.EmissionMapType,{fabric:{type:Material.EmissionMapType,uniforms:{image:Material.DefaultImageId,channels:"rgb",repeat:new Cartesian2(1,1)},components:{emission:"texture2D(image, fract(repeat * materialInput.st)).channels"}},translucent:!1}),Material.BumpMapType="BumpMap",Material._materialCache.addMaterial(Material.BumpMapType,{fabric:{type:Material.BumpMapType,uniforms:{image:Material.DefaultImageId,channel:"r",strength:.8,repeat:new Cartesian2(1,1)},source:BumpMapMaterial},translucent:!1}),Material.NormalMapType="NormalMap",Material._materialCache.addMaterial(Material.NormalMapType,{fabric:{type:Material.NormalMapType,uniforms:{image:Material.DefaultImageId,channels:"rgb",strength:.8,repeat:new Cartesian2(1,1)},source:NormalMapMaterial},translucent:!1}),Material.GridType="Grid",Material._materialCache.addMaterial(Material.GridType,{fabric:{type:Material.GridType,uniforms:{color:new Color(0,1,0,1),cellAlpha:.1,lineCount:new Cartesian2(8,8),lineThickness:new Cartesian2(1,1),lineOffset:new Cartesian2(0,0)},source:GridMaterial},translucent:function(e){var t=e.uniforms;return t.color.alpha<1||t.cellAlpha<1}}),Material.StripeType="Stripe",Material._materialCache.addMaterial(Material.StripeType,{fabric:{type:Material.StripeType,uniforms:{horizontal:!0,evenColor:new Color(1,1,1,.5),oddColor:new Color(0,0,1,.5),offset:0,repeat:5},source:StripeMaterial},translucent:function(e){var t=e.uniforms;return t.evenColor.alpha<1||t.oddColor.alpha<1}}),Material.CheckerboardType="Checkerboard",Material._materialCache.addMaterial(Material.CheckerboardType,{fabric:{type:Material.CheckerboardType,uniforms:{lightColor:new Color(1,1,1,.5),darkColor:new Color(0,0,0,.5),repeat:new Cartesian2(5,5)},source:CheckerboardMaterial},translucent:function(e){var t=e.uniforms;return t.lightColor.alpha<1||t.darkColor.alpha<1}}),Material.DotType="Dot",Material._materialCache.addMaterial(Material.DotType,{fabric:{type:Material.DotType,uniforms:{lightColor:new Color(1,1,0,.75),darkColor:new Color(0,1,1,.75),repeat:new Cartesian2(5,5)},source:DotMaterial},translucent:function(e){var t=e.uniforms;return t.lightColor.alpha<1||t.darkColor.alpha<1}}),Material.WaterType="Water",Material._materialCache.addMaterial(Material.WaterType,{fabric:{type:Material.WaterType,uniforms:{baseWaterColor:new Color(.2,.3,.6,1),blendColor:new Color(0,1,.699,1),specularMap:Material.DefaultImageId,normalMap:Material.DefaultImageId,frequency:10,animationSpeed:.01,amplitude:1,specularIntensity:.5,fadeFactor:1},source:WaterMaterial},translucent:function(e){var t=e.uniforms;return t.baseWaterColor.alpha<1||t.blendColor.alpha<1}}),Material.RimLightingType="RimLighting",Material._materialCache.addMaterial(Material.RimLightingType,{fabric:{type:Material.RimLightingType,uniforms:{color:new Color(1,0,0,.7),rimColor:new Color(1,1,1,.4),width:.3},source:RimLightingMaterial},translucent:function(e){var t=e.uniforms;return t.color.alpha<1||t.rimColor.alpha<1}}),Material.FadeType="Fade",Material._materialCache.addMaterial(Material.FadeType,{fabric:{type:Material.FadeType,uniforms:{fadeInColor:new Color(1,0,0,1),fadeOutColor:new Color(0,0,0,0),maximumDistance:.5,repeat:!0,fadeDirection:{x:!0,y:!0},time:new Cartesian2(.5,.5)},source:FadeMaterial},translucent:function(e){var t=e.uniforms;return t.fadeInColor.alpha<1||t.fadeOutColor.alpha<1}}),Material.PolylineArrowType="PolylineArrow",Material._materialCache.addMaterial(Material.PolylineArrowType,{fabric:{type:Material.PolylineArrowType,uniforms:{color:new Color(1,1,1,1)},source:PolylineArrowMaterial},translucent:!0}),Material.PolylineDashType="PolylineDash",Material._materialCache.addMaterial(Material.PolylineDashType,{fabric:{type:Material.PolylineDashType,uniforms:{color:new Color(1,0,1,1),gapColor:new Color(0,0,0,0),dashLength:16,dashPattern:255},source:PolylineDashMaterial},translucent:!0}),Material.PolylineGlowType="PolylineGlow",Material._materialCache.addMaterial(Material.PolylineGlowType,{fabric:{type:Material.PolylineGlowType,uniforms:{color:new Color(0,.5,1,1),glowPower:.25,taperPower:1},source:PolylineGlowMaterial},translucent:!0}),Material.PolylineOutlineType="PolylineOutline",Material._materialCache.addMaterial(Material.PolylineOutlineType,{fabric:{type:Material.PolylineOutlineType,uniforms:{color:new Color(1,1,1,1),outlineColor:new Color(1,0,0,1),outlineWidth:1},source:PolylineOutlineMaterial},translucent:function(e){var t=e.uniforms;return t.color.alpha<1||t.outlineColor.alpha<1}}),Material.ElevationContourType="ElevationContour",Material._materialCache.addMaterial(Material.ElevationContourType,{fabric:{type:Material.ElevationContourType,uniforms:{spacing:100,color:new Color(1,0,0,1),width:1},source:ElevationContourMaterial},translucent:!1}),Material.ElevationRampType="ElevationRamp",Material._materialCache.addMaterial(Material.ElevationRampType,{fabric:{type:Material.ElevationRampType,uniforms:{image:Material.DefaultImageId,minimumHeight:0,maximumHeight:1e4},source:ElevationRampMaterial},translucent:!1}),Material.SlopeRampMaterialType="SlopeRamp",Material._materialCache.addMaterial(Material.SlopeRampMaterialType,{fabric:{type:Material.SlopeRampMaterialType,uniforms:{image:Material.DefaultImageId},source:SlopeRampMaterial},translucent:!1}),Material.AspectRampMaterialType="AspectRamp",Material._materialCache.addMaterial(Material.AspectRampMaterialType,{fabric:{type:Material.AspectRampMaterialType,uniforms:{image:Material.DefaultImageId},source:AspectRampMaterial},translucent:!1}),Object.defineProperties(MaterialAppearance.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},materialSupport:{get:function(){return this._materialSupport}},vertexFormat:{get:function(){return this._vertexFormat}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}}}),MaterialAppearance.prototype.getFragmentShaderSource=Appearance.prototype.getFragmentShaderSource,MaterialAppearance.prototype.isTranslucent=Appearance.prototype.isTranslucent,MaterialAppearance.prototype.getRenderState=Appearance.prototype.getRenderState,MaterialAppearance.MaterialSupport={BASIC:Object.freeze({vertexFormat:VertexFormat.POSITION_AND_NORMAL,vertexShaderSource:BasicMaterialAppearanceVS,fragmentShaderSource:BasicMaterialAppearanceFS}),TEXTURED:Object.freeze({vertexFormat:VertexFormat.POSITION_NORMAL_AND_ST,vertexShaderSource:TexturedMaterialAppearanceVS,fragmentShaderSource:TexturedMaterialAppearanceFS}),ALL:Object.freeze({vertexFormat:VertexFormat.ALL,vertexShaderSource:AllMaterialAppearanceVS,fragmentShaderSource:AllMaterialAppearanceFS})};var PerInstanceColorAppearanceFS="varying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvarying vec4 v_color;\nvoid main()\n{\nvec3 positionToEyeEC = -v_positionEC;\nvec3 normalEC = normalize(v_normalEC);\n#ifdef FACE_FORWARD\nnormalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n#endif\nvec4 color = czm_gammaCorrect(v_color);\nczm_materialInput materialInput;\nmaterialInput.normalEC = normalEC;\nmaterialInput.positionToEyeEC = positionToEyeEC;\nczm_material material = czm_getDefaultMaterial(materialInput);\nmaterial.diffuse = color.rgb;\nmaterial.alpha = color.a;\ngl_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);\n}\n",PerInstanceColorAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 normal;\nattribute vec4 color;\nattribute float batchId;\nvarying vec3 v_positionEC;\nvarying vec3 v_normalEC;\nvarying vec4 v_color;\nvoid main()\n{\nvec4 p = czm_computePosition();\nv_positionEC = (czm_modelViewRelativeToEye * p).xyz;\nv_normalEC = czm_normal * normal;\nv_color = color;\ngl_Position = czm_modelViewProjectionRelativeToEye * p;\n}\n",PerInstanceFlatColorAppearanceFS="varying vec4 v_color;\nvoid main()\n{\ngl_FragColor = czm_gammaCorrect(v_color);\n}\n",PerInstanceFlatColorAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec4 color;\nattribute float batchId;\nvarying vec4 v_color;\nvoid main()\n{\nvec4 p = czm_computePosition();\nv_color = color;\ngl_Position = czm_modelViewProjectionRelativeToEye * p;\n}\n";function PerInstanceColorAppearance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.translucent,!0),i=defaultValue(e.closed,!1),r=defaultValue(e.flat,!1),n=r?PerInstanceFlatColorAppearanceVS:PerInstanceColorAppearanceVS,a=r?PerInstanceFlatColorAppearanceFS:PerInstanceColorAppearanceFS,o=r?PerInstanceColorAppearance.FLAT_VERTEX_FORMAT:PerInstanceColorAppearance.VERTEX_FORMAT;this.material=void 0,this.translucent=t,this._vertexShaderSource=defaultValue(e.vertexShaderSource,n),this._fragmentShaderSource=defaultValue(e.fragmentShaderSource,a),this._renderState=Appearance.getDefaultRenderState(t,i,e.renderState),this._closed=i,this._vertexFormat=o,this._flat=r,this._faceForward=defaultValue(e.faceForward,!i)}function ColorMaterialProperty(e){this._definitionChanged=new Event,this._color=void 0,this._colorSubscription=void 0,this.color=e}function DrawCommand(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._boundingVolume=e.boundingVolume,this._orientedBoundingBox=e.orientedBoundingBox,this._cull=defaultValue(e.cull,!0),this._occlude=defaultValue(e.occlude,!0),this._modelMatrix=e.modelMatrix,this._primitiveType=defaultValue(e.primitiveType,PrimitiveType$1.TRIANGLES),this._vertexArray=e.vertexArray,this._count=e.count,this._offset=defaultValue(e.offset,0),this._instanceCount=defaultValue(e.instanceCount,0),this._shaderProgram=e.shaderProgram,this._uniformMap=e.uniformMap,this._renderState=e.renderState,this._framebuffer=e.framebuffer,this._pass=e.pass,this._executeInClosestFrustum=defaultValue(e.executeInClosestFrustum,!1),this._owner=e.owner,this._debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this._debugOverlappingFrustums=0,this._castShadows=defaultValue(e.castShadows,!1),this._receiveShadows=defaultValue(e.receiveShadows,!1),this._pickId=e.pickId,this._pickOnly=defaultValue(e.pickOnly,!1),this.dirty=!0,this.lastDirtyTime=0,this.derivedCommands={}}Object.defineProperties(PerInstanceColorAppearance.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}}}),PerInstanceColorAppearance.VERTEX_FORMAT=VertexFormat.POSITION_AND_NORMAL,PerInstanceColorAppearance.FLAT_VERTEX_FORMAT=VertexFormat.POSITION_ONLY,PerInstanceColorAppearance.prototype.getFragmentShaderSource=Appearance.prototype.getFragmentShaderSource,PerInstanceColorAppearance.prototype.isTranslucent=Appearance.prototype.isTranslucent,PerInstanceColorAppearance.prototype.getRenderState=Appearance.prototype.getRenderState,Object.defineProperties(ColorMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._color)}},definitionChanged:{get:function(){return this._definitionChanged}},color:createPropertyDescriptor("color")}),ColorMaterialProperty.prototype.getType=function(e){return"Color"},ColorMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.color=Property.getValueOrClonedDefault(this._color,e,Color.WHITE,t.color),t},ColorMaterialProperty.prototype.equals=function(e){return this===e||e instanceof ColorMaterialProperty&&Property.equals(this._color,e._color)},Object.defineProperties(DrawCommand.prototype,{boundingVolume:{get:function(){return this._boundingVolume},set:function(e){this._boundingVolume!==e&&(this._boundingVolume=e,this.dirty=!0)}},orientedBoundingBox:{get:function(){return this._orientedBoundingBox},set:function(e){this._orientedBoundingBox!==e&&(this._orientedBoundingBox=e,this.dirty=!0)}},cull:{get:function(){return this._cull},set:function(e){this._cull!==e&&(this._cull=e,this.dirty=!0)}},occlude:{get:function(){return this._occlude},set:function(e){this._occlude!==e&&(this._occlude=e,this.dirty=!0)}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._modelMatrix!==e&&(this._modelMatrix=e,this.dirty=!0)}},primitiveType:{get:function(){return this._primitiveType},set:function(e){this._primitiveType!==e&&(this._primitiveType=e,this.dirty=!0)}},vertexArray:{get:function(){return this._vertexArray},set:function(e){this._vertexArray!==e&&(this._vertexArray=e,this.dirty=!0)}},count:{get:function(){return this._count},set:function(e){this._count!==e&&(this._count=e,this.dirty=!0)}},offset:{get:function(){return this._offset},set:function(e){this._offset!==e&&(this._offset=e,this.dirty=!0)}},instanceCount:{get:function(){return this._instanceCount},set:function(e){this._instanceCount!==e&&(this._instanceCount=e,this.dirty=!0)}},shaderProgram:{get:function(){return this._shaderProgram},set:function(e){this._shaderProgram!==e&&(this._shaderProgram=e,this.dirty=!0)}},castShadows:{get:function(){return this._castShadows},set:function(e){this._castShadows!==e&&(this._castShadows=e,this.dirty=!0)}},receiveShadows:{get:function(){return this._receiveShadows},set:function(e){this._receiveShadows!==e&&(this._receiveShadows=e,this.dirty=!0)}},uniformMap:{get:function(){return this._uniformMap},set:function(e){this._uniformMap!==e&&(this._uniformMap=e,this.dirty=!0)}},renderState:{get:function(){return this._renderState},set:function(e){this._renderState!==e&&(this._renderState=e,this.dirty=!0)}},framebuffer:{get:function(){return this._framebuffer},set:function(e){this._framebuffer!==e&&(this._framebuffer=e,this.dirty=!0)}},pass:{get:function(){return this._pass},set:function(e){this._pass!==e&&(this._pass=e,this.dirty=!0)}},executeInClosestFrustum:{get:function(){return this._executeInClosestFrustum},set:function(e){this._executeInClosestFrustum!==e&&(this._executeInClosestFrustum=e,this.dirty=!0)}},owner:{get:function(){return this._owner},set:function(e){this._owner!==e&&(this._owner=e,this.dirty=!0)}},debugShowBoundingVolume:{get:function(){return this._debugShowBoundingVolume},set:function(e){this._debugShowBoundingVolume!==e&&(this._debugShowBoundingVolume=e,this.dirty=!0)}},debugOverlappingFrustums:{get:function(){return this._debugOverlappingFrustums},set:function(e){this._debugOverlappingFrustums!==e&&(this._debugOverlappingFrustums=e,this.dirty=!0)}},pickId:{get:function(){return this._pickId},set:function(e){this._pickId!==e&&(this._pickId=e,this.dirty=!0)}},pickOnly:{get:function(){return this._pickOnly},set:function(e){this._pickOnly!==e&&(this._pickOnly=e,this.dirty=!0)}}}),DrawCommand.shallowClone=function(e,t){if(defined(e))return defined(t)||(t=new DrawCommand),t._boundingVolume=e._boundingVolume,t._orientedBoundingBox=e._orientedBoundingBox,t._cull=e._cull,t._occlude=e._occlude,t._modelMatrix=e._modelMatrix,t._primitiveType=e._primitiveType,t._vertexArray=e._vertexArray,t._count=e._count,t._offset=e._offset,t._instanceCount=e._instanceCount,t._shaderProgram=e._shaderProgram,t._uniformMap=e._uniformMap,t._renderState=e._renderState,t._framebuffer=e._framebuffer,t._pass=e._pass,t._executeInClosestFrustum=e._executeInClosestFrustum,t._owner=e._owner,t._debugShowBoundingVolume=e._debugShowBoundingVolume,t._debugOverlappingFrustums=e._debugOverlappingFrustums,t._castShadows=e._castShadows,t._receiveShadows=e._receiveShadows,t._pickId=e._pickId,t._pickOnly=e._pickOnly,t.dirty=!0,t.lastDirtyTime=0,t},DrawCommand.prototype.execute=function(e,t){e.draw(this,t)};var Pass={ENVIRONMENT:0,COMPUTE:1,GLOBE:2,TERRAIN_CLASSIFICATION:3,CESIUM_3D_TILE:4,CESIUM_3D_TILE_CLASSIFICATION:5,CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW:6,OPAQUE:7,TRANSLUCENT:8,OVERLAY:9,NUMBER_OF_PASSES:10},Pass$1=Object.freeze(Pass);function freezeRenderState(e){if("object"!=typeof e||null===e)return e;for(var t,i=Object.keys(e),r=0;r<i.length;r++)t=i[r],e.hasOwnProperty(t)&&"_applyFunctions"!==t&&(e[t]=freezeRenderState(e[t]));return Object.freeze(e)}function RenderState(e){var t=defaultValue(e,defaultValue.EMPTY_OBJECT),i=defaultValue(t.cull,defaultValue.EMPTY_OBJECT),r=defaultValue(t.polygonOffset,defaultValue.EMPTY_OBJECT),n=defaultValue(t.scissorTest,defaultValue.EMPTY_OBJECT),a=defaultValue(n.rectangle,defaultValue.EMPTY_OBJECT),o=defaultValue(t.depthRange,defaultValue.EMPTY_OBJECT),s=defaultValue(t.depthTest,defaultValue.EMPTY_OBJECT),l=defaultValue(t.colorMask,defaultValue.EMPTY_OBJECT),c=defaultValue(t.blending,defaultValue.EMPTY_OBJECT),u=defaultValue(c.color,defaultValue.EMPTY_OBJECT),d=defaultValue(t.stencilTest,defaultValue.EMPTY_OBJECT),h=defaultValue(d.frontOperation,defaultValue.EMPTY_OBJECT),p=defaultValue(d.backOperation,defaultValue.EMPTY_OBJECT),m=defaultValue(t.sampleCoverage,defaultValue.EMPTY_OBJECT),f=t.viewport;this.frontFace=defaultValue(t.frontFace,WindingOrder$1.COUNTER_CLOCKWISE),this.cull={enabled:defaultValue(i.enabled,!1),face:defaultValue(i.face,WebGLConstants$1.BACK)},this.lineWidth=defaultValue(t.lineWidth,1),this.polygonOffset={enabled:defaultValue(r.enabled,!1),factor:defaultValue(r.factor,0),units:defaultValue(r.units,0)},this.scissorTest={enabled:defaultValue(n.enabled,!1),rectangle:BoundingRectangle.clone(a)},this.depthRange={near:defaultValue(o.near,0),far:defaultValue(o.far,1)},this.depthTest={enabled:defaultValue(s.enabled,!1),func:defaultValue(s.func,WebGLConstants$1.LESS)},this.colorMask={red:defaultValue(l.red,!0),green:defaultValue(l.green,!0),blue:defaultValue(l.blue,!0),alpha:defaultValue(l.alpha,!0)},this.depthMask=defaultValue(t.depthMask,!0),this.stencilMask=defaultValue(t.stencilMask,-1),this.blending={enabled:defaultValue(c.enabled,!1),color:new Color(defaultValue(u.red,0),defaultValue(u.green,0),defaultValue(u.blue,0),defaultValue(u.alpha,0)),equationRgb:defaultValue(c.equationRgb,WebGLConstants$1.FUNC_ADD),equationAlpha:defaultValue(c.equationAlpha,WebGLConstants$1.FUNC_ADD),functionSourceRgb:defaultValue(c.functionSourceRgb,WebGLConstants$1.ONE),functionSourceAlpha:defaultValue(c.functionSourceAlpha,WebGLConstants$1.ONE),functionDestinationRgb:defaultValue(c.functionDestinationRgb,WebGLConstants$1.ZERO),functionDestinationAlpha:defaultValue(c.functionDestinationAlpha,WebGLConstants$1.ZERO)},this.stencilTest={enabled:defaultValue(d.enabled,!1),frontFunction:defaultValue(d.frontFunction,WebGLConstants$1.ALWAYS),backFunction:defaultValue(d.backFunction,WebGLConstants$1.ALWAYS),reference:defaultValue(d.reference,0),mask:defaultValue(d.mask,-1),frontOperation:{fail:defaultValue(h.fail,WebGLConstants$1.KEEP),zFail:defaultValue(h.zFail,WebGLConstants$1.KEEP),zPass:defaultValue(h.zPass,WebGLConstants$1.KEEP)},backOperation:{fail:defaultValue(p.fail,WebGLConstants$1.KEEP),zFail:defaultValue(p.zFail,WebGLConstants$1.KEEP),zPass:defaultValue(p.zPass,WebGLConstants$1.KEEP)}},this.sampleCoverage={enabled:defaultValue(m.enabled,!1),value:defaultValue(m.value,1),invert:defaultValue(m.invert,!1)},this.viewport=defined(f)?new BoundingRectangle(f.x,f.y,f.width,f.height):void 0,this.id=0,this._applyFunctions=[]}var nextRenderStateId=0,renderStateCache={};function enableOrDisable(e,t,i){i?e.enable(t):e.disable(t)}function applyFrontFace(e,t){e.frontFace(t.frontFace)}function applyCull(e,t){var i=t.cull,r=i.enabled;enableOrDisable(e,e.CULL_FACE,r),r&&e.cullFace(i.face)}function applyLineWidth(e,t){e.lineWidth(t.lineWidth)}function applyPolygonOffset(e,t){var i=t.polygonOffset,r=i.enabled;enableOrDisable(e,e.POLYGON_OFFSET_FILL,r),r&&e.polygonOffset(i.factor,i.units)}function applyScissorTest(e,t,i){var r,n=t.scissorTest,a=defined(i.scissorTest)?i.scissorTest.enabled:n.enabled;enableOrDisable(e,e.SCISSOR_TEST,a),a&&(r=defined(i.scissorTest)?i.scissorTest.rectangle:n.rectangle,e.scissor(r.x,r.y,r.width,r.height))}function applyDepthRange(e,t){var i=t.depthRange;e.depthRange(i.near,i.far)}function applyDepthTest(e,t){var i=t.depthTest,r=i.enabled;enableOrDisable(e,e.DEPTH_TEST,r),r&&e.depthFunc(i.func)}function applyColorMask(e,t){var i=t.colorMask;e.colorMask(i.red,i.green,i.blue,i.alpha)}function applyDepthMask(e,t){e.depthMask(t.depthMask)}function applyStencilMask(e,t){e.stencilMask(t.stencilMask)}function applyBlendingColor(e,t){e.blendColor(t.red,t.green,t.blue,t.alpha)}function applyBlending(e,t,i){var r=t.blending,n=defined(i.blendingEnabled)?i.blendingEnabled:r.enabled;enableOrDisable(e,e.BLEND,n),n&&(applyBlendingColor(e,r.color),e.blendEquationSeparate(r.equationRgb,r.equationAlpha),e.blendFuncSeparate(r.functionSourceRgb,r.functionDestinationRgb,r.functionSourceAlpha,r.functionDestinationAlpha))}function applyStencilTest(e,t){var i,r,n,a,o,s,l,c,u,d,h,p,m=t.stencilTest,f=m.enabled;enableOrDisable(e,e.STENCIL_TEST,f),f&&(i=m.frontFunction,r=m.backFunction,n=m.reference,a=m.mask,e.stencilFunc(i,n,a),e.stencilFuncSeparate(e.BACK,r,n,a),e.stencilFuncSeparate(e.FRONT,i,n,a),s=(o=m.frontOperation).fail,l=o.zFail,c=o.zPass,e.stencilOpSeparate(e.FRONT,s,l,c),d=(u=m.backOperation).fail,h=u.zFail,p=u.zPass,e.stencilOpSeparate(e.BACK,d,h,p))}function applySampleCoverage(e,t){var i=t.sampleCoverage,r=i.enabled;enableOrDisable(e,e.SAMPLE_COVERAGE,r),r&&e.sampleCoverage(i.value,i.invert)}RenderState.fromCache=function(e){var t=JSON.stringify(e),i=renderStateCache[t];if(defined(i))return++i.referenceCount,i.state;var r=new RenderState(e),n=JSON.stringify(r);return defined(i=renderStateCache[n])||(r.id=nextRenderStateId++,i={referenceCount:0,state:r},renderStateCache[n]=i),++i.referenceCount,renderStateCache[t]={referenceCount:1,state:i.state},i.state},RenderState.removeFromCache=function(e){var t=new RenderState(e),i=JSON.stringify(t),r=renderStateCache[i],n=JSON.stringify(e),a=renderStateCache[n];defined(a)&&(--a.referenceCount,0===a.referenceCount&&(delete renderStateCache[n],defined(r)&&--r.referenceCount)),defined(r)&&0===r.referenceCount&&delete renderStateCache[i]},RenderState.getCache=function(){return renderStateCache},RenderState.clearCache=function(){renderStateCache={}};var scratchViewport=new BoundingRectangle;function applyViewport(e,t,i){var r=defaultValue(t.viewport,i.viewport);defined(r)||((r=scratchViewport).width=i.context.drawingBufferWidth,r.height=i.context.drawingBufferHeight),i.context.uniformState.viewport=r,e.viewport(r.x,r.y,r.width,r.height)}function createFuncs(e,t){var i=[];return e.frontFace!==t.frontFace&&i.push(applyFrontFace),e.cull.enabled===t.cull.enabled&&e.cull.face===t.cull.face||i.push(applyCull),e.lineWidth!==t.lineWidth&&i.push(applyLineWidth),e.polygonOffset.enabled===t.polygonOffset.enabled&&e.polygonOffset.factor===t.polygonOffset.factor&&e.polygonOffset.units===t.polygonOffset.units||i.push(applyPolygonOffset),e.depthRange.near===t.depthRange.near&&e.depthRange.far===t.depthRange.far||i.push(applyDepthRange),e.depthTest.enabled===t.depthTest.enabled&&e.depthTest.func===t.depthTest.func||i.push(applyDepthTest),e.colorMask.red===t.colorMask.red&&e.colorMask.green===t.colorMask.green&&e.colorMask.blue===t.colorMask.blue&&e.colorMask.alpha===t.colorMask.alpha||i.push(applyColorMask),e.depthMask!==t.depthMask&&i.push(applyDepthMask),e.stencilMask!==t.stencilMask&&i.push(applyStencilMask),e.stencilTest.enabled===t.stencilTest.enabled&&e.stencilTest.frontFunction===t.stencilTest.frontFunction&&e.stencilTest.backFunction===t.stencilTest.backFunction&&e.stencilTest.reference===t.stencilTest.reference&&e.stencilTest.mask===t.stencilTest.mask&&e.stencilTest.frontOperation.fail===t.stencilTest.frontOperation.fail&&e.stencilTest.frontOperation.zFail===t.stencilTest.frontOperation.zFail&&e.stencilTest.backOperation.fail===t.stencilTest.backOperation.fail&&e.stencilTest.backOperation.zFail===t.stencilTest.backOperation.zFail&&e.stencilTest.backOperation.zPass===t.stencilTest.backOperation.zPass||i.push(applyStencilTest),e.sampleCoverage.enabled===t.sampleCoverage.enabled&&e.sampleCoverage.value===t.sampleCoverage.value&&e.sampleCoverage.invert===t.sampleCoverage.invert||i.push(applySampleCoverage),i}RenderState.apply=function(e,t,i){applyFrontFace(e,t),applyCull(e,t),applyLineWidth(e,t),applyPolygonOffset(e,t),applyDepthRange(e,t),applyDepthTest(e,t),applyColorMask(e,t),applyDepthMask(e,t),applyStencilMask(e,t),applyStencilTest(e,t),applySampleCoverage(e,t),applyScissorTest(e,t,i),applyBlending(e,t,i),applyViewport(e,t,i)},RenderState.partialApply=function(e,t,i,r,n,a){if(t!==i){var o=i._applyFunctions[t.id];defined(o)||(o=createFuncs(t,i),i._applyFunctions[t.id]=o);for(var s=o.length,l=0;l<s;++l)o[l](e,i)}(defined(r.scissorTest)?r.scissorTest:t.scissorTest)===(defined(n.scissorTest)?n.scissorTest:i.scissorTest)&&!a||applyScissorTest(e,i,n);var c=defined(r.blendingEnabled)?r.blendingEnabled:t.blending.enabled,u=defined(n.blendingEnabled)?n.blendingEnabled:i.blending.enabled;(c!==u||u&&t.blending!==i.blending)&&applyBlending(e,i,n),t===i&&r===n&&r.context===n.context||applyViewport(e,i,n)},RenderState.getState=function(e){return{frontFace:e.frontFace,cull:{enabled:e.cull.enabled,face:e.cull.face},lineWidth:e.lineWidth,polygonOffset:{enabled:e.polygonOffset.enabled,factor:e.polygonOffset.factor,units:e.polygonOffset.units},scissorTest:{enabled:e.scissorTest.enabled,rectangle:BoundingRectangle.clone(e.scissorTest.rectangle)},depthRange:{near:e.depthRange.near,far:e.depthRange.far},depthTest:{enabled:e.depthTest.enabled,func:e.depthTest.func},colorMask:{red:e.colorMask.red,green:e.colorMask.green,blue:e.colorMask.blue,alpha:e.colorMask.alpha},depthMask:e.depthMask,stencilMask:e.stencilMask,blending:{enabled:e.blending.enabled,color:Color.clone(e.blending.color),equationRgb:e.blending.equationRgb,equationAlpha:e.blending.equationAlpha,functionSourceRgb:e.blending.functionSourceRgb,functionSourceAlpha:e.blending.functionSourceAlpha,functionDestinationRgb:e.blending.functionDestinationRgb,functionDestinationAlpha:e.blending.functionDestinationAlpha},stencilTest:{enabled:e.stencilTest.enabled,frontFunction:e.stencilTest.frontFunction,backFunction:e.stencilTest.backFunction,reference:e.stencilTest.reference,mask:e.stencilTest.mask,frontOperation:{fail:e.stencilTest.frontOperation.fail,zFail:e.stencilTest.frontOperation.zFail,zPass:e.stencilTest.frontOperation.zPass},backOperation:{fail:e.stencilTest.backOperation.fail,zFail:e.stencilTest.backOperation.zFail,zPass:e.stencilTest.backOperation.zPass}},sampleCoverage:{enabled:e.sampleCoverage.enabled,value:e.sampleCoverage.value,invert:e.sampleCoverage.invert},viewport:defined(e.viewport)?BoundingRectangle.clone(e.viewport):void 0}};var viewerPositionWCScratch=new Cartesian3;function AutomaticUniform(e){this._size=e.size,this._datatype=e.datatype,this.getValue=e.getValue}var datatypeToGlsl={};datatypeToGlsl[WebGLConstants$1.FLOAT]="float",datatypeToGlsl[WebGLConstants$1.FLOAT_VEC2]="vec2",datatypeToGlsl[WebGLConstants$1.FLOAT_VEC3]="vec3",datatypeToGlsl[WebGLConstants$1.FLOAT_VEC4]="vec4",datatypeToGlsl[WebGLConstants$1.INT]="int",datatypeToGlsl[WebGLConstants$1.INT_VEC2]="ivec2",datatypeToGlsl[WebGLConstants$1.INT_VEC3]="ivec3",datatypeToGlsl[WebGLConstants$1.INT_VEC4]="ivec4",datatypeToGlsl[WebGLConstants$1.BOOL]="bool",datatypeToGlsl[WebGLConstants$1.BOOL_VEC2]="bvec2",datatypeToGlsl[WebGLConstants$1.BOOL_VEC3]="bvec3",datatypeToGlsl[WebGLConstants$1.BOOL_VEC4]="bvec4",datatypeToGlsl[WebGLConstants$1.FLOAT_MAT2]="mat2",datatypeToGlsl[WebGLConstants$1.FLOAT_MAT3]="mat3",datatypeToGlsl[WebGLConstants$1.FLOAT_MAT4]="mat4",datatypeToGlsl[WebGLConstants$1.SAMPLER_2D]="sampler2D",datatypeToGlsl[WebGLConstants$1.SAMPLER_CUBE]="samplerCube",AutomaticUniform.prototype.getDeclaration=function(e){var t="uniform "+datatypeToGlsl[this._datatype]+" "+e,i=this._size;return t+=1===i?";":"["+i.toString()+"];"};var AutomaticUniforms={czm_viewport:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC4,getValue:function(e){return e.viewportCartesian4}}),czm_viewportOrthographic:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.viewportOrthographic}}),czm_viewportTransformation:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.viewportTransformation}}),czm_globeDepthTexture:new AutomaticUniform({size:1,datatype:WebGLConstants$1.SAMPLER_2D,getValue:function(e){return e.globeDepthTexture}}),czm_model:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.model}}),czm_inverseModel:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseModel}}),czm_view:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.view}}),czm_view3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.view3D}}),czm_viewRotation:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.viewRotation}}),czm_viewRotation3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.viewRotation3D}}),czm_inverseView:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseView}}),czm_inverseView3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseView3D}}),czm_inverseViewRotation:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.inverseViewRotation}}),czm_inverseViewRotation3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.inverseViewRotation3D}}),czm_projection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.projection}}),czm_inverseProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseProjection}}),czm_infiniteProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.infiniteProjection}}),czm_modelView:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.modelView}}),czm_modelView3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.modelView3D}}),czm_modelViewRelativeToEye:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.modelViewRelativeToEye}}),czm_inverseModelView:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseModelView}}),czm_inverseModelView3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseModelView3D}}),czm_viewProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.viewProjection}}),czm_inverseViewProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseViewProjection}}),czm_modelViewProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.modelViewProjection}}),czm_inverseModelViewProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.inverseModelViewProjection}}),czm_modelViewProjectionRelativeToEye:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.modelViewProjectionRelativeToEye}}),czm_modelViewInfiniteProjection:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT4,getValue:function(e){return e.modelViewInfiniteProjection}}),czm_orthographicIn3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.orthographicIn3D?1:0}}),czm_normal:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.normal}}),czm_normal3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.normal3D}}),czm_inverseNormal:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.inverseNormal}}),czm_inverseNormal3D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.inverseNormal3D}}),czm_eyeHeight:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.eyeHeight}}),czm_eyeHeight2D:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC2,getValue:function(e){return e.eyeHeight2D}}),czm_entireFrustum:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC2,getValue:function(e){return e.entireFrustum}}),czm_currentFrustum:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC2,getValue:function(e){return e.currentFrustum}}),czm_frustumPlanes:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC4,getValue:function(e){return e.frustumPlanes}}),czm_farDepthFromNearPlusOne:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.farDepthFromNearPlusOne}}),czm_log2FarDepthFromNearPlusOne:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.log2FarDepthFromNearPlusOne}}),czm_oneOverLog2FarDepthFromNearPlusOne:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.oneOverLog2FarDepthFromNearPlusOne}}),czm_sunPositionWC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.sunPositionWC}}),czm_sunPositionColumbusView:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.sunPositionColumbusView}}),czm_sunDirectionEC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.sunDirectionEC}}),czm_sunDirectionWC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.sunDirectionWC}}),czm_moonDirectionEC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.moonDirectionEC}}),czm_lightDirectionEC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.lightDirectionEC}}),czm_lightDirectionWC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.lightDirectionWC}}),czm_lightColor:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.lightColor}}),czm_lightColorHdr:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.lightColorHdr}}),czm_encodedCameraPositionMCHigh:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.encodedCameraPositionMCHigh}}),czm_encodedCameraPositionMCLow:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.encodedCameraPositionMCLow}}),czm_viewerPositionWC:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return Matrix4.getTranslation(e.inverseView,viewerPositionWCScratch)}}),czm_frameNumber:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.frameState.frameNumber}}),czm_morphTime:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.frameState.morphTime}}),czm_sceneMode:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.frameState.mode}}),czm_pass:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.pass}}),czm_backgroundColor:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC4,getValue:function(e){return e.backgroundColor}}),czm_brdfLut:new AutomaticUniform({size:1,datatype:WebGLConstants$1.SAMPLER_2D,getValue:function(e){return e.brdfLut}}),czm_environmentMap:new AutomaticUniform({size:1,datatype:WebGLConstants$1.SAMPLER_CUBE,getValue:function(e){return e.environmentMap}}),czm_specularEnvironmentMaps:new AutomaticUniform({size:1,datatype:WebGLConstants$1.SAMPLER_2D,getValue:function(e){return e.specularEnvironmentMaps}}),czm_specularEnvironmentMapSize:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC2,getValue:function(e){return e.specularEnvironmentMapsDimensions}}),czm_specularEnvironmentMapsMaximumLOD:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.specularEnvironmentMapsMaximumLOD}}),czm_sphericalHarmonicCoefficients:new AutomaticUniform({size:9,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.sphericalHarmonicCoefficients}}),czm_temeToPseudoFixed:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_MAT3,getValue:function(e){return e.temeToPseudoFixedMatrix}}),czm_pixelRatio:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.pixelRatio}}),czm_fogDensity:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.fogDensity}}),czm_imagerySplitPosition:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.imagerySplitPosition}}),czm_geometricToleranceOverMeter:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.geometricToleranceOverMeter}}),czm_minimumDisableDepthTestDistance:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.minimumDisableDepthTestDistance}}),czm_invertClassificationColor:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC4,getValue:function(e){return e.invertClassificationColor}}),czm_gamma:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT,getValue:function(e){return e.gamma}}),czm_ellipsoidRadii:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.ellipsoid.radii}}),czm_ellipsoidInverseRadii:new AutomaticUniform({size:1,datatype:WebGLConstants$1.FLOAT_VEC3,getValue:function(e){return e.ellipsoid.oneOverRadii}})};function createUniform$1(e,t,i,r){switch(t.type){case e.FLOAT:return new UniformFloat(e,t,i,r);case e.FLOAT_VEC2:return new UniformFloatVec2(e,t,i,r);case e.FLOAT_VEC3:return new UniformFloatVec3(e,t,i,r);case e.FLOAT_VEC4:return new UniformFloatVec4(e,t,i,r);case e.SAMPLER_2D:case e.SAMPLER_CUBE:return new UniformSampler(e,t,i,r);case e.INT:case e.BOOL:return new UniformInt(e,t,i,r);case e.INT_VEC2:case e.BOOL_VEC2:return new UniformIntVec2(e,t,i,r);case e.INT_VEC3:case e.BOOL_VEC3:return new UniformIntVec3(e,t,i,r);case e.INT_VEC4:case e.BOOL_VEC4:return new UniformIntVec4(e,t,i,r);case e.FLOAT_MAT2:return new UniformMat2(e,t,i,r);case e.FLOAT_MAT3:return new UniformMat3(e,t,i,r);case e.FLOAT_MAT4:return new UniformMat4(e,t,i,r);default:throw new RuntimeError("Unrecognized uniform type: "+t.type+' for uniform "'+i+'".')}}function UniformFloat(e,t,i,r){this.name=i,this.value=void 0,this._value=0,this._gl=e,this._location=r}function UniformFloatVec2(e,t,i,r){this.name=i,this.value=void 0,this._value=new Cartesian2,this._gl=e,this._location=r}function UniformFloatVec3(e,t,i,r){this.name=i,this.value=void 0,this._value=void 0,this._gl=e,this._location=r}function UniformFloatVec4(e,t,i,r){this.name=i,this.value=void 0,this._value=void 0,this._gl=e,this._location=r}function UniformSampler(e,t,i,r){this.name=i,this.value=void 0,this._gl=e,this._location=r,this.textureUnitIndex=void 0}function UniformInt(e,t,i,r){this.name=i,this.value=void 0,this._value=0,this._gl=e,this._location=r}function UniformIntVec2(e,t,i,r){this.name=i,this.value=void 0,this._value=new Cartesian2,this._gl=e,this._location=r}function UniformIntVec3(e,t,i,r){this.name=i,this.value=void 0,this._value=new Cartesian3,this._gl=e,this._location=r}function UniformIntVec4(e,t,i,r){this.name=i,this.value=void 0,this._value=new Cartesian4,this._gl=e,this._location=r}UniformFloat.prototype.set=function(){this.value!==this._value&&(this._value=this.value,this._gl.uniform1f(this._location,this.value))},UniformFloatVec2.prototype.set=function(){var e=this.value;Cartesian2.equals(e,this._value)||(Cartesian2.clone(e,this._value),this._gl.uniform2f(this._location,e.x,e.y))},UniformFloatVec3.prototype.set=function(){var e=this.value;defined(e.red)?Color.equals(e,this._value)||(this._value=Color.clone(e,this._value),this._gl.uniform3f(this._location,e.red,e.green,e.blue)):defined(e.x)&&(Cartesian3.equals(e,this._value)||(this._value=Cartesian3.clone(e,this._value),this._gl.uniform3f(this._location,e.x,e.y,e.z)))},UniformFloatVec4.prototype.set=function(){var e=this.value;defined(e.red)?Color.equals(e,this._value)||(this._value=Color.clone(e,this._value),this._gl.uniform4f(this._location,e.red,e.green,e.blue,e.alpha)):defined(e.x)&&(Cartesian4.equals(e,this._value)||(this._value=Cartesian4.clone(e,this._value),this._gl.uniform4f(this._location,e.x,e.y,e.z,e.w)))},UniformSampler.prototype.set=function(){var e=this._gl;e.activeTexture(e.TEXTURE0+this.textureUnitIndex);var t=this.value;e.bindTexture(t._target,t._texture)},UniformSampler.prototype._setSampler=function(e){return this.textureUnitIndex=e,this._gl.uniform1i(this._location,e),e+1},UniformInt.prototype.set=function(){this.value!==this._value&&(this._value=this.value,this._gl.uniform1i(this._location,this.value))},UniformIntVec2.prototype.set=function(){var e=this.value;Cartesian2.equals(e,this._value)||(Cartesian2.clone(e,this._value),this._gl.uniform2i(this._location,e.x,e.y))},UniformIntVec3.prototype.set=function(){var e=this.value;Cartesian3.equals(e,this._value)||(Cartesian3.clone(e,this._value),this._gl.uniform3i(this._location,e.x,e.y,e.z))},UniformIntVec4.prototype.set=function(){var e=this.value;Cartesian4.equals(e,this._value)||(Cartesian4.clone(e,this._value),this._gl.uniform4i(this._location,e.x,e.y,e.z,e.w))};var scratchUniformArray=new Float32Array(4);function UniformMat2(e,t,i,r){this.name=i,this.value=void 0,this._value=new Matrix2,this._gl=e,this._location=r}UniformMat2.prototype.set=function(){var e;Matrix2.equalsArray(this.value,this._value,0)||(Matrix2.clone(this.value,this._value),e=Matrix2.toArray(this.value,scratchUniformArray),this._gl.uniformMatrix2fv(this._location,!1,e))};var scratchMat3Array=new Float32Array(9);function UniformMat3(e,t,i,r){this.name=i,this.value=void 0,this._value=new Matrix3,this._gl=e,this._location=r}UniformMat3.prototype.set=function(){var e;Matrix3.equalsArray(this.value,this._value,0)||(Matrix3.clone(this.value,this._value),e=Matrix3.toArray(this.value,scratchMat3Array),this._gl.uniformMatrix3fv(this._location,!1,e))};var scratchMat4Array=new Float32Array(16);function UniformMat4(e,t,i,r){this.name=i,this.value=void 0,this._value=new Matrix4,this._gl=e,this._location=r}function createUniformArray(e,t,i,r){switch(t.type){case e.FLOAT:return new UniformArrayFloat(e,t,i,r);case e.FLOAT_VEC2:return new UniformArrayFloatVec2(e,t,i,r);case e.FLOAT_VEC3:return new UniformArrayFloatVec3(e,t,i,r);case e.FLOAT_VEC4:return new UniformArrayFloatVec4(e,t,i,r);case e.SAMPLER_2D:case e.SAMPLER_CUBE:return new UniformArraySampler(e,t,i,r);case e.INT:case e.BOOL:return new UniformArrayInt(e,t,i,r);case e.INT_VEC2:case e.BOOL_VEC2:return new UniformArrayIntVec2(e,t,i,r);case e.INT_VEC3:case e.BOOL_VEC3:return new UniformArrayIntVec3(e,t,i,r);case e.INT_VEC4:case e.BOOL_VEC4:return new UniformArrayIntVec4(e,t,i,r);case e.FLOAT_MAT2:return new UniformArrayMat2(e,t,i,r);case e.FLOAT_MAT3:return new UniformArrayMat3(e,t,i,r);case e.FLOAT_MAT4:return new UniformArrayMat4(e,t,i,r);default:throw new RuntimeError("Unrecognized uniform type: "+t.type+' for uniform "'+i+'".')}}function UniformArrayFloat(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(n),this._gl=e,this._location=r[0]}function UniformArrayFloatVec2(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(2*n),this._gl=e,this._location=r[0]}function UniformArrayFloatVec3(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(3*n),this._gl=e,this._location=r[0]}function UniformArrayFloatVec4(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(4*n),this._gl=e,this._location=r[0]}function UniformArraySampler(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(n),this._gl=e,this._locations=r,this.textureUnitIndex=void 0}function UniformArrayInt(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Int32Array(n),this._gl=e,this._location=r[0]}function UniformArrayIntVec2(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Int32Array(2*n),this._gl=e,this._location=r[0]}function UniformArrayIntVec3(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Int32Array(3*n),this._gl=e,this._location=r[0]}function UniformArrayIntVec4(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Int32Array(4*n),this._gl=e,this._location=r[0]}function UniformArrayMat2(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(4*n),this._gl=e,this._location=r[0]}function UniformArrayMat3(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(9*n),this._gl=e,this._location=r[0]}function UniformArrayMat4(e,t,i,r){var n=r.length;this.name=i,this.value=new Array(n),this._value=new Float32Array(16*n),this._gl=e,this._location=r[0]}UniformMat4.prototype.set=function(){var e;Matrix4.equalsArray(this.value,this._value,0)||(Matrix4.clone(this.value,this._value),e=Matrix4.toArray(this.value,scratchMat4Array),this._gl.uniformMatrix4fv(this._location,!1,e))},UniformArrayFloat.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0;n<t;++n){var a=e[n];a!==i[n]&&(i[n]=a,r=!0)}r&&this._gl.uniform1fv(this._location,i)},UniformArrayFloatVec2.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Cartesian2.equalsArray(o,i,n)||(Cartesian2.pack(o,i,n),r=!0),n+=2}r&&this._gl.uniform2fv(this._location,i)},UniformArrayFloatVec3.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];defined(o.red)?o.red===i[n]&&o.green===i[n+1]&&o.blue===i[n+2]||(i[n]=o.red,i[n+1]=o.green,i[n+2]=o.blue,r=!0):defined(o.x)&&(Cartesian3.equalsArray(o,i,n)||(Cartesian3.pack(o,i,n),r=!0)),n+=3}r&&this._gl.uniform3fv(this._location,i)},UniformArrayFloatVec4.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];defined(o.red)?Color.equalsArray(o,i,n)||(Color.pack(o,i,n),r=!0):defined(o.x)&&(Cartesian4.equalsArray(o,i,n)||(Cartesian4.pack(o,i,n),r=!0)),n+=4}r&&this._gl.uniform4fv(this._location,i)},UniformArraySampler.prototype.set=function(){for(var e=this._gl,t=e.TEXTURE0+this.textureUnitIndex,i=this.value,r=i.length,n=0;n<r;++n){var a=i[n];e.activeTexture(t+n),e.bindTexture(a._target,a._texture)}},UniformArraySampler.prototype._setSampler=function(e){this.textureUnitIndex=e;for(var t=this._locations,i=t.length,r=0;r<i;++r){var n=e+r;this._gl.uniform1i(t[r],n)}return e+i},UniformArrayInt.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0;n<t;++n){var a=e[n];a!==i[n]&&(i[n]=a,r=!0)}r&&this._gl.uniform1iv(this._location,i)},UniformArrayIntVec2.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Cartesian2.equalsArray(o,i,n)||(Cartesian2.pack(o,i,n),r=!0),n+=2}r&&this._gl.uniform2iv(this._location,i)},UniformArrayIntVec3.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Cartesian3.equalsArray(o,i,n)||(Cartesian3.pack(o,i,n),r=!0),n+=3}r&&this._gl.uniform3iv(this._location,i)},UniformArrayIntVec4.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Cartesian4.equalsArray(o,i,n)||(Cartesian4.pack(o,i,n),r=!0),n+=4}r&&this._gl.uniform4iv(this._location,i)},UniformArrayMat2.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Matrix2.equalsArray(o,i,n)||(Matrix2.pack(o,i,n),r=!0),n+=4}r&&this._gl.uniformMatrix2fv(this._location,!1,i)},UniformArrayMat3.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Matrix3.equalsArray(o,i,n)||(Matrix3.pack(o,i,n),r=!0),n+=9}r&&this._gl.uniformMatrix3fv(this._location,!1,i)},UniformArrayMat4.prototype.set=function(){for(var e=this.value,t=e.length,i=this._value,r=!1,n=0,a=0;a<t;++a){var o=e[a];Matrix4.equalsArray(o,i,n)||(Matrix4.pack(o,i,n),r=!0),n+=16}r&&this._gl.uniformMatrix4fv(this._location,!1,i)};var nextShaderProgramId=0;function ShaderProgram(e){var t=e.vertexShaderText,i=e.fragmentShaderText;"undefined"!=typeof spector&&(t=t.replace(/^#line/gm,"//#line"),i=i.replace(/^#line/gm,"//#line"));var r=handleUniformPrecisionMismatches(t,i);this._gl=e.gl,this._logShaderCompilation=e.logShaderCompilation,this._debugShaders=e.debugShaders,this._attributeLocations=e.attributeLocations,this._program=void 0,this._numberOfVertexAttributes=void 0,this._vertexAttributes=void 0,this._uniformsByName=void 0,this._uniforms=void 0,this._automaticUniforms=void 0,this._manualUniforms=void 0,this._duplicateUniformNames=r.duplicateUniformNames,this._cachedShader=void 0,this.maximumTextureUnitIndex=void 0,this._vertexShaderSource=e.vertexShaderSource,this._vertexShaderText=e.vertexShaderText,this._fragmentShaderSource=e.fragmentShaderSource,this._fragmentShaderText=r.fragmentShaderText,this.id=nextShaderProgramId++}function extractUniforms(e){var t=[],i=e.match(/uniform.*?(?![^{]*})(?=[=\[;])/g);if(defined(i))for(var r=i.length,n=0;n<r;n++){var a=i[n].trim(),o=a.slice(a.lastIndexOf(" ")+1);t.push(o)}return t}function handleUniformPrecisionMismatches(e,t){var i={};if(!ContextLimits.highpFloatSupported||!ContextLimits.highpIntSupported)for(var r,n,a,o,s=extractUniforms(e),l=extractUniforms(t),c=s.length,u=l.length,d=0;d<c;d++)for(r=0;r<u;r++){s[d]===l[r]&&(a="czm_mediump_"+(n=s[d]),o=new RegExp(n+"\\b","g"),t=t.replace(o,a),i[a]=n)}return{fragmentShaderText:t,duplicateUniformNames:i}}ShaderProgram.fromCache=function(e){return(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context.shaderCache.getShaderProgram(e)},ShaderProgram.replaceCache=function(e){return(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context.shaderCache.replaceShaderProgram(e)},Object.defineProperties(ShaderProgram.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},vertexAttributes:{get:function(){return initialize$1(this),this._vertexAttributes}},numberOfVertexAttributes:{get:function(){return initialize$1(this),this._numberOfVertexAttributes}},allUniforms:{get:function(){return initialize$1(this),this._uniformsByName}}});var consolePrefix="[Cesium WebGL] ";function createAndLinkProgram(e,t){var i=t._vertexShaderText,r=t._fragmentShaderText,n=e.createShader(e.VERTEX_SHADER);e.shaderSource(n,i),e.compileShader(n);var a=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(a,r),e.compileShader(a);var o=e.createProgram();e.attachShader(o,n),e.attachShader(o,a),e.deleteShader(n),e.deleteShader(a);var s=t._attributeLocations;if(defined(s))for(var l in s)s.hasOwnProperty(l)&&e.bindAttribLocation(o,s[l],l);if(e.linkProgram(o),!e.getProgramParameter(o,e.LINK_STATUS)){var c,u=t._debugShaders;if(!e.getShaderParameter(a,e.COMPILE_STATUS)){var d,h=e.getShaderInfoLog(a);throw console.error(consolePrefix+"Fragment shader compile log: "+h),defined(u)&&(""!==(d=u.getTranslatedShaderSource(a))?console.error(consolePrefix+"Translated fragment shader source:\n"+d):console.error(consolePrefix+"Fragment shader translation failed.")),e.deleteProgram(o),new RuntimeError("Fragment shader failed to compile. Compile log: "+h)}if(!e.getShaderParameter(n,e.COMPILE_STATUS))throw h=e.getShaderInfoLog(n),console.error(consolePrefix+"Vertex shader compile log: "+h),defined(u)&&(""!==(c=u.getTranslatedShaderSource(n))?console.error(consolePrefix+"Translated vertex shader source:\n"+c):console.error(consolePrefix+"Vertex shader translation failed.")),e.deleteProgram(o),new RuntimeError("Vertex shader failed to compile. Compile log: "+h);throw h=e.getProgramInfoLog(o),console.error(consolePrefix+"Shader program link log: "+h),defined(u)&&(console.error(consolePrefix+"Translated vertex shader source:\n"+u.getTranslatedShaderSource(n)),console.error(consolePrefix+"Translated fragment shader source:\n"+u.getTranslatedShaderSource(a))),e.deleteProgram(o),new RuntimeError("Program failed to link. Link log: "+h)}var p=t._logShaderCompilation;return p&&defined(h=e.getShaderInfoLog(n))&&0<h.length&&console.log(consolePrefix+"Vertex shader compile log: "+h),p&&defined(h=e.getShaderInfoLog(a))&&0<h.length&&console.log(consolePrefix+"Fragment shader compile log: "+h),p&&defined(h=e.getProgramInfoLog(o))&&0<h.length&&console.log(consolePrefix+"Shader program link log: "+h),o}function findVertexAttributes(e,t,i){for(var r={},n=0;n<i;++n){var a=e.getActiveAttrib(t,n),o=e.getAttribLocation(t,a.name);r[a.name]={name:a.name,type:a.type,index:o}}return r}function findUniforms(e,t){for(var i={},r=[],n=[],a=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),o=0;o<a;++o){var s=e.getActiveUniform(t,o),l=-1!==s.name.indexOf("[0]",s.name.length-"[0]".length)?s.name.slice(0,s.name.length-3):s.name;if(0!==l.indexOf("gl_"))if(s.name.indexOf("[")<0){var c,u=e.getUniformLocation(t,l);null!==u&&(c=createUniform$1(e,s,l,u),i[l]=c,r.push(c),c._setSampler&&n.push(c))}else{var d,h,p,m,f=l.indexOf("[");if(0<=f){if(!defined(d=i[l.slice(0,f)]))continue;(h=d._locations).length<=1&&(p=d.value,null!==(m=e.getUniformLocation(t,l))&&(h.push(m),p.push(e.getUniform(t,m))))}else{h=[];for(var g=0;g<s.size;++g)null!==(m=e.getUniformLocation(t,l+"["+g+"]"))&&h.push(m);d=createUniformArray(e,s,l,h),i[l]=d,r.push(d),d._setSampler&&n.push(d)}}}return{uniformsByName:i,uniforms:r,samplerUniforms:n}}function partitionUniforms(e,t){var i,r,n,a,o=[],s=[];for(var l in t){t.hasOwnProperty(l)&&(i=t[l],r=l,defined(n=e._duplicateUniformNames[r])&&(r=i.name=n),defined(a=AutomaticUniforms[r])?o.push({uniform:i,automaticUniform:a}):s.push(i))}return{automaticUniforms:o,manualUniforms:s}}function setSamplerUniforms(e,t,i){e.useProgram(t);for(var r=0,n=i.length,a=0;a<n;++a)r=i[a]._setSampler(r);return e.useProgram(null),r}function initialize$1(e){defined(e._program)||reinitialize(e)}function reinitialize(l){var e=l._program,t=l._gl,i=createAndLinkProgram(t,l,l._debugShaders),r=t.getProgramParameter(i,t.ACTIVE_ATTRIBUTES),n=findUniforms(t,i),a=partitionUniforms(l,n.uniformsByName);l._program=i,l._numberOfVertexAttributes=r,l._vertexAttributes=findVertexAttributes(t,i,r),l._uniformsByName=n.uniformsByName,l._uniforms=n.uniforms,l._automaticUniforms=a.automaticUniforms,l._manualUniforms=a.manualUniforms,l.maximumTextureUnitIndex=setSamplerUniforms(t,i,n.samplerUniforms),e&&l._gl.deleteProgram(e),"undefined"!=typeof spector&&(l._program.__SPECTOR_rebuildProgram=function(e,t,i,r){var n=l._vertexShaderText,a=l._fragmentShaderText,o=/ ! = /g;l._vertexShaderText=e.replace(o," != "),l._fragmentShaderText=t.replace(o," != ");try{reinitialize(l),i(l._program)}catch(e){l._vertexShaderText=n,l._fragmentShaderText=a;var s=/(?:Compile|Link) error: ([^]*)/.exec(e.message);r(s?s[1]:e.message)}})}function modernizeShader(e,t){var i=/#define OUTPUT_DECLARATION/,r=e.split("\n");if(/#version 300 es/g.test(e))return e;for(var n,a=-1,o=0;o<r.length;++o)if(n=r[o],i.test(n)){a=o;break}if(-1===a)throw new DeveloperError("Could not find a #define OUTPUT_DECLARATION!");var s=[];for(o=0;o<10;o++){var l="gl_FragData\\["+o+"\\]",c="czm_out"+o;new RegExp(l,"g").test(e)&&(setAdd(c,s),replaceInSourceString(l,c,r),r.splice(a,0,"layout(location = "+o+") out vec4 "+c+";"),a+=1)}var u="czm_fragColor";findInSource("gl_FragColor",r)&&(setAdd(u,s),replaceInSourceString("gl_FragColor",u,r),r.splice(a,0,"layout(location = 0) out vec4 czm_fragColor;"),a+=1);var d=getVariablePreprocessorBranch(s,r),h={};for(o=0;o<r.length;o++)for(var p in n=r[o],d){d.hasOwnProperty(p)&&new RegExp("(layout)[^]+(out)[^]+("+p+")[^]+","g").test(n)&&(h[n]=p)}for(var m in h)if(h.hasOwnProperty(m)){for(var f=h[m],g=r.indexOf(m),_=d[f],y=_.length,v=0;v<y;v++)r.splice(g,0,_[v]);for(g+=y+1,v=y-1;0<=v;v--)r.splice(g,0,"#endif //"+_[v])}var C="WEBGL_2",S="#version 300 es",T=!1;for(o=0;o<r.length;o++)if(/#version/.test(r[o])){r[o]=S,T=!0;break}return T||r.splice(0,0,S),r.splice(1,0,"#define WEBGL_2"),removeExtension("EXT_draw_buffers",C,r),removeExtension("EXT_frag_depth",C,r),removeExtension("OES_standard_derivatives",C,r),replaceInSourceString("texture2D","texture",r),replaceInSourceString("texture3D","texture",r),replaceInSourceString("textureCube","texture",r),replaceInSourceString("gl_FragDepthEXT","gl_FragDepth",r),t?replaceInSourceString("varying","in",r):(replaceInSourceString("attribute","in",r),replaceInSourceString("varying","out",r)),compileSource(r)}function replaceInSourceString(e,t,i){for(var r=new RegExp("(^|[^\\w])("+e+")($|[^\\w])","g"),n=i.length,a=0;a<n;++a){var o=i[a];i[a]=o.replace(r,"$1"+t+"$3")}}function replaceInSourceRegex(e,t,i){for(var r=i.length,n=0;n<r;++n){var a=i[n];i[n]=a.replace(e,t)}}function findInSource(e,t){for(var i=new RegExp("(^|[^\\w])("+e+")($|[^\\w])","g"),r=t.length,n=0;n<r;++n){var a=t[n];if(i.test(a))return 1}}function compileSource(e){for(var t="",i=e.length,r=0;r<i;++r)t+=e[r]+"\n";return t}function setAdd(e,t){-1===t.indexOf(e)&&t.push(e)}function getVariablePreprocessorBranch(e,t){for(var i={},r=e.length,n=[],a=0;a<t.length;++a){var o=t[a],s=/(#ifdef|#if)/g.test(o),l=/#else/g.test(o),c=/#endif/g.test(o);if(s)n.push(o);else if(l){var u=n[n.length-1].replace("ifdef","ifndef");/if/g.test(u)&&(u=u.replace(/(#if\s+)(\S*)([^]*)/,"$1!($2)$3")),n.pop(),n.push(u)}else if(c)n.pop();else if(!/layout/g.test(o))for(var d=0;d<r;++d){var h=e[d];-1!==o.indexOf(h)&&(defined(i[h])?i[h]=i[h].filter(function(e){return 0<=n.indexOf(e)}):i[h]=n.slice())}}return i}function removeExtension(e,t,i){replaceInSourceRegex(new RegExp("#extension\\s+GL_"+e+"\\s+:\\s+[a-zA-Z0-9]+\\s*$","g"),"",i),replaceInSourceString("GL_"+e,t,i)}ShaderProgram.prototype._bind=function(){initialize$1(this),this._gl.useProgram(this._program)},ShaderProgram.prototype._setUniforms=function(e,t,i){if(defined(e))for(var r=this._manualUniforms,n=r.length,a=0;a<n;++a){var o=r[a];o.value=e[o.name]()}var s=this._automaticUniforms;for(n=s.length,a=0;a<n;++a){var l=s[a];l.uniform.value=l.automaticUniform.getValue(t)}var c,u,d=this._uniforms;for(n=d.length,a=0;a<n;++a)d[a].set();i&&(c=this._gl,u=this._program,c.validateProgram(u))},ShaderProgram.prototype.isDestroyed=function(){return!1},ShaderProgram.prototype.destroy=function(){this._cachedShader.cache.releaseShaderProgram(this)},ShaderProgram.prototype.finalDestroy=function(){return this._gl.deleteProgram(this._program),destroyObject(this)};var czm_degreesPerRadian="const float czm_degreesPerRadian = 57.29577951308232;\n",czm_depthRange="const czm_depthRangeStruct czm_depthRange = czm_depthRangeStruct(0.0, 1.0);\n",czm_epsilon1="const float czm_epsilon1 = 0.1;\n",czm_epsilon2="const float czm_epsilon2 = 0.01;\n",czm_epsilon3="const float czm_epsilon3 = 0.001;\n",czm_epsilon4="const float czm_epsilon4 = 0.0001;\n",czm_epsilon5="const float czm_epsilon5 = 0.00001;\n",czm_epsilon6="const float czm_epsilon6 = 0.000001;\n",czm_epsilon7="const float czm_epsilon7 = 0.0000001;\n",czm_infinity="const float czm_infinity = 5906376272000.0;\n",czm_oneOverPi="const float czm_oneOverPi = 0.3183098861837907;\n",czm_oneOverTwoPi="const float czm_oneOverTwoPi = 0.15915494309189535;\n",czm_passCesium3DTile="const float czm_passCesium3DTile = 4.0;\n",czm_passCesium3DTileClassification="const float czm_passCesium3DTileClassification = 5.0;\n",czm_passCesium3DTileClassificationIgnoreShow="const float czm_passCesium3DTileClassificationIgnoreShow = 6.0;\n",czm_passClassification="const float czm_passClassification = 7.0;\n",czm_passCompute="const float czm_passCompute = 1.0;\n",czm_passEnvironment="const float czm_passEnvironment = 0.0;\n",czm_passGlobe="const float czm_passGlobe = 2.0;\n",czm_passOpaque="const float czm_passOpaque = 7.0;\n",czm_passOverlay="const float czm_passOverlay = 9.0;\n",czm_passTerrainClassification="const float czm_passTerrainClassification = 3.0;\n",czm_passTranslucent="const float czm_passTranslucent = 8.0;\n",czm_pi="const float czm_pi = 3.141592653589793;\n",czm_piOverFour="const float czm_piOverFour = 0.7853981633974483;\n",czm_piOverSix="const float czm_piOverSix = 0.5235987755982988;\n",czm_piOverThree="const float czm_piOverThree = 1.0471975511965976;\n",czm_piOverTwo="const float czm_piOverTwo = 1.5707963267948966;\n",czm_radiansPerDegree="const float czm_radiansPerDegree = 0.017453292519943295;\n",czm_sceneMode2D="const float czm_sceneMode2D = 2.0;\n",czm_sceneMode3D="const float czm_sceneMode3D = 3.0;\n",czm_sceneModeColumbusView="const float czm_sceneModeColumbusView = 1.0;\n",czm_sceneModeMorphing="const float czm_sceneModeMorphing = 0.0;\n",czm_solarRadius="const float czm_solarRadius = 695500000.0;\n",czm_threePiOver2="const float czm_threePiOver2 = 4.71238898038469;\n",czm_twoPi="const float czm_twoPi = 6.283185307179586;\n",czm_webMercatorMaxLatitude="const float czm_webMercatorMaxLatitude = 1.4844222297453324;\n",czm_depthRangeStruct="struct czm_depthRangeStruct\n{\nfloat near;\nfloat far;\n};\n",czm_material="struct czm_material\n{\nvec3 diffuse;\nfloat specular;\nfloat shininess;\nvec3 normal;\nvec3 emission;\nfloat alpha;\n};\n",czm_materialInput="struct czm_materialInput\n{\nfloat s;\nvec2 st;\nvec3 str;\nvec3 normalEC;\nmat3 tangentToEyeMatrix;\nvec3 positionToEyeEC;\nfloat height;\nfloat slope;\nfloat aspect;\n};\n",czm_ray="struct czm_ray\n{\nvec3 origin;\nvec3 direction;\n};\n",czm_raySegment="struct czm_raySegment\n{\nfloat start;\nfloat stop;\n};\nconst czm_raySegment czm_emptyRaySegment = czm_raySegment(-czm_infinity, -czm_infinity);\nconst czm_raySegment czm_fullRaySegment = czm_raySegment(0.0, czm_infinity);\n",czm_shadowParameters="struct czm_shadowParameters\n{\n#ifdef USE_CUBE_MAP_SHADOW\nvec3 texCoords;\n#else\nvec2 texCoords;\n#endif\nfloat depthBias;\nfloat depth;\nfloat nDotL;\nvec2 texelStepSize;\nfloat normalShadingSmooth;\nfloat darkness;\n};\n",czm_HSBToRGB="const vec4 K_HSB2RGB = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\nvec3 czm_HSBToRGB(vec3 hsb)\n{\nvec3 p = abs(fract(hsb.xxx + K_HSB2RGB.xyz) * 6.0 - K_HSB2RGB.www);\nreturn hsb.z * mix(K_HSB2RGB.xxx, clamp(p - K_HSB2RGB.xxx, 0.0, 1.0), hsb.y);\n}\n",czm_HSLToRGB="vec3 hueToRGB(float hue)\n{\nfloat r = abs(hue * 6.0 - 3.0) - 1.0;\nfloat g = 2.0 - abs(hue * 6.0 - 2.0);\nfloat b = 2.0 - abs(hue * 6.0 - 4.0);\nreturn clamp(vec3(r, g, b), 0.0, 1.0);\n}\nvec3 czm_HSLToRGB(vec3 hsl)\n{\nvec3 rgb = hueToRGB(hsl.x);\nfloat c = (1.0 - abs(2.0 * hsl.z - 1.0)) * hsl.y;\nreturn (rgb - 0.5) * c + hsl.z;\n}\n",czm_RGBToHSB="const vec4 K_RGB2HSB = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\nvec3 czm_RGBToHSB(vec3 rgb)\n{\nvec4 p = mix(vec4(rgb.bg, K_RGB2HSB.wz), vec4(rgb.gb, K_RGB2HSB.xy), step(rgb.b, rgb.g));\nvec4 q = mix(vec4(p.xyw, rgb.r), vec4(rgb.r, p.yzx), step(p.x, rgb.r));\nfloat d = q.x - min(q.w, q.y);\nreturn vec3(abs(q.z + (q.w - q.y) / (6.0 * d + czm_epsilon7)), d / (q.x + czm_epsilon7), q.x);\n}\n",czm_RGBToHSL="vec3 RGBtoHCV(vec3 rgb)\n{\nvec4 p = (rgb.g < rgb.b) ? vec4(rgb.bg, -1.0, 2.0 / 3.0) : vec4(rgb.gb, 0.0, -1.0 / 3.0);\nvec4 q = (rgb.r < p.x) ? vec4(p.xyw, rgb.r) : vec4(rgb.r, p.yzx);\nfloat c = q.x - min(q.w, q.y);\nfloat h = abs((q.w - q.y) / (6.0 * c + czm_epsilon7) + q.z);\nreturn vec3(h, c, q.x);\n}\nvec3 czm_RGBToHSL(vec3 rgb)\n{\nvec3 hcv = RGBtoHCV(rgb);\nfloat l = hcv.z - hcv.y * 0.5;\nfloat s = hcv.y / (1.0 - abs(l * 2.0 - 1.0) + czm_epsilon7);\nreturn vec3(hcv.x, s, l);\n}\n",czm_RGBToXYZ="vec3 czm_RGBToXYZ(vec3 rgb)\n{\nconst mat3 RGB2XYZ = mat3(0.4124, 0.2126, 0.0193,\n0.3576, 0.7152, 0.1192,\n0.1805, 0.0722, 0.9505);\nvec3 xyz = RGB2XYZ * rgb;\nvec3 Yxy;\nYxy.r = xyz.g;\nfloat temp = dot(vec3(1.0), xyz);\nYxy.gb = xyz.rg / temp;\nreturn Yxy;\n}\n",czm_XYZToRGB="vec3 czm_XYZToRGB(vec3 Yxy)\n{\nconst mat3 XYZ2RGB = mat3( 3.2405, -0.9693, 0.0556,\n-1.5371, 1.8760, -0.2040,\n-0.4985, 0.0416, 1.0572);\nvec3 xyz;\nxyz.r = Yxy.r * Yxy.g / Yxy.b;\nxyz.g = Yxy.r;\nxyz.b = Yxy.r * (1.0 - Yxy.g - Yxy.b) / Yxy.b;\nreturn XYZ2RGB * xyz;\n}\n",czm_acesTonemapping="vec3 czm_acesTonemapping(vec3 color) {\nfloat g = 0.985;\nfloat a = 0.065;\nfloat b = 0.0001;\nfloat c = 0.433;\nfloat d = 0.238;\ncolor = (color * (color + a) - b) / (color * (g * color + c) + d);\ncolor = clamp(color, 0.0, 1.0);\nreturn color;\n}\n",czm_alphaWeight="float czm_alphaWeight(float a)\n{\nfloat z = (gl_FragCoord.z - czm_viewportTransformation[3][2]) / czm_viewportTransformation[2][2];\nreturn pow(a + 0.01, 4.0) + max(1e-2, min(3.0 * 1e3, 0.003 / (1e-5 + pow(abs(z) / 200.0, 4.0))));\n}\n",czm_antialias="vec4 czm_antialias(vec4 color1, vec4 color2, vec4 currentColor, float dist, float fuzzFactor)\n{\nfloat val1 = clamp(dist / fuzzFactor, 0.0, 1.0);\nfloat val2 = clamp((dist - 0.5) / fuzzFactor, 0.0, 1.0);\nval1 = val1 * (1.0 - val2);\nval1 = val1 * val1 * (3.0 - (2.0 * val1));\nval1 = pow(val1, 0.5);\nvec4 midColor = (color1 + color2) * 0.5;\nreturn mix(midColor, currentColor, val1);\n}\nvec4 czm_antialias(vec4 color1, vec4 color2, vec4 currentColor, float dist)\n{\nreturn czm_antialias(color1, color2, currentColor, dist, 0.1);\n}\n",czm_approximateSphericalCoordinates="vec2 czm_approximateSphericalCoordinates(vec3 normal) {\nfloat latitudeApproximation = czm_fastApproximateAtan(sqrt(normal.x * normal.x + normal.y * normal.y), normal.z);\nfloat longitudeApproximation = czm_fastApproximateAtan(normal.x, normal.y);\nreturn vec2(latitudeApproximation, longitudeApproximation);\n}\n",czm_backFacing="bool czm_backFacing()\n{\nreturn gl_FrontFacing == false;\n}\n",czm_branchFreeTernary="float czm_branchFreeTernary(bool comparison, float a, float b) {\nfloat useA = float(comparison);\nreturn a * useA + b * (1.0 - useA);\n}\nvec2 czm_branchFreeTernary(bool comparison, vec2 a, vec2 b) {\nfloat useA = float(comparison);\nreturn a * useA + b * (1.0 - useA);\n}\nvec3 czm_branchFreeTernary(bool comparison, vec3 a, vec3 b) {\nfloat useA = float(comparison);\nreturn a * useA + b * (1.0 - useA);\n}\nvec4 czm_branchFreeTernary(bool comparison, vec4 a, vec4 b) {\nfloat useA = float(comparison);\nreturn a * useA + b * (1.0 - useA);\n}\n",czm_cascadeColor="vec4 czm_cascadeColor(vec4 weights)\n{\nreturn vec4(1.0, 0.0, 0.0, 1.0) * weights.x +\nvec4(0.0, 1.0, 0.0, 1.0) * weights.y +\nvec4(0.0, 0.0, 1.0, 1.0) * weights.z +\nvec4(1.0, 0.0, 1.0, 1.0) * weights.w;\n}\n",czm_cascadeDistance="uniform vec4 shadowMap_cascadeDistances;\nfloat czm_cascadeDistance(vec4 weights)\n{\nreturn dot(shadowMap_cascadeDistances, weights);\n}\n",czm_cascadeMatrix="uniform mat4 shadowMap_cascadeMatrices[4];\nmat4 czm_cascadeMatrix(vec4 weights)\n{\nreturn shadowMap_cascadeMatrices[0] * weights.x +\nshadowMap_cascadeMatrices[1] * weights.y +\nshadowMap_cascadeMatrices[2] * weights.z +\nshadowMap_cascadeMatrices[3] * weights.w;\n}\n",czm_cascadeWeights="uniform vec4 shadowMap_cascadeSplits[2];\nvec4 czm_cascadeWeights(float depthEye)\n{\nvec4 near = step(shadowMap_cascadeSplits[0], vec4(depthEye));\nvec4 far = step(depthEye, shadowMap_cascadeSplits[1]);\nreturn near * far;\n}\n",czm_columbusViewMorph="vec4 czm_columbusViewMorph(vec4 position2D, vec4 position3D, float time)\n{\nvec3 p = mix(position2D.xyz, position3D.xyz, time);\nreturn vec4(p, 1.0);\n}\n",czm_computePosition="vec4 czm_computePosition();\n",czm_cosineAndSine="vec2 cordic(float angle)\n{\nvec2 vector = vec2(6.0725293500888267e-1, 0.0);\nfloat sense = (angle < 0.0) ? -1.0 : 1.0;\nmat2 rotation = mat2(1.0, sense, -sense, 1.0);\nvector = rotation * vector;\nangle -= sense * 7.8539816339744828e-1;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfloat factor = sense * 5.0e-1;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 4.6364760900080609e-1;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 2.5e-1;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 2.4497866312686414e-1;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.25e-1;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 1.2435499454676144e-1;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 6.25e-2;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 6.2418809995957350e-2;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 3.125e-2;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 3.1239833430268277e-2;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.5625e-2;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 1.5623728620476831e-2;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 7.8125e-3;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 7.8123410601011111e-3;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 3.90625e-3;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 3.9062301319669718e-3;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.953125e-3;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 1.9531225164788188e-3;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 9.765625e-4;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 9.7656218955931946e-4;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 4.8828125e-4;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 4.8828121119489829e-4;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 2.44140625e-4;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 2.4414062014936177e-4;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.220703125e-4;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 1.2207031189367021e-4;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 6.103515625e-5;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 6.1035156174208773e-5;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 3.0517578125e-5;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 3.0517578115526096e-5;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.52587890625e-5;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 1.5258789061315762e-5;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 7.62939453125e-6;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 7.6293945311019700e-6;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 3.814697265625e-6;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 3.8146972656064961e-6;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.9073486328125e-6;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 1.9073486328101870e-6;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 9.5367431640625e-7;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 9.5367431640596084e-7;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 4.76837158203125e-7;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 4.7683715820308884e-7;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 2.384185791015625e-7;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nangle -= sense * 2.3841857910155797e-7;\nsense = (angle < 0.0) ? -1.0 : 1.0;\nfactor = sense * 1.1920928955078125e-7;\nrotation[0][1] = factor;\nrotation[1][0] = -factor;\nvector = rotation * vector;\nreturn vector;\n}\nvec2 czm_cosineAndSine(float angle)\n{\nif (angle < -czm_piOverTwo || angle > czm_piOverTwo)\n{\nif (angle < 0.0)\n{\nreturn -cordic(angle + czm_pi);\n}\nelse\n{\nreturn -cordic(angle - czm_pi);\n}\n}\nelse\n{\nreturn cordic(angle);\n}\n}\n",czm_decompressTextureCoordinates="vec2 czm_decompressTextureCoordinates(float encoded)\n{\nfloat temp = encoded / 4096.0;\nfloat xZeroTo4095 = floor(temp);\nfloat stx = xZeroTo4095 / 4095.0;\nfloat sty = (encoded - xZeroTo4095 * 4096.0) / 4095.0;\nreturn vec2(stx, sty);\n}\n",czm_depthClamp="#ifndef LOG_DEPTH\nvarying float v_WindowZ;\n#endif\nvec4 czm_depthClamp(vec4 coords)\n{\n#ifndef LOG_DEPTH\nv_WindowZ = (0.5 * (coords.z / coords.w) + 0.5) * coords.w;\ncoords.z = clamp(coords.z, -coords.w, +coords.w);\n#endif\nreturn coords;\n}\n",czm_eastNorthUpToEyeCoordinates="mat3 czm_eastNorthUpToEyeCoordinates(vec3 positionMC, vec3 normalEC)\n{\nvec3 tangentMC = normalize(vec3(-positionMC.y, positionMC.x, 0.0));\nvec3 tangentEC = normalize(czm_normal3D * tangentMC);\nvec3 bitangentEC = normalize(cross(normalEC, tangentEC));\nreturn mat3(\ntangentEC.x, tangentEC.y, tangentEC.z,\nbitangentEC.x, bitangentEC.y, bitangentEC.z,\nnormalEC.x, normalEC.y, normalEC.z);\n}\n",czm_ellipsoidContainsPoint="bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point)\n{\nvec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;\nreturn (dot(scaled, scaled) <= 1.0);\n}\n",czm_ellipsoidWgs84TextureCoordinates="vec2 czm_ellipsoidWgs84TextureCoordinates(vec3 normal)\n{\nreturn vec2(atan(normal.y, normal.x) * czm_oneOverTwoPi + 0.5, asin(normal.z) * czm_oneOverPi + 0.5);\n}\n",czm_equalsEpsilon="bool czm_equalsEpsilon(vec4 left, vec4 right, float epsilon) {\nreturn all(lessThanEqual(abs(left - right), vec4(epsilon)));\n}\nbool czm_equalsEpsilon(vec3 left, vec3 right, float epsilon) {\nreturn all(lessThanEqual(abs(left - right), vec3(epsilon)));\n}\nbool czm_equalsEpsilon(vec2 left, vec2 right, float epsilon) {\nreturn all(lessThanEqual(abs(left - right), vec2(epsilon)));\n}\nbool czm_equalsEpsilon(float left, float right, float epsilon) {\nreturn (abs(left - right) <= epsilon);\n}\n",czm_eyeOffset="vec4 czm_eyeOffset(vec4 positionEC, vec3 eyeOffset)\n{\nvec4 p = positionEC;\nvec4 zEyeOffset = normalize(p) * eyeOffset.z;\np.xy += eyeOffset.xy + zEyeOffset.xy;\np.z += zEyeOffset.z;\nreturn p;\n}\n",czm_eyeToWindowCoordinates="vec4 czm_eyeToWindowCoordinates(vec4 positionEC)\n{\nvec4 q = czm_projection * positionEC;\nq.xyz /= q.w;\nq.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz;\nreturn q;\n}\n",czm_fastApproximateAtan="float czm_fastApproximateAtan(float x) {\nreturn x * (-0.1784 * x - 0.0663 * x * x + 1.0301);\n}\nfloat czm_fastApproximateAtan(float x, float y) {\nfloat t = abs(x);\nfloat opposite = abs(y);\nfloat adjacent = max(t, opposite);\nopposite = min(t, opposite);\nt = czm_fastApproximateAtan(opposite / adjacent);\nt = czm_branchFreeTernary(abs(y) > abs(x), czm_piOverTwo - t, t);\nt = czm_branchFreeTernary(x < 0.0, czm_pi - t, t);\nt = czm_branchFreeTernary(y < 0.0, -t, t);\nreturn t;\n}\n",czm_fog="vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor)\n{\nfloat scalar = distanceToCamera * czm_fogDensity;\nfloat fog = 1.0 - exp(-(scalar * scalar));\nreturn mix(color, fogColor, fog);\n}\nvec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor, float fogModifierConstant)\n{\nfloat scalar = distanceToCamera * czm_fogDensity;\nfloat fog = 1.0 - exp(-((fogModifierConstant * scalar + fogModifierConstant) * (scalar * (1.0 + fogModifierConstant))));\nreturn mix(color, fogColor, fog);\n}\n",czm_gammaCorrect="vec3 czm_gammaCorrect(vec3 color) {\n#ifdef HDR\ncolor = pow(color, vec3(czm_gamma));\n#endif\nreturn color;\n}\nvec4 czm_gammaCorrect(vec4 color) {\n#ifdef HDR\ncolor.rgb = pow(color.rgb, vec3(czm_gamma));\n#endif\nreturn color;\n}\n",czm_geodeticSurfaceNormal="vec3 czm_geodeticSurfaceNormal(vec3 positionOnEllipsoid, vec3 ellipsoidCenter, vec3 oneOverEllipsoidRadiiSquared)\n{\nreturn normalize((positionOnEllipsoid - ellipsoidCenter) * oneOverEllipsoidRadiiSquared);\n}\n",czm_getDefaultMaterial="czm_material czm_getDefaultMaterial(czm_materialInput materialInput)\n{\nczm_material material;\nmaterial.diffuse = vec3(0.0);\nmaterial.specular = 0.0;\nmaterial.shininess = 1.0;\nmaterial.normal = materialInput.normalEC;\nmaterial.emission = vec3(0.0);\nmaterial.alpha = 1.0;\nreturn material;\n}\n",czm_getLambertDiffuse="float czm_getLambertDiffuse(vec3 lightDirectionEC, vec3 normalEC)\n{\nreturn max(dot(lightDirectionEC, normalEC), 0.0);\n}\n",czm_getSpecular="float czm_getSpecular(vec3 lightDirectionEC, vec3 toEyeEC, vec3 normalEC, float shininess)\n{\nvec3 toReflectedLight = reflect(-lightDirectionEC, normalEC);\nfloat specular = max(dot(toReflectedLight, toEyeEC), 0.0);\nreturn pow(specular, max(shininess, czm_epsilon2));\n}\n",czm_getWaterNoise="vec4 czm_getWaterNoise(sampler2D normalMap, vec2 uv, float time, float angleInRadians)\n{\nfloat cosAngle = cos(angleInRadians);\nfloat sinAngle = sin(angleInRadians);\nvec2 s0 = vec2(1.0/17.0, 0.0);\nvec2 s1 = vec2(-1.0/29.0, 0.0);\nvec2 s2 = vec2(1.0/101.0, 1.0/59.0);\nvec2 s3 = vec2(-1.0/109.0, -1.0/57.0);\ns0 = vec2((cosAngle * s0.x) - (sinAngle * s0.y), (sinAngle * s0.x) + (cosAngle * s0.y));\ns1 = vec2((cosAngle * s1.x) - (sinAngle * s1.y), (sinAngle * s1.x) + (cosAngle * s1.y));\ns2 = vec2((cosAngle * s2.x) - (sinAngle * s2.y), (sinAngle * s2.x) + (cosAngle * s2.y));\ns3 = vec2((cosAngle * s3.x) - (sinAngle * s3.y), (sinAngle * s3.x) + (cosAngle * s3.y));\nvec2 uv0 = (uv/103.0) + (time * s0);\nvec2 uv1 = uv/107.0 + (time * s1) + vec2(0.23);\nvec2 uv2 = uv/vec2(897.0, 983.0) + (time * s2) + vec2(0.51);\nvec2 uv3 = uv/vec2(991.0, 877.0) + (time * s3) + vec2(0.71);\nuv0 = fract(uv0);\nuv1 = fract(uv1);\nuv2 = fract(uv2);\nuv3 = fract(uv3);\nvec4 noise = (texture2D(normalMap, uv0)) +\n(texture2D(normalMap, uv1)) +\n(texture2D(normalMap, uv2)) +\n(texture2D(normalMap, uv3));\nreturn ((noise / 4.0) - 0.5) * 2.0;\n}\n",czm_hue="vec3 czm_hue(vec3 rgb, float adjustment)\n{\nconst mat3 toYIQ = mat3(0.299, 0.587, 0.114,\n0.595716, -0.274453, -0.321263,\n0.211456, -0.522591, 0.311135);\nconst mat3 toRGB = mat3(1.0, 0.9563, 0.6210,\n1.0, -0.2721, -0.6474,\n1.0, -1.107, 1.7046);\nvec3 yiq = toYIQ * rgb;\nfloat hue = atan(yiq.z, yiq.y) + adjustment;\nfloat chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y);\nvec3 color = vec3(yiq.x, chroma * cos(hue), chroma * sin(hue));\nreturn toRGB * color;\n}\n",czm_inverseGamma="vec3 czm_inverseGamma(vec3 color) {\nreturn pow(color, vec3(1.0 / czm_gamma));\n}\n",czm_isEmpty="bool czm_isEmpty(czm_raySegment interval)\n{\nreturn (interval.stop < 0.0);\n}\n",czm_isFull="bool czm_isFull(czm_raySegment interval)\n{\nreturn (interval.start == 0.0 && interval.stop == czm_infinity);\n}\n",czm_latitudeToWebMercatorFraction="float czm_latitudeToWebMercatorFraction(float latitude, float southMercatorY, float oneOverMercatorHeight)\n{\nfloat sinLatitude = sin(latitude);\nfloat mercatorY = 0.5 * log((1.0 + sinLatitude) / (1.0 - sinLatitude));\nreturn (mercatorY - southMercatorY) * oneOverMercatorHeight;\n}\n",czm_lineDistance="float czm_lineDistance(vec2 point1, vec2 point2, vec2 point) {\nreturn abs((point2.y - point1.y) * point.x - (point2.x - point1.x) * point.y + point2.x * point1.y - point2.y * point1.x) / distance(point2, point1);\n}\n",czm_luminance="float czm_luminance(vec3 rgb)\n{\nconst vec3 W = vec3(0.2125, 0.7154, 0.0721);\nreturn dot(rgb, W);\n}\n",czm_metersPerPixel="float czm_metersPerPixel(vec4 positionEC, float pixelRatio)\n{\nfloat width = czm_viewport.z;\nfloat height = czm_viewport.w;\nfloat pixelWidth;\nfloat pixelHeight;\nfloat top = czm_frustumPlanes.x;\nfloat bottom = czm_frustumPlanes.y;\nfloat left = czm_frustumPlanes.z;\nfloat right = czm_frustumPlanes.w;\nif (czm_sceneMode == czm_sceneMode2D || czm_orthographicIn3D == 1.0)\n{\nfloat frustumWidth = right - left;\nfloat frustumHeight = top - bottom;\npixelWidth = frustumWidth / width;\npixelHeight = frustumHeight / height;\n}\nelse\n{\nfloat distanceToPixel = -positionEC.z;\nfloat inverseNear = 1.0 / czm_currentFrustum.x;\nfloat tanTheta = top * inverseNear;\npixelHeight = 2.0 * distanceToPixel * tanTheta / height;\ntanTheta = right * inverseNear;\npixelWidth = 2.0 * distanceToPixel * tanTheta / width;\n}\nreturn max(pixelWidth, pixelHeight) * pixelRatio;\n}\nfloat czm_metersPerPixel(vec4 positionEC)\n{\nreturn czm_metersPerPixel(positionEC, czm_pixelRatio);\n}\n",czm_modelToWindowCoordinates="vec4 czm_modelToWindowCoordinates(vec4 position)\n{\nvec4 q = czm_modelViewProjection * position;\nq.xyz /= q.w;\nq.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz;\nreturn q;\n}\n",czm_multiplyWithColorBalance="vec3 czm_multiplyWithColorBalance(vec3 left, vec3 right)\n{\nconst vec3 W = vec3(0.2125, 0.7154, 0.0721);\nvec3 target = left * right;\nfloat leftLuminance = dot(left, W);\nfloat rightLuminance = dot(right, W);\nfloat targetLuminance = dot(target, W);\nreturn ((leftLuminance + rightLuminance) / (2.0 * targetLuminance)) * target;\n}\n",czm_nearFarScalar="float czm_nearFarScalar(vec4 nearFarScalar, float cameraDistSq)\n{\nfloat valueAtMin = nearFarScalar.y;\nfloat valueAtMax = nearFarScalar.w;\nfloat nearDistanceSq = nearFarScalar.x * nearFarScalar.x;\nfloat farDistanceSq = nearFarScalar.z * nearFarScalar.z;\nfloat t = (cameraDistSq - nearDistanceSq) / (farDistanceSq - nearDistanceSq);\nt = pow(clamp(t, 0.0, 1.0), 0.2);\nreturn mix(valueAtMin, valueAtMax, t);\n}\n",czm_octDecode="vec3 czm_octDecode(vec2 encoded, float range)\n{\nif (encoded.x == 0.0 && encoded.y == 0.0) {\nreturn vec3(0.0, 0.0, 0.0);\n}\nencoded = encoded / range * 2.0 - 1.0;\nvec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y));\nif (v.z < 0.0)\n{\nv.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy);\n}\nreturn normalize(v);\n}\nvec3 czm_octDecode(vec2 encoded)\n{\nreturn czm_octDecode(encoded, 255.0);\n}\nvec3 czm_octDecode(float encoded)\n{\nfloat temp = encoded / 256.0;\nfloat x = floor(temp);\nfloat y = (temp - x) * 256.0;\nreturn czm_octDecode(vec2(x, y));\n}\nvoid czm_octDecode(vec2 encoded, out vec3 vector1, out vec3 vector2, out vec3 vector3)\n{\nfloat temp = encoded.x / 65536.0;\nfloat x = floor(temp);\nfloat encodedFloat1 = (temp - x) * 65536.0;\ntemp = encoded.y / 65536.0;\nfloat y = floor(temp);\nfloat encodedFloat2 = (temp - y) * 65536.0;\nvector1 = czm_octDecode(encodedFloat1);\nvector2 = czm_octDecode(encodedFloat2);\nvector3 = czm_octDecode(vec2(x, y));\n}\n",czm_packDepth="vec4 czm_packDepth(float depth)\n{\nvec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\nenc = fract(enc);\nenc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);\nreturn enc;\n}\n",czm_phong="float czm_private_getLambertDiffuseOfMaterial(vec3 lightDirectionEC, czm_material material)\n{\nreturn czm_getLambertDiffuse(lightDirectionEC, material.normal);\n}\nfloat czm_private_getSpecularOfMaterial(vec3 lightDirectionEC, vec3 toEyeEC, czm_material material)\n{\nreturn czm_getSpecular(lightDirectionEC, toEyeEC, material.normal, material.shininess);\n}\nvec4 czm_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC)\n{\nfloat diffuse = czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 0.0, 1.0), material);\nif (czm_sceneMode == czm_sceneMode3D) {\ndiffuse += czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 1.0, 0.0), material);\n}\nfloat specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material);\nvec3 materialDiffuse = material.diffuse * 0.5;\nvec3 ambient = materialDiffuse;\nvec3 color = ambient + material.emission;\ncolor += materialDiffuse * diffuse * czm_lightColor;\ncolor += material.specular * specular * czm_lightColor;\nreturn vec4(color, material.alpha);\n}\nvec4 czm_private_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC)\n{\nfloat diffuse = czm_private_getLambertDiffuseOfMaterial(lightDirectionEC, material);\nfloat specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material);\nvec3 ambient = vec3(0.0);\nvec3 color = ambient + material.emission;\ncolor += material.diffuse * diffuse * czm_lightColor;\ncolor += material.specular * specular * czm_lightColor;\nreturn vec4(color, material.alpha);\n}\n",czm_planeDistance="float czm_planeDistance(vec4 plane, vec3 point) {\nreturn (dot(plane.xyz, point) + plane.w);\n}\nfloat czm_planeDistance(vec3 planeNormal, float planeDistance, vec3 point) {\nreturn (dot(planeNormal, point) + planeDistance);\n}\n",czm_pointAlongRay="vec3 czm_pointAlongRay(czm_ray ray, float time)\n{\nreturn ray.origin + (time * ray.direction);\n}\n",czm_rayEllipsoidIntersectionInterval="czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii)\n{\nvec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;\nvec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;\nq = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz;\nfloat q2 = dot(q, q);\nfloat qw = dot(q, w);\nif (q2 > 1.0)\n{\nif (qw >= 0.0)\n{\nreturn czm_emptyRaySegment;\n}\nelse\n{\nfloat qw2 = qw * qw;\nfloat difference = q2 - 1.0;\nfloat w2 = dot(w, w);\nfloat product = w2 * difference;\nif (qw2 < product)\n{\nreturn czm_emptyRaySegment;\n}\nelse if (qw2 > product)\n{\nfloat discriminant = qw * qw - product;\nfloat temp = -qw + sqrt(discriminant);\nfloat root0 = temp / w2;\nfloat root1 = difference / temp;\nif (root0 < root1)\n{\nczm_raySegment i = czm_raySegment(root0, root1);\nreturn i;\n}\nelse\n{\nczm_raySegment i = czm_raySegment(root1, root0);\nreturn i;\n}\n}\nelse\n{\nfloat root = sqrt(difference / w2);\nczm_raySegment i = czm_raySegment(root, root);\nreturn i;\n}\n}\n}\nelse if (q2 < 1.0)\n{\nfloat difference = q2 - 1.0;\nfloat w2 = dot(w, w);\nfloat product = w2 * difference;\nfloat discriminant = qw * qw - product;\nfloat temp = -qw + sqrt(discriminant);\nczm_raySegment i = czm_raySegment(0.0, temp / w2);\nreturn i;\n}\nelse\n{\nif (qw < 0.0)\n{\nfloat w2 = dot(w, w);\nczm_raySegment i = czm_raySegment(0.0, -qw / w2);\nreturn i;\n}\nelse\n{\nreturn czm_emptyRaySegment;\n}\n}\n}\n",czm_readDepth="float czm_readDepth(sampler2D depthTexture, vec2 texCoords)\n{\nreturn czm_reverseLogDepth(texture2D(depthTexture, texCoords).r);\n}\n",czm_readNonPerspective="float czm_readNonPerspective(float value, float oneOverW) {\nreturn value * oneOverW;\n}\nvec2 czm_readNonPerspective(vec2 value, float oneOverW) {\nreturn value * oneOverW;\n}\nvec3 czm_readNonPerspective(vec3 value, float oneOverW) {\nreturn value * oneOverW;\n}\nvec4 czm_readNonPerspective(vec4 value, float oneOverW) {\nreturn value * oneOverW;\n}\n",czm_reverseLogDepth="float czm_reverseLogDepth(float logZ)\n{\n#ifdef LOG_DEPTH\nfloat near = czm_currentFrustum.x;\nfloat far = czm_currentFrustum.y;\nfloat log2Depth = logZ * czm_log2FarDepthFromNearPlusOne;\nfloat depthFromNear = pow(2.0, log2Depth) - 1.0;\nreturn far * (1.0 - near / (depthFromNear + near)) / (far - near);\n#endif\nreturn logZ;\n}\n",czm_sampleOctahedralProjection="vec3 czm_sampleOctahedralProjectionWithFiltering(sampler2D projectedMap, vec2 textureSize, vec3 direction, float lod)\n{\ndirection /= dot(vec3(1.0), abs(direction));\nvec2 rev = abs(direction.zx) - vec2(1.0);\nvec2 neg = vec2(direction.x < 0.0 ? rev.x : -rev.x,\ndirection.z < 0.0 ? rev.y : -rev.y);\nvec2 uv = direction.y < 0.0 ? neg : direction.xz;\nvec2 coord = 0.5 * uv + vec2(0.5);\nvec2 pixel = 1.0 / textureSize;\nif (lod > 0.0)\n{\nfloat scale = 1.0 / pow(2.0, lod);\nfloat offset = ((textureSize.y + 1.0) / textureSize.x);\ncoord.x *= offset;\ncoord *= scale;\ncoord.x += offset + pixel.x;\ncoord.y += (1.0 - (1.0 / pow(2.0, lod - 1.0))) + pixel.y * (lod - 1.0) * 2.0;\n}\nelse\n{\ncoord.x *= (textureSize.y / textureSize.x);\n}\n#ifndef OES_texture_float_linear\nvec3 color1 = texture2D(projectedMap, coord + vec2(0.0, pixel.y)).rgb;\nvec3 color2 = texture2D(projectedMap, coord + vec2(pixel.x, 0.0)).rgb;\nvec3 color3 = texture2D(projectedMap, coord + pixel).rgb;\nvec3 color4 = texture2D(projectedMap, coord).rgb;\nvec2 texturePosition = coord * textureSize;\nfloat fu = fract(texturePosition.x);\nfloat fv = fract(texturePosition.y);\nvec3 average1 = mix(color4, color2, fu);\nvec3 average2 = mix(color1, color3, fu);\nvec3 color = mix(average1, average2, fv);\n#else\nvec3 color = texture2D(projectedMap, coord).rgb;\n#endif\nreturn color;\n}\nvec3 czm_sampleOctahedralProjection(sampler2D projectedMap, vec2 textureSize, vec3 direction, float lod, float maxLod) {\nfloat currentLod = floor(lod + 0.5);\nfloat nextLod = min(currentLod + 1.0, maxLod);\nvec3 colorCurrentLod = czm_sampleOctahedralProjectionWithFiltering(projectedMap, textureSize, direction, currentLod);\nvec3 colorNextLod = czm_sampleOctahedralProjectionWithFiltering(projectedMap, textureSize, direction, nextLod);\nreturn mix(colorNextLod, colorCurrentLod, nextLod - lod);\n}\n",czm_saturation="vec3 czm_saturation(vec3 rgb, float adjustment)\n{\nconst vec3 W = vec3(0.2125, 0.7154, 0.0721);\nvec3 intensity = vec3(dot(rgb, W));\nreturn mix(intensity, rgb, adjustment);\n}\n",czm_shadowDepthCompare="float czm_sampleShadowMap(samplerCube shadowMap, vec3 d)\n{\nreturn czm_unpackDepth(textureCube(shadowMap, d));\n}\nfloat czm_sampleShadowMap(sampler2D shadowMap, vec2 uv)\n{\n#ifdef USE_SHADOW_DEPTH_TEXTURE\nreturn texture2D(shadowMap, uv).r;\n#else\nreturn czm_unpackDepth(texture2D(shadowMap, uv));\n#endif\n}\nfloat czm_shadowDepthCompare(samplerCube shadowMap, vec3 uv, float depth)\n{\nreturn step(depth, czm_sampleShadowMap(shadowMap, uv));\n}\nfloat czm_shadowDepthCompare(sampler2D shadowMap, vec2 uv, float depth)\n{\nreturn step(depth, czm_sampleShadowMap(shadowMap, uv));\n}\n",czm_shadowVisibility="float czm_private_shadowVisibility(float visibility, float nDotL, float normalShadingSmooth, float darkness)\n{\n#ifdef USE_NORMAL_SHADING\n#ifdef USE_NORMAL_SHADING_SMOOTH\nfloat strength = clamp(nDotL / normalShadingSmooth, 0.0, 1.0);\n#else\nfloat strength = step(0.0, nDotL);\n#endif\nvisibility *= strength;\n#endif\nvisibility = max(visibility, darkness);\nreturn visibility;\n}\n#ifdef USE_CUBE_MAP_SHADOW\nfloat czm_shadowVisibility(samplerCube shadowMap, czm_shadowParameters shadowParameters)\n{\nfloat depthBias = shadowParameters.depthBias;\nfloat depth = shadowParameters.depth;\nfloat nDotL = shadowParameters.nDotL;\nfloat normalShadingSmooth = shadowParameters.normalShadingSmooth;\nfloat darkness = shadowParameters.darkness;\nvec3 uvw = shadowParameters.texCoords;\ndepth -= depthBias;\nfloat visibility = czm_shadowDepthCompare(shadowMap, uvw, depth);\nreturn czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness);\n}\n#else\nfloat czm_shadowVisibility(sampler2D shadowMap, czm_shadowParameters shadowParameters)\n{\nfloat depthBias = shadowParameters.depthBias;\nfloat depth = shadowParameters.depth;\nfloat nDotL = shadowParameters.nDotL;\nfloat normalShadingSmooth = shadowParameters.normalShadingSmooth;\nfloat darkness = shadowParameters.darkness;\nvec2 uv = shadowParameters.texCoords;\ndepth -= depthBias;\n#ifdef USE_SOFT_SHADOWS\nvec2 texelStepSize = shadowParameters.texelStepSize;\nfloat radius = 1.0;\nfloat dx0 = -texelStepSize.x * radius;\nfloat dy0 = -texelStepSize.y * radius;\nfloat dx1 = texelStepSize.x * radius;\nfloat dy1 = texelStepSize.y * radius;\nfloat visibility = (\nczm_shadowDepthCompare(shadowMap, uv, depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy0), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy0), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy0), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(dx0, 0.0), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(dx1, 0.0), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy1), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy1), depth) +\nczm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy1), depth)\n) * (1.0 / 9.0);\n#else\nfloat visibility = czm_shadowDepthCompare(shadowMap, uv, depth);\n#endif\nreturn czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness);\n}\n#endif\n",czm_signNotZero="float czm_signNotZero(float value)\n{\nreturn value >= 0.0 ? 1.0 : -1.0;\n}\nvec2 czm_signNotZero(vec2 value)\n{\nreturn vec2(czm_signNotZero(value.x), czm_signNotZero(value.y));\n}\nvec3 czm_signNotZero(vec3 value)\n{\nreturn vec3(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z));\n}\nvec4 czm_signNotZero(vec4 value)\n{\nreturn vec4(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z), czm_signNotZero(value.w));\n}\n",czm_sphericalHarmonics="vec3 czm_sphericalHarmonics(vec3 normal, vec3 coefficients[9])\n{\nconst float c1 = 0.429043;\nconst float c2 = 0.511664;\nconst float c3 = 0.743125;\nconst float c4 = 0.886227;\nconst float c5 = 0.247708;\nvec3 L00 = coefficients[0];\nvec3 L1_1 = coefficients[1];\nvec3 L10 = coefficients[2];\nvec3 L11 = coefficients[3];\nvec3 L2_2 = coefficients[4];\nvec3 L2_1 = coefficients[5];\nvec3 L20 = coefficients[6];\nvec3 L21 = coefficients[7];\nvec3 L22 = coefficients[8];\nfloat x = normal.x;\nfloat y = normal.y;\nfloat z = normal.z;\nreturn c1 * L22 * (x * x - y * y) + c3 * L20 * z * z + c4 * L00 - c5 * L20 +\n2.0 * c1 * (L2_2 * x * y + L21 * x * z + L2_1 * y * z) +\n2.0 * c2 * (L11 * x + L1_1 * y + L10 * z);\n}\n",czm_tangentToEyeSpaceMatrix="mat3 czm_tangentToEyeSpaceMatrix(vec3 normalEC, vec3 tangentEC, vec3 bitangentEC)\n{\nvec3 normal = normalize(normalEC);\nvec3 tangent = normalize(tangentEC);\nvec3 bitangent = normalize(bitangentEC);\nreturn mat3(tangent.x , tangent.y , tangent.z,\nbitangent.x, bitangent.y, bitangent.z,\nnormal.x , normal.y , normal.z);\n}\n",czm_transformPlane="vec4 czm_transformPlane(vec4 clippingPlane, mat4 transform) {\nvec3 transformedDirection = normalize((transform * vec4(clippingPlane.xyz, 0.0)).xyz);\nvec3 transformedPosition = (transform * vec4(clippingPlane.xyz * -clippingPlane.w, 1.0)).xyz;\nvec4 transformedPlane;\ntransformedPlane.xyz = transformedDirection;\ntransformedPlane.w = -dot(transformedDirection, transformedPosition);\nreturn transformedPlane;\n}\n",czm_translateRelativeToEye="vec4 czm_translateRelativeToEye(vec3 high, vec3 low)\n{\nvec3 highDifference = high - czm_encodedCameraPositionMCHigh;\nvec3 lowDifference = low - czm_encodedCameraPositionMCLow;\nreturn vec4(highDifference + lowDifference, 1.0);\n}\n",czm_translucentPhong="vec4 czm_translucentPhong(vec3 toEye, czm_material material, vec3 lightDirectionEC)\n{\nfloat diffuse = czm_getLambertDiffuse(vec3(0.0, 0.0, 1.0), material.normal);\nif (czm_sceneMode == czm_sceneMode3D) {\ndiffuse += czm_getLambertDiffuse(vec3(0.0, 1.0, 0.0), material.normal);\n}\ndiffuse = clamp(diffuse, 0.0, 1.0);\nfloat specular = czm_getSpecular(lightDirectionEC, toEye, material.normal, material.shininess);\nvec3 materialDiffuse = material.diffuse * 0.5;\nvec3 ambient = materialDiffuse;\nvec3 color = ambient + material.emission;\ncolor += materialDiffuse * diffuse * czm_lightColor;\ncolor += material.specular * specular * czm_lightColor;\nreturn vec4(color, material.alpha);\n}\n",czm_transpose="mat2 czm_transpose(mat2 matrix)\n{\nreturn mat2(\nmatrix[0][0], matrix[1][0],\nmatrix[0][1], matrix[1][1]);\n}\nmat3 czm_transpose(mat3 matrix)\n{\nreturn mat3(\nmatrix[0][0], matrix[1][0], matrix[2][0],\nmatrix[0][1], matrix[1][1], matrix[2][1],\nmatrix[0][2], matrix[1][2], matrix[2][2]);\n}\nmat4 czm_transpose(mat4 matrix)\n{\nreturn mat4(\nmatrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0],\nmatrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1],\nmatrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2],\nmatrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]);\n}\n",czm_unpackDepth="float czm_unpackDepth(vec4 packedDepth)\n{\nreturn dot(packedDepth, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n}\n",czm_unpackFloat="#define SHIFT_RIGHT_8 0.00390625 //1.0 / 256.0\n#define SHIFT_RIGHT_16 0.00001525878 //1.0 / 65536.0\n#define SHIFT_RIGHT_24 5.960464477539063e-8//1.0 / 16777216.0\n#define BIAS 38.0\nfloat czm_unpackFloat(vec4 packedFloat)\n{\npackedFloat *= 255.0;\nfloat temp = packedFloat.w / 2.0;\nfloat exponent = floor(temp);\nfloat sign = (temp - exponent) * 2.0;\nexponent = exponent - float(BIAS);\nsign = sign * 2.0 - 1.0;\nsign = -sign;\nfloat unpacked = sign * packedFloat.x * float(SHIFT_RIGHT_8);\nunpacked += sign * packedFloat.y * float(SHIFT_RIGHT_16);\nunpacked += sign * packedFloat.z * float(SHIFT_RIGHT_24);\nreturn unpacked * pow(10.0, exponent);\n}\n",czm_vertexLogDepth="#ifdef LOG_DEPTH\nvarying float v_depthFromNearPlusOne;\n#ifdef SHADOW_MAP\nvarying vec3 v_logPositionEC;\n#endif\n#endif\nvec4 czm_updatePositionDepth(vec4 coords) {\n#if defined(LOG_DEPTH)\n#ifdef SHADOW_MAP\nvec3 logPositionEC = (czm_inverseProjection * coords).xyz;\nv_logPositionEC = logPositionEC;\n#endif\ncoords.z = clamp(coords.z / coords.w, -1.0, 1.0) * coords.w;\n#endif\nreturn coords;\n}\nvoid czm_vertexLogDepth()\n{\n#ifdef LOG_DEPTH\nv_depthFromNearPlusOne = (gl_Position.w - czm_currentFrustum.x) + 1.0;\ngl_Position = czm_updatePositionDepth(gl_Position);\n#endif\n}\nvoid czm_vertexLogDepth(vec4 clipCoords)\n{\n#ifdef LOG_DEPTH\nv_depthFromNearPlusOne = (clipCoords.w - czm_currentFrustum.x) + 1.0;\nczm_updatePositionDepth(clipCoords);\n#endif\n}\n",czm_windowToEyeCoordinates="vec4 czm_windowToEyeCoordinates(vec4 fragmentCoordinate)\n{\nfloat x = 2.0 * (fragmentCoordinate.x - czm_viewport.x) / czm_viewport.z - 1.0;\nfloat y = 2.0 * (fragmentCoordinate.y - czm_viewport.y) / czm_viewport.w - 1.0;\nfloat z = (fragmentCoordinate.z - czm_viewportTransformation[3][2]) / czm_viewportTransformation[2][2];\nvec4 q = vec4(x, y, z, 1.0);\nq /= fragmentCoordinate.w;\nif (!(czm_inverseProjection == mat4(0.0)))\n{\nq = czm_inverseProjection * q;\n}\nelse\n{\nfloat top = czm_frustumPlanes.x;\nfloat bottom = czm_frustumPlanes.y;\nfloat left = czm_frustumPlanes.z;\nfloat right = czm_frustumPlanes.w;\nfloat near = czm_currentFrustum.x;\nfloat far = czm_currentFrustum.y;\nq.x = (q.x * (right - left) + left + right) * 0.5;\nq.y = (q.y * (top - bottom) + bottom + top) * 0.5;\nq.z = (q.z * (near - far) - near - far) * 0.5;\nq.w = 1.0;\n}\nreturn q;\n}\nvec4 czm_windowToEyeCoordinates(vec2 fragmentCoordinateXY, float depthOrLogDepth)\n{\n#ifdef LOG_DEPTH\nfloat near = czm_currentFrustum.x;\nfloat far = czm_currentFrustum.y;\nfloat log2Depth = depthOrLogDepth * czm_log2FarDepthFromNearPlusOne;\nfloat depthFromNear = pow(2.0, log2Depth) - 1.0;\nfloat depthFromCamera = depthFromNear + near;\nvec4 windowCoord = vec4(fragmentCoordinateXY, far * (1.0 - near / depthFromCamera) / (far - near), 1.0);\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(windowCoord);\neyeCoordinate.w = 1.0 / depthFromCamera;\nreturn eyeCoordinate;\n#else\nvec4 windowCoord = vec4(fragmentCoordinateXY, depthOrLogDepth, 1.0);\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(windowCoord);\n#endif\nreturn eyeCoordinate;\n}\n",czm_writeDepthClamp="#ifndef LOG_DEPTH\nvarying float v_WindowZ;\n#endif\nvoid czm_writeDepthClamp()\n{\n#if defined(GL_EXT_frag_depth) && !defined(LOG_DEPTH)\ngl_FragDepthEXT = clamp(v_WindowZ * gl_FragCoord.w, 0.0, 1.0);\n#endif\n}\n",czm_writeLogDepth="#ifdef LOG_DEPTH\nvarying float v_depthFromNearPlusOne;\n#ifdef POLYGON_OFFSET\nuniform vec2 u_polygonOffset;\n#endif\n#endif\nvoid czm_writeLogDepth(float depth)\n{\n#if defined(GL_EXT_frag_depth) && defined(LOG_DEPTH)\nif (depth <= 0.9999999 || depth > czm_farDepthFromNearPlusOne) {\ndiscard;\n}\n#ifdef POLYGON_OFFSET\nfloat factor = u_polygonOffset[0];\nfloat units = u_polygonOffset[1];\n#ifdef GL_OES_standard_derivatives\nfloat x = dFdx(depth);\nfloat y = dFdy(depth);\nfloat m = sqrt(x * x + y * y);\ndepth += m * factor;\n#endif\n#endif\ngl_FragDepthEXT = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne;\n#ifdef POLYGON_OFFSET\ngl_FragDepthEXT += czm_epsilon7 * units;\n#endif\n#endif\n}\nvoid czm_writeLogDepth() {\n#ifdef LOG_DEPTH\nczm_writeLogDepth(v_depthFromNearPlusOne);\n#endif\n}\n",czm_writeNonPerspective="float czm_writeNonPerspective(float value, float w) {\nreturn value * w;\n}\nvec2 czm_writeNonPerspective(vec2 value, float w) {\nreturn value * w;\n}\nvec3 czm_writeNonPerspective(vec3 value, float w) {\nreturn value * w;\n}\nvec4 czm_writeNonPerspective(vec4 value, float w) {\nreturn value * w;\n}\n",CzmBuiltins={czm_degreesPerRadian:czm_degreesPerRadian,czm_depthRange:czm_depthRange,czm_epsilon1:czm_epsilon1,czm_epsilon2:czm_epsilon2,czm_epsilon3:czm_epsilon3,czm_epsilon4:czm_epsilon4,czm_epsilon5:czm_epsilon5,czm_epsilon6:czm_epsilon6,czm_epsilon7:czm_epsilon7,czm_infinity:czm_infinity,czm_oneOverPi:czm_oneOverPi,czm_oneOverTwoPi:czm_oneOverTwoPi,czm_passCesium3DTile:czm_passCesium3DTile,czm_passCesium3DTileClassification:czm_passCesium3DTileClassification,czm_passCesium3DTileClassificationIgnoreShow:czm_passCesium3DTileClassificationIgnoreShow,czm_passClassification:czm_passClassification,czm_passCompute:czm_passCompute,czm_passEnvironment:czm_passEnvironment,czm_passGlobe:czm_passGlobe,czm_passOpaque:czm_passOpaque,czm_passOverlay:czm_passOverlay,czm_passTerrainClassification:czm_passTerrainClassification,czm_passTranslucent:czm_passTranslucent,czm_pi:czm_pi,czm_piOverFour:czm_piOverFour,czm_piOverSix:czm_piOverSix,czm_piOverThree:czm_piOverThree,czm_piOverTwo:czm_piOverTwo,czm_radiansPerDegree:czm_radiansPerDegree,czm_sceneMode2D:czm_sceneMode2D,czm_sceneMode3D:czm_sceneMode3D,czm_sceneModeColumbusView:czm_sceneModeColumbusView,czm_sceneModeMorphing:czm_sceneModeMorphing,czm_solarRadius:czm_solarRadius,czm_threePiOver2:czm_threePiOver2,czm_twoPi:czm_twoPi,czm_webMercatorMaxLatitude:czm_webMercatorMaxLatitude,czm_depthRangeStruct:czm_depthRangeStruct,czm_material:czm_material,czm_materialInput:czm_materialInput,czm_ray:czm_ray,czm_raySegment:czm_raySegment,czm_shadowParameters:czm_shadowParameters,czm_HSBToRGB:czm_HSBToRGB,czm_HSLToRGB:czm_HSLToRGB,czm_RGBToHSB:czm_RGBToHSB,czm_RGBToHSL:czm_RGBToHSL,czm_RGBToXYZ:czm_RGBToXYZ,czm_XYZToRGB:czm_XYZToRGB,czm_acesTonemapping:czm_acesTonemapping,czm_alphaWeight:czm_alphaWeight,czm_antialias:czm_antialias,czm_approximateSphericalCoordinates:czm_approximateSphericalCoordinates,czm_backFacing:czm_backFacing,czm_branchFreeTernary:czm_branchFreeTernary,czm_cascadeColor:czm_cascadeColor,czm_cascadeDistance:czm_cascadeDistance,czm_cascadeMatrix:czm_cascadeMatrix,czm_cascadeWeights:czm_cascadeWeights,czm_columbusViewMorph:czm_columbusViewMorph,czm_computePosition:czm_computePosition,czm_cosineAndSine:czm_cosineAndSine,czm_decompressTextureCoordinates:czm_decompressTextureCoordinates,czm_depthClamp:czm_depthClamp,czm_eastNorthUpToEyeCoordinates:czm_eastNorthUpToEyeCoordinates,czm_ellipsoidContainsPoint:czm_ellipsoidContainsPoint,czm_ellipsoidWgs84TextureCoordinates:czm_ellipsoidWgs84TextureCoordinates,czm_equalsEpsilon:czm_equalsEpsilon,czm_eyeOffset:czm_eyeOffset,czm_eyeToWindowCoordinates:czm_eyeToWindowCoordinates,czm_fastApproximateAtan:czm_fastApproximateAtan,czm_fog:czm_fog,czm_gammaCorrect:czm_gammaCorrect,czm_geodeticSurfaceNormal:czm_geodeticSurfaceNormal,czm_getDefaultMaterial:czm_getDefaultMaterial,czm_getLambertDiffuse:czm_getLambertDiffuse,czm_getSpecular:czm_getSpecular,czm_getWaterNoise:czm_getWaterNoise,czm_hue:czm_hue,czm_inverseGamma:czm_inverseGamma,czm_isEmpty:czm_isEmpty,czm_isFull:czm_isFull,czm_latitudeToWebMercatorFraction:czm_latitudeToWebMercatorFraction,czm_lineDistance:czm_lineDistance,czm_luminance:czm_luminance,czm_metersPerPixel:czm_metersPerPixel,czm_modelToWindowCoordinates:czm_modelToWindowCoordinates,czm_multiplyWithColorBalance:czm_multiplyWithColorBalance,czm_nearFarScalar:czm_nearFarScalar,czm_octDecode:czm_octDecode,czm_packDepth:czm_packDepth,czm_phong:czm_phong,czm_planeDistance:czm_planeDistance,czm_pointAlongRay:czm_pointAlongRay,czm_rayEllipsoidIntersectionInterval:czm_rayEllipsoidIntersectionInterval,czm_readDepth:czm_readDepth,czm_readNonPerspective:czm_readNonPerspective,czm_reverseLogDepth:czm_reverseLogDepth,czm_sampleOctahedralProjection:czm_sampleOctahedralProjection,czm_saturation:czm_saturation,czm_shadowDepthCompare:czm_shadowDepthCompare,czm_shadowVisibility:czm_shadowVisibility,czm_signNotZero:czm_signNotZero,czm_sphericalHarmonics:czm_sphericalHarmonics,czm_tangentToEyeSpaceMatrix:czm_tangentToEyeSpaceMatrix,czm_transformPlane:czm_transformPlane,czm_translateRelativeToEye:czm_translateRelativeToEye,czm_translucentPhong:czm_translucentPhong,czm_transpose:czm_transpose,czm_unpackDepth:czm_unpackDepth,czm_unpackFloat:czm_unpackFloat,czm_vertexLogDepth:czm_vertexLogDepth,czm_windowToEyeCoordinates:czm_windowToEyeCoordinates,czm_writeDepthClamp:czm_writeDepthClamp,czm_writeLogDepth:czm_writeLogDepth,czm_writeNonPerspective:czm_writeNonPerspective},uniform;function removeComments(e){return(e=e.replace(/\/\/.*/g,"")).replace(/\/\*\*[\s\S]*?\*\//gm,function(e){for(var t=e.match(/\n/gm).length,i="",r=0;r<t;++r)i+="\n";return i})}function getDependencyNode(e,t,i){for(var r,n=0;n<i.length;++n)i[n].name===e&&(r=i[n]);return defined(r)||(r={name:e,glslSource:t=removeComments(t),dependsOn:[],requiredBy:[],evaluated:!1},i.push(r)),r}function generateDependencies(i,r){var n;i.evaluated||(i.evaluated=!0,defined(n=i.glslSource.match(/\bczm_[a-zA-Z0-9_]*/g))&&null!==n&&(n=n.filter(function(e,t){return n.indexOf(e)===t})).forEach(function(e){var t;e!==i.name&&ShaderSource._czmBuiltinsAndUniforms.hasOwnProperty(e)&&(t=getDependencyNode(e,ShaderSource._czmBuiltinsAndUniforms[e],r),i.dependsOn.push(t),t.requiredBy.push(i),generateDependencies(t,r))}))}function sortDependencies(e){for(var t=[],i=[];0<e.length;){var r=e.pop();i.push(r),0===r.requiredBy.length&&t.push(r)}for(;0<t.length;){var n=t.shift();e.push(n);for(var a=0;a<n.dependsOn.length;++a){var o=n.dependsOn[a],s=o.requiredBy.indexOf(n);o.requiredBy.splice(s,1),0===o.requiredBy.length&&t.push(o)}}for(var l=0;l<i.length;++l)i[l].requiredBy.length}function getBuiltinsAndAutomaticUniforms(e){var t=[],i=getDependencyNode("main",e,t);generateDependencies(i,t),sortDependencies(t);for(var r="",n=t.length-1;0<=n;--n)r=r+t[n].glslSource+"\n";return r.replace(i.glslSource,"")}function combineShader(e,t,i){var r,n,a="",o=e.sources;if(defined(o))for(d=0,r=o.length;d<r;++d)a+="\n#line 0\n"+o[d];a=(a=removeComments(a)).replace(/#version\s+(.*?)\n/gm,function(e,t){return n=t,"\n"});var s=[];a=(a=a.replace(/#extension.*\n/gm,function(e){return s.push(e),"\n"})).replace(/precision\s(lowp|mediump|highp)\s(float|int);/,"");var l=e.pickColorQualifier;defined(l)&&(a=ShaderSource.createPickFragmentShaderSource(a,l));var c="";defined(n)&&(c="#version "+n+"\n");for(var u=s.length,d=0;d<u;d++)c+=s[d];t&&(c+="#ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n#else\n precision mediump float;\n#endif\n\n");var h=e.defines;if(defined(h))for(d=0,r=h.length;d<r;++d){var p=h[d];0!==p.length&&(c+="#define "+p+"\n")}return i.webgl2&&(c+="#define OUTPUT_DECLARATION\n\n"),i.textureFloatLinear&&(c+="#define OES_texture_float_linear\n\n"),e.includeBuiltIns&&(c+=getBuiltinsAndAutomaticUniforms(a)),c+="\n#line 0\n",c+=a,i.webgl2&&(c=modernizeShader(c,t)),c}function ShaderSource(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).pickColorQualifier;this.defines=defined(e.defines)?e.defines.slice(0):[],this.sources=defined(e.sources)?e.sources.slice(0):[],this.pickColorQualifier=t,this.includeBuiltIns=defaultValue(e.includeBuiltIns,!0)}for(var builtinName in ShaderSource.prototype.clone=function(){return new ShaderSource({sources:this.sources,defines:this.defines,pickColorQualifier:this.pickColorQualifier,includeBuiltIns:this.includeBuiltIns})},ShaderSource.replaceMain=function(e,t){return t="void "+t+"()",e.replace(/void\s+main\s*\(\s*(?:void)?\s*\)/g,t)},ShaderSource.prototype.createCombinedVertexShader=function(e){return combineShader(this,!1,e)},ShaderSource.prototype.createCombinedFragmentShader=function(e){return combineShader(this,!0,e)},ShaderSource._czmBuiltinsAndUniforms={},CzmBuiltins)CzmBuiltins.hasOwnProperty(builtinName)&&(ShaderSource._czmBuiltinsAndUniforms[builtinName]=CzmBuiltins[builtinName]);for(var uniformName in AutomaticUniforms){AutomaticUniforms.hasOwnProperty(uniformName)&&(uniform=AutomaticUniforms[uniformName],"function"==typeof uniform.getDeclaration&&(ShaderSource._czmBuiltinsAndUniforms[uniformName]=uniform.getDeclaration(uniformName)))}ShaderSource.createPickVertexShaderSource=function(e){return ShaderSource.replaceMain(e,"czm_old_main")+"\nattribute vec4 pickColor; \nvarying vec4 czm_pickColor; \nvoid main() \n{ \n czm_old_main(); \n czm_pickColor = pickColor; \n}"},ShaderSource.createPickFragmentShaderSource=function(e,t){return ShaderSource.replaceMain(e,"czm_old_main")+"\n"+(t+" vec4 czm_pickColor; \nvoid main() \n{ \n czm_old_main(); \n if (gl_FragColor.a == 0.0) { \n discard; \n } \n gl_FragColor = czm_pickColor; \n}")},ShaderSource.findVarying=function(e,t){for(var i=e.sources,r=t.length,n=0;n<r;++n)for(var a=t[n],o=i.length,s=0;s<o;++s)if(-1!==i[s].indexOf(a))return a};var normalVaryingNames=["v_normalEC","v_normal"];ShaderSource.findNormalVarying=function(e){return ShaderSource.findVarying(e,normalVaryingNames)};var positionVaryingNames=["v_positionEC"];ShaderSource.findPositionVarying=function(e){return ShaderSource.findVarying(e,positionVaryingNames)};var ShadowVolumeAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute float batchId;\n#ifdef EXTRUDED_GEOMETRY\nattribute vec3 extrudeDirection;\nuniform float u_globeMinimumAltitude;\n#endif // EXTRUDED_GEOMETRY\n#ifdef PER_INSTANCE_COLOR\nvarying vec4 v_color;\n#endif // PER_INSTANCE_COLOR\n#ifdef TEXTURE_COORDINATES\n#ifdef SPHERICAL\nvarying vec4 v_sphericalExtents;\n#else // SPHERICAL\nvarying vec2 v_inversePlaneExtents;\nvarying vec4 v_westPlane;\nvarying vec4 v_southPlane;\n#endif // SPHERICAL\nvarying vec3 v_uvMinAndSphericalLongitudeRotation;\nvarying vec3 v_uMaxAndInverseDistance;\nvarying vec3 v_vMaxAndInverseDistance;\n#endif // TEXTURE_COORDINATES\nvoid main()\n{\nvec4 position = czm_computePosition();\n#ifdef EXTRUDED_GEOMETRY\nfloat delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverMeter * length(position.xyz));\ndelta *= czm_sceneMode == czm_sceneMode3D ? 1.0 : 0.0;\nposition = position + vec4(extrudeDirection * delta, 0.0);\n#endif\n#ifdef TEXTURE_COORDINATES\n#ifdef SPHERICAL\nv_sphericalExtents = czm_batchTable_sphericalExtents(batchId);\nv_uvMinAndSphericalLongitudeRotation.z = czm_batchTable_longitudeRotation(batchId);\n#else // SPHERICAL\n#ifdef COLUMBUS_VIEW_2D\nvec4 planes2D_high = czm_batchTable_planes2D_HIGH(batchId);\nvec4 planes2D_low = czm_batchTable_planes2D_LOW(batchId);\nvec2 idlSplitNewPlaneHiLow = vec2(EAST_MOST_X_HIGH - (WEST_MOST_X_HIGH - planes2D_high.w), EAST_MOST_X_LOW - (WEST_MOST_X_LOW - planes2D_low.w));\nbool idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y > 0.0;\nplanes2D_high.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.w);\nplanes2D_low.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.w);\nidlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y < 0.0;\nidlSplitNewPlaneHiLow = vec2(WEST_MOST_X_HIGH - (EAST_MOST_X_HIGH - planes2D_high.x), WEST_MOST_X_LOW - (EAST_MOST_X_LOW - planes2D_low.x));\nplanes2D_high.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.x);\nplanes2D_low.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.x);\nvec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.xy), vec3(0.0, planes2D_low.xy))).xyz;\nvec3 northWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.x, planes2D_high.z), vec3(0.0, planes2D_low.x, planes2D_low.z))).xyz;\nvec3 southEastCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.w, planes2D_high.y), vec3(0.0, planes2D_low.w, planes2D_low.y))).xyz;\n#else // COLUMBUS_VIEW_2D\nvec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(czm_batchTable_southWest_HIGH(batchId), czm_batchTable_southWest_LOW(batchId))).xyz;\nvec3 northWestCorner = czm_normal * czm_batchTable_northward(batchId) + southWestCorner;\nvec3 southEastCorner = czm_normal * czm_batchTable_eastward(batchId) + southWestCorner;\n#endif // COLUMBUS_VIEW_2D\nvec3 eastWard = southEastCorner - southWestCorner;\nfloat eastExtent = length(eastWard);\neastWard /= eastExtent;\nvec3 northWard = northWestCorner - southWestCorner;\nfloat northExtent = length(northWard);\nnorthWard /= northExtent;\nv_westPlane = vec4(eastWard, -dot(eastWard, southWestCorner));\nv_southPlane = vec4(northWard, -dot(northWard, southWestCorner));\nv_inversePlaneExtents = vec2(1.0 / eastExtent, 1.0 / northExtent);\n#endif // SPHERICAL\nvec4 uvMinAndExtents = czm_batchTable_uvMinAndExtents(batchId);\nvec4 uMaxVmax = czm_batchTable_uMaxVmax(batchId);\nv_uMaxAndInverseDistance = vec3(uMaxVmax.xy, uvMinAndExtents.z);\nv_vMaxAndInverseDistance = vec3(uMaxVmax.zw, uvMinAndExtents.w);\nv_uvMinAndSphericalLongitudeRotation.xy = uvMinAndExtents.xy;\n#endif // TEXTURE_COORDINATES\n#ifdef PER_INSTANCE_COLOR\nv_color = czm_batchTable_color(batchId);\n#endif\ngl_Position = czm_depthClamp(czm_modelViewProjectionRelativeToEye * position);\n}\n",ShadowVolumeFS="#ifdef GL_EXT_frag_depth\n#extension GL_EXT_frag_depth : enable\n#endif\n#ifdef VECTOR_TILE\nuniform vec4 u_highlightColor;\n#endif\nvoid main(void)\n{\n#ifdef VECTOR_TILE\ngl_FragColor = czm_gammaCorrect(u_highlightColor);\n#else\ngl_FragColor = vec4(1.0);\n#endif\nczm_writeDepthClamp();\n}\n",ClassificationType={TERRAIN:0,CESIUM_3D_TILE:1,BOTH:2,NUMBER_OF_CLASSIFICATION_TYPES:3},ClassificationType$1=Object.freeze(ClassificationType),DepthFunction={NEVER:WebGLConstants$1.NEVER,LESS:WebGLConstants$1.LESS,EQUAL:WebGLConstants$1.EQUAL,LESS_OR_EQUAL:WebGLConstants$1.LEQUAL,GREATER:WebGLConstants$1.GREATER,NOT_EQUAL:WebGLConstants$1.NOTEQUAL,GREATER_OR_EQUAL:WebGLConstants$1.GEQUAL,ALWAYS:WebGLConstants$1.ALWAYS},DepthFunction$1=Object.freeze(DepthFunction),BufferUsage={STREAM_DRAW:WebGLConstants$1.STREAM_DRAW,STATIC_DRAW:WebGLConstants$1.STATIC_DRAW,DYNAMIC_DRAW:WebGLConstants$1.DYNAMIC_DRAW,validate:function(e){return e===BufferUsage.STREAM_DRAW||e===BufferUsage.STATIC_DRAW||e===BufferUsage.DYNAMIC_DRAW}},BufferUsage$1=Object.freeze(BufferUsage);function Buffer$1(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context._gl,i=e.bufferTarget,r=e.typedArray,n=e.sizeInBytes,a=e.usage,o=defined(r);o&&(n=r.byteLength);var s=t.createBuffer();t.bindBuffer(i,s),t.bufferData(i,o?r:n,a),t.bindBuffer(i,null),this._gl=t,this._webgl2=e.context._webgl2,this._bufferTarget=i,this._sizeInBytes=n,this._usage=a,this._buffer=s,this.vertexArrayDestroyable=!0}function addAttribute(e,t,i,r){var n=defined(t.vertexBuffer),a=defined(t.value),o=t.value?t.value.length:t.componentsPerAttribute,s={index:defaultValue(t.index,i),enabled:defaultValue(t.enabled,!0),vertexBuffer:t.vertexBuffer,value:a?t.value.slice(0):void 0,componentsPerAttribute:o,componentDatatype:defaultValue(t.componentDatatype,ComponentDatatype$1.FLOAT),normalize:defaultValue(t.normalize,!1),offsetInBytes:defaultValue(t.offsetInBytes,0),strideInBytes:defaultValue(t.strideInBytes,0),instanceDivisor:defaultValue(t.instanceDivisor,0)};if(n)s.vertexAttrib=function(e){var t=this.index;e.bindBuffer(e.ARRAY_BUFFER,this.vertexBuffer._getBuffer()),e.vertexAttribPointer(t,this.componentsPerAttribute,this.componentDatatype,this.normalize,this.strideInBytes,this.offsetInBytes),e.enableVertexAttribArray(t),0<this.instanceDivisor&&(r.glVertexAttribDivisor(t,this.instanceDivisor),r._vertexAttribDivisors[t]=this.instanceDivisor,r._previousDrawInstanced=!0)},s.disableVertexAttribArray=function(e){e.disableVertexAttribArray(this.index),0<this.instanceDivisor&&r.glVertexAttribDivisor(i,0)};else{switch(s.componentsPerAttribute){case 1:s.vertexAttrib=function(e){e.vertexAttrib1fv(this.index,this.value)};break;case 2:s.vertexAttrib=function(e){e.vertexAttrib2fv(this.index,this.value)};break;case 3:s.vertexAttrib=function(e){e.vertexAttrib3fv(this.index,this.value)};break;case 4:s.vertexAttrib=function(e){e.vertexAttrib4fv(this.index,this.value)}}s.disableVertexAttribArray=function(e){}}e.push(s)}function bind(e,t,i){for(var r=0;r<t.length;++r){var n=t[r];n.enabled&&n.vertexAttrib(e)}defined(i)&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,i._getBuffer())}function VertexArray(e){for(var t,i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context,r=i._gl,n=e.attributes,a=e.indexBuffer,o=[],s=1,l=!1,c=!1,u=n.length,d=0;d<u;++d)addAttribute(o,n[d],d,i);for(u=o.length,d=0;d<u;++d){var h=o[d];if(defined(h.vertexBuffer)&&0===h.instanceDivisor){var p=h.strideInBytes||h.componentsPerAttribute*ComponentDatatype$1.getSizeInBytes(h.componentDatatype),s=h.vertexBuffer.sizeInBytes/p;break}}for(d=0;d<u;++d)0<o[d].instanceDivisor&&(l=!0),defined(o[d].value)&&(c=!0);i.vertexArrayObject&&(t=i.glCreateVertexArray(),i.glBindVertexArray(t),bind(r,o,a),i.glBindVertexArray(null)),this._numberOfVertices=s,this._hasInstancedAttributes=l,this._hasConstantAttributes=c,this._context=i,this._gl=r,this._vao=t,this._attributes=o,this._indexBuffer=a}function computeNumberOfVertices(e){return e.values.length/e.componentsPerAttribute}function computeAttributeSizeInBytes(e){return ComponentDatatype$1.getSizeInBytes(e.componentDatatype)*e.componentsPerAttribute}function interleaveAttributes(i){var e,t,r,n=[];for(e in i)i.hasOwnProperty(e)&&defined(i[e])&&defined(i[e].values)&&(n.push(e),i[e].componentDatatype===ComponentDatatype$1.DOUBLE&&(i[e].componentDatatype=ComponentDatatype$1.FLOAT,i[e].values=ComponentDatatype$1.createTypedArray(ComponentDatatype$1.FLOAT,i[e].values)));var a=n.length;if(0<a)for(r=computeNumberOfVertices(i[n[0]]),p=1;p<a;++p){var o=computeNumberOfVertices(i[n[p]]);if(o!==r)throw new RuntimeError("Each attribute list must have the same number of vertices. Attribute "+n[p]+" has a different number of vertices ("+o.toString()+") than attribute "+n[0]+" ("+r.toString()+").")}n.sort(function(e,t){return ComponentDatatype$1.getSizeInBytes(i[t].componentDatatype)-ComponentDatatype$1.getSizeInBytes(i[e].componentDatatype)});var s=0,l={};for(p=0;p<a;++p)e=n[p],t=i[e],l[e]=s,s+=computeAttributeSizeInBytes(t);if(0<s){var c=ComponentDatatype$1.getSizeInBytes(i[n[0]].componentDatatype),u=s%c;0!=u&&(s+=c-u);for(var d=new ArrayBuffer(r*s),h={},p=0;p<a;++p){e=n[p];var m=ComponentDatatype$1.getSizeInBytes(i[e].componentDatatype);h[e]={pointer:ComponentDatatype$1.createTypedArray(i[e].componentDatatype,d),index:l[e]/m,strideInComponentType:s/m}}for(p=0;p<r;++p)for(var f=0;f<a;++f){e=n[f];for(var g=(t=i[e]).values,_=h[e],y=_.pointer,v=t.componentsPerAttribute,C=0;C<v;++C)y[_.index+C]=g[p*v+C];_.index+=_.strideInComponentType}return{buffer:d,offsetsInBytes:l,vertexSizeInBytes:s}}}function setVertexAttribDivisor(e){var t=e._context,i=e._hasInstancedAttributes;if(i||t._previousDrawInstanced){t._previousDrawInstanced=i;var r=t._vertexAttribDivisors,n=e._attributes,a=ContextLimits.maximumVertexAttributes;if(i)for(var o=n.length,s=0;s<o;++s){var l,c,u=n[s];!u.enabled||(l=u.instanceDivisor)!==r[c=u.index]&&(t.glVertexAttribDivisor(c,l),r[c]=l)}else for(s=0;s<a;++s)0<r[s]&&(t.glVertexAttribDivisor(s,0),r[s]=0)}}function setConstantAttributes(e,t){for(var i=e._attributes,r=i.length,n=0;n<r;++n){var a=i[n];a.enabled&&defined(a.value)&&a.vertexAttrib(t)}}function BatchTable(e,t,i){var r,n,a,o,s,l,c,u,d,h,p,m,f,g;this._attributes=t,this._numberOfInstances=i,0!==t.length&&(r=getDatatype(t),n=e.floatingPointTexture,s=getStride(o=createOffsets(t,a=r===PixelDatatype$1.FLOAT&&!n),t,a),l=Math.floor(ContextLimits.maximumTextureSize/s),p=.5*(h=1/(u=s*(c=Math.min(i,l)))),f=.5*(m=1/(d=Math.ceil(i/c))),this._textureDimensions=new Cartesian2(u,d),this._textureStep=new Cartesian4(h,p,m,f),this._pixelDatatype=a?PixelDatatype$1.UNSIGNED_BYTE:r,this._packFloats=a,this._offsets=o,this._stride=s,this._texture=void 0,g=4*u*d,this._batchValues=new(r!==PixelDatatype$1.FLOAT||a?Uint8Array:Float32Array)(g),this._batchValuesDirty=!1)}function getDatatype(e){for(var t=!1,i=e.length,r=0;r<i;++r)if(e[r].componentDatatype!==ComponentDatatype$1.UNSIGNED_BYTE){t=!0;break}return t?PixelDatatype$1.FLOAT:PixelDatatype$1.UNSIGNED_BYTE}function getAttributeType(e,t){var i=e[t].componentsPerAttribute;return 2===i?Cartesian2:3===i?Cartesian3:4===i?Cartesian4:Number}function createOffsets(e,t){for(var i=new Array(e.length),r=0,n=e.length,a=0;a<n;++a){var o=e[a].componentDatatype;i[a]=r,o!==ComponentDatatype$1.UNSIGNED_BYTE&&t?r+=4:++r}return i}function getStride(e,t,i){var r=e.length,n=e[r-1];return t[r-1].componentDatatype!==ComponentDatatype$1.UNSIGNED_BYTE&&i?n+4:n+1}Buffer$1.createVertexBuffer=function(e){return new Buffer$1({context:e.context,bufferTarget:WebGLConstants$1.ARRAY_BUFFER,typedArray:e.typedArray,sizeInBytes:e.sizeInBytes,usage:e.usage})},Buffer$1.createIndexBuffer=function(e){var t=e.context,i=e.indexDatatype,r=IndexDatatype$1.getSizeInBytes(i),n=new Buffer$1({context:t,bufferTarget:WebGLConstants$1.ELEMENT_ARRAY_BUFFER,typedArray:e.typedArray,sizeInBytes:e.sizeInBytes,usage:e.usage}),a=n.sizeInBytes/r;return Object.defineProperties(n,{indexDatatype:{get:function(){return i}},bytesPerIndex:{get:function(){return r}},numberOfIndices:{get:function(){return a}}}),n},Object.defineProperties(Buffer$1.prototype,{sizeInBytes:{get:function(){return this._sizeInBytes}},usage:{get:function(){return this._usage}}}),Buffer$1.prototype._getBuffer=function(){return this._buffer},Buffer$1.prototype.copyFromArrayView=function(e,t){t=defaultValue(t,0);var i=this._gl,r=this._bufferTarget;i.bindBuffer(r,this._buffer),i.bufferSubData(r,t,e),i.bindBuffer(r,null)},Buffer$1.prototype.copyFromBuffer=function(e,t,i,r){var n=WebGLConstants$1.COPY_READ_BUFFER,a=WebGLConstants$1.COPY_WRITE_BUFFER,o=this._gl;o.bindBuffer(a,this._buffer),o.bindBuffer(n,e._buffer),o.copyBufferSubData(n,a,t,i,r),o.bindBuffer(a,null),o.bindBuffer(n,null)},Buffer$1.prototype.getBufferData=function(e,t,i,r){t=defaultValue(t,0),i=defaultValue(i,0);var n=this._gl,a=WebGLConstants$1.COPY_READ_BUFFER;n.bindBuffer(a,this._buffer),n.getBufferSubData(a,t,e,i,r),n.bindBuffer(a,null)},Buffer$1.prototype.isDestroyed=function(){return!1},Buffer$1.prototype.destroy=function(){return this._gl.deleteBuffer(this._buffer),destroyObject(this)},VertexArray.fromGeometry=function(e){var t,i,r,n,a,o=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context,s=defaultValue(e.geometry,defaultValue.EMPTY_OBJECT),l=defaultValue(e.bufferUsage,BufferUsage$1.DYNAMIC_DRAW),c=defaultValue(e.attributeLocations,defaultValue.EMPTY_OBJECT),u=defaultValue(e.interleave,!1),d=e.vertexArrayAttributes,h=defined(d)?d:[],p=s.attributes;if(u){var m=interleaveAttributes(p);if(defined(m)){r=Buffer$1.createVertexBuffer({context:o,typedArray:m.buffer,usage:l});var f=m.offsetsInBytes,g=m.vertexSizeInBytes;for(t in p)p.hasOwnProperty(t)&&defined(p[t])&&(defined((i=p[t]).values)?h.push({index:c[t],vertexBuffer:r,componentDatatype:i.componentDatatype,componentsPerAttribute:i.componentsPerAttribute,normalize:i.normalize,offsetInBytes:f[t],strideInBytes:g}):h.push({index:c[t],value:i.value,componentDatatype:i.componentDatatype,normalize:i.normalize}))}}else for(t in p){p.hasOwnProperty(t)&&defined(p[t])&&((n=(i=p[t]).componentDatatype)===ComponentDatatype$1.DOUBLE&&(n=ComponentDatatype$1.FLOAT),r=void 0,defined(i.values)&&(r=Buffer$1.createVertexBuffer({context:o,typedArray:ComponentDatatype$1.createTypedArray(n,i.values),usage:l})),h.push({index:c[t],vertexBuffer:r,value:i.value,componentDatatype:n,componentsPerAttribute:i.componentsPerAttribute,normalize:i.normalize}))}var _=s.indices;return defined(_)&&(a=Geometry.computeNumberOfVertices(s)>=CesiumMath.SIXTY_FOUR_KILOBYTES&&o.elementIndexUint?Buffer$1.createIndexBuffer({context:o,typedArray:new Uint32Array(_),usage:l,indexDatatype:IndexDatatype$1.UNSIGNED_INT}):Buffer$1.createIndexBuffer({context:o,typedArray:new Uint16Array(_),usage:l,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT})),new VertexArray({context:o,attributes:h,indexBuffer:a})},Object.defineProperties(VertexArray.prototype,{numberOfAttributes:{get:function(){return this._attributes.length}},numberOfVertices:{get:function(){return this._numberOfVertices}},indexBuffer:{get:function(){return this._indexBuffer}}}),VertexArray.prototype.getAttribute=function(e){return this._attributes[e]},VertexArray.prototype._bind=function(){defined(this._vao)?(this._context.glBindVertexArray(this._vao),this._context.instancedArrays&&setVertexAttribDivisor(this),this._hasConstantAttributes&&setConstantAttributes(this,this._gl)):bind(this._gl,this._attributes,this._indexBuffer)},VertexArray.prototype._unBind=function(){if(defined(this._vao))this._context.glBindVertexArray(null);else{for(var e=this._attributes,t=this._gl,i=0;i<e.length;++i){var r=e[i];r.enabled&&r.disableVertexAttribArray(t)}this._indexBuffer&&t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null)}},VertexArray.prototype.isDestroyed=function(){return!1},VertexArray.prototype.destroy=function(){for(var e=this._attributes,t=0;t<e.length;++t){var i=e[t].vertexBuffer;defined(i)&&!i.isDestroyed()&&i.vertexArrayDestroyable&&i.destroy()}var r=this._indexBuffer;return defined(r)&&!r.isDestroyed()&&r.vertexArrayDestroyable&&r.destroy(),defined(this._vao)&&this._context.glDeleteVertexArray(this._vao),destroyObject(this)},Object.defineProperties(BatchTable.prototype,{attributes:{get:function(){return this._attributes}},numberOfInstances:{get:function(){return this._numberOfInstances}}});var scratchPackedFloatCartesian4=new Cartesian4;function getPackedFloat(e,t,i){var r=Cartesian4.unpack(e,t,scratchPackedFloatCartesian4),n=Cartesian4.unpackFloat(r),r=Cartesian4.unpack(e,t+4,scratchPackedFloatCartesian4),a=Cartesian4.unpackFloat(r);r=Cartesian4.unpack(e,t+8,scratchPackedFloatCartesian4);var o=Cartesian4.unpackFloat(r);r=Cartesian4.unpack(e,t+12,scratchPackedFloatCartesian4);var s=Cartesian4.unpackFloat(r);return Cartesian4.fromElements(n,a,o,s,i)}function setPackedAttribute(e,t,i){var r=Cartesian4.packFloat(e.x,scratchPackedFloatCartesian4);Cartesian4.pack(r,t,i),r=Cartesian4.packFloat(e.y,r),Cartesian4.pack(r,t,i+4),r=Cartesian4.packFloat(e.z,r),Cartesian4.pack(r,t,i+8),r=Cartesian4.packFloat(e.w,r),Cartesian4.pack(r,t,i+12)}var scratchGetAttributeCartesian4=new Cartesian4;BatchTable.prototype.getBatchedAttribute=function(e,t,i){var r=this._attributes,n=this._offsets[t],a=4*this._stride*e+4*n,o=this._packFloats&&r[t].componentDatatype!==PixelDatatype$1.UNSIGNED_BYTE?getPackedFloat(this._batchValues,a,scratchGetAttributeCartesian4):Cartesian4.unpack(this._batchValues,a,scratchGetAttributeCartesian4),s=getAttributeType(r,t);return defined(s.fromCartesian4)?s.fromCartesian4(o,i):defined(s.clone)?s.clone(o,i):o.x};var setAttributeScratchValues=[void 0,void 0,new Cartesian2,new Cartesian3,new Cartesian4],setAttributeScratchCartesian4=new Cartesian4;function createTexture(e,t){var i=e._textureDimensions;e._texture=new Texture({context:t,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:e._pixelDatatype,width:i.x,height:i.y,sampler:Sampler.NEAREST,flipY:!1})}function updateTexture(e){var t=e._textureDimensions;e._texture.copyFrom({width:t.x,height:t.y,arrayBufferView:e._batchValues})}function getGlslComputeSt(e){var t=e._stride;return 1===e._textureDimensions.y?"uniform vec4 batchTextureStep; \nvec2 computeSt(float batchId) \n{ \n float stepX = batchTextureStep.x; \n float centerX = batchTextureStep.y; \n float numberOfAttributes = float("+t+"); \n return vec2(centerX + (batchId * numberOfAttributes * stepX), 0.5); \n} \n":"uniform vec4 batchTextureStep; \nuniform vec2 batchTextureDimensions; \nvec2 computeSt(float batchId) \n{ \n float stepX = batchTextureStep.x; \n float centerX = batchTextureStep.y; \n float stepY = batchTextureStep.z; \n float centerY = batchTextureStep.w; \n float numberOfAttributes = float("+t+"); \n float xId = mod(batchId * numberOfAttributes, batchTextureDimensions.x); \n float yId = floor(batchId * numberOfAttributes / batchTextureDimensions.x); \n return vec2(centerX + (xId * stepX), centerY + (yId * stepY)); \n} \n"}function getComponentType(e){return 1===e?"float":"vec"+e}function getComponentSwizzle(e){return 1===e?".x":2===e?".xy":3===e?".xyz":""}function getGlslAttributeFunction(e,t){var i=e._attributes[t],r=i.componentsPerAttribute,n=i.functionName,a=getComponentType(r),o=getComponentSwizzle(r),s=a+" "+n+"(float batchId) \n{ \n vec2 st = computeSt(batchId); \n st.x += batchTextureStep.x * float("+e._offsets[t]+"); \n";return e._packFloats&&i.componentDatatype!==PixelDatatype$1.UNSIGNED_BYTE?s+="vec4 textureValue; \ntextureValue.x = czm_unpackFloat(texture2D(batchTexture, st)); \ntextureValue.y = czm_unpackFloat(texture2D(batchTexture, st + vec2(batchTextureStep.x, 0.0))); \ntextureValue.z = czm_unpackFloat(texture2D(batchTexture, st + vec2(batchTextureStep.x * 2.0, 0.0))); \ntextureValue.w = czm_unpackFloat(texture2D(batchTexture, st + vec2(batchTextureStep.x * 3.0, 0.0))); \n":s+=" vec4 textureValue = texture2D(batchTexture, st); \n",s+=" "+a+" value = textureValue"+o+"; \n",e._pixelDatatype!==PixelDatatype$1.UNSIGNED_BYTE||i.componentDatatype!==ComponentDatatype$1.UNSIGNED_BYTE||i.normalize?e._pixelDatatype===PixelDatatype$1.FLOAT&&i.componentDatatype===ComponentDatatype$1.UNSIGNED_BYTE&&i.normalize&&(s+="value /= 255.0; \n"):s+="value *= 255.0; \n",s+=" return value; \n} \n"}function transformToWorldCoordinates(e,t,i){var r=!i,n=e.length;if(!r&&1<n)for(var a=e[0].modelMatrix,o=1;o<n;++o)if(!Matrix4.equals(a,e[o].modelMatrix)){r=!0;break}if(r)for(o=0;o<n;++o)defined(e[o].geometry)&&GeometryPipeline.transformToWorldCoordinates(e[o]);else Matrix4.multiplyTransformation(t,e[0].modelMatrix,t)}function addGeometryBatchId(e,t){var i=e.attributes,r=i.position,n=r.values.length/r.componentsPerAttribute;i.batchId=new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:1,values:new Float32Array(n)});for(var a=i.batchId.values,o=0;o<n;++o)a[o]=t}function addBatchIds(e){for(var t=e.length,i=0;i<t;++i){var r=e[i];defined(r.geometry)?addGeometryBatchId(r.geometry,i):defined(r.westHemisphereGeometry)&&defined(r.eastHemisphereGeometry)&&(addGeometryBatchId(r.westHemisphereGeometry,i),addGeometryBatchId(r.eastHemisphereGeometry,i))}}function geometryPipeline(e){var t,i=e.instances,r=e.projection,n=e.elementIndexUintSupported,a=e.scene3DOnly,o=e.vertexCacheOptimize,s=e.compressVertices,l=e.modelMatrix,c=i.length;for(_=0;_<c;++_)if(defined(i[_].geometry)){i[_].geometry.primitiveType;break}if(transformToWorldCoordinates(i,l,a),!a)for(_=0;_<c;++_)defined(i[_].geometry)&&GeometryPipeline.splitLongitude(i[_]);if(addBatchIds(i),o)for(_=0;_<c;++_){var u=i[_];defined(u.geometry)?(GeometryPipeline.reorderForPostVertexCache(u.geometry),GeometryPipeline.reorderForPreVertexCache(u.geometry)):defined(u.westHemisphereGeometry)&&defined(u.eastHemisphereGeometry)&&(GeometryPipeline.reorderForPostVertexCache(u.westHemisphereGeometry),GeometryPipeline.reorderForPreVertexCache(u.westHemisphereGeometry),GeometryPipeline.reorderForPostVertexCache(u.eastHemisphereGeometry),GeometryPipeline.reorderForPreVertexCache(u.eastHemisphereGeometry))}var d=GeometryPipeline.combineInstances(i);for(c=d.length,_=0;_<c;++_){var h,p,m,f=(t=d[_]).attributes;if(a)for(h in f)f.hasOwnProperty(h)&&f[h].componentDatatype===ComponentDatatype$1.DOUBLE&&GeometryPipeline.encodeAttribute(t,h,h+"3DHigh",h+"3DLow");else for(h in f){f.hasOwnProperty(h)&&f[h].componentDatatype===ComponentDatatype$1.DOUBLE&&(p=h+"3D",m=h+"2D",GeometryPipeline.projectTo2D(t,h,p,m,r),defined(t.boundingSphere)&&"position"===h&&(t.boundingSphereCV=BoundingSphere.fromVertices(t.attributes.position2D.values)),GeometryPipeline.encodeAttribute(t,p,p+"High",p+"Low"),GeometryPipeline.encodeAttribute(t,m,m+"High",m+"Low"))}s&&GeometryPipeline.compressVertices(t)}if(!n){for(var g=[],c=d.length,_=0;_<c;++_)t=d[_],g=g.concat(GeometryPipeline.fitToUnsignedShortIndices(t));d=g}return d}function createPickOffsets(e,t,i,r){var n,a,o,s,l=r.length-1;s=0<=l?(a=(n=r[l]).offset+n.count,i[o=n.index].indices.length):i[o=a=0].indices.length;for(var c=e.length,u=0;u<c;++u){var d,h=e[u][t];defined(h)&&(s<a+(d=h.indices.length)&&(a=0,s=i[++o].indices.length),r.push({index:o,offset:a,count:d}),a+=d)}}function createInstancePickOffsets(e,t){var i=[];return createPickOffsets(e,"geometry",t,i),createPickOffsets(e,"westHemisphereGeometry",t,i),createPickOffsets(e,"eastHemisphereGeometry",t,i),i}BatchTable.prototype.setBatchedAttribute=function(e,t,i){var r,n,a,o=this._attributes,s=setAttributeScratchValues[o[t].componentsPerAttribute],l=this.getBatchedAttribute(e,t,s),c=getAttributeType(this._attributes,t);(defined(c.equals)?c.equals(l,i):l===i)||((r=setAttributeScratchCartesian4).x=defined(i.x)?i.x:i,r.y=defined(i.y)?i.y:0,r.z=defined(i.z)?i.z:0,r.w=defined(i.w)?i.w:0,n=this._offsets[t],a=4*this._stride*e+4*n,this._packFloats&&o[t].componentDatatype!==PixelDatatype$1.UNSIGNED_BYTE?setPackedAttribute(r,this._batchValues,a):Cartesian4.pack(r,this._batchValues,a),this._batchValuesDirty=!0)},BatchTable.prototype.update=function(e){defined(this._texture)&&!this._batchValuesDirty||0===this._attributes.length||(this._batchValuesDirty=!1,defined(this._texture)||createTexture(this,e.context),updateTexture(this))},BatchTable.prototype.getUniformMapCallback=function(){var t=this;return function(e){return 0===t._attributes.length?e:combine(e,{batchTexture:function(){return t._texture},batchTextureDimensions:function(){return t._textureDimensions},batchTextureStep:function(){return t._textureStep}})}},BatchTable.prototype.getVertexShaderCallback=function(){var e=this._attributes;if(0===e.length)return function(e){return e};var n="uniform highp sampler2D batchTexture; \n";n+=getGlslComputeSt(this)+"\n";for(var t=e.length,i=0;i<t;++i)n+=getGlslAttributeFunction(this,i);return function(e){var t=e.indexOf("void main"),i=e.substring(0,t),r=e.substring(t);return i+"\n"+n+"\n"+r}},BatchTable.prototype.isDestroyed=function(){return!1},BatchTable.prototype.destroy=function(){return this._texture=this._texture&&this._texture.destroy(),destroyObject(this)};var PrimitivePipeline={};function transferGeometry(e,t){var i,r=e.attributes;for(var n in r){!r.hasOwnProperty(n)||defined(i=r[n])&&defined(i.values)&&t.push(i.values.buffer)}defined(e.indices)&&t.push(e.indices.buffer)}function transferGeometries(e,t){for(var i=e.length,r=0;r<i;++r)transferGeometry(e[r],t)}function countCreateGeometryResults(e){for(var t=1,i=e.length,r=0;r<i;r++){var n=e[r];if(++t,defined(n)){var a=n.attributes;for(var o in t+=7+2*BoundingSphere.packedLength+(defined(n.indices)?n.indices.length:0),a){a.hasOwnProperty(o)&&defined(a[o])&&(t+=5+a[o].values.length)}}}return t}function packInstancesForCombine(e,t){var i=e.length,r=new Float64Array(1+19*i),n=0;r[n++]=i;for(var a=0;a<i;a++){var o,s=e[a];Matrix4.pack(s.modelMatrix,r,n),n+=Matrix4.packedLength,defined(s.attributes)&&defined(s.attributes.offset)&&(o=s.attributes.offset.value,r[n]=o[0],r[n+1]=o[1],r[n+2]=o[2]),n+=3}return t.push(r.buffer),r}function unpackInstancesForCombine(e){for(var t=e,i=new Array(t[0]),r=0,n=1;n<t.length;){var a,o=Matrix4.unpack(t,n);defined(t[n+=Matrix4.packedLength])&&(a={offset:new OffsetGeometryInstanceAttribute(t[n],t[n+1],t[n+2])}),n+=3,i[r++]={modelMatrix:o,attributes:a}}return i}function packBoundingSpheres(e){var t=e.length,i=1+(BoundingSphere.packedLength+1)*t,r=new Float32Array(i),n=0;r[n++]=t;for(var a=0;a<t;++a){defined(e[a])?(r[n++]=1,BoundingSphere.pack(e[a],r,n)):r[n++]=0,n+=BoundingSphere.packedLength}return r}function unpackBoundingSpheres(e){for(var t=new Array(e[0]),i=0,r=1;r<e.length;)1===e[r++]&&(t[i]=BoundingSphere.unpack(e,r)),++i,r+=BoundingSphere.packedLength;return t}PrimitivePipeline.combineGeometry=function(e){var t,i,r,n,a=e.instances,o=a.length,s=!1;0<o&&(0<(t=geometryPipeline(e)).length&&(i=GeometryPipeline.createAttributeLocations(t[0]),e.createPickOffsets&&(r=createInstancePickOffsets(a,t))),defined(a[0].attributes)&&defined(a[0].attributes.offset)&&(n=new Array(o),s=!0));for(var l=new Array(o),c=new Array(o),u=0;u<o;++u){var d=a[u],h=d.geometry;defined(h)&&(l[u]=h.boundingSphere,c[u]=h.boundingSphereCV,s&&(n[u]=d.geometry.offsetAttribute));var p=d.eastHemisphereGeometry,m=d.westHemisphereGeometry;defined(p)&&defined(m)&&(defined(p.boundingSphere)&&defined(m.boundingSphere)&&(l[u]=BoundingSphere.union(p.boundingSphere,m.boundingSphere)),defined(p.boundingSphereCV)&&defined(m.boundingSphereCV)&&(c[u]=BoundingSphere.union(p.boundingSphereCV,m.boundingSphereCV)))}return{geometries:t,modelMatrix:e.modelMatrix,attributeLocations:i,pickOffsets:r,offsetInstanceExtend:n,boundingSpheres:l,boundingSpheresCV:c}},PrimitivePipeline.packCreateGeometryResults=function(e,t){var i=new Float64Array(countCreateGeometryResults(e)),r=[],n={},a=e.length,o=0;i[o++]=a;for(var s=0;s<a;s++){var l=e[s],c=defined(l);if(i[o++]=c?1:0,c){i[o++]=l.primitiveType,i[o++]=l.geometryType,i[o++]=defaultValue(l.offsetAttribute,-1);var u=defined(l.boundingSphere)?1:0;(i[o++]=u)&&BoundingSphere.pack(l.boundingSphere,i,o),o+=BoundingSphere.packedLength;var d=defined(l.boundingSphereCV)?1:0;(i[o++]=d)&&BoundingSphere.pack(l.boundingSphereCV,i,o),o+=BoundingSphere.packedLength;var h=l.attributes,p=[];for(var m in h)h.hasOwnProperty(m)&&defined(h[m])&&(p.push(m),defined(n[m])||(n[m]=r.length,r.push(m)));i[o++]=p.length;for(var f=0;f<p.length;f++){var g=p[f],_=h[g];i[o++]=n[g],i[o++]=_.componentDatatype,i[o++]=_.componentsPerAttribute,i[o++]=_.normalize?1:0,i[o++]=_.values.length,i.set(_.values,o),o+=_.values.length}var y=defined(l.indices)?l.indices.length:0;0<(i[o++]=y)&&(i.set(l.indices,o),o+=y)}}return t.push(i.buffer),{stringTable:r,packedData:i}},PrimitivePipeline.unpackCreateGeometryResults=function(e){for(var t=e.stringTable,i=e.packedData,r=new Array(i[0]),n=0,a=1;a<i.length;){if(1===i[a++]){var o,s,l=i[a++],c=i[a++],u=i[a++];-1===u&&(u=void 0),1===i[a++]&&(o=BoundingSphere.unpack(i,a)),a+=BoundingSphere.packedLength,1===i[a++]&&(s=BoundingSphere.unpack(i,a)),a+=BoundingSphere.packedLength;var d=new GeometryAttributes,h=i[a++];for(T=0;T<h;T++){for(var p=t[i[a++]],m=i[a++],f=i[a++],g=0!==i[a++],_=i[a++],y=ComponentDatatype$1.createTypedArray(m,_),v=0;v<_;v++)y[v]=i[a++];d[p]=new GeometryAttribute({componentDatatype:m,componentsPerAttribute:f,normalize:g,values:y})}if(0<(_=i[a++]))for(var C=y.length/f,S=IndexDatatype$1.createTypedArray(C,_),T=0;T<_;T++)S[T]=i[a++];r[n++]=new Geometry({primitiveType:l,geometryType:c,boundingSphere:o,boundingSphereCV:s,indices:S,attributes:d,offsetAttribute:u})}else r[n++]=void 0}return r},PrimitivePipeline.packCombineGeometryParameters=function(e,t){for(var i=e.createGeometryResults,r=i.length,n=0;n<r;n++)t.push(i[n].packedData.buffer);return{createGeometryResults:e.createGeometryResults,packedInstances:packInstancesForCombine(e.instances,t),ellipsoid:e.ellipsoid,isGeographic:e.projection instanceof GeographicProjection,elementIndexUintSupported:e.elementIndexUintSupported,scene3DOnly:e.scene3DOnly,vertexCacheOptimize:e.vertexCacheOptimize,compressVertices:e.compressVertices,modelMatrix:e.modelMatrix,createPickOffsets:e.createPickOffsets}},PrimitivePipeline.unpackCombineGeometryParameters=function(e){for(var t=unpackInstancesForCombine(e.packedInstances),i=e.createGeometryResults,r=i.length,n=0,a=0;a<r;a++)for(var o=PrimitivePipeline.unpackCreateGeometryResults(i[a]),s=o.length,l=0;l<s;l++){var c=o[l];t[n].geometry=c,++n}var u=Ellipsoid.clone(e.ellipsoid);return{instances:t,ellipsoid:u,projection:new(e.isGeographic?GeographicProjection:WebMercatorProjection)(u),elementIndexUintSupported:e.elementIndexUintSupported,scene3DOnly:e.scene3DOnly,vertexCacheOptimize:e.vertexCacheOptimize,compressVertices:e.compressVertices,modelMatrix:Matrix4.clone(e.modelMatrix),createPickOffsets:e.createPickOffsets}},PrimitivePipeline.packCombineGeometryResults=function(e,t){defined(e.geometries)&&transferGeometries(e.geometries,t);var i=packBoundingSpheres(e.boundingSpheres),r=packBoundingSpheres(e.boundingSpheresCV);return t.push(i.buffer,r.buffer),{geometries:e.geometries,attributeLocations:e.attributeLocations,modelMatrix:e.modelMatrix,pickOffsets:e.pickOffsets,offsetInstanceExtend:e.offsetInstanceExtend,boundingSpheres:i,boundingSpheresCV:r}},PrimitivePipeline.unpackCombineGeometryResults=function(e){return{geometries:e.geometries,attributeLocations:e.attributeLocations,modelMatrix:e.modelMatrix,pickOffsets:e.pickOffsets,offsetInstanceExtend:e.offsetInstanceExtend,boundingSpheres:unpackBoundingSpheres(e.boundingSpheres),boundingSpheresCV:unpackBoundingSpheres(e.boundingSpheresCV)}};var PrimitiveState={READY:0,CREATING:1,CREATED:2,COMBINING:3,COMBINED:4,COMPLETE:5,FAILED:6},PrimitiveState$1=Object.freeze(PrimitiveState),SceneMode={MORPHING:0,COLUMBUS_VIEW:1,SCENE2D:2,SCENE3D:3,getMorphTime:function(e){return e===SceneMode.SCENE3D?1:e!==SceneMode.MORPHING?0:void 0}},SceneMode$1=Object.freeze(SceneMode),ShadowMode={DISABLED:0,ENABLED:1,CAST_ONLY:2,RECEIVE_ONLY:3,NUMBER_OF_SHADOW_MODES:4,castShadows:function(e){return e===ShadowMode.ENABLED||e===ShadowMode.CAST_ONLY},receiveShadows:function(e){return e===ShadowMode.ENABLED||e===ShadowMode.RECEIVE_ONLY},fromCastReceive:function(e,t){return e&&t?ShadowMode.ENABLED:e?ShadowMode.CAST_ONLY:t?ShadowMode.RECEIVE_ONLY:ShadowMode.DISABLED}},ShadowMode$1=Object.freeze(ShadowMode);function Primitive(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.geometryInstances=e.geometryInstances,this.appearance=e.appearance,this._appearance=void 0,this._material=void 0,this.depthFailAppearance=e.depthFailAppearance,this._depthFailAppearance=void 0,this._depthFailMaterial=void 0,this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=new Matrix4,this.show=defaultValue(e.show,!0),this._vertexCacheOptimize=defaultValue(e.vertexCacheOptimize,!1),this._interleave=defaultValue(e.interleave,!1),this._releaseGeometryInstances=defaultValue(e.releaseGeometryInstances,!0),this._allowPicking=defaultValue(e.allowPicking,!0),this._asynchronous=defaultValue(e.asynchronous,!0),this._compressVertices=defaultValue(e.compressVertices,!0),this.cull=defaultValue(e.cull,!0),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.rtcCenter=e.rtcCenter,this.shadows=defaultValue(e.shadows,ShadowMode$1.DISABLED),this._translucent=void 0,this._state=PrimitiveState$1.READY,this._geometries=[],this._error=void 0,this._numberOfInstances=0,this._boundingSpheres=[],this._boundingSphereWC=[],this._boundingSphereCV=[],this._boundingSphere2D=[],this._boundingSphereMorph=[],this._perInstanceAttributeCache=[],this._instanceIds=[],this._lastPerInstanceAttributeIndex=0,this._va=[],this._attributeLocations=void 0,this._primitiveType=void 0,this._frontFaceRS=void 0,this._backFaceRS=void 0,this._sp=void 0,this._depthFailAppearance=void 0,this._spDepthFail=void 0,this._frontFaceDepthFailRS=void 0,this._backFaceDepthFailRS=void 0,this._pickIds=[],this._colorCommands=[],this._pickCommands=[],this._createBoundingVolumeFunction=e._createBoundingVolumeFunction,this._createRenderStatesFunction=e._createRenderStatesFunction,this._createShaderProgramFunction=e._createShaderProgramFunction,this._createCommandsFunction=e._createCommandsFunction,this._updateAndQueueCommandsFunction=e._updateAndQueueCommandsFunction,this._createPickOffsets=e._createPickOffsets,this._pickOffsets=void 0,this._createGeometryResults=void 0,this._ready=!1,this._readyPromise=when.defer(),this._batchTable=void 0,this._batchTableAttributeIndices=void 0,this._offsetInstanceExtend=void 0,this._batchTableOffsetAttribute2DIndex=void 0,this._batchTableOffsetsUpdated=!1,this._instanceBoundingSpheres=void 0,this._instanceBoundingSpheresCV=void 0,this._tempBoundingSpheres=void 0,this._recomputeBoundingSpheres=!1,this._batchTableBoundingSpheresUpdated=!1,this._batchTableBoundingSphereAttributeIndices=void 0}function getCommonPerInstanceAttributeNames(e){var t,i=e.length,r=[],n=e[0].attributes;for(t in n)if(n.hasOwnProperty(t)&&defined(n[t])){for(var a=n[t],o=!0,s=1;s<i;++s){var l=e[s].attributes[t];if(!defined(l)||a.componentDatatype!==l.componentDatatype||a.componentsPerAttribute!==l.componentsPerAttribute||a.normalize!==l.normalize){o=!1;break}}o&&r.push(t)}return r}Object.defineProperties(Primitive.prototype,{vertexCacheOptimize:{get:function(){return this._vertexCacheOptimize}},interleave:{get:function(){return this._interleave}},releaseGeometryInstances:{get:function(){return this._releaseGeometryInstances}},allowPicking:{get:function(){return this._allowPicking}},asynchronous:{get:function(){return this._asynchronous}},compressVertices:{get:function(){return this._compressVertices}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}}});var scratchGetAttributeCartesian2=new Cartesian2,scratchGetAttributeCartesian3=new Cartesian3,scratchGetAttributeCartesian4$1=new Cartesian4;function getAttributeValue(e){var t=e.length;return 1===t?e[0]:2===t?Cartesian2.unpack(e,0,scratchGetAttributeCartesian2):3===t?Cartesian3.unpack(e,0,scratchGetAttributeCartesian3):4===t?Cartesian4.unpack(e,0,scratchGetAttributeCartesian4$1):void 0}function createBatchTable(e,t){var i=e.geometryInstances,r=Array.isArray(i)?i:[i],n=r.length;if(0!==n){for(var a,o,s,l=getCommonPerInstanceAttributeNames(r),c=l.length,u=[],d={},h={},p=r[0].attributes,m=0;m<c;++m)s=p[o=l[m]],d[o]=m,u.push({functionName:"czm_batchTable_"+o,componentDatatype:s.componentDatatype,componentsPerAttribute:s.componentsPerAttribute,normalize:s.normalize});-1!==l.indexOf("distanceDisplayCondition")&&(u.push({functionName:"czm_batchTable_boundingSphereCenter3DHigh",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{functionName:"czm_batchTable_boundingSphereCenter3DLow",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{functionName:"czm_batchTable_boundingSphereCenter2DHigh",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{functionName:"czm_batchTable_boundingSphereCenter2DLow",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{functionName:"czm_batchTable_boundingSphereRadius",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:1}),h.center3DHigh=u.length-5,h.center3DLow=u.length-4,h.center2DHigh=u.length-3,h.center2DLow=u.length-2,h.radius=u.length-1),-1!==l.indexOf("offset")&&(u.push({functionName:"czm_batchTable_offset2D",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3}),a=u.length-1),u.push({functionName:"czm_batchTable_pickColor",componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:4,normalize:!0});var f=u.length,g=new BatchTable(t,u,n);for(m=0;m<n;++m){for(var _=r[m],p=_.attributes,y=0;y<c;++y){var v=getAttributeValue((s=p[o=l[y]]).value),C=d[o];g.setBatchedAttribute(m,C,v)}var S={primitive:defaultValue(_.pickPrimitive,e)};defined(_.id)&&(S.id=_.id);var T=t.createPickId(S);e._pickIds.push(T);var x=T.color,b=scratchGetAttributeCartesian4$1;b.x=Color.floatToByte(x.red),b.y=Color.floatToByte(x.green),b.z=Color.floatToByte(x.blue),b.w=Color.floatToByte(x.alpha),g.setBatchedAttribute(m,f-1,b)}e._batchTable=g,e._batchTableAttributeIndices=d,e._batchTableBoundingSphereAttributeIndices=h,e._batchTableOffsetAttribute2DIndex=a}}function cloneAttribute(e){var t=Array.isArray(e.values)?e.values.slice(0):new e.values.constructor(e.values);return new GeometryAttribute({componentDatatype:e.componentDatatype,componentsPerAttribute:e.componentsPerAttribute,normalize:e.normalize,values:t})}function cloneGeometry(e){var t,i,r=e.attributes,n=new GeometryAttributes;for(var a in r)r.hasOwnProperty(a)&&defined(r[a])&&(n[a]=cloneAttribute(r[a]));return defined(e.indices)&&(t=e.indices,i=Array.isArray(t)?t.slice(0):new t.constructor(t)),new Geometry({attributes:n,indices:i,primitiveType:e.primitiveType,boundingSphere:BoundingSphere.clone(e.boundingSphere)})}function cloneInstance(e,t){return{geometry:t,attributes:e.attributes,modelMatrix:Matrix4.clone(e.modelMatrix),pickPrimitive:e.pickPrimitive,id:e.id}}var positionRegex=/attribute\s+vec(?:3|4)\s+(.*)3DHigh;/g;function appendPickToVertexShader(e){return ShaderSource.replaceMain(e,"czm_non_pick_main")+"\nvarying vec4 v_pickColor; \nvoid main() \n{ \n czm_non_pick_main(); \n v_pickColor = czm_batchTable_pickColor(batchId); \n}"}function appendPickToFragmentShader(e){return"varying vec4 v_pickColor;\n"+e}function modifyForEncodedNormals(e,t){if(!e.compressVertices)return t;var i=-1!==t.search(/attribute\s+vec3\s+normal;/g),r=-1!==t.search(/attribute\s+vec2\s+st;/g);if(!i&&!r)return t;var n=-1!==t.search(/attribute\s+vec3\s+tangent;/g),a=-1!==t.search(/attribute\s+vec3\s+bitangent;/g),o=r&&i?2:1,s="compressedAttributes",l="attribute "+(1<(o+=n||a?1:0)?"vec"+o:"float")+" "+s+";",c="",u="";r&&(c+="vec2 st;\n",u+=" st = czm_decompressTextureCoordinates("+(1<o?s+".x":s)+");\n"),i&&n&&a?(c+="vec3 normal;\nvec3 tangent;\nvec3 bitangent;\n",u+=" czm_octDecode("+s+"."+(r?"yz":"xy")+", normal, tangent, bitangent);\n"):(i&&(c+="vec3 normal;\n",u+=" normal = czm_octDecode("+s+(1<o?"."+(r?"y":"x"):"")+");\n"),n&&(c+="vec3 tangent;\n",u+=" tangent = czm_octDecode("+s+"."+(r&&i?"z":"y")+");\n"),a&&(c+="vec3 bitangent;\n",u+=" bitangent = czm_octDecode("+s+"."+(r&&i?"z":"y")+");\n"));var d=t;return d=(d=(d=(d=d.replace(/attribute\s+vec3\s+normal;/g,"")).replace(/attribute\s+vec2\s+st;/g,"")).replace(/attribute\s+vec3\s+tangent;/g,"")).replace(/attribute\s+vec3\s+bitangent;/g,""),[l,c,d=ShaderSource.replaceMain(d,"czm_non_compressed_main"),"void main() \n{ \n"+u+" czm_non_compressed_main(); \n}"].join("\n")}function depthClampVS(e){var t=ShaderSource.replaceMain(e,"czm_non_depth_clamp_main");return t+="void main() {\n czm_non_depth_clamp_main();\n gl_Position = czm_depthClamp(gl_Position);}\n"}function depthClampFS(e){var t=ShaderSource.replaceMain(e,"czm_non_depth_clamp_main");return"#ifdef GL_EXT_frag_depth\n#extension GL_EXT_frag_depth : enable\n#endif\n"+(t+="void main() {\n czm_non_depth_clamp_main();\n#if defined(GL_EXT_frag_depth)\n #if defined(LOG_DEPTH)\n czm_writeLogDepth();\n #else\n czm_writeDepthClamp();\n #endif\n#endif\n}\n")}function validateShaderMatching(e,t){e.vertexAttributes}function getUniformFunction(e,t){return function(){return e[t]}}Primitive._modifyShaderPosition=function(e,t,i){for(var r,n="",a="",o="";null!==(r=positionRegex.exec(t));){var s=r[1],l="vec4 czm_compute"+s[0].toUpperCase()+s.substr(1)+"()";"vec4 czm_computePosition()"!=l&&(n+=l+";\n"),defined(e.rtcCenter)?(n+="uniform mat4 u_modifiedModelView;\n",a+="attribute vec4 position;\n",o+=l+"\n{\n return u_modifiedModelView * position;\n}\n\n",t=(t=(t=(t=t.replace(/attribute\s+vec(?:3|4)\s+position3DHigh;/g,"")).replace(/attribute\s+vec(?:3|4)\s+position3DLow;/g,"")).replace(/czm_modelViewRelativeToEye\s+\*\s+/g,"")).replace(/czm_modelViewProjectionRelativeToEye/g,"czm_projection")):i?o+=l+"\n{\n return czm_translateRelativeToEye("+s+"3DHigh, "+s+"3DLow);\n}\n\n":(a+="attribute vec3 "+s+"2DHigh;\nattribute vec3 "+s+"2DLow;\n",o+=l+"\n{\n vec4 p;\n if (czm_morphTime == 1.0)\n {\n p = czm_translateRelativeToEye("+s+"3DHigh, "+s+"3DLow);\n }\n else if (czm_morphTime == 0.0)\n {\n p = czm_translateRelativeToEye("+s+"2DHigh.zxy, "+s+"2DLow.zxy);\n }\n else\n {\n p = czm_columbusViewMorph(\n czm_translateRelativeToEye("+s+"2DHigh.zxy, "+s+"2DLow.zxy),\n czm_translateRelativeToEye("+s+"3DHigh, "+s+"3DLow),\n czm_morphTime);\n }\n return p;\n}\n\n")}return[n,a,t,o].join("\n")},Primitive._appendShowToShader=function(e,t){if(!defined(e._batchTableAttributeIndices.show))return t;return ShaderSource.replaceMain(t,"czm_non_show_main")+"\nvoid main() \n{ \n czm_non_show_main(); \n gl_Position *= czm_batchTable_show(batchId); \n}"},Primitive._updateColorAttribute=function(e,t,i){if(!defined(e._batchTableAttributeIndices.color)&&!defined(e._batchTableAttributeIndices.depthFailColor))return t;if(-1===t.search(/attribute\s+vec4\s+color;/g))return t;var r=(r=t).replace(/attribute\s+vec4\s+color;/g,"");return r=i?r.replace(/(\b)color(\b)/g,"$1czm_batchTable_depthFailColor(batchId)$2"):r.replace(/(\b)color(\b)/g,"$1czm_batchTable_color(batchId)$2")},Primitive._updatePickColorAttribute=function(e){return e.replace(/attribute\s+vec4\s+pickColor;/g,"").replace(/(\b)pickColor(\b)/g,"$1czm_batchTable_pickColor(batchId)$2")},Primitive._appendOffsetToShader=function(e,t){if(!defined(e._batchTableAttributeIndices.offset))return t;var i=t.replace(/attribute\s+float\s+batchId;/g,"attribute float batchId;\nattribute float applyOffset;");return i=i.replace(/vec4\s+([A-Za-z0-9_]+)\s+=\s+czm_computePosition\(\);/g,"vec4 $1 = czm_computePosition();\n if (czm_sceneMode == czm_sceneMode3D)\n {\n $1 = $1 + vec4(czm_batchTable_offset(batchId) * applyOffset, 0.0); }\n else\n {\n $1 = $1 + vec4(czm_batchTable_offset2D(batchId) * applyOffset, 0.0); }\n")},Primitive._appendDistanceDisplayConditionToShader=function(e,t,i){if(!defined(e._batchTableAttributeIndices.distanceDisplayCondition))return t;var r="void main() \n{ \n czm_non_distanceDisplayCondition_main(); \n vec2 distanceDisplayCondition = czm_batchTable_distanceDisplayCondition(batchId);\n vec3 boundingSphereCenter3DHigh = czm_batchTable_boundingSphereCenter3DHigh(batchId);\n vec3 boundingSphereCenter3DLow = czm_batchTable_boundingSphereCenter3DLow(batchId);\n float boundingSphereRadius = czm_batchTable_boundingSphereRadius(batchId);\n";return r+=i?" vec4 centerRTE = czm_translateRelativeToEye(boundingSphereCenter3DHigh, boundingSphereCenter3DLow);\n":" vec3 boundingSphereCenter2DHigh = czm_batchTable_boundingSphereCenter2DHigh(batchId);\n vec3 boundingSphereCenter2DLow = czm_batchTable_boundingSphereCenter2DLow(batchId);\n vec4 centerRTE;\n if (czm_morphTime == 1.0)\n {\n centerRTE = czm_translateRelativeToEye(boundingSphereCenter3DHigh, boundingSphereCenter3DLow);\n }\n else if (czm_morphTime == 0.0)\n {\n centerRTE = czm_translateRelativeToEye(boundingSphereCenter2DHigh.zxy, boundingSphereCenter2DLow.zxy);\n }\n else\n {\n centerRTE = czm_columbusViewMorph(\n czm_translateRelativeToEye(boundingSphereCenter2DHigh.zxy, boundingSphereCenter2DLow.zxy),\n czm_translateRelativeToEye(boundingSphereCenter3DHigh, boundingSphereCenter3DLow),\n czm_morphTime);\n }\n",ShaderSource.replaceMain(t,"czm_non_distanceDisplayCondition_main")+"\n"+(r+=" float radiusSq = boundingSphereRadius * boundingSphereRadius; \n float distanceSq; \n if (czm_sceneMode == czm_sceneMode2D) \n { \n distanceSq = czm_eyeHeight2D.y - radiusSq; \n } \n else \n { \n distanceSq = dot(centerRTE.xyz, centerRTE.xyz) - radiusSq; \n } \n distanceSq = max(distanceSq, 0.0); \n float nearSq = distanceDisplayCondition.x * distanceDisplayCondition.x; \n float farSq = distanceDisplayCondition.y * distanceDisplayCondition.y; \n float show = (distanceSq >= nearSq && distanceSq <= farSq) ? 1.0 : 0.0; \n gl_Position *= show; \n}")};var numberOfCreationWorkers=Math.max(FeatureDetection.hardwareConcurrency-1,1),createGeometryTaskProcessors,combineGeometryTaskProcessor=new TaskProcessor("combineGeometry",Number.POSITIVE_INFINITY);function loadAsynchronous(i,r){var e,t,n,a,o,s,l=i._instanceIds;if(i._state===PrimitiveState$1.READY){n=Array.isArray(i.geometryInstances)?i.geometryInstances:[i.geometryInstances];for(var c,u=i._numberOfInstances=n.length,d=[],h=[],p=0;p<u;++p)e=n[p].geometry,l.push(n[p].id),h.push({moduleName:e._workerName,geometry:e});if(!defined(createGeometryTaskProcessors))for(createGeometryTaskProcessors=new Array(numberOfCreationWorkers),p=0;p<numberOfCreationWorkers;p++)createGeometryTaskProcessors[p]=new TaskProcessor("createGeometry",Number.POSITIVE_INFINITY);for(h=subdivideArray(h,numberOfCreationWorkers),p=0;p<h.length;p++){var m=0,f=h[p],g=f.length;for(v=0;v<g;++v)defined((e=(c=f[v]).geometry).constructor.pack)&&(c.offset=m,m+=defaultValue(e.constructor.packedLength,e.packedLength));if(0<m)for(var _=new Float64Array(m),y=[_.buffer],v=0;v<g;++v)defined((e=(c=f[v]).geometry).constructor.pack)&&(e.constructor.pack(e,_,c.offset),c.geometry=_);d.push(createGeometryTaskProcessors[p].scheduleTask({subTasks:h[p]},y))}i._state=PrimitiveState$1.CREATING,when.all(d,function(e){i._createGeometryResults=e,i._state=PrimitiveState$1.CREATED}).otherwise(function(e){setReady(i,r,PrimitiveState$1.FAILED,e)})}else{i._state===PrimitiveState$1.CREATED&&(t=[],n=Array.isArray(i.geometryInstances)?i.geometryInstances:[i.geometryInstances],a=r.scene3DOnly,o=r.mapProjection,s=combineGeometryTaskProcessor.scheduleTask(PrimitivePipeline.packCombineGeometryParameters({createGeometryResults:i._createGeometryResults,instances:n,ellipsoid:o.ellipsoid,projection:o,elementIndexUintSupported:r.context.elementIndexUint,scene3DOnly:a,vertexCacheOptimize:i.vertexCacheOptimize,compressVertices:i.compressVertices,modelMatrix:i.modelMatrix,createPickOffsets:i._createPickOffsets},t),t),i._createGeometryResults=void 0,i._state=PrimitiveState$1.COMBINING,when(s,function(e){var t=PrimitivePipeline.unpackCombineGeometryResults(e);i._geometries=t.geometries,i._attributeLocations=t.attributeLocations,i.modelMatrix=Matrix4.clone(t.modelMatrix,i.modelMatrix),i._pickOffsets=t.pickOffsets,i._offsetInstanceExtend=t.offsetInstanceExtend,i._instanceBoundingSpheres=t.boundingSpheres,i._instanceBoundingSpheresCV=t.boundingSpheresCV,defined(i._geometries)&&0<i._geometries.length?(i._recomputeBoundingSpheres=!0,i._state=PrimitiveState$1.COMBINED):setReady(i,r,PrimitiveState$1.FAILED,void 0)}).otherwise(function(e){setReady(i,r,PrimitiveState$1.FAILED,e)}))}}function loadSynchronous(e,t){for(var i,r=Array.isArray(e.geometryInstances)?e.geometryInstances:[e.geometryInstances],n=e._numberOfInstances=r.length,a=new Array(n),o=e._instanceIds,s=0,l=0;l<n;l++){var c=(i=r[l]).geometry,u=defined(c.attributes)&&defined(c.primitiveType)?cloneGeometry(c):c.constructor.createGeometry(c);a[s++]=cloneInstance(i,u),o.push(i.id)}a.length=s;var d=t.scene3DOnly,h=t.mapProjection,p=PrimitivePipeline.combineGeometry({instances:a,ellipsoid:h.ellipsoid,projection:h,elementIndexUintSupported:t.context.elementIndexUint,scene3DOnly:d,vertexCacheOptimize:e.vertexCacheOptimize,compressVertices:e.compressVertices,modelMatrix:e.modelMatrix,createPickOffsets:e._createPickOffsets});e._geometries=p.geometries,e._attributeLocations=p.attributeLocations,e.modelMatrix=Matrix4.clone(p.modelMatrix,e.modelMatrix),e._pickOffsets=p.pickOffsets,e._offsetInstanceExtend=p.offsetInstanceExtend,e._instanceBoundingSpheres=p.boundingSpheres,e._instanceBoundingSpheresCV=p.boundingSpheresCV,defined(e._geometries)&&0<e._geometries.length?(e._recomputeBoundingSpheres=!0,e._state=PrimitiveState$1.COMBINED):setReady(e,t,PrimitiveState$1.FAILED,void 0)}function recomputeBoundingSpheres(e,t){var i=e._batchTableAttributeIndices.offset;if(e._recomputeBoundingSpheres&&defined(i)){var r=e._offsetInstanceExtend,n=e._instanceBoundingSpheres,a=n.length,o=e._tempBoundingSpheres;if(!defined(o)){for(o=new Array(a),h=0;h<a;h++)o[h]=new BoundingSphere;e._tempBoundingSpheres=o}for(h=0;h<a;++h){var s=o[h],l=e._batchTable.getBatchedAttribute(h,i,new Cartesian3);transformBoundingSphere(s=n[h].clone(s),l,r[h])}for(var c=[],u=[],d=[],h=0;h<a;++h){var p=o[h];0<p.center.x-p.radius||BoundingSphere.intersectPlane(p,Plane.ORIGIN_ZX_PLANE)!==Intersect$1.INTERSECTING?c.push(p):(u.push(p),d.push(p))}var m=c[0],f=d[0],g=u[0];for(h=1;h<c.length;h++)m=BoundingSphere.union(m,c[h]);for(h=1;h<d.length;h++)f=BoundingSphere.union(f,d[h]);for(h=1;h<u.length;h++)g=BoundingSphere.union(g,u[h]);var _=[];for(defined(m)&&_.push(m),defined(f)&&_.push(f),defined(g)&&_.push(g),h=0;h<_.length;h++){var y=_[h].clone(e._boundingSpheres[h]);e._boundingSpheres[h]=y,e._boundingSphereCV[h]=BoundingSphere.projectTo2D(y,t.mapProjection,e._boundingSphereCV[h])}Primitive._updateBoundingVolumes(e,t,e.modelMatrix,!0),e._recomputeBoundingSpheres=!1}else e._recomputeBoundingSpheres=!1}var scratchBoundingSphereCenterEncoded=new EncodedCartesian3,scratchBoundingSphereCartographic=new Cartographic,scratchBoundingSphereCenter2D=new Cartesian3,scratchBoundingSphere$2=new BoundingSphere;function updateBatchTableBoundingSpheres(e,t){if(defined(e._batchTableAttributeIndices.distanceDisplayCondition)&&!e._batchTableBoundingSpheresUpdated){for(var i=e._batchTableBoundingSphereAttributeIndices,r=i.center3DHigh,n=i.center3DLow,a=i.center2DHigh,o=i.center2DLow,s=i.radius,l=t.mapProjection,c=l.ellipsoid,u=e._batchTable,d=e._instanceBoundingSpheres,h=d.length,p=0;p<h;++p){var m,f,g,_,y,v,C=d[p];defined(C)&&(defined(m=e.modelMatrix)&&(C=BoundingSphere.transform(C,m,scratchBoundingSphere$2)),f=C.center,g=C.radius,v=EncodedCartesian3.fromCartesian(f,scratchBoundingSphereCenterEncoded),u.setBatchedAttribute(p,r,v.high),u.setBatchedAttribute(p,n,v.low),t.scene3DOnly||(_=c.cartesianToCartographic(f,scratchBoundingSphereCartographic),y=l.project(_,scratchBoundingSphereCenter2D),v=EncodedCartesian3.fromCartesian(y,scratchBoundingSphereCenterEncoded),u.setBatchedAttribute(p,a,v.high),u.setBatchedAttribute(p,o,v.low)),u.setBatchedAttribute(p,s,g))}e._batchTableBoundingSpheresUpdated=!0}}var offsetScratchCartesian=new Cartesian3,offsetCenterScratch=new Cartesian3;function updateBatchTableOffsets(e,t){if(defined(e._batchTableAttributeIndices.offset)&&!e._batchTableOffsetsUpdated&&!t.scene3DOnly){for(var i=e._batchTableOffsetAttribute2DIndex,r=t.mapProjection,n=r.ellipsoid,a=e._batchTable,o=e._instanceBoundingSpheres,s=o.length,l=0;l<s;++l){var c,u,d,h,p,m,f,g,_,y=o[l];defined(y)&&(c=a.getBatchedAttribute(l,e._batchTableAttributeIndices.offset),Cartesian3.equals(c,Cartesian3.ZERO)?a.setBatchedAttribute(l,i,Cartesian3.ZERO):(defined(u=e.modelMatrix)&&(y=BoundingSphere.transform(y,u,scratchBoundingSphere$2)),d=y.center,d=n.scaleToGeodeticSurface(d,offsetCenterScratch),m=n.cartesianToCartographic(d,scratchBoundingSphereCartographic),h=r.project(m,scratchBoundingSphereCenter2D),p=Cartesian3.add(c,d,offsetScratchCartesian),m=n.cartesianToCartographic(p,m),f=r.project(m,offsetScratchCartesian),_=(g=Cartesian3.subtract(f,h,offsetScratchCartesian)).x,g.x=g.z,g.z=g.y,g.y=_,a.setBatchedAttribute(l,i,g)))}e._batchTableOffsetsUpdated=!0}}function createVertexArray(e,t){for(var i=e._attributeLocations,r=e._geometries,n=t.scene3DOnly,a=t.context,o=[],s=r.length,l=0;l<s;++l){var c,u,d,h,p=r[l];o.push(VertexArray.fromGeometry({context:a,geometry:p,attributeLocations:i,bufferUsage:BufferUsage$1.STATIC_DRAW,interleave:e._interleave})),defined(e._createBoundingVolumeFunction)?e._createBoundingVolumeFunction(t,p):(e._boundingSpheres.push(BoundingSphere.clone(p.boundingSphere)),e._boundingSphereWC.push(new BoundingSphere),n||(u=(c=p.boundingSphereCV.center).x,d=c.y,h=c.z,c.x=h,c.y=u,c.z=d,e._boundingSphereCV.push(BoundingSphere.clone(p.boundingSphereCV)),e._boundingSphere2D.push(new BoundingSphere),e._boundingSphereMorph.push(new BoundingSphere)))}e._va=o,e._primitiveType=r[0].primitiveType,e.releaseGeometryInstances&&(e.geometryInstances=void 0),e._geometries=void 0,setReady(e,t,PrimitiveState$1.COMPLETE,void 0)}function createRenderStates(e,t,i,r){var n,a=i.getRenderState();r?((n=clone(a,!1)).cull={enabled:!0,face:CullFace$1.BACK},e._frontFaceRS=RenderState.fromCache(n),n.cull.face=CullFace$1.FRONT,e._backFaceRS=RenderState.fromCache(n)):(e._frontFaceRS=RenderState.fromCache(a),e._backFaceRS=e._frontFaceRS),n=clone(a,!1),defined(e._depthFailAppearance)&&(n.depthTest.enabled=!1),defined(e._depthFailAppearance)&&((n=clone(a=e._depthFailAppearance.getRenderState(),!1)).depthTest.func=DepthFunction$1.GREATER,r?(n.cull={enabled:!0,face:CullFace$1.BACK},e._frontFaceDepthFailRS=RenderState.fromCache(n),n.cull.face=CullFace$1.FRONT,e._backFaceDepthFailRS=RenderState.fromCache(n)):(e._frontFaceDepthFailRS=RenderState.fromCache(n),e._backFaceDepthFailRS=e._frontFaceRS))}function createShaderProgram(e,t,i){var r=t.context,n=e._attributeLocations,a=e._batchTable.getVertexShaderCallback()(i.vertexShaderSource),a=Primitive._appendOffsetToShader(e,a);a=Primitive._appendShowToShader(e,a),a=appendPickToVertexShader(Primitive._appendDistanceDisplayConditionToShader(e,a,t.scene3DOnly)),a=modifyForEncodedNormals(e,Primitive._updateColorAttribute(e,a,!1)),a=Primitive._modifyShaderPosition(e,a,t.scene3DOnly);var o=appendPickToFragmentShader(o=i.getFragmentShaderSource());e._sp=ShaderProgram.replaceCache({context:r,shaderProgram:e._sp,vertexShaderSource:a,fragmentShaderSource:o,attributeLocations:n}),validateShaderMatching(e._sp),defined(e._depthFailAppearance)&&(a=e._batchTable.getVertexShaderCallback()(e._depthFailAppearance.vertexShaderSource),a=Primitive._appendShowToShader(e,a),a=appendPickToVertexShader(Primitive._appendDistanceDisplayConditionToShader(e,a,t.scene3DOnly)),a=modifyForEncodedNormals(e,Primitive._updateColorAttribute(e,a,!0)),a=depthClampVS(Primitive._modifyShaderPosition(e,a,t.scene3DOnly)),o=depthClampFS(o=appendPickToFragmentShader(o=e._depthFailAppearance.getFragmentShaderSource())),e._spDepthFail=ShaderProgram.replaceCache({context:r,shaderProgram:e._spDepthFail,vertexShaderSource:a,fragmentShaderSource:o,attributeLocations:n}),validateShaderMatching(e._spDepthFail))}var modifiedModelViewScratch=new Matrix4,rtcScratch=new Cartesian3;function getUniforms(t,e,i,r){var n=defined(i)?i._uniforms:void 0,a={},o=e.uniforms;if(defined(o))for(var s in o)o.hasOwnProperty(s)&&(a[s]=getUniformFunction(o,s));var l=combine(a,n),l=t._batchTable.getUniformMapCallback()(l);return defined(t.rtcCenter)&&(l.u_modifiedModelView=function(){var e=r.context.uniformState.view;return Matrix4.multiply(e,t._modelMatrix,modifiedModelViewScratch),Matrix4.multiplyByPoint(modifiedModelViewScratch,t.rtcCenter,rtcScratch),Matrix4.setTranslation(modifiedModelViewScratch,rtcScratch,modifiedModelViewScratch),modifiedModelViewScratch}),l}function createCommands(e,t,i,r,n,a,o,s){var l,c=getUniforms(e,t,i,s);defined(e._depthFailAppearance)&&(l=getUniforms(e,e._depthFailAppearance,e._depthFailAppearance.material,s));var u=r?Pass$1.TRANSLUCENT:Pass$1.OPAQUE,d=n?2:1;d*=defined(e._depthFailAppearance)?2:1,a.length=e._va.length*d;for(var h,p=a.length,m=0,f=0;f<p;++f){n&&(defined(h=a[f])||(h=a[f]=new DrawCommand({owner:e,primitiveType:e._primitiveType})),h.vertexArray=e._va[m],h.renderState=e._backFaceRS,h.shaderProgram=e._sp,h.uniformMap=c,h.pass=u,++f),defined(h=a[f])||(h=a[f]=new DrawCommand({owner:e,primitiveType:e._primitiveType})),h.vertexArray=e._va[m],h.renderState=e._frontFaceRS,h.shaderProgram=e._sp,h.uniformMap=c,h.pass=u,defined(e._depthFailAppearance)&&(n&&(defined(h=a[++f])||(h=a[f]=new DrawCommand({owner:e,primitiveType:e._primitiveType})),h.vertexArray=e._va[m],h.renderState=e._backFaceDepthFailRS,h.shaderProgram=e._spDepthFail,h.uniformMap=l,h.pass=u),defined(h=a[++f])||(h=a[f]=new DrawCommand({owner:e,primitiveType:e._primitiveType})),h.vertexArray=e._va[m],h.renderState=e._frontFaceDepthFailRS,h.shaderProgram=e._spDepthFail,h.uniformMap=l,h.pass=u),++m}}function updateAndQueueCommands(e,t,i,r,n,a,o,s){var l;Primitive._updateBoundingVolumes(e,t,n),t.mode===SceneMode$1.SCENE3D?l=e._boundingSphereWC:t.mode===SceneMode$1.COLUMBUS_VIEW?l=e._boundingSphereCV:t.mode===SceneMode$1.SCENE2D&&defined(e._boundingSphere2D)?l=e._boundingSphere2D:defined(e._boundingSphereMorph)&&(l=e._boundingSphereMorph);var c=t.commandList,u=t.passes;if(u.render||u.pick){var d=e.allowPicking,h=ShadowMode$1.castShadows(e.shadows),p=ShadowMode$1.receiveShadows(e.shadows),m=i.length,f=s?2:1;f*=defined(e._depthFailAppearance)?2:1;for(var g=0;g<m;++g){var _=Math.floor(g/f),y=i[g];y.modelMatrix=n,y.boundingVolume=l[_],y.cull=a,y.debugShowBoundingVolume=o,y.castShadows=h,y.receiveShadows=p,y.pickId=d?"v_pickColor":void 0,c.push(y)}}}Primitive._updateBoundingVolumes=function(e,t,i,r){var n,a,o;if(r||!Matrix4.equals(i,e._modelMatrix))for(Matrix4.clone(i,e._modelMatrix),a=e._boundingSpheres.length,n=0;n<a;++n)defined(o=e._boundingSpheres[n])&&(e._boundingSphereWC[n]=BoundingSphere.transform(o,i,e._boundingSphereWC[n]),t.scene3DOnly||(e._boundingSphere2D[n]=BoundingSphere.clone(e._boundingSphereCV[n],e._boundingSphere2D[n]),e._boundingSphere2D[n].center.x=0,e._boundingSphereMorph[n]=BoundingSphere.union(e._boundingSphereWC[n],e._boundingSphereCV[n])));var s=e.appearance.pixelSize;if(defined(s))for(a=e._boundingSpheres.length,n=0;n<a;++n){o=e._boundingSpheres[n];var l=e._boundingSphereWC[n],c=t.camera.getPixelSize(o,t.context.drawingBufferWidth,t.context.drawingBufferHeight)*s;l.radius=o.radius+c}},Primitive.prototype.update=function(e){if(!(!defined(this.geometryInstances)&&0===this._va.length||defined(this.geometryInstances)&&Array.isArray(this.geometryInstances)&&0===this.geometryInstances.length||!defined(this.appearance)||e.mode!==SceneMode$1.SCENE3D&&e.scene3DOnly||!e.passes.render&&!e.passes.pick)){if(defined(this._error))throw this._error;if(this._state!==PrimitiveState$1.FAILED){var t,i,r,n,a,o,s,l,c=e.context;if(defined(this._batchTable)||createBatchTable(this,c),0<this._batchTable.attributes.length){if(0===ContextLimits.maximumVertexTextureImageUnits)throw new RuntimeError("Vertex texture fetch support is required to render primitives with per-instance attributes. The maximum number of vertex texture image units must be greater than zero.");this._batchTable.update(e)}this._state!==PrimitiveState$1.COMPLETE&&this._state!==PrimitiveState$1.COMBINED&&(this.asynchronous?loadAsynchronous:loadSynchronous)(this,e),this._state===PrimitiveState$1.COMBINED&&(updateBatchTableBoundingSpheres(this,e),updateBatchTableOffsets(this,e),createVertexArray(this,e)),this.show&&this._state===PrimitiveState$1.COMPLETE&&(this._batchTableOffsetsUpdated||updateBatchTableOffsets(this,e),this._recomputeBoundingSpheres&&recomputeBoundingSpheres(this,e),i=(t=this.appearance).material,n=r=!1,this._appearance!==t?(this._appearance=t,this._material=i,n=r=!0):this._material!==i&&(this._material=i,n=!0),o=defined(a=this.depthFailAppearance)?a.material:void 0,this._depthFailAppearance!==a?(this._depthFailAppearance=a,this._depthFailMaterial=o,n=r=!0):this._depthFailMaterial!==o&&(this._depthFailMaterial=o,n=!0),s=this._appearance.isTranslucent(),this._translucent!==s&&(this._translucent=s,r=!0),defined(this._material)&&this._material.update(c),l=t.closed&&s,r&&defaultValue(this._createRenderStatesFunction,createRenderStates)(this,c,t,l),n&&defaultValue(this._createShaderProgramFunction,createShaderProgram)(this,e,t),(r||n)&&defaultValue(this._createCommandsFunction,createCommands)(this,t,i,s,l,this._colorCommands,this._pickCommands,e),defaultValue(this._updateAndQueueCommandsFunction,updateAndQueueCommands)(this,e,this._colorCommands,this._pickCommands,this.modelMatrix,this.cull,this.debugShowBoundingVolume,l))}}};var offsetBoundingSphereScratch1=new BoundingSphere,offsetBoundingSphereScratch2=new BoundingSphere;function transformBoundingSphere(e,t,i){var r,n;return i===GeometryOffsetAttribute$1.TOP?(r=BoundingSphere.clone(e,offsetBoundingSphereScratch1),(n=BoundingSphere.clone(e,offsetBoundingSphereScratch2)).center=Cartesian3.add(n.center,t,n.center),e=BoundingSphere.union(r,n,e)):i===GeometryOffsetAttribute$1.ALL&&(e.center=Cartesian3.add(e.center,t,e.center)),e}function createGetFunction(n,a,o){return function(){var e=n.getBatchedAttribute(a,o),t=n.attributes[o],i=t.componentsPerAttribute,r=ComponentDatatype$1.createTypedArray(t.componentDatatype,i);return defined(e.constructor.pack)?e.constructor.pack(e,r,0):r[0]=e,r}}function createSetFunction(i,r,n,a,o){return function(e){var t=getAttributeValue(e);i.setBatchedAttribute(r,n,t),"offset"===o&&(a._recomputeBoundingSpheres=!0,a._batchTableOffsetsUpdated=!1)}}var offsetScratch$2=new Cartesian3;function createBoundingSphereProperties(r,n,a){n.boundingSphere={get:function(){var e,t,i=r._instanceBoundingSpheres[a];return defined(i)&&(i=i.clone(),e=r.modelMatrix,defined(t=n.offset)&&transformBoundingSphere(i,Cartesian3.fromArray(t.get(),0,offsetScratch$2),r._offsetInstanceExtend[a]),defined(e)&&(i=BoundingSphere.transform(i,e))),i}},n.boundingSphereCV={get:function(){return r._instanceBoundingSpheresCV[a]}}}function createPickIdProperty(e,t,i){t.pickId={get:function(){return e._pickIds[i]}}}function setReady(e,t,i,r){e._error=r,e._state=i,t.afterRender.push(function(){e._ready=e._state===PrimitiveState$1.COMPLETE||e._state===PrimitiveState$1.FAILED,defined(r)?e._readyPromise.reject(r):e._readyPromise.resolve(e)})}Primitive.prototype.getGeometryInstanceAttributes=function(e){for(var t=-1,i=this._lastPerInstanceAttributeIndex,r=this._instanceIds,n=r.length,a=0;a<n;++a){var o=(i+a)%n;if(e===r[o]){t=o;break}}if(-1!==t){if(defined(u=this._perInstanceAttributeCache[t]))return u;var s,l=this._batchTable,c=this._batchTableAttributeIndices,u={},d={};for(var h in c){c.hasOwnProperty(h)&&(s=c[h],d[h]={get:createGetFunction(l,t,s),set:createSetFunction(l,t,s,this,h)})}return createBoundingSphereProperties(this,d,t),createPickIdProperty(this,d,t),Object.defineProperties(u,d),this._lastPerInstanceAttributeIndex=t,this._perInstanceAttributeCache[t]=u}},Primitive.prototype.isDestroyed=function(){return!1},Primitive.prototype.destroy=function(){this._sp=this._sp&&this._sp.destroy(),this._spDepthFail=this._spDepthFail&&this._spDepthFail.destroy();for(var e=this._va,t=e.length,i=0;i<t;++i)e[i].destroy();this._va=void 0;var r=this._pickIds;for(t=r.length,i=0;i<t;++i)r[i].destroy();return this._pickIds=void 0,this._batchTable=this._batchTable&&this._batchTable.destroy(),this._instanceIds=void 0,this._perInstanceAttributeCache=void 0,this._attributeLocations=void 0,destroyObject(this)};var ShadowVolumeAppearanceFS="#ifdef GL_EXT_frag_depth\n#extension GL_EXT_frag_depth : enable\n#endif\n#ifdef TEXTURE_COORDINATES\n#ifdef SPHERICAL\nvarying vec4 v_sphericalExtents;\n#else // SPHERICAL\nvarying vec2 v_inversePlaneExtents;\nvarying vec4 v_westPlane;\nvarying vec4 v_southPlane;\n#endif // SPHERICAL\nvarying vec3 v_uvMinAndSphericalLongitudeRotation;\nvarying vec3 v_uMaxAndInverseDistance;\nvarying vec3 v_vMaxAndInverseDistance;\n#endif // TEXTURE_COORDINATES\n#ifdef PER_INSTANCE_COLOR\nvarying vec4 v_color;\n#endif\n#ifdef NORMAL_EC\nvec3 getEyeCoordinate3FromWindowCoordinate(vec2 fragCoord, float logDepthOrDepth) {\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(fragCoord, logDepthOrDepth);\nreturn eyeCoordinate.xyz / eyeCoordinate.w;\n}\nvec3 vectorFromOffset(vec4 eyeCoordinate, vec2 positiveOffset) {\nvec2 glFragCoordXY = gl_FragCoord.xy;\nfloat upOrRightLogDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, (glFragCoordXY + positiveOffset) / czm_viewport.zw));\nfloat downOrLeftLogDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, (glFragCoordXY - positiveOffset) / czm_viewport.zw));\nbvec2 upOrRightInBounds = lessThan(glFragCoordXY + positiveOffset, czm_viewport.zw);\nfloat useUpOrRight = float(upOrRightLogDepth > 0.0 && upOrRightInBounds.x && upOrRightInBounds.y);\nfloat useDownOrLeft = float(useUpOrRight == 0.0);\nvec3 upOrRightEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY + positiveOffset, upOrRightLogDepth);\nvec3 downOrLeftEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY - positiveOffset, downOrLeftLogDepth);\nreturn (upOrRightEC - (eyeCoordinate.xyz / eyeCoordinate.w)) * useUpOrRight + ((eyeCoordinate.xyz / eyeCoordinate.w) - downOrLeftEC) * useDownOrLeft;\n}\n#endif // NORMAL_EC\nvoid main(void)\n{\n#ifdef REQUIRES_EC\nfloat logDepthOrDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw));\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth);\n#endif\n#ifdef REQUIRES_WC\nvec4 worldCoordinate4 = czm_inverseView * eyeCoordinate;\nvec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w;\n#endif\n#ifdef TEXTURE_COORDINATES\nvec2 uv;\n#ifdef SPHERICAL\nvec2 sphericalLatLong = czm_approximateSphericalCoordinates(worldCoordinate);\nsphericalLatLong.y += v_uvMinAndSphericalLongitudeRotation.z;\nsphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi);\nuv.x = (sphericalLatLong.y - v_sphericalExtents.y) * v_sphericalExtents.w;\nuv.y = (sphericalLatLong.x - v_sphericalExtents.x) * v_sphericalExtents.z;\n#else // SPHERICAL\nuv.x = czm_planeDistance(v_westPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.x;\nuv.y = czm_planeDistance(v_southPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.y;\n#endif // SPHERICAL\n#endif // TEXTURE_COORDINATES\n#ifdef PICK\n#ifdef CULL_FRAGMENTS\nif (0.0 <= uv.x && uv.x <= 1.0 && 0.0 <= uv.y && uv.y <= 1.0) {\ngl_FragColor.a = 1.0;\nczm_writeDepthClamp();\n}\n#else // CULL_FRAGMENTS\ngl_FragColor.a = 1.0;\n#endif // CULL_FRAGMENTS\n#else // PICK\n#ifdef CULL_FRAGMENTS\nif (uv.x <= 0.0 || 1.0 <= uv.x || uv.y <= 0.0 || 1.0 <= uv.y) {\ndiscard;\n}\n#endif\n#ifdef NORMAL_EC\nvec3 downUp = vectorFromOffset(eyeCoordinate, vec2(0.0, 1.0));\nvec3 leftRight = vectorFromOffset(eyeCoordinate, vec2(1.0, 0.0));\nvec3 normalEC = normalize(cross(leftRight, downUp));\n#endif\n#ifdef PER_INSTANCE_COLOR\nvec4 color = czm_gammaCorrect(v_color);\n#ifdef FLAT\ngl_FragColor = color;\n#else // FLAT\nczm_materialInput materialInput;\nmaterialInput.normalEC = normalEC;\nmaterialInput.positionToEyeEC = -eyeCoordinate.xyz;\nczm_material material = czm_getDefaultMaterial(materialInput);\nmaterial.diffuse = color.rgb;\nmaterial.alpha = color.a;\ngl_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC);\n#endif // FLAT\ngl_FragColor.rgb *= gl_FragColor.a;\n#else // PER_INSTANCE_COLOR\nczm_materialInput materialInput;\n#ifdef USES_NORMAL_EC\nmaterialInput.normalEC = normalEC;\n#endif\n#ifdef USES_POSITION_TO_EYE_EC\nmaterialInput.positionToEyeEC = -eyeCoordinate.xyz;\n#endif\n#ifdef USES_TANGENT_TO_EYE\nmaterialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(worldCoordinate, normalEC);\n#endif\n#ifdef USES_ST\nmaterialInput.st.x = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_uMaxAndInverseDistance.xy, uv) * v_uMaxAndInverseDistance.z;\nmaterialInput.st.y = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_vMaxAndInverseDistance.xy, uv) * v_vMaxAndInverseDistance.z;\n#endif\nczm_material material = czm_getMaterial(materialInput);\n#ifdef FLAT\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#else // FLAT\ngl_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC);\n#endif // FLAT\ngl_FragColor.rgb *= gl_FragColor.a;\n#endif // PER_INSTANCE_COLOR\nczm_writeDepthClamp();\n#endif // PICK\n}\n";function ShadowVolumeAppearance(e,t,i){this._projectionExtentDefines={eastMostYhighDefine:"",eastMostYlowDefine:"",westMostYhighDefine:"",westMostYlowDefine:""};var r=new ShaderDependencies;r.requiresTextureCoordinates=e,r.requiresEC=!i.flat;var n,a=new ShaderDependencies;a.requiresTextureCoordinates=e,i instanceof PerInstanceColorAppearance?r.requiresNormalEC=!i.flat:(n=i.material.shaderSource+"\n"+i.fragmentShaderSource,r.normalEC=-1!==n.indexOf("materialInput.normalEC")||-1!==n.indexOf("czm_getDefaultMaterial"),r.positionToEyeEC=-1!==n.indexOf("materialInput.positionToEyeEC"),r.tangentToEyeMatrix=-1!==n.indexOf("materialInput.tangentToEyeMatrix"),r.st=-1!==n.indexOf("materialInput.st")),this._colorShaderDependencies=r,this._pickShaderDependencies=a,this._appearance=i,this._extentsCulling=e,this._planarExtents=t}ShadowVolumeAppearance.prototype.createFragmentShader=function(e){var t=this._appearance,i=this._colorShaderDependencies,r=[];e||this._planarExtents||r.push("SPHERICAL"),i.requiresEC&&r.push("REQUIRES_EC"),i.requiresWC&&r.push("REQUIRES_WC"),i.requiresTextureCoordinates&&r.push("TEXTURE_COORDINATES"),this._extentsCulling&&r.push("CULL_FRAGMENTS"),i.requiresNormalEC&&r.push("NORMAL_EC"),t instanceof PerInstanceColorAppearance&&r.push("PER_INSTANCE_COLOR"),i.normalEC&&r.push("USES_NORMAL_EC"),i.positionToEyeEC&&r.push("USES_POSITION_TO_EYE_EC"),i.tangentToEyeMatrix&&r.push("USES_TANGENT_TO_EYE"),i.st&&r.push("USES_ST"),t.flat&&r.push("FLAT");var n="";return t instanceof PerInstanceColorAppearance||(n=t.material.shaderSource),new ShaderSource({defines:r,sources:[n,ShadowVolumeAppearanceFS]})},ShadowVolumeAppearance.prototype.createPickFragmentShader=function(e){var t=this._pickShaderDependencies,i=["PICK"];return e||this._planarExtents||i.push("SPHERICAL"),t.requiresEC&&i.push("REQUIRES_EC"),t.requiresWC&&i.push("REQUIRES_WC"),t.requiresTextureCoordinates&&i.push("TEXTURE_COORDINATES"),this._extentsCulling&&i.push("CULL_FRAGMENTS"),new ShaderSource({defines:i,sources:[ShadowVolumeAppearanceFS],pickColorQualifier:"varying"})},ShadowVolumeAppearance.prototype.createVertexShader=function(e,t,i,r){return createShadowVolumeAppearanceVS(this._colorShaderDependencies,this._planarExtents,i,e,t,this._appearance,r,this._projectionExtentDefines)},ShadowVolumeAppearance.prototype.createPickVertexShader=function(e,t,i,r){return createShadowVolumeAppearanceVS(this._pickShaderDependencies,this._planarExtents,i,e,t,void 0,r,this._projectionExtentDefines)};var longitudeExtentsCartesianScratch=new Cartesian3,longitudeExtentsCartographicScratch=new Cartographic,longitudeExtentsEncodeScratch={high:0,low:0};function createShadowVolumeAppearanceVS(e,t,i,r,n,a,o,s){var l,c,u,d,h,p=r.slice();return""===s.eastMostYhighDefine&&((l=longitudeExtentsCartographicScratch).longitude=CesiumMath.PI,l.latitude=0,l.height=0,c=o.project(l,longitudeExtentsCartesianScratch),h=EncodedCartesian3.encode(c.x,longitudeExtentsEncodeScratch),s.eastMostYhighDefine="EAST_MOST_X_HIGH "+h.high.toFixed((h.high+"").length+1),s.eastMostYlowDefine="EAST_MOST_X_LOW "+h.low.toFixed((h.low+"").length+1),(u=longitudeExtentsCartographicScratch).longitude=-CesiumMath.PI,u.latitude=0,u.height=0,d=o.project(u,longitudeExtentsCartesianScratch),h=EncodedCartesian3.encode(d.x,longitudeExtentsEncodeScratch),s.westMostYhighDefine="WEST_MOST_X_HIGH "+h.high.toFixed((h.high+"").length+1),s.westMostYlowDefine="WEST_MOST_X_LOW "+h.low.toFixed((h.low+"").length+1)),i&&(p.push(s.eastMostYhighDefine),p.push(s.eastMostYlowDefine),p.push(s.westMostYhighDefine),p.push(s.westMostYlowDefine)),defined(a)&&a instanceof PerInstanceColorAppearance&&p.push("PER_INSTANCE_COLOR"),e.requiresTextureCoordinates&&(p.push("TEXTURE_COORDINATES"),t||i||p.push("SPHERICAL"),i&&p.push("COLUMBUS_VIEW_2D")),new ShaderSource({defines:p,sources:[n]})}function ShaderDependencies(){this._requiresEC=!1,this._requiresWC=!1,this._requiresNormalEC=!1,this._requiresTextureCoordinates=!1,this._usesNormalEC=!1,this._usesPositionToEyeEC=!1,this._usesTangentToEyeMat=!1,this._usesSt=!1}function pointLineDistance(e,t,i){return Math.abs((t.y-e.y)*i.x-(t.x-e.x)*i.y+t.x*e.y-t.y*e.x)/Cartesian2.distance(t,e)}Object.defineProperties(ShaderDependencies.prototype,{requiresEC:{get:function(){return this._requiresEC},set:function(e){this._requiresEC=e||this._requiresEC}},requiresWC:{get:function(){return this._requiresWC},set:function(e){this._requiresWC=e||this._requiresWC,this.requiresEC=this._requiresWC}},requiresNormalEC:{get:function(){return this._requiresNormalEC},set:function(e){this._requiresNormalEC=e||this._requiresNormalEC,this.requiresEC=this._requiresNormalEC}},requiresTextureCoordinates:{get:function(){return this._requiresTextureCoordinates},set:function(e){this._requiresTextureCoordinates=e||this._requiresTextureCoordinates,this.requiresWC=this._requiresTextureCoordinates}},normalEC:{set:function(e){this.requiresNormalEC=e,this._usesNormalEC=e},get:function(){return this._usesNormalEC}},tangentToEyeMatrix:{set:function(e){this.requiresWC=e,this.requiresNormalEC=e,this._usesTangentToEyeMat=e},get:function(){return this._usesTangentToEyeMat}},positionToEyeEC:{set:function(e){this.requiresEC=e,this._usesPositionToEyeEC=e},get:function(){return this._usesPositionToEyeEC}},st:{set:function(e){this.requiresTextureCoordinates=e,this._usesSt=e},get:function(){return this._usesSt}}});var points2DScratch$2=[new Cartesian2,new Cartesian2,new Cartesian2,new Cartesian2];function addTextureCoordinateRotationAttributes(e,t){var i=points2DScratch$2,r=Cartesian2.unpack(t,0,i[0]),n=Cartesian2.unpack(t,2,i[1]),a=Cartesian2.unpack(t,4,i[2]);e.uMaxVmax=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4,normalize:!1,value:[n.x,n.y,a.x,a.y]});var o=1/pointLineDistance(r,n,a),s=1/pointLineDistance(r,a,n);e.uvMinAndExtents=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4,normalize:!1,value:[r.x,r.y,o,s]})}var cartographicScratch$1=new Cartographic,cornerScratch=new Cartesian3,northWestScratch=new Cartesian3,southEastScratch=new Cartesian3,highLowScratch={high:0,low:0};function add2DTextureCoordinateAttributes(e,t,i){var r=cartographicScratch$1;r.height=0,r.longitude=e.west,r.latitude=e.south;var n=t.project(r,cornerScratch);r.latitude=e.north;var a=t.project(r,northWestScratch);r.longitude=e.east,r.latitude=e.south;var o=t.project(r,southEastScratch),s=[0,0,0,0],l=[0,0,0,0],c=EncodedCartesian3.encode(n.x,highLowScratch);s[0]=c.high,l[0]=c.low,c=EncodedCartesian3.encode(n.y,highLowScratch),s[1]=c.high,l[1]=c.low,c=EncodedCartesian3.encode(a.y,highLowScratch),s[2]=c.high,l[2]=c.low,c=EncodedCartesian3.encode(o.x,highLowScratch),s[3]=c.high,l[3]=c.low,i.planes2D_HIGH=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4,normalize:!1,value:s}),i.planes2D_LOW=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4,normalize:!1,value:l})}var enuMatrixScratch=new Matrix4,inverseEnuScratch=new Matrix4,rectanglePointCartesianScratch=new Cartesian3,rectangleCenterScratch$2=new Cartographic,pointsCartographicScratch=[new Cartographic,new Cartographic,new Cartographic,new Cartographic,new Cartographic,new Cartographic,new Cartographic,new Cartographic];function computeRectangleBounds(e,t,i,r,n,a){var o=Rectangle.center(e,rectangleCenterScratch$2);o.height=i;var s=Cartographic.toCartesian(o,t,rectanglePointCartesianScratch),l=Transforms.eastNorthUpToFixedFrame(s,t,enuMatrixScratch),c=Matrix4.inverse(l,inverseEnuScratch),u=e.west,d=e.east,h=e.north,p=e.south,m=pointsCartographicScratch;m[0].latitude=p,m[0].longitude=u,m[1].latitude=h,m[1].longitude=u,m[2].latitude=h,m[2].longitude=d,m[3].latitude=p;var f=.5*(u+(m[3].longitude=d)),g=.5*(h+p);m[4].latitude=p,m[4].longitude=f,m[5].latitude=h,m[5].longitude=f,m[6].latitude=g,m[6].longitude=u,m[7].latitude=g,m[7].longitude=d;for(var _=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,C=Number.NEGATIVE_INFINITY,S=0;S<8;S++){m[S].height=i;var T=Cartographic.toCartesian(m[S],t,rectanglePointCartesianScratch);Matrix4.multiplyByPoint(c,T,T),T.z=0,_=Math.min(_,T.x),y=Math.max(y,T.x),v=Math.min(v,T.y),C=Math.max(C,T.y)}var x=r;x.x=_,x.y=v,x.z=0,Matrix4.multiplyByPoint(l,x,x);var b=n;b.x=y,b.y=v,b.z=0,Matrix4.multiplyByPoint(l,b,b),Cartesian3.subtract(b,x,n);var E=a;E.x=_,E.y=C,E.z=0,Matrix4.multiplyByPoint(l,E,E),Cartesian3.subtract(E,x,a)}var eastwardScratch=new Cartesian3,northwardScratch=new Cartesian3,encodeScratch$1=new EncodedCartesian3;ShadowVolumeAppearance.getPlanarTextureCoordinateAttributes=function(e,t,i,r,n){var a=cornerScratch,o=eastwardScratch,s=northwardScratch;computeRectangleBounds(e,i,defaultValue(n,0),a,o,s);var l={};addTextureCoordinateRotationAttributes(l,t);var c=EncodedCartesian3.fromCartesian(a,encodeScratch$1);return l.southWest_HIGH=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,normalize:!1,value:Cartesian3.pack(c.high,[0,0,0])}),l.southWest_LOW=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,normalize:!1,value:Cartesian3.pack(c.low,[0,0,0])}),l.eastward=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,normalize:!1,value:Cartesian3.pack(o,[0,0,0])}),l.northward=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,normalize:!1,value:Cartesian3.pack(s,[0,0,0])}),add2DTextureCoordinateAttributes(e,r,l),l};var spherePointScratch=new Cartesian3;function latLongToSpherical(e,t,i,r){var n=cartographicScratch$1;n.latitude=e,n.longitude=t,n.height=0;var a=Cartographic.toCartesian(n,i,spherePointScratch),o=Math.sqrt(a.x*a.x+a.y*a.y),s=CesiumMath.fastApproximateAtan2(o,a.z),l=CesiumMath.fastApproximateAtan2(a.x,a.y);return r.x=s,r.y=l,r}var sphericalScratch=new Cartesian2;function shouldUseSpherical(e){return Math.max(e.width,e.height)>ShadowVolumeAppearance.MAX_WIDTH_FOR_PLANAR_EXTENTS}ShadowVolumeAppearance.getSphericalExtentGeometryInstanceAttributes=function(e,t,i,r){var n=latLongToSpherical(e.south,e.west,i,sphericalScratch),a=n.x,o=n.y,s=latLongToSpherical(e.north,e.east,i,sphericalScratch),l=s.x,c=s.y,u=0;c<o&&(u=CesiumMath.PI-o,o=-CesiumMath.PI,c+=u),a-=CesiumMath.EPSILON5,o-=CesiumMath.EPSILON5,l+=CesiumMath.EPSILON5;var d=1/((c+=CesiumMath.EPSILON5)-o),h=1/(l-a),p={sphericalExtents:new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4,normalize:!1,value:[a,o,h,d]}),longitudeRotation:new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:1,normalize:!1,value:[u]})};return addTextureCoordinateRotationAttributes(p,t),add2DTextureCoordinateAttributes(e,r,p),p},ShadowVolumeAppearance.hasAttributesForTextureCoordinatePlanes=function(e){return defined(e.southWest_HIGH)&&defined(e.southWest_LOW)&&defined(e.northward)&&defined(e.eastward)&&defined(e.planes2D_HIGH)&&defined(e.planes2D_LOW)&&defined(e.uMaxVmax)&&defined(e.uvMinAndExtents)},ShadowVolumeAppearance.hasAttributesForSphericalExtents=function(e){return defined(e.sphericalExtents)&&defined(e.longitudeRotation)&&defined(e.planes2D_HIGH)&&defined(e.planes2D_LOW)&&defined(e.uMaxVmax)&&defined(e.uvMinAndExtents)},ShadowVolumeAppearance.shouldUseSphericalCoordinates=function(e){return shouldUseSpherical(e)},ShadowVolumeAppearance.MAX_WIDTH_FOR_PLANAR_EXTENTS=CesiumMath.toRadians(1);var StencilFunction={NEVER:WebGLConstants$1.NEVER,LESS:WebGLConstants$1.LESS,EQUAL:WebGLConstants$1.EQUAL,LESS_OR_EQUAL:WebGLConstants$1.LEQUAL,GREATER:WebGLConstants$1.GREATER,NOT_EQUAL:WebGLConstants$1.NOTEQUAL,GREATER_OR_EQUAL:WebGLConstants$1.GEQUAL,ALWAYS:WebGLConstants$1.ALWAYS},StencilFunction$1=Object.freeze(StencilFunction),StencilOperation={ZERO:WebGLConstants$1.ZERO,KEEP:WebGLConstants$1.KEEP,REPLACE:WebGLConstants$1.REPLACE,INCREMENT:WebGLConstants$1.INCR,DECREMENT:WebGLConstants$1.DECR,INVERT:WebGLConstants$1.INVERT,INCREMENT_WRAP:WebGLConstants$1.INCR_WRAP,DECREMENT_WRAP:WebGLConstants$1.DECR_WRAP},StencilOperation$1=Object.freeze(StencilOperation),StencilConstants={CESIUM_3D_TILE_MASK:128,SKIP_LOD_MASK:112,SKIP_LOD_BIT_SHIFT:4,CLASSIFICATION_MASK:15,setCesium3DTileBit:function(){return{enabled:!0,frontFunction:StencilFunction$1.ALWAYS,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.REPLACE},backFunction:StencilFunction$1.ALWAYS,backOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.REPLACE},reference:StencilConstants.CESIUM_3D_TILE_MASK,mask:StencilConstants.CESIUM_3D_TILE_MASK}}},StencilConstants$1=Object.freeze(StencilConstants);function ClassificationPrimitive(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).geometryInstances;this.geometryInstances=t,this.show=defaultValue(e.show,!0),this.classificationType=defaultValue(e.classificationType,ClassificationType$1.BOTH),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.debugShowShadowVolume=defaultValue(e.debugShowShadowVolume,!1),this._debugShowShadowVolume=!1,this._extruded=defaultValue(e._extruded,!1),this._uniformMap=e._uniformMap,this._sp=void 0,this._spStencil=void 0,this._spPick=void 0,this._spColor=void 0,this._spPick2D=void 0,this._spColor2D=void 0,this._rsStencilDepthPass=void 0,this._rsStencilDepthPass3DTiles=void 0,this._rsColorPass=void 0,this._rsPickPass=void 0,this._commandsIgnoreShow=[],this._ready=!1,this._readyPromise=when.defer(),this._primitive=void 0,this._pickPrimitive=e._pickPrimitive,this._hasSphericalExtentsAttribute=!1,this._hasPlanarExtentsAttributes=!1,this._hasPerColorAttribute=!1,this.appearance=e.appearance,this._createBoundingVolumeFunction=e._createBoundingVolumeFunction,this._updateAndQueueCommandsFunction=e._updateAndQueueCommandsFunction,this._usePickOffsets=!1,this._primitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:defaultValue(e.vertexCacheOptimize,!1),interleave:defaultValue(e.interleave,!1),releaseGeometryInstances:defaultValue(e.releaseGeometryInstances,!0),allowPicking:defaultValue(e.allowPicking,!0),asynchronous:defaultValue(e.asynchronous,!0),compressVertices:defaultValue(e.compressVertices,!0),_createBoundingVolumeFunction:void 0,_createRenderStatesFunction:void 0,_createShaderProgramFunction:void 0,_createCommandsFunction:void 0,_updateAndQueueCommandsFunction:void 0,_createPickOffsets:!0}}function getStencilDepthRenderState(e,t){var i=t?StencilFunction$1.EQUAL:StencilFunction$1.ALWAYS;return{colorMask:{red:!1,green:!1,blue:!1,alpha:!1},stencilTest:{enabled:e,frontFunction:i,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.DECREMENT_WRAP,zPass:StencilOperation$1.KEEP},backFunction:i,backOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.INCREMENT_WRAP,zPass:StencilOperation$1.KEEP},reference:StencilConstants$1.CESIUM_3D_TILE_MASK,mask:StencilConstants$1.CESIUM_3D_TILE_MASK},stencilMask:StencilConstants$1.CLASSIFICATION_MASK,depthTest:{enabled:!0,func:DepthFunction$1.LESS_OR_EQUAL},depthMask:!1}}function getColorRenderState(e){return{stencilTest:{enabled:e,frontFunction:StencilFunction$1.NOT_EQUAL,frontOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},backFunction:StencilFunction$1.NOT_EQUAL,backOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},reference:0,mask:StencilConstants$1.CLASSIFICATION_MASK},stencilMask:StencilConstants$1.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1,blending:BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND}}Object.defineProperties(ClassificationPrimitive.prototype,{vertexCacheOptimize:{get:function(){return this._primitiveOptions.vertexCacheOptimize}},interleave:{get:function(){return this._primitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._primitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._primitiveOptions.allowPicking}},asynchronous:{get:function(){return this._primitiveOptions.asynchronous}},compressVertices:{get:function(){return this._primitiveOptions.compressVertices}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},_needs2DShader:{get:function(){return this._hasPlanarExtentsAttributes||this._hasSphericalExtentsAttribute}}}),ClassificationPrimitive.isSupported=function(e){return e.context.stencilBuffer};var pickRenderState={stencilTest:{enabled:!0,frontFunction:StencilFunction$1.NOT_EQUAL,frontOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},backFunction:StencilFunction$1.NOT_EQUAL,backOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},reference:0,mask:StencilConstants$1.CLASSIFICATION_MASK},stencilMask:StencilConstants$1.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1};function createRenderStates$1(e,t,i,r){var n;defined(e._rsStencilDepthPass)||(n=!e.debugShowShadowVolume,e._rsStencilDepthPass=RenderState.fromCache(getStencilDepthRenderState(n,!1)),e._rsStencilDepthPass3DTiles=RenderState.fromCache(getStencilDepthRenderState(n,!0)),e._rsColorPass=RenderState.fromCache(getColorRenderState(n)),e._rsPickPass=RenderState.fromCache(pickRenderState))}function modifyForEncodedNormals$1(e,t){if(!e.compressVertices)return t;if(-1!==t.search(/attribute\s+vec3\s+extrudeDirection;/g)){var i="compressedAttributes",r="attribute vec2 "+i+";",n=(n=t).replace(/attribute\s+vec3\s+extrudeDirection;/g,"");return[r,"vec3 extrudeDirection;\n",n=ShaderSource.replaceMain(n,"czm_non_compressed_main"),"void main() \n{ \n extrudeDirection = czm_octDecode(compressedAttributes, 65535.0);\n czm_non_compressed_main(); \n}"].join("\n")}}function createShaderProgram$1(e,t){var i=t.context,r=e._primitive,n=ShadowVolumeAppearanceVS,n=e._primitive._batchTable.getVertexShaderCallback()(n);n=Primitive._appendDistanceDisplayConditionToShader(r,n),n=Primitive._modifyShaderPosition(e,n,t.scene3DOnly),n=Primitive._updateColorAttribute(r,n);var a=e._hasPlanarExtentsAttributes,o=a||e._hasSphericalExtentsAttribute;e._extruded&&(n=modifyForEncodedNormals$1(r,n));var s,l,c,u,d,h,p=e._extruded?"EXTRUDED_GEOMETRY":"",m=new ShaderSource({defines:[p],sources:[n]}),f=new ShaderSource({sources:[ShadowVolumeFS]}),g=e._primitive._attributeLocations,_=new ShadowVolumeAppearance(o,a,e.appearance);e._spStencil=ShaderProgram.replaceCache({context:i,shaderProgram:e._spStencil,vertexShaderSource:m,fragmentShaderSource:f,attributeLocations:g}),e._primitive.allowPicking?(s=ShaderSource.createPickVertexShaderSource(n),s=Primitive._appendShowToShader(r,s),s=Primitive._updatePickColorAttribute(s),l=_.createPickFragmentShader(!1),c=_.createPickVertexShader([p],s,!1,t.mapProjection),e._spPick=ShaderProgram.replaceCache({context:i,shaderProgram:e._spPick,vertexShaderSource:c,fragmentShaderSource:l,attributeLocations:g}),o&&(defined(h=i.shaderCache.getDerivedShaderProgram(e._spPick,"2dPick"))||(u=_.createPickFragmentShader(!0),d=_.createPickVertexShader([p],s,!0,t.mapProjection),h=i.shaderCache.createDerivedShaderProgram(e._spPick,"2dPick",{vertexShaderSource:d,fragmentShaderSource:u,attributeLocations:g})),e._spPick2D=h)):e._spPick=ShaderProgram.fromCache({context:i,vertexShaderSource:m,fragmentShaderSource:f,attributeLocations:g}),m=new ShaderSource({defines:[p],sources:[n=Primitive._appendShowToShader(r,n)]}),e._sp=ShaderProgram.replaceCache({context:i,shaderProgram:e._sp,vertexShaderSource:m,fragmentShaderSource:f,attributeLocations:g});var y,v,C,S=_.createFragmentShader(!1),T=_.createVertexShader([p],n,!1,t.mapProjection);e._spColor=ShaderProgram.replaceCache({context:i,shaderProgram:e._spColor,vertexShaderSource:T,fragmentShaderSource:S,attributeLocations:g}),o&&(defined(C=i.shaderCache.getDerivedShaderProgram(e._spColor,"2dColor"))||(y=_.createFragmentShader(!0),v=_.createVertexShader([p],n,!0,t.mapProjection),C=i.shaderCache.createDerivedShaderProgram(e._spColor,"2dColor",{vertexShaderSource:v,fragmentShaderSource:y,attributeLocations:g})),e._spColor2D=C)}function createColorCommands(e,t){var i,r=e._primitive,n=2*r._va.length;t.length=n;for(var a=0,o=r._batchTable.getUniformMapCallback()(e._uniformMap),s=e._needs2DShader,l=0;l<n;l+=2){var c,u=r._va[a++];defined(c=t[l])||(c=t[l]=new DrawCommand({owner:e,primitiveType:r._primitiveType})),c.vertexArray=u,c.renderState=e._rsStencilDepthPass,c.shaderProgram=e._sp,c.uniformMap=o,c.pass=Pass$1.TERRAIN_CLASSIFICATION,(i=DrawCommand.shallowClone(c,c.derivedCommands.tileset)).renderState=e._rsStencilDepthPass3DTiles,i.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,c.derivedCommands.tileset=i,defined(c=t[l+1])||(c=t[l+1]=new DrawCommand({owner:e,primitiveType:r._primitiveType})),c.vertexArray=u,c.renderState=e._rsColorPass,c.shaderProgram=e._spColor,c.pass=Pass$1.TERRAIN_CLASSIFICATION;var d,h=e.appearance.material;defined(h)&&(o=combine(o,h._uniforms)),c.uniformMap=o,(i=DrawCommand.shallowClone(c,c.derivedCommands.tileset)).pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,c.derivedCommands.tileset=i,s&&((d=DrawCommand.shallowClone(c,c.derivedCommands.appearance2D)).shaderProgram=e._spColor2D,c.derivedCommands.appearance2D=d,(d=DrawCommand.shallowClone(i,i.derivedCommands.appearance2D)).shaderProgram=e._spColor2D,i.derivedCommands.appearance2D=d)}for(var p=e._commandsIgnoreShow,m=e._spStencil,f=0,n=p.length=n/2,g=0;g<n;++g){var _=p[g]=DrawCommand.shallowClone(t[f],p[g]);_.shaderProgram=m,_.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW,f+=2}}function createPickCommands(e,t){var i,r,n,a,o=e._usePickOffsets,s=e._primitive,l=2*s._va.length,c=0;o&&(l=2*(i=s._pickOffsets).length),t.length=l;for(var u=0,d=s._batchTable.getUniformMapCallback()(e._uniformMap),h=e._needs2DShader,p=0;p<l;p+=2){var m,f=s._va[u++];o&&(r=i[c++],f=s._va[r.index]),defined(n=t[p])||(n=t[p]=new DrawCommand({owner:e,primitiveType:s._primitiveType,pickOnly:!0})),n.vertexArray=f,n.renderState=e._rsStencilDepthPass,n.shaderProgram=e._sp,n.uniformMap=d,n.pass=Pass$1.TERRAIN_CLASSIFICATION,o&&(n.offset=r.offset,n.count=r.count),(a=DrawCommand.shallowClone(n,n.derivedCommands.tileset)).renderState=e._rsStencilDepthPass3DTiles,a.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,n.derivedCommands.tileset=a,defined(n=t[p+1])||(n=t[p+1]=new DrawCommand({owner:e,primitiveType:s._primitiveType,pickOnly:!0})),n.vertexArray=f,n.renderState=e._rsPickPass,n.shaderProgram=e._spPick,n.uniformMap=d,n.pass=Pass$1.TERRAIN_CLASSIFICATION,o&&(n.offset=r.offset,n.count=r.count),(a=DrawCommand.shallowClone(n,n.derivedCommands.tileset)).pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,n.derivedCommands.tileset=a,h&&((m=DrawCommand.shallowClone(n,n.derivedCommands.pick2D)).shaderProgram=e._spPick2D,n.derivedCommands.pick2D=m,(m=DrawCommand.shallowClone(a,a.derivedCommands.pick2D)).shaderProgram=e._spPick2D,a.derivedCommands.pick2D=m)}}function createCommands$1(e,t,i,r,n,a,o){createColorCommands(e,a),createPickCommands(e,o)}function boundingVolumeIndex(e,t){return Math.floor(e%t/2)}function updateAndQueueRenderCommand(e,t,i,r,n,a){e.modelMatrix=i,e.boundingVolume=n,e.cull=r,e.debugShowBoundingVolume=a,t.commandList.push(e)}function updateAndQueuePickCommand(e,t,i,r,n){e.modelMatrix=i,e.boundingVolume=n,e.cull=r,t.commandList.push(e)}function updateAndQueueCommands$1(e,t,i,r,n,a,o,s){var l,c=e._primitive;Primitive._updateBoundingVolumes(c,t,n),t.mode===SceneMode$1.SCENE3D?l=c._boundingSphereWC:t.mode===SceneMode$1.COLUMBUS_VIEW?l=c._boundingSphereCV:t.mode===SceneMode$1.SCENE2D&&defined(c._boundingSphere2D)?l=c._boundingSphere2D:defined(c._boundingSphereMorph)&&(l=c._boundingSphereMorph);var u=e.classificationType,d=u!==ClassificationType$1.CESIUM_3D_TILE,h=u!==ClassificationType$1.TERRAIN,p=t.passes;if(p.render){var m=i.length;for(_=0;_<m;++_)C=l[boundingVolumeIndex(_,m)],d&&updateAndQueueRenderCommand(i[_],t,n,a,C,o),h&&updateAndQueueRenderCommand(i[_].derivedCommands.tileset,t,n,a,C,o);if(t.invertClassification)for(var f=e._commandsIgnoreShow,g=f.length,_=0;_<g;++_)C=l[_],updateAndQueueRenderCommand(f[_],t,n,a,C,o)}if(p.pick){var y=r.length,v=c._pickOffsets;for(_=0;_<y;++_){var C=l[v[boundingVolumeIndex(_,y)].index];d&&updateAndQueuePickCommand(r[_],t,n,a,C),h&&updateAndQueuePickCommand(r[_].derivedCommands.tileset,t,n,a,C)}}}ClassificationPrimitive.prototype.update=function(e){if(defined(this._primitive)||defined(this.geometryInstances)){var t=this.appearance;defined(t)&&defined(t.material)&&t.material.update(e.context);var l=this,i=this._primitiveOptions;if(!defined(this._primitive)){var r,n,a,o=Array.isArray(this.geometryInstances)?this.geometryInstances:[this.geometryInstances],s=o.length,c=!1,u=!0,d=!1,h=!1;for(0<s&&(n=o[0].attributes,d=ShadowVolumeAppearance.hasAttributesForSphericalExtents(n),h=ShadowVolumeAppearance.hasAttributesForTextureCoordinatePlanes(n),a=n.color),f=0;f<s;f++){var p=(r=o[f]).attributes.color;defined(p)&&(c=!0),u=u&&defined(p)&&ColorGeometryInstanceAttribute.equals(a,p)}if(!u&&!d&&!h)throw new DeveloperError("All GeometryInstances must have the same color attribute except via GroundPrimitives");c&&!defined(t)&&(t=new PerInstanceColorAppearance({flat:!0}),this.appearance=t),this._usePickOffsets=!d&&!h,this._hasSphericalExtentsAttribute=d,this._hasPlanarExtentsAttributes=h,this._hasPerColorAttribute=c;for(var m=new Array(s),f=0;f<s;++f)r=o[f],m[f]=new GeometryInstance({geometry:r.geometry,attributes:r.attributes,modelMatrix:r.modelMatrix,id:r.id,pickPrimitive:defaultValue(this._pickPrimitive,l)});i.appearance=t,i.geometryInstances=m,defined(this._createBoundingVolumeFunction)&&(i._createBoundingVolumeFunction=function(e,t){l._createBoundingVolumeFunction(e,t)}),i._createRenderStatesFunction=function(e,t,i,r){createRenderStates$1(l)},i._createShaderProgramFunction=function(e,t,i){createShaderProgram$1(l,t)},i._createCommandsFunction=function(e,t,i,r,n,a,o){createCommands$1(l,void 0,void 0,!0,!1,a,o)},defined(this._updateAndQueueCommandsFunction)?i._updateAndQueueCommandsFunction=function(e,t,i,r,n,a,o,s){l._updateAndQueueCommandsFunction(e,t,i,r,n,a,o,s)}:i._updateAndQueueCommandsFunction=function(e,t,i,r,n,a,o,s){updateAndQueueCommands$1(l,t,i,r,n,a,o)},this._primitive=new Primitive(i),this._primitive.readyPromise.then(function(e){l._ready=!0,l.releaseGeometryInstances&&(l.geometryInstances=void 0);var t=e._error;defined(t)?l._readyPromise.reject(t):l._readyPromise.resolve(l)})}this.debugShowShadowVolume&&!this._debugShowShadowVolume&&this._ready?(this._debugShowShadowVolume=!0,this._rsStencilDepthPass=RenderState.fromCache(getStencilDepthRenderState(!1,!1)),this._rsStencilDepthPass3DTiles=RenderState.fromCache(getStencilDepthRenderState(!1,!0)),this._rsColorPass=RenderState.fromCache(getColorRenderState(!1))):!this.debugShowShadowVolume&&this._debugShowShadowVolume&&(this._debugShowShadowVolume=!1,this._rsStencilDepthPass=RenderState.fromCache(getStencilDepthRenderState(!0,!1)),this._rsStencilDepthPass3DTiles=RenderState.fromCache(getStencilDepthRenderState(!0,!0)),this._rsColorPass=RenderState.fromCache(getColorRenderState(!0))),this._primitive.appearance!==t&&(this._primitive.appearance=t),this._primitive.show=this.show,this._primitive.debugShowBoundingVolume=this.debugShowBoundingVolume,this._primitive.update(e)}},ClassificationPrimitive.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)},ClassificationPrimitive.prototype.isDestroyed=function(){return!1},ClassificationPrimitive.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),this._sp=this._sp&&this._sp.destroy(),this._spPick=this._spPick&&this._spPick.destroy(),this._spColor=this._spColor&&this._spColor.destroy(),this._spPick2D=void 0,this._spColor2D=void 0,destroyObject(this)};var GroundPrimitiveUniformMap={u_globeMinimumAltitude:function(){return 55e3}};function GroundPrimitive(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).appearance,i=e.geometryInstances;if(!defined(t)&&defined(i))for(var r=Array.isArray(i)?i:[i],n=r.length,a=0;a<n;a++){var o=r[a].attributes;if(defined(o)&&defined(o.color)){t=new PerInstanceColorAppearance({flat:!0});break}}this.appearance=t,this.geometryInstances=e.geometryInstances,this.show=defaultValue(e.show,!0),this.classificationType=defaultValue(e.classificationType,ClassificationType$1.BOTH),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.debugShowShadowVolume=defaultValue(e.debugShowShadowVolume,!1),this._boundingVolumes=[],this._boundingVolumes2D=[],this._ready=!1,this._readyPromise=when.defer(),this._primitive=void 0,this._maxHeight=void 0,this._minHeight=void 0,this._maxTerrainHeight=ApproximateTerrainHeights._defaultMaxTerrainHeight,this._minTerrainHeight=ApproximateTerrainHeights._defaultMinTerrainHeight,this._boundingSpheresKeys=[],this._boundingSpheres=[],this._useFragmentCulling=!1,this._zIndex=void 0;this._classificationPrimitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:defaultValue(e.vertexCacheOptimize,!1),interleave:defaultValue(e.interleave,!1),releaseGeometryInstances:defaultValue(e.releaseGeometryInstances,!0),allowPicking:defaultValue(e.allowPicking,!0),asynchronous:defaultValue(e.asynchronous,!0),compressVertices:defaultValue(e.compressVertices,!0),_createBoundingVolumeFunction:void 0,_updateAndQueueCommandsFunction:void 0,_pickPrimitive:this,_extruded:!0,_uniformMap:GroundPrimitiveUniformMap}}function getComputeMaximumHeightFunction(n){return function(e,t){var i=t.maximumRadius,r=i/Math.cos(.5*e)-i;return n._maxHeight+r}}function getComputeMinimumHeightFunction(i){return function(e,t){return i._minHeight}}Object.defineProperties(GroundPrimitive.prototype,{vertexCacheOptimize:{get:function(){return this._classificationPrimitiveOptions.vertexCacheOptimize}},interleave:{get:function(){return this._classificationPrimitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._classificationPrimitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._classificationPrimitiveOptions.allowPicking}},asynchronous:{get:function(){return this._classificationPrimitiveOptions.asynchronous}},compressVertices:{get:function(){return this._classificationPrimitiveOptions.compressVertices}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}}}),GroundPrimitive.isSupported=ClassificationPrimitive.isSupported;var scratchBVCartesianHigh=new Cartesian3,scratchBVCartesianLow=new Cartesian3,scratchBVCartesian=new Cartesian3,scratchBVCartographic=new Cartographic,scratchBVRectangle=new Rectangle;function getRectangle(e,t){var i=e.mapProjection.ellipsoid;if(!defined(t.attributes)||!defined(t.attributes.position3DHigh))return defined(t.rectangle)?t.rectangle:void 0;for(var r=t.attributes.position3DHigh.values,n=t.attributes.position3DLow.values,a=r.length,o=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=0;u<a;u+=3)var d=Cartesian3.unpack(r,u,scratchBVCartesianHigh),h=Cartesian3.unpack(n,u,scratchBVCartesianLow),p=Cartesian3.add(d,h,scratchBVCartesian),m=i.cartesianToCartographic(p,scratchBVCartographic),f=m.latitude,g=m.longitude,o=Math.min(o,f),s=Math.min(s,g),l=Math.max(l,f),c=Math.max(c,g);var _=scratchBVRectangle;return _.north=l,_.south=o,_.east=c,_.west=s,_}function setMinMaxTerrainHeights(e,t,i){var r=ApproximateTerrainHeights.getMinimumMaximumHeights(t,i);e._minTerrainHeight=r.minimumTerrainHeight,e._maxTerrainHeight=r.maximumTerrainHeight}function createBoundingVolume(e,t,i){var r,n,a=t.mapProjection.ellipsoid,o=getRectangle(t,i),s=OrientedBoundingBox.fromRectangle(o,e._minHeight,e._maxHeight,a);e._boundingVolumes.push(s),t.scene3DOnly||(r=t.mapProjection,n=BoundingSphere.fromRectangleWithHeights2D(o,r,e._maxHeight,e._minHeight),Cartesian3.fromElements(n.center.z,n.center.x,n.center.y,n.center),e._boundingVolumes2D.push(n))}function boundingVolumeIndex$1(e,t){return Math.floor(e%t/2)}function updateAndQueueRenderCommand$1(e,t,i,r,n,a,o){var s=e._primitive;i.mode!==SceneMode$1.SCENE3D&&t.shaderProgram===s._spColor&&s._needs2DShader&&(t=t.derivedCommands.appearance2D),t.owner=e,t.modelMatrix=r,t.boundingVolume=a,t.cull=n,t.debugShowBoundingVolume=o,i.commandList.push(t)}function updateAndQueuePickCommand$1(e,t,i,r,n,a){var o=e._primitive;i.mode!==SceneMode$1.SCENE3D&&t.shaderProgram===o._spPick&&o._needs2DShader&&(t=t.derivedCommands.pick2D),t.owner=e,t.modelMatrix=r,t.boundingVolume=a,t.cull=n,i.commandList.push(t)}function updateAndQueueCommands$2(e,t,i,r,n,a,o,s){var l=t.mode===SceneMode$1.SCENE3D?e._boundingVolumes:e._boundingVolumes2D,c=e.classificationType,u=c!==ClassificationType$1.CESIUM_3D_TILE,d=c!==ClassificationType$1.TERRAIN,h=t.passes,p=e._primitive;if(h.render){var m=i.length;for(_=0;_<m;++_)v=l[boundingVolumeIndex$1(_,m)],u&&updateAndQueueRenderCommand$1(e,i[_],t,n,a,v,o),d&&updateAndQueueRenderCommand$1(e,i[_].derivedCommands.tileset,t,n,a,v,o);if(t.invertClassification)for(var f=p._commandsIgnoreShow,g=f.length,_=0;_<g;++_)v=l[_],updateAndQueueRenderCommand$1(e,f[_],t,n,a,v,o)}if(h.pick){var y,v,C=r.length;for(e._useFragmentCulling||(y=p._primitive._pickOffsets),_=0;_<C;++_){v=l[boundingVolumeIndex$1(_,C)],e._useFragmentCulling||(v=l[y[boundingVolumeIndex$1(_,C)].index]),u&&updateAndQueuePickCommand$1(e,r[_],t,n,a,v),d&&updateAndQueuePickCommand$1(e,r[_].derivedCommands.tileset,t,n,a,v)}}}function MaterialProperty(){DeveloperError.throwInstantiationError()}function DynamicGeometryUpdater(e,t,i){this._primitives=t,this._orderedGroundPrimitives=i,this._primitive=void 0,this._outlinePrimitive=void 0,this._geometryUpdater=e,this._options=e._options,this._entity=e._entity,this._material=void 0}GroundPrimitive.initializeTerrainHeights=function(){return ApproximateTerrainHeights.initialize()},GroundPrimitive.prototype.update=function(e){if(defined(this._primitive)||defined(this.geometryInstances))if(ApproximateTerrainHeights.initialized){var l=this,t=this._classificationPrimitiveOptions;if(!defined(this._primitive)){var i,r,n,a,o=e.mapProjection.ellipsoid,s=Array.isArray(this.geometryInstances)?this.geometryInstances:[this.geometryInstances],c=s.length,u=new Array(c);for(_=0;_<c;++_){var d=getRectangle(e,r=(i=s[_]).geometry);defined(a)?defined(d)&&Rectangle.union(a,d,a):a=Rectangle.clone(d);var h,p=i.id;defined(p)&&defined(d)&&(h=ApproximateTerrainHeights.getBoundingSphere(d,o),this._boundingSpheresKeys.push(p),this._boundingSpheres.push(h)),defined(n=r.constructor)&&defined(n.createShadowVolume)}setMinMaxTerrainHeights(this,a,o);var m=e.terrainExaggeration;this._minHeight=this._minTerrainHeight*m,this._maxHeight=this._maxTerrainHeight*m;var f=GroundPrimitive._supportsMaterials(e.context);if(this._useFragmentCulling=f){for(var g=!0,_=0;_<c;++_)if(a=getRectangle(e,r=(i=s[_]).geometry),ShadowVolumeAppearance.shouldUseSphericalCoordinates(a)){g=!1;break}for(_=0;_<c;++_){n=(r=(i=s[_]).geometry).constructor;var y=getRectangle(e,r),v=r.textureCoordinateRotationPoints,C=g?ShadowVolumeAppearance.getPlanarTextureCoordinateAttributes(y,v,o,e.mapProjection,this._maxHeight):ShadowVolumeAppearance.getSphericalExtentGeometryInstanceAttributes(y,v,o,e.mapProjection),S=i.attributes;for(var T in S)S.hasOwnProperty(T)&&(C[T]=S[T]);u[_]=new GeometryInstance({geometry:n.createShadowVolume(r,getComputeMinimumHeightFunction(this),getComputeMaximumHeightFunction(this)),attributes:C,id:i.id})}}else for(_=0;_<c;++_)n=(r=(i=s[_]).geometry).constructor,u[_]=new GeometryInstance({geometry:n.createShadowVolume(r,getComputeMinimumHeightFunction(this),getComputeMaximumHeightFunction(this)),attributes:i.attributes,id:i.id});t.geometryInstances=u,t.appearance=this.appearance,t._createBoundingVolumeFunction=function(e,t){createBoundingVolume(l,e,t)},t._updateAndQueueCommandsFunction=function(e,t,i,r,n,a,o,s){updateAndQueueCommands$2(l,t,i,r,n,a,o)},this._primitive=new ClassificationPrimitive(t),this._primitive.readyPromise.then(function(e){l._ready=!0,l.releaseGeometryInstances&&(l.geometryInstances=void 0);var t=e._error;defined(t)?l._readyPromise.reject(t):l._readyPromise.resolve(l)})}this._primitive.appearance=this.appearance,this._primitive.show=this.show,this._primitive.debugShowShadowVolume=this.debugShowShadowVolume,this._primitive.debugShowBoundingVolume=this.debugShowBoundingVolume,this._primitive.update(e)}else GroundPrimitive.initializeTerrainHeights()},GroundPrimitive.prototype.getBoundingSphere=function(e){var t=this._boundingSpheresKeys.indexOf(e);if(-1!==t)return this._boundingSpheres[t]},GroundPrimitive.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)},GroundPrimitive.prototype.isDestroyed=function(){return!1},GroundPrimitive.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),destroyObject(this)},GroundPrimitive._supportsMaterials=function(e){return e.depthTexture},GroundPrimitive.supportsMaterials=function(e){return GroundPrimitive._supportsMaterials(e.frameState.context)},Object.defineProperties(MaterialProperty.prototype,{isConstant:{get:DeveloperError.throwInstantiationError},definitionChanged:{get:DeveloperError.throwInstantiationError}}),MaterialProperty.prototype.getType=DeveloperError.throwInstantiationError,MaterialProperty.prototype.getValue=DeveloperError.throwInstantiationError,MaterialProperty.prototype.equals=DeveloperError.throwInstantiationError,MaterialProperty.getValue=function(e,t,i){var r;return defined(t)&&defined(r=t.getType(e))?(defined(i)&&i.type===r||(i=Material.fromType(r)),t.getValue(e,i.uniforms)):(defined(i)&&i.type===Material.ColorType||(i=Material.fromType(Material.ColorType)),Color.clone(Color.WHITE,i.uniforms.color)),i},DynamicGeometryUpdater.prototype._isHidden=function(e,t,i){return!e.isShowing||!e.isAvailable(i)||!Property.getValueOrDefault(t.show,i,!0)},DynamicGeometryUpdater.prototype._setOptions=DeveloperError.throwInstantiationError,DynamicGeometryUpdater.prototype.update=function(e){var t=this._geometryUpdater,i=t._onTerrain,r=this._primitives,n=this._orderedGroundPrimitives;i?n.remove(this._primitive):(r.removeAndDestroy(this._primitive),r.removeAndDestroy(this._outlinePrimitive),this._outlinePrimitive=void 0),this._primitive=void 0;var a,o,s,l,c,u,d,h,p,m,f=this._entity,g=f[this._geometryUpdater._geometryPropertyName];this._setOptions(f,g,e),this._isHidden(f,g,e)||(a=this._geometryUpdater.shadowsProperty.getValue(e),o=this._options,defined(g.fill)&&!g.fill.getValue(e)||(l=(s=t.fillMaterialProperty)instanceof ColorMaterialProperty,c=t._getIsClosed(o),d=l?new PerInstanceColorAppearance({closed:c,flat:i&&!t._supportsMaterialsforEntitiesOnTerrain}):(u=MaterialProperty.getValue(e,s,this._material),new MaterialAppearance({material:this._material=u,translucent:u.isTranslucent(),closed:c})),i?(o.vertexFormat=PerInstanceColorAppearance.VERTEX_FORMAT,this._primitive=n.add(new GroundPrimitive({geometryInstances:this._geometryUpdater.createFillGeometryInstance(e),appearance:d,asynchronous:!1,shadows:a,classificationType:this._geometryUpdater.classificationTypeProperty.getValue(e)}),Property.getValueOrUndefined(this._geometryUpdater.zIndex,e))):(o.vertexFormat=d.vertexFormat,h=this._geometryUpdater.createFillGeometryInstance(e),l&&(d.translucent=255!==h.attributes.color.value[3]),this._primitive=r.add(new Primitive({geometryInstances:h,appearance:d,asynchronous:!1,shadows:a})))),!i&&defined(g.outline)&&g.outline.getValue(e)&&(p=this._geometryUpdater.createOutlineGeometryInstance(e),m=Property.getValueOrDefault(g.outlineWidth,e,1),this._outlinePrimitive=r.add(new Primitive({geometryInstances:p,appearance:new PerInstanceColorAppearance({flat:!0,translucent:255!==p.attributes.color.value[3],renderState:{lineWidth:t._scene.clampLineWidth(m)}}),asynchronous:!1,shadows:a}))))},DynamicGeometryUpdater.prototype.getBoundingSphere=function(e){var t,i=this._entity,r=this._primitive,n=this._outlinePrimitive;return defined(r)&&r.show&&r.ready&&defined(t=r.getGeometryInstanceAttributes(i))&&defined(t.boundingSphere)||defined(n)&&n.show&&n.ready&&defined(t=n.getGeometryInstanceAttributes(i))&&defined(t.boundingSphere)?(BoundingSphere.clone(t.boundingSphere,e),BoundingSphereState$1.DONE):defined(r)&&!r.ready||defined(n)&&!n.ready?BoundingSphereState$1.PENDING:BoundingSphereState$1.FAILED},DynamicGeometryUpdater.prototype.isDestroyed=function(){return!1},DynamicGeometryUpdater.prototype.destroy=function(){var e=this._primitives,t=this._orderedGroundPrimitives;this._geometryUpdater._onTerrain?t.remove(this._primitive):e.removeAndDestroy(this._primitive),e.removeAndDestroy(this._outlinePrimitive),destroyObject(this)};var PolylineShadowVolumeFS="#ifdef GL_EXT_frag_depth\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec4 v_startPlaneNormalEcAndHalfWidth;\nvarying vec4 v_endPlaneNormalEcAndBatchId;\nvarying vec4 v_rightPlaneEC;\nvarying vec4 v_endEcAndStartEcX;\nvarying vec4 v_texcoordNormalizationAndStartEcYZ;\n#ifdef PER_INSTANCE_COLOR\nvarying vec4 v_color;\n#endif\nvoid main(void)\n{\nfloat logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture2D(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw)));\nvec3 ecStart = vec3(v_endEcAndStartEcX.w, v_texcoordNormalizationAndStartEcYZ.zw);\nif (logDepthOrDepth == 0.0) {\n#ifdef DEBUG_SHOW_VOLUME\ngl_FragColor = vec4(1.0, 0.0, 0.0, 0.5);\nreturn;\n#else // DEBUG_SHOW_VOLUME\ndiscard;\n#endif // DEBUG_SHOW_VOLUME\n}\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth);\neyeCoordinate /= eyeCoordinate.w;\nfloat halfMaxWidth = v_startPlaneNormalEcAndHalfWidth.w * czm_metersPerPixel(eyeCoordinate);\nfloat widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz);\nfloat distanceFromStart = czm_planeDistance(v_startPlaneNormalEcAndHalfWidth.xyz, -dot(ecStart, v_startPlaneNormalEcAndHalfWidth.xyz), eyeCoordinate.xyz);\nfloat distanceFromEnd = czm_planeDistance(v_endPlaneNormalEcAndBatchId.xyz, -dot(v_endEcAndStartEcX.xyz, v_endPlaneNormalEcAndBatchId.xyz), eyeCoordinate.xyz);\nif (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) {\n#ifdef DEBUG_SHOW_VOLUME\ngl_FragColor = vec4(1.0, 0.0, 0.0, 0.5);\nreturn;\n#else // DEBUG_SHOW_VOLUME\ndiscard;\n#endif // DEBUG_SHOW_VOLUME\n}\nvec3 alignedPlaneNormal;\nalignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_startPlaneNormalEcAndHalfWidth.xyz);\nalignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz));\ndistanceFromStart = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, ecStart), eyeCoordinate.xyz);\nalignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_endPlaneNormalEcAndBatchId.xyz);\nalignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz));\ndistanceFromEnd = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, v_endEcAndStartEcX.xyz), eyeCoordinate.xyz);\n#ifdef PER_INSTANCE_COLOR\ngl_FragColor = czm_gammaCorrect(v_color);\n#else // PER_INSTANCE_COLOR\nfloat s = clamp(distanceFromStart / (distanceFromStart + distanceFromEnd), 0.0, 1.0);\ns = (s * v_texcoordNormalizationAndStartEcYZ.x) + v_texcoordNormalizationAndStartEcYZ.y;\nfloat t = (widthwiseDistance + halfMaxWidth) / (2.0 * halfMaxWidth);\nczm_materialInput materialInput;\nmaterialInput.s = s;\nmaterialInput.st = vec2(s, t);\nmaterialInput.str = vec3(s, t, 0.0);\nczm_material material = czm_getMaterial(materialInput);\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#endif // PER_INSTANCE_COLOR\ngl_FragColor.rgb *= gl_FragColor.a;\nczm_writeDepthClamp();\n}\n",PolylineShadowVolumeMorphFS="varying vec3 v_forwardDirectionEC;\nvarying vec3 v_texcoordNormalizationAndHalfWidth;\nvarying float v_batchId;\n#ifdef PER_INSTANCE_COLOR\nvarying vec4 v_color;\n#else\nvarying vec2 v_alignedPlaneDistances;\nvarying float v_texcoordT;\n#endif\nfloat rayPlaneDistanceUnsafe(vec3 origin, vec3 direction, vec3 planeNormal, float planeDistance) {\nreturn (-planeDistance - dot(planeNormal, origin)) / dot(planeNormal, direction);\n}\nvoid main(void)\n{\nvec4 eyeCoordinate = gl_FragCoord;\neyeCoordinate /= eyeCoordinate.w;\n#ifdef PER_INSTANCE_COLOR\ngl_FragColor = czm_gammaCorrect(v_color);\n#else // PER_INSTANCE_COLOR\nfloat distanceFromStart = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, -v_forwardDirectionEC, v_forwardDirectionEC.xyz, v_alignedPlaneDistances.x);\nfloat distanceFromEnd = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, v_forwardDirectionEC, -v_forwardDirectionEC.xyz, v_alignedPlaneDistances.y);\ndistanceFromStart = max(0.0, distanceFromStart);\ndistanceFromEnd = max(0.0, distanceFromEnd);\nfloat s = distanceFromStart / (distanceFromStart + distanceFromEnd);\ns = (s * v_texcoordNormalizationAndHalfWidth.x) + v_texcoordNormalizationAndHalfWidth.y;\nczm_materialInput materialInput;\nmaterialInput.s = s;\nmaterialInput.st = vec2(s, v_texcoordT);\nmaterialInput.str = vec3(s, v_texcoordT, 0.0);\nczm_material material = czm_getMaterial(materialInput);\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#endif // PER_INSTANCE_COLOR\n}\n",PolylineShadowVolumeMorphVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec4 startHiAndForwardOffsetX;\nattribute vec4 startLoAndForwardOffsetY;\nattribute vec4 startNormalAndForwardOffsetZ;\nattribute vec4 endNormalAndTextureCoordinateNormalizationX;\nattribute vec4 rightNormalAndTextureCoordinateNormalizationY;\nattribute vec4 startHiLo2D;\nattribute vec4 offsetAndRight2D;\nattribute vec4 startEndNormals2D;\nattribute vec2 texcoordNormalization2D;\nattribute float batchId;\nvarying vec3 v_forwardDirectionEC;\nvarying vec3 v_texcoordNormalizationAndHalfWidth;\nvarying float v_batchId;\n#ifdef WIDTH_VARYING\nvarying float v_width;\n#endif\n#ifdef ANGLE_VARYING\nvarying float v_polylineAngle;\n#endif\n#ifdef PER_INSTANCE_COLOR\nvarying vec4 v_color;\n#else\nvarying vec2 v_alignedPlaneDistances;\nvarying float v_texcoordT;\n#endif\nvoid main()\n{\nv_batchId = batchId;\nvec4 posRelativeToEye2D = czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw));\nvec4 posRelativeToEye3D = czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz);\nvec4 posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime);\nvec3 posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz;\nvec3 posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz;\nvec3 startEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz;\nvec4 startPlane2D;\nvec4 startPlane3D;\nstartPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy);\nstartPlane3D.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz;\nstartPlane2D.w = -dot(startPlane2D.xyz, posEc2D);\nstartPlane3D.w = -dot(startPlane3D.xyz, posEc3D);\nvec4 rightPlane2D;\nvec4 rightPlane3D;\nrightPlane2D.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw);\nrightPlane3D.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz;\nrightPlane2D.w = -dot(rightPlane2D.xyz, posEc2D);\nrightPlane3D.w = -dot(rightPlane3D.xyz, posEc3D);\nposRelativeToEye2D = posRelativeToEye2D + vec4(0.0, offsetAndRight2D.xy, 0.0);\nposRelativeToEye3D = posRelativeToEye3D + vec4(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w, 0.0);\nposRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime);\nposEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz;\nposEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz;\nvec3 endEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz;\nvec3 forwardEc3D = czm_normal * normalize(vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w));\nvec3 forwardEc2D = czm_normal * normalize(vec3(0.0, offsetAndRight2D.xy));\nvec4 endPlane2D;\nvec4 endPlane3D;\nendPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw);\nendPlane3D.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz;\nendPlane2D.w = -dot(endPlane2D.xyz, posEc2D);\nendPlane3D.w = -dot(endPlane3D.xyz, posEc3D);\nv_forwardDirectionEC = normalize(endEC - startEC);\nvec2 cleanTexcoordNormalization2D;\ncleanTexcoordNormalization2D.x = abs(texcoordNormalization2D.x);\ncleanTexcoordNormalization2D.y = czm_branchFreeTernary(texcoordNormalization2D.y > 1.0, 0.0, abs(texcoordNormalization2D.y));\nvec2 cleanTexcoordNormalization3D;\ncleanTexcoordNormalization3D.x = abs(endNormalAndTextureCoordinateNormalizationX.w);\ncleanTexcoordNormalization3D.y = rightNormalAndTextureCoordinateNormalizationY.w;\ncleanTexcoordNormalization3D.y = czm_branchFreeTernary(cleanTexcoordNormalization3D.y > 1.0, 0.0, abs(cleanTexcoordNormalization3D.y));\nv_texcoordNormalizationAndHalfWidth.xy = mix(cleanTexcoordNormalization2D, cleanTexcoordNormalization3D, czm_morphTime);\n#ifdef PER_INSTANCE_COLOR\nv_color = czm_batchTable_color(batchId);\n#else // PER_INSTANCE_COLOR\nv_alignedPlaneDistances.x = -dot(v_forwardDirectionEC, startEC);\nv_alignedPlaneDistances.y = -dot(-v_forwardDirectionEC, endEC);\n#endif // PER_INSTANCE_COLOR\n#ifdef WIDTH_VARYING\nfloat width = czm_batchTable_width(batchId);\nfloat halfWidth = width * 0.5;\nv_width = width;\nv_texcoordNormalizationAndHalfWidth.z = halfWidth;\n#else\nfloat halfWidth = 0.5 * czm_batchTable_width(batchId);\nv_texcoordNormalizationAndHalfWidth.z = halfWidth;\n#endif\nvec4 positionEc3D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position3DHigh, position3DLow);\nfloat absStartPlaneDistance = abs(czm_planeDistance(startPlane3D, positionEc3D.xyz));\nfloat absEndPlaneDistance = abs(czm_planeDistance(endPlane3D, positionEc3D.xyz));\nvec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane3D.xyz, endPlane3D.xyz);\nvec3 upOrDown = normalize(cross(rightPlane3D.xyz, planeDirection));\nvec3 normalEC = normalize(cross(planeDirection, upOrDown));\nvec3 geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc3D));\ngeodeticSurfaceNormal *= float(0.0 <= rightNormalAndTextureCoordinateNormalizationY.w && rightNormalAndTextureCoordinateNormalizationY.w <= 1.0);\ngeodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT;\npositionEc3D.xyz += geodeticSurfaceNormal;\nnormalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w);\npositionEc3D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc3D)) * normalEC;\nvec4 positionEc2D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy);\nabsStartPlaneDistance = abs(czm_planeDistance(startPlane2D, positionEc2D.xyz));\nabsEndPlaneDistance = abs(czm_planeDistance(endPlane2D, positionEc2D.xyz));\nplaneDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane2D.xyz, endPlane2D.xyz);\nupOrDown = normalize(cross(rightPlane2D.xyz, planeDirection));\nnormalEC = normalize(cross(planeDirection, upOrDown));\ngeodeticSurfaceNormal = normalize(cross(normalEC, forwardEc2D));\ngeodeticSurfaceNormal *= float(0.0 <= texcoordNormalization2D.y && texcoordNormalization2D.y <= 1.0);\ngeodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT;\npositionEc2D.xyz += geodeticSurfaceNormal;\nnormalEC *= sign(texcoordNormalization2D.x);\n#ifndef PER_INSTANCE_COLOR\nv_texcoordT = clamp(sign(texcoordNormalization2D.x), 0.0, 1.0);\n#endif\npositionEc2D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc2D)) * normalEC;\ngl_Position = czm_projection * mix(positionEc2D, positionEc3D, czm_morphTime);\n#ifdef ANGLE_VARYING\nvec2 approxLineDirection = normalize(vec2(v_forwardDirectionEC.x, -v_forwardDirectionEC.y));\napproxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y);\nv_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y);\n#endif\n}\n",PolylineShadowVolumeVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\n#ifndef COLUMBUS_VIEW_2D\nattribute vec4 startHiAndForwardOffsetX;\nattribute vec4 startLoAndForwardOffsetY;\nattribute vec4 startNormalAndForwardOffsetZ;\nattribute vec4 endNormalAndTextureCoordinateNormalizationX;\nattribute vec4 rightNormalAndTextureCoordinateNormalizationY;\n#else\nattribute vec4 startHiLo2D;\nattribute vec4 offsetAndRight2D;\nattribute vec4 startEndNormals2D;\nattribute vec2 texcoordNormalization2D;\n#endif\nattribute float batchId;\nvarying vec4 v_startPlaneNormalEcAndHalfWidth;\nvarying vec4 v_endPlaneNormalEcAndBatchId;\nvarying vec4 v_rightPlaneEC;\nvarying vec4 v_endEcAndStartEcX;\nvarying vec4 v_texcoordNormalizationAndStartEcYZ;\n#ifdef WIDTH_VARYING\nvarying float v_width;\n#endif\n#ifdef ANGLE_VARYING\nvarying float v_polylineAngle;\n#endif\n#ifdef PER_INSTANCE_COLOR\nvarying vec4 v_color;\n#endif\nvoid main()\n{\n#ifdef COLUMBUS_VIEW_2D\nvec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw))).xyz;\nvec3 forwardDirectionEC = czm_normal * vec3(0.0, offsetAndRight2D.xy);\nvec3 ecEnd = forwardDirectionEC + ecStart;\nforwardDirectionEC = normalize(forwardDirectionEC);\nv_rightPlaneEC.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw);\nv_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart);\nvec4 startPlaneEC;\nstartPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy);\nstartPlaneEC.w = -dot(startPlaneEC.xyz, ecStart);\nvec4 endPlaneEC;\nendPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw);\nendPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd);\nv_texcoordNormalizationAndStartEcYZ.x = abs(texcoordNormalization2D.x);\nv_texcoordNormalizationAndStartEcYZ.y = texcoordNormalization2D.y;\n#else // COLUMBUS_VIEW_2D\nvec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz)).xyz;\nvec3 offset = czm_normal * vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w);\nvec3 ecEnd = ecStart + offset;\nvec3 forwardDirectionEC = normalize(offset);\nvec4 startPlaneEC;\nstartPlaneEC.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz;\nstartPlaneEC.w = -dot(startPlaneEC.xyz, ecStart);\nvec4 endPlaneEC;\nendPlaneEC.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz;\nendPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd);\nv_rightPlaneEC.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz;\nv_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart);\nv_texcoordNormalizationAndStartEcYZ.x = abs(endNormalAndTextureCoordinateNormalizationX.w);\nv_texcoordNormalizationAndStartEcYZ.y = rightNormalAndTextureCoordinateNormalizationY.w;\n#endif // COLUMBUS_VIEW_2D\nv_endEcAndStartEcX.xyz = ecEnd;\nv_endEcAndStartEcX.w = ecStart.x;\nv_texcoordNormalizationAndStartEcYZ.zw = ecStart.yz;\n#ifdef PER_INSTANCE_COLOR\nv_color = czm_batchTable_color(batchId);\n#endif // PER_INSTANCE_COLOR\nvec4 positionRelativeToEye = czm_computePosition();\nvec4 positionEC = czm_modelViewRelativeToEye * positionRelativeToEye;\nfloat absStartPlaneDistance = abs(czm_planeDistance(startPlaneEC, positionEC.xyz));\nfloat absEndPlaneDistance = abs(czm_planeDistance(endPlaneEC, positionEC.xyz));\nvec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlaneEC.xyz, endPlaneEC.xyz);\nvec3 upOrDown = normalize(cross(v_rightPlaneEC.xyz, planeDirection));\nvec3 normalEC = normalize(cross(planeDirection, upOrDown));\nupOrDown = cross(forwardDirectionEC, normalEC);\nupOrDown = float(czm_sceneMode == czm_sceneMode3D) * upOrDown;\nupOrDown = float(v_texcoordNormalizationAndStartEcYZ.y > 1.0 || v_texcoordNormalizationAndStartEcYZ.y < 0.0) * upOrDown;\nupOrDown = min(GLOBE_MINIMUM_ALTITUDE, czm_geometricToleranceOverMeter * length(positionRelativeToEye.xyz)) * upOrDown;\npositionEC.xyz += upOrDown;\nv_texcoordNormalizationAndStartEcYZ.y = czm_branchFreeTernary(v_texcoordNormalizationAndStartEcYZ.y > 1.0, 0.0, abs(v_texcoordNormalizationAndStartEcYZ.y));\nfloat width = czm_batchTable_width(batchId);\n#ifdef WIDTH_VARYING\nv_width = width;\n#endif\nv_startPlaneNormalEcAndHalfWidth.xyz = startPlaneEC.xyz;\nv_startPlaneNormalEcAndHalfWidth.w = width * 0.5;\nv_endPlaneNormalEcAndBatchId.xyz = endPlaneEC.xyz;\nv_endPlaneNormalEcAndBatchId.w = batchId;\nwidth = width * max(0.0, czm_metersPerPixel(positionEC));\nwidth = width / dot(normalEC, v_rightPlaneEC.xyz);\n#ifdef COLUMBUS_VIEW_2D\nnormalEC *= sign(texcoordNormalization2D.x);\n#else\nnormalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w);\n#endif\npositionEC.xyz += width * normalEC;\ngl_Position = czm_depthClamp(czm_projection * positionEC);\n#ifdef ANGLE_VARYING\nvec2 approxLineDirection = normalize(vec2(forwardDirectionEC.x, -forwardDirectionEC.y));\napproxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y);\nv_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y);\n#endif\n}\n",PolylineColorAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 prevPosition3DHigh;\nattribute vec3 prevPosition3DLow;\nattribute vec3 nextPosition3DHigh;\nattribute vec3 nextPosition3DLow;\nattribute vec2 expandAndWidth;\nattribute vec4 color;\nattribute float batchId;\nvarying vec4 v_color;\nvoid main()\n{\nfloat expandDir = expandAndWidth.x;\nfloat width = abs(expandAndWidth.y) + 0.5;\nbool usePrev = expandAndWidth.y < 0.0;\nvec4 p = czm_computePosition();\nvec4 prev = czm_computePrevPosition();\nvec4 next = czm_computeNextPosition();\nfloat angle;\nvec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle);\ngl_Position = czm_viewportOrthographic * positionWC;\nv_color = color;\n}\n",PolylineCommon="void clipLineSegmentToNearPlane(\nvec3 p0,\nvec3 p1,\nout vec4 positionWC,\nout bool clipped,\nout bool culledByNearPlane,\nout vec4 clippedPositionEC)\n{\nculledByNearPlane = false;\nclipped = false;\nvec3 p0ToP1 = p1 - p0;\nfloat magnitude = length(p0ToP1);\nvec3 direction = normalize(p0ToP1);\nfloat endPoint0Distance = czm_currentFrustum.x + p0.z;\nfloat denominator = -direction.z;\nif (endPoint0Distance > 0.0 && abs(denominator) < czm_epsilon7)\n{\nculledByNearPlane = true;\n}\nelse if (endPoint0Distance > 0.0)\n{\nfloat t = endPoint0Distance / denominator;\nif (t < 0.0 || t > magnitude)\n{\nculledByNearPlane = true;\n}\nelse\n{\np0 = p0 + t * direction;\np0.z = min(p0.z, -czm_currentFrustum.x);\nclipped = true;\n}\n}\nclippedPositionEC = vec4(p0, 1.0);\npositionWC = czm_eyeToWindowCoordinates(clippedPositionEC);\n}\nvec4 getPolylineWindowCoordinatesEC(vec4 positionEC, vec4 prevEC, vec4 nextEC, float expandDirection, float width, bool usePrevious, out float angle)\n{\n#ifdef POLYLINE_DASH\nvec4 positionWindow = czm_eyeToWindowCoordinates(positionEC);\nvec4 previousWindow = czm_eyeToWindowCoordinates(prevEC);\nvec4 nextWindow = czm_eyeToWindowCoordinates(nextEC);\nvec2 lineDir;\nif (usePrevious) {\nlineDir = normalize(positionWindow.xy - previousWindow.xy);\n}\nelse {\nlineDir = normalize(nextWindow.xy - positionWindow.xy);\n}\nangle = atan(lineDir.x, lineDir.y) - 1.570796327;\nangle = floor(angle / czm_piOverFour + 0.5) * czm_piOverFour;\n#endif\nvec4 clippedPrevWC, clippedPrevEC;\nbool prevSegmentClipped, prevSegmentCulled;\nclipLineSegmentToNearPlane(prevEC.xyz, positionEC.xyz, clippedPrevWC, prevSegmentClipped, prevSegmentCulled, clippedPrevEC);\nvec4 clippedNextWC, clippedNextEC;\nbool nextSegmentClipped, nextSegmentCulled;\nclipLineSegmentToNearPlane(nextEC.xyz, positionEC.xyz, clippedNextWC, nextSegmentClipped, nextSegmentCulled, clippedNextEC);\nbool segmentClipped, segmentCulled;\nvec4 clippedPositionWC, clippedPositionEC;\nclipLineSegmentToNearPlane(positionEC.xyz, usePrevious ? prevEC.xyz : nextEC.xyz, clippedPositionWC, segmentClipped, segmentCulled, clippedPositionEC);\nif (segmentCulled)\n{\nreturn vec4(0.0, 0.0, 0.0, 1.0);\n}\nvec2 directionToPrevWC = normalize(clippedPrevWC.xy - clippedPositionWC.xy);\nvec2 directionToNextWC = normalize(clippedNextWC.xy - clippedPositionWC.xy);\nif (prevSegmentCulled)\n{\ndirectionToPrevWC = -directionToNextWC;\n}\nelse if (nextSegmentCulled)\n{\ndirectionToNextWC = -directionToPrevWC;\n}\nvec2 thisSegmentForwardWC, otherSegmentForwardWC;\nif (usePrevious)\n{\nthisSegmentForwardWC = -directionToPrevWC;\notherSegmentForwardWC = directionToNextWC;\n}\nelse\n{\nthisSegmentForwardWC = directionToNextWC;\notherSegmentForwardWC = -directionToPrevWC;\n}\nvec2 thisSegmentLeftWC = vec2(-thisSegmentForwardWC.y, thisSegmentForwardWC.x);\nvec2 leftWC = thisSegmentLeftWC;\nfloat expandWidth = width * 0.5;\nif (!czm_equalsEpsilon(prevEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1) && !czm_equalsEpsilon(nextEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1))\n{\nvec2 otherSegmentLeftWC = vec2(-otherSegmentForwardWC.y, otherSegmentForwardWC.x);\nvec2 leftSumWC = thisSegmentLeftWC + otherSegmentLeftWC;\nfloat leftSumLength = length(leftSumWC);\nleftWC = leftSumLength < czm_epsilon6 ? thisSegmentLeftWC : (leftSumWC / leftSumLength);\nvec2 u = -thisSegmentForwardWC;\nvec2 v = leftWC;\nfloat sinAngle = abs(u.x * v.y - u.y * v.x);\nexpandWidth = clamp(expandWidth / sinAngle, 0.0, width * 2.0);\n}\nvec2 offset = leftWC * expandDirection * expandWidth * czm_pixelRatio;\nreturn vec4(clippedPositionWC.xy + offset, -clippedPositionWC.z, 1.0) * (czm_projection * clippedPositionEC).w;\n}\nvec4 getPolylineWindowCoordinates(vec4 position, vec4 previous, vec4 next, float expandDirection, float width, bool usePrevious, out float angle)\n{\nvec4 positionEC = czm_modelViewRelativeToEye * position;\nvec4 prevEC = czm_modelViewRelativeToEye * previous;\nvec4 nextEC = czm_modelViewRelativeToEye * next;\nreturn getPolylineWindowCoordinatesEC(positionEC, prevEC, nextEC, expandDirection, width, usePrevious, angle);\n}\n",defaultVertexShaderSource=PolylineCommon+"\n"+PolylineColorAppearanceVS,defaultFragmentShaderSource=PerInstanceFlatColorAppearanceFS;function PolylineColorAppearance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.translucent,!0),i=PolylineColorAppearance.VERTEX_FORMAT;this.material=void 0,this.translucent=t,this._vertexShaderSource=defaultValue(e.vertexShaderSource,defaultVertexShaderSource),this._fragmentShaderSource=defaultValue(e.fragmentShaderSource,defaultFragmentShaderSource),this._renderState=Appearance.getDefaultRenderState(t,!1,e.renderState),this._closed=!1,this._vertexFormat=i}FeatureDetection.isInternetExplorer()||(defaultVertexShaderSource="#define CLIP_POLYLINE \n"+defaultVertexShaderSource),Object.defineProperties(PolylineColorAppearance.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}}}),PolylineColorAppearance.VERTEX_FORMAT=VertexFormat.POSITION_ONLY,PolylineColorAppearance.prototype.getFragmentShaderSource=Appearance.prototype.getFragmentShaderSource,PolylineColorAppearance.prototype.isTranslucent=Appearance.prototype.isTranslucent,PolylineColorAppearance.prototype.getRenderState=Appearance.prototype.getRenderState;var PolylineMaterialAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 prevPosition3DHigh;\nattribute vec3 prevPosition3DLow;\nattribute vec3 nextPosition3DHigh;\nattribute vec3 nextPosition3DLow;\nattribute vec2 expandAndWidth;\nattribute vec2 st;\nattribute float batchId;\nvarying float v_width;\nvarying vec2 v_st;\nvarying float v_polylineAngle;\nvoid main()\n{\nfloat expandDir = expandAndWidth.x;\nfloat width = abs(expandAndWidth.y) + 0.5;\nbool usePrev = expandAndWidth.y < 0.0;\nvec4 p = czm_computePosition();\nvec4 prev = czm_computePrevPosition();\nvec4 next = czm_computeNextPosition();\nfloat angle;\nvec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle);\ngl_Position = czm_viewportOrthographic * positionWC;\nv_width = width;\nv_st.s = st.s;\nv_st.t = czm_writeNonPerspective(st.t, gl_Position.w);\nv_polylineAngle = angle;\n}\n",PolylineFS="#ifdef VECTOR_TILE\nuniform vec4 u_highlightColor;\n#endif\nvarying vec2 v_st;\nvoid main()\n{\nczm_materialInput materialInput;\nvec2 st = v_st;\nst.t = czm_readNonPerspective(st.t, gl_FragCoord.w);\nmaterialInput.s = st.s;\nmaterialInput.st = st;\nmaterialInput.str = vec3(st, 0.0);\nczm_material material = czm_getMaterial(materialInput);\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#ifdef VECTOR_TILE\ngl_FragColor *= u_highlightColor;\n#endif\nczm_writeLogDepth();\n}\n",defaultVertexShaderSource$1=PolylineCommon+"\n"+PolylineMaterialAppearanceVS,defaultFragmentShaderSource$1=PolylineFS;function PolylineMaterialAppearance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.translucent,!0),i=PolylineMaterialAppearance.VERTEX_FORMAT;this.material=defined(e.material)?e.material:Material.fromType(Material.ColorType),this.translucent=t,this._vertexShaderSource=defaultValue(e.vertexShaderSource,defaultVertexShaderSource$1),this._fragmentShaderSource=defaultValue(e.fragmentShaderSource,defaultFragmentShaderSource$1),this._renderState=Appearance.getDefaultRenderState(t,!1,e.renderState),this._closed=!1,this._vertexFormat=i}function GroundPolylinePrimitive(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.geometryInstances=e.geometryInstances,this._hasPerInstanceColors=!0;var t=e.appearance;defined(t)||(t=new PolylineMaterialAppearance),this.appearance=t,this.show=defaultValue(e.show,!0),this.classificationType=defaultValue(e.classificationType,ClassificationType$1.BOTH),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this._debugShowShadowVolume=defaultValue(e.debugShowShadowVolume,!1),this._primitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:!1,interleave:defaultValue(e.interleave,!1),releaseGeometryInstances:defaultValue(e.releaseGeometryInstances,!0),allowPicking:defaultValue(e.allowPicking,!0),asynchronous:defaultValue(e.asynchronous,!0),compressVertices:!1,_createShaderProgramFunction:void 0,_createCommandsFunction:void 0,_updateAndQueueCommandsFunction:void 0},this._zIndex=void 0,this._ready=!1,this._readyPromise=when.defer(),this._primitive=void 0,this._sp=void 0,this._sp2D=void 0,this._spMorph=void 0,this._renderState=getRenderState(!1),this._renderState3DTiles=getRenderState(!0),this._renderStateMorph=RenderState.fromCache({cull:{enabled:!0,face:CullFace$1.FRONT},depthTest:{enabled:!0},blending:BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1})}function createShaderProgram$2(e,t,i){var r=t.context,n=e._primitive,a=n._attributeLocations,o=n._batchTable.getVertexShaderCallback()(PolylineShadowVolumeVS),o=Primitive._appendShowToShader(n,o);o=Primitive._appendDistanceDisplayConditionToShader(n,o),o=Primitive._modifyShaderPosition(e,o,t.scene3DOnly);var s=n._batchTable.getVertexShaderCallback()(PolylineShadowVolumeMorphVS),s=Primitive._appendShowToShader(n,s);s=Primitive._appendDistanceDisplayConditionToShader(n,s),s=Primitive._modifyShaderPosition(e,s,t.scene3DOnly);var l=n._batchTable.getVertexShaderCallback()(PolylineShadowVolumeFS),c=["GLOBE_MINIMUM_ALTITUDE "+t.mapProjection.ellipsoid.minimumRadius.toFixed(1)],u="",d="";defined(i.material)?(-1!==(d=defined(i.material)?i.material.shaderSource:"").search(/varying\s+float\s+v_polylineAngle;/g)&&c.push("ANGLE_VARYING"),-1!==d.search(/varying\s+float\s+v_width;/g)&&c.push("WIDTH_VARYING")):u="PER_INSTANCE_COLOR",c.push(u);var h=e.debugShowShadowVolume?["DEBUG_SHOW_VOLUME",u]:[u],p=new ShaderSource({defines:c,sources:[o]}),m=new ShaderSource({defines:h,sources:[d,l]});e._sp=ShaderProgram.replaceCache({context:r,shaderProgram:n._sp,vertexShaderSource:p,fragmentShaderSource:m,attributeLocations:a});var f,g=r.shaderCache.getDerivedShaderProgram(e._sp,"2dColor");defined(g)||(f=new ShaderSource({defines:c.concat(["COLUMBUS_VIEW_2D"]),sources:[o]}),g=r.shaderCache.createDerivedShaderProgram(e._sp,"2dColor",{context:r,shaderProgram:e._sp2D,vertexShaderSource:f,fragmentShaderSource:m,attributeLocations:a})),e._sp2D=g;var _,y,v=r.shaderCache.getDerivedShaderProgram(e._sp,"MorphColor");defined(v)||(_=new ShaderSource({defines:c.concat(["MAX_TERRAIN_HEIGHT "+ApproximateTerrainHeights._defaultMaxTerrainHeight.toFixed(1)]),sources:[s]}),y=new ShaderSource({defines:h,sources:[d,l=n._batchTable.getVertexShaderCallback()(PolylineShadowVolumeMorphFS)]}),v=r.shaderCache.createDerivedShaderProgram(e._sp,"MorphColor",{context:r,shaderProgram:e._spMorph,vertexShaderSource:_,fragmentShaderSource:y,attributeLocations:a})),e._spMorph=v}function getRenderState(e){return RenderState.fromCache({cull:{enabled:!0},blending:BlendingState$1.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1,stencilTest:{enabled:e,frontFunction:StencilFunction$1.EQUAL,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.KEEP},backFunction:StencilFunction$1.EQUAL,backOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.KEEP},reference:StencilConstants$1.CESIUM_3D_TILE_MASK,mask:StencilConstants$1.CESIUM_3D_TILE_MASK}})}function createCommands$2(e,t,i,r,n,a){var o=e._primitive,s=o._va.length;n.length=s,a.length=s;for(var l=t instanceof PolylineColorAppearance?{}:i._uniforms,c=o._batchTable.getUniformMapCallback()(l),u=0;u<s;u++){var d=o._va[u],h=n[u];defined(h)||(h=n[u]=new DrawCommand({owner:e,primitiveType:o._primitiveType})),h.vertexArray=d,h.renderState=e._renderState,h.shaderProgram=e._sp,h.uniformMap=c,h.pass=Pass$1.TERRAIN_CLASSIFICATION,h.pickId="czm_batchTable_pickColor(v_endPlaneNormalEcAndBatchId.w)";var p=DrawCommand.shallowClone(h,h.derivedCommands.tileset);p.renderState=e._renderState3DTiles,p.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,h.derivedCommands.tileset=p;var m=DrawCommand.shallowClone(h,h.derivedCommands.color2D);m.shaderProgram=e._sp2D,h.derivedCommands.color2D=m;var f=DrawCommand.shallowClone(p,p.derivedCommands.color2D);f.shaderProgram=e._sp2D,p.derivedCommands.color2D=f;var g=DrawCommand.shallowClone(h,h.derivedCommands.colorMorph);g.renderState=e._renderStateMorph,g.shaderProgram=e._spMorph,g.pickId="czm_batchTable_pickColor(v_batchId)",h.derivedCommands.colorMorph=g}}function updateAndQueueCommand(e,t,i,r,n,a,o){i.mode===SceneMode$1.MORPHING?t=t.derivedCommands.colorMorph:i.mode!==SceneMode$1.SCENE3D&&(t=t.derivedCommands.color2D),t.modelMatrix=r,t.boundingVolume=a,t.cull=n,t.debugShowBoundingVolume=o,i.commandList.push(t)}function updateAndQueueCommands$3(e,t,i,r,n,a,o){var s,l=e._primitive;Primitive._updateBoundingVolumes(l,t,n),t.mode===SceneMode$1.SCENE3D?s=l._boundingSphereWC:t.mode===SceneMode$1.COLUMBUS_VIEW?s=l._boundingSphereCV:t.mode===SceneMode$1.SCENE2D&&defined(l._boundingSphere2D)?s=l._boundingSphere2D:defined(l._boundingSphereMorph)&&(s=l._boundingSphereMorph);var c=t.mode===SceneMode$1.MORPHING,u=e.classificationType,d=u!==ClassificationType$1.CESIUM_3D_TILE,h=u!==ClassificationType$1.TERRAIN&&!c,p=t.passes;if(p.render||p.pick&&l.allowPicking)for(var m=i.length,f=0;f<m;++f){var g=s[f];d&&updateAndQueueCommand(e,i[f],t,n,a,g,o),h&&updateAndQueueCommand(e,i[f].derivedCommands.tileset,t,n,a,g,o)}}FeatureDetection.isInternetExplorer()||(defaultVertexShaderSource$1="#define CLIP_POLYLINE \n"+defaultVertexShaderSource$1),Object.defineProperties(PolylineMaterialAppearance.prototype,{vertexShaderSource:{get:function(){var e=this._vertexShaderSource;return-1!==this.material.shaderSource.search(/varying\s+float\s+v_polylineAngle;/g)&&(e="#define POLYLINE_DASH\n"+e),e}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}}}),PolylineMaterialAppearance.VERTEX_FORMAT=VertexFormat.POSITION_AND_ST,PolylineMaterialAppearance.prototype.getFragmentShaderSource=Appearance.prototype.getFragmentShaderSource,PolylineMaterialAppearance.prototype.isTranslucent=Appearance.prototype.isTranslucent,PolylineMaterialAppearance.prototype.getRenderState=Appearance.prototype.getRenderState,Object.defineProperties(GroundPolylinePrimitive.prototype,{interleave:{get:function(){return this._primitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._primitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._primitiveOptions.allowPicking}},asynchronous:{get:function(){return this._primitiveOptions.asynchronous}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},debugShowShadowVolume:{get:function(){return this._debugShowShadowVolume}}}),GroundPolylinePrimitive.initializeTerrainHeights=function(){return ApproximateTerrainHeights.initialize()},GroundPolylinePrimitive.prototype.update=function(e){if(defined(this._primitive)||defined(this.geometryInstances))if(ApproximateTerrainHeights.initialized){var l=this,t=this._primitiveOptions;if(!defined(this._primitive)){for(var i=Array.isArray(this.geometryInstances)?this.geometryInstances:[this.geometryInstances],r=i.length,n=new Array(r),a=0;a<r;++a)if(!defined(s=i[a].attributes)||!defined(s.color)){this._hasPerInstanceColors=!1;break}for(a=0;a<r;++a){var o=i[a],s={},c=o.attributes;for(var u in c)c.hasOwnProperty(u)&&(s[u]=c[u]);defined(s.width)||(s.width=new GeometryInstanceAttribute({componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:1,value:[o.geometry.width]})),o.geometry._scene3DOnly=e.scene3DOnly,GroundPolylineGeometry.setProjectionAndEllipsoid(o.geometry,e.mapProjection),n[a]=new GeometryInstance({geometry:o.geometry,attributes:s,id:o.id,pickPrimitive:l})}t.geometryInstances=n,t.appearance=this.appearance,t._createShaderProgramFunction=function(e,t,i){createShaderProgram$2(l,t,i)},t._createCommandsFunction=function(e,t,i,r,n,a,o){createCommands$2(l,t,i,r,a,o)},t._updateAndQueueCommandsFunction=function(e,t,i,r,n,a,o,s){updateAndQueueCommands$3(l,t,i,r,n,a,o)},this._primitive=new Primitive(t),this._primitive.readyPromise.then(function(e){l._ready=!0,l.releaseGeometryInstances&&(l.geometryInstances=void 0);var t=e._error;defined(t)?l._readyPromise.reject(t):l._readyPromise.resolve(l)})}if(this.appearance instanceof PolylineColorAppearance&&!this._hasPerInstanceColors)throw new DeveloperError("All GeometryInstances must have color attributes to use PolylineColorAppearance with GroundPolylinePrimitive.");this._primitive.appearance=this.appearance,this._primitive.show=this.show,this._primitive.debugShowBoundingVolume=this.debugShowBoundingVolume,this._primitive.update(e)}else GroundPolylinePrimitive.initializeTerrainHeights()},GroundPolylinePrimitive.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)},GroundPolylinePrimitive.isSupported=function(e){return e.frameState.context.depthTexture},GroundPolylinePrimitive.prototype.isDestroyed=function(){return!1},GroundPolylinePrimitive.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),this._sp=this._sp&&this._sp.destroy(),this._sp2D=void 0,this._spMorph=void 0,destroyObject(this)};var defaultRepeat=new Cartesian2(1,1),defaultTransparent=!1,defaultColor$1=Color.WHITE;function ImageMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._image=void 0,this._imageSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this._color=void 0,this._colorSubscription=void 0,this._transparent=void 0,this._transparentSubscription=void 0,this.image=e.image,this.repeat=e.repeat,this.color=e.color,this.transparent=e.transparent}function createMaterialProperty(e){if(e instanceof Color)return new ColorMaterialProperty(e);if("string"==typeof e||e instanceof Resource||e instanceof HTMLCanvasElement||e instanceof HTMLVideoElement){var t=new ImageMaterialProperty;return t.image=e,t}}function createMaterialPropertyDescriptor(e,t){return createPropertyDescriptor(e,t,createMaterialProperty)}function BoxGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._dimensions=void 0,this._dimensionsSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function PositionProperty(){DeveloperError.throwInstantiationError()}Object.defineProperties(ImageMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._image)&&Property.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},image:createPropertyDescriptor("image"),repeat:createPropertyDescriptor("repeat"),color:createPropertyDescriptor("color"),transparent:createPropertyDescriptor("transparent")}),ImageMaterialProperty.prototype.getType=function(e){return"Image"},ImageMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.image=Property.getValueOrUndefined(this._image,e),t.repeat=Property.getValueOrClonedDefault(this._repeat,e,defaultRepeat,t.repeat),t.color=Property.getValueOrClonedDefault(this._color,e,defaultColor$1,t.color),Property.getValueOrDefault(this._transparent,e,defaultTransparent)&&(t.color.alpha=Math.min(.99,t.color.alpha)),t},ImageMaterialProperty.prototype.equals=function(e){return this===e||e instanceof ImageMaterialProperty&&Property.equals(this._image,e._image)&&Property.equals(this._repeat,e._repeat)&&Property.equals(this._color,e._color)&&Property.equals(this._transparent,e._transparent)},Object.defineProperties(BoxGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),dimensions:createPropertyDescriptor("dimensions"),heightReference:createPropertyDescriptor("heightReference"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),BoxGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.dimensions=this.dimensions,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new BoxGraphics(this)},BoxGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.dimensions=defaultValue(this.dimensions,e.dimensions),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)},Object.defineProperties(PositionProperty.prototype,{isConstant:{get:DeveloperError.throwInstantiationError},definitionChanged:{get:DeveloperError.throwInstantiationError},referenceFrame:{get:DeveloperError.throwInstantiationError}}),PositionProperty.prototype.getValue=DeveloperError.throwInstantiationError,PositionProperty.prototype.getValueInReferenceFrame=DeveloperError.throwInstantiationError,PositionProperty.prototype.equals=DeveloperError.throwInstantiationError;var scratchMatrix3=new Matrix3;function ConstantPositionProperty(e,t){this._definitionChanged=new Event,this._value=Cartesian3.clone(e),this._referenceFrame=defaultValue(t,ReferenceFrame$1.FIXED)}function CorridorGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._positions=void 0,this._positionsSubscription=void 0,this._width=void 0,this._widthSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._cornerType=void 0,this._cornerTypeSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function createRawProperty(e){return e}function createRawPropertyDescriptor(e,t){return createPropertyDescriptor(e,t,createRawProperty)}function CylinderGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._length=void 0,this._lengthSubscription=void 0,this._topRadius=void 0,this._topRadiusSubscription=void 0,this._bottomRadius=void 0,this._bottomRadiusSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._numberOfVerticalLines=void 0,this._numberOfVerticalLinesSubscription=void 0,this._slices=void 0,this._slicesSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function EllipseGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._semiMajorAxis=void 0,this._semiMajorAxisSubscription=void 0,this._semiMinorAxis=void 0,this._semiMinorAxisSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._stRotation=void 0,this._stRotationSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._numberOfVerticalLines=void 0,this._numberOfVerticalLinesSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function EllipsoidGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._radii=void 0,this._radiiSubscription=void 0,this._innerRadii=void 0,this._innerRadiiSubscription=void 0,this._minimumClock=void 0,this._minimumClockSubscription=void 0,this._maximumClock=void 0,this._maximumClockSubscription=void 0,this._minimumCone=void 0,this._minimumConeSubscription=void 0,this._maximumCone=void 0,this._maximumConeSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._stackPartitions=void 0,this._stackPartitionsSubscription=void 0,this._slicePartitions=void 0,this._slicePartitionsSubscription=void 0,this._subdivisions=void 0,this._subdivisionsSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function LabelGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._text=void 0,this._textSubscription=void 0,this._font=void 0,this._fontSubscription=void 0,this._style=void 0,this._styleSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this._showBackground=void 0,this._showBackgroundSubscription=void 0,this._backgroundColor=void 0,this._backgroundColorSubscription=void 0,this._backgroundPadding=void 0,this._backgroundPaddingSubscription=void 0,this._pixelOffset=void 0,this._pixelOffsetSubscription=void 0,this._eyeOffset=void 0,this._eyeOffsetSubscription=void 0,this._horizontalOrigin=void 0,this._horizontalOriginSubscription=void 0,this._verticalOrigin=void 0,this._verticalOriginSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fillColor=void 0,this._fillColorSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._translucencyByDistance=void 0,this._translucencyByDistanceSubscription=void 0,this._pixelOffsetScaleByDistance=void 0,this._pixelOffsetScaleByDistanceSubscription=void 0,this._scaleByDistance=void 0,this._scaleByDistanceSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._disableDepthTestDistance=void 0,this._disableDepthTestDistanceSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}PositionProperty.convertToReferenceFrame=function(e,t,i,r,n){if(!defined(t))return t;if(defined(n)||(n=new Cartesian3),i===r)return Cartesian3.clone(t,n);var a=Transforms.computeIcrfToFixedMatrix(e,scratchMatrix3);return defined(a)||(a=Transforms.computeTemeToPseudoFixedMatrix(e,scratchMatrix3)),i===ReferenceFrame$1.INERTIAL?Matrix3.multiplyByVector(a,t,n):i===ReferenceFrame$1.FIXED?Matrix3.multiplyByVector(Matrix3.transpose(a,scratchMatrix3),t,n):void 0},Object.defineProperties(ConstantPositionProperty.prototype,{isConstant:{get:function(){return!defined(this._value)||this._referenceFrame===ReferenceFrame$1.FIXED}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}}}),ConstantPositionProperty.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,ReferenceFrame$1.FIXED,t)},ConstantPositionProperty.prototype.setValue=function(e,t){var i=!1;Cartesian3.equals(this._value,e)||(i=!0,this._value=Cartesian3.clone(e)),defined(t)&&this._referenceFrame!==t&&(i=!0,this._referenceFrame=t),i&&this._definitionChanged.raiseEvent(this)},ConstantPositionProperty.prototype.getValueInReferenceFrame=function(e,t,i){return PositionProperty.convertToReferenceFrame(e,this._value,this._referenceFrame,t,i)},ConstantPositionProperty.prototype.equals=function(e){return this===e||e instanceof ConstantPositionProperty&&Cartesian3.equals(this._value,e._value)&&this._referenceFrame===e._referenceFrame},Object.defineProperties(CorridorGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),positions:createPropertyDescriptor("positions"),width:createPropertyDescriptor("width"),height:createPropertyDescriptor("height"),heightReference:createPropertyDescriptor("heightReference"),extrudedHeight:createPropertyDescriptor("extrudedHeight"),extrudedHeightReference:createPropertyDescriptor("extrudedHeightReference"),cornerType:createPropertyDescriptor("cornerType"),granularity:createPropertyDescriptor("granularity"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),classificationType:createPropertyDescriptor("classificationType"),zIndex:createPropertyDescriptor("zIndex")}),CorridorGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.positions=this.positions,e.width=this.width,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.cornerType=this.cornerType,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new CorridorGraphics(this)},CorridorGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.positions=defaultValue(this.positions,e.positions),this.width=defaultValue(this.width,e.width),this.height=defaultValue(this.height,e.height),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.extrudedHeight=defaultValue(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=defaultValue(this.extrudedHeightReference,e.extrudedHeightReference),this.cornerType=defaultValue(this.cornerType,e.cornerType),this.granularity=defaultValue(this.granularity,e.granularity),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=defaultValue(this.classificationType,e.classificationType),this.zIndex=defaultValue(this.zIndex,e.zIndex)},Object.defineProperties(CylinderGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),length:createPropertyDescriptor("length"),topRadius:createPropertyDescriptor("topRadius"),bottomRadius:createPropertyDescriptor("bottomRadius"),heightReference:createPropertyDescriptor("heightReference"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),numberOfVerticalLines:createPropertyDescriptor("numberOfVerticalLines"),slices:createPropertyDescriptor("slices"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),CylinderGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.length=this.length,e.topRadius=this.topRadius,e.bottomRadius=this.bottomRadius,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.numberOfVerticalLines=this.numberOfVerticalLines,e.slices=this.slices,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new CylinderGraphics(this)},CylinderGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.length=defaultValue(this.length,e.length),this.topRadius=defaultValue(this.topRadius,e.topRadius),this.bottomRadius=defaultValue(this.bottomRadius,e.bottomRadius),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.numberOfVerticalLines=defaultValue(this.numberOfVerticalLines,e.numberOfVerticalLines),this.slices=defaultValue(this.slices,e.slices),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)},Object.defineProperties(EllipseGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),semiMajorAxis:createPropertyDescriptor("semiMajorAxis"),semiMinorAxis:createPropertyDescriptor("semiMinorAxis"),height:createPropertyDescriptor("height"),heightReference:createPropertyDescriptor("heightReference"),extrudedHeight:createPropertyDescriptor("extrudedHeight"),extrudedHeightReference:createPropertyDescriptor("extrudedHeightReference"),rotation:createPropertyDescriptor("rotation"),stRotation:createPropertyDescriptor("stRotation"),granularity:createPropertyDescriptor("granularity"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),numberOfVerticalLines:createPropertyDescriptor("numberOfVerticalLines"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),classificationType:createPropertyDescriptor("classificationType"),zIndex:createPropertyDescriptor("zIndex")}),EllipseGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.semiMajorAxis=this.semiMajorAxis,e.semiMinorAxis=this.semiMinorAxis,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.rotation=this.rotation,e.stRotation=this.stRotation,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.numberOfVerticalLines=this.numberOfVerticalLines,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new EllipseGraphics(this)},EllipseGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.semiMajorAxis=defaultValue(this.semiMajorAxis,e.semiMajorAxis),this.semiMinorAxis=defaultValue(this.semiMinorAxis,e.semiMinorAxis),this.height=defaultValue(this.height,e.height),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.extrudedHeight=defaultValue(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=defaultValue(this.extrudedHeightReference,e.extrudedHeightReference),this.rotation=defaultValue(this.rotation,e.rotation),this.stRotation=defaultValue(this.stRotation,e.stRotation),this.granularity=defaultValue(this.granularity,e.granularity),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.numberOfVerticalLines=defaultValue(this.numberOfVerticalLines,e.numberOfVerticalLines),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=defaultValue(this.classificationType,e.classificationType),this.zIndex=defaultValue(this.zIndex,e.zIndex)},Object.defineProperties(EllipsoidGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),radii:createPropertyDescriptor("radii"),innerRadii:createPropertyDescriptor("innerRadii"),minimumClock:createPropertyDescriptor("minimumClock"),maximumClock:createPropertyDescriptor("maximumClock"),minimumCone:createPropertyDescriptor("minimumCone"),maximumCone:createPropertyDescriptor("maximumCone"),heightReference:createPropertyDescriptor("heightReference"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),stackPartitions:createPropertyDescriptor("stackPartitions"),slicePartitions:createPropertyDescriptor("slicePartitions"),subdivisions:createPropertyDescriptor("subdivisions"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),EllipsoidGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.radii=this.radii,e.innerRadii=this.innerRadii,e.minimumClock=this.minimumClock,e.maximumClock=this.maximumClock,e.minimumCone=this.minimumCone,e.maximumCone=this.maximumCone,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.stackPartitions=this.stackPartitions,e.slicePartitions=this.slicePartitions,e.subdivisions=this.subdivisions,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new EllipsoidGraphics(this)},EllipsoidGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.radii=defaultValue(this.radii,e.radii),this.innerRadii=defaultValue(this.innerRadii,e.innerRadii),this.minimumClock=defaultValue(this.minimumClock,e.minimumClock),this.maximumClock=defaultValue(this.maximumClock,e.maximumClock),this.minimumCone=defaultValue(this.minimumCone,e.minimumCone),this.maximumCone=defaultValue(this.maximumCone,e.maximumCone),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.stackPartitions=defaultValue(this.stackPartitions,e.stackPartitions),this.slicePartitions=defaultValue(this.slicePartitions,e.slicePartitions),this.subdivisions=defaultValue(this.subdivisions,e.subdivisions),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)},Object.defineProperties(LabelGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),text:createPropertyDescriptor("text"),font:createPropertyDescriptor("font"),style:createPropertyDescriptor("style"),scale:createPropertyDescriptor("scale"),showBackground:createPropertyDescriptor("showBackground"),backgroundColor:createPropertyDescriptor("backgroundColor"),backgroundPadding:createPropertyDescriptor("backgroundPadding"),pixelOffset:createPropertyDescriptor("pixelOffset"),eyeOffset:createPropertyDescriptor("eyeOffset"),horizontalOrigin:createPropertyDescriptor("horizontalOrigin"),verticalOrigin:createPropertyDescriptor("verticalOrigin"),heightReference:createPropertyDescriptor("heightReference"),fillColor:createPropertyDescriptor("fillColor"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),translucencyByDistance:createPropertyDescriptor("translucencyByDistance"),pixelOffsetScaleByDistance:createPropertyDescriptor("pixelOffsetScaleByDistance"),scaleByDistance:createPropertyDescriptor("scaleByDistance"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),disableDepthTestDistance:createPropertyDescriptor("disableDepthTestDistance")}),LabelGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.text=this.text,e.font=this.font,e.style=this.style,e.scale=this.scale,e.showBackground=this.showBackground,e.backgroundColor=this.backgroundColor,e.backgroundPadding=this.backgroundPadding,e.pixelOffset=this.pixelOffset,e.eyeOffset=this.eyeOffset,e.horizontalOrigin=this.horizontalOrigin,e.verticalOrigin=this.verticalOrigin,e.heightReference=this.heightReference,e.fillColor=this.fillColor,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.translucencyByDistance=this.translucencyByDistance,e.pixelOffsetScaleByDistance=this.pixelOffsetScaleByDistance,e.scaleByDistance=this.scaleByDistance,e.distanceDisplayCondition=this.distanceDisplayCondition,e.disableDepthTestDistance=this.disableDepthTestDistance,e):new LabelGraphics(this)},LabelGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.text=defaultValue(this.text,e.text),this.font=defaultValue(this.font,e.font),this.style=defaultValue(this.style,e.style),this.scale=defaultValue(this.scale,e.scale),this.showBackground=defaultValue(this.showBackground,e.showBackground),this.backgroundColor=defaultValue(this.backgroundColor,e.backgroundColor),this.backgroundPadding=defaultValue(this.backgroundPadding,e.backgroundPadding),this.pixelOffset=defaultValue(this.pixelOffset,e.pixelOffset),this.eyeOffset=defaultValue(this.eyeOffset,e.eyeOffset),this.horizontalOrigin=defaultValue(this.horizontalOrigin,e.horizontalOrigin),this.verticalOrigin=defaultValue(this.verticalOrigin,e.verticalOrigin),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.fillColor=defaultValue(this.fillColor,e.fillColor),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.translucencyByDistance=defaultValue(this.translucencyByDistance,e.translucencyByDistance),this.pixelOffsetScaleByDistance=defaultValue(this.pixelOffsetScaleByDistance,e.pixelOffsetScaleByDistance),this.scaleByDistance=defaultValue(this.scaleByDistance,e.scaleByDistance),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.disableDepthTestDistance=defaultValue(this.disableDepthTestDistance,e.disableDepthTestDistance)};var defaultNodeTransformation=new TranslationRotationScale;function NodeTransformationProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._translation=void 0,this._translationSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this.translation=e.translation,this.rotation=e.rotation,this.scale=e.scale}function PropertyBag(e,t){this._propertyNames=[],this._definitionChanged=new Event,defined(e)&&this.merge(e,t)}function createConstantProperty$1(e){return new ConstantProperty(e)}function propertiesEqual(e,t){var i=e._propertyNames,r=t._propertyNames,n=i.length;if(n!==r.length)return!1;for(var a=0;a<n;++a){var o=i[a];if(-1===r.indexOf(o))return!1;if(!Property.equals(e[o],t[o]))return!1}return!0}function createNodeTransformationProperty(e){return new NodeTransformationProperty(e)}function createNodeTransformationPropertyBag(e){return new PropertyBag(e,createNodeTransformationProperty)}function createArticulationStagePropertyBag(e){return new PropertyBag(e)}function ModelGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._uri=void 0,this._uriSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this._minimumPixelSize=void 0,this._minimumPixelSizeSubscription=void 0,this._maximumScale=void 0,this._maximumScaleSubscription=void 0,this._incrementallyLoadTextures=void 0,this._incrementallyLoadTexturesSubscription=void 0,this._runAnimations=void 0,this._runAnimationsSubscription=void 0,this._clampAnimations=void 0,this._clampAnimationsSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._silhouetteColor=void 0,this._silhouetteColorSubscription=void 0,this._silhouetteSize=void 0,this._silhouetteSizeSubscription=void 0,this._color=void 0,this._colorSubscription=void 0,this._colorBlendMode=void 0,this._colorBlendModeSubscription=void 0,this._colorBlendAmount=void 0,this._colorBlendAmountSubscription=void 0,this._imageBasedLightingFactor=void 0,this._imageBasedLightingFactorSubscription=void 0,this._lightColor=void 0,this._lightColorSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._nodeTransformations=void 0,this._nodeTransformationsSubscription=void 0,this._articulations=void 0,this._articulationsSubscription=void 0,this._clippingPlanes=void 0,this._clippingPlanesSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function Cesium3DTilesetGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._uri=void 0,this._uriSubscription=void 0,this._maximumScreenSpaceError=void 0,this._maximumScreenSpaceErrorSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function PathGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._leadTime=void 0,this._leadTimeSubscription=void 0,this._trailTime=void 0,this._trailTimeSubscription=void 0,this._width=void 0,this._widthSubscription=void 0,this._resolution=void 0,this._resolutionSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function PlaneGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._plane=void 0,this._planeSubscription=void 0,this._dimensions=void 0,this._dimensionsSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function PointGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._pixelSize=void 0,this._pixelSizeSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._color=void 0,this._colorSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._scaleByDistance=void 0,this._scaleByDistanceSubscription=void 0,this._translucencyByDistance=void 0,this._translucencyByDistanceSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._disableDepthTestDistance=void 0,this._disableDepthTestDistanceSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function createPolygonHierarchyProperty(e){return Array.isArray(e)&&(e=new PolygonHierarchy(e)),new ConstantProperty(e)}function PolygonGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._hierarchy=void 0,this._hierarchySubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._stRotation=void 0,this._stRotationSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._perPositionHeight=void 0,this._perPositionHeightSubscription=void 0,this._closeTop=void 0,this._closeTopSubscription=void 0,this._closeBottom=void 0,this._closeBottomSubscription=void 0,this._arcType=void 0,this._arcTypeSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function PolylineGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._positions=void 0,this._positionsSubscription=void 0,this._width=void 0,this._widthSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._depthFailMaterial=void 0,this._depthFailMaterialSubscription=void 0,this._arcType=void 0,this._arcTypeSubscription=void 0,this._clampToGround=void 0,this._clampToGroundSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function PolylineVolumeGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._positions=void 0,this._positionsSubscription=void 0,this._shape=void 0,this._shapeSubscription=void 0,this._cornerType=void 0,this._cornerTypeSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubsription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function RectangleGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._coordinates=void 0,this._coordinatesSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._stRotation=void 0,this._stRotationSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distancedisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}function WallGraphics(e){this._definitionChanged=new Event,this._show=void 0,this._showSubscription=void 0,this._positions=void 0,this._positionsSubscription=void 0,this._minimumHeights=void 0,this._minimumHeightsSubscription=void 0,this._maximumHeights=void 0,this._maximumHeightsSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(defaultValue(e,defaultValue.EMPTY_OBJECT))}Object.defineProperties(NodeTransformationProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._translation)&&Property.isConstant(this._rotation)&&Property.isConstant(this._scale)}},definitionChanged:{get:function(){return this._definitionChanged}},translation:createPropertyDescriptor("translation"),rotation:createPropertyDescriptor("rotation"),scale:createPropertyDescriptor("scale")}),NodeTransformationProperty.prototype.getValue=function(e,t){return defined(t)||(t=new TranslationRotationScale),t.translation=Property.getValueOrClonedDefault(this._translation,e,defaultNodeTransformation.translation,t.translation),t.rotation=Property.getValueOrClonedDefault(this._rotation,e,defaultNodeTransformation.rotation,t.rotation),t.scale=Property.getValueOrClonedDefault(this._scale,e,defaultNodeTransformation.scale,t.scale),t},NodeTransformationProperty.prototype.equals=function(e){return this===e||e instanceof NodeTransformationProperty&&Property.equals(this._translation,e._translation)&&Property.equals(this._rotation,e._rotation)&&Property.equals(this._scale,e._scale)},Object.defineProperties(PropertyBag.prototype,{propertyNames:{get:function(){return this._propertyNames}},isConstant:{get:function(){for(var e=this._propertyNames,t=0,i=e.length;t<i;t++)if(!Property.isConstant(this[e[t]]))return!1;return!0}},definitionChanged:{get:function(){return this._definitionChanged}}}),PropertyBag.prototype.hasProperty=function(e){return-1!==this._propertyNames.indexOf(e)},PropertyBag.prototype.addProperty=function(e,t,i){this._propertyNames.push(e),Object.defineProperty(this,e,createPropertyDescriptor(e,!0,defaultValue(i,createConstantProperty$1))),defined(t)&&(this[e]=t),this._definitionChanged.raiseEvent(this)},PropertyBag.prototype.removeProperty=function(e){var t=this._propertyNames.indexOf(e);this._propertyNames.splice(t,1),delete this[e],this._definitionChanged.raiseEvent(this)},PropertyBag.prototype.getValue=function(e,t){defined(t)||(t={});for(var i=this._propertyNames,r=0,n=i.length;r<n;r++){var a=i[r];t[a]=Property.getValueOrUndefined(this[a],e,t[a])}return t},PropertyBag.prototype.merge=function(e,t){for(var i=this._propertyNames,r=defined(e._propertyNames)?e._propertyNames:Object.keys(e),n=0,a=r.length;n<a;n++){var o=r[n],s=this[o],l=e[o];void 0===s&&-1===i.indexOf(o)&&this.addProperty(o,void 0,t),void 0!==l&&(void 0!==s?defined(s)&&defined(s.merge)&&s.merge(l):defined(l)&&defined(l.merge)&&defined(l.clone)?this[o]=l.clone():this[o]=l)}},PropertyBag.prototype.equals=function(e){return this===e||e instanceof PropertyBag&&propertiesEqual(this,e)},Object.defineProperties(ModelGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),uri:createPropertyDescriptor("uri"),scale:createPropertyDescriptor("scale"),minimumPixelSize:createPropertyDescriptor("minimumPixelSize"),maximumScale:createPropertyDescriptor("maximumScale"),incrementallyLoadTextures:createPropertyDescriptor("incrementallyLoadTextures"),runAnimations:createPropertyDescriptor("runAnimations"),clampAnimations:createPropertyDescriptor("clampAnimations"),shadows:createPropertyDescriptor("shadows"),heightReference:createPropertyDescriptor("heightReference"),silhouetteColor:createPropertyDescriptor("silhouetteColor"),silhouetteSize:createPropertyDescriptor("silhouetteSize"),color:createPropertyDescriptor("color"),colorBlendMode:createPropertyDescriptor("colorBlendMode"),colorBlendAmount:createPropertyDescriptor("colorBlendAmount"),imageBasedLightingFactor:createPropertyDescriptor("imageBasedLightingFactor"),lightColor:createPropertyDescriptor("lightColor"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),nodeTransformations:createPropertyDescriptor("nodeTransformations",void 0,createNodeTransformationPropertyBag),articulations:createPropertyDescriptor("articulations",void 0,createArticulationStagePropertyBag),clippingPlanes:createPropertyDescriptor("clippingPlanes")}),ModelGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.uri=this.uri,e.scale=this.scale,e.minimumPixelSize=this.minimumPixelSize,e.maximumScale=this.maximumScale,e.incrementallyLoadTextures=this.incrementallyLoadTextures,e.runAnimations=this.runAnimations,e.clampAnimations=this.clampAnimations,e.heightReference=this._heightReference,e.silhouetteColor=this.silhouetteColor,e.silhouetteSize=this.silhouetteSize,e.color=this.color,e.colorBlendMode=this.colorBlendMode,e.colorBlendAmount=this.colorBlendAmount,e.imageBasedLightingFactor=this.imageBasedLightingFactor,e.lightColor=this.lightColor,e.distanceDisplayCondition=this.distanceDisplayCondition,e.nodeTransformations=this.nodeTransformations,e.articulations=this.articulations,e.clippingPlanes=this.clippingPlanes,e):new ModelGraphics(this)},ModelGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.uri=defaultValue(this.uri,e.uri),this.scale=defaultValue(this.scale,e.scale),this.minimumPixelSize=defaultValue(this.minimumPixelSize,e.minimumPixelSize),this.maximumScale=defaultValue(this.maximumScale,e.maximumScale),this.incrementallyLoadTextures=defaultValue(this.incrementallyLoadTextures,e.incrementallyLoadTextures),this.runAnimations=defaultValue(this.runAnimations,e.runAnimations),this.clampAnimations=defaultValue(this.clampAnimations,e.clampAnimations),this.shadows=defaultValue(this.shadows,e.shadows),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.silhouetteColor=defaultValue(this.silhouetteColor,e.silhouetteColor),this.silhouetteSize=defaultValue(this.silhouetteSize,e.silhouetteSize),this.color=defaultValue(this.color,e.color),this.colorBlendMode=defaultValue(this.colorBlendMode,e.colorBlendMode),this.colorBlendAmount=defaultValue(this.colorBlendAmount,e.colorBlendAmount),this.imageBasedLightingFactor=defaultValue(this.imageBasedLightingFactor,e.imageBasedLightingFactor),this.lightColor=defaultValue(this.lightColor,e.lightColor),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.clippingPlanes=defaultValue(this.clippingPlanes,e.clippingPlanes);var t,i=e.nodeTransformations;defined(i)&&(defined(t=this.nodeTransformations)?t.merge(i):this.nodeTransformations=new PropertyBag(i,createNodeTransformationProperty));var r,n=e.articulations;defined(n)&&(defined(r=this.articulations)?r.merge(n):this.articulations=new PropertyBag(n))},Object.defineProperties(Cesium3DTilesetGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),uri:createPropertyDescriptor("uri"),maximumScreenSpaceError:createPropertyDescriptor("maximumScreenSpaceError")}),Cesium3DTilesetGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.uri=this.uri,e.maximumScreenSpaceError=this.maximumScreenSpaceError,e):new Cesium3DTilesetGraphics(this)},Cesium3DTilesetGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.uri=defaultValue(this.uri,e.uri),this.maximumScreenSpaceError=defaultValue(this.maximumScreenSpaceError,e.maximumScreenSpaceError)},Object.defineProperties(PathGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),leadTime:createPropertyDescriptor("leadTime"),trailTime:createPropertyDescriptor("trailTime"),width:createPropertyDescriptor("width"),resolution:createPropertyDescriptor("resolution"),material:createMaterialPropertyDescriptor("material"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),PathGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.leadTime=this.leadTime,e.trailTime=this.trailTime,e.width=this.width,e.resolution=this.resolution,e.material=this.material,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new PathGraphics(this)},PathGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.leadTime=defaultValue(this.leadTime,e.leadTime),this.trailTime=defaultValue(this.trailTime,e.trailTime),this.width=defaultValue(this.width,e.width),this.resolution=defaultValue(this.resolution,e.resolution),this.material=defaultValue(this.material,e.material),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)},Object.defineProperties(PlaneGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),plane:createPropertyDescriptor("plane"),dimensions:createPropertyDescriptor("dimensions"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),PlaneGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.plane=this.plane,e.dimensions=this.dimensions,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new PlaneGraphics(this)},PlaneGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.plane=defaultValue(this.plane,e.plane),this.dimensions=defaultValue(this.dimensions,e.dimensions),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)},Object.defineProperties(PointGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),pixelSize:createPropertyDescriptor("pixelSize"),heightReference:createPropertyDescriptor("heightReference"),color:createPropertyDescriptor("color"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),scaleByDistance:createPropertyDescriptor("scaleByDistance"),translucencyByDistance:createPropertyDescriptor("translucencyByDistance"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),disableDepthTestDistance:createPropertyDescriptor("disableDepthTestDistance")}),PointGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.pixelSize=this.pixelSize,e.heightReference=this.heightReference,e.color=this.color,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.scaleByDistance=this.scaleByDistance,e.translucencyByDistance=this._translucencyByDistance,e.distanceDisplayCondition=this.distanceDisplayCondition,e.disableDepthTestDistance=this.disableDepthTestDistance,e):new PointGraphics(this)},PointGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.pixelSize=defaultValue(this.pixelSize,e.pixelSize),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.color=defaultValue(this.color,e.color),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.scaleByDistance=defaultValue(this.scaleByDistance,e.scaleByDistance),this.translucencyByDistance=defaultValue(this._translucencyByDistance,e.translucencyByDistance),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.disableDepthTestDistance=defaultValue(this.disableDepthTestDistance,e.disableDepthTestDistance)},Object.defineProperties(PolygonGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),hierarchy:createPropertyDescriptor("hierarchy",void 0,createPolygonHierarchyProperty),height:createPropertyDescriptor("height"),heightReference:createPropertyDescriptor("heightReference"),extrudedHeight:createPropertyDescriptor("extrudedHeight"),extrudedHeightReference:createPropertyDescriptor("extrudedHeightReference"),stRotation:createPropertyDescriptor("stRotation"),granularity:createPropertyDescriptor("granularity"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),perPositionHeight:createPropertyDescriptor("perPositionHeight"),closeTop:createPropertyDescriptor("closeTop"),closeBottom:createPropertyDescriptor("closeBottom"),arcType:createPropertyDescriptor("arcType"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),classificationType:createPropertyDescriptor("classificationType"),zIndex:createPropertyDescriptor("zIndex")}),PolygonGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.hierarchy=this.hierarchy,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.stRotation=this.stRotation,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.perPositionHeight=this.perPositionHeight,e.closeTop=this.closeTop,e.closeBottom=this.closeBottom,e.arcType=this.arcType,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new PolygonGraphics(this)},PolygonGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.hierarchy=defaultValue(this.hierarchy,e.hierarchy),this.height=defaultValue(this.height,e.height),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.extrudedHeight=defaultValue(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=defaultValue(this.extrudedHeightReference,e.extrudedHeightReference),this.stRotation=defaultValue(this.stRotation,e.stRotation),this.granularity=defaultValue(this.granularity,e.granularity),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.perPositionHeight=defaultValue(this.perPositionHeight,e.perPositionHeight),this.closeTop=defaultValue(this.closeTop,e.closeTop),this.closeBottom=defaultValue(this.closeBottom,e.closeBottom),this.arcType=defaultValue(this.arcType,e.arcType),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=defaultValue(this.classificationType,e.classificationType),this.zIndex=defaultValue(this.zIndex,e.zIndex)},Object.defineProperties(PolylineGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),positions:createPropertyDescriptor("positions"),width:createPropertyDescriptor("width"),granularity:createPropertyDescriptor("granularity"),material:createMaterialPropertyDescriptor("material"),depthFailMaterial:createMaterialPropertyDescriptor("depthFailMaterial"),arcType:createPropertyDescriptor("arcType"),clampToGround:createPropertyDescriptor("clampToGround"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),classificationType:createPropertyDescriptor("classificationType"),zIndex:createPropertyDescriptor("zIndex")}),PolylineGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.positions=this.positions,e.width=this.width,e.granularity=this.granularity,e.material=this.material,e.depthFailMaterial=this.depthFailMaterial,e.arcType=this.arcType,e.clampToGround=this.clampToGround,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new PolylineGraphics(this)},PolylineGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.positions=defaultValue(this.positions,e.positions),this.width=defaultValue(this.width,e.width),this.granularity=defaultValue(this.granularity,e.granularity),this.material=defaultValue(this.material,e.material),this.depthFailMaterial=defaultValue(this.depthFailMaterial,e.depthFailMaterial),this.arcType=defaultValue(this.arcType,e.arcType),this.clampToGround=defaultValue(this.clampToGround,e.clampToGround),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=defaultValue(this.classificationType,e.classificationType),this.zIndex=defaultValue(this.zIndex,e.zIndex)},Object.defineProperties(PolylineVolumeGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),positions:createPropertyDescriptor("positions"),shape:createPropertyDescriptor("shape"),cornerType:createPropertyDescriptor("cornerType"),granularity:createPropertyDescriptor("granularity"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),PolylineVolumeGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.positions=this.positions,e.shape=this.shape,e.cornerType=this.cornerType,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new PolylineVolumeGraphics(this)},PolylineVolumeGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.positions=defaultValue(this.positions,e.positions),this.shape=defaultValue(this.shape,e.shape),this.cornerType=defaultValue(this.cornerType,e.cornerType),this.granularity=defaultValue(this.granularity,e.granularity),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)},Object.defineProperties(RectangleGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),coordinates:createPropertyDescriptor("coordinates"),height:createPropertyDescriptor("height"),heightReference:createPropertyDescriptor("heightReference"),extrudedHeight:createPropertyDescriptor("extrudedHeight"),extrudedHeightReference:createPropertyDescriptor("extrudedHeightReference"),rotation:createPropertyDescriptor("rotation"),stRotation:createPropertyDescriptor("stRotation"),granularity:createPropertyDescriptor("granularity"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition"),classificationType:createPropertyDescriptor("classificationType"),zIndex:createPropertyDescriptor("zIndex")}),RectangleGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.coordinates=this.coordinates,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.rotation=this.rotation,e.stRotation=this.stRotation,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new RectangleGraphics(this)},RectangleGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.coordinates=defaultValue(this.coordinates,e.coordinates),this.height=defaultValue(this.height,e.height),this.heightReference=defaultValue(this.heightReference,e.heightReference),this.extrudedHeight=defaultValue(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=defaultValue(this.extrudedHeightReference,e.extrudedHeightReference),this.rotation=defaultValue(this.rotation,e.rotation),this.stRotation=defaultValue(this.stRotation,e.stRotation),this.granularity=defaultValue(this.granularity,e.granularity),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=defaultValue(this.classificationType,e.classificationType),this.zIndex=defaultValue(this.zIndex,e.zIndex)},Object.defineProperties(WallGraphics.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:createPropertyDescriptor("show"),positions:createPropertyDescriptor("positions"),minimumHeights:createPropertyDescriptor("minimumHeights"),maximumHeights:createPropertyDescriptor("maximumHeights"),granularity:createPropertyDescriptor("granularity"),fill:createPropertyDescriptor("fill"),material:createMaterialPropertyDescriptor("material"),outline:createPropertyDescriptor("outline"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth"),shadows:createPropertyDescriptor("shadows"),distanceDisplayCondition:createPropertyDescriptor("distanceDisplayCondition")}),WallGraphics.prototype.clone=function(e){return defined(e)?(e.show=this.show,e.positions=this.positions,e.minimumHeights=this.minimumHeights,e.maximumHeights=this.maximumHeights,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new WallGraphics(this)},WallGraphics.prototype.merge=function(e){this.show=defaultValue(this.show,e.show),this.positions=defaultValue(this.positions,e.positions),this.minimumHeights=defaultValue(this.minimumHeights,e.minimumHeights),this.maximumHeights=defaultValue(this.maximumHeights,e.maximumHeights),this.granularity=defaultValue(this.granularity,e.granularity),this.fill=defaultValue(this.fill,e.fill),this.material=defaultValue(this.material,e.material),this.outline=defaultValue(this.outline,e.outline),this.outlineColor=defaultValue(this.outlineColor,e.outlineColor),this.outlineWidth=defaultValue(this.outlineWidth,e.outlineWidth),this.shadows=defaultValue(this.shadows,e.shadows),this.distanceDisplayCondition=defaultValue(this.distanceDisplayCondition,e.distanceDisplayCondition)};var cartoScratch$1=new Cartographic;function createConstantPositionProperty(e){return new ConstantPositionProperty(e)}function createPositionPropertyDescriptor(e){return createPropertyDescriptor(e,void 0,createConstantPositionProperty)}function createPropertyTypeDescriptor(e,t){return createPropertyDescriptor(e,void 0,function(e){return e instanceof t?e:new t(e)})}function Entity(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).id;defined(t)||(t=createGuid()),this._availability=void 0,this._id=t,this._definitionChanged=new Event,this._name=e.name,this._show=defaultValue(e.show,!0),this._parent=void 0,this._propertyNames=["billboard","box","corridor","cylinder","description","ellipse","ellipsoid","label","model","tileset","orientation","path","plane","point","polygon","polyline","polylineVolume","position","properties","rectangle","viewFrom","wall"],this._billboard=void 0,this._billboardSubscription=void 0,this._box=void 0,this._boxSubscription=void 0,this._corridor=void 0,this._corridorSubscription=void 0,this._cylinder=void 0,this._cylinderSubscription=void 0,this._description=void 0,this._descriptionSubscription=void 0,this._ellipse=void 0,this._ellipseSubscription=void 0,this._ellipsoid=void 0,this._ellipsoidSubscription=void 0,this._label=void 0,this._labelSubscription=void 0,this._model=void 0,this._modelSubscription=void 0,this._tileset=void 0,this._tilesetSubscription=void 0,this._orientation=void 0,this._orientationSubscription=void 0,this._path=void 0,this._pathSubscription=void 0,this._plane=void 0,this._planeSubscription=void 0,this._point=void 0,this._pointSubscription=void 0,this._polygon=void 0,this._polygonSubscription=void 0,this._polyline=void 0,this._polylineSubscription=void 0,this._polylineVolume=void 0,this._polylineVolumeSubscription=void 0,this._position=void 0,this._positionSubscription=void 0,this._properties=void 0,this._propertiesSubscription=void 0,this._rectangle=void 0,this._rectangleSubscription=void 0,this._viewFrom=void 0,this._viewFromSubscription=void 0,this._wall=void 0,this._wallSubscription=void 0,this._children=[],this.entityCollection=void 0,this.parent=e.parent,this.merge(e)}function updateShow(e,t,i){for(var r=t.length,n=0;n<r;n++){var a=t[n],o=a._show;(!i&&o)!==(i&&o)&&updateShow(a,a._children,i)}e._definitionChanged.raiseEvent(e,"isShowing",i,!i)}Object.defineProperties(Entity.prototype,{availability:createRawPropertyDescriptor("availability"),id:{get:function(){return this._id}},definitionChanged:{get:function(){return this._definitionChanged}},name:createRawPropertyDescriptor("name"),show:{get:function(){return this._show},set:function(e){var t,i;e!==this._show&&(t=this.isShowing,this._show=e,t!==(i=this.isShowing)&&updateShow(this,this._children,i),this._definitionChanged.raiseEvent(this,"show",e,!e))}},isShowing:{get:function(){return this._show&&(!defined(this.entityCollection)||this.entityCollection.show)&&(!defined(this._parent)||this._parent.isShowing)}},parent:{get:function(){return this._parent},set:function(e){var t,i,r,n=this._parent;n!==e&&(t=this.isShowing,defined(n)&&(i=n._children.indexOf(this),n._children.splice(i,1)),defined(this._parent=e)&&e._children.push(this),t!==(r=this.isShowing)&&updateShow(this,this._children,r),this._definitionChanged.raiseEvent(this,"parent",e,n))}},propertyNames:{get:function(){return this._propertyNames}},billboard:createPropertyTypeDescriptor("billboard",BillboardGraphics),box:createPropertyTypeDescriptor("box",BoxGraphics),corridor:createPropertyTypeDescriptor("corridor",CorridorGraphics),cylinder:createPropertyTypeDescriptor("cylinder",CylinderGraphics),description:createPropertyDescriptor("description"),ellipse:createPropertyTypeDescriptor("ellipse",EllipseGraphics),ellipsoid:createPropertyTypeDescriptor("ellipsoid",EllipsoidGraphics),label:createPropertyTypeDescriptor("label",LabelGraphics),model:createPropertyTypeDescriptor("model",ModelGraphics),tileset:createPropertyTypeDescriptor("tileset",Cesium3DTilesetGraphics),orientation:createPropertyDescriptor("orientation"),path:createPropertyTypeDescriptor("path",PathGraphics),plane:createPropertyTypeDescriptor("plane",PlaneGraphics),point:createPropertyTypeDescriptor("point",PointGraphics),polygon:createPropertyTypeDescriptor("polygon",PolygonGraphics),polyline:createPropertyTypeDescriptor("polyline",PolylineGraphics),polylineVolume:createPropertyTypeDescriptor("polylineVolume",PolylineVolumeGraphics),properties:createPropertyTypeDescriptor("properties",PropertyBag),position:createPositionPropertyDescriptor("position"),rectangle:createPropertyTypeDescriptor("rectangle",RectangleGraphics),viewFrom:createPropertyDescriptor("viewFrom"),wall:createPropertyTypeDescriptor("wall",WallGraphics)}),Entity.prototype.isAvailable=function(e){var t=this._availability;return!defined(t)||t.contains(e)},Entity.prototype.addProperty=function(e){this._propertyNames.push(e),Object.defineProperty(this,e,createRawPropertyDescriptor(e,!0))},Entity.prototype.removeProperty=function(e){var t=this._propertyNames.indexOf(e);this._propertyNames.splice(t,1),delete this[e]},Entity.prototype.merge=function(e){this.name=defaultValue(this.name,e.name),this.availability=defaultValue(this.availability,e.availability);for(var t=this._propertyNames,i=defined(e._propertyNames)?e._propertyNames:Object.keys(e),r=i.length,n=0;n<r;n++){var a,o,s=i[n];"parent"!==s&&"name"!==s&&"availability"!==s&&(a=this[s],o=e[s],defined(a)||-1!==t.indexOf(s)||this.addProperty(s),defined(o)&&(defined(a)?defined(a.merge)&&a.merge(o):defined(o.merge)&&defined(o.clone)?this[s]=o.clone():this[s]=o))}};var matrix3Scratch$1=new Matrix3,positionScratch$5=new Cartesian3,orientationScratch=new Quaternion;Entity.prototype.computeModelMatrix=function(e,t){var i=Property.getValueOrUndefined(this._position,e,positionScratch$5);if(defined(i)){var r=Property.getValueOrUndefined(this._orientation,e,orientationScratch);return t=defined(r)?Matrix4.fromRotationTranslation(Matrix3.fromQuaternion(r,matrix3Scratch$1),i,t):Transforms.eastNorthUpToFixedFrame(i,void 0,t)}},Entity.prototype.computeModelMatrixForHeightReference=function(e,t,i,r,n){var a=Property.getValueOrDefault(t,e,HeightReference$1.NONE),o=Property.getValueOrUndefined(this._position,e,positionScratch$5);if(a===HeightReference$1.NONE||!defined(o)||Cartesian3.equalsEpsilon(o,Cartesian3.ZERO,CesiumMath.EPSILON8))return this.computeModelMatrix(e,n);var s=r.cartesianToCartographic(o,cartoScratch$1);a===HeightReference$1.CLAMP_TO_GROUND?s.height=i:s.height+=i,o=r.cartographicToCartesian(s,o);var l=Property.getValueOrUndefined(this._orientation,e,orientationScratch);return n=defined(l)?Matrix4.fromRotationTranslation(Matrix3.fromQuaternion(l,matrix3Scratch$1),o,n):Transforms.eastNorthUpToFixedFrame(o,void 0,n)},Entity.supportsMaterialsforEntitiesOnTerrain=function(e){return GroundPrimitive.supportsMaterials(e)},Entity.supportsPolylinesOnTerrain=function(e){return GroundPolylinePrimitive.isSupported(e)};var defaultMaterial=new ColorMaterialProperty(Color.WHITE),defaultShow=new ConstantProperty(!0),defaultFill=new ConstantProperty(!0),defaultOutline=new ConstantProperty(!1),defaultOutlineColor=new ConstantProperty(Color.BLACK),defaultShadows=new ConstantProperty(ShadowMode$1.DISABLED),defaultDistanceDisplayCondition=new ConstantProperty(new DistanceDisplayCondition),defaultClassificationType=new ConstantProperty(ClassificationType$1.BOTH);function GeometryUpdater(e){var t=e.entity,i=e.geometryPropertyName;this._entity=t,this._scene=e.scene,this._fillEnabled=!1,this._isClosed=!1,this._onTerrain=!1,this._dynamic=!1,this._outlineEnabled=!1,this._geometryChanged=new Event,this._showProperty=void 0,this._materialProperty=void 0,this._showOutlineProperty=void 0,this._outlineColorProperty=void 0,this._outlineWidth=1,this._shadowsProperty=void 0,this._distanceDisplayConditionProperty=void 0,this._classificationTypeProperty=void 0,this._options=e.geometryOptions,this._geometryPropertyName=i,this._id=i+"-"+t.id,this._observedPropertyNames=e.observedPropertyNames,this._supportsMaterialsforEntitiesOnTerrain=Entity.supportsMaterialsforEntitiesOnTerrain(e.scene)}function CallbackProperty(e,t){this._callback=void 0,this._isConstant=void 0,this._definitionChanged=new Event,this.setCallback(e,t)}Object.defineProperties(GeometryUpdater.prototype,{id:{get:function(){return this._id}},entity:{get:function(){return this._entity}},fillEnabled:{get:function(){return this._fillEnabled}},hasConstantFill:{get:function(){return!this._fillEnabled||!defined(this._entity.availability)&&Property.isConstant(this._showProperty)&&Property.isConstant(this._fillProperty)}},fillMaterialProperty:{get:function(){return this._materialProperty}},outlineEnabled:{get:function(){return this._outlineEnabled}},hasConstantOutline:{get:function(){return!this._outlineEnabled||!defined(this._entity.availability)&&Property.isConstant(this._showProperty)&&Property.isConstant(this._showOutlineProperty)}},outlineColorProperty:{get:function(){return this._outlineColorProperty}},outlineWidth:{get:function(){return this._outlineWidth}},shadowsProperty:{get:function(){return this._shadowsProperty}},distanceDisplayConditionProperty:{get:function(){return this._distanceDisplayConditionProperty}},classificationTypeProperty:{get:function(){return this._classificationTypeProperty}},isDynamic:{get:function(){return this._dynamic}},isClosed:{get:function(){return this._isClosed}},onTerrain:{get:function(){return this._onTerrain}},geometryChanged:{get:function(){return this._geometryChanged}}}),GeometryUpdater.prototype.isOutlineVisible=function(e){var t=this._entity;return defaultValue(this._outlineEnabled&&t.isAvailable(e)&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e),!1)},GeometryUpdater.prototype.isFilled=function(e){var t=this._entity;return defaultValue(this._fillEnabled&&t.isAvailable(e)&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e),!1)},GeometryUpdater.prototype.createFillGeometryInstance=DeveloperError.throwInstantiationError,GeometryUpdater.prototype.createOutlineGeometryInstance=DeveloperError.throwInstantiationError,GeometryUpdater.prototype.isDestroyed=function(){return!1},GeometryUpdater.prototype.destroy=function(){destroyObject(this)},GeometryUpdater.prototype._isHidden=function(e,t){var i=t.show;return defined(i)&&i.isConstant&&!i.getValue(Iso8601.MINIMUM_VALUE)},GeometryUpdater.prototype._isOnTerrain=function(e,t){return!1},GeometryUpdater.prototype._getIsClosed=function(e){return!0},GeometryUpdater.prototype._isDynamic=DeveloperError.throwInstantiationError,GeometryUpdater.prototype._setStaticOptions=DeveloperError.throwInstantiationError,GeometryUpdater.prototype._onEntityPropertyChanged=function(e,t,i,r){var n,a,o,s,l,c,u,d;-1!==this._observedPropertyNames.indexOf(t)&&(defined(n=this._entity[this._geometryPropertyName])?(o=!defined(a=n.fill)||!a.isConstant||a.getValue(Iso8601.MINIMUM_VALUE),(l=defined(s=n.outline))&&s.isConstant&&(l=s.getValue(Iso8601.MINIMUM_VALUE)),o||l?(c=n.show,this._isHidden(e,n)?(this._fillEnabled||this._outlineEnabled)&&(this._fillEnabled=!1,this._outlineEnabled=!1,this._geometryChanged.raiseEvent(this)):(this._materialProperty=defaultValue(n.material,defaultMaterial),this._fillProperty=defaultValue(a,defaultFill),this._showProperty=defaultValue(c,defaultShow),this._showOutlineProperty=defaultValue(n.outline,defaultOutline),this._outlineColorProperty=l?defaultValue(n.outlineColor,defaultOutlineColor):void 0,this._shadowsProperty=defaultValue(n.shadows,defaultShadows),this._distanceDisplayConditionProperty=defaultValue(n.distanceDisplayCondition,defaultDistanceDisplayCondition),this._classificationTypeProperty=defaultValue(n.classificationType,defaultClassificationType),this._fillEnabled=o,u=this._isOnTerrain(e,n)&&(this._supportsMaterialsforEntitiesOnTerrain||this._materialProperty instanceof ColorMaterialProperty),l&&u&&(oneTimeWarning(oneTimeWarning.geometryOutlines),l=!1),this._onTerrain=u,this._outlineEnabled=l,this._isDynamic(e,n)?this._dynamic||(this._dynamic=!0,this._geometryChanged.raiseEvent(this)):(this._setStaticOptions(e,n),this._isClosed=this._getIsClosed(this._options),d=n.outlineWidth,this._outlineWidth=defined(d)?d.getValue(Iso8601.MINIMUM_VALUE):1,this._dynamic=!1,this._geometryChanged.raiseEvent(this)))):(this._fillEnabled||this._outlineEnabled)&&(this._fillEnabled=!1,this._outlineEnabled=!1,this._geometryChanged.raiseEvent(this))):(this._fillEnabled||this._outlineEnabled)&&(this._fillEnabled=!1,this._outlineEnabled=!1,this._geometryChanged.raiseEvent(this)))},GeometryUpdater.prototype.createDynamicUpdater=function(e,t){return new this.constructor.DynamicGeometryUpdater(this,e,t)},Object.defineProperties(CallbackProperty.prototype,{isConstant:{get:function(){return this._isConstant}},definitionChanged:{get:function(){return this._definitionChanged}}}),CallbackProperty.prototype.getValue=function(e,t){return this._callback(e,t)},CallbackProperty.prototype.setCallback=function(e,t){var i=this._callback!==e||this._isConstant!==t;this._callback=e,this._isConstant=t,i&&this._definitionChanged.raiseEvent(this)},CallbackProperty.prototype.equals=function(e){return this===e||e instanceof CallbackProperty&&this._callback===e._callback&&this._isConstant===e._isConstant};var scratchPosition$5=new Cartesian3,scratchCarto=new Cartographic;function TerrainOffsetProperty(e,t,i,r){this._scene=e,this._heightReference=i,this._extrudedHeightReference=r,this._positionProperty=t,this._position=new Cartesian3,this._cartographicPosition=new Cartographic,this._normal=new Cartesian3,this._definitionChanged=new Event,this._terrainHeight=0,this._removeCallbackFunc=void 0,this._removeEventListener=void 0,this._removeModeListener=void 0;var n=this;if(defined(e.globe)&&(this._removeEventListener=e.terrainProviderChanged.addEventListener(function(){n._updateClamping()}),this._removeModeListener=e.morphComplete.addEventListener(function(){n._updateClamping()})),t.isConstant){var a=t.getValue(Iso8601.MINIMUM_VALUE,scratchPosition$5);if(!defined(a)||Cartesian3.equals(a,Cartesian3.ZERO)||!defined(e.globe))return;this._position=Cartesian3.clone(a,this._position),this._updateClamping(),this._normal=e.globe.ellipsoid.geodeticSurfaceNormal(a,this._normal)}}function heightReferenceOnEntityPropertyChanged(e,t,i,r){var n,a,o;GeometryUpdater.prototype._onEntityPropertyChanged.call(this,e,t,i,r),-1===this._observedPropertyNames.indexOf(t)||defined(n=this._entity[this._geometryPropertyName])&&(defined(this._terrainOffsetProperty)&&(this._terrainOffsetProperty.destroy(),this._terrainOffsetProperty=void 0),defined(a=n.heightReference)&&(o=new CallbackProperty(this._computeCenter.bind(this),!this._dynamic),this._terrainOffsetProperty=new TerrainOffsetProperty(this._scene,o,a)))}Object.defineProperties(TerrainOffsetProperty.prototype,{isConstant:{get:function(){return!1}},definitionChanged:{get:function(){return this._definitionChanged}}}),TerrainOffsetProperty.prototype._updateClamping=function(){defined(this._removeCallbackFunc)&&this._removeCallbackFunc();var i,e,r,t,n,a=this._scene,o=a.globe,s=this._position;defined(o)&&!Cartesian3.equals(s,Cartesian3.ZERO)?(i=o.ellipsoid,e=o._surface,r=this,t=i.cartesianToCartographic(s,this._cartographicPosition),defined(n=o.getHeight(t))?this._terrainHeight=n:this._terrainHeight=0,this._removeCallbackFunc=e.updateHeight(t,function(e){var t;a.mode===SceneMode$1.SCENE3D?(t=i.cartesianToCartographic(e,scratchCarto),r._terrainHeight=t.height):r._terrainHeight=e.x,r.definitionChanged.raiseEvent()})):this._terrainHeight=0},TerrainOffsetProperty.prototype.getValue=function(e,t){var i=Property.getValueOrDefault(this._heightReference,e,HeightReference$1.NONE),r=Property.getValueOrDefault(this._extrudedHeightReference,e,HeightReference$1.NONE);if(i===HeightReference$1.NONE&&r!==HeightReference$1.RELATIVE_TO_GROUND)return this._position=Cartesian3.clone(Cartesian3.ZERO,this._position),Cartesian3.clone(Cartesian3.ZERO,t);if(this._positionProperty.isConstant)return Cartesian3.multiplyByScalar(this._normal,this._terrainHeight,t);var n=this._scene,a=this._positionProperty.getValue(e,scratchPosition$5);if(!defined(a)||Cartesian3.equals(a,Cartesian3.ZERO)||!defined(n.globe))return Cartesian3.clone(Cartesian3.ZERO,t);if(Cartesian3.equalsEpsilon(this._position,a,CesiumMath.EPSILON10))return Cartesian3.multiplyByScalar(this._normal,this._terrainHeight,t);this._position=Cartesian3.clone(a,this._position),this._updateClamping();var o=n.globe.ellipsoid.geodeticSurfaceNormal(a,this._normal);return Cartesian3.multiplyByScalar(o,this._terrainHeight,t)},TerrainOffsetProperty.prototype.isDestroyed=function(){return!1},TerrainOffsetProperty.prototype.destroy=function(){return defined(this._removeEventListener)&&this._removeEventListener(),defined(this._removeModeListener)&&this._removeModeListener(),defined(this._removeCallbackFunc)&&this._removeCallbackFunc(),destroyObject(this)};var defaultOffset=Cartesian3.ZERO,offsetScratch$3=new Cartesian3,positionScratch$6=new Cartesian3,scratchColor=new Color;function BoxGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.dimensions=void 0,this.offsetAttribute=void 0}function BoxGeometryUpdater(e,t){GeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new BoxGeometryOptions(e),geometryPropertyName:"box",observedPropertyNames:["availability","position","orientation","box"]}),this._onEntityPropertyChanged(e,"box",e.box,void 0)}function DynamicBoxGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}function ClearCommand(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.color=e.color,this.depth=e.depth,this.stencil=e.stencil,this.renderState=e.renderState,this.framebuffer=e.framebuffer,this.owner=e.owner,this.pass=e.pass}defined(Object.create)&&(BoxGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),BoxGeometryUpdater.prototype.constructor=BoxGeometryUpdater),Object.defineProperties(BoxGeometryUpdater.prototype,{terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}}),BoxGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),a=this._distanceDisplayConditionProperty.getValue(e),o={show:n,distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a),color:void 0,offset:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor)),defined(t)||(t=Color.WHITE),o.color=ColorGeometryInstanceAttribute.fromColor(t)),defined(this._options.offsetAttribute)&&(o.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset,offsetScratch$3))),new GeometryInstance({id:i,geometry:BoxGeometry.fromDimensions(this._options),modelMatrix:i.computeModelMatrixForHeightReference(e,i.box.heightReference,.5*this._options.dimensions.z,this._scene.mapProjection.ellipsoid),attributes:o})},BoxGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor),n=this._distanceDisplayConditionProperty.getValue(e),a={show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n),offset:void 0};return defined(this._options.offsetAttribute)&&(a.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset,offsetScratch$3))),new GeometryInstance({id:t,geometry:BoxOutlineGeometry.fromDimensions(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.box.heightReference,.5*this._options.dimensions.z,this._scene.mapProjection.ellipsoid),attributes:a})},BoxGeometryUpdater.prototype._computeCenter=function(e,t){return Property.getValueOrUndefined(this._entity.position,e,t)},BoxGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.dimensions)||!defined(e.position)||GeometryUpdater.prototype._isHidden.call(this,e,t)},BoxGeometryUpdater.prototype._isDynamic=function(e,t){return!(e.position.isConstant&&Property.isConstant(e.orientation)&&t.dimensions.isConstant&&Property.isConstant(t.outlineWidth))},BoxGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),r=this._options;r.vertexFormat=this._materialProperty instanceof ColorMaterialProperty?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,r.dimensions=t.dimensions.getValue(Iso8601.MINIMUM_VALUE,r.dimensions),r.offsetAttribute=i!==HeightReference$1.NONE?GeometryOffsetAttribute$1.ALL:void 0},BoxGeometryUpdater.prototype._onEntityPropertyChanged=heightReferenceOnEntityPropertyChanged,BoxGeometryUpdater.DynamicGeometryUpdater=DynamicBoxGeometryUpdater,defined(Object.create)&&(DynamicBoxGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicBoxGeometryUpdater.prototype.constructor=DynamicBoxGeometryUpdater),DynamicBoxGeometryUpdater.prototype._isHidden=function(e,t,i){var r=Property.getValueOrUndefined(e.position,i,positionScratch$6),n=this._options.dimensions;return!defined(r)||!defined(n)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicBoxGeometryUpdater.prototype._setOptions=function(e,t,i){var r=Property.getValueOrDefault(t.heightReference,i,HeightReference$1.NONE),n=this._options;n.dimensions=Property.getValueOrUndefined(t.dimensions,i,n.dimensions),n.offsetAttribute=r!==HeightReference$1.NONE?GeometryOffsetAttribute$1.ALL:void 0},ClearCommand.ALL=Object.freeze(new ClearCommand({color:new Color(0,0,0,0),depth:1,stencil:0})),ClearCommand.prototype.execute=function(e,t){e.clear(this,t)};var Axis={X:0,Y:1,Z:2};Axis.Y_UP_TO_Z_UP=Matrix4.fromRotationTranslation(Matrix3.fromRotationX(CesiumMath.PI_OVER_TWO)),Axis.Z_UP_TO_Y_UP=Matrix4.fromRotationTranslation(Matrix3.fromRotationX(-CesiumMath.PI_OVER_TWO)),Axis.X_UP_TO_Z_UP=Matrix4.fromRotationTranslation(Matrix3.fromRotationY(-CesiumMath.PI_OVER_TWO)),Axis.Z_UP_TO_X_UP=Matrix4.fromRotationTranslation(Matrix3.fromRotationY(CesiumMath.PI_OVER_TWO)),Axis.X_UP_TO_Y_UP=Matrix4.fromRotationTranslation(Matrix3.fromRotationZ(CesiumMath.PI_OVER_TWO)),Axis.Y_UP_TO_X_UP=Matrix4.fromRotationTranslation(Matrix3.fromRotationZ(-CesiumMath.PI_OVER_TWO)),Axis.fromName=function(e){return Axis[e]};var Axis$1=Object.freeze(Axis),AttributeType={SCALAR:"SCALAR",VEC2:"VEC2",VEC3:"VEC3",VEC4:"VEC4",MAT2:"MAT2",MAT3:"MAT3",MAT4:"MAT4"},AttributeType$1=Object.freeze(AttributeType),Cesium3DTileColorBlendMode={HIGHLIGHT:0,REPLACE:1,MIX:2},Cesium3DTileColorBlendMode$1=Object.freeze(Cesium3DTileColorBlendMode),ComponentsPerAttribute={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},ClassPerType={SCALAR:void 0,VEC2:Cartesian2,VEC3:Cartesian3,VEC4:Cartesian4,MAT2:Matrix2,MAT3:Matrix3,MAT4:Matrix4};function getBinaryAccessor(e){var t=e.componentType,r="string"==typeof t?ComponentDatatype$1.fromName(t):t,n=ComponentsPerAttribute[e.type],i=ClassPerType[e.type];return{componentsPerAttribute:n,classType:i,createArrayBufferView:function(e,t,i){return ComponentDatatype$1.createArrayBufferView(r,e,t,n*i)}}}var DEFAULT_COLOR_VALUE=Color.WHITE,DEFAULT_SHOW_VALUE=!0;function Cesium3DTileBatchTable(e,t,i,r,n){var a;this.featuresLength=t,this._translucentFeaturesLength=0,defined(i)&&(a=i.extensions),this._extensions=defaultValue(a,{});var o,s,l,c,u,d,h,p,m=initializeProperties(i);this._properties=m,this._batchTableHierarchy=initializeHierarchy(this,i,r),this._batchTableBinaryProperties=getBinaryProperties(t,m,r),this._showAlphaProperties=void 0,this._batchValues=void 0,this._batchValuesDirty=!1,this._batchTexture=void 0,this._defaultTexture=void 0,this._pickTexture=void 0,this._pickIds=[],this._content=e,this._colorChangedCallback=n,0<t&&(c=.5*(l=1/(o=Math.min(t,ContextLimits.maximumTextureSize))),d=.5*(u=1/(s=Math.ceil(t/ContextLimits.maximumTextureSize))),h=new Cartesian2(o,s),p=new Cartesian4(l,c,u,d)),this._textureDimensions=h,this._textureStep=p}function initializeProperties(e){var t={};if(!defined(e))return t;for(var i in e)e.hasOwnProperty(i)&&"HIERARCHY"!==i&&"extensions"!==i&&"extras"!==i&&(t[i]=clone(e[i],!0));return t}function initializeHierarchy(e,t,i){if(defined(t)){var r=e._extensions["3DTILES_batch_table_hierarchy"],n=t.HIERARCHY;if(defined(n)&&(Cesium3DTileBatchTable._deprecationWarning("batchTableHierarchyExtension","The batch table HIERARCHY property has been moved to an extension. Use extensions.3DTILES_batch_table_hierarchy instead."),r=e._extensions["3DTILES_batch_table_hierarchy"]=n),defined(r))return initializeHierarchyValues(r,i)}}function initializeHierarchyValues(e,t){var i,r,n=e.instancesLength,a=e.classes,o=e.classIds,s=e.parentCounts,l=e.parentIds,c=n;if(defined(o.byteOffset)&&(o.componentType=defaultValue(o.componentType,ComponentDatatype$1.UNSIGNED_SHORT),o.type=AttributeType$1.SCALAR,o=getBinaryAccessor(o).createArrayBufferView(t.buffer,t.byteOffset+o.byteOffset,n)),defined(s))for(defined(s.byteOffset)&&(s.componentType=defaultValue(s.componentType,ComponentDatatype$1.UNSIGNED_SHORT),s.type=AttributeType$1.SCALAR,s=getBinaryAccessor(s).createArrayBufferView(t.buffer,t.byteOffset+s.byteOffset,n)),r=new Uint16Array(n),d=c=0;d<n;++d)r[d]=c,c+=s[d];defined(l)&&defined(l.byteOffset)&&(l.componentType=defaultValue(l.componentType,ComponentDatatype$1.UNSIGNED_SHORT),l.type=AttributeType$1.SCALAR,l=getBinaryAccessor(l).createArrayBufferView(t.buffer,t.byteOffset+l.byteOffset,c));for(var u=a.length,d=0;d<u;++d){var h=a[d].length,p=a[d].instances,m=getBinaryProperties(h,p,t);a[d].instances=combine(m,p)}var f=arrayFill(new Array(u),0),g=new Uint16Array(n);for(d=0;d<n;++d)i=o[d],g[d]=f[i],++f[i];return{classes:a,classIds:o,classIndexes:g,parentCounts:s,parentIndexes:r,parentIds:l}}function getBinaryProperties(e,t,i){var r;for(var n in t)if(t.hasOwnProperty(n)){var a=t[n],o=a.byteOffset;if(defined(o)){var s=a.componentType,l=a.type;if(!defined(s))throw new RuntimeError("componentType is required.");if(!defined(l))throw new RuntimeError("type is required.");if(!defined(i))throw new RuntimeError("Property "+n+" requires a batch table binary.");var c=getBinaryAccessor(a),u=c.componentsPerAttribute,d=c.classType,h=c.createArrayBufferView(i.buffer,i.byteOffset+o,e);defined(r)||(r={}),r[n]={typedArray:h,componentCount:u,type:d}}}return r}function getByteLength(e){var t=e._textureDimensions;return t.x*t.y*4}function getBatchValues(e){var t,i;return defined(e._batchValues)||(t=getByteLength(e),arrayFill(i=new Uint8Array(t),255),e._batchValues=i),e._batchValues}function getShowAlphaProperties(e){var t,i;return defined(e._showAlphaProperties)||(t=2*e.featuresLength,arrayFill(i=new Uint8Array(t),255),e._showAlphaProperties=i),e._showAlphaProperties}Cesium3DTileBatchTable._deprecationWarning=deprecationWarning,Object.defineProperties(Cesium3DTileBatchTable.prototype,{memorySizeInBytes:{get:function(){var e=0;return defined(this._pickTexture)&&(e+=this._pickTexture.sizeInBytes),defined(this._batchTexture)&&(e+=this._batchTexture.sizeInBytes),e}}}),Cesium3DTileBatchTable.getBinaryProperties=function(e,t,i){return getBinaryProperties(e,t,i)},Cesium3DTileBatchTable.prototype.setShow=function(e,t){var i,r,n;t&&!defined(this._showAlphaProperties)||(n=t?255:0,(i=getShowAlphaProperties(this))[r=2*e]!==n&&(i[r]=n,getBatchValues(this)[4*e+3]=t?i[1+r]:0,this._batchValuesDirty=!0))},Cesium3DTileBatchTable.prototype.setAllShow=function(e){for(var t=this.featuresLength,i=0;i<t;++i)this.setShow(i,e)},Cesium3DTileBatchTable.prototype.getShow=function(e){if(!defined(this._showAlphaProperties))return!0;var t=2*e;return 255===this._showAlphaProperties[t]};var scratchColorBytes=new Array(4);Cesium3DTileBatchTable.prototype.setColor=function(e,t){var i,r,n,a,o,s,l,c,u;Color.equals(t,DEFAULT_COLOR_VALUE)&&!defined(this._batchValues)||(r=(i=t.toBytes(scratchColorBytes))[3],n=getBatchValues(this),a=4*e,o=getShowAlphaProperties(this),s=2*e,n[a]===i[0]&&n[1+a]===i[1]&&n[2+a]===i[2]&&o[1+s]===r||(n[a]=i[0],n[1+a]=i[1],n[2+a]=i[2],l=255!==o[1+s],c=0!==o[s],n[3+a]=c?r:0,(u=255!==(o[1+s]=r))&&!l?++this._translucentFeaturesLength:!u&&l&&--this._translucentFeaturesLength,this._batchValuesDirty=!0,defined(this._colorChangedCallback)&&this._colorChangedCallback(e,t)))},Cesium3DTileBatchTable.prototype.setAllColor=function(e){for(var t=this.featuresLength,i=0;i<t;++i)this.setColor(i,e)},Cesium3DTileBatchTable.prototype.getColor=function(e,t){if(!defined(this._batchValues))return Color.clone(DEFAULT_COLOR_VALUE,t);var i=this._batchValues,r=4*e,n=this._showAlphaProperties,a=2*e;return Color.fromBytes(i[r],i[1+r],i[2+r],n[1+a],t)},Cesium3DTileBatchTable.prototype.getPickColor=function(e){return this._pickIds[e]};var scratchColor$1=new Color;function getBinaryProperty(e,t){var i=e.typedArray,r=e.componentCount;return 1===r?i[t]:e.type.unpack(i,t*r)}function setBinaryProperty(e,t,i){var r=e.typedArray,n=e.componentCount;1===n?r[t]=i:e.type.pack(i,r,t*n)}Cesium3DTileBatchTable.prototype.applyStyle=function(e){if(!defined(e))return this.setAllColor(DEFAULT_COLOR_VALUE),void this.setAllShow(DEFAULT_SHOW_VALUE);for(var t=this._content,i=this.featuresLength,r=0;r<i;++r){var n=t.getFeature(r),a=defined(e.color)?e.color.evaluateColor(n,scratchColor$1):DEFAULT_COLOR_VALUE,o=defined(e.show)?e.show.evaluate(n):DEFAULT_SHOW_VALUE;this.setColor(r,a),this.setShow(r,o)}};var scratchVisited=[],scratchStack=[],marker=0;function traverseHierarchyMultipleParents(e,t,i){var r=e.classIds,n=e.parentCounts,a=e.parentIds,o=e.parentIndexes,s=r.length,l=scratchVisited;l.length=Math.max(l.length,s);var c=++marker,u=scratchStack;for(u.length=0,u.push(t);0<u.length;)if(l[t=u.pop()]!==c){l[t]=c;var d=i(e,t);if(defined(d))return d;for(var h=n[t],p=o[t],m=0;m<h;++m){var f=a[p+m];f!==t&&u.push(f)}}}function traverseHierarchySingleParent(e,t,i){for(var r=!0;r;){var n=i(e,t);if(defined(n))return n;var a=e.parentIds[t],r=a!==t;t=a}}function traverseHierarchy(e,t,i){var r=e.parentCounts;return defined(e.parentIds)?(defined(r)?traverseHierarchyMultipleParents:traverseHierarchySingleParent)(e,t,i):i(e,t)}function hasPropertyInHierarchy(e,t,r){var i=traverseHierarchy(e._batchTableHierarchy,t,function(e,t){var i=e.classIds[t];if(defined(e.classes[i].instances[r]))return!0});return defined(i)}function getPropertyNamesInHierarchy(e,t,a){traverseHierarchy(e._batchTableHierarchy,t,function(e,t){var i=e.classIds[t],r=e.classes[i].instances;for(var n in r)r.hasOwnProperty(n)&&-1===a.indexOf(n)&&a.push(n)})}function getHierarchyProperty(e,t,o){return traverseHierarchy(e._batchTableHierarchy,t,function(e,t){var i=e.classIds[t],r=e.classes[i],n=e.classIndexes[t],a=r.instances[o];if(defined(a))return defined(a.typedArray)?getBinaryProperty(a,n):clone(a[n],!0)})}function setHierarchyProperty(e,t,o,s){var i=traverseHierarchy(e._batchTableHierarchy,t,function(e,t){var i=e.classIds[t],r=e.classes[i],n=e.classIndexes[t],a=r.instances[o];if(defined(a))return defined(a.typedArray)?setBinaryProperty(a,n,s):a[n]=clone(s,!0),!0});return defined(i)}function getGlslComputeSt$1(e){return 1===e._textureDimensions.y?"uniform vec4 tile_textureStep; \nvec2 computeSt(float batchId) \n{ \n float stepX = tile_textureStep.x; \n float centerX = tile_textureStep.y; \n return vec2(centerX + (batchId * stepX), 0.5); \n} \n":"uniform vec4 tile_textureStep; \nuniform vec2 tile_textureDimensions; \nvec2 computeSt(float batchId) \n{ \n float stepX = tile_textureStep.x; \n float centerX = tile_textureStep.y; \n float stepY = tile_textureStep.z; \n float centerY = tile_textureStep.w; \n float xId = mod(batchId, tile_textureDimensions.x); \n float yId = floor(batchId / tile_textureDimensions.x); \n return vec2(centerX + (xId * stepX), centerY + (yId * stepY)); \n} \n"}function getDefaultShader(e,t){return e=ShaderSource.replaceMain(e,"tile_main"),t?e+"uniform float tile_colorBlend; \nvoid tile_color(vec4 tile_featureColor) \n{ \n tile_main(); \n tile_featureColor = czm_gammaCorrect(tile_featureColor); \n gl_FragColor.a *= tile_featureColor.a; \n float highlight = ceil(tile_colorBlend); \n gl_FragColor.rgb *= mix(tile_featureColor.rgb, vec3(1.0), highlight); \n} \n":e+"void tile_color(vec4 tile_featureColor) \n{ \n tile_main(); \n} \n"}function replaceDiffuseTextureCalls(e,t){for(var i,r,n="texture2D("+t,a=e.indexOf(n,0);-1<a;){for(var o=0,s=a;s<e.length;++s){var l=e.charAt(s);if("("===l)++o;else if(")"===l&&0===--o){r=s+1;break}}var c="tile_diffuse_final("+e.slice(a,r)+", tile_diffuse)";e=e.slice(0,a)+c+e.slice(r),i=a+c.length,a=e.indexOf(n,i)}return e}function modifyDiffuse(e,t,i){if(!defined(t))return getDefaultShader(e,i);var r=new RegExp("(uniform|attribute|in)\\s+(vec[34]|sampler2D)\\s+"+t+";"),n=e.match(r);if(!defined(n))return getDefaultShader(e,i);var a=n[0],o=n[2];e=(e=ShaderSource.replaceMain(e,"tile_main")).replace(a,"");var s,l,c;return"vec3"===o||"vec4"===o?(l="vec3"===o?"vec4("+t+", 1.0)":t,c="vec3"===o?"tile_diffuse.xyz":"tile_diffuse",r=new RegExp(t,"g"),e=e.replace(r,c),s=" vec4 source = "+l+"; \n tile_diffuse = tile_diffuse_final(source, tile_featureColor); \n tile_main(); \n"):"sampler2D"===o&&(e=replaceDiffuseTextureCalls(e,t),s=" tile_diffuse = tile_featureColor; \n tile_main(); \n"),e="uniform float tile_colorBlend; \nvec4 tile_diffuse = vec4(1.0); \nbool isWhite(vec3 color) \n{ \n return all(greaterThan(color, vec3(1.0 - czm_epsilon3))); \n} \nvec4 tile_diffuse_final(vec4 sourceDiffuse, vec4 tileDiffuse) \n{ \n vec4 blendDiffuse = mix(sourceDiffuse, tileDiffuse, tile_colorBlend); \n vec4 diffuse = isWhite(tileDiffuse.rgb) ? sourceDiffuse : blendDiffuse; \n return vec4(diffuse.rgb, sourceDiffuse.a); \n} \n"+a+"\n"+e+"\nvoid tile_color(vec4 tile_featureColor) \n{ \n"+s,i&&(e+=" tile_featureColor = czm_gammaCorrect(tile_featureColor); \n gl_FragColor.a *= tile_featureColor.a; \n float highlight = ceil(tile_colorBlend); \n gl_FragColor.rgb *= mix(tile_featureColor.rgb, vec3(1.0), highlight); \n"),e+="} \n"}function getColorBlend(e){var t=e._content.tileset,i=t.colorBlendMode,r=t.colorBlendAmount;return i===Cesium3DTileColorBlendMode$1.HIGHLIGHT?0:i===Cesium3DTileColorBlendMode$1.REPLACE?1:i===Cesium3DTileColorBlendMode$1.MIX?CesiumMath.clamp(r,CesiumMath.EPSILON4,1):void 0}Cesium3DTileBatchTable.prototype.isClass=function(e,r){var t=this._batchTableHierarchy;return!!defined(t)&&defined(traverseHierarchy(t,e,function(e,t){var i=e.classIds[t];if(e.classes[i].name===r)return!0}))},Cesium3DTileBatchTable.prototype.isExactClass=function(e,t){return this.getExactClassName(e)===t},Cesium3DTileBatchTable.prototype.getExactClassName=function(e){var t=this._batchTableHierarchy;if(defined(t)){var i=t.classIds[e];return t.classes[i].name}},Cesium3DTileBatchTable.prototype.hasProperty=function(e,t){return defined(this._properties[t])||defined(this._batchTableHierarchy)&&hasPropertyInHierarchy(this,e,t)},Cesium3DTileBatchTable.prototype.getPropertyNames=function(e,t){(t=defined(t)?t:[]).length=0;var i=Object.keys(this._properties);return t.push.apply(t,i),defined(this._batchTableHierarchy)&&getPropertyNamesInHierarchy(this,e,t),t},Cesium3DTileBatchTable.prototype.getProperty=function(e,t){if(defined(this._batchTableBinaryProperties)){var i=this._batchTableBinaryProperties[t];if(defined(i))return getBinaryProperty(i,e)}var r=this._properties[t];if(defined(r))return clone(r[e],!0);if(defined(this._batchTableHierarchy)){var n=getHierarchyProperty(this,e,t);if(defined(n))return n}},Cesium3DTileBatchTable.prototype.setProperty=function(e,t,i){var r,n=this.featuresLength;if(defined(this._batchTableBinaryProperties)){var a=this._batchTableBinaryProperties[t];if(defined(a))return void setBinaryProperty(a,e,i)}defined(this._batchTableHierarchy)&&setHierarchyProperty(this,e,t,i)||(defined(r=this._properties[t])||(this._properties[t]=new Array(n),r=this._properties[t]),r[e]=clone(i,!0))},Cesium3DTileBatchTable.prototype.getVertexShaderCallback=function(r,n,a){if(0!==this.featuresLength){var o=this;return function(e){var t,i=modifyDiffuse(e,a,!1);return 0<ContextLimits.maximumVertexTextureImageUnits?(t="",r&&(t+="uniform bool tile_translucentCommand; \n"),t+="uniform sampler2D tile_batchTexture; \nvarying vec4 tile_featureColor; \nvarying vec2 tile_featureSt; \nvoid main() \n{ \n vec2 st = computeSt("+n+"); \n vec4 featureProperties = texture2D(tile_batchTexture, st); \n tile_color(featureProperties); \n float show = ceil(featureProperties.a); \n gl_Position *= show; \n",r&&(t+=" bool isStyleTranslucent = (featureProperties.a != 1.0); \n if (czm_pass == czm_passTranslucent) \n { \n if (!isStyleTranslucent && !tile_translucentCommand) \n { \n gl_Position *= 0.0; \n } \n } \n else \n { \n if (isStyleTranslucent) \n { \n gl_Position *= 0.0; \n } \n } \n"),t+=" tile_featureColor = featureProperties; \n tile_featureSt = st; \n}"):t="varying vec2 tile_featureSt; \nvoid main() \n{ \n tile_color(vec4(1.0)); \n tile_featureSt = computeSt("+n+"); \n}",i+"\n"+getGlslComputeSt$1(o)+t}}},Cesium3DTileBatchTable.prototype.getFragmentShaderCallback=function(t,i){if(0!==this.featuresLength)return function(e){return e=modifyDiffuse(e,i,!0),0<ContextLimits.maximumVertexTextureImageUnits?e+="uniform sampler2D tile_pickTexture; \nvarying vec2 tile_featureSt; \nvarying vec4 tile_featureColor; \nvoid main() \n{ \n tile_color(tile_featureColor); \n}":(t&&(e+="uniform bool tile_translucentCommand; \n"),e+="uniform sampler2D tile_pickTexture; \nuniform sampler2D tile_batchTexture; \nvarying vec2 tile_featureSt; \nvoid main() \n{ \n vec4 featureProperties = texture2D(tile_batchTexture, tile_featureSt); \n if (featureProperties.a == 0.0) { \n discard; \n } \n",t&&(e+=" bool isStyleTranslucent = (featureProperties.a != 1.0); \n if (czm_pass == czm_passTranslucent) \n { \n if (!isStyleTranslucent && !tile_translucentCommand) \n { \n discard; \n } \n } \n else \n { \n if (isStyleTranslucent) \n { \n discard; \n } \n } \n"),e+=" tile_color(featureProperties); \n} \n"),e}},Cesium3DTileBatchTable.prototype.getClassificationFragmentShaderCallback=function(){if(0!==this.featuresLength)return function(e){return e=ShaderSource.replaceMain(e,"tile_main"),0<ContextLimits.maximumVertexTextureImageUnits?e+="uniform sampler2D tile_pickTexture;\nvarying vec2 tile_featureSt; \nvarying vec4 tile_featureColor; \nvoid main() \n{ \n tile_main(); \n gl_FragColor = tile_featureColor; \n}":e+="uniform sampler2D tile_batchTexture; \nuniform sampler2D tile_pickTexture;\nvarying vec2 tile_featureSt; \nvoid main() \n{ \n tile_main(); \n vec4 featureProperties = texture2D(tile_batchTexture, tile_featureSt); \n if (featureProperties.a == 0.0) { \n discard; \n } \n gl_FragColor = featureProperties; \n} \n",e}},Cesium3DTileBatchTable.prototype.getUniformMapCallback=function(){if(0!==this.featuresLength){var t=this;return function(e){return combine(e,{tile_batchTexture:function(){return defaultValue(t._batchTexture,t._defaultTexture)},tile_textureDimensions:function(){return t._textureDimensions},tile_textureStep:function(){return t._textureStep},tile_colorBlend:function(){return getColorBlend(t)},tile_pickTexture:function(){return t._pickTexture}})}}},Cesium3DTileBatchTable.prototype.getPickId=function(){return"texture2D(tile_pickTexture, tile_featureSt)"};var StyleCommandsNeeded={ALL_OPAQUE:0,ALL_TRANSLUCENT:1,OPAQUE_AND_TRANSLUCENT:2};function getStyleCommandsNeeded(e){var t=e._translucentFeaturesLength;return 0===t?StyleCommandsNeeded.ALL_OPAQUE:t===e.featuresLength?StyleCommandsNeeded.ALL_TRANSLUCENT:StyleCommandsNeeded.OPAQUE_AND_TRANSLUCENT}function deriveCommand(e){var t=DrawCommand.shallowClone(e),i=t.pass===Pass$1.TRANSLUCENT;return t.uniformMap=defined(t.uniformMap)?t.uniformMap:{},t.uniformMap.tile_translucentCommand=function(){return i},t}function deriveTranslucentCommand(e){var t=DrawCommand.shallowClone(e);return t.pass=Pass$1.TRANSLUCENT,t.renderState=getTranslucentRenderState(e.renderState),t}function deriveOpaqueCommand(e){var t=DrawCommand.shallowClone(e);return t.renderState=getOpaqueRenderState(e.renderState),t}function getLogDepthPolygonOffsetFragmentShaderProgram(e,t){var i,r=e.shaderCache.getDerivedShaderProgram(t,"zBackfaceLogDepth");return defined(r)||((i=t.fragmentShaderSource.clone()).defines=defined(i.defines)?i.defines.slice(0):[],i.defines.push("POLYGON_OFFSET"),i.sources.unshift("#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\n"),r=e.shaderCache.createDerivedShaderProgram(t,"zBackfaceLogDepth",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:i,attributeLocations:t._attributeLocations})),r}function deriveZBackfaceCommand(e,t){var i=DrawCommand.shallowClone(t),r=clone(i.renderState,!0);r.cull.enabled=!0,r.cull.face=CullFace$1.FRONT,r.colorMask={red:!1,green:!1,blue:!1,alpha:!1},r.polygonOffset={enabled:!0,factor:5,units:5},r.stencilTest=StencilConstants$1.setCesium3DTileBit(),r.stencilMask=StencilConstants$1.CESIUM_3D_TILE_MASK,i.renderState=RenderState.fromCache(r),i.castShadows=!1,i.receiveShadows=!1,i.uniformMap=clone(t.uniformMap);var n=new Cartesian2(5,5);return i.uniformMap.u_polygonOffset=function(){return n},i.shaderProgram=getLogDepthPolygonOffsetFragmentShaderProgram(e,t.shaderProgram),i}function deriveStencilCommand(e,t){var i=DrawCommand.shallowClone(e),r=clone(i.renderState,!0);return r.stencilTest.enabled=!0,r.stencilTest.mask=StencilConstants$1.SKIP_LOD_MASK,r.stencilTest.reference=StencilConstants$1.CESIUM_3D_TILE_MASK|t<<StencilConstants$1.SKIP_LOD_BIT_SHIFT,r.stencilTest.frontFunction=StencilFunction$1.GREATER_OR_EQUAL,r.stencilTest.frontOperation.zPass=StencilOperation$1.REPLACE,r.stencilTest.backFunction=StencilFunction$1.GREATER_OR_EQUAL,r.stencilTest.backOperation.zPass=StencilOperation$1.REPLACE,r.stencilMask=StencilConstants$1.CESIUM_3D_TILE_MASK|StencilConstants$1.SKIP_LOD_MASK,i.renderState=RenderState.fromCache(r),i}function getLastSelectionDepth(e){return(e.renderState.stencilTest.reference&StencilConstants$1.SKIP_LOD_MASK)>>>StencilConstants$1.SKIP_LOD_BIT_SHIFT}function getTranslucentRenderState(e){var t=clone(e,!0);return t.cull.enabled=!1,t.depthTest.enabled=!0,t.depthMask=!1,t.blending=BlendingState$1.ALPHA_BLEND,RenderState.fromCache(t)}function getOpaqueRenderState(e){var t=clone(e,!0);return t.stencilTest=StencilConstants$1.setCesium3DTileBit(),t.stencilMask=StencilConstants$1.CESIUM_3D_TILE_MASK,RenderState.fromCache(t)}function createTexture$1(e,t,i){var r=e._textureDimensions;return new Texture({context:t,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,source:{width:r.x,height:r.y,arrayBufferView:i},flipY:!1,sampler:Sampler.NEAREST})}function createPickTexture(e,t){var i=e.featuresLength;if(!defined(e._pickTexture)&&0<i){for(var r=e._pickIds,n=getByteLength(e),a=new Uint8Array(n),o=e._content,s=0;s<i;++s){var l=t.createPickId(o.getFeature(s));r.push(l);var c=l.color,u=4*s;a[u]=Color.floatToByte(c.red),a[1+u]=Color.floatToByte(c.green),a[2+u]=Color.floatToByte(c.blue),a[3+u]=Color.floatToByte(c.alpha)}e._pickTexture=createTexture$1(e,t,a),o.tileset._statistics.batchTableByteLength+=e._pickTexture.sizeInBytes}}function updateBatchTexture(e){var t=e._textureDimensions;e._batchTexture.copyFrom({width:t.x,height:t.y,arrayBufferView:e._batchValues})}function Cesium3DTileFeature(e,t){this._content=e,this._batchId=t,this._color=void 0}function Cesium3DTileFeatureTable(e,t){this.json=e,this.buffer=t,this._cachedTypedArrays={},this.featuresLength=0}function getTypedArrayFromBinary(e,t,i,r,n,a){var o=e._cachedTypedArrays,s=o[t];return defined(s)||(s=ComponentDatatype$1.createArrayBufferView(i,e.buffer.buffer,e.buffer.byteOffset+a,n*r),o[t]=s),s}function getTypedArrayFromArray(e,t,i,r){var n=e._cachedTypedArrays,a=n[t];return defined(a)||(a=ComponentDatatype$1.createTypedArray(i,r),n[t]=a),a}function addToArray(e,t,i){if(i=defaultValue(i,!1)){var r=e.indexOf(t);if(-1<r)return r}return e.push(t),e.length-1}function hasExtension(e,t){return defined(e.extensionsUsed)&&0<=e.extensionsUsed.indexOf(t)}function ForEach(){}function numberOfComponentsForType(e){switch(e){case"SCALAR":return 1;case"VEC2":return 2;case"VEC3":return 3;case"VEC4":case"MAT2":return 4;case"MAT3":return 9;case"MAT4":return 16}}function getAccessorByteStride(e,t){var i=t.bufferView;if(defined(i)){var r=e.bufferViews[i];if(defined(r.byteStride)&&0<r.byteStride)return r.byteStride}return ComponentDatatype$1.getSizeInBytes(t.componentType)*numberOfComponentsForType(t.type)}function addDefaults(n){ForEach.accessor(n,function(e){defined(e.bufferView)&&(e.byteOffset=defaultValue(e.byteOffset,0))}),ForEach.bufferView(n,function(e){defined(e.buffer)&&(e.byteOffset=defaultValue(e.byteOffset,0))}),ForEach.mesh(n,function(e){ForEach.meshPrimitive(e,function(e){e.mode=defaultValue(e.mode,WebGLConstants$1.TRIANGLES),defined(e.material)||(defined(n.materials)||(n.materials=[]),e.material=addToArray(n.materials,{name:"default"}))})}),ForEach.accessorContainingVertexAttributeData(n,function(e){var t,i=n.accessors[e],r=i.bufferView;i.normalized=defaultValue(i.normalized,!1),defined(r)&&((t=n.bufferViews[r]).byteStride=getAccessorByteStride(n,i),t.target=WebGLConstants$1.ARRAY_BUFFER)}),ForEach.accessorContainingIndexData(n,function(e){var t=n.accessors[e].bufferView;defined(t)&&(n.bufferViews[t].target=WebGLConstants$1.ELEMENT_ARRAY_BUFFER)}),ForEach.material(n,function(e){var t=defaultValue(e.extensions,defaultValue.EMPTY_OBJECT),i=t.KHR_materials_common;if(defined(i)){var r=i.technique,n=defined(i.values)?i.values:{};return(i.values=n).ambient=defined(n.ambient)?n.ambient:[0,0,0,1],n.emission=defined(n.emission)?n.emission:[0,0,0,1],n.transparency=defaultValue(n.transparency,1),n.transparent=defaultValue(n.transparent,!1),n.doubleSided=defaultValue(n.doubleSided,!1),void("CONSTANT"!==r&&(n.diffuse=defined(n.diffuse)?n.diffuse:[0,0,0,1],"LAMBERT"!==r&&(n.specular=defined(n.specular)?n.specular:[0,0,0,1],n.shininess=defaultValue(n.shininess,0))))}e.emissiveFactor=defaultValue(e.emissiveFactor,[0,0,0]),e.alphaMode=defaultValue(e.alphaMode,"OPAQUE"),e.doubleSided=defaultValue(e.doubleSided,!1),"MASK"===e.alphaMode&&(e.alphaCutoff=defaultValue(e.alphaCutoff,.5)),defined(t.KHR_techniques_webgl)&&ForEach.materialValue(e,function(e){defined(e.index)&&addTextureDefaults(e)}),addTextureDefaults(e.emissiveTexture),addTextureDefaults(e.normalTexture),addTextureDefaults(e.occlusionTexture);var a=e.pbrMetallicRoughness;defined(a)&&(a.baseColorFactor=defaultValue(a.baseColorFactor,[1,1,1,1]),a.metallicFactor=defaultValue(a.metallicFactor,1),a.roughnessFactor=defaultValue(a.roughnessFactor,1),addTextureDefaults(a.baseColorTexture),addTextureDefaults(a.metallicRoughnessTexture));var o=t.pbrSpecularGlossiness;defined(o)&&(o.diffuseFactor=defaultValue(o.diffuseFactor,[1,1,1,1]),o.specularFactor=defaultValue(o.specularFactor,[1,1,1]),o.glossinessFactor=defaultValue(o.glossinessFactor,1),addTextureDefaults(o.specularGlossinessTexture))}),ForEach.animation(n,function(e){ForEach.animationSampler(e,function(e){e.interpolation=defaultValue(e.interpolation,"LINEAR")})});var i=getAnimatedNodes(n);return ForEach.node(n,function(e,t){defined(i[t])||defined(e.translation)||defined(e.rotation)||defined(e.scale)?(e.translation=defaultValue(e.translation,[0,0,0]),e.rotation=defaultValue(e.rotation,[0,0,0,1]),e.scale=defaultValue(e.scale,[1,1,1])):e.matrix=defaultValue(e.matrix,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}),ForEach.sampler(n,function(e){e.wrapS=defaultValue(e.wrapS,WebGLConstants$1.REPEAT),e.wrapT=defaultValue(e.wrapT,WebGLConstants$1.REPEAT)}),defined(n.scenes)&&!defined(n.scene)&&(n.scene=0),n}function getAnimatedNodes(e){var n={};return ForEach.animation(e,function(e){ForEach.animationChannel(e,function(e){var t=e.target,i=t.node,r=t.path;"translation"!==r&&"rotation"!==r&&"scale"!==r||(n[i]=!0)})}),n}function addTextureDefaults(e){defined(e)&&(e.texCoord=defaultValue(e.texCoord,0))}function addPipelineExtras(e){return ForEach.shader(e,function(e){addExtras(e)}),ForEach.buffer(e,function(e){addExtras(e)}),ForEach.image(e,function(e){addExtras(e),ForEach.compressedImage(e,function(e){addExtras(e)})}),addExtras(e),e}function addExtras(e){e.extras=defined(e.extras)?e.extras:{},e.extras._pipeline=defined(e.extras._pipeline)?e.extras._pipeline:{}}function removeExtensionsRequired(e,t){var i,r=e.extensionsRequired;defined(r)&&(0<=(i=r.indexOf(t))&&r.splice(i,1),0===r.length&&delete e.extensionsRequired)}function removeExtensionsUsed(e,t){var i,r=e.extensionsUsed;defined(r)&&(0<=(i=r.indexOf(t))&&r.splice(i,1),removeExtensionsRequired(e,t),0===r.length&&delete e.extensionsUsed)}Cesium3DTileBatchTable.prototype.addDerivedCommands=function(e,t){for(var i=e.commandList,r=i.length,n=this._content._tile,a=n._finalResolution,o=n.tileset,s=o._skipLevelOfDetail&&o._hasMixedContent&&e.context.stencilBuffer,l=getStyleCommandsNeeded(this),c=t;c<r;++c){var u=i[c],d=u.derivedCommands.tileset;defined(d)&&!u.dirty||(d={},(u.derivedCommands.tileset=d).originalCommand=deriveCommand(u),u.dirty=!1);var h=d.originalCommand;l!==StyleCommandsNeeded.ALL_OPAQUE&&u.pass!==Pass$1.TRANSLUCENT&&(defined(d.translucent)||(d.translucent=deriveTranslucentCommand(h))),l!==StyleCommandsNeeded.ALL_TRANSLUCENT&&u.pass!==Pass$1.TRANSLUCENT&&(defined(d.opaque)||(d.opaque=deriveOpaqueCommand(h)),s&&(a||(defined(d.zback)||(d.zback=deriveZBackfaceCommand(e.context,h)),o._backfaceCommands.push(d.zback)),defined(d.stencil)&&n._selectionDepth===getLastSelectionDepth(d.stencil)||(u.renderState.depthMask?d.stencil=deriveStencilCommand(h,n._selectionDepth):d.stencil=d.opaque)));var p=s?d.stencil:d.opaque,m=d.translucent;u.pass!==Pass$1.TRANSLUCENT?(l===StyleCommandsNeeded.ALL_OPAQUE&&(i[c]=p),l===StyleCommandsNeeded.ALL_TRANSLUCENT&&(i[c]=m),l===StyleCommandsNeeded.OPAQUE_AND_TRANSLUCENT&&(i[c]=p,i.push(m))):i[c]=h}},Cesium3DTileBatchTable.prototype.update=function(e,t){var i=t.context;this._defaultTexture=i.defaultTexture;var r=t.passes;(r.pick||r.postProcess)&&createPickTexture(this,i),this._batchValuesDirty&&(this._batchValuesDirty=!1,defined(this._batchTexture)||(this._batchTexture=createTexture$1(this,i,this._batchValues),e._statistics.batchTableByteLength+=this._batchTexture.sizeInBytes),updateBatchTexture(this))},Cesium3DTileBatchTable.prototype.isDestroyed=function(){return!1},Cesium3DTileBatchTable.prototype.destroy=function(){this._batchTexture=this._batchTexture&&this._batchTexture.destroy(),this._pickTexture=this._pickTexture&&this._pickTexture.destroy();for(var e=this._pickIds,t=e.length,i=0;i<t;++i)e[i].destroy();return destroyObject(this)},Object.defineProperties(Cesium3DTileFeature.prototype,{show:{get:function(){return this._content.batchTable.getShow(this._batchId)},set:function(e){this._content.batchTable.setShow(this._batchId,e)}},color:{get:function(){return defined(this._color)||(this._color=new Color),this._content.batchTable.getColor(this._batchId,this._color)},set:function(e){this._content.batchTable.setColor(this._batchId,e)}},content:{get:function(){return this._content}},tileset:{get:function(){return this._content.tileset}},primitive:{get:function(){return this._content.tileset}},pickId:{get:function(){return this._content.batchTable.getPickColor(this._batchId)}}}),Cesium3DTileFeature.prototype.hasProperty=function(e){return this._content.batchTable.hasProperty(this._batchId,e)},Cesium3DTileFeature.prototype.getPropertyNames=function(e){return this._content.batchTable.getPropertyNames(this._batchId,e)},Cesium3DTileFeature.prototype.getProperty=function(e){return this._content.batchTable.getProperty(this._batchId,e)},Cesium3DTileFeature.prototype.setProperty=function(e,t){this._content.batchTable.setProperty(this._batchId,e,t),this._content.featurePropertiesDirty=!0},Cesium3DTileFeature.prototype.isExactClass=function(e){return this._content.batchTable.isExactClass(this._batchId,e)},Cesium3DTileFeature.prototype.isClass=function(e){return this._content.batchTable.isClass(this._batchId,e)},Cesium3DTileFeature.prototype.getExactClassName=function(){return this._content.batchTable.getExactClassName(this._batchId)},Cesium3DTileFeatureTable.prototype.getGlobalProperty=function(e,t,i){var r=this.json[e];if(defined(r))return defined(r.byteOffset)?getTypedArrayFromBinary(this,e,t=defaultValue(t,ComponentDatatype$1.UNSIGNED_INT),i=defaultValue(i,1),1,r.byteOffset):r},Cesium3DTileFeatureTable.prototype.getPropertyArray=function(e,t,i){var r=this.json[e];if(defined(r))return defined(r.byteOffset)?(defined(r.componentType)&&(t=ComponentDatatype$1.fromName(r.componentType)),getTypedArrayFromBinary(this,e,t,i,this.featuresLength,r.byteOffset)):getTypedArrayFromArray(this,e,t,r)},Cesium3DTileFeatureTable.prototype.getProperty=function(e,t,i,r,n){if(defined(this.json[e])){var a=this.getPropertyArray(e,t,i);if(1===i)return a[r];for(var o=0;o<i;++o)n[o]=a[i*r+o];return n}},ForEach.objectLegacy=function(e,t){if(defined(e))for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var r=t(e[i],i);if(defined(r))return r}},ForEach.object=function(e,t){if(defined(e))for(var i=e.length,r=0;r<i;r++){var n=t(e[r],r);if(defined(n))return n}},ForEach.topLevel=function(e,t,i){var r=e[t];return defined(r)&&!Array.isArray(r)?ForEach.objectLegacy(r,i):ForEach.object(r,i)},ForEach.accessor=function(e,t){return ForEach.topLevel(e,"accessors",t)},ForEach.accessorWithSemantic=function(e,r,n){var a={};return ForEach.mesh(e,function(e){return ForEach.meshPrimitive(e,function(e){var t=ForEach.meshPrimitiveAttribute(e,function(e,t){if(0===t.indexOf(r)&&!defined(a[e])){a[e]=!0;var i=n(e);if(defined(i))return i}});return defined(t)?t:ForEach.meshPrimitiveTarget(e,function(e){return ForEach.meshPrimitiveTargetAttribute(e,function(e,t){if(0===t.indexOf(r)&&!defined(a[e])){a[e]=!0;var i=n(e);if(defined(i))return i}})})})})},ForEach.accessorContainingVertexAttributeData=function(e,i){var r={};return ForEach.mesh(e,function(e){return ForEach.meshPrimitive(e,function(e){var t=ForEach.meshPrimitiveAttribute(e,function(e){if(!defined(r[e])){r[e]=!0;var t=i(e);if(defined(t))return t}});return defined(t)?t:ForEach.meshPrimitiveTarget(e,function(e){return ForEach.meshPrimitiveTargetAttribute(e,function(e){if(!defined(r[e])){r[e]=!0;var t=i(e);if(defined(t))return t}})})})})},ForEach.accessorContainingIndexData=function(e,r){var n={};return ForEach.mesh(e,function(e){return ForEach.meshPrimitive(e,function(e){var t=e.indices;if(defined(t)&&!defined(n[t])){n[t]=!0;var i=r(t);if(defined(i))return i}})})},ForEach.animation=function(e,t){return ForEach.topLevel(e,"animations",t)},ForEach.animationChannel=function(e,t){var i=e.channels;return ForEach.object(i,t)},ForEach.animationSampler=function(e,t){var i=e.samplers;return ForEach.object(i,t)},ForEach.buffer=function(e,t){return ForEach.topLevel(e,"buffers",t)},ForEach.bufferView=function(e,t){return ForEach.topLevel(e,"bufferViews",t)},ForEach.camera=function(e,t){return ForEach.topLevel(e,"cameras",t)},ForEach.image=function(e,t){return ForEach.topLevel(e,"images",t)},ForEach.compressedImage=function(e,t){if(defined(e.extras)){var i=e.extras.compressedImage3DTiles;for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var n=t(i[r],r);if(defined(n))return n}}},ForEach.material=function(e,t){return ForEach.topLevel(e,"materials",t)},ForEach.materialValue=function(e,t){var i=e.values;for(var r in defined(e.extensions)&&defined(e.extensions.KHR_techniques_webgl)&&(i=e.extensions.KHR_techniques_webgl.values),i)if(Object.prototype.hasOwnProperty.call(i,r)){var n=t(i[r],r);if(defined(n))return n}},ForEach.mesh=function(e,t){return ForEach.topLevel(e,"meshes",t)},ForEach.meshPrimitive=function(e,t){var i=e.primitives;if(defined(i))for(var r=i.length,n=0;n<r;n++){var a=t(i[n],n);if(defined(a))return a}},ForEach.meshPrimitiveAttribute=function(e,t){var i=e.attributes;for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var n=t(i[r],r);if(defined(n))return n}},ForEach.meshPrimitiveTarget=function(e,t){var i=e.targets;if(defined(i))for(var r=i.length,n=0;n<r;++n){var a=t(i[n],n);if(defined(a))return a}},ForEach.meshPrimitiveTargetAttribute=function(e,t){for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var r=t(e[i],i);if(defined(r))return r}},ForEach.node=function(e,t){return ForEach.topLevel(e,"nodes",t)},ForEach.nodeInTree=function(e,t,i){var r=e.nodes;if(defined(r))for(var n=t.length,a=0;a<n;a++){var o=t[a],s=r[o];if(defined(s)){var l=i(s,o);if(defined(l))return l;var c=s.children;if(defined(c)&&defined(l=ForEach.nodeInTree(e,c,i)))return l}}},ForEach.nodeInScene=function(e,t,i){var r=t.nodes;if(defined(r))return ForEach.nodeInTree(e,r,i)},ForEach.program=function(e,t){return hasExtension(e,"KHR_techniques_webgl")?ForEach.object(e.extensions.KHR_techniques_webgl.programs,t):ForEach.topLevel(e,"programs",t)},ForEach.sampler=function(e,t){return ForEach.topLevel(e,"samplers",t)},ForEach.scene=function(e,t){return ForEach.topLevel(e,"scenes",t)},ForEach.shader=function(e,t){return hasExtension(e,"KHR_techniques_webgl")?ForEach.object(e.extensions.KHR_techniques_webgl.shaders,t):ForEach.topLevel(e,"shaders",t)},ForEach.skin=function(e,t){return ForEach.topLevel(e,"skins",t)},ForEach.skinJoint=function(e,t){var i=e.joints;if(defined(i))for(var r=i.length,n=0;n<r;n++){var a=t(i[n]);if(defined(a))return a}},ForEach.techniqueAttribute=function(e,t){var i=e.attributes;for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var n=t(i[r],r);if(defined(n))return n}},ForEach.techniqueUniform=function(e,t){var i=e.uniforms;for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var n=t(i[r],r);if(defined(n))return n}},ForEach.techniqueParameter=function(e,t){var i=e.parameters;for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var n=t(i[r],r);if(defined(n))return n}},ForEach.technique=function(e,t){return hasExtension(e,"KHR_techniques_webgl")?ForEach.object(e.extensions.KHR_techniques_webgl.techniques,t):ForEach.topLevel(e,"techniques",t)},ForEach.texture=function(e,t){return ForEach.topLevel(e,"textures",t)};var sizeOfUint32$2=4;function parseGlb(e){if("glTF"!==getMagic(e))throw new RuntimeError("File is not valid binary glTF");var t=readHeader(e,0,5),i=t[1];if(1!==i&&2!==i)throw new RuntimeError("Binary glTF version is not 1 or 2");return(1===i?parseGlbVersion1:parseGlbVersion2)(e,t)}function readHeader(e,t,i){for(var r=new DataView(e.buffer),n=new Array(i),a=0;a<i;++a)n[a]=r.getUint32(e.byteOffset+t+a*sizeOfUint32$2,!0);return n}function parseGlbVersion1(e,t){var i=t[2],r=t[3];if(0!==t[4])throw new RuntimeError("Binary glTF scene format is not JSON");var n=20+r,a=getStringFromTypedArray(e,20,r),o=JSON.parse(a);addPipelineExtras(o);var s,l=e.subarray(n,i),c=o.buffers;return defined(c)&&0<Object.keys(c).length&&(defined(s=defaultValue(c.binary_glTF,c.KHR_binary_glTF))&&(s.extras._pipeline.source=l)),removeExtensionsUsed(o,"KHR_binary_glTF"),o}function parseGlbVersion2(e,t){for(var i,r,n=t[2],a=12;a<n;){var o=readHeader(e,a,2),s=o[0],l=o[1];a+=8;var c,u,d=e.subarray(a,a+s);a+=s,1313821514===l?(c=getStringFromTypedArray(d),addPipelineExtras(u=JSON.parse(c))):5130562===l&&(i=d)}return defined(u)&&defined(i)&&(defined(r=u.buffers)&&0<r.length&&(r[0].extras._pipeline.source=i)),u}function addExtensionsUsed(e,t){var i=e.extensionsUsed;defined(i)||(i=[],e.extensionsUsed=i),addToArray(i,t,!0)}function getComponentReader(e){switch(e){case ComponentDatatype$1.BYTE:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getInt8(t+a*r)};case ComponentDatatype$1.UNSIGNED_BYTE:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getUint8(t+a*r)};case ComponentDatatype$1.SHORT:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getInt16(t+a*r,!0)};case ComponentDatatype$1.UNSIGNED_SHORT:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getUint16(t+a*r,!0)};case ComponentDatatype$1.INT:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getInt32(t+a*r,!0)};case ComponentDatatype$1.UNSIGNED_INT:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getUint32(t+a*r,!0)};case ComponentDatatype$1.FLOAT:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getFloat32(t+a*r,!0)};case ComponentDatatype$1.DOUBLE:return function(e,t,i,r,n){for(var a=0;a<i;++a)n[a]=e.getFloat64(t+a*r,!0)}}}function findAccessorMinMax(e,t){var i=e.bufferViews,r=e.buffers,n=t.bufferView,a=numberOfComponentsForType(t.type);if(!defined(t.bufferView))return{min:arrayFill(new Array(a),0),max:arrayFill(new Array(a),0)};for(var o=arrayFill(new Array(a),Number.POSITIVE_INFINITY),s=arrayFill(new Array(a),Number.NEGATIVE_INFINITY),l=i[n],c=r[l.buffer].extras._pipeline.source,u=t.count,d=getAccessorByteStride(e,t),h=t.byteOffset+l.byteOffset+c.byteOffset,p=t.componentType,m=ComponentDatatype$1.getSizeInBytes(p),f=new DataView(c.buffer),g=new Array(a),_=getComponentReader(p),y=0;y<u;y++){_(f,h,a,m,g);for(var v=0;v<a;v++){var C=g[v];o[v]=Math.min(o[v],C),s[v]=Math.max(s[v],C)}h+=d}return{min:o,max:s}}var defaultBlendEquation=[WebGLConstants$1.FUNC_ADD,WebGLConstants$1.FUNC_ADD],defaultBlendFactors=[WebGLConstants$1.ONE,WebGLConstants$1.ZERO,WebGLConstants$1.ONE,WebGLConstants$1.ZERO];function isStateEnabled(e,t){var i=e.enable;return defined(i)&&-1<i.indexOf(t)}var supportedBlendFactors=[WebGLConstants$1.ZERO,WebGLConstants$1.ONE,WebGLConstants$1.SRC_COLOR,WebGLConstants$1.ONE_MINUS_SRC_COLOR,WebGLConstants$1.SRC_ALPHA,WebGLConstants$1.ONE_MINUS_SRC_ALPHA,WebGLConstants$1.DST_ALPHA,WebGLConstants$1.ONE_MINUS_DST_ALPHA,WebGLConstants$1.DST_COLOR,WebGLConstants$1.ONE_MINUS_DST_COLOR];function getSupportedBlendFactors(e,t){if(!defined(e))return t;for(var i=0;i<4;i++)if(-1===supportedBlendFactors.indexOf(e[i]))return t;return e}function moveTechniqueRenderStates(e){var a={},o={};return defined(e.techniques)&&(ForEach.technique(e,function(e,t){var i,r,n=e.states;defined(n)&&(i=o[t]={},isStateEnabled(n,WebGLConstants$1.BLEND)&&(i.alphaMode="BLEND",defined(r=n.functions)&&(defined(r.blendEquationSeparate)||defined(r.blendFuncSeparate))&&(a[t]={blendEquation:defaultValue(r.blendEquationSeparate,defaultBlendEquation),blendFactors:getSupportedBlendFactors(r.blendFuncSeparate,defaultBlendFactors)})),isStateEnabled(n,WebGLConstants$1.CULL_FACE)||(i.doubleSided=!0),delete e.states)}),0<Object.keys(a).length&&(defined(e.extensions)||(e.extensions={}),addExtensionsUsed(e,"KHR_blend")),ForEach.material(e,function(i){var e,t;defined(i.technique)&&(e=o[i.technique],ForEach.objectLegacy(e,function(e,t){i[t]=e}),defined(t=a[i.technique])&&(defined(i.extensions)||(i.extensions={}),i.extensions.KHR_blend=t))})),e}function addExtensionsRequired(e,t){var i=e.extensionsRequired;defined(i)||(i=[],e.extensionsRequired=i),addToArray(i,t,!0),addExtensionsUsed(e,t)}function moveTechniquesToExtension(l){var c,u,e=l.techniques,d={},h={};return defined(e)&&(c={programs:[],shaders:[],techniques:[]},u=l.glExtensionsUsed,delete l.glExtensionsUsed,ForEach.technique(l,function(i,e){var r,n={name:i.name,program:void 0,attributes:{},uniforms:{}};ForEach.techniqueAttribute(i,function(e,t){r=i.parameters[e],n.attributes[t]={semantic:r.semantic}}),ForEach.techniqueUniform(i,function(e,t){r=i.parameters[e],n.uniforms[t]={count:r.count,node:r.node,type:r.type,semantic:r.semantic,value:r.value},d[e]=t});var t=l.programs[i.program],a={name:t.name,fragmentShader:void 0,vertexShader:void 0,glExtensions:u},o=l.shaders[t.fragmentShader];a.fragmentShader=addToArray(c.shaders,o,!0);var s=l.shaders[t.vertexShader];a.vertexShader=addToArray(c.shaders,s,!0),n.program=addToArray(c.programs,a),h[e]=addToArray(c.techniques,n)}),0<c.techniques.length&&(defined(l.extensions)||(l.extensions={}),l.extensions.KHR_techniques_webgl=c,addExtensionsUsed(l,"KHR_techniques_webgl"),addExtensionsRequired(l,"KHR_techniques_webgl"))),ForEach.material(l,function(e){var r;defined(e.technique)&&(r={technique:h[e.technique]},ForEach.objectLegacy(e.values,function(e,t){defined(r.values)||(r.values={});var i=d[t];r.values[i]=e}),defined(e.extensions)||(e.extensions={}),e.extensions.KHR_techniques_webgl=r),delete e.technique,delete e.values}),delete l.techniques,delete l.programs,delete l.shaders,l}var allElementTypes=["mesh","node","material","accessor","bufferView","buffer"];function removeUnusedElements(t,i){return i=defaultValue(i,allElementTypes),allElementTypes.forEach(function(e){-1<i.indexOf(e)&&removeUnusedElementsByType(t,e)}),t}var TypeToGltfElementName={accessor:"accessors",buffer:"buffers",bufferView:"bufferViews",node:"nodes",material:"materials",mesh:"meshes"};function removeUnusedElementsByType(e,t){var i=e[TypeToGltfElementName[t]];if(defined(i))for(var r=0,n=getListOfElementsIdsInUse[t](e),a=i.length,o=0;o<a;++o)n[o]||(Remove[t](e,o-r),r++)}function Remove(){}function getListOfElementsIdsInUse(){}function nodeIsEmpty(t,e){return!(defined(e.mesh)||defined(e.camera)||defined(e.skin)||defined(e.weights)||defined(e.extras)||defined(e.extensions)&&0!==e.extensions.length)&&(!defined(e.children)||0===e.children.filter(function(e){return!nodeIsEmpty(t,t.nodes[e])}).length)}function addBuffer(e,t){var i={byteLength:t.length,extras:{_pipeline:{source:t}}},r={buffer:addToArray(e.buffers,i),byteOffset:0,byteLength:t.length};return addToArray(e.bufferViews,r)}function readAccessorPacked(e,t){var i=getAccessorByteStride(e,t),r=ComponentDatatype$1.getSizeInBytes(t.componentType),n=numberOfComponentsForType(t.type),a=t.count,o=new Array(n*a);if(!defined(t.bufferView))return arrayFill(o,0),o;for(var s=e.bufferViews[t.bufferView],l=e.buffers[s.buffer].extras._pipeline.source,c=t.byteOffset+s.byteOffset+l.byteOffset,u=new DataView(l.buffer),d=new Array(n),h=getComponentReader(t.componentType),p=0;p<a;++p){h(u,c,n,r,d);for(var m=0;m<n;++m)o[p*n+m]=d[m];c+=i}return o}function updateAccessorComponentTypes(i){var r;return ForEach.accessorWithSemantic(i,"JOINTS_0",function(e){var t=i.accessors[e];(r=t.componentType)===WebGLConstants$1.BYTE?convertType(i,t,ComponentDatatype$1.UNSIGNED_BYTE):r!==WebGLConstants$1.UNSIGNED_BYTE&&r!==WebGLConstants$1.UNSIGNED_SHORT&&convertType(i,t,ComponentDatatype$1.UNSIGNED_SHORT)}),ForEach.accessorWithSemantic(i,"WEIGHTS_0",function(e){var t=i.accessors[e];(r=t.componentType)===WebGLConstants$1.BYTE?convertType(i,t,ComponentDatatype$1.UNSIGNED_BYTE):r===WebGLConstants$1.SHORT&&convertType(i,t,ComponentDatatype$1.UNSIGNED_SHORT)}),i}function convertType(e,t,i){var r=ComponentDatatype$1.createTypedArray(i,readAccessorPacked(e,t)),n=new Uint8Array(r.buffer);t.bufferView=addBuffer(e,n),t.componentType=i,t.byteOffset=0}Remove.accessor=function(e,r){e.accessors.splice(r,1),ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(i){ForEach.meshPrimitiveAttribute(i,function(e,t){r<e&&i.attributes[t]--}),ForEach.meshPrimitiveTarget(i,function(i){ForEach.meshPrimitiveTargetAttribute(i,function(e,t){r<e&&i[t]--})});var e=i.indices;defined(e)&&r<e&&i.indices--})}),ForEach.skin(e,function(e){defined(e.inverseBindMatrices)&&e.inverseBindMatrices>r&&e.inverseBindMatrices--}),ForEach.animation(e,function(e){ForEach.animationSampler(e,function(e){defined(e.input)&&e.input>r&&e.input--,defined(e.output)&&e.output>r&&e.output--})})},Remove.buffer=function(e,t){e.buffers.splice(t,1),ForEach.bufferView(e,function(e){defined(e.buffer)&&e.buffer>t&&e.buffer--})},Remove.bufferView=function(e,i){e.bufferViews.splice(i,1),ForEach.accessor(e,function(e){defined(e.bufferView)&&e.bufferView>i&&e.bufferView--}),ForEach.shader(e,function(e){defined(e.bufferView)&&e.bufferView>i&&e.bufferView--}),ForEach.image(e,function(e){defined(e.bufferView)&&e.bufferView>i&&e.bufferView--,ForEach.compressedImage(e,function(e){var t=e.bufferView;defined(t)&&i<t&&e.bufferView--})}),hasExtension(e,"KHR_draco_mesh_compression")&&ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){defined(e.extensions)&&defined(e.extensions.KHR_draco_mesh_compression)&&e.extensions.KHR_draco_mesh_compression.bufferView>i&&e.extensions.KHR_draco_mesh_compression.bufferView--})})},Remove.mesh=function(e,t){e.meshes.splice(t,1),ForEach.node(e,function(e){defined(e.mesh)&&(e.mesh>t?e.mesh--:e.mesh===t&&delete e.mesh)})},Remove.node=function(e,t){e.nodes.splice(t,1),ForEach.skin(e,function(e){defined(e.skeleton)&&e.skeleton>t&&e.skeleton--,e.joints=e.joints.map(function(e){return t<e?e-1:e})}),ForEach.animation(e,function(e){ForEach.animationChannel(e,function(e){defined(e.target)&&defined(e.target.node)&&e.target.node>t&&e.target.node--})}),ForEach.technique(e,function(e){ForEach.techniqueUniform(e,function(e){defined(e.node)&&e.node>t&&e.node--})}),ForEach.node(e,function(e){defined(e.children)&&(e.children=e.children.filter(function(e){return e!==t}).map(function(e){return t<e?e-1:e}))}),ForEach.scene(e,function(e){e.nodes=e.nodes.filter(function(e){return e!==t}).map(function(e){return t<e?e-1:e})})},Remove.material=function(e,t){e.materials.splice(t,1),ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){defined(e.material)&&e.material>t&&e.material--})})},getListOfElementsIdsInUse.accessor=function(e){var i={};return ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){ForEach.meshPrimitiveAttribute(e,function(e){i[e]=!0}),ForEach.meshPrimitiveTarget(e,function(e){ForEach.meshPrimitiveTargetAttribute(e,function(e){i[e]=!0})});var t=e.indices;defined(t)&&(i[t]=!0)})}),ForEach.skin(e,function(e){defined(e.inverseBindMatrices)&&(i[e.inverseBindMatrices]=!0)}),ForEach.animation(e,function(e){ForEach.animationSampler(e,function(e){defined(e.input)&&(i[e.input]=!0),defined(e.output)&&(i[e.output]=!0)})}),i},getListOfElementsIdsInUse.buffer=function(e){var t={};return ForEach.bufferView(e,function(e){defined(e.buffer)&&(t[e.buffer]=!0)}),t},getListOfElementsIdsInUse.bufferView=function(e){var t={};return ForEach.accessor(e,function(e){defined(e.bufferView)&&(t[e.bufferView]=!0)}),ForEach.shader(e,function(e){defined(e.bufferView)&&(t[e.bufferView]=!0)}),ForEach.image(e,function(e){defined(e.bufferView)&&(t[e.bufferView]=!0),ForEach.compressedImage(e,function(e){defined(e.bufferView)&&(t[e.bufferView]=!0)})}),hasExtension(e,"KHR_draco_mesh_compression")&&ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){defined(e.extensions)&&defined(e.extensions.KHR_draco_mesh_compression)&&(t[e.extensions.KHR_draco_mesh_compression.bufferView]=!0)})}),t},getListOfElementsIdsInUse.mesh=function(i){var r={};return ForEach.node(i,function(e){var t;!defined(e.mesh&&defined(i.meshes))||defined(t=i.meshes[e.mesh])&&defined(t.primitives)&&0<t.primitives.length&&(r[e.mesh]=!0)}),r},getListOfElementsIdsInUse.node=function(i){var r={};return ForEach.node(i,function(e,t){nodeIsEmpty(i,e)||(r[t]=!0)}),ForEach.skin(i,function(e){defined(e.skeleton)&&(r[e.skeleton]=!0),ForEach.skinJoint(e,function(e){r[e]=!0})}),ForEach.animation(i,function(e){ForEach.animationChannel(e,function(e){defined(e.target)&&defined(e.target.node)&&(r[e.target.node]=!0)})}),ForEach.technique(i,function(e){ForEach.techniqueUniform(e,function(e){defined(e.node)&&(r[e.node]=!0)})}),r},getListOfElementsIdsInUse.material=function(e){var t={};return ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){defined(e.material)&&(t[e.material]=!0)})}),t};var updateFunctions={.8:glTF08to10,"1.0":glTF10to20,"2.0":void 0};function updateVersion(e,t){var i=(t=defaultValue(t,defaultValue.EMPTY_OBJECT)).targetVersion,r=e.version;e.asset=defaultValue(e.asset,{version:"1.0"}),e.asset.version=defaultValue(e.asset.version,"1.0"),r=defaultValue(r,e.asset.version).toString(),Object.prototype.hasOwnProperty.call(updateFunctions,r)||(defined(r)&&(r=r.substring(0,3)),Object.prototype.hasOwnProperty.call(updateFunctions,r)||(r="1.0"));for(var n=updateFunctions[r];defined(n)&&r!==i;)n(e,t),r=e.asset.version,n=updateFunctions[r];return e}function updateInstanceTechniques(e){var t,i,r=e.materials;for(var n in r){!Object.prototype.hasOwnProperty.call(r,n)||defined(i=(t=r[n]).instanceTechnique)&&(t.technique=i.technique,t.values=i.values,delete t.instanceTechnique)}}function setPrimitiveModes(e){var t=e.meshes;for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var r=t[i].primitives;if(defined(r))for(var n=r.length,a=0;a<n;++a){var o=r[a],s=defaultValue(o.primitive,WebGLConstants$1.TRIANGLES);o.mode=defaultValue(o.mode,s),delete o.primitive}}}function updateNodes(e){var t,i,r,n=e.nodes,a=new Cartesian3,o=new Quaternion;for(var s in n){Object.prototype.hasOwnProperty.call(n,s)&&(defined((t=n[s]).rotation)&&(i=t.rotation,Cartesian3.fromArray(i,0,a),Quaternion.fromAxisAngle(a,i[3],o),t.rotation=[o.x,o.y,o.z,o.w]),defined(r=t.instanceSkin)&&(t.skeletons=r.skeletons,t.skin=r.skin,t.meshes=r.meshes,delete t.instanceSkin))}}function updateAnimations(e){var t=e.animations,i=e.accessors,r=e.bufferViews,n=e.buffers,a={},o=new Cartesian3,s=new Quaternion;for(var l in t)if(Object.prototype.hasOwnProperty.call(t,l)){var c=t[l],u=c.channels,d=c.parameters,h=c.samplers;if(defined(u))for(var p=u.length,m=0;m<p;++m){var f=u[m];if("rotation"===f.target.path){var g=d[h[f.sampler].output];if(defined(a[g]))continue;a[g]=!0;for(var _=i[g],y=r[_.bufferView],v=n[y.buffer].extras._pipeline.source,C=v.byteOffset+y.byteOffset+_.byteOffset,S=_.componentType,T=_.count,x=numberOfComponentsForType(_.type),b=_.count*x,E=ComponentDatatype$1.createArrayBufferView(S,v.buffer,C,b),P=0;P<T;P++){var A=P*x;Cartesian3.unpack(E,A,o);var w=E[3+A];Quaternion.fromAxisAngle(o,w,s),Quaternion.pack(s,E,A)}}}}}function removeTechniquePasses(e){var t,i,r,n,a,o=e.techniques;for(var s in o){!Object.prototype.hasOwnProperty.call(o,s)||defined(i=(t=o[s]).passes)&&(r=defaultValue(t.pass,"defaultPass"),Object.prototype.hasOwnProperty.call(i,r)&&(a=(n=i[r]).instanceProgram,t.attributes=defaultValue(t.attributes,a.attributes),t.program=defaultValue(t.program,a.program),t.uniforms=defaultValue(t.uniforms,a.uniforms),t.states=defaultValue(t.states,n.states)),delete t.passes,delete t.pass)}}function glTF08to10(e){defined(e.asset)||(e.asset={});var t,i,r,n=e.asset;n.version="1.0","string"==typeof n.profile?(t=n.profile.split(" "),n.profile={api:t[0],version:t[1]}):n.profile={},defined(e.version)&&delete e.version,updateInstanceTechniques(e),setPrimitiveModes(e),updateNodes(e),updateAnimations(e),removeTechniquePasses(e),defined(e.allExtensions)&&(e.extensionsUsed=e.allExtensions,delete e.allExtensions),defined(e.lights)&&(i=defaultValue(e.extensions,{}),r=defaultValue((e.extensions=i).KHR_materials_common,{}),(i.KHR_materials_common=r).lights=e.lights,delete e.lights,addExtensionsUsed(e,"KHR_materials_common"))}function removeAnimationSamplersIndirection(e){var t=e.animations;for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var r=t[i],n=r.parameters;if(defined(n)){var a,o=r.samplers;for(var s in o){Object.prototype.hasOwnProperty.call(o,s)&&((a=o[s]).input=n[a.input],a.output=n[a.output])}delete r.parameters}}}function objectToArray(e,t){var i,r=[];for(var n in e){Object.prototype.hasOwnProperty.call(e,n)&&(i=e[n],t[n]=r.length,r.push(i),defined(i.name)||(i.name=n))}return r}function objectsToArrays(l){var c,e,t,i,u={accessors:{},animations:{},buffers:{},bufferViews:{},cameras:{},images:{},materials:{},meshes:{},nodes:{},programs:{},samplers:{},scenes:{},shaders:{},skins:{},textures:{},techniques:{}},n={},r=l.nodes;for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&defined(e=r[a].jointName)&&(n[e]=a);for(var o in l){Object.prototype.hasOwnProperty.call(l,o)&&defined(u[o])&&(t={},i=l[o],l[o]=objectToArray(i,t),u[o]=t)}for(e in n)Object.prototype.hasOwnProperty.call(n,e)&&(n[e]=u.nodes[n[e]]);defined(l.scene)&&(l.scene=u.scenes[l.scene]),ForEach.bufferView(l,function(e){defined(e.buffer)&&(e.buffer=u.buffers[e.buffer])}),ForEach.accessor(l,function(e){defined(e.bufferView)&&(e.bufferView=u.bufferViews[e.bufferView])}),ForEach.shader(l,function(e){var t,i=e.extensions;defined(i)&&(defined(t=i.KHR_binary_glTF)&&(e.bufferView=u.bufferViews[t.bufferView],delete i.KHR_binary_glTF),0===Object.keys(i).length&&delete e.extensions)}),ForEach.program(l,function(e){defined(e.vertexShader)&&(e.vertexShader=u.shaders[e.vertexShader]),defined(e.fragmentShader)&&(e.fragmentShader=u.shaders[e.fragmentShader])}),ForEach.technique(l,function(e){defined(e.program)&&(e.program=u.programs[e.program]),ForEach.techniqueParameter(e,function(e){defined(e.node)&&(e.node=u.nodes[e.node]);var t=e.value;"string"==typeof t&&(e.value={index:u.textures[t]})})}),ForEach.mesh(l,function(e){ForEach.meshPrimitive(e,function(i){defined(i.indices)&&(i.indices=u.accessors[i.indices]),ForEach.meshPrimitiveAttribute(i,function(e,t){i.attributes[t]=u.accessors[e]}),defined(i.material)&&(i.material=u.materials[i.material])})}),ForEach.node(l,function(e){var t,i=e.children;if(defined(i)){var r=i.length;for(c=0;c<r;++c)i[c]=u.nodes[i[c]]}if(defined(e.meshes)){var n=e.meshes,a=n.length;if(0<a)for(e.mesh=u.meshes[n[0]],c=1;c<a;++c){var o={mesh:u.meshes[n[c]]},s=addToArray(l.nodes,o);defined(i)||(i=[],e.children=i),i.push(s)}delete e.meshes}defined(e.camera)&&(e.camera=u.cameras[e.camera]),defined(e.skin)&&(e.skin=u.skins[e.skin]),defined(e.skeletons)&&(0<(t=e.skeletons).length&&defined(e.skin)&&(l.skins[e.skin].skeleton=u.nodes[t[0]]),delete e.skeletons),defined(e.jointName)&&delete e.jointName}),ForEach.skin(l,function(e){defined(e.inverseBindMatrices)&&(e.inverseBindMatrices=u.accessors[e.inverseBindMatrices]);var t=e.jointNames;if(defined(t)){var i=[],r=t.length;for(c=0;c<r;++c)i[c]=n[t[c]];e.joints=i,delete e.jointNames}}),ForEach.scene(l,function(e){var t=e.nodes;if(defined(t)){var i=t.length;for(c=0;c<i;++c)t[c]=u.nodes[t[c]]}}),ForEach.animation(l,function(e){var i={};e.samplers=objectToArray(e.samplers,i),ForEach.animationSampler(e,function(e){e.input=u.accessors[e.input],e.output=u.accessors[e.output]}),ForEach.animationChannel(e,function(e){e.sampler=i[e.sampler];var t=e.target;defined(t)&&(t.node=u.nodes[t.id],delete t.id)})}),ForEach.material(l,function(i){defined(i.technique)&&(i.technique=u.techniques[i.technique]),ForEach.materialValue(i,function(e,t){"string"==typeof e&&(i.values[t]={index:u.textures[e]})});var r,e=i.extensions;!defined(e)||defined(r=e.KHR_materials_common)&&ForEach.materialValue(r,function(e,t){"string"==typeof e&&(r.values[t]={index:u.textures[e]})})}),ForEach.image(l,function(e){var t,r=e.extensions;defined(r)&&(defined(t=r.KHR_binary_glTF)&&(e.bufferView=u.bufferViews[t.bufferView],e.mimeType=t.mimeType,delete r.KHR_binary_glTF),0===Object.keys(r).length&&delete e.extensions),ForEach.compressedImage(e,function(e){var t,i=e.extensions;defined(i)&&(defined(t=i.KHR_binary_glTF)&&(e.bufferView=u.bufferViews[t.bufferView],e.mimeType=t.mimeType,delete i.KHR_binary_glTF),0===Object.keys(r).length&&delete e.extensions)})}),ForEach.texture(l,function(e){defined(e.sampler)&&(e.sampler=u.samplers[e.sampler]),defined(e.source)&&(e.source=u.images[e.source])})}function removeAnimationSamplerNames(e){ForEach.animation(e,function(e){ForEach.animationSampler(e,function(e){delete e.name})})}function removeEmptyArrays(e){for(var t in e){var i;Object.prototype.hasOwnProperty.call(e,t)&&(i=e[t],Array.isArray(i)&&0===i.length&&delete e[t])}ForEach.node(e,function(e){defined(e.children)&&0===e.children.length&&delete e.children})}function stripAsset(e){var t=e.asset;delete t.profile,delete t.premultipliedAlpha}var knownExtensions={CESIUM_RTC:!0,KHR_materials_common:!0,WEB3D_quantized_attributes:!0};function requireKnownExtensions(e){var t=e.extensionsUsed;if(e.extensionsRequired=defaultValue(e.extensionsRequired,[]),defined(t))for(var i=t.length,r=0;r<i;++r){var n=t[r];defined(knownExtensions[n])&&e.extensionsRequired.push(n)}}function removeBufferType(e){ForEach.buffer(e,function(e){delete e.type})}function removeTextureProperties(e){ForEach.texture(e,function(e){delete e.format,delete e.internalFormat,delete e.target,delete e.type})}function requireAttributeSetIndex(e){ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(i){ForEach.meshPrimitiveAttribute(i,function(e,t){"TEXCOORD"===t?i.attributes.TEXCOORD_0=e:"COLOR"===t&&(i.attributes.COLOR_0=e)}),delete i.attributes.TEXCOORD,delete i.attributes.COLOR})}),ForEach.technique(e,function(e){ForEach.techniqueParameter(e,function(e){var t=e.semantic;defined(t)&&("TEXCOORD"===t?e.semantic="TEXCOORD_0":"COLOR"===t&&(e.semantic="COLOR_0"))})})}var knownSemantics={POSITION:!0,NORMAL:!0,TANGENT:!0},indexedSemantics={COLOR:"COLOR",JOINT:"JOINTS",JOINTS:"JOINTS",TEXCOORD:"TEXCOORD",WEIGHT:"WEIGHTS",WEIGHTS:"WEIGHTS"};function underscoreApplicationSpecificSemantics(e){var s={};ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){for(var t in ForEach.meshPrimitiveAttribute(e,function(e,t){var i,r,n,a,o;"_"!==t.charAt(0)&&(i=t.search(/_[0-9]+/g),r=t,n="_0",0<=i&&(r=t.substring(0,i),n=t.substring(i)),defined(o=indexedSemantics[r])?(a=o+n,s[t]=a):defined(knownSemantics[r])||(a="_"+t,s[t]=a))}),s){var i,r;Object.prototype.hasOwnProperty.call(s,t)&&(i=s[t],defined(r=e.attributes[t])&&(delete e.attributes[t],e.attributes[i]=r))}})}),ForEach.technique(e,function(e){ForEach.techniqueParameter(e,function(e){var t=s[e.semantic];defined(t)&&(e.semantic=t)})})}function clampCameraParameters(e){ForEach.camera(e,function(e){var t,i,r=e.perspective;defined(r)&&(defined(t=r.aspectRatio)&&0===t&&delete r.aspectRatio,defined(i=r.yfov)&&0===i&&(r.yfov=1))})}function computeAccessorByteStride(e,t){return defined(t.byteStride)&&0!==t.byteStride?t.byteStride:getAccessorByteStride(e,t)}function requireByteLength(a){ForEach.buffer(a,function(e){defined(e.byteLength)||(e.byteLength=e.extras._pipeline.source.length)}),ForEach.accessor(a,function(e){var t,i,r,n=e.bufferView;defined(n)&&(t=a.bufferViews[n],i=computeAccessorByteStride(a,e),r=e.byteOffset+e.count*i,t.byteLength=Math.max(defaultValue(t.byteLength,0),r))})}function moveByteStrideToBufferView(i){var e,t=i.bufferViews,r={};ForEach.accessorContainingVertexAttributeData(i,function(e){var t=i.accessors[e];defined(t.bufferView)&&(r[t.bufferView]=!0)});var n={};for(var a in ForEach.accessor(i,function(e){defined(e.bufferView)&&(n[e.bufferView]=defaultValue(n[e.bufferView],[]),n[e.bufferView].push(e))}),n)if(Object.prototype.hasOwnProperty.call(n,a)){e=t[a];var o=n[a];o.sort(function(e,t){return e.byteOffset-t.byteOffset});for(var s=0,l=0,c=o.length,u=0;u<c;++u){var d=o[u],h=computeAccessorByteStride(i,d),p=d.byteOffset,m=d.count*h;delete d.byteStride;var f=u<c-1;if(h!==(f?computeAccessorByteStride(i,o[u+1]):void 0)){var g=clone(e,!0);r[a]&&(g.byteStride=h),g.byteOffset+=s,g.byteLength=p+m-s;for(var _=addToArray(t,g),y=l;y<=u;++y)(d=o[y]).bufferView=_,d.byteOffset=d.byteOffset-s;s=f?o[u+1].byteOffset:void 0,l=u+1}}}removeUnusedElements(i,["accessor","bufferView","buffer"])}function requirePositionAccessorMinMax(r){ForEach.accessorWithSemantic(r,"POSITION",function(e){var t,i=r.accessors[e];defined(i.min)&&defined(i.max)||(t=findAccessorMinMax(r,i),i.min=t.min,i.max=t.max)})}function isNodeEmpty(e){return(!defined(e.children)||0===e.children.length)&&(!defined(e.meshes)||0===e.meshes.length)&&!defined(e.camera)&&!defined(e.skin)&&!defined(e.skeletons)&&!defined(e.jointName)&&(!defined(e.translation)||Cartesian3.fromArray(e.translation).equals(Cartesian3.ZERO))&&(!defined(e.scale)||Cartesian3.fromArray(e.scale).equals(new Cartesian3(1,1,1)))&&(!defined(e.rotation)||Cartesian4.fromArray(e.rotation).equals(new Cartesian4(0,0,0,1)))&&(!defined(e.matrix)||Matrix4.fromColumnMajorArray(e.matrix).equals(Matrix4.IDENTITY))&&!defined(e.extensions)&&!defined(e.extras)}function deleteNode(r,n){ForEach.scene(r,function(e){var t=e.nodes;if(defined(t))for(var i=t.length;0<=i;--i)if(t[i]===n)return void t.splice(i,1)}),ForEach.node(r,function(e,t){var i;!defined(e.children)||-1<(i=e.children.indexOf(n))&&(e.children.splice(i,1),isNodeEmpty(e)&&deleteNode(r,t))}),delete r.nodes[n]}function removeEmptyNodes(i){return ForEach.node(i,function(e,t){isNodeEmpty(e)&&deleteNode(i,t)}),i}function requireAnimationAccessorMinMax(r){ForEach.animation(r,function(e){ForEach.animationSampler(e,function(e){var t,i=r.accessors[e.input];defined(i.min)&&defined(i.max)||(t=findAccessorMinMax(r,i),i.min=t.min,i.max=t.max)})})}function glTF10to20(e){e.asset=defaultValue(e.asset,{}),e.asset.version="2.0",updateInstanceTechniques(e),removeAnimationSamplersIndirection(e),removeEmptyNodes(e),objectsToArrays(e),removeAnimationSamplerNames(e),stripAsset(e),requireKnownExtensions(e),requireByteLength(e),moveByteStrideToBufferView(e),requirePositionAccessorMinMax(e),requireAnimationAccessorMinMax(e),removeBufferType(e),removeTextureProperties(e),requireAttributeSetIndex(e),underscoreApplicationSpecificSemantics(e),updateAccessorComponentTypes(e),clampCameraParameters(e),moveTechniqueRenderStates(e),moveTechniquesToExtension(e),removeEmptyArrays(e)}function ModelLoadResources(){this.initialized=!1,this.resourcesParsed=!1,this.vertexBuffersToCreate=new Queue,this.indexBuffersToCreate=new Queue,this.buffers={},this.pendingBufferLoads=0,this.programsToCreate=new Queue,this.shaders={},this.pendingShaderLoads=0,this.texturesToCreate=new Queue,this.pendingTextureLoads=0,this.texturesToCreateFromBufferView=new Queue,this.pendingBufferViewToImage=0,this.createSamplers=!0,this.createSkins=!0,this.createRuntimeAnimations=!0,this.createVertexArrays=!0,this.createRenderStates=!0,this.createUniformMaps=!0,this.createRuntimeNodes=!0,this.createdBufferViews={},this.primitivesToDecode=new Queue,this.activeDecodingTasks=0,this.pendingDecodingCache=!1,this.skinnedNodesIds=[]}function getSubarray(e,t,i){return e.subarray(t,t+i)}ModelLoadResources.prototype.getBuffer=function(e){return getSubarray(this.buffers[e.buffer],e.byteOffset,e.byteLength)},ModelLoadResources.prototype.finishedPendingBufferLoads=function(){return 0===this.pendingBufferLoads},ModelLoadResources.prototype.finishedBuffersCreation=function(){return 0===this.pendingBufferLoads&&0===this.vertexBuffersToCreate.length&&0===this.indexBuffersToCreate.length},ModelLoadResources.prototype.finishedProgramCreation=function(){return 0===this.pendingShaderLoads&&0===this.programsToCreate.length},ModelLoadResources.prototype.finishedTextureCreation=function(){var e=0===this.pendingTextureLoads,t=0===this.texturesToCreate.length&&0===this.texturesToCreateFromBufferView.length;return e&&t},ModelLoadResources.prototype.finishedEverythingButTextureCreation=function(){var e=0===this.pendingBufferLoads&&0===this.pendingShaderLoads,t=0===this.vertexBuffersToCreate.length&&0===this.indexBuffersToCreate.length&&0===this.programsToCreate.length&&0===this.pendingBufferViewToImage;return this.finishedDecoding()&&e&&t},ModelLoadResources.prototype.finishedDecoding=function(){return 0===this.primitivesToDecode.length&&0===this.activeDecodingTasks&&!this.pendingDecodingCache},ModelLoadResources.prototype.finished=function(){return this.finishedDecoding()&&this.finishedTextureCreation()&&this.finishedEverythingButTextureCreation()};var ModelUtility={updateForwardAxis:function(e){var t=e.gltf.extras.sourceVersion;(defined(t)&&"2.0"!==t||"2.0"!==ModelUtility.getAssetVersion(e.gltf))&&(e._gltfForwardAxis=Axis$1.X)},getAssetVersion:function(e){return defined(e.asset)&&defined(e.asset.version)?e.asset.version:"1.0"},splitIncompatibleMaterials:function(e){var _=e.accessors,y=e.materials,v={};return ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){var t,i,r,n=e.material,a=y[n],o=e.attributes.JOINTS_0;defined(o)&&(i=(t=_[o]).componentType,r=t.type);var s,l=defined(o)&&"VEC4"===r,c=defined(e.attributes.COLOR_0),u=defined(e.targets),d=defined(e.attributes.NORMAL),h=defined(e.attributes.TANGENT),p=defined(e.attributes.TEXCOORD_0),m=p&&defined(e.attributes.TEXCOORD_1),f=defined(e.extensions)&&defined(e.extensions.CESIUM_primitive_outline),g=v[n];defined(g)?g.skinning.skinned===l&&g.hasVertexColors===c&&g.hasMorphTargets===u&&g.hasNormals===d&&g.hasTangents===h&&g.hasTexCoords===p&&g.hasTexCoord1===m&&g.hasOutline===f||(s=clone(a,!0),n=addToArray(y,s),e.material=n,v[n]={skinning:{skinned:l,componentType:i},hasVertexColors:c,hasMorphTargets:u,hasNormals:d,hasTangents:h,hasTexCoords:p,hasTexCoord1:m,hasOutline:f}):v[n]={skinning:{skinned:l,componentType:i},hasVertexColors:c,hasMorphTargets:u,hasNormals:d,hasTangents:h,hasTexCoords:p,hasTexCoord1:m,hasOutline:f}})}),v},getShaderVariable:function(e){return"SCALAR"===e?"float":e.toLowerCase()},ModelState:{NEEDS_LOAD:0,LOADING:1,LOADED:2,FAILED:3},getFailedLoadFunction:function(i,r,n){return function(e){i._state=ModelUtility.ModelState.FAILED;var t="Failed to load "+r+": "+n;defined(e)&&(t+="\n"+e.message),i._readyPromise.reject(new RuntimeError(t))}},parseBuffers:function(r,n){var a=r._loadResources;ForEach.buffer(r.gltf,function(e,t){var i;defined(e.extras._pipeline.source)?a.buffers[t]=e.extras._pipeline.source:defined(n)&&(i=r._resource.getDerivedResource({url:e.uri}),++a.pendingBufferLoads,i.fetchArrayBuffer().then(n(r,t)).otherwise(ModelUtility.getFailedLoadFunction(r,"buffer",i.url)))})}},aMinScratch=new Cartesian3,aMaxScratch=new Cartesian3;function techniqueAttributeForSemantic(e,i){return ForEach.techniqueAttribute(e,function(e,t){if(e.semantic===i)return t})}function ensureSemanticExistenceForPrimitive(e,t){var i=e.accessors,r=e.materials,n=e.extensions.KHR_techniques_webgl,a=n.techniques,o=n.programs,s=n.shaders,l=t.targets,c=t.attributes;for(var u in l)if(l.hasOwnProperty(u)){var d=l[u];for(var h in d)"extras"!==h&&(c[h+"_"+u]=d[h])}var p,m,f,g,_,y=a[r[t.material].extensions.KHR_techniques_webgl.technique],v=s[o[y.program].vertexShader];for(var C in c){c.hasOwnProperty(C)&&(defined(techniqueAttributeForSemantic(y,C))||(p=i[c[C]],"_"===(m=C.toLowerCase()).charAt(0)&&(m=m.slice(1)),f="a_"+m,y.attributes[f]={semantic:C,type:p.componentType},_=(g=v.extras._pipeline).source,_="attribute "+ModelUtility.getShaderVariable(p.type)+" "+f+";\n"+_,g.source=_))}}function getTechniqueAttributeOrUniformFunction(e,r,n,a){return hasExtension(e,"KHR_techniques_webgl")?function(e,t){if(!(e.semantic!==n||a&&defined(e.node)))return t}:function(e,t){var i=r.parameters[e];if(!(i.semantic!==n||a&&defined(i.node)))return t}}ModelUtility.computeBoundingSphere=function(e){for(var t=e.gltf,i=t.nodes,r=t.meshes,n=t.scenes[t.scene].nodes,a=n.length,o=[],s=new Cartesian3(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE),l=new Cartesian3(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE),c=0;c<a;++c){var u=i[n[c]];for(u._transformToRoot=ModelUtility.getTransform(u),o.push(u);0<o.length;){var d=(u=o.pop())._transformToRoot,h=u.mesh;if(defined(h))for(var p=r[h].primitives,m=p.length,f=0;f<m;++f){var g,_,y,v=p[f].attributes.POSITION;!defined(v)||defined((g=ModelUtility.getAccessorMinMax(t,v)).min)&&defined(g.max)&&(_=Cartesian3.fromArray(g.min,0,aMinScratch),y=Cartesian3.fromArray(g.max,0,aMaxScratch),Matrix4.multiplyByPoint(d,_,_),Matrix4.multiplyByPoint(d,y,y),Cartesian3.minimumByComponent(s,_,s),Cartesian3.maximumByComponent(l,y,l))}var C=u.children;if(defined(C))for(var S=C.length,T=0;T<S;++T){var x=i[C[T]];x._transformToRoot=ModelUtility.getTransform(x),Matrix4.multiplyTransformation(d,x._transformToRoot,x._transformToRoot),o.push(x)}delete u._transformToRoot}}var b=BoundingSphere.fromCornerPoints(s,l);return e._forwardAxis===Axis$1.Z&&BoundingSphere.transformWithoutScale(b,Axis$1.Z_UP_TO_X_UP,b),e._upAxis===Axis$1.Y?BoundingSphere.transformWithoutScale(b,Axis$1.Y_UP_TO_Z_UP,b):e._upAxis===Axis$1.X&&BoundingSphere.transformWithoutScale(b,Axis$1.X_UP_TO_Z_UP,b),b},ModelUtility.ensureSemanticExistence=function(t){return ForEach.mesh(t,function(e){ForEach.meshPrimitive(e,function(e){ensureSemanticExistenceForPrimitive(t,e)})}),t},ModelUtility.createAttributeLocations=function(e,t){var i={},r=!1,n=1;if(ForEach.techniqueAttribute(e,function(e,t){/pos/i.test(t)&&!r?(i[t]=0,r=!0):i[t]=n++}),defined(t))for(var a in t)t.hasOwnProperty(a)&&(i[a]=n++);return i},ModelUtility.getAccessorMinMax=function(e,t){var i,r=e.accessors[t],n=r.extensions,a=r.min,o=r.max;return!defined(n)||defined(i=n.WEB3D_quantized_attributes)&&(a=i.decodedMin,o=i.decodedMax),{min:a,max:o}},ModelUtility.getAttributeOrUniformBySemantic=function(i,r,n,a){return ForEach.technique(i,function(e){if(!defined(n)||e.program===n){var t=ForEach.techniqueAttribute(e,getTechniqueAttributeOrUniformFunction(i,e,r,a));return defined(t)?t:ForEach.techniqueUniform(e,getTechniqueAttributeOrUniformFunction(i,e,r,a))}})},ModelUtility.getDiffuseAttributeOrUniform=function(e,t){var i=ModelUtility.getAttributeOrUniformBySemantic(e,"COLOR_0",t);return defined(i)||(i=ModelUtility.getAttributeOrUniformBySemantic(e,"_3DTILESDIFFUSE",t)),i};var nodeTranslationScratch=new Cartesian3,nodeQuaternionScratch=new Quaternion,nodeScaleScratch=new Cartesian3;function replaceAllButFirstInString(e,t,i){t+="(?!\\w)",t=new RegExp(t,"g");var r=e.search(t);return e.replace(t,function(e,t){return r===t?e:i})}function getQuantizedAttributes(e,t){var i=e.accessors[t].extensions;if(defined(i))return i.WEB3D_quantized_attributes}function getAttributeVariableName(e,t,i){var r=t.material,n=e.materials[r];if(hasExtension(e,"KHR_techniques_webgl")&&defined(n.extensions)&&defined(n.extensions.KHR_techniques_webgl)){var a=n.extensions.KHR_techniques_webgl.technique,o=e.extensions.KHR_techniques_webgl.techniques[a];return ForEach.techniqueAttribute(o,function(e,t){if(e.semantic===i)return t})}}function getScalarUniformFunction(e){var t={value:e,clone:function(e,t){return e},func:function(){return t.value}};return t}function getVec2UniformFunction(e){var t={value:Cartesian2.fromArray(e),clone:Cartesian2.clone,func:function(){return t.value}};return t}function getVec3UniformFunction(e){var t={value:Cartesian3.fromArray(e),clone:Cartesian3.clone,func:function(){return t.value}};return t}function getVec4UniformFunction(e){var t={value:Cartesian4.fromArray(e),clone:Cartesian4.clone,func:function(){return t.value}};return t}function getMat2UniformFunction(e){var t={value:Matrix2.fromColumnMajorArray(e),clone:Matrix2.clone,func:function(){return t.value}};return t}function getMat3UniformFunction(e){var t={value:Matrix3.fromColumnMajorArray(e),clone:Matrix3.clone,func:function(){return t.value}};return t}function getMat4UniformFunction(e){var t={value:Matrix4.fromColumnMajorArray(e),clone:Matrix4.clone,func:function(){return t.value}};return t}function DelayLoadedTextureUniform(e,t,i){this._value=void 0,this._textureId=e.index,this._textures=t,this._defaultTexture=i}function getTextureUniformFunction(e,t,i){var r=new DelayLoadedTextureUniform(e,t,i);return r.func=function(){return r.value},r}ModelUtility.getTransform=function(e,t){return defined(e.matrix)?Matrix4.fromColumnMajorArray(e.matrix,t):Matrix4.fromTranslationQuaternionRotationScale(Cartesian3.fromArray(e.translation,0,nodeTranslationScratch),Quaternion.unpack(e.rotation,0,nodeQuaternionScratch),Cartesian3.fromArray(e.scale,0,nodeScaleScratch),t)},ModelUtility.getUsedExtensions=function(e){var t=e.extensionsUsed,i={};if(defined(t))for(var r=t.length,n=0;n<r;n++){i[t[n]]=!0}return i},ModelUtility.getRequiredExtensions=function(e){var t=e.extensionsRequired,i={};if(defined(t))for(var r=t.length,n=0;n<r;n++){i[t[n]]=!0}return i},ModelUtility.supportedExtensions={AGI_articulations:!0,CESIUM_RTC:!0,EXT_texture_webp:!0,KHR_blend:!0,KHR_binary_glTF:!0,KHR_draco_mesh_compression:!0,KHR_materials_common:!0,KHR_techniques_webgl:!0,KHR_materials_unlit:!0,KHR_materials_pbrSpecularGlossiness:!0,KHR_texture_transform:!0,WEB3D_quantized_attributes:!0},ModelUtility.checkSupportedExtensions=function(e,t){for(var i in e)if(e.hasOwnProperty(i)){if(!ModelUtility.supportedExtensions[i])throw new RuntimeError("Unsupported glTF Extension: "+i);if("EXT_texture_webp"===i&&!1===t)throw new RuntimeError("Loaded model requires WebP but browser does not support it.")}},ModelUtility.checkSupportedGlExtensions=function(e,t){if(defined(e))for(var i=e.length,r=0;r<i;r++){var n=e[r];if("OES_element_index_uint"!==n)throw new RuntimeError("Unsupported WebGL Extension: "+n);if(!t.elementIndexUint)throw new RuntimeError("OES_element_index_uint WebGL extension is not enabled.")}},ModelUtility.modifyShaderForDracoQuantizedAttributes=function(e,t,i,r){var n={};for(var a in r)if(r.hasOwnProperty(a)){var o=r[a],s=o.quantization;if(!defined(s))continue;var l=getAttributeVariableName(e,t,a);"_"===a.charAt(0)&&(a=a.substring(1));var c,u,d,h,p,m,f,g,_,y="gltf_u_dec_"+a.toLowerCase();defined(n[y])||(c="gltf_decoded_"+a,u=l.replace("a_","gltf_a_dec_"),d=o.componentsPerAttribute,i=replaceAllButFirstInString(i,l,u),i=(h=s.octEncoded?"vec3":1<d?"vec"+d:"float")+" "+u+";\n"+i,(p=3===d&&"COLOR_0"===a)&&(i=replaceAllButFirstInString(i,u,"vec4("+u+", 1.0)")),_="",_=s.octEncoded?(i="uniform float "+(m=y+"_rangeConstant")+";\n"+i,"\nvoid main() {\n "+u+" = czm_octDecode("+l+".xy, "+m+").zxy;\n "+c+"();\n}\n"):(i="uniform float "+(f=y+"_normConstant")+";\nuniform "+h+" "+(g=y+"_min")+";\n"+i,"\nvoid main() {\n "+u+" = "+g+" + "+l+(p?".xyz":"")+" * "+f+";\n "+c+"();\n}\n"),i=ShaderSource.replaceMain(i,c),i+=_)}return{shader:i}},ModelUtility.modifyShaderForQuantizedAttributes=function(e,t,i){var r,n,a,o,s,l,c,u,d,h,p,m,f={},g=t.attributes;for(var _ in g){g.hasOwnProperty(_)&&(r=getAttributeVariableName(e,t,_),n=t.attributes[_],"_"===_.charAt(0)&&(_=_.substring(1)),o=(a="gltf_u_dec_"+_.toLowerCase())+"_scale",s=a+"_translate",defined(f[a])||defined(f[o])||defined(l=getQuantizedAttributes(e,n))&&(c=l.decodeMatrix,u="gltf_decoded_"+_,d=r.replace("a_","gltf_a_dec_"),i=(p=2<(h=Math.floor(Math.sqrt(c.length)))?"vec"+(h-1):"float")+" "+d+";\n"+(i=replaceAllButFirstInString(i,r,d)),m="",5===h?(i="uniform vec4 "+s+";\n"+(i="uniform mat4 "+o+";\n"+i),m="\nvoid main() {\n "+d+" = "+o+" * "+r+" + "+s+";\n "+u+"();\n}\n",f[o]={mat:4},f[s]={vec:4}):(i="uniform mat"+h+" "+a+";\n"+i,m="\nvoid main() {\n "+d+" = "+p+"("+a+" * vec"+h+"("+r+",1.0));\n "+u+"();\n}\n",f[a]={mat:h}),i=ShaderSource.replaceMain(i,u),i+=m))}return{shader:i,uniforms:f}},Object.defineProperties(DelayLoadedTextureUniform.prototype,{value:{get:function(){if(!defined(this._value)){var e=this._textures[this._textureId];if(!defined(e))return this._defaultTexture;this._value=e}return this._value},set:function(e){this._value=e}}}),DelayLoadedTextureUniform.prototype.clone=function(e){return e},DelayLoadedTextureUniform.prototype.func=void 0;var gltfUniformFunctions={};function scaleFromMatrix5Array(e){return[e[0],e[1],e[2],e[3],e[5],e[6],e[7],e[8],e[10],e[11],e[12],e[13],e[15],e[16],e[17],e[18]]}function translateFromMatrix5Array(e){return[e[20],e[21],e[22],e[23]]}gltfUniformFunctions[WebGLConstants$1.FLOAT]=getScalarUniformFunction,gltfUniformFunctions[WebGLConstants$1.FLOAT_VEC2]=getVec2UniformFunction,gltfUniformFunctions[WebGLConstants$1.FLOAT_VEC3]=getVec3UniformFunction,gltfUniformFunctions[WebGLConstants$1.FLOAT_VEC4]=getVec4UniformFunction,gltfUniformFunctions[WebGLConstants$1.INT]=getScalarUniformFunction,gltfUniformFunctions[WebGLConstants$1.INT_VEC2]=getVec2UniformFunction,gltfUniformFunctions[WebGLConstants$1.INT_VEC3]=getVec3UniformFunction,gltfUniformFunctions[WebGLConstants$1.INT_VEC4]=getVec4UniformFunction,gltfUniformFunctions[WebGLConstants$1.BOOL]=getScalarUniformFunction,gltfUniformFunctions[WebGLConstants$1.BOOL_VEC2]=getVec2UniformFunction,gltfUniformFunctions[WebGLConstants$1.BOOL_VEC3]=getVec3UniformFunction,gltfUniformFunctions[WebGLConstants$1.BOOL_VEC4]=getVec4UniformFunction,gltfUniformFunctions[WebGLConstants$1.FLOAT_MAT2]=getMat2UniformFunction,gltfUniformFunctions[WebGLConstants$1.FLOAT_MAT3]=getMat3UniformFunction,gltfUniformFunctions[WebGLConstants$1.FLOAT_MAT4]=getMat4UniformFunction,gltfUniformFunctions[WebGLConstants$1.SAMPLER_2D]=getTextureUniformFunction,ModelUtility.createUniformFunction=function(e,t,i,r){return gltfUniformFunctions[e](t,i,r)},ModelUtility.createUniformsForDracoQuantizedAttributes=function(e){var t={};for(var i in e)if(e.hasOwnProperty(i)){var r=e[i],n=r.quantization;if(!defined(n))continue;"_"===i.charAt(0)&&(i=i.substring(1));var a="gltf_u_dec_"+i.toLowerCase();if(n.octEncoded){var o=a+"_rangeConstant",s=(1<<n.quantizationBits)-1;t[o]=getScalarUniformFunction(s).func;continue}var l=a+"_normConstant",c=n.range/(1<<n.quantizationBits);t[l]=getScalarUniformFunction(c).func;var u=a+"_min";switch(r.componentsPerAttribute){case 1:t[u]=getScalarUniformFunction(n.minValues).func;break;case 2:t[u]=getVec2UniformFunction(n.minValues).func;break;case 3:t[u]=getVec3UniformFunction(n.minValues).func;break;case 4:t[u]=getVec4UniformFunction(n.minValues).func}}return t},ModelUtility.createUniformsForQuantizedAttributes=function(e,t,i){var r,n=e.accessors,a={},o={},s=t.attributes;for(var l in s)if(s.hasOwnProperty(l)){var c=n[s[l]],u=c.extensions;if("_"===l.charAt(0)&&(l=l.substring(1)),defined(u)){var d=u.WEB3D_quantized_attributes;if(defined(d)){var h=d.decodeMatrix,p="gltf_u_dec_"+l.toLowerCase();switch(c.type){case AttributeType$1.SCALAR:o[p]=getMat2UniformFunction(h).func,a[p]=!0;break;case AttributeType$1.VEC2:o[p]=getMat3UniformFunction(h).func,a[p]=!0;break;case AttributeType$1.VEC3:o[p]=getMat4UniformFunction(h).func,a[p]=!0;break;case AttributeType$1.VEC4:var m=p+"_scale",f=p+"_translate";o[m]=getMat4UniformFunction(scaleFromMatrix5Array(h)).func,o[f]=getVec4UniformFunction(translateFromMatrix5Array(h)).func,a[m]=!0,a[f]=!0}}}}for(var g in i){i.hasOwnProperty(g)&&(a[g]||(defined((r=i[g]).mat)&&(2===r.mat?o[g]=getMat2UniformFunction(Matrix2.IDENTITY).func:3===r.mat?o[g]=getMat3UniformFunction(Matrix3.IDENTITY).func:4===r.mat&&(o[g]=getMat4UniformFunction(Matrix4.IDENTITY).func)),defined(r.vec)&&4===r.vec&&(o[g]=getVec4UniformFunction([0,0,0,0]).func)))}return o};var scratchTranslationRtc=new Cartesian3,gltfSemanticUniforms={MODEL:function(e,t){return function(){return e.model}},VIEW:function(e,t){return function(){return e.view}},PROJECTION:function(e,t){return function(){return e.projection}},MODELVIEW:function(e,t){return function(){return e.modelView}},CESIUM_RTC_MODELVIEW:function(e,t){var i=new Matrix4;return function(){return defined(t._rtcCenter)?(Matrix4.getTranslation(e.model,scratchTranslationRtc),Cartesian3.add(scratchTranslationRtc,t._rtcCenter,scratchTranslationRtc),Matrix4.multiplyByPoint(e.view,scratchTranslationRtc,scratchTranslationRtc),Matrix4.setTranslation(e.modelView,scratchTranslationRtc,i)):e.modelView}},MODELVIEWPROJECTION:function(e,t){return function(){return e.modelViewProjection}},MODELINVERSE:function(e,t){return function(){return e.inverseModel}},VIEWINVERSE:function(e,t){return function(){return e.inverseView}},PROJECTIONINVERSE:function(e,t){return function(){return e.inverseProjection}},MODELVIEWINVERSE:function(e,t){return function(){return e.inverseModelView}},MODELVIEWPROJECTIONINVERSE:function(e,t){return function(){return e.inverseModelViewProjection}},MODELINVERSETRANSPOSE:function(e,t){return function(){return e.inverseTransposeModel}},MODELVIEWINVERSETRANSPOSE:function(e,t){return function(){return e.normal}},VIEWPORT:function(e,t){return function(){return e.viewportCartesian4}}};function processModelMaterialsCommon(c,u){if(u=defaultValue(u,defaultValue.EMPTY_OBJECT),defined(c)&&hasExtension(c,"KHR_materials_common")){hasExtension(c,"KHR_techniques_webgl")||(defined(c.extensions)||(c.extensions={}),c.extensions.KHR_techniques_webgl={programs:[],shaders:[],techniques:[]},c.extensionsUsed.push("KHR_techniques_webgl"),c.extensionsRequired.push("KHR_techniques_webgl"));var d=c.extensions.KHR_techniques_webgl;lightDefaults(c);var h=generateLightParameters(c),p=ModelUtility.splitIncompatibleMaterials(c),m={},f=!1;return(ForEach.material(c,function(e,t){if(defined(e.extensions)&&defined(e.extensions.KHR_materials_common)){var i=e.extensions.KHR_materials_common,r=p[t],n=getTechniqueKey(i,r),a=m[n];defined(a)||(a=generateTechnique(c,d,r,i,h,u.addBatchIdToGeneratedShaders),m[n]=a,f=!0);var o={},s=i.values;for(var l in s)s.hasOwnProperty(l)&&"transparent"!==l&&"doubleSided"!==l&&(o["u_"+l.toLowerCase()]=s[l]);e.extensions.KHR_techniques_webgl={technique:a,values:o},e.alphaMode="OPAQUE",i.transparent&&(e.alphaMode="BLEND"),i.doubleSided&&(e.doubleSided=!0)}}),f)?(ModelUtility.ensureSemanticExistence(c),c):c}}function generateLightParameters(e){var t,i={};if(defined(e.extensions)&&defined(e.extensions.KHR_materials_common)&&(t=e.extensions.KHR_materials_common.lights),defined(t)){var r,n,a=e.nodes;for(var o in a){!a.hasOwnProperty(o)||defined((r=a[o]).extensions)&&defined(r.extensions.KHR_materials_common)&&(defined(n=r.extensions.KHR_materials_common.light)&&defined(t[n])&&(t[n].node=o),delete r.extensions.KHR_materials_common)}var s=0;for(var l in t)if(t.hasOwnProperty(l)){var c=t[l],u=c.type;if("ambient"!==u&&!defined(c.node)){delete t[l];continue}var d="light"+s.toString();switch(c.baseName=d,u){case"ambient":var h=c.ambient;i[d+"Color"]={type:WebGLConstants$1.FLOAT_VEC3,value:h.color};break;case"directional":var p=c.directional;i[d+"Color"]={type:WebGLConstants$1.FLOAT_VEC3,value:p.color},defined(c.node)&&(i[d+"Transform"]={node:c.node,semantic:"MODELVIEW",type:WebGLConstants$1.FLOAT_MAT4});break;case"point":var m=c.point;i[d+"Color"]={type:WebGLConstants$1.FLOAT_VEC3,value:m.color},defined(c.node)&&(i[d+"Transform"]={node:c.node,semantic:"MODELVIEW",type:WebGLConstants$1.FLOAT_MAT4}),i[d+"Attenuation"]={type:WebGLConstants$1.FLOAT_VEC3,value:[m.constantAttenuation,m.linearAttenuation,m.quadraticAttenuation]};break;case"spot":var f=c.spot;i[d+"Color"]={type:WebGLConstants$1.FLOAT_VEC3,value:f.color},defined(c.node)&&(i[d+"Transform"]={node:c.node,semantic:"MODELVIEW",type:WebGLConstants$1.FLOAT_MAT4},i[d+"InverseTransform"]={node:c.node,semantic:"MODELVIEWINVERSE",type:WebGLConstants$1.FLOAT_MAT4,useInFragment:!0}),i[d+"Attenuation"]={type:WebGLConstants$1.FLOAT_VEC3,value:[f.constantAttenuation,f.linearAttenuation,f.quadraticAttenuation]},i[d+"FallOff"]={type:WebGLConstants$1.FLOAT_VEC2,value:[f.fallOffAngle,f.fallOffExponent]}}++s}}return i}function generateTechnique(e,t,i,r,n,a){defined(r)||(r={}),a=defaultValue(a,!1);var o,s=t.techniques,l=t.shaders,c=t.programs,u=r.technique.toUpperCase();defined(e.extensions)&&defined(e.extensions.KHR_materials_common)&&(o=e.extensions.KHR_materials_common.lights);var d=r.values,h=defaultValue(r.jointCount,0),p=!1,m=!1;defined(i)&&(p=i.skinning.skinned,m=i.hasVertexColors);var f="precision highp float;\n",g="precision highp float;\n",_="CONSTANT"!==u,y={u_modelViewMatrix:{semantic:hasExtension(e,"CESIUM_RTC")?"CESIUM_RTC_MODELVIEW":"MODELVIEW",type:WebGLConstants$1.FLOAT_MAT4},u_projectionMatrix:{semantic:"PROJECTION",type:WebGLConstants$1.FLOAT_MAT4}};_&&(y.u_normalMatrix={semantic:"MODELVIEWINVERSETRANSPOSE",type:WebGLConstants$1.FLOAT_MAT3}),p&&(y.u_jointMatrix={count:h,semantic:"JOINTMATRIX",type:WebGLConstants$1.FLOAT_MAT4});var v,C,S,T,x=!1;for(var b in d){d.hasOwnProperty(b)&&"transparent"!==b&&"doubleSided"!==b&&(v=getKHRMaterialsCommonValueType(b,d[b]),C="u_"+b.toLowerCase(),x||v!==WebGLConstants$1.SAMPLER_2D||(x=!0),y[C]={type:v})}if(defined(y.u_diffuse)&&(y.u_diffuse.semantic="_3DTILESDIFFUSE"),defined(n))for(var E in n)n.hasOwnProperty(E)&&(y[C="u_"+E]=n[E]);for(C in y){y.hasOwnProperty(C)&&(T=defined((S=y[C]).count)?"["+S.count+"]":"",S.type!==WebGLConstants$1.FLOAT_MAT3&&S.type!==WebGLConstants$1.FLOAT_MAT4||S.useInFragment?(g+="uniform "+webGLConstantToGlslType(S.type)+" "+C+T+";\n",delete S.useInFragment):f+="uniform "+webGLConstantToGlslType(S.type)+" "+C+T+";\n")}var P="";p&&(P+=" mat4 skinMatrix =\n a_weight.x * u_jointMatrix[int(a_joint.x)] +\n a_weight.y * u_jointMatrix[int(a_joint.y)] +\n a_weight.z * u_jointMatrix[int(a_joint.z)] +\n a_weight.w * u_jointMatrix[int(a_joint.w)];\n");var A,w={a_position:{semantic:"POSITION"}};f+="attribute vec3 a_position;\n",f+="varying vec3 v_positionEC;\n",P+=p?" vec4 pos = u_modelViewMatrix * skinMatrix * vec4(a_position,1.0);\n":" vec4 pos = u_modelViewMatrix * vec4(a_position,1.0);\n",P+=" v_positionEC = pos.xyz;\n",P+=" gl_Position = u_projectionMatrix * pos;\n",g+="varying vec3 v_positionEC;\n",_&&(w.a_normal={semantic:"NORMAL"},f+="attribute vec3 a_normal;\n",f+="varying vec3 v_normal;\n",P+=p?" v_normal = u_normalMatrix * mat3(skinMatrix) * a_normal;\n":" v_normal = u_normalMatrix * a_normal;\n",g+="varying vec3 v_normal;\n"),x&&(w.a_texcoord_0={semantic:"TEXCOORD_0"},f+="attribute vec2 a_texcoord_0;\n",f+="varying vec2 "+(A="v_texcoord_0")+";\n",P+=" "+A+" = a_texcoord_0;\n",g+="varying vec2 "+A+";\n"),p&&(w.a_joint={semantic:"JOINTS_0"},w.a_weight={semantic:"WEIGHTS_0"},f+="attribute vec4 a_joint;\n",f+="attribute vec4 a_weight;\n"),m&&(w.a_vertexColor={semantic:"COLOR_0"},f+="attribute vec4 a_vertexColor;\n",f+="varying vec4 v_vertexColor;\n",P+=" v_vertexColor = a_vertexColor;\n",g+="varying vec4 v_vertexColor;\n"),a&&(w.a_batchId={semantic:"_BATCHID"},f+="attribute float a_batchId;\n");var D,M,I,R,O,L,F=_&&("BLINN"===u||"PHONG"===u)&&defined(y.u_specular)&&defined(y.u_shininess)&&0<y.u_shininess,N=!1,B=!1,V="";for(var k in o){o.hasOwnProperty(k)&&(M=(D=o[k]).type.toLowerCase(),V+=" {\n",R="u_"+(I=D.baseName)+"Color","ambient"===M?(B=!0,V+=" ambientLight += "+R+";\n"):_&&(N=!0,O="v_"+I+"Direction",L="v_"+I+"Position","point"!==M&&(f+="varying vec3 "+O+";\n",g+="varying vec3 "+O+";\n",P+=" "+O+" = mat3(u_"+I+"Transform) * vec3(0.,0.,1.);\n","directional"===M&&(V+=" vec3 l = normalize("+O+");\n")),"directional"!==M?(f+="varying vec3 "+L+";\n",g+="varying vec3 "+L+";\n",P+=" "+L+" = u_"+I+"Transform[3].xyz;\n",V+=" vec3 VP = "+L+" - v_positionEC;\n",V+=" vec3 l = normalize(VP);\n",V+=" float range = length(VP);\n",V+=" float attenuation = 1.0 / (u_"+I+"Attenuation.x + ",V+="(u_"+I+"Attenuation.y * range) + ",V+="(u_"+I+"Attenuation.z * range * range));\n"):V+=" float attenuation = 1.0;\n","spot"===M&&(V+=" float spotDot = dot(l, normalize("+O+"));\n",V+=" if (spotDot < cos(u_"+I+"FallOff.x * 0.5))\n",V+=" {\n",V+=" attenuation = 0.0;\n",V+=" }\n",V+=" else\n",V+=" {\n",V+=" attenuation *= max(0.0, pow(spotDot, u_"+I+"FallOff.y));\n",V+=" }\n"),V+=" diffuseLight += "+R+"* max(dot(normal,l), 0.) * attenuation;\n",F&&("BLINN"===u?(V+=" vec3 h = normalize(l + viewDir);\n",V+=" float specularIntensity = max(0., pow(max(dot(normal, h), 0.), u_shininess)) * attenuation;\n"):(V+=" vec3 reflectDir = reflect(-l, normal);\n",V+=" float specularIntensity = max(0., pow(max(dot(reflectDir, viewDir), 0.), u_shininess)) * attenuation;\n"),V+=" specularLight += "+R+" * specularIntensity;\n")),V+=" }\n")}B||(V+=" ambientLight += vec3(0.2, 0.2, 0.2);\n"),N||"CONSTANT"===u||(g+="#ifdef USE_CUSTOM_LIGHT_COLOR \n",g+="uniform vec3 gltf_lightColor; \n",g+="#endif \n",V+="#ifndef USE_CUSTOM_LIGHT_COLOR \n",V+=" vec3 lightColor = czm_lightColor;\n",V+="#else \n",V+=" vec3 lightColor = gltf_lightColor;\n",V+="#endif \n",V+=" vec3 l = normalize(czm_lightDirectionEC);\n",V+=" diffuseLight += lightColor * max(dot(normal,l), 0.2);\n",F&&("BLINN"===u?(V+=" vec3 h = normalize(l + viewDir);\n",V+=" float specularIntensity = max(0., pow(max(dot(normal, h), 0.), u_shininess));\n"):(V+=" vec3 reflectDir = reflect(-l, normal);\n",V+=" float specularIntensity = max(0., pow(max(dot(reflectDir, viewDir), 0.), u_shininess));\n"),V+=" specularLight += lightColor * specularIntensity;\n")),f+="void main(void) {\n",f+=P,f+="}\n",g+="void main(void) {\n";var z,$=" vec3 color = vec3(0.0, 0.0, 0.0);\n";_&&(g+=" vec3 normal = normalize(v_normal);\n",r.doubleSided&&(g+=" if (czm_backFacing())\n",g+=" {\n",g+=" normal = -normal;\n",g+=" }\n")),z="CONSTANT"!==u?(defined(y.u_diffuse)&&(y.u_diffuse.type===WebGLConstants$1.SAMPLER_2D?g+=" vec4 diffuse = texture2D(u_diffuse, "+A+");\n":g+=" vec4 diffuse = u_diffuse;\n",g+=" vec3 diffuseLight = vec3(0.0, 0.0, 0.0);\n",$+=" color += diffuse.rgb * diffuseLight;\n"),F&&(y.u_specular.type===WebGLConstants$1.SAMPLER_2D?g+=" vec3 specular = texture2D(u_specular, "+A+").rgb;\n":g+=" vec3 specular = u_specular.rgb;\n",g+=" vec3 specularLight = vec3(0.0, 0.0, 0.0);\n",$+=" color += specular * specularLight;\n"),defined(y.u_transparency)?" gl_FragColor = vec4(color * diffuse.a * u_transparency, diffuse.a * u_transparency);\n":" gl_FragColor = vec4(color * diffuse.a, diffuse.a);\n"):defined(y.u_transparency)?" gl_FragColor = vec4(color * u_transparency, u_transparency);\n":" gl_FragColor = vec4(color, 1.0);\n",m&&($+=" color *= v_vertexColor.rgb;\n"),defined(y.u_emission)&&(y.u_emission.type===WebGLConstants$1.SAMPLER_2D?g+=" vec3 emission = texture2D(u_emission, "+A+").rgb;\n":g+=" vec3 emission = u_emission.rgb;\n",$+=" color += emission;\n"),!defined(y.u_ambient)&&"CONSTANT"===u||(defined(y.u_ambient)?y.u_ambient.type===WebGLConstants$1.SAMPLER_2D?g+=" vec3 ambient = texture2D(u_ambient, "+A+").rgb;\n":g+=" vec3 ambient = u_ambient.rgb;\n":g+=" vec3 ambient = diffuse.rgb;\n",$+=" color += ambient * ambientLight;\n"),g+=" vec3 viewDir = -normalize(v_positionEC);\n",g+=" vec3 ambientLight = vec3(0.0, 0.0, 0.0);\n",g+=V,g+=$,g+=z,g+="}\n";var U=addToArray(l,{type:WebGLConstants$1.VERTEX_SHADER,extras:{_pipeline:{source:f,extension:".glsl"}}}),G=addToArray(l,{type:WebGLConstants$1.FRAGMENT_SHADER,extras:{_pipeline:{source:g,extension:".glsl"}}}),H=addToArray(c,{fragmentShader:G,vertexShader:U});return addToArray(s,{attributes:w,program:H,uniforms:y})}function getKHRMaterialsCommonValueType(e,t){var i=defined(t.value)?t.value:defined(t.index)?[t.index]:t;switch(e){case"ambient":case"diffuse":case"emission":case"specular":return 1===i.length?WebGLConstants$1.SAMPLER_2D:WebGLConstants$1.FLOAT_VEC4;case"shininess":case"transparency":return WebGLConstants$1.FLOAT;case"transparent":case"doubleSided":return WebGLConstants$1.BOOL}}function getTechniqueKey(e,t){var i="";i+="technique:"+e.technique+";";for(var r=e.values,n=Object.keys(r).sort(),a=n.length,o=0;o<a;++o){var s=n[o];r.hasOwnProperty(s)&&(i+=s+":"+getKHRMaterialsCommonValueType(s,r[s]),i+=";")}var l,c=defaultValue(e.jointCount,0);return i+=c.toString()+";",defined(t)&&(l=t.skinning,0<c&&(i+=l.type+";"),i+=t.hasVertexColors),i}function lightDefaults(e){var t=e.extensions.KHR_materials_common;if(defined(t)&&defined(t.lights))for(var i=t.lights,r=i.length,n=0;n<r;n++){var a,o,s,l,c=i[n];"ambient"===c.type?(defined(c.ambient)||(c.ambient={}),defined((a=c.ambient).color)||(a.color=[1,1,1])):"directional"===c.type?(defined(c.directional)||(c.directional={}),defined((o=c.directional).color)||(o.color=[1,1,1])):"point"===c.type?(defined(c.point)||(c.point={}),defined((s=c.point).color)||(s.color=[1,1,1]),s.constantAttenuation=defaultValue(s.constantAttenuation,1),s.linearAttenuation=defaultValue(s.linearAttenuation,0),s.quadraticAttenuation=defaultValue(s.quadraticAttenuation,0)):"spot"===c.type&&(defined(c.spot)||(c.spot={}),defined((l=c.spot).color)||(l.color=[1,1,1]),l.constantAttenuation=defaultValue(l.constantAttenuation,1),l.fallOffAngle=defaultValue(l.fallOffAngle,3.14159265),l.fallOffExponent=defaultValue(l.fallOffExponent,0),l.linearAttenuation=defaultValue(l.linearAttenuation,0),l.quadraticAttenuation=defaultValue(l.quadraticAttenuation,0))}}function processPbrMaterials(n,a){if(a=defaultValue(a,defaultValue.EMPTY_OBJECT),hasExtension(n,"KHR_techniques_webgl"))return n;if(!defined(n.materials)||0===n.materials.length)return n;defined(n.extensions)||(n.extensions={}),defined(n.extensionsUsed)||(n.extensionsUsed=[]),defined(n.extensionsRequired)||(n.extensionsRequired=[]),n.extensions.KHR_techniques_webgl={programs:[],shaders:[],techniques:[]},n.extensionsUsed.push("KHR_techniques_webgl"),n.extensionsRequired.push("KHR_techniques_webgl");var o=ModelUtility.splitIncompatibleMaterials(n);return ForEach.material(n,function(e,t){var i={},r=generateTechnique$1(n,e,t,i,o,a);defined(e.extensions)||(e.extensions={}),e.extensions.KHR_techniques_webgl={values:i,technique:r}}),ModelUtility.ensureSemanticExistence(n),n}function isSpecularGlossinessMaterial(e){return defined(e.extensions)&&defined(e.extensions.KHR_materials_pbrSpecularGlossiness)}function addTextureCoordinates(e,t,i,r,n){var a,o=i[t];return defined(o)&&defined(o.texCoord)&&1===o.texCoord&&(r=r.replace("0","1")),defined(i[t+"Offset"])?(a=t+"Coord",n.fragmentShaderMain+=" vec2 "+a+" = computeTexCoord("+r+", "+t+"Offset, "+t+"Rotation, "+t+"Scale);\n"):a=r,a}ModelUtility.getGltfSemanticUniforms=function(){return gltfSemanticUniforms};var DEFAULT_TEXTURE_OFFSET=[0,0],DEFAULT_TEXTURE_ROTATION=[0],DEFAULT_TEXTURE_SCALE=[1,1];function handleKHRTextureTransform(e,t,i){var r,n;-1!==e.indexOf("Texture")&&defined(t.extensions)&&defined(t.extensions.KHR_texture_transform)&&(r="u_"+e,n=t.extensions.KHR_texture_transform,i[r+"Offset"]=defaultValue(n.offset,DEFAULT_TEXTURE_OFFSET),i[r+"Rotation"]=defaultValue(n.rotation,DEFAULT_TEXTURE_ROTATION),i[r+"Scale"]=defaultValue(n.scale,DEFAULT_TEXTURE_SCALE),defined(t.texCoord)&&defined(n.texCoord)&&(i[r].texCoord=n.texCoord))}function generateTechnique$1(e,t,i,r,n,a){var o,s,l,c=defaultValue(a.addBatchIdToGeneratedShaders,!1),u=e.extensions.KHR_techniques_webgl,d=u.techniques,h=u.shaders,p=u.programs,m=isSpecularGlossinessMaterial(t),f=t.pbrMetallicRoughness;if(defined(f)&&!m)for(s in f)f.hasOwnProperty(s)&&(l=f[s],handleKHRTextureTransform(s,r[o="u_"+s]=l,r));if(m){var g=t.extensions.KHR_materials_pbrSpecularGlossiness;for(s in g)g.hasOwnProperty(s)&&(l=g[s],handleKHRTextureTransform(s,r[o="u_"+s]=l,r))}for(var _ in t)t.hasOwnProperty(_)&&(0<=_.indexOf("Texture")||0<=_.indexOf("Factor"))&&(l=t[_],handleKHRTextureTransform(_,r[o="u_"+_]=l,r));var y,v="precision highp float;\n",C="precision highp float;\n";defined(e.skins)&&(y=e.skins[0]);var S,T=defined(y)?y.joints:[],x=T.length,b=n[i],E=!1,P=!1,A=!1,w=!1,D=!1,M=!1,I=!1,R=!1,O=!1;defined(b)&&(E=b.skinning.skinned&&0<T.length,P=b.hasVertexColors,A=b.hasMorphTargets,w=b.hasNormals,D=b.hasTangents,M=b.hasTexCoords,I=b.hasTexCoord1,R=b.hasOutline),A&&ForEach.mesh(e,function(e){ForEach.meshPrimitive(e,function(e){var t;e.material!==i||defined(t=e.targets)&&(S=t)})});var L={u_modelViewMatrix:{semantic:hasExtension(e,"CESIUM_RTC")?"CESIUM_RTC_MODELVIEW":"MODELVIEW",type:WebGLConstants$1.FLOAT_MAT4},u_projectionMatrix:{semantic:"PROJECTION",type:WebGLConstants$1.FLOAT_MAT4}};defined(t.extensions)&&defined(t.extensions.KHR_materials_unlit)&&(D=w=!(O=!0)),w&&(L.u_normalMatrix={semantic:"MODELVIEWINVERSETRANSPOSE",type:WebGLConstants$1.FLOAT_MAT3}),E&&(L.u_jointMatrix={count:x,semantic:"JOINTMATRIX",type:WebGLConstants$1.FLOAT_MAT4}),A&&(L.u_morphWeights={count:S.length,semantic:"MORPHWEIGHTS",type:WebGLConstants$1.FLOAT});var F=t.alphaMode;for(o in defined(F)&&"MASK"===F&&(L.u_alphaCutoff={semantic:"ALPHACUTOFF",type:WebGLConstants$1.FLOAT}),r)r.hasOwnProperty(o)&&(L[o]={type:getPBRValueType(o)});var N,B,V=defaultValue(L.u_baseColorTexture,L.u_baseColorFactor);for(o in defined(V)&&(V.semantic="_3DTILESDIFFUSE"),L){L.hasOwnProperty(o)&&(B=defined((N=L[o]).count)?"["+N.count+"]":"",N.type!==WebGLConstants$1.FLOAT_MAT3&&N.type!==WebGLConstants$1.FLOAT_MAT4&&"u_morphWeights"!==o||N.useInFragment?(C+="uniform "+webGLConstantToGlslType(N.type)+" "+o+B+";\n",delete N.useInFragment):v+="uniform "+webGLConstantToGlslType(N.type)+" "+o+B+";\n")}R&&(C+="uniform sampler2D u_outlineTexture;\n");var k="";E&&(k+=" mat4 skinMatrix =\n a_weight.x * u_jointMatrix[int(a_joint.x)] +\n a_weight.y * u_jointMatrix[int(a_joint.y)] +\n a_weight.z * u_jointMatrix[int(a_joint.z)] +\n a_weight.w * u_jointMatrix[int(a_joint.w)];\n");var z={a_position:{semantic:"POSITION"}};if(R&&(z.a_outlineCoordinates={semantic:"_OUTLINE_COORDINATES"}),v+="attribute vec3 a_position;\n",w&&(v+="varying vec3 v_positionEC;\n"),R&&(v+="attribute vec3 a_outlineCoordinates;\n",v+="varying vec3 v_outlineCoordinates;\n"),k+=" vec3 weightedPosition = a_position;\n",w&&(k+=" vec3 weightedNormal = a_normal;\n"),D&&(k+=" vec4 weightedTangent = a_tangent;\n"),A)for(var $=0;$<S.length;$++){var U,G=S[$];for(var H in G){G.hasOwnProperty(H)&&"extras"!==H&&(z[U="a_"+H+"_"+$]={semantic:H+"_"+$},v+="attribute vec3 "+U+";\n","POSITION"===H?k+=" weightedPosition += u_morphWeights["+$+"] * "+U+";\n":"NORMAL"===H?k+=" weightedNormal += u_morphWeights["+$+"] * "+U+";\n":D&&"TANGENT"===H&&(k+=" weightedTangent.xyz += u_morphWeights["+$+"] * "+U+";\n"))}}k+=E?" vec4 position = skinMatrix * vec4(weightedPosition, 1.0);\n":" vec4 position = vec4(weightedPosition, 1.0);\n",k+=" position = u_modelViewMatrix * position;\n",w&&(k+=" v_positionEC = position.xyz;\n"),k+=" gl_Position = u_projectionMatrix * position;\n",R&&(k+=" v_outlineCoordinates = a_outlineCoordinates;\n"),w&&(z.a_normal={semantic:"NORMAL"},v+="attribute vec3 a_normal;\n",v+="varying vec3 v_normal;\n",k+=E?" v_normal = u_normalMatrix * mat3(skinMatrix) * weightedNormal;\n":" v_normal = u_normalMatrix * weightedNormal;\n",C+="varying vec3 v_normal;\n",C+="varying vec3 v_positionEC;\n"),D&&(z.a_tangent={semantic:"TANGENT"},v+="attribute vec4 a_tangent;\n",v+="varying vec4 v_tangent;\n",k+=" v_tangent.xyz = u_normalMatrix * weightedTangent.xyz;\n",k+=" v_tangent.w = weightedTangent.w;\n",C+="varying vec4 v_tangent;\n"),R&&(C+="varying vec3 v_outlineCoordinates;\n");var W,q,j,Y,X,Q,J,Z,K,ee,te="";M&&(z.a_texcoord_0={semantic:"TEXCOORD_0"},v+="attribute vec2 a_texcoord_0;\n",v+="varying vec2 "+(W="v_texcoord_0")+";\n",k+=" "+W+" = a_texcoord_0;\n",C+="varying vec2 "+W+";\n",I&&(z.a_texcoord_1={semantic:"TEXCOORD_1"},v+="attribute vec2 a_texcoord_1;\n",v+="varying vec2 "+(q=W.replace("0","1"))+";\n",k+=" "+q+" = a_texcoord_1;\n",C+="varying vec2 "+q+";\n"),Y=addTextureCoordinates(e,"u_normalTexture",r,W,j={fragmentShaderMain:te}),X=addTextureCoordinates(e,"u_baseColorTexture",r,W,j),Q=addTextureCoordinates(e,"u_specularGlossinessTexture",r,W,j),J=addTextureCoordinates(e,"u_diffuseTexture",r,W,j),Z=addTextureCoordinates(e,"u_metallicRoughnessTexture",r,W,j),K=addTextureCoordinates(e,"u_occlusionTexture",r,W,j),ee=addTextureCoordinates(e,"u_emissiveTexture",r,W,j),te=j.fragmentShaderMain),E&&(z.a_joint={semantic:"JOINTS_0"},z.a_weight={semantic:"WEIGHTS_0"},v+="attribute vec4 a_joint;\n",v+="attribute vec4 a_weight;\n"),P&&(z.a_vertexColor={semantic:"COLOR_0"},v+="attribute vec4 a_vertexColor;\n",v+="varying vec4 v_vertexColor;\n",k+=" v_vertexColor = a_vertexColor;\n",C+="varying vec4 v_vertexColor;\n"),c&&(z.a_batchId={semantic:"_BATCHID"},v+="attribute float a_batchId;\n"),v+="void main(void) \n{\n",v+=k,v+="}\n",w&&(C+="const float M_PI = 3.141592653589793;\n",C+="vec3 lambertianDiffuse(vec3 diffuseColor) \n{\n return diffuseColor / M_PI;\n}\n\n",C+="vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH) \n{\n return f0 + (f90 - f0) * pow(clamp(1.0 - VdotH, 0.0, 1.0), 5.0);\n}\n\n",C+="vec3 fresnelSchlick(float metalness, float VdotH) \n{\n return metalness + (vec3(1.0) - metalness) * pow(1.0 - VdotH, 5.0);\n}\n\n",C+="float smithVisibilityG1(float NdotV, float roughness) \n{\n float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;\n return NdotV / (NdotV * (1.0 - k) + k);\n}\n\n",C+="float smithVisibilityGGX(float roughness, float NdotL, float NdotV) \n{\n return smithVisibilityG1(NdotL, roughness) * smithVisibilityG1(NdotV, roughness);\n}\n\n",C+="float GGX(float roughness, float NdotH) \n{\n float roughnessSquared = roughness * roughness;\n float f = (NdotH * roughnessSquared - NdotH) * NdotH + 1.0;\n return roughnessSquared / (M_PI * f * f);\n}\n\n"),C+="vec3 SRGBtoLINEAR3(vec3 srgbIn) \n{\n return pow(srgbIn, vec3(2.2));\n}\n\n",C+="vec4 SRGBtoLINEAR4(vec4 srgbIn) \n{\n vec3 linearOut = pow(srgbIn.rgb, vec3(2.2));\n return vec4(linearOut, srgbIn.a);\n}\n\n",C+="vec3 applyTonemapping(vec3 linearIn) \n{\n#ifndef HDR \n return czm_acesTonemapping(linearIn);\n#else \n return linearIn;\n#endif \n}\n\n",C+="vec3 LINEARtoSRGB(vec3 linearIn) \n{\n#ifndef HDR \n return pow(linearIn, vec3(1.0/2.2));\n#else \n return linearIn;\n#endif \n}\n\n",C+="vec2 computeTexCoord(vec2 texCoords, vec2 offset, float rotation, vec2 scale) \n{\n rotation = -rotation; \n mat3 transform = mat3(\n cos(rotation) * scale.x, sin(rotation) * scale.x, 0.0, \n -sin(rotation) * scale.y, cos(rotation) * scale.y, 0.0, \n offset.x, offset.y, 1.0); \n vec2 transformedTexCoords = (transform * vec3(fract(texCoords), 1.0)).xy; \n return transformedTexCoords; \n}\n\n",C+="#ifdef USE_IBL_LIGHTING \n",C+="uniform vec2 gltf_iblFactor; \n",C+="#endif \n",C+="#ifdef USE_CUSTOM_LIGHT_COLOR \n",C+="uniform vec3 gltf_lightColor; \n",C+="#endif \n",C+="void main(void) \n{\n",C+=te,w&&(C+=" vec3 ng = normalize(v_normal);\n",C+=" vec3 positionWC = vec3(czm_inverseView * vec4(v_positionEC, 1.0));\n",defined(r.u_normalTexture)?D?(C+=" vec3 t = normalize(v_tangent.xyz);\n",C+=" vec3 b = normalize(cross(ng, t) * v_tangent.w);\n",C+=" mat3 tbn = mat3(t, b, ng);\n",C+=" vec3 n = texture2D(u_normalTexture, "+Y+").rgb;\n",C+=" n = normalize(tbn * (2.0 * n - 1.0));\n"):(C="#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\n"+C,C+="#ifdef GL_OES_standard_derivatives\n",C+=" vec3 pos_dx = dFdx(v_positionEC);\n",C+=" vec3 pos_dy = dFdy(v_positionEC);\n",C+=" vec3 tex_dx = dFdx(vec3("+Y+",0.0));\n",C+=" vec3 tex_dy = dFdy(vec3("+Y+",0.0));\n",C+=" vec3 t = (tex_dy.t * pos_dx - tex_dx.t * pos_dy) / (tex_dx.s * tex_dy.t - tex_dy.s * tex_dx.t);\n",C+=" t = normalize(t - ng * dot(ng, t));\n",C+=" vec3 b = normalize(cross(ng, t));\n",C+=" mat3 tbn = mat3(t, b, ng);\n",C+=" vec3 n = texture2D(u_normalTexture, "+Y+").rgb;\n",C+=" n = normalize(tbn * (2.0 * n - 1.0));\n",C+="#else\n",C+=" vec3 n = ng;\n",C+="#endif\n"):C+=" vec3 n = ng;\n",t.doubleSided&&(C+=" if (czm_backFacing())\n",C+=" {\n",C+=" n = -n;\n",C+=" }\n")),defined(r.u_baseColorTexture)?(C+=" vec4 baseColorWithAlpha = SRGBtoLINEAR4(texture2D(u_baseColorTexture, "+X+"));\n",defined(r.u_baseColorFactor)&&(C+=" baseColorWithAlpha *= u_baseColorFactor;\n")):defined(r.u_baseColorFactor)?C+=" vec4 baseColorWithAlpha = u_baseColorFactor;\n":C+=" vec4 baseColorWithAlpha = vec4(1.0);\n",P&&(C+=" baseColorWithAlpha *= v_vertexColor;\n"),C+=" vec3 baseColor = baseColorWithAlpha.rgb;\n",w?(m?(defined(r.u_specularGlossinessTexture)?(C+=" vec4 specularGlossiness = SRGBtoLINEAR4(texture2D(u_specularGlossinessTexture, "+Q+"));\n",C+=" vec3 specular = specularGlossiness.rgb;\n",C+=" float glossiness = specularGlossiness.a;\n",defined(r.u_specularFactor)&&(C+=" specular *= u_specularFactor;\n"),defined(r.u_glossinessFactor)&&(C+=" glossiness *= u_glossinessFactor;\n")):(defined(r.u_specularFactor)?C+=" vec3 specular = clamp(u_specularFactor, vec3(0.0), vec3(1.0));\n":C+=" vec3 specular = vec3(1.0);\n",defined(r.u_glossinessFactor)?C+=" float glossiness = clamp(u_glossinessFactor, 0.0, 1.0);\n":C+=" float glossiness = 1.0;\n"),defined(r.u_diffuseTexture)?(C+=" vec4 diffuse = SRGBtoLINEAR4(texture2D(u_diffuseTexture, "+J+"));\n",defined(r.u_diffuseFactor)&&(C+=" diffuse *= u_diffuseFactor;\n")):defined(r.u_diffuseFactor)?C+=" vec4 diffuse = clamp(u_diffuseFactor, vec4(0.0), vec4(1.0));\n":C+=" vec4 diffuse = vec4(1.0);\n"):defined(r.u_metallicRoughnessTexture)?(C+=" vec3 metallicRoughness = texture2D(u_metallicRoughnessTexture, "+Z+").rgb;\n",C+=" float metalness = clamp(metallicRoughness.b, 0.0, 1.0);\n",C+=" float roughness = clamp(metallicRoughness.g, 0.04, 1.0);\n",defined(r.u_metallicFactor)&&(C+=" metalness *= u_metallicFactor;\n"),defined(r.u_roughnessFactor)&&(C+=" roughness *= u_roughnessFactor;\n")):(defined(r.u_metallicFactor)?C+=" float metalness = clamp(u_metallicFactor, 0.0, 1.0);\n":C+=" float metalness = 1.0;\n",defined(r.u_roughnessFactor)?C+=" float roughness = clamp(u_roughnessFactor, 0.04, 1.0);\n":C+=" float roughness = 1.0;\n"),C+=" vec3 v = -normalize(v_positionEC);\n",C+="#ifndef USE_CUSTOM_LIGHT_COLOR \n",C+=" vec3 lightColorHdr = czm_lightColorHdr;\n",C+="#else \n",C+=" vec3 lightColorHdr = gltf_lightColor;\n",C+="#endif \n",C+=" vec3 l = normalize(czm_lightDirectionEC);\n",C+=" vec3 h = normalize(v + l);\n",C+=" float NdotL = clamp(dot(n, l), 0.001, 1.0);\n",C+=" float NdotV = abs(dot(n, v)) + 0.001;\n",C+=" float NdotH = clamp(dot(n, h), 0.0, 1.0);\n",C+=" float LdotH = clamp(dot(l, h), 0.0, 1.0);\n",C+=" float VdotH = clamp(dot(v, h), 0.0, 1.0);\n",C+=" vec3 f0 = vec3(0.04);\n",m?(C+=" float roughness = 1.0 - glossiness;\n",C+=" vec3 diffuseColor = diffuse.rgb * (1.0 - max(max(specular.r, specular.g), specular.b));\n",C+=" vec3 specularColor = specular;\n"):(C+=" vec3 diffuseColor = baseColor * (1.0 - metalness) * (1.0 - f0);\n",C+=" vec3 specularColor = mix(f0, baseColor, metalness);\n"),C+=" float alpha = roughness * roughness;\n",C+=" float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\n",C+=" vec3 r90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0));\n",C+=" vec3 r0 = specularColor.rgb;\n",C+=" vec3 F = fresnelSchlick2(r0, r90, VdotH);\n",C+=" float G = smithVisibilityGGX(alpha, NdotL, NdotV);\n",C+=" float D = GGX(alpha, NdotH);\n",C+=" vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor);\n",C+=" vec3 specularContribution = F * G * D / (4.0 * NdotL * NdotV);\n",C+=" vec3 color = NdotL * lightColorHdr * (diffuseContribution + specularContribution);\n",C+="#if defined(USE_IBL_LIGHTING) && !defined(DIFFUSE_IBL) && !defined(SPECULAR_IBL) \n",C+=" vec3 r = normalize(czm_inverseViewRotation * normalize(reflect(v, n)));\n",C+=" float vertexRadius = length(positionWC);\n",C+=" float horizonDotNadir = 1.0 - min(1.0, czm_ellipsoidRadii.x / vertexRadius);\n",C+=" float reflectionDotNadir = dot(r, normalize(positionWC));\n",C+=" r.x = -r.x;\n",C+=" r = -normalize(czm_temeToPseudoFixed * r);\n",C+=" r.x = -r.x;\n",C+=" float inverseRoughness = 1.04 - roughness;\n",C+=" inverseRoughness *= inverseRoughness;\n",C+=" vec3 sceneSkyBox = textureCube(czm_environmentMap, r).rgb * inverseRoughness;\n",C+=" float atmosphereHeight = 0.05;\n",C+=" float blendRegionSize = 0.1 * ((1.0 - inverseRoughness) * 8.0 + 1.1 - horizonDotNadir);\n",C+=" float blendRegionOffset = roughness * -1.0;\n",C+=" float farAboveHorizon = clamp(horizonDotNadir - blendRegionSize * 0.5 + blendRegionOffset, 1.0e-10 - blendRegionSize, 0.99999);\n",C+=" float aroundHorizon = clamp(horizonDotNadir + blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999);\n",C+=" float farBelowHorizon = clamp(horizonDotNadir + blendRegionSize * 1.5, 1.0e-10 - blendRegionSize, 0.99999);\n",C+=" float smoothstepHeight = smoothstep(0.0, atmosphereHeight, horizonDotNadir);\n",C+=" vec3 belowHorizonColor = mix(vec3(0.1, 0.15, 0.25), vec3(0.4, 0.7, 0.9), smoothstepHeight);\n",C+=" vec3 nadirColor = belowHorizonColor * 0.5;\n",C+=" vec3 aboveHorizonColor = mix(vec3(0.9, 1.0, 1.2), belowHorizonColor, roughness * 0.5);\n",C+=" vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.75);\n",C+=" vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, smoothstepHeight);\n",C+=" vec3 blueSkyDiffuseColor = vec3(0.7, 0.85, 0.9);\n",C+=" float diffuseIrradianceFromEarth = (1.0 - horizonDotNadir) * (reflectionDotNadir * 0.25 + 0.75) * smoothstepHeight;\n",C+=" float diffuseIrradianceFromSky = (1.0 - smoothstepHeight) * (1.0 - (reflectionDotNadir * 0.25 + 0.25));\n",C+=" vec3 diffuseIrradiance = blueSkyDiffuseColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0);\n",C+=" float notDistantRough = (1.0 - horizonDotNadir * roughness * 0.8);\n",C+=" vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * notDistantRough);\n",C+=" specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, reflectionDotNadir) * inverseRoughness);\n",C+=" specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n",C+="#ifdef USE_SUN_LUMINANCE \n",C+=" float LdotZenith = clamp(dot(normalize(czm_inverseViewRotation * l), normalize(positionWC * -1.0)), 0.001, 1.0);\n",C+=" float S = acos(LdotZenith);\n",C+=" float NdotZenith = clamp(dot(normalize(czm_inverseViewRotation * n), normalize(positionWC * -1.0)), 0.001, 1.0);\n",C+=" float gamma = acos(NdotL);\n",C+=" float numerator = ((0.91 + 10.0 * exp(-3.0 * gamma) + 0.45 * pow(NdotL, 2.0)) * (1.0 - exp(-0.32 / NdotZenith)));\n",C+=" float denominator = (0.91 + 10.0 * exp(-3.0 * S) + 0.45 * pow(LdotZenith,2.0)) * (1.0 - exp(-0.32));\n",C+=" float luminance = gltf_luminanceAtZenith * (numerator / denominator);\n",C+="#endif \n",C+=" vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, roughness)).rg;\n",C+=" vec3 IBLColor = (diffuseIrradiance * diffuseColor * gltf_iblFactor.x) + (specularIrradiance * SRGBtoLINEAR3(specularColor * brdfLut.x + brdfLut.y) * gltf_iblFactor.y);\n",C+=" float maximumComponent = max(max(lightColorHdr.x, lightColorHdr.y), lightColorHdr.z);\n",C+=" vec3 lightColor = lightColorHdr / max(maximumComponent, 1.0);\n",C+=" IBLColor *= lightColor;\n",C+="#ifdef USE_SUN_LUMINANCE \n",C+=" color += IBLColor * luminance;\n",C+="#else \n",C+=" color += IBLColor; \n",C+="#endif \n",C+="#elif defined(DIFFUSE_IBL) || defined(SPECULAR_IBL) \n",C+=" mat3 fixedToENU = mat3(gltf_clippingPlanesMatrix[0][0], gltf_clippingPlanesMatrix[1][0], gltf_clippingPlanesMatrix[2][0], \n",C+=" gltf_clippingPlanesMatrix[0][1], gltf_clippingPlanesMatrix[1][1], gltf_clippingPlanesMatrix[2][1], \n",C+=" gltf_clippingPlanesMatrix[0][2], gltf_clippingPlanesMatrix[1][2], gltf_clippingPlanesMatrix[2][2]); \n",C+=" const mat3 yUpToZUp = mat3(-1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); \n",C+=" vec3 cubeDir = normalize(yUpToZUp * fixedToENU * normalize(reflect(-v, n))); \n",C+="#ifdef DIFFUSE_IBL \n",C+="#ifdef CUSTOM_SPHERICAL_HARMONICS \n",C+=" vec3 diffuseIrradiance = czm_sphericalHarmonics(cubeDir, gltf_sphericalHarmonicCoefficients); \n",C+="#else \n",C+=" vec3 diffuseIrradiance = czm_sphericalHarmonics(cubeDir, czm_sphericalHarmonicCoefficients); \n",C+="#endif \n",C+="#else \n",C+=" vec3 diffuseIrradiance = vec3(0.0); \n",C+="#endif \n",C+="#ifdef SPECULAR_IBL \n",C+=" vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, roughness)).rg;\n",C+="#ifdef CUSTOM_SPECULAR_IBL \n",C+=" vec3 specularIBL = czm_sampleOctahedralProjection(gltf_specularMap, gltf_specularMapSize, cubeDir, roughness * gltf_maxSpecularLOD, gltf_maxSpecularLOD);\n",C+="#else \n",C+=" vec3 specularIBL = czm_sampleOctahedralProjection(czm_specularEnvironmentMaps, czm_specularEnvironmentMapSize, cubeDir, roughness * czm_specularEnvironmentMapsMaximumLOD, czm_specularEnvironmentMapsMaximumLOD);\n",C+="#endif \n",C+=" specularIBL *= F * brdfLut.x + brdfLut.y;\n",C+="#else \n",C+=" vec3 specularIBL = vec3(0.0); \n",C+="#endif \n",C+=" color += diffuseIrradiance * diffuseColor + specularColor * specularIBL;\n",C+="#endif \n"):C+=" vec3 color = baseColor;\n",O||(defined(r.u_occlusionTexture)&&(C+=" color *= texture2D(u_occlusionTexture, "+K+").r;\n"),defined(r.u_emissiveTexture)?(C+=" vec3 emissive = SRGBtoLINEAR3(texture2D(u_emissiveTexture, "+ee+").rgb);\n",defined(r.u_emissiveFactor)&&(C+=" emissive *= u_emissiveFactor;\n"),C+=" color += emissive;\n"):defined(r.u_emissiveFactor)&&(C+=" color += u_emissiveFactor;\n")),O||(C+=" color = applyTonemapping(color);\n"),C+=" color = LINEARtoSRGB(color);\n",R&&(C+=" float outlineness = max(\n",C+=" texture2D(u_outlineTexture, vec2(v_outlineCoordinates.x, 0.5)).r,\n",C+=" max(\n",C+=" texture2D(u_outlineTexture, vec2(v_outlineCoordinates.y, 0.5)).r,\n",C+=" texture2D(u_outlineTexture, vec2(v_outlineCoordinates.z, 0.5)).r));\n",C+=" color = mix(color, vec3(0.0, 0.0, 0.0), outlineness);\n"),defined(F)?"MASK"===F?(C+=" if (baseColorWithAlpha.a < u_alphaCutoff) {\n",C+=" discard;\n",C+=" }\n",C+=" gl_FragColor = vec4(color, 1.0);\n"):C+="BLEND"===F?" gl_FragColor = vec4(color, baseColorWithAlpha.a);\n":" gl_FragColor = vec4(color, 1.0);\n":C+=" gl_FragColor = vec4(color, 1.0);\n",C+="}\n";var ie=addToArray(h,{type:WebGLConstants$1.VERTEX_SHADER,extras:{_pipeline:{source:v,extension:".glsl"}}}),re=addToArray(h,{type:WebGLConstants$1.FRAGMENT_SHADER,extras:{_pipeline:{source:C,extension:".glsl"}}}),ne=addToArray(p,{fragmentShader:re,vertexShader:ie});return addToArray(d,{attributes:z,program:ne,uniforms:L})}function getPBRValueType(e){if(-1!==e.indexOf("Offset"))return WebGLConstants$1.FLOAT_VEC2;if(-1!==e.indexOf("Rotation"))return WebGLConstants$1.FLOAT;if(-1!==e.indexOf("Scale"))return WebGLConstants$1.FLOAT_VEC2;if(-1!==e.indexOf("Texture"))return WebGLConstants$1.SAMPLER_2D;switch(e){case"u_baseColorFactor":return WebGLConstants$1.FLOAT_VEC4;case"u_metallicFactor":case"u_roughnessFactor":return WebGLConstants$1.FLOAT;case"u_emissiveFactor":return WebGLConstants$1.FLOAT_VEC3;case"u_diffuseFactor":return WebGLConstants$1.FLOAT_VEC4;case"u_specularFactor":return WebGLConstants$1.FLOAT_VEC3;case"u_glossinessFactor":return WebGLConstants$1.FLOAT}}function Vector3DTileBatch(e){this.offset=e.offset,this.count=e.count,this.color=e.color,this.batchIds=e.batchIds}var VectorTileVS="attribute vec3 position;\nattribute float a_batchId;\nuniform mat4 u_modifiedModelViewProjection;\nvoid main()\n{\ngl_Position = czm_depthClamp(u_modifiedModelViewProjection * vec4(position, 1.0));\n}\n",tmp$2={},X1d,$1d,_1d,u2d,v2d,x2d,y2d,z2d;function s2d(e,t){var i=new Error(e+" at character "+t);throw i.index=t,i.description=e,i}function w2d(e){var t,i=0;for(var r in e)(t=r.length)>i&&e.hasOwnProperty(r)&&(i=t);return i}function B2d(e){return v2d[e]||0}function C2d(e,t,i){return{type:"||"===e||"&&"===e?"LogicalExpression":"BinaryExpression",operator:e,left:t,right:i}}function D2d(e){return 48<=e&&e<=57}function E2d(e){return 36===e||95===e||65<=e&&e<=90||97<=e&&e<=122||128<=e&&!v2d[String.fromCharCode(e)]}function G2d(n){for(var e,t,l=0,i=n.charAt,r=n.charCodeAt,a=function(e){return i.call(n,e)},o=function(e){return r.call(n,e)},s=n.length,c=function(){for(var e=o(l);32===e||9===e;)e=o(++l)},u=function(){var e,t,i=h();return c(),63!==o(l)?i:(l++,(e=u())||s2d("Expected expression",l),c(),58===o(l)?(l++,(t=u())||s2d("Expected expression",l),{type:"ConditionalExpression",test:i,consequent:e,alternate:t}):void s2d("Expected :",l))},d=function(){c();for(var e=n.substr(l,y2d),t=e.length;0<t;){if(v2d.hasOwnProperty(e))return l+=t,e;e=e.substr(0,--t)}return!1},h=function(){var e,t,i,r,n,a,o=p(),s=d();if(!s)return o;for(r={value:s,prec:B2d(s)},(n=p())||s2d("Expected expression after "+s,l),i=[o,r,n];(s=d())&&0!==(t=B2d(s));){for(r={value:s,prec:t};2<i.length&&t<=i[i.length-2].prec;)n=i.pop(),s=i.pop().value,o=i.pop(),e=C2d(s,o,n),i.push(e);(e=p())||s2d("Expected expression after "+s,l),i.push(r,e)}for(e=i[a=i.length-1];1<a;)e=C2d(i[a-1].value,i[a-2],e),a-=2;return e},p=function(){var e,t,i;if(c(),e=o(l),D2d(e)||46===e)return m();if(39===e||34===e)return f();if(E2d(e)||40===e)return y();if(91===e)return C();for(i=(t=n.substr(l,x2d)).length;0<i;){if(u2d.hasOwnProperty(t))return l+=i,{type:"UnaryExpression",operator:t,argument:p(),prefix:!0};t=t.substr(0,--i)}return!1},m=function(){for(var e,t,i="";D2d(o(l));)i+=a(l++);if(46===o(l))for(i+=a(l++);D2d(o(l));)i+=a(l++);if("e"===(e=a(l))||"E"===e){for(i+=a(l++),"+"!==(e=a(l))&&"-"!==e||(i+=a(l++));D2d(o(l));)i+=a(l++);D2d(o(l-1))||s2d("Expected exponent ("+i+a(l)+")",l)}return t=o(l),E2d(t)?s2d("Variable names cannot start with a number ("+i+a(l)+")",l):46===t&&s2d("Unexpected period",l),{type:_1d,value:parseFloat(i),raw:i}},f=function(){for(var e,t="",i=a(l++),r=!1;l<s;){if((e=a(l++))===i){r=!0;break}if("\\"===e)switch(e=a(l++)){case"n":t+="\n";break;case"r":t+="\r";break;case"t":t+="\t";break;case"b":t+="\b";break;case"f":t+="\f";break;case"v":t+="\v";break;default:t+="\\"+e}else t+=e}return r||s2d('Unclosed quote after "'+t+'"',l),{type:_1d,value:t,raw:i+t+i}},g=function(){var e,t,i=o(l),r=l;for(E2d(i)?l++:s2d("Unexpected "+a(l),l);l<s&&(i=o(l),36===(t=i)||95===t||65<=t&&t<=90||97<=t&&t<=122||48<=t&&t<=57||128<=t&&!v2d[String.fromCharCode(t)]);)l++;return e=n.slice(r,l),z2d.hasOwnProperty(e)?{type:_1d,value:z2d[e],raw:e}:"this"===e?{type:"ThisExpression"}:{type:"Identifier",name:e}},_=function(e){for(var t,i,r=[],n=!1;l<s;){if(c(),(t=o(l))===e){n=!0,l++;break}44===t?l++:((i=u())&&"Compound"!==i.type||s2d("Expected comma",l),r.push(i))}return n||s2d("Expected "+String.fromCharCode(e),l),r},y=function(){var e=o(l),t=(40===e?v:g)();for(c(),e=o(l);46===e||91===e||40===e;)l++,46===e?(c(),t={type:$1d,computed:!1,object:t,property:g()}):91===e?(t={type:$1d,computed:!0,object:t,property:u()},c(),93!==(e=o(l))&&s2d("Unclosed [",l),l++):40===e&&(t={type:"CallExpression",arguments:_(41),callee:t}),c(),e=o(l);return t},v=function(){l++;var e=u();if(c(),41===o(l))return l++,e;s2d("Unclosed (",l)},C=function(){return l++,{type:"ArrayExpression",elements:_(93)}},S=[];l<s;)59===(e=o(l))||44===e?l++:(t=u())?S.push(t):l<s&&s2d('Unexpected "'+a(l)+'"',l);return 1===S.length?S[0]:{type:"Compound",body:S}}X1d=tmp$2,$1d="MemberExpression",_1d="Literal",u2d={"-":!0,"!":!0,"~":!0,"+":!0},v2d={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},x2d=w2d(u2d),y2d=w2d(v2d),z2d={true:!0,false:!1,null:null},G2d.version="0.3.1",G2d.toString=function(){return"JavaScript Expression Parser (JSEP) v"+G2d.version},G2d.addUnaryOp=function(e){return x2d=Math.max(e.length,x2d),u2d[e]=!0,this},G2d.addBinaryOp=function(e,t){return y2d=Math.max(e.length,y2d),v2d[e]=t,this},G2d.addLiteral=function(e,t){return z2d[e]=t,this},G2d.removeUnaryOp=function(e){return delete u2d[e],e.length===x2d&&(x2d=w2d(u2d)),this},G2d.removeAllUnaryOps=function(){return u2d={},x2d=0,this},G2d.removeBinaryOp=function(e){return delete v2d[e],e.length===y2d&&(y2d=w2d(v2d)),this},G2d.removeAllBinaryOps=function(){return v2d={},y2d=0,this},G2d.removeLiteral=function(e){return delete z2d[e],this},G2d.removeAllLiterals=function(){return z2d={},this},X1d.jsep=G2d;var jsep=tmp$2.jsep,ExpressionNodeType={VARIABLE:0,UNARY:1,BINARY:2,TERNARY:3,CONDITIONAL:4,MEMBER:5,FUNCTION_CALL:6,ARRAY:7,REGEX:8,VARIABLE_IN_STRING:9,LITERAL_NULL:10,LITERAL_BOOLEAN:11,LITERAL_NUMBER:12,LITERAL_STRING:13,LITERAL_COLOR:14,LITERAL_VECTOR:15,LITERAL_REGEX:16,LITERAL_UNDEFINED:17,BUILTIN_VARIABLE:18},ExpressionNodeType$1=Object.freeze(ExpressionNodeType);function Expression(e,t){var i;e=replaceVariables(removeBackslashes(e=replaceDefines(this._expression=e,t))),jsep.addBinaryOp("=~",0),jsep.addBinaryOp("!~",0);try{i=jsep(e)}catch(e){throw new RuntimeError(e)}this._runtimeAst=createRuntimeAst(this,i)}Object.defineProperties(Expression.prototype,{expression:{get:function(){return this._expression}}});var scratchStorage={arrayIndex:0,arrayArray:[[]],cartesian2Index:0,cartesian3Index:0,cartesian4Index:0,cartesian2Array:[new Cartesian2],cartesian3Array:[new Cartesian3],cartesian4Array:[new Cartesian4],reset:function(){this.arrayIndex=0,this.cartesian2Index=0,this.cartesian3Index=0,this.cartesian4Index=0},getArray:function(){this.arrayIndex>=this.arrayArray.length&&this.arrayArray.push([]);var e=this.arrayArray[this.arrayIndex++];return e.length=0,e},getCartesian2:function(){return this.cartesian2Index>=this.cartesian2Array.length&&this.cartesian2Array.push(new Cartesian2),this.cartesian2Array[this.cartesian2Index++]},getCartesian3:function(){return this.cartesian3Index>=this.cartesian3Array.length&&this.cartesian3Array.push(new Cartesian3),this.cartesian3Array[this.cartesian3Index++]},getCartesian4:function(){return this.cartesian4Index>=this.cartesian4Array.length&&this.cartesian4Array.push(new Cartesian4),this.cartesian4Array[this.cartesian4Index++]}};Expression.prototype.evaluate=function(e,t){scratchStorage.reset();var i=this._runtimeAst.evaluate(e);return t instanceof Color&&i instanceof Cartesian4?Color.fromCartesian4(i,t):i instanceof Cartesian2||i instanceof Cartesian3||i instanceof Cartesian4?i.clone(t):i},Expression.prototype.evaluateColor=function(e,t){scratchStorage.reset();var i=this._runtimeAst.evaluate(e);return Color.fromCartesian4(i,t)},Expression.prototype.getShaderFunction=function(e,t,i,r){return r+" "+e+"() \n{ \n return "+this.getShaderExpression(t,i)+"; \n} \n"},Expression.prototype.getShaderExpression=function(e,t){return this._runtimeAst.getShaderExpression(e,t)};var unaryOperators=["!","-","+"],binaryOperators=["+","-","*","/","%","===","!==",">",">=","<","<=","&&","||","!~","=~"],variableRegex=/\${(.*?)}/g,backslashRegex=/\\/g,backslashReplacement="@#%",replacementRegex=/@#%/g,scratchColor$2=new Color,unaryFunctions={abs:getEvaluateUnaryComponentwise(Math.abs),sqrt:getEvaluateUnaryComponentwise(Math.sqrt),cos:getEvaluateUnaryComponentwise(Math.cos),sin:getEvaluateUnaryComponentwise(Math.sin),tan:getEvaluateUnaryComponentwise(Math.tan),acos:getEvaluateUnaryComponentwise(Math.acos),asin:getEvaluateUnaryComponentwise(Math.asin),atan:getEvaluateUnaryComponentwise(Math.atan),radians:getEvaluateUnaryComponentwise(CesiumMath.toRadians),degrees:getEvaluateUnaryComponentwise(CesiumMath.toDegrees),sign:getEvaluateUnaryComponentwise(CesiumMath.sign),floor:getEvaluateUnaryComponentwise(Math.floor),ceil:getEvaluateUnaryComponentwise(Math.ceil),round:getEvaluateUnaryComponentwise(Math.round),exp:getEvaluateUnaryComponentwise(Math.exp),exp2:getEvaluateUnaryComponentwise(exp2),log:getEvaluateUnaryComponentwise(Math.log),log2:getEvaluateUnaryComponentwise(log2),fract:getEvaluateUnaryComponentwise(fract),length:length,normalize:normalize},binaryFunctions={atan2:getEvaluateBinaryComponentwise(Math.atan2,!1),pow:getEvaluateBinaryComponentwise(Math.pow,!1),min:getEvaluateBinaryComponentwise(Math.min,!0),max:getEvaluateBinaryComponentwise(Math.max,!0),distance:distance,dot:dot,cross:cross},ternaryFunctions={clamp:getEvaluateTernaryComponentwise(CesiumMath.clamp,!0),mix:getEvaluateTernaryComponentwise(CesiumMath.lerp,!0)};function fract(e){return e-Math.floor(e)}function exp2(e){return Math.pow(2,e)}function log2(e){return CesiumMath.log2(e)}function getEvaluateUnaryComponentwise(i){return function(e,t){if("number"==typeof t)return i(t);if(t instanceof Cartesian2)return Cartesian2.fromElements(i(t.x),i(t.y),scratchStorage.getCartesian2());if(t instanceof Cartesian3)return Cartesian3.fromElements(i(t.x),i(t.y),i(t.z),scratchStorage.getCartesian3());if(t instanceof Cartesian4)return Cartesian4.fromElements(i(t.x),i(t.y),i(t.z),i(t.w),scratchStorage.getCartesian4());throw new RuntimeError('Function "'+e+'" requires a vector or number argument. Argument is '+t+".")}}function getEvaluateBinaryComponentwise(r,n){return function(e,t,i){if(n&&"number"==typeof i){if("number"==typeof t)return r(t,i);if(t instanceof Cartesian2)return Cartesian2.fromElements(r(t.x,i),r(t.y,i),scratchStorage.getCartesian2());if(t instanceof Cartesian3)return Cartesian3.fromElements(r(t.x,i),r(t.y,i),r(t.z,i),scratchStorage.getCartesian3());if(t instanceof Cartesian4)return Cartesian4.fromElements(r(t.x,i),r(t.y,i),r(t.z,i),r(t.w,i),scratchStorage.getCartesian4())}if("number"==typeof t&&"number"==typeof i)return r(t,i);if(t instanceof Cartesian2&&i instanceof Cartesian2)return Cartesian2.fromElements(r(t.x,i.x),r(t.y,i.y),scratchStorage.getCartesian2());if(t instanceof Cartesian3&&i instanceof Cartesian3)return Cartesian3.fromElements(r(t.x,i.x),r(t.y,i.y),r(t.z,i.z),scratchStorage.getCartesian3());if(t instanceof Cartesian4&&i instanceof Cartesian4)return Cartesian4.fromElements(r(t.x,i.x),r(t.y,i.y),r(t.z,i.z),r(t.w,i.w),scratchStorage.getCartesian4());throw new RuntimeError('Function "'+e+'" requires vector or number arguments of matching types. Arguments are '+t+" and "+i+".")}}function getEvaluateTernaryComponentwise(n,a){return function(e,t,i,r){if(a&&"number"==typeof r){if("number"==typeof t&&"number"==typeof i)return n(t,i,r);if(t instanceof Cartesian2&&i instanceof Cartesian2)return Cartesian2.fromElements(n(t.x,i.x,r),n(t.y,i.y,r),scratchStorage.getCartesian2());if(t instanceof Cartesian3&&i instanceof Cartesian3)return Cartesian3.fromElements(n(t.x,i.x,r),n(t.y,i.y,r),n(t.z,i.z,r),scratchStorage.getCartesian3());if(t instanceof Cartesian4&&i instanceof Cartesian4)return Cartesian4.fromElements(n(t.x,i.x,r),n(t.y,i.y,r),n(t.z,i.z,r),n(t.w,i.w,r),scratchStorage.getCartesian4())}if("number"==typeof t&&"number"==typeof i&&"number"==typeof r)return n(t,i,r);if(t instanceof Cartesian2&&i instanceof Cartesian2&&r instanceof Cartesian2)return Cartesian2.fromElements(n(t.x,i.x,r.x),n(t.y,i.y,r.y),scratchStorage.getCartesian2());if(t instanceof Cartesian3&&i instanceof Cartesian3&&r instanceof Cartesian3)return Cartesian3.fromElements(n(t.x,i.x,r.x),n(t.y,i.y,r.y),n(t.z,i.z,r.z),scratchStorage.getCartesian3());if(t instanceof Cartesian4&&i instanceof Cartesian4&&r instanceof Cartesian4)return Cartesian4.fromElements(n(t.x,i.x,r.x),n(t.y,i.y,r.y),n(t.z,i.z,r.z),n(t.w,i.w,r.w),scratchStorage.getCartesian4());throw new RuntimeError('Function "'+e+'" requires vector or number arguments of matching types. Arguments are '+t+", "+i+", and "+r+".")}}function length(e,t){if("number"==typeof t)return Math.abs(t);if(t instanceof Cartesian2)return Cartesian2.magnitude(t);if(t instanceof Cartesian3)return Cartesian3.magnitude(t);if(t instanceof Cartesian4)return Cartesian4.magnitude(t);throw new RuntimeError('Function "'+e+'" requires a vector or number argument. Argument is '+t+".")}function normalize(e,t){if("number"==typeof t)return 1;if(t instanceof Cartesian2)return Cartesian2.normalize(t,scratchStorage.getCartesian2());if(t instanceof Cartesian3)return Cartesian3.normalize(t,scratchStorage.getCartesian3());if(t instanceof Cartesian4)return Cartesian4.normalize(t,scratchStorage.getCartesian4());throw new RuntimeError('Function "'+e+'" requires a vector or number argument. Argument is '+t+".")}function distance(e,t,i){if("number"==typeof t&&"number"==typeof i)return Math.abs(t-i);if(t instanceof Cartesian2&&i instanceof Cartesian2)return Cartesian2.distance(t,i);if(t instanceof Cartesian3&&i instanceof Cartesian3)return Cartesian3.distance(t,i);if(t instanceof Cartesian4&&i instanceof Cartesian4)return Cartesian4.distance(t,i);throw new RuntimeError('Function "'+e+'" requires vector or number arguments of matching types. Arguments are '+t+" and "+i+".")}function dot(e,t,i){if("number"==typeof t&&"number"==typeof i)return t*i;if(t instanceof Cartesian2&&i instanceof Cartesian2)return Cartesian2.dot(t,i);if(t instanceof Cartesian3&&i instanceof Cartesian3)return Cartesian3.dot(t,i);if(t instanceof Cartesian4&&i instanceof Cartesian4)return Cartesian4.dot(t,i);throw new RuntimeError('Function "'+e+'" requires vector or number arguments of matching types. Arguments are '+t+" and "+i+".")}function cross(e,t,i){if(t instanceof Cartesian3&&i instanceof Cartesian3)return Cartesian3.cross(t,i,scratchStorage.getCartesian3());throw new RuntimeError('Function "'+e+'" requires vec3 arguments. Arguments are '+t+" and "+i+".")}function Node$2(e,t,i,r,n){this._type=e,this._value=t,this._left=i,this._right=r,this._test=n,this.evaluate=void 0,setEvaluateFunction(this)}function replaceDefines(e,t){if(!defined(t))return e;for(var i in t){var r,n;t.hasOwnProperty(i)&&(r=new RegExp("\\$\\{"+i+"\\}","g"),defined(n="("+t[i]+")")&&(e=e.replace(r,n)))}return e}function removeBackslashes(e){return e.replace(backslashRegex,backslashReplacement)}function replaceBackslashes(e){return e.replace(replacementRegex,"\\")}function replaceVariables(e){for(var t=e,i="",r=t.indexOf("${");0<=r;){var n,a=t.indexOf("'"),o=t.indexOf('"');if(0<=a&&a<r)n=t.indexOf("'",a+1),i+=t.substr(0,n+1),r=(t=t.substr(n+1)).indexOf("${");else if(0<=o&&o<r)n=t.indexOf('"',o+1),i+=t.substr(0,n+1),r=(t=t.substr(n+1)).indexOf("${");else{i+=t.substr(0,r);var s=t.indexOf("}");if(s<0)throw new RuntimeError("Unmatched {.");i+="czm_"+t.substr(r+2,s-(r+2)),r=(t=t.substr(s+1)).indexOf("${")}}return i+=t}function parseLiteral(e){var t=typeof e.value;return null===e.value?new Node$2(ExpressionNodeType$1.LITERAL_NULL,null):"boolean"==t?new Node$2(ExpressionNodeType$1.LITERAL_BOOLEAN,e.value):"number"==t?new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,e.value):"string"==t?0<=e.value.indexOf("${")?new Node$2(ExpressionNodeType$1.VARIABLE_IN_STRING,e.value):new Node$2(ExpressionNodeType$1.LITERAL_STRING,replaceBackslashes(e.value)):void 0}function parseCall(e,t){var i,r,n,a,o=t.arguments,s=o.length;if("MemberExpression"===t.callee.type){i=t.callee.property.name;var l=t.callee.object;if("test"===i||"exec"===i){if("regExp"!==l.callee.name)throw new RuntimeError(i+" is not a function.");return 0===s?"test"===i?new Node$2(ExpressionNodeType$1.LITERAL_BOOLEAN,!1):new Node$2(ExpressionNodeType$1.LITERAL_NULL,null):(n=createRuntimeAst(e,l),a=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.FUNCTION_CALL,i,n,a))}if("toString"===i)return r=createRuntimeAst(e,l),new Node$2(ExpressionNodeType$1.FUNCTION_CALL,i,r);throw new RuntimeError('Unexpected function call "'+i+'".')}if("color"===(i=t.callee.name)){if(0===s)return new Node$2(ExpressionNodeType$1.LITERAL_COLOR,i);if(r=createRuntimeAst(e,o[0]),defined(o[1])){var c=createRuntimeAst(e,o[1]);return new Node$2(ExpressionNodeType$1.LITERAL_COLOR,i,[r,c])}return new Node$2(ExpressionNodeType$1.LITERAL_COLOR,i,[r])}if("rgb"===i||"hsl"===i){if(s<3)throw new RuntimeError(i+" requires three arguments.");return r=[createRuntimeAst(e,o[0]),createRuntimeAst(e,o[1]),createRuntimeAst(e,o[2])],new Node$2(ExpressionNodeType$1.LITERAL_COLOR,i,r)}if("rgba"===i||"hsla"===i){if(s<4)throw new RuntimeError(i+" requires four arguments.");return r=[createRuntimeAst(e,o[0]),createRuntimeAst(e,o[1]),createRuntimeAst(e,o[2]),createRuntimeAst(e,o[3])],new Node$2(ExpressionNodeType$1.LITERAL_COLOR,i,r)}if("vec2"===i||"vec3"===i||"vec4"===i){r=new Array(s);for(var u=0;u<s;++u)r[u]=createRuntimeAst(e,o[u]);return new Node$2(ExpressionNodeType$1.LITERAL_VECTOR,i,r)}if("isNaN"===i||"isFinite"===i)return 0===s?new Node$2(ExpressionNodeType$1.LITERAL_BOOLEAN,"isNaN"===i):(r=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.UNARY,i,r));if("isExactClass"===i||"isClass"===i){if(s<1||1<s)throw new RuntimeError(i+" requires exactly one argument.");return r=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.UNARY,i,r)}if("getExactClassName"===i){if(0<s)throw new RuntimeError(i+" does not take any argument.");return new Node$2(ExpressionNodeType$1.UNARY,i)}if(defined(unaryFunctions[i])){if(1!==s)throw new RuntimeError(i+" requires exactly one argument.");return r=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.UNARY,i,r)}if(defined(binaryFunctions[i])){if(2!==s)throw new RuntimeError(i+" requires exactly two arguments.");return n=createRuntimeAst(e,o[0]),a=createRuntimeAst(e,o[1]),new Node$2(ExpressionNodeType$1.BINARY,i,n,a)}if(defined(ternaryFunctions[i])){if(3!==s)throw new RuntimeError(i+" requires exactly three arguments.");n=createRuntimeAst(e,o[0]),a=createRuntimeAst(e,o[1]);var d=createRuntimeAst(e,o[2]);return new Node$2(ExpressionNodeType$1.TERNARY,i,n,a,d)}if("Boolean"===i)return 0===s?new Node$2(ExpressionNodeType$1.LITERAL_BOOLEAN,!1):(r=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.UNARY,i,r));if("Number"===i)return 0===s?new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,0):(r=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.UNARY,i,r));if("String"===i)return 0===s?new Node$2(ExpressionNodeType$1.LITERAL_STRING,""):(r=createRuntimeAst(e,o[0]),new Node$2(ExpressionNodeType$1.UNARY,i,r));if("regExp"===i)return parseRegex$1(e,t);throw new RuntimeError('Unexpected function call "'+i+'".')}function parseRegex$1(e,t){var i=t.arguments;if(0===i.length)return new Node$2(ExpressionNodeType$1.LITERAL_REGEX,new RegExp);var r,n=createRuntimeAst(e,i[0]);if(1<i.length){var a=createRuntimeAst(e,i[1]);if(isLiteralType(n)&&isLiteralType(a)){try{r=new RegExp(replaceBackslashes(String(n._value)),a._value)}catch(e){throw new RuntimeError(e)}return new Node$2(ExpressionNodeType$1.LITERAL_REGEX,r)}return new Node$2(ExpressionNodeType$1.REGEX,n,a)}if(isLiteralType(n)){try{r=new RegExp(replaceBackslashes(String(n._value)))}catch(e){throw new RuntimeError(e)}return new Node$2(ExpressionNodeType$1.LITERAL_REGEX,r)}return new Node$2(ExpressionNodeType$1.REGEX,n)}function parseKeywordsAndVariables(e){if(isVariable(e.name)){var t=getPropertyName(e.name);return"tiles3d_"===t.substr(0,8)?new Node$2(ExpressionNodeType$1.BUILTIN_VARIABLE,t):new Node$2(ExpressionNodeType$1.VARIABLE,t)}if("NaN"===e.name)return new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,NaN);if("Infinity"===e.name)return new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,1/0);if("undefined"===e.name)return new Node$2(ExpressionNodeType$1.LITERAL_UNDEFINED,void 0);throw new RuntimeError(e.name+" is not defined.")}function parseMathConstant(e){var t=e.property.name;return"PI"===t?new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,Math.PI):"E"===t?new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,Math.E):void 0}function parseNumberConstant(e){if("POSITIVE_INFINITY"===e.property.name)return new Node$2(ExpressionNodeType$1.LITERAL_NUMBER,Number.POSITIVE_INFINITY)}function parseMemberExpression(e,t){if("Math"===t.object.name)return parseMathConstant(t);if("Number"===t.object.name)return parseNumberConstant(t);var i,r=createRuntimeAst(e,t.object);return t.computed?(i=createRuntimeAst(e,t.property),new Node$2(ExpressionNodeType$1.MEMBER,"brackets",r,i)):(i=new Node$2(ExpressionNodeType$1.LITERAL_STRING,t.property.name),new Node$2(ExpressionNodeType$1.MEMBER,"dot",r,i))}function isLiteralType(e){return e._type>=ExpressionNodeType$1.LITERAL_NULL}function isVariable(e){return"czm_"===e.substr(0,4)}function getPropertyName(e){return e.substr(4)}function createRuntimeAst(e,t){var i;if("Literal"===t.type)s=parseLiteral(t);else if("CallExpression"===t.type)s=parseCall(e,t);else if("Identifier"===t.type)s=parseKeywordsAndVariables(t);else if("UnaryExpression"===t.type){i=t.operator;var r=createRuntimeAst(e,t.argument);if(!(-1<unaryOperators.indexOf(i)))throw new RuntimeError('Unexpected operator "'+i+'".');s=new Node$2(ExpressionNodeType$1.UNARY,i,r)}else if("BinaryExpression"===t.type){if(i=t.operator,a=createRuntimeAst(e,t.left),o=createRuntimeAst(e,t.right),!(-1<binaryOperators.indexOf(i)))throw new RuntimeError('Unexpected operator "'+i+'".');s=new Node$2(ExpressionNodeType$1.BINARY,i,a,o)}else if("LogicalExpression"===t.type)i=t.operator,a=createRuntimeAst(e,t.left),o=createRuntimeAst(e,t.right),-1<binaryOperators.indexOf(i)&&(s=new Node$2(ExpressionNodeType$1.BINARY,i,a,o));else if("ConditionalExpression"===t.type)var n=createRuntimeAst(e,t.test),a=createRuntimeAst(e,t.consequent),o=createRuntimeAst(e,t.alternate),s=new Node$2(ExpressionNodeType$1.CONDITIONAL,"?",a,o,n);else if("MemberExpression"===t.type)s=parseMemberExpression(e,t);else{if("ArrayExpression"!==t.type)throw"Compound"===t.type?new RuntimeError("Provide exactly one expression."):new RuntimeError("Cannot parse expression.");for(var l=[],c=0;c<t.elements.length;c++)l[c]=createRuntimeAst(e,t.elements[c]);s=new Node$2(ExpressionNodeType$1.ARRAY,l)}return s}function setEvaluateFunction(e){e._type===ExpressionNodeType$1.CONDITIONAL?e.evaluate=e._evaluateConditional:e._type===ExpressionNodeType$1.FUNCTION_CALL?"test"===e._value?e.evaluate=e._evaluateRegExpTest:"exec"===e._value?e.evaluate=e._evaluateRegExpExec:"toString"===e._value&&(e.evaluate=e._evaluateToString):e._type===ExpressionNodeType$1.UNARY?"!"===e._value?e.evaluate=e._evaluateNot:"-"===e._value?e.evaluate=e._evaluateNegative:"+"===e._value?e.evaluate=e._evaluatePositive:"isNaN"===e._value?e.evaluate=e._evaluateNaN:"isFinite"===e._value?e.evaluate=e._evaluateIsFinite:"isExactClass"===e._value?e.evaluate=e._evaluateIsExactClass:"isClass"===e._value?e.evaluate=e._evaluateIsClass:"getExactClassName"===e._value?e.evaluate=e._evaluateGetExactClassName:"Boolean"===e._value?e.evaluate=e._evaluateBooleanConversion:"Number"===e._value?e.evaluate=e._evaluateNumberConversion:"String"===e._value?e.evaluate=e._evaluateStringConversion:defined(unaryFunctions[e._value])&&(e.evaluate=getEvaluateUnaryFunction(e._value)):e._type===ExpressionNodeType$1.BINARY?"+"===e._value?e.evaluate=e._evaluatePlus:"-"===e._value?e.evaluate=e._evaluateMinus:"*"===e._value?e.evaluate=e._evaluateTimes:"/"===e._value?e.evaluate=e._evaluateDivide:"%"===e._value?e.evaluate=e._evaluateMod:"==="===e._value?e.evaluate=e._evaluateEqualsStrict:"!=="===e._value?e.evaluate=e._evaluateNotEqualsStrict:"<"===e._value?e.evaluate=e._evaluateLessThan:"<="===e._value?e.evaluate=e._evaluateLessThanOrEquals:">"===e._value?e.evaluate=e._evaluateGreaterThan:">="===e._value?e.evaluate=e._evaluateGreaterThanOrEquals:"&&"===e._value?e.evaluate=e._evaluateAnd:"||"===e._value?e.evaluate=e._evaluateOr:"=~"===e._value?e.evaluate=e._evaluateRegExpMatch:"!~"===e._value?e.evaluate=e._evaluateRegExpNotMatch:defined(binaryFunctions[e._value])&&(e.evaluate=getEvaluateBinaryFunction(e._value)):e._type===ExpressionNodeType$1.TERNARY?e.evaluate=getEvaluateTernaryFunction(e._value):e._type===ExpressionNodeType$1.MEMBER?"brackets"===e._value?e.evaluate=e._evaluateMemberBrackets:e.evaluate=e._evaluateMemberDot:e._type===ExpressionNodeType$1.ARRAY?e.evaluate=e._evaluateArray:e._type===ExpressionNodeType$1.VARIABLE?e.evaluate=e._evaluateVariable:e._type===ExpressionNodeType$1.VARIABLE_IN_STRING?e.evaluate=e._evaluateVariableString:e._type===ExpressionNodeType$1.LITERAL_COLOR?e.evaluate=e._evaluateLiteralColor:e._type===ExpressionNodeType$1.LITERAL_VECTOR?e.evaluate=e._evaluateLiteralVector:e._type===ExpressionNodeType$1.LITERAL_STRING?e.evaluate=e._evaluateLiteralString:e._type===ExpressionNodeType$1.REGEX?e.evaluate=e._evaluateRegExp:e._type===ExpressionNodeType$1.BUILTIN_VARIABLE?"tiles3d_tileset_time"===e._value&&(e.evaluate=evaluateTilesetTime):e.evaluate=e._evaluateLiteral}function evaluateTilesetTime(e){return defined(e)?e.content.tileset.timeSinceLoad:0}function getEvaluateUnaryFunction(i){var r=unaryFunctions[i];return function(e){var t=this._left.evaluate(e);return r(i,t)}}function getEvaluateBinaryFunction(r){var n=binaryFunctions[r];return function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);return n(r,t,i)}}function getEvaluateTernaryFunction(n){var a=ternaryFunctions[n];return function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e),r=this._test.evaluate(e);return a(n,t,i,r)}}function getFeatureProperty(e,t){if(defined(e))return e.getProperty(t)}function checkFeature(e){return"feature"===e._value}function convertHSLToRGB(e){for(var t=e._left,i=t.length,r=0;r<i;++r)if(t[r]._type!==ExpressionNodeType$1.LITERAL_NUMBER)return;var n=t[0]._value,a=t[1]._value,o=t[2]._value,s=4===i?t[3]._value:1;return Color.fromHsl(n,a,o,s,scratchColor$2)}function convertRGBToColor(e){for(var t=e._left,i=t.length,r=0;r<i;++r)if(t[r]._type!==ExpressionNodeType$1.LITERAL_NUMBER)return;var n=scratchColor$2;return n.red=t[0]._value/255,n.green=t[1]._value/255,n.blue=t[2]._value/255,n.alpha=4===i?t[3]._value:1,n}function numberToString(e){return e%1==0?e.toFixed(1):e.toString()}function colorToVec3(e){return"vec3("+numberToString(e.red)+", "+numberToString(e.green)+", "+numberToString(e.blue)+")"}function colorToVec4(e){return"vec4("+numberToString(e.red)+", "+numberToString(e.green)+", "+numberToString(e.blue)+", "+numberToString(e.alpha)+")"}function getExpressionArray(e,t,i,r){for(var n=e.length,a=new Array(n),o=0;o<n;++o)a[o]=e[o].getShaderExpression(t,i,r);return a}function getVariableName(e,t){if(!defined(t[e]))throw new RuntimeError('Style references a property "'+e+'" that does not exist or is not styleable.');return t[e]}Node$2.prototype._evaluateLiteral=function(){return this._value},Node$2.prototype._evaluateLiteralColor=function(e){var t,i=scratchColor$2,r=this._left;return"color"===this._value?defined(r)?1<r.length?(Color.fromCssColorString(r[0].evaluate(e),i),i.alpha=r[1].evaluate(e)):Color.fromCssColorString(r[0].evaluate(e),i):Color.fromBytes(255,255,255,255,i):"rgb"===this._value?Color.fromBytes(r[0].evaluate(e),r[1].evaluate(e),r[2].evaluate(e),255,i):"rgba"===this._value?(t=255*r[3].evaluate(e),Color.fromBytes(r[0].evaluate(e),r[1].evaluate(e),r[2].evaluate(e),t,i)):"hsl"===this._value?Color.fromHsl(r[0].evaluate(e),r[1].evaluate(e),r[2].evaluate(e),1,i):"hsla"===this._value&&Color.fromHsl(r[0].evaluate(e),r[1].evaluate(e),r[2].evaluate(e),r[3].evaluate(e),i),Cartesian4.fromColor(i,scratchStorage.getCartesian4())},Node$2.prototype._evaluateLiteralVector=function(e){for(var t=scratchStorage.getArray(),i=this._value,r=this._left,n=r.length,a=0;a<n;++a){var o=r[a].evaluate(e);if("number"==typeof o)t.push(o);else if(o instanceof Cartesian2)t.push(o.x,o.y);else if(o instanceof Cartesian3)t.push(o.x,o.y,o.z);else{if(!(o instanceof Cartesian4))throw new RuntimeError(i+" argument must be a vector or number. Argument is "+o+".");t.push(o.x,o.y,o.z,o.w)}}var s,l=t.length,c=parseInt(i.charAt(3));if(0===l)throw new RuntimeError("Invalid "+i+" constructor. No valid arguments.");if(l<c&&1<l)throw new RuntimeError("Invalid "+i+" constructor. Not enough arguments.");if(c<l&&1<n)throw new RuntimeError("Invalid "+i+" constructor. Too many arguments.");return 1===l&&(s=t[0],t.push(s,s,s)),"vec2"===i?Cartesian2.fromArray(t,0,scratchStorage.getCartesian2()):"vec3"===i?Cartesian3.fromArray(t,0,scratchStorage.getCartesian3()):"vec4"===i?Cartesian4.fromArray(t,0,scratchStorage.getCartesian4()):void 0},Node$2.prototype._evaluateLiteralString=function(){return this._value},Node$2.prototype._evaluateVariableString=function(e){for(var t=this._value,i=variableRegex.exec(t);null!==i;){var r=i[0],n=getFeatureProperty(e,i[1]);defined(n)||(n=""),t=t.replace(r,n),i=variableRegex.exec(t)}return t},Node$2.prototype._evaluateVariable=function(e){return getFeatureProperty(e,this._value)},Node$2.prototype._evaluateMemberDot=function(e){if(checkFeature(this._left))return getFeatureProperty(e,this._right.evaluate(e));var t=this._left.evaluate(e);if(defined(t)){var i=this._right.evaluate(e);if(t instanceof Cartesian2||t instanceof Cartesian3||t instanceof Cartesian4){if("r"===i)return t.x;if("g"===i)return t.y;if("b"===i)return t.z;if("a"===i)return t.w}return t[i]}},Node$2.prototype._evaluateMemberBrackets=function(e){if(checkFeature(this._left))return getFeatureProperty(e,this._right.evaluate(e));var t=this._left.evaluate(e);if(defined(t)){var i=this._right.evaluate(e);if(t instanceof Cartesian2||t instanceof Cartesian3||t instanceof Cartesian4){if(0===i||"r"===i)return t.x;if(1===i||"g"===i)return t.y;if(2===i||"b"===i)return t.z;if(3===i||"a"===i)return t.w}return t[i]}},Node$2.prototype._evaluateArray=function(e){for(var t=[],i=0;i<this._value.length;i++)t[i]=this._value[i].evaluate(e);return t},Node$2.prototype._evaluateNot=function(e){var t=this._left.evaluate(e);if("boolean"!=typeof t)throw new RuntimeError('Operator "!" requires a boolean argument. Argument is '+t+".");return!t},Node$2.prototype._evaluateNegative=function(e){var t=this._left.evaluate(e);if(t instanceof Cartesian2)return Cartesian2.negate(t,scratchStorage.getCartesian2());if(t instanceof Cartesian3)return Cartesian3.negate(t,scratchStorage.getCartesian3());if(t instanceof Cartesian4)return Cartesian4.negate(t,scratchStorage.getCartesian4());if("number"==typeof t)return-t;throw new RuntimeError('Operator "-" requires a vector or number argument. Argument is '+t+".")},Node$2.prototype._evaluatePositive=function(e){var t=this._left.evaluate(e);if(!(t instanceof Cartesian2||t instanceof Cartesian3||t instanceof Cartesian4||"number"==typeof t))throw new RuntimeError('Operator "+" requires a vector or number argument. Argument is '+t+".");return t},Node$2.prototype._evaluateLessThan=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if("number"!=typeof t||"number"!=typeof i)throw new RuntimeError('Operator "<" requires number arguments. Arguments are '+t+" and "+i+".");return t<i},Node$2.prototype._evaluateLessThanOrEquals=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if("number"!=typeof t||"number"!=typeof i)throw new RuntimeError('Operator "<=" requires number arguments. Arguments are '+t+" and "+i+".");return t<=i},Node$2.prototype._evaluateGreaterThan=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if("number"!=typeof t||"number"!=typeof i)throw new RuntimeError('Operator ">" requires number arguments. Arguments are '+t+" and "+i+".");return i<t},Node$2.prototype._evaluateGreaterThanOrEquals=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if("number"!=typeof t||"number"!=typeof i)throw new RuntimeError('Operator ">=" requires number arguments. Arguments are '+t+" and "+i+".");return i<=t},Node$2.prototype._evaluateOr=function(e){var t=this._left.evaluate(e);if("boolean"!=typeof t)throw new RuntimeError('Operator "||" requires boolean arguments. First argument is '+t+".");if(t)return!0;var i=this._right.evaluate(e);if("boolean"!=typeof i)throw new RuntimeError('Operator "||" requires boolean arguments. Second argument is '+i+".");return t||i},Node$2.prototype._evaluateAnd=function(e){var t=this._left.evaluate(e);if("boolean"!=typeof t)throw new RuntimeError('Operator "&&" requires boolean arguments. First argument is '+t+".");if(!t)return!1;var i=this._right.evaluate(e);if("boolean"!=typeof i)throw new RuntimeError('Operator "&&" requires boolean arguments. Second argument is '+i+".");return t&&i},Node$2.prototype._evaluatePlus=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(i instanceof Cartesian2&&t instanceof Cartesian2)return Cartesian2.add(t,i,scratchStorage.getCartesian2());if(i instanceof Cartesian3&&t instanceof Cartesian3)return Cartesian3.add(t,i,scratchStorage.getCartesian3());if(i instanceof Cartesian4&&t instanceof Cartesian4)return Cartesian4.add(t,i,scratchStorage.getCartesian4());if("string"==typeof t||"string"==typeof i)return t+i;if("number"==typeof t&&"number"==typeof i)return t+i;throw new RuntimeError('Operator "+" requires vector or number arguments of matching types, or at least one string argument. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateMinus=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(i instanceof Cartesian2&&t instanceof Cartesian2)return Cartesian2.subtract(t,i,scratchStorage.getCartesian2());if(i instanceof Cartesian3&&t instanceof Cartesian3)return Cartesian3.subtract(t,i,scratchStorage.getCartesian3());if(i instanceof Cartesian4&&t instanceof Cartesian4)return Cartesian4.subtract(t,i,scratchStorage.getCartesian4());if("number"==typeof t&&"number"==typeof i)return t-i;throw new RuntimeError('Operator "-" requires vector or number arguments of matching types. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateTimes=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(i instanceof Cartesian2&&t instanceof Cartesian2)return Cartesian2.multiplyComponents(t,i,scratchStorage.getCartesian2());if(i instanceof Cartesian2&&"number"==typeof t)return Cartesian2.multiplyByScalar(i,t,scratchStorage.getCartesian2());if(t instanceof Cartesian2&&"number"==typeof i)return Cartesian2.multiplyByScalar(t,i,scratchStorage.getCartesian2());if(i instanceof Cartesian3&&t instanceof Cartesian3)return Cartesian3.multiplyComponents(t,i,scratchStorage.getCartesian3());if(i instanceof Cartesian3&&"number"==typeof t)return Cartesian3.multiplyByScalar(i,t,scratchStorage.getCartesian3());if(t instanceof Cartesian3&&"number"==typeof i)return Cartesian3.multiplyByScalar(t,i,scratchStorage.getCartesian3());if(i instanceof Cartesian4&&t instanceof Cartesian4)return Cartesian4.multiplyComponents(t,i,scratchStorage.getCartesian4());if(i instanceof Cartesian4&&"number"==typeof t)return Cartesian4.multiplyByScalar(i,t,scratchStorage.getCartesian4());if(t instanceof Cartesian4&&"number"==typeof i)return Cartesian4.multiplyByScalar(t,i,scratchStorage.getCartesian4());if("number"==typeof t&&"number"==typeof i)return t*i;throw new RuntimeError('Operator "*" requires vector or number arguments. If both arguments are vectors they must be matching types. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateDivide=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(i instanceof Cartesian2&&t instanceof Cartesian2)return Cartesian2.divideComponents(t,i,scratchStorage.getCartesian2());if(t instanceof Cartesian2&&"number"==typeof i)return Cartesian2.divideByScalar(t,i,scratchStorage.getCartesian2());if(i instanceof Cartesian3&&t instanceof Cartesian3)return Cartesian3.divideComponents(t,i,scratchStorage.getCartesian3());if(t instanceof Cartesian3&&"number"==typeof i)return Cartesian3.divideByScalar(t,i,scratchStorage.getCartesian3());if(i instanceof Cartesian4&&t instanceof Cartesian4)return Cartesian4.divideComponents(t,i,scratchStorage.getCartesian4());if(t instanceof Cartesian4&&"number"==typeof i)return Cartesian4.divideByScalar(t,i,scratchStorage.getCartesian4());if("number"==typeof t&&"number"==typeof i)return t/i;throw new RuntimeError('Operator "/" requires vector or number arguments of matching types, or a number as the second argument. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateMod=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(i instanceof Cartesian2&&t instanceof Cartesian2)return Cartesian2.fromElements(t.x%i.x,t.y%i.y,scratchStorage.getCartesian2());if(i instanceof Cartesian3&&t instanceof Cartesian3)return Cartesian3.fromElements(t.x%i.x,t.y%i.y,t.z%i.z,scratchStorage.getCartesian3());if(i instanceof Cartesian4&&t instanceof Cartesian4)return Cartesian4.fromElements(t.x%i.x,t.y%i.y,t.z%i.z,t.w%i.w,scratchStorage.getCartesian4());if("number"==typeof t&&"number"==typeof i)return t%i;throw new RuntimeError('Operator "%" requires vector or number arguments of matching types. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateEqualsStrict=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);return i instanceof Cartesian2&&t instanceof Cartesian2||i instanceof Cartesian3&&t instanceof Cartesian3||i instanceof Cartesian4&&t instanceof Cartesian4?t.equals(i):t===i},Node$2.prototype._evaluateNotEqualsStrict=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);return i instanceof Cartesian2&&t instanceof Cartesian2||i instanceof Cartesian3&&t instanceof Cartesian3||i instanceof Cartesian4&&t instanceof Cartesian4?!t.equals(i):t!==i},Node$2.prototype._evaluateConditional=function(e){var t=this._test.evaluate(e);if("boolean"!=typeof t)throw new RuntimeError("Conditional argument of conditional expression must be a boolean. Argument is "+t+".");return t?this._left.evaluate(e):this._right.evaluate(e)},Node$2.prototype._evaluateNaN=function(e){return isNaN(this._left.evaluate(e))},Node$2.prototype._evaluateIsFinite=function(e){return isFinite(this._left.evaluate(e))},Node$2.prototype._evaluateIsExactClass=function(e){return!!defined(e)&&e.isExactClass(this._left.evaluate(e))},Node$2.prototype._evaluateIsClass=function(e){return!!defined(e)&&e.isClass(this._left.evaluate(e))},Node$2.prototype._evaluateGetExactClassName=function(e){if(defined(e))return e.getExactClassName()},Node$2.prototype._evaluateBooleanConversion=function(e){return Boolean(this._left.evaluate(e))},Node$2.prototype._evaluateNumberConversion=function(e){return Number(this._left.evaluate(e))},Node$2.prototype._evaluateStringConversion=function(e){return String(this._left.evaluate(e))},Node$2.prototype._evaluateRegExp=function(e){var t,i=this._value.evaluate(e),r="";defined(this._left)&&(r=this._left.evaluate(e));try{t=new RegExp(i,r)}catch(e){throw new RuntimeError(e)}return t},Node$2.prototype._evaluateRegExpTest=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(!(t instanceof RegExp&&"string"==typeof i))throw new RuntimeError("RegExp.test requires the first argument to be a RegExp and the second argument to be a string. Arguments are "+t+" and "+i+".");return t.test(i)},Node$2.prototype._evaluateRegExpMatch=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(t instanceof RegExp&&"string"==typeof i)return t.test(i);if(i instanceof RegExp&&"string"==typeof t)return i.test(t);throw new RuntimeError('Operator "=~" requires one RegExp argument and one string argument. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateRegExpNotMatch=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(t instanceof RegExp&&"string"==typeof i)return!t.test(i);if(i instanceof RegExp&&"string"==typeof t)return!i.test(t);throw new RuntimeError('Operator "!~" requires one RegExp argument and one string argument. Arguments are '+t+" and "+i+".")},Node$2.prototype._evaluateRegExpExec=function(e){var t=this._left.evaluate(e),i=this._right.evaluate(e);if(!(t instanceof RegExp&&"string"==typeof i))throw new RuntimeError("RegExp.exec requires the first argument to be a RegExp and the second argument to be a string. Arguments are "+t+" and "+i+".");var r=t.exec(i);return defined(r)?r[1]:null},Node$2.prototype._evaluateToString=function(e){var t=this._left.evaluate(e);if(t instanceof RegExp||t instanceof Cartesian2||t instanceof Cartesian3||t instanceof Cartesian4)return String(t);throw new RuntimeError('Unexpected function call "'+this._value+'".')};var nullSentinel="czm_infinity";function Vector3DTilePrimitive(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._batchTable=e.batchTable,this._batchIds=e.batchIds,this._positions=e.positions,this._vertexBatchIds=e.vertexBatchIds,this._indices=e.indices,this._indexCounts=e.indexCounts,this._indexOffsets=e.indexOffsets,this._batchedIndices=e.batchedIndices,this._boundingVolume=e.boundingVolume,this._boundingVolumes=e.boundingVolumes,this._center=defaultValue(e.center,Cartesian3.ZERO),this._va=void 0,this._sp=void 0,this._spStencil=void 0,this._spPick=void 0,this._uniformMap=void 0,this._vaSwap=void 0,this._rsStencilDepthPass=void 0,this._rsStencilDepthPass3DTiles=void 0,this._rsColorPass=void 0,this._rsPickPass=void 0,this._rsWireframe=void 0,this._commands=[],this._commandsIgnoreShow=[],this._pickCommands=[],this._constantColor=Color.clone(Color.WHITE),this._highlightColor=this._constantColor,this._batchDirty=!0,this._pickCommandsDirty=!0,this._framesSinceLastRebatch=0,this._updatingAllCommands=!1,this._trianglesLength=this._indices.length/3,this._geometryByteLength=this._indices.byteLength+this._positions.byteLength+this._vertexBatchIds.byteLength,this.debugWireframe=!1,this._debugWireframe=this.debugWireframe,this._wireframeDirty=!1,this.forceRebatch=!1,this.classificationType=defaultValue(e.classificationType,ClassificationType$1.BOTH),this._vertexShaderSource=e._vertexShaderSource,this._fragmentShaderSource=e._fragmentShaderSource,this._attributeLocations=e._attributeLocations,this._uniformMap=e._uniformMap,this._pickId=e._pickId,this._modelMatrix=e._modelMatrix,this._boundingSphere=e._boundingSphere,this._batchIdLookUp={};for(var t=this._batchIds.length,i=0;i<t;++i){var r=this._batchIds[i];this._batchIdLookUp[r]=i}}Node$2.prototype.getShaderExpression=function(e,t,i){var r,n,a,o,s=this._type,l=this._value;switch(defined(this._left)&&(n=Array.isArray(this._left)?getExpressionArray(this._left,e,t,this):this._left.getShaderExpression(e,t,this)),defined(this._right)&&(a=this._right.getShaderExpression(e,t,this)),defined(this._test)&&(o=this._test.getShaderExpression(e,t,this)),Array.isArray(this._value)&&(l=getExpressionArray(this._value,e,t,this)),s){case ExpressionNodeType$1.VARIABLE:if(checkFeature(this))return;return getVariableName(l,e);case ExpressionNodeType$1.UNARY:if("Boolean"===l)return"bool("+n+")";if("Number"===l)return"float("+n+")";if("round"===l)return"floor("+n+" + 0.5)";if(defined(unaryFunctions[l]))return l+"("+n+")";if("isNaN"===l)return"("+n+" != "+n+")";if("isFinite"===l)return"(abs("+n+") < czm_infinity)";if("String"===l||"isExactClass"===l||"isClass"===l||"getExactClassName"===l)throw new RuntimeError('Error generating style shader: "'+l+'" is not supported.');return l+n;case ExpressionNodeType$1.BINARY:return"%"===l?"mod("+n+", "+a+")":"==="===l?"("+n+" == "+a+")":"!=="===l?"("+n+" != "+a+")":"atan2"===l?"atan("+n+", "+a+")":defined(binaryFunctions[l])?l+"("+n+", "+a+")":"("+n+" "+l+" "+a+")";case ExpressionNodeType$1.TERNARY:if(defined(ternaryFunctions[l]))return l+"("+n+", "+a+", "+o+")";break;case ExpressionNodeType$1.CONDITIONAL:return"("+o+" ? "+n+" : "+a+")";case ExpressionNodeType$1.MEMBER:return checkFeature(this._left)?getVariableName(a,e):"r"===a||"x"===a||"0.0"===a?n+"[0]":"g"===a||"y"===a||"1.0"===a?n+"[1]":"b"===a||"z"===a||"2.0"===a?n+"[2]":"a"===a||"w"===a||"3.0"===a?n+"[3]":n+"[int("+a+")]";case ExpressionNodeType$1.FUNCTION_CALL:throw new RuntimeError('Error generating style shader: "'+l+'" is not supported.');case ExpressionNodeType$1.ARRAY:if(4===l.length)return"vec4("+l[0]+", "+l[1]+", "+l[2]+", "+l[3]+")";if(3===l.length)return"vec3("+l[0]+", "+l[1]+", "+l[2]+")";if(2===l.length)return"vec2("+l[0]+", "+l[1]+")";throw new RuntimeError("Error generating style shader: Invalid array length. Array length should be 2, 3, or 4.");case ExpressionNodeType$1.REGEX:throw new RuntimeError("Error generating style shader: Regular expressions are not supported.");case ExpressionNodeType$1.VARIABLE_IN_STRING:throw new RuntimeError("Error generating style shader: Converting a variable to a string is not supported.");case ExpressionNodeType$1.LITERAL_NULL:return nullSentinel;case ExpressionNodeType$1.LITERAL_BOOLEAN:return l?"true":"false";case ExpressionNodeType$1.LITERAL_NUMBER:return numberToString(l);case ExpressionNodeType$1.LITERAL_STRING:if(defined(i)&&i._type===ExpressionNodeType$1.MEMBER&&("r"===l||"g"===l||"b"===l||"a"===l||"x"===l||"y"===l||"z"===l||"w"===l||checkFeature(i._left)))return l;if(defined(r=Color.fromCssColorString(l,scratchColor$2)))return colorToVec3(r);throw new RuntimeError("Error generating style shader: String literals are not supported.");case ExpressionNodeType$1.LITERAL_COLOR:var c=n;if("color"===l){if(!defined(c))return"vec4(1.0)";if(1<c.length){var u=c[0],d=c[1];return"1.0"!==d&&(t.translucent=!0),"vec4("+u+", "+d+")"}return"vec4("+c[0]+", 1.0)"}if("rgb"===l)return defined(r=convertRGBToColor(this))?colorToVec4(r):"vec4("+c[0]+" / 255.0, "+c[1]+" / 255.0, "+c[2]+" / 255.0, 1.0)";if("rgba"===l)return"1.0"!==c[3]&&(t.translucent=!0),defined(r=convertRGBToColor(this))?colorToVec4(r):"vec4("+c[0]+" / 255.0, "+c[1]+" / 255.0, "+c[2]+" / 255.0, "+c[3]+")";if("hsl"===l)return defined(r=convertHSLToRGB(this))?colorToVec4(r):"vec4(czm_HSLToRGB(vec3("+c[0]+", "+c[1]+", "+c[2]+")), 1.0)";if("hsla"===l)return defined(r=convertHSLToRGB(this))?(1!==r.alpha&&(t.translucent=!0),colorToVec4(r)):("1.0"!==c[3]&&(t.translucent=!0),"vec4(czm_HSLToRGB(vec3("+c[0]+", "+c[1]+", "+c[2]+")), "+c[3]+")");break;case ExpressionNodeType$1.LITERAL_VECTOR:for(var h=n.length,p=l+"(",m=0;m<h;++m)p+=n[m],m<h-1&&(p+=", ");return p+=")";case ExpressionNodeType$1.LITERAL_REGEX:throw new RuntimeError("Error generating style shader: Regular expressions are not supported.");case ExpressionNodeType$1.LITERAL_UNDEFINED:return nullSentinel;case ExpressionNodeType$1.BUILTIN_VARIABLE:if("tiles3d_tileset_time"===l)return"u_time"}},Object.defineProperties(Vector3DTilePrimitive.prototype,{trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}}});var defaultAttributeLocations={position:0,a_batchId:1};function createVertexArray$1(e,t){var i,r,n,a;defined(e._va)||(i=Buffer$1.createVertexBuffer({context:t,typedArray:e._positions,usage:BufferUsage$1.STATIC_DRAW}),r=Buffer$1.createVertexBuffer({context:t,typedArray:e._vertexBatchIds,usage:BufferUsage$1.STATIC_DRAW}),n=Buffer$1.createIndexBuffer({context:t,typedArray:e._indices,usage:BufferUsage$1.DYNAMIC_DRAW,indexDatatype:2===e._indices.BYTES_PER_ELEMENT?IndexDatatype$1.UNSIGNED_SHORT:IndexDatatype$1.UNSIGNED_INT}),a=[{index:0,vertexBuffer:i,componentDatatype:ComponentDatatype$1.fromTypedArray(e._positions),componentsPerAttribute:3},{index:1,vertexBuffer:r,componentDatatype:ComponentDatatype$1.fromTypedArray(e._vertexBatchIds),componentsPerAttribute:1}],e._va=new VertexArray({context:t,attributes:a,indexBuffer:n}),t.webgl2&&(e._vaSwap=new VertexArray({context:t,attributes:a,indexBuffer:Buffer$1.createIndexBuffer({context:t,sizeInBytes:n.sizeInBytes,usage:BufferUsage$1.DYNAMIC_DRAW,indexDatatype:n.indexDatatype})})),e._batchedPositions=void 0,e._transferrableBatchIds=void 0,e._vertexBatchIds=void 0,e._verticesPromise=void 0)}function createShaders(e,t){if(!defined(e._sp)){var i=e._batchTable,r=defaultValue(e._attributeLocations,defaultAttributeLocations),n=e._pickId,a=e._vertexShaderSource,o=e._fragmentShaderSource;if(defined(a))return e._sp=ShaderProgram.fromCache({context:t,vertexShaderSource:a,fragmentShaderSource:o,attributeLocations:r}),e._spStencil=e._sp,o=ShaderSource.replaceMain(o,"czm_non_pick_main")+"void main() \n{ \n czm_non_pick_main(); \n gl_FragColor = "+n+"; \n} \n",void(e._spPick=ShaderProgram.fromCache({context:t,vertexShaderSource:a,fragmentShaderSource:o,attributeLocations:r}));var s=i.getVertexShaderCallback(!1,"a_batchId",void 0)(VectorTileVS),l=i.getFragmentShaderCallback()(ShadowVolumeFS,!1,void 0),n=i.getPickId(),c=new ShaderSource({sources:[s]}),u=new ShaderSource({defines:["VECTOR_TILE"],sources:[l]});e._sp=ShaderProgram.fromCache({context:t,vertexShaderSource:c,fragmentShaderSource:u,attributeLocations:r}),c=new ShaderSource({sources:[VectorTileVS]}),u=new ShaderSource({defines:["VECTOR_TILE"],sources:[ShadowVolumeFS]}),e._spStencil=ShaderProgram.fromCache({context:t,vertexShaderSource:c,fragmentShaderSource:u,attributeLocations:r}),l=ShaderSource.replaceMain(l,"czm_non_pick_main")+"\nvoid main() \n{ \n czm_non_pick_main(); \n gl_FragColor = "+n+"; \n} \n";var d=new ShaderSource({sources:[s]}),h=new ShaderSource({defines:["VECTOR_TILE"],sources:[l]});e._spPick=ShaderProgram.fromCache({context:t,vertexShaderSource:d,fragmentShaderSource:h,attributeLocations:r})}}function getStencilDepthRenderState$1(e){var t=e?StencilFunction$1.EQUAL:StencilFunction$1.ALWAYS;return{colorMask:{red:!1,green:!1,blue:!1,alpha:!1},stencilTest:{enabled:!0,frontFunction:t,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.DECREMENT_WRAP,zPass:StencilOperation$1.KEEP},backFunction:t,backOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.INCREMENT_WRAP,zPass:StencilOperation$1.KEEP},reference:StencilConstants$1.CESIUM_3D_TILE_MASK,mask:StencilConstants$1.CESIUM_3D_TILE_MASK},stencilMask:StencilConstants$1.CLASSIFICATION_MASK,depthTest:{enabled:!0,func:DepthFunction$1.LESS_OR_EQUAL},depthMask:!1}}var colorRenderState={stencilTest:{enabled:!0,frontFunction:StencilFunction$1.NOT_EQUAL,frontOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},backFunction:StencilFunction$1.NOT_EQUAL,backOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},reference:0,mask:StencilConstants$1.CLASSIFICATION_MASK},stencilMask:StencilConstants$1.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1,blending:BlendingState$1.ALPHA_BLEND},pickRenderState$1={stencilTest:{enabled:!0,frontFunction:StencilFunction$1.NOT_EQUAL,frontOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},backFunction:StencilFunction$1.NOT_EQUAL,backOperation:{fail:StencilOperation$1.ZERO,zFail:StencilOperation$1.ZERO,zPass:StencilOperation$1.ZERO},reference:0,mask:StencilConstants$1.CLASSIFICATION_MASK},stencilMask:StencilConstants$1.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1};function createRenderStates$2(e){defined(e._rsStencilDepthPass)||(e._rsStencilDepthPass=RenderState.fromCache(getStencilDepthRenderState$1(!1)),e._rsStencilDepthPass3DTiles=RenderState.fromCache(getStencilDepthRenderState$1(!0)),e._rsColorPass=RenderState.fromCache(colorRenderState),e._rsPickPass=RenderState.fromCache(pickRenderState$1))}var modifiedModelViewScratch$1=new Matrix4,rtcScratch$1=new Cartesian3;function createUniformMap(i,r){var e;defined(i._uniformMap)||(e={u_modifiedModelViewProjection:function(){var e=r.uniformState.view,t=r.uniformState.projection;return Matrix4.clone(e,modifiedModelViewScratch$1),Matrix4.multiplyByPoint(modifiedModelViewScratch$1,i._center,rtcScratch$1),Matrix4.setTranslation(modifiedModelViewScratch$1,rtcScratch$1,modifiedModelViewScratch$1),Matrix4.multiply(t,modifiedModelViewScratch$1,modifiedModelViewScratch$1),modifiedModelViewScratch$1},u_highlightColor:function(){return i._highlightColor}},i._uniformMap=i._batchTable.getUniformMapCallback()(e))}function copyIndicesCPU(e,t,i,r,n,a,o){for(var s=e.constructor.BYTES_PER_ELEMENT,l=a.length,c=0;c<l;++c){var u=o[a[c]],d=r[u],h=n[u],p=new e.constructor(e.buffer,s*d,h);t.set(p,i),r[u]=i,i+=h}return i}function rebatchCPU(e,t){var i=e._indices,r=e._indexOffsets,n=e._indexCounts,a=e._batchIdLookUp,o=new i.constructor(i.length),s=t.pop(),l=[s],c=copyIndicesCPU(i,o,0,r,n,s.batchIds,a);for(s.offset=0,s.count=c;0<t.length;){var u,d=t.pop();Color.equals(d.color,s.color)?(c=copyIndicesCPU(i,o,c,r,n,d.batchIds,a),s.batchIds=s.batchIds.concat(d.batchIds),s.count=c-s.offset):(c=copyIndicesCPU(i,o,u=c,r,n,d.batchIds,a),d.offset=u,d.count=c-u,l.push(d),s=d)}e._va.indexBuffer.copyFromArrayView(o),e._indices=o,e._batchedIndices=l}function copyIndicesGPU(e,t,i,r,n,a,o){for(var s=e.bytesPerIndex,l=a.length,c=0;c<l;++c){var u=o[a[c]],d=r[u],h=n[u];t.copyFromBuffer(e,d*s,i*s,h*s),r[u]=i,i+=h}return i}function rebatchGPU(e,t){var i=e._indexOffsets,r=e._indexCounts,n=e._batchIdLookUp,a=t.pop(),o=[a],s=e._va.indexBuffer,l=e._vaSwap.indexBuffer,c=copyIndicesGPU(s,l,0,i,r,a.batchIds,n);for(a.offset=0,a.count=c;0<t.length;){var u,d=t.pop();Color.equals(d.color,a.color)?(c=copyIndicesGPU(s,l,c,i,r,d.batchIds,n),a.batchIds=a.batchIds.concat(d.batchIds),a.count=c-a.offset):(c=copyIndicesGPU(s,l,u=c,i,r,d.batchIds,n),d.offset=u,d.count=c-u,o.push(d),a=d)}var h=e._va;e._va=e._vaSwap,e._vaSwap=h,e._batchedIndices=o}function compareColors(e,t){return t.color.toRgba()-e.color.toRgba()}function rebatchCommands(e,t){if(!e._batchDirty)return!1;for(var i=e._batchedIndices,r=i.length,n=!1,a={},o=0;o<r;++o){var s=i[o].color.toRgba();if(defined(a[s])){n=!0;break}a[s]=!0}return n?n&&!e.forceRebatch&&e._framesSinceLastRebatch<120?void++e._framesSinceLastRebatch:(i.sort(compareColors),(t.webgl2?rebatchGPU:rebatchCPU)(e,i),e._framesSinceLastRebatch=0,e._batchDirty=!1,e._pickCommandsDirty=!0,e._wireframeDirty=!0):e._batchDirty=!1}function createColorCommands$1(e,t){var i=rebatchCommands(e,t),r=e._commands,n=e._batchedIndices,a=n.length,o=2*a;if(!defined(r)||i||r.length!==o){r.length=o;for(var s=e._va,l=e._sp,c=defaultValue(e._modelMatrix,Matrix4.IDENTITY),u=e._uniformMap,d=e._boundingVolume,h=0;h<a;++h){var p=n[h].offset,m=n[h].count,f=r[2*h];defined(f)||(f=r[2*h]=new DrawCommand({owner:e})),f.vertexArray=s,f.modelMatrix=c,f.offset=p,f.count=m,f.renderState=e._rsStencilDepthPass,f.shaderProgram=l,f.uniformMap=u,f.boundingVolume=d,f.cull=!1,f.pass=Pass$1.TERRAIN_CLASSIFICATION;var g=DrawCommand.shallowClone(f,f.derivedCommands.tileset);g.renderState=e._rsStencilDepthPass3DTiles,g.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,f.derivedCommands.tileset=g;var _=r[2*h+1];defined(_)||(_=r[2*h+1]=new DrawCommand({owner:e})),_.vertexArray=s,_.modelMatrix=c,_.offset=p,_.count=m,_.renderState=e._rsColorPass,_.shaderProgram=l,_.uniformMap=u,_.boundingVolume=d,_.cull=!1,_.pass=Pass$1.TERRAIN_CLASSIFICATION;var y=DrawCommand.shallowClone(_,_.derivedCommands.tileset);y.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,_.derivedCommands.tileset=y}e._commandsDirty=!0}}function createColorCommandsIgnoreShow(e,t){if(e.classificationType!==ClassificationType$1.TERRAIN&&t.invertClassification&&(!defined(e._commandsIgnoreShow)||e._commandsDirty)){for(var i=e._commands,r=e._commandsIgnoreShow,n=e._spStencil,a=i.length,o=r.length=a/2,s=0,l=0;l<o;++l){var c=r[l]=DrawCommand.shallowClone(i[s],r[l]);c.shaderProgram=n,c.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW,s+=2}e._commandsDirty=!1}}function createPickCommands$1(e){if(e._pickCommandsDirty){var t=e._indexOffsets.length,i=e._pickCommands;i.length=2*t;for(var r=e._va,n=e._spStencil,a=e._spPick,o=defaultValue(e._modelMatrix,Matrix4.IDENTITY),s=e._uniformMap,l=0;l<t;++l){var c=e._indexOffsets[l],u=e._indexCounts[l],d=defined(e._boundingVolumes)?e._boundingVolumes[l]:e.boundingVolume,h=i[2*l];defined(h)||(h=i[2*l]=new DrawCommand({owner:e,pickOnly:!0})),h.vertexArray=r,h.modelMatrix=o,h.offset=c,h.count=u,h.renderState=e._rsStencilDepthPass,h.shaderProgram=n,h.uniformMap=s,h.boundingVolume=d,h.pass=Pass$1.TERRAIN_CLASSIFICATION;var p=DrawCommand.shallowClone(h,h.derivedCommands.tileset);p.renderState=e._rsStencilDepthPass3DTiles,p.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,h.derivedCommands.tileset=p;var m=i[2*l+1];defined(m)||(m=i[2*l+1]=new DrawCommand({owner:e,pickOnly:!0})),m.vertexArray=r,m.modelMatrix=o,m.offset=c,m.count=u,m.renderState=e._rsPickPass,m.shaderProgram=a,m.uniformMap=s,m.boundingVolume=d,m.pass=Pass$1.TERRAIN_CLASSIFICATION;var f=DrawCommand.shallowClone(m,m.derivedCommands.tileset);f.pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,m.derivedCommands.tileset=f}e._pickCommandsDirty=!1}}function clearStyle(e,t){e._updatingAllCommands=!0;for(var i=e._batchIds,r=i.length,n=0;n<r;++n){var a=t[i[n]];a.show=!0,a.color=Color.WHITE}var o=e._batchedIndices,r=o.length;for(n=0;n<r;++n)o[n].color=Color.clone(Color.WHITE);e._updatingAllCommands=!1,e._batchDirty=!0}Vector3DTilePrimitive.prototype.createFeatures=function(e,t){for(var i=this._batchIds,r=i.length,n=0;n<r;++n){var a=i[n];t[a]=new Cesium3DTileFeature(e,a)}},Vector3DTilePrimitive.prototype.applyDebugSettings=function(e,t){this._highlightColor=e?t:this._constantColor};var scratchColor$3=new Color,DEFAULT_COLOR_VALUE$1=Color.WHITE,DEFAULT_SHOW_VALUE$1=!0,complexExpressionReg=/\$/;function queueCommands(e,t,i,r){for(var n,a=e.classificationType,o=a!==ClassificationType$1.CESIUM_3D_TILE,s=a!==ClassificationType$1.TERRAIN,l=t.commandList,c=i.length,u=0;u<c;++u)o&&((n=i[u]).pass=Pass$1.TERRAIN_CLASSIFICATION,l.push(n)),s&&((n=i[u].derivedCommands.tileset).pass=Pass$1.CESIUM_3D_TILE_CLASSIFICATION,l.push(n));if(t.invertClassification&&defined(r))for(c=r.length,u=0;u<c;++u)l.push(r[u])}function queueWireframeCommands(e,t){for(var i=e.commandList,r=t.length,n=0;n<r;n+=2){var a=t[n+1];a.pass=Pass$1.OPAQUE,i.push(a)}}function updateWireframe(e){var t,i;if(!(e.debugWireframe===e._debugWireframe&&!(e.debugWireframe&&e._wireframeDirty))){defined(e._rsWireframe)||(e._rsWireframe=RenderState.fromCache({})),i=e.debugWireframe?(t=e._rsWireframe,PrimitiveType$1.LINES):(t=e._rsColorPass,PrimitiveType$1.TRIANGLES);for(var r=e._commands,n=r.length,a=0;a<n;a+=2){var o=r[a+1];o.renderState=t,o.primitiveType=i}e._debugWireframe=e.debugWireframe,e._wireframeDirty=!1}}Vector3DTilePrimitive.prototype.applyStyle=function(e,t){if(defined(e)){var i=e.color,r=i instanceof Expression&&!complexExpressionReg.test(i.expression);this._updatingAllCommands=r;var n=this._batchIds,a=n.length;for(l=0;l<a;++l){var o=t[n[l]];o.color=defined(e.color)?e.color.evaluateColor(o,scratchColor$3):DEFAULT_COLOR_VALUE$1,o.show=defined(e.show)?e.show.evaluate(o):DEFAULT_SHOW_VALUE$1}if(r){for(var s=this._batchedIndices,a=s.length,l=0;l<a;++l)s[l].color=Color.clone(Color.WHITE);this._updatingAllCommands=!1,this._batchDirty=!0}}else clearStyle(this,t)},Vector3DTilePrimitive.prototype.updateCommands=function(e,t){if(!this._updatingAllCommands){var i=this._batchIdLookUp,r=i[e];if(defined(r)){for(var n=this._indexOffsets,a=this._indexCounts,o=n[r],s=a[r],l=this._batchedIndices,c=l.length,u=0;u<c;++u){var d=l[u].offset,h=l[u].count;if(d<=o&&o<d+h)break}l.push(new Vector3DTileBatch({color:Color.clone(t),offset:o,count:s,batchIds:[e]}));for(var p=[],m=[],f=l[u].batchIds,g=f.length,_=0;_<g;++_){var y=f[_];y!==e&&(n[i[y]]<o?p.push(y):m.push(y))}0!==m.length&&l.push(new Vector3DTileBatch({color:Color.clone(l[u].color),offset:o+s,count:l[u].offset+l[u].count-(o+s),batchIds:m})),0!==p.length?(l[u].count=o-l[u].offset,l[u].batchIds=p):l.splice(u,1),this._batchDirty=!0}}},Vector3DTilePrimitive.prototype.update=function(e){var t=e.context;createVertexArray$1(this,t),createShaders(this,t),createRenderStates$2(this),createUniformMap(this,t);var i=e.passes;i.render&&(createColorCommands$1(this,t),createColorCommandsIgnoreShow(this,e),updateWireframe(this),this._debugWireframe?queueWireframeCommands(e,this._commands):queueCommands(this,e,this._commands,this._commandsIgnoreShow)),i.pick&&(createPickCommands$1(this),queueCommands(this,e,this._pickCommands))},Vector3DTilePrimitive.prototype.isDestroyed=function(){return!1},Vector3DTilePrimitive.prototype.destroy=function(){return this._va=this._va&&this._va.destroy(),this._sp=this._sp&&this._sp.destroy(),this._spPick=this._spPick&&this._spPick.destroy(),this._vaSwap=this._vaSwap&&this._vaSwap.destroy(),destroyObject(this)};var boundingSphereCartesian3Scratch=new Cartesian3,ModelState=ModelUtility.ModelState;function ClassificationModel(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).gltf;if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),!(t instanceof Uint8Array))throw new RuntimeError("Only binary glTF is supported as a classifier.");updateVersion(t=parseGlb(t)),addDefaults(t),processModelMaterialsCommon(t),processPbrMaterials(t),ForEach.buffer(t,function(e){if(!defined(e.extras._pipeline.source))throw new RuntimeError("Buffer data must be embedded in the binary gltf.")});var i=t.nodes,r=t.meshes,n=i[0].mesh;if(1!==i.length||!defined(n))throw new RuntimeError("Only one node is supported for classification and it must have a mesh.");if(1!==r.length)throw new RuntimeError("Only one mesh is supported when using b3dm for classification.");var a=r[0].primitives;if(1!==a.length)throw new RuntimeError("Only one primitive per mesh is supported when using b3dm for classification.");if(!defined(a[0].attributes.POSITION))throw new RuntimeError("The mesh must have a position attribute.");if(!defined(a[0].attributes._BATCHID))throw new RuntimeError("The mesh must have a batch id attribute.");this._gltf=t,this.show=defaultValue(e.show,!0),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=Matrix4.clone(this.modelMatrix),this._ready=!1,this._readyPromise=when.defer(),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this._debugShowBoundingVolume=!1,this.debugWireframe=defaultValue(e.debugWireframe,!1),this._debugWireframe=!1,this._classificationType=e.classificationType,this._vertexShaderLoaded=e.vertexShaderLoaded,this._classificationShaderLoaded=e.classificationShaderLoaded,this._uniformMapLoaded=e.uniformMapLoaded,this._pickIdLoaded=e.pickIdLoaded,this._ignoreCommands=defaultValue(e.ignoreCommands,!1),this._upAxis=defaultValue(e.upAxis,Axis$1.Y),this._batchTable=e.batchTable,this._computedModelMatrix=new Matrix4,this._initialRadius=void 0,this._boundingSphere=void 0,this._scaledBoundingSphere=new BoundingSphere,this._state=ModelState.NEEDS_LOAD,this._loadResources=void 0,this._mode=void 0,this._dirty=!1,this._nodeMatrix=new Matrix4,this._primitive=void 0,this._extensionsUsed=void 0,this._extensionsRequired=void 0,this._quantizedUniforms=void 0,this._buffers={},this._vertexArray=void 0,this._shaderProgram=void 0,this._uniformMap=void 0,this._geometryByteLength=0,this._trianglesLength=0,this._rtcCenter=void 0,this._rtcCenterEye=void 0,this._rtcCenter3D=void 0,this._rtcCenter2D=void 0}function addBuffersToLoadResources(e){var t=e.gltf,i=e._loadResources;ForEach.buffer(t,function(e,t){i.buffers[t]=e.extras._pipeline.source})}function parseBufferViews(e){var i=e.gltf.bufferViews,r=e._loadResources.vertexBuffersToCreate;ForEach.bufferView(e.gltf,function(e,t){e.target===WebGLConstants$1.ARRAY_BUFFER&&r.enqueue(t)});var n=e._loadResources.indexBuffersToCreate,a={};ForEach.accessor(e.gltf,function(e){var t=e.bufferView;i[t].target!==WebGLConstants$1.ELEMENT_ARRAY_BUFFER||defined(a[t])||(a[t]=!0,n.enqueue({id:t,componentType:e.componentType}))})}function createVertexBuffer(e,t){var i=t._loadResources,r=t.gltf.bufferViews[e],n=i.getBuffer(r);t._buffers[e]=n,t._geometryByteLength+=n.byteLength}function createIndexBuffer(e,t,i){var r=i._loadResources,n=i.gltf.bufferViews[e],a={typedArray:r.getBuffer(n),indexDatatype:t};i._buffers[e]=a,i._geometryByteLength+=a.typedArray.byteLength}function createBuffers(e){var t=e._loadResources;if(0===t.pendingBufferLoads){for(var i=t.vertexBuffersToCreate,r=t.indexBuffersToCreate;0<i.length;)createVertexBuffer(i.dequeue(),e);for(;0<r.length;){var n=r.dequeue();createIndexBuffer(n.id,n.componentType,e)}}}function modifyShaderForQuantizedAttributes(e,t){var i=t.gltf.meshes[0].primitives[0],r=ModelUtility.modifyShaderForQuantizedAttributes(t.gltf,i,e);return t._quantizedUniforms=r.uniforms,r.shader}function modifyShader(e,t){return defined(t)&&(e=t(e)),e}function createProgram(e){var t=e.gltf,i=ModelUtility.getAttributeOrUniformBySemantic(t,"POSITION"),r=ModelUtility.getAttributeOrUniformBySemantic(t,"_BATCHID"),n={};n[i]=0,n[r]=1;var a,o,s,l=ModelUtility.getAttributeOrUniformBySemantic(t,"MODELVIEWPROJECTION"),c=defined(l)?(a="uniform mat4 "+l+";\n",l+" * vec4("+i+", 1.0)"):(o=ModelUtility.getAttributeOrUniformBySemantic(t,"PROJECTION"),defined(s=ModelUtility.getAttributeOrUniformBySemantic(t,"MODELVIEW"))||(s=ModelUtility.getAttributeOrUniformBySemantic(t,"CESIUM_RTC_MODELVIEW")),a="uniform mat4 "+s+";\nuniform mat4 "+o+";\n",o+" * "+s+" * vec4("+i+", 1.0)"),u="attribute vec3 "+i+";\nattribute float "+r+";\n"+a+"void main() {\n"+(" vec4 positionInClipCoords = "+c+";\n")+" gl_Position = czm_depthClamp(positionInClipCoords);\n}\n";e.extensionsUsed.WEB3D_quantized_attributes&&(u=modifyShaderForQuantizedAttributes(u,e));var d=modifyShader(u,e._vertexShaderLoaded),h=modifyShader("#ifdef GL_EXT_frag_depth\n#extension GL_EXT_frag_depth : enable\n#endif\nvoid main() \n{ \n gl_FragColor = vec4(1.0); \n czm_writeDepthClamp();\n}\n",e._classificationShaderLoaded);e._shaderProgram={vertexShaderSource:d,fragmentShaderSource:h,attributeLocations:n}}function getAttributeLocations(){return{POSITION:0,_BATCHID:1}}function createVertexArray$2(e){var n,a,o,t,s,l,i,r;e._loadResources.finishedBuffersCreation()&&!defined(e._vertexArray)&&(n=e._buffers,a=e.gltf,o=a.accessors,t=a.meshes[0].primitives[0],s=getAttributeLocations(),l={},ForEach.meshPrimitiveAttribute(t,function(e,t){var i,r=s[t];defined(r)&&(i=o[e],l[t]={index:r,vertexBuffer:n[i.bufferView],componentsPerAttribute:numberOfComponentsForType(i.type),componentDatatype:i.componentType,offsetInBytes:i.byteOffset,strideInBytes:getAccessorByteStride(a,i)})}),defined(t.indices)&&(i=o[t.indices],r=n[i.bufferView]),e._vertexArray={attributes:l,indexBuffer:r})}Object.defineProperties(ClassificationModel.prototype,{gltf:{get:function(){return this._gltf}},boundingSphere:{get:function(){var e=this.modelMatrix,t=Matrix4.getScale(e,boundingSphereCartesian3Scratch),i=this._scaledBoundingSphere;return i.center=Cartesian3.multiplyComponents(this._boundingSphere.center,t,i.center),i.radius=Cartesian3.maximumComponent(t)*this._initialRadius,defined(this._rtcCenter)&&Cartesian3.add(this._rtcCenter,i.center,i.center),i}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},dirty:{get:function(){return this._dirty}},extensionsUsed:{get:function(){return defined(this._extensionsUsed)||(this._extensionsUsed=ModelUtility.getUsedExtensions(this.gltf)),this._extensionsUsed}},extensionsRequired:{get:function(){return defined(this._extensionsRequired)||(this._extensionsRequired=ModelUtility.getRequiredExtensions(this.gltf)),this._extensionsRequired}},upAxis:{get:function(){return this._upAxis}},trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},texturesByteLength:{get:function(){return 0}},classificationType:{get:function(){return this._classificationType}}});var gltfSemanticUniforms$1={PROJECTION:function(e,t){return ModelUtility.getGltfSemanticUniforms().PROJECTION(e,t)},MODELVIEW:function(e,t){return ModelUtility.getGltfSemanticUniforms().MODELVIEW(e,t)},CESIUM_RTC_MODELVIEW:function(e,t){return ModelUtility.getGltfSemanticUniforms().CESIUM_RTC_MODELVIEW(e,t)},MODELVIEWPROJECTION:function(e,t){return ModelUtility.getGltfSemanticUniforms().MODELVIEWPROJECTION(e,t)}};function createUniformMap$1(i,r){var n;defined(i._uniformMap)||(n={},ForEach.technique(i.gltf,function(e){ForEach.techniqueUniform(e,function(e,t){defined(e.semantic)&&defined(gltfSemanticUniforms$1[e.semantic])&&(n[t]=gltfSemanticUniforms$1[e.semantic](r.uniformState,i))})}),i._uniformMap=n)}function createUniformsForQuantizedAttributes(e,t){return ModelUtility.createUniformsForQuantizedAttributes(e.gltf,t,e._quantizedUniforms)}function triangleCountFromPrimitiveIndices(e,t){switch(e.mode){case PrimitiveType$1.TRIANGLES:return t/3;case PrimitiveType$1.TRIANGLE_STRIP:case PrimitiveType$1.TRIANGLE_FAN:return Math.max(t-2,0);default:return 0}}function createPrimitive(e){var t,i,r=e._batchTable,n=e._uniformMap,a=e._vertexArray,o=e.gltf,s=o.accessors,l=o.meshes[0].primitives[0],c=s[l.indices],u=l.attributes.POSITION,d=ModelUtility.getAccessorMinMax(o,u),h=BoundingSphere.fromCornerPoints(Cartesian3.fromArray(d.min),Cartesian3.fromArray(d.max));i=defined(c)?(t=c.count,c.byteOffset/IndexDatatype$1.getSizeInBytes(c.componentType)):(t=s[l.attributes.POSITION].count,0),e._trianglesLength+=triangleCountFromPrimitiveIndices(l,t),defined(e._uniformMapLoaded)&&(n=e._uniformMapLoaded(n)),e.extensionsUsed.WEB3D_quantized_attributes&&(n=combine(n,createUniformsForQuantizedAttributes(e,l)));var p,m,f,g=a.attributes.POSITION,_=g.componentDatatype,y=g.vertexBuffer,v=y.byteOffset,C=y.byteLength/ComponentDatatype$1.getSizeInBytes(_),S=ComponentDatatype$1.createArrayBufferView(_,y.buffer,v,C),_=(g=a.attributes._BATCHID).componentDatatype,v=(y=g.vertexBuffer).byteOffset,C=y.byteLength/ComponentDatatype$1.getSizeInBytes(_),T=ComponentDatatype$1.createArrayBufferView(_,y.buffer,v,C),x=a.indexBuffer.typedArray,b=a.indexBuffer.indexDatatype===IndexDatatype$1.UNSIGNED_SHORT?new Uint16Array(x.buffer,x.byteOffset,x.byteLength/Uint16Array.BYTES_PER_ELEMENT):new Uint32Array(x.buffer,x.byteOffset,x.byteLength/Uint32Array.BYTES_PER_ELEMENT),S=arraySlice(S),E=[],P=[],A=[],w=[],D=(T=arraySlice(T))[(b=arraySlice(b,i,i+t))[0]];E.push(D),A.push(0);for(var M=b.length,I=1;I<M;++I)(p=T[b[I]])!==D&&(f=I-(m=A[A.length-1]),E.push(p),P.push(f),A.push(I),w.push(new Vector3DTileBatch({offset:m,count:f,batchIds:[D],color:Color.WHITE})),D=p);f=M-(m=A[A.length-1]),P.push(f),w.push(new Vector3DTileBatch({offset:m,count:f,batchIds:[D],color:Color.WHITE}));var R=e._shaderProgram,O=R.vertexShaderSource,L=R.fragmentShaderSource,F=R.attributeLocations,N=defined(e._pickIdLoaded)?e._pickIdLoaded():void 0;e._primitive=new Vector3DTilePrimitive({classificationType:e._classificationType,positions:S,indices:b,indexOffsets:A,indexCounts:P,batchIds:E,vertexBatchIds:T,batchedIndices:w,batchTable:r,boundingVolume:new BoundingSphere,_vertexShaderSource:O,_fragmentShaderSource:L,_attributeLocations:F,_uniformMap:n,_pickId:N,_modelMatrix:new Matrix4,_boundingSphere:h}),e._buffers=void 0,e._vertexArray=void 0,e._shaderProgram=void 0,e._uniformMap=void 0}function createRuntimeNodes(e){var t;e._loadResources.finished()&&(defined(e._primitive)||(t=e.gltf.nodes[0],e._nodeMatrix=ModelUtility.getTransform(t,e._nodeMatrix),createPrimitive(e)))}function createResources(e,t){var i=t.context;ModelUtility.checkSupportedGlExtensions(e.gltf.glExtensionsUsed,i),createBuffers(e),createProgram(e),createVertexArray$2(e),createUniformMap$1(e,i),createRuntimeNodes(e)}var scratchComputedTranslation=new Cartesian4,scratchComputedMatrixIn2D=new Matrix4;function updateNodeModelMatrix(e,t,i,r){var n,a,o,s=e._computedModelMatrix;e._mode===SceneMode$1.SCENE3D||e._ignoreCommands||(n=Matrix4.getColumn(s,3,scratchComputedTranslation),Cartesian4.equals(n,Cartesian4.UNIT_W)?(a=e.boundingSphere.center,o=Transforms.wgs84To2DModelMatrix(r,a,scratchComputedMatrixIn2D),s=Matrix4.multiply(o,s,scratchComputedMatrixIn2D),defined(e._rtcCenter)&&(Matrix4.setTranslation(s,Cartesian4.UNIT_W,s),e._rtcCenter=e._rtcCenter2D)):(s=Transforms.basisTo2D(r,s,scratchComputedMatrixIn2D),e._rtcCenter=e._rtcCenter3D));var l=e._primitive;(t||i)&&(Matrix4.multiplyTransformation(s,e._nodeMatrix,l._modelMatrix),BoundingSphere.transform(l._boundingSphere,l._modelMatrix,l._boundingVolume),defined(e._rtcCenter)&&Cartesian3.add(e._rtcCenter,l._boundingVolume.center,l._boundingVolume.center))}function ClippingPlane(e,t){this._distance=t,this._normal=new UpdateChangedCartesian3(e,this),this.onChangeCallback=void 0,this.index=-1}function UpdateChangedCartesian3(e,t){this._clippingPlane=t,this._cartesian3=Cartesian3.clone(e)}function ClippingPlaneCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._planes=[],this._dirtyIndex=-1,this._multipleDirtyPlanes=!1,this._enabled=defaultValue(e.enabled,!0),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this.edgeColor=Color.clone(defaultValue(e.edgeColor,Color.WHITE)),this.edgeWidth=defaultValue(e.edgeWidth,0),this.planeAdded=new Event,this.planeRemoved=new Event,this._owner=void 0;var t=defaultValue(e.unionClippingRegions,!1);this._unionClippingRegions=t,this._testIntersection=t?unionIntersectFunction:defaultIntersectFunction,this._uint8View=void 0,this._float32View=void 0,this._clippingPlanesTexture=void 0;var i=e.planes;if(defined(i))for(var r=i.length,n=0;n<r;++n)this.add(i[n])}function unionIntersectFunction(e){return e===Intersect$1.OUTSIDE}function defaultIntersectFunction(e){return e===Intersect$1.INSIDE}function setIndexDirty(e,t){e._multipleDirtyPlanes=e._multipleDirtyPlanes||-1!==e._dirtyIndex&&e._dirtyIndex!==t,e._dirtyIndex=t}function indexOf(e,t){for(var i=e.length,r=0;r<i;++r)if(Plane.equals(e[r],t))return r;return-1}ClassificationModel.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)},ClassificationModel.prototype.update=function(e){var t,i,r,n,a,o,s,l,c,u,d,h,p,m;e.mode!==SceneMode$1.MORPHING&&(FeatureDetection.supportsWebP.initialized?(t=FeatureDetection.supportsWebP(),this._state===ModelState.NEEDS_LOAD&&defined(this.gltf)&&(this._state=ModelState.LOADING,this._state!==ModelState.FAILED&&(defined(i=this.gltf.extensions)&&defined(i.CESIUM_RTC)&&(r=Cartesian3.fromArray(i.CESIUM_RTC.center),Cartesian3.equals(r,Cartesian3.ZERO)||(this._rtcCenter3D=r,a=(n=e.mapProjection).ellipsoid.cartesianToCartographic(this._rtcCenter3D),o=n.project(a),Cartesian3.fromElements(o.z,o.x,o.y,o),this._rtcCenter2D=o,this._rtcCenterEye=new Cartesian3,this._rtcCenter=this._rtcCenter3D)),this._loadResources=new ModelLoadResources,ModelUtility.parseBuffers(this))),s=this._loadResources,l=!1,this._state===ModelState.LOADING&&(0===s.pendingBufferLoads&&(ModelUtility.checkSupportedExtensions(this.extensionsRequired,t),addBuffersToLoadResources(this),parseBufferViews(this),this._boundingSphere=ModelUtility.computeBoundingSphere(this),this._initialRadius=this._boundingSphere.radius,createResources(this,e)),s.finished()&&(this._state=ModelState.LOADED,l=!0)),defined(s)&&this._state===ModelState.LOADED&&(l||createResources(this,e),s.finished()&&(this._loadResources=void 0)),((c=this.show)&&this._state===ModelState.LOADED||l)&&(this._dirty=!1,u=this.modelMatrix,d=e.mode!==this._mode,this._mode=e.mode,((h=!Matrix4.equals(this._modelMatrix,u)||d)||l)&&(Matrix4.clone(u,this._modelMatrix),p=this._computedModelMatrix,Matrix4.clone(u,p),this._upAxis===Axis$1.Y?Matrix4.multiplyTransformation(p,Axis$1.Y_UP_TO_Z_UP,p):this._upAxis===Axis$1.X&&Matrix4.multiplyTransformation(p,Axis$1.X_UP_TO_Z_UP,p)),(h||l)&&(updateNodeModelMatrix(this,h,l,e.mapProjection),this._dirty=!0)),l?(m=this,e.afterRender.push(function(){m._ready=!0,m._readyPromise.resolve(m)})):c&&!this._ignoreCommands&&(this._primitive.debugShowBoundingVolume=this.debugShowBoundingVolume,this._primitive.debugWireframe=this.debugWireframe,this._primitive.update(e))):FeatureDetection.supportsWebP.initialize())},ClassificationModel.prototype.isDestroyed=function(){return!1},ClassificationModel.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),destroyObject(this)},Object.defineProperties(ClippingPlane.prototype,{distance:{get:function(){return this._distance},set:function(e){defined(this.onChangeCallback)&&e!==this._distance&&this.onChangeCallback(this.index),this._distance=e}},normal:{get:function(){return this._normal},set:function(e){defined(this.onChangeCallback)&&!Cartesian3.equals(this._normal._cartesian3,e)&&this.onChangeCallback(this.index),Cartesian3.clone(e,this._normal._cartesian3)}}}),ClippingPlane.fromPlane=function(e,t){return defined(t)?(t.normal=e.normal,t.distance=e.distance):t=new ClippingPlane(e.normal,e.distance),t},ClippingPlane.clone=function(e,t){return defined(t)?(t.normal=e.normal,t.distance=e.distance,t):new ClippingPlane(e.normal,e.distance)},Object.defineProperties(UpdateChangedCartesian3.prototype,{x:{get:function(){return this._cartesian3.x},set:function(e){defined(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.x&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.x=e}},y:{get:function(){return this._cartesian3.y},set:function(e){defined(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.y&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.y=e}},z:{get:function(){return this._cartesian3.z},set:function(e){defined(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.z&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.z=e}}}),Object.defineProperties(ClippingPlaneCollection.prototype,{length:{get:function(){return this._planes.length}},unionClippingRegions:{get:function(){return this._unionClippingRegions},set:function(e){this._unionClippingRegions!==e&&(this._unionClippingRegions=e,this._testIntersection=e?unionIntersectFunction:defaultIntersectFunction)}},enabled:{get:function(){return this._enabled},set:function(e){this._enabled!==e&&(this._enabled=e)}},texture:{get:function(){return this._clippingPlanesTexture}},owner:{get:function(){return this._owner}},clippingPlanesState:{get:function(){return this._unionClippingRegions?this._planes.length:-this._planes.length}}}),ClippingPlaneCollection.prototype.add=function(e){var t=this._planes.length,i=this;e.onChangeCallback=function(e){setIndexDirty(i,e)},setIndexDirty(this,e.index=t),this._planes.push(e),this.planeAdded.raiseEvent(e,t)},ClippingPlaneCollection.prototype.get=function(e){return this._planes[e]},ClippingPlaneCollection.prototype.contains=function(e){return-1!==indexOf(this._planes,e)},ClippingPlaneCollection.prototype.remove=function(e){var t=this._planes,i=indexOf(t,e);if(-1===i)return!1;e instanceof ClippingPlane&&(e.onChangeCallback=void 0,e.index=-1);for(var r=t.length-1,n=i;n<r;++n){var a=t[n+1];(t[n]=a)instanceof ClippingPlane&&(a.index=n)}return this._multipleDirtyPlanes=!0,t.length=r,this.planeRemoved.raiseEvent(e,i),!0},ClippingPlaneCollection.prototype.removeAll=function(){for(var e=this._planes,t=e.length,i=0;i<t;++i){var r=e[i];r instanceof ClippingPlane&&(r.onChangeCallback=void 0,r.index=-1),this.planeRemoved.raiseEvent(r,i)}this._multipleDirtyPlanes=!0,this._planes=[]};var distanceEncodeScratch=new Cartesian4,oct32EncodeScratch=new Cartesian4;function packPlanesAsUint8(e,t,i){for(var r=e._uint8View,n=e._planes,a=0,o=t;o<i;++o){var s=n[o],l=AttributeCompression.octEncodeToCartesian4(s.normal,oct32EncodeScratch);r[a]=l.x,r[a+1]=l.y,r[a+2]=l.z,r[a+3]=l.w;var c=Cartesian4.packFloat(s.distance,distanceEncodeScratch);r[a+4]=c.x,r[a+5]=c.y,r[a+6]=c.z,r[a+7]=c.w,a+=8}}function packPlanesAsFloats(e,t,i){for(var r=e._float32View,n=e._planes,a=0,o=t;o<i;++o){var s=n[o],l=s.normal;r[a]=l.x,r[a+1]=l.y,r[a+2]=l.z,r[a+3]=s.distance,a+=4}}function computeTextureResolution(e,t){var i=ContextLimits.maximumTextureSize;return t.x=Math.min(e,i),t.y=Math.ceil(e/t.x),t}var textureResolutionScratch=new Cartesian2;ClippingPlaneCollection.prototype.update=function(e){var t,i,r,n,a,o=this._clippingPlanesTexture,s=e.context,l=ClippingPlaneCollection.useFloatTexture(s),c=l?this.length:2*this.length;!defined(o)||((t=o.width*o.height)<c||c<.25*t)&&(o.destroy(),o=void 0,this._clippingPlanesTexture=void 0),0!==this.length&&(defined(o)||((i=computeTextureResolution(c,textureResolutionScratch)).y*=2,l?(o=new Texture({context:s,width:i.x,height:i.y,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.FLOAT,sampler:Sampler.NEAREST,flipY:!1}),this._float32View=new Float32Array(i.x*i.y*4)):(o=new Texture({context:s,width:i.x,height:i.y,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST,flipY:!1}),this._uint8View=new Uint8Array(i.x*i.y*4)),this._clippingPlanesTexture=o,this._multipleDirtyPlanes=!0),r=this._dirtyIndex,!this._multipleDirtyPlanes&&-1===r||(this._multipleDirtyPlanes?l?(packPlanesAsFloats(this,0,this._planes.length),o.copyFrom({width:o.width,height:o.height,arrayBufferView:this._float32View})):(packPlanesAsUint8(this,0,this._planes.length),o.copyFrom({width:o.width,height:o.height,arrayBufferView:this._uint8View})):(a=n=0,l?(a=Math.floor(r/o.width),n=Math.floor(r-a*o.width),packPlanesAsFloats(this,r,r+1),o.copyFrom({width:1,height:1,arrayBufferView:this._float32View},n,a)):(a=Math.floor(2*r/o.width),n=Math.floor(2*r-a*o.width),packPlanesAsUint8(this,r,r+1),o.copyFrom({width:2,height:1,arrayBufferView:this._uint8View},n,a))),this._multipleDirtyPlanes=!1,this._dirtyIndex=-1))};var scratchMatrix=new Matrix4,scratchPlane$2=new Plane(Cartesian3.UNIT_X,0);ClippingPlaneCollection.prototype.computeIntersectionWithBoundingVolume=function(e,t){var i=this._planes,r=i.length,n=this.modelMatrix;defined(t)&&(n=Matrix4.multiply(t,n,scratchMatrix));var a=Intersect$1.INSIDE;!this.unionClippingRegions&&0<r&&(a=Intersect$1.OUTSIDE);for(var o=0;o<r;++o){var s=i[o];Plane.transform(s,n,scratchPlane$2);var l=e.intersectPlane(scratchPlane$2);if(l===Intersect$1.INTERSECTING)a=l;else if(this._testIntersection(l))return l}return a},ClippingPlaneCollection.setOwner=function(e,t,i){e!==t[i]&&(t[i]=t[i]&&t[i].destroy(),defined(e)&&((e._owner=t)[i]=e))},ClippingPlaneCollection.useFloatTexture=function(e){return e.floatingPointTexture},ClippingPlaneCollection.getTextureResolution=function(e,t,i){var r=e.texture;if(defined(r))return i.x=r.width,i.y=r.height,i;var n=computeTextureResolution(ClippingPlaneCollection.useFloatTexture(t)?e.length:2*e.length,i);return n.y*=2,n},ClippingPlaneCollection.prototype.isDestroyed=function(){return!1},ClippingPlaneCollection.prototype.destroy=function(){return this._clippingPlanesTexture=this._clippingPlanesTexture&&this._clippingPlanesTexture.destroy(),destroyObject(this)};var ColorBlendMode={HIGHLIGHT:0,REPLACE:1,MIX:2,getColorBlend:function(e,t){return e===ColorBlendMode.HIGHLIGHT?0:e===ColorBlendMode.REPLACE?1:e===ColorBlendMode.MIX?CesiumMath.clamp(t,CesiumMath.EPSILON4,1):void 0}},ColorBlendMode$1=Object.freeze(ColorBlendMode);function DracoLoader(){}function addBufferToLoadResources(e,t){var i="runtime."+Object.keys(e.createdBufferViews).length,r=e.buffers,n=Object.keys(r).length;return r[n]=t,e.createdBufferViews[i]={buffer:n,byteOffset:0,byteLength:t.byteLength},i}function addNewVertexBuffer(e,t,i){var r=t._loadResources,n=addBufferToLoadResources(r,e);return r.vertexBuffersToCreate.enqueue(n),n}function addNewIndexBuffer(e,t,i){var r=e.typedArray,n=t._loadResources,a=addBufferToLoadResources(n,r);return n.indexBuffersToCreate.enqueue({id:a,componentType:ComponentDatatype$1.fromTypedArray(r)}),{bufferViewId:a,numberOfIndices:e.numberOfIndices}}function scheduleDecodingTask(e,l,c,t){if(DracoLoader._taskProcessorReady){var u=c.primitivesToDecode.peek();if(defined(u)){var i=e.scheduleTask(u,[u.array.buffer]);if(defined(i))return c.activeDecodingTasks++,c.primitivesToDecode.dequeue(),i.then(function(e){c.activeDecodingTasks--;var t,i,r,n=addNewIndexBuffer(e.indexArray,l),a={},o=e.attributeData;for(var s in o){o.hasOwnProperty(s)&&(i=addNewVertexBuffer((t=o[s]).array,l),(r=t.data).bufferView=i,a[s]=r)}l._decodedData[u.mesh+".primitive."+u.primitive]={bufferView:n.bufferViewId,numberOfIndices:n.numberOfIndices,attributes:a}})}}}function getClipAndStyleCode(e,t,i){return" float clipDistance = clip(gl_FragCoord, "+e+", "+t+"); \n vec4 clippingPlanesEdgeColor = vec4(1.0); \n clippingPlanesEdgeColor.rgb = "+i+".rgb; \n float clippingPlanesEdgeWidth = "+i+".a; \n if (clipDistance > 0.0 && clipDistance < clippingPlanesEdgeWidth) \n { \n gl_FragColor = clippingPlanesEdgeColor;\n } \n"}DracoLoader._maxDecodingConcurrency=Math.max(FeatureDetection.hardwareConcurrency-1,1),DracoLoader._decoderTaskProcessor=void 0,DracoLoader._taskProcessorReady=!1,DracoLoader._getDecoderTaskProcessor=function(){var e;return defined(DracoLoader._decoderTaskProcessor)||((e=new TaskProcessor("decodeDraco",DracoLoader._maxDecodingConcurrency)).initWebAssemblyModule({modulePath:"ThirdParty/Workers/draco_wasm_wrapper.js",wasmBinaryFile:"ThirdParty/draco_decoder.wasm",fallbackModulePath:"ThirdParty/Workers/draco_decoder.js"}).then(function(){DracoLoader._taskProcessorReady=!0}),DracoLoader._decoderTaskProcessor=e),DracoLoader._decoderTaskProcessor},DracoLoader.hasExtension=function(e){return defined(e.extensionsRequired.KHR_draco_mesh_compression)||defined(e.extensionsUsed.KHR_draco_mesh_compression)},DracoLoader._decodedModelResourceCache=void 0,DracoLoader.parse=function(e,t){if(DracoLoader.hasExtension(e)){var o=e._loadResources,i=e.cacheKey;if(defined(i)){defined(DracoLoader._decodedModelResourceCache)||(defined(t.cache.modelDecodingCache)||(t.cache.modelDecodingCache={}),DracoLoader._decodedModelResourceCache=t.cache.modelDecodingCache);var r=DracoLoader._decodedModelResourceCache[i];if(defined(r))return r.count++,void(o.pendingDecodingCache=!0)}var s=e._dequantizeInShader,l=e.gltf;ForEach.mesh(l,function(e,a){ForEach.meshPrimitive(e,function(e,t){var i,r,n;!defined(e.extensions)||defined(i=e.extensions.KHR_draco_mesh_compression)&&(r=l.bufferViews[i.bufferView],n=arraySlice(l.buffers[r.buffer].extras._pipeline.source,r.byteOffset,r.byteOffset+r.byteLength),o.primitivesToDecode.enqueue({mesh:a,primitive:t,array:n,bufferView:r,compressedAttributes:i.attributes,dequantizeInShader:s}))})})}},DracoLoader.decodeModel=function(e,t){if(!DracoLoader.hasExtension(e))return when.resolve();var i=e._loadResources,r=e.cacheKey;if(defined(r)&&defined(DracoLoader._decodedModelResourceCache)){var n=DracoLoader._decodedModelResourceCache[r];if(defined(n)&&i.pendingDecodingCache)return when(n.ready,function(){e._decodedData=n.data,i.pendingDecodingCache=!1});DracoLoader._decodedModelResourceCache[r]={ready:!1,count:1,data:void 0}}if(0===i.primitivesToDecode.length)return when.resolve();for(var a=DracoLoader._getDecoderTaskProcessor(),o=[],s=scheduleDecodingTask(a,e,i);defined(s);)o.push(s),s=scheduleDecodingTask(a,e,i);return when.all(o)},DracoLoader.decodePointCloud=function(e){var t=DracoLoader._getDecoderTaskProcessor();if(DracoLoader._taskProcessorReady)return t.scheduleTask(e,[e.buffer.buffer])},DracoLoader.cacheDataForModel=function(e){var t,i=e.cacheKey;defined(i)&&defined(DracoLoader._decodedModelResourceCache)&&(defined(t=DracoLoader._decodedModelResourceCache[i])&&(t.ready=!0,t.data=e._decodedData))},DracoLoader.destroyCachedDataForModel=function(e){var t,i=e.cacheKey;defined(i)&&defined(DracoLoader._decodedModelResourceCache)&&(defined(t=DracoLoader._decodedModelResourceCache[i])&&0==--t.count&&delete DracoLoader._decodedModelResourceCache[i])};var textureResolutionScratch$1=new Cartesian2;function getClippingFunction(e,t){var i=e.unionClippingRegions,r=e.length,n=ClippingPlaneCollection.useFloatTexture(t),a=ClippingPlaneCollection.getTextureResolution(e,t,textureResolutionScratch$1),o=a.x,s=a.y,l=(n?getClippingPlaneFloat:getClippingPlaneUint8)(o,s);return l+="\n",l+=(i?clippingFunctionUnion:clippingFunctionIntersect)(r)}function clippingFunctionUnion(e){return"float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix)\n{\n vec4 position = czm_windowToEyeCoordinates(fragCoord);\n vec3 clipNormal = vec3(0.0);\n vec3 clipPosition = vec3(0.0);\n float clipAmount;\n float pixelWidth = czm_metersPerPixel(position);\n bool breakAndDiscard = false;\n for (int i = 0; i < "+e+"; ++i)\n {\n vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix);\n clipNormal = clippingPlane.xyz;\n clipPosition = -clippingPlane.w * clipNormal;\n float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth;\n clipAmount = czm_branchFreeTernary(i == 0, amount, min(amount, clipAmount));\n if (amount <= 0.0)\n {\n breakAndDiscard = true;\n break;\n }\n }\n if (breakAndDiscard) {\n discard;\n }\n return clipAmount;\n}\n"}function clippingFunctionIntersect(e){return"float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix)\n{\n bool clipped = true;\n vec4 position = czm_windowToEyeCoordinates(fragCoord);\n vec3 clipNormal = vec3(0.0);\n vec3 clipPosition = vec3(0.0);\n float clipAmount = 0.0;\n float pixelWidth = czm_metersPerPixel(position);\n for (int i = 0; i < "+e+"; ++i)\n {\n vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix);\n clipNormal = clippingPlane.xyz;\n clipPosition = -clippingPlane.w * clipNormal;\n float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth;\n clipAmount = max(amount, clipAmount);\n clipped = clipped && (amount <= 0.0);\n }\n if (clipped)\n {\n discard;\n }\n return clipAmount;\n}\n"}function getClippingPlaneFloat(e,t){var i=1/t,r=1/e+"";-1===r.indexOf(".")&&(r+=".0");var n=i+"";return-1===n.indexOf(".")&&(n+=".0"),"vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform)\n{\n int pixY = clippingPlaneNumber / "+e+";\n int pixX = clippingPlaneNumber - (pixY * "+e+");\n float u = (float(pixX) + 0.5) * "+r+";\n float v = (float(pixY) + 0.5) * "+n+";\n vec4 plane = texture2D(packedClippingPlanes, vec2(u, v));\n return czm_transformPlane(plane, transform);\n}\n"}function getClippingPlaneUint8(e,t){var i=1/t,r=1/e+"";-1===r.indexOf(".")&&(r+=".0");var n=i+"";return-1===n.indexOf(".")&&(n+=".0"),"vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform)\n{\n int clippingPlaneStartIndex = clippingPlaneNumber * 2;\n int pixY = clippingPlaneStartIndex / "+e+";\n int pixX = clippingPlaneStartIndex - (pixY * "+e+");\n float u = (float(pixX) + 0.5) * "+r+";\n float v = (float(pixY) + 0.5) * "+n+";\n vec4 oct32 = texture2D(packedClippingPlanes, vec2(u, v)) * 255.0;\n vec2 oct = vec2(oct32.x * 256.0 + oct32.y, oct32.z * 256.0 + oct32.w);\n vec4 plane;\n plane.xyz = czm_octDecode(oct, 65535.0);\n plane.w = czm_unpackFloat(texture2D(packedClippingPlanes, vec2(u + "+r+", v)));\n return czm_transformPlane(plane, transform);\n}\n"}var JobType={TEXTURE:0,PROGRAM:1,BUFFER:2,NUMBER_OF_JOB_TYPES:3},JobType$1=Object.freeze(JobType);function ModelAnimationCache(){}var dataUriRegex$2=/^data\:/i;function getAccessorKey(e,t){var i=e.gltf,r=i.buffers,n=i.bufferViews[t.bufferView],a=r[n.buffer],o=n.byteOffset+t.byteOffset,s=t.count*numberOfComponentsForType(t.type),l=dataUriRegex$2.test(a.uri)?"":a.uri;return e.cacheKey+"//"+l+"/"+o+"/"+s}var cachedAnimationParameters={};ModelAnimationCache.getAnimationParameterValues=function(e,t){var i=getAccessorKey(e,t);if(!defined(h=cachedAnimationParameters[i])){for(var r=e.gltf,n=r.buffers,a=r.bufferViews[t.bufferView],o=n[a.buffer].extras._pipeline.source,s=t.componentType,l=t.type,c=numberOfComponentsForType(l),u=t.count,d=getAccessorByteStride(r,t),h=new Array(u),p=defaultValue(t.byteOffset,0),m=a.byteOffset+p,f=0;f<u;f++){var g=ComponentDatatype$1.createArrayBufferView(s,o.buffer,o.byteOffset+m,c);"SCALAR"===l?h[f]=g[0]:"VEC3"===l?h[f]=Cartesian3.fromArray(g):"VEC4"===l&&(h[f]=Quaternion.unpack(g)),m+=d}defined(e.cacheKey)&&(cachedAnimationParameters[i]=h)}return h};var cachedAnimationSplines={};function getAnimationSplineKey(e,t,i){return e.cacheKey+"//"+t+"/"+i}function ConstantSpline(e){this._value=e}function SteppedSpline(e){this._spline=e,this._lastTimeIndex=0}ConstantSpline.prototype.evaluate=function(e,t){return this._value},ConstantSpline.prototype.wrapTime=function(e){return 0},ConstantSpline.prototype.clampTime=function(e){return 0},SteppedSpline.prototype.findTimeInterval=Spline.prototype.findTimeInterval,SteppedSpline.prototype.evaluate=function(e,t){var i=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),r=this._spline.times,n=e>=r[i+1]?r[i+1]:r[i];return this._spline.evaluate(n,t)},Object.defineProperties(SteppedSpline.prototype,{times:{get:function(){return this._spline.times}}}),SteppedSpline.prototype.wrapTime=function(e){return this._spline.wrapTime(e)},SteppedSpline.prototype.clampTime=function(e){return this._spline.clampTime(e)},ModelAnimationCache.getAnimationSpline=function(e,t,i,r,n,a,o,s){var l,c,u=getAnimationSplineKey(e,t,r),d=cachedAnimationSplines[u];return defined(d)||(c=s,1===(l=a).length&&1===c.length?d=new ConstantSpline(c[0]):"LINEAR"!==n.interpolation&&"STEP"!==n.interpolation||("translation"===o||"scale"===o?d=new LinearSpline({times:l,points:c}):"rotation"===o?d=new QuaternionSpline({times:l,points:c}):"weights"===o&&(d=new WeightSpline({times:l,weights:c})),defined(d)&&"STEP"===n.interpolation&&(d=new SteppedSpline(d))),defined(e.cacheKey)&&(cachedAnimationSplines[u]=d)),d};var cachedSkinInverseBindMatrices={};ModelAnimationCache.getSkinInverseBindMatrices=function(e,t){var i=getAccessorKey(e,t);if(!defined(p=cachedSkinInverseBindMatrices[i])){var r=e.gltf,n=r.buffers,a=r.bufferViews[t.bufferView],o=n[a.buffer].extras._pipeline.source,s=t.componentType,l=t.type,c=t.count,u=getAccessorByteStride(r,t),d=a.byteOffset+t.byteOffset,h=numberOfComponentsForType(l),p=new Array(c);if(s===WebGLConstants$1.FLOAT&&l===AttributeType$1.MAT4)for(var m=0;m<c;++m){var f=ComponentDatatype$1.createArrayBufferView(s,o.buffer,o.byteOffset+d,h);p[m]=Matrix4.fromArray(f),d+=u}cachedSkinInverseBindMatrices[i]=p}return p};var ModelAnimationLoop={NONE:0,REPEAT:1,MIRRORED_REPEAT:2},ModelAnimationLoop$1=Object.freeze(ModelAnimationLoop),ModelAnimationState=Object.freeze({STOPPED:0,ANIMATING:1});function ModelAnimation(e,t,i){this._name=i.name,this._startTime=JulianDate.clone(e.startTime),this._delay=defaultValue(e.delay,0),this._stopTime=e.stopTime,this.removeOnStop=defaultValue(e.removeOnStop,!1),this._multiplier=defaultValue(e.multiplier,1),this._reverse=defaultValue(e.reverse,!1),this._loop=defaultValue(e.loop,ModelAnimationLoop$1.NONE),this.start=new Event,this.update=new Event,this.stop=new Event,this._state=ModelAnimationState.STOPPED,this._runtimeAnimation=i,this._computedStartTime=void 0,this._duration=void 0;var r=this;this._raiseStartEvent=function(){r.start.raiseEvent(t,r)},this._updateEventTime=0,this._raiseUpdateEvent=function(){r.update.raiseEvent(t,r,r._updateEventTime)},this._raiseStopEvent=function(){r.stop.raiseEvent(t,r)}}function ModelAnimationCollection(e){this.animationAdded=new Event,this.animationRemoved=new Event,this._model=e,this._scheduledAnimations=[],this._previousTime=void 0}function add(e,t,i){var r=e._model,n=new ModelAnimation(i,r,r._runtime.animations[t]);return e._scheduledAnimations.push(n),e.animationAdded.raiseEvent(r,n),n}function animateChannels(e,t){for(var i=e.channelEvaluators,r=i.length,n=0;n<r;++n)i[n](t)}Object.defineProperties(ModelAnimation.prototype,{name:{get:function(){return this._name}},startTime:{get:function(){return this._startTime}},delay:{get:function(){return this._delay}},stopTime:{get:function(){return this._stopTime}},multiplier:{get:function(){return this._multiplier}},reverse:{get:function(){return this._reverse}},loop:{get:function(){return this._loop}}}),Object.defineProperties(ModelAnimationCollection.prototype,{length:{get:function(){return this._scheduledAnimations.length}}}),ModelAnimationCollection.prototype.add=function(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t,i=this._model._runtime.animations;if(defined(e.index))return add(this,e.index,e);for(var r=i.length,n=0;n<r;++n)if(i[n].name===e.name){t=n;break}return add(this,t,e)},ModelAnimationCollection.prototype.addAll=function(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);for(var t=[],i=this._model._runtime.animations.length,r=0;r<i;++r)t.push(add(this,r,e));return t},ModelAnimationCollection.prototype.remove=function(e){if(defined(e)){var t=this._scheduledAnimations,i=t.indexOf(e);if(-1!==i)return t.splice(i,1),this.animationRemoved.raiseEvent(this._model,e),!0}return!1},ModelAnimationCollection.prototype.removeAll=function(){var e=this._model,t=this._scheduledAnimations,i=t.length;this._scheduledAnimations=[];for(var r=0;r<i;++r)this.animationRemoved.raiseEvent(e,t[r])},ModelAnimationCollection.prototype.contains=function(e){return!!defined(e)&&-1!==this._scheduledAnimations.indexOf(e)},ModelAnimationCollection.prototype.get=function(e){return this._scheduledAnimations[e]};var animationsToRemove=[];function createAnimationRemovedFunction(e,t,i){return function(){e.animationRemoved.raiseEvent(t,i)}}function ModelMaterial(e,t,i){this._name=t.name,this._id=i,this._uniformMap=e._uniformMaps[i],this._technique=void 0,this._program=void 0,this._values=void 0}function ModelMesh(e,t,i){for(var r=[],n=e.primitives,a=n.length,o=0;o<a;++o){var s=n[o];r[o]=t[s.material]}this._name=e.name,this._materials=r,this._id=i}function ModelNode(e,t,i,r,n){this._model=e,this._runtimeNode=i,this._name=t.name,this._id=r,this.useMatrix=!1,this._show=!0,this._matrix=Matrix4.clone(n),this._originalMatrix=Matrix4.clone(n)}ModelAnimationCollection.prototype.update=function(e){var t=this._scheduledAnimations,i=t.length;if(0===i)return this._previousTime=void 0,!1;if(JulianDate.equals(e.time,this._previousTime))return!1;this._previousTime=JulianDate.clone(e.time,this._previousTime);for(var r=!1,n=e.time,a=this._model,o=0;o<i;++o){var s=t[o],l=s._runtimeAnimation;defined(s._computedStartTime)||(s._computedStartTime=JulianDate.addSeconds(defaultValue(s.startTime,n),s.delay,new JulianDate)),defined(s._duration)||(s._duration=l.stopTime*(1/s.multiplier));var c=s._computedStartTime,u=s._duration,d=s.stopTime,h=0!==u?JulianDate.secondsDifference(n,c)/u:0;0!==u&&defined(d)&&JulianDate.greaterThan(n,d)&&(h=JulianDate.secondsDifference(d,c)/u);var p,m,f,g=0<=h,_=s.loop===ModelAnimationLoop$1.REPEAT||s.loop===ModelAnimationLoop$1.MIRRORED_REPEAT,y=(g||_&&!defined(s.startTime))&&(h<=1||_)&&(!defined(d)||JulianDate.lessThanOrEquals(n,d));!y&&s._state!==ModelAnimationState.ANIMATING||(y&&s._state===ModelAnimationState.STOPPED&&(s._state=ModelAnimationState.ANIMATING,0<s.start.numberOfListeners&&e.afterRender.push(s._raiseStartEvent)),s.loop===ModelAnimationLoop$1.REPEAT?h-=Math.floor(h):s.loop===ModelAnimationLoop$1.MIRRORED_REPEAT&&(m=h-(p=Math.floor(h)),h=p%2==1?1-m:m),s.reverse&&(h=1-h),f=h*u*s.multiplier,animateChannels(l,f=CesiumMath.clamp(f,l.startTime,l.stopTime)),0<s.update.numberOfListeners&&(s._updateEventTime=f,e.afterRender.push(s._raiseUpdateEvent)),r=!0,y||(s._state=ModelAnimationState.STOPPED,0<s.stop.numberOfListeners&&e.afterRender.push(s._raiseStopEvent),s.removeOnStop&&animationsToRemove.push(s)))}i=animationsToRemove.length;for(var v=0;v<i;++v){var C=animationsToRemove[v];t.splice(t.indexOf(C),1),e.afterRender.push(createAnimationRemovedFunction(this,a,C))}return animationsToRemove.length=0,r},Object.defineProperties(ModelMaterial.prototype,{name:{get:function(){return this._name}},id:{get:function(){return this._id}}}),ModelMaterial.prototype.setValue=function(e,t){var i="u_"+e,r=this._uniformMap.values[i];r.value=r.clone(t,r.value)},ModelMaterial.prototype.getValue=function(e){var t="u_"+e,i=this._uniformMap.values[t];if(defined(i))return i.value},Object.defineProperties(ModelMesh.prototype,{name:{get:function(){return this._name}},id:{get:function(){return this._id}},materials:{get:function(){return this._materials}}}),Object.defineProperties(ModelNode.prototype,{name:{get:function(){return this._name}},id:{get:function(){return this._id}},show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,this._model._perNodeShowDirty=!0)}},matrix:{get:function(){return this._matrix},set:function(e){this._matrix=Matrix4.clone(e,this._matrix),this.useMatrix=!0;var t=this._model;t._cesiumAnimationsDirty=!0,this._runtimeNode.dirtyNumber=t._maxDirtyNumber}},originalMatrix:{get:function(){return this._originalMatrix}}}),ModelNode.prototype.setMatrix=function(e){Matrix4.clone(e,this._matrix)};var MAX_GLTF_UINT16_INDEX=65534;function ModelOutlineLoader(){}function addOutline(e,t,i,r,n){var a,o=n.vertexCopies,s=n.extraVertices,l=n.outlineCoordinates,c=e.gltf,u=c.meshes[t].primitives[i],d=c.accessors,h=c.bufferViews;for(var p in u.attributes)if(u.attributes.hasOwnProperty(p)){var m=d[u.attributes[p]];if(defined(m)){a=m.count;break}}if(defined(a)){for(var f=d[u.indices],g=h[f.bufferView],_=d[r],y=h[_.bufferView],v=e._loadResources,C=v.getBuffer(g),S=v.getBuffer(y),T=new(5123===f.componentType?Uint16Array:Uint32Array)(C.buffer,C.byteOffset+f.byteOffset,f.count),x=new(5123===_.componentType?Uint16Array:Uint32Array)(S.buffer,S.byteOffset+_.byteOffset,_.count),b=a,E=[b],P=0;P<x.length;P+=2){var A=x[P],w=x[P+1];E[Math.min(A,w)*b+Math.max(A,w)]=1}for(P=0;P<T.length;P+=3)for(var D=T[P],M=T[P+1],I=T[P+2],R=isHighlighted(E,D,M),O=isHighlighted(E,M,I),L=isHighlighted(E,I,D),F=matchAndStoreCoordinates(l,D,M,I,R,O,L);0<=F;){var N=F===D?o[D]:F===M?o[M]:o[I];if(void 0===N){N=a+s.length;for(var B=F;a<=B;)B=s[B-a];s.push(B),o[F]=N}MAX_GLTF_UINT16_INDEX<N&&T instanceof Uint16Array&&(T=new Uint32Array(T),f.componentType=5125,g.buffer=c.buffers.push({byteLength:T.byteLength,extras:{_pipeline:{source:T.buffer}}})-1,g.byteLength=T.byteLength,g.byteOffset=0,e._loadResources.buffers[g.buffer]=new Uint8Array(T.buffer,0,T.byteLength),v.indexBuffersToCreate._array.forEach(function(e){e.id===f.bufferView&&(e.componentType=f.componentType)})),F===D?(D=N,T[P]=N):F===M?(M=N,T[P+1]=N):(I=N,T[P+2]=N),defined(f.max)&&(f.max[0]=Math.max(f.max[0],N)),F=matchAndStoreCoordinates(l,D,M,I,R,O,L)}}}function computeOrderMask(e,t,i,r,n){var a=3*t,o=e[a],s=e[1+a],l=e[2+a];return void 0===o?63:((o===i&&s===r&&l===n)<<0)+((o===i&&s===n&&l===r)<<1)+((o===r&&s===i&&l===n)<<2)+((o===r&&s===n&&l===i)<<3)+((o===n&&s===i&&l===r)<<4)+((o===n&&s===r&&l===i)<<5)}function popcount0to63(e){return(1&e)+(e>>1&1)+(e>>2&1)+(e>>3&1)+(e>>4&1)+(e>>5&1)}function matchAndStoreCoordinates(e,t,i,r,n,a,o){var s=o?1:0,l=n?1:0,c=computeOrderMask(e,t,s,l,0);if(0===c)return t;var u=n?1:0,d=a?1:0,h=computeOrderMask(e,i,0,u,d);if(0===h)return i;var p=o?1:0,m=a?1:0,f=computeOrderMask(e,r,p,0,m);if(0===f)return r;var g,_,y,v=c&h&f;if(1&v)g=0,_=1,y=2;else if(2&v)g=0,y=1,_=2;else if(4&v)_=0,g=1,y=2;else if(8&v)_=0,y=1,g=2;else if(16&v)y=0,g=1,_=2;else{if(!(32&v)){var C=popcount0to63(c),S=popcount0to63(h),T=popcount0to63(f);return C<S&&C<T?t:S<T?i:r}y=0,_=1,g=2}var x=3*t;e[x+g]=s,e[x+_]=l,e[x+y]=0;var b=3*i;e[b+g]=0,e[b+_]=u,e[b+y]=d;var E=3*r;return e[E+g]=p,e[E+_]=0,e[E+y]=m,-1}function isHighlighted(e,t,i){var r=e[0];return 1===e[Math.min(t,i)*r+Math.max(t,i)]}function createTexture$2(e){var t=new Uint8Array(e);return t[e-1]=192,8===e?t[e-1]=96:4===e?t[e-1]=48:2===e?t[e-1]=24:1===e&&(t[e-1]=12),t}function updateBufferViewsWithNewVertices(e,t){for(var i=e.gltf,r=e._loadResources,n=0;n<t.length;++n){var a=t[n],o=a.extras._pipeline.vertexNumberingScope;a.extras._pipeline.vertexNumberingScope=void 0;var s=o.extraVertices,l=r.getBuffer(a),c=a.byteStride||4,u=s.length,d=new Uint8Array(l.byteLength+u*c);for(d.set(l),b=0;b<u;++b)for(var h=s[b]*c,p=l.length+b*c,m=0;m<c;++m)d[p+m]=d[h+m];a.byteOffset=0,a.byteLength=d.byteLength;var f=i.buffers.push({byteLength:d.byteLength,extras:{_pipeline:{source:d.buffer}}})-1;a.buffer=f,r.buffers[f]=d;var g=o.accessors;for(b=0;b<g.length;++b){var _=g[b];i.accessors[_].count+=u}if(!o.createdOutlines){var y=o.outlineCoordinates,v=new Float32Array(y),C=e.gltf.buffers.push({byteLength:v.byteLength,extras:{_pipeline:{source:v.buffer}}})-1;r.buffers[C]=new Uint8Array(v.buffer,0,v.byteLength);for(var S=e.gltf.bufferViews.push({buffer:C,byteLength:v.byteLength,byteOffset:0,byteStride:3*Float32Array.BYTES_PER_ELEMENT,target:34962})-1,T=e.gltf.accessors.push({bufferView:S,byteOffset:0,componentType:5126,count:v.length/3,type:"VEC3",min:[0,0,0],max:[1,1,1]})-1,x=o.primitives,b=0;b<x.length;++b)x[b].attributes._OUTLINE_COORDINATES=T;r.vertexBuffersToCreate.enqueue(S),o.createdOutlines=!0}}}function compactBuffers(e){for(var t=e.gltf,i=e._loadResources,r=0;r<t.buffers.length;++r){var n=t.buffers[r],a=t.bufferViews.filter(usesBuffer.bind(void 0,r)),o=a.reduce(function(e,t){return e+t.byteLength},0);if(o!==n.byteLength){for(var s=new Uint8Array(o),l=0,c=0;c<a.length;++c){var u=a[c],d=i.getBuffer(u);s.set(d,l),u.byteOffset=l,l+=d.byteLength}i.buffers[r]=s,n.extras._pipeline.source=s.buffer,n.byteLength=o}}}function usesBuffer(e,t){return t.buffer===e}function getVertexNumberingScope(e,t){var i=t.attributes;if(void 0!==i){var r,n=e.gltf;for(var a in i)if(i.hasOwnProperty(a)){var o=i[a],s=n.accessors[o].bufferView,l=n.bufferViews[s];if(defined(l.extras)||(l.extras={}),defined(l.extras._pipeline)||(l.extras._pipeline={}),defined(l.extras._pipeline.vertexNumberingScope)){if(void 0!==r&&l.extras._pipeline.vertexNumberingScope!==r)return}else l.extras._pipeline.vertexNumberingScope=r||{vertexCopies:[],extraVertices:[],outlineCoordinates:[],accessors:[],bufferViews:[],primitives:[],createdOutlines:!1};(r=l.extras._pipeline.vertexNumberingScope).bufferViews.indexOf(l)<0&&r.bufferViews.push(l),r.accessors.indexOf(o)<0&&r.accessors.push(o)}return r.primitives.push(t),r}}function ComputeCommand(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.vertexArray=e.vertexArray,this.fragmentShaderSource=e.fragmentShaderSource,this.shaderProgram=e.shaderProgram,this.uniformMap=e.uniformMap,this.outputTexture=e.outputTexture,this.preExecute=e.preExecute,this.postExecute=e.postExecute,this.persists=defaultValue(e.persists,!1),this.pass=Pass$1.COMPUTE,this.owner=e.owner}ModelOutlineLoader.hasExtension=function(e){return defined(e.extensionsRequired.CESIUM_primitive_outline)||defined(e.extensionsUsed.CESIUM_primitive_outline)},ModelOutlineLoader.outlinePrimitives=function(a){if(ModelOutlineLoader.hasExtension(a)){var e=a.gltf,o=[];ForEach.mesh(e,function(e,n){ForEach.meshPrimitive(e,function(e,t){var i,r;defined(e.extensions)&&(!defined(i=e.extensions.CESIUM_primitive_outline)||void 0!==(r=getVertexNumberingScope(a,e))&&(o.indexOf(r)<0&&o.push(r),addOutline(a,n,t,i.indices,r)))})});for(var t=0;t<o.length;++t)updateBufferViewsWithNewVertices(a,o[t].bufferViews);compactBuffers(a)}},ModelOutlineLoader.createTexture=function(e,t){var i=t.cache.modelOutliningCache;if(defined(i)||(i=t.cache.modelOutliningCache={}),defined(i.outlineTexture))return i.outlineTexture;for(var r=Math.min(4096,ContextLimits.maximumTextureSize),n=r,a=createTexture$2(n),o=[];1<n;)n>>=1,o.push(createTexture$2(n));var s=new Texture({context:t,source:{arrayBufferView:a,mipLevels:o},width:r,height:1,pixelFormat:PixelFormat$1.LUMINANCE,sampler:new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR,magnificationFilter:TextureMagnificationFilter$1.LINEAR})});return i.outlineTexture=s},ComputeCommand.prototype.execute=function(e){e.execute(this)};var OctahedralProjectionAtlasFS="varying vec2 v_textureCoordinates;\nuniform float originalSize;\nuniform sampler2D texture0;\nuniform sampler2D texture1;\nuniform sampler2D texture2;\nuniform sampler2D texture3;\nuniform sampler2D texture4;\nuniform sampler2D texture5;\nconst float yMipLevel1 = 1.0 - (1.0 / pow(2.0, 1.0));\nconst float yMipLevel2 = 1.0 - (1.0 / pow(2.0, 2.0));\nconst float yMipLevel3 = 1.0 - (1.0 / pow(2.0, 3.0));\nconst float yMipLevel4 = 1.0 - (1.0 / pow(2.0, 4.0));\nvoid main()\n{\nvec2 uv = v_textureCoordinates;\nvec2 textureSize = vec2(originalSize * 1.5 + 2.0, originalSize);\nvec2 pixel = 1.0 / textureSize;\nfloat mipLevel = 0.0;\nif (uv.x - pixel.x > (textureSize.y / textureSize.x))\n{\nmipLevel = 1.0;\nif (uv.y - pixel.y > yMipLevel1)\n{\nmipLevel = 2.0;\nif (uv.y - pixel.y * 3.0 > yMipLevel2)\n{\nmipLevel = 3.0;\nif (uv.y - pixel.y * 5.0 > yMipLevel3)\n{\nmipLevel = 4.0;\nif (uv.y - pixel.y * 7.0 > yMipLevel4)\n{\nmipLevel = 5.0;\n}\n}\n}\n}\n}\nif (mipLevel > 0.0)\n{\nfloat scale = pow(2.0, mipLevel);\nuv.y -= (pixel.y * (mipLevel - 1.0) * 2.0);\nuv.x *= ((textureSize.x - 2.0) / textureSize.y);\nuv.x -= 1.0 + pixel.x;\nuv.y -= (1.0 - (1.0 / pow(2.0, mipLevel - 1.0)));\nuv *= scale;\n}\nelse\n{\nuv.x *= (textureSize.x / textureSize.y);\n}\nif(mipLevel == 0.0)\n{\ngl_FragColor = texture2D(texture0, uv);\n}\nelse if(mipLevel == 1.0)\n{\ngl_FragColor = texture2D(texture1, uv);\n}\nelse if(mipLevel == 2.0)\n{\ngl_FragColor = texture2D(texture2, uv);\n}\nelse if(mipLevel == 3.0)\n{\ngl_FragColor = texture2D(texture3, uv);\n}\nelse if(mipLevel == 4.0)\n{\ngl_FragColor = texture2D(texture4, uv);\n}\nelse if(mipLevel == 5.0)\n{\ngl_FragColor = texture2D(texture5, uv);\n}\nelse\n{\ngl_FragColor = vec4(0.0);\n}\n}\n",OctahedralProjectionFS="varying vec3 v_cubeMapCoordinates;\nuniform samplerCube cubeMap;\nvoid main()\n{\nvec4 rgbm = textureCube(cubeMap, v_cubeMapCoordinates);\nfloat m = rgbm.a * 16.0;\nvec3 r = rgbm.rgb * m;\ngl_FragColor = vec4(r * r, 1.0);\n}\n",OctahedralProjectionVS="attribute vec4 position;\nattribute vec3 cubeMapCoordinates;\nvarying vec3 v_cubeMapCoordinates;\nvoid main()\n{\ngl_Position = position;\nv_cubeMapCoordinates = cubeMapCoordinates;\n}\n";function OctahedralProjectedCubeMap(e){this._url=e,this._cubeMapBuffers=void 0,this._cubeMaps=void 0,this._texture=void 0,this._mipTextures=void 0,this._va=void 0,this._sp=void 0,this._maximumMipmapLevel=void 0,this._loading=!1,this._ready=!1,this._readyPromise=when.defer()}Object.defineProperties(OctahedralProjectedCubeMap.prototype,{url:{get:function(){return this._url}},texture:{get:function(){return this._texture}},maximumMipmapLevel:{get:function(){return this._maximumMipmapLevel}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}}}),OctahedralProjectedCubeMap.isSupported=function(e){return e.colorBufferHalfFloat&&e.halfFloatingPointTexture||e.floatingPointTexture&&e.colorBufferFloat};for(var v1$1=new Cartesian3(1,0,0),v2$1=new Cartesian3(0,0,1),v3=new Cartesian3(-1,0,0),v4=new Cartesian3(0,0,-1),v5=new Cartesian3(0,1,0),v6=new Cartesian3(0,-1,0),cubeMapCoordinates=[v5,v3,v2$1,v6,v1$1,v5,v4,v5,v5],length$1=cubeMapCoordinates.length,flatCubeMapCoordinates=new Float32Array(3*length$1),offset=0,i$2=0;i$2<length$1;++i$2,offset+=3)Cartesian3.pack(cubeMapCoordinates[i$2],flatCubeMapCoordinates,offset);var flatPositions=new Float32Array([-1,1,-1,0,0,1,0,0,1,0,1,1,0,-1,-1,-1,1,-1]),indices=new Uint16Array([0,1,2,2,3,1,7,6,1,3,6,1,2,5,4,3,4,2,4,8,6,3,4,6]);function createVertexArray$3(e){var t=Buffer$1.createVertexBuffer({context:e,typedArray:flatPositions,usage:BufferUsage$1.STATIC_DRAW}),i=Buffer$1.createVertexBuffer({context:e,typedArray:flatCubeMapCoordinates,usage:BufferUsage$1.STATIC_DRAW}),r=Buffer$1.createIndexBuffer({context:e,typedArray:indices,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT});return new VertexArray({context:e,attributes:[{index:0,vertexBuffer:t,componentsPerAttribute:2,componentDatatype:ComponentDatatype$1.FLOAT},{index:1,vertexBuffer:i,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT}],indexBuffer:r})}function createUniformTexture(e){return function(){return e}}function cleanupResources(e){var t,i;e._va=e._va&&e._va.destroy(),e._sp=e._sp&&e._sp.destroy();var r=e._cubeMaps;if(defined(r))for(i=r.length,t=0;t<i;++t)r[t].destroy();var n=e._mipTextures;if(defined(n))for(i=n.length,t=0;t<i;++t)n[t].destroy();e._va=void 0,e._sp=void 0,e._cubeMaps=void 0,e._cubeMapBuffers=void 0,e._mipTextures=void 0}OctahedralProjectedCubeMap.prototype.update=function(e){var t=e.context;if(OctahedralProjectedCubeMap.isSupported(t)&&(defined(this._texture)&&defined(this._va)&&cleanupResources(this),!defined(this._texture))){if(!defined(this._texture)&&!this._loading){var i=t.textureCache.getTexture(this._url);if(defined(i))return cleanupResources(this),this._texture=i,this._maximumMipmapLevel=this._texture.maximumMipmapLevel,this._ready=!0,void this._readyPromise.resolve()}var r,n=this._cubeMapBuffers;if(defined(n)||this._loading||(loadKTX((r=this)._url).then(function(e){r._cubeMapBuffers=e,r._loading=!1}).otherwise(this._readyPromise.reject),this._loading=!0),defined(this._cubeMapBuffers)){this._va=createVertexArray$3(t),this._sp=ShaderProgram.fromCache({context:t,vertexShaderSource:OctahedralProjectionVS,fragmentShaderSource:OctahedralProjectionFS,attributeLocations:{position:0,cubeMapCoordinates:1}});var a=Math.min(n.length,6);this._maximumMipmapLevel=a-1;for(var o=this._cubeMaps=new Array(a),s=this._mipTextures=new Array(a),l=2*n[0].positiveX.width,c={originalSize:function(){return l}},u=t.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT,d=PixelFormat$1.RGBA,h=0;h<a;++h){var p=n[h].positiveY;n[h].positiveY=n[h].negativeY,n[h].negativeY=p;var m=o[h]=new CubeMap({context:t,source:n[h]}),f=2*o[h].width,g=s[h]=new Texture({context:t,width:f,height:f,pixelDatatype:u,pixelFormat:d}),_=new ComputeCommand({vertexArray:this._va,shaderProgram:this._sp,uniformMap:{cubeMap:createUniformTexture(m)},outputTexture:g,persists:!0,owner:this});e.commandList.push(_),c["texture"+h]=createUniformTexture(g)}this._texture=new Texture({context:t,width:1.5*l+2,height:l,pixelDatatype:u,pixelFormat:d}),this._texture.maximumMipmapLevel=this._maximumMipmapLevel,t.textureCache.addTexture(this._url,this._texture);var y=new ComputeCommand({fragmentShaderSource:OctahedralProjectionAtlasFS,uniformMap:c,outputTexture:this._texture,persists:!1,owner:this});e.commandList.push(y),this._ready=!0,this._readyPromise.resolve()}}},OctahedralProjectedCubeMap.prototype.isDestroyed=function(){return!1},OctahedralProjectedCubeMap.prototype.destroy=function(){return cleanupResources(this),this._texture=this._texture&&this._texture.destroy(),destroyObject(this)};var boundingSphereCartesian3Scratch$1=new Cartesian3,ModelState$1=ModelUtility.ModelState,defaultModelAccept="model/gltf-binary,model/gltf+json;q=0.8,application/json;q=0.2,*/*;q=0.01",articulationEpsilon=CesiumMath.EPSILON16;function setCachedGltf(e,t){e._cachedGltf=t}function CachedGltf(e){this._gltf=e.gltf,this.ready=e.ready,this.modelsToLoad=[],this.count=0}Object.defineProperties(CachedGltf.prototype,{gltf:{set:function(e){this._gltf=e},get:function(){return this._gltf}}}),CachedGltf.prototype.makeReady=function(e){this.gltf=e;for(var t=this.modelsToLoad,i=t.length,r=0;r<i;++r){var n=t[r];n.isDestroyed()||setCachedGltf(n,this)}this.modelsToLoad=void 0,this.ready=!0};var gltfCache={},uriToGuid={};function Model(e){var t,i,r=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).cacheKey;this._cacheKey=r,this._cachedGltf=void 0,this._releaseGltfJson=defaultValue(e.releaseGltfJson,!1),defined(r)&&defined(gltfCache[r])&&gltfCache[r].ready?++(i=gltfCache[r]).count:defined(t=e.gltf)&&(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(i=t instanceof Uint8Array?new CachedGltf({gltf:parseGlb(t),ready:!0}):new CachedGltf({gltf:e.gltf,ready:!0})).count=1,defined(r)&&(gltfCache[r]=i)),setCachedGltf(this,i);var n=defaultValue(e.basePath,"");this._resource=Resource.createIfNeeded(n);var a=e.credit;"string"==typeof a&&(a=new Credit(a)),this._credit=a,this._resourceCredits=[],this.show=defaultValue(e.show,!0),this.silhouetteColor=defaultValue(e.silhouetteColor,Color.RED),this._silhouetteColor=new Color,this._silhouetteColorPreviousAlpha=1,this._normalAttributeName=void 0,this.silhouetteSize=defaultValue(e.silhouetteSize,0),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=Matrix4.clone(this.modelMatrix),this._clampedModelMatrix=void 0,this.scale=defaultValue(e.scale,1),this._scale=this.scale,this.minimumPixelSize=defaultValue(e.minimumPixelSize,0),this._minimumPixelSize=this.minimumPixelSize,this.maximumScale=e.maximumScale,this._maximumScale=this.maximumScale,this.id=e.id,this._id=e.id,this.heightReference=defaultValue(e.heightReference,HeightReference$1.NONE),this._heightReference=this.heightReference,this._heightChanged=!1,this._removeUpdateHeightCallback=void 0;var o=e.scene;defined(this._scene=o)&&defined(o.terrainProviderChanged)&&(this._terrainProviderChangedCallback=o.terrainProviderChanged.addEventListener(function(){this._heightChanged=!0},this)),this._pickObject=e.pickObject,this._allowPicking=defaultValue(e.allowPicking,!0),this._ready=!1,this._readyPromise=when.defer(),this.activeAnimations=new ModelAnimationCollection(this),this.clampAnimations=defaultValue(e.clampAnimations,!0),this._defaultTexture=void 0,this._incrementallyLoadTextures=defaultValue(e.incrementallyLoadTextures,!0),this._asynchronous=defaultValue(e.asynchronous,!0),this.shadows=defaultValue(e.shadows,ShadowMode$1.ENABLED),this._shadows=this.shadows,this.color=Color.clone(defaultValue(e.color,Color.WHITE)),this._colorPreviousAlpha=1,this.colorBlendMode=defaultValue(e.colorBlendMode,ColorBlendMode$1.HIGHLIGHT),this.colorBlendAmount=defaultValue(e.colorBlendAmount,.5),this._colorShadingEnabled=!1,this._clippingPlanes=void 0,this.clippingPlanes=e.clippingPlanes,this._clippingPlanesState=0,this.clippingPlanesOriginMatrix=void 0,this.backFaceCulling=defaultValue(e.backFaceCulling,!0),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this._debugShowBoundingVolume=!1,this.debugWireframe=defaultValue(e.debugWireframe,!1),this._debugWireframe=!1,this._distanceDisplayCondition=e.distanceDisplayCondition,this._addBatchIdToGeneratedShaders=e.addBatchIdToGeneratedShaders,this._precreatedAttributes=e.precreatedAttributes,this._vertexShaderLoaded=e.vertexShaderLoaded,this._fragmentShaderLoaded=e.fragmentShaderLoaded,this._uniformMapLoaded=e.uniformMapLoaded,this._pickIdLoaded=e.pickIdLoaded,this._ignoreCommands=defaultValue(e.ignoreCommands,!1),this._requestType=e.requestType,this._upAxis=defaultValue(e.upAxis,Axis$1.Y),this._gltfForwardAxis=Axis$1.Z,this._forwardAxis=e.forwardAxis,this.cull=defaultValue(e.cull,!0),this.opaquePass=defaultValue(e.opaquePass,Pass$1.OPAQUE),this._computedModelMatrix=new Matrix4,this._clippingPlaneModelViewMatrix=Matrix4.clone(Matrix4.IDENTITY),this._initialRadius=void 0,this._boundingSphere=void 0,this._scaledBoundingSphere=new BoundingSphere,this._state=ModelState$1.NEEDS_LOAD,this._loadResources=void 0,this._mode=void 0,this._perNodeShowDirty=!1,this._cesiumAnimationsDirty=!1,this._dirty=!1,this._maxDirtyNumber=0,this._runtime={animations:void 0,articulationsByName:void 0,articulationsByStageKey:void 0,stagesByKey:void 0,rootNodes:void 0,nodes:void 0,nodesByName:void 0,skinnedNodes:void 0,meshesByName:void 0,materialsByName:void 0,materialsById:void 0},this._uniformMaps={},this._extensionsUsed=void 0,this._extensionsRequired=void 0,this._quantizedUniforms={},this._programPrimitives={},this._rendererResources={buffers:{},vertexArrays:{},programs:{},sourceShaders:{},silhouettePrograms:{},textures:{},samplers:{},renderStates:{}},this._cachedRendererResources=void 0,this._loadRendererResourcesFromCache=!1,this._dequantizeInShader=defaultValue(e.dequantizeInShader,!0),this._decodedData={},this._cachedGeometryByteLength=0,this._cachedTexturesByteLength=0,this._geometryByteLength=0,this._texturesByteLength=0,this._trianglesLength=0,this._sourceTechniques={},this._sourcePrograms={},this._quantizedVertexShaders={},this._nodeCommands=[],this._pickIds=[],this._rtcCenter=void 0,this._rtcCenterEye=void 0,this._rtcCenter3D=void 0,this._rtcCenter2D=void 0,this._sourceVersion=void 0,this._sourceKHRTechniquesWebGL=void 0,this._imageBasedLightingFactor=new Cartesian2(1,1),Cartesian2.clone(e.imageBasedLightingFactor,this._imageBasedLightingFactor),this._lightColor=Cartesian3.clone(e.lightColor),this._luminanceAtZenith=void 0,this.luminanceAtZenith=defaultValue(e.luminanceAtZenith,.2),this._sphericalHarmonicCoefficients=e.sphericalHarmonicCoefficients,this._specularEnvironmentMaps=e.specularEnvironmentMaps,this._shouldUpdateSpecularMapAtlas=!0,this._specularEnvironmentMapAtlas=void 0,this._useDefaultSphericalHarmonics=!1,this._useDefaultSpecularMaps=!1,this._shouldRegenerateShaders=!1}function silhouetteSupported(e){return e.stencilBuffer}function isColorShadingEnabled(e){return!Color.equals(e.color,Color.WHITE)||e.colorBlendMode!==ColorBlendMode$1.HIGHLIGHT}function isClippingEnabled(e){var t=e._clippingPlanes;return defined(t)&&t.enabled&&0!==t.length}function containsGltfMagic(e){return"glTF"===getMagic(e)}function getRuntime(e,t,i){return e._runtime[t][i]}Object.defineProperties(Model.prototype,{gltf:{get:function(){return defined(this._cachedGltf)?this._cachedGltf.gltf:void 0}},releaseGltfJson:{get:function(){return this._releaseGltfJson}},cacheKey:{get:function(){return this._cacheKey}},basePath:{get:function(){return this._resource.url}},boundingSphere:{get:function(){var e=this.modelMatrix;this.heightReference!==HeightReference$1.NONE&&this._clampedModelMatrix&&(e=this._clampedModelMatrix);var t=Matrix4.getScale(e,boundingSphereCartesian3Scratch$1),i=defined(this.maximumScale)?Math.min(this.maximumScale,this.scale):this.scale;Cartesian3.multiplyByScalar(t,i,t);var r=this._scaledBoundingSphere;return r.center=Cartesian3.multiplyComponents(this._boundingSphere.center,t,r.center),r.radius=Cartesian3.maximumComponent(t)*this._initialRadius,defined(this._rtcCenter)&&Cartesian3.add(this._rtcCenter,r.center,r.center),r}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},asynchronous:{get:function(){return this._asynchronous}},allowPicking:{get:function(){return this._allowPicking}},incrementallyLoadTextures:{get:function(){return this._incrementallyLoadTextures}},pendingTextureLoads:{get:function(){return defined(this._loadResources)?this._loadResources.pendingTextureLoads:0}},dirty:{get:function(){return this._dirty}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){this._distanceDisplayCondition=DistanceDisplayCondition.clone(e,this._distanceDisplayCondition)}},extensionsUsed:{get:function(){return defined(this._extensionsUsed)||(this._extensionsUsed=ModelUtility.getUsedExtensions(this.gltf)),this._extensionsUsed}},extensionsRequired:{get:function(){return defined(this._extensionsRequired)||(this._extensionsRequired=ModelUtility.getRequiredExtensions(this.gltf)),this._extensionsRequired}},upAxis:{get:function(){return this._upAxis}},forwardAxis:{get:function(){return defined(this._forwardAxis)?this._forwardAxis:this._gltfForwardAxis}},trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},texturesByteLength:{get:function(){return this._texturesByteLength}},cachedGeometryByteLength:{get:function(){return this._cachedGeometryByteLength}},cachedTexturesByteLength:{get:function(){return this._cachedTexturesByteLength}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){e!==this._clippingPlanes&&ClippingPlaneCollection.setOwner(e,this,"_clippingPlanes")}},pickIds:{get:function(){return this._pickIds}},imageBasedLightingFactor:{get:function(){return this._imageBasedLightingFactor},set:function(e){var t=this._imageBasedLightingFactor;e===t||Cartesian2.equals(e,t)||(this._shouldRegenerateShaders=this._shouldRegenerateShaders||0<this._imageBasedLightingFactor.x&&0===e.x||0===this._imageBasedLightingFactor.x&&0<e.x,this._shouldRegenerateShaders=this._shouldRegenerateShaders||0<this._imageBasedLightingFactor.y&&0===e.y||0===this._imageBasedLightingFactor.y&&0<e.y,Cartesian2.clone(e,this._imageBasedLightingFactor))}},lightColor:{get:function(){return this._lightColor},set:function(e){var t=this._lightColor;e===t||Cartesian3.equals(e,t)||(this._shouldRegenerateShaders=this._shouldRegenerateShaders||defined(t)&&!defined(e)||defined(e)&&!defined(t),this._lightColor=Cartesian3.clone(e,t))}},luminanceAtZenith:{get:function(){return this._luminanceAtZenith},set:function(e){var t=this._luminanceAtZenith;e!==t&&(this._shouldRegenerateShaders=this._shouldRegenerateShaders||defined(t)&&!defined(e)||defined(e)&&!defined(t),this._luminanceAtZenith=e)}},sphericalHarmonicCoefficients:{get:function(){return this._sphericalHarmonicCoefficients},set:function(e){e!==this._sphericalHarmonicCoefficients&&(this._sphericalHarmonicCoefficients=e,this._shouldRegenerateShaders=!0)}},specularEnvironmentMaps:{get:function(){return this._specularEnvironmentMaps},set:function(e){this._shouldUpdateSpecularMapAtlas=this._shouldUpdateSpecularMapAtlas||e!==this._specularEnvironmentMaps,this._specularEnvironmentMaps=e}},credit:{get:function(){return this._credit}}}),Model.silhouetteSupported=function(e){return silhouetteSupported(e.context)},Model.fromGltf=function(e){var t=e.url;e=clone(e);var l=Resource.createIfNeeded(t),i=defaultValue(e.basePath,l.clone()),r=Resource.createIfNeeded(i),n=defaultValue(e.cacheKey,uriToGuid[getAbsoluteUri(l.url)]);defined(n)||(n=createGuid(),uriToGuid[getAbsoluteUri(l.url)]=n),defined(e.basePath)&&!defined(e.cacheKey)&&(n+=r.url),e.cacheKey=n,e.basePath=r;var c=new Model(e),u=gltfCache[n];return defined(u)?u.ready||(++u.count,u.modelsToLoad.push(c)):((u=new CachedGltf({ready:!1})).count=1,u.modelsToLoad.push(c),setCachedGltf(c,u),gltfCache[n]=u,defined(l.headers.Accept)||(l.headers.Accept=defaultModelAccept),l.fetchArrayBuffer().then(function(e){var t,i,r=new Uint8Array(e);containsGltfMagic(r)?(t=parseGlb(r),u.makeReady(t)):(i=getStringFromTypedArray(r),u.makeReady(JSON.parse(i)));var n=c._resourceCredits,a=l.credits;if(defined(a))for(var o=a.length,s=0;s<o;s++)n.push(a[s])}).otherwise(ModelUtility.getFailedLoadFunction(c,"model",l.url))),c},Model._gltfCache=gltfCache,Model.prototype.getNode=function(e){var t=getRuntime(this,"nodesByName",e);return defined(t)?t.publicNode:void 0},Model.prototype.getMesh=function(e){return getRuntime(this,"meshesByName",e)},Model.prototype.getMaterial=function(e){return getRuntime(this,"materialsByName",e)},Model.prototype.setArticulationStage=function(e,t){var i=getRuntime(this,"stagesByKey",e),r=getRuntime(this,"articulationsByStageKey",e);defined(i)&&defined(r)&&(t=CesiumMath.clamp(t,i.minimumValue,i.maximumValue),CesiumMath.equalsEpsilon(i.currentValue,t,articulationEpsilon)||(i.currentValue=t,r.isDirty=!0))};var scratchArticulationCartesian=new Cartesian3,scratchArticulationRotation=new Matrix3;function applyArticulationStageMatrix(e,t){var i,r=e.currentValue,n=scratchArticulationCartesian;switch(e.type){case"xRotate":i=Matrix3.fromRotationX(CesiumMath.toRadians(r),scratchArticulationRotation),Matrix4.multiplyByMatrix3(t,i,t);break;case"yRotate":i=Matrix3.fromRotationY(CesiumMath.toRadians(r),scratchArticulationRotation),Matrix4.multiplyByMatrix3(t,i,t);break;case"zRotate":i=Matrix3.fromRotationZ(CesiumMath.toRadians(r),scratchArticulationRotation),Matrix4.multiplyByMatrix3(t,i,t);break;case"xTranslate":n.x=r,n.y=0,n.z=0,Matrix4.multiplyByTranslation(t,n,t);break;case"yTranslate":n.x=0,n.y=r,n.z=0,Matrix4.multiplyByTranslation(t,n,t);break;case"zTranslate":n.x=0,n.y=0,n.z=r,Matrix4.multiplyByTranslation(t,n,t);break;case"xScale":n.x=r,n.y=1,n.z=1,Matrix4.multiplyByScale(t,n,t);break;case"yScale":n.x=1,n.y=r,n.z=1,Matrix4.multiplyByScale(t,n,t);break;case"zScale":n.x=1,n.y=1,n.z=r,Matrix4.multiplyByScale(t,n,t);break;case"uniformScale":Matrix4.multiplyByUniformScale(t,r,t)}return t}var scratchApplyArticulationTransform=new Matrix4;function addBuffersToLoadResources$1(e){var t=e.gltf,i=e._loadResources;ForEach.buffer(t,function(e,t){i.buffers[t]=e.extras._pipeline.source})}function bufferLoad(r,n){return function(e){var t=r._loadResources,i=new Uint8Array(e);--t.pendingBufferLoads,r.gltf.buffers[n].extras._pipeline.source=i}}function parseBufferViews$1(e){var i=e.gltf.bufferViews,r=e._loadResources.vertexBuffersToCreate;ForEach.bufferView(e.gltf,function(e,t){e.target===WebGLConstants$1.ARRAY_BUFFER&&r.enqueue(t)});var n=e._loadResources.indexBuffersToCreate,a={};ForEach.accessor(e.gltf,function(e){var t=e.bufferView;defined(t)&&(i[t].target!==WebGLConstants$1.ELEMENT_ARRAY_BUFFER||defined(a[t])||(a[t]=!0,n.enqueue({id:t,componentType:e.componentType})))})}function parseTechniques(e){var r,n,a,t=e.gltf;hasExtension(t,"KHR_techniques_webgl")&&(r=e._sourcePrograms,n=e._sourceTechniques,a=t.extensions.KHR_techniques_webgl.programs,ForEach.technique(t,function(e,t){n[t]=clone(e);var i=e.program;defined(r[i])||(r[i]=clone(a[i]))}))}function shaderLoad(i,r,n){return function(e){var t=i._loadResources;t.shaders[n]={source:e,type:r,bufferView:void 0},--t.pendingShaderLoads,i._rendererResources.sourceShaders[n]=e}}function parseShaders(s){var e=s.gltf,l=e.buffers,c=e.bufferViews,u=s._rendererResources.sourceShaders;ForEach.shader(e,function(e,t){var i,r,n,a,o;defined(e.bufferView)?(i=e.bufferView,n=(r=c[i]).buffer,a=getStringFromTypedArray(l[n].extras._pipeline.source,r.byteOffset,r.byteLength),u[t]=a):defined(e.extras._pipeline.source)?u[t]=e.extras._pipeline.source:(++s._loadResources.pendingShaderLoads,(o=s._resource.getDerivedResource({url:e.uri})).fetchText().then(shaderLoad(s,e.type,t)).otherwise(ModelUtility.getFailedLoadFunction(s,"shader",o.url)))})}function parsePrograms(e){var t,i=e._sourceTechniques;for(var r in i){i.hasOwnProperty(r)&&(t=i[r],e._loadResources.programsToCreate.enqueue({programId:t.program,techniqueId:r}))}}function parseArticulations(e){var t={},i={},r={};e._runtime.articulationsByName=t,e._runtime.articulationsByStageKey=i,e._runtime.stagesByKey=r;var n=e.gltf;if(hasExtension(n,"AGI_articulations")&&defined(n.extensions)&&defined(n.extensions.AGI_articulations)){var a=n.extensions.AGI_articulations.articulations;if(defined(a))for(var o=a.length,s=0;s<o;++s){var l=clone(a[s]);l.nodes=[],l.isDirty=!0;for(var c=(t[l.name]=l).stages.length,u=0;u<c;++u){var d=l.stages[u];d.currentValue=d.initialValue;var h=l.name+" "+d.name;i[h]=l,r[h]=d}}}}function imageLoad(i,r){return function(e){var t=i._loadResources;--t.pendingTextureLoads,t.texturesToCreate.enqueue({id:r,image:e,bufferView:e.bufferView,width:e.width,height:e.height,internalFormat:e.internalFormat})}}Model.prototype.applyArticulations=function(){var e=this._runtime.articulationsByName;for(var t in e)if(e.hasOwnProperty(t)){var i=e[t];if(i.isDirty){i.isDirty=!1;for(var r=i.nodes.length,n=0;n<r;++n){for(var a=i.nodes[n],o=Matrix4.clone(a.originalMatrix,scratchApplyArticulationTransform),s=i.stages.length,l=0;l<s;++l)o=applyArticulationStageMatrix(i.stages[l],o);a.matrix=o}}}};var ktxRegex$1=/(^data:image\/ktx)|(\.ktx$)/i,crnRegex$1=/(^data:image\/crn)|(\.crn$)/i;function parseTextures(h,p,m){var f,e=h.gltf,g=e.images;ForEach.texture(e,function(e,t){var i=e.source;defined(e.extensions)&&defined(e.extensions.EXT_texture_webp)&&m&&(i=e.extensions.EXT_texture_webp.source);var r,n,a,o,s,l=g[i],c=l.extras,u=l.bufferView,d=l.mimeType;f=l.uri,defined(c)&&defined(c.compressedImage3DTiles)&&(r=c.compressedImage3DTiles.crunch,n=c.compressedImage3DTiles.s3tc,a=c.compressedImage3DTiles.pvrtc1,o=c.compressedImage3DTiles.etc1,p.s3tc&&defined(r)?(d=r.mimeType,defined(r.bufferView)?u=r.bufferView:f=r.uri):p.s3tc&&defined(n)?(d=n.mimeType,defined(n.bufferView)?u=n.bufferView:f=n.uri):p.pvrtc&&defined(a)?(d=a.mimeType,defined(a.bufferView)?u=a.bufferView:f=a.uri):p.etc1&&defined(o)&&(d=o.mimeType,defined(o.bufferView)?u=o.bufferView:f=o.uri)),defined(u)?h._loadResources.texturesToCreateFromBufferView.enqueue({id:t,image:void 0,bufferView:u,mimeType:d}):(++h._loadResources.pendingTextureLoads,s=h._resource.getDerivedResource({url:f}),(ktxRegex$1.test(f)?loadKTX(s):crnRegex$1.test(f)?loadCRN(s):s.fetchImage()).then(imageLoad(h,t)).otherwise(ModelUtility.getFailedLoadFunction(h,"image",s.url)))})}var scratchArticulationStageInitialTransform=new Matrix4;function parseNodes(l){var c={},u={},d=[],h=l._loadResources.skinnedNodesIds,p=l._runtime.articulationsByName;ForEach.node(l.gltf,function(e,t){var i={matrix:void 0,translation:void 0,rotation:void 0,scale:void 0,computedShow:!0,transformToRoot:new Matrix4,computedMatrix:new Matrix4,dirtyNumber:0,commands:[],inverseBindMatrices:void 0,bindShapeMatrix:void 0,joints:[],computedJointMatrices:[],jointName:e.jointName,weights:[],children:[],parents:[],publicNode:void 0};if(i.publicNode=new ModelNode(l,e,i,t,ModelUtility.getTransform(e)),c[t]=i,u[e.name]=i,defined(e.skin)&&(h.push(t),d.push(i)),defined(e.extensions)&&defined(e.extensions.AGI_articulations)){var r=e.extensions.AGI_articulations.articulationName;if(defined(r)){var n=Matrix4.clone(i.publicNode.originalMatrix,scratchArticulationStageInitialTransform),a=p[r];a.nodes.push(i.publicNode);for(var o=a.stages.length,s=0;s<o;++s)n=applyArticulationStageMatrix(a.stages[s],n);i.publicNode.matrix=n}}}),l._runtime.nodes=c,l._runtime.nodesByName=u,l._runtime.skinnedNodes=d}function parseMaterials(n){var e=n.gltf,a=n._sourceTechniques,o={},s={},l=n._uniformMaps;ForEach.material(e,function(e,t){l[t]={uniformMap:void 0,values:void 0,jointMatrixUniformName:void 0,morphWeightsUniformName:void 0};var i,r=new ModelMaterial(n,e,t);defined(e.extensions)&&defined(e.extensions.KHR_techniques_webgl)&&(i=e.extensions.KHR_techniques_webgl.technique,r._technique=i,r._program=a[i].program,ForEach.materialValue(e,function(e,t){defined(r._values)||(r._values={}),r._values[t]=clone(e)})),o[e.name]=r,s[t]=r}),n._runtime.materialsByName=o,n._runtime.materialsById=s}function parseMeshes(a){var t={},i=a._runtime.materialsById;ForEach.mesh(a.gltf,function(e,n){t[e.name]=new ModelMesh(e,i,n),(defined(a.extensionsUsed.WEB3D_quantized_attributes)||a._dequantizeInShader)&&ForEach.meshPrimitive(e,function(e,t){var i=getProgramForPrimitive(a,e),r=a._programPrimitives[i];defined(r)||(r={},a._programPrimitives[i]=r),r[n+".primitive."+t]=e})}),a._runtime.meshesByName=t}var CreateVertexBufferJob=function(){this.id=void 0,this.model=void 0,this.context=void 0};function createVertexBuffer$1(e,t,i){var r=t._loadResources,n=t.gltf.bufferViews[e];defined(n)||(n=r.createdBufferViews[e]);var a=Buffer$1.createVertexBuffer({context:i,typedArray:r.getBuffer(n),usage:BufferUsage$1.STATIC_DRAW});a.vertexArrayDestroyable=!1,t._rendererResources.buffers[e]=a,t._geometryByteLength+=a.sizeInBytes}CreateVertexBufferJob.prototype.set=function(e,t,i){this.id=e,this.model=t,this.context=i},CreateVertexBufferJob.prototype.execute=function(){createVertexBuffer$1(this.id,this.model,this.context)};var CreateIndexBufferJob=function(){this.id=void 0,this.componentType=void 0,this.model=void 0,this.context=void 0};function createIndexBuffer$1(e,t,i,r){var n=i._loadResources,a=i.gltf.bufferViews[e];defined(a)||(a=n.createdBufferViews[e]);var o=Buffer$1.createIndexBuffer({context:r,typedArray:n.getBuffer(a),usage:BufferUsage$1.STATIC_DRAW,indexDatatype:t});o.vertexArrayDestroyable=!1,i._rendererResources.buffers[e]=o,i._geometryByteLength+=o.sizeInBytes}CreateIndexBufferJob.prototype.set=function(e,t,i,r){this.id=e,this.componentType=t,this.model=i,this.context=r},CreateIndexBufferJob.prototype.execute=function(){createIndexBuffer$1(this.id,this.componentType,this.model,this.context)};var scratchVertexBufferJob=new CreateVertexBufferJob,scratchIndexBufferJob=new CreateIndexBufferJob;function createBuffers$1(e,t){var i=e._loadResources;if(0===i.pendingBufferLoads){var r,n=t.context,a=i.vertexBuffersToCreate,o=i.indexBuffersToCreate;if(e.asynchronous){for(;0<a.length&&(scratchVertexBufferJob.set(a.peek(),e,n),t.jobScheduler.execute(scratchVertexBufferJob,JobType$1.BUFFER));)a.dequeue();for(;0<o.length&&(r=o.peek(),scratchIndexBufferJob.set(r.id,r.componentType,e,n),t.jobScheduler.execute(scratchIndexBufferJob,JobType$1.BUFFER));)o.dequeue()}else{for(;0<a.length;)createVertexBuffer$1(a.dequeue(),e,n);for(;0<o.length;)createIndexBuffer$1((r=o.dequeue()).id,r.componentType,e,n)}}}function getProgramForPrimitive(e,t){var i=e._runtime.materialsById[t.material];if(defined(i))return i._program}function modifyShaderForQuantizedAttributes$1(e,t,i){var r,n,a,o=i._programPrimitives[t];if(!defined(o))return e;for(n in o)if(o.hasOwnProperty(n)&&getProgramForPrimitive(i,r=o[n])===t)break;if(i._programPrimitives[t]=void 0,i.extensionsUsed.WEB3D_quantized_attributes)a=ModelUtility.modifyShaderForQuantizedAttributes(i.gltf,r,e),i._quantizedUniforms[t]=a.uniforms;else{var s=i._decodedData[n];if(!defined(s))return e;a=ModelUtility.modifyShaderForDracoQuantizedAttributes(i.gltf,r,e,s.attributes)}return a.shader}function modifyShaderForColor(e){return e=ShaderSource.replaceMain(e,"gltf_blend_main"),e+="uniform vec4 gltf_color; \nuniform float gltf_colorBlend; \nvoid main() \n{ \n gltf_blend_main(); \n gl_FragColor.rgb = mix(gl_FragColor.rgb, gltf_color.rgb, gltf_colorBlend); \n float highlight = ceil(gltf_colorBlend); \n gl_FragColor.rgb *= mix(gltf_color.rgb, vec3(1.0), highlight); \n gl_FragColor.a *= gltf_color.a; \n} \n"}function modifyShader$1(e,t,i){return defined(i)&&(e=i(e,t)),e}var CreateProgramJob=function(){this.programToCreate=void 0,this.model=void 0,this.context=void 0};function createProgram$1(e,t,i){var r,n=e.programId,a=e.techniqueId,o=t._sourcePrograms[n],s=t._rendererResources.sourceShaders,l=s[o.vertexShader],c=s[o.fragmentShader],u=t._quantizedVertexShaders;(t.extensionsUsed.WEB3D_quantized_attributes||t._dequantizeInShader)&&(defined(r=u[n])||(r=modifyShaderForQuantizedAttributes$1(l,n,t),u[n]=r),l=r);var d=modifyShader$1(l,n,t._vertexShaderLoaded),h=modifyShader$1(c,n,t._fragmentShaderLoaded);defined(t._uniformMapLoaded)||(h="uniform vec4 czm_pickColor;\n"+h);var p,m,f=0<t._imageBasedLightingFactor.x||0<t._imageBasedLightingFactor.y;f&&(h="#define USE_IBL_LIGHTING \n\n"+h),defined(t._lightColor)&&(h="#define USE_CUSTOM_LIGHT_COLOR \n\n"+h),"2.0"===t._sourceVersion&&!t._sourceKHRTechniquesWebGL||(h=ShaderSource.replaceMain(h,"non_gamma_corrected_main"),h+="\nvoid main() { \n non_gamma_corrected_main(); \n gl_FragColor = czm_gammaCorrect(gl_FragColor); \n} \n"),OctahedralProjectedCubeMap.isSupported(i)&&(p=defined(t._sphericalHarmonicCoefficients)||t._useDefaultSphericalHarmonics,m=defined(t._specularEnvironmentMapAtlas)&&t._specularEnvironmentMapAtlas.ready||t._useDefaultSpecularMaps,(p||m||f)&&(h="uniform mat4 gltf_clippingPlanesMatrix; \n"+h),defined(t._sphericalHarmonicCoefficients)?h="#define DIFFUSE_IBL \n#define CUSTOM_SPHERICAL_HARMONICS \nuniform vec3 gltf_sphericalHarmonicCoefficients[9]; \n"+h:t._useDefaultSphericalHarmonics&&(h="#define DIFFUSE_IBL \n"+h),defined(t._specularEnvironmentMapAtlas)&&t._specularEnvironmentMapAtlas.ready?h="#define SPECULAR_IBL \n#define CUSTOM_SPECULAR_IBL \nuniform sampler2D gltf_specularMap; \nuniform vec2 gltf_specularMapSize; \nuniform float gltf_maxSpecularLOD; \n"+h:t._useDefaultSpecularMaps&&(h="#define SPECULAR_IBL \n"+h)),defined(t._luminanceAtZenith)&&(h="#define USE_SUN_LUMINANCE \nuniform float gltf_luminanceAtZenith;\n"+h),createAttributesAndProgram(n,a,h,d,t,i)}function recreateProgram(e,t,i){var r=e.programId,n=e.techniqueId,a=t._sourcePrograms[r],o=t._rendererResources.sourceShaders,s=t._quantizedVertexShaders,l=t.clippingPlanes,c=isClippingEnabled(t),u=o[a.vertexShader],d=o[a.fragmentShader];(t.extensionsUsed.WEB3D_quantized_attributes||t._dequantizeInShader)&&(u=s[r]);var h=d;isColorShadingEnabled(t)&&(h=Model._modifyShaderForColor(h)),c&&(h=modifyShaderForClippingPlanes(h,l,i));var p=modifyShader$1(u,r,t._vertexShaderLoaded),m=modifyShader$1(h,r,t._fragmentShaderLoaded);defined(t._uniformMapLoaded)||(m="uniform vec4 czm_pickColor;\n"+m);var f,g,_=0<t._imageBasedLightingFactor.x||0<t._imageBasedLightingFactor.y;_&&(m="#define USE_IBL_LIGHTING \n\n"+m),defined(t._lightColor)&&(m="#define USE_CUSTOM_LIGHT_COLOR \n\n"+m),"2.0"===t._sourceVersion&&!t._sourceKHRTechniquesWebGL||(m=ShaderSource.replaceMain(m,"non_gamma_corrected_main"),m+="\nvoid main() { \n non_gamma_corrected_main(); \n gl_FragColor = czm_gammaCorrect(gl_FragColor); \n} \n"),OctahedralProjectedCubeMap.isSupported(i)&&(f=defined(t._sphericalHarmonicCoefficients)||t._useDefaultSphericalHarmonics,g=defined(t._specularEnvironmentMapAtlas)&&t._specularEnvironmentMapAtlas.ready||t._useDefaultSpecularMaps,!c&&(f||g||_)&&(m="uniform mat4 gltf_clippingPlanesMatrix; \n"+m),defined(t._sphericalHarmonicCoefficients)?m="#define DIFFUSE_IBL \n#define CUSTOM_SPHERICAL_HARMONICS \nuniform vec3 gltf_sphericalHarmonicCoefficients[9]; \n"+m:t._useDefaultSphericalHarmonics&&(m="#define DIFFUSE_IBL \n"+m),defined(t._specularEnvironmentMapAtlas)&&t._specularEnvironmentMapAtlas.ready?m="#define SPECULAR_IBL \n#define CUSTOM_SPECULAR_IBL \nuniform sampler2D gltf_specularMap; \nuniform vec2 gltf_specularMapSize; \nuniform float gltf_maxSpecularLOD; \n"+m:t._useDefaultSpecularMaps&&(m="#define SPECULAR_IBL \n"+m)),defined(t._luminanceAtZenith)&&(m="#define USE_SUN_LUMINANCE \nuniform float gltf_luminanceAtZenith;\n"+m),createAttributesAndProgram(r,n,m,p,t,i)}function createAttributesAndProgram(e,t,i,r,n,a){var o=n._sourceTechniques[t],s=ModelUtility.createAttributeLocations(o,n._precreatedAttributes);n._rendererResources.programs[e]=ShaderProgram.fromCache({context:a,vertexShaderSource:r,fragmentShaderSource:i,attributeLocations:s})}CreateProgramJob.prototype.set=function(e,t,i){this.programToCreate=e,this.model=t,this.context=i},CreateProgramJob.prototype.execute=function(){createProgram$1(this.programToCreate,this.model,this.context)};var scratchCreateProgramJob=new CreateProgramJob;function createPrograms(e,t){var i=e._loadResources,r=i.programsToCreate;if(0===i.pendingShaderLoads&&0===i.pendingBufferLoads){var n=t.context;if(e.asynchronous)for(;0<r.length&&(scratchCreateProgramJob.set(r.peek(),e,n),t.jobScheduler.execute(scratchCreateProgramJob,JobType$1.PROGRAM));)r.dequeue();else for(;0<r.length;)createProgram$1(r.dequeue(),e,n)}}function getOnImageCreatedFromTypedArray(t,i){return function(e){t.texturesToCreate.enqueue({id:i.id,image:e,bufferView:void 0}),--t.pendingBufferViewToImage}}function loadTexturesFromBufferViews(e){var t=e._loadResources;if(0===t.pendingBufferLoads)for(;0<t.texturesToCreateFromBufferView.length;){var i,r=t.texturesToCreateFromBufferView.dequeue(),n=e.gltf,a=n.bufferViews[r.bufferView],o=(n.textures[r.id].source,ModelUtility.getFailedLoadFunction(e,"image","id: "+r.id+", bufferView: "+r.bufferView));"image/ktx"===r.mimeType?(loadKTX(t.getBuffer(a)).then(imageLoad(e,r.id)).otherwise(o),++e._loadResources.pendingTextureLoads):"image/crn"===r.mimeType?(loadCRN(t.getBuffer(a)).then(imageLoad(e,r.id)).otherwise(o),++e._loadResources.pendingTextureLoads):(i=getOnImageCreatedFromTypedArray(t,r),loadImageFromTypedArray({uint8Array:t.getBuffer(a),format:r.mimeType,flipY:!1}).then(i).otherwise(o),++t.pendingBufferViewToImage)}}function createSamplers(e){var i,t=e._loadResources;t.createSamplers&&(t.createSamplers=!1,i=e._rendererResources.samplers,ForEach.sampler(e.gltf,function(e,t){i[t]=new Sampler({wrapS:e.wrapS,wrapT:e.wrapT,minificationFilter:e.minFilter,magnificationFilter:e.magFilter})}))}var CreateTextureJob=function(){this.gltfTexture=void 0,this.model=void 0,this.context=void 0};function createTexture$3(e,t,i){var r=t.gltf.textures[e.id],n=t._rendererResources.samplers[r.sampler];defined(n)||(n=new Sampler({wrapS:TextureWrap$1.REPEAT,wrapT:TextureWrap$1.REPEAT}));for(var a=!1,o=t.gltf.materials,s=o.length,l=0;l<s;++l){var c=o[l];if(defined(c.extensions)&&defined(c.extensions.KHR_techniques_webgl)){var u=c.extensions.KHR_techniques_webgl.values;for(var d in u)if(u.hasOwnProperty(d)&&-1!==d.indexOf("Texture")){var h=u[d];if(h.index===e.id&&defined(h.extensions)&&defined(h.extensions.KHR_texture_transform)){a=!0;break}}}if(a)break}var p=n.wrapS,m=n.wrapT,f=n.minificationFilter;a&&f!==TextureMinificationFilter$1.LINEAR&&f!==TextureMinificationFilter$1.NEAREST&&(f=f===TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST||f===TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR?TextureMinificationFilter$1.NEAREST:TextureMinificationFilter$1.LINEAR,n=new Sampler({wrapS:n.wrapS,wrapT:n.wrapT,textureMinificationFilter:f,textureMagnificationFilter:n.magnificationFilter}));var g,_,y,v=e.internalFormat,C=!(defined(v)&&PixelFormat$1.isCompressedFormat(v)||f!==TextureMinificationFilter$1.NEAREST_MIPMAP_NEAREST&&f!==TextureMinificationFilter$1.NEAREST_MIPMAP_LINEAR&&f!==TextureMinificationFilter$1.LINEAR_MIPMAP_NEAREST&&f!==TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR),S=C||p===TextureWrap$1.REPEAT||p===TextureWrap$1.MIRRORED_REPEAT||m===TextureWrap$1.REPEAT||m===TextureWrap$1.MIRRORED_REPEAT,T=e.image;defined(v)?g=new Texture({context:i,source:{arrayBufferView:e.bufferView},width:e.width,height:e.height,pixelFormat:v,sampler:n}):defined(T)&&(_=!CesiumMath.isPowerOfTwo(T.width)||!CesiumMath.isPowerOfTwo(T.height),S&&_&&((y=document.createElement("canvas")).width=CesiumMath.nextPowerOfTwo(T.width),y.height=CesiumMath.nextPowerOfTwo(T.height),y.getContext("2d").drawImage(T,0,0,T.width,T.height,0,0,y.width,y.height),T=y),g=new Texture({context:i,source:T,pixelFormat:r.internalFormat,pixelDatatype:r.type,sampler:n,flipY:!1}),C&&g.generateMipmap()),defined(g)&&(t._rendererResources.textures[e.id]=g,t._texturesByteLength+=g.sizeInBytes)}CreateTextureJob.prototype.set=function(e,t,i){this.gltfTexture=e,this.model=t,this.context=i},CreateTextureJob.prototype.execute=function(){createTexture$3(this.gltfTexture,this.model,this.context)};var scratchCreateTextureJob=new CreateTextureJob;function createTextures(e,t){var i=t.context,r=e._loadResources.texturesToCreate;if(e.asynchronous)for(;0<r.length&&(scratchCreateTextureJob.set(r.peek(),e,i),t.jobScheduler.execute(scratchCreateTextureJob,JobType$1.TEXTURE));)r.dequeue();else for(;0<r.length;)createTexture$3(r.dequeue(),e,i)}function getAttributeLocations$1(e,t){var i,r,n=e._sourceTechniques,a={},o=e._runtime.materialsById[t.material];if(!defined(o))return a;var s=n[o._technique];if(!defined(s))return a;var l,c=s.attributes,u=e._rendererResources.programs[s.program],d=u.vertexAttributes,h=u._attributeLocations;for(i in d){!d.hasOwnProperty(i)||defined(l=c[i])&&(r=h[i],a[l.semantic]=r)}var p=e._precreatedAttributes;if(defined(p))for(i in p)p.hasOwnProperty(i)&&(r=h[i],a[i]=r);return a}function createJoints(e,t){for(var i=e.gltf,r=i.skins,n=i.nodes,a=e._runtime.nodes,o=e._loadResources.skinnedNodesIds,s=o.length,l=0;l<s;++l){var c=o[l],u=a[c],d=n[c],h=t[d.skin];u.inverseBindMatrices=h.inverseBindMatrices,u.bindShapeMatrix=h.bindShapeMatrix;for(var p=r[d.skin].joints,m=p.length,f=0;f<m;++f){var g=a[p[f]];u.joints.push(g)}}}function createSkins(n){var e,a,o,t=n._loadResources;0===t.pendingBufferLoads&&t.createSkins&&(t.createSkins=!1,e=n.gltf,a=e.accessors,o={},ForEach.skin(e,function(e,t){var i,r=a[e.inverseBindMatrices];Matrix4.equals(e.bindShapeMatrix,Matrix4.IDENTITY)||(i=Matrix4.clone(e.bindShapeMatrix)),o[t]={inverseBindMatrices:ModelAnimationCache.getSkinInverseBindMatrices(n,r),bindShapeMatrix:i}}),createJoints(n,o))}function getChannelEvaluator(t,i,r,n){return function(e){defined(n)&&(e=t.clampAnimations?n.clampTime(e):n.wrapTime(e),i[r]=n.evaluate(e,i[r]),i.dirtyNumber=t._maxDirtyNumber)}}function createRuntimeAnimations(g){var _,y,e=g._loadResources;e.finishedPendingBufferLoads()&&e.createRuntimeAnimations&&(e.createRuntimeAnimations=!1,g._runtime.animations=[],_=g._runtime.nodes,y=g.gltf.accessors,ForEach.animation(g.gltf,function(e,t){for(var i=e.channels,r=e.samplers,n=Number.MAX_VALUE,a=-Number.MAX_VALUE,o=i.length,s=new Array(o),l=0;l<o;++l){var c=i[l],u=c.target,d=u.path,h=r[c.sampler],p=ModelAnimationCache.getAnimationParameterValues(g,y[h.input]),m=ModelAnimationCache.getAnimationParameterValues(g,y[h.output]),n=Math.min(n,p[0]),a=Math.max(a,p[p.length-1]),f=ModelAnimationCache.getAnimationSpline(g,t,e,c.sampler,h,p,d,m);s[l]=getChannelEvaluator(g,_[u.node],u.path,f)}g._runtime.animations[t]={name:e.name,startTime:n,stopTime:a,channelEvaluators:s}}))}function createVertexArrays(h,p){var m,f,g,_,e=h._loadResources;e.finishedBuffersCreation()&&e.finishedProgramCreation()&&e.createVertexArrays&&(e.createVertexArrays=!1,m=h._rendererResources.buffers,f=h._rendererResources.vertexArrays,g=h.gltf,_=g.accessors,ForEach.mesh(g,function(e,d){ForEach.meshPrimitive(e,function(e,t){var o,i,r,s=[],l=getAttributeLocations$1(h,e),c=h._decodedData[d+".primitive."+t];ForEach.meshPrimitiveAttribute(e,function(e,t){if(defined(o=l[t])){if(defined(c)){var i=c.attributes;if(i.hasOwnProperty(t)){var r=i[t];return void s.push({index:o,vertexBuffer:m[r.bufferView],componentsPerAttribute:r.componentsPerAttribute,componentDatatype:r.componentDatatype,normalize:r.normalized,offsetInBytes:r.byteOffset,strideInBytes:r.byteStride})}}var n=_[e],a=defined(n.normalized)&&n.normalized;s.push({index:o,vertexBuffer:m[n.bufferView],componentsPerAttribute:numberOfComponentsForType(n.type),componentDatatype:n.componentType,normalize:a,offsetInBytes:n.byteOffset,strideInBytes:getAccessorByteStride(g,n)})}});var n,a,u=h._precreatedAttributes;if(defined(u))for(r in u)u.hasOwnProperty(r)&&defined(o=l[r])&&((i=u[r]).index=o,s.push(i));defined(e.indices)&&(a=_[e.indices].bufferView,defined(c)&&(a=c.bufferView),n=m[a]),f[d+".primitive."+t]=new VertexArray({context:p,attributes:s,indexBuffer:n})})}))}function createRenderStates$3(i){var e=i._loadResources;e.createRenderStates&&(e.createRenderStates=!1,ForEach.material(i.gltf,function(e,t){createRenderStateForMaterial(i,e,t)}))}function createRenderStateForMaterial(e,t,i){var r=e._rendererResources.renderStates,n=[WebGLConstants$1.FUNC_ADD,WebGLConstants$1.FUNC_ADD],a=[WebGLConstants$1.ONE,WebGLConstants$1.ONE_MINUS_SRC_ALPHA,WebGLConstants$1.ONE,WebGLConstants$1.ONE_MINUS_SRC_ALPHA];defined(t.extensions)&&defined(t.extensions.KHR_blend)&&(n=t.extensions.KHR_blend.blendEquation,a=t.extensions.KHR_blend.blendFactors);var o=!t.doubleSided,s="BLEND"===t.alphaMode;r[i]=RenderState.fromCache({cull:{enabled:o},depthTest:{enabled:!0,func:DepthFunction$1.LESS_OR_EQUAL},depthMask:!s,blending:{enabled:s,equationRgb:n[0],equationAlpha:n[1],functionSourceRgb:a[0],functionDestinationRgb:a[1],functionSourceAlpha:a[2],functionDestinationAlpha:a[3]}})}var gltfUniformsFromNode={MODEL:function(e,t,i){return function(){return i.computedMatrix}},VIEW:function(e,t,i){return function(){return e.view}},PROJECTION:function(e,t,i){return function(){return e.projection}},MODELVIEW:function(e,t,i){var r=new Matrix4;return function(){return Matrix4.multiplyTransformation(e.view,i.computedMatrix,r)}},CESIUM_RTC_MODELVIEW:function(e,t,i){var r=new Matrix4;return function(){return Matrix4.multiplyTransformation(e.view,i.computedMatrix,r),Matrix4.setTranslation(r,t._rtcCenterEye,r)}},MODELVIEWPROJECTION:function(e,t,i){var r=new Matrix4;return function(){return Matrix4.multiplyTransformation(e.view,i.computedMatrix,r),Matrix4.multiply(e._projection,r,r)}},MODELINVERSE:function(e,t,i){var r=new Matrix4;return function(){return Matrix4.inverse(i.computedMatrix,r)}},VIEWINVERSE:function(e,t){return function(){return e.inverseView}},PROJECTIONINVERSE:function(e,t,i){return function(){return e.inverseProjection}},MODELVIEWINVERSE:function(e,t,i){var r=new Matrix4,n=new Matrix4;return function(){return Matrix4.multiplyTransformation(e.view,i.computedMatrix,r),Matrix4.inverse(r,n)}},MODELVIEWPROJECTIONINVERSE:function(e,t,i){var r=new Matrix4,n=new Matrix4;return function(){return Matrix4.multiplyTransformation(e.view,i.computedMatrix,r),Matrix4.multiply(e._projection,r,r),Matrix4.inverse(r,n)}},MODELINVERSETRANSPOSE:function(e,t,i){var r=new Matrix4,n=new Matrix3;return function(){return Matrix4.inverse(i.computedMatrix,r),Matrix4.getMatrix3(r,n),Matrix3.transpose(n,n)}},MODELVIEWINVERSETRANSPOSE:function(e,t,i){var r=new Matrix4,n=new Matrix4,a=new Matrix3;return function(){return Matrix4.multiplyTransformation(e.view,i.computedMatrix,r),Matrix4.inverse(r,n),Matrix4.getMatrix3(n,a),Matrix3.transpose(a,a)}},VIEWPORT:function(e,t,i){return function(){return e.viewportCartesian4}}};function getUniformFunctionFromSource(e,t,i,r){var n=t._runtime.nodes[e];return gltfUniformsFromNode[i](r,t,n)}function createUniformsForMaterial(o,s,e,l,c,u,d){var h,p,m={},f={};return ForEach.techniqueUniform(e,function(e,t){var i,r,n,a;defined(l)&&defined(l[t])?(n=ModelUtility.createUniformFunction(e.type,l[t],u,d),m[t]=n.func,f[t]=n):defined(e.node)?m[t]=getUniformFunctionFromSource(e.node,o,e.semantic,c.uniformState):defined(e.semantic)?"JOINTMATRIX"===e.semantic?h=t:"MORPHWEIGHTS"===e.semantic?p=t:"ALPHACUTOFF"===e.semantic?defined(i=s.alphaMode)&&"MASK"===i&&(r=defaultValue(s.alphaCutoff,.5),n=ModelUtility.createUniformFunction(e.type,r,u,d),m[t]=n.func,f[t]=n):m[t]=ModelUtility.getGltfSemanticUniforms()[e.semantic](c.uniformState,o):defined(e.value)&&(a=ModelUtility.createUniformFunction(e.type,e.value,u,d),m[t]=a.func,f[t]=a)}),{map:m,values:f,jointMatrixUniformName:h,morphWeightsUniformName:p}}function createUniformMaps(l,c){var e,u,d,h,p,t=l._loadResources;t.finishedProgramCreation()&&t.createUniformMaps&&(t.createUniformMaps=!1,e=l.gltf,u=l._sourceTechniques,d=l._uniformMaps,h=l._rendererResources.textures,p=l._defaultTexture,ForEach.material(e,function(e,t){var i,r=l._runtime.materialsById[t],n=u[r._technique],a=r._values,o=createUniformsForMaterial(l,e,n,a,c,h,p),s=d[t];s.uniformMap=o.map,s.values=o.values,s.jointMatrixUniformName=o.jointMatrixUniformName,s.morphWeightsUniformName=o.morphWeightsUniformName,defined(n.attributes.a_outlineCoordinates)&&(i=ModelOutlineLoader.createTexture(l,c),s.uniformMap.u_outlineTexture=function(){return i})}))}function createUniformsForDracoQuantizedAttributes(e){return ModelUtility.createUniformsForDracoQuantizedAttributes(e.attributes)}function createUniformsForQuantizedAttributes$1(e,t){var i=getProgramForPrimitive(e,t),r=e._quantizedUniforms[i];return ModelUtility.createUniformsForQuantizedAttributes(e.gltf,t,r)}function createPickColorFunction(e){return function(){return e}}function createJointMatricesFunction(e){return function(){return e.computedJointMatrices}}function createMorphWeightsFunction(e){return function(){return e.weights}}function createSilhouetteColorFunction(e){return function(){return e.silhouetteColor}}function createSilhouetteSizeFunction(e){return function(){return e.silhouetteSize}}function createColorFunction(e){return function(){return e.color}}var scratchClippingPlaneMatrix=new Matrix4;function createClippingPlanesMatrixFunction(i){return function(){var e=i.clippingPlanes;if(!defined(e)&&!defined(i._sphericalHarmonicCoefficients)&&!defined(i._specularEnvironmentMaps))return Matrix4.IDENTITY;var t=defined(e)?e.modelMatrix:Matrix4.IDENTITY;return Matrix4.multiply(i._clippingPlaneModelViewMatrix,t,scratchClippingPlaneMatrix)}}function createClippingPlanesFunction(t){return function(){var e=t.clippingPlanes;return defined(e)&&e.enabled?e.texture:t._defaultTexture}}function createClippingPlanesEdgeStyleFunction(i){return function(){var e=i.clippingPlanes;if(!defined(e))return Color.WHITE.withAlpha(0);var t=Color.clone(e.edgeColor);return t.alpha=e.edgeWidth,t}}function createColorBlendFunction(e){return function(){return ColorBlendMode$1.getColorBlend(e.colorBlendMode,e.colorBlendAmount)}}function createIBLFactorFunction(e){return function(){return e._imageBasedLightingFactor}}function createLightColorFunction(e){return function(){return e._lightColor}}function createLuminanceAtZenithFunction(e){return function(){return e.luminanceAtZenith}}function createSphericalHarmonicCoefficientsFunction(e){return function(){return e._sphericalHarmonicCoefficients}}function createSpecularEnvironmentMapFunction(e){return function(){return e._specularEnvironmentMapAtlas.texture}}function createSpecularEnvironmentMapSizeFunction(e){return function(){return e._specularEnvironmentMapAtlas.texture.dimensions}}function createSpecularEnvironmentMapLOD(e){return function(){return e._specularEnvironmentMapAtlas.maximumMipmapLevel}}function triangleCountFromPrimitiveIndices$1(e,t){switch(e.mode){case PrimitiveType$1.TRIANGLES:return t/3;case PrimitiveType$1.TRIANGLE_STRIP:case PrimitiveType$1.TRIANGLE_FAN:return Math.max(t-2,0);default:return 0}}function createCommand(e,t,i,r,n){for(var a=e._nodeCommands,o=e._pickIds,s=e.allowPicking,l=e._runtime.meshesByName,c=e._rendererResources,u=c.vertexArrays,d=c.programs,h=c.renderStates,p=e._uniformMaps,m=e.gltf,f=m.accessors,g=m.meshes,_=t.mesh,y=g[_],v=y.primitives,C=v.length,S=0;S<C;++S){var T,x,b=v[S],E=f[b.indices],P=e._runtime.materialsById[b.material]._program,A=e._decodedData[_+".primitive."+S],w=b.attributes.POSITION;defined(w)&&(T=ModelUtility.getAccessorMinMax(m,w),x=BoundingSphere.fromCornerPoints(Cartesian3.fromArray(T.min),Cartesian3.fromArray(T.max)));var D,M,I=u[_+".primitive."+S];M=defined(A)?(D=A.numberOfIndices,0):defined(E)?(D=E.count,E.byteOffset/IndexDatatype$1.getSizeInBytes(E.componentType)):(D=f[b.attributes.POSITION].count,0),e._trianglesLength+=triangleCountFromPrimitiveIndices$1(b,D);var R,O,L=p[b.material],F=L.uniformMap;defined(L.jointMatrixUniformName)&&((R={})[L.jointMatrixUniformName]=createJointMatricesFunction(i),F=combine(F,R)),defined(L.morphWeightsUniformName)&&((O={})[L.morphWeightsUniformName]=createMorphWeightsFunction(i),F=combine(F,O)),F=combine(F,{gltf_color:createColorFunction(e),gltf_colorBlend:createColorBlendFunction(e),gltf_clippingPlanes:createClippingPlanesFunction(e),gltf_clippingPlanesEdgeStyle:createClippingPlanesEdgeStyleFunction(e),gltf_clippingPlanesMatrix:createClippingPlanesMatrixFunction(e),gltf_iblFactor:createIBLFactorFunction(e),gltf_lightColor:createLightColorFunction(e),gltf_sphericalHarmonicCoefficients:createSphericalHarmonicCoefficientsFunction(e),gltf_specularMap:createSpecularEnvironmentMapFunction(e),gltf_specularMapSize:createSpecularEnvironmentMapSizeFunction(e),gltf_maxSpecularLOD:createSpecularEnvironmentMapLOD(e),gltf_luminanceAtZenith:createLuminanceAtZenithFunction(e)}),defined(e._uniformMapLoaded)&&(F=e._uniformMapLoaded(F,P,i));var N={};e.extensionsUsed.WEB3D_quantized_attributes?N=createUniformsForQuantizedAttributes$1(e,b):e._dequantizeInShader&&defined(A)&&(N=createUniformsForDracoQuantizedAttributes(A)),F=combine(F,N);var B=h[b.material],V=B.blending.enabled,k=e._pickObject;defined(k)||(k={primitive:e,id:e.id,node:i.publicNode,mesh:l[y.name]});var z,$=ShadowMode$1.castShadows(e._shadows),U=ShadowMode$1.receiveShadows(e._shadows);s&&!defined(e._uniformMapLoaded)&&(z=r.createPickId(k),o.push(z),F=combine(F,{czm_pickColor:createPickColorFunction(z.color)})),s&&(z=defined(e._pickIdLoaded)&&defined(e._uniformMapLoaded)?e._pickIdLoaded():"czm_pickColor");var G,H=new DrawCommand({boundingVolume:new BoundingSphere,cull:e.cull,modelMatrix:new Matrix4,primitiveType:b.mode,vertexArray:I,count:D,offset:M,shaderProgram:d[P],castShadows:$,receiveShadows:U,uniformMap:F,renderState:B,owner:k,pass:V?Pass$1.TRANSLUCENT:e.opaquePass,pickId:z});n||((G=DrawCommand.shallowClone(H)).boundingVolume=new BoundingSphere,G.modelMatrix=new Matrix4);var W={show:!0,boundingSphere:x,command:H,command2D:G,silhouetteModelCommand:void 0,silhouetteModelCommand2D:void 0,silhouetteColorCommand:void 0,silhouetteColorCommand2D:void 0,translucentCommand:void 0,translucentCommand2D:void 0,disableCullingCommand:void 0,disableCullingCommand2D:void 0,programId:P};i.commands.push(W),a.push(W)}}function createRuntimeNodes$1(e,t,i){var r=e._loadResources;if(r.finishedEverythingButTextureCreation()&&r.createRuntimeNodes){r.createRuntimeNodes=!1;for(var n=[],a=e._runtime.nodes,o=e.gltf,s=o.nodes,l=o.scenes[o.scene].nodes,c=l.length,u=[],d={},h=0;h<c;++h)for(u.push({parentRuntimeNode:void 0,gltfNode:s[l[h]],id:l[h]});0<u.length;){var p=u.pop();d[p.id]=!0;var m,f=p.parentRuntimeNode,g=p.gltfNode,_=a[p.id];0===_.parents.length&&(defined(g.matrix)?_.matrix=Matrix4.fromColumnMajorArray(g.matrix):(m=g.rotation,_.translation=Cartesian3.fromArray(g.translation),_.rotation=Quaternion.unpack(m),_.scale=Cartesian3.fromArray(g.scale))),defined(f)?(f.children.push(_),_.parents.push(f)):n.push(_),defined(g.mesh)&&createCommand(e,g,_,t,i);var y=g.children;if(defined(y))for(var v=y.length,C=0;C<v;C++){var S=y[C];d[S]||u.push({parentRuntimeNode:_,gltfNode:s[S],id:y[C]})}}e._runtime.rootNodes=n,e._runtime.nodes=a}}function getGeometryByteLength(e){var t=0;for(var i in e)e.hasOwnProperty(i)&&(t+=e[i].sizeInBytes);return t}function getTexturesByteLength(e){var t=0;for(var i in e)e.hasOwnProperty(i)&&(t+=e[i].sizeInBytes);return t}function createResources$1(e,t){var i,r,n,a,o,s=t.context,l=t.scene3DOnly,c=e._quantizedVertexShaders,u=e._sourceTechniques,d=e._sourcePrograms,h=e._rendererResources,p=h.sourceShaders;for(var m in e._loadRendererResourcesFromCache&&(p=h.sourceShaders=e._cachedRendererResources.sourceShaders),u){u.hasOwnProperty(m)&&(n=p[(r=d[i=u[m].program]).vertexShader],ModelUtility.checkSupportedGlExtensions(r.glExtensions,s),(e.extensionsUsed.WEB3D_quantized_attributes||e._dequantizeInShader)&&(defined(a=c[i])||(a=modifyShaderForQuantizedAttributes$1(n,i,e),c[i]=a),n=a),n=modifyShader$1(n,i,e._vertexShaderLoaded))}e._loadRendererResourcesFromCache?(o=e._cachedRendererResources,h.buffers=o.buffers,h.vertexArrays=o.vertexArrays,h.programs=o.programs,h.silhouettePrograms=o.silhouettePrograms,h.textures=o.textures,h.samplers=o.samplers,h.renderStates=o.renderStates,defined(e._precreatedAttributes)&&createVertexArrays(e,s),e._cachedGeometryByteLength+=getGeometryByteLength(o.buffers),e._cachedTexturesByteLength+=getTexturesByteLength(o.textures)):(createBuffers$1(e,t),createPrograms(e,t),createSamplers(e),loadTexturesFromBufferViews(e),createTextures(e,t)),createSkins(e),createRuntimeAnimations(e),e._loadRendererResourcesFromCache||(createVertexArrays(e,s),createRenderStates$3(e)),createUniformMaps(e,s),createRuntimeNodes$1(e,s,l)}function getNodeMatrix(e,t){var i=e.publicNode,r=i.matrix;i.useMatrix&&defined(r)?Matrix4.clone(r,t):defined(e.matrix)?Matrix4.clone(e.matrix,t):(Matrix4.fromTranslationQuaternionRotationScale(e.translation,e.rotation,e.scale,t),i.setMatrix(t))}var scratchNodeStack=[],scratchComputedTranslation$1=new Cartesian4,scratchComputedMatrixIn2D$1=new Matrix4;function updateNodeHierarchyModelMatrix(e,t,i,r){var n,a,o,s=e._maxDirtyNumber,l=e._runtime.rootNodes,c=l.length,u=scratchNodeStack,d=e._computedModelMatrix;e._mode===SceneMode$1.SCENE3D||e._ignoreCommands||(n=Matrix4.getColumn(d,3,scratchComputedTranslation$1),Cartesian4.equals(n,Cartesian4.UNIT_W)?(a=e.boundingSphere.center,o=Transforms.wgs84To2DModelMatrix(r,a,scratchComputedMatrixIn2D$1),d=Matrix4.multiply(o,d,scratchComputedMatrixIn2D$1),defined(e._rtcCenter)&&(Matrix4.setTranslation(d,Cartesian4.UNIT_W,d),e._rtcCenter=e._rtcCenter2D)):(d=Transforms.basisTo2D(r,d,scratchComputedMatrixIn2D$1),e._rtcCenter=e._rtcCenter3D));for(var h=0;h<c;++h){var p=l[h];for(getNodeMatrix(p,p.transformToRoot),u.push(p);0<u.length;){var m=(p=u.pop()).transformToRoot,f=p.commands;if(p.dirtyNumber===s||t||i){var g=Matrix4.multiplyTransformation(d,m,p.computedMatrix),_=f.length;if(0<_)for(var y=0;y<_;++y){var v=f[y],C=v.command;Matrix4.clone(g,C.modelMatrix),BoundingSphere.transform(v.boundingSphere,C.modelMatrix,C.boundingVolume),defined(e._rtcCenter)&&Cartesian3.add(e._rtcCenter,C.boundingVolume.center,C.boundingVolume.center),defined(C=v.command2D)&&e._mode===SceneMode$1.SCENE2D&&(Matrix4.clone(g,C.modelMatrix),C.modelMatrix[13]-=2*CesiumMath.sign(C.modelMatrix[13])*CesiumMath.PI*r.ellipsoid.maximumRadius,BoundingSphere.transform(v.boundingSphere,C.modelMatrix,C.boundingVolume))}}var S=p.children;if(defined(S))for(var T=S.length,x=0;x<T;++x){var b=S[x];b.dirtyNumber=Math.max(b.dirtyNumber,p.dirtyNumber),b.dirtyNumber!==s&&!i||(getNodeMatrix(b,b.transformToRoot),Matrix4.multiplyTransformation(m,b.transformToRoot,b.transformToRoot)),u.push(b)}}}++e._maxDirtyNumber}var scratchObjectSpace=new Matrix4;function applySkins(e){for(var t=e._runtime.skinnedNodes,i=t.length,r=0;r<i;++r){var n=t[r];scratchObjectSpace=Matrix4.inverseTransformation(n.transformToRoot,scratchObjectSpace);for(var a=n.computedJointMatrices,o=n.joints,s=n.bindShapeMatrix,l=n.inverseBindMatrices,c=l.length,u=0;u<c;++u)defined(a[u])||(a[u]=new Matrix4),a[u]=Matrix4.multiplyTransformation(scratchObjectSpace,o[u].transformToRoot,a[u]),a[u]=Matrix4.multiplyTransformation(a[u],l[u],a[u]),defined(s)&&(a[u]=Matrix4.multiplyTransformation(a[u],s,a[u]))}}function updatePerNodeShow(e){for(var t=e._runtime.rootNodes,i=t.length,r=scratchNodeStack,n=0;n<i;++n){var a=t[n];for(a.computedShow=a.publicNode.show,r.push(a);0<r.length;){for(var o=(a=r.pop()).computedShow,s=a.commands,l=s.length,c=0;c<l;++c)s[c].show=o;var u=a.children;if(defined(u))for(var d=u.length,h=0;h<d;++h){var p=u[h];p.computedShow=o&&p.publicNode.show,r.push(p)}}}}function updatePickIds(e,t){var i=e.id;if(e._id!==i){e._id=i;for(var r=e._pickIds,n=r.length,a=0;a<n;++a)r[a].object.id=i}}function updateWireframe$1(e){if(e._debugWireframe!==e.debugWireframe){e._debugWireframe=e.debugWireframe;for(var t=e.debugWireframe?PrimitiveType$1.LINES:PrimitiveType$1.TRIANGLES,i=e._nodeCommands,r=i.length,n=0;n<r;++n)i[n].command.primitiveType=t}}function updateShowBoundingVolume(e){if(e.debugShowBoundingVolume!==e._debugShowBoundingVolume){e._debugShowBoundingVolume=e.debugShowBoundingVolume;for(var t=e.debugShowBoundingVolume,i=e._nodeCommands,r=i.length,n=0;n<r;++n)i[n].command.debugShowBoundingVolume=t}}function updateShadows(e){if(e.shadows!==e._shadows){e._shadows=e.shadows;for(var t=ShadowMode$1.castShadows(e.shadows),i=ShadowMode$1.receiveShadows(e.shadows),r=e._nodeCommands,n=r.length,a=0;a<n;a++){var o=r[a];o.command.castShadows=t,o.command.receiveShadows=i}}}function getTranslucentRenderState$1(e){var t=clone(e,!0);return t.cull.enabled=!1,t.depthTest.enabled=!0,t.depthMask=!1,t.blending=BlendingState$1.ALPHA_BLEND,RenderState.fromCache(t)}function deriveTranslucentCommand$1(e){var t=DrawCommand.shallowClone(e);return t.pass=Pass$1.TRANSLUCENT,t.renderState=getTranslucentRenderState$1(e.renderState),t}function updateColor(e,t,i){var r=t.scene3DOnly,n=e.color.alpha;if(0<n&&n<1){var a=e._nodeCommands,o=a.length;if(!defined(a[0].translucentCommand)||i)for(var s=0;s<o;++s){var l,c=a[s],u=c.command;c.translucentCommand=deriveTranslucentCommand$1(u),r||(l=c.command2D,c.translucentCommand2D=deriveTranslucentCommand$1(l))}}}function getDisableCullingRenderState(e){var t=clone(e,!0);return t.cull.enabled=!1,RenderState.fromCache(t)}function deriveDisableCullingCommand(e){var t=DrawCommand.shallowClone(e);return t.renderState=getDisableCullingRenderState(e.renderState),t}function updateBackFaceCulling(e,t,i){var r=t.scene3DOnly;if(!e.backFaceCulling){var n=e._nodeCommands,a=n.length;if(!defined(n[0].disableCullingCommand)||i)for(var o=0;o<a;++o){var s,l=n[o],c=l.command;l.disableCullingCommand=deriveDisableCullingCommand(c),r||(s=l.command2D,l.disableCullingCommand2D=deriveDisableCullingCommand(s))}}}function getProgramId(e,t){var i=e._rendererResources.programs;for(var r in i)if(i.hasOwnProperty(r)&&i[r]===t)return r}function createSilhouetteProgram(e,t,i){var r=t.vertexShaderSource.sources[0],n=t._attributeLocations,a=e._normalAttributeName,r=ShaderSource.replaceMain(r,"gltf_silhouette_main");r+="uniform float gltf_silhouetteSize; \nvoid main() \n{ \n gltf_silhouette_main(); \n vec3 n = normalize(czm_normal3D * "+a+"); \n n.x *= czm_projection[0][0]; \n n.y *= czm_projection[1][1]; \n vec4 clip = gl_Position; \n clip.xy += n.xy * clip.w * gltf_silhouetteSize * czm_pixelRatio / czm_viewport.z; \n gl_Position = clip; \n}";return ShaderProgram.fromCache({context:i.context,vertexShaderSource:r,fragmentShaderSource:"uniform vec4 gltf_silhouetteColor; \nvoid main() \n{ \n gl_FragColor = czm_gammaCorrect(gltf_silhouetteColor); \n}",attributeLocations:n})}function hasSilhouette(e,t){return silhouetteSupported(t.context)&&0<e.silhouetteSize&&0<e.silhouetteColor.alpha&&defined(e._normalAttributeName)}function hasTranslucentCommands(e){for(var t=e._nodeCommands,i=t.length,r=0;r<i;++r){if(t[r].command.pass===Pass$1.TRANSLUCENT)return!0}return!1}function isTranslucent(e){return 0<e.color.alpha&&e.color.alpha<1}function isInvisible(e){return 0===e.color.alpha}function alphaDirty(e,t){return Math.floor(e)!==Math.floor(t)||Math.ceil(e)!==Math.ceil(t)}var silhouettesLength=0;function createSilhouetteCommands(e,t){for(var i=++silhouettesLength%255,r=hasTranslucentCommands(e)||isTranslucent(e)||e.silhouetteColor.alpha<1,n=e._rendererResources.silhouettePrograms,a=t.scene3DOnly,o=e._nodeCommands,s=o.length,l=0;l<s;++l){var c=o[l],u=c.command,d=isTranslucent(e)?c.translucentCommand:u,h=DrawCommand.shallowClone(d),p=clone(d.renderState);p.stencilTest={enabled:!0,frontFunction:WebGLConstants$1.ALWAYS,backFunction:WebGLConstants$1.ALWAYS,reference:i,mask:-1,frontOperation:{fail:WebGLConstants$1.KEEP,zFail:WebGLConstants$1.KEEP,zPass:WebGLConstants$1.REPLACE},backOperation:{fail:WebGLConstants$1.KEEP,zFail:WebGLConstants$1.KEEP,zPass:WebGLConstants$1.REPLACE}},isInvisible(e)&&(p.colorMask={red:!1,green:!1,blue:!1,alpha:!1},p.depthMask=!1),p=RenderState.fromCache(p),h.renderState=p,c.silhouetteModelCommand=h;var m=DrawCommand.shallowClone(u);(p=clone(u.renderState,!0)).depthTest.enabled=!0,p.cull.enabled=!1,r&&(m.pass=Pass$1.TRANSLUCENT,p.depthMask=!1,p.blending=BlendingState$1.ALPHA_BLEND),p.stencilTest={enabled:!0,frontFunction:WebGLConstants$1.NOTEQUAL,backFunction:WebGLConstants$1.NOTEQUAL,reference:i,mask:-1,frontOperation:{fail:WebGLConstants$1.KEEP,zFail:WebGLConstants$1.KEEP,zPass:WebGLConstants$1.KEEP},backOperation:{fail:WebGLConstants$1.KEEP,zFail:WebGLConstants$1.KEEP,zPass:WebGLConstants$1.KEEP}},p=RenderState.fromCache(p);var f=u.shaderProgram,g=getProgramId(e,f),_=n[g];defined(_)||(_=createSilhouetteProgram(e,f,t),n[g]=_);var y,v,C,S=combine(u.uniformMap,{gltf_silhouetteColor:createSilhouetteColorFunction(e),gltf_silhouetteSize:createSilhouetteSizeFunction(e)});m.renderState=p,m.shaderProgram=_,m.uniformMap=S,m.castShadows=!1,m.receiveShadows=!1,c.silhouetteColorCommand=m,a||(y=c.command2D,(v=DrawCommand.shallowClone(h)).boundingVolume=y.boundingVolume,v.modelMatrix=y.modelMatrix,c.silhouetteModelCommand2D=v,C=DrawCommand.shallowClone(m),v.boundingVolume=y.boundingVolume,v.modelMatrix=y.modelMatrix,c.silhouetteColorCommand2D=C)}}function modifyShaderForClippingPlanes(e,t,i){return e=ShaderSource.replaceMain(e,"gltf_clip_main"),e+=Model._getClippingFunction(t,i)+"\n",e+="uniform highp sampler2D gltf_clippingPlanes; \nuniform mat4 gltf_clippingPlanesMatrix; \nuniform vec4 gltf_clippingPlanesEdgeStyle; \nvoid main() \n{ \n gltf_clip_main(); \n"+getClipAndStyleCode("gltf_clippingPlanes","gltf_clippingPlanesMatrix","gltf_clippingPlanesEdgeStyle")+"} \n"}function updateSilhouette(e,t,i){var r,n;hasSilhouette(e,t)&&(r=e._nodeCommands,n=alphaDirty(e.color.alpha,e._colorPreviousAlpha)||alphaDirty(e.silhouetteColor.alpha,e._silhouetteColorPreviousAlpha)||!defined(r[0].silhouetteModelCommand),e._colorPreviousAlpha=e.color.alpha,e._silhouetteColorPreviousAlpha=e.silhouetteColor.alpha,(n||i)&&createSilhouetteCommands(e,t))}function updateClippingPlanes(e,t){var i=e._clippingPlanes;defined(i)&&i.owner===e&&i.enabled&&i.update(t)}var scratchBoundingSphere$3=new BoundingSphere;function scaleInPixels(e,t,i){return scratchBoundingSphere$3.center=e,scratchBoundingSphere$3.radius=t,i.camera.getPixelSize(scratchBoundingSphere$3,i.context.drawingBufferWidth,i.context.drawingBufferHeight)}var scratchPosition$6=new Cartesian3,scratchCartographic$3=new Cartographic;function getScale(e,t){var i,r,n,a,o,s,l,c,u=e.scale;return 0!==e.minimumPixelSize&&(i=t.context,r=Math.max(i.drawingBufferWidth,i.drawingBufferHeight),n=defined(e._clampedModelMatrix)?e._clampedModelMatrix:e.modelMatrix,scratchPosition$6.x=n[12],scratchPosition$6.y=n[13],scratchPosition$6.z=n[14],defined(e._rtcCenter)&&Cartesian3.add(e._rtcCenter,scratchPosition$6,scratchPosition$6),e._mode!==SceneMode$1.SCENE3D&&(o=(a=t.mapProjection).ellipsoid.cartesianToCartographic(scratchPosition$6,scratchCartographic$3),a.project(o,scratchPosition$6),Cartesian3.fromElements(scratchPosition$6.z,scratchPosition$6.x,scratchPosition$6.y,scratchPosition$6)),s=e.boundingSphere.radius,c=1/(l=scaleInPixels(scratchPosition$6,s,t)),Math.min(2*s*c,r)<e.minimumPixelSize&&(u=e.minimumPixelSize*l/(2*e._initialRadius))),defined(e.maximumScale)?Math.min(e.maximumScale,u):u}function releaseCachedGltf(e){defined(e._cacheKey)&&defined(e._cachedGltf)&&0==--e._cachedGltf.count&&delete gltfCache[e._cacheKey],e._cachedGltf=void 0}function CachedRendererResources(e,t){this.buffers=void 0,this.vertexArrays=void 0,this.programs=void 0,this.sourceShaders=void 0,this.silhouettePrograms=void 0,this.textures=void 0,this.samplers=void 0,this.renderStates=void 0,this.ready=!1,this.context=e,this.cacheKey=t,this.count=0}function destroy(e){for(var t in e)e.hasOwnProperty(t)&&e[t].destroy()}function destroyCachedRendererResources(e){destroy(e.buffers),destroy(e.vertexArrays),destroy(e.programs),destroy(e.silhouettePrograms),destroy(e.textures)}function getUpdateHeightCallback(r,n,a){return function(e){var t;r.heightReference===HeightReference$1.RELATIVE_TO_GROUND&&((t=n.cartesianToCartographic(e,scratchCartographic$3)).height+=a.height,n.cartographicToCartesian(t,e));var i=r._clampedModelMatrix;Matrix4.clone(r.modelMatrix,i),i[12]=e.x,i[13]=e.y,i[14]=e.z,r._heightChanged=!0}}function updateClamping(e){defined(e._removeUpdateHeightCallback)&&(e._removeUpdateHeightCallback(),e._removeUpdateHeightCallback=void 0);var t,i,r,n,a,o,s,l=e._scene;defined(l)&&defined(l.globe)&&e.heightReference!==HeightReference$1.NONE?(i=(t=l.globe).ellipsoid,r=e.modelMatrix,scratchPosition$6.x=r[12],scratchPosition$6.y=r[13],scratchPosition$6.z=r[14],n=i.cartesianToCartographic(scratchPosition$6),defined(e._clampedModelMatrix)||(e._clampedModelMatrix=Matrix4.clone(r,new Matrix4)),a=t._surface,e._removeUpdateHeightCallback=a.updateHeight(n,getUpdateHeightCallback(e,i,n)),defined(o=t.getHeight(n))&&(s=getUpdateHeightCallback(e,i,n),Cartographic.clone(n,scratchCartographic$3),scratchCartographic$3.height=o,i.cartographicToCartesian(scratchCartographic$3,scratchPosition$6),s(scratchPosition$6))):e._clampedModelMatrix=void 0}CachedRendererResources.prototype.release=function(){if(0==--this.count)return defined(this.cacheKey)&&delete this.context.cache.modelRendererResourceCache[this.cacheKey],destroyCachedRendererResources(this),destroyObject(this)};var scratchDisplayConditionCartesian=new Cartesian3,scratchDistanceDisplayConditionCartographic=new Cartographic;function distanceDisplayConditionVisible(e,t){var i,r,n,a,o=e.distanceDisplayCondition,s=o.near*o.near,l=o.far*o.far;return t.mode===SceneMode$1.SCENE2D?(i=.5*(t.camera.frustum.right-t.camera.frustum.left),i*=i):(a=Matrix4.getTranslation(e.modelMatrix,scratchDisplayConditionCartesian),t.mode===SceneMode$1.COLUMBUS_VIEW&&(n=(r=t.mapProjection).ellipsoid.cartesianToCartographic(a,scratchDistanceDisplayConditionCartographic),a=r.project(n,a),Cartesian3.fromElements(a.z,a.x,a.y,a)),i=Cartesian3.distanceSquared(a,t.camera.positionWC)),s<=i&&i<=l}function destroyIfNotCached(e,t){e.programs!==t.programs&&destroy(e.programs),e.silhouettePrograms!==t.silhouettePrograms&&destroy(e.silhouettePrograms)}function regenerateShaders(e,t){var i=e._rendererResources,r=e._cachedRendererResources;if(destroyIfNotCached(i,r),isClippingEnabled(e)||isColorShadingEnabled(e)||e._shouldRegenerateShaders){e._shouldRegenerateShaders=!1,i.programs={},i.silhouettePrograms={};var n={},a=e._sourceTechniques;for(var o in a)a.hasOwnProperty(o)&&(n[d=a[o].program]||(n[d]=!0,recreateProgram({programId:d,techniqueId:o},e,t.context)))}else i.programs=r.programs,i.silhouettePrograms=r.silhouettePrograms;for(var s=i.programs,l=e._nodeCommands,c=l.length,u=0;u<c;++u){var d,h=l[u],p=s[d=h.programId];h.command.shaderProgram=p,defined(h.command2D)&&(h.command2D.shaderProgram=p)}updateColor(e,t,!0),updateBackFaceCulling(e,t,!0),updateSilhouette(e,t,!0)}function Batched3DModel3DTileContent(e,t,i,r,n){this._tileset=e,this._tile=t,this._resource=i,this._model=void 0,this._batchTable=void 0,this._features=void 0,this._batchIdAttributeName=void 0,this._diffuseAttributeOrUniformName={},this._rtcCenterTransform=void 0,this._contentModelMatrix=void 0,this.featurePropertiesDirty=!1,initialize$2(this,r,n)}Model.prototype.update=function(e){if(e.mode!==SceneMode$1.MORPHING)if(FeatureDetection.supportsWebP.initialized){var t=FeatureDetection.supportsWebP(),i=e.context;if(this._defaultTexture=i.defaultTexture,this._state===ModelState$1.NEEDS_LOAD&&defined(this.gltf)){var r,n,a,o,s,l=this.cacheKey;if(defined(l)){i.cache.modelRendererResourceCache=defaultValue(i.cache.modelRendererResourceCache,{});var c,u=i.cache.modelRendererResourceCache;if(defined(c=u[this.cacheKey])){if(!c.ready)return;++c.count,this._loadRendererResourcesFromCache=!0}else(c=new CachedRendererResources(i,l)).count=1,u[this.cacheKey]=c;this._cachedRendererResources=c}else(c=new CachedRendererResources(i)).count=1,this._cachedRendererResources=c;this._state=ModelState$1.LOADING,this._state!==ModelState$1.FAILED&&(defined(r=this.gltf.extensions)&&defined(r.CESIUM_RTC)&&(n=Cartesian3.fromArray(r.CESIUM_RTC.center),Cartesian3.equals(n,Cartesian3.ZERO)||(this._rtcCenter3D=n,o=(a=e.mapProjection).ellipsoid.cartesianToCartographic(this._rtcCenter3D),s=a.project(o),Cartesian3.fromElements(s.z,s.x,s.y,s),this._rtcCenter2D=s,this._rtcCenterEye=new Cartesian3,this._rtcCenter=this._rtcCenter3D)),addPipelineExtras(this.gltf),this._loadResources=new ModelLoadResources,this._loadRendererResourcesFromCache||ModelUtility.parseBuffers(this,bufferLoad))}var d,h,p,m,f=this._loadResources,g=this._incrementallyLoadTextures,_=!1;this._state===ModelState$1.LOADING&&(0===f.pendingBufferLoads&&(f.initialized||(e.brdfLutGenerator.update(e),ModelUtility.checkSupportedExtensions(this.extensionsRequired,t),ModelUtility.updateForwardAxis(this),defined(this.gltf.extras.sourceVersion)||((d=this.gltf).extras.sourceVersion=ModelUtility.getAssetVersion(d),d.extras.sourceKHRTechniquesWebGL=defined(ModelUtility.getUsedExtensions(d).KHR_techniques_webgl),this._sourceVersion=d.extras.sourceVersion,this._sourceKHRTechniquesWebGL=d.extras.sourceKHRTechniquesWebGL,updateVersion(d),addDefaults(d),processModelMaterialsCommon(d,h={addBatchIdToGeneratedShaders:this._addBatchIdToGeneratedShaders}),processPbrMaterials(d,h)),this._sourceVersion=this.gltf.extras.sourceVersion,this._sourceKHRTechniquesWebGL=this.gltf.extras.sourceKHRTechniquesWebGL,this._dequantizeInShader=this._dequantizeInShader&&DracoLoader.hasExtension(this),addBuffersToLoadResources$1(this),parseArticulations(this),parseTechniques(this),this._loadRendererResourcesFromCache||(parseBufferViews$1(this),parseShaders(this),parsePrograms(this),parseTextures(this,i,t)),parseMaterials(this),parseMeshes(this),parseNodes(this),DracoLoader.parse(this,i),f.initialized=!0),f.finishedDecoding()||DracoLoader.decodeModel(this,i).otherwise(ModelUtility.getFailedLoadFunction(this,"model",this.basePath)),f.finishedDecoding()&&!f.resourcesParsed&&(this._boundingSphere=ModelUtility.computeBoundingSphere(this),this._initialRadius=this._boundingSphere.radius,DracoLoader.cacheDataForModel(this),f.resourcesParsed=!0),f.resourcesParsed&&0===f.pendingShaderLoads&&(ModelOutlineLoader.outlinePrimitives(this),createResources$1(this,e))),(f.finished()||g&&f.finishedEverythingButTextureCreation())&&(this._state=ModelState$1.LOADED,_=!0)),defined(f)&&this._state===ModelState$1.LOADED&&(g&&!_&&createResources$1(this,e),f.finished()&&(this._loadResources=void 0,p=this._rendererResources,(m=this._cachedRendererResources).buffers=p.buffers,m.vertexArrays=p.vertexArrays,m.programs=p.programs,m.sourceShaders=p.sourceShaders,m.silhouettePrograms=p.silhouettePrograms,m.textures=p.textures,m.samplers=p.samplers,m.renderStates=p.renderStates,m.ready=!0,this._normalAttributeName=ModelUtility.getAttributeOrUniformBySemantic(this.gltf,"NORMAL"),defined(this._precreatedAttributes)&&(m.vertexArrays={}),this.releaseGltfJson&&releaseCachedGltf(this)));var y,v=OctahedralProjectedCubeMap.isSupported(i);this._shouldUpdateSpecularMapAtlas&&v&&(this._shouldUpdateSpecularMapAtlas=!1,this._specularEnvironmentMapAtlas=this._specularEnvironmentMapAtlas&&this._specularEnvironmentMapAtlas.destroy(),this._specularEnvironmentMapAtlas=void 0,defined(this._specularEnvironmentMaps)&&(this._specularEnvironmentMapAtlas=new OctahedralProjectedCubeMap(this._specularEnvironmentMaps),(y=this)._specularEnvironmentMapAtlas.readyPromise.then(function(){y._shouldRegenerateShaders=!0}).otherwise(function(e){console.error("Error loading specularEnvironmentMaps: "+e)})),this._shouldRegenerateShaders=!0),defined(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.update(e);var C=!defined(this._specularEnvironmentMapAtlas)&&defined(e.specularEnvironmentMaps)&&!this._useDefaultSpecularMaps,S=!defined(e.specularEnvironmentMaps)&&this._useDefaultSpecularMaps,T=!defined(this._sphericalHarmonicCoefficients)&&defined(e.sphericalHarmonicCoefficients)&&!this._useDefaultSphericalHarmonics,x=!defined(e.sphericalHarmonicCoefficients)&&this._useDefaultSphericalHarmonics;this._shouldRegenerateShaders=this._shouldRegenerateShaders||C||S||T||x,this._useDefaultSpecularMaps=!defined(this._specularEnvironmentMapAtlas)&&defined(e.specularEnvironmentMaps),this._useDefaultSphericalHarmonics=!defined(this._sphericalHarmonicCoefficients)&&defined(e.sphericalHarmonicCoefficients);var b,E,P,A,w,D,M,I,R,O,L,F,N,B,V=hasSilhouette(this,e),k=isTranslucent(this),z=isInvisible(this),$=this.backFaceCulling,U=!defined(this.distanceDisplayCondition)||distanceDisplayConditionVisible(this,e),G=this.show&&U&&0!==this.scale&&(!z||V);if((G&&this._state===ModelState$1.LOADED||_)&&(b=this.activeAnimations.update(e)||this._cesiumAnimationsDirty,this._cesiumAnimationsDirty=!1,this._dirty=!1,E=this.modelMatrix,P=e.mode!==this._mode,this._mode=e.mode,((A=!Matrix4.equals(this._modelMatrix,E)||this._scale!==this.scale||this._minimumPixelSize!==this.minimumPixelSize||0!==this.minimumPixelSize||this._maximumScale!==this.maximumScale||this._heightReference!==this.heightReference||this._heightChanged||P)||_)&&(Matrix4.clone(E,this._modelMatrix),updateClamping(this),defined(this._clampedModelMatrix)&&(E=this._clampedModelMatrix),this._scale=this.scale,this._minimumPixelSize=this.minimumPixelSize,this._maximumScale=this.maximumScale,this._heightReference=this.heightReference,this._heightChanged=!1,w=getScale(this,e),D=this._computedModelMatrix,Matrix4.multiplyByUniformScale(E,w,D),this._upAxis===Axis$1.Y?Matrix4.multiplyTransformation(D,Axis$1.Y_UP_TO_Z_UP,D):this._upAxis===Axis$1.X&&Matrix4.multiplyTransformation(D,Axis$1.X_UP_TO_Z_UP,D),this.forwardAxis===Axis$1.Z&&Matrix4.multiplyTransformation(D,Axis$1.Z_UP_TO_X_UP,D)),(b||A||_)&&(updateNodeHierarchyModelMatrix(this,A,_,e.mapProjection),this._dirty=!0,(b||_)&&applySkins(this)),this._perNodeShowDirty&&(this._perNodeShowDirty=!1,updatePerNodeShow(this)),updatePickIds(this),updateWireframe$1(this),updateShowBoundingVolume(this),updateShadows(this),updateClippingPlanes(this,e),I=0,R=defined(M=this._clippingPlanes)&&M.enabled&&0<M.length,O=defined(this._sphericalHarmonicCoefficients)||this._useDefaultSphericalHarmonics,L=defined(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.ready||this._useDefaultSpecularMaps,(R||O||L)&&(F=defaultValue(this.clippingPlanesOriginMatrix,E),Matrix4.multiply(i.uniformState.view3D,F,this._clippingPlaneModelViewMatrix)),R&&(I=M.clippingPlanesState),N=(N=this._shouldRegenerateShaders)||this._clippingPlanesState!==I,this._clippingPlanesState=I,(B=isColorShadingEnabled(this))!==this._colorShadingEnabled&&(this._colorShadingEnabled=B,N=!0),N?regenerateShaders(this,e):(updateColor(this,e,!1),updateBackFaceCulling(this,e,!1),updateSilhouette(this,e,!1))),_){var H=this;e.afterRender.push(function(){H._ready=!0,H._readyPromise.resolve(H)})}else{if(G&&!this._ignoreCommands){var W,q,j,Y,X,Q=e.commandList,J=e.passes,Z=this._nodeCommands,K=Z.length,ee=e.mapProjection.ellipsoid.maximumRadius*CesiumMath.PI;if(J.render||J.pick&&this.allowPicking){for(W=0;W<K;++W){(X=Z[W]).show&&(j=X.command,V?j=X.silhouetteModelCommand:k?j=X.translucentCommand:$||(j=X.disableCullingCommand),Q.push(j),q=X.command.boundingVolume,e.mode===SceneMode$1.SCENE2D&&(q.center.y+q.radius>ee||q.center.y-q.radius<ee)&&(Y=X.command2D,V?Y=X.silhouetteModelCommand2D:k?Y=X.translucentCommand2D:$||(Y=X.disableCullingCommand2D),Q.push(Y)))}if(V&&!J.pick)for(W=0;W<K;++W)(X=Z[W]).show&&(Q.push(X.silhouetteColorCommand),q=X.command.boundingVolume,e.mode===SceneMode$1.SCENE2D&&(q.center.y+q.radius>ee||q.center.y-q.radius<ee)&&Q.push(X.silhouetteColorCommand2D))}}var te=this._credit;defined(te)&&e.creditDisplay.addCredit(te);for(var ie=this._resourceCredits,re=ie.length,ne=0;ne<re;ne++)e.creditDisplay.addCredit(ie[ne])}}else FeatureDetection.supportsWebP.initialize()},Model.prototype.isDestroyed=function(){return!1},Model.prototype.destroy=function(){defined(this._precreatedAttributes)&&destroy(this._rendererResources.vertexArrays),defined(this._removeUpdateHeightCallback)&&(this._removeUpdateHeightCallback(),this._removeUpdateHeightCallback=void 0),defined(this._terrainProviderChangedCallback)&&(this._terrainProviderChangedCallback(),this._terrainProviderChangedCallback=void 0),defined(this._cachedRendererResources)&&destroyIfNotCached(this._rendererResources,this._cachedRendererResources),this._rendererResources=void 0,this._cachedRendererResources=this._cachedRendererResources&&this._cachedRendererResources.release(),DracoLoader.destroyCachedDataForModel(this);for(var e=this._pickIds,t=e.length,i=0;i<t;++i)e[i].destroy();releaseCachedGltf(this),this._quantizedVertexShaders=void 0;var r=this._clippingPlanes;return defined(r)&&!r.isDestroyed()&&r.owner===this&&r.destroy(),this._clippingPlanes=void 0,this._specularEnvironmentMapAtlas=this._specularEnvironmentMapAtlas&&this._specularEnvironmentMapAtlas.destroy(),destroyObject(this)},Model._getClippingFunction=getClippingFunction,Model._modifyShaderForColor=modifyShaderForColor,Batched3DModel3DTileContent._deprecationWarning=deprecationWarning,Object.defineProperties(Batched3DModel3DTileContent.prototype,{featuresLength:{get:function(){return this._batchTable.featuresLength}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return this._model.trianglesLength}},geometryByteLength:{get:function(){return this._model.geometryByteLength}},texturesByteLength:{get:function(){return this._model.texturesByteLength}},batchTableByteLength:{get:function(){return this._batchTable.memorySizeInBytes}},innerContents:{get:function(){}},readyPromise:{get:function(){return this._model.readyPromise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){return this._batchTable}}});var sizeOfUint32$3=Uint32Array.BYTES_PER_ELEMENT;function getBatchIdAttributeName(e){var t=ModelUtility.getAttributeOrUniformBySemantic(e,"_BATCHID");return defined(t)||defined(t=ModelUtility.getAttributeOrUniformBySemantic(e,"BATCHID"))&&Batched3DModel3DTileContent._deprecationWarning("b3dm-legacy-batchid","The glTF in this b3dm uses the semantic `BATCHID`. Application-specific semantics should be prefixed with an underscore: `_BATCHID`."),t}function getVertexShaderCallback(o){return function(e,t){var i=o._batchTable,r=!defined(o._tileset.classificationType),n=o._model.gltf;defined(n)&&(o._batchIdAttributeName=getBatchIdAttributeName(n),o._diffuseAttributeOrUniformName[t]=ModelUtility.getDiffuseAttributeOrUniform(n,t));var a=i.getVertexShaderCallback(r,o._batchIdAttributeName,o._diffuseAttributeOrUniformName[t]);return defined(a)?a(e):e}}function getFragmentShaderCallback(o){return function(e,t){var i=o._batchTable,r=!defined(o._tileset.classificationType),n=o._model.gltf;defined(n)&&(o._diffuseAttributeOrUniformName[t]=ModelUtility.getDiffuseAttributeOrUniform(n,t));var a=i.getFragmentShaderCallback(r,o._diffuseAttributeOrUniformName[t]);return defined(a)?a(e):e}}function getPickIdCallback(e){return function(){return e._batchTable.getPickId()}}function getClassificationFragmentShaderCallback(i){return function(e){var t=i._batchTable.getClassificationFragmentShaderCallback();return defined(t)?t(e):e}}function createColorChangedCallback(i){return function(e,t){i._model.updateCommands(e,t)}}function initialize$2(e,t,i){var r=e._tileset,n=e._tile,a=e._resource,o=defaultValue(i,0);i=o;var s=new Uint8Array(t),l=new DataView(t);i+=sizeOfUint32$3;var c=l.getUint32(i,!0);if(1!==c)throw new RuntimeError("Only Batched 3D Model version 1 is supported. Version "+c+" is not.");i+=sizeOfUint32$3;var u=l.getUint32(i,!0);i+=sizeOfUint32$3;var d=l.getUint32(i,!0);i+=sizeOfUint32$3;var h=l.getUint32(i,!0);i+=sizeOfUint32$3;var p=l.getUint32(i,!0);i+=sizeOfUint32$3;var m,f,g=l.getUint32(i,!0);i+=sizeOfUint32$3,570425344<=p?(i-=2*sizeOfUint32$3,x=d,p=h,h=d=g=0,Batched3DModel3DTileContent._deprecationWarning("b3dm-legacy-header","This b3dm header is using the legacy format [batchLength] [batchTableByteLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/master/specification/TileFormats/Batched3DModel.")):570425344<=g&&(i-=sizeOfUint32$3,x=p,p=d,g=h,h=d=0,Batched3DModel3DTileContent._deprecationWarning("b3dm-legacy-header","This b3dm header is using the legacy format [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/master/specification/TileFormats/Batched3DModel.")),0===d?f={BATCH_LENGTH:defaultValue(x,0)}:(m=getStringFromTypedArray(s,i,d),f=JSON.parse(m),i+=d);var _=new Uint8Array(t,i,h);i+=h;var y,v,C,S,T=new Cesium3DTileFeatureTable(f,_),x=T.getGlobalProperty("BATCH_LENGTH");T.featuresLength=x,0<p&&(v=getStringFromTypedArray(s,i,p),C=JSON.parse(v),i+=p,0<g&&(y=new Uint8Array(t,i,g),y=new Uint8Array(y),i+=g)),defined(r.classificationType)&&(S=createColorChangedCallback(e));var b=new Cesium3DTileBatchTable(e,x,C,y,S);e._batchTable=b;var E,P=o+u-i;if(0==P)throw new RuntimeError("glTF byte length must be greater than 0.");E=i%4==0?new Uint8Array(t,i,P):(Batched3DModel3DTileContent._deprecationWarning("b3dm-glb-unaligned","The embedded glb is not aligned to a 4-byte boundary."),new Uint8Array(s.subarray(i,i+P)));var A={content:e,primitive:r};e._rtcCenterTransform=Matrix4.IDENTITY;var w=T.getGlobalProperty("RTC_CENTER",ComponentDatatype$1.FLOAT,3);defined(w)&&(e._rtcCenterTransform=Matrix4.fromTranslation(Cartesian3.fromArray(w))),e._contentModelMatrix=Matrix4.multiply(n.computedTransform,e._rtcCenterTransform,new Matrix4),defined(r.classificationType)?e._model=new ClassificationModel({gltf:E,cull:!1,basePath:a,requestType:RequestType$1.TILES3D,modelMatrix:e._contentModelMatrix,upAxis:r._gltfUpAxis,forwardAxis:Axis$1.X,debugWireframe:r.debugWireframe,vertexShaderLoaded:getVertexShaderCallback(e),classificationShaderLoaded:getClassificationFragmentShaderCallback(e),uniformMapLoaded:b.getUniformMapCallback(),pickIdLoaded:getPickIdCallback(e),classificationType:r._classificationType,batchTable:b}):(e._model=new Model({gltf:E,cull:!1,releaseGltfJson:!0,opaquePass:Pass$1.CESIUM_3D_TILE,basePath:a,requestType:RequestType$1.TILES3D,modelMatrix:e._contentModelMatrix,upAxis:r._gltfUpAxis,forwardAxis:Axis$1.X,shadows:r.shadows,debugWireframe:r.debugWireframe,incrementallyLoadTextures:!1,vertexShaderLoaded:getVertexShaderCallback(e),fragmentShaderLoaded:getFragmentShaderCallback(e),uniformMapLoaded:b.getUniformMapCallback(),pickIdLoaded:getPickIdCallback(e),addBatchIdToGeneratedShaders:0<x,pickObject:A,imageBasedLightingFactor:r.imageBasedLightingFactor,lightColor:r.lightColor,luminanceAtZenith:r.luminanceAtZenith,sphericalHarmonicCoefficients:r.sphericalHarmonicCoefficients,specularEnvironmentMaps:r.specularEnvironmentMaps,backFaceCulling:r.backFaceCulling}),e._model.readyPromise.then(function(e){e.activeAnimations.addAll({loop:ModelAnimationLoop$1.REPEAT})}))}function createFeatures(e){var t=e.featuresLength;if(!defined(e._features)&&0<t){for(var i=new Array(t),r=0;r<t;++r)i[r]=new Cesium3DTileFeature(e,r);e._features=i}}function Composite3DTileContent(e,t,i,r,n,a){this._tileset=e,this._tile=t,this._resource=i,this._contents=[],this._readyPromise=when.defer(),initialize$3(this,r,n,a)}Batched3DModel3DTileContent.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)},Batched3DModel3DTileContent.prototype.getFeature=function(e){return createFeatures(this),this._features[e]},Batched3DModel3DTileContent.prototype.applyDebugSettings=function(e,t){t=e?t:Color.WHITE,0===this.featuresLength?this._model.color=t:this._batchTable.setAllColor(t)},Batched3DModel3DTileContent.prototype.applyStyle=function(e){var t,i;0===this.featuresLength?(t=defined(e)&&defined(e.color),i=defined(e)&&defined(e.show),this._model.color=t?e.color.evaluateColor(void 0,this._model.color):Color.clone(Color.WHITE,this._model.color),this._model.show=!i||e.show.evaluate(void 0)):this._batchTable.applyStyle(e)},Batched3DModel3DTileContent.prototype.update=function(e,t){var i=t.commandList.length;this._batchTable.update(e,t),this._contentModelMatrix=Matrix4.multiply(this._tile.computedTransform,this._rtcCenterTransform,this._contentModelMatrix),this._model.modelMatrix=this._contentModelMatrix,this._model.shadows=this._tileset.shadows,this._model.imageBasedLightingFactor=this._tileset.imageBasedLightingFactor,this._model.lightColor=this._tileset.lightColor,this._model.luminanceAtZenith=this._tileset.luminanceAtZenith,this._model.sphericalHarmonicCoefficients=this._tileset.sphericalHarmonicCoefficients,this._model.specularEnvironmentMaps=this._tileset.specularEnvironmentMaps,this._model.backFaceCulling=this._tileset.backFaceCulling,this._model.debugWireframe=this._tileset.debugWireframe;var r=this._tileset.clippingPlanes;this._model.clippingPlanesOriginMatrix=this._tileset.clippingPlanesOriginMatrix,defined(r)&&this._tile.clippingPlanesDirty&&(this._model._clippingPlanes=r.enabled&&this._tile._isClipped?r:void 0),defined(r)&&defined(this._model._clippingPlanes)&&this._model._clippingPlanes!==r&&(this._model._clippingPlanes=r),this._model.update(t),i<t.commandList.length&&(t.passes.render||t.passes.pick)&&!defined(e.classificationType)&&this._batchTable.addDerivedCommands(t,i)},Batched3DModel3DTileContent.prototype.isDestroyed=function(){return!1},Batched3DModel3DTileContent.prototype.destroy=function(){return this._model=this._model&&this._model.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),destroyObject(this)},Object.defineProperties(Composite3DTileContent.prototype,{featurePropertiesDirty:{get:function(){for(var e=this._contents,t=e.length,i=0;i<t;++i)if(e[i].featurePropertiesDirty)return!0;return!1},set:function(e){for(var t=this._contents,i=t.length,r=0;r<i;++r)t[r].featurePropertiesDirty=e}},featuresLength:{get:function(){return 0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return 0}},geometryByteLength:{get:function(){return 0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return 0}},innerContents:{get:function(){return this._contents}},readyPromise:{get:function(){return this._readyPromise.promise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){}}});var sizeOfUint32$4=Uint32Array.BYTES_PER_ELEMENT;function initialize$3(t,e,i,r){i=defaultValue(i,0);var n=new Uint8Array(e),a=new DataView(e);i+=sizeOfUint32$4;var o=a.getUint32(i,!0);if(1!==o)throw new RuntimeError("Only Composite Tile version 1 is supported. Version "+o+" is not.");i+=sizeOfUint32$4,i+=sizeOfUint32$4;var s=a.getUint32(i,!0);i+=sizeOfUint32$4;for(var l=[],c=0;c<s;++c){var u=getMagic(n,i),d=a.getUint32(i+2*sizeOfUint32$4,!0),h=r[u];if(!defined(h))throw new RuntimeError("Unknown tile content type, "+u+", inside Composite tile");var p=h(t._tileset,t._tile,t._resource,e,i);t._contents.push(p),l.push(p.readyPromise),i+=d}when.all(l).then(function(){t._readyPromise.resolve(t)}).otherwise(function(e){t._readyPromise.reject(e)})}function Vector3DTileGeometry(e){this._boxes=e.boxes,this._boxBatchIds=e.boxBatchIds,this._cylinders=e.cylinders,this._cylinderBatchIds=e.cylinderBatchIds,this._ellipsoids=e.ellipsoids,this._ellipsoidBatchIds=e.ellipsoidBatchIds,this._spheres=e.spheres,this._sphereBatchIds=e.sphereBatchIds,this._modelMatrix=e.modelMatrix,this._batchTable=e.batchTable,this._boundingVolume=e.boundingVolume,this._center=e.center,defined(this._center)||(defined(this._boundingVolume)?this._center=Cartesian3.clone(this._boundingVolume.center):this._center=Cartesian3.clone(Cartesian3.ZERO)),this._boundingVolumes=void 0,this._batchedIndices=void 0,this._indices=void 0,this._indexOffsets=void 0,this._indexCounts=void 0,this._positions=void 0,this._vertexBatchIds=void 0,this._batchIds=void 0,this._batchTableColors=void 0,this._packedBuffer=void 0,this._ready=!1,this._readyPromise=when.defer(),this._verticesPromise=void 0,this._primitive=void 0,this.debugWireframe=!1,this.forceRebatch=!1,this.classificationType=ClassificationType$1.BOTH}function packBuffer(e){var t=new Float64Array(Matrix4.packedLength+Cartesian3.packedLength),i=0;return Cartesian3.pack(e._center,t,0),i+=Cartesian3.packedLength,Matrix4.pack(e._modelMatrix,t,i),t}function unpackBuffer(e,t){for(var i=0,r=t[i++],n=t[i++],a=e._boundingVolumes=new Array(n),o=0;o<n;++o)a[o]=BoundingSphere.unpack(t,i),i+=BoundingSphere.packedLength;for(var s=t[i++],l=e._batchedIndices=new Array(s),c=0;c<s;++c){var u=Color.unpack(t,i);i+=Color.packedLength;for(var d=t[i++],h=t[i++],p=t[i++],m=new Array(p),f=0;f<p;++f)m[f]=t[i++];l[c]=new Vector3DTileBatch({color:u,offset:d,count:h,batchIds:m})}return r}Composite3DTileContent.prototype.hasProperty=function(e,t){return!1},Composite3DTileContent.prototype.getFeature=function(e){},Composite3DTileContent.prototype.applyDebugSettings=function(e,t){for(var i=this._contents,r=i.length,n=0;n<r;++n)i[n].applyDebugSettings(e,t)},Composite3DTileContent.prototype.applyStyle=function(e){for(var t=this._contents,i=t.length,r=0;r<i;++r)t[r].applyStyle(e)},Composite3DTileContent.prototype.update=function(e,t){for(var i=this._contents,r=i.length,n=0;n<r;++n)i[n].update(e,t)},Composite3DTileContent.prototype.isDestroyed=function(){return!1},Composite3DTileContent.prototype.destroy=function(){for(var e=this._contents,t=e.length,i=0;i<t;++i)e[i].destroy();return destroyObject(this)},Object.defineProperties(Vector3DTileGeometry.prototype,{trianglesLength:{get:function(){return defined(this._primitive)?this._primitive.trianglesLength:0}},geometryByteLength:{get:function(){return defined(this._primitive)?this._primitive.geometryByteLength:0}},readyPromise:{get:function(){return this._readyPromise.promise}}}),Vector3DTileGeometry.packedBoxLength=Matrix4.packedLength+Cartesian3.packedLength,Vector3DTileGeometry.packedCylinderLength=Matrix4.packedLength+2,Vector3DTileGeometry.packedEllipsoidLength=Matrix4.packedLength+Cartesian3.packedLength,Vector3DTileGeometry.packedSphereLength=Cartesian3.packedLength+1;var createVerticesTaskProcessor=new TaskProcessor("createVectorTileGeometries"),scratchColor$4=new Color;function createPrimitive$1(r){if(!defined(r._primitive)){if(!defined(r._verticesPromise)){var e=r._boxes,t=r._boxBatchIds,i=r._cylinders,n=r._cylinderBatchIds,a=r._ellipsoids,o=r._ellipsoidBatchIds,s=r._spheres,l=r._sphereBatchIds,c=r._batchTableColors,u=r._packedBuffer;if(!defined(c)){var d=0;defined(r._boxes)&&(e=r._boxes=arraySlice(e),d+=(t=r._boxBatchIds=arraySlice(t)).length),defined(r._cylinders)&&(i=r._cylinders=arraySlice(i),d+=(n=r._cylinderBatchIds=arraySlice(n)).length),defined(r._ellipsoids)&&(a=r._ellipsoids=arraySlice(a),d+=(o=r._ellipsoidBatchIds=arraySlice(o)).length),defined(r._spheres)&&(s=r._sphere=arraySlice(s),d+=(l=r._sphereBatchIds=arraySlice(l)).length),c=r._batchTableColors=new Uint32Array(d);for(var h=r._batchTable,p=0;p<d;++p){var m=h.getColor(p,scratchColor$4);c[p]=m.toRgba()}u=r._packedBuffer=packBuffer(r)}var f=[];defined(e)&&f.push(e.buffer,t.buffer),defined(i)&&f.push(i.buffer,n.buffer),defined(a)&&f.push(a.buffer,o.buffer),defined(s)&&f.push(s.buffer,l.buffer),f.push(c.buffer,u.buffer);var g={boxes:defined(e)?e.buffer:void 0,boxBatchIds:defined(e)?t.buffer:void 0,cylinders:defined(i)?i.buffer:void 0,cylinderBatchIds:defined(i)?n.buffer:void 0,ellipsoids:defined(a)?a.buffer:void 0,ellipsoidBatchIds:defined(a)?o.buffer:void 0,spheres:defined(s)?s.buffer:void 0,sphereBatchIds:defined(s)?l.buffer:void 0,batchTableColors:c.buffer,packedBuffer:u.buffer},_=r._verticesPromise=createVerticesTaskProcessor.scheduleTask(g,f);if(!defined(_))return;_.then(function(e){var t=new Float64Array(e.packedBuffer),i=unpackBuffer(r,t);r._indices=new(2===i?Uint16Array:Uint32Array)(e.indices),r._indexOffsets=new Uint32Array(e.indexOffsets),r._indexCounts=new Uint32Array(e.indexCounts),r._positions=new Float32Array(e.positions),r._vertexBatchIds=new Uint16Array(e.vertexBatchIds),r._batchIds=new Uint16Array(e.batchIds),r._ready=!0})}r._ready&&!defined(r._primitive)&&(r._primitive=new Vector3DTilePrimitive({batchTable:r._batchTable,positions:r._positions,batchIds:r._batchIds,vertexBatchIds:r._vertexBatchIds,indices:r._indices,indexOffsets:r._indexOffsets,indexCounts:r._indexCounts,batchedIndices:r._batchedIndices,boundingVolume:r._boundingVolume,boundingVolumes:r._boundingVolumes,center:r._center,pickObject:defaultValue(r._pickObject,r)}),r._boxes=void 0,r._boxBatchIds=void 0,r._cylinders=void 0,r._cylinderBatchIds=void 0,r._ellipsoids=void 0,r._ellipsoidBatchIds=void 0,r._spheres=void 0,r._sphereBatchIds=void 0,r._center=void 0,r._modelMatrix=void 0,r._batchTable=void 0,r._boundingVolume=void 0,r._boundingVolumes=void 0,r._batchedIndices=void 0,r._indices=void 0,r._indexOffsets=void 0,r._indexCounts=void 0,r._positions=void 0,r._vertexBatchIds=void 0,r._batchIds=void 0,r._batchTableColors=void 0,r._packedBuffer=void 0,r._verticesPromise=void 0,r._readyPromise.resolve())}}function Geometry3DTileContent(e,t,i,r,n){this._tileset=e,this._tile=t,this._resource=i,this._geometries=void 0,this._contentReadyPromise=void 0,this._readyPromise=when.defer(),this._batchTable=void 0,this._features=void 0,this.featurePropertiesDirty=!1,initialize$4(this,r,n)}function createColorChangedCallback$1(i){return function(e,t){defined(i._geometries)&&i._geometries.updateCommands(e,t)}}function getBatchIds(e,t){var i,r,n,a,o,s,l,c,u,d=defaultValue(e.BOXES_LENGTH,0),h=defaultValue(e.CYLINDERS_LENGTH,0),p=defaultValue(e.ELLIPSOIDS_LENGTH,0),m=defaultValue(e.SPHERES_LENGTH,0);0<d&&defined(e.BOX_BATCH_IDS)&&(r=t.byteOffset+e.BOX_BATCH_IDS.byteOffset,n=new Uint16Array(t.buffer,r,d)),0<h&&defined(e.CYLINDER_BATCH_IDS)&&(a=t.byteOffset+e.CYLINDER_BATCH_IDS.byteOffset,o=new Uint16Array(t.buffer,a,h)),0<p&&defined(e.ELLIPSOID_BATCH_IDS)&&(s=t.byteOffset+e.ELLIPSOID_BATCH_IDS.byteOffset,l=new Uint16Array(t.buffer,s,p)),0<m&&defined(e.SPHERE_BATCH_IDS)&&(c=t.byteOffset+e.SPHERE_BATCH_IDS.byteOffset,u=new Uint16Array(t.buffer,c,m));var f=defined(n)||defined(o)||defined(l)||defined(u),g=0<d&&!defined(n)||0<h&&!defined(o)||0<p&&!defined(l)||0<m&&!defined(u);if(f&&g)throw new RuntimeError("If one group of batch ids is defined, then all batch ids must be defined.");if(!(defined(n)||defined(o)||defined(l)||defined(u))){var _=0;if(!defined(n)&&0<d)for(n=new Uint16Array(d),i=0;i<d;++i)n[i]=_++;if(!defined(o)&&0<h)for(o=new Uint16Array(h),i=0;i<h;++i)o[i]=_++;if(!defined(l)&&0<p)for(l=new Uint16Array(p),i=0;i<p;++i)l[i]=_++;if(!defined(u)&&0<m)for(u=new Uint16Array(m),i=0;i<m;++i)u[i]=_++}return{boxes:n,cylinders:o,ellipsoids:l,spheres:u}}Vector3DTileGeometry.prototype.createFeatures=function(e,t){this._primitive.createFeatures(e,t)},Vector3DTileGeometry.prototype.applyDebugSettings=function(e,t){this._primitive.applyDebugSettings(e,t)},Vector3DTileGeometry.prototype.applyStyle=function(e,t){this._primitive.applyStyle(e,t)},Vector3DTileGeometry.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)},Vector3DTileGeometry.prototype.update=function(e){createPrimitive$1(this),this._ready&&(this._primitive.debugWireframe=this.debugWireframe,this._primitive.forceRebatch=this.forceRebatch,this._primitive.classificationType=this.classificationType,this._primitive.update(e))},Vector3DTileGeometry.prototype.isDestroyed=function(){return!1},Vector3DTileGeometry.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),destroyObject(this)},Object.defineProperties(Geometry3DTileContent.prototype,{featuresLength:{get:function(){return defined(this._batchTable)?this._batchTable.featuresLength:0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return defined(this._geometries)?this._geometries.trianglesLength:0}},geometryByteLength:{get:function(){return defined(this._geometries)?this._geometries.geometryByteLength:0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return defined(this._batchTable)?this._batchTable.memorySizeInBytes:0}},innerContents:{get:function(){}},readyPromise:{get:function(){return this._readyPromise.promise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){return this._batchTable}}});var sizeOfUint32$5=Uint32Array.BYTES_PER_ELEMENT;function initialize$4(e,t,i){i=defaultValue(i,0);var r=new Uint8Array(t),n=new DataView(t);i+=sizeOfUint32$5;var a=n.getUint32(i,!0);if(1!==a)throw new RuntimeError("Only Geometry tile version 1 is supported. Version "+a+" is not.");i+=sizeOfUint32$5;var o=n.getUint32(i,!0);if(i+=sizeOfUint32$5,0!==o){var s=n.getUint32(i,!0);if(i+=sizeOfUint32$5,0===s)throw new RuntimeError("Feature table must have a byte length greater than zero");var l=n.getUint32(i,!0);i+=sizeOfUint32$5;var c=n.getUint32(i,!0);i+=sizeOfUint32$5;var u=n.getUint32(i,!0),d=getStringFromTypedArray(r,i+=sizeOfUint32$5,s),h=JSON.parse(d);i+=s;var p,m,f,g=new Uint8Array(t,i,l);i+=l,0<c&&(m=getStringFromTypedArray(r,i,c),f=JSON.parse(m),i+=c,0<u&&(p=new Uint8Array(t,i,u),p=new Uint8Array(p)));var _,y,v,C,S,T,x,b,E,P,A,w=defaultValue(h.BOXES_LENGTH,0),D=defaultValue(h.CYLINDERS_LENGTH,0),M=defaultValue(h.ELLIPSOIDS_LENGTH,0),I=defaultValue(h.SPHERES_LENGTH,0),R=w+D+M+I,O=new Cesium3DTileBatchTable(e,R,f,p,createColorChangedCallback$1(e));e._batchTable=O,0!==R&&(_=e.tile.computedTransform,defined(h.RTC_CENTER)&&(y=Cartesian3.unpack(h.RTC_CENTER),Matrix4.multiplyByPoint(_,y,y)),v=getBatchIds(h,g),(0<w||0<D||0<M||0<I)&&(0<w&&(C=g.byteOffset+h.BOXES.byteOffset,S=new Float32Array(g.buffer,C,Vector3DTileGeometry.packedBoxLength*w)),0<D&&(T=g.byteOffset+h.CYLINDERS.byteOffset,x=new Float32Array(g.buffer,T,Vector3DTileGeometry.packedCylinderLength*D)),0<M&&(b=g.byteOffset+h.ELLIPSOIDS.byteOffset,E=new Float32Array(g.buffer,b,Vector3DTileGeometry.packedEllipsoidLength*M)),0<I&&(P=g.byteOffset+h.SPHERES.byteOffset,A=new Float32Array(g.buffer,P,Vector3DTileGeometry.packedSphereLength*I)),e._geometries=new Vector3DTileGeometry({boxes:S,boxBatchIds:v.boxes,cylinders:x,cylinderBatchIds:v.cylinders,ellipsoids:E,ellipsoidBatchIds:v.ellipsoids,spheres:A,sphereBatchIds:v.spheres,center:y,modelMatrix:_,batchTable:O,boundingVolume:e.tile.boundingVolume.boundingVolume})))}else e._readyPromise.resolve(e)}function createFeatures$1(e){var t,i=e.featuresLength;!defined(e._features)&&0<i&&(t=new Array(i),defined(e._geometries)&&e._geometries.createFeatures(e,t),e._features=t)}function ModelInstance(e,t,i){this.primitive=e,this._modelMatrix=Matrix4.clone(t),this._instanceId=i}Geometry3DTileContent.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)},Geometry3DTileContent.prototype.getFeature=function(e){return createFeatures$1(this),this._features[e]},Geometry3DTileContent.prototype.applyDebugSettings=function(e,t){defined(this._geometries)&&this._geometries.applyDebugSettings(e,t)},Geometry3DTileContent.prototype.applyStyle=function(e){createFeatures$1(this),defined(this._geometries)&&this._geometries.applyStyle(e,this._features)},Geometry3DTileContent.prototype.update=function(e,t){var i;defined(this._geometries)&&(this._geometries.classificationType=this._tileset.classificationType,this._geometries.debugWireframe=this._tileset.debugWireframe,this._geometries.update(t)),defined(this._batchTable)&&this._geometries._ready&&this._batchTable.update(e,t),defined(this._contentReadyPromise)||((i=this)._contentReadyPromise=this._geometries.readyPromise.then(function(){i._readyPromise.resolve(i)}))},Geometry3DTileContent.prototype.isDestroyed=function(){return!1},Geometry3DTileContent.prototype.destroy=function(){return this._geometries=this._geometries&&this._geometries.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),destroyObject(this)},Object.defineProperties(ModelInstance.prototype,{instanceId:{get:function(){return this._instanceId}},model:{get:function(){return this.primitive._model}},modelMatrix:{get:function(){return Matrix4.clone(this._modelMatrix)},set:function(e){Matrix4.clone(e,this._modelMatrix),this.primitive.expandBoundingSphere(this._modelMatrix),this.primitive._dirty=!0}}});var LoadState={NEEDS_LOAD:0,LOADING:1,LOADED:2,FAILED:3};function ModelInstanceCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.show=defaultValue(e.show,!0),this._instancingSupported=!1,this._dynamic=defaultValue(e.dynamic,!1),this._allowPicking=defaultValue(e.allowPicking,!0),this._ready=!1,this._readyPromise=when.defer(),this._state=LoadState.NEEDS_LOAD,this._dirty=!1,this._cull=defaultValue(e.cull,!0),this._opaquePass=defaultValue(e.opaquePass,Pass$1.OPAQUE),this._instances=createInstances(this,e.instances),this._batchTable=e.batchTable,this._model=void 0,this._vertexBufferTypedArray=void 0,this._vertexBuffer=void 0,this._batchIdBuffer=void 0,this._instancedUniformsByProgram=void 0,this._drawCommands=[],this._modelCommands=void 0,this._renderStates=void 0,this._disableCullingRenderStates=void 0,this._boundingSphere=createBoundingSphere(this),this._center=Cartesian3.clone(this._boundingSphere.center),this._rtcTransform=new Matrix4,this._rtcModelView=new Matrix4,this._mode=void 0,this.modelMatrix=Matrix4.clone(Matrix4.IDENTITY),this._modelMatrix=Matrix4.clone(this.modelMatrix),this._url=Resource.createIfNeeded(e.url),this._requestType=e.requestType,this._gltf=e.gltf,this._basePath=Resource.createIfNeeded(e.basePath),this._asynchronous=e.asynchronous,this._incrementallyLoadTextures=e.incrementallyLoadTextures,this._upAxis=e.upAxis,this._forwardAxis=e.forwardAxis,this.shadows=defaultValue(e.shadows,ShadowMode$1.ENABLED),this._shadows=this.shadows,this._pickIdLoaded=e.pickIdLoaded,this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this._debugShowBoundingVolume=!1,this.debugWireframe=defaultValue(e.debugWireframe,!1),this._debugWireframe=!1,this._imageBasedLightingFactor=new Cartesian2(1,1),Cartesian2.clone(e.imageBasedLightingFactor,this._imageBasedLightingFactor),this.lightColor=e.lightColor,this.luminanceAtZenith=e.luminanceAtZenith,this.sphericalHarmonicCoefficients=e.sphericalHarmonicCoefficients,this.specularEnvironmentMaps=e.specularEnvironmentMaps,this.backFaceCulling=defaultValue(e.backFaceCulling,!0),this._backFaceCulling=this.backFaceCulling}function createInstances(e,t){for(var i=(t=defaultValue(t,[])).length,r=new Array(i),n=0;n<i;++n){var a=t[n],o=a.modelMatrix,s=defaultValue(a.batchId,n);r[n]=new ModelInstance(e,o,s)}return r}function createBoundingSphere(e){for(var t=e.length,i=new Array(t),r=0;r<t;++r)i[r]=Matrix4.getTranslation(e._instances[r]._modelMatrix,new Cartesian3);return BoundingSphere.fromPoints(i)}Object.defineProperties(ModelInstanceCollection.prototype,{allowPicking:{get:function(){return this._allowPicking}},length:{get:function(){return this._instances.length}},activeAnimations:{get:function(){return this._model.activeAnimations}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},imageBasedLightingFactor:{get:function(){return this._imageBasedLightingFactor},set:function(e){Cartesian2.clone(e,this._imageBasedLightingFactor)}}});var scratchCartesian$2=new Cartesian3,scratchMatrix$1=new Matrix4;function getCheckUniformSemanticFunction(r,n,a,o){return function(e,t){var i=e.semantic;if(defined(i)&&-1<r.indexOf(i)){if(!(-1<n.indexOf(i)))throw new RuntimeError('Shader program cannot be optimized for instancing. Uniform "'+t+'" in program "'+a+'" uses unsupported semantic "'+i+'"');o[t]=i}}}function getInstancedUniforms(e,t){if(defined(e._instancedUniformsByProgram))return e._instancedUniformsByProgram[t];var i={};e._instancedUniformsByProgram=i;var r,n,a,o=["MODEL","MODELVIEW","CESIUM_RTC_MODELVIEW","MODELVIEWPROJECTION","MODELINVERSE","MODELVIEWINVERSE","MODELVIEWPROJECTIONINVERSE","MODELINVERSETRANSPOSE","MODELVIEWINVERSETRANSPOSE"],s=["MODELVIEW","CESIUM_RTC_MODELVIEW","MODELVIEWPROJECTION","MODELVIEWINVERSETRANSPOSE"],l=e._model._sourceTechniques;for(var c in l){l.hasOwnProperty(c)&&(defined(i[n=(r=l[c]).program])||(a={},i[n]=a,ForEach.techniqueUniform(r,getCheckUniformSemanticFunction(o,s,t,a))))}return i[t]}function getVertexShaderCallback$1(_){return function(e,t){var i,r,n,a=getInstancedUniforms(_,t),o=defined(_._batchTable),s=ShaderSource.replaceMain(e,"czm_instancing_main"),l="",c="";for(var u in a){a.hasOwnProperty(u)&&("MODELVIEW"===(i=a[u])||"CESIUM_RTC_MODELVIEW"===i?r="czm_instanced_modelView":"MODELVIEWPROJECTION"===i?(r="czm_instanced_modelViewProjection",l+="mat4 czm_instanced_modelViewProjection;\n",c+="czm_instanced_modelViewProjection = czm_projection * czm_instanced_modelView;\n"):"MODELVIEWINVERSETRANSPOSE"===i&&(r="czm_instanced_modelViewInverseTranspose",l+="mat3 czm_instanced_modelViewInverseTranspose;\n",c+="czm_instanced_modelViewInverseTranspose = mat3(czm_instanced_modelView);\n"),n=new RegExp("uniform.*"+u+".*"),s=s.replace(n,""),n=new RegExp(u+"\\b","g"),s=s.replace(n,r))}var d,h,p,m,f=o?(d="attribute float a_batchId;\n",h=""):(d="",h="attribute vec4 pickColor;\nvarying vec4 v_pickColor;\n"," v_pickColor = pickColor;\n"),g="uniform mat4 czm_instanced_modifiedModelView;\nuniform mat4 czm_instanced_nodeTransform;\n"+l+"mat4 czm_instanced_modelView;\nattribute vec4 czm_modelMatrixRow0;\nattribute vec4 czm_modelMatrixRow1;\nattribute vec4 czm_modelMatrixRow2;\n"+d+h+s+"void main()\n{\n mat4 czm_instanced_model = mat4(czm_modelMatrixRow0.x, czm_modelMatrixRow1.x, czm_modelMatrixRow2.x, 0.0, czm_modelMatrixRow0.y, czm_modelMatrixRow1.y, czm_modelMatrixRow2.y, 0.0, czm_modelMatrixRow0.z, czm_modelMatrixRow1.z, czm_modelMatrixRow2.z, 0.0, czm_modelMatrixRow0.w, czm_modelMatrixRow1.w, czm_modelMatrixRow2.w, 1.0);\n czm_instanced_modelView = czm_instanced_modifiedModelView * czm_instanced_model * czm_instanced_nodeTransform;\n"+c+" czm_instancing_main();\n"+f+"}\n";return o&&(p=_._model.gltf,m=ModelUtility.getDiffuseAttributeOrUniform(p,t),g=_._batchTable.getVertexShaderCallback(!0,"a_batchId",m)(g)),g}}function getFragmentShaderCallback$1(a){return function(e,t){var i,r,n=a._batchTable;return e=defined(n)?(i=a._model.gltf,r=ModelUtility.getDiffuseAttributeOrUniform(i,t),n.getFragmentShaderCallback(!0,r)(e)):"varying vec4 v_pickColor;\n"+e}}function createModifiedModelView(e,t){return function(){return Matrix4.multiply(t.uniformState.view,e._rtcTransform,e._rtcModelView)}}function createNodeTransformFunction(e){return function(){return e.computedMatrix}}function getUniformMapCallback(a,o){return function(e,t,i){(e=clone(e)).czm_instanced_modifiedModelView=createModifiedModelView(a,o),e.czm_instanced_nodeTransform=createNodeTransformFunction(i);var r=getInstancedUniforms(a,t);for(var n in r)r.hasOwnProperty(n)&&delete e[n];return defined(a._batchTable)&&(e=a._batchTable.getUniformMapCallback()(e)),e}}function getVertexShaderNonInstancedCallback(n){return function(e,t){var i,r;return defined(n._batchTable)&&(i=n._model.gltf,r=ModelUtility.getDiffuseAttributeOrUniform(i,t),e="uniform float a_batchId\n;"+(e=n._batchTable.getVertexShaderCallback(!0,"a_batchId",r)(e))),e}}function getFragmentShaderNonInstancedCallback(a){return function(e,t){var i,r,n=a._batchTable;return e=defined(n)?(i=a._model.gltf,r=ModelUtility.getDiffuseAttributeOrUniform(i,t),n.getFragmentShaderCallback(!0,r)(e)):"uniform vec4 czm_pickColor;\n"+e}}function getUniformMapNonInstancedCallback(t){return function(e){return defined(t._batchTable)&&(e=t._batchTable.getUniformMapCallback()(e)),e}}function getVertexBufferTypedArray(e){var t=e._instances,i=e.length,r=e._center,n=e._vertexBufferTypedArray;defined(n)||(n=new Float32Array(12*i)),e._dynamic&&(e._vertexBufferTypedArray=n);for(var a=0;a<i;++a){var o=t[a]._modelMatrix,s=Matrix4.clone(o,scratchMatrix$1);s[12]-=r.x,s[13]-=r.y,s[14]-=r.z;var l=12*a;n[0+l]=s[0],n[1+l]=s[4],n[2+l]=s[8],n[3+l]=s[12],n[4+l]=s[1],n[5+l]=s[5],n[6+l]=s[9],n[7+l]=s[13],n[8+l]=s[2],n[9+l]=s[6],n[10+l]=s[10],n[11+l]=s[14]}return n}function createVertexBuffer$2(e,t){var i=e._instances,r=e.length,n=e._dynamic,a=defined(e._batchTable);if(a){for(var o=new Uint16Array(r),s=0;s<r;++s)o[s]=i[s]._instanceId;e._batchIdBuffer=Buffer$1.createVertexBuffer({context:t,typedArray:o,usage:BufferUsage$1.STATIC_DRAW})}if(!a){var l=new Uint8Array(4*r);for(s=0;s<r;++s){var c=e._pickIds[s].color,u=4*s;l[u]=Color.floatToByte(c.red),l[1+u]=Color.floatToByte(c.green),l[2+u]=Color.floatToByte(c.blue),l[3+u]=Color.floatToByte(c.alpha)}e._pickIdBuffer=Buffer$1.createVertexBuffer({context:t,typedArray:l,usage:BufferUsage$1.STATIC_DRAW})}var d=getVertexBufferTypedArray(e);e._vertexBuffer=Buffer$1.createVertexBuffer({context:t,typedArray:d,usage:n?BufferUsage$1.STREAM_DRAW:BufferUsage$1.STATIC_DRAW})}function updateVertexBuffer(e){var t=getVertexBufferTypedArray(e);e._vertexBuffer.copyFromArrayView(t)}function createPickIds(e,t){for(var i=e._instances,r=i.length,n=new Array(r),a=0;a<r;++a)n[a]=t.createPickId(i[a]);return n}function createModel(e,t){var i,r,n=e._instancingSupported,a=defined(e._batchTable),o=e._allowPicking,s={url:e._url,requestType:e._requestType,gltf:e._gltf,basePath:e._basePath,shadows:e._shadows,cacheKey:void 0,asynchronous:e._asynchronous,allowPicking:o,incrementallyLoadTextures:e._incrementallyLoadTextures,upAxis:e._upAxis,forwardAxis:e._forwardAxis,precreatedAttributes:void 0,vertexShaderLoaded:void 0,fragmentShaderLoaded:void 0,uniformMapLoaded:void 0,pickIdLoaded:e._pickIdLoaded,ignoreCommands:!0,opaquePass:e._opaquePass,imageBasedLightingFactor:e.imageBasedLightingFactor,lightColor:e.lightColor,luminanceAtZenith:e.luminanceAtZenith,sphericalHarmonicCoefficients:e.sphericalHarmonicCoefficients,specularEnvironmentMaps:e.specularEnvironmentMaps};a||(e._pickIds=createPickIds(e,t)),n?(createVertexBuffer$2(e,t),i=ComponentDatatype$1.getSizeInBytes(ComponentDatatype$1.FLOAT),r={czm_modelMatrixRow0:{index:0,vertexBuffer:e._vertexBuffer,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,normalize:!1,offsetInBytes:0,strideInBytes:12*i,instanceDivisor:1},czm_modelMatrixRow1:{index:0,vertexBuffer:e._vertexBuffer,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,normalize:!1,offsetInBytes:4*i,strideInBytes:12*i,instanceDivisor:1},czm_modelMatrixRow2:{index:0,vertexBuffer:e._vertexBuffer,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,normalize:!1,offsetInBytes:8*i,strideInBytes:12*i,instanceDivisor:1}},a&&(r.a_batchId={index:0,vertexBuffer:e._batchIdBuffer,componentsPerAttribute:1,componentDatatype:ComponentDatatype$1.UNSIGNED_SHORT,normalize:!1,offsetInBytes:0,strideInBytes:0,instanceDivisor:1}),a||(r.pickColor={index:0,vertexBuffer:e._pickIdBuffer,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,normalize:!0,offsetInBytes:0,strideInBytes:0,instanceDivisor:1}),s.precreatedAttributes=r,s.vertexShaderLoaded=getVertexShaderCallback$1(e),s.fragmentShaderLoaded=getFragmentShaderCallback$1(e),s.uniformMapLoaded=getUniformMapCallback(e,t),defined(e._url)&&(s.cacheKey=e._url.getUrlComponent()+"#instanced")):(s.vertexShaderLoaded=getVertexShaderNonInstancedCallback(e),s.fragmentShaderLoaded=getFragmentShaderNonInstancedCallback(e),s.uniformMapLoaded=getUniformMapNonInstancedCallback(e)),defined(e._url)?e._model=Model.fromGltf(s):e._model=new Model(s)}function updateWireframe$2(e,t){if(e._debugWireframe!==e.debugWireframe||t){e._debugWireframe=e.debugWireframe;for(var i=e.debugWireframe?PrimitiveType$1.LINES:PrimitiveType$1.TRIANGLES,r=e._drawCommands,n=r.length,a=0;a<n;++a)r[a].primitiveType=i}}function getDisableCullingRenderState$1(e){var t=clone(e,!0);return t.cull.enabled=!1,RenderState.fromCache(t)}function updateBackFaceCulling$1(e,t){if(e._backFaceCulling!==e.backFaceCulling||t){e._backFaceCulling=e.backFaceCulling;var i,r=e._drawCommands,n=r.length;if(!defined(e._disableCullingRenderStates))for(e._disableCullingRenderStates=new Array(n),e._renderStates=new Array(n),i=0;i<n;++i){var a=r[i].renderState,o=getDisableCullingRenderState$1(a);e._disableCullingRenderStates[i]=o,e._renderStates[i]=a}for(i=0;i<n;++i)r[i].renderState=e._backFaceCulling?e._renderStates[i]:e._disableCullingRenderStates[i]}}function updateShowBoundingVolume$1(e,t){if(e.debugShowBoundingVolume!==e._debugShowBoundingVolume||t){e._debugShowBoundingVolume=e.debugShowBoundingVolume;for(var i=e._drawCommands,r=i.length,n=0;n<r;++n)i[n].debugShowBoundingVolume=e.debugShowBoundingVolume}}function createCommands$3(e,t){for(var i=t.length,r=e.length,n=e._boundingSphere,a=e._cull,o=0;o<i;++o){var s=DrawCommand.shallowClone(t[o]);s.instanceCount=r,s.boundingVolume=n,s.cull=a,defined(e._batchTable)?s.pickId=e._batchTable.getPickId():s.pickId="v_pickColor",e._drawCommands.push(s)}}function createBatchIdFunction(e){return function(){return e}}function createPickColorFunction$1(e){return function(){return e}}function createCommandsNonInstanced(e,t){for(var i=e._instances,r=t.length,n=e.length,a=defined(e._batchTable),o=e._cull,s=0;s<r;++s)for(var l=0;l<n;++l){var c,u=DrawCommand.shallowClone(t[s]);u.modelMatrix=new Matrix4,u.boundingVolume=new BoundingSphere,u.cull=o,u.uniformMap=clone(u.uniformMap),a?u.uniformMap.a_batchId=createBatchIdFunction(i[l]._instanceId):(c=e._pickIds[l],u.uniformMap.czm_pickColor=createPickColorFunction$1(c.color)),e._drawCommands.push(u)}}function updateCommandsNonInstanced(e){for(var t=e._modelCommands,i=t.length,r=e.length,n=e._rtcTransform,a=e._center,o=0;o<i;++o)for(var s=t[o],l=0;l<r;++l){var c=o*r+l,u=e._drawCommands[c],d=Matrix4.clone(e._instances[l]._modelMatrix,scratchMatrix$1);d[12]-=a.x,d[13]-=a.y,d[14]-=a.z,d=Matrix4.multiply(n,d,scratchMatrix$1);var h=s.modelMatrix,p=u.modelMatrix;Matrix4.multiply(d,h,p);var m=s.boundingVolume,f=u.boundingVolume;BoundingSphere.transform(m,d,f)}}function getModelCommands(e){for(var t=e._nodeCommands,i=t.length,r=[],n=0;n<i;++n){var a=t[n];a.show&&r.push(a.command)}return r}function commandsDirty(e){for(var t=e._nodeCommands,i=t.length,r=!1,n=0;n<i;n++){var a=t[n];a.command.dirty&&(r=!(a.command.dirty=!1))}return r}function generateModelCommands(e,t){e._drawCommands=[];var i=getModelCommands(e._model);t?createCommands$3(e,i):(createCommandsNonInstanced(e,i),updateCommandsNonInstanced(e))}function updateShadows$1(e,t){if(e.shadows!==e._shadows||t){e._shadows=e.shadows;for(var i=ShadowMode$1.castShadows(e.shadows),r=ShadowMode$1.receiveShadows(e.shadows),n=e._drawCommands,a=n.length,o=0;o<a;++o){var s=n[o];s.castShadows=i,s.receiveShadows=r}}}function Instanced3DModel3DTileContent(e,t,i,r,n){this._tileset=e,this._tile=t,this._resource=i,this._modelInstanceCollection=void 0,this._batchTable=void 0,this._features=void 0,this.featurePropertiesDirty=!1,initialize$5(this,r,n)}function getPickIdCallback$1(e){return function(){return e._batchTable.getPickId()}}ModelInstanceCollection.prototype.expandBoundingSphere=function(e){var t=Matrix4.getTranslation(e,scratchCartesian$2);BoundingSphere.expand(this._boundingSphere,t,this._boundingSphere)},ModelInstanceCollection.prototype.update=function(e){if(e.mode!==SceneMode$1.MORPHING&&this.show&&0!==this.length){var t,i=e.context;this._state===LoadState.NEEDS_LOAD&&(this._state=LoadState.LOADING,this._instancingSupported=i.instancedArrays,createModel(this,i),(t=this)._model.readyPromise.otherwise(function(e){t._state=LoadState.FAILED,t._readyPromise.reject(e)}));var r=this._instancingSupported,n=this._model;if(n.imageBasedLightingFactor=this.imageBasedLightingFactor,n.lightColor=this.lightColor,n.luminanceAtZenith=this.luminanceAtZenith,n.sphericalHarmonicCoefficients=this.sphericalHarmonicCoefficients,n.specularEnvironmentMaps=this.specularEnvironmentMaps,n.update(e),n.ready&&this._state===LoadState.LOADING){this._state=LoadState.LOADED,this._ready=!0;var a=n.boundingSphere.radius+Cartesian3.magnitude(n.boundingSphere.center);return this._boundingSphere.radius+=a,this._modelCommands=getModelCommands(n),generateModelCommands(this,r),void this._readyPromise.resolve(this)}if(this._state===LoadState.LOADED){var o,s=e.mode!==this._mode,l=this.modelMatrix,c=!Matrix4.equals(this._modelMatrix,l);(s||c)&&(this._mode=e.mode,Matrix4.clone(l,this._modelMatrix),o=Matrix4.multiplyByTranslation(this._modelMatrix,this._center,this._rtcTransform),this._mode!==SceneMode$1.SCENE3D&&(o=Transforms.basisTo2D(e.mapProjection,o,o)),Matrix4.getTranslation(o,this._boundingSphere.center)),r&&this._dirty&&(this._dynamic=!0,this._dirty=!1,updateVertexBuffer(this));var u=commandsDirty(n);u&&generateModelCommands(this,r),!r&&(n.dirty||this._dirty||s||c)&&updateCommandsNonInstanced(this),updateShadows$1(this,u),updateWireframe$2(this,u),updateBackFaceCulling$1(this,u),updateShowBoundingVolume$1(this,u);var d=e.passes;if(d.render||d.pick)for(var h=e.commandList,p=this._drawCommands,m=p.length,f=0;f<m;++f)h.push(p[f])}}},ModelInstanceCollection.prototype.isDestroyed=function(){return!1},ModelInstanceCollection.prototype.destroy=function(){this._model=this._model&&this._model.destroy();var e=this._pickIds;if(defined(e))for(var t=e.length,i=0;i<t;++i)e[i].destroy();return destroyObject(this)},Instanced3DModel3DTileContent._deprecationWarning=deprecationWarning,Object.defineProperties(Instanced3DModel3DTileContent.prototype,{featuresLength:{get:function(){return this._batchTable.featuresLength}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){var e=this._modelInstanceCollection._model;return defined(e)?e.trianglesLength:0}},geometryByteLength:{get:function(){var e=this._modelInstanceCollection._model;return defined(e)?e.geometryByteLength:0}},texturesByteLength:{get:function(){var e=this._modelInstanceCollection._model;return defined(e)?e.texturesByteLength:0}},batchTableByteLength:{get:function(){return this._batchTable.memorySizeInBytes}},innerContents:{get:function(){}},readyPromise:{get:function(){return this._modelInstanceCollection.readyPromise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){return this._batchTable}}});var sizeOfUint32$6=Uint32Array.BYTES_PER_ELEMENT,propertyScratch1=new Array(4),propertyScratch2=new Array(4);function initialize$5(e,t,i){var r=defaultValue(i,0);i=r;var n=new Uint8Array(t),a=new DataView(t);i+=sizeOfUint32$6;var o=a.getUint32(i,!0);if(1!==o)throw new RuntimeError("Only Instanced 3D Model version 1 is supported. Version "+o+" is not.");i+=sizeOfUint32$6;var s=a.getUint32(i,!0);i+=sizeOfUint32$6;var l=a.getUint32(i,!0);if(0===l)throw new RuntimeError("featureTableJsonByteLength is zero, the feature table must be defined.");i+=sizeOfUint32$6;var c=a.getUint32(i,!0);i+=sizeOfUint32$6;var u=a.getUint32(i,!0);i+=sizeOfUint32$6;var d=a.getUint32(i,!0);i+=sizeOfUint32$6;var h=a.getUint32(i,!0);if(1!==h&&0!==h)throw new RuntimeError("Only glTF format 0 (uri) or 1 (embedded) are supported. Format "+h+" is not.");var p=getStringFromTypedArray(n,i+=sizeOfUint32$6,l),m=JSON.parse(p);i+=l;var f=new Uint8Array(t,i,c);i+=c;var g,_,y,v=new Cesium3DTileFeatureTable(m,f),C=v.getGlobalProperty("INSTANCES_LENGTH");if(!defined(v.featuresLength=C))throw new RuntimeError("Feature table global property: INSTANCES_LENGTH must be defined");0<u&&(_=getStringFromTypedArray(n,i,u),y=JSON.parse(_),i+=u,0<d&&(g=new Uint8Array(t,i,d),g=new Uint8Array(g),i+=d)),e._batchTable=new Cesium3DTileBatchTable(e,C,y,g);var S,T=r+s-i;if(0==T)throw new RuntimeError("glTF byte length is zero, i3dm must have a glTF to instance.");S=i%4==0?new Uint8Array(t,i,T):(Instanced3DModel3DTileContent._deprecationWarning("i3dm-glb-unaligned","The embedded glb is not aligned to a 4-byte boundary."),new Uint8Array(n.subarray(i,i+T)));var x,b=e._tileset,E={instances:new Array(C),batchTable:e._batchTable,cull:!1,url:void 0,requestType:RequestType$1.TILES3D,gltf:void 0,basePath:void 0,incrementallyLoadTextures:!1,upAxis:b._gltfUpAxis,forwardAxis:Axis$1.X,opaquePass:Pass$1.CESIUM_3D_TILE,pickIdLoaded:getPickIdCallback$1(e),imageBasedLightingFactor:b.imageBasedLightingFactor,lightColor:b.lightColor,luminanceAtZenith:b.luminanceAtZenith,sphericalHarmonicCoefficients:b.sphericalHarmonicCoefficients,specularEnvironmentMaps:b.specularEnvironmentMaps,backFaceCulling:b.backFaceCulling};0===h?(x=(x=getStringFromTypedArray(S)).replace(/[\s\0]+$/,""),E.url=e._resource.getDerivedResource({url:x})):(E.gltf=S,E.basePath=e._resource.clone());var P,A=v.getGlobalProperty("EAST_NORTH_UP"),w=v.getGlobalProperty("RTC_CENTER",ComponentDatatype$1.FLOAT,3);defined(w)&&(P=Cartesian3.unpack(w));for(var D=E.instances,M=new Cartesian3,I=new Array(3),R=new Cartesian3,O=new Cartesian3,L=new Cartesian3,F=new Matrix3,N=new Quaternion,B=new Cartesian3,V=new TranslationRotationScale,k=new Matrix4,z=0;z<C;z++){var $=v.getProperty("POSITION",ComponentDatatype$1.FLOAT,3,z,propertyScratch1);if(!defined($)){$=I;var U=v.getProperty("POSITION_QUANTIZED",ComponentDatatype$1.UNSIGNED_SHORT,3,z,propertyScratch1);if(!defined(U))throw new RuntimeError("Either POSITION or POSITION_QUANTIZED must be defined for each instance.");var G=v.getGlobalProperty("QUANTIZED_VOLUME_OFFSET",ComponentDatatype$1.FLOAT,3);if(!defined(G))throw new RuntimeError("Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.");var H=v.getGlobalProperty("QUANTIZED_VOLUME_SCALE",ComponentDatatype$1.FLOAT,3);if(!defined(H))throw new RuntimeError("Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.");for(var W=0;W<3;W++)$[W]=U[W]/65535*H[W]+G[W]}Cartesian3.unpack($,0,M),defined(P)&&Cartesian3.add(M,P,M),V.translation=M;var q=v.getProperty("NORMAL_UP",ComponentDatatype$1.FLOAT,3,z,propertyScratch1),j=v.getProperty("NORMAL_RIGHT",ComponentDatatype$1.FLOAT,3,z,propertyScratch2),Y=!1;if(defined(q)){if(!defined(j))throw new RuntimeError("To define a custom orientation, both NORMAL_UP and NORMAL_RIGHT must be defined.");Cartesian3.unpack(q,0,O),Cartesian3.unpack(j,0,R),Y=!0}else{var X=v.getProperty("NORMAL_UP_OCT32P",ComponentDatatype$1.UNSIGNED_SHORT,2,z,propertyScratch1),Q=v.getProperty("NORMAL_RIGHT_OCT32P",ComponentDatatype$1.UNSIGNED_SHORT,2,z,propertyScratch2);if(defined(X)){if(!defined(Q))throw new RuntimeError("To define a custom orientation with oct-encoded vectors, both NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P must be defined.");AttributeCompression.octDecodeInRange(X[0],X[1],65535,O),AttributeCompression.octDecodeInRange(Q[0],Q[1],65535,R),Y=!0}else A?(Transforms.eastNorthUpToFixedFrame(M,Ellipsoid.WGS84,k),Matrix4.getMatrix3(k,F)):Matrix3.clone(Matrix3.IDENTITY,F)}Y&&(Cartesian3.cross(R,O,L),Cartesian3.normalize(L,L),Matrix3.setColumn(F,0,R,F),Matrix3.setColumn(F,1,O,F),Matrix3.setColumn(F,2,L,F)),Quaternion.fromRotationMatrix(F,N),V.rotation=N,B=Cartesian3.fromElements(1,1,1,B);var J=v.getProperty("SCALE",ComponentDatatype$1.FLOAT,1,z);defined(J)&&Cartesian3.multiplyByScalar(B,J,B);var Z=v.getProperty("SCALE_NON_UNIFORM",ComponentDatatype$1.FLOAT,3,z,propertyScratch1);defined(Z)&&(B.x*=Z[0],B.y*=Z[1],B.z*=Z[2]),V.scale=B;var K=v.getProperty("BATCH_ID",ComponentDatatype$1.UNSIGNED_SHORT,1,z);defined(K)||(K=z),Matrix4.fromTranslationRotationScale(V,k);var ee=k.clone();D[z]={modelMatrix:ee,batchId:K}}e._modelInstanceCollection=new ModelInstanceCollection(E),e._modelInstanceCollection.readyPromise.then(function(e){e.activeAnimations.addAll({loop:ModelAnimationLoop$1.REPEAT})})}function createFeatures$2(e){var t=e.featuresLength;if(!defined(e._features)&&0<t){for(var i=new Array(t),r=0;r<t;++r)i[r]=new Cesium3DTileFeature(e,r);e._features=i}}Instanced3DModel3DTileContent.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)},Instanced3DModel3DTileContent.prototype.getFeature=function(e){this.featuresLength;return createFeatures$2(this),this._features[e]},Instanced3DModel3DTileContent.prototype.applyDebugSettings=function(e,t){t=e?t:Color.WHITE,this._batchTable.setAllColor(t)},Instanced3DModel3DTileContent.prototype.applyStyle=function(e){this._batchTable.applyStyle(e)},Instanced3DModel3DTileContent.prototype.update=function(e,t){var i=t.commandList.length;this._batchTable.update(e,t),this._modelInstanceCollection.modelMatrix=this._tile.computedTransform,this._modelInstanceCollection.shadows=this._tileset.shadows,this._modelInstanceCollection.lightColor=this._tileset.lightColor,this._modelInstanceCollection.luminanceAtZenith=this._tileset.luminanceAtZenith,this._modelInstanceCollection.sphericalHarmonicCoefficients=this._tileset.sphericalHarmonicCoefficients,this._modelInstanceCollection.specularEnvironmentMaps=this._tileset.specularEnvironmentMaps,this._modelInstanceCollection.backFaceCulling=this._tileset.backFaceCulling,this._modelInstanceCollection.debugWireframe=this._tileset.debugWireframe;var r,n=this._modelInstanceCollection._model;defined(n)&&(r=this._tileset.clippingPlanes,n.clippingPlanesOriginMatrix=this._tileset.clippingPlanesOriginMatrix,defined(r)&&this._tile.clippingPlanesDirty&&(n._clippingPlanes=r.enabled&&this._tile._isClipped?r:void 0),defined(r)&&defined(n._clippingPlanes)&&n._clippingPlanes!==r&&(n._clippingPlanes=r)),this._modelInstanceCollection.update(t),i<t.commandList.length&&(t.passes.render||t.passes.pick)&&this._batchTable.addDerivedCommands(t,i,!1)},Instanced3DModel3DTileContent.prototype.isDestroyed=function(){return!1},Instanced3DModel3DTileContent.prototype.destroy=function(){return this._modelInstanceCollection=this._modelInstanceCollection&&this._modelInstanceCollection.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),destroyObject(this)};var Cesium3DTileRefine={ADD:0,REPLACE:1},Cesium3DTileRefine$1=Object.freeze(Cesium3DTileRefine),DecodingState={NEEDS_DECODE:0,DECODING:1,READY:2,FAILED:3};function PointCloud(e){this._parsedContent=void 0,this._drawCommand=void 0,this._isTranslucent=!1,this._styleTranslucent=!1,this._constantColor=Color.clone(Color.DARKGRAY),this._highlightColor=Color.clone(Color.WHITE),this._pointSize=1,this._rtcCenter=void 0,this._quantizedVolumeScale=void 0,this._quantizedVolumeOffset=void 0,this._styleableShaderAttributes=void 0,this._isQuantized=!1,this._isOctEncoded16P=!1,this._isRGB565=!1,this._hasColors=!1,this._hasNormals=!1,this._hasBatchIds=!1,this._decodingState=DecodingState.READY,this._dequantizeInShader=!0,this._isQuantizedDraco=!1,this._isOctEncodedDraco=!1,this._quantizedRange=0,this._octEncodedRange=0,this.backFaceCulling=!1,this._backFaceCulling=!1,this.normalShading=!0,this._normalShading=!0,this._opaqueRenderState=void 0,this._translucentRenderState=void 0,this._mode=void 0,this._ready=!1,this._readyPromise=when.defer(),this._pointsLength=0,this._geometryByteLength=0,this._vertexShaderLoaded=e.vertexShaderLoaded,this._fragmentShaderLoaded=e.fragmentShaderLoaded,this._uniformMapLoaded=e.uniformMapLoaded,this._batchTableLoaded=e.batchTableLoaded,this._pickIdLoaded=e.pickIdLoaded,this._opaquePass=defaultValue(e.opaquePass,Pass$1.OPAQUE),this._cull=defaultValue(e.cull,!0),this.style=void 0,this._style=void 0,this.styleDirty=!1,this.modelMatrix=Matrix4.clone(Matrix4.IDENTITY),this._modelMatrix=Matrix4.clone(Matrix4.IDENTITY),this.time=0,this.shadows=ShadowMode$1.ENABLED,this._boundingSphere=void 0,this.clippingPlanes=void 0,this.isClipped=!1,this.clippingPlanesDirty=!1,this.clippingPlanesOriginMatrix=void 0,this.attenuation=!1,this._attenuation=!1,this.geometricError=0,this.geometricErrorScale=1,this.maximumAttenuation=this._pointSize,initialize$6(this,e)}Object.defineProperties(PointCloud.prototype,{pointsLength:{get:function(){return this._pointsLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},color:{get:function(){return Color.clone(this._highlightColor)},set:function(e){this._highlightColor=Color.clone(e,this._highlightColor)}},boundingSphere:{get:function(){if(defined(this._drawCommand))return this._drawCommand.boundingVolume},set:function(e){this._boundingSphere=BoundingSphere.clone(e,this._boundingSphere)}}});var sizeOfUint32$7=Uint32Array.BYTES_PER_ELEMENT;function initialize$6(e,t){var i=t.arrayBuffer,r=defaultValue(t.byteOffset,0),n=new Uint8Array(i),a=new DataView(i);r+=sizeOfUint32$7;var o=a.getUint32(r,!0);if(1!==o)throw new RuntimeError("Only Point Cloud tile version 1 is supported. Version "+o+" is not.");r+=sizeOfUint32$7,r+=sizeOfUint32$7;var s=a.getUint32(r,!0);if(0===s)throw new RuntimeError("Feature table must have a byte length greater than zero");r+=sizeOfUint32$7;var l=a.getUint32(r,!0);r+=sizeOfUint32$7;var c=a.getUint32(r,!0);r+=sizeOfUint32$7;var u=a.getUint32(r,!0),d=getStringFromTypedArray(n,r+=sizeOfUint32$7,s),h=JSON.parse(d);r+=s;var p,m,f,g=new Uint8Array(i,r,l);r+=l,0<c&&(m=getStringFromTypedArray(n,r,c),f=JSON.parse(m),r+=c,0<u&&(p=new Uint8Array(i,r,u)));var _=new Cesium3DTileFeatureTable(h,g),y=_.getGlobalProperty("POINTS_LENGTH");if(!defined(_.featuresLength=y))throw new RuntimeError("Feature table global property: POINTS_LENGTH must be defined");var v,C,S,T,x=_.getGlobalProperty("RTC_CENTER",ComponentDatatype$1.FLOAT,3);defined(x)&&(e._rtcCenter=Cartesian3.unpack(x));var b,E,P,A,w,D,M=!1,I=!1,R=!1,O=!1,L=!1,F=!1,N=!1,B=!1,V=defined(h.extensions)?h.extensions["3DTILES_draco_point_compression"]:void 0,k=defined(f)&&defined(f.extensions)?f.extensions["3DTILES_draco_point_compression"]:void 0;if(defined(k)&&(P=k.properties),defined(V)){E=V.properties;var z=V.byteOffset,$=V.byteLength;if(!defined(E)||!defined(z)||!defined($))throw new RuntimeError("Draco properties, byteOffset, and byteLength must be defined");b=arraySlice(g,z,z+$),M=defined(E.POSITION),I=defined(E.RGB)||defined(E.RGBA),R=defined(E.NORMAL),O=defined(E.BATCH_ID),F=defined(E.RGBA),e._decodingState=DecodingState.NEEDS_DECODE}if(defined(b)&&(A={buffer:b,featureTableProperties:E,batchTableProperties:P,properties:combine(E,P),dequantizeInShader:e._dequantizeInShader}),!M)if(defined(h.POSITION))v=_.getPropertyArray("POSITION",ComponentDatatype$1.FLOAT,3),M=!0;else if(defined(h.POSITION_QUANTIZED)){v=_.getPropertyArray("POSITION_QUANTIZED",ComponentDatatype$1.UNSIGNED_SHORT,3),M=L=!0;var U=_.getGlobalProperty("QUANTIZED_VOLUME_SCALE",ComponentDatatype$1.FLOAT,3);if(!defined(U))throw new RuntimeError("Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.");e._quantizedVolumeScale=Cartesian3.unpack(U),e._quantizedRange=65535;var G=_.getGlobalProperty("QUANTIZED_VOLUME_OFFSET",ComponentDatatype$1.FLOAT,3);if(!defined(G))throw new RuntimeError("Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.");e._quantizedVolumeOffset=Cartesian3.unpack(G)}if(I||(defined(h.RGBA)?(C=_.getPropertyArray("RGBA",ComponentDatatype$1.UNSIGNED_BYTE,4),I=F=!0):defined(h.RGB)?(C=_.getPropertyArray("RGB",ComponentDatatype$1.UNSIGNED_BYTE,3),I=!0):defined(h.RGB565)&&(C=_.getPropertyArray("RGB565",ComponentDatatype$1.UNSIGNED_SHORT,1),I=N=!0)),R||(defined(h.NORMAL)?(S=_.getPropertyArray("NORMAL",ComponentDatatype$1.FLOAT,3),R=!0):defined(h.NORMAL_OCT16P)&&(S=_.getPropertyArray("NORMAL_OCT16P",ComponentDatatype$1.UNSIGNED_BYTE,2),R=B=!0)),O||defined(h.BATCH_ID)&&(T=_.getPropertyArray("BATCH_ID",ComponentDatatype$1.UNSIGNED_SHORT,1),O=!0),!M)throw new RuntimeError("Either POSITION or POSITION_QUANTIZED must be defined.");if(defined(h.CONSTANT_RGBA)&&(w=_.getGlobalProperty("CONSTANT_RGBA",ComponentDatatype$1.UNSIGNED_BYTE,4),e._constantColor=Color.fromBytes(w[0],w[1],w[2],w[3],e._constantColor)),O){var H=_.getGlobalProperty("BATCH_LENGTH");if(!defined(H))throw new RuntimeError("Global property: BATCH_LENGTH must be defined when BATCH_ID is defined.");defined(p)&&(p=new Uint8Array(p)),defined(e._batchTableLoaded)&&e._batchTableLoaded(H,f,p)}!O&&defined(p)&&(D=Cesium3DTileBatchTable.getBinaryProperties(y,f,p)),e._parsedContent={positions:v,colors:C,normals:S,batchIds:T,styleableProperties:D,draco:A},e._pointsLength=y,e._isQuantized=L,e._isOctEncoded16P=B,e._isRGB565=N,e._isTranslucent=F,e._hasColors=I,e._hasNormals=R,e._hasBatchIds=O}var scratchMin$2=new Cartesian3,scratchMax$2=new Cartesian3,scratchPosition$7=new Cartesian3,randomValues;function getRandomValues(e){if(!defined(randomValues)){CesiumMath.setRandomNumberSeed(0),randomValues=new Array(e);for(var t=0;t<e;++t)randomValues[t]=CesiumMath.nextRandomNumber()}return randomValues}function computeApproximateBoundingSphereFromPositions(e){for(var t=e.length/3,i=Math.min(t,20),r=getRandomValues(20),n=Number.MAX_VALUE,a=-Number.MAX_VALUE,o=Cartesian3.fromElements(n,n,n,scratchMin$2),s=Cartesian3.fromElements(a,a,a,scratchMax$2),l=0;l<i;++l){var c=Math.floor(r[l]*t),u=Cartesian3.unpack(e,3*c,scratchPosition$7);Cartesian3.minimumByComponent(o,u,o),Cartesian3.maximumByComponent(s,u,s)}var d=BoundingSphere.fromCornerPoints(o,s);return d.radius+=CesiumMath.EPSILON2,d}function prepareVertexAttribute(e,t){var i=ComponentDatatype$1.fromTypedArray(e);return i===ComponentDatatype$1.INT||i===ComponentDatatype$1.UNSIGNED_INT||i===ComponentDatatype$1.DOUBLE?(oneTimeWarning("Cast pnts property to floats",'Point cloud property "'+t+'" will be casted to a float array because INT, UNSIGNED_INT, and DOUBLE are not valid WebGL vertex attribute types. Some precision may be lost.'),new Float32Array(e)):e}var scratchPointSizeAndTimeAndGeometricErrorAndDepthMultiplier=new Cartesian4,scratchQuantizedVolumeScaleAndOctEncodedRange=new Cartesian4,scratchColor$5=new Color,positionLocation=0,colorLocation=1,normalLocation=2,batchIdLocation=3,numberOfAttributes=4,scratchClippingPlaneMatrix$1=new Matrix4;function createResources$2(e,t){var i=t.context,r=e._parsedContent,n=e._pointsLength,a=r.positions,o=r.colors,s=r.normals,l=r.batchIds,c=r.styleableProperties,u=defined(c),d=e._isQuantized,h=e._isQuantizedDraco,p=e._isOctEncoded16P,m=e._isOctEncodedDraco,f=e._quantizedRange,g=e._octEncodedRange,_=e._isRGB565,y=e._isTranslucent,v=e._hasColors,C=e._hasNormals,S=e._hasBatchIds,T=[],x={};if(e._styleableShaderAttributes=x,u){var b,E,P,A,w,D,M=numberOfAttributes;for(var I in c){c.hasOwnProperty(I)&&(E=prepareVertexAttribute((b=c[I]).typedArray,I),P=b.componentCount,A=ComponentDatatype$1.fromTypedArray(E),w=Buffer$1.createVertexBuffer({context:i,typedArray:E,usage:BufferUsage$1.STATIC_DRAW}),e._geometryByteLength+=w.sizeInBytes,D={index:M,vertexBuffer:w,componentsPerAttribute:P,componentDatatype:A,normalize:!1,offsetInBytes:0,strideInBytes:0},T.push(D),x[I]={location:M,componentCount:P},++M)}}var R,O,L,F=Buffer$1.createVertexBuffer({context:i,typedArray:a,usage:BufferUsage$1.STATIC_DRAW});e._geometryByteLength+=F.sizeInBytes,v&&(R=Buffer$1.createVertexBuffer({context:i,typedArray:o,usage:BufferUsage$1.STATIC_DRAW}),e._geometryByteLength+=R.sizeInBytes),C&&(O=Buffer$1.createVertexBuffer({context:i,typedArray:s,usage:BufferUsage$1.STATIC_DRAW}),e._geometryByteLength+=O.sizeInBytes),S&&(l=prepareVertexAttribute(l,"batchIds"),L=Buffer$1.createVertexBuffer({context:i,typedArray:l,usage:BufferUsage$1.STATIC_DRAW}),e._geometryByteLength+=L.sizeInBytes);var N,B=[];A=d?ComponentDatatype$1.UNSIGNED_SHORT:h?f<=255?ComponentDatatype$1.UNSIGNED_BYTE:ComponentDatatype$1.UNSIGNED_SHORT:ComponentDatatype$1.FLOAT,B.push({index:positionLocation,vertexBuffer:F,componentsPerAttribute:3,componentDatatype:A,normalize:!1,offsetInBytes:0,strideInBytes:0}),e._cull&&(e._boundingSphere=d||h?BoundingSphere.fromCornerPoints(Cartesian3.ZERO,e._quantizedVolumeScale):computeApproximateBoundingSphereFromPositions(a)),v&&(_?B.push({index:colorLocation,vertexBuffer:R,componentsPerAttribute:1,componentDatatype:ComponentDatatype$1.UNSIGNED_SHORT,normalize:!1,offsetInBytes:0,strideInBytes:0}):(N=y?4:3,B.push({index:colorLocation,vertexBuffer:R,componentsPerAttribute:N,componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,normalize:!0,offsetInBytes:0,strideInBytes:0}))),C&&(A=p?(P=2,ComponentDatatype$1.UNSIGNED_BYTE):m?(P=2,g<=255?ComponentDatatype$1.UNSIGNED_BYTE:ComponentDatatype$1.UNSIGNED_SHORT):(P=3,ComponentDatatype$1.FLOAT),B.push({index:normalLocation,vertexBuffer:O,componentsPerAttribute:P,componentDatatype:A,normalize:!1,offsetInBytes:0,strideInBytes:0})),S&&B.push({index:batchIdLocation,vertexBuffer:L,componentsPerAttribute:1,componentDatatype:ComponentDatatype$1.fromTypedArray(l),normalize:!1,offsetInBytes:0,strideInBytes:0}),u&&(B=B.concat(T));var V=new VertexArray({context:i,attributes:B}),k={depthTest:{enabled:!0}};e._opaquePass===Pass$1.CESIUM_3D_TILE&&(k.stencilTest=StencilConstants$1.setCesium3DTileBit(),k.stencilMask=StencilConstants$1.CESIUM_3D_TILE_MASK),e._opaqueRenderState=RenderState.fromCache(k),e._translucentRenderState=RenderState.fromCache({depthTest:{enabled:!0},depthMask:!1,blending:BlendingState$1.ALPHA_BLEND}),e._drawCommand=new DrawCommand({boundingVolume:new BoundingSphere,cull:e._cull,modelMatrix:new Matrix4,primitiveType:PrimitiveType$1.POINTS,vertexArray:V,count:n,shaderProgram:void 0,uniformMap:void 0,renderState:y?e._translucentRenderState:e._opaqueRenderState,pass:y?Pass$1.TRANSLUCENT:e._opaquePass,owner:e,castShadows:!1,receiveShadows:!1,pickId:e._pickIdLoaded()})}function createUniformMap$2(r,n){var a=n.context,e=r._isQuantized,t=r._isQuantizedDraco,i=r._isOctEncodedDraco,o={u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier:function(){var e,t,i=scratchPointSizeAndTimeAndGeometricErrorAndDepthMultiplier;return i.x=r._attenuation?r.maximumAttenuation:r._pointSize,i.x*=n.pixelRatio,i.y=r.time,r._attenuation&&(e=n.camera.frustum,t=n.mode===SceneMode$1.SCENE2D||e instanceof OrthographicFrustum?Number.POSITIVE_INFINITY:a.drawingBufferHeight/n.camera.frustum.sseDenominator,i.z=r.geometricError*r.geometricErrorScale,i.w=t),i},u_highlightColor:function(){return r._highlightColor},u_constantColor:function(){return r._constantColor},u_clippingPlanes:function(){var e=r.clippingPlanes;return r.isClipped?e.texture:a.defaultTexture},u_clippingPlanesEdgeStyle:function(){var e=r.clippingPlanes;if(!defined(e))return Color.TRANSPARENT;var t=Color.clone(e.edgeColor,scratchColor$5);return t.alpha=e.edgeWidth,t},u_clippingPlanesMatrix:function(){var e=r.clippingPlanes;if(!defined(e))return Matrix4.IDENTITY;var t=defaultValue(r.clippingPlanesOriginMatrix,r._modelMatrix);return Matrix4.multiply(a.uniformState.view3D,t,scratchClippingPlaneMatrix$1),Matrix4.multiply(scratchClippingPlaneMatrix$1,e.modelMatrix,scratchClippingPlaneMatrix$1)}};(e||t||i)&&(o=combine(o,{u_quantizedVolumeScaleAndOctEncodedRange:function(){var e,t=scratchQuantizedVolumeScaleAndOctEncodedRange;return defined(r._quantizedVolumeScale)&&(e=Cartesian3.clone(r._quantizedVolumeScale,t),Cartesian3.divideByScalar(e,r._quantizedRange,t)),t.w=r._octEncodedRange,t}})),defined(r._uniformMapLoaded)&&(o=r._uniformMapLoaded(o)),r._drawCommand.uniformMap=o}function getStyleablePropertyIds(e,t){for(var i=/czm_3dtiles_property_(\d+)/g,r=i.exec(e);null!==r;){var n=parseInt(r[1]);-1===t.indexOf(n)&&t.push(n),r=i.exec(e)}}function getBuiltinPropertyNames(e,t){for(var i=/czm_3dtiles_builtin_property_(\w+)/g,r=i.exec(e);null!==r;){var n=r[1];-1===t.indexOf(n)&&t.push(n),r=i.exec(e)}}function getVertexAttribute(e,t){for(var i=e.numberOfAttributes,r=0;r<i;++r){var n=e.getAttribute(r);if(n.index===t)return n}}var builtinPropertyNameMap={POSITION:"czm_3dtiles_builtin_property_POSITION",POSITION_ABSOLUTE:"czm_3dtiles_builtin_property_POSITION_ABSOLUTE",COLOR:"czm_3dtiles_builtin_property_COLOR",NORMAL:"czm_3dtiles_builtin_property_NORMAL"};function modifyStyleFunction(e){return e.replace("()","(vec3 czm_3dtiles_builtin_property_POSITION, vec3 czm_3dtiles_builtin_property_POSITION_ABSOLUTE, vec4 czm_3dtiles_builtin_property_COLOR, vec3 czm_3dtiles_builtin_property_NORMAL)")}function createShaders$1(e,t,i){var r,n,a,o,s,l=t.context,c=defined(i),u=e._isQuantized,d=e._isQuantizedDraco,h=e._isOctEncoded16P,p=e._isOctEncodedDraco,m=e._isRGB565,f=e._isTranslucent,g=e._hasColors,_=e._hasNormals,y=e._hasBatchIds,v=e._backFaceCulling,C=e._normalShading,S=e._drawCommand.vertexArray,T=e.clippingPlanes,x=e._attenuation,b=f,E=clone(builtinPropertyNameMap),P={},A=e._styleableShaderAttributes;for(r in A)A.hasOwnProperty(r)&&(G=A[r],E[r]="czm_3dtiles_property_"+G.location,P[G.location]=G);c&&(n={translucent:!1},a=i.getColorShaderFunction("getColorFromStyle",E,n),o=i.getShowShaderFunction("getShowFromStyle",E,n),s=i.getPointSizeShaderFunction("getPointSizeFromStyle",E,n),defined(a)&&n.translucent&&(b=!0)),e._styleTranslucent=b;var w=defined(a),D=defined(o),M=defined(s),I=e.isClipped,R=[],O=[];w&&(getStyleablePropertyIds(a,R),getBuiltinPropertyNames(a,O),a=modifyStyleFunction(a)),D&&(getStyleablePropertyIds(o,R),getBuiltinPropertyNames(o,O),o=modifyStyleFunction(o)),M&&(getStyleablePropertyIds(s,R),getBuiltinPropertyNames(s,O),s=modifyStyleFunction(s));var L,F=0<=O.indexOf("COLOR"),N=0<=O.indexOf("NORMAL");if(N&&!_)throw new RuntimeError("Style references the NORMAL semantic but the point cloud does not have normals");for(r in A){A.hasOwnProperty(r)&&(G=A[r],L=0<=R.indexOf(G.location),getVertexAttribute(S,G.location).enabled=L)}var B=g&&(!w||F);g&&(getVertexAttribute(S,colorLocation).enabled=B);var V=_&&(C||v||N);_&&(getVertexAttribute(S,normalLocation).enabled=V);var k={a_position:positionLocation};B&&(k.a_color=colorLocation),V&&(k.a_normal=normalLocation),y&&(k.a_batchId=batchIdLocation);for(var z="",$=R.length,U=0;U<$;++U){var G,H=R[U],W=(G=P[H]).componentCount,q="czm_3dtiles_property_"+H,j=1===W?"float":"vec"+W;z+="attribute "+j+" "+q+"; \n",k[q]=G.location}createUniformMap$2(e,t);var Y="attribute vec3 a_position; \nvarying vec4 v_color; \nuniform vec4 u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier; \nuniform vec4 u_constantColor; \nuniform vec4 u_highlightColor; \n";Y+="float u_pointSize; \nfloat u_time; \n",x&&(Y+="float u_geometricError; \nfloat u_depthMultiplier; \n"),Y+=z,B&&(Y+=f?"attribute vec4 a_color; \n":m?"attribute float a_color; \nconst float SHIFT_RIGHT_11 = 1.0 / 2048.0; \nconst float SHIFT_RIGHT_5 = 1.0 / 32.0; \nconst float SHIFT_LEFT_11 = 2048.0; \nconst float SHIFT_LEFT_5 = 32.0; \nconst float NORMALIZE_6 = 1.0 / 64.0; \nconst float NORMALIZE_5 = 1.0 / 32.0; \n":"attribute vec3 a_color; \n"),V&&(Y+=h||p?"attribute vec2 a_normal; \n":"attribute vec3 a_normal; \n"),y&&(Y+="attribute float a_batchId; \n"),(u||d||p)&&(Y+="uniform vec4 u_quantizedVolumeScaleAndOctEncodedRange; \n"),w&&(Y+=a),D&&(Y+=o),M&&(Y+=s),Y+="void main() \n{ \n u_pointSize = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.x; \n u_time = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.y; \n",x&&(Y+=" u_geometricError = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.z; \n u_depthMultiplier = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.w; \n"),Y+=B?f?" vec4 color = a_color; \n":m?" float compressed = a_color; \n float r = floor(compressed * SHIFT_RIGHT_11); \n compressed -= r * SHIFT_LEFT_11; \n float g = floor(compressed * SHIFT_RIGHT_5); \n compressed -= g * SHIFT_LEFT_5; \n float b = compressed; \n vec3 rgb = vec3(r * NORMALIZE_5, g * NORMALIZE_6, b * NORMALIZE_5); \n vec4 color = vec4(rgb, 1.0); \n":" vec4 color = vec4(a_color, 1.0); \n":" vec4 color = u_constantColor; \n",Y+=u||d?" vec3 position = a_position * u_quantizedVolumeScaleAndOctEncodedRange.xyz; \n":" vec3 position = a_position; \n",Y+=" vec3 position_absolute = vec3(czm_model * vec4(position, 1.0)); \n",V?(Y+=h?" vec3 normal = czm_octDecode(a_normal); \n":p?" vec3 normal = czm_octDecode(a_normal, u_quantizedVolumeScaleAndOctEncodedRange.w).zxy; \n":" vec3 normal = a_normal; \n",Y+=" vec3 normalEC = czm_normal * normal; \n"):Y+=" vec3 normal = vec3(1.0); \n",w&&(Y+=" color = getColorFromStyle(position, position_absolute, color, normal); \n"),D&&(Y+=" float show = float(getShowFromStyle(position, position_absolute, color, normal)); \n"),Y+=M?" gl_PointSize = getPointSizeFromStyle(position, position_absolute, color, normal) * czm_pixelRatio; \n":x?" vec4 positionEC = czm_modelView * vec4(position, 1.0); \n float depth = -positionEC.z; \n gl_PointSize = min((u_geometricError / depth) * u_depthMultiplier, u_pointSize); \n":" gl_PointSize = u_pointSize; \n",Y+=" color = color * u_highlightColor; \n",V&&C&&(Y+=" float diffuseStrength = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC); \n diffuseStrength = max(diffuseStrength, 0.4); \n color.xyz *= diffuseStrength * czm_lightColor; \n"),Y+=" v_color = color; \n gl_Position = czm_modelViewProjection * vec4(position, 1.0); \n",V&&v&&(Y+=" float visible = step(-normalEC.z, 0.0); \n gl_Position *= visible; \n gl_PointSize *= visible; \n"),D&&(Y+=" gl_Position.w *= float(show); \n gl_PointSize *= float(show); \n"),Y+="} \n";var X="varying vec4 v_color; \n";I&&(X+="uniform highp sampler2D u_clippingPlanes; \nuniform mat4 u_clippingPlanesMatrix; \nuniform vec4 u_clippingPlanesEdgeStyle; \n",X+="\n",X+=getClippingFunction(T,l),X+="\n"),X+="void main() \n{ \n gl_FragColor = czm_gammaCorrect(v_color); \n",I&&(X+=getClipAndStyleCode("u_clippingPlanes","u_clippingPlanesMatrix","u_clippingPlanesEdgeStyle")),X+="} \n",defined(e._vertexShaderLoaded)&&(Y=e._vertexShaderLoaded(Y)),defined(e._fragmentShaderLoaded)&&(X=e._fragmentShaderLoaded(X));var Q=e._drawCommand;defined(Q.shaderProgram)&&Q.shaderProgram.destroy(),Q.shaderProgram=ShaderProgram.fromCache({context:l,vertexShaderSource:Y,fragmentShaderSource:X,attributeLocations:k});try{Q.shaderProgram._bind()}catch(e){throw new RuntimeError("Error generating style shader: this may be caused by a type mismatch, index out-of-bounds, or other syntax error.")}}function decodeDraco(m,e){return m._decodingState!==DecodingState.READY&&(m._decodingState===DecodingState.NEEDS_DECODE&&(f=m._parsedContent,g=f.draco,defined(t=DracoLoader.decodePointCloud(g,e))&&(m._decodingState=DecodingState.DECODING,t.then(function(e){m._decodingState=DecodingState.READY;var t,i,r=defined(e.POSITION)?e.POSITION.array:void 0,n=defined(e.RGB)?e.RGB.array:void 0,a=defined(e.RGBA)?e.RGBA.array:void 0,o=defined(e.NORMAL)?e.NORMAL.array:void 0,s=defined(e.BATCH_ID)?e.BATCH_ID.array:void 0,l=defined(r)&&defined(e.POSITION.data.quantization),c=defined(o)&&defined(e.NORMAL.data.quantization);l&&(i=(t=e.POSITION.data.quantization).range,m._quantizedVolumeScale=Cartesian3.fromElements(i,i,i),m._quantizedVolumeOffset=Cartesian3.unpack(t.minValues),m._quantizedRange=(1<<t.quantizationBits)-1,m._isQuantizedDraco=!0),c&&(m._octEncodedRange=(1<<e.NORMAL.data.quantization.quantizationBits)-1,m._isOctEncodedDraco=!0);var u,d=f.styleableProperties,h=g.batchTableProperties;for(var p in h){h.hasOwnProperty(p)&&(u=e[p],defined(d)||(d={}),d[p]={typedArray:u.array,componentCount:u.data.componentsPerAttribute})}f.positions=defaultValue(r,f.positions),f.colors=defaultValue(defaultValue(a,n),f.colors),f.normals=defaultValue(o,f.normals),f.batchIds=defaultValue(s,f.batchIds),f.styleableProperties=d}).otherwise(function(e){m._decodingState=DecodingState.FAILED,m._readyPromise.reject(e)}))),!0);var f,g,t}var scratchComputedTranslation$2=new Cartesian4,scratchScale$5=new Cartesian3;function attachTexture(e,t,i){var r=e._gl;r.framebufferTexture2D(r.FRAMEBUFFER,t,i._target,i._texture,0)}function attachRenderbuffer(e,t,i){var r=e._gl;r.framebufferRenderbuffer(r.FRAMEBUFFER,t,r.RENDERBUFFER,i._getRenderbuffer())}function Framebuffer(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context._gl;this._gl=t,this._framebuffer=t.createFramebuffer(),this._colorTextures=[],this._colorRenderbuffers=[],this._activeColorAttachments=[],this._depthTexture=void 0,this._depthRenderbuffer=void 0,this._stencilRenderbuffer=void 0,this._depthStencilTexture=void 0,this._depthStencilRenderbuffer=void 0,this.destroyAttachments=defaultValue(e.destroyAttachments,!0);var i,r,n;defined(e.depthTexture)||defined(e.depthRenderbuffer),defined(e.depthStencilTexture)||defined(e.depthStencilRenderbuffer);if(this._bind(),defined(e.colorTextures))for(var a=e.colorTextures,o=this._colorTextures.length=this._activeColorAttachments.length=a.length,s=0;s<o;++s)i=a[s],attachTexture(this,n=this._gl.COLOR_ATTACHMENT0+s,i),this._activeColorAttachments[s]=n,this._colorTextures[s]=i;if(defined(e.colorRenderbuffers)){var l=e.colorRenderbuffers;for(o=this._colorRenderbuffers.length=this._activeColorAttachments.length=l.length,s=0;s<o;++s)r=l[s],attachRenderbuffer(this,n=this._gl.COLOR_ATTACHMENT0+s,r),this._activeColorAttachments[s]=n,this._colorRenderbuffers[s]=r}defined(e.depthTexture)&&(i=e.depthTexture,attachTexture(this,this._gl.DEPTH_ATTACHMENT,i),this._depthTexture=i),defined(e.depthRenderbuffer)&&(r=e.depthRenderbuffer,attachRenderbuffer(this,this._gl.DEPTH_ATTACHMENT,r),this._depthRenderbuffer=r),defined(e.stencilRenderbuffer)&&(r=e.stencilRenderbuffer,attachRenderbuffer(this,this._gl.STENCIL_ATTACHMENT,r),this._stencilRenderbuffer=r),defined(e.depthStencilTexture)&&(i=e.depthStencilTexture,attachTexture(this,this._gl.DEPTH_STENCIL_ATTACHMENT,i),this._depthStencilTexture=i),defined(e.depthStencilRenderbuffer)&&(r=e.depthStencilRenderbuffer,attachRenderbuffer(this,this._gl.DEPTH_STENCIL_ATTACHMENT,r),this._depthStencilRenderbuffer=r),this._unBind()}PointCloud.prototype.update=function(e){var t,i,r,n,a,o,s,l,c,u,d;decodeDraco(this,e.context)||(t=!1,i=!Matrix4.equals(this._modelMatrix,this.modelMatrix),this._mode!==e.mode&&(this._mode=e.mode,i=!0),defined(this._drawCommand)||(createResources$2(this,e),t=i=!0,this._ready=!0,this._readyPromise.resolve(this),this._parsedContent=void 0),i&&(Matrix4.clone(this.modelMatrix,this._modelMatrix),r=this._drawCommand.modelMatrix,Matrix4.clone(this._modelMatrix,r),defined(this._rtcCenter)&&Matrix4.multiplyByTranslation(r,this._rtcCenter,r),defined(this._quantizedVolumeOffset)&&Matrix4.multiplyByTranslation(r,this._quantizedVolumeOffset,r),e.mode!==SceneMode$1.SCENE3D&&(n=e.mapProjection,a=Matrix4.getColumn(r,3,scratchComputedTranslation$2),Cartesian4.equals(a,Cartesian4.UNIT_W)||Transforms.basisTo2D(n,r,r)),o=this._drawCommand.boundingVolume,BoundingSphere.clone(this._boundingSphere,o),this._cull&&(s=o.center,Matrix4.multiplyByPoint(r,s,s),l=Matrix4.getScale(r,scratchScale$5),o.radius*=Cartesian3.maximumComponent(l))),this.clippingPlanesDirty&&(t=!(this.clippingPlanesDirty=!1)),this._attenuation!==this.attenuation&&(this._attenuation=this.attenuation,t=!0),this.backFaceCulling!==this._backFaceCulling&&(this._backFaceCulling=this.backFaceCulling,t=!0),this.normalShading!==this._normalShading&&(this._normalShading=this.normalShading,t=!0),this._style===this.style&&!this.styleDirty||(this._style=this.style,t=!(this.styleDirty=!1)),t&&createShaders$1(this,e,this._style),this._drawCommand.castShadows=ShadowMode$1.castShadows(this.shadows),this._drawCommand.receiveShadows=ShadowMode$1.receiveShadows(this.shadows),c=this._highlightColor.alpha<1||this._constantColor.alpha<1||this._styleTranslucent,this._drawCommand.renderState=c?this._translucentRenderState:this._opaqueRenderState,this._drawCommand.pass=c?Pass$1.TRANSLUCENT:this._opaquePass,u=e.commandList,((d=e.passes).render||d.pick)&&u.push(this._drawCommand))},PointCloud.prototype.isDestroyed=function(){return!1},PointCloud.prototype.destroy=function(){var e=this._drawCommand;return defined(e)&&(e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy()),destroyObject(this)},Object.defineProperties(Framebuffer.prototype,{status:{get:function(){this._bind();var e=this._gl.checkFramebufferStatus(this._gl.FRAMEBUFFER);return this._unBind(),e}},numberOfColorAttachments:{get:function(){return this._activeColorAttachments.length}},depthTexture:{get:function(){return this._depthTexture}},depthRenderbuffer:{get:function(){return this._depthRenderbuffer}},stencilRenderbuffer:{get:function(){return this._stencilRenderbuffer}},depthStencilTexture:{get:function(){return this._depthStencilTexture}},depthStencilRenderbuffer:{get:function(){return this._depthStencilRenderbuffer}},hasDepthAttachment:{get:function(){return!!(this.depthTexture||this.depthRenderbuffer||this.depthStencilTexture||this.depthStencilRenderbuffer)}}}),Framebuffer.prototype._bind=function(){var e=this._gl;e.bindFramebuffer(e.FRAMEBUFFER,this._framebuffer)},Framebuffer.prototype._unBind=function(){var e=this._gl;e.bindFramebuffer(e.FRAMEBUFFER,null)},Framebuffer.prototype._getActiveColorAttachments=function(){return this._activeColorAttachments},Framebuffer.prototype.getColorTexture=function(e){return this._colorTextures[e]},Framebuffer.prototype.getColorRenderbuffer=function(e){return this._colorRenderbuffers[e]},Framebuffer.prototype.isDestroyed=function(){return!1},Framebuffer.prototype.destroy=function(){if(this.destroyAttachments){for(var e=0,t=this._colorTextures,i=t.length;e<i;++e){var r=t[e];defined(r)&&r.destroy()}for(var n=this._colorRenderbuffers,i=n.length,e=0;e<i;++e){var a=n[e];defined(a)&&a.destroy()}this._depthTexture=this._depthTexture&&this._depthTexture.destroy(),this._depthRenderbuffer=this._depthRenderbuffer&&this._depthRenderbuffer.destroy(),this._stencilRenderbuffer=this._stencilRenderbuffer&&this._stencilRenderbuffer.destroy(),this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),this._depthStencilRenderbuffer=this._depthStencilRenderbuffer&&this._depthStencilRenderbuffer.destroy()}return this._gl.deleteFramebuffer(this._framebuffer),destroyObject(this)};var PointCloudEyeDomeLightingShader="#extension GL_EXT_frag_depth : enable\nuniform sampler2D u_pointCloud_colorGBuffer;\nuniform sampler2D u_pointCloud_depthGBuffer;\nuniform vec2 u_distanceAndEdlStrength;\nvarying vec2 v_textureCoordinates;\nvec2 neighborContribution(float log2Depth, vec2 offset)\n{\nfloat dist = u_distanceAndEdlStrength.x;\nvec2 texCoordOrig = v_textureCoordinates + offset * dist;\nvec2 texCoord0 = v_textureCoordinates + offset * floor(dist);\nvec2 texCoord1 = v_textureCoordinates + offset * ceil(dist);\nfloat depthOrLogDepth0 = czm_unpackDepth(texture2D(u_pointCloud_depthGBuffer, texCoord0));\nfloat depthOrLogDepth1 = czm_unpackDepth(texture2D(u_pointCloud_depthGBuffer, texCoord1));\nif (depthOrLogDepth0 == 0.0 || depthOrLogDepth1 == 0.0) {\nreturn vec2(0.0);\n}\nfloat depthMix = mix(depthOrLogDepth0, depthOrLogDepth1, fract(dist));\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(texCoordOrig, depthMix);\nreturn vec2(max(0.0, log2Depth - log2(-eyeCoordinate.z / eyeCoordinate.w)), 1.0);\n}\nvoid main()\n{\nfloat depthOrLogDepth = czm_unpackDepth(texture2D(u_pointCloud_depthGBuffer, v_textureCoordinates));\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, depthOrLogDepth);\neyeCoordinate /= eyeCoordinate.w;\nfloat log2Depth = log2(-eyeCoordinate.z);\nif (depthOrLogDepth == 0.0)\n{\ndiscard;\n}\nvec4 color = texture2D(u_pointCloud_colorGBuffer, v_textureCoordinates);\nvec2 texelSize = 1.0 / czm_viewport.zw;\nvec2 responseAndCount = vec2(0.0);\nresponseAndCount += neighborContribution(log2Depth, vec2(-texelSize.x, 0.0));\nresponseAndCount += neighborContribution(log2Depth, vec2(+texelSize.x, 0.0));\nresponseAndCount += neighborContribution(log2Depth, vec2(0.0, -texelSize.y));\nresponseAndCount += neighborContribution(log2Depth, vec2(0.0, +texelSize.y));\nfloat response = responseAndCount.x / responseAndCount.y;\nfloat strength = u_distanceAndEdlStrength.y;\nfloat shade = exp(-response * 300.0 * strength);\ncolor.rgb *= shade;\ngl_FragColor = vec4(color);\ngl_FragDepthEXT = depthOrLogDepth;\n}\n";function PointCloudEyeDomeLighting(){this._framebuffer=void 0,this._colorGBuffer=void 0,this._depthGBuffer=void 0,this._depthTexture=void 0,this._drawCommand=void 0,this._clearCommand=void 0,this._strength=1,this._radius=1}function destroyFramebuffer(e){var t=e._framebuffer;defined(t)&&(e._colorGBuffer.destroy(),e._depthGBuffer.destroy(),e._depthTexture.destroy(),t.destroy(),e._framebuffer=void 0,e._colorGBuffer=void 0,e._depthGBuffer=void 0,e._depthTexture=void 0,e._drawCommand=void 0,e._clearCommand=void 0)}function createFramebuffer(e,t){var i=t.drawingBufferWidth,r=t.drawingBufferHeight,n=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),a=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),o=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.DEPTH_COMPONENT,pixelDatatype:PixelDatatype$1.UNSIGNED_INT,sampler:Sampler.NEAREST});e._framebuffer=new Framebuffer({context:t,colorTextures:[n,a],depthTexture:o,destroyAttachments:!1}),e._colorGBuffer=n,e._depthGBuffer=a,e._depthTexture=o}var distanceAndEdlStrengthScratch=new Cartesian2;function createCommands$4(e,t){var i=new ShaderSource({defines:["LOG_DEPTH_WRITE"],sources:[PointCloudEyeDomeLightingShader]}),r={u_pointCloud_colorGBuffer:function(){return e._colorGBuffer},u_pointCloud_depthGBuffer:function(){return e._depthGBuffer},u_distanceAndEdlStrength:function(){return distanceAndEdlStrengthScratch.x=e._radius,distanceAndEdlStrengthScratch.y=e._strength,distanceAndEdlStrengthScratch}},n=RenderState.fromCache({blending:BlendingState$1.ALPHA_BLEND,depthMask:!0,depthTest:{enabled:!0},stencilTest:StencilConstants$1.setCesium3DTileBit(),stencilMask:StencilConstants$1.CESIUM_3D_TILE_MASK});e._drawCommand=t.createViewportQuadCommand(i,{uniformMap:r,renderState:n,pass:Pass$1.CESIUM_3D_TILE,owner:e}),e._clearCommand=new ClearCommand({framebuffer:e._framebuffer,color:new Color(0,0,0,0),depth:1,renderState:RenderState.fromCache(),pass:Pass$1.CESIUM_3D_TILE,owner:e})}function createResources$3(e,t){var i=t.drawingBufferWidth,r=t.drawingBufferHeight,n=e._colorGBuffer,a=!1,o=defined(n)&&(n.width!==i||n.height!==r);return defined(n)&&!o||(destroyFramebuffer(e),createFramebuffer(e,t),createCommands$4(e,t),a=!0),a}function isSupported(e){return e.drawBuffers&&e.fragmentDepth}function getECShaderProgram(e,t){var i,r,n=e.shaderCache.getDerivedShaderProgram(t,"EC");return defined(n)||(i=t._attributeLocations,(r=t.fragmentShaderSource.clone()).sources=r.sources.map(function(e){return e=(e=ShaderSource.replaceMain(e,"czm_point_cloud_post_process_main")).replace(/gl_FragColor/g,"gl_FragData[0]")}),r.sources.unshift("#extension GL_EXT_draw_buffers : enable \n"),r.sources.push("void main() \n{ \n czm_point_cloud_post_process_main(); \n#ifdef LOG_DEPTH\n czm_writeLogDepth();\n gl_FragData[1] = czm_packDepth(gl_FragDepthEXT); \n#else\n gl_FragData[1] = czm_packDepth(gl_FragCoord.z);\n#endif\n}"),n=e.shaderCache.createDerivedShaderProgram(t,"EC",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:r,attributeLocations:i})),n}function PointCloudShading(e){var t=defaultValue(e,{});this.attenuation=defaultValue(t.attenuation,!1),this.geometricErrorScale=defaultValue(t.geometricErrorScale,1),this.maximumAttenuation=t.maximumAttenuation,this.baseResolution=t.baseResolution,this.eyeDomeLighting=defaultValue(t.eyeDomeLighting,!0),this.eyeDomeLightingStrength=defaultValue(t.eyeDomeLightingStrength,1),this.eyeDomeLightingRadius=defaultValue(t.eyeDomeLightingRadius,1),this.backFaceCulling=defaultValue(t.backFaceCulling,!1),this.normalShading=defaultValue(t.normalShading,!0)}function PointCloud3DTileContent(e,t,i,r,n){this._tileset=e,this._tile=t,this._resource=i,this._pickId=void 0,this._batchTable=void 0,this._styleDirty=!1,this._features=void 0,this.featurePropertiesDirty=!1,this._pointCloud=new PointCloud({arrayBuffer:r,byteOffset:n,cull:!1,opaquePass:Pass$1.CESIUM_3D_TILE,vertexShaderLoaded:getVertexShaderLoaded(this),fragmentShaderLoaded:getFragmentShaderLoaded(this),uniformMapLoaded:getUniformMapLoaded(this),batchTableLoaded:getBatchTableLoaded(this),pickIdLoaded:getPickIdLoaded(this)})}function getVertexShaderLoaded(t){return function(e){return defined(t._batchTable)?t._batchTable.getVertexShaderCallback(!1,"a_batchId",void 0)(e):e}}function getFragmentShaderLoaded(t){return function(e){return defined(t._batchTable)?t._batchTable.getFragmentShaderCallback(!1,void 0)(e):"uniform vec4 czm_pickColor;\n"+e}}function getUniformMapLoaded(t){return function(e){return defined(t._batchTable)?t._batchTable.getUniformMapCallback()(e):combine(e,{czm_pickColor:function(){return t._pickId.color}})}}function getBatchTableLoaded(r){return function(e,t,i){r._batchTable=new Cesium3DTileBatchTable(r,e,t,i)}}function getPickIdLoaded(e){return function(){return defined(e._batchTable)?e._batchTable.getPickId():"czm_pickColor"}}function getGeometricError(e){var t=e._tileset.pointCloudShading,i=e._tile.contentBoundingVolume.boundingSphere.volume(),r=CesiumMath.cbrt(i/e.pointsLength),n=e._tile.geometricError;return 0===n&&(n=defined(t)&&defined(t.baseResolution)?t.baseResolution:r),n}function createFeatures$3(e){var t=e.featuresLength;if(!defined(e._features)&&0<t){for(var i=new Array(t),r=0;r<t;++r)i[r]=new Cesium3DTileFeature(e,r);e._features=i}}PointCloudEyeDomeLighting.isSupported=isSupported,PointCloudEyeDomeLighting.prototype.update=function(e,t,i,r){if(isSupported(e.context)){this._strength=i.eyeDomeLightingStrength,this._radius=i.eyeDomeLightingRadius*e.pixelRatio;for(var n=createResources$3(this,e.context),a=e.commandList,o=a.length,s=t;s<o;++s){var l,c=a[s];c.primitiveType===PrimitiveType$1.POINTS&&c.pass!==Pass$1.TRANSLUCENT&&(defined(l=c.derivedCommands.pointCloudProcessor)&&!c.dirty&&!n&&l.framebuffer===this._framebuffer||(l=DrawCommand.shallowClone(c),(c.derivedCommands.pointCloudProcessor=l).framebuffer=this._framebuffer,l.shaderProgram=getECShaderProgram(e.context,c.shaderProgram),l.castShadows=!1,l.receiveShadows=!1),a[s]=l)}var u=this._clearCommand,d=this._drawCommand;d.boundingVolume=r,a.push(d),a.push(u)}},PointCloudEyeDomeLighting.prototype.isDestroyed=function(){return!1},PointCloudEyeDomeLighting.prototype.destroy=function(){return destroyFramebuffer(this),destroyObject(this)},PointCloudShading.isSupported=function(e){return PointCloudEyeDomeLighting.isSupported(e.context)},Object.defineProperties(PointCloud3DTileContent.prototype,{featuresLength:{get:function(){return defined(this._batchTable)?this._batchTable.featuresLength:0}},pointsLength:{get:function(){return this._pointCloud.pointsLength}},trianglesLength:{get:function(){return 0}},geometryByteLength:{get:function(){return this._pointCloud.geometryByteLength}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return defined(this._batchTable)?this._batchTable.memorySizeInBytes:0}},innerContents:{get:function(){}},readyPromise:{get:function(){return this._pointCloud.readyPromise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){return this._batchTable}}}),PointCloud3DTileContent.prototype.hasProperty=function(e,t){return!!defined(this._batchTable)&&this._batchTable.hasProperty(e,t)},PointCloud3DTileContent.prototype.getFeature=function(e){if(defined(this._batchTable)){this.featuresLength;return createFeatures$3(this),this._features[e]}},PointCloud3DTileContent.prototype.applyDebugSettings=function(e,t){this._pointCloud.color=e?t:Color.WHITE},PointCloud3DTileContent.prototype.applyStyle=function(e){defined(this._batchTable)?this._batchTable.applyStyle(e):this._styleDirty=!0};var defaultShading=new PointCloudShading;function Tileset3DTileContent(e,t,i,r,n){this._tileset=e,this._tile=t,this._resource=i,this._readyPromise=when.defer(),this.featurePropertiesDirty=!1,initialize$7(this,r,n)}function initialize$7(t,e,i){i=defaultValue(i,0);var r,n=getStringFromTypedArray(new Uint8Array(e),i);try{r=JSON.parse(n)}catch(e){return void t._readyPromise.reject(new RuntimeError("Invalid tile content."))}t._tileset.loadTileset(t._resource,r,t._tile),t._readyPromise.resolve(t)}function VertexArrayFacade(e,t,i,r){var n=VertexArrayFacade._verifyAttributes(t);i=defaultValue(i,0);for(var a,o,s,l,c=[],u={},d=n.length,h=0;h<d;++h){var p=n[h];p.vertexBuffer?c.push(p):(defined(a=u[o=p.usage])||(a=u[o]=[]),a.push(p))}function m(e,t){return ComponentDatatype$1.getSizeInBytes(t.componentDatatype)-ComponentDatatype$1.getSizeInBytes(e.componentDatatype)}for(o in this._allBuffers=[],u){u.hasOwnProperty(o)&&((a=u[o]).sort(m),l={vertexSizeInBytes:s=VertexArrayFacade._vertexSizeInBytes(a),vertexBuffer:void 0,usage:a[0].usage,needsCommit:!1,arrayBuffer:void 0,arrayViews:VertexArrayFacade._createArrayViews(a,s)},this._allBuffers.push(l))}this._size=0,this._instanced=defaultValue(r,!1),this._precreated=c,this._context=e,this.writers=void 0,this.va=void 0,this.resize(i)}PointCloud3DTileContent.prototype.update=function(e,t){var i,r=this._pointCloud,n=defaultValue(e.pointCloudShading,defaultShading),a=this._tile,o=this._batchTable,s=t.mode,l=e.clippingPlanes;defined(this._pickId)||defined(o)||(this._pickId=t.context.createPickId({primitive:e,content:this})),defined(o)&&o.update(e,t),i=defined(a._contentBoundingVolume)?s===SceneMode$1.SCENE3D?a._contentBoundingVolume.boundingSphere:a._contentBoundingVolume2D.boundingSphere:s===SceneMode$1.SCENE3D?a._boundingVolume.boundingSphere:a._boundingVolume2D.boundingSphere;var c=this._styleDirty;this._styleDirty=!1,r.clippingPlanesOriginMatrix=e.clippingPlanesOriginMatrix,r.style=defined(o)?void 0:e.style,r.styleDirty=c,r.modelMatrix=a.computedTransform,r.time=e.timeSinceLoad,r.shadows=e.shadows,r.boundingSphere=i,r.clippingPlanes=l,r.isClipped=defined(l)&&l.enabled&&a._isClipped,r.clippingPlanesDirty=a.clippingPlanesDirty,r.attenuation=n.attenuation,r.backFaceCulling=n.backFaceCulling,r.normalShading=n.normalShading,r.geometricError=getGeometricError(this),r.geometricErrorScale=n.geometricErrorScale,defined(n)&&defined(n.maximumAttenuation)?r.maximumAttenuation=n.maximumAttenuation:a.refine===Cesium3DTileRefine$1.ADD?r.maximumAttenuation=5:r.maximumAttenuation=e.maximumScreenSpaceError,r.update(t)},PointCloud3DTileContent.prototype.isDestroyed=function(){return!1},PointCloud3DTileContent.prototype.destroy=function(){return this._pickId=this._pickId&&this._pickId.destroy(),this._pointCloud=this._pointCloud&&this._pointCloud.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),destroyObject(this)},Object.defineProperties(Tileset3DTileContent.prototype,{featuresLength:{get:function(){return 0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return 0}},geometryByteLength:{get:function(){return 0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return 0}},innerContents:{get:function(){}},readyPromise:{get:function(){return this._readyPromise.promise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){}}}),Tileset3DTileContent.prototype.hasProperty=function(e,t){return!1},Tileset3DTileContent.prototype.getFeature=function(e){},Tileset3DTileContent.prototype.applyDebugSettings=function(e,t){},Tileset3DTileContent.prototype.applyStyle=function(e){},Tileset3DTileContent.prototype.update=function(e,t){},Tileset3DTileContent.prototype.isDestroyed=function(){return!1},Tileset3DTileContent.prototype.destroy=function(){return destroyObject(this)},VertexArrayFacade._verifyAttributes=function(e){for(var t=[],i=0;i<e.length;++i){var r=e[i],n={index:defaultValue(r.index,i),enabled:defaultValue(r.enabled,!0),componentsPerAttribute:r.componentsPerAttribute,componentDatatype:defaultValue(r.componentDatatype,ComponentDatatype$1.FLOAT),normalize:defaultValue(r.normalize,!1),vertexBuffer:r.vertexBuffer,usage:defaultValue(r.usage,BufferUsage$1.STATIC_DRAW)};t.push(n)}for(var a=new Array(t.length),o=0;o<t.length;++o){a[t[o].index]=!0}return t},VertexArrayFacade._vertexSizeInBytes=function(e){for(var t=0,i=e.length,r=0;r<i;++r){var n=e[r];t+=n.componentsPerAttribute*ComponentDatatype$1.getSizeInBytes(n.componentDatatype)}var a=0<i?ComponentDatatype$1.getSizeInBytes(e[0].componentDatatype):0,o=0<a?t%a:0;return t+=0==o?0:a-o},VertexArrayFacade._createArrayViews=function(e,t){for(var i=[],r=0,n=e.length,a=0;a<n;++a){var o=e[a],s=o.componentDatatype;i.push({index:o.index,enabled:o.enabled,componentsPerAttribute:o.componentsPerAttribute,componentDatatype:s,normalize:o.normalize,offsetInBytes:r,vertexSizeInComponentType:t/ComponentDatatype$1.getSizeInBytes(s),view:void 0}),r+=o.componentsPerAttribute*ComponentDatatype$1.getSizeInBytes(s)}return i},VertexArrayFacade.prototype.resize=function(e){this._size=e;var t=this._allBuffers;this.writers=[];for(var i=0,r=t.length;i<r;++i){var n=t[i];VertexArrayFacade._resize(n,this._size),VertexArrayFacade._appendWriters(this.writers,n)}destroyVA(this)},VertexArrayFacade._resize=function(e,t){if(0<e.vertexSizeInBytes){var i=new ArrayBuffer(t*e.vertexSizeInBytes);if(defined(e.arrayBuffer))for(var r=new Uint8Array(i),n=new Uint8Array(e.arrayBuffer),a=n.length,o=0;o<a;++o)r[o]=n[o];for(var s=e.arrayViews,l=s.length,c=0;c<l;++c){var u=s[c];u.view=ComponentDatatype$1.createArrayBufferView(u.componentDatatype,i,u.offsetInBytes)}e.arrayBuffer=i}};var createWriters=[function(i,r,n){return function(e,t){r[e*n]=t,i.needsCommit=!0}},function(n,a,o){return function(e,t,i){var r=e*o;a[r]=t,a[1+r]=i,n.needsCommit=!0}},function(a,o,s){return function(e,t,i,r){var n=e*s;o[n]=t,o[1+n]=i,o[2+n]=r,a.needsCommit=!0}},function(o,s,l){return function(e,t,i,r,n){var a=e*l;s[a]=t,s[1+a]=i,s[2+a]=r,s[3+a]=n,o.needsCommit=!0}}];function commit(e,t){if(t.needsCommit&&0<t.vertexSizeInBytes){t.needsCommit=!1;var i=t.vertexBuffer,r=e._size*t.vertexSizeInBytes,n=defined(i);if(!n||i.sizeInBytes<r)return n&&i.destroy(),t.vertexBuffer=Buffer$1.createVertexBuffer({context:e._context,typedArray:t.arrayBuffer,usage:t.usage}),!(t.vertexBuffer.vertexArrayDestroyable=!1);t.vertexBuffer.copyFromArrayView(t.arrayBuffer)}return!1}function subCommit(e,t,i){var r,n;e.needsCommit&&0<e.vertexSizeInBytes&&(r=e.vertexSizeInBytes*t,n=e.vertexSizeInBytes*i,e.vertexBuffer.copyFromArrayView(new Uint8Array(e.arrayBuffer,r,n),r))}function destroyVA(e){var t=e.va;if(defined(t)){for(var i=t.length,r=0;r<i;++r)t[r].va.destroy();e.va=void 0}}VertexArrayFacade._appendWriters=function(e,t){for(var i=t.arrayViews,r=i.length,n=0;n<r;++n){var a=i[n];e[a.index]=createWriters[a.componentsPerAttribute-1](t,a.view,a.vertexSizeInComponentType)}},VertexArrayFacade.prototype.commit=function(e){var t,i=!1,r=this._allBuffers;for(c=0,u=r.length;c<u;++c)i=commit(this,t=r[c])||i;if(i||!defined(this.va)){destroyVA(this);for(var n=this.va=[],a=CesiumMath.SIXTY_FOUR_KILOBYTES-4,o=defined(e)&&!this._instanced?Math.ceil(this._size/a):1,s=0;s<o;++s){for(var l=[],c=0,u=r.length;c<u;++c){var d=s*((t=r[c]).vertexSizeInBytes*a);VertexArrayFacade._appendAttributes(l,t,d,this._instanced)}l=l.concat(this._precreated),n.push({va:new VertexArray({context:this._context,attributes:l,indexBuffer:e}),indicesCount:1.5*(s!==o-1?a:this._size%a)})}}},VertexArrayFacade._appendAttributes=function(e,t,i,r){for(var n=t.arrayViews,a=n.length,o=0;o<a;++o){var s=n[o];e.push({index:s.index,enabled:s.enabled,componentsPerAttribute:s.componentsPerAttribute,componentDatatype:s.componentDatatype,normalize:s.normalize,vertexBuffer:t.vertexBuffer,offsetInBytes:i+s.offsetInBytes,strideInBytes:t.vertexSizeInBytes,instanceDivisor:r?1:0})}},VertexArrayFacade.prototype.subCommit=function(e,t){for(var i=this._allBuffers,r=0,n=i.length;r<n;++r)subCommit(i[r],e,t)},VertexArrayFacade.prototype.endSubCommits=function(){for(var e=this._allBuffers,t=0,i=e.length;t<i;++t)e[t].needsCommit=!1},VertexArrayFacade.prototype.isDestroyed=function(){return!1},VertexArrayFacade.prototype.destroy=function(){for(var e=this._allBuffers,t=0,i=e.length;t<i;++t){var r=e[t];r.vertexBuffer=r.vertexBuffer&&r.vertexBuffer.destroy()}return destroyVA(this),destroyObject(this)};var BillboardCollectionFS="#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\nuniform sampler2D u_atlas;\n#ifdef VECTOR_TILE\nuniform vec4 u_highlightColor;\n#endif\nvarying vec2 v_textureCoordinates;\nvarying vec4 v_pickColor;\nvarying vec4 v_color;\n#ifdef SDF\nvarying vec4 v_outlineColor;\nvarying float v_outlineWidth;\n#endif\n#ifdef FRAGMENT_DEPTH_CHECK\nvarying vec4 v_textureCoordinateBounds;\nvarying vec4 v_originTextureCoordinateAndTranslate;\nvarying vec4 v_compressed;\nvarying mat2 v_rotationMatrix;\nconst float SHIFT_LEFT12 = 4096.0;\nconst float SHIFT_LEFT1 = 2.0;\nconst float SHIFT_RIGHT12 = 1.0 / 4096.0;\nconst float SHIFT_RIGHT1 = 1.0 / 2.0;\nfloat getGlobeDepth(vec2 adjustedST, vec2 depthLookupST, bool applyTranslate, vec2 dimensions, vec2 imageSize)\n{\nvec2 lookupVector = imageSize * (depthLookupST - adjustedST);\nlookupVector = v_rotationMatrix * lookupVector;\nvec2 labelOffset = (dimensions - imageSize) * (depthLookupST - vec2(0.0, v_originTextureCoordinateAndTranslate.y));\nvec2 translation = v_originTextureCoordinateAndTranslate.zw;\nif (applyTranslate)\n{\ntranslation += (dimensions * v_originTextureCoordinateAndTranslate.xy * vec2(1.0, 0.0));\n}\nvec2 st = ((lookupVector - translation + labelOffset) + gl_FragCoord.xy) / czm_viewport.zw;\nfloat logDepthOrDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, st));\nif (logDepthOrDepth == 0.0)\n{\nreturn 0.0;\n}\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth);\nreturn eyeCoordinate.z / eyeCoordinate.w;\n}\n#endif\n#ifdef SDF\nfloat getDistance(vec2 position)\n{\nreturn texture2D(u_atlas, position).r;\n}\nvec4 getSDFColor(vec2 position, float outlineWidth, vec4 outlineColor, float smoothing)\n{\nfloat distance = getDistance(position);\nif (outlineWidth > 0.0)\n{\nfloat outlineEdge = clamp(SDF_EDGE - outlineWidth, 0.0, SDF_EDGE);\nfloat outlineFactor = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance);\nvec4 sdfColor = mix(outlineColor, v_color, outlineFactor);\nfloat alpha = smoothstep(outlineEdge - smoothing, outlineEdge + smoothing, distance);\nreturn vec4(sdfColor.rgb, sdfColor.a * alpha);\n}\nelse\n{\nfloat alpha = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance);\nreturn vec4(v_color.rgb, v_color.a * alpha);\n}\n}\n#endif\nvoid main()\n{\nvec4 color = texture2D(u_atlas, v_textureCoordinates);\n#ifdef SDF\nfloat outlineWidth = v_outlineWidth;\nvec4 outlineColor = v_outlineColor;\nfloat distance = getDistance(v_textureCoordinates);\n#ifdef GL_OES_standard_derivatives\nfloat smoothing = fwidth(distance);\nvec2 sampleOffset = 0.354 * vec2(dFdx(v_textureCoordinates) + dFdy(v_textureCoordinates));\nvec4 center = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing);\nvec4 color1 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing);\nvec4 color2 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing);\nvec4 color3 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing);\nvec4 color4 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing);\ncolor = (center + color1 + color2 + color3 + color4)/5.0;\n#else\nfloat smoothing = 1.0/32.0;\ncolor = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing);\n#endif\ncolor = czm_gammaCorrect(color);\n#else\ncolor = czm_gammaCorrect(color);\ncolor *= czm_gammaCorrect(v_color);\n#endif\n#if !defined(OPAQUE) && !defined(TRANSLUCENT)\nif (color.a < 0.005)\n{\ndiscard;\n}\n#else\n#ifdef OPAQUE\nif (color.a < 0.995)\n{\ndiscard;\n}\n#else\nif (color.a >= 0.995)\n{\ndiscard;\n}\n#endif\n#endif\n#ifdef VECTOR_TILE\ncolor *= u_highlightColor;\n#endif\ngl_FragColor = color;\n#ifdef LOG_DEPTH\nczm_writeLogDepth();\n#endif\n#ifdef FRAGMENT_DEPTH_CHECK\nfloat temp = v_compressed.y;\ntemp = temp * SHIFT_RIGHT1;\nfloat temp2 = (temp - floor(temp)) * SHIFT_LEFT1;\nbool enableDepthTest = temp2 != 0.0;\nbool applyTranslate = floor(temp) != 0.0;\nif (enableDepthTest) {\ntemp = v_compressed.z;\ntemp = temp * SHIFT_RIGHT12;\nvec2 dimensions;\ndimensions.y = (temp - floor(temp)) * SHIFT_LEFT12;\ndimensions.x = floor(temp);\ntemp = v_compressed.w;\ntemp = temp * SHIFT_RIGHT12;\nvec2 imageSize;\nimageSize.y = (temp - floor(temp)) * SHIFT_LEFT12;\nimageSize.x = floor(temp);\nvec2 adjustedST = v_textureCoordinates - v_textureCoordinateBounds.xy;\nadjustedST = adjustedST / vec2(v_textureCoordinateBounds.z - v_textureCoordinateBounds.x, v_textureCoordinateBounds.w - v_textureCoordinateBounds.y);\nfloat epsilonEyeDepth = v_compressed.x + czm_epsilon1;\nfloat globeDepth1 = getGlobeDepth(adjustedST, v_originTextureCoordinateAndTranslate.xy, applyTranslate, dimensions, imageSize);\nif (globeDepth1 != 0.0 && globeDepth1 > epsilonEyeDepth)\n{\nfloat globeDepth2 = getGlobeDepth(adjustedST, vec2(0.0, 1.0), applyTranslate, dimensions, imageSize);\nif (globeDepth2 != 0.0 && globeDepth2 > epsilonEyeDepth)\n{\nfloat globeDepth3 = getGlobeDepth(adjustedST, vec2(1.0, 1.0), applyTranslate, dimensions, imageSize);\nif (globeDepth3 != 0.0 && globeDepth3 > epsilonEyeDepth)\n{\ndiscard;\n}\n}\n}\n}\n#endif\n}\n",BillboardCollectionVS="#ifdef INSTANCED\nattribute vec2 direction;\n#endif\nattribute vec4 positionHighAndScale;\nattribute vec4 positionLowAndRotation;\nattribute vec4 compressedAttribute0;\nattribute vec4 compressedAttribute1;\nattribute vec4 compressedAttribute2;\nattribute vec4 eyeOffset;\nattribute vec4 scaleByDistance;\nattribute vec4 pixelOffsetScaleByDistance;\nattribute vec4 compressedAttribute3;\nattribute vec2 sdf;\n#if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK)\nattribute vec4 textureCoordinateBoundsOrLabelTranslate;\n#endif\n#ifdef VECTOR_TILE\nattribute float a_batchId;\n#endif\nvarying vec2 v_textureCoordinates;\n#ifdef FRAGMENT_DEPTH_CHECK\nvarying vec4 v_textureCoordinateBounds;\nvarying vec4 v_originTextureCoordinateAndTranslate;\nvarying vec4 v_compressed;\nvarying mat2 v_rotationMatrix;\n#endif\nvarying vec4 v_pickColor;\nvarying vec4 v_color;\n#ifdef SDF\nvarying vec4 v_outlineColor;\nvarying float v_outlineWidth;\n#endif\nconst float UPPER_BOUND = 32768.0;\nconst float SHIFT_LEFT16 = 65536.0;\nconst float SHIFT_LEFT12 = 4096.0;\nconst float SHIFT_LEFT8 = 256.0;\nconst float SHIFT_LEFT7 = 128.0;\nconst float SHIFT_LEFT5 = 32.0;\nconst float SHIFT_LEFT3 = 8.0;\nconst float SHIFT_LEFT2 = 4.0;\nconst float SHIFT_LEFT1 = 2.0;\nconst float SHIFT_RIGHT12 = 1.0 / 4096.0;\nconst float SHIFT_RIGHT8 = 1.0 / 256.0;\nconst float SHIFT_RIGHT7 = 1.0 / 128.0;\nconst float SHIFT_RIGHT5 = 1.0 / 32.0;\nconst float SHIFT_RIGHT3 = 1.0 / 8.0;\nconst float SHIFT_RIGHT2 = 1.0 / 4.0;\nconst float SHIFT_RIGHT1 = 1.0 / 2.0;\nvec4 addScreenSpaceOffset(vec4 positionEC, vec2 imageSize, float scale, vec2 direction, vec2 origin, vec2 translate, vec2 pixelOffset, vec3 alignedAxis, bool validAlignedAxis, float rotation, bool sizeInMeters, out mat2 rotationMatrix, out float mpp)\n{\nvec2 halfSize = imageSize * scale * 0.5;\nhalfSize *= ((direction * 2.0) - 1.0);\nvec2 originTranslate = origin * abs(halfSize);\n#if defined(ROTATION) || defined(ALIGNED_AXIS)\nif (validAlignedAxis || rotation != 0.0)\n{\nfloat angle = rotation;\nif (validAlignedAxis)\n{\nvec4 projectedAlignedAxis = czm_modelViewProjection * vec4(alignedAxis, 0.0);\nangle += sign(-projectedAlignedAxis.x) * acos(sign(projectedAlignedAxis.y) * (projectedAlignedAxis.y * projectedAlignedAxis.y) /\n(projectedAlignedAxis.x * projectedAlignedAxis.x + projectedAlignedAxis.y * projectedAlignedAxis.y));\n}\nfloat cosTheta = cos(angle);\nfloat sinTheta = sin(angle);\nrotationMatrix = mat2(cosTheta, sinTheta, -sinTheta, cosTheta);\nhalfSize = rotationMatrix * halfSize;\n}\nelse\n{\nrotationMatrix = mat2(1.0, 0.0, 0.0, 1.0);\n}\n#endif\nmpp = czm_metersPerPixel(positionEC);\npositionEC.xy += (originTranslate + halfSize) * czm_branchFreeTernary(sizeInMeters, 1.0, mpp);\npositionEC.xy += (translate + pixelOffset) * mpp;\nreturn positionEC;\n}\n#ifdef VERTEX_DEPTH_CHECK\nfloat getGlobeDepth(vec4 positionEC)\n{\nvec4 posWC = czm_eyeToWindowCoordinates(positionEC);\nfloat globeDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, posWC.xy / czm_viewport.zw));\nif (globeDepth == 0.0)\n{\nreturn 0.0;\n}\nvec4 eyeCoordinate = czm_windowToEyeCoordinates(posWC.xy, globeDepth);\nreturn eyeCoordinate.z / eyeCoordinate.w;\n}\n#endif\nvoid main()\n{\nvec3 positionHigh = positionHighAndScale.xyz;\nvec3 positionLow = positionLowAndRotation.xyz;\nfloat scale = positionHighAndScale.w;\n#if defined(ROTATION) || defined(ALIGNED_AXIS)\nfloat rotation = positionLowAndRotation.w;\n#else\nfloat rotation = 0.0;\n#endif\nfloat compressed = compressedAttribute0.x;\nvec2 pixelOffset;\npixelOffset.x = floor(compressed * SHIFT_RIGHT7);\ncompressed -= pixelOffset.x * SHIFT_LEFT7;\npixelOffset.x -= UPPER_BOUND;\nvec2 origin;\norigin.x = floor(compressed * SHIFT_RIGHT5);\ncompressed -= origin.x * SHIFT_LEFT5;\norigin.y = floor(compressed * SHIFT_RIGHT3);\ncompressed -= origin.y * SHIFT_LEFT3;\n#ifdef FRAGMENT_DEPTH_CHECK\nvec2 depthOrigin = origin.xy;\n#endif\norigin -= vec2(1.0);\nfloat show = floor(compressed * SHIFT_RIGHT2);\ncompressed -= show * SHIFT_LEFT2;\n#ifdef INSTANCED\nvec2 textureCoordinatesBottomLeft = czm_decompressTextureCoordinates(compressedAttribute0.w);\nvec2 textureCoordinatesRange = czm_decompressTextureCoordinates(eyeOffset.w);\nvec2 textureCoordinates = textureCoordinatesBottomLeft + direction * textureCoordinatesRange;\n#else\nvec2 direction;\ndirection.x = floor(compressed * SHIFT_RIGHT1);\ndirection.y = compressed - direction.x * SHIFT_LEFT1;\nvec2 textureCoordinates = czm_decompressTextureCoordinates(compressedAttribute0.w);\n#endif\nfloat temp = compressedAttribute0.y * SHIFT_RIGHT8;\npixelOffset.y = -(floor(temp) - UPPER_BOUND);\nvec2 translate;\ntranslate.y = (temp - floor(temp)) * SHIFT_LEFT16;\ntemp = compressedAttribute0.z * SHIFT_RIGHT8;\ntranslate.x = floor(temp) - UPPER_BOUND;\ntranslate.y += (temp - floor(temp)) * SHIFT_LEFT8;\ntranslate.y -= UPPER_BOUND;\ntemp = compressedAttribute1.x * SHIFT_RIGHT8;\nfloat temp2 = floor(compressedAttribute2.w * SHIFT_RIGHT2);\nvec2 imageSize = vec2(floor(temp), temp2);\n#ifdef FRAGMENT_DEPTH_CHECK\nfloat labelHorizontalOrigin = floor(compressedAttribute2.w - (temp2 * SHIFT_LEFT2));\nfloat applyTranslate = 0.0;\nif (labelHorizontalOrigin != 0.0)\n{\napplyTranslate = 1.0;\nlabelHorizontalOrigin -= 2.0;\ndepthOrigin.x = labelHorizontalOrigin + 1.0;\n}\ndepthOrigin = vec2(1.0) - (depthOrigin * 0.5);\n#endif\n#ifdef EYE_DISTANCE_TRANSLUCENCY\nvec4 translucencyByDistance;\ntranslucencyByDistance.x = compressedAttribute1.z;\ntranslucencyByDistance.z = compressedAttribute1.w;\ntranslucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0;\ntemp = compressedAttribute1.y * SHIFT_RIGHT8;\ntranslucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0;\n#endif\n#if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK)\ntemp = compressedAttribute3.w;\ntemp = temp * SHIFT_RIGHT12;\nvec2 dimensions;\ndimensions.y = (temp - floor(temp)) * SHIFT_LEFT12;\ndimensions.x = floor(temp);\n#endif\n#ifdef ALIGNED_AXIS\nvec3 alignedAxis = czm_octDecode(floor(compressedAttribute1.y * SHIFT_RIGHT8));\ntemp = compressedAttribute2.z * SHIFT_RIGHT5;\nbool validAlignedAxis = (temp - floor(temp)) * SHIFT_LEFT1 > 0.0;\n#else\nvec3 alignedAxis = vec3(0.0);\nbool validAlignedAxis = false;\n#endif\nvec4 pickColor;\nvec4 color;\ntemp = compressedAttribute2.y;\ntemp = temp * SHIFT_RIGHT8;\npickColor.b = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\npickColor.g = (temp - floor(temp)) * SHIFT_LEFT8;\npickColor.r = floor(temp);\ntemp = compressedAttribute2.x;\ntemp = temp * SHIFT_RIGHT8;\ncolor.b = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\ncolor.g = (temp - floor(temp)) * SHIFT_LEFT8;\ncolor.r = floor(temp);\ntemp = compressedAttribute2.z * SHIFT_RIGHT8;\nbool sizeInMeters = floor((temp - floor(temp)) * SHIFT_LEFT7) > 0.0;\ntemp = floor(temp) * SHIFT_RIGHT8;\npickColor.a = (temp - floor(temp)) * SHIFT_LEFT8;\npickColor /= 255.0;\ncolor.a = floor(temp);\ncolor /= 255.0;\nvec4 p = czm_translateRelativeToEye(positionHigh, positionLow);\nvec4 positionEC = czm_modelViewRelativeToEye * p;\n#if defined(FRAGMENT_DEPTH_CHECK) || defined(VERTEX_DEPTH_CHECK)\nfloat eyeDepth = positionEC.z;\n#endif\npositionEC = czm_eyeOffset(positionEC, eyeOffset.xyz);\npositionEC.xyz *= show;\n#if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(EYE_DISTANCE_PIXEL_OFFSET) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE)\nfloat lengthSq;\nif (czm_sceneMode == czm_sceneMode2D)\n{\nlengthSq = czm_eyeHeight2D.y;\n}\nelse\n{\nlengthSq = dot(positionEC.xyz, positionEC.xyz);\n}\n#endif\n#ifdef EYE_DISTANCE_SCALING\nfloat distanceScale = czm_nearFarScalar(scaleByDistance, lengthSq);\nscale *= distanceScale;\ntranslate *= distanceScale;\nif (scale == 0.0)\n{\npositionEC.xyz = vec3(0.0);\n}\n#endif\nfloat translucency = 1.0;\n#ifdef EYE_DISTANCE_TRANSLUCENCY\ntranslucency = czm_nearFarScalar(translucencyByDistance, lengthSq);\nif (translucency == 0.0)\n{\npositionEC.xyz = vec3(0.0);\n}\n#endif\n#ifdef EYE_DISTANCE_PIXEL_OFFSET\nfloat pixelOffsetScale = czm_nearFarScalar(pixelOffsetScaleByDistance, lengthSq);\npixelOffset *= pixelOffsetScale;\n#endif\n#ifdef DISTANCE_DISPLAY_CONDITION\nfloat nearSq = compressedAttribute3.x;\nfloat farSq = compressedAttribute3.y;\nif (lengthSq < nearSq || lengthSq > farSq)\n{\npositionEC.xyz = vec3(0.0);\n}\n#endif\nmat2 rotationMatrix;\nfloat mpp;\n#ifdef DISABLE_DEPTH_DISTANCE\nfloat disableDepthTestDistance = compressedAttribute3.z;\n#endif\n#ifdef VERTEX_DEPTH_CHECK\nif (lengthSq < disableDepthTestDistance) {\nfloat depthsilon = 10.0;\nvec2 labelTranslate = textureCoordinateBoundsOrLabelTranslate.xy;\nvec4 pEC1 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp);\nfloat globeDepth1 = getGlobeDepth(pEC1);\nif (globeDepth1 != 0.0 && pEC1.z + depthsilon < globeDepth1)\n{\nvec4 pEC2 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0, 1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp);\nfloat globeDepth2 = getGlobeDepth(pEC2);\nif (globeDepth2 != 0.0 && pEC2.z + depthsilon < globeDepth2)\n{\nvec4 pEC3 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp);\nfloat globeDepth3 = getGlobeDepth(pEC3);\nif (globeDepth3 != 0.0 && pEC3.z + depthsilon < globeDepth3)\n{\npositionEC.xyz = vec3(0.0);\n}\n}\n}\n}\n#endif\npositionEC = addScreenSpaceOffset(positionEC, imageSize, scale, direction, origin, translate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp);\ngl_Position = czm_projection * positionEC;\nv_textureCoordinates = textureCoordinates;\n#ifdef LOG_DEPTH\nczm_vertexLogDepth();\n#endif\n#ifdef DISABLE_DEPTH_DISTANCE\nif (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0)\n{\ndisableDepthTestDistance = czm_minimumDisableDepthTestDistance;\n}\nif (disableDepthTestDistance != 0.0)\n{\nfloat zclip = gl_Position.z / gl_Position.w;\nbool clipped = (zclip < -1.0 || zclip > 1.0);\nif (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance)))\n{\ngl_Position.z = -gl_Position.w;\n#ifdef LOG_DEPTH\nv_depthFromNearPlusOne = 1.0;\n#endif\n}\n}\n#endif\n#ifdef FRAGMENT_DEPTH_CHECK\nif (sizeInMeters) {\ntranslate /= mpp;\ndimensions /= mpp;\nimageSize /= mpp;\n}\n#if defined(ROTATION) || defined(ALIGNED_AXIS)\nv_rotationMatrix = rotationMatrix;\n#else\nv_rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0);\n#endif\nfloat enableDepthCheck = 0.0;\nif (lengthSq < disableDepthTestDistance)\n{\nenableDepthCheck = 1.0;\n}\nfloat dw = floor(clamp(dimensions.x, 0.0, SHIFT_LEFT12));\nfloat dh = floor(clamp(dimensions.y, 0.0, SHIFT_LEFT12));\nfloat iw = floor(clamp(imageSize.x, 0.0, SHIFT_LEFT12));\nfloat ih = floor(clamp(imageSize.y, 0.0, SHIFT_LEFT12));\nv_compressed.x = eyeDepth;\nv_compressed.y = applyTranslate * SHIFT_LEFT1 + enableDepthCheck;\nv_compressed.z = dw * SHIFT_LEFT12 + dh;\nv_compressed.w = iw * SHIFT_LEFT12 + ih;\nv_originTextureCoordinateAndTranslate.xy = depthOrigin;\nv_originTextureCoordinateAndTranslate.zw = translate;\nv_textureCoordinateBounds = textureCoordinateBoundsOrLabelTranslate;\n#endif\n#ifdef SDF\nvec4 outlineColor;\nfloat outlineWidth;\ntemp = sdf.x;\ntemp = temp * SHIFT_RIGHT8;\noutlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\noutlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8;\noutlineColor.r = floor(temp);\ntemp = sdf.y;\ntemp = temp * SHIFT_RIGHT8;\nfloat temp3 = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\noutlineWidth = (temp - floor(temp)) * SHIFT_LEFT8;\noutlineColor.a = floor(temp);\noutlineColor /= 255.0;\nv_outlineWidth = outlineWidth / 255.0;\nv_outlineColor = outlineColor;\nv_outlineColor.a *= translucency;\n#endif\nv_pickColor = pickColor;\nv_color = color;\nv_color.a *= translucency;\n}\n",SceneTransforms={},actualPositionScratch=new Cartesian4(0,0,0,1),positionCC=new Cartesian4,scratchViewport$1=new BoundingRectangle,scratchWindowCoord0=new Cartesian2,scratchWindowCoord1=new Cartesian2;SceneTransforms.wgs84ToWindowCoordinates=function(e,t,i){return SceneTransforms.wgs84WithEyeOffsetToWindowCoordinates(e,t,Cartesian3.ZERO,i)};var scratchCartesian4$3=new Cartesian4,scratchEyeOffset=new Cartesian3;function worldToClip(e,t,i,r){var n=i.viewMatrix,a=Matrix4.multiplyByVector(n,Cartesian4.fromElements(e.x,e.y,e.z,1,scratchCartesian4$3),scratchCartesian4$3),o=Cartesian3.multiplyComponents(t,Cartesian3.normalize(a,scratchEyeOffset),scratchEyeOffset);return a.x+=t.x+o.x,a.y+=t.y+o.y,a.z+=o.z,Matrix4.multiplyByVector(i.frustum.projectionMatrix,a,r)}var scratchMaxCartographic=new Cartographic(Math.PI,CesiumMath.PI_OVER_TWO),scratchProjectedCartesian=new Cartesian3,scratchCameraPosition=new Cartesian3;SceneTransforms.wgs84WithEyeOffsetToWindowCoordinates=function(e,t,i,r){var n=e.frameState,a=SceneTransforms.computeActualWgs84Position(n,t,actualPositionScratch);if(defined(a)){var o=e.canvas,s=scratchViewport$1;s.x=0,s.y=0,s.width=o.clientWidth,s.height=o.clientHeight;var l,c,u,d,h,p,m,f,g,_,y=e.camera,v=!1;if(n.mode===SceneMode$1.SCENE2D&&(l=e.mapProjection.project(scratchMaxCartographic,scratchProjectedCartesian),c=Cartesian3.clone(y.position,scratchCameraPosition),u=y.frustum.clone(),d=Matrix4.computeViewportTransformation(s,0,1,new Matrix4),h=y.frustum.projectionMatrix,p=y.positionWC.y,m=Cartesian3.fromElements(CesiumMath.sign(p)*l.x-p,0,-y.positionWC.x),f=Transforms.pointToGLWindowCoordinates(h,d,m),0===p||f.x<=0||f.x>=o.clientWidth?v=!0:(positionCC=(f.x>.5*o.clientWidth?(s.width=f.x,y.frustum.right=l.x-p,positionCC=worldToClip(a,i,y,positionCC),SceneTransforms.clipToGLWindowCoordinates(s,positionCC,scratchWindowCoord0),s.x+=f.x,y.position.x=-y.position.x,g=y.frustum.right,y.frustum.right=-y.frustum.left,y.frustum.left=-g):(s.x+=f.x,s.width-=f.x,y.frustum.left=-l.x-p,positionCC=worldToClip(a,i,y,positionCC),SceneTransforms.clipToGLWindowCoordinates(s,positionCC,scratchWindowCoord0),s.x=s.x-s.width,y.position.x=-y.position.x,_=y.frustum.left,y.frustum.left=-y.frustum.right,y.frustum.right=-_),worldToClip(a,i,y,positionCC)),SceneTransforms.clipToGLWindowCoordinates(s,positionCC,scratchWindowCoord1),Cartesian3.clone(c,y.position),y.frustum=u.clone(),((r=Cartesian2.clone(scratchWindowCoord0,r)).x<0||r.x>o.clientWidth)&&(r.x=scratchWindowCoord1.x))),n.mode!==SceneMode$1.SCENE2D||v){if((positionCC=worldToClip(a,i,y,positionCC)).z<0&&!(y.frustum instanceof OrthographicFrustum)&&!(y.frustum instanceof OrthographicOffCenterFrustum))return;r=SceneTransforms.clipToGLWindowCoordinates(s,positionCC,r)}return r.y=o.clientHeight-r.y,r}},SceneTransforms.wgs84ToDrawingBufferCoordinates=function(e,t,i){if(defined(i=SceneTransforms.wgs84ToWindowCoordinates(e,t,i)))return SceneTransforms.transformWindowToDrawingBuffer(e,i,i)};var projectedPosition=new Cartesian3,positionInCartographic=new Cartographic;SceneTransforms.computeActualWgs84Position=function(e,t,i){var r=e.mode;if(r===SceneMode$1.SCENE3D)return Cartesian3.clone(t,i);var n=e.mapProjection,a=n.ellipsoid.cartesianToCartographic(t,positionInCartographic);if(defined(a)){if(n.project(a,projectedPosition),r===SceneMode$1.COLUMBUS_VIEW)return Cartesian3.fromElements(projectedPosition.z,projectedPosition.x,projectedPosition.y,i);if(r===SceneMode$1.SCENE2D)return Cartesian3.fromElements(0,projectedPosition.x,projectedPosition.y,i);var o=e.morphTime;return Cartesian3.fromElements(CesiumMath.lerp(projectedPosition.z,t.x,o),CesiumMath.lerp(projectedPosition.x,t.y,o),CesiumMath.lerp(projectedPosition.y,t.z,o),i)}};var positionNDC=new Cartesian3,positionWC=new Cartesian3,viewportTransform=new Matrix4;SceneTransforms.clipToGLWindowCoordinates=function(e,t,i){return Cartesian3.divideByScalar(t,t.w,positionNDC),Matrix4.computeViewportTransformation(e,0,1,viewportTransform),Matrix4.multiplyByPoint(viewportTransform,positionNDC,positionWC),Cartesian2.fromCartesian3(positionWC,i)},SceneTransforms.transformWindowToDrawingBuffer=function(e,t,i){var r=e.canvas,n=e.drawingBufferWidth/r.clientWidth,a=e.drawingBufferHeight/r.clientHeight;return Cartesian2.fromElements(t.x*n,t.y*a,i)};var scratchNDC=new Cartesian4,scratchWorldCoords=new Cartesian4;function Billboard(e,t){var i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).translucencyByDistance,r=e.pixelOffsetScaleByDistance,n=e.scaleByDistance,a=e.distanceDisplayCondition;defined(i)&&(i=NearFarScalar.clone(i)),defined(r)&&(r=NearFarScalar.clone(r)),defined(n)&&(n=NearFarScalar.clone(n)),defined(a)&&(a=DistanceDisplayCondition.clone(a)),this._show=defaultValue(e.show,!0),this._position=Cartesian3.clone(defaultValue(e.position,Cartesian3.ZERO)),this._actualPosition=Cartesian3.clone(this._position),this._pixelOffset=Cartesian2.clone(defaultValue(e.pixelOffset,Cartesian2.ZERO)),this._translate=new Cartesian2(0,0),this._eyeOffset=Cartesian3.clone(defaultValue(e.eyeOffset,Cartesian3.ZERO)),this._heightReference=defaultValue(e.heightReference,HeightReference$1.NONE),this._verticalOrigin=defaultValue(e.verticalOrigin,VerticalOrigin$1.CENTER),this._horizontalOrigin=defaultValue(e.horizontalOrigin,HorizontalOrigin$1.CENTER),this._scale=defaultValue(e.scale,1),this._color=Color.clone(defaultValue(e.color,Color.WHITE)),this._rotation=defaultValue(e.rotation,0),this._alignedAxis=Cartesian3.clone(defaultValue(e.alignedAxis,Cartesian3.ZERO)),this._width=e.width,this._height=e.height,this._scaleByDistance=n,this._translucencyByDistance=i,this._pixelOffsetScaleByDistance=r,this._sizeInMeters=defaultValue(e.sizeInMeters,!1),this._distanceDisplayCondition=a,this._disableDepthTestDistance=e.disableDepthTestDistance,this._id=e.id,this._collection=defaultValue(e.collection,t),this._pickId=void 0,this._pickPrimitive=defaultValue(e._pickPrimitive,this),this._billboardCollection=t,this._dirty=!1,this._index=-1,this._batchIndex=void 0,this._imageIndex=-1,this._imageIndexPromise=void 0,this._imageId=void 0,this._image=void 0,this._imageSubRegion=void 0,this._imageWidth=void 0,this._imageHeight=void 0,this._labelDimensions=void 0,this._labelHorizontalOrigin=void 0,this._labelTranslate=void 0;var o=e.image,s=e.imageId;defined(o)&&(defined(s)||(s="string"==typeof o?o:defined(o.src)?o.src:createGuid()),this._imageId=s,this._image=o),defined(e.imageSubRegion)&&(this._imageId=s,this._imageSubRegion=e.imageSubRegion),defined(this._billboardCollection._textureAtlas)&&this._loadImage(),this._actualClampedPosition=void 0,this._removeCallbackFunc=void 0,this._mode=SceneMode$1.SCENE3D,this._clusterShow=!0,this._outlineColor=Color.clone(defaultValue(e.outlineColor,Color.BLACK)),this._outlineWidth=defaultValue(e.outlineWidth,0),this._updateClamping()}SceneTransforms.drawingBufferToWgs84Coordinates=function(e,t,i,r){var n,a=e.context.uniformState,o=a.currentFrustum,s=o.x,l=o.y;e.frameState.useLogDepth&&(n=i*a.log2FarDepthFromNearPlusOne,i=l*(1-s/(Math.pow(2,n)-1+s))/(l-s));var c,u=e.view.passState.viewport,d=Cartesian4.clone(Cartesian4.UNIT_W,scratchNDC);d.x=(t.x-u.x)/u.width*2-1,d.y=(t.y-u.y)/u.height*2-1,d.z=2*i-1,d.w=1;var h,p=e.camera.frustum;return defined(p.fovy)?(h=1/(c=Matrix4.multiplyByVector(a.inverseViewProjection,d,scratchWorldCoords)).w,Cartesian3.multiplyByScalar(c,h,c)):(defined(p._offCenterFrustum)&&(p=p._offCenterFrustum),(c=scratchWorldCoords).x=.5*(d.x*(p.right-p.left)+p.left+p.right),c.y=.5*(d.y*(p.top-p.bottom)+p.bottom+p.top),c.z=.5*(d.z*(s-l)-s-l),c.w=1,c=Matrix4.multiplyByVector(a.inverseView,c,c)),Cartesian3.fromCartesian4(c,r)};var SHOW_INDEX=Billboard.SHOW_INDEX=0,POSITION_INDEX=Billboard.POSITION_INDEX=1,PIXEL_OFFSET_INDEX=Billboard.PIXEL_OFFSET_INDEX=2,EYE_OFFSET_INDEX=Billboard.EYE_OFFSET_INDEX=3,HORIZONTAL_ORIGIN_INDEX=Billboard.HORIZONTAL_ORIGIN_INDEX=4,VERTICAL_ORIGIN_INDEX=Billboard.VERTICAL_ORIGIN_INDEX=5,SCALE_INDEX=Billboard.SCALE_INDEX=6,IMAGE_INDEX_INDEX=Billboard.IMAGE_INDEX_INDEX=7,COLOR_INDEX=Billboard.COLOR_INDEX=8,ROTATION_INDEX=Billboard.ROTATION_INDEX=9,ALIGNED_AXIS_INDEX=Billboard.ALIGNED_AXIS_INDEX=10,SCALE_BY_DISTANCE_INDEX=Billboard.SCALE_BY_DISTANCE_INDEX=11,TRANSLUCENCY_BY_DISTANCE_INDEX=Billboard.TRANSLUCENCY_BY_DISTANCE_INDEX=12,PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX=Billboard.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX=13,DISTANCE_DISPLAY_CONDITION=Billboard.DISTANCE_DISPLAY_CONDITION=14,DISABLE_DEPTH_DISTANCE=Billboard.DISABLE_DEPTH_DISTANCE=15;Billboard.TEXTURE_COORDINATE_BOUNDS=16;var SDF_INDEX=Billboard.SDF_INDEX=17;function makeDirty(e,t){var i=e._billboardCollection;defined(i)&&(i._updateBillboard(e,t),e._dirty=!0)}Billboard.NUMBER_OF_PROPERTIES=18,Object.defineProperties(Billboard.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,makeDirty(this,SHOW_INDEX))}},position:{get:function(){return this._position},set:function(e){var t=this._position;Cartesian3.equals(t,e)||(Cartesian3.clone(e,t),Cartesian3.clone(e,this._actualPosition),this._updateClamping(),makeDirty(this,POSITION_INDEX))}},heightReference:{get:function(){return this._heightReference},set:function(e){e!==this._heightReference&&(this._heightReference=e,this._updateClamping(),makeDirty(this,POSITION_INDEX))}},pixelOffset:{get:function(){return this._pixelOffset},set:function(e){var t=this._pixelOffset;Cartesian2.equals(t,e)||(Cartesian2.clone(e,t),makeDirty(this,PIXEL_OFFSET_INDEX))}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){var t=this._scaleByDistance;NearFarScalar.equals(t,e)||(this._scaleByDistance=NearFarScalar.clone(e,t),makeDirty(this,SCALE_BY_DISTANCE_INDEX))}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){var t=this._translucencyByDistance;NearFarScalar.equals(t,e)||(this._translucencyByDistance=NearFarScalar.clone(e,t),makeDirty(this,TRANSLUCENCY_BY_DISTANCE_INDEX))}},pixelOffsetScaleByDistance:{get:function(){return this._pixelOffsetScaleByDistance},set:function(e){var t=this._pixelOffsetScaleByDistance;NearFarScalar.equals(t,e)||(this._pixelOffsetScaleByDistance=NearFarScalar.clone(e,t),makeDirty(this,PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX))}},eyeOffset:{get:function(){return this._eyeOffset},set:function(e){var t=this._eyeOffset;Cartesian3.equals(t,e)||(Cartesian3.clone(e,t),makeDirty(this,EYE_OFFSET_INDEX))}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin!==e&&(this._horizontalOrigin=e,makeDirty(this,HORIZONTAL_ORIGIN_INDEX))}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){this._verticalOrigin!==e&&(this._verticalOrigin=e,makeDirty(this,VERTICAL_ORIGIN_INDEX))}},scale:{get:function(){return this._scale},set:function(e){this._scale!==e&&(this._scale=e,makeDirty(this,SCALE_INDEX))}},color:{get:function(){return this._color},set:function(e){var t=this._color;Color.equals(t,e)||(Color.clone(e,t),makeDirty(this,COLOR_INDEX))}},rotation:{get:function(){return this._rotation},set:function(e){this._rotation!==e&&(this._rotation=e,makeDirty(this,ROTATION_INDEX))}},alignedAxis:{get:function(){return this._alignedAxis},set:function(e){var t=this._alignedAxis;Cartesian3.equals(t,e)||(Cartesian3.clone(e,t),makeDirty(this,ALIGNED_AXIS_INDEX))}},width:{get:function(){return defaultValue(this._width,this._imageWidth)},set:function(e){this._width!==e&&(this._width=e,makeDirty(this,IMAGE_INDEX_INDEX))}},height:{get:function(){return defaultValue(this._height,this._imageHeight)},set:function(e){this._height!==e&&(this._height=e,makeDirty(this,IMAGE_INDEX_INDEX))}},sizeInMeters:{get:function(){return this._sizeInMeters},set:function(e){this._sizeInMeters!==e&&(this._sizeInMeters=e,makeDirty(this,COLOR_INDEX))}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){DistanceDisplayCondition.equals(e,this._distanceDisplayCondition)||(this._distanceDisplayCondition=DistanceDisplayCondition.clone(e,this._distanceDisplayCondition),makeDirty(this,DISTANCE_DISPLAY_CONDITION))}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance!==e&&(this._disableDepthTestDistance=e,makeDirty(this,DISABLE_DEPTH_DISTANCE))}},id:{get:function(){return this._id},set:function(e){this._id=e,defined(this._pickId)&&(this._pickId.object.id=e)}},pickPrimitive:{get:function(){return this._pickPrimitive},set:function(e){this._pickPrimitive=e,defined(this._pickId)&&(this._pickId.object.primitive=e)}},pickId:{get:function(){return this._pickId}},image:{get:function(){return this._imageId},set:function(e){defined(e)?"string"==typeof e?this.setImage(e,e):e instanceof Resource?this.setImage(e.url,e):defined(e.src)?this.setImage(e.src,e):this.setImage(createGuid(),e):(this._imageIndex=-1,this._imageSubRegion=void 0,this._imageId=void 0,this._image=void 0,this._imageIndexPromise=void 0,makeDirty(this,IMAGE_INDEX_INDEX))}},ready:{get:function(){return-1!==this._imageIndex}},_clampedPosition:{get:function(){return this._actualClampedPosition},set:function(e){this._actualClampedPosition=Cartesian3.clone(e,this._actualClampedPosition),makeDirty(this,POSITION_INDEX)}},clusterShow:{get:function(){return this._clusterShow},set:function(e){this._clusterShow!==e&&(this._clusterShow=e,makeDirty(this,SHOW_INDEX))}},outlineColor:{get:function(){return this._outlineColor},set:function(e){var t=this._outlineColor;Color.equals(t,e)||(Color.clone(e,t),makeDirty(this,SDF_INDEX))}},outlineWidth:{get:function(){return this._outlineWidth},set:function(e){this._outlineWidth!==e&&(this._outlineWidth=e,makeDirty(this,SDF_INDEX))}}}),Billboard.prototype.getPickId=function(e){return defined(this._pickId)||(this._pickId=e.createPickId({primitive:this._pickPrimitive,collection:this._collection,id:this._id})),this._pickId},Billboard.prototype._updateClamping=function(){Billboard._updateClamping(this._billboardCollection,this)};var scratchCartographic$4=new Cartographic,scratchPosition$8=new Cartesian3;Billboard._updateClamping=function(e,i){var t,r,n,a,o,s,l,c=e._scene;function u(e){var t;i._heightReference===HeightReference$1.RELATIVE_TO_GROUND&&(i._mode===SceneMode$1.SCENE3D?((t=r.cartesianToCartographic(e,scratchCartographic$4)).height+=s.height,r.cartographicToCartesian(t,e)):e.x+=s.height),i._clampedPosition=Cartesian3.clone(e,i._clampedPosition)}defined(c)&&defined(c.globe)&&(t=c.globe,r=t.ellipsoid,n=t._surface,o=(a=c.frameState.mode)!==i._mode,i._mode=a,(i._heightReference===HeightReference$1.NONE||o)&&defined(i._removeCallbackFunc)&&(i._removeCallbackFunc(),i._removeCallbackFunc=void 0,i._clampedPosition=void 0),i._heightReference!==HeightReference$1.NONE&&defined(i._position)&&(defined(s=r.cartesianToCartographic(i._position))?(defined(i._removeCallbackFunc)&&i._removeCallbackFunc(),i._removeCallbackFunc=n.updateHeight(s,u),Cartographic.clone(s,scratchCartographic$4),defined(l=t.getHeight(s))&&(scratchCartographic$4.height=l),r.cartographicToCartesian(scratchCartographic$4,scratchPosition$8),u(scratchPosition$8)):i._actualClampedPosition=void 0))},Billboard.prototype._loadImage=function(){var e,i,r=this._billboardCollection._textureAtlas,n=this._imageId,a=this._image,o=this._imageSubRegion;defined(a)&&(e=r.addImage(n,a)),defined(o)&&(e=r.addSubRegion(n,o)),defined(this._imageIndexPromise=e)&&(i=this,e.then(function(e){var t;i._imageId===n&&i._image===a&&BoundingRectangle.equals(i._imageSubRegion,o)&&(t=r.textureCoordinates[e],i._imageWidth=r.texture.width*t.width,i._imageHeight=r.texture.height*t.height,i._imageIndex=e,i._ready=!0,i._image=void 0,i._imageIndexPromise=void 0,makeDirty(i,IMAGE_INDEX_INDEX))}).otherwise(function(e){console.error("Error loading image for billboard: "+e),i._imageIndexPromise=void 0}))},Billboard.prototype.setImage=function(e,t){this._imageId!==e&&(this._imageIndex=-1,this._imageSubRegion=void 0,this._imageId=e,this._image=t,defined(this._billboardCollection._textureAtlas)&&this._loadImage())},Billboard.prototype.setImageSubRegion=function(e,t){this._imageId===e&&BoundingRectangle.equals(this._imageSubRegion,t)||(this._imageIndex=-1,this._imageId=e,this._imageSubRegion=BoundingRectangle.clone(t),defined(this._billboardCollection._textureAtlas)&&this._loadImage())},Billboard.prototype._setTranslate=function(e){var t=this._translate;Cartesian2.equals(t,e)||(Cartesian2.clone(e,t),makeDirty(this,PIXEL_OFFSET_INDEX))},Billboard.prototype._getActualPosition=function(){return defined(this._clampedPosition)?this._clampedPosition:this._actualPosition},Billboard.prototype._setActualPosition=function(e){defined(this._clampedPosition)||Cartesian3.clone(e,this._actualPosition),makeDirty(this,POSITION_INDEX)};var tempCartesian3=new Cartesian4;Billboard._computeActualPosition=function(e,t,i,r){return defined(e._clampedPosition)?(i.mode!==e._mode&&e._updateClamping(),e._clampedPosition):i.mode===SceneMode$1.SCENE3D?t:(Matrix4.multiplyByPoint(r,t,tempCartesian3),SceneTransforms.computeActualWgs84Position(i,tempCartesian3))};var scratchCartesian3$9=new Cartesian3;Billboard._computeScreenSpacePosition=function(e,t,i,r,n,a){var o=Matrix4.multiplyByPoint(e,t,scratchCartesian3$9),s=SceneTransforms.wgs84WithEyeOffsetToWindowCoordinates(n,o,i,a);if(defined(s))return Cartesian2.add(s,r,s),s};var scratchPixelOffset=new Cartesian2(0,0);Billboard.prototype.computeScreenSpacePosition=function(e,t){var i=this._billboardCollection;defined(t)||(t=new Cartesian2),Cartesian2.clone(this._pixelOffset,scratchPixelOffset),Cartesian2.add(scratchPixelOffset,this._translate,scratchPixelOffset);var r,n,a,o=i.modelMatrix,s=this._position;return defined(this._clampedPosition)&&(s=this._clampedPosition,e.mode!==SceneMode$1.SCENE3D&&(n=(r=e.mapProjection).ellipsoid,a=r.unproject(s,scratchCartographic$4),s=n.cartographicToCartesian(a,scratchCartesian3$9),o=Matrix4.IDENTITY)),Billboard._computeScreenSpacePosition(o,s,this._eyeOffset,scratchPixelOffset,e,t)},Billboard.getScreenSpaceBoundingBox=function(e,t,i){var r=e.width,n=e.height,a=e.scale;r*=a,n*=a;var o=t.x;e.horizontalOrigin===HorizontalOrigin$1.RIGHT?o-=r:e.horizontalOrigin===HorizontalOrigin$1.CENTER&&(o-=.5*r);var s=t.y;return e.verticalOrigin===VerticalOrigin$1.BOTTOM||e.verticalOrigin===VerticalOrigin$1.BASELINE?s-=n:e.verticalOrigin===VerticalOrigin$1.CENTER&&(s-=.5*n),defined(i)||(i=new BoundingRectangle),i.x=o,i.y=s,i.width=r,i.height=n,i},Billboard.prototype.equals=function(e){return this===e||defined(e)&&this._id===e._id&&Cartesian3.equals(this._position,e._position)&&this._imageId===e._imageId&&this._show===e._show&&this._scale===e._scale&&this._verticalOrigin===e._verticalOrigin&&this._horizontalOrigin===e._horizontalOrigin&&this._heightReference===e._heightReference&&BoundingRectangle.equals(this._imageSubRegion,e._imageSubRegion)&&Color.equals(this._color,e._color)&&Cartesian2.equals(this._pixelOffset,e._pixelOffset)&&Cartesian2.equals(this._translate,e._translate)&&Cartesian3.equals(this._eyeOffset,e._eyeOffset)&&NearFarScalar.equals(this._scaleByDistance,e._scaleByDistance)&&NearFarScalar.equals(this._translucencyByDistance,e._translucencyByDistance)&&NearFarScalar.equals(this._pixelOffsetScaleByDistance,e._pixelOffsetScaleByDistance)&&DistanceDisplayCondition.equals(this._distanceDisplayCondition,e._distanceDisplayCondition)&&this._disableDepthTestDistance===e._disableDepthTestDistance},Billboard.prototype._destroy=function(){defined(this._customData)&&(this._billboardCollection._scene.globe._surface.removeTileCustomData(this._customData),this._customData=void 0),defined(this._removeCallbackFunc)&&(this._removeCallbackFunc(),this._removeCallbackFunc=void 0),this.image=void 0,this._pickId=this._pickId&&this._pickId.destroy(),this._billboardCollection=void 0};var BlendOption={OPAQUE:0,TRANSLUCENT:1,OPAQUE_AND_TRANSLUCENT:2},BlendOption$1=Object.freeze(BlendOption),SDFSettings={FONT_SIZE:48,PADDING:10,RADIUS:8,CUTOFF:.25},SDFSettings$1=Object.freeze(SDFSettings);function TextureAtlasNode(e,t,i,r,n){this.bottomLeft=defaultValue(e,Cartesian2.ZERO),this.topRight=defaultValue(t,Cartesian2.ZERO),this.childNode1=i,this.childNode2=r,this.imageIndex=n}var defaultInitialSize=new Cartesian2(16,16);function TextureAtlas(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.borderWidthInPixels,1),i=defaultValue(e.initialSize,defaultInitialSize);this._context=e.context,this._pixelFormat=defaultValue(e.pixelFormat,PixelFormat$1.RGBA),this._borderWidthInPixels=t,this._textureCoordinates=[],this._guid=createGuid(),this._idHash={},this._initialSize=i,this._root=void 0}function resizeAtlas(e,t){var i=e._context,r=e.numberOfImages,n=e._borderWidthInPixels;if(0<r){for(var a=e._texture.width,o=e._texture.height,s=2*(a+t.width+n),l=2*(o+t.height+n),c=a/s,u=o/l,d=new TextureAtlasNode(new Cartesian2(a+n,n),new Cartesian2(s,o)),h=new TextureAtlasNode(new Cartesian2,new Cartesian2(s,o),e._root,d),p=new TextureAtlasNode(new Cartesian2(n,o+n),new Cartesian2(s,l)),m=new TextureAtlasNode(new Cartesian2,new Cartesian2(s,l),h,p),f=0;f<e._textureCoordinates.length;f++){var g=e._textureCoordinates[f];defined(g)&&(g.x*=c,g.y*=u,g.width*=c,g.height*=u)}var _=new Texture({context:e._context,width:s,height:l,pixelFormat:e._pixelFormat}),y=new Framebuffer({context:i,colorTextures:[e._texture],destroyAttachments:!1});y._bind(),_.copyFromFramebuffer(0,0,0,0,s,l),y._unBind(),y.destroy(),e._texture=e._texture&&e._texture.destroy(),e._texture=_,e._root=m}else{var v=2*(t.width+2*n),C=2*(t.height+2*n);v<e._initialSize.x&&(v=e._initialSize.x),C<e._initialSize.y&&(C=e._initialSize.y),e._texture=e._texture&&e._texture.destroy(),e._texture=new Texture({context:e._context,width:v,height:C,pixelFormat:e._pixelFormat}),e._root=new TextureAtlasNode(new Cartesian2(n,n),new Cartesian2(v,C))}}function findNode$1(e,t,i){if(defined(t)){if(defined(t.childNode1)||defined(t.childNode2))return findNode$1(e,t.childNode1,i)||findNode$1(e,t.childNode2,i);if(defined(t.imageIndex))return;var r,n,a=t.topRight.x-t.bottomLeft.x,o=t.topRight.y-t.bottomLeft.y,s=a-i.width,l=o-i.height;if(s<0||l<0)return;return 0==s&&0==l?t:(l<s?(t.childNode1=new TextureAtlasNode(new Cartesian2(t.bottomLeft.x,t.bottomLeft.y),new Cartesian2(t.bottomLeft.x+i.width,t.topRight.y)),(r=t.bottomLeft.x+i.width+e._borderWidthInPixels)<t.topRight.x&&(t.childNode2=new TextureAtlasNode(new Cartesian2(r,t.bottomLeft.y),new Cartesian2(t.topRight.x,t.topRight.y)))):(t.childNode1=new TextureAtlasNode(new Cartesian2(t.bottomLeft.x,t.bottomLeft.y),new Cartesian2(t.topRight.x,t.bottomLeft.y+i.height)),(n=t.bottomLeft.y+i.height+e._borderWidthInPixels)<t.topRight.y&&(t.childNode2=new TextureAtlasNode(new Cartesian2(t.bottomLeft.x,n),new Cartesian2(t.topRight.x,t.topRight.y)))),findNode$1(e,t.childNode1,i))}}function addImage(e,t,i){var r,n,a,o,s,l,c,u,d=findNode$1(e,e._root,t);defined(d)?(d.imageIndex=i,r=e._texture.width,n=e._texture.height,a=d.topRight.x-d.bottomLeft.x,o=d.topRight.y-d.bottomLeft.y,s=d.bottomLeft.x/r,l=d.bottomLeft.y/n,c=a/r,u=o/n,e._textureCoordinates[i]=new BoundingRectangle(s,l,c,u),e._texture.copyFrom(t,d.bottomLeft.x,d.bottomLeft.y)):(resizeAtlas(e,t),addImage(e,t,i)),e._guid=createGuid()}Object.defineProperties(TextureAtlas.prototype,{borderWidthInPixels:{get:function(){return this._borderWidthInPixels}},textureCoordinates:{get:function(){return this._textureCoordinates}},texture:{get:function(){return defined(this._texture)||(this._texture=new Texture({context:this._context,width:this._initialSize.x,height:this._initialSize.y,pixelFormat:this._pixelFormat})),this._texture}},numberOfImages:{get:function(){return this._textureCoordinates.length}},guid:{get:function(){return this._guid}}}),TextureAtlas.prototype.addImage=function(e,t){if(defined(r=this._idHash[e]))return r;"function"==typeof t?t=t(e):("string"==typeof t||t instanceof Resource)&&(t=Resource.createIfNeeded(t).fetchImage());var i=this,r=when(t,function(e){if(i.isDestroyed())return-1;var t=i.numberOfImages;return addImage(i,e,t),t});return this._idHash[e]=r},TextureAtlas.prototype.addSubRegion=function(e,c){var t=this._idHash[e];if(!defined(t))throw new RuntimeError('image with id "'+e+'" not found in the atlas.');var u=this;return when(t,function(e){if(-1===e)return-1;var t=u._texture.width,i=u._texture.height,r=u.numberOfImages,n=u._textureCoordinates[e],a=n.x+c.x/t,o=n.y+c.y/i,s=c.width/t,l=c.height/i;return u._textureCoordinates.push(new BoundingRectangle(a,o,s,l)),u._guid=createGuid(),r})},TextureAtlas.prototype.isDestroyed=function(){return!1},TextureAtlas.prototype.destroy=function(){return this._texture=this._texture&&this._texture.destroy(),destroyObject(this)};var SHOW_INDEX$1=Billboard.SHOW_INDEX,POSITION_INDEX$1=Billboard.POSITION_INDEX,PIXEL_OFFSET_INDEX$1=Billboard.PIXEL_OFFSET_INDEX,EYE_OFFSET_INDEX$1=Billboard.EYE_OFFSET_INDEX,HORIZONTAL_ORIGIN_INDEX$1=Billboard.HORIZONTAL_ORIGIN_INDEX,VERTICAL_ORIGIN_INDEX$1=Billboard.VERTICAL_ORIGIN_INDEX,SCALE_INDEX$1=Billboard.SCALE_INDEX,IMAGE_INDEX_INDEX$1=Billboard.IMAGE_INDEX_INDEX,COLOR_INDEX$1=Billboard.COLOR_INDEX,ROTATION_INDEX$1=Billboard.ROTATION_INDEX,ALIGNED_AXIS_INDEX$1=Billboard.ALIGNED_AXIS_INDEX,SCALE_BY_DISTANCE_INDEX$1=Billboard.SCALE_BY_DISTANCE_INDEX,TRANSLUCENCY_BY_DISTANCE_INDEX$1=Billboard.TRANSLUCENCY_BY_DISTANCE_INDEX,PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX$1=Billboard.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX,DISTANCE_DISPLAY_CONDITION_INDEX=Billboard.DISTANCE_DISPLAY_CONDITION,DISABLE_DEPTH_DISTANCE$1=Billboard.DISABLE_DEPTH_DISTANCE,TEXTURE_COORDINATE_BOUNDS=Billboard.TEXTURE_COORDINATE_BOUNDS,SDF_INDEX$1=Billboard.SDF_INDEX,NUMBER_OF_PROPERTIES=Billboard.NUMBER_OF_PROPERTIES,attributeLocations,attributeLocationsBatched={positionHighAndScale:0,positionLowAndRotation:1,compressedAttribute0:2,compressedAttribute1:3,compressedAttribute2:4,eyeOffset:5,scaleByDistance:6,pixelOffsetScaleByDistance:7,compressedAttribute3:8,textureCoordinateBoundsOrLabelTranslate:9,a_batchId:10,sdf:11},attributeLocationsInstanced={direction:0,positionHighAndScale:1,positionLowAndRotation:2,compressedAttribute0:3,compressedAttribute1:4,compressedAttribute2:5,eyeOffset:6,scaleByDistance:7,pixelOffsetScaleByDistance:8,compressedAttribute3:9,textureCoordinateBoundsOrLabelTranslate:10,a_batchId:11,sdf:12},getIndexBuffer;function BillboardCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._scene=e.scene,this._batchTable=e.batchTable,this._textureAtlas=void 0,this._textureAtlasGUID=void 0,this._destroyTextureAtlas=!0,this._sp=void 0,this._spTranslucent=void 0,this._rsOpaque=void 0,this._rsTranslucent=void 0,this._vaf=void 0,this._billboards=[],this._billboardsToUpdate=[],this._billboardsToUpdateIndex=0,this._billboardsRemoved=!1,this._createVertexArray=!1,this._shaderRotation=!1,this._compiledShaderRotation=!1,this._shaderAlignedAxis=!1,this._compiledShaderAlignedAxis=!1,this._shaderScaleByDistance=!1,this._compiledShaderScaleByDistance=!1,this._shaderTranslucencyByDistance=!1,this._compiledShaderTranslucencyByDistance=!1,this._shaderPixelOffsetScaleByDistance=!1,this._compiledShaderPixelOffsetScaleByDistance=!1,this._shaderDistanceDisplayCondition=!1,this._compiledShaderDistanceDisplayCondition=!1,this._shaderDisableDepthDistance=!1,this._compiledShaderDisableDepthDistance=!1,this._shaderClampToGround=!1,this._compiledShaderClampToGround=!1,this._propertiesChanged=new Uint32Array(NUMBER_OF_PROPERTIES),this._maxSize=0,this._maxEyeOffset=0,this._maxScale=1,this._maxPixelOffset=0,this._allHorizontalCenter=!0,this._allVerticalCenter=!0,this._allSizedInMeters=!0,this._baseVolume=new BoundingSphere,this._baseVolumeWC=new BoundingSphere,this._baseVolume2D=new BoundingSphere,this._boundingVolume=new BoundingSphere,this._boundingVolumeDirty=!1,this._colorCommands=[],this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=Matrix4.clone(Matrix4.IDENTITY),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.debugShowTextureAtlas=defaultValue(e.debugShowTextureAtlas,!1),this.blendOption=defaultValue(e.blendOption,BlendOption$1.OPAQUE_AND_TRANSLUCENT),this._blendOption=void 0,this._mode=SceneMode$1.SCENE3D,this._buffersUsage=[BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW],this._highlightColor=Color.clone(Color.WHITE);var t=this;this._uniforms={u_atlas:function(){return t._textureAtlas.texture},u_highlightColor:function(){return t._highlightColor}};var i=this._scene;defined(i)&&defined(i.terrainProviderChanged)&&(this._removeCallbackFunc=i.terrainProviderChanged.addEventListener(function(){for(var e=this._billboards,t=e.length,i=0;i<t;++i)defined(e[i])&&e[i]._updateClamping()},this))}function destroyBillboards(e){for(var t=e.length,i=0;i<t;++i)e[i]&&e[i]._destroy()}function removeBillboards(e){if(e._billboardsRemoved){e._billboardsRemoved=!1;for(var t=[],i=e._billboards,r=i.length,n=0,a=0;n<r;++n){var o=i[n];o&&(o._index=a++,t.push(o))}e._billboards=t}}function getIndexBufferBatched(e){var t=e.cache.billboardCollection_indexBufferBatched;if(defined(t))return t;for(var i=new Uint16Array(98298),r=0,n=0;r<98298;r+=6,n+=4)i[r]=n,i[r+1]=n+1,i[r+2]=n+2,i[r+3]=n+0,i[r+4]=n+2,i[r+5]=n+3;return(t=Buffer$1.createIndexBuffer({context:e,typedArray:i,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT})).vertexArrayDestroyable=!1,e.cache.billboardCollection_indexBufferBatched=t}function getIndexBufferInstanced(e){var t=e.cache.billboardCollection_indexBufferInstanced;return defined(t)?t:((t=Buffer$1.createIndexBuffer({context:e,typedArray:new Uint16Array([0,1,2,0,2,3]),usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT})).vertexArrayDestroyable=!1,e.cache.billboardCollection_indexBufferInstanced=t)}function getVertexBufferInstanced(e){var t=e.cache.billboardCollection_vertexBufferInstanced;return defined(t)?t:((t=Buffer$1.createVertexBuffer({context:e,typedArray:new Float32Array([0,0,1,0,1,1,0,1]),usage:BufferUsage$1.STATIC_DRAW})).vertexArrayDestroyable=!1,e.cache.billboardCollection_vertexBufferInstanced=t)}function createVAF(e,t,i,r,n,a){var o=[{index:attributeLocations.positionHighAndScale,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[POSITION_INDEX$1]},{index:attributeLocations.positionLowAndRotation,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[POSITION_INDEX$1]},{index:attributeLocations.compressedAttribute0,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[PIXEL_OFFSET_INDEX$1]},{index:attributeLocations.compressedAttribute1,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[TRANSLUCENCY_BY_DISTANCE_INDEX$1]},{index:attributeLocations.compressedAttribute2,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[COLOR_INDEX$1]},{index:attributeLocations.eyeOffset,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[EYE_OFFSET_INDEX$1]},{index:attributeLocations.scaleByDistance,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[SCALE_BY_DISTANCE_INDEX$1]},{index:attributeLocations.pixelOffsetScaleByDistance,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX$1]},{index:attributeLocations.compressedAttribute3,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[DISTANCE_DISPLAY_CONDITION_INDEX]},{index:attributeLocations.textureCoordinateBoundsOrLabelTranslate,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[TEXTURE_COORDINATE_BOUNDS]}];return r&&o.push({index:attributeLocations.direction,componentsPerAttribute:2,componentDatatype:ComponentDatatype$1.FLOAT,vertexBuffer:getVertexBufferInstanced(e)}),defined(n)&&o.push({index:attributeLocations.a_batchId,componentsPerAttribute:1,componentDatatype:ComponentDatatype$1.FLOAT,bufferUsage:BufferUsage$1.STATIC_DRAW}),a&&o.push({index:attributeLocations.sdf,componentsPerAttribute:2,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[SDF_INDEX$1]}),new VertexArrayFacade(e,o,r?t:4*t,r)}Object.defineProperties(BillboardCollection.prototype,{length:{get:function(){return removeBillboards(this),this._billboards.length}},textureAtlas:{get:function(){return this._textureAtlas},set:function(e){this._textureAtlas!==e&&(this._textureAtlas=this._destroyTextureAtlas&&this._textureAtlas&&this._textureAtlas.destroy(),this._textureAtlas=e,this._createVertexArray=!0)}},destroyTextureAtlas:{get:function(){return this._destroyTextureAtlas},set:function(e){this._destroyTextureAtlas=e}}}),BillboardCollection.prototype.add=function(e){var t=new Billboard(e,this);return t._index=this._billboards.length,this._billboards.push(t),this._createVertexArray=!0,t},BillboardCollection.prototype.remove=function(e){return!!this.contains(e)&&(this._billboards[e._index]=null,this._billboardsRemoved=!0,this._createVertexArray=!0,e._destroy(),!0)},BillboardCollection.prototype.removeAll=function(){destroyBillboards(this._billboards),this._billboards=[],this._billboardsToUpdate=[],this._billboardsToUpdateIndex=0,this._billboardsRemoved=!1,this._createVertexArray=!0},BillboardCollection.prototype._updateBillboard=function(e,t){e._dirty||(this._billboardsToUpdate[this._billboardsToUpdateIndex++]=e),++this._propertiesChanged[t]},BillboardCollection.prototype.contains=function(e){return defined(e)&&e._billboardCollection===this},BillboardCollection.prototype.get=function(e){return removeBillboards(this),this._billboards[e]},BillboardCollection.prototype.computeNewBuffersUsage=function(){for(var e=this._buffersUsage,t=!1,i=this._propertiesChanged,r=0;r<NUMBER_OF_PROPERTIES;++r){var n=0===i[r]?BufferUsage$1.STATIC_DRAW:BufferUsage$1.STREAM_DRAW,t=t||e[r]!==n;e[r]=n}return t};var writePositionScratch=new EncodedCartesian3;function writePositionScaleAndRotation(e,t,i,r,n){var a,o=r[attributeLocations.positionHighAndScale],s=r[attributeLocations.positionLowAndRotation],l=n._getActualPosition();e._mode===SceneMode$1.SCENE3D&&(BoundingSphere.expand(e._baseVolume,l,e._baseVolume),e._boundingVolumeDirty=!0),EncodedCartesian3.fromCartesian(l,writePositionScratch);var c=n.scale,u=n.rotation;0!==u&&(e._shaderRotation=!0),e._maxScale=Math.max(e._maxScale,c);var d=writePositionScratch.high,h=writePositionScratch.low;e._instanced?(o(a=n._index,d.x,d.y,d.z,c),s(a,h.x,h.y,h.z,u)):(o((a=4*n._index)+0,d.x,d.y,d.z,c),o(a+1,d.x,d.y,d.z,c),o(a+2,d.x,d.y,d.z,c),o(a+3,d.x,d.y,d.z,c),s(a+0,h.x,h.y,h.z,u),s(a+1,h.x,h.y,h.z,u),s(a+2,h.x,h.y,h.z,u),s(a+3,h.x,h.y,h.z,u))}var scratchCartesian2$8=new Cartesian2,UPPER_BOUND=32768,LEFT_SHIFT16=65536,LEFT_SHIFT12=4096,LEFT_SHIFT8=256,LEFT_SHIFT7=128,LEFT_SHIFT5=32,LEFT_SHIFT3=8,LEFT_SHIFT2=4,RIGHT_SHIFT8=1/256,LOWER_LEFT=0,LOWER_RIGHT=2,UPPER_RIGHT=3,UPPER_LEFT=1;function writeCompressedAttrib0(e,t,i,r,n){var a,o=r[attributeLocations.compressedAttribute0],s=n.pixelOffset,l=s.x,c=s.y,u=n._translate,d=u.x,h=u.y;e._maxPixelOffset=Math.max(e._maxPixelOffset,Math.abs(l+d),Math.abs(-c+h));var p=n.horizontalOrigin,m=n._verticalOrigin,f=n.show&&n.clusterShow;0===n.color.alpha&&(f=!1),m===VerticalOrigin$1.BASELINE&&(m=VerticalOrigin$1.BOTTOM),e._allHorizontalCenter=e._allHorizontalCenter&&p===HorizontalOrigin$1.CENTER,e._allVerticalCenter=e._allVerticalCenter&&m===VerticalOrigin$1.CENTER;var g,_=0,y=0,v=0,C=0,S=n._imageIndex;-1!==S&&(_=(g=i[S]).x,y=g.y,v=g.width,C=g.height);var T=_+v,x=y+C,b=Math.floor(CesiumMath.clamp(l,-UPPER_BOUND,UPPER_BOUND)+UPPER_BOUND)*LEFT_SHIFT7;b+=(p+1)*LEFT_SHIFT5,b+=(m+1)*LEFT_SHIFT3,b+=(f?1:0)*LEFT_SHIFT2;var E=Math.floor(CesiumMath.clamp(c,-UPPER_BOUND,UPPER_BOUND)+UPPER_BOUND)*LEFT_SHIFT8,P=Math.floor(CesiumMath.clamp(d,-UPPER_BOUND,UPPER_BOUND)+UPPER_BOUND)*LEFT_SHIFT8,A=(CesiumMath.clamp(h,-UPPER_BOUND,UPPER_BOUND)+UPPER_BOUND)*RIGHT_SHIFT8,w=Math.floor(A);E+=w,P+=Math.floor((A-w)*LEFT_SHIFT8),scratchCartesian2$8.x=_,scratchCartesian2$8.y=y;var D=AttributeCompression.compressTextureCoordinates(scratchCartesian2$8);scratchCartesian2$8.x=T;var M=AttributeCompression.compressTextureCoordinates(scratchCartesian2$8);scratchCartesian2$8.y=x;var I=AttributeCompression.compressTextureCoordinates(scratchCartesian2$8);scratchCartesian2$8.x=_;var R=AttributeCompression.compressTextureCoordinates(scratchCartesian2$8);e._instanced?o(a=n._index,b,E,P,D):(o((a=4*n._index)+0,b+LOWER_LEFT,E,P,D),o(a+1,b+LOWER_RIGHT,E,P,M),o(a+2,b+UPPER_RIGHT,E,P,I),o(a+3,b+UPPER_LEFT,E,P,R))}function writeCompressedAttrib1(e,t,i,r,n){var a,o=r[attributeLocations.compressedAttribute1],s=n.alignedAxis;Cartesian3.equals(s,Cartesian3.ZERO)||(e._shaderAlignedAxis=!0);var l=0,c=1,u=1,d=1,h=n.translucencyByDistance;defined(h)&&(l=h.near,c=h.nearValue,u=h.far,d=h.farValue,1===c&&1===d||(e._shaderTranslucencyByDistance=!0));var p=0,m=n._imageIndex;-1!==m&&(p=i[m].width);var f=e._textureAtlas.texture.width,g=Math.round(defaultValue(n.width,f*p));e._maxSize=Math.max(e._maxSize,g);var _=CesiumMath.clamp(g,0,LEFT_SHIFT16),y=0;Math.abs(Cartesian3.magnitudeSquared(s)-1)<CesiumMath.EPSILON6&&(y=AttributeCompression.octEncodeFloat(s)),c=CesiumMath.clamp(c,0,1),_=_*LEFT_SHIFT8+(c=1===c?255:255*c|0),d=CesiumMath.clamp(d,0,1),y=y*LEFT_SHIFT8+(d=1===d?255:255*d|0),e._instanced?o(a=n._index,_,y,l,u):(o((a=4*n._index)+0,_,y,l,u),o(a+1,_,y,l,u),o(a+2,_,y,l,u),o(a+3,_,y,l,u))}function writeCompressedAttrib2(e,t,i,r,n){var a,o=r[attributeLocations.compressedAttribute2],s=n.color,l=defined(e._batchTable)?Color.WHITE:n.getPickId(t.context).color,c=n.sizeInMeters?1:0,u=Math.abs(Cartesian3.magnitudeSquared(n.alignedAxis)-1)<CesiumMath.EPSILON6?1:0;e._allSizedInMeters=e._allSizedInMeters&&1==c;var d=0,h=n._imageIndex;-1!==h&&(d=i[h].height);var p=e._textureAtlas.texture.dimensions,m=Math.round(defaultValue(n.height,p.y*d));e._maxSize=Math.max(e._maxSize,m);var f=defaultValue(n._labelHorizontalOrigin,-2),g=m*LEFT_SHIFT2+(f+=2),_=Color.floatToByte(s.red),y=Color.floatToByte(s.green),v=Color.floatToByte(s.blue),C=_*LEFT_SHIFT16+y*LEFT_SHIFT8+v,_=Color.floatToByte(l.red),y=Color.floatToByte(l.green),v=Color.floatToByte(l.blue),S=_*LEFT_SHIFT16+y*LEFT_SHIFT8+v,T=Color.floatToByte(s.alpha)*LEFT_SHIFT16+Color.floatToByte(l.alpha)*LEFT_SHIFT8;T+=2*c+u,e._instanced?o(a=n._index,C,S,T,g):(o((a=4*n._index)+0,C,S,T,g),o(a+1,C,S,T,g),o(a+2,C,S,T,g),o(a+3,C,S,T,g))}function writeEyeOffset(e,t,i,r,n){var a,o,s,l,c,u,d=r[attributeLocations.eyeOffset],h=n.eyeOffset,p=h.z;n._heightReference!==HeightReference$1.NONE&&(p*=1.005),e._maxEyeOffset=Math.max(e._maxEyeOffset,Math.abs(h.x),Math.abs(h.y),Math.abs(p)),e._instanced?(l=s=0,-1!==(a=n._imageIndex)&&(s=(o=i[a]).width,l=o.height),scratchCartesian2$8.x=s,scratchCartesian2$8.y=l,c=AttributeCompression.compressTextureCoordinates(scratchCartesian2$8),d(u=n._index,h.x,h.y,p,c)):(d((u=4*n._index)+0,h.x,h.y,p,0),d(u+1,h.x,h.y,p,0),d(u+2,h.x,h.y,p,0),d(u+3,h.x,h.y,p,0))}function writeScaleByDistance(e,t,i,r,n){var a,o=r[attributeLocations.scaleByDistance],s=0,l=1,c=1,u=1,d=n.scaleByDistance;defined(d)&&(s=d.near,l=d.nearValue,c=d.far,u=d.farValue,1===l&&1===u||(e._shaderScaleByDistance=!0)),e._instanced?o(a=n._index,s,l,c,u):(o((a=4*n._index)+0,s,l,c,u),o(a+1,s,l,c,u),o(a+2,s,l,c,u),o(a+3,s,l,c,u))}function writePixelOffsetScaleByDistance(e,t,i,r,n){var a,o=r[attributeLocations.pixelOffsetScaleByDistance],s=0,l=1,c=1,u=1,d=n.pixelOffsetScaleByDistance;defined(d)&&(s=d.near,l=d.nearValue,c=d.far,u=d.farValue,1===l&&1===u||(e._shaderPixelOffsetScaleByDistance=!0)),e._instanced?o(a=n._index,s,l,c,u):(o((a=4*n._index)+0,s,l,c,u),o(a+1,s,l,c,u),o(a+2,s,l,c,u),o(a+3,s,l,c,u))}function writeCompressedAttribute3(e,t,i,r,n){var a,o=r[attributeLocations.compressedAttribute3],s=0,l=Number.MAX_VALUE,c=n.distanceDisplayCondition;defined(c)&&(s=c.near,l=c.far,s*=s,l*=l,e._shaderDistanceDisplayCondition=!0);var u,d,h,p,m,f,g,_=n.disableDepthTestDistance,y=n.heightReference===HeightReference$1.CLAMP_TO_GROUND&&t.context.depthTexture;defined(_)||(_=y?5e3:0),_*=_,(y||0<_)&&(e._shaderDisableDepthDistance=!0,_===Number.POSITIVE_INFINITY&&(_=-1)),defined(n._labelDimensions)?(g=n._labelDimensions.x,u=n._labelDimensions.y):(m=p=0,-1!==(d=n._imageIndex)&&(p=(h=i[d]).height,m=h.width),u=Math.round(defaultValue(n.height,e._textureAtlas.texture.dimensions.y*p)),f=e._textureAtlas.texture.width,g=Math.round(defaultValue(n.width,f*m)));var v=Math.floor(CesiumMath.clamp(g,0,LEFT_SHIFT12)),C=Math.floor(CesiumMath.clamp(u,0,LEFT_SHIFT12)),S=v*LEFT_SHIFT12+C;e._instanced?o(a=n._index,s,l,_,S):(o((a=4*n._index)+0,s,l,_,S),o(a+1,s,l,_,S),o(a+2,s,l,_,S),o(a+3,s,l,_,S))}function writeTextureCoordinateBoundsOrLabelTranslate(e,t,i,r,n){var a,o,s,l,c;n.heightReference===HeightReference$1.CLAMP_TO_GROUND&&(a=e._scene,o=t.context,s=t.globeTranslucencyState.translucent,l=defined(a.globe)&&a.globe.depthTestAgainstTerrain,e._shaderClampToGround=o.depthTexture&&!s&&l);var u=r[attributeLocations.textureCoordinateBoundsOrLabelTranslate];if(0<ContextLimits.maximumVertexTextureImageUnits){var d=0,h=0;return defined(n._labelTranslate)&&(d=n._labelTranslate.x,h=n._labelTranslate.y),void(e._instanced?u(c=n._index,d,h,0,0):(u((c=4*n._index)+0,d,h,0,0),u(c+1,d,h,0,0),u(c+2,d,h,0,0),u(c+3,d,h,0,0)))}var p,m=0,f=0,g=0,_=0,y=n._imageIndex;-1!==y&&(m=(p=i[y]).x,f=p.y,g=p.width,_=p.height);var v=m+g,C=f+_;e._instanced?u(c=n._index,m,f,v,C):(u((c=4*n._index)+0,m,f,v,C),u(c+1,m,f,v,C),u(c+2,m,f,v,C),u(c+3,m,f,v,C))}function writeBatchId(e,t,i,r,n){var a,o,s;defined(e._batchTable)&&(a=r[attributeLocations.a_batchId],o=n._batchIndex,e._instanced?a(s=n._index,o):(a((s=4*n._index)+0,o),a(s+1,o),a(s+2,o),a(s+3,o)))}function writeSDF(e,t,i,r,n){var a,o,s,l,c,u,d,h,p,m;e._sdf&&(o=r[attributeLocations.sdf],s=n.outlineColor,l=n.outlineWidth,c=Color.floatToByte(s.red),u=Color.floatToByte(s.green),d=Color.floatToByte(s.blue),h=c*LEFT_SHIFT16+u*LEFT_SHIFT8+d,p=l/SDFSettings$1.RADIUS,m=Color.floatToByte(s.alpha)*LEFT_SHIFT16+Color.floatToByte(p)*LEFT_SHIFT8,e._instanced?o(a=n._index,h,m):(o((a=4*n._index)+0,h+LOWER_LEFT,m),o(a+1,h+LOWER_RIGHT,m),o(a+2,h+UPPER_RIGHT,m),o(a+3,h+UPPER_LEFT,m)))}function writeBillboard(e,t,i,r,n){writePositionScaleAndRotation(e,t,i,r,n),writeCompressedAttrib0(e,t,i,r,n),writeCompressedAttrib1(e,t,i,r,n),writeCompressedAttrib2(e,t,i,r,n),writeEyeOffset(e,t,i,r,n),writeScaleByDistance(e,t,i,r,n),writePixelOffsetScaleByDistance(e,t,i,r,n),writeCompressedAttribute3(e,t,i,r,n),writeTextureCoordinateBoundsOrLabelTranslate(e,t,i,r,n),writeBatchId(e,t,i,r,n),writeSDF(e,t,i,r,n)}function recomputeActualPositions(e,t,i,r,n,a){var o;r.mode===SceneMode$1.SCENE3D?(o=e._baseVolume,e._boundingVolumeDirty=!0):o=e._baseVolume2D;for(var s=[],l=0;l<i;++l){var c=t[l],u=c.position,d=Billboard._computeActualPosition(c,u,r,n);defined(d)&&(c._setActualPosition(d),a?s.push(d):BoundingSphere.expand(o,d,o))}a&&BoundingSphere.fromPoints(s,o)}function updateMode(e,t){var i=t.mode,r=e._billboards,n=e._billboardsToUpdate,a=e._modelMatrix;e._createVertexArray||e._mode!==i||i!==SceneMode$1.SCENE3D&&!Matrix4.equals(a,e.modelMatrix)?(e._mode=i,Matrix4.clone(e.modelMatrix,a),e._createVertexArray=!0,i!==SceneMode$1.SCENE3D&&i!==SceneMode$1.SCENE2D&&i!==SceneMode$1.COLUMBUS_VIEW||recomputeActualPositions(e,r,r.length,t,a,!0)):i===SceneMode$1.MORPHING?recomputeActualPositions(e,r,r.length,t,a,!0):i!==SceneMode$1.SCENE2D&&i!==SceneMode$1.COLUMBUS_VIEW||recomputeActualPositions(e,n,e._billboardsToUpdateIndex,t,a,!1)}function updateBoundingVolume(e,t,i){var r=1;e._allSizedInMeters&&0===e._maxPixelOffset||(r=t.camera.getPixelSize(i,t.context.drawingBufferWidth,t.context.drawingBufferHeight));var n=r*e._maxScale*e._maxSize*2;e._allHorizontalCenter&&e._allVerticalCenter&&(n*=.5);var a=r*e._maxPixelOffset+e._maxEyeOffset;i.radius+=n+a}function createDebugCommand(e,t){var i=t.createViewportQuadCommand("uniform sampler2D billboard_texture; \nvarying vec2 v_textureCoordinates; \nvoid main() \n{ \n gl_FragColor = texture2D(billboard_texture, v_textureCoordinates); \n} \n",{uniformMap:{billboard_texture:function(){return e._textureAtlas.texture}}});return i.pass=Pass$1.OVERLAY,i}var scratchWriterArray=[];function createBillboardPointCallback(r,n,a,o,s){return function(){var e=document.createElement("canvas"),t=s+2*o;e.height=e.width=t;var i=e.getContext("2d");return i.clearRect(0,0,t,t),0!==o&&(i.beginPath(),i.arc(t/2,t/2,t/2,0,2*Math.PI,!0),i.closePath(),i.fillStyle=a,i.fill(),r<1&&(i.save(),i.globalCompositeOperation="destination-out",i.beginPath(),i.arc(t/2,t/2,s/2,0,2*Math.PI,!0),i.closePath(),i.fillStyle="black",i.fill(),i.restore())),i.beginPath(),i.arc(t/2,t/2,s/2,0,2*Math.PI,!0),i.closePath(),i.fillStyle=n,i.fill(),e}}function Cesium3DTilePointFeature(e,t,i,r,n){this._content=e,this._billboard=i,this._label=r,this._polyline=n,this._batchId=t,this._billboardImage=void 0,this._billboardColor=void 0,this._billboardOutlineColor=void 0,this._billboardOutlineWidth=void 0,this._billboardSize=void 0,this._pointSize=void 0,this._color=void 0,this._pointSize=void 0,this._pointOutlineColor=void 0,this._pointOutlineWidth=void 0,this._heightOffset=void 0,this._pickIds=new Array(3),setBillboardImage(this)}BillboardCollection.prototype.update=function(e){removeBillboards(this);var t=this._billboards,i=t.length,r=e.context;this._instanced=r.instancedArrays,attributeLocations=this._instanced?attributeLocationsInstanced:attributeLocationsBatched,getIndexBuffer=this._instanced?getIndexBufferInstanced:getIndexBufferBatched;var n=this._textureAtlas;if(!defined(n)){n=this._textureAtlas=new TextureAtlas({context:r});for(var a=0;a<i;++a)t[a]._loadImage()}var o=n.textureCoordinates;if(0!==o.length){updateMode(this,e),i=(t=this._billboards).length;var s=this._billboardsToUpdate,l=this._billboardsToUpdateIndex,c=this._propertiesChanged,u=n.guid,d=this._createVertexArray||this._textureAtlasGUID!==u;this._textureAtlasGUID=u;var h=e.passes,p=h.pick;if(d||!p&&this.computeNewBuffersUsage()){this._createVertexArray=!1;for(var m=0;m<NUMBER_OF_PROPERTIES;++m)c[m]=0;if(this._vaf=this._vaf&&this._vaf.destroy(),0<i){this._vaf=createVAF(r,i,this._buffersUsage,this._instanced,this._batchTable,this._sdf),v=this._vaf.writers;for(var f=0;f<i;++f){var g=this._billboards[f];g._dirty=!1,writeBillboard(this,e,o,v,g)}this._vaf.commit(getIndexBuffer(r))}this._billboardsToUpdateIndex=0}else if(0<l){var _=scratchWriterArray;_.length=0,(c[POSITION_INDEX$1]||c[ROTATION_INDEX$1]||c[SCALE_INDEX$1])&&_.push(writePositionScaleAndRotation),(c[IMAGE_INDEX_INDEX$1]||c[PIXEL_OFFSET_INDEX$1]||c[HORIZONTAL_ORIGIN_INDEX$1]||c[VERTICAL_ORIGIN_INDEX$1]||c[SHOW_INDEX$1])&&(_.push(writeCompressedAttrib0),this._instanced&&_.push(writeEyeOffset)),(c[IMAGE_INDEX_INDEX$1]||c[ALIGNED_AXIS_INDEX$1]||c[TRANSLUCENCY_BY_DISTANCE_INDEX$1])&&(_.push(writeCompressedAttrib1),_.push(writeCompressedAttrib2)),(c[IMAGE_INDEX_INDEX$1]||c[COLOR_INDEX$1])&&_.push(writeCompressedAttrib2),c[EYE_OFFSET_INDEX$1]&&_.push(writeEyeOffset),c[SCALE_BY_DISTANCE_INDEX$1]&&_.push(writeScaleByDistance),c[PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX$1]&&_.push(writePixelOffsetScaleByDistance),(c[DISTANCE_DISPLAY_CONDITION_INDEX]||c[DISABLE_DEPTH_DISTANCE$1]||c[IMAGE_INDEX_INDEX$1]||c[POSITION_INDEX$1])&&_.push(writeCompressedAttribute3),(c[IMAGE_INDEX_INDEX$1]||c[POSITION_INDEX$1])&&_.push(writeTextureCoordinateBoundsOrLabelTranslate),c[SDF_INDEX$1]&&_.push(writeSDF);var y=_.length,v=this._vaf.writers;if(.1<l/i){for(var C=0;C<l;++C){var S=s[C];S._dirty=!1;for(var T=0;T<y;++T)_[T](this,e,o,v,S)}this._vaf.commit(getIndexBuffer(r))}else{for(var x=0;x<l;++x){var b=s[x];b._dirty=!1;for(var E=0;E<y;++E)_[E](this,e,o,v,b);this._instanced?this._vaf.subCommit(b._index,1):this._vaf.subCommit(4*b._index,4)}this._vaf.endSubCommits()}this._billboardsToUpdateIndex=0}if(1.5*i<l&&(s.length=i),defined(this._vaf)&&defined(this._vaf.va)){this._boundingVolumeDirty&&(this._boundingVolumeDirty=!1,BoundingSphere.transform(this._baseVolume,this.modelMatrix,this._baseVolumeWC));var P,A=Matrix4.IDENTITY;updateBoundingVolume(this,e,P=e.mode===SceneMode$1.SCENE3D?(A=this.modelMatrix,BoundingSphere.clone(this._baseVolumeWC,this._boundingVolume)):BoundingSphere.clone(this._baseVolume2D,this._boundingVolume));var w,D,M,I,R,O,L=this._blendOption!==this.blendOption;this._blendOption=this.blendOption,L&&(this._blendOption===BlendOption$1.OPAQUE||this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT?this._rsOpaque=RenderState.fromCache({depthTest:{enabled:!0,func:WebGLConstants$1.LESS},depthMask:!0}):this._rsOpaque=void 0,w=this._blendOption===BlendOption$1.TRANSLUCENT,this._blendOption===BlendOption$1.TRANSLUCENT||this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT?this._rsTranslucent=RenderState.fromCache({depthTest:{enabled:!0,func:w?WebGLConstants$1.LEQUAL:WebGLConstants$1.LESS},depthMask:w,blending:BlendingState$1.ALPHA_BLEND}):this._rsTranslucent=void 0),this._shaderDisableDepthDistance=this._shaderDisableDepthDistance||0!==e.minimumDisableDepthTestDistance;var F,N,B=0<ContextLimits.maximumVertexTextureImageUnits;!L&&this._shaderRotation===this._compiledShaderRotation&&this._shaderAlignedAxis===this._compiledShaderAlignedAxis&&this._shaderScaleByDistance===this._compiledShaderScaleByDistance&&this._shaderTranslucencyByDistance===this._compiledShaderTranslucencyByDistance&&this._shaderPixelOffsetScaleByDistance===this._compiledShaderPixelOffsetScaleByDistance&&this._shaderDistanceDisplayCondition===this._compiledShaderDistanceDisplayCondition&&this._shaderDisableDepthDistance===this._compiledShaderDisableDepthDistance&&this._shaderClampToGround===this._compiledShaderClampToGround&&this._sdf===this._compiledSDF||(D=BillboardCollectionVS,M=BillboardCollectionFS,O=[],defined(this._batchTable)&&(O.push("VECTOR_TILE"),D=this._batchTable.getVertexShaderCallback(!1,"a_batchId",void 0)(D),M=this._batchTable.getFragmentShaderCallback(!1,void 0)(M)),I=new ShaderSource({defines:O,sources:[D]}),this._instanced&&I.defines.push("INSTANCED"),this._shaderRotation&&I.defines.push("ROTATION"),this._shaderAlignedAxis&&I.defines.push("ALIGNED_AXIS"),this._shaderScaleByDistance&&I.defines.push("EYE_DISTANCE_SCALING"),this._shaderTranslucencyByDistance&&I.defines.push("EYE_DISTANCE_TRANSLUCENCY"),this._shaderPixelOffsetScaleByDistance&&I.defines.push("EYE_DISTANCE_PIXEL_OFFSET"),this._shaderDistanceDisplayCondition&&I.defines.push("DISTANCE_DISPLAY_CONDITION"),this._shaderDisableDepthDistance&&I.defines.push("DISABLE_DEPTH_DISTANCE"),this._shaderClampToGround&&(B?I.defines.push("VERTEX_DEPTH_CHECK"):I.defines.push("FRAGMENT_DEPTH_CHECK")),F=1-SDFSettings$1.CUTOFF,this._sdf&&I.defines.push("SDF"),N=defined(this._batchTable)?"VECTOR_TILE":"",this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT&&(R=new ShaderSource({defines:["OPAQUE",N],sources:[M]}),this._shaderClampToGround&&(B?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push("SDF_EDGE "+F)),this._sp=ShaderProgram.replaceCache({context:r,shaderProgram:this._sp,vertexShaderSource:I,fragmentShaderSource:R,attributeLocations:attributeLocations}),R=new ShaderSource({defines:["TRANSLUCENT",N],sources:[M]}),this._shaderClampToGround&&(B?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push("SDF_EDGE "+F)),this._spTranslucent=ShaderProgram.replaceCache({context:r,shaderProgram:this._spTranslucent,vertexShaderSource:I,fragmentShaderSource:R,attributeLocations:attributeLocations})),this._blendOption===BlendOption$1.OPAQUE&&(R=new ShaderSource({defines:[N],sources:[M]}),this._shaderClampToGround&&(B?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push("SDF_EDGE "+F)),this._sp=ShaderProgram.replaceCache({context:r,shaderProgram:this._sp,vertexShaderSource:I,fragmentShaderSource:R,attributeLocations:attributeLocations})),this._blendOption===BlendOption$1.TRANSLUCENT&&(R=new ShaderSource({defines:[N],sources:[M]}),this._shaderClampToGround&&(B?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push("SDF_EDGE "+F)),this._spTranslucent=ShaderProgram.replaceCache({context:r,shaderProgram:this._spTranslucent,vertexShaderSource:I,fragmentShaderSource:R,attributeLocations:attributeLocations})),this._compiledShaderRotation=this._shaderRotation,this._compiledShaderAlignedAxis=this._shaderAlignedAxis,this._compiledShaderScaleByDistance=this._shaderScaleByDistance,this._compiledShaderTranslucencyByDistance=this._shaderTranslucencyByDistance,this._compiledShaderPixelOffsetScaleByDistance=this._shaderPixelOffsetScaleByDistance,this._compiledShaderDistanceDisplayCondition=this._shaderDistanceDisplayCondition,this._compiledShaderDisableDepthDistance=this._shaderDisableDepthDistance,this._compiledShaderClampToGround=this._shaderClampToGround,this._compiledSDF=this._sdf);var V=e.commandList;if(h.render||h.pick){var k=this._colorCommands,z=this._blendOption===BlendOption$1.OPAQUE,$=this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT,U=this._vaf.va,G=U.length,H=this._uniforms,W=defined(this._batchTable)?(H=this._batchTable.getUniformMapCallback()(H),this._batchTable.getPickId()):"v_pickColor";k.length=G;for(var q=$?2*G:G,j=0;j<q;++j){var Y=k[j];defined(Y)||(Y=k[j]=new DrawCommand);var X=z||$&&j%2==0;Y.pass=X||!$?Pass$1.OPAQUE:Pass$1.TRANSLUCENT,Y.owner=this;var Q=$?Math.floor(j/2):j;Y.boundingVolume=P,Y.modelMatrix=A,Y.count=U[Q].indicesCount,Y.shaderProgram=X?this._sp:this._spTranslucent,Y.uniformMap=H,Y.vertexArray=U[Q].va,Y.renderState=X?this._rsOpaque:this._rsTranslucent,Y.debugShowBoundingVolume=this.debugShowBoundingVolume,Y.pickId=W,this._instanced&&(Y.count=6,Y.instanceCount=i),V.push(Y)}this.debugShowTextureAtlas&&(defined(this.debugCommand)||(this.debugCommand=createDebugCommand(this,e.context)),V.push(this.debugCommand))}}}},BillboardCollection.prototype.isDestroyed=function(){return!1},BillboardCollection.prototype.destroy=function(){return defined(this._removeCallbackFunc)&&(this._removeCallbackFunc(),this._removeCallbackFunc=void 0),this._textureAtlas=this._destroyTextureAtlas&&this._textureAtlas&&this._textureAtlas.destroy(),this._sp=this._sp&&this._sp.destroy(),this._spTranslucent=this._spTranslucent&&this._spTranslucent.destroy(),this._vaf=this._vaf&&this._vaf.destroy(),destroyBillboards(this._billboards),destroyObject(this)};var scratchCartographic$5=new Cartographic;function setBillboardImage(e){var t,i,r,n,a,o,s,l,c,u,d,h,p=e._billboard;defined(e._billboardImage)&&e._billboardImage!==p.image?p.image=e._billboardImage:defined(e._billboardImage)||(t=defaultValue(e._color,Cesium3DTilePointFeature.defaultColor),i=defaultValue(e._pointOutlineColor,Cesium3DTilePointFeature.defaultPointOutlineColor),r=defaultValue(e._pointOutlineWidth,Cesium3DTilePointFeature.defaultPointOutlineWidth),n=defaultValue(e._pointSize,Cesium3DTilePointFeature.defaultPointSize),a=e._billboardColor,o=e._billboardOutlineColor,s=e._billboardOutlineWidth,l=e._billboardSize,Color.equals(t,a)&&Color.equals(i,o)&&r===s&&n===l||(e._billboardColor=Color.clone(t,e._billboardColor),e._billboardOutlineColor=Color.clone(i,e._billboardOutlineColor),e._billboardOutlineWidth=r,e._billboardSize=n,c=t.alpha,u=t.toCssColorString(),d=i.toCssColorString(),h=JSON.stringify([u,n,d,r]),p.setImage(h,createBillboardPointCallback(c,u,d,r,n))))}Object.defineProperties(Cesium3DTilePointFeature.prototype,{show:{get:function(){return this._label.show},set:function(e){this._label.show=e,this._billboard.show=e,this._polyline.show=e}},color:{get:function(){return this._color},set:function(e){this._color=Color.clone(e,this._color),setBillboardImage(this)}},pointSize:{get:function(){return this._pointSize},set:function(e){this._pointSize=e,setBillboardImage(this)}},pointOutlineColor:{get:function(){return this._pointOutlineColor},set:function(e){this._pointOutlineColor=Color.clone(e,this._pointOutlineColor),setBillboardImage(this)}},pointOutlineWidth:{get:function(){return this._pointOutlineWidth},set:function(e){this._pointOutlineWidth=e,setBillboardImage(this)}},labelColor:{get:function(){return this._label.fillColor},set:function(e){this._label.fillColor=e,this._polyline.show=this._label.show&&0<e.alpha}},labelOutlineColor:{get:function(){return this._label.outlineColor},set:function(e){this._label.outlineColor=e}},labelOutlineWidth:{get:function(){return this._label.outlineWidth},set:function(e){this._label.outlineWidth=e}},font:{get:function(){return this._label.font},set:function(e){this._label.font=e}},labelStyle:{get:function(){return this._label.style},set:function(e){this._label.style=e}},labelText:{get:function(){return this._label.text},set:function(e){defined(e)||(e=""),this._label.text=e}},backgroundColor:{get:function(){return this._label.backgroundColor},set:function(e){this._label.backgroundColor=e}},backgroundPadding:{get:function(){return this._label.backgroundPadding},set:function(e){this._label.backgroundPadding=e}},backgroundEnabled:{get:function(){return this._label.showBackground},set:function(e){this._label.showBackground=e}},scaleByDistance:{get:function(){return this._label.scaleByDistance},set:function(e){this._label.scaleByDistance=e,this._billboard.scaleByDistance=e}},translucencyByDistance:{get:function(){return this._label.translucencyByDistance},set:function(e){this._label.translucencyByDistance=e,this._billboard.translucencyByDistance=e}},distanceDisplayCondition:{get:function(){return this._label.distanceDisplayCondition},set:function(e){this._label.distanceDisplayCondition=e,this._polyline.distanceDisplayCondition=e,this._billboard.distanceDisplayCondition=e}},heightOffset:{get:function(){return this._heightOffset},set:function(e){var t=defaultValue(this._heightOffset,0),i=this._content.tileset.ellipsoid,r=i.cartesianToCartographic(this._billboard.position,scratchCartographic$5);r.height=r.height-t+e;var n=i.cartographicToCartesian(r);this._billboard.position=n,this._label.position=this._billboard.position,this._polyline.positions=[this._polyline.positions[0],n],this._heightOffset=e}},anchorLineEnabled:{get:function(){return this._polyline.show},set:function(e){this._polyline.show=e}},anchorLineColor:{get:function(){return this._polyline.material.uniforms.color},set:function(e){this._polyline.material.uniforms.color=Color.clone(e,this._polyline.material.uniforms.color)}},image:{get:function(){return this._billboardImage},set:function(e){var t=this._billboardImage!==e;this._billboardImage=e,t&&setBillboardImage(this)}},disableDepthTestDistance:{get:function(){return this._label.disableDepthTestDistance},set:function(e){this._label.disableDepthTestDistance=e,this._billboard.disableDepthTestDistance=e}},horizontalOrigin:{get:function(){return this._billboard.horizontalOrigin},set:function(e){this._billboard.horizontalOrigin=e}},verticalOrigin:{get:function(){return this._billboard.verticalOrigin},set:function(e){this._billboard.verticalOrigin=e}},labelHorizontalOrigin:{get:function(){return this._label.horizontalOrigin},set:function(e){this._label.horizontalOrigin=e}},labelVerticalOrigin:{get:function(){return this._label.verticalOrigin},set:function(e){this._label.verticalOrigin=e}},content:{get:function(){return this._content}},tileset:{get:function(){return this._content.tileset}},primitive:{get:function(){return this._content.tileset}},pickIds:{get:function(){var e=this._pickIds;return e[0]=this._billboard.pickId,e[1]=this._label.pickId,e[2]=this._polyline.pickId,e}}}),Cesium3DTilePointFeature.defaultColor=Color.WHITE,Cesium3DTilePointFeature.defaultPointOutlineColor=Color.BLACK,Cesium3DTilePointFeature.defaultPointOutlineWidth=0,Cesium3DTilePointFeature.defaultPointSize=8,Cesium3DTilePointFeature.prototype.hasProperty=function(e){return this._content.batchTable.hasProperty(this._batchId,e)},Cesium3DTilePointFeature.prototype.getPropertyNames=function(e){return this._content.batchTable.getPropertyNames(this._batchId,e)},Cesium3DTilePointFeature.prototype.getProperty=function(e){return this._content.batchTable.getProperty(this._batchId,e)},Cesium3DTilePointFeature.prototype.setProperty=function(e,t){this._content.batchTable.setProperty(this._batchId,e,t),this._content.featurePropertiesDirty=!0},Cesium3DTilePointFeature.prototype.isExactClass=function(e){return this._content.batchTable.isExactClass(this._batchId,e)},Cesium3DTilePointFeature.prototype.isClass=function(e){return this._content.batchTable.isClass(this._batchId,e)},Cesium3DTilePointFeature.prototype.getExactClassName=function(){return this._content.batchTable.getExactClassName(this._batchId)};var INF=1e20;function clamp(e,t,i){return t<i?e<t?t:i<e?i:e:e<i?i:t<e?t:e}function calcSDF(e,t){var i,r,n,a,o,s,l,c,u,d=null==(t=t||{}).cutoff?.25:t.cutoff,h=null==t.radius?8:t.radius,p=t.channel||0;if(ArrayBuffer.isView(e)||Array.isArray(e)){if(!t.width||!t.height)throw Error("For raw data width and height should be provided by options");i=t.width,r=t.height,a=e,s=t.stride?t.stride:Math.floor(e.length/i/r)}else window.HTMLCanvasElement&&e instanceof window.HTMLCanvasElement?(l=(c=e).getContext("2d"),i=c.width,r=c.height,a=(u=l.getImageData(0,0,i,r)).data,s=4):window.CanvasRenderingContext2D&&e instanceof window.CanvasRenderingContext2D?(i=(c=(l=e).canvas).width,r=c.height,a=(u=l.getImageData(0,0,i,r)).data,s=4):window.ImageData&&e instanceof window.ImageData&&(i=(u=e).width,r=e.height,a=u.data,s=4);if(n=Math.max(i,r),window.Uint8ClampedArray&&a instanceof window.Uint8ClampedArray||window.Uint8Array&&a instanceof window.Uint8Array)for(o=a,a=Array(i*r),C=0,S=o.length;C<S;C++)a[C]=o[C*s+p]/255;else if(1!==s)throw Error("Raw data can have only 1 value per pixel");for(var m=Array(i*r),f=Array(i*r),g=Array(n),_=Array(n),y=Array(n+1),v=Array(n),C=0,S=i*r;C<S;C++){var T=a[C];m[C]=1===T?0:0===T?INF:Math.pow(Math.max(0,.5-T),2),f[C]=1===T?INF:0===T?0:Math.pow(Math.max(0,T-.5),2)}edt(m,i,r,g,_,v,y),edt(f,i,r,g,_,v,y);var x=new(window.Float32Array?Float32Array:Array)(i*r);for(C=0,S=i*r;C<S;C++)x[C]=clamp(1-((m[C]-f[C])/h+d),0,1);return x}function edt(e,t,i,r,n,a,o){for(var s=0;s<t;s++){for(var l=0;l<i;l++)r[l]=e[l*t+s];for(edt1d(r,n,a,o,i),l=0;l<i;l++)e[l*t+s]=n[l]}for(l=0;l<i;l++){for(s=0;s<t;s++)r[s]=e[l*t+s];for(edt1d(r,n,a,o,t),s=0;s<t;s++)e[l*t+s]=Math.sqrt(n[s])}}function edt1d(e,t,i,r,n){r[i[0]=0]=-INF,r[1]=+INF;for(var a=1,o=0;a<n;a++){for(var s=(e[a]+a*a-(e[i[o]]+i[o]*i[o]))/(2*a-2*i[o]);s<=r[o];)o--,s=(e[a]+a*a-(e[i[o]]+i[o]*i[o]))/(2*a-2*i[o]);i[++o]=a,r[o]=s,r[o+1]=+INF}for(o=a=0;a<n;a++){for(;r[o+1]<a;)o++;t[a]=(a-i[o])*(a-i[o])+e[i[o]]}}var LabelStyle={FILL:0,OUTLINE:1,FILL_AND_OUTLINE:2},LabelStyle$1=Object.freeze(LabelStyle),fontInfoCache={},fontInfoCacheLength=0,fontInfoCacheMaxSize=256,defaultBackgroundColor=new Color(.165,.165,.165,.8),defaultBackgroundPadding=new Cartesian2(7,5),textTypes=Object.freeze({LTR:0,RTL:1,WEAK:2,BRACKETS:3});function rebindAllGlyphs(e){e._rebindAllGlyphs||e._repositionAllGlyphs||e._labelCollection._labelsToUpdate.push(e),e._rebindAllGlyphs=!0}function repositionAllGlyphs(e){e._rebindAllGlyphs||e._repositionAllGlyphs||e._labelCollection._labelsToUpdate.push(e),e._repositionAllGlyphs=!0}function getCSSValue$1(e,t){return document.defaultView.getComputedStyle(e,null).getPropertyValue(t)}function parseFont(e){var t,i=fontInfoCache[e._font];defined(i)||((t=document.createElement("div")).style.position="absolute",t.style.opacity=0,t.style.font=e._font,document.body.appendChild(t),i={family:getCSSValue$1(t,"font-family"),size:getCSSValue$1(t,"font-size").replace("px",""),style:getCSSValue$1(t,"font-style"),weight:getCSSValue$1(t,"font-weight")},document.body.removeChild(t),fontInfoCacheLength<fontInfoCacheMaxSize&&(fontInfoCache[e._font]=i,fontInfoCacheLength++)),e._fontFamily=i.family,e._fontSize=i.size,e._fontStyle=i.style,e._fontWeight=i.weight}function Label(e,t){var i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).translucencyByDistance,r=e.pixelOffsetScaleByDistance,n=e.scaleByDistance,a=e.distanceDisplayCondition;defined(i)&&(i=NearFarScalar.clone(i)),defined(r)&&(r=NearFarScalar.clone(r)),defined(n)&&(n=NearFarScalar.clone(n)),defined(a)&&(a=DistanceDisplayCondition.clone(a)),this._renderedText=void 0,this._text=void 0,this._show=defaultValue(e.show,!0),this._font=defaultValue(e.font,"30px sans-serif"),this._fillColor=Color.clone(defaultValue(e.fillColor,Color.WHITE)),this._outlineColor=Color.clone(defaultValue(e.outlineColor,Color.BLACK)),this._outlineWidth=defaultValue(e.outlineWidth,1),this._showBackground=defaultValue(e.showBackground,!1),this._backgroundColor=Color.clone(defaultValue(e.backgroundColor,defaultBackgroundColor)),this._backgroundPadding=Cartesian2.clone(defaultValue(e.backgroundPadding,defaultBackgroundPadding)),this._style=defaultValue(e.style,LabelStyle$1.FILL),this._verticalOrigin=defaultValue(e.verticalOrigin,VerticalOrigin$1.BASELINE),this._horizontalOrigin=defaultValue(e.horizontalOrigin,HorizontalOrigin$1.LEFT),this._pixelOffset=Cartesian2.clone(defaultValue(e.pixelOffset,Cartesian2.ZERO)),this._eyeOffset=Cartesian3.clone(defaultValue(e.eyeOffset,Cartesian3.ZERO)),this._position=Cartesian3.clone(defaultValue(e.position,Cartesian3.ZERO)),this._scale=defaultValue(e.scale,1),this._id=e.id,this._translucencyByDistance=i,this._pixelOffsetScaleByDistance=r,this._scaleByDistance=n,this._heightReference=defaultValue(e.heightReference,HeightReference$1.NONE),this._distanceDisplayCondition=a,this._disableDepthTestDistance=e.disableDepthTestDistance,this._labelCollection=t,this._glyphs=[],this._backgroundBillboard=void 0,this._batchIndex=void 0,this._rebindAllGlyphs=!0,this._repositionAllGlyphs=!0,this._actualClampedPosition=void 0,this._removeCallbackFunc=void 0,this._mode=void 0,this._clusterShow=!0,this.text=defaultValue(e.text,""),this._relativeSize=1,parseFont(this),this._updateClamping()}function convertTextToTypes(e,t){for(var i=/[a-zA-Z0-9]/,r=/[()[\]{}<>]/,n=[],a="",o=textTypes.LTR,s="",l=e.length,c=0;c<l;++c){var u=e.charAt(c),s=t.test(u)?textTypes.RTL:i.test(u)?textTypes.LTR:r.test(u)?textTypes.BRACKETS:textTypes.WEAK;0===c&&(o=s),o===s&&s!==textTypes.BRACKETS?a+=u:(""!==a&&n.push({Type:o,Word:a}),o=s,a=u)}return n.push({Type:s,Word:a}),n}function reverseWord(e){return e.split("").reverse().join("")}function spliceWord(e,t,i){return e.slice(0,t)+i+e.slice(t)}function reverseBrackets(e){switch(e){case"(":return")";case")":return"(";case"[":return"]";case"]":return"[";case"{":return"}";case"}":return"{";case"<":return">";case">":return"<"}}Object.defineProperties(Label.prototype,{show:{get:function(){return this._show},set:function(e){if(this._show!==e){this._show=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i].billboard;defined(n)&&(n.show=e)}var a=this._backgroundBillboard;defined(a)&&(a.show=e)}}},position:{get:function(){return this._position},set:function(e){var t=this._position;if(!Cartesian3.equals(t,e)){Cartesian3.clone(e,t);for(var i=this._glyphs,r=0,n=i.length;r<n;r++){var a=i[r].billboard;defined(a)&&(a.position=e)}var o=this._backgroundBillboard;defined(o)&&(o.position=e),this._updateClamping()}}},heightReference:{get:function(){return this._heightReference},set:function(e){if(e!==this._heightReference){this._heightReference=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i].billboard;defined(n)&&(n.heightReference=e)}var a=this._backgroundBillboard;defined(a)&&(a.heightReference=e),repositionAllGlyphs(this),this._updateClamping()}}},text:{get:function(){return this._text},set:function(e){this._text!==e&&(this._text=e,this._renderedText=Label.enableRightToLeftDetection?reverseRtl(e):e,rebindAllGlyphs(this))}},font:{get:function(){return this._font},set:function(e){this._font!==e&&(this._font=e,rebindAllGlyphs(this),parseFont(this))}},fillColor:{get:function(){return this._fillColor},set:function(e){var t=this._fillColor;Color.equals(t,e)||(Color.clone(e,t),rebindAllGlyphs(this))}},outlineColor:{get:function(){return this._outlineColor},set:function(e){var t=this._outlineColor;Color.equals(t,e)||(Color.clone(e,t),rebindAllGlyphs(this))}},outlineWidth:{get:function(){return this._outlineWidth},set:function(e){this._outlineWidth!==e&&(this._outlineWidth=e,rebindAllGlyphs(this))}},showBackground:{get:function(){return this._showBackground},set:function(e){this._showBackground!==e&&(this._showBackground=e,rebindAllGlyphs(this))}},backgroundColor:{get:function(){return this._backgroundColor},set:function(e){var t,i=this._backgroundColor;Color.equals(i,e)||(Color.clone(e,i),defined(t=this._backgroundBillboard)&&(t.color=i))}},backgroundPadding:{get:function(){return this._backgroundPadding},set:function(e){var t=this._backgroundPadding;Cartesian2.equals(t,e)||(Cartesian2.clone(e,t),repositionAllGlyphs(this))}},style:{get:function(){return this._style},set:function(e){this._style!==e&&(this._style=e,rebindAllGlyphs(this))}},pixelOffset:{get:function(){return this._pixelOffset},set:function(e){var t=this._pixelOffset;if(!Cartesian2.equals(t,e)){Cartesian2.clone(e,t);for(var i=this._glyphs,r=0,n=i.length;r<n;r++){var a=i[r];defined(a.billboard)&&(a.billboard.pixelOffset=e)}var o=this._backgroundBillboard;defined(o)&&(o.pixelOffset=e)}}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){var t=this._translucencyByDistance;if(!NearFarScalar.equals(t,e)){this._translucencyByDistance=NearFarScalar.clone(e,t);for(var i=this._glyphs,r=0,n=i.length;r<n;r++){var a=i[r];defined(a.billboard)&&(a.billboard.translucencyByDistance=e)}var o=this._backgroundBillboard;defined(o)&&(o.translucencyByDistance=e)}}},pixelOffsetScaleByDistance:{get:function(){return this._pixelOffsetScaleByDistance},set:function(e){var t=this._pixelOffsetScaleByDistance;if(!NearFarScalar.equals(t,e)){this._pixelOffsetScaleByDistance=NearFarScalar.clone(e,t);for(var i=this._glyphs,r=0,n=i.length;r<n;r++){var a=i[r];defined(a.billboard)&&(a.billboard.pixelOffsetScaleByDistance=e)}var o=this._backgroundBillboard;defined(o)&&(o.pixelOffsetScaleByDistance=e)}}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){var t=this._scaleByDistance;if(!NearFarScalar.equals(t,e)){this._scaleByDistance=NearFarScalar.clone(e,t);for(var i=this._glyphs,r=0,n=i.length;r<n;r++){var a=i[r];defined(a.billboard)&&(a.billboard.scaleByDistance=e)}var o=this._backgroundBillboard;defined(o)&&(o.scaleByDistance=e)}}},eyeOffset:{get:function(){return this._eyeOffset},set:function(e){var t=this._eyeOffset;if(!Cartesian3.equals(t,e)){Cartesian3.clone(e,t);for(var i=this._glyphs,r=0,n=i.length;r<n;r++){var a=i[r];defined(a.billboard)&&(a.billboard.eyeOffset=e)}var o=this._backgroundBillboard;defined(o)&&(o.eyeOffset=e)}}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin!==e&&(this._horizontalOrigin=e,repositionAllGlyphs(this))}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){if(this._verticalOrigin!==e){this._verticalOrigin=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard.verticalOrigin=e)}var a=this._backgroundBillboard;defined(a)&&(a.verticalOrigin=e),repositionAllGlyphs(this)}}},scale:{get:function(){return this._scale},set:function(e){if(this._scale!==e){this._scale=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard.scale=e*this._relativeSize)}var a=this._backgroundBillboard;defined(a)&&(a.scale=e*this._relativeSize),repositionAllGlyphs(this)}}},totalScale:{get:function(){return this._scale*this._relativeSize}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){if(!DistanceDisplayCondition.equals(e,this._distanceDisplayCondition)){this._distanceDisplayCondition=DistanceDisplayCondition.clone(e,this._distanceDisplayCondition);for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard.distanceDisplayCondition=e)}var a=this._backgroundBillboard;defined(a)&&(a.distanceDisplayCondition=e)}}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){if(this._disableDepthTestDistance!==e){this._disableDepthTestDistance=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard.disableDepthTestDistance=e)}var a=this._backgroundBillboard;defined(a)&&(a.disableDepthTestDistance=e)}}},id:{get:function(){return this._id},set:function(e){if(this._id!==e){this._id=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard.id=e)}var a=this._backgroundBillboard;defined(a)&&(a.id=e)}}},pickId:{get:function(){if(0!==this._glyphs.length&&defined(this._glyphs[0].billboard))return this._glyphs[0].billboard.pickId}},_clampedPosition:{get:function(){return this._actualClampedPosition},set:function(e){this._actualClampedPosition=Cartesian3.clone(e,this._actualClampedPosition);for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard._clampedPosition=e)}var a=this._backgroundBillboard;defined(a)&&(a._clampedPosition=e)}},clusterShow:{get:function(){return this._clusterShow},set:function(e){if(this._clusterShow!==e){this._clusterShow=e;for(var t=this._glyphs,i=0,r=t.length;i<r;i++){var n=t[i];defined(n.billboard)&&(n.billboard.clusterShow=e)}var a=this._backgroundBillboard;defined(a)&&(a.clusterShow=e)}}}}),Label.prototype._updateClamping=function(){Billboard._updateClamping(this._labelCollection,this)},Label.prototype.computeScreenSpacePosition=function(e,t){defined(t)||(t=new Cartesian2);var i=this._labelCollection.modelMatrix,r=defined(this._actualClampedPosition)?this._actualClampedPosition:this._position;return Billboard._computeScreenSpacePosition(i,r,this._eyeOffset,this._pixelOffset,e,t)},Label.getScreenSpaceBoundingBox=function(e,t,i){var r=0,n=0,a=0,o=0,s=e.totalScale,l=e._backgroundBillboard;if(defined(l))r=t.x+l._translate.x,n=t.y-l._translate.y,a=l.width*s,o=l.height*s,e.verticalOrigin===VerticalOrigin$1.BOTTOM||e.verticalOrigin===VerticalOrigin$1.BASELINE?n-=o:e.verticalOrigin===VerticalOrigin$1.CENTER&&(n-=.5*o);else{r=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY;for(var c=0,u=0,d=e._glyphs,h=d.length,p=0;p<h;++p){var m,f,g,_,y=d[p],v=y.billboard;defined(v)&&(m=t.x+v._translate.x,f=t.y-v._translate.y,g=y.dimensions.width*s,_=y.dimensions.height*s,e.verticalOrigin===VerticalOrigin$1.BOTTOM||e.verticalOrigin===VerticalOrigin$1.BASELINE?f-=_:e.verticalOrigin===VerticalOrigin$1.CENTER&&(f-=.5*_),e._verticalOrigin===VerticalOrigin$1.TOP?f+=SDFSettings$1.PADDING*s:e._verticalOrigin!==VerticalOrigin$1.BOTTOM&&e._verticalOrigin!==VerticalOrigin$1.BASELINE||(f-=SDFSettings$1.PADDING*s),r=Math.min(r,m),n=Math.min(n,f),c=Math.max(c,m+g),u=Math.max(u,f+_))}a=c-r,o=u-n}return defined(i)||(i=new BoundingRectangle),i.x=r,i.y=n,i.width=a,i.height=o,i},Label.prototype.equals=function(e){return this===e||defined(e)&&this._show===e._show&&this._scale===e._scale&&this._outlineWidth===e._outlineWidth&&this._showBackground===e._showBackground&&this._style===e._style&&this._verticalOrigin===e._verticalOrigin&&this._horizontalOrigin===e._horizontalOrigin&&this._heightReference===e._heightReference&&this._renderedText===e._renderedText&&this._font===e._font&&Cartesian3.equals(this._position,e._position)&&Color.equals(this._fillColor,e._fillColor)&&Color.equals(this._outlineColor,e._outlineColor)&&Color.equals(this._backgroundColor,e._backgroundColor)&&Cartesian2.equals(this._backgroundPadding,e._backgroundPadding)&&Cartesian2.equals(this._pixelOffset,e._pixelOffset)&&Cartesian3.equals(this._eyeOffset,e._eyeOffset)&&NearFarScalar.equals(this._translucencyByDistance,e._translucencyByDistance)&&NearFarScalar.equals(this._pixelOffsetScaleByDistance,e._pixelOffsetScaleByDistance)&&NearFarScalar.equals(this._scaleByDistance,e._scaleByDistance)&&DistanceDisplayCondition.equals(this._distanceDisplayCondition,e._distanceDisplayCondition)&&this._disableDepthTestDistance===e._disableDepthTestDistance&&this._id===e._id},Label.prototype.isDestroyed=function(){return!1},Label.enableRightToLeftDetection=!1;var hebrew="א-ת",arabic="؀-ۿݐ-ݿࢠ-ࣿ",rtlChars=new RegExp("["+hebrew+arabic+"]");function reverseRtl(e){for(var t=e.split("\n"),i="",r=0;r<t.length;r++){for(var n=t[r],a=rtlChars.test(n.charAt(0)),o=convertTextToTypes(n,rtlChars),s=0,l="",c=0;c<o.length;++c){var u=o[c],d=(u.Type===textTypes.BRACKETS?reverseBrackets:reverseWord)(u.Word);a?u.Type===textTypes.RTL?(l=d+l,s=0):u.Type===textTypes.LTR?(l=spliceWord(l,s,u.Word),s+=u.Word.length):u.Type!==textTypes.WEAK&&u.Type!==textTypes.BRACKETS||(u.Type===textTypes.WEAK&&o[c-1].Type===textTypes.BRACKETS?l=d+l:o[c-1].Type===textTypes.RTL?(l=d+l,s=0):o.length>c+1?o[c+1].Type===textTypes.RTL?(l=d+l,s=0):(l=spliceWord(l,s,u.Word),s+=u.Word.length):l=spliceWord(l,0,d)):u.Type===textTypes.RTL?l=spliceWord(l,s,d):u.Type===textTypes.LTR?s=(l+=u.Word).length:u.Type!==textTypes.WEAK&&u.Type!==textTypes.BRACKETS||(0<c&&o[c-1].Type===textTypes.RTL?o.length>c+1?o[c+1].Type===textTypes.RTL?l=spliceWord(l,s,d):s=(l+=u.Word).length:l+=u.Word:s=(l+=u.Word).length)}i+=l,r<t.length-1&&(i+="\n")}return i}function GraphemeSplitter(){var c=0,u=1,d=2,h=3,p=4,m=5,f=6,g=7,_=8,y=9,v=10,C=12,S=13,T=14,x=15,b=16,E=17,P=0,A=1,w=2,D=3,M=4;function l(e,t){void 0===t&&(t=0);var i=e.charCodeAt(t);if(55296<=i&&i<=56319&&t<e.length-1){var r=i;return 56320<=(n=e.charCodeAt(t+1))&&n<=57343?1024*(r-55296)+(n-56320)+65536:r}if(56320<=i&&i<=57343&&1<=t){var n=i;return 55296<=(r=e.charCodeAt(t-1))&&r<=56319?1024*(r-55296)+(n-56320)+65536:n}return i}function I(e){return 1536<=e&&e<=1541||1757==e||1807==e||2274==e||3406==e||69821==e||70082<=e&&e<=70083||72250==e||72326<=e&&e<=72329||73030==e?C:13==e?c:10==e?u:0<=e&&e<=9||11<=e&&e<=12||14<=e&&e<=31||127<=e&&e<=159||173==e||1564==e||6158==e||8203==e||8206<=e&&e<=8207||8232==e||8233==e||8234<=e&&e<=8238||8288<=e&&e<=8292||8293==e||8294<=e&&e<=8303||55296<=e&&e<=57343||65279==e||65520<=e&&e<=65528||65529<=e&&e<=65531||113824<=e&&e<=113827||119155<=e&&e<=119162||917504==e||917505==e||917506<=e&&e<=917535||917632<=e&&e<=917759||918e3<=e&&e<=921599?d:768<=e&&e<=879||1155<=e&&e<=1159||1160<=e&&e<=1161||1425<=e&&e<=1469||1471==e||1473<=e&&e<=1474||1476<=e&&e<=1477||1479==e||1552<=e&&e<=1562||1611<=e&&e<=1631||1648==e||1750<=e&&e<=1756||1759<=e&&e<=1764||1767<=e&&e<=1768||1770<=e&&e<=1773||1809==e||1840<=e&&e<=1866||1958<=e&&e<=1968||2027<=e&&e<=2035||2070<=e&&e<=2073||2075<=e&&e<=2083||2085<=e&&e<=2087||2089<=e&&e<=2093||2137<=e&&e<=2139||2260<=e&&e<=2273||2275<=e&&e<=2306||2362==e||2364==e||2369<=e&&e<=2376||2381==e||2385<=e&&e<=2391||2402<=e&&e<=2403||2433==e||2492==e||2494==e||2497<=e&&e<=2500||2509==e||2519==e||2530<=e&&e<=2531||2561<=e&&e<=2562||2620==e||2625<=e&&e<=2626||2631<=e&&e<=2632||2635<=e&&e<=2637||2641==e||2672<=e&&e<=2673||2677==e||2689<=e&&e<=2690||2748==e||2753<=e&&e<=2757||2759<=e&&e<=2760||2765==e||2786<=e&&e<=2787||2810<=e&&e<=2815||2817==e||2876==e||2878==e||2879==e||2881<=e&&e<=2884||2893==e||2902==e||2903==e||2914<=e&&e<=2915||2946==e||3006==e||3008==e||3021==e||3031==e||3072==e||3134<=e&&e<=3136||3142<=e&&e<=3144||3146<=e&&e<=3149||3157<=e&&e<=3158||3170<=e&&e<=3171||3201==e||3260==e||3263==e||3266==e||3270==e||3276<=e&&e<=3277||3285<=e&&e<=3286||3298<=e&&e<=3299||3328<=e&&e<=3329||3387<=e&&e<=3388||3390==e||3393<=e&&e<=3396||3405==e||3415==e||3426<=e&&e<=3427||3530==e||3535==e||3538<=e&&e<=3540||3542==e||3551==e||3633==e||3636<=e&&e<=3642||3655<=e&&e<=3662||3761==e||3764<=e&&e<=3769||3771<=e&&e<=3772||3784<=e&&e<=3789||3864<=e&&e<=3865||3893==e||3895==e||3897==e||3953<=e&&e<=3966||3968<=e&&e<=3972||3974<=e&&e<=3975||3981<=e&&e<=3991||3993<=e&&e<=4028||4038==e||4141<=e&&e<=4144||4146<=e&&e<=4151||4153<=e&&e<=4154||4157<=e&&e<=4158||4184<=e&&e<=4185||4190<=e&&e<=4192||4209<=e&&e<=4212||4226==e||4229<=e&&e<=4230||4237==e||4253==e||4957<=e&&e<=4959||5906<=e&&e<=5908||5938<=e&&e<=5940||5970<=e&&e<=5971||6002<=e&&e<=6003||6068<=e&&e<=6069||6071<=e&&e<=6077||6086==e||6089<=e&&e<=6099||6109==e||6155<=e&&e<=6157||6277<=e&&e<=6278||6313==e||6432<=e&&e<=6434||6439<=e&&e<=6440||6450==e||6457<=e&&e<=6459||6679<=e&&e<=6680||6683==e||6742==e||6744<=e&&e<=6750||6752==e||6754==e||6757<=e&&e<=6764||6771<=e&&e<=6780||6783==e||6832<=e&&e<=6845||6846==e||6912<=e&&e<=6915||6964==e||6966<=e&&e<=6970||6972==e||6978==e||7019<=e&&e<=7027||7040<=e&&e<=7041||7074<=e&&e<=7077||7080<=e&&e<=7081||7083<=e&&e<=7085||7142==e||7144<=e&&e<=7145||7149==e||7151<=e&&e<=7153||7212<=e&&e<=7219||7222<=e&&e<=7223||7376<=e&&e<=7378||7380<=e&&e<=7392||7394<=e&&e<=7400||7405==e||7412==e||7416<=e&&e<=7417||7616<=e&&e<=7673||7675<=e&&e<=7679||8204==e||8400<=e&&e<=8412||8413<=e&&e<=8416||8417==e||8418<=e&&e<=8420||8421<=e&&e<=8432||11503<=e&&e<=11505||11647==e||11744<=e&&e<=11775||12330<=e&&e<=12333||12334<=e&&e<=12335||12441<=e&&e<=12442||42607==e||42608<=e&&e<=42610||42612<=e&&e<=42621||42654<=e&&e<=42655||42736<=e&&e<=42737||43010==e||43014==e||43019==e||43045<=e&&e<=43046||43204<=e&&e<=43205||43232<=e&&e<=43249||43302<=e&&e<=43309||43335<=e&&e<=43345||43392<=e&&e<=43394||43443==e||43446<=e&&e<=43449||43452==e||43493==e||43561<=e&&e<=43566||43569<=e&&e<=43570||43573<=e&&e<=43574||43587==e||43596==e||43644==e||43696==e||43698<=e&&e<=43700||43703<=e&&e<=43704||43710<=e&&e<=43711||43713==e||43756<=e&&e<=43757||43766==e||44005==e||44008==e||44013==e||64286==e||65024<=e&&e<=65039||65056<=e&&e<=65071||65438<=e&&e<=65439||66045==e||66272==e||66422<=e&&e<=66426||68097<=e&&e<=68099||68101<=e&&e<=68102||68108<=e&&e<=68111||68152<=e&&e<=68154||68159==e||68325<=e&&e<=68326||69633==e||69688<=e&&e<=69702||69759<=e&&e<=69761||69811<=e&&e<=69814||69817<=e&&e<=69818||69888<=e&&e<=69890||69927<=e&&e<=69931||69933<=e&&e<=69940||70003==e||70016<=e&&e<=70017||70070<=e&&e<=70078||70090<=e&&e<=70092||70191<=e&&e<=70193||70196==e||70198<=e&&e<=70199||70206==e||70367==e||70371<=e&&e<=70378||70400<=e&&e<=70401||70460==e||70462==e||70464==e||70487==e||70502<=e&&e<=70508||70512<=e&&e<=70516||70712<=e&&e<=70719||70722<=e&&e<=70724||70726==e||70832==e||70835<=e&&e<=70840||70842==e||70845==e||70847<=e&&e<=70848||70850<=e&&e<=70851||71087==e||71090<=e&&e<=71093||71100<=e&&e<=71101||71103<=e&&e<=71104||71132<=e&&e<=71133||71219<=e&&e<=71226||71229==e||71231<=e&&e<=71232||71339==e||71341==e||71344<=e&&e<=71349||71351==e||71453<=e&&e<=71455||71458<=e&&e<=71461||71463<=e&&e<=71467||72193<=e&&e<=72198||72201<=e&&e<=72202||72243<=e&&e<=72248||72251<=e&&e<=72254||72263==e||72273<=e&&e<=72278||72281<=e&&e<=72283||72330<=e&&e<=72342||72344<=e&&e<=72345||72752<=e&&e<=72758||72760<=e&&e<=72765||72767==e||72850<=e&&e<=72871||72874<=e&&e<=72880||72882<=e&&e<=72883||72885<=e&&e<=72886||73009<=e&&e<=73014||73018==e||73020<=e&&e<=73021||73023<=e&&e<=73029||73031==e||92912<=e&&e<=92916||92976<=e&&e<=92982||94095<=e&&e<=94098||113821<=e&&e<=113822||119141==e||119143<=e&&e<=119145||119150<=e&&e<=119154||119163<=e&&e<=119170||119173<=e&&e<=119179||119210<=e&&e<=119213||119362<=e&&e<=119364||121344<=e&&e<=121398||121403<=e&&e<=121452||121461==e||121476==e||121499<=e&&e<=121503||121505<=e&&e<=121519||122880<=e&&e<=122886||122888<=e&&e<=122904||122907<=e&&e<=122913||122915<=e&&e<=122916||122918<=e&&e<=122922||125136<=e&&e<=125142||125252<=e&&e<=125258||917536<=e&&e<=917631||917760<=e&&e<=917999?h:127462<=e&&e<=127487?p:2307==e||2363==e||2366<=e&&e<=2368||2377<=e&&e<=2380||2382<=e&&e<=2383||2434<=e&&e<=2435||2495<=e&&e<=2496||2503<=e&&e<=2504||2507<=e&&e<=2508||2563==e||2622<=e&&e<=2624||2691==e||2750<=e&&e<=2752||2761==e||2763<=e&&e<=2764||2818<=e&&e<=2819||2880==e||2887<=e&&e<=2888||2891<=e&&e<=2892||3007==e||3009<=e&&e<=3010||3014<=e&&e<=3016||3018<=e&&e<=3020||3073<=e&&e<=3075||3137<=e&&e<=3140||3202<=e&&e<=3203||3262==e||3264<=e&&e<=3265||3267<=e&&e<=3268||3271<=e&&e<=3272||3274<=e&&e<=3275||3330<=e&&e<=3331||3391<=e&&e<=3392||3398<=e&&e<=3400||3402<=e&&e<=3404||3458<=e&&e<=3459||3536<=e&&e<=3537||3544<=e&&e<=3550||3570<=e&&e<=3571||3635==e||3763==e||3902<=e&&e<=3903||3967==e||4145==e||4155<=e&&e<=4156||4182<=e&&e<=4183||4228==e||6070==e||6078<=e&&e<=6085||6087<=e&&e<=6088||6435<=e&&e<=6438||6441<=e&&e<=6443||6448<=e&&e<=6449||6451<=e&&e<=6456||6681<=e&&e<=6682||6741==e||6743==e||6765<=e&&e<=6770||6916==e||6965==e||6971==e||6973<=e&&e<=6977||6979<=e&&e<=6980||7042==e||7073==e||7078<=e&&e<=7079||7082==e||7143==e||7146<=e&&e<=7148||7150==e||7154<=e&&e<=7155||7204<=e&&e<=7211||7220<=e&&e<=7221||7393==e||7410<=e&&e<=7411||7415==e||43043<=e&&e<=43044||43047==e||43136<=e&&e<=43137||43188<=e&&e<=43203||43346<=e&&e<=43347||43395==e||43444<=e&&e<=43445||43450<=e&&e<=43451||43453<=e&&e<=43456||43567<=e&&e<=43568||43571<=e&&e<=43572||43597==e||43755==e||43758<=e&&e<=43759||43765==e||44003<=e&&e<=44004||44006<=e&&e<=44007||44009<=e&&e<=44010||44012==e||69632==e||69634==e||69762==e||69808<=e&&e<=69810||69815<=e&&e<=69816||69932==e||70018==e||70067<=e&&e<=70069||70079<=e&&e<=70080||70188<=e&&e<=70190||70194<=e&&e<=70195||70197==e||70368<=e&&e<=70370||70402<=e&&e<=70403||70463==e||70465<=e&&e<=70468||70471<=e&&e<=70472||70475<=e&&e<=70477||70498<=e&&e<=70499||70709<=e&&e<=70711||70720<=e&&e<=70721||70725==e||70833<=e&&e<=70834||70841==e||70843<=e&&e<=70844||70846==e||70849==e||71088<=e&&e<=71089||71096<=e&&e<=71099||71102==e||71216<=e&&e<=71218||71227<=e&&e<=71228||71230==e||71340==e||71342<=e&&e<=71343||71350==e||71456<=e&&e<=71457||71462==e||72199<=e&&e<=72200||72249==e||72279<=e&&e<=72280||72343==e||72751==e||72766==e||72873==e||72881==e||72884==e||94033<=e&&e<=94078||119142==e||119149==e?m:4352<=e&&e<=4447||43360<=e&&e<=43388?f:4448<=e&&e<=4519||55216<=e&&e<=55238?g:4520<=e&&e<=4607||55243<=e&&e<=55291?_:44032==e||44060==e||44088==e||44116==e||44144==e||44172==e||44200==e||44228==e||44256==e||44284==e||44312==e||44340==e||44368==e||44396==e||44424==e||44452==e||44480==e||44508==e||44536==e||44564==e||44592==e||44620==e||44648==e||44676==e||44704==e||44732==e||44760==e||44788==e||44816==e||44844==e||44872==e||44900==e||44928==e||44956==e||44984==e||45012==e||45040==e||45068==e||45096==e||45124==e||45152==e||45180==e||45208==e||45236==e||45264==e||45292==e||45320==e||45348==e||45376==e||45404==e||45432==e||45460==e||45488==e||45516==e||45544==e||45572==e||45600==e||45628==e||45656==e||45684==e||45712==e||45740==e||45768==e||45796==e||45824==e||45852==e||45880==e||45908==e||45936==e||45964==e||45992==e||46020==e||46048==e||46076==e||46104==e||46132==e||46160==e||46188==e||46216==e||46244==e||46272==e||46300==e||46328==e||46356==e||46384==e||46412==e||46440==e||46468==e||46496==e||46524==e||46552==e||46580==e||46608==e||46636==e||46664==e||46692==e||46720==e||46748==e||46776==e||46804==e||46832==e||46860==e||46888==e||46916==e||46944==e||46972==e||47e3==e||47028==e||47056==e||47084==e||47112==e||47140==e||47168==e||47196==e||47224==e||47252==e||47280==e||47308==e||47336==e||47364==e||47392==e||47420==e||47448==e||47476==e||47504==e||47532==e||47560==e||47588==e||47616==e||47644==e||47672==e||47700==e||47728==e||47756==e||47784==e||47812==e||47840==e||47868==e||47896==e||47924==e||47952==e||47980==e||48008==e||48036==e||48064==e||48092==e||48120==e||48148==e||48176==e||48204==e||48232==e||48260==e||48288==e||48316==e||48344==e||48372==e||48400==e||48428==e||48456==e||48484==e||48512==e||48540==e||48568==e||48596==e||48624==e||48652==e||48680==e||48708==e||48736==e||48764==e||48792==e||48820==e||48848==e||48876==e||48904==e||48932==e||48960==e||48988==e||49016==e||49044==e||49072==e||49100==e||49128==e||49156==e||49184==e||49212==e||49240==e||49268==e||49296==e||49324==e||49352==e||49380==e||49408==e||49436==e||49464==e||49492==e||49520==e||49548==e||49576==e||49604==e||49632==e||49660==e||49688==e||49716==e||49744==e||49772==e||49800==e||49828==e||49856==e||49884==e||49912==e||49940==e||49968==e||49996==e||50024==e||50052==e||50080==e||50108==e||50136==e||50164==e||50192==e||50220==e||50248==e||50276==e||50304==e||50332==e||50360==e||50388==e||50416==e||50444==e||50472==e||50500==e||50528==e||50556==e||50584==e||50612==e||50640==e||50668==e||50696==e||50724==e||50752==e||50780==e||50808==e||50836==e||50864==e||50892==e||50920==e||50948==e||50976==e||51004==e||51032==e||51060==e||51088==e||51116==e||51144==e||51172==e||51200==e||51228==e||51256==e||51284==e||51312==e||51340==e||51368==e||51396==e||51424==e||51452==e||51480==e||51508==e||51536==e||51564==e||51592==e||51620==e||51648==e||51676==e||51704==e||51732==e||51760==e||51788==e||51816==e||51844==e||51872==e||51900==e||51928==e||51956==e||51984==e||52012==e||52040==e||52068==e||52096==e||52124==e||52152==e||52180==e||52208==e||52236==e||52264==e||52292==e||52320==e||52348==e||52376==e||52404==e||52432==e||52460==e||52488==e||52516==e||52544==e||52572==e||52600==e||52628==e||52656==e||52684==e||52712==e||52740==e||52768==e||52796==e||52824==e||52852==e||52880==e||52908==e||52936==e||52964==e||52992==e||53020==e||53048==e||53076==e||53104==e||53132==e||53160==e||53188==e||53216==e||53244==e||53272==e||53300==e||53328==e||53356==e||53384==e||53412==e||53440==e||53468==e||53496==e||53524==e||53552==e||53580==e||53608==e||53636==e||53664==e||53692==e||53720==e||53748==e||53776==e||53804==e||53832==e||53860==e||53888==e||53916==e||53944==e||53972==e||54e3==e||54028==e||54056==e||54084==e||54112==e||54140==e||54168==e||54196==e||54224==e||54252==e||54280==e||54308==e||54336==e||54364==e||54392==e||54420==e||54448==e||54476==e||54504==e||54532==e||54560==e||54588==e||54616==e||54644==e||54672==e||54700==e||54728==e||54756==e||54784==e||54812==e||54840==e||54868==e||54896==e||54924==e||54952==e||54980==e||55008==e||55036==e||55064==e||55092==e||55120==e||55148==e||55176==e?y:44033<=e&&e<=44059||44061<=e&&e<=44087||44089<=e&&e<=44115||44117<=e&&e<=44143||44145<=e&&e<=44171||44173<=e&&e<=44199||44201<=e&&e<=44227||44229<=e&&e<=44255||44257<=e&&e<=44283||44285<=e&&e<=44311||44313<=e&&e<=44339||44341<=e&&e<=44367||44369<=e&&e<=44395||44397<=e&&e<=44423||44425<=e&&e<=44451||44453<=e&&e<=44479||44481<=e&&e<=44507||44509<=e&&e<=44535||44537<=e&&e<=44563||44565<=e&&e<=44591||44593<=e&&e<=44619||44621<=e&&e<=44647||44649<=e&&e<=44675||44677<=e&&e<=44703||44705<=e&&e<=44731||44733<=e&&e<=44759||44761<=e&&e<=44787||44789<=e&&e<=44815||44817<=e&&e<=44843||44845<=e&&e<=44871||44873<=e&&e<=44899||44901<=e&&e<=44927||44929<=e&&e<=44955||44957<=e&&e<=44983||44985<=e&&e<=45011||45013<=e&&e<=45039||45041<=e&&e<=45067||45069<=e&&e<=45095||45097<=e&&e<=45123||45125<=e&&e<=45151||45153<=e&&e<=45179||45181<=e&&e<=45207||45209<=e&&e<=45235||45237<=e&&e<=45263||45265<=e&&e<=45291||45293<=e&&e<=45319||45321<=e&&e<=45347||45349<=e&&e<=45375||45377<=e&&e<=45403||45405<=e&&e<=45431||45433<=e&&e<=45459||45461<=e&&e<=45487||45489<=e&&e<=45515||45517<=e&&e<=45543||45545<=e&&e<=45571||45573<=e&&e<=45599||45601<=e&&e<=45627||45629<=e&&e<=45655||45657<=e&&e<=45683||45685<=e&&e<=45711||45713<=e&&e<=45739||45741<=e&&e<=45767||45769<=e&&e<=45795||45797<=e&&e<=45823||45825<=e&&e<=45851||45853<=e&&e<=45879||45881<=e&&e<=45907||45909<=e&&e<=45935||45937<=e&&e<=45963||45965<=e&&e<=45991||45993<=e&&e<=46019||46021<=e&&e<=46047||46049<=e&&e<=46075||46077<=e&&e<=46103||46105<=e&&e<=46131||46133<=e&&e<=46159||46161<=e&&e<=46187||46189<=e&&e<=46215||46217<=e&&e<=46243||46245<=e&&e<=46271||46273<=e&&e<=46299||46301<=e&&e<=46327||46329<=e&&e<=46355||46357<=e&&e<=46383||46385<=e&&e<=46411||46413<=e&&e<=46439||46441<=e&&e<=46467||46469<=e&&e<=46495||46497<=e&&e<=46523||46525<=e&&e<=46551||46553<=e&&e<=46579||46581<=e&&e<=46607||46609<=e&&e<=46635||46637<=e&&e<=46663||46665<=e&&e<=46691||46693<=e&&e<=46719||46721<=e&&e<=46747||46749<=e&&e<=46775||46777<=e&&e<=46803||46805<=e&&e<=46831||46833<=e&&e<=46859||46861<=e&&e<=46887||46889<=e&&e<=46915||46917<=e&&e<=46943||46945<=e&&e<=46971||46973<=e&&e<=46999||47001<=e&&e<=47027||47029<=e&&e<=47055||47057<=e&&e<=47083||47085<=e&&e<=47111||47113<=e&&e<=47139||47141<=e&&e<=47167||47169<=e&&e<=47195||47197<=e&&e<=47223||47225<=e&&e<=47251||47253<=e&&e<=47279||47281<=e&&e<=47307||47309<=e&&e<=47335||47337<=e&&e<=47363||47365<=e&&e<=47391||47393<=e&&e<=47419||47421<=e&&e<=47447||47449<=e&&e<=47475||47477<=e&&e<=47503||47505<=e&&e<=47531||47533<=e&&e<=47559||47561<=e&&e<=47587||47589<=e&&e<=47615||47617<=e&&e<=47643||47645<=e&&e<=47671||47673<=e&&e<=47699||47701<=e&&e<=47727||47729<=e&&e<=47755||47757<=e&&e<=47783||47785<=e&&e<=47811||47813<=e&&e<=47839||47841<=e&&e<=47867||47869<=e&&e<=47895||47897<=e&&e<=47923||47925<=e&&e<=47951||47953<=e&&e<=47979||47981<=e&&e<=48007||48009<=e&&e<=48035||48037<=e&&e<=48063||48065<=e&&e<=48091||48093<=e&&e<=48119||48121<=e&&e<=48147||48149<=e&&e<=48175||48177<=e&&e<=48203||48205<=e&&e<=48231||48233<=e&&e<=48259||48261<=e&&e<=48287||48289<=e&&e<=48315||48317<=e&&e<=48343||48345<=e&&e<=48371||48373<=e&&e<=48399||48401<=e&&e<=48427||48429<=e&&e<=48455||48457<=e&&e<=48483||48485<=e&&e<=48511||48513<=e&&e<=48539||48541<=e&&e<=48567||48569<=e&&e<=48595||48597<=e&&e<=48623||48625<=e&&e<=48651||48653<=e&&e<=48679||48681<=e&&e<=48707||48709<=e&&e<=48735||48737<=e&&e<=48763||48765<=e&&e<=48791||48793<=e&&e<=48819||48821<=e&&e<=48847||48849<=e&&e<=48875||48877<=e&&e<=48903||48905<=e&&e<=48931||48933<=e&&e<=48959||48961<=e&&e<=48987||48989<=e&&e<=49015||49017<=e&&e<=49043||49045<=e&&e<=49071||49073<=e&&e<=49099||49101<=e&&e<=49127||49129<=e&&e<=49155||49157<=e&&e<=49183||49185<=e&&e<=49211||49213<=e&&e<=49239||49241<=e&&e<=49267||49269<=e&&e<=49295||49297<=e&&e<=49323||49325<=e&&e<=49351||49353<=e&&e<=49379||49381<=e&&e<=49407||49409<=e&&e<=49435||49437<=e&&e<=49463||49465<=e&&e<=49491||49493<=e&&e<=49519||49521<=e&&e<=49547||49549<=e&&e<=49575||49577<=e&&e<=49603||49605<=e&&e<=49631||49633<=e&&e<=49659||49661<=e&&e<=49687||49689<=e&&e<=49715||49717<=e&&e<=49743||49745<=e&&e<=49771||49773<=e&&e<=49799||49801<=e&&e<=49827||49829<=e&&e<=49855||49857<=e&&e<=49883||49885<=e&&e<=49911||49913<=e&&e<=49939||49941<=e&&e<=49967||49969<=e&&e<=49995||49997<=e&&e<=50023||50025<=e&&e<=50051||50053<=e&&e<=50079||50081<=e&&e<=50107||50109<=e&&e<=50135||50137<=e&&e<=50163||50165<=e&&e<=50191||50193<=e&&e<=50219||50221<=e&&e<=50247||50249<=e&&e<=50275||50277<=e&&e<=50303||50305<=e&&e<=50331||50333<=e&&e<=50359||50361<=e&&e<=50387||50389<=e&&e<=50415||50417<=e&&e<=50443||50445<=e&&e<=50471||50473<=e&&e<=50499||50501<=e&&e<=50527||50529<=e&&e<=50555||50557<=e&&e<=50583||50585<=e&&e<=50611||50613<=e&&e<=50639||50641<=e&&e<=50667||50669<=e&&e<=50695||50697<=e&&e<=50723||50725<=e&&e<=50751||50753<=e&&e<=50779||50781<=e&&e<=50807||50809<=e&&e<=50835||50837<=e&&e<=50863||50865<=e&&e<=50891||50893<=e&&e<=50919||50921<=e&&e<=50947||50949<=e&&e<=50975||50977<=e&&e<=51003||51005<=e&&e<=51031||51033<=e&&e<=51059||51061<=e&&e<=51087||51089<=e&&e<=51115||51117<=e&&e<=51143||51145<=e&&e<=51171||51173<=e&&e<=51199||51201<=e&&e<=51227||51229<=e&&e<=51255||51257<=e&&e<=51283||51285<=e&&e<=51311||51313<=e&&e<=51339||51341<=e&&e<=51367||51369<=e&&e<=51395||51397<=e&&e<=51423||51425<=e&&e<=51451||51453<=e&&e<=51479||51481<=e&&e<=51507||51509<=e&&e<=51535||51537<=e&&e<=51563||51565<=e&&e<=51591||51593<=e&&e<=51619||51621<=e&&e<=51647||51649<=e&&e<=51675||51677<=e&&e<=51703||51705<=e&&e<=51731||51733<=e&&e<=51759||51761<=e&&e<=51787||51789<=e&&e<=51815||51817<=e&&e<=51843||51845<=e&&e<=51871||51873<=e&&e<=51899||51901<=e&&e<=51927||51929<=e&&e<=51955||51957<=e&&e<=51983||51985<=e&&e<=52011||52013<=e&&e<=52039||52041<=e&&e<=52067||52069<=e&&e<=52095||52097<=e&&e<=52123||52125<=e&&e<=52151||52153<=e&&e<=52179||52181<=e&&e<=52207||52209<=e&&e<=52235||52237<=e&&e<=52263||52265<=e&&e<=52291||52293<=e&&e<=52319||52321<=e&&e<=52347||52349<=e&&e<=52375||52377<=e&&e<=52403||52405<=e&&e<=52431||52433<=e&&e<=52459||52461<=e&&e<=52487||52489<=e&&e<=52515||52517<=e&&e<=52543||52545<=e&&e<=52571||52573<=e&&e<=52599||52601<=e&&e<=52627||52629<=e&&e<=52655||52657<=e&&e<=52683||52685<=e&&e<=52711||52713<=e&&e<=52739||52741<=e&&e<=52767||52769<=e&&e<=52795||52797<=e&&e<=52823||52825<=e&&e<=52851||52853<=e&&e<=52879||52881<=e&&e<=52907||52909<=e&&e<=52935||52937<=e&&e<=52963||52965<=e&&e<=52991||52993<=e&&e<=53019||53021<=e&&e<=53047||53049<=e&&e<=53075||53077<=e&&e<=53103||53105<=e&&e<=53131||53133<=e&&e<=53159||53161<=e&&e<=53187||53189<=e&&e<=53215||53217<=e&&e<=53243||53245<=e&&e<=53271||53273<=e&&e<=53299||53301<=e&&e<=53327||53329<=e&&e<=53355||53357<=e&&e<=53383||53385<=e&&e<=53411||53413<=e&&e<=53439||53441<=e&&e<=53467||53469<=e&&e<=53495||53497<=e&&e<=53523||53525<=e&&e<=53551||53553<=e&&e<=53579||53581<=e&&e<=53607||53609<=e&&e<=53635||53637<=e&&e<=53663||53665<=e&&e<=53691||53693<=e&&e<=53719||53721<=e&&e<=53747||53749<=e&&e<=53775||53777<=e&&e<=53803||53805<=e&&e<=53831||53833<=e&&e<=53859||53861<=e&&e<=53887||53889<=e&&e<=53915||53917<=e&&e<=53943||53945<=e&&e<=53971||53973<=e&&e<=53999||54001<=e&&e<=54027||54029<=e&&e<=54055||54057<=e&&e<=54083||54085<=e&&e<=54111||54113<=e&&e<=54139||54141<=e&&e<=54167||54169<=e&&e<=54195||54197<=e&&e<=54223||54225<=e&&e<=54251||54253<=e&&e<=54279||54281<=e&&e<=54307||54309<=e&&e<=54335||54337<=e&&e<=54363||54365<=e&&e<=54391||54393<=e&&e<=54419||54421<=e&&e<=54447||54449<=e&&e<=54475||54477<=e&&e<=54503||54505<=e&&e<=54531||54533<=e&&e<=54559||54561<=e&&e<=54587||54589<=e&&e<=54615||54617<=e&&e<=54643||54645<=e&&e<=54671||54673<=e&&e<=54699||54701<=e&&e<=54727||54729<=e&&e<=54755||54757<=e&&e<=54783||54785<=e&&e<=54811||54813<=e&&e<=54839||54841<=e&&e<=54867||54869<=e&&e<=54895||54897<=e&&e<=54923||54925<=e&&e<=54951||54953<=e&&e<=54979||54981<=e&&e<=55007||55009<=e&&e<=55035||55037<=e&&e<=55063||55065<=e&&e<=55091||55093<=e&&e<=55119||55121<=e&&e<=55147||55149<=e&&e<=55175||55177<=e&&e<=55203?v:9757==e||9977==e||9994<=e&&e<=9997||127877==e||127938<=e&&e<=127940||127943==e||127946<=e&&e<=127948||128066<=e&&e<=128067||128070<=e&&e<=128080||128110==e||128112<=e&&e<=128120||128124==e||128129<=e&&e<=128131||128133<=e&&e<=128135||128170==e||128372<=e&&e<=128373||128378==e||128400==e||128405<=e&&e<=128406||128581<=e&&e<=128583||128587<=e&&e<=128591||128675==e||128692<=e&&e<=128694||128704==e||128716==e||129304<=e&&e<=129308||129310<=e&&e<=129311||129318==e||129328<=e&&e<=129337||129341<=e&&e<=129342||129489<=e&&e<=129501?S:127995<=e&&e<=127999?T:8205==e?x:9792==e||9794==e||9877<=e&&e<=9878||9992==e||10084==e||127752==e||127806==e||127859==e||127891==e||127908==e||127912==e||127979==e||127981==e||128139==e||128187<=e&&e<=128188||128295==e||128300==e||128488==e||128640==e||128658==e?b:128102<=e&&e<=128105?E:11}return this.nextBreak=function(e,t){if(void 0===t&&(t=0),t<0)return 0;if(t>=e.length-1)return e.length;for(var i,r,n=I(l(e,t)),a=[],o=t+1;o<e.length;o++)if(r=o-1,!(55296<=(i=e).charCodeAt(r)&&i.charCodeAt(r)<=56319&&56320<=i.charCodeAt(r+1)&&i.charCodeAt(r+1)<=57343)){var s=I(l(e,o));if(function(e,t,i){var r=[e].concat(t).concat([i]),n=r[r.length-2],a=i,o=r.lastIndexOf(T);if(1<o&&r.slice(1,o).every(function(e){return e==h})&&-1==[h,S,E].indexOf(e))return w;var s=r.lastIndexOf(p);if(0<s&&r.slice(1,s).every(function(e){return e==p})&&-1==[C,p].indexOf(n))return r.filter(function(e){return e==p}).length%2==1?D:M;if(n==c&&a==u)return P;if(n==d||n==c||n==u)return a==T&&t.every(function(e){return e==h})?w:A;if(a==d||a==c||a==u)return A;if(n==f&&(a==f||a==g||a==y||a==v))return P;if(!(n!=y&&n!=g||a!=g&&a!=_))return P;if((n==v||n==_)&&a==_)return P;if(a==h||a==x)return P;if(a==m)return P;if(n==C)return P;var l=-1!=r.indexOf(h)?r.lastIndexOf(h)-1:r.length-2;return-1!=[S,E].indexOf(r[l])&&r.slice(1+l,-1).every(function(e){return e==h})&&a==T||n==x&&-1!=[b,E].indexOf(a)?P:-1!=t.indexOf(p)?w:n==p&&a==p?P:A}(n,a,s))return o;a.push(s)}return e.length},this.splitGraphemes=function(e){for(var t,i=[],r=0;(t=this.nextBreak(e,r))<e.length;)i.push(e.slice(r,t)),r=t;return r<e.length&&i.push(e.slice(r)),i},this.iterateGraphemes=function(i){var r=0,e={next:function(){var e,t;return(t=this.nextBreak(i,r))<i.length?(e=i.slice(r,t),r=t,{value:e,done:!1}):r<i.length?(e=i.slice(r),r=i.length,{value:e,done:!1}):{value:void 0,done:!0}}.bind(this)};return"undefined"!=typeof Symbol&&Symbol.iterator&&(e[Symbol.iterator]=function(){return e}),e},this.countGraphemes=function(e){for(var t,i=0,r=0;(t=this.nextBreak(e,r))<e.length;)r=t,i++;return r<e.length&&i++,i},this}function Glyph(){this.textureInfo=void 0,this.dimensions=void 0,this.billboard=void 0}function GlyphTextureInfo(e,t,i){this.labelCollection=e,this.index=t,this.dimensions=i}var defaultLineSpacingPercent=1.2,whitePixelCanvasId="ID_WHITE_PIXEL",whitePixelSize=new Cartesian2(4,4),whitePixelBoundingRegion=new BoundingRectangle(1,1,1,1);function addWhitePixelCanvas(e,t){var i=document.createElement("canvas");i.width=whitePixelSize.x,i.height=whitePixelSize.y;var r=i.getContext("2d");r.fillStyle="#fff",r.fillRect(0,0,i.width,i.height),e.addImage(whitePixelCanvasId,i).then(function(e){t._whitePixelIndex=e})}var writeTextToCanvasParameters={};function createGlyphCanvas(e,t,i,r,n,a,o){return writeTextToCanvasParameters.font=t,writeTextToCanvasParameters.fillColor=i,writeTextToCanvasParameters.strokeColor=r,writeTextToCanvasParameters.strokeWidth=n,writeTextToCanvasParameters.padding=SDFSettings$1.PADDING,o===VerticalOrigin$1.CENTER?writeTextToCanvasParameters.textBaseline="middle":o===VerticalOrigin$1.TOP?writeTextToCanvasParameters.textBaseline="top":writeTextToCanvasParameters.textBaseline="bottom",writeTextToCanvasParameters.fill=a===LabelStyle$1.FILL||a===LabelStyle$1.FILL_AND_OUTLINE,writeTextToCanvasParameters.stroke=a===LabelStyle$1.OUTLINE||a===LabelStyle$1.FILL_AND_OUTLINE,writeTextToCanvasParameters.backgroundColor=Color.BLACK,writeTextToCanvas(e,writeTextToCanvasParameters)}function unbindGlyph(e,t){t.textureInfo=void 0,t.dimensions=void 0;var i=t.billboard;defined(i)&&(i.show=!1,i.image=void 0,defined(i._removeCallbackFunc)&&(i._removeCallbackFunc(),i._removeCallbackFunc=void 0),e._spareBillboards.push(i),t.billboard=void 0)}function addGlyphToTextureAtlas(e,t,i,r){e.addImage(t,i).then(function(e){r.index=e})}var splitter=new GraphemeSplitter;function rebindAllGlyphs$1(e,t){var i,r,n=t._renderedText,a=splitter.splitGraphemes(n),o=a.length,s=t._glyphs,l=s.length;if(t._relativeSize=t._fontSize/SDFSettings$1.FONT_SIZE,o<l)for(r=o;r<l;++r)unbindGlyph(e,s[r]);s.length=o;var c=t._showBackground&&0<n.split("\n").join("").length,u=t._backgroundBillboard,d=e._backgroundBillboardCollection;c?(defined(u)||(u=d.add({collection:e,image:whitePixelCanvasId,imageSubRegion:whitePixelBoundingRegion}),t._backgroundBillboard=u),u.color=t._backgroundColor,u.show=t._show,u.position=t._position,u.eyeOffset=t._eyeOffset,u.pixelOffset=t._pixelOffset,u.horizontalOrigin=HorizontalOrigin$1.LEFT,u.verticalOrigin=t._verticalOrigin,u.heightReference=t._heightReference,u.scale=t.totalScale,u.pickPrimitive=t,u.id=t._id,u.translucencyByDistance=t._translucencyByDistance,u.pixelOffsetScaleByDistance=t._pixelOffsetScaleByDistance,u.scaleByDistance=t._scaleByDistance,u.distanceDisplayCondition=t._distanceDisplayCondition,u.disableDepthTestDistance=t._disableDepthTestDistance):defined(u)&&(d.remove(u),t._backgroundBillboard=u=void 0);for(var h=e._glyphTextureCache,p=0;p<o;++p){var m,f,g=a[p],_=t._verticalOrigin,y=JSON.stringify([g,t._fontFamily,t._fontStyle,t._fontWeight,+_]);if(!defined(C=h[y])){var v=createGlyphCanvas(g,t._fontStyle+" "+t._fontWeight+" "+SDFSettings$1.FONT_SIZE+"px "+t._fontFamily,Color.WHITE,Color.WHITE,0,LabelStyle$1.FILL,_),C=new GlyphTextureInfo(e,-1,v.dimensions);if(h[y]=C,0<v.width&&0<v.height){for(var S=calcSDF(v,{cutoff:SDFSettings$1.CUTOFF,radius:SDFSettings$1.RADIUS}),T=v.getContext("2d"),x=v.width,b=v.height,E=T.getImageData(0,0,x,b),P=0;P<x;P++)for(var A=0;A<b;A++){var w=A*x+P,D=255*S[w],M=4*w;E.data[0+M]=D,E.data[1+M]=D,E.data[2+M]=D,E.data[3+M]=D}T.putImageData(E,0,0)," "!==g&&addGlyphToTextureAtlas(e._textureAtlas,y,v,C)}}defined(i=s[p])?-1===C.index?unbindGlyph(e,i):defined(i.textureInfo)&&(i.textureInfo=void 0):(i=new Glyph,s[p]=i),i.textureInfo=C,i.dimensions=C.dimensions,-1!==C.index&&(m=i.billboard,f=e._spareBillboards,defined(m)||(0<f.length?m=f.pop():((m=e._billboardCollection.add({collection:e}))._labelDimensions=new Cartesian2,m._labelTranslate=new Cartesian2),i.billboard=m),m.show=t._show,m.position=t._position,m.eyeOffset=t._eyeOffset,m.pixelOffset=t._pixelOffset,m.horizontalOrigin=HorizontalOrigin$1.LEFT,m.verticalOrigin=t._verticalOrigin,m.heightReference=t._heightReference,m.scale=t.totalScale,m.pickPrimitive=t,m.id=t._id,m.image=y,m.translucencyByDistance=t._translucencyByDistance,m.pixelOffsetScaleByDistance=t._pixelOffsetScaleByDistance,m.scaleByDistance=t._scaleByDistance,m.distanceDisplayCondition=t._distanceDisplayCondition,m.disableDepthTestDistance=t._disableDepthTestDistance,m._batchIndex=t._batchIndex,m.outlineColor=t.outlineColor,t.style===LabelStyle$1.FILL_AND_OUTLINE?(m.color=t._fillColor,m.outlineWidth=t.outlineWidth):t.style===LabelStyle$1.FILL?(m.color=t._fillColor,m.outlineWidth=0):t.style===LabelStyle$1.OUTLINE&&(m.color=Color.TRANSPARENT,m.outlineWidth=t.outlineWidth))}t._repositionAllGlyphs=!0}function calculateWidthOffset(e,t,i){return t===HorizontalOrigin$1.CENTER?-e/2:t===HorizontalOrigin$1.RIGHT?-(e+i.x):i.x}var glyphPixelOffset=new Cartesian2,scratchBackgroundPadding=new Cartesian2;function repositionAllGlyphs$1(e){var t=e._glyphs,i=e._renderedText,r=0,n=0,a=[],o=Number.NEGATIVE_INFINITY,s=0,l=1,c=t.length,u=e._backgroundBillboard,d=Cartesian2.clone(defined(u)?e._backgroundPadding:Cartesian2.ZERO,scratchBackgroundPadding);for(d.x/=e._relativeSize,d.y/=e._relativeSize,w=0;w<c;++w)"\n"===i.charAt(w)?(a.push(r),++l,r=0):(E=(b=t[w]).dimensions,s=Math.max(s,E.height-E.descent),o=Math.max(o,E.descent),r+=E.width-E.bounds.minx,w<c-1&&(r+=t[w+1].dimensions.bounds.minx),n=Math.max(n,r));a.push(r);var h=s+o,p=e.totalScale,m=e._horizontalOrigin,f=e._verticalOrigin,g=0,_=a[g],y=calculateWidthOffset(_,m,d),v=defaultLineSpacingPercent*h,C=v*(l-1),S=n,T=h+C;defined(u)&&(S+=2*d.x,T+=2*d.y,u._labelHorizontalOrigin=m),glyphPixelOffset.x=y*p;for(var x,b,E,P=!(glyphPixelOffset.y=0),A=0,w=0;w<c;++w){"\n"===i.charAt(w)?(A+=v,y=calculateWidthOffset(a[++g],m,d),glyphPixelOffset.x=y*p,P=!0):(E=(b=t[w]).dimensions,f===VerticalOrigin$1.TOP?(glyphPixelOffset.y=E.height-s-d.y,glyphPixelOffset.y+=SDFSettings$1.PADDING):f===VerticalOrigin$1.CENTER?glyphPixelOffset.y=(C+E.height-s)/2:(f===VerticalOrigin$1.BASELINE?glyphPixelOffset.y=C:glyphPixelOffset.y=C+o+d.y,glyphPixelOffset.y-=SDFSettings$1.PADDING),glyphPixelOffset.y=(glyphPixelOffset.y-E.descent-A)*p,P&&(glyphPixelOffset.x-=SDFSettings$1.PADDING*p,P=!1),defined(b.billboard)&&(b.billboard._setTranslate(glyphPixelOffset),b.billboard._labelDimensions.x=S,b.billboard._labelDimensions.y=T,b.billboard._labelHorizontalOrigin=m),w<c-1&&(x=t[w+1],glyphPixelOffset.x+=(E.width-E.bounds.minx+x.dimensions.bounds.minx)*p))}if(defined(u)&&0<i.split("\n").join("").length&&(y=m===HorizontalOrigin$1.CENTER?-n/2-d.x:m===HorizontalOrigin$1.RIGHT?-(n+2*d.x):0,glyphPixelOffset.x=y*p,f===VerticalOrigin$1.TOP?glyphPixelOffset.y=h-s-o:f===VerticalOrigin$1.CENTER?glyphPixelOffset.y=(h-s)/2-o:f===VerticalOrigin$1.BASELINE?glyphPixelOffset.y=-d.y-o:glyphPixelOffset.y=0,glyphPixelOffset.y=glyphPixelOffset.y*p,u.width=S,u.height=T,u._setTranslate(glyphPixelOffset),u._labelTranslate=Cartesian2.clone(glyphPixelOffset,u._labelTranslate)),e.heightReference===HeightReference$1.CLAMP_TO_GROUND)for(w=0;w<c;++w){var D=(b=t[w]).billboard;defined(D)&&(D._labelTranslate=Cartesian2.clone(glyphPixelOffset,D._labelTranslate))}}function destroyLabel(e,t){for(var i=t._glyphs,r=0,n=i.length;r<n;++r)unbindGlyph(e,i[r]);defined(t._backgroundBillboard)&&(e._backgroundBillboardCollection.remove(t._backgroundBillboard),t._backgroundBillboard=void 0),t._labelCollection=void 0,defined(t._removeCallbackFunc)&&t._removeCallbackFunc(),destroyObject(t)}function LabelCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._scene=e.scene,this._batchTable=e.batchTable,this._textureAtlas=void 0,this._backgroundTextureAtlas=void 0,this._whitePixelIndex=void 0,this._backgroundBillboardCollection=new BillboardCollection({scene:this._scene}),this._backgroundBillboardCollection.destroyTextureAtlas=!1,this._billboardCollection=new BillboardCollection({scene:this._scene,batchTable:this._batchTable}),this._billboardCollection.destroyTextureAtlas=!1,this._billboardCollection._sdf=!0,this._spareBillboards=[],this._glyphTextureCache={},this._labels=[],this._labelsToUpdate=[],this._totalGlyphCount=0,this._highlightColor=Color.clone(Color.WHITE),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.blendOption=defaultValue(e.blendOption,BlendOption$1.OPAQUE_AND_TRANSLUCENT)}Object.defineProperties(LabelCollection.prototype,{length:{get:function(){return this._labels.length}}}),LabelCollection.prototype.add=function(e){var t=new Label(e,this);return this._labels.push(t),this._labelsToUpdate.push(t),t},LabelCollection.prototype.remove=function(e){if(defined(e)&&e._labelCollection===this){var t=this._labels.indexOf(e);if(-1!==t)return this._labels.splice(t,1),destroyLabel(this,e),!0}return!1},LabelCollection.prototype.removeAll=function(){for(var e=this._labels,t=0,i=e.length;t<i;++t)destroyLabel(this,e[t]);e.length=0},LabelCollection.prototype.contains=function(e){return defined(e)&&e._labelCollection===this},LabelCollection.prototype.get=function(e){return this._labels[e]},LabelCollection.prototype.update=function(e){var t=this._billboardCollection,i=this._backgroundBillboardCollection;t.modelMatrix=this.modelMatrix,t.debugShowBoundingVolume=this.debugShowBoundingVolume,i.modelMatrix=this.modelMatrix,i.debugShowBoundingVolume=this.debugShowBoundingVolume;var r=e.context;defined(this._textureAtlas)||(this._textureAtlas=new TextureAtlas({context:r}),t.textureAtlas=this._textureAtlas),defined(this._backgroundTextureAtlas)||(this._backgroundTextureAtlas=new TextureAtlas({context:r,initialSize:whitePixelSize}),i.textureAtlas=this._backgroundTextureAtlas,addWhitePixelCanvas(this._backgroundTextureAtlas,this));for(var n=this._labelsToUpdate.length,a=0;a<n;++a){var o,s,l=this._labelsToUpdate[a];l.isDestroyed()||(o=l._glyphs.length,l._rebindAllGlyphs&&(rebindAllGlyphs$1(this,l),l._rebindAllGlyphs=!1),l._repositionAllGlyphs&&(repositionAllGlyphs$1(l),l._repositionAllGlyphs=!1),s=l._glyphs.length-o,this._totalGlyphCount+=s)}var c=0<i.length?BlendOption$1.TRANSLUCENT:this.blendOption;t.blendOption=c,i.blendOption=c,t._highlightColor=this._highlightColor,i._highlightColor=this._highlightColor,this._labelsToUpdate.length=0,i.update(e),t.update(e)},LabelCollection.prototype.isDestroyed=function(){return!1},LabelCollection.prototype.destroy=function(){return this.removeAll(),this._billboardCollection=this._billboardCollection.destroy(),this._textureAtlas=this._textureAtlas&&this._textureAtlas.destroy(),this._backgroundBillboardCollection=this._backgroundBillboardCollection.destroy(),this._backgroundTextureAtlas=this._backgroundTextureAtlas&&this._backgroundTextureAtlas.destroy(),destroyObject(this)};var PolylineVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec3 position2DHigh;\nattribute vec3 position2DLow;\nattribute vec3 prevPosition3DHigh;\nattribute vec3 prevPosition3DLow;\nattribute vec3 prevPosition2DHigh;\nattribute vec3 prevPosition2DLow;\nattribute vec3 nextPosition3DHigh;\nattribute vec3 nextPosition3DLow;\nattribute vec3 nextPosition2DHigh;\nattribute vec3 nextPosition2DLow;\nattribute vec4 texCoordExpandAndBatchIndex;\nvarying vec2 v_st;\nvarying float v_width;\nvarying vec4 v_pickColor;\nvarying float v_polylineAngle;\nvoid main()\n{\nfloat texCoord = texCoordExpandAndBatchIndex.x;\nfloat expandDir = texCoordExpandAndBatchIndex.y;\nbool usePrev = texCoordExpandAndBatchIndex.z < 0.0;\nfloat batchTableIndex = texCoordExpandAndBatchIndex.w;\nvec2 widthAndShow = batchTable_getWidthAndShow(batchTableIndex);\nfloat width = widthAndShow.x + 0.5;\nfloat show = widthAndShow.y;\nif (width < 1.0)\n{\nshow = 0.0;\n}\nvec4 pickColor = batchTable_getPickColor(batchTableIndex);\nvec4 p, prev, next;\nif (czm_morphTime == 1.0)\n{\np = czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz);\nprev = czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz);\nnext = czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz);\n}\nelse if (czm_morphTime == 0.0)\n{\np = czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy);\nprev = czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy);\nnext = czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy);\n}\nelse\n{\np = czm_columbusViewMorph(\nczm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy),\nczm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz),\nczm_morphTime);\nprev = czm_columbusViewMorph(\nczm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy),\nczm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz),\nczm_morphTime);\nnext = czm_columbusViewMorph(\nczm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy),\nczm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz),\nczm_morphTime);\n}\n#ifdef DISTANCE_DISPLAY_CONDITION\nvec3 centerHigh = batchTable_getCenterHigh(batchTableIndex);\nvec4 centerLowAndRadius = batchTable_getCenterLowAndRadius(batchTableIndex);\nvec3 centerLow = centerLowAndRadius.xyz;\nfloat radius = centerLowAndRadius.w;\nvec2 distanceDisplayCondition = batchTable_getDistanceDisplayCondition(batchTableIndex);\nfloat lengthSq;\nif (czm_sceneMode == czm_sceneMode2D)\n{\nlengthSq = czm_eyeHeight2D.y;\n}\nelse\n{\nvec4 center = czm_translateRelativeToEye(centerHigh.xyz, centerLow.xyz);\nlengthSq = max(0.0, dot(center.xyz, center.xyz) - radius * radius);\n}\nfloat nearSq = distanceDisplayCondition.x * distanceDisplayCondition.x;\nfloat farSq = distanceDisplayCondition.y * distanceDisplayCondition.y;\nif (lengthSq < nearSq || lengthSq > farSq)\n{\nshow = 0.0;\n}\n#endif\nfloat polylineAngle;\nvec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, polylineAngle);\ngl_Position = czm_viewportOrthographic * positionWC * show;\nv_st.s = texCoord;\nv_st.t = czm_writeNonPerspective(clamp(expandDir, 0.0, 1.0), gl_Position.w);\nv_width = width;\nv_pickColor = pickColor;\nv_polylineAngle = polylineAngle;\n}\n";function Polyline(e,t){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._show=defaultValue(e.show,!0),this._width=defaultValue(e.width,1),this._loop=defaultValue(e.loop,!1),this._distanceDisplayCondition=e.distanceDisplayCondition,this._material=e.material,defined(this._material)||(this._material=Material.fromType(Material.ColorType,{color:new Color(1,1,1,1)}));var i,r=e.positions;defined(r)||(r=[]),this._positions=r,this._actualPositions=arrayRemoveDuplicates(r,Cartesian3.equalsEpsilon),this._loop&&2<this._actualPositions.length&&(this._actualPositions===this._positions&&(this._actualPositions=r.slice()),this._actualPositions.push(Cartesian3.clone(this._actualPositions[0]))),this._length=this._actualPositions.length,this._id=e.id,defined(t)&&(i=Matrix4.clone(t.modelMatrix)),this._modelMatrix=i,this._segments=PolylinePipeline.wrapLongitude(this._actualPositions,i),this._actualLength=void 0,this._propertiesChanged=new Uint32Array(NUMBER_OF_PROPERTIES$1),this._polylineCollection=t,this._dirty=!1,this._pickId=void 0,this._boundingVolume=BoundingSphere.fromPoints(this._actualPositions),this._boundingVolumeWC=BoundingSphere.transform(this._boundingVolume,this._modelMatrix),this._boundingVolume2D=new BoundingSphere}var POSITION_INDEX$2=Polyline.POSITION_INDEX=0,SHOW_INDEX$2=Polyline.SHOW_INDEX=1,WIDTH_INDEX=Polyline.WIDTH_INDEX=2,MATERIAL_INDEX=Polyline.MATERIAL_INDEX=3,POSITION_SIZE_INDEX=Polyline.POSITION_SIZE_INDEX=4,DISTANCE_DISPLAY_CONDITION$1=Polyline.DISTANCE_DISPLAY_CONDITION=5,NUMBER_OF_PROPERTIES$1=Polyline.NUMBER_OF_PROPERTIES=6;function makeDirty$1(e,t){++e._propertiesChanged[t];var i=e._polylineCollection;defined(i)&&(i._updatePolyline(e,t),e._dirty=!0)}Object.defineProperties(Polyline.prototype,{show:{get:function(){return this._show},set:function(e){e!==this._show&&(this._show=e,makeDirty$1(this,SHOW_INDEX$2))}},positions:{get:function(){return this._positions},set:function(e){var t=arrayRemoveDuplicates(e,Cartesian3.equalsEpsilon);this._loop&&2<t.length&&(t===e&&(t=e.slice()),t.push(Cartesian3.clone(t[0]))),this._actualPositions.length===t.length&&this._actualPositions.length===this._length||makeDirty$1(this,POSITION_SIZE_INDEX),this._positions=e,this._actualPositions=t,this._length=t.length,this._boundingVolume=BoundingSphere.fromPoints(this._actualPositions,this._boundingVolume),this._boundingVolumeWC=BoundingSphere.transform(this._boundingVolume,this._modelMatrix,this._boundingVolumeWC),makeDirty$1(this,POSITION_INDEX$2),this.update()}},material:{get:function(){return this._material},set:function(e){this._material!==e&&(this._material=e,makeDirty$1(this,MATERIAL_INDEX))}},width:{get:function(){return this._width},set:function(e){e!==this._width&&(this._width=e,makeDirty$1(this,WIDTH_INDEX))}},loop:{get:function(){return this._loop},set:function(e){var t;e!==this._loop&&(t=this._actualPositions,e?2<t.length&&!Cartesian3.equals(t[0],t[t.length-1])&&(t.length===this._positions.length&&(this._actualPositions=t=this._positions.slice()),t.push(Cartesian3.clone(t[0]))):2<t.length&&Cartesian3.equals(t[0],t[t.length-1])&&(t.length-1===this._positions.length?this._actualPositions=this._positions:t.pop()),this._loop=e,makeDirty$1(this,POSITION_SIZE_INDEX))}},id:{get:function(){return this._id},set:function(e){this._id=e,defined(this._pickId)&&(this._pickId.object.id=e)}},pickId:{get:function(){return this._pickId}},isDestroyed:{get:function(){return!defined(this._polylineCollection)}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){DistanceDisplayCondition.equals(e,this._distanceDisplayCondition)||(this._distanceDisplayCondition=DistanceDisplayCondition.clone(e,this._distanceDisplayCondition),makeDirty$1(this,DISTANCE_DISPLAY_CONDITION$1))}}}),Polyline.prototype.update=function(){var e=Matrix4.IDENTITY;defined(this._polylineCollection)&&(e=this._polylineCollection.modelMatrix);var t=this._segments.positions.length,i=this._segments.lengths,r=0<this._propertiesChanged[POSITION_INDEX$2]||0<this._propertiesChanged[POSITION_SIZE_INDEX];if(Matrix4.equals(e,this._modelMatrix)&&!r||(this._segments=PolylinePipeline.wrapLongitude(this._actualPositions,e),this._boundingVolumeWC=BoundingSphere.transform(this._boundingVolume,e,this._boundingVolumeWC)),this._modelMatrix=Matrix4.clone(e,this._modelMatrix),this._segments.positions.length!==t)makeDirty$1(this,POSITION_SIZE_INDEX);else for(var n=i.length,a=0;a<n;++a)if(i[a]!==this._segments.lengths[a]){makeDirty$1(this,POSITION_SIZE_INDEX);break}},Polyline.prototype.getPickId=function(e){return defined(this._pickId)||(this._pickId=e.createPickId({primitive:this,collection:this._polylineCollection,id:this._id})),this._pickId},Polyline.prototype._clean=function(){this._dirty=!1;for(var e=this._propertiesChanged,t=0;t<NUMBER_OF_PROPERTIES$1-1;++t)e[t]=0},Polyline.prototype._destroy=function(){this._pickId=this._pickId&&this._pickId.destroy(),this._material=this._material&&this._material.destroy(),this._polylineCollection=void 0};var SHOW_INDEX$3=Polyline.SHOW_INDEX,WIDTH_INDEX$1=Polyline.WIDTH_INDEX,POSITION_INDEX$3=Polyline.POSITION_INDEX,MATERIAL_INDEX$1=Polyline.MATERIAL_INDEX,POSITION_SIZE_INDEX$1=Polyline.POSITION_SIZE_INDEX,DISTANCE_DISPLAY_CONDITION$2=Polyline.DISTANCE_DISPLAY_CONDITION,NUMBER_OF_PROPERTIES$2=Polyline.NUMBER_OF_PROPERTIES,attributeLocations$1={texCoordExpandAndBatchIndex:0,position3DHigh:1,position3DLow:2,position2DHigh:3,position2DLow:4,prevPosition3DHigh:5,prevPosition3DLow:6,prevPosition2DHigh:7,prevPosition2DLow:8,nextPosition3DHigh:9,nextPosition3DLow:10,nextPosition2DHigh:11,nextPosition2DLow:12};function PolylineCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=Matrix4.clone(Matrix4.IDENTITY),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this._opaqueRS=void 0,this._translucentRS=void 0,this._colorCommands=[],this._polylinesUpdated=!1,this._polylinesRemoved=!1,this._createVertexArray=!1,this._propertiesChanged=new Uint32Array(NUMBER_OF_PROPERTIES$2),this._polylines=[],this._polylineBuckets={},this._positionBufferUsage={bufferUsage:BufferUsage$1.STATIC_DRAW,frameCount:0},this._mode=void 0,this._polylinesToUpdate=[],this._vertexArrays=[],this._positionBuffer=void 0,this._texCoordExpandAndBatchIndexBuffer=void 0,this._batchTable=void 0,this._createBatchTable=!1,this._useHighlightColor=!1,this._highlightColor=Color.clone(Color.WHITE);var t=this;this._uniformMap={u_highlightColor:function(){return t._highlightColor}}}function createBatchTable$1(e,t){defined(e._batchTable)&&e._batchTable.destroy();var i=[{functionName:"batchTable_getWidthAndShow",componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:2},{functionName:"batchTable_getPickColor",componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE,componentsPerAttribute:4,normalize:!0},{functionName:"batchTable_getCenterHigh",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{functionName:"batchTable_getCenterLowAndRadius",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:4},{functionName:"batchTable_getDistanceDisplayCondition",componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2}];e._batchTable=new BatchTable(t,i,e._polylines.length)}Object.defineProperties(PolylineCollection.prototype,{length:{get:function(){return removePolylines(this),this._polylines.length}}}),PolylineCollection.prototype.add=function(e){var t=new Polyline(e,this);return t._index=this._polylines.length,this._polylines.push(t),this._createVertexArray=!0,this._createBatchTable=!0,t},PolylineCollection.prototype.remove=function(e){var t;return!!this.contains(e)&&(this._polylinesRemoved=!0,this._createVertexArray=!0,this._createBatchTable=!0,defined(e._bucket)&&((t=e._bucket).shaderProgram=t.shaderProgram&&t.shaderProgram.destroy()),e._destroy(),!0)},PolylineCollection.prototype.removeAll=function(){releaseShaders(this),destroyPolylines(this),this._polylineBuckets={},this._polylinesRemoved=!1,this._polylines.length=0,this._polylinesToUpdate.length=0,this._createVertexArray=!0},PolylineCollection.prototype.contains=function(e){return defined(e)&&e._polylineCollection===this},PolylineCollection.prototype.get=function(e){return removePolylines(this),this._polylines[e]};var scratchUpdatePolylineEncodedCartesian=new EncodedCartesian3,scratchUpdatePolylineCartesian4=new Cartesian4,scratchNearFarCartesian2=new Cartesian2;PolylineCollection.prototype.update=function(e){if(removePolylines(this),0!==this._polylines.length){updateMode$1(this,e);var t,i=e.context,r=e.mapProjection,n=this._propertiesChanged;if(this._createBatchTable){if(0===ContextLimits.maximumVertexTextureImageUnits)throw new RuntimeError("Vertex texture fetch support is required to render polylines. The maximum number of vertex texture image units must be greater than zero.");createBatchTable$1(this,i),this._createBatchTable=!1}if(this._createVertexArray||computeNewBuffersUsage(this))createVertexArrays$1(this,i,r);else if(this._polylinesUpdated){var a=this._polylinesToUpdate;if(this._mode!==SceneMode$1.SCENE3D)for(var o=a.length,s=0;s<o;++s)(t=a[s]).update();if(n[POSITION_SIZE_INDEX$1]||n[MATERIAL_INDEX$1])createVertexArrays$1(this,i,r);else for(var l=a.length,c=this._polylineBuckets,u=0;u<l;++u){n=(t=a[u])._propertiesChanged;var d,h,p,m,f,g=t._bucket,_=0;for(var y in c)if(c.hasOwnProperty(y)){if(c[y]===g){n[POSITION_INDEX$3]&&g.writeUpdate(_,t,this._positionBuffer,r);break}_+=c[y].lengthOfPositions}(n[SHOW_INDEX$3]||n[WIDTH_INDEX$1])&&this._batchTable.setBatchedAttribute(t._index,0,new Cartesian2(t._width,t._show)),2<this._batchTable.attributes.length&&((n[POSITION_INDEX$3]||n[POSITION_SIZE_INDEX$1])&&(d=e.mode===SceneMode$1.SCENE2D?t._boundingVolume2D:t._boundingVolumeWC,h=EncodedCartesian3.fromCartesian(d.center,scratchUpdatePolylineEncodedCartesian),p=Cartesian4.fromElements(h.low.x,h.low.y,h.low.z,d.radius,scratchUpdatePolylineCartesian4),this._batchTable.setBatchedAttribute(t._index,2,h.high),this._batchTable.setBatchedAttribute(t._index,3,p)),n[DISTANCE_DISPLAY_CONDITION$2]&&((m=scratchNearFarCartesian2).x=0,m.y=Number.MAX_VALUE,defined(f=t.distanceDisplayCondition)&&(m.x=f.near,m.y=f.far),this._batchTable.setBatchedAttribute(t._index,4,m))),t._clean()}a.length=0,this._polylinesUpdated=!1}n=this._propertiesChanged;for(var v=0;v<NUMBER_OF_PROPERTIES$2;++v)n[v]=0;var C=Matrix4.IDENTITY;e.mode===SceneMode$1.SCENE3D&&(C=this.modelMatrix);var S=e.passes,T=0!==e.morphTime;defined(this._opaqueRS)&&this._opaqueRS.depthTest.enabled===T||(this._opaqueRS=RenderState.fromCache({depthMask:T,depthTest:{enabled:T}})),defined(this._translucentRS)&&this._translucentRS.depthTest.enabled===T||(this._translucentRS=RenderState.fromCache({blending:BlendingState$1.ALPHA_BLEND,depthMask:!T,depthTest:{enabled:T}})),this._batchTable.update(e),(S.render||S.pick)&&createCommandLists(this,e,this._colorCommands,C)}};var boundingSphereScratch=new BoundingSphere,boundingSphereScratch2=new BoundingSphere;function createCommandLists(e,t,i,r){for(var n=t.context,a=t.commandList,o=i.length,s=0,l=!0,c=e._vertexArrays,u=e.debugShowBoundingVolume,d=e._batchTable.getUniformMapCallback(),h=c.length,p=0;p<h;++p)for(var m=c[p],f=m.buckets,g=f.length,_=0;_<g;++_){for(var y,v,C,S,T=f[_],x=T.offset,b=T.bucket.shaderProgram,E=T.bucket.polylines,P=E.length,A=0,w=0;w<P;++w){var D,M=E[w],I=createMaterialId(M._material);I!==y&&(defined(y)&&0<A&&(D=v.isTranslucent(),o<=s?(C=new DrawCommand({owner:e}),i.push(C)):C=i[s],++s,S=combine(d(v._uniforms),e._uniformMap),C.boundingVolume=BoundingSphere.clone(boundingSphereScratch,C.boundingVolume),C.modelMatrix=r,C.shaderProgram=b,C.vertexArray=m.va,C.renderState=D?e._translucentRS:e._opaqueRS,C.pass=D?Pass$1.TRANSLUCENT:Pass$1.OPAQUE,C.debugShowBoundingVolume=u,C.pickId="v_pickColor",C.uniformMap=S,C.count=A,C.offset=x,x+=A,l=!(A=0),a.push(C)),(v=M._material).update(n),y=I);for(var R,O=M._locatorBuckets,L=O.length,F=0;F<L;++F){var N=O[F];N.locator===T&&(A+=N.count)}t.mode===SceneMode$1.SCENE3D?R=M._boundingVolumeWC:t.mode===SceneMode$1.COLUMBUS_VIEW?R=M._boundingVolume2D:t.mode===SceneMode$1.SCENE2D?defined(M._boundingVolume2D)&&((R=BoundingSphere.clone(M._boundingVolume2D,boundingSphereScratch2)).center.x=0):defined(M._boundingVolumeWC)&&defined(M._boundingVolume2D)&&(R=BoundingSphere.union(M._boundingVolumeWC,M._boundingVolume2D,boundingSphereScratch2)),l?(l=!1,BoundingSphere.clone(R,boundingSphereScratch)):BoundingSphere.union(R,boundingSphereScratch,boundingSphereScratch)}defined(y)&&0<A&&(o<=s?(C=new DrawCommand({owner:e}),i.push(C)):C=i[s],++s,S=combine(d(v._uniforms),e._uniformMap),C.boundingVolume=BoundingSphere.clone(boundingSphereScratch,C.boundingVolume),C.modelMatrix=r,C.shaderProgram=b,C.vertexArray=m.va,C.renderState=v.isTranslucent()?e._translucentRS:e._opaqueRS,C.pass=v.isTranslucent()?Pass$1.TRANSLUCENT:Pass$1.OPAQUE,C.debugShowBoundingVolume=u,C.pickId="v_pickColor",C.uniformMap=S,C.count=A,C.offset=x,l=!0,a.push(C)),y=void 0}i.length=s}function computeNewBuffersUsage(e){var t=!1,i=e._propertiesChanged,r=e._positionBufferUsage;return i[POSITION_INDEX$3]?(r.bufferUsage!==BufferUsage$1.STREAM_DRAW&&(t=!0,r.bufferUsage=BufferUsage$1.STREAM_DRAW),r.frameCount=100):r.bufferUsage!==BufferUsage$1.STATIC_DRAW&&(0===r.frameCount?(t=!0,r.bufferUsage=BufferUsage$1.STATIC_DRAW):r.frameCount--),t}PolylineCollection.prototype.isDestroyed=function(){return!1},PolylineCollection.prototype.destroy=function(){return destroyVertexArrays(this),releaseShaders(this),destroyPolylines(this),this._batchTable=this._batchTable&&this._batchTable.destroy(),destroyObject(this)};var emptyVertexBuffer=[0,0,0];function createVertexArrays$1(e,t,i){e._createVertexArray=!1,releaseShaders(e),destroyVertexArrays(e),sortPolylinesIntoBuckets(e);var r,n,a=[[]],o=a[0],s=e._batchTable,l=e._useHighlightColor,c=[0],u=0,d=[[]],h=0,p=e._polylineBuckets;for(r in p)p.hasOwnProperty(r)&&((n=p[r]).updateShader(t,s,l),h+=n.lengthOfPositions);if(0<h){var m,f,g=e._mode,_=new Float32Array(6*h*3),y=new Float32Array(4*h),v=0,C=0,S=0;for(r in p){p.hasOwnProperty(r)&&((n=p[r]).write(_,y,v,C,S,s,t,i),g===SceneMode$1.MORPHING&&(defined(m)||(m=new Float32Array(6*h*3)),n.writeForMorph(m,v)),v+=6*(f=n.lengthOfPositions)*3,C+=4*f,S+=4*f,u=n.updateIndices(a,c,d,u))}var T,x=e._positionBufferUsage.bufferUsage,b=BufferUsage$1.STATIC_DRAW;e._positionBuffer=Buffer$1.createVertexBuffer({context:t,typedArray:_,usage:x}),defined(m)&&(T=Buffer$1.createVertexBuffer({context:t,typedArray:m,usage:x})),e._texCoordExpandAndBatchIndexBuffer=Buffer$1.createVertexBuffer({context:t,typedArray:y,usage:b});for(var E,P,A,w,D,M,I,R,O,L,F,N,B,V,k,z=3*Float32Array.BYTES_PER_ELEMENT,$=4*Float32Array.BYTES_PER_ELEMENT,U=0,G=a.length,H=0;H<G;++H){0<(o=a[H]).length&&(E=new Uint16Array(o),P=Buffer$1.createIndexBuffer({context:t,typedArray:E,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT}),U+=c[H],R=z+(I=z+(M=z+(D=z+(w=z+(A=6*(H*(z*CesiumMath.SIXTY_FOUR_KILOBYTES)-U*z)))))),O=H*($*CesiumMath.SIXTY_FOUR_KILOBYTES)-U*$,L=[{index:attributeLocations$1.position3DHigh,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:A,strideInBytes:6*z},{index:attributeLocations$1.position3DLow,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:w,strideInBytes:6*z},{index:attributeLocations$1.position2DHigh,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:A,strideInBytes:6*z},{index:attributeLocations$1.position2DLow,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:w,strideInBytes:6*z},{index:attributeLocations$1.prevPosition3DHigh,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:D,strideInBytes:6*z},{index:attributeLocations$1.prevPosition3DLow,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:M,strideInBytes:6*z},{index:attributeLocations$1.prevPosition2DHigh,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:D,strideInBytes:6*z},{index:attributeLocations$1.prevPosition2DLow,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:M,strideInBytes:6*z},{index:attributeLocations$1.nextPosition3DHigh,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:I,strideInBytes:6*z},{index:attributeLocations$1.nextPosition3DLow,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:R,strideInBytes:6*z},{index:attributeLocations$1.nextPosition2DHigh,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:I,strideInBytes:6*z},{index:attributeLocations$1.nextPosition2DLow,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,offsetInBytes:R,strideInBytes:6*z},{index:attributeLocations$1.texCoordExpandAndBatchIndex,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,vertexBuffer:e._texCoordExpandAndBatchIndexBuffer,offsetInBytes:O}],V=g===SceneMode$1.SCENE3D?(F=e._positionBuffer,N="vertexBuffer",B=emptyVertexBuffer,"value"):(B=(N=g===SceneMode$1.SCENE2D||g===SceneMode$1.COLUMBUS_VIEW?(F=emptyVertexBuffer,"value"):(F=T,"vertexBuffer"),e._positionBuffer),"vertexBuffer"),L[0][N]=F,L[1][N]=F,L[2][V]=B,L[3][V]=B,L[4][N]=F,L[5][N]=F,L[6][V]=B,L[7][V]=B,L[8][N]=F,L[9][N]=F,L[10][V]=B,L[11][V]=B,k=new VertexArray({context:t,attributes:L,indexBuffer:P}),e._vertexArrays.push({va:k,buckets:d[H]}))}}}function replacer(e,t){return t instanceof Texture?t.id:t}var scratchUniformArray$1=[];function createMaterialId(e){var t=Material._uniformList[e.type],i=t.length;scratchUniformArray$1.length=2*i;for(var r=0,n=0;n<i;++n){var a=t[n];scratchUniformArray$1[r]=a,scratchUniformArray$1[r+1]=e._uniforms[a](),r+=2}return e.type+":"+JSON.stringify(scratchUniformArray$1,replacer)}function sortPolylinesIntoBuckets(e){for(var t=e._mode,i=e._modelMatrix,r=e._polylineBuckets={},n=e._polylines,a=n.length,o=0;o<a;++o){var s,l,c=n[o];1<c._actualPositions.length&&(c.update(),defined(l=r[(s=c.material).type])||(l=r[s.type]=new PolylineBucket(s,t,i)),l.addPolyline(c))}}function updateMode$1(e,t){var i=t.mode;e._mode===i&&Matrix4.equals(e._modelMatrix,e.modelMatrix)||(e._mode=i,e._modelMatrix=Matrix4.clone(e.modelMatrix),e._createVertexArray=!0)}function removePolylines(e){if(e._polylinesRemoved){e._polylinesRemoved=!1;for(var t,i=[],r=[],n=0,a=e._polylines.length,o=0;o<a;++o)(t=e._polylines[o]).isDestroyed||(t._index=n++,r.push(t),i.push(t));e._polylines=i,e._polylinesToUpdate=r}}function releaseShaders(e){for(var t,i=e._polylines,r=i.length,n=0;n<r;++n){i[n].isDestroyed||defined(t=i[n]._bucket)&&(t.shaderProgram=t.shaderProgram&&t.shaderProgram.destroy())}}function destroyVertexArrays(e){for(var t=e._vertexArrays.length,i=0;i<t;++i)e._vertexArrays[i].va.destroy();e._vertexArrays.length=0}function destroyPolylines(e){for(var t=e._polylines,i=t.length,r=0;r<i;++r)t[r].isDestroyed||t[r]._destroy()}function VertexArrayBucketLocator(e,t,i){this.count=e,this.offset=t,this.bucket=i}function PolylineBucket(e,t,i){this.polylines=[],this.lengthOfPositions=0,this.material=e,this.shaderProgram=void 0,this.mode=t,this.modelMatrix=i}function intersectsIDL(e){return Cartesian3.dot(Cartesian3.UNIT_X,e._boundingVolume.center)<0||e._boundingVolume.intersectPlane(Plane.ORIGIN_ZX_PLANE)===Intersect$1.INTERSECTING}PolylineCollection.prototype._updatePolyline=function(e,t){this._polylinesUpdated=!0,e._dirty||this._polylinesToUpdate.push(e),++this._propertiesChanged[t]},PolylineBucket.prototype.addPolyline=function(e){this.polylines.push(e),e._actualLength=this.getPolylinePositionsLength(e),this.lengthOfPositions+=e._actualLength,e._bucket=this},PolylineBucket.prototype.updateShader=function(e,t,i){var r,n,a,o;defined(this.shaderProgram)||(r=["DISTANCE_DISPLAY_CONDITION"],i&&r.push("VECTOR_TILE"),-1!==this.material.shaderSource.search(/varying\s+float\s+v_polylineAngle;/g)&&r.push("POLYLINE_DASH"),FeatureDetection.isInternetExplorer()||r.push("CLIP_POLYLINE"),n=new ShaderSource({defines:r,sources:["varying vec4 v_pickColor;\n",this.material.shaderSource,PolylineFS]}),a=t.getVertexShaderCallback()(PolylineVS),o=new ShaderSource({defines:r,sources:[PolylineCommon,a]}),this.shaderProgram=ShaderProgram.fromCache({context:e,vertexShaderSource:o,fragmentShaderSource:n,attributeLocations:attributeLocations$1}))},PolylineBucket.prototype.getPolylinePositionsLength=function(e){if(this.mode===SceneMode$1.SCENE3D||!intersectsIDL(e))return 4*(r=e._actualPositions.length)-4;for(var t=0,i=e._segments.lengths,r=i.length,n=0;n<r;++n)t+=4*i[n]-4;return t};var scratchWritePosition=new Cartesian3,scratchWritePrevPosition=new Cartesian3,scratchWriteNextPosition=new Cartesian3,scratchWriteVector=new Cartesian3,scratchPickColorCartesian=new Cartesian4,scratchWidthShowCartesian=new Cartesian2;PolylineBucket.prototype.write=function(e,t,i,r,n,a,o,s){for(var l=this.mode,c=s.ellipsoid.maximumRadius*CesiumMath.PI,u=this.polylines,d=u.length,h=0;h<d;++h){for(var p,m=u[h],f=m.width,g=m.show&&0<f,_=m._index,y=this.getSegments(m,s),v=y.positions,C=y.lengths,S=v.length,T=m.getPickId(o).color,x=0,b=0,E=0;E<S;++E){0===E?m._loop?p=v[S-2]:(p=scratchWriteVector,Cartesian3.subtract(v[0],v[1],p),Cartesian3.add(v[0],p,p)):p=v[E-1],Cartesian3.clone(p,scratchWritePrevPosition),Cartesian3.clone(v[E],scratchWritePosition),E===S-1?m._loop?p=v[1]:(p=scratchWriteVector,Cartesian3.subtract(v[S-1],v[S-2],p),Cartesian3.add(v[S-1],p,p)):p=v[E+1],Cartesian3.clone(p,scratchWriteNextPosition);var P=C[x];E===b+P&&(b+=P,++x);var A=E-b==0,w=E===b+C[x]-1;l===SceneMode$1.SCENE2D&&(scratchWritePrevPosition.z=0,scratchWritePosition.z=0,scratchWriteNextPosition.z=0),l!==SceneMode$1.SCENE2D&&l!==SceneMode$1.MORPHING||(A||w)&&c-Math.abs(scratchWritePosition.x)<1&&((scratchWritePosition.x<0&&0<scratchWritePrevPosition.x||0<scratchWritePosition.x&&scratchWritePrevPosition.x<0)&&Cartesian3.clone(scratchWritePosition,scratchWritePrevPosition),(scratchWritePosition.x<0&&0<scratchWriteNextPosition.x||0<scratchWritePosition.x&&scratchWriteNextPosition.x<0)&&Cartesian3.clone(scratchWritePosition,scratchWriteNextPosition));for(var D=w?2:4,M=A?2:0;M<D;++M){EncodedCartesian3.writeElements(scratchWritePosition,e,i),EncodedCartesian3.writeElements(scratchWritePrevPosition,e,i+6),EncodedCartesian3.writeElements(scratchWriteNextPosition,e,i+12);var I=M-2<0?-1:1;t[n]=E/(S-1),t[n+1]=M%2*2-1,t[n+2]=I,t[n+3]=_,i+=18,n+=4}}var R=scratchPickColorCartesian;R.x=Color.floatToByte(T.red),R.y=Color.floatToByte(T.green),R.z=Color.floatToByte(T.blue),R.w=Color.floatToByte(T.alpha);var O=scratchWidthShowCartesian;O.x=f,O.y=g?1:0;var L=l===SceneMode$1.SCENE2D?m._boundingVolume2D:m._boundingVolumeWC,F=EncodedCartesian3.fromCartesian(L.center,scratchUpdatePolylineEncodedCartesian),N=F.high,B=Cartesian4.fromElements(F.low.x,F.low.y,F.low.z,L.radius,scratchUpdatePolylineCartesian4),V=scratchNearFarCartesian2;V.x=0,V.y=Number.MAX_VALUE;var k=m.distanceDisplayCondition;defined(k)&&(V.x=k.near,V.y=k.far),a.setBatchedAttribute(_,0,O),a.setBatchedAttribute(_,1,R),2<a.attributes.length&&(a.setBatchedAttribute(_,2,N),a.setBatchedAttribute(_,3,B),a.setBatchedAttribute(_,4,V))}};var morphPositionScratch=new Cartesian3,morphPrevPositionScratch=new Cartesian3,morphNextPositionScratch=new Cartesian3,morphVectorScratch=new Cartesian3;PolylineBucket.prototype.writeForMorph=function(e,t){for(var i=this.modelMatrix,r=this.polylines,n=r.length,a=0;a<n;++a)for(var o,s=r[a],l=s._segments.positions,c=s._segments.lengths,u=l.length,d=0,h=0,p=0;p<u;++p){0===p?s._loop?o=l[u-2]:(o=morphVectorScratch,Cartesian3.subtract(l[0],l[1],o),Cartesian3.add(l[0],o,o)):o=l[p-1],o=Matrix4.multiplyByPoint(i,o,morphPrevPositionScratch);var m,f=Matrix4.multiplyByPoint(i,l[p],morphPositionScratch);p===u-1?s._loop?m=l[1]:(m=morphVectorScratch,Cartesian3.subtract(l[u-1],l[u-2],m),Cartesian3.add(l[u-1],m,m)):m=l[p+1],m=Matrix4.multiplyByPoint(i,m,morphNextPositionScratch);var g=c[d];p===h+g&&(h+=g,++d);for(var _=p-h==0,y=p===h+c[d]-1?2:4,v=_?2:0;v<y;++v)EncodedCartesian3.writeElements(f,e,t),EncodedCartesian3.writeElements(o,e,t+6),EncodedCartesian3.writeElements(m,e,t+12),t+=18}};var scratchSegmentLengths=new Array(1);PolylineBucket.prototype.updateIndices=function(e,t,i,r){var n=i.length-1,a=new VertexArrayBucketLocator(0,r,this);i[n].push(a);var o=0,s=e[e.length-1],l=0;0<s.length&&(l=s[s.length-1]+1);for(var c=this.polylines,u=c.length,d=0;d<u;++d){var h,p=c[d];if(p._locatorBuckets=[],this.mode===SceneMode$1.SCENE3D){h=scratchSegmentLengths;var m=p._actualPositions.length;if(!(0<m))continue;h[0]=m}else h=p._segments.lengths;var f=h.length;if(0<f){for(var g=0,_=0;_<f;++_)for(var y=h[_]-1,v=0;v<y;++v)l+4>CesiumMath.SIXTY_FOUR_KILOBYTES&&(p._locatorBuckets.push({locator:a,count:g}),g=0,t.push(4),s=[],e.push(s),l=0,a.count=o,a=new VertexArrayBucketLocator(r=o=0,0,this),i[++n]=[a]),s.push(l,l+2,l+1),s.push(l+1,l+2,l+3),g+=6,o+=6,r+=6,l+=4;p._locatorBuckets.push({locator:a,count:g}),l+4>CesiumMath.SIXTY_FOUR_KILOBYTES&&(t.push(0),s=[],e.push(s),l=0,a.count=o,a=new VertexArrayBucketLocator(o=r=0,0,this),i[++n]=[a])}p._clean()}return a.count=o,r},PolylineBucket.prototype.getPolylineStartIndex=function(e){for(var t=this.polylines,i=0,r=t.length,n=0;n<r;++n){var a=t[n];if(a===e)break;i+=a._actualLength}return i};var scratchSegments={positions:void 0,lengths:void 0},scratchLengths=new Array(1),pscratch=new Cartesian3,scratchCartographic$6=new Cartographic,scratchPositionsArray;function Vector3DTilePoints(e){this._positions=e.positions,this._batchTable=e.batchTable,this._batchIds=e.batchIds,this._rectangle=e.rectangle,this._minHeight=e.minimumHeight,this._maxHeight=e.maximumHeight,this._billboardCollection=void 0,this._labelCollection=void 0,this._polylineCollection=void 0,this._verticesPromise=void 0,this._packedBuffer=void 0,this._ready=!1,this._readyPromise=when.defer(),this._resolvedPromise=!1}function packBuffer$1(e,t){var i=e._rectangle,r=e._minHeight,n=e._maxHeight,a=2+Rectangle.packedLength+Ellipsoid.packedLength,o=new Float64Array(a),s=0;return o[s++]=r,o[s++]=n,Rectangle.pack(i,o,2),s+=Rectangle.packedLength,Ellipsoid.pack(t,o,s),o}PolylineBucket.prototype.getSegments=function(e,t){var i=e._actualPositions;if(this.mode===SceneMode$1.SCENE3D)return scratchLengths[0]=i.length,scratchSegments.positions=i,scratchSegments.lengths=scratchLengths,scratchSegments;intersectsIDL(e)&&(i=e._segments.positions);for(var r,n,a=t.ellipsoid,o=[],s=this.modelMatrix,l=i.length,c=pscratch,u=0;u<l;++u)r=i[u],c=Matrix4.multiplyByPoint(s,r,c),o.push(t.project(a.cartesianToCartographic(c,scratchCartographic$6)));return 0<o.length&&(e._boundingVolume2D=BoundingSphere.fromPoints(o,e._boundingVolume2D),n=e._boundingVolume2D.center,e._boundingVolume2D.center=new Cartesian3(n.z,n.x,n.y)),scratchSegments.positions=o,scratchSegments.lengths=e._segments.lengths,scratchSegments},PolylineBucket.prototype.writeUpdate=function(e,t,i,r){var n=this.mode,a=r.ellipsoid.maximumRadius*CesiumMath.PI;if(f=t._actualLength){e+=this.getPolylineStartIndex(t);var o=scratchPositionsArray,s=6*f*3;!defined(o)||o.length<s?o=scratchPositionsArray=new Float32Array(s):o.length>s&&(o=new Float32Array(o.buffer,0,s));for(var l,c=this.getSegments(t,r),u=c.positions,d=c.lengths,h=0,p=0,m=0,f=u.length,g=0;g<f;++g){0===g?t._loop?l=u[f-2]:(l=scratchWriteVector,Cartesian3.subtract(u[0],u[1],l),Cartesian3.add(u[0],l,l)):l=u[g-1],Cartesian3.clone(l,scratchWritePrevPosition),Cartesian3.clone(u[g],scratchWritePosition),g===f-1?t._loop?l=u[1]:(l=scratchWriteVector,Cartesian3.subtract(u[f-1],u[f-2],l),Cartesian3.add(u[f-1],l,l)):l=u[g+1],Cartesian3.clone(l,scratchWriteNextPosition);var _=d[p];g===m+_&&(m+=_,++p);var y=g-m==0,v=g===m+d[p]-1;n===SceneMode$1.SCENE2D&&(scratchWritePrevPosition.z=0,scratchWritePosition.z=0,scratchWriteNextPosition.z=0),n!==SceneMode$1.SCENE2D&&n!==SceneMode$1.MORPHING||(y||v)&&a-Math.abs(scratchWritePosition.x)<1&&((scratchWritePosition.x<0&&0<scratchWritePrevPosition.x||0<scratchWritePosition.x&&scratchWritePrevPosition.x<0)&&Cartesian3.clone(scratchWritePosition,scratchWritePrevPosition),(scratchWritePosition.x<0&&0<scratchWriteNextPosition.x||0<scratchWritePosition.x&&scratchWriteNextPosition.x<0)&&Cartesian3.clone(scratchWritePosition,scratchWriteNextPosition));for(var C=v?2:4,S=y?2:0;S<C;++S)EncodedCartesian3.writeElements(scratchWritePosition,o,h),EncodedCartesian3.writeElements(scratchWritePrevPosition,o,h+6),EncodedCartesian3.writeElements(scratchWriteNextPosition,o,h+12),h+=18}i.copyFromArrayView(o,18*Float32Array.BYTES_PER_ELEMENT*e)}},Object.defineProperties(Vector3DTilePoints.prototype,{pointsLength:{get:function(){return this._billboardCollection.length}},texturesByteLength:{get:function(){return this._billboardCollection.textureAtlas.texture.sizeInBytes+this._labelCollection._textureAtlas.texture.sizeInBytes}},readyPromise:{get:function(){return this._readyPromise.promise}}});var createVerticesTaskProcessor$1=new TaskProcessor("createVectorTilePoints"),scratchPosition$9=new Cartesian3;function createPoints(t,e){if(!defined(t._billboardCollection)){var i;if(!defined(t._verticesPromise)){i=t._positions;var r=t._packedBuffer;defined(r)||(i=t._positions=arraySlice(i),t._batchIds=arraySlice(t._batchIds),r=t._packedBuffer=packBuffer$1(t,e));var n=[i.buffer,r.buffer],a={positions:i.buffer,packedBuffer:r.buffer},o=t._verticesPromise=createVerticesTaskProcessor$1.scheduleTask(a,n);if(!defined(o))return;o.then(function(e){t._positions=new Float64Array(e.positions),t._ready=!0})}if(t._ready&&!defined(t._billboardCollection)){i=t._positions;var s=t._batchTable,l=t._batchIds,c=t._billboardCollection=new BillboardCollection({batchTable:s}),u=t._labelCollection=new LabelCollection({batchTable:s}),d=t._polylineCollection=new PolylineCollection;d._useHighlightColor=!0;for(var h=i.length/3,p=0;p<h;++p){var m=l[p],f=Cartesian3.unpack(i,3*p,scratchPosition$9),g=c.add();g.position=f,g._batchIndex=m;var _=u.add();_.text=" ",_.position=f,_._batchIndex=m,d.add().positions=[Cartesian3.clone(f),Cartesian3.clone(f)]}t._positions=void 0,t._packedBuffer=void 0}}}function clearStyle$1(e,t){for(var i=e._batchIds,r=i.length,n=0;n<r;++n){var a=t[i[n]];a.show=!0,a.pointSize=Cesium3DTilePointFeature.defaultPointSize,a.color=Cesium3DTilePointFeature.defaultColor,a.pointOutlineColor=Cesium3DTilePointFeature.defaultPointOutlineColor,a.pointOutlineWidth=Cesium3DTilePointFeature.defaultPointOutlineWidth,a.labelColor=Color.WHITE,a.labelOutlineColor=Color.WHITE,a.labelOutlineWidth=1,a.font="30px sans-serif",a.labelStyle=LabelStyle$1.FILL,a.labelText=void 0,a.backgroundColor=new Color(.165,.165,.165,.8),a.backgroundPadding=new Cartesian2(7,5),a.backgroundEnabled=!1,a.scaleByDistance=void 0,a.translucencyByDistance=void 0,a.distanceDisplayCondition=void 0,a.heightOffset=0,a.anchorLineEnabled=!1,a.anchorLineColor=Color.WHITE,a.image=void 0,a.disableDepthTestDistance=0,a.horizontalOrigin=HorizontalOrigin$1.CENTER,a.verticalOrigin=VerticalOrigin$1.CENTER,a.labelHorizontalOrigin=HorizontalOrigin$1.RIGHT,a.labelVerticalOrigin=VerticalOrigin$1.BASELINE}}Vector3DTilePoints.prototype.createFeatures=function(e,t){for(var i=this._billboardCollection,r=this._labelCollection,n=this._polylineCollection,a=this._batchIds,o=a.length,s=0;s<o;++s){var l=a[s],c=i.get(s),u=r.get(s),d=n.get(s);t[l]=new Cesium3DTilePointFeature(e,l,c,u,d)}},Vector3DTilePoints.prototype.applyDebugSettings=function(e,t){e?(Color.clone(t,this._billboardCollection._highlightColor),Color.clone(t,this._labelCollection._highlightColor),Color.clone(t,this._polylineCollection._highlightColor)):(Color.clone(Color.WHITE,this._billboardCollection._highlightColor),Color.clone(Color.WHITE,this._labelCollection._highlightColor),Color.clone(Color.WHITE,this._polylineCollection._highlightColor))};var scratchColor$6=new Color,scratchColor2=new Color,scratchColor3=new Color,scratchColor4=new Color,scratchColor5=new Color,scratchColor6=new Color,scratchScaleByDistance=new NearFarScalar,scratchTranslucencyByDistance=new NearFarScalar,scratchDistanceDisplayCondition=new DistanceDisplayCondition;function Vector3DTilePolygons(e){this._batchTable=e.batchTable,this._batchIds=e.batchIds,this._positions=e.positions,this._counts=e.counts,this._indices=e.indices,this._indexCounts=e.indexCounts,this._indexOffsets=void 0,this._batchTableColors=void 0,this._packedBuffer=void 0,this._batchedPositions=void 0,this._transferrableBatchIds=void 0,this._vertexBatchIds=void 0,this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.WGS84),this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._polygonMinimumHeights=e.polygonMinimumHeights,this._polygonMaximumHeights=e.polygonMaximumHeights,this._center=defaultValue(e.center,Cartesian3.ZERO),this._rectangle=e.rectangle,this._center=void 0,this._boundingVolume=e.boundingVolume,this._boundingVolumes=void 0,this._batchedIndices=void 0,this._ready=!1,this._readyPromise=when.defer(),this._verticesPromise=void 0,this._primitive=void 0,this.debugWireframe=!1,this.forceRebatch=!1,this.classificationType=ClassificationType$1.BOTH}function packBuffer$2(e){var t=new Float64Array(3+Cartesian3.packedLength+Ellipsoid.packedLength+Rectangle.packedLength),i=0;return t[i++]=e._indices.BYTES_PER_ELEMENT,t[i++]=e._minimumHeight,t[i++]=e._maximumHeight,Cartesian3.pack(e._center,t,3),i+=Cartesian3.packedLength,Ellipsoid.pack(e._ellipsoid,t,i),i+=Ellipsoid.packedLength,Rectangle.pack(e._rectangle,t,i),t}function unpackBuffer$1(e,t){for(var i=1,r=t[i++],n=e._boundingVolumes=new Array(r),a=0;a<r;++a)n[a]=OrientedBoundingBox.unpack(t,i),i+=OrientedBoundingBox.packedLength;for(var o=t[i++],s=e._batchedIndices=new Array(o),l=0;l<o;++l){var c=Color.unpack(t,i);i+=Color.packedLength;for(var u=t[i++],d=t[i++],h=t[i++],p=new Array(h),m=0;m<h;++m)p[m]=t[i++];s[l]=new Vector3DTileBatch({color:c,offset:u,count:d,batchIds:p})}}Vector3DTilePoints.prototype.applyStyle=function(e,t){if(defined(e))for(var i=this._batchIds,r=i.length,n=0;n<r;++n){var a,o,s,l=t[i[n]];defined(e.show)&&(l.show=e.show.evaluate(l)),defined(e.pointSize)&&(l.pointSize=e.pointSize.evaluate(l)),defined(e.color)&&(l.color=e.color.evaluateColor(l,scratchColor$6)),defined(e.pointOutlineColor)&&(l.pointOutlineColor=e.pointOutlineColor.evaluateColor(l,scratchColor2)),defined(e.pointOutlineWidth)&&(l.pointOutlineWidth=e.pointOutlineWidth.evaluate(l)),defined(e.labelColor)&&(l.labelColor=e.labelColor.evaluateColor(l,scratchColor3)),defined(e.labelOutlineColor)&&(l.labelOutlineColor=e.labelOutlineColor.evaluateColor(l,scratchColor4)),defined(e.labelOutlineWidth)&&(l.labelOutlineWidth=e.labelOutlineWidth.evaluate(l)),defined(e.font)&&(l.font=e.font.evaluate(l)),defined(e.labelStyle)&&(l.labelStyle=e.labelStyle.evaluate(l)),defined(e.labelText)?l.labelText=e.labelText.evaluate(l):l.labelText=void 0,defined(e.backgroundColor)&&(l.backgroundColor=e.backgroundColor.evaluateColor(l,scratchColor5)),defined(e.backgroundPadding)&&(l.backgroundPadding=e.backgroundPadding.evaluate(l)),defined(e.backgroundEnabled)&&(l.backgroundEnabled=e.backgroundEnabled.evaluate(l)),defined(e.scaleByDistance)?(a=e.scaleByDistance.evaluate(l),scratchScaleByDistance.near=a.x,scratchScaleByDistance.nearValue=a.y,scratchScaleByDistance.far=a.z,scratchScaleByDistance.farValue=a.w,l.scaleByDistance=scratchScaleByDistance):l.scaleByDistance=void 0,defined(e.translucencyByDistance)?(o=e.translucencyByDistance.evaluate(l),scratchTranslucencyByDistance.near=o.x,scratchTranslucencyByDistance.nearValue=o.y,scratchTranslucencyByDistance.far=o.z,scratchTranslucencyByDistance.farValue=o.w,l.translucencyByDistance=scratchTranslucencyByDistance):l.translucencyByDistance=void 0,defined(e.distanceDisplayCondition)?(s=e.distanceDisplayCondition.evaluate(l),scratchDistanceDisplayCondition.near=s.x,scratchDistanceDisplayCondition.far=s.y,l.distanceDisplayCondition=scratchDistanceDisplayCondition):l.distanceDisplayCondition=void 0,defined(e.heightOffset)&&(l.heightOffset=e.heightOffset.evaluate(l)),defined(e.anchorLineEnabled)&&(l.anchorLineEnabled=e.anchorLineEnabled.evaluate(l)),defined(e.anchorLineColor)&&(l.anchorLineColor=e.anchorLineColor.evaluateColor(l,scratchColor6)),defined(e.image)?l.image=e.image.evaluate(l):l.image=void 0,defined(e.disableDepthTestDistance)&&(l.disableDepthTestDistance=e.disableDepthTestDistance.evaluate(l)),defined(e.horizontalOrigin)&&(l.horizontalOrigin=e.horizontalOrigin.evaluate(l)),defined(e.verticalOrigin)&&(l.verticalOrigin=e.verticalOrigin.evaluate(l)),defined(e.labelHorizontalOrigin)&&(l.labelHorizontalOrigin=e.labelHorizontalOrigin.evaluate(l)),defined(e.labelVerticalOrigin)&&(l.labelVerticalOrigin=e.labelVerticalOrigin.evaluate(l))}else clearStyle$1(this,t)},Vector3DTilePoints.prototype.update=function(e){createPoints(this,e.mapProjection.ellipsoid),this._ready&&(this._polylineCollection.update(e),this._billboardCollection.update(e),this._labelCollection.update(e),this._resolvedPromise||(this._readyPromise.resolve(),this._resolvedPromise=!0))},Vector3DTilePoints.prototype.isDestroyed=function(){return!1},Vector3DTilePoints.prototype.destroy=function(){return this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),this._labelCollection=this._labelCollection&&this._labelCollection.destroy(),this._polylineCollection=this._polylineCollection&&this._polylineCollection.destroy(),destroyObject(this)},Object.defineProperties(Vector3DTilePolygons.prototype,{trianglesLength:{get:function(){return defined(this._primitive)?this._primitive.trianglesLength:0}},geometryByteLength:{get:function(){return defined(this._primitive)?this._primitive.geometryByteLength:0}},readyPromise:{get:function(){return this._readyPromise.promise}}});var createVerticesTaskProcessor$2=new TaskProcessor("createVectorTilePolygons"),scratchColor$7=new Color;function createPrimitive$2(r){if(!defined(r._primitive)){if(!defined(r._verticesPromise)){var e=r._positions,t=r._counts,i=r._indexCounts,n=r._indices,a=r._transferrableBatchIds,o=r._batchTableColors,s=r._packedBuffer;if(!defined(o)){e=r._positions=arraySlice(r._positions),t=r._counts=arraySlice(r._counts),i=r._indexCounts=arraySlice(r._indexCounts),n=r._indices=arraySlice(r._indices),r._center=r._ellipsoid.cartographicToCartesian(Rectangle.center(r._rectangle)),a=r._transferrableBatchIds=new Uint32Array(r._batchIds),o=r._batchTableColors=new Uint32Array(a.length);for(var l=r._batchTable,c=o.length,u=0;u<c;++u){var d=l.getColor(u,scratchColor$7);o[u]=d.toRgba()}s=r._packedBuffer=packBuffer$2(r)}var h=[e.buffer,t.buffer,i.buffer,n.buffer,a.buffer,o.buffer,s.buffer],p={packedBuffer:s.buffer,positions:e.buffer,counts:t.buffer,indexCounts:i.buffer,indices:n.buffer,batchIds:a.buffer,batchTableColors:o.buffer},m=r._polygonMinimumHeights,f=r._polygonMaximumHeights;defined(m)&&defined(f)&&(m=arraySlice(m),f=arraySlice(f),h.push(m.buffer,f.buffer),p.minimumHeights=m,p.maximumHeights=f);var g=r._verticesPromise=createVerticesTaskProcessor$2.scheduleTask(p,h);if(!defined(g))return;when(g,function(e){r._positions=void 0,r._counts=void 0,r._polygonMinimumHeights=void 0,r._polygonMaximumHeights=void 0;var t=new Float64Array(e.packedBuffer),i=t[0];unpackBuffer$1(r,t),r._indices=new(2===IndexDatatype$1.getSizeInBytes(i)?Uint16Array:Uint32Array)(e.indices),r._indexOffsets=new Uint32Array(e.indexOffsets),r._indexCounts=new Uint32Array(e.indexCounts),r._batchedPositions=new Float32Array(e.positions),r._vertexBatchIds=new Uint16Array(e.batchIds),r._ready=!0})}r._ready&&!defined(r._primitive)&&(r._primitive=new Vector3DTilePrimitive({batchTable:r._batchTable,positions:r._batchedPositions,batchIds:r._batchIds,vertexBatchIds:r._vertexBatchIds,indices:r._indices,indexOffsets:r._indexOffsets,indexCounts:r._indexCounts,batchedIndices:r._batchedIndices,boundingVolume:r._boundingVolume,boundingVolumes:r._boundingVolumes,center:r._center}),r._batchTable=void 0,r._batchIds=void 0,r._positions=void 0,r._counts=void 0,r._indices=void 0,r._indexCounts=void 0,r._indexOffsets=void 0,r._batchTableColors=void 0,r._packedBuffer=void 0,r._batchedPositions=void 0,r._transferrableBatchIds=void 0,r._vertexBatchIds=void 0,r._ellipsoid=void 0,r._minimumHeight=void 0,r._maximumHeight=void 0,r._polygonMinimumHeights=void 0,r._polygonMaximumHeights=void 0,r._center=void 0,r._rectangle=void 0,r._boundingVolume=void 0,r._boundingVolumes=void 0,r._batchedIndices=void 0,r._verticesPromise=void 0,r._readyPromise.resolve())}}Vector3DTilePolygons.prototype.createFeatures=function(e,t){this._primitive.createFeatures(e,t)},Vector3DTilePolygons.prototype.applyDebugSettings=function(e,t){this._primitive.applyDebugSettings(e,t)},Vector3DTilePolygons.prototype.applyStyle=function(e,t){this._primitive.applyStyle(e,t)},Vector3DTilePolygons.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)},Vector3DTilePolygons.prototype.update=function(e){createPrimitive$2(this),this._ready&&(this._primitive.debugWireframe=this.debugWireframe,this._primitive.forceRebatch=this.forceRebatch,this._primitive.classificationType=this.classificationType,this._primitive.update(e))},Vector3DTilePolygons.prototype.isDestroyed=function(){return!1},Vector3DTilePolygons.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),destroyObject(this)};var Vector3DTilePolylinesVS="attribute vec4 currentPosition;\nattribute vec4 previousPosition;\nattribute vec4 nextPosition;\nattribute vec2 expandAndWidth;\nattribute float a_batchId;\nuniform mat4 u_modifiedModelView;\nvoid main()\n{\nfloat expandDir = expandAndWidth.x;\nfloat width = abs(expandAndWidth.y) + 0.5;\nbool usePrev = expandAndWidth.y < 0.0;\nvec4 p = u_modifiedModelView * currentPosition;\nvec4 prev = u_modifiedModelView * previousPosition;\nvec4 next = u_modifiedModelView * nextPosition;\nfloat angle;\nvec4 positionWC = getPolylineWindowCoordinatesEC(p, prev, next, expandDir, width, usePrev, angle);\ngl_Position = czm_viewportOrthographic * positionWC;\n}\n";function Vector3DTilePolylines(e){this._positions=e.positions,this._widths=e.widths,this._counts=e.counts,this._batchIds=e.batchIds,this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.WGS84),this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._center=e.center,this._rectangle=e.rectangle,this._boundingVolume=e.boundingVolume,this._batchTable=e.batchTable,this._va=void 0,this._sp=void 0,this._rs=void 0,this._uniformMap=void 0,this._command=void 0,this._transferrableBatchIds=void 0,this._packedBuffer=void 0,this._currentPositions=void 0,this._previousPositions=void 0,this._nextPositions=void 0,this._expandAndWidth=void 0,this._vertexBatchIds=void 0,this._indices=void 0,this._constantColor=Color.clone(Color.WHITE),this._highlightColor=this._constantColor,this._trianglesLength=0,this._geometryByteLength=0,this._ready=!1,this._readyPromise=when.defer(),this._verticesPromise=void 0}function packBuffer$3(e){var t=e._rectangle,i=e._minimumHeight,r=e._maximumHeight,n=e._ellipsoid,a=e._center,o=2+Rectangle.packedLength+Ellipsoid.packedLength+Cartesian3.packedLength,s=new Float64Array(o),l=0;return s[l++]=i,s[l++]=r,Rectangle.pack(t,s,2),l+=Rectangle.packedLength,Ellipsoid.pack(n,s,l),l+=Ellipsoid.packedLength,Cartesian3.pack(a,s,l),s}Object.defineProperties(Vector3DTilePolylines.prototype,{trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},readyPromise:{get:function(){return this._readyPromise.promise}}});var createVerticesTaskProcessor$3=new TaskProcessor("createVectorTilePolylines"),attributeLocations$2={previousPosition:0,currentPosition:1,nextPosition:2,expandAndWidth:3,a_batchId:4};function createVertexArray$4(i,e){if(!defined(i._va)){if(!defined(i._verticesPromise)){var t=i._positions,r=i._widths,n=i._counts,a=i._transferrableBatchIds,o=i._packedBuffer;defined(o)||(t=i._positions=arraySlice(t),r=i._widths=arraySlice(r),n=i._counts=arraySlice(n),a=i._transferrableBatchIds=arraySlice(i._batchIds),o=i._packedBuffer=packBuffer$3(i));var s=[t.buffer,r.buffer,n.buffer,a.buffer,o.buffer],l={positions:t.buffer,widths:r.buffer,counts:n.buffer,batchIds:a.buffer,packedBuffer:o.buffer},c=i._verticesPromise=createVerticesTaskProcessor$3.scheduleTask(l,s);if(!defined(c))return;when(c,function(e){i._currentPositions=new Float32Array(e.currentPositions),i._previousPositions=new Float32Array(e.previousPositions),i._nextPositions=new Float32Array(e.nextPositions),i._expandAndWidth=new Float32Array(e.expandAndWidth),i._vertexBatchIds=new Uint16Array(e.batchIds);var t=e.indexDatatype;i._indices=new(t===IndexDatatype$1.UNSIGNED_SHORT?Uint16Array:Uint32Array)(e.indices),i._ready=!0})}var u,d,h,p,m,f,g,_,y,v,C,S,T,x;i._ready&&!defined(i._va)&&(u=i._currentPositions,d=i._previousPositions,h=i._nextPositions,p=i._expandAndWidth,m=i._vertexBatchIds,f=i._indices,g=d.byteLength+u.byteLength+h.byteLength,g+=p.byteLength+m.byteLength+f.byteLength,i._trianglesLength=f.length/3,i._geometryByteLength=g,_=Buffer$1.createVertexBuffer({context:e,typedArray:d,usage:BufferUsage$1.STATIC_DRAW}),y=Buffer$1.createVertexBuffer({context:e,typedArray:u,usage:BufferUsage$1.STATIC_DRAW}),v=Buffer$1.createVertexBuffer({context:e,typedArray:h,usage:BufferUsage$1.STATIC_DRAW}),C=Buffer$1.createVertexBuffer({context:e,typedArray:p,usage:BufferUsage$1.STATIC_DRAW}),S=Buffer$1.createVertexBuffer({context:e,typedArray:m,usage:BufferUsage$1.STATIC_DRAW}),T=Buffer$1.createIndexBuffer({context:e,typedArray:f,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:2===f.BYTES_PER_ELEMENT?IndexDatatype$1.UNSIGNED_SHORT:IndexDatatype$1.UNSIGNED_INT}),x=[{index:attributeLocations$2.previousPosition,vertexBuffer:_,componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{index:attributeLocations$2.currentPosition,vertexBuffer:y,componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{index:attributeLocations$2.nextPosition,vertexBuffer:v,componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3},{index:attributeLocations$2.expandAndWidth,vertexBuffer:C,componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2},{index:attributeLocations$2.a_batchId,vertexBuffer:S,componentDatatype:ComponentDatatype$1.UNSIGNED_SHORT,componentsPerAttribute:1}],i._va=new VertexArray({context:e,attributes:x,indexBuffer:T}),i._positions=void 0,i._widths=void 0,i._counts=void 0,i._ellipsoid=void 0,i._minimumHeight=void 0,i._maximumHeight=void 0,i._rectangle=void 0,i._transferrableBatchIds=void 0,i._packedBuffer=void 0,i._currentPositions=void 0,i._previousPositions=void 0,i._nextPositions=void 0,i._expandAndWidth=void 0,i._vertexBatchIds=void 0,i._indices=void 0,i._readyPromise.resolve())}}var modifiedModelViewScratch$2=new Matrix4,rtcScratch$2=new Cartesian3;function createUniformMap$3(t,i){defined(t._uniformMap)||(t._uniformMap={u_modifiedModelView:function(){var e=i.uniformState.view;return Matrix4.clone(e,modifiedModelViewScratch$2),Matrix4.multiplyByPoint(modifiedModelViewScratch$2,t._center,rtcScratch$2),Matrix4.setTranslation(modifiedModelViewScratch$2,rtcScratch$2,modifiedModelViewScratch$2),modifiedModelViewScratch$2},u_highlightColor:function(){return t._highlightColor}})}function createRenderStates$4(e){defined(e._rs)||(e._rs=RenderState.fromCache({blending:BlendingState$1.ALPHA_BLEND,depthMask:!1,depthTest:{enabled:!0},polygonOffset:{enabled:!0,factor:-5,units:-5}}))}var PolylineFS$1="uniform vec4 u_highlightColor; \nvoid main()\n{\n gl_FragColor = u_highlightColor;\n}\n";function createShaders$2(e,t){var i,r,n,a,o;defined(e._sp)||(r=(i=e._batchTable).getVertexShaderCallback(!1,"a_batchId",void 0)(Vector3DTilePolylinesVS),n=i.getFragmentShaderCallback()(PolylineFS$1,!1,void 0),a=new ShaderSource({defines:["VECTOR_TILE",FeatureDetection.isInternetExplorer()?"":"CLIP_POLYLINE"],sources:[PolylineCommon,r]}),o=new ShaderSource({defines:["VECTOR_TILE"],sources:[n]}),e._sp=ShaderProgram.fromCache({context:t,vertexShaderSource:a,fragmentShaderSource:o,attributeLocations:attributeLocations$2}))}function queueCommands$1(e,t){var i;defined(e._command)||(i=e._batchTable.getUniformMapCallback()(e._uniformMap),e._command=new DrawCommand({owner:e,vertexArray:e._va,renderState:e._rs,shaderProgram:e._sp,uniformMap:i,boundingVolume:e._boundingVolume,pass:Pass$1.TRANSLUCENT,pickId:e._batchTable.getPickId()})),t.commandList.push(e._command)}function clearStyle$2(e,t){for(var i=e._batchIds,r=i.length,n=0;n<r;++n){var a=t[i[n]];a.show=!0,a.color=Color.WHITE}}Vector3DTilePolylines.prototype.createFeatures=function(e,t){for(var i=this._batchIds,r=i.length,n=0;n<r;++n){var a=i[n];t[a]=new Cesium3DTileFeature(e,a)}},Vector3DTilePolylines.prototype.applyDebugSettings=function(e,t){this._highlightColor=e?t:this._constantColor};var scratchColor$8=new Color,DEFAULT_COLOR_VALUE$2=Color.WHITE,DEFAULT_SHOW_VALUE$2=!0;function Vector3DTileContent(e,t,i,r,n){this._tileset=e,this._tile=t,this._resource=i,this._polygons=void 0,this._polylines=void 0,this._points=void 0,this._contentReadyPromise=void 0,this._readyPromise=when.defer(),this._batchTable=void 0,this._features=void 0,this.featurePropertiesDirty=!1,initialize$8(this,r,n)}function createColorChangedCallback$2(i){return function(e,t){defined(i._polygons)&&i._polygons.updateCommands(e,t)}}function getBatchIds$1(e,t){var i,r,n,a,o,s,l,c=defaultValue(e.POLYGONS_LENGTH,0),u=defaultValue(e.POLYLINES_LENGTH,0),d=defaultValue(e.POINTS_LENGTH,0);0<c&&defined(e.POLYGON_BATCH_IDS)&&(r=t.byteOffset+e.POLYGON_BATCH_IDS.byteOffset,n=new Uint16Array(t.buffer,r,c)),0<u&&defined(e.POLYLINE_BATCH_IDS)&&(a=t.byteOffset+e.POLYLINE_BATCH_IDS.byteOffset,o=new Uint16Array(t.buffer,a,u)),0<d&&defined(e.POINT_BATCH_IDS)&&(s=t.byteOffset+e.POINT_BATCH_IDS.byteOffset,l=new Uint16Array(t.buffer,s,d));var h=defined(n)||defined(o)||defined(l),p=0<c&&!defined(n)||0<u&&!defined(o)||0<d&&!defined(l);if(h&&p)throw new RuntimeError("If one group of batch ids is defined, then all batch ids must be defined.");if(!defined(n)&&!defined(o)&&!defined(l)){var m=0;if(!defined(n)&&0<c)for(n=new Uint16Array(c),i=0;i<c;++i)n[i]=m++;if(!defined(o)&&0<u)for(o=new Uint16Array(u),i=0;i<u;++i)o[i]=m++;if(!defined(l)&&0<d)for(l=new Uint16Array(d),i=0;i<d;++i)l[i]=m++}return{polygons:n,polylines:o,points:l}}Vector3DTilePolylines.prototype.applyStyle=function(e,t){if(defined(e))for(var i=this._batchIds,r=i.length,n=0;n<r;++n){var a=t[i[n]];a.color=defined(e.color)?e.color.evaluateColor(a,scratchColor$8):DEFAULT_COLOR_VALUE$2,a.show=defined(e.show)?e.show.evaluate(a):DEFAULT_SHOW_VALUE$2}else clearStyle$2(this,t)},Vector3DTilePolylines.prototype.update=function(e){var t,i=e.context;createVertexArray$4(this,i),createUniformMap$3(this,i),createShaders$2(this,i),createRenderStates$4(this),!this._ready||((t=e.passes).render||t.pick)&&queueCommands$1(this,e)},Vector3DTilePolylines.prototype.isDestroyed=function(){return!1},Vector3DTilePolylines.prototype.destroy=function(){return this._va=this._va&&this._va.destroy(),this._sp=this._sp&&this._sp.destroy(),destroyObject(this)},Object.defineProperties(Vector3DTileContent.prototype,{featuresLength:{get:function(){return defined(this._batchTable)?this._batchTable.featuresLength:0}},pointsLength:{get:function(){return defined(this._points)?this._points.pointsLength:0}},trianglesLength:{get:function(){var e=0;return defined(this._polygons)&&(e+=this._polygons.trianglesLength),defined(this._polylines)&&(e+=this._polylines.trianglesLength),e}},geometryByteLength:{get:function(){var e=0;return defined(this._polygons)&&(e+=this._polygons.geometryByteLength),defined(this._polylines)&&(e+=this._polylines.geometryByteLength),e}},texturesByteLength:{get:function(){return defined(this._points)?this._points.texturesByteLength:0}},batchTableByteLength:{get:function(){return defined(this._batchTable)?this._batchTable.memorySizeInBytes:0}},innerContents:{get:function(){}},readyPromise:{get:function(){return this._readyPromise.promise}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){return this._batchTable}}});var sizeOfUint32$8=Uint32Array.BYTES_PER_ELEMENT;function initialize$8(e,t,i){i=defaultValue(i,0);var r=new Uint8Array(t),n=new DataView(t);i+=sizeOfUint32$8;var a=n.getUint32(i,!0);if(1!==a)throw new RuntimeError("Only Vector tile version 1 is supported. Version "+a+" is not.");i+=sizeOfUint32$8;var o=n.getUint32(i,!0);if(i+=sizeOfUint32$8,0!==o){var s=n.getUint32(i,!0);if(i+=sizeOfUint32$8,0===s)throw new RuntimeError("Feature table must have a byte length greater than zero");var l=n.getUint32(i,!0);i+=sizeOfUint32$8;var c=n.getUint32(i,!0);i+=sizeOfUint32$8;var u=n.getUint32(i,!0);i+=sizeOfUint32$8;var d=n.getUint32(i,!0);i+=sizeOfUint32$8;var h=n.getUint32(i,!0);i+=sizeOfUint32$8;var p=n.getUint32(i,!0);i+=sizeOfUint32$8;var m=n.getUint32(i,!0),f=getStringFromTypedArray(r,i+=sizeOfUint32$8,s),g=JSON.parse(f);i+=s;var _,y,v,C=new Uint8Array(t,i,l);i+=l,0<c&&(y=getStringFromTypedArray(r,i,c),v=JSON.parse(y),i+=c,0<u&&(_=new Uint8Array(t,i,u),_=new Uint8Array(_),i+=u));var S=defaultValue(g.POLYGONS_LENGTH,0),T=defaultValue(g.POLYLINES_LENGTH,0),x=defaultValue(g.POINTS_LENGTH,0),b=S+T+x,E=new Cesium3DTileBatchTable(e,b,v,_,createColorChangedCallback$2(e));if(e._batchTable=E,0!==b){var P=new Cesium3DTileFeatureTable(g,C),A=P.getGlobalProperty("REGION");if(!defined(A))throw new RuntimeError("Feature table global property: REGION must be defined");var w=Rectangle.unpack(A),D=A[4],M=A[5],I=e._tile.computedTransform,R=P.getGlobalProperty("RTC_CENTER",ComponentDatatype$1.FLOAT,3);defined(R)?(R=Cartesian3.unpack(R),Matrix4.multiplyByPoint(I,R,R)):((R=Rectangle.center(w)).height=CesiumMath.lerp(D,M,.5),R=Ellipsoid.WGS84.cartographicToCartesian(R));var O,L=getBatchIds$1(g,C);if(i+=i%4,0<S){P.featuresLength=S;var F=defaultValue(P.getPropertyArray("POLYGON_COUNTS",ComponentDatatype$1.UNSIGNED_INT,1),P.getPropertyArray("POLYGON_COUNT",ComponentDatatype$1.UNSIGNED_INT,1));if(!defined(F))throw new RuntimeError("Feature table property: POLYGON_COUNTS must be defined when POLYGONS_LENGTH is greater than 0");var N=defaultValue(P.getPropertyArray("POLYGON_INDEX_COUNTS",ComponentDatatype$1.UNSIGNED_INT,1),P.getPropertyArray("POLYGON_INDEX_COUNT",ComponentDatatype$1.UNSIGNED_INT,1));if(!defined(N))throw new RuntimeError("Feature table property: POLYGON_INDEX_COUNTS must be defined when POLYGONS_LENGTH is greater than 0");var B=F.reduce(function(e,t){return e+2*t},0),V=N.reduce(function(e,t){return e+t},0),k=new Uint32Array(t,i,V);i+=d;var z,$,U=new Uint16Array(t,i,B);i+=h,defined(g.POLYGON_MINIMUM_HEIGHTS)&&defined(g.POLYGON_MAXIMUM_HEIGHTS)&&(z=P.getPropertyArray("POLYGON_MINIMUM_HEIGHTS",ComponentDatatype$1.FLOAT,1),$=P.getPropertyArray("POLYGON_MAXIMUM_HEIGHTS",ComponentDatatype$1.FLOAT,1)),e._polygons=new Vector3DTilePolygons({positions:U,counts:F,indexCounts:N,indices:k,minimumHeight:D,maximumHeight:M,polygonMinimumHeights:z,polygonMaximumHeights:$,center:R,rectangle:w,boundingVolume:e.tile.boundingVolume.boundingVolume,batchTable:E,batchIds:L.polygons,modelMatrix:I})}if(0<T){P.featuresLength=T;var G=defaultValue(P.getPropertyArray("POLYLINE_COUNTS",ComponentDatatype$1.UNSIGNED_INT,1),P.getPropertyArray("POLYLINE_COUNT",ComponentDatatype$1.UNSIGNED_INT,1));if(!defined(G))throw new RuntimeError("Feature table property: POLYLINE_COUNTS must be defined when POLYLINES_LENGTH is greater than 0");var H=P.getPropertyArray("POLYLINE_WIDTHS",ComponentDatatype$1.UNSIGNED_SHORT,1);if(!defined(H)){H=new Uint16Array(T);for(var W=0;W<T;++W)H[W]=2}var q=G.reduce(function(e,t){return e+3*t},0),j=new Uint16Array(t,i,q);i+=p,e._polylines=new Vector3DTilePolylines({positions:j,widths:H,counts:G,batchIds:L.polylines,minimumHeight:D,maximumHeight:M,center:R,rectangle:w,boundingVolume:e.tile.boundingVolume.boundingVolume,batchTable:E})}0<x&&(O=new Uint16Array(t,i,3*x),i+=m,e._points=new Vector3DTilePoints({positions:O,batchIds:L.points,minimumHeight:D,maximumHeight:M,rectangle:w,batchTable:E}))}}else e._readyPromise.resolve(e)}function createFeatures$4(e){var t,i=e.featuresLength;!defined(e._features)&&0<i&&(t=new Array(i),defined(e._polygons)&&e._polygons.createFeatures(e,t),defined(e._polylines)&&e._polylines.createFeatures(e,t),defined(e._points)&&e._points.createFeatures(e,t),e._features=t)}Vector3DTileContent.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)},Vector3DTileContent.prototype.getFeature=function(e){return createFeatures$4(this),this._features[e]},Vector3DTileContent.prototype.applyDebugSettings=function(e,t){defined(this._polygons)&&this._polygons.applyDebugSettings(e,t),defined(this._polylines)&&this._polylines.applyDebugSettings(e,t),defined(this._points)&&this._points.applyDebugSettings(e,t)},Vector3DTileContent.prototype.applyStyle=function(e){createFeatures$4(this),defined(this._polygons)&&this._polygons.applyStyle(e,this._features),defined(this._polylines)&&this._polylines.applyStyle(e,this._features),defined(this._points)&&this._points.applyStyle(e,this._features)},Vector3DTileContent.prototype.update=function(e,t){var i,r,n,a,o=!0;defined(this._polygons)&&(this._polygons.classificationType=this._tileset.classificationType,this._polygons.debugWireframe=this._tileset.debugWireframe,this._polygons.update(t),o=o&&this._polygons._ready),defined(this._polylines)&&(this._polylines.update(t),o=o&&this._polylines._ready),defined(this._points)&&(this._points.update(t),o=o&&this._points._ready),defined(this._batchTable)&&o&&this._batchTable.update(e,t),defined(this._contentReadyPromise)||(i=defined(this._points)?this._points.readyPromise:void 0,r=defined(this._polygons)?this._polygons.readyPromise:void 0,n=defined(this._polylines)?this._polylines.readyPromise:void 0,(a=this)._contentReadyPromise=when.all([i,r,n]).then(function(){a._readyPromise.resolve(a)}))},Vector3DTileContent.prototype.isDestroyed=function(){return!1},Vector3DTileContent.prototype.destroy=function(){return this._polygons=this._polygons&&this._polygons.destroy(),this._polylines=this._polylines&&this._polylines.destroy(),this._points=this._points&&this._points.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),destroyObject(this)};var Cesium3DTileContentFactory={b3dm:function(e,t,i,r,n){return new Batched3DModel3DTileContent(e,t,i,r,n)},pnts:function(e,t,i,r,n){return new PointCloud3DTileContent(e,t,i,r,n)},i3dm:function(e,t,i,r,n){return new Instanced3DModel3DTileContent(e,t,i,r,n)},cmpt:function(e,t,i,r,n){return new Composite3DTileContent(e,t,i,r,n,Cesium3DTileContentFactory)},json:function(e,t,i,r,n){return new Tileset3DTileContent(e,t,i,r,n)},geom:function(e,t,i,r,n){return new Geometry3DTileContent(e,t,i,r,n)},vctr:function(e,t,i,r,n){return new Vector3DTileContent(e,t,i,r,n)}},Cesium3DTileContentState={UNLOADED:0,LOADING:1,PROCESSING:2,READY:3,EXPIRED:4,FAILED:5},Cesium3DTileContentState$1=Object.freeze(Cesium3DTileContentState),Cesium3DTileOptimizationHint={NOT_COMPUTED:-1,USE_OPTIMIZATION:1,SKIP_OPTIMIZATION:0},Cesium3DTileOptimizationHint$1=Object.freeze(Cesium3DTileOptimizationHint);function Cesium3DTilesetMostDetailedTraversal(){}var traversal={stack:new ManagedArray,stackMaximumLength:0};function isVisible(e){return e._visible&&e._inRequestVolume}function hasEmptyContent(e){return e.hasEmptyContent||e.hasTilesetContent}function hasUnloadedContent(e){return!hasEmptyContent(e)&&e.contentUnloaded}function canTraverse(e,t){return 0!==t.children.length&&(t.hasTilesetContent?!t.contentExpired:(t.hasEmptyContent,!0))}function updateAndPushChildren(e,t,i,r){for(var n=t.children,a=n.length,o=0;o<a;++o){var s=n[o];s.updateVisibility(r),isVisible(s)&&i.push(s)}}function loadTile(e,t){(hasUnloadedContent(t)||t.contentExpired)&&(t._priority=0,e._requestedTiles.push(t))}function touchTile(e,t,i){t._touchedFrame!==i.frameNumber&&(e._cache.touch(t),t._touchedFrame=i.frameNumber)}function visitTile(e){++e.statistics.visited}function selectDesiredTile(e,t,i){t.contentAvailable&&t.contentVisibility(i)!==Intersect$1.OUTSIDE&&e._selectedTiles.push(t)}function Cesium3DTilesetTraversal(){}function isVisible$1(e){return e._visible&&e._inRequestVolume}Cesium3DTilesetMostDetailedTraversal.selectTiles=function(e,t){e._selectedTiles.length=0,e._requestedTiles.length=0;var i=!(e._hasMixedContent=!1),r=e.root;if(r.updateVisibility(t),!isVisible(r))return i;var n=traversal.stack;for(n.push(e.root);0<n.length;){traversal.stackMaximumLength=Math.max(traversal.stackMaximumLength,n.length);var a=n.pop(),o=a.refine===Cesium3DTileRefine$1.ADD,s=a.refine===Cesium3DTileRefine$1.REPLACE,l=canTraverse(e,a);l&&updateAndPushChildren(e,a,n,t),(o||s&&!l)&&(loadTile(e,a),touchTile(e,a,t),selectDesiredTile(e,a,t),hasEmptyContent(a)||a.contentAvailable||(i=!1)),visitTile(e)}return traversal.stack.trim(traversal.stackMaximumLength),i};var traversal$1={stack:new ManagedArray,stackMaximumLength:0},emptyTraversal={stack:new ManagedArray,stackMaximumLength:0},descendantTraversal={stack:new ManagedArray,stackMaximumLength:0},selectionTraversal={stack:new ManagedArray,stackMaximumLength:0,ancestorStack:new ManagedArray,ancestorStackMaximumLength:0},descendantSelectionDepth=2;function executeBaseTraversal(e,t,i){executeTraversal(e,t,e._maximumScreenSpaceError,e._maximumScreenSpaceError,i)}function executeSkipTraversal(e,t,i){executeTraversal(e,t,Number.MAX_VALUE,e._maximumScreenSpaceError,i),traverseAndSelect(e,t,i)}function executeBaseAndSkipTraversal(e,t,i){executeTraversal(e,t,Math.max(e.baseScreenSpaceError,e.maximumScreenSpaceError),e.maximumScreenSpaceError,i),traverseAndSelect(e,t,i)}function skipLevelOfDetail(e){return e._skipLevelOfDetail}function addEmptyTile(e,t){e._emptyTiles.push(t)}function selectTile(e,t,i){var r;t.contentVisibility(i)!==Intersect$1.OUTSIDE&&((r=t.content).featurePropertiesDirty?(r.featurePropertiesDirty=!1,t.lastStyleTime=0,e._selectedTilesToStyle.push(t)):t._selectedFrame<i.frameNumber-1&&e._selectedTilesToStyle.push(t),t._selectedFrame=i.frameNumber,e._selectedTiles.push(t))}function selectDescendants(e,t,i){var r=descendantTraversal.stack;for(r.push(t);0<r.length;){descendantTraversal.stackMaximumLength=Math.max(descendantTraversal.stackMaximumLength,r.length);for(var n=r.pop().children,a=n.length,o=0;o<a;++o){var s=n[o];isVisible$1(s)&&(s.contentAvailable?(updateTile(e,s,i),touchTile$1(e,s,i),selectTile(e,s,i)):s._depth-t._depth<descendantSelectionDepth&&r.push(s))}}}function selectDesiredTile$1(e,t,i){var r;skipLevelOfDetail(e)?defined(r=t.contentAvailable?t:t._ancestorWithContentAvailable)?r._shouldSelect=!0:selectDescendants(e,t,i):t.contentAvailable&&selectTile(e,t,i)}function visitTile$1(e,t,i){++e._statistics.visited,t._visitedFrame=i.frameNumber}function touchTile$1(e,t,i){t._touchedFrame!==i.frameNumber&&(e._cache.touch(t),t._touchedFrame=i.frameNumber)}function updateMinimumMaximumPriority(e,t){e._maximumPriority.distance=Math.max(t._priorityHolder._distanceToCamera,e._maximumPriority.distance),e._minimumPriority.distance=Math.min(t._priorityHolder._distanceToCamera,e._minimumPriority.distance),e._maximumPriority.depth=Math.max(t._depth,e._maximumPriority.depth),e._minimumPriority.depth=Math.min(t._depth,e._minimumPriority.depth),e._maximumPriority.foveatedFactor=Math.max(t._priorityHolder._foveatedFactor,e._maximumPriority.foveatedFactor),e._minimumPriority.foveatedFactor=Math.min(t._priorityHolder._foveatedFactor,e._minimumPriority.foveatedFactor),e._maximumPriority.reverseScreenSpaceError=Math.max(t._priorityReverseScreenSpaceError,e._maximumPriority.reverseScreenSpaceError),e._minimumPriority.reverseScreenSpaceError=Math.min(t._priorityReverseScreenSpaceError,e._minimumPriority.reverseScreenSpaceError)}function isOnScreenLongEnough(e,t,i){if(!e._cullRequestsWhileMoving)return 1;var r=t.boundingSphere,n=Math.max(2*r.radius,1),a=i.camera,o=0!==a.positionWCDeltaMagnitude?a.positionWCDeltaMagnitude:a.positionWCDeltaMagnitudeLastFrame;return e.cullRequestsWhileMovingMultiplier*o/n<1}function loadTile$1(e,t,i){var r;t._requestedFrame!==i.frameNumber&&(hasUnloadedContent$1(t)||t.contentExpired)&&isOnScreenLongEnough(e,t,i)&&(r=i.camera.timeSinceMoved<e.foveatedTimeDelay,t.priorityDeferred&&r||(t._requestedFrame=i.frameNumber,e._requestedTiles.push(t)))}function updateVisibility(e,t,i){t._updatedVisibilityFrame!==e._updatedVisibilityFrame&&(t.updateVisibility(i),t._updatedVisibilityFrame=e._updatedVisibilityFrame)}function anyChildrenVisible(e,t,i){for(var r=!1,n=t.children,a=n.length,o=0;o<a;++o){var s=n[o];updateVisibility(e,s,i),r=r||isVisible$1(s)}return r}function meetsScreenSpaceErrorEarly(e,t,i){var r=t.parent;return defined(r)&&!r.hasTilesetContent&&r.refine===Cesium3DTileRefine$1.ADD&&t.getScreenSpaceError(i,!0)<=e._maximumScreenSpaceError}function updateTileVisibility(e,t,i){if(updateVisibility(e,t,i),isVisible$1(t)){var r=0<t.children.length;if(t.hasTilesetContent&&r){var n=t.children[0];return updateTileVisibility(e,n,i),void(t._visible=n._visible)}if(!meetsScreenSpaceErrorEarly(e,t,i)){var a=t.refine===Cesium3DTileRefine$1.REPLACE,o=t._optimChildrenWithinParent===Cesium3DTileOptimizationHint$1.USE_OPTIMIZATION;return a&&o&&r&&!anyChildrenVisible(e,t,i)&&(++e._statistics.numberOfTilesCulledWithChildrenUnion,void(t._visible=!1))}t._visible=!1}}function updateTile(e,t,i){updateTileVisibility(e,t,i),t.updateExpiration(),t._wasMinPriorityChild=!1,updateMinimumMaximumPriority(e,t._priorityHolder=t),t._shouldSelect=!1,t._finalResolution=!0}function updateTileAncestorContentLinks(e,t){e._ancestorWithContent=void 0,e._ancestorWithContentAvailable=void 0;var i,r=e.parent;defined(r)&&(i=!hasUnloadedContent$1(r)||r._requestedFrame===t.frameNumber,e._ancestorWithContent=i?r:r._ancestorWithContent,e._ancestorWithContentAvailable=r.contentAvailable?r:r._ancestorWithContentAvailable)}function hasEmptyContent$1(e){return e.hasEmptyContent||e.hasTilesetContent}function hasUnloadedContent$1(e){return!hasEmptyContent$1(e)&&e.contentUnloaded}function reachedSkippingThreshold(e,t){var i=t._ancestorWithContent;return!e.immediatelyLoadDesiredLevelOfDetail&&(t._priorityProgressiveResolutionScreenSpaceErrorLeaf||defined(i)&&t._screenSpaceError<i._screenSpaceError/e.skipScreenSpaceErrorFactor&&t._depth>i._depth+e.skipLevels)}function sortChildrenByDistanceToCamera(e,t){return 0===t._distanceToCamera&&0===e._distanceToCamera?t._centerZDepth-e._centerZDepth:t._distanceToCamera-e._distanceToCamera}function updateAndPushChildren$1(e,t,i,r){for(var n=t.refine===Cesium3DTileRefine$1.REPLACE,a=t.children,o=a.length,s=0;s<o;++s)updateTile(e,a[s],r);a.sort(sortChildrenByDistanceToCamera);var l,c,u=!skipLevelOfDetail(e)&&n&&!hasEmptyContent$1(t),d=!0,h=!1,p=-1,m=Number.MAX_VALUE;for(s=0;s<o;++s){isVisible$1(c=a[s])?(i.push(c),c._foveatedFactor<m&&(p=s,m=c._foveatedFactor),h=!0):(u||e.loadSiblings)&&(c._foveatedFactor<m&&(p=s,m=c._foveatedFactor),loadTile$1(e,c,r),touchTile$1(e,c,r)),u&&(l=!!c._inRequestVolume&&(hasEmptyContent$1(c)?executeEmptyTraversal(e,c,r):c.contentAvailable),d=d&&l)}if(h||(d=!1),-1!==p&&!skipLevelOfDetail(e)&&n){var f=a[p];f._wasMinPriorityChild=!0;var g=(t._wasMinPriorityChild||t===e.root)&&m<=t._priorityHolder._foveatedFactor?t._priorityHolder:t;for(g._foveatedFactor=Math.min(f._foveatedFactor,g._foveatedFactor),g._distanceToCamera=Math.min(f._distanceToCamera,g._distanceToCamera),s=0;s<o;++s)(c=a[s])._priorityHolder=g}return d}function inBaseTraversal(e,t,i){return!skipLevelOfDetail(e)||!e.immediatelyLoadDesiredLevelOfDetail&&(!defined(t._ancestorWithContent)||(0===t._screenSpaceError?t.parent._screenSpaceError>i:t._screenSpaceError>i))}function canTraverse$1(e,t){return 0!==t.children.length&&(t.hasTilesetContent?!t.contentExpired:t._screenSpaceError>e._maximumScreenSpaceError)}function executeTraversal(e,t,i,r,n){var a=traversal$1.stack;for(a.push(t);0<a.length;){traversal$1.stackMaximumLength=Math.max(traversal$1.stackMaximumLength,a.length);var o=a.pop();updateTileAncestorContentLinks(o,n);var s=inBaseTraversal(e,o,i),l=o.refine===Cesium3DTileRefine$1.ADD,c=o.refine===Cesium3DTileRefine$1.REPLACE,u=o.parent,d=!defined(u)||u._refines,h=!1;canTraverse$1(e,o)&&(h=updateAndPushChildren$1(e,o,a,n)&&d);var p=!h&&d;hasEmptyContent$1(o)?(addEmptyTile(e,o),loadTile$1(e,o,n),p&&selectDesiredTile$1(e,o,n)):l?(selectDesiredTile$1(e,o,n),loadTile$1(e,o,n)):c&&(s?(loadTile$1(e,o,n),p&&selectDesiredTile$1(e,o,n)):p?(selectDesiredTile$1(e,o,n),loadTile$1(e,o,n)):reachedSkippingThreshold(e,o)&&loadTile$1(e,o,n)),visitTile$1(e,o,n),touchTile$1(e,o,n),o._refines=h}}function executeEmptyTraversal(e,t,i){var r=!0,n=emptyTraversal.stack;for(n.push(t);0<n.length;){emptyTraversal.stackMaximumLength=Math.max(emptyTraversal.stackMaximumLength,n.length);var a=n.pop(),o=a.children,s=o.length,l=hasEmptyContent$1(a),c=l&&canTraverse$1(e,a),u=l&&0===a.children.length;if(c||a.contentAvailable||u||(r=!1),updateTile(e,a,i),isVisible$1(a)||(loadTile$1(e,a,i),touchTile$1(e,a,i)),c)for(var d=0;d<s;++d){var h=o[d];n.push(h)}}return r}function traverseAndSelect(e,t,i){var r,n=selectionTraversal.stack,a=selectionTraversal.ancestorStack;for(n.push(t);0<n.length||0<a.length;){if(selectionTraversal.stackMaximumLength=Math.max(selectionTraversal.stackMaximumLength,n.length),selectionTraversal.ancestorStackMaximumLength=Math.max(selectionTraversal.ancestorStackMaximumLength,a.length),0<a.length){var o=a.peek();if(o._stackLength===n.length){a.pop(),o!==r&&(o._finalResolution=!1),selectTile(e,o,i);continue}}var s=n.pop();if(defined(s)){var l=s.refine===Cesium3DTileRefine$1.ADD,c=s._shouldSelect,u=s.children,d=u.length,h=canTraverse$1(e,s);if(c)if(l)selectTile(e,s,i);else{if(s._selectionDepth=a.length,0<s._selectionDepth&&(e._hasMixedContent=!0),r=s,!h){selectTile(e,s,i);continue}a.push(s),s._stackLength=n.length}if(h)for(var p=0;p<d;++p){var m=u[p];isVisible$1(m)&&n.push(m)}}}}Cesium3DTilesetTraversal.selectTiles=function(e,t){if(e._requestedTiles.length=0,!e.debugFreezeFrame){e._selectedTiles.length=0,e._selectedTilesToStyle.length=0,e._emptyTiles.length=0,e._hasMixedContent=!1;var i=e.root;if(updateTile(e,i,t),isVisible$1(i)&&!(i.getScreenSpaceError(t,!0)<=e._maximumScreenSpaceError)){(skipLevelOfDetail(e)?e.immediatelyLoadDesiredLevelOfDetail?executeSkipTraversal:executeBaseAndSkipTraversal:executeBaseTraversal)(e,i,t),traversal$1.stack.trim(traversal$1.stackMaximumLength),emptyTraversal.stack.trim(emptyTraversal.stackMaximumLength),descendantTraversal.stack.trim(descendantTraversal.stackMaximumLength),selectionTraversal.stack.trim(selectionTraversal.stackMaximumLength),selectionTraversal.ancestorStack.trim(selectionTraversal.ancestorStackMaximumLength);for(var r=e._requestedTiles,n=r.length,a=0;a<n;++a)r[a].updatePriority()}}};var Cesium3DTilePass={RENDER:0,PICK:1,SHADOW:2,PRELOAD:3,PRELOAD_FLIGHT:4,REQUEST_RENDER_MODE_DEFER_CHECK:5,MOST_DETAILED_PRELOAD:6,MOST_DETAILED_PICK:7,NUMBER_OF_PASSES:8},passOptions=new Array(Cesium3DTilePass.NUMBER_OF_PASSES);passOptions[Cesium3DTilePass.RENDER]=Object.freeze({traversal:Cesium3DTilesetTraversal,isRender:!0,requestTiles:!0,ignoreCommands:!1}),passOptions[Cesium3DTilePass.PICK]=Object.freeze({traversal:Cesium3DTilesetTraversal,isRender:!1,requestTiles:!1,ignoreCommands:!1}),passOptions[Cesium3DTilePass.SHADOW]=Object.freeze({traversal:Cesium3DTilesetTraversal,isRender:!1,requestTiles:!0,ignoreCommands:!1}),passOptions[Cesium3DTilePass.PRELOAD]=Object.freeze({traversal:Cesium3DTilesetTraversal,isRender:!1,requestTiles:!0,ignoreCommands:!0}),passOptions[Cesium3DTilePass.PRELOAD_FLIGHT]=Object.freeze({traversal:Cesium3DTilesetTraversal,isRender:!1,requestTiles:!0,ignoreCommands:!0}),passOptions[Cesium3DTilePass.REQUEST_RENDER_MODE_DEFER_CHECK]=Object.freeze({traversal:Cesium3DTilesetTraversal,isRender:!1,requestTiles:!0,ignoreCommands:!0}),passOptions[Cesium3DTilePass.MOST_DETAILED_PRELOAD]=Object.freeze({traversal:Cesium3DTilesetMostDetailedTraversal,isRender:!1,requestTiles:!0,ignoreCommands:!0}),passOptions[Cesium3DTilePass.MOST_DETAILED_PICK]=Object.freeze({traversal:Cesium3DTilesetMostDetailedTraversal,isRender:!1,requestTiles:!1,ignoreCommands:!1}),Cesium3DTilePass.getPassOptions=function(e){return passOptions[e]};var Cesium3DTilePass$1=Object.freeze(Cesium3DTilePass);function Empty3DTileContent(e,t){this._tileset=e,this._tile=t,this.featurePropertiesDirty=!1}function TileBoundingRegion(e){this.rectangle=Rectangle.clone(e.rectangle),this.minimumHeight=defaultValue(e.minimumHeight,0),this.maximumHeight=defaultValue(e.maximumHeight,0),this.southwestCornerCartesian=new Cartesian3,this.northeastCornerCartesian=new Cartesian3,this.westNormal=new Cartesian3,this.southNormal=new Cartesian3,this.eastNormal=new Cartesian3,this.northNormal=new Cartesian3;var t=defaultValue(e.ellipsoid,Ellipsoid.WGS84);computeBox(this,e.rectangle,t),defaultValue(e.computeBoundingVolumes,!0)&&(this._orientedBoundingBox=OrientedBoundingBox.fromRectangle(this.rectangle,this.minimumHeight,this.maximumHeight,t),this._boundingSphere=BoundingSphere.fromOrientedBoundingBox(this._orientedBoundingBox))}Object.defineProperties(Empty3DTileContent.prototype,{featuresLength:{get:function(){return 0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return 0}},geometryByteLength:{get:function(){return 0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return 0}},innerContents:{get:function(){}},readyPromise:{get:function(){}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){}},batchTable:{get:function(){}}}),Empty3DTileContent.prototype.hasProperty=function(e,t){return!1},Empty3DTileContent.prototype.getFeature=function(e){},Empty3DTileContent.prototype.applyDebugSettings=function(e,t){},Empty3DTileContent.prototype.applyStyle=function(e){},Empty3DTileContent.prototype.update=function(e,t){},Empty3DTileContent.prototype.isDestroyed=function(){return!1},Empty3DTileContent.prototype.destroy=function(){return destroyObject(this)},Object.defineProperties(TileBoundingRegion.prototype,{boundingVolume:{get:function(){return this._orientedBoundingBox}},boundingSphere:{get:function(){return this._boundingSphere}}});var cartesian3Scratch$2=new Cartesian3,cartesian3Scratch2$1=new Cartesian3,cartesian3Scratch3$1=new Cartesian3,eastWestNormalScratch=new Cartesian3,westernMidpointScratch=new Cartesian3,easternMidpointScratch=new Cartesian3,cartographicScratch$2=new Cartographic,planeScratch=new Plane(Cartesian3.UNIT_X,0),rayScratch=new Ray;function computeBox(e,t,i){i.cartographicToCartesian(Rectangle.southwest(t),e.southwestCornerCartesian),i.cartographicToCartesian(Rectangle.northeast(t),e.northeastCornerCartesian),cartographicScratch$2.longitude=t.west,cartographicScratch$2.latitude=.5*(t.south+t.north),cartographicScratch$2.height=0;var r=i.cartographicToCartesian(cartographicScratch$2,westernMidpointScratch),n=Cartesian3.cross(r,Cartesian3.UNIT_Z,cartesian3Scratch$2);Cartesian3.normalize(n,e.westNormal),cartographicScratch$2.longitude=t.east;var a=i.cartographicToCartesian(cartographicScratch$2,easternMidpointScratch),o=Cartesian3.cross(Cartesian3.UNIT_Z,a,cartesian3Scratch$2);Cartesian3.normalize(o,e.eastNormal);var s,l,c=Cartesian3.subtract(r,a,cartesian3Scratch$2),u=Cartesian3.normalize(c,eastWestNormalScratch),d=t.south,h=0<d?(cartographicScratch$2.longitude=.5*(t.west+t.east),cartographicScratch$2.latitude=d,s=i.cartographicToCartesian(cartographicScratch$2,rayScratch.origin),Cartesian3.clone(u,rayScratch.direction),l=Plane.fromPointNormal(e.southwestCornerCartesian,e.westNormal,planeScratch),IntersectionTests.rayPlane(rayScratch,l,e.southwestCornerCartesian),i.geodeticSurfaceNormal(s,cartesian3Scratch2$1)):i.geodeticSurfaceNormalCartographic(Rectangle.southeast(t),cartesian3Scratch2$1),p=Cartesian3.cross(h,c,cartesian3Scratch3$1);Cartesian3.normalize(p,e.southNormal);var m,f,g=t.north,_=g<0?(cartographicScratch$2.longitude=.5*(t.west+t.east),cartographicScratch$2.latitude=g,m=i.cartographicToCartesian(cartographicScratch$2,rayScratch.origin),Cartesian3.negate(u,rayScratch.direction),f=Plane.fromPointNormal(e.northeastCornerCartesian,e.eastNormal,planeScratch),IntersectionTests.rayPlane(rayScratch,f,e.northeastCornerCartesian),i.geodeticSurfaceNormal(m,cartesian3Scratch2$1)):i.geodeticSurfaceNormalCartographic(Rectangle.northwest(t),cartesian3Scratch2$1),y=Cartesian3.cross(c,_,cartesian3Scratch3$1);Cartesian3.normalize(y,e.northNormal)}var southwestCornerScratch=new Cartesian3,northeastCornerScratch=new Cartesian3,negativeUnitY=new Cartesian3(0,-1,0),negativeUnitZ=new Cartesian3(0,0,-1),vectorScratch=new Cartesian3;function TileBoundingSphere(e,t){0===t&&(t=CesiumMath.EPSILON7),this._boundingSphere=new BoundingSphere(e,t)}TileBoundingRegion.prototype.distanceToCamera=function(e){var t,i,r,n,a,o,s,l,c,u,d,h,p,m,f,g,_,y=e.camera,v=y.positionWC,C=y.positionCartographic,S=0;return Rectangle.contains(this.rectangle,C)||(t=this.southwestCornerCartesian,i=this.northeastCornerCartesian,r=this.westNormal,n=this.southNormal,a=this.eastNormal,o=this.northNormal,e.mode!==SceneMode$1.SCENE3D&&((t=e.mapProjection.project(Rectangle.southwest(this.rectangle),southwestCornerScratch)).z=t.y,t.y=t.x,t.x=0,(i=e.mapProjection.project(Rectangle.northeast(this.rectangle),northeastCornerScratch)).z=i.y,i.y=i.x,i.x=0,r=negativeUnitY,a=Cartesian3.UNIT_Y,n=negativeUnitZ,o=Cartesian3.UNIT_Z),s=Cartesian3.subtract(v,t,vectorScratch),l=Cartesian3.dot(s,r),c=Cartesian3.dot(s,n),u=Cartesian3.subtract(v,i,vectorScratch),d=Cartesian3.dot(u,a),h=Cartesian3.dot(u,o),0<l?S+=l*l:0<d&&(S+=d*d),0<c?S+=c*c:0<h&&(S+=h*h)),(f=e.mode===SceneMode$1.SCENE3D?(p=C.height,m=this.minimumHeight,this.maximumHeight):(p=v.x,m=0))<p?S+=(g=p-f)*g:p<m&&(S+=(_=m-p)*_),Math.sqrt(S)},TileBoundingRegion.prototype.intersectPlane=function(e){return this._orientedBoundingBox.intersectPlane(e)},TileBoundingRegion.prototype.createDebugVolume=function(e){var t=new Matrix4.clone(Matrix4.IDENTITY);return new Primitive({geometryInstances:new GeometryInstance({geometry:new RectangleOutlineGeometry({rectangle:this.rectangle,height:this.minimumHeight,extrudedHeight:this.maximumHeight}),id:"outline",modelMatrix:t,attributes:{color:ColorGeometryInstanceAttribute.fromColor(e)}}),appearance:new PerInstanceColorAppearance({translucent:!1,flat:!0}),asynchronous:!1})},Object.defineProperties(TileBoundingSphere.prototype,{center:{get:function(){return this._boundingSphere.center}},radius:{get:function(){return this._boundingSphere.radius}},boundingVolume:{get:function(){return this._boundingSphere}},boundingSphere:{get:function(){return this._boundingSphere}}}),TileBoundingSphere.prototype.distanceToCamera=function(e){var t=this._boundingSphere;return Math.max(0,Cartesian3.distance(t.center,e.camera.positionWC)-t.radius)},TileBoundingSphere.prototype.intersectPlane=function(e){return BoundingSphere.intersectPlane(this._boundingSphere,e)},TileBoundingSphere.prototype.update=function(e,t){Cartesian3.clone(e,this._boundingSphere.center),this._boundingSphere.radius=t},TileBoundingSphere.prototype.createDebugVolume=function(e){return new Primitive({geometryInstances:new GeometryInstance({geometry:new SphereOutlineGeometry({radius:this.radius}),id:"outline",modelMatrix:Matrix4.fromTranslation(this.center,new Matrix4.clone(Matrix4.IDENTITY)),attributes:{color:ColorGeometryInstanceAttribute.fromColor(e)}}),appearance:new PerInstanceColorAppearance({translucent:!1,flat:!0}),asynchronous:!1})};var scratchU=new Cartesian3,scratchV=new Cartesian3,scratchW$1=new Cartesian3,scratchCartesian$3=new Cartesian3;function computeMissingVector(e,t,i){i=Cartesian3.cross(e,t,i);var r=Cartesian3.magnitude(i);return Cartesian3.multiplyByScalar(i,CesiumMath.EPSILON7/r,i)}function findOrthogonalVector(e,t){var i=Cartesian3.normalize(e,scratchCartesian$3);return computeMissingVector(e,Cartesian3.equalsEpsilon(i,Cartesian3.UNIT_X,CesiumMath.EPSILON6)?Cartesian3.UNIT_Y:Cartesian3.UNIT_X,t)}function checkHalfAxes(e){var t=Matrix3.getColumn(e,0,scratchU),i=Matrix3.getColumn(e,1,scratchV),r=Matrix3.getColumn(e,2,scratchW$1),n=Cartesian3.equals(t,Cartesian3.ZERO),a=Cartesian3.equals(i,Cartesian3.ZERO),o=Cartesian3.equals(r,Cartesian3.ZERO);return(n||a||o)&&(n&&a&&o?(e[0]=CesiumMath.EPSILON7,e[4]=CesiumMath.EPSILON7,e[8]=CesiumMath.EPSILON7):(!n||a||o?n||!a||o?n||a||!o?n?a?o||(i=computeMissingVector(r,t=findOrthogonalVector(r,t),i)):r=computeMissingVector(i,t=findOrthogonalVector(i,t),r):r=computeMissingVector(i=findOrthogonalVector(t,i),t,r):r=computeMissingVector(i,t,r):i=computeMissingVector(t,r,i):t=computeMissingVector(i,r,t),Matrix3.setColumn(e,0,t,e),Matrix3.setColumn(e,1,i,e),Matrix3.setColumn(e,2,r,e))),e}function TileOrientedBoundingBox(e,t){t=checkHalfAxes(t),this._orientedBoundingBox=new OrientedBoundingBox(e,t),this._boundingSphere=BoundingSphere.fromOrientedBoundingBox(this._orientedBoundingBox)}function Cesium3DTile(e,t,i,r){this._tileset=e;var n=(this._header=i).content;this.transform=defined(i.transform)?Matrix4.unpack(i.transform):Matrix4.clone(Matrix4.IDENTITY);var a,o,s,l,c,u,d,h,p,m=defined(r)?r.computedTransform:e.modelMatrix,f=Matrix4.multiply(m,this.transform,new Matrix4),g=defined(r)?r._initialTransform:Matrix4.IDENTITY;this._initialTransform=Matrix4.multiply(g,this.transform,new Matrix4),this.computedTransform=f,this._boundingVolume=this.createBoundingVolume(i.boundingVolume,f),this._boundingVolume2D=void 0,defined(n)&&defined(n.boundingVolume)&&(a=this.createBoundingVolume(n.boundingVolume,f)),this._contentBoundingVolume=a,this._contentBoundingVolume2D=void 0,defined(i.viewerRequestVolume)&&(o=this.createBoundingVolume(i.viewerRequestVolume,f)),this._viewerRequestVolume=o,this.geometricError=i.geometricError,this._geometricError=i.geometricError,defined(this._geometricError)||(this._geometricError=defined(r)?r.geometricError:e._geometricError,Cesium3DTile._deprecationWarning("geometricErrorUndefined","Required property geometricError is undefined for this tile. Using parent's geometric error instead.")),this.updateGeometricErrorScale(),s=defined(i.refine)?("replace"!==i.refine&&"add"!==i.refine||Cesium3DTile._deprecationWarning("lowercase-refine",'This tile uses a lowercase refine "'+i.refine+'". Instead use "'+i.refine.toUpperCase()+'".'),"REPLACE"===i.refine.toUpperCase()?Cesium3DTileRefine$1.REPLACE:Cesium3DTileRefine$1.ADD):defined(r)?r.refine:Cesium3DTileRefine$1.REPLACE,this.refine=s,this.children=[],this.parent=r,t=Resource.createIfNeeded(t),defined(n)?(p=n.uri,defined(n.url)&&(Cesium3DTile._deprecationWarning("contentUrl",'This tileset JSON uses the "content.url" property which has been deprecated. Use "content.uri" instead.'),p=n.url),c=!1,u=Cesium3DTileContentState$1.UNLOADED,d=t.getDerivedResource({url:p}),h=RequestScheduler.getServerKey(d.getUrlComponent())):(l=new Empty3DTileContent(e,this),c=!0,u=Cesium3DTileContentState$1.READY),this._content=l,this._contentResource=d,this._contentState=u,this._contentReadyToProcessPromise=void 0,this._contentReadyPromise=void 0,this._expiredContent=void 0,this._serverKey=h,this.hasEmptyContent=c,this.hasTilesetContent=!1,this.cacheNode=void 0;var _,y,v=i.expire;defined(v)&&(_=v.duration,defined(v.date)&&(y=JulianDate.fromIso8601(v.date))),this.expireDuration=_,this.expireDate=y,this.lastStyleTime=0,this._optimChildrenWithinParent=Cesium3DTileOptimizationHint$1.NOT_COMPUTED,this.clippingPlanesDirty=!1,this.priorityDeferred=!1,this._distanceToCamera=0,this._centerZDepth=0,this._screenSpaceError=0,this._screenSpaceErrorProgressiveResolution=0,this._visibilityPlaneMask=0,this._visible=!1,this._inRequestVolume=!1,this._finalResolution=!0,this._depth=0,this._stackLength=0,this._selectionDepth=0,this._updatedVisibilityFrame=0,this._touchedFrame=0,this._visitedFrame=0,this._selectedFrame=0,this._requestedFrame=0,this._ancestorWithContent=void 0,this._ancestorWithContentAvailable=void 0,this._refines=!1,this._shouldSelect=!1,this._isClipped=!0,this._clippingPlanesState=0,this._debugBoundingVolume=void 0,this._debugContentBoundingVolume=void 0,this._debugViewerRequestVolume=void 0,this._debugColor=Color.fromRandom({alpha:1}),this._debugColorizeTiles=!1,this._priority=0,(this._priorityHolder=this)._priorityProgressiveResolution=!1,this._priorityProgressiveResolutionScreenSpaceErrorLeaf=!1,this._priorityReverseScreenSpaceError=0,this._foveatedFactor=0,this._wasMinPriorityChild=!1,this._loadTimestamp=new JulianDate,this._commandsLength=0,this._color=void 0,this._colorDirty=!1,this._request=void 0}Object.defineProperties(TileOrientedBoundingBox.prototype,{boundingVolume:{get:function(){return this._orientedBoundingBox}},boundingSphere:{get:function(){return this._boundingSphere}}}),TileOrientedBoundingBox.prototype.distanceToCamera=function(e){return Math.sqrt(this._orientedBoundingBox.distanceSquaredTo(e.camera.positionWC))},TileOrientedBoundingBox.prototype.intersectPlane=function(e){return this._orientedBoundingBox.intersectPlane(e)},TileOrientedBoundingBox.prototype.update=function(e,t){Cartesian3.clone(e,this._orientedBoundingBox.center),t=checkHalfAxes(t),Matrix3.clone(t,this._orientedBoundingBox.halfAxes),BoundingSphere.fromOrientedBoundingBox(this._orientedBoundingBox,this._boundingSphere)},TileOrientedBoundingBox.prototype.createDebugVolume=function(e){return new Primitive({geometryInstances:new GeometryInstance({geometry:new BoxOutlineGeometry({minimum:new Cartesian3(-1,-1,-1),maximum:new Cartesian3(1,1,1)}),id:"outline",modelMatrix:Matrix4.fromRotationTranslation(this.boundingVolume.halfAxes,this.boundingVolume.center),attributes:{color:ColorGeometryInstanceAttribute.fromColor(e)}}),appearance:new PerInstanceColorAppearance({translucent:!1,flat:!0}),asynchronous:!1})},Cesium3DTile._deprecationWarning=deprecationWarning,Object.defineProperties(Cesium3DTile.prototype,{tileset:{get:function(){return this._tileset}},content:{get:function(){return this._content}},boundingVolume:{get:function(){return this._boundingVolume}},contentBoundingVolume:{get:function(){return defaultValue(this._contentBoundingVolume,this._boundingVolume)}},boundingSphere:{get:function(){return this._boundingVolume.boundingSphere}},extras:{get:function(){return this._header.extras}},color:{get:function(){return defined(this._color)||(this._color=new Color),Color.clone(this._color)},set:function(e){this._color=Color.clone(e,this._color),this._colorDirty=!0}},contentAvailable:{get:function(){return this.contentReady&&!this.hasEmptyContent&&!this.hasTilesetContent||defined(this._expiredContent)&&!this.contentFailed}},contentReady:{get:function(){return this._contentState===Cesium3DTileContentState$1.READY}},contentUnloaded:{get:function(){return this._contentState===Cesium3DTileContentState$1.UNLOADED}},contentExpired:{get:function(){return this._contentState===Cesium3DTileContentState$1.EXPIRED}},contentFailed:{get:function(){return this._contentState===Cesium3DTileContentState$1.FAILED}},contentReadyToProcessPromise:{get:function(){if(defined(this._contentReadyToProcessPromise))return this._contentReadyToProcessPromise.promise}},contentReadyPromise:{get:function(){if(defined(this._contentReadyPromise))return this._contentReadyPromise.promise}},commandsLength:{get:function(){return this._commandsLength}}});var scratchCartesian$4=new Cartesian3;function isPriorityDeferred(e,t){var i,r,n,a,o,s=e._tileset,l=t.camera,c=e.boundingSphere,u=c.radius,d=Cartesian3.multiplyByScalar(l.directionWC,e._centerZDepth,scratchCartesian$4),h=Cartesian3.add(l.positionWC,d,scratchCartesian$4),p=Cartesian3.subtract(h,c.center,scratchCartesian$4);u<Cartesian3.magnitude(p)?(i=Cartesian3.normalize(p,scratchCartesian$4),r=Cartesian3.multiplyByScalar(i,u,scratchCartesian$4),n=Cartesian3.add(c.center,r,scratchCartesian$4),a=Cartesian3.subtract(n,l.positionWC,scratchCartesian$4),o=Cartesian3.normalize(a,scratchCartesian$4),e._foveatedFactor=1-Math.abs(Cartesian3.dot(l.directionWC,o))):e._foveatedFactor=0;var m=e.refine===Cesium3DTileRefine$1.REPLACE,f=s._skipLevelOfDetail;if(m&&!f||!s.foveatedScreenSpaceError||1===s.foveatedConeSize||e._priorityProgressiveResolution&&m&&f||s._pass===Cesium3DTilePass$1.PRELOAD_FLIGHT||s._pass===Cesium3DTilePass$1.PRELOAD)return!1;var g=1-Math.cos(.5*l.frustum.fov),_=s.foveatedConeSize*g;if(e._foveatedFactor<=_)return!1;var y=g-_,v=CesiumMath.clamp((e._foveatedFactor-_)/y,0,1),C=s.foveatedInterpolationCallback(s.foveatedMinimumScreenSpaceErrorRelaxation,s.maximumScreenSpaceError,v),S=0===e._screenSpaceError&&defined(e.parent)?.5*e.parent._screenSpaceError:e._screenSpaceError;return s.maximumScreenSpaceError-C<=S}var scratchJulianDate$1=new JulianDate;function isPriorityProgressiveResolution(e,t){if(e.progressiveResolutionHeightFraction<=0||.5<e.progressiveResolutionHeightFraction)return!1;var i=t._screenSpaceErrorProgressiveResolution>e._maximumScreenSpaceError;t._priorityProgressiveResolutionScreenSpaceErrorLeaf=!1;var r=t.parent,n=e._maximumScreenSpaceError,a=t._screenSpaceErrorProgressiveResolution<=n,o=defined(r)&&r._screenSpaceErrorProgressiveResolution>n;return a&&o&&(i=t._priorityProgressiveResolutionScreenSpaceErrorLeaf=!0),i}function getPriorityReverseScreenSpaceError(e,t){var i=t.parent,r=defined(i)&&(!e._skipLevelOfDetail||0===t._screenSpaceError||i.hasTilesetContent)?i._screenSpaceError:t._screenSpaceError;return e.root._screenSpaceError-r}function updateExpireDate(e){var t;defined(e.expireDuration)&&(t=JulianDate.now(scratchJulianDate$1),JulianDate.addSeconds(t,e.expireDuration,t),defined(e.expireDate)?JulianDate.lessThan(e.expireDate,t)&&JulianDate.clone(t,e.expireDate):e.expireDate=JulianDate.clone(t))}function getContentFailedFunction(t,i){return function(e){t._contentState===Cesium3DTileContentState$1.PROCESSING?--i.statistics.numberOfTilesProcessing:--i.statistics.numberOfPendingRequests,t._contentState=Cesium3DTileContentState$1.FAILED,t._contentReadyPromise.reject(e),t._contentReadyToProcessPromise.reject(e)}}function createPriorityFunction(e){return function(){return e._priority}}Cesium3DTile.prototype.getScreenSpaceError=function(e,t,i){var r=this._tileset,n=defaultValue(i,1),a=defined(this.parent)?this.parent.geometricError:r._geometricError,o=t?a:this.geometricError;if(0===o)return 0;var s,l,c,u,d=e.camera,h=d.frustum,p=e.context,m=p.drawingBufferWidth,f=p.drawingBufferHeight*n;return e.mode===SceneMode$1.SCENE2D||h instanceof OrthographicFrustum?(defined(h._offCenterFrustum)&&(h=h._offCenterFrustum),s=o/(Math.max(h.top-h.bottom,h.right-h.left)/Math.max(m,f))):(s=o*f/((l=Math.max(this._distanceToCamera,CesiumMath.EPSILON7))*d.frustum.sseDenominator),r.dynamicScreenSpaceError&&(c=r._dynamicScreenSpaceErrorComputedDensity,u=r.dynamicScreenSpaceErrorFactor,s-=CesiumMath.fog(l,c)*u)),s/=e.pixelRatio},Cesium3DTile.prototype.updateVisibility=function(e){var t=this.parent,i=this._tileset,r=defined(t)?t.computedTransform:i.modelMatrix,n=defined(t)?t._visibilityPlaneMask:CullingVolume.MASK_INDETERMINATE;this.updateTransform(r),this._distanceToCamera=this.distanceToTile(e),this._centerZDepth=this.distanceToTileCenter(e),this._screenSpaceError=this.getScreenSpaceError(e,!1),this._screenSpaceErrorProgressiveResolution=this.getScreenSpaceError(e,!1,i.progressiveResolutionHeightFraction),this._visibilityPlaneMask=this.visibility(e,n),this._visible=this._visibilityPlaneMask!==CullingVolume.MASK_OUTSIDE,this._inRequestVolume=this.insideViewerRequestVolume(e),this._priorityReverseScreenSpaceError=getPriorityReverseScreenSpaceError(i,this),this._priorityProgressiveResolution=isPriorityProgressiveResolution(i,this),this.priorityDeferred=isPriorityDeferred(this,e)},Cesium3DTile.prototype.updateExpiration=function(){var e;defined(this.expireDate)&&this.contentReady&&!this.hasEmptyContent&&(e=JulianDate.now(scratchJulianDate$1),JulianDate.lessThan(this.expireDate,e)&&(this._contentState=Cesium3DTileContentState$1.EXPIRED,this._expiredContent=this._content))},Cesium3DTile.prototype.requestContent=function(){var n=this,a=this._tileset;if(this.hasEmptyContent)return!1;var e=this._contentResource.clone(),o=this.contentExpired;o&&e.setQueryParameters({expired:this.expireDate.toString()});var t=new Request({throttle:!0,throttleByServer:!0,type:RequestType$1.TILES3D,priorityFunction:createPriorityFunction(this),serverKey:this._serverKey});this._request=t,e.request=t;var i=e.fetchArrayBuffer();if(!defined(i))return!1;var r=this._contentState;this._contentState=Cesium3DTileContentState$1.LOADING,this._contentReadyToProcessPromise=when.defer(),this._contentReadyPromise=when.defer();var s=getContentFailedFunction(this,a);return i.then(function(e){if(!n.isDestroyed()){var t,i=getMagic(new Uint8Array(e)),r=Cesium3DTileContentFactory[i];return a._disableSkipLevelOfDetail=a._disableSkipLevelOfDetail||"vctr"===i||"geom"===i,defined(r)?t=r(a,n,n._contentResource,e,0):(t=Cesium3DTileContentFactory.json(a,n,n._contentResource,e,0),n.hasTilesetContent=!0),o&&(n.expireDate=void 0),n._content=t,n._contentState=Cesium3DTileContentState$1.PROCESSING,n._contentReadyToProcessPromise.resolve(t),t.readyPromise.then(function(e){n.isDestroyed()?s():(updateExpireDate(n),n._selectedFrame=0,n.lastStyleTime=0,JulianDate.now(n._loadTimestamp),n._contentState=Cesium3DTileContentState$1.READY,n._contentReadyPromise.resolve(e))})}s()}).otherwise(function(e){return t.state===RequestState$1.CANCELLED?(n._contentState=r,--a.statistics.numberOfPendingRequests,void++a.statistics.numberOfAttemptedRequests):void s(e)}),!0},Cesium3DTile.prototype.unloadContent=function(){this.hasEmptyContent||this.hasTilesetContent||(this._content=this._content&&this._content.destroy(),this._contentState=Cesium3DTileContentState$1.UNLOADED,this._contentReadyToProcessPromise=void 0,this._contentReadyPromise=void 0,this.lastStyleTime=0,this.clippingPlanesDirty=0===this._clippingPlanesState,this._clippingPlanesState=0,this._debugColorizeTiles=!1,this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy())};var scratchProjectedBoundingSphere=new BoundingSphere;function getBoundingVolume(e,t){var i,r;return t.mode===SceneMode$1.SCENE3D||defined(e._boundingVolume2D)||(i=e._boundingVolume.boundingSphere,r=BoundingSphere.projectTo2D(i,t.mapProjection,scratchProjectedBoundingSphere),e._boundingVolume2D=new TileBoundingSphere(r.center,r.radius)),t.mode!==SceneMode$1.SCENE3D?e._boundingVolume2D:e._boundingVolume}function getContentBoundingVolume(e,t){var i,r;return t.mode===SceneMode$1.SCENE3D||defined(e._contentBoundingVolume2D)||(i=e._contentBoundingVolume.boundingSphere,r=BoundingSphere.projectTo2D(i,t.mapProjection,scratchProjectedBoundingSphere),e._contentBoundingVolume2D=new TileBoundingSphere(r.center,r.radius)),t.mode!==SceneMode$1.SCENE3D?e._contentBoundingVolume2D:e._contentBoundingVolume}Cesium3DTile.prototype.visibility=function(e,t){var i=e.cullingVolume,r=getBoundingVolume(this,e),n=this._tileset,a=n.clippingPlanes;if(defined(a)&&a.enabled){var o=a.computeIntersectionWithBoundingVolume(r,n.clippingPlanesOriginMatrix);if(this._isClipped=o!==Intersect$1.INSIDE,o===Intersect$1.OUTSIDE)return CullingVolume.MASK_OUTSIDE}return i.computeVisibilityWithPlaneMask(r,t)},Cesium3DTile.prototype.contentVisibility=function(e){if(!defined(this._contentBoundingVolume))return Intersect$1.INSIDE;if(this._visibilityPlaneMask===CullingVolume.MASK_INSIDE)return Intersect$1.INSIDE;var t=e.cullingVolume,i=getContentBoundingVolume(this,e),r=this._tileset,n=r.clippingPlanes;if(defined(n)&&n.enabled){var a=n.computeIntersectionWithBoundingVolume(i,r.clippingPlanesOriginMatrix);if(this._isClipped=a!==Intersect$1.INSIDE,a===Intersect$1.OUTSIDE)return Intersect$1.OUTSIDE}return t.computeVisibility(i)},Cesium3DTile.prototype.distanceToTile=function(e){return getBoundingVolume(this,e).distanceToCamera(e)};var scratchToTileCenter=new Cartesian3;Cesium3DTile.prototype.distanceToTileCenter=function(e){var t=getBoundingVolume(this,e).boundingVolume,i=Cartesian3.subtract(t.center,e.camera.positionWC,scratchToTileCenter);return Cartesian3.dot(e.camera.directionWC,i)},Cesium3DTile.prototype.insideViewerRequestVolume=function(e){var t=this._viewerRequestVolume;return!defined(t)||0===t.distanceToCamera(e)};var scratchMatrix$2=new Matrix3,scratchScale$6=new Cartesian3,scratchHalfAxes=new Matrix3,scratchCenter$3=new Cartesian3,scratchRectangle$2=new Rectangle,scratchOrientedBoundingBox=new OrientedBoundingBox,scratchTransform=new Matrix4;function createBox(e,t,i){var r=Cartesian3.fromElements(e[0],e[1],e[2],scratchCenter$3),n=Matrix3.fromArray(e,3,scratchHalfAxes),r=Matrix4.multiplyByPoint(t,r,r),a=Matrix4.getMatrix3(t,scratchMatrix$2),n=Matrix3.multiply(a,n,n);return defined(i)?(i.update(r,n),i):new TileOrientedBoundingBox(r,n)}function createBoxFromTransformedRegion(e,t,i,r){var n=Rectangle.unpack(e,0,scratchRectangle$2),a=e[4],o=e[5],s=OrientedBoundingBox.fromRectangle(n,a,o,Ellipsoid.WGS84,scratchOrientedBoundingBox),l=s.center,c=s.halfAxes;t=Matrix4.multiplyTransformation(t,Matrix4.inverseTransformation(i,scratchTransform),scratchTransform),l=Matrix4.multiplyByPoint(t,l,l);var u=Matrix4.getMatrix3(t,scratchMatrix$2),c=Matrix3.multiply(u,c,c);return defined(r)&&r instanceof TileOrientedBoundingBox?(r.update(l,c),r):new TileOrientedBoundingBox(l,c)}function createRegion(e,t,i,r){return Matrix4.equalsEpsilon(t,i,CesiumMath.EPSILON8)?defined(r)?r:new TileBoundingRegion({rectangle:Rectangle.unpack(e,0,scratchRectangle$2),minimumHeight:e[4],maximumHeight:e[5]}):createBoxFromTransformedRegion(e,t,i,r)}function createSphere(e,t,i){var r=Cartesian3.fromElements(e[0],e[1],e[2],scratchCenter$3),n=e[3],r=Matrix4.multiplyByPoint(t,r,r),a=Matrix4.getScale(t,scratchScale$6);return n*=Cartesian3.maximumComponent(a),defined(i)?(i.update(r,n),i):new TileBoundingSphere(r,n)}function applyDebugSettings(e,t,i,r){var n,a,o,s,l,c,u;r.isRender&&(n=defined(e._header.content)&&defined(e._header.content.boundingVolume),a=e.hasEmptyContent||e.hasTilesetContent,(o=t.debugShowBoundingVolume||t.debugShowContentBoundingVolume&&!n)?(s=e._finalResolution?a?Color.DARKGRAY:Color.WHITE:Color.YELLOW,defined(e._debugBoundingVolume)||(e._debugBoundingVolume=e._boundingVolume.createDebugVolume(s)),e._debugBoundingVolume.update(i),(l=e._debugBoundingVolume.getGeometryInstanceAttributes("outline")).color=ColorGeometryInstanceAttribute.toValue(s,l.color)):!o&&defined(e._debugBoundingVolume)&&(e._debugBoundingVolume=e._debugBoundingVolume.destroy()),t.debugShowContentBoundingVolume&&n?(defined(e._debugContentBoundingVolume)||(e._debugContentBoundingVolume=e._contentBoundingVolume.createDebugVolume(Color.BLUE)),e._debugContentBoundingVolume.update(i)):!t.debugShowContentBoundingVolume&&defined(e._debugContentBoundingVolume)&&(e._debugContentBoundingVolume=e._debugContentBoundingVolume.destroy()),t.debugShowViewerRequestVolume&&defined(e._viewerRequestVolume)?(defined(e._debugViewerRequestVolume)||(e._debugViewerRequestVolume=e._viewerRequestVolume.createDebugVolume(Color.YELLOW)),e._debugViewerRequestVolume.update(i)):!t.debugShowViewerRequestVolume&&defined(e._debugViewerRequestVolume)&&(e._debugViewerRequestVolume=e._debugViewerRequestVolume.destroy()),c=t.debugColorizeTiles&&!e._debugColorizeTiles||defined(t._heatmap.tilePropertyName),u=!t.debugColorizeTiles&&e._debugColorizeTiles,c?(t._heatmap.colorize(e,i),e._debugColorizeTiles=!0,e.color=e._debugColor):u&&(e._debugColorizeTiles=!1,e.color=Color.WHITE),e._colorDirty&&(e._colorDirty=!1,e._content.applyDebugSettings(!0,e._color)),u&&t.makeStyleDirty())}function updateContent(e,t,i){var r=e._content,n=e._expiredContent;if(defined(n)){if(!e.contentReady)return void n.update(t,i);e._expiredContent.destroy(),e._expiredContent=void 0}r.update(t,i)}function updateClippingPlanes$1(e,t){var i=t.clippingPlanes,r=0;defined(i)&&e._isClipped&&i.enabled&&(r=i.clippingPlanesState),r!==e._clippingPlanesState&&(e._clippingPlanesState=r,e.clippingPlanesDirty=!0)}Cesium3DTile.prototype.createBoundingVolume=function(e,t,i){if(!defined(e))throw new RuntimeError("boundingVolume must be defined");if(defined(e.box))return createBox(e.box,t,i);if(defined(e.region))return createRegion(e.region,t,this._initialTransform,i);if(defined(e.sphere))return createSphere(e.sphere,t,i);throw new RuntimeError("boundingVolume must contain a sphere, region, or box")},Cesium3DTile.prototype.updateTransform=function(e){e=defaultValue(e,Matrix4.IDENTITY);var t,i,r=Matrix4.multiply(e,this.transform,scratchTransform);Matrix4.equals(r,this.computedTransform)||(Matrix4.clone(r,this.computedTransform),t=this._header,i=this._header.content,this._boundingVolume=this.createBoundingVolume(t.boundingVolume,this.computedTransform,this._boundingVolume),defined(this._contentBoundingVolume)&&(this._contentBoundingVolume=this.createBoundingVolume(i.boundingVolume,this.computedTransform,this._contentBoundingVolume)),defined(this._viewerRequestVolume)&&(this._viewerRequestVolume=this.createBoundingVolume(t.viewerRequestVolume,this.computedTransform,this._viewerRequestVolume)),this.updateGeometricErrorScale(),this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy())},Cesium3DTile.prototype.updateGeometricErrorScale=function(){var e=Matrix4.getScale(this.computedTransform,scratchScale$6),t=Cartesian3.maximumComponent(e);this.geometricError=this._geometricError*t},Cesium3DTile.prototype.update=function(e,t,i){var r=t.commandList.length;updateClippingPlanes$1(this,e),applyDebugSettings(this,e,t,i),updateContent(this,e,t),this._commandsLength=t.commandList.length-r,this.clippingPlanesDirty=!1};var scratchCommandList=[];function isolateDigits(e,t,i){var r=e*Math.pow(10,t);return parseInt(r)*Math.pow(10,i)}function priorityNormalizeAndClamp(e,t,i){return Math.max(CesiumMath.normalize(e,t,i)-CesiumMath.EPSILON7,0)}Cesium3DTile.prototype.process=function(e,t){var i=t.commandList;t.commandList=scratchCommandList,this._content.update(e,t),scratchCommandList.length=0,t.commandList=i},Cesium3DTile.prototype.updatePriority=function(){var e=this.tileset,t=e.preferLeaves,i=e._minimumPriority,r=e._maximumPriority,n=Math.pow(10,8),a=Math.pow(10,9),o=Math.pow(10,10),s=priorityNormalizeAndClamp(this._depth,i.depth,r.depth),s=t?1-s:s,l=isolateDigits(!e._skipLevelOfDetail&&this.refine===Cesium3DTileRefine$1.REPLACE?priorityNormalizeAndClamp(this._priorityHolder._distanceToCamera,i.distance,r.distance):priorityNormalizeAndClamp(this._priorityReverseScreenSpaceError,i.reverseScreenSpaceError,r.reverseScreenSpaceError),4,0),c=this._priorityProgressiveResolution?0:n,u=isolateDigits(priorityNormalizeAndClamp(this._priorityHolder._foveatedFactor,i.foveatedFactor,r.foveatedFactor),4,4),d=this.priorityDeferred?a:0,h=e._pass===Cesium3DTilePass$1.PRELOAD_FLIGHT?0:o;this._priority=s+l+c+u+d+h},Cesium3DTile.prototype.isDestroyed=function(){return!1},Cesium3DTile.prototype.destroy=function(){return this._content=this._content&&this._content.destroy(),this._expiredContent=this._expiredContent&&!this._expiredContent.isDestroyed()&&this._expiredContent.destroy(),this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy(),destroyObject(this)};var Cesium3DTileOptimizations={},scratchAxis=new Cartesian3;function Cesium3DTilesetCache(){this._list=new DoublyLinkedList,this._sentinel=this._list.add(),this._trimTiles=!1}function Cesium3DTilesetHeatmap(e){this.tilePropertyName=e,this._minimum=Number.MAX_VALUE,this._maximum=-Number.MAX_VALUE,this._previousMinimum=Number.MAX_VALUE,this._previousMaximum=-Number.MAX_VALUE,this._referenceMinimum={},this._referenceMaximum={}}function getHeatmapValue(e,t){var i="_loadTimestamp"===t?JulianDate.toDate(e).getTime():e;return i}function getHeatmapValueAndUpdateMinimumMaximum(e,t){var i=e.tilePropertyName;if(defined(i)){var r=getHeatmapValue(t[i],i);return defined(r)?(e._maximum=Math.max(r,e._maximum),e._minimum=Math.min(r,e._minimum),r):(e.tilePropertyName=void 0,r)}}Cesium3DTileOptimizations.checkChildrenWithinParent=function(e){var t=e.children,i=t.length,r=e.boundingVolume;if(r instanceof TileOrientedBoundingBox||r instanceof TileBoundingRegion){var n=r._orientedBoundingBox;e._optimChildrenWithinParent=Cesium3DTileOptimizationHint$1.USE_OPTIMIZATION;for(var a=0;a<i;++a){var o=t[a].boundingVolume;if(!(o instanceof TileOrientedBoundingBox||o instanceof TileBoundingRegion)){e._optimChildrenWithinParent=Cesium3DTileOptimizationHint$1.SKIP_OPTIMIZATION;break}var s=o._orientedBoundingBox,l=Cartesian3.subtract(s.center,n.center,scratchAxis),c=Cartesian3.magnitude(l);if(Cartesian3.divideByScalar(l,c,l),Math.abs(n.halfAxes[0]*l.x)+Math.abs(n.halfAxes[1]*l.y)+Math.abs(n.halfAxes[2]*l.z)+Math.abs(n.halfAxes[3]*l.x)+Math.abs(n.halfAxes[4]*l.y)+Math.abs(n.halfAxes[5]*l.z)+Math.abs(n.halfAxes[6]*l.x)+Math.abs(n.halfAxes[7]*l.y)+Math.abs(n.halfAxes[8]*l.z)<=Math.abs(s.halfAxes[0]*l.x)+Math.abs(s.halfAxes[1]*l.y)+Math.abs(s.halfAxes[2]*l.z)+Math.abs(s.halfAxes[3]*l.x)+Math.abs(s.halfAxes[4]*l.y)+Math.abs(s.halfAxes[5]*l.z)+Math.abs(s.halfAxes[6]*l.x)+Math.abs(s.halfAxes[7]*l.y)+Math.abs(s.halfAxes[8]*l.z)+c){e._optimChildrenWithinParent=Cesium3DTileOptimizationHint$1.SKIP_OPTIMIZATION;break}}}return e._optimChildrenWithinParent===Cesium3DTileOptimizationHint$1.USE_OPTIMIZATION},Cesium3DTilesetCache.prototype.reset=function(){this._list.splice(this._list.tail,this._sentinel)},Cesium3DTilesetCache.prototype.touch=function(e){var t=e.cacheNode;defined(t)&&this._list.splice(this._sentinel,t)},Cesium3DTilesetCache.prototype.add=function(e){defined(e.cacheNode)||(e.cacheNode=this._list.add(e))},Cesium3DTilesetCache.prototype.unloadTile=function(e,t,i){var r=t.cacheNode;defined(r)&&(this._list.remove(r),t.cacheNode=void 0,i(e,t))},Cesium3DTilesetCache.prototype.unloadTiles=function(e,t){var i=this._trimTiles;this._trimTiles=!1;for(var r=this._list,n=1024*e.maximumMemoryUsage*1024,a=this._sentinel,o=r.head;o!==a&&(e.totalMemoryUsageInBytes>n||i);){var s=o.item,o=o.next;this.unloadTile(e,s,t)}},Cesium3DTilesetCache.prototype.trim=function(){this._trimTiles=!0},Cesium3DTilesetHeatmap.prototype.setReferenceMinimumMaximum=function(e,t,i){this._referenceMinimum[i]=getHeatmapValue(e,i),this._referenceMaximum[i]=getHeatmapValue(t,i)};var heatmapColors=[new Color(.1,.1,.1,1),new Color(.153,.278,.878,1),new Color(.827,.231,.49,1),new Color(.827,.188,.22,1),new Color(1,.592,.259,1),new Color(1,.843,0,1)];function Cesium3DTilesetStatistics(){this.selected=0,this.visited=0,this.numberOfCommands=0,this.numberOfAttemptedRequests=0,this.numberOfPendingRequests=0,this.numberOfTilesProcessing=0,this.numberOfTilesWithContentReady=0,this.numberOfTilesTotal=0,this.numberOfLoadedTilesTotal=0,this.numberOfFeaturesSelected=0,this.numberOfFeaturesLoaded=0,this.numberOfPointsSelected=0,this.numberOfPointsLoaded=0,this.numberOfTrianglesSelected=0,this.numberOfTilesStyled=0,this.numberOfFeaturesStyled=0,this.numberOfTilesCulledWithChildrenUnion=0,this.geometryByteLength=0,this.texturesByteLength=0,this.batchTableByteLength=0}function updatePointAndFeatureCounts(e,t,i,r){var n=t.innerContents,a=t.pointsLength,o=t.trianglesLength,s=t.featuresLength,l=t.geometryByteLength,c=t.texturesByteLength,u=t.batchTableByteLength;if(r?(e.numberOfFeaturesLoaded+=i?-s:s,e.numberOfPointsLoaded+=i?-a:a,e.geometryByteLength+=i?-l:l,e.texturesByteLength+=i?-c:c,e.batchTableByteLength+=i?-u:u):(e.numberOfFeaturesSelected+=i?-s:s,e.numberOfPointsSelected+=i?-a:a,e.numberOfTrianglesSelected+=i?-o:o),defined(n))for(var d=n.length,h=0;h<d;++h)updatePointAndFeatureCounts(e,n[h],i,r)}function Cesium3DTileStyleEngine(){this._style=void 0,this._styleDirty=!1,this._lastStyleTime=0}function Cesium3DTileset(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._url=void 0,this._basePath=void 0,this._root=void 0,this._asset=void 0,this._properties=void 0,this._geometricError=void 0,this._extensionsUsed=void 0,this._extensions=void 0,this._gltfUpAxis=void 0,this._cache=new Cesium3DTilesetCache,this._processingQueue=[],this._selectedTiles=[],this._emptyTiles=[],this._requestedTiles=[],this._selectedTilesToStyle=[],this._loadTimestamp=void 0,this._timeSinceLoad=0,this._updatedVisibilityFrame=0,this._updatedModelMatrixFrame=0,this._modelMatrixChanged=!1,this._previousModelMatrix=void 0,this._extras=void 0,this._credits=void 0,this._cullWithChildrenBounds=defaultValue(e.cullWithChildrenBounds,!0),this._allTilesAdditive=!0,this._hasMixedContent=!1,this._stencilClearCommand=void 0,this._backfaceCommands=new ManagedArray,this._maximumScreenSpaceError=defaultValue(e.maximumScreenSpaceError,16),this._maximumMemoryUsage=defaultValue(e.maximumMemoryUsage,512),this._styleEngine=new Cesium3DTileStyleEngine,this._modelMatrix=defined(e.modelMatrix)?Matrix4.clone(e.modelMatrix):Matrix4.clone(Matrix4.IDENTITY),this._statistics=new Cesium3DTilesetStatistics,this._statisticsLast=new Cesium3DTilesetStatistics,this._statisticsPerPass=new Array(Cesium3DTilePass$1.NUMBER_OF_PASSES);for(var t=0;t<Cesium3DTilePass$1.NUMBER_OF_PASSES;++t)this._statisticsPerPass[t]=new Cesium3DTilesetStatistics;this._requestedTilesInFlight=[],this._maximumPriority={foveatedFactor:-Number.MAX_VALUE,depth:-Number.MAX_VALUE,distance:-Number.MAX_VALUE,reverseScreenSpaceError:-Number.MAX_VALUE},this._minimumPriority={foveatedFactor:Number.MAX_VALUE,depth:Number.MAX_VALUE,distance:Number.MAX_VALUE,reverseScreenSpaceError:Number.MAX_VALUE},this._heatmap=new Cesium3DTilesetHeatmap(e.debugHeatmapTilePropertyName),this.cullRequestsWhileMoving=defaultValue(e.cullRequestsWhileMoving,!0),this._cullRequestsWhileMoving=!1,this.cullRequestsWhileMovingMultiplier=defaultValue(e.cullRequestsWhileMovingMultiplier,60),this.progressiveResolutionHeightFraction=CesiumMath.clamp(defaultValue(e.progressiveResolutionHeightFraction,.3),0,.5),this.preferLeaves=defaultValue(e.preferLeaves,!1),this._tilesLoaded=!1,this._initialTilesLoaded=!1,this._tileDebugLabels=void 0,this._readyPromise=when.defer(),this._classificationType=e.classificationType,this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.WGS84),this._initialClippingPlanesOriginMatrix=Matrix4.IDENTITY,this._clippingPlanesOriginMatrix=void 0,this._clippingPlanesOriginMatrixDirty=!0,this.preloadWhenHidden=defaultValue(e.preloadWhenHidden,!1),this.preloadFlightDestinations=defaultValue(e.preloadFlightDestinations,!0),this._pass=void 0,this.dynamicScreenSpaceError=defaultValue(e.dynamicScreenSpaceError,!1),this.foveatedScreenSpaceError=defaultValue(e.foveatedScreenSpaceError,!0),this._foveatedConeSize=defaultValue(e.foveatedConeSize,.1),this._foveatedMinimumScreenSpaceErrorRelaxation=defaultValue(e.foveatedMinimumScreenSpaceErrorRelaxation,0),this.foveatedInterpolationCallback=defaultValue(e.foveatedInterpolationCallback,CesiumMath.lerp),this.foveatedTimeDelay=defaultValue(e.foveatedTimeDelay,.2),this.dynamicScreenSpaceErrorDensity=.00278,this.dynamicScreenSpaceErrorFactor=4,this.dynamicScreenSpaceErrorHeightFalloff=.25,this._dynamicScreenSpaceErrorComputedDensity=0,this.shadows=defaultValue(e.shadows,ShadowMode$1.ENABLED),this.show=defaultValue(e.show,!0),this.colorBlendMode=Cesium3DTileColorBlendMode$1.HIGHLIGHT,this.colorBlendAmount=.5,this.pointCloudShading=new PointCloudShading(e.pointCloudShading),this._pointCloudEyeDomeLighting=new PointCloudEyeDomeLighting,this.loadProgress=new Event,this.allTilesLoaded=new Event,this.initialTilesLoaded=new Event,this.tileLoad=new Event,this.tileUnload=new Event,this.tileFailed=new Event,this.tileVisible=new Event,this.skipLevelOfDetail=defaultValue(e.skipLevelOfDetail,!1),this._skipLevelOfDetail=this.skipLevelOfDetail,this._disableSkipLevelOfDetail=!1,this.baseScreenSpaceError=defaultValue(e.baseScreenSpaceError,1024),this.skipScreenSpaceErrorFactor=defaultValue(e.skipScreenSpaceErrorFactor,16),this.skipLevels=defaultValue(e.skipLevels,1),this.immediatelyLoadDesiredLevelOfDetail=defaultValue(e.immediatelyLoadDesiredLevelOfDetail,!1),this.loadSiblings=defaultValue(e.loadSiblings,!1),this._clippingPlanes=void 0,this.clippingPlanes=e.clippingPlanes,this._imageBasedLightingFactor=new Cartesian2(1,1),Cartesian2.clone(e.imageBasedLightingFactor,this._imageBasedLightingFactor),this.lightColor=e.lightColor,this.luminanceAtZenith=defaultValue(e.luminanceAtZenith,.2),this.sphericalHarmonicCoefficients=e.sphericalHarmonicCoefficients,this.specularEnvironmentMaps=e.specularEnvironmentMaps,this.backFaceCulling=defaultValue(e.backFaceCulling,!0),this.debugFreezeFrame=defaultValue(e.debugFreezeFrame,!1),this.debugColorizeTiles=defaultValue(e.debugColorizeTiles,!1),this.debugWireframe=defaultValue(e.debugWireframe,!1),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.debugShowContentBoundingVolume=defaultValue(e.debugShowContentBoundingVolume,!1),this.debugShowViewerRequestVolume=defaultValue(e.debugShowViewerRequestVolume,!1),this._tileDebugLabels=void 0,this.debugPickedTileLabelOnly=!1,this.debugPickedTile=void 0,this.debugPickPosition=void 0,this.debugShowGeometricError=defaultValue(e.debugShowGeometricError,!1),this.debugShowRenderingStatistics=defaultValue(e.debugShowRenderingStatistics,!1),this.debugShowMemoryUsage=defaultValue(e.debugShowMemoryUsage,!1),this.debugShowUrl=defaultValue(e.debugShowUrl,!1);var u,d=this;when(e.url).then(function(e){var t;return u=Resource.createIfNeeded(e),d._credits=u.credits,"json"===u.extension?t=u.getBaseUri(!0):u.isDataUri&&(t=""),d._url=u.url,d._basePath=t,Cesium3DTileset.loadJson(u)}).then(function(e){d._root=d.loadTileset(u,e);var t=defined(e.asset.gltfUpAxis)?Axis$1.fromName(e.asset.gltfUpAxis):Axis$1.Y,i=e.asset;d._asset=i,d._properties=e.properties,d._geometricError=e.geometricError,d._extensionsUsed=e.extensionsUsed,d._extensions=e.extensions,d._gltfUpAxis=t,d._extras=e.extras;var r=i.extras;if(defined(r)&&defined(r.cesium)&&defined(r.cesium.credits)){var n=r.cesium.credits,a=d._credits;defined(a)||(a=[],d._credits=a);for(var o=0;o<n.length;++o){var s=n[o];a.push(new Credit(s.html,s.showOnScreen))}}var l=d._root.createBoundingVolume(e.root.boundingVolume,Matrix4.IDENTITY).boundingSphere.center,c=d._ellipsoid.cartesianToCartographic(l);defined(c)&&c.height>ApproximateTerrainHeights._defaultMinTerrainHeight&&(d._initialClippingPlanesOriginMatrix=Transforms.eastNorthUpToFixedFrame(l)),d._clippingPlanesOriginMatrix=Matrix4.clone(d._initialClippingPlanesOriginMatrix),d._readyPromise.resolve(d)}).otherwise(function(e){d._readyPromise.reject(e)})}Cesium3DTilesetHeatmap.prototype.colorize=function(e,t){var i,r,n,a,o,s,l,c,u,d,h;defined(this.tilePropertyName)&&e.contentAvailable&&e._selectedFrame===t.frameNumber&&(i=getHeatmapValueAndUpdateMinimumMaximum(this,e),r=this._previousMinimum,n=this._previousMaximum,r!==Number.MAX_VALUE&&n!==-Number.MAX_VALUE&&(a=n-r+CesiumMath.EPSILON7,o=CesiumMath.clamp(i-r,0,a)/a*(heatmapColors.length-1),s=Math.floor(o),l=Math.ceil(o),c=o-s,u=heatmapColors[s],d=heatmapColors[l],(h=Color.clone(Color.WHITE)).red=CesiumMath.lerp(u.red,d.red,c),h.green=CesiumMath.lerp(u.green,d.green,c),h.blue=CesiumMath.lerp(u.blue,d.blue,c),e._debugColor=h))},Cesium3DTilesetHeatmap.prototype.resetMinimumMaximum=function(){var e,t,i,r=this.tilePropertyName;defined(r)&&(e=this._referenceMinimum[r],t=this._referenceMaximum[r],i=defined(e)&&defined(t),this._previousMinimum=i?e:this._minimum,this._previousMaximum=i?t:this._maximum,this._minimum=Number.MAX_VALUE,this._maximum=-Number.MAX_VALUE)},Cesium3DTilesetStatistics.prototype.clear=function(){this.selected=0,this.visited=0,this.numberOfCommands=0,this.numberOfAttemptedRequests=0,this.numberOfFeaturesSelected=0,this.numberOfPointsSelected=0,this.numberOfTrianglesSelected=0,this.numberOfTilesStyled=0,this.numberOfFeaturesStyled=0,this.numberOfTilesCulledWithChildrenUnion=0},Cesium3DTilesetStatistics.prototype.incrementSelectionCounts=function(e){updatePointAndFeatureCounts(this,e,!1,!1)},Cesium3DTilesetStatistics.prototype.incrementLoadCounts=function(e){updatePointAndFeatureCounts(this,e,!1,!0)},Cesium3DTilesetStatistics.prototype.decrementLoadCounts=function(e){updatePointAndFeatureCounts(this,e,!0,!0)},Cesium3DTilesetStatistics.clone=function(e,t){t.selected=e.selected,t.visited=e.visited,t.numberOfCommands=e.numberOfCommands,t.selected=e.selected,t.numberOfAttemptedRequests=e.numberOfAttemptedRequests,t.numberOfPendingRequests=e.numberOfPendingRequests,t.numberOfTilesProcessing=e.numberOfTilesProcessing,t.numberOfTilesWithContentReady=e.numberOfTilesWithContentReady,t.numberOfTilesTotal=e.numberOfTilesTotal,t.numberOfFeaturesSelected=e.numberOfFeaturesSelected,t.numberOfFeaturesLoaded=e.numberOfFeaturesLoaded,t.numberOfPointsSelected=e.numberOfPointsSelected,t.numberOfPointsLoaded=e.numberOfPointsLoaded,t.numberOfTrianglesSelected=e.numberOfTrianglesSelected,t.numberOfTilesStyled=e.numberOfTilesStyled,t.numberOfFeaturesStyled=e.numberOfFeaturesStyled,t.numberOfTilesCulledWithChildrenUnion=e.numberOfTilesCulledWithChildrenUnion,t.geometryByteLength=e.geometryByteLength,t.texturesByteLength=e.texturesByteLength,t.batchTableByteLength=e.batchTableByteLength},Object.defineProperties(Cesium3DTileStyleEngine.prototype,{style:{get:function(){return this._style},set:function(e){this._style=e,this._styleDirty=!0}}}),Cesium3DTileStyleEngine.prototype.makeDirty=function(){this._styleDirty=!0},Cesium3DTileStyleEngine.prototype.applyStyle=function(e,t){if(e.ready&&(!defined(this._style)||this._style.ready)){var i=this._styleDirty;t.isRender&&(this._styleDirty=!1),i&&++this._lastStyleTime;for(var r=this._lastStyleTime,n=e._statistics,a=i?e._selectedTiles:e._selectedTilesToStyle,o=a.length,s=0;s<o;++s){var l,c=a[s];c.lastStyleTime!==r&&(l=c.content,c.lastStyleTime=r,l.applyStyle(this._style),n.numberOfFeaturesStyled+=l.featuresLength,++n.numberOfTilesStyled)}}},Object.defineProperties(Cesium3DTileset.prototype,{isCesium3DTileset:{get:function(){return!0}},asset:{get:function(){return this._asset}},extensions:{get:function(){return this._extensions}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){ClippingPlaneCollection.setOwner(e,this,"_clippingPlanes")}},properties:{get:function(){return this._properties}},ready:{get:function(){return defined(this._root)}},readyPromise:{get:function(){return this._readyPromise.promise}},tilesLoaded:{get:function(){return this._tilesLoaded}},url:{get:function(){return this._url}},basePath:{get:function(){return deprecationWarning("Cesium3DTileset.basePath","Cesium3DTileset.basePath has been deprecated. All tiles are relative to the url of the tileset JSON file that contains them. Use the url property instead."),this._basePath}},style:{get:function(){return this._styleEngine.style},set:function(e){this._styleEngine.style=e}},maximumScreenSpaceError:{get:function(){return this._maximumScreenSpaceError},set:function(e){this._maximumScreenSpaceError=e}},maximumMemoryUsage:{get:function(){return this._maximumMemoryUsage},set:function(e){this._maximumMemoryUsage=e}},root:{get:function(){return this._root}},boundingSphere:{get:function(){return this._root.updateTransform(this._modelMatrix),this._root.boundingSphere}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._modelMatrix=Matrix4.clone(e,this._modelMatrix)}},timeSinceLoad:{get:function(){return this._timeSinceLoad}},totalMemoryUsageInBytes:{get:function(){var e=this._statistics;return e.texturesByteLength+e.geometryByteLength+e.batchTableByteLength}},clippingPlanesOriginMatrix:{get:function(){return defined(this._clippingPlanesOriginMatrix)?(this._clippingPlanesOriginMatrixDirty&&(Matrix4.multiply(this.root.computedTransform,this._initialClippingPlanesOriginMatrix,this._clippingPlanesOriginMatrix),this._clippingPlanesOriginMatrixDirty=!1),this._clippingPlanesOriginMatrix):Matrix4.IDENTITY}},styleEngine:{get:function(){return this._styleEngine}},statistics:{get:function(){return this._statistics}},classificationType:{get:function(){return this._classificationType}},ellipsoid:{get:function(){return this._ellipsoid}},foveatedConeSize:{get:function(){return this._foveatedConeSize},set:function(e){this._foveatedConeSize=e}},foveatedMinimumScreenSpaceErrorRelaxation:{get:function(){return this._foveatedMinimumScreenSpaceErrorRelaxation},set:function(e){this._foveatedMinimumScreenSpaceErrorRelaxation=e}},extras:{get:function(){return this._extras}},imageBasedLightingFactor:{get:function(){return this._imageBasedLightingFactor},set:function(e){Cartesian2.clone(e,this._imageBasedLightingFactor)}}}),Cesium3DTileset.loadJson=function(e){return Resource.createIfNeeded(e).fetchJson()},Cesium3DTileset.prototype.makeStyleDirty=function(){this._styleEngine.makeDirty()},Cesium3DTileset.prototype.loadTileset=function(e,t,i){var r=t.asset;if(!defined(r))throw new RuntimeError("Tileset must have an asset property.");if("0.0"!==r.version&&"1.0"!==r.version)throw new RuntimeError("The tileset must be 3D Tiles version 0.0 or 1.0.");var n=this._statistics,a=r.tilesetVersion;defined(a)&&(this._basePath+="?v="+a,e.setQueryParameters({v:a}));var o=new Cesium3DTile(this,e,t.root,i);defined(i)&&(i.children.push(o),o._depth=i._depth+1);var s=[];for(s.push(o);0<s.length;){var l=s.pop();++n.numberOfTilesTotal,this._allTilesAdditive=this._allTilesAdditive&&l.refine===Cesium3DTileRefine$1.ADD;var c=l._header.children;if(defined(c))for(var u=c.length,d=0;d<u;++d){var h=new Cesium3DTile(this,e,c[d],l);l.children.push(h),h._depth=l._depth+1,s.push(h)}this._cullWithChildrenBounds&&Cesium3DTileOptimizations.checkChildrenWithinParent(l)}return o};var scratchPositionNormal=new Cartesian3,scratchCartographic$7=new Cartographic,scratchMatrix$3=new Matrix4,scratchCenter$4=new Cartesian3,scratchPosition$a=new Cartesian3,scratchDirection=new Cartesian3;function updateDynamicScreenSpaceError(e,t){var i,r,n,a,o,s,l,c,u,d,h,p,m,f=t.camera,g=e._root,_=g.contentBoundingVolume;_ instanceof TileBoundingRegion?(s=Cartesian3.normalize(f.positionWC,scratchPositionNormal),l=f.directionWC,c=f.positionCartographic.height,u=_.minimumHeight,d=_.maximumHeight):(i=Matrix4.inverseTransformation(g.computedTransform,scratchMatrix$3),r=t.mapProjection.ellipsoid,n=_.boundingVolume,a=Matrix4.multiplyByPoint(i,n.center,scratchCenter$4),Cartesian3.magnitude(a)>r.minimumRadius?(o=Cartographic.fromCartesian(a,r,scratchCartographic$7),s=Cartesian3.normalize(f.positionWC,scratchPositionNormal),l=f.directionWC,c=f.positionCartographic.height,u=0,d=2*o.height):(h=Matrix4.multiplyByPoint(i,f.positionWC,scratchPosition$a),s=Cartesian3.UNIT_Z,l=Matrix4.multiplyByPointAsVector(i,f.directionWC,scratchDirection),l=Cartesian3.normalize(l,l),c=h.z,_ instanceof TileOrientedBoundingBox?(p=g._header.boundingVolume.box[11],u=a.z-p,d=a.z+p):_ instanceof TileBoundingSphere&&(m=n.radius,u=a.z-m,d=a.z+m)));var y=u+(d-u)*e.dynamicScreenSpaceErrorHeightFalloff,v=CesiumMath.clamp((c-y)/(d-y),0,1),C=1-Math.abs(Cartesian3.dot(l,s));C*=1-v;var S=e.dynamicScreenSpaceErrorDensity;S*=C,e._dynamicScreenSpaceErrorComputedDensity=S}function requestContent(e,t){var i,r;t.hasEmptyContent||(i=e._statistics,r=t.contentExpired,t.requestContent()?(r&&(t.hasTilesetContent?destroySubtree(e,t):(i.decrementLoadCounts(t.content),--i.numberOfTilesWithContentReady)),++i.numberOfPendingRequests,e._requestedTilesInFlight.push(t),t.contentReadyToProcessPromise.then(addToProcessingQueue(e,t)),t.contentReadyPromise.then(handleTileSuccess(e,t)).otherwise(handleTileFailure(e,t))):++i.numberOfAttemptedRequests)}function sortRequestByPriority(e,t){return e._priority-t._priority}function cancelOutOfViewRequests(e,t){for(var i=e._requestedTilesInFlight,r=0,n=i.length,a=0;a<n;++a){var o=i[a],s=1<=t.frameNumber-o._touchedFrame;o._contentState===Cesium3DTileContentState$1.LOADING?s?(o._request.cancel(),++r):0<r&&(i[a-r]=o):++r}i.length-=r}function requestTiles(e,t){var i=e._requestedTiles,r=i.length;i.sort(sortRequestByPriority);for(var n=0;n<r;++n)requestContent(e,i[n])}function addToProcessingQueue(e,t){return function(){e._processingQueue.push(t),--e._statistics.numberOfPendingRequests,++e._statistics.numberOfTilesProcessing}}function handleTileFailure(r,n){return function(e){var t=n._contentResource.url,i=defined(e.message)?e.message:e.toString();0<r.tileFailed.numberOfListeners?r.tileFailed.raiseEvent({url:t,message:i}):(console.log("A 3D tile failed to load: "+t),console.log("Error: "+i))}}function handleTileSuccess(e,t){return function(){--e._statistics.numberOfTilesProcessing,t.hasTilesetContent||(e._statistics.incrementLoadCounts(t.content),++e._statistics.numberOfTilesWithContentReady,++e._statistics.numberOfLoadedTilesTotal,e._cache.add(t)),e.tileLoad.raiseEvent(t)}}function filterProcessingQueue(e){for(var t=e._processingQueue,i=t.length,r=0,n=0;n<i;++n){var a=t[n];a._contentState===Cesium3DTileContentState$1.PROCESSING?0<r&&(t[n-r]=a):++r}t.length-=r}function processTiles(e,t){filterProcessingQueue(e);for(var i=e._processingQueue,r=i.length,n=0;n<r;++n)i[n].process(e,t)}Cesium3DTileset.prototype.postPassesUpdate=function(e){this.ready&&(cancelOutOfViewRequests(this,e),raiseLoadProgressEvent(this,e),this._cache.unloadTiles(this,unloadTile))},Cesium3DTileset.prototype.prePassesUpdate=function(e){var t;this.ready&&(processTiles(this,e),t=this._clippingPlanes,this._clippingPlanesOriginMatrixDirty=!0,defined(t)&&t.enabled&&t.update(e),defined(this._loadTimestamp)||(this._loadTimestamp=JulianDate.clone(e.time)),this._timeSinceLoad=Math.max(1e3*JulianDate.secondsDifference(e.time,this._loadTimestamp),0),this._skipLevelOfDetail=this.skipLevelOfDetail&&!defined(this._classificationType)&&!this._disableSkipLevelOfDetail&&!this._allTilesAdditive,this.dynamicScreenSpaceError&&updateDynamicScreenSpaceError(this,e),e.newFrame&&this._cache.reset())};var scratchCartesian$5=new Cartesian3,stringOptions={maximumFractionDigits:3};function formatMemoryString(e){var t=e/1048576;return t<1?t.toLocaleString(void 0,stringOptions):Math.round(t).toLocaleString()}function computeTileLabelPosition(e){var t,i=e.boundingVolume.boundingVolume,r=i.halfAxes,n=i.radius,a=Cartesian3.clone(i.center,scratchCartesian$5);return defined(r)?(a.x+=.75*(r[0]+r[3]+r[6]),a.y+=.75*(r[1]+r[4]+r[7]),a.z+=.75*(r[2]+r[5]+r[8])):defined(n)&&(t=Cartesian3.normalize(i.center,scratchCartesian$5),t=Cartesian3.multiplyByScalar(t,.75*n,scratchCartesian$5),a=Cartesian3.add(t,i.center,scratchCartesian$5)),a}function addTileDebugLabel(e,t,i){var r="",n=0;t.debugShowGeometricError&&(r+="\nGeometric error: "+e.geometricError,n++),t.debugShowRenderingStatistics&&(r+="\nCommands: "+e.commandsLength,n++,0<e.content.pointsLength&&(r+="\nPoints: "+e.content.pointsLength,n++),0<e.content.trianglesLength&&(r+="\nTriangles: "+e.content.trianglesLength,n++),r+="\nFeatures: "+e.content.featuresLength,n++),t.debugShowMemoryUsage&&(r+="\nTexture Memory: "+formatMemoryString(e.content.texturesByteLength),r+="\nGeometry Memory: "+formatMemoryString(e.content.geometryByteLength),n+=2),t.debugShowUrl&&(r+="\nUrl: "+e._header.content.uri,n++);var a={text:r.substring(1),position:i,font:19-n+"px sans-serif",showBackground:!0,disableDepthTestDistance:Number.POSITIVE_INFINITY};return t._tileDebugLabels.add(a)}function updateTileDebugLabels(e,t){var i,r,n,a=e._selectedTiles,o=a.length,s=e._emptyTiles,l=s.length;if(e._tileDebugLabels.removeAll(),e.debugPickedTileLabelOnly){defined(e.debugPickedTile)&&(n=defined(e.debugPickPosition)?e.debugPickPosition:computeTileLabelPosition(e.debugPickedTile),addTileDebugLabel(e.debugPickedTile,e,n).pixelOffset=new Cartesian2(15,-15))}else{for(i=0;i<o;++i)addTileDebugLabel(r=a[i],e,computeTileLabelPosition(r));for(i=0;i<l;++i)(r=s[i]).hasTilesetContent&&addTileDebugLabel(r,e,computeTileLabelPosition(r))}e._tileDebugLabels.update(t)}function updateTiles(e,t,i){e._styleEngine.applyStyle(e,i);var r,n=i.isRender,a=e._statistics,o=t.commandList,s=o.length,l=e._selectedTiles,c=l.length,u=e._emptyTiles,d=u.length,h=e.tileVisible,p=e._skipLevelOfDetail&&e._hasMixedContent&&t.context.stencilBuffer&&0<c;e._backfaceCommands.length=0,p&&(defined(e._stencilClearCommand)||(e._stencilClearCommand=new ClearCommand({stencil:0,pass:Pass$1.CESIUM_3D_TILE,renderState:RenderState.fromCache({stencilMask:StencilConstants$1.SKIP_LOD_MASK})})),o.push(e._stencilClearCommand));for(var m=o.length,f=0;f<c;++f)r=l[f],n&&h.raiseEvent(r),r.update(e,t,i),a.incrementSelectionCounts(r.content),++a.selected;for(f=0;f<d;++f)(r=u[f]).update(e,t,i);var g=o.length-m;if(e._backfaceCommands.trim(),p){var _=e._backfaceCommands.values,y=_.length;for(o.length+=y,f=g-1;0<=f;--f)o[m+y+f]=o[m+f];for(f=0;f<y;++f)o[m+f]=_[f]}g=o.length-s,a.numberOfCommands=g,n&&e.pointCloudShading.attenuation&&e.pointCloudShading.eyeDomeLighting&&0<g&&e._pointCloudEyeDomeLighting.update(t,s,e.pointCloudShading,e.boundingSphere),n&&(e.debugShowGeometricError||e.debugShowRenderingStatistics||e.debugShowMemoryUsage||e.debugShowUrl?(defined(e._tileDebugLabels)||(e._tileDebugLabels=new LabelCollection),updateTileDebugLabels(e,t)):e._tileDebugLabels=e._tileDebugLabels&&e._tileDebugLabels.destroy())}var scratchStack$1=[];function destroySubtree(e,t){var i=t,r=scratchStack$1;for(r.push(t);0<r.length;){for(var n=(t=r.pop()).children,a=n.length,o=0;o<a;++o)r.push(n[o]);t!==i&&(destroyTile(e,t),--e._statistics.numberOfTilesTotal)}i.children=[]}function unloadTile(e,t){e.tileUnload.raiseEvent(t),e._statistics.decrementLoadCounts(t.content),--e._statistics.numberOfTilesWithContentReady,t.unloadContent()}function destroyTile(e,t){e._cache.unloadTile(e,t,unloadTile),t.destroy()}function raiseLoadProgressEvent(e,t){var i=e._statistics,r=e._statisticsLast,n=i.numberOfPendingRequests,a=i.numberOfTilesProcessing,o=r.numberOfPendingRequests,s=r.numberOfTilesProcessing;Cesium3DTilesetStatistics.clone(i,r);var l=n!==o||a!==s;l&&t.afterRender.push(function(){e.loadProgress.raiseEvent(n,a)}),e._tilesLoaded=0===i.numberOfPendingRequests&&0===i.numberOfTilesProcessing&&0===i.numberOfAttemptedRequests,l&&e._tilesLoaded&&(t.afterRender.push(function(){e.allTilesLoaded.raiseEvent()}),e._initialTilesLoaded||(e._initialTilesLoaded=!0,t.afterRender.push(function(){e.initialTilesLoaded.raiseEvent()})))}function resetMinimumMaximum(e){e._heatmap.resetMinimumMaximum(),e._minimumPriority.depth=Number.MAX_VALUE,e._maximumPriority.depth=-Number.MAX_VALUE,e._minimumPriority.foveatedFactor=Number.MAX_VALUE,e._maximumPriority.foveatedFactor=-Number.MAX_VALUE,e._minimumPriority.distance=Number.MAX_VALUE,e._maximumPriority.distance=-Number.MAX_VALUE,e._minimumPriority.reverseScreenSpaceError=Number.MAX_VALUE,e._maximumPriority.reverseScreenSpaceError=-Number.MAX_VALUE}function detectModelMatrixChanged(e,t){t.frameNumber===e._updatedModelMatrixFrame&&defined(e._previousModelMatrix)||(e._updatedModelMatrixFrame=t.frameNumber,e._modelMatrixChanged=!Matrix4.equals(e.modelMatrix,e._previousModelMatrix),e._previousModelMatrix=Matrix4.clone(e.modelMatrix,e._previousModelMatrix))}function update$4(e,t,i,r){if(t.mode===SceneMode$1.MORPHING)return!1;if(!e.ready)return!1;var n=e._statistics;n.clear();var a=r.isRender;++e._updatedVisibilityFrame,resetMinimumMaximum(e),detectModelMatrixChanged(e,t),e._cullRequestsWhileMoving=e.cullRequestsWhileMoving&&!e._modelMatrixChanged;var o=r.traversal.selectTiles(e,t);if(r.requestTiles&&requestTiles(e),updateTiles(e,t,r),Cesium3DTilesetStatistics.clone(n,i),a){var s=e._credits;if(defined(s)&&0!==n.selected)for(var l=s.length,c=0;c<l;++c)t.creditDisplay.addCredit(s[c])}return o}Cesium3DTileset.prototype.trimLoadedTiles=function(){this._cache.trim()},Cesium3DTileset.prototype.update=function(e){this.updateForPass(e,e.tilesetPassState)},Cesium3DTileset.prototype.updateForPass=function(e,t){var i,r,n,a,o,s,l,c,u=t.pass;u===Cesium3DTilePass$1.PRELOAD&&(!this.preloadWhenHidden||this.show)||!(u!==Cesium3DTilePass$1.PRELOAD_FLIGHT||this.preloadFlightDestinations&&(this.show||this.preloadWhenHidden))||u===Cesium3DTilePass$1.REQUEST_RENDER_MODE_DEFER_CHECK&&(!this._cullRequestsWhileMoving&&this.foveatedTimeDelay<=0||!this.show)||(i=e.commandList,r=e.camera,n=e.cullingVolume,t.ready=!1,o=(a=Cesium3DTilePass$1.getPassOptions(u)).ignoreCommands,l=(s=defaultValue(t.commandList,i)).length,e.commandList=s,e.camera=defaultValue(t.camera,r),e.cullingVolume=defaultValue(t.cullingVolume,n),c=this._statisticsPerPass[u],(this.show||o)&&(this._pass=u,t.ready=update$4(this,e,c,a)),o&&(s.length=l),e.commandList=i,e.camera=r,e.cullingVolume=n)},Cesium3DTileset.prototype.hasExtension=function(e){return!!defined(this._extensionsUsed)&&-1<this._extensionsUsed.indexOf(e)},Cesium3DTileset.prototype.isDestroyed=function(){return!1},Cesium3DTileset.prototype.destroy=function(){if(this._tileDebugLabels=this._tileDebugLabels&&this._tileDebugLabels.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),defined(this._root)){var e=scratchStack$1;for(e.push(this._root);0<e.length;){var t=e.pop();t.destroy();for(var i=t.children,r=i.length,n=0;n<r;++n)e.push(i[n])}}return this._root=void 0,destroyObject(this)};var modelMatrixScratch=new Matrix4;function Cesium3DTilesetVisualizer(e,t){t.collectionChanged.addEventListener(Cesium3DTilesetVisualizer.prototype._onCollectionChanged,this),this._scene=e,this._primitives=e.primitives,this._entityCollection=t,this._tilesetHash={},this._entitiesToVisualize=new AssociativeArray,this._onCollectionChanged(t,t.values,[],[])}function removeTileset(e,t,i,r){var n=i[t.id];defined(n)&&(r.removeAndDestroy(n.tilesetPrimitive),delete i[t.id])}function checkLoad(e,t,i){e.readyPromise.otherwise(function(e){console.error(e),i[t.id].loadFail=!0})}Cesium3DTilesetVisualizer.prototype.update=function(e){for(var t=this._entitiesToVisualize.values,i=this._tilesetHash,r=this._primitives,n=0,a=t.length;n<a;n++){var o,s,l,c=t[n],u=c._tileset,d=i[c.id],h=c.isShowing&&c.isAvailable(e)&&Property.getValueOrDefault(u._show,e,!0);h&&(s=c.computeModelMatrix(e,modelMatrixScratch),o=Resource.createIfNeeded(Property.getValueOrUndefined(u._uri,e))),h?(l=defined(d)?d.tilesetPrimitive:void 0,defined(l)&&o.url===d.url||(defined(l)&&(r.removeAndDestroy(l),delete i[c.id]),(l=new Cesium3DTileset({url:o})).id=c,r.add(l),d={tilesetPrimitive:l,url:o.url,loadFail:!1},i[c.id]=d,checkLoad(l,c,i)),l.show=!0,defined(s)&&(l.modelMatrix=s),l.maximumScreenSpaceError=Property.getValueOrDefault(u.maximumScreenSpaceError,e,l.maximumScreenSpaceError)):defined(d)&&(d.tilesetPrimitive.show=!1)}return!0},Cesium3DTilesetVisualizer.prototype.isDestroyed=function(){return!1},Cesium3DTilesetVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(Cesium3DTilesetVisualizer.prototype._onCollectionChanged,this);for(var e=this._entitiesToVisualize.values,t=this._tilesetHash,i=this._primitives,r=e.length-1;-1<r;r--)removeTileset(this,e[r],t,i);return destroyObject(this)},Cesium3DTilesetVisualizer.prototype.getBoundingSphere=function(e,t){var i=this._tilesetHash[e.id];if(!defined(i)||i.loadFail)return BoundingSphereState$1.FAILED;var r=i.tilesetPrimitive;return defined(r)&&r.show?r.ready?(BoundingSphere.clone(r.boundingSphere,t),BoundingSphereState$1.DONE):BoundingSphereState$1.PENDING:BoundingSphereState$1.FAILED},Cesium3DTilesetVisualizer.prototype._onCollectionChanged=function(e,t,i,r){for(var n,a=this._entitiesToVisualize,o=this._tilesetHash,s=this._primitives,l=t.length-1;-1<l;l--)defined((n=t[l])._tileset)&&a.set(n.id,n);for(l=r.length-1;-1<l;l--)defined((n=r[l])._tileset)?a.set(n.id,n):(removeTileset(this,n,o,s),a.remove(n.id));for(l=i.length-1;-1<l;l--)removeTileset(this,n=i[l],o,s),a.remove(n.id)};var defaultEvenColor=Color.WHITE,defaultOddColor=Color.BLACK,defaultRepeat$1=new Cartesian2(2,2);function CheckerboardMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._evenColor=void 0,this._evenColorSubscription=void 0,this._oddColor=void 0,this._oddColorSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this.evenColor=e.evenColor,this.oddColor=e.oddColor,this.repeat=e.repeat}Object.defineProperties(CheckerboardMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._evenColor)&&Property.isConstant(this._oddColor)&&Property.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},evenColor:createPropertyDescriptor("evenColor"),oddColor:createPropertyDescriptor("oddColor"),repeat:createPropertyDescriptor("repeat")}),CheckerboardMaterialProperty.prototype.getType=function(e){return"Checkerboard"},CheckerboardMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.lightColor=Property.getValueOrClonedDefault(this._evenColor,e,defaultEvenColor,t.lightColor),t.darkColor=Property.getValueOrClonedDefault(this._oddColor,e,defaultOddColor,t.darkColor),t.repeat=Property.getValueOrDefault(this._repeat,e,defaultRepeat$1),t},CheckerboardMaterialProperty.prototype.equals=function(e){return this===e||e instanceof CheckerboardMaterialProperty&&Property.equals(this._evenColor,e._evenColor)&&Property.equals(this._oddColor,e._oddColor)&&Property.equals(this._repeat,e._repeat)};var entityOptionsScratch={id:void 0};function fireChangedEvent(e){if(e._firing)e._refire=!0;else if(0===e._suspendCount){var t=e._addedEntities,i=e._removedEntities,r=e._changedEntities;if(0!==r.length||0!==t.length||0!==i.length){e._firing=!0;do{e._refire=!1;var n=t.values.slice(0),a=i.values.slice(0),o=r.values.slice(0);t.removeAll(),i.removeAll(),r.removeAll(),e._collectionChanged.raiseEvent(e,n,a,o)}while(e._refire);e._firing=!1}}}function EntityCollection(e){this._owner=e,this._entities=new AssociativeArray,this._addedEntities=new AssociativeArray,this._removedEntities=new AssociativeArray,this._changedEntities=new AssociativeArray,this._suspendCount=0,this._collectionChanged=new Event,this._id=createGuid(),this._show=!0,this._firing=!1,this._refire=!1}EntityCollection.prototype.suspendEvents=function(){this._suspendCount++},EntityCollection.prototype.resumeEvents=function(){this._suspendCount--,fireChangedEvent(this)},EntityCollection.collectionChangedEventCallback=void 0,Object.defineProperties(EntityCollection.prototype,{collectionChanged:{get:function(){return this._collectionChanged}},id:{get:function(){return this._id}},values:{get:function(){return this._entities.values}},show:{get:function(){return this._show},set:function(e){if(e!==this._show){this.suspendEvents();for(var t=[],i=this._entities.values,r=i.length,n=0;n<r;n++)t.push(i[n].isShowing);for(this._show=e,n=0;n<r;n++){var a=t[n],o=i[n];a!==o.isShowing&&o.definitionChanged.raiseEvent(o,"isShowing",o.isShowing,a)}this.resumeEvents()}}},owner:{get:function(){return this._owner}}}),EntityCollection.prototype.computeAvailability=function(){for(var e=Iso8601.MAXIMUM_VALUE,t=Iso8601.MINIMUM_VALUE,i=this._entities.values,r=0,n=i.length;r<n;r++){var a,o,s=i[r].availability;defined(s)&&(a=s.start,o=s.stop,JulianDate.lessThan(a,e)&&!a.equals(Iso8601.MINIMUM_VALUE)&&(e=a),JulianDate.greaterThan(o,t)&&!o.equals(Iso8601.MAXIMUM_VALUE)&&(t=o))}return Iso8601.MAXIMUM_VALUE.equals(e)&&(e=Iso8601.MINIMUM_VALUE),Iso8601.MINIMUM_VALUE.equals(t)&&(t=Iso8601.MAXIMUM_VALUE),new TimeInterval({start:e,stop:t})},EntityCollection.prototype.add=function(e){e instanceof Entity||(e=new Entity(e));var t=e.id,i=this._entities;if(i.contains(t))throw new RuntimeError("An entity with id "+t+" already exists in this collection.");return e.entityCollection=this,i.set(t,e),this._removedEntities.remove(t)||this._addedEntities.set(t,e),e.definitionChanged.addEventListener(EntityCollection.prototype._onEntityDefinitionChanged,this),fireChangedEvent(this),e},EntityCollection.prototype.remove=function(e){return!!defined(e)&&this.removeById(e.id)},EntityCollection.prototype.contains=function(e){return this._entities.get(e.id)===e},EntityCollection.prototype.removeById=function(e){if(!defined(e))return!1;var t=this._entities.get(e);return!!this._entities.remove(e)&&(this._addedEntities.remove(e)||(this._removedEntities.set(e,t),this._changedEntities.remove(e)),this._entities.remove(e),t.definitionChanged.removeEventListener(EntityCollection.prototype._onEntityDefinitionChanged,this),fireChangedEvent(this),!0)},EntityCollection.prototype.removeAll=function(){for(var e=this._entities,t=e.length,i=e.values,r=this._addedEntities,n=this._removedEntities,a=0;a<t;a++){var o=i[a],s=o.id;defined(r.get(s))||(o.definitionChanged.removeEventListener(EntityCollection.prototype._onEntityDefinitionChanged,this),n.set(s,o))}e.removeAll(),r.removeAll(),this._changedEntities.removeAll(),fireChangedEvent(this)},EntityCollection.prototype.getById=function(e){return this._entities.get(e)},EntityCollection.prototype.getOrCreateEntity=function(e){var t=this._entities.get(e);return defined(t)||(entityOptionsScratch.id=e,t=new Entity(entityOptionsScratch),this.add(t)),t},EntityCollection.prototype._onEntityDefinitionChanged=function(e){var t=e.id;this._addedEntities.contains(t)||this._changedEntities.set(t,e),fireChangedEvent(this)};var entityOptionsScratch$1={id:void 0},entityIdScratch=new Array(2);function clean(e){for(var t=e.propertyNames,i=t.length,r=0;r<i;r++)e[t[r]]=void 0;e._name=void 0,e._availability=void 0}function subscribeToEntity(e,t,i,r){entityIdScratch[0]=i,entityIdScratch[1]=r.id,t[JSON.stringify(entityIdScratch)]=r.definitionChanged.addEventListener(CompositeEntityCollection.prototype._onDefinitionChanged,e)}function unsubscribeFromEntity(e,t,i,r){entityIdScratch[0]=i,entityIdScratch[1]=r.id;var n=JSON.stringify(entityIdScratch);t[n](),t[n]=void 0}function recomposite(e){if(e._shouldRecomposite=!0,0===e._suspendCount){for(var t,i,r,n,a,o=e._collections,s=o.length,l=e._collectionsCopy,c=l.length,u=e._composite,d=new EntityCollection(e),h=e._eventHash,p=0;p<c;p++)for((n=l[p]).collectionChanged.removeEventListener(CompositeEntityCollection.prototype._onCollectionChanged,e),i=n.values,a=n.id,r=i.length-1;-1<r;r--)unsubscribeFromEntity(e,h,a,t=i[r]);for(p=s-1;0<=p;p--)for((n=o[p]).collectionChanged.addEventListener(CompositeEntityCollection.prototype._onCollectionChanged,e),i=n.values,a=n.id,r=i.length-1;-1<r;r--){subscribeToEntity(e,h,a,t=i[r]);var m=d.getById(t.id);defined(m)||(defined(m=u.getById(t.id))?clean(m):(entityOptionsScratch$1.id=t.id,m=new Entity(entityOptionsScratch$1)),d.add(m)),m.merge(t)}e._collectionsCopy=o.slice(0),u.suspendEvents(),u.removeAll();var f=d.values;for(p=0;p<f.length;p++)u.add(f[p]);u.resumeEvents()}}function CompositeEntityCollection(e,t){this._owner=t,this._composite=new EntityCollection(this),this._suspendCount=0,this._collections=defined(e)?e.slice():[],this._collectionsCopy=[],this._id=createGuid(),this._eventHash={},recomposite(this),this._shouldRecomposite=!1}function getCollectionIndex(e,t){return e.indexOf(t)}function swapCollections(e,t,i){var r,n=e._collections;(t=CesiumMath.clamp(t,0,n.length-1))!==(i=CesiumMath.clamp(i,0,n.length-1))&&(r=n[t],n[t]=n[i],n[i]=r,recomposite(e))}function subscribeAll(e,t,i,r){function n(){i.raiseEvent(e)}var a=[];t.removeAll();for(var o=r.length,s=0;s<o;s++){var l=r.get(s);defined(l.data)&&-1===a.indexOf(l.data)&&t.add(l.data.definitionChanged,n)}}function CompositeProperty(){this._eventHelper=new EventHelper,this._definitionChanged=new Event,this._intervals=new TimeIntervalCollection,this._intervals.changedEvent.addEventListener(CompositeProperty.prototype._intervalsChanged,this)}function CompositeMaterialProperty(){this._definitionChanged=new Event,this._composite=new CompositeProperty,this._composite.definitionChanged.addEventListener(CompositeMaterialProperty.prototype._raiseDefinitionChanged,this)}function CompositePositionProperty(e){this._referenceFrame=defaultValue(e,ReferenceFrame$1.FIXED),this._definitionChanged=new Event,this._composite=new CompositeProperty,this._composite.definitionChanged.addEventListener(CompositePositionProperty.prototype._raiseDefinitionChanged,this)}Object.defineProperties(CompositeEntityCollection.prototype,{collectionChanged:{get:function(){return this._composite._collectionChanged}},id:{get:function(){return this._id}},values:{get:function(){return this._composite.values}},owner:{get:function(){return this._owner}}}),CompositeEntityCollection.prototype.addCollection=function(e,t){defined(t)?this._collections.splice(t,0,e):(t=this._collections.length,this._collections.push(e)),recomposite(this)},CompositeEntityCollection.prototype.removeCollection=function(e){var t=this._collections.indexOf(e);return-1!==t&&(this._collections.splice(t,1),recomposite(this),!0)},CompositeEntityCollection.prototype.removeAllCollections=function(){this._collections.length=0,recomposite(this)},CompositeEntityCollection.prototype.containsCollection=function(e){return-1!==this._collections.indexOf(e)},CompositeEntityCollection.prototype.contains=function(e){return this._composite.contains(e)},CompositeEntityCollection.prototype.indexOfCollection=function(e){return this._collections.indexOf(e)},CompositeEntityCollection.prototype.getCollection=function(e){return this._collections[e]},CompositeEntityCollection.prototype.getCollectionsLength=function(){return this._collections.length},CompositeEntityCollection.prototype.raiseCollection=function(e){var t=getCollectionIndex(this._collections,e);swapCollections(this,t,t+1)},CompositeEntityCollection.prototype.lowerCollection=function(e){var t=getCollectionIndex(this._collections,e);swapCollections(this,t,t-1)},CompositeEntityCollection.prototype.raiseCollectionToTop=function(e){var t=getCollectionIndex(this._collections,e);t!==this._collections.length-1&&(this._collections.splice(t,1),this._collections.push(e),recomposite(this))},CompositeEntityCollection.prototype.lowerCollectionToBottom=function(e){var t=getCollectionIndex(this._collections,e);0!==t&&(this._collections.splice(t,1),this._collections.splice(0,0,e),recomposite(this))},CompositeEntityCollection.prototype.suspendEvents=function(){this._suspendCount++,this._composite.suspendEvents()},CompositeEntityCollection.prototype.resumeEvents=function(){this._suspendCount--,this._shouldRecomposite&&0===this._suspendCount&&(recomposite(this),this._shouldRecomposite=!1),this._composite.resumeEvents()},CompositeEntityCollection.prototype.computeAvailability=function(){return this._composite.computeAvailability()},CompositeEntityCollection.prototype.getById=function(e){return this._composite.getById(e)},CompositeEntityCollection.prototype._onCollectionChanged=function(e,t,i){var r,n,a=this._collectionsCopy,o=a.length,s=this._composite;s.suspendEvents();for(var l=i.length,c=this._eventHash,u=e.id,d=0;d<l;d++){var h=i[d];unsubscribeFromEntity(this,c,u,h);for(var p=h.id,m=o-1;0<=m;m--)defined(r=a[m].getById(p))&&(defined(n)||clean(n=s.getById(p)),n.merge(r));defined(n)||s.removeById(p),n=void 0}var f=t.length;for(d=0;d<f;d++){var g=t[d];subscribeToEntity(this,c,u,g);var _=g.id;for(m=o-1;0<=m;m--)defined(r=a[m].getById(_))&&(defined(n)||(defined(n=s.getById(_))?clean(n):(entityOptionsScratch$1.id=_,n=new Entity(entityOptionsScratch$1),s.add(n))),n.merge(r));n=void 0}s.resumeEvents()},CompositeEntityCollection.prototype._onDefinitionChanged=function(e,t,i,r){for(var n=this._collections,a=this._composite,o=n.length,s=e.id,l=a.getById(s),c=l[t],u=!defined(c),d=!0,h=o-1;0<=h;h--){var p=n[h].getById(e.id);if(defined(p)){var m=p[t];if(defined(m)){if(d){if(d=!1,!defined(m.merge)||!defined(m.clone)){c=m;break}c=m.clone(c)}c.merge(m)}}}u&&-1===l.propertyNames.indexOf(t)&&l.addProperty(t),l[t]=c},Object.defineProperties(CompositeProperty.prototype,{isConstant:{get:function(){return this._intervals.isEmpty}},definitionChanged:{get:function(){return this._definitionChanged}},intervals:{get:function(){return this._intervals}}}),CompositeProperty.prototype.getValue=function(e,t){var i=this._intervals.findDataForIntervalContainingDate(e);if(defined(i))return i.getValue(e,t)},CompositeProperty.prototype.equals=function(e){return this===e||e instanceof CompositeProperty&&this._intervals.equals(e._intervals,Property.equals)},CompositeProperty.prototype._intervalsChanged=function(){subscribeAll(this,this._eventHelper,this._definitionChanged,this._intervals),this._definitionChanged.raiseEvent(this)},Object.defineProperties(CompositeMaterialProperty.prototype,{isConstant:{get:function(){return this._composite.isConstant}},definitionChanged:{get:function(){return this._definitionChanged}},intervals:{get:function(){return this._composite._intervals}}}),CompositeMaterialProperty.prototype.getType=function(e){var t=this._composite._intervals.findDataForIntervalContainingDate(e);if(defined(t))return t.getType(e)},CompositeMaterialProperty.prototype.getValue=function(e,t){var i=this._composite._intervals.findDataForIntervalContainingDate(e);if(defined(i))return i.getValue(e,t)},CompositeMaterialProperty.prototype.equals=function(e){return this===e||e instanceof CompositeMaterialProperty&&this._composite.equals(e._composite,Property.equals)},CompositeMaterialProperty.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)},Object.defineProperties(CompositePositionProperty.prototype,{isConstant:{get:function(){return this._composite.isConstant}},definitionChanged:{get:function(){return this._definitionChanged}},intervals:{get:function(){return this._composite.intervals}},referenceFrame:{get:function(){return this._referenceFrame},set:function(e){this._referenceFrame=e}}}),CompositePositionProperty.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,ReferenceFrame$1.FIXED,t)},CompositePositionProperty.prototype.getValueInReferenceFrame=function(e,t,i){var r=this._composite._intervals.findDataForIntervalContainingDate(e);if(defined(r))return r.getValueInReferenceFrame(e,t,i)},CompositePositionProperty.prototype.equals=function(e){return this===e||e instanceof CompositePositionProperty&&this._referenceFrame===e._referenceFrame&&this._composite.equals(e._composite,Property.equals)},CompositePositionProperty.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)};var defaultZIndex=new ConstantProperty(0);function GroundGeometryUpdater(e){GeometryUpdater.call(this,e),this._zIndex=0,this._terrainOffsetProperty=void 0}defined(Object.create)&&(GroundGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),GroundGeometryUpdater.prototype.constructor=GroundGeometryUpdater),Object.defineProperties(GroundGeometryUpdater.prototype,{zIndex:{get:function(){return this._zIndex}},terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}}),GroundGeometryUpdater.prototype._isOnTerrain=function(e,t){return this._fillEnabled&&!defined(t.height)&&!defined(t.extrudedHeight)&&GroundPrimitive.isSupported(this._scene)},GroundGeometryUpdater.prototype._getIsClosed=function(e){var t=e.height,i=e.extrudedHeight;return 0===t||defined(i)&&i!==t},GroundGeometryUpdater.prototype._computeCenter=DeveloperError.throwInstantiationError,GroundGeometryUpdater.prototype._onEntityPropertyChanged=function(e,t,i,r){var n,a,o,s;GeometryUpdater.prototype._onEntityPropertyChanged.call(this,e,t,i,r),-1===this._observedPropertyNames.indexOf(t)||defined(n=this._entity[this._geometryPropertyName])&&(defined(n.zIndex)&&(defined(n.height)||defined(n.extrudedHeight))&&oneTimeWarning(oneTimeWarning.geometryZIndex),this._zIndex=defaultValue(n.zIndex,defaultZIndex),defined(this._terrainOffsetProperty)&&(this._terrainOffsetProperty.destroy(),this._terrainOffsetProperty=void 0),a=n.heightReference,o=n.extrudedHeightReference,(defined(a)||defined(o))&&(s=new CallbackProperty(this._computeCenter.bind(this),!this._dynamic),this._terrainOffsetProperty=new TerrainOffsetProperty(this._scene,s,a,o)))},GroundGeometryUpdater.prototype.destroy=function(){defined(this._terrainOffsetProperty)&&(this._terrainOffsetProperty.destroy(),this._terrainOffsetProperty=void 0),GeometryUpdater.prototype.destroy.call(this)},GroundGeometryUpdater.getGeometryHeight=function(e,t){if(defined(e))return t!==HeightReference$1.CLAMP_TO_GROUND?e:0;t!==HeightReference$1.NONE&&oneTimeWarning(oneTimeWarning.geometryHeightReference)},GroundGeometryUpdater.getGeometryExtrudedHeight=function(e,t){if(defined(e))return t!==HeightReference$1.CLAMP_TO_GROUND?e:GroundGeometryUpdater.CLAMP_TO_GROUND;t!==HeightReference$1.NONE&&oneTimeWarning(oneTimeWarning.geometryExtrudedHeightReference)},GroundGeometryUpdater.CLAMP_TO_GROUND="clamp",GroundGeometryUpdater.computeGeometryOffsetAttribute=function(e,t,i,r){defined(e)&&defined(t)||(t=HeightReference$1.NONE),defined(i)&&defined(r)||(r=HeightReference$1.NONE);var n=0;return t!==HeightReference$1.NONE&&n++,r===HeightReference$1.RELATIVE_TO_GROUND&&n++,2===n?GeometryOffsetAttribute$1.ALL:1===n?GeometryOffsetAttribute$1.TOP:void 0};var scratchColor$9=new Color,defaultOffset$1=Cartesian3.ZERO,offsetScratch$4=new Cartesian3,scratchRectangle$3=new Rectangle;function CorridorGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.positions=void 0,this.width=void 0,this.cornerType=void 0,this.height=void 0,this.extrudedHeight=void 0,this.granularity=void 0,this.offsetAttribute=void 0}function CorridorGeometryUpdater(e,t){GroundGeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new CorridorGeometryOptions(e),geometryPropertyName:"corridor",observedPropertyNames:["availability","corridor"]}),this._onEntityPropertyChanged(e,"corridor",e.corridor,void 0)}function DynamicCorridorGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}function DataSource(){DeveloperError.throwInstantiationError()}function PointPrimitive(e,t){var i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).translucencyByDistance,r=e.scaleByDistance,n=e.distanceDisplayCondition;defined(i)&&(i=NearFarScalar.clone(i)),defined(r)&&(r=NearFarScalar.clone(r)),defined(n)&&(n=DistanceDisplayCondition.clone(n)),this._show=defaultValue(e.show,!0),this._position=Cartesian3.clone(defaultValue(e.position,Cartesian3.ZERO)),this._actualPosition=Cartesian3.clone(this._position),this._color=Color.clone(defaultValue(e.color,Color.WHITE)),this._outlineColor=Color.clone(defaultValue(e.outlineColor,Color.TRANSPARENT)),this._outlineWidth=defaultValue(e.outlineWidth,0),this._pixelSize=defaultValue(e.pixelSize,10),this._scaleByDistance=r,this._translucencyByDistance=i,this._distanceDisplayCondition=n,this._disableDepthTestDistance=defaultValue(e.disableDepthTestDistance,0),this._id=e.id,this._collection=defaultValue(e.collection,t),this._clusterShow=!0,this._pickId=void 0,this._pointPrimitiveCollection=t,this._dirty=!1,this._index=-1}defined(Object.create)&&(CorridorGeometryUpdater.prototype=Object.create(GroundGeometryUpdater.prototype),CorridorGeometryUpdater.prototype.constructor=CorridorGeometryUpdater),CorridorGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n={show:new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(e)),offset:void 0,color:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$9)),defined(t)||(t=Color.WHITE),n.color=ColorGeometryInstanceAttribute.fromColor(t)),defined(this._options.offsetAttribute)&&(n.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$1,offsetScratch$4))),new GeometryInstance({id:i,geometry:new CorridorGeometry(this._options),attributes:n})},CorridorGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$9),n={show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(e)),offset:void 0};return defined(this._options.offsetAttribute)&&(n.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$1,offsetScratch$4))),new GeometryInstance({id:t,geometry:new CorridorOutlineGeometry(this._options),attributes:n})},CorridorGeometryUpdater.prototype._computeCenter=function(e,t){var i=Property.getValueOrUndefined(this._entity.corridor.positions,e);if(defined(i)&&0!==i.length)return Cartesian3.clone(i[Math.floor(i.length/2)],t)},CorridorGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.positions)||!defined(t.width)||GeometryUpdater.prototype._isHidden.call(this,e,t)},CorridorGeometryUpdater.prototype._isDynamic=function(e,t){return!t.positions.isConstant||!Property.isConstant(t.height)||!Property.isConstant(t.extrudedHeight)||!Property.isConstant(t.granularity)||!Property.isConstant(t.width)||!Property.isConstant(t.outlineWidth)||!Property.isConstant(t.cornerType)||!Property.isConstant(t.zIndex)||this._onTerrain&&!Property.isConstant(this._materialProperty)&&!(this._materialProperty instanceof ColorMaterialProperty)},CorridorGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=Property.getValueOrUndefined(t.height,Iso8601.MINIMUM_VALUE),r=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),n=Property.getValueOrUndefined(t.extrudedHeight,Iso8601.MINIMUM_VALUE),a=Property.getValueOrDefault(t.extrudedHeightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE);defined(n)&&!defined(i)&&(i=0);var o=this._options;o.vertexFormat=this._materialProperty instanceof ColorMaterialProperty?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,o.positions=t.positions.getValue(Iso8601.MINIMUM_VALUE,o.positions),o.width=t.width.getValue(Iso8601.MINIMUM_VALUE),o.granularity=Property.getValueOrUndefined(t.granularity,Iso8601.MINIMUM_VALUE),o.cornerType=Property.getValueOrUndefined(t.cornerType,Iso8601.MINIMUM_VALUE),o.offsetAttribute=GroundGeometryUpdater.computeGeometryOffsetAttribute(i,r,n,a),o.height=GroundGeometryUpdater.getGeometryHeight(i,r),(n=GroundGeometryUpdater.getGeometryExtrudedHeight(n,a))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(n=ApproximateTerrainHeights.getMinimumMaximumHeights(CorridorGeometry.computeRectangle(o,scratchRectangle$3)).minimumTerrainHeight),o.extrudedHeight=n},CorridorGeometryUpdater.DynamicGeometryUpdater=DynamicCorridorGeometryUpdater,defined(Object.create)&&(DynamicCorridorGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicCorridorGeometryUpdater.prototype.constructor=DynamicCorridorGeometryUpdater),DynamicCorridorGeometryUpdater.prototype._isHidden=function(e,t,i){var r=this._options;return!defined(r.positions)||!defined(r.width)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicCorridorGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options,n=Property.getValueOrUndefined(t.height,i),a=Property.getValueOrDefault(t.heightReference,i,HeightReference$1.NONE),o=Property.getValueOrUndefined(t.extrudedHeight,i),s=Property.getValueOrDefault(t.extrudedHeightReference,i,HeightReference$1.NONE);defined(o)&&!defined(n)&&(n=0),r.positions=Property.getValueOrUndefined(t.positions,i),r.width=Property.getValueOrUndefined(t.width,i),r.granularity=Property.getValueOrUndefined(t.granularity,i),r.cornerType=Property.getValueOrUndefined(t.cornerType,i),r.offsetAttribute=GroundGeometryUpdater.computeGeometryOffsetAttribute(n,a,o,s),r.height=GroundGeometryUpdater.getGeometryHeight(n,a),(o=GroundGeometryUpdater.getGeometryExtrudedHeight(o,s))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(o=ApproximateTerrainHeights.getMinimumMaximumHeights(CorridorGeometry.computeRectangle(r,scratchRectangle$3)).minimumTerrainHeight),r.extrudedHeight=o},Object.defineProperties(DataSource.prototype,{name:{get:DeveloperError.throwInstantiationError},clock:{get:DeveloperError.throwInstantiationError},entities:{get:DeveloperError.throwInstantiationError},isLoading:{get:DeveloperError.throwInstantiationError},changedEvent:{get:DeveloperError.throwInstantiationError},errorEvent:{get:DeveloperError.throwInstantiationError},loadingEvent:{get:DeveloperError.throwInstantiationError},show:{get:DeveloperError.throwInstantiationError},clustering:{get:DeveloperError.throwInstantiationError}}),DataSource.prototype.update=function(e){DeveloperError.throwInstantiationError()},DataSource.setLoading=function(e,t){e._isLoading!==t&&(t?e._entityCollection.suspendEvents():e._entityCollection.resumeEvents(),e._isLoading=t,e._loading.raiseEvent(e,t))};var SHOW_INDEX$4=PointPrimitive.SHOW_INDEX=0,POSITION_INDEX$4=PointPrimitive.POSITION_INDEX=1,COLOR_INDEX$2=PointPrimitive.COLOR_INDEX=2,OUTLINE_COLOR_INDEX=PointPrimitive.OUTLINE_COLOR_INDEX=3,OUTLINE_WIDTH_INDEX=PointPrimitive.OUTLINE_WIDTH_INDEX=4,PIXEL_SIZE_INDEX=PointPrimitive.PIXEL_SIZE_INDEX=5,SCALE_BY_DISTANCE_INDEX$2=PointPrimitive.SCALE_BY_DISTANCE_INDEX=6,TRANSLUCENCY_BY_DISTANCE_INDEX$2=PointPrimitive.TRANSLUCENCY_BY_DISTANCE_INDEX=7,DISTANCE_DISPLAY_CONDITION_INDEX$1=PointPrimitive.DISTANCE_DISPLAY_CONDITION_INDEX=8,DISABLE_DEPTH_DISTANCE_INDEX=PointPrimitive.DISABLE_DEPTH_DISTANCE_INDEX=9;function makeDirty$2(e,t){var i=e._pointPrimitiveCollection;defined(i)&&(i._updatePointPrimitive(e,t),e._dirty=!0)}PointPrimitive.NUMBER_OF_PROPERTIES=10,Object.defineProperties(PointPrimitive.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,makeDirty$2(this,SHOW_INDEX$4))}},position:{get:function(){return this._position},set:function(e){var t=this._position;Cartesian3.equals(t,e)||(Cartesian3.clone(e,t),Cartesian3.clone(e,this._actualPosition),makeDirty$2(this,POSITION_INDEX$4))}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){var t=this._scaleByDistance;NearFarScalar.equals(t,e)||(this._scaleByDistance=NearFarScalar.clone(e,t),makeDirty$2(this,SCALE_BY_DISTANCE_INDEX$2))}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){var t=this._translucencyByDistance;NearFarScalar.equals(t,e)||(this._translucencyByDistance=NearFarScalar.clone(e,t),makeDirty$2(this,TRANSLUCENCY_BY_DISTANCE_INDEX$2))}},pixelSize:{get:function(){return this._pixelSize},set:function(e){this._pixelSize!==e&&(this._pixelSize=e,makeDirty$2(this,PIXEL_SIZE_INDEX))}},color:{get:function(){return this._color},set:function(e){var t=this._color;Color.equals(t,e)||(Color.clone(e,t),makeDirty$2(this,COLOR_INDEX$2))}},outlineColor:{get:function(){return this._outlineColor},set:function(e){var t=this._outlineColor;Color.equals(t,e)||(Color.clone(e,t),makeDirty$2(this,OUTLINE_COLOR_INDEX))}},outlineWidth:{get:function(){return this._outlineWidth},set:function(e){this._outlineWidth!==e&&(this._outlineWidth=e,makeDirty$2(this,OUTLINE_WIDTH_INDEX))}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){DistanceDisplayCondition.equals(this._distanceDisplayCondition,e)||(this._distanceDisplayCondition=DistanceDisplayCondition.clone(e,this._distanceDisplayCondition),makeDirty$2(this,DISTANCE_DISPLAY_CONDITION_INDEX$1))}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance!==e&&(this._disableDepthTestDistance=e,makeDirty$2(this,DISABLE_DEPTH_DISTANCE_INDEX))}},id:{get:function(){return this._id},set:function(e){this._id=e,defined(this._pickId)&&(this._pickId.object.id=e)}},pickId:{get:function(){return this._pickId}},clusterShow:{get:function(){return this._clusterShow},set:function(e){this._clusterShow!==e&&(this._clusterShow=e,makeDirty$2(this,SHOW_INDEX$4))}}}),PointPrimitive.prototype.getPickId=function(e){return defined(this._pickId)||(this._pickId=e.createPickId({primitive:this,collection:this._collection,id:this._id})),this._pickId},PointPrimitive.prototype._getActualPosition=function(){return this._actualPosition},PointPrimitive.prototype._setActualPosition=function(e){Cartesian3.clone(e,this._actualPosition),makeDirty$2(this,POSITION_INDEX$4)};var tempCartesian3$1=new Cartesian4;PointPrimitive._computeActualPosition=function(e,t,i){return t.mode===SceneMode$1.SCENE3D?e:(Matrix4.multiplyByPoint(i,e,tempCartesian3$1),SceneTransforms.computeActualWgs84Position(t,tempCartesian3$1))};var scratchCartesian4$4=new Cartesian4;PointPrimitive._computeScreenSpacePosition=function(e,t,i,r){var n=Matrix4.multiplyByVector(e,Cartesian4.fromElements(t.x,t.y,t.z,1,scratchCartesian4$4),scratchCartesian4$4);return SceneTransforms.wgs84ToWindowCoordinates(i,n,r)},PointPrimitive.prototype.computeScreenSpacePosition=function(e,t){var i=this._pointPrimitiveCollection;defined(t)||(t=new Cartesian2);var r=i.modelMatrix,n=PointPrimitive._computeScreenSpacePosition(r,this._actualPosition,e,t);if(defined(n))return n.y=e.canvas.clientHeight-n.y,n},PointPrimitive.getScreenSpaceBoundingBox=function(e,t,i){var r=e.pixelSize,n=.5*r,a=t.x-n,o=t.y-n,s=r,l=r;return defined(i)||(i=new BoundingRectangle),i.x=a,i.y=o,i.width=s,i.height=l,i},PointPrimitive.prototype.equals=function(e){return this===e||defined(e)&&this._id===e._id&&Cartesian3.equals(this._position,e._position)&&Color.equals(this._color,e._color)&&this._pixelSize===e._pixelSize&&this._outlineWidth===e._outlineWidth&&this._show===e._show&&Color.equals(this._outlineColor,e._outlineColor)&&NearFarScalar.equals(this._scaleByDistance,e._scaleByDistance)&&NearFarScalar.equals(this._translucencyByDistance,e._translucencyByDistance)&&DistanceDisplayCondition.equals(this._distanceDisplayCondition,e._distanceDisplayCondition)&&this._disableDepthTestDistance===e._disableDepthTestDistance},PointPrimitive.prototype._destroy=function(){this._pickId=this._pickId&&this._pickId.destroy(),this._pointPrimitiveCollection=void 0};var PointPrimitiveCollectionFS="varying vec4 v_color;\nvarying vec4 v_outlineColor;\nvarying float v_innerPercent;\nvarying float v_pixelDistance;\nvarying vec4 v_pickColor;\nvoid main()\n{\nfloat distanceToCenter = length(gl_PointCoord - vec2(0.5));\nfloat maxDistance = max(0.0, 0.5 - v_pixelDistance);\nfloat wholeAlpha = 1.0 - smoothstep(maxDistance, 0.5, distanceToCenter);\nfloat innerAlpha = 1.0 - smoothstep(maxDistance * v_innerPercent, 0.5 * v_innerPercent, distanceToCenter);\nvec4 color = mix(v_outlineColor, v_color, innerAlpha);\ncolor.a *= wholeAlpha;\n#if !defined(OPAQUE) && !defined(TRANSLUCENT)\nif (color.a < 0.005)\n{\ndiscard;\n}\n#else\n#ifdef OPAQUE\nif (color.a < 0.995)\n{\ndiscard;\n}\n#else\nif (color.a >= 0.995)\n{\ndiscard;\n}\n#endif\n#endif\ngl_FragColor = czm_gammaCorrect(color);\nczm_writeLogDepth();\n}\n",PointPrimitiveCollectionVS="uniform float u_maxTotalPointSize;\nattribute vec4 positionHighAndSize;\nattribute vec4 positionLowAndOutline;\nattribute vec4 compressedAttribute0;\nattribute vec4 compressedAttribute1;\nattribute vec4 scaleByDistance;\nattribute vec3 distanceDisplayConditionAndDisableDepth;\nvarying vec4 v_color;\nvarying vec4 v_outlineColor;\nvarying float v_innerPercent;\nvarying float v_pixelDistance;\nvarying vec4 v_pickColor;\nconst float SHIFT_LEFT8 = 256.0;\nconst float SHIFT_RIGHT8 = 1.0 / 256.0;\nvoid main()\n{\nvec3 positionHigh = positionHighAndSize.xyz;\nvec3 positionLow = positionLowAndOutline.xyz;\nfloat outlineWidthBothSides = 2.0 * positionLowAndOutline.w;\nfloat totalSize = positionHighAndSize.w + outlineWidthBothSides;\nfloat outlinePercent = outlineWidthBothSides / totalSize;\ntotalSize *= czm_pixelRatio;\ntotalSize += 3.0;\nfloat temp = compressedAttribute1.x * SHIFT_RIGHT8;\nfloat show = floor(temp);\n#ifdef EYE_DISTANCE_TRANSLUCENCY\nvec4 translucencyByDistance;\ntranslucencyByDistance.x = compressedAttribute1.z;\ntranslucencyByDistance.z = compressedAttribute1.w;\ntranslucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0;\ntemp = compressedAttribute1.y * SHIFT_RIGHT8;\ntranslucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0;\n#endif\nvec4 color;\nvec4 outlineColor;\nvec4 pickColor;\ntemp = compressedAttribute0.z * SHIFT_RIGHT8;\npickColor.b = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\npickColor.g = (temp - floor(temp)) * SHIFT_LEFT8;\npickColor.r = floor(temp);\ntemp = compressedAttribute0.x * SHIFT_RIGHT8;\ncolor.b = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\ncolor.g = (temp - floor(temp)) * SHIFT_LEFT8;\ncolor.r = floor(temp);\ntemp = compressedAttribute0.y * SHIFT_RIGHT8;\noutlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8;\ntemp = floor(temp) * SHIFT_RIGHT8;\noutlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8;\noutlineColor.r = floor(temp);\ntemp = compressedAttribute0.w * SHIFT_RIGHT8;\npickColor.a = (temp - floor(temp)) * SHIFT_LEFT8;\npickColor = pickColor / 255.0;\ntemp = floor(temp) * SHIFT_RIGHT8;\noutlineColor.a = (temp - floor(temp)) * SHIFT_LEFT8;\noutlineColor /= 255.0;\ncolor.a = floor(temp);\ncolor /= 255.0;\nvec4 p = czm_translateRelativeToEye(positionHigh, positionLow);\nvec4 positionEC = czm_modelViewRelativeToEye * p;\n#if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE)\nfloat lengthSq;\nif (czm_sceneMode == czm_sceneMode2D)\n{\nlengthSq = czm_eyeHeight2D.y;\n}\nelse\n{\nlengthSq = dot(positionEC.xyz, positionEC.xyz);\n}\n#endif\n#ifdef EYE_DISTANCE_SCALING\ntotalSize *= czm_nearFarScalar(scaleByDistance, lengthSq);\n#endif\ntotalSize = min(totalSize, u_maxTotalPointSize);\nif (totalSize < 1.0)\n{\npositionEC.xyz = vec3(0.0);\ntotalSize = 1.0;\n}\nfloat translucency = 1.0;\n#ifdef EYE_DISTANCE_TRANSLUCENCY\ntranslucency = czm_nearFarScalar(translucencyByDistance, lengthSq);\nif (translucency < 0.004)\n{\npositionEC.xyz = vec3(0.0);\n}\n#endif\n#ifdef DISTANCE_DISPLAY_CONDITION\nfloat nearSq = distanceDisplayConditionAndDisableDepth.x;\nfloat farSq = distanceDisplayConditionAndDisableDepth.y;\nif (lengthSq < nearSq || lengthSq > farSq) {\npositionEC.xyz = vec3(0.0, 0.0, 1.0);\n}\n#endif\ngl_Position = czm_projection * positionEC;\nczm_vertexLogDepth();\n#ifdef DISABLE_DEPTH_DISTANCE\nfloat disableDepthTestDistance = distanceDisplayConditionAndDisableDepth.z;\nif (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0)\n{\ndisableDepthTestDistance = czm_minimumDisableDepthTestDistance;\n}\nif (disableDepthTestDistance != 0.0)\n{\nfloat zclip = gl_Position.z / gl_Position.w;\nbool clipped = (zclip < -1.0 || zclip > 1.0);\nif (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance)))\n{\ngl_Position.z = -gl_Position.w;\n#ifdef LOG_DEPTH\nczm_vertexLogDepth(vec4(czm_currentFrustum.x));\n#endif\n}\n}\n#endif\nv_color = color;\nv_color.a *= translucency * show;\nv_outlineColor = outlineColor;\nv_outlineColor.a *= translucency * show;\nv_innerPercent = 1.0 - outlinePercent;\nv_pixelDistance = 2.0 / totalSize;\ngl_PointSize = totalSize * show;\ngl_Position *= show;\nv_pickColor = pickColor;\n}\n",SHOW_INDEX$5=PointPrimitive.SHOW_INDEX,POSITION_INDEX$5=PointPrimitive.POSITION_INDEX,COLOR_INDEX$3=PointPrimitive.COLOR_INDEX,OUTLINE_COLOR_INDEX$1=PointPrimitive.OUTLINE_COLOR_INDEX,OUTLINE_WIDTH_INDEX$1=PointPrimitive.OUTLINE_WIDTH_INDEX,PIXEL_SIZE_INDEX$1=PointPrimitive.PIXEL_SIZE_INDEX,SCALE_BY_DISTANCE_INDEX$3=PointPrimitive.SCALE_BY_DISTANCE_INDEX,TRANSLUCENCY_BY_DISTANCE_INDEX$3=PointPrimitive.TRANSLUCENCY_BY_DISTANCE_INDEX,DISTANCE_DISPLAY_CONDITION_INDEX$2=PointPrimitive.DISTANCE_DISPLAY_CONDITION_INDEX,DISABLE_DEPTH_DISTANCE_INDEX$1=PointPrimitive.DISABLE_DEPTH_DISTANCE_INDEX,NUMBER_OF_PROPERTIES$3=PointPrimitive.NUMBER_OF_PROPERTIES,attributeLocations$3={positionHighAndSize:0,positionLowAndOutline:1,compressedAttribute0:2,compressedAttribute1:3,scaleByDistance:4,distanceDisplayConditionAndDisableDepth:5};function PointPrimitiveCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._sp=void 0,this._spTranslucent=void 0,this._rsOpaque=void 0,this._rsTranslucent=void 0,this._vaf=void 0,this._pointPrimitives=[],this._pointPrimitivesToUpdate=[],this._pointPrimitivesToUpdateIndex=0,this._pointPrimitivesRemoved=!1,this._createVertexArray=!1,this._shaderScaleByDistance=!1,this._compiledShaderScaleByDistance=!1,this._shaderTranslucencyByDistance=!1,this._compiledShaderTranslucencyByDistance=!1,this._shaderDistanceDisplayCondition=!1,this._compiledShaderDistanceDisplayCondition=!1,this._shaderDisableDepthDistance=!1,this._compiledShaderDisableDepthDistance=!1,this._propertiesChanged=new Uint32Array(NUMBER_OF_PROPERTIES$3),this._maxPixelSize=1,this._baseVolume=new BoundingSphere,this._baseVolumeWC=new BoundingSphere,this._baseVolume2D=new BoundingSphere,this._boundingVolume=new BoundingSphere,this._boundingVolumeDirty=!1,this._colorCommands=[],this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=Matrix4.clone(Matrix4.IDENTITY),this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.blendOption=defaultValue(e.blendOption,BlendOption$1.OPAQUE_AND_TRANSLUCENT),this._blendOption=void 0,this._mode=SceneMode$1.SCENE3D,this._maxTotalPointSize=1,this._buffersUsage=[BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW,BufferUsage$1.STATIC_DRAW];var t=this;this._uniforms={u_maxTotalPointSize:function(){return t._maxTotalPointSize}}}function destroyPointPrimitives(e){for(var t=e.length,i=0;i<t;++i)e[i]&&e[i]._destroy()}function removePointPrimitives(e){if(e._pointPrimitivesRemoved){e._pointPrimitivesRemoved=!1;for(var t=[],i=e._pointPrimitives,r=i.length,n=0,a=0;n<r;++n){var o=i[n];o&&(o._index=a++,t.push(o))}e._pointPrimitives=t}}function createVAF$1(e,t,i){return new VertexArrayFacade(e,[{index:attributeLocations$3.positionHighAndSize,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[POSITION_INDEX$5]},{index:attributeLocations$3.positionLowAndShow,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[POSITION_INDEX$5]},{index:attributeLocations$3.compressedAttribute0,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[COLOR_INDEX$3]},{index:attributeLocations$3.compressedAttribute1,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[TRANSLUCENCY_BY_DISTANCE_INDEX$3]},{index:attributeLocations$3.scaleByDistance,componentsPerAttribute:4,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[SCALE_BY_DISTANCE_INDEX$3]},{index:attributeLocations$3.distanceDisplayConditionAndDisableDepth,componentsPerAttribute:3,componentDatatype:ComponentDatatype$1.FLOAT,usage:i[DISTANCE_DISPLAY_CONDITION_INDEX$2]}],t)}Object.defineProperties(PointPrimitiveCollection.prototype,{length:{get:function(){return removePointPrimitives(this),this._pointPrimitives.length}}}),PointPrimitiveCollection.prototype.add=function(e){var t=new PointPrimitive(e,this);return t._index=this._pointPrimitives.length,this._pointPrimitives.push(t),this._createVertexArray=!0,t},PointPrimitiveCollection.prototype.remove=function(e){return!!this.contains(e)&&(this._pointPrimitives[e._index]=null,this._pointPrimitivesRemoved=!0,this._createVertexArray=!0,e._destroy(),!0)},PointPrimitiveCollection.prototype.removeAll=function(){destroyPointPrimitives(this._pointPrimitives),this._pointPrimitives=[],this._pointPrimitivesToUpdate=[],this._pointPrimitivesToUpdateIndex=0,this._pointPrimitivesRemoved=!1,this._createVertexArray=!0},PointPrimitiveCollection.prototype._updatePointPrimitive=function(e,t){e._dirty||(this._pointPrimitivesToUpdate[this._pointPrimitivesToUpdateIndex++]=e),++this._propertiesChanged[t]},PointPrimitiveCollection.prototype.contains=function(e){return defined(e)&&e._pointPrimitiveCollection===this},PointPrimitiveCollection.prototype.get=function(e){return removePointPrimitives(this),this._pointPrimitives[e]},PointPrimitiveCollection.prototype.computeNewBuffersUsage=function(){for(var e=this._buffersUsage,t=!1,i=this._propertiesChanged,r=0;r<NUMBER_OF_PROPERTIES$3;++r){var n=0===i[r]?BufferUsage$1.STATIC_DRAW:BufferUsage$1.STREAM_DRAW,t=t||e[r]!==n;e[r]=n}return t};var writePositionScratch$1=new EncodedCartesian3;function writePositionSizeAndOutline(e,t,i,r){var n=r._index,a=r._getActualPosition();e._mode===SceneMode$1.SCENE3D&&(BoundingSphere.expand(e._baseVolume,a,e._baseVolume),e._boundingVolumeDirty=!0),EncodedCartesian3.fromCartesian(a,writePositionScratch$1);var o=r.pixelSize,s=r.outlineWidth;e._maxPixelSize=Math.max(e._maxPixelSize,o+s);var l=i[attributeLocations$3.positionHighAndSize],c=writePositionScratch$1.high;l(n,c.x,c.y,c.z,o);var u=i[attributeLocations$3.positionLowAndOutline],d=writePositionScratch$1.low;u(n,d.x,d.y,d.z,s)}var LEFT_SHIFT16$1=65536,LEFT_SHIFT8$1=256;function writeCompressedAttrib0$1(e,t,i,r){var n=r._index,a=r.color,o=r.getPickId(t).color,s=r.outlineColor,l=Color.floatToByte(a.red),c=Color.floatToByte(a.green),u=Color.floatToByte(a.blue),d=l*LEFT_SHIFT16$1+c*LEFT_SHIFT8$1+u,l=Color.floatToByte(s.red),c=Color.floatToByte(s.green),u=Color.floatToByte(s.blue),h=l*LEFT_SHIFT16$1+c*LEFT_SHIFT8$1+u;l=Color.floatToByte(o.red),c=Color.floatToByte(o.green),u=Color.floatToByte(o.blue);var p=l*LEFT_SHIFT16$1+c*LEFT_SHIFT8$1+u,m=Color.floatToByte(a.alpha)*LEFT_SHIFT16$1+Color.floatToByte(s.alpha)*LEFT_SHIFT8$1+Color.floatToByte(o.alpha);(0,i[attributeLocations$3.compressedAttribute0])(n,d,h,p,m)}function writeCompressedAttrib1$1(e,t,i,r){var n=r._index,a=0,o=1,s=1,l=1,c=r.translucencyByDistance;defined(c)&&(a=c.near,o=c.nearValue,s=c.far,l=c.farValue,1===o&&1===l||(e._shaderTranslucencyByDistance=!0));var u=r.show&&r.clusterShow;0===r.color.alpha&&0===r.outlineColor.alpha&&(u=!1),o=CesiumMath.clamp(o,0,1);var d=(u?1:0)*LEFT_SHIFT8$1+(o=1===o?255:255*o|0);l=1===(l=CesiumMath.clamp(l,0,1))?255:255*l|0,(0,i[attributeLocations$3.compressedAttribute1])(n,d,l,a,s)}function writeScaleByDistance$1(e,t,i,r){var n=r._index,a=i[attributeLocations$3.scaleByDistance],o=0,s=1,l=1,c=1,u=r.scaleByDistance;defined(u)&&(o=u.near,s=u.nearValue,l=u.far,c=u.farValue,1===s&&1===c||(e._shaderScaleByDistance=!0)),a(n,o,s,l,c)}function writeDistanceDisplayConditionAndDepthDisable(e,t,i,r){var n=r._index,a=i[attributeLocations$3.distanceDisplayConditionAndDisableDepth],o=0,s=Number.MAX_VALUE,l=r.distanceDisplayCondition;defined(l)&&(o=l.near,s=l.far,o*=o,s*=s,e._shaderDistanceDisplayCondition=!0);var c=r.disableDepthTestDistance;0<(c*=c)&&(e._shaderDisableDepthDistance=!0,c===Number.POSITIVE_INFINITY&&(c=-1)),a(n,o,s,c)}function writePointPrimitive(e,t,i,r){writePositionSizeAndOutline(e,t,i,r),writeCompressedAttrib0$1(e,t,i,r),writeCompressedAttrib1$1(e,t,i,r),writeScaleByDistance$1(e,t,i,r),writeDistanceDisplayConditionAndDepthDisable(e,t,i,r)}function recomputeActualPositions$1(e,t,i,r,n,a){var o;r.mode===SceneMode$1.SCENE3D?(o=e._baseVolume,e._boundingVolumeDirty=!0):o=e._baseVolume2D;for(var s=[],l=0;l<i;++l){var c=t[l],u=c.position,d=PointPrimitive._computeActualPosition(u,r,n);defined(d)&&(c._setActualPosition(d),a?s.push(d):BoundingSphere.expand(o,d,o))}a&&BoundingSphere.fromPoints(s,o)}function updateMode$2(e,t){var i=t.mode,r=e._pointPrimitives,n=e._pointPrimitivesToUpdate,a=e._modelMatrix;e._createVertexArray||e._mode!==i||i!==SceneMode$1.SCENE3D&&!Matrix4.equals(a,e.modelMatrix)?(e._mode=i,Matrix4.clone(e.modelMatrix,a),e._createVertexArray=!0,i!==SceneMode$1.SCENE3D&&i!==SceneMode$1.SCENE2D&&i!==SceneMode$1.COLUMBUS_VIEW||recomputeActualPositions$1(e,r,r.length,t,a,!0)):i===SceneMode$1.MORPHING?recomputeActualPositions$1(e,r,r.length,t,a,!0):i!==SceneMode$1.SCENE2D&&i!==SceneMode$1.COLUMBUS_VIEW||recomputeActualPositions$1(e,n,e._pointPrimitivesToUpdateIndex,t,a,!1)}function updateBoundingVolume$1(e,t,i){var r=t.camera.getPixelSize(i,t.context.drawingBufferWidth,t.context.drawingBufferHeight)*e._maxPixelSize;i.radius+=r}var scratchWriterArray$1=[];function kdbush(e,t,i,r,n){return new KDBush(e,t,i,r,n)}function KDBush(e,t,i,r,n){t=t||defaultGetX,i=i||defaultGetY,n=n||Array,this.nodeSize=r||64,this.points=e,this.ids=new n(e.length),this.coords=new n(2*e.length);for(var a=0;a<e.length;a++)this.ids[a]=a,this.coords[2*a]=t(e[a]),this.coords[2*a+1]=i(e[a]);sort$1(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0)}function defaultGetX(e){return e[0]}function defaultGetY(e){return e[1]}function range(e,t,i,r,n,a,o){for(var s=[0,e.length-1,0],l=[];s.length;){var c=s.pop(),u=s.pop(),d=s.pop();if(u-d<=o)for(var h=d;h<=u;h++)m=t[2*h],f=t[2*h+1],i<=m&&m<=n&&r<=f&&f<=a&&l.push(e[h]);else{var p=Math.floor((d+u)/2),m=t[2*p],f=t[2*p+1];i<=m&&m<=n&&r<=f&&f<=a&&l.push(e[p]);var g=(c+1)%2;(0===c?i<=m:r<=f)&&(s.push(d),s.push(p-1),s.push(g)),(0===c?m<=n:f<=a)&&(s.push(p+1),s.push(u),s.push(g))}}return l}function sort$1(e,t,i,r,n,a){var o;n-r<=i||(select(e,t,o=Math.floor((r+n)/2),r,n,a%2),sort$1(e,t,i,r,o-1,a+1),sort$1(e,t,i,o+1,n,a+1))}function select(e,t,i,r,n,a){for(;r<n;){var o,s,l,c,u;600<n-r&&(o=n-r+1,s=i-r+1,l=Math.log(o),c=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*c*(o-c)/o)*(s-o/2<0?-1:1),select(e,t,i,Math.max(r,Math.floor(i-s*c/o+u)),Math.min(n,Math.floor(i+(o-s)*c/o+u)),a));var d=t[2*i+a],h=r,p=n;for(swapItem(e,t,r,i),t[2*n+a]>d&&swapItem(e,t,r,n);h<p;){for(swapItem(e,t,h,p),h++,p--;t[2*h+a]<d;)h++;for(;t[2*p+a]>d;)p--}t[2*r+a]===d?swapItem(e,t,r,p):swapItem(e,t,++p,n),p<=i&&(r=p+1),i<=p&&(n=p-1)}}function swapItem(e,t,i,r){swap$2(e,i,r),swap$2(t,2*i,2*r),swap$2(t,2*i+1,2*r+1)}function swap$2(e,t,i){var r=e[t];e[t]=e[i],e[i]=r}function within(e,t,i,r,n,a){for(var o=[0,e.length-1,0],s=[],l=n*n;o.length;){var c=o.pop(),u=o.pop(),d=o.pop();if(u-d<=a)for(var h=d;h<=u;h++)sqDist(t[2*h],t[2*h+1],i,r)<=l&&s.push(e[h]);else{var p=Math.floor((d+u)/2),m=t[2*p],f=t[2*p+1];sqDist(m,f,i,r)<=l&&s.push(e[p]);var g=(c+1)%2;(0===c?i-n<=m:r-n<=f)&&(o.push(d),o.push(p-1),o.push(g)),(0===c?m<=i+n:f<=r+n)&&(o.push(p+1),o.push(u),o.push(g))}}return s}function sqDist(e,t,i,r){var n=e-i,a=t-r;return n*n+a*a}function EntityCluster(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._enabled=defaultValue(e.enabled,!1),this._pixelRange=defaultValue(e.pixelRange,80),this._minimumClusterSize=defaultValue(e.minimumClusterSize,2),this._clusterBillboards=defaultValue(e.clusterBillboards,!0),this._clusterLabels=defaultValue(e.clusterLabels,!0),this._clusterPoints=defaultValue(e.clusterPoints,!0),this._labelCollection=void 0,this._billboardCollection=void 0,this._pointCollection=void 0,this._clusterBillboardCollection=void 0,this._clusterLabelCollection=void 0,this._clusterPointCollection=void 0,this._collectionIndicesByEntity={},this._unusedLabelIndices=[],this._unusedBillboardIndices=[],this._unusedPointIndices=[],this._previousClusters=[],this._previousHeight=void 0,this._enabledDirty=!1,this._clusterDirty=!1,this._cluster=void 0,this._removeEventListener=void 0,this._clusterEvent=new Event}function getX(e){return e.coord.x}function getY(e){return e.coord.y}function expandBoundingBox(e,t){e.x-=t,e.y-=t,e.width+=2*t,e.height+=2*t}PointPrimitiveCollection.prototype.update=function(e){removePointPrimitives(this),this._maxTotalPointSize=ContextLimits.maximumAliasedPointSize,updateMode$2(this,e);var t=this._pointPrimitives.length,i=this._pointPrimitivesToUpdate,r=this._pointPrimitivesToUpdateIndex,n=this._propertiesChanged,a=this._createVertexArray,o=e.context,s=e.passes,l=s.pick;if(a||!l&&this.computeNewBuffersUsage()){this._createVertexArray=!1;for(var c=0;c<NUMBER_OF_PROPERTIES$3;++c)n[c]=0;if(this._vaf=this._vaf&&this._vaf.destroy(),0<t){this._vaf=createVAF$1(o,t,this._buffersUsage),m=this._vaf.writers;for(var u=0;u<t;++u){var d=this._pointPrimitives[u];d._dirty=!1,writePointPrimitive(this,o,m,d)}this._vaf.commit()}this._pointPrimitivesToUpdateIndex=0}else if(0<r){var h=scratchWriterArray$1;h.length=0,(n[POSITION_INDEX$5]||n[OUTLINE_WIDTH_INDEX$1]||n[PIXEL_SIZE_INDEX$1])&&h.push(writePositionSizeAndOutline),(n[COLOR_INDEX$3]||n[OUTLINE_COLOR_INDEX$1])&&h.push(writeCompressedAttrib0$1),(n[SHOW_INDEX$5]||n[TRANSLUCENCY_BY_DISTANCE_INDEX$3])&&h.push(writeCompressedAttrib1$1),n[SCALE_BY_DISTANCE_INDEX$3]&&h.push(writeScaleByDistance$1),(n[DISTANCE_DISPLAY_CONDITION_INDEX$2]||n[DISABLE_DEPTH_DISTANCE_INDEX$1])&&h.push(writeDistanceDisplayConditionAndDepthDisable);var p=h.length,m=this._vaf.writers;if(.1<r/t){for(var f=0;f<r;++f){var g=i[f];g._dirty=!1;for(var _=0;_<p;++_)h[_](this,o,m,g)}this._vaf.commit()}else{for(var y=0;y<r;++y){var v=i[y];v._dirty=!1;for(var C=0;C<p;++C)h[C](this,o,m,v);this._vaf.subCommit(v._index,1)}this._vaf.endSubCommits()}this._pointPrimitivesToUpdateIndex=0}if(1.5*t<r&&(i.length=t),defined(this._vaf)&&defined(this._vaf.va)){this._boundingVolumeDirty&&(this._boundingVolumeDirty=!1,BoundingSphere.transform(this._baseVolume,this.modelMatrix,this._baseVolumeWC));var S,T=Matrix4.IDENTITY;updateBoundingVolume$1(this,e,S=e.mode===SceneMode$1.SCENE3D?(T=this.modelMatrix,BoundingSphere.clone(this._baseVolumeWC,this._boundingVolume)):BoundingSphere.clone(this._baseVolume2D,this._boundingVolume));var x,b,E=this._blendOption!==this.blendOption;this._blendOption=this.blendOption,E&&(this._blendOption===BlendOption$1.OPAQUE||this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT?this._rsOpaque=RenderState.fromCache({depthTest:{enabled:!0,func:WebGLConstants$1.LEQUAL},depthMask:!0}):this._rsOpaque=void 0,this._blendOption===BlendOption$1.TRANSLUCENT||this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT?this._rsTranslucent=RenderState.fromCache({depthTest:{enabled:!0,func:WebGLConstants$1.LEQUAL},depthMask:!1,blending:BlendingState$1.ALPHA_BLEND}):this._rsTranslucent=void 0),this._shaderDisableDepthDistance=this._shaderDisableDepthDistance||0!==e.minimumDisableDepthTestDistance,(E||this._shaderScaleByDistance&&!this._compiledShaderScaleByDistance||this._shaderTranslucencyByDistance&&!this._compiledShaderTranslucencyByDistance||this._shaderDistanceDisplayCondition&&!this._compiledShaderDistanceDisplayCondition||this._shaderDisableDepthDistance!==this._compiledShaderDisableDepthDistance)&&(x=new ShaderSource({sources:[PointPrimitiveCollectionVS]}),this._shaderScaleByDistance&&x.defines.push("EYE_DISTANCE_SCALING"),this._shaderTranslucencyByDistance&&x.defines.push("EYE_DISTANCE_TRANSLUCENCY"),this._shaderDistanceDisplayCondition&&x.defines.push("DISTANCE_DISPLAY_CONDITION"),this._shaderDisableDepthDistance&&x.defines.push("DISABLE_DEPTH_DISTANCE"),this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT&&(b=new ShaderSource({defines:["OPAQUE"],sources:[PointPrimitiveCollectionFS]}),this._sp=ShaderProgram.replaceCache({context:o,shaderProgram:this._sp,vertexShaderSource:x,fragmentShaderSource:b,attributeLocations:attributeLocations$3}),b=new ShaderSource({defines:["TRANSLUCENT"],sources:[PointPrimitiveCollectionFS]}),this._spTranslucent=ShaderProgram.replaceCache({context:o,shaderProgram:this._spTranslucent,vertexShaderSource:x,fragmentShaderSource:b,attributeLocations:attributeLocations$3})),this._blendOption===BlendOption$1.OPAQUE&&(b=new ShaderSource({sources:[PointPrimitiveCollectionFS]}),this._sp=ShaderProgram.replaceCache({context:o,shaderProgram:this._sp,vertexShaderSource:x,fragmentShaderSource:b,attributeLocations:attributeLocations$3})),this._blendOption===BlendOption$1.TRANSLUCENT&&(b=new ShaderSource({sources:[PointPrimitiveCollectionFS]}),this._spTranslucent=ShaderProgram.replaceCache({context:o,shaderProgram:this._spTranslucent,vertexShaderSource:x,fragmentShaderSource:b,attributeLocations:attributeLocations$3})),this._compiledShaderScaleByDistance=this._shaderScaleByDistance,this._compiledShaderTranslucencyByDistance=this._shaderTranslucencyByDistance,this._compiledShaderDistanceDisplayCondition=this._shaderDistanceDisplayCondition,this._compiledShaderDisableDepthDistance=this._shaderDisableDepthDistance);var P=e.commandList;if(s.render||l){var A,w=this._colorCommands,D=this._blendOption===BlendOption$1.OPAQUE,M=this._blendOption===BlendOption$1.OPAQUE_AND_TRANSLUCENT,I=(A=this._vaf.va).length;w.length=I;for(var R=M?2*I:I,O=0;O<R;++O){var L,F=D||M&&O%2==0;defined(L=w[O])||(L=w[O]=new DrawCommand),L.primitiveType=PrimitiveType$1.POINTS,L.pass=F||!M?Pass$1.OPAQUE:Pass$1.TRANSLUCENT,L.owner=this;var N=M?Math.floor(O/2):O;L.boundingVolume=S,L.modelMatrix=T,L.shaderProgram=F?this._sp:this._spTranslucent,L.uniformMap=this._uniforms,L.vertexArray=A[N].va,L.renderState=F?this._rsOpaque:this._rsTranslucent,L.debugShowBoundingVolume=this.debugShowBoundingVolume,L.pickId="v_pickColor",P.push(L)}}}},PointPrimitiveCollection.prototype.isDestroyed=function(){return!1},PointPrimitiveCollection.prototype.destroy=function(){return this._sp=this._sp&&this._sp.destroy(),this._spTranslucent=this._spTranslucent&&this._spTranslucent.destroy(),this._spPick=this._spPick&&this._spPick.destroy(),this._vaf=this._vaf&&this._vaf.destroy(),destroyPointPrimitives(this._pointPrimitives),destroyObject(this)},KDBush.prototype={range:function(e,t,i,r){return range(this.ids,this.coords,e,t,i,r,this.nodeSize)},within:function(e,t,i){return within(this.ids,this.coords,e,t,i,this.nodeSize)}};var labelBoundingBoxScratch=new BoundingRectangle;function getBoundingBox(e,t,i,r,n){var a,o,s;return defined(e._labelCollection)&&r._clusterLabels?n=Label.getScreenSpaceBoundingBox(e,t,n):defined(e._billboardCollection)&&r._clusterBillboards?n=Billboard.getScreenSpaceBoundingBox(e,t,n):defined(e._pointPrimitiveCollection)&&r._clusterPoints&&(n=PointPrimitive.getScreenSpaceBoundingBox(e,t,n)),expandBoundingBox(n,i),r._clusterLabels&&!defined(e._labelCollection)&&defined(e.id)&&hasLabelIndex(r,e.id.id)&&defined(e.id._label)&&(a=r._collectionIndicesByEntity[e.id.id].labelIndex,o=r._labelCollection.get(a),expandBoundingBox(s=Label.getScreenSpaceBoundingBox(o,t,labelBoundingBoxScratch),i),n=BoundingRectangle.union(n,s,n)),n}function addNonClusteredItem(e,t){var i;e.clusterShow=!0,!defined(e._labelCollection)&&defined(e.id)&&hasLabelIndex(t,e.id.id)&&defined(e.id._label)&&(i=t._collectionIndicesByEntity[e.id.id].labelIndex,t._labelCollection.get(i).clusterShow=!0)}function addCluster(e,t,i,r){var n={billboard:r._clusterBillboardCollection.add(),label:r._clusterLabelCollection.add(),point:r._clusterPointCollection.add()};n.billboard.show=!1,n.point.show=!1,n.label.show=!0,n.label.text=t.toLocaleString(),n.label.id=i,n.billboard.position=n.label.position=n.point.position=e,r._clusterEvent.raiseEvent(i,n)}function hasLabelIndex(e,t){return defined(e)&&defined(e._collectionIndicesByEntity[t])&&defined(e._collectionIndicesByEntity[t].labelIndex)}function getScreenSpacePositions(e,t,i,r,n){if(defined(e))for(var a=e.length,o=0;o<a;++o){var s,l,c,u,d=e.get(o);d.clusterShow=!1,d.show&&(n._scene.mode!==SceneMode$1.SCENE3D||r.isPointVisible(d.position))&&(s=n._clusterLabels&&defined(d._labelCollection),l=n._clusterBillboards&&defined(d.id._billboard),c=n._clusterPoints&&defined(d.id._point),s&&(c||l)||defined(u=d.computeScreenSpacePosition(i))&&t.push({index:o,collection:e,clustered:!1,coord:u}))}}var pointBoundinRectangleScratch=new BoundingRectangle,totalBoundingRectangleScratch=new BoundingRectangle,neighborBoundingRectangleScratch=new BoundingRectangle;function createDeclutterCallback(H){return function(e){if(!(defined(e)&&e<.05)&&H.enabled){var t=H._scene,i=H._labelCollection,r=H._billboardCollection,n=H._pointCollection;if((defined(i)||defined(r)||defined(n))&&(H._clusterBillboards||H._clusterLabels||H._clusterPoints)){var a=H._clusterLabelCollection,o=H._clusterBillboardCollection,s=H._clusterPointCollection;defined(a)?a.removeAll():a=H._clusterLabelCollection=new LabelCollection({scene:t}),defined(o)?o.removeAll():o=H._clusterBillboardCollection=new BillboardCollection({scene:t}),defined(s)?s.removeAll():s=H._clusterPointCollection=new PointPrimitiveCollection;var l,c,u,d,h=H._pixelRange,p=H._minimumClusterSize,m=H._previousClusters,f=[],g=H._previousHeight,_=t.camera.positionCartographic.height,y=new EllipsoidalOccluder(t.mapProjection.ellipsoid,t.camera.positionWC),v=[];H._clusterLabels&&getScreenSpacePositions(i,v,t,y,H),H._clusterBillboards&&getScreenSpacePositions(r,v,t,y,H),H._clusterPoints&&getScreenSpacePositions(n,v,t,y,H);var C=kdbush(v,getX,getY,64,Int32Array);if(_<g)for(c=m.length,l=0;l<c;++l){var S=m[l];if(y.isPointVisible(S.position)){var T=Billboard._computeScreenSpacePosition(Matrix4.IDENTITY,S.position,Cartesian3.ZERO,Cartesian2.ZERO,t);if(defined(T)){for(var x,b=1-_/g,E=S.width=S.width*b,P=S.height=S.height*b,E=Math.max(E,S.minimumWidth),P=Math.max(P,S.minimumHeight),A=T.x-.5*E,w=T.y-.5*P,D=T.x+E,M=T.y+P,I=(x=C.range(A,w,D,M)).length,R=0,O=[],L=0;L<I;++L)($=v[x[L]]).clustered||(++R,u=$.collection,d=$.index,O.push(u.get(d).id));if(p<=R)for(addCluster(S.position,R,O,H),f.push(S),L=0;L<I;++L)v[x[L]].clustered=!0}}}for(c=v.length,l=0;l<c;++l){var F=v[l];if(!F.clustered){F.clustered=!0,u=F.collection,d=F.index;var N=u.get(d),B=getBoundingBox(N,F.coord,h,H,pointBoundinRectangleScratch),V=BoundingRectangle.clone(B,totalBoundingRectangleScratch);I=(x=C.range(B.x,B.y,B.x+B.width,B.y+B.height)).length;var k,z,$,U=Cartesian3.clone(N.position);for(R=1,O=[N.id],L=0;L<I;++L){($=v[x[L]]).clustered||(z=getBoundingBox(k=$.collection.get($.index),$.coord,h,H,neighborBoundingRectangleScratch),Cartesian3.add(k.position,U,U),BoundingRectangle.union(V,z,V),++R,O.push(k.id))}if(p<=R){var G=Cartesian3.multiplyByScalar(U,1/R,U);for(addCluster(G,R,O,H),f.push({position:G,width:V.width,height:V.height,minimumWidth:B.width,minimumHeight:B.height}),L=0;L<I;++L)v[x[L]].clustered=!0}else addNonClusteredItem(N,H)}}0===a.length&&(a.destroy(),H._clusterLabelCollection=void 0),0===o.length&&(o.destroy(),H._clusterBillboardCollection=void 0),0===s.length&&(s.destroy(),H._clusterPointCollection=void 0),H._previousClusters=f,H._previousHeight=_}}}}function createGetEntity(o,s,l,c){return function(e){var t=this[o];defined(this._collectionIndicesByEntity)||(this._collectionIndicesByEntity={});var i,r,n=this._collectionIndicesByEntity[e.id];if(defined(n)||(n=this._collectionIndicesByEntity[e.id]={billboardIndex:void 0,labelIndex:void 0,pointIndex:void 0}),defined(t)&&defined(n[c]))return t.get(n[c]);defined(t)||(t=this[o]=new s({scene:this._scene}));var a=this[l];return 0<a.length?(i=a.pop(),r=t.get(i)):(r=t.add(),i=t.length-1),n[c]=i,this._clusterDirty=!0,r}}function removeEntityIndicesIfUnused(e,t){var i=e._collectionIndicesByEntity[t];defined(i.billboardIndex)||defined(i.labelIndex)||defined(i.pointIndex)||delete e._collectionIndicesByEntity[t]}function disableCollectionClustering(e){if(defined(e))for(var t=e.length,i=0;i<t;++i)e.get(i).clusterShow=!0}function updateEnable(e){e.enabled||(defined(e._clusterLabelCollection)&&e._clusterLabelCollection.destroy(),defined(e._clusterBillboardCollection)&&e._clusterBillboardCollection.destroy(),defined(e._clusterPointCollection)&&e._clusterPointCollection.destroy(),e._clusterLabelCollection=void 0,e._clusterBillboardCollection=void 0,e._clusterPointCollection=void 0,disableCollectionClustering(e._labelCollection),disableCollectionClustering(e._billboardCollection),disableCollectionClustering(e._pointCollection))}function CustomDataSource(e){this._name=e,this._clock=void 0,this._changed=new Event,this._error=new Event,this._isLoading=!1,this._loading=new Event,this._entityCollection=new EntityCollection(this),this._entityCluster=new EntityCluster}EntityCluster.prototype._initialize=function(e){this._scene=e;var t=createDeclutterCallback(this);this._cluster=t,this._removeEventListener=e.camera.changed.addEventListener(t)},Object.defineProperties(EntityCluster.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this._enabledDirty=e!==this._enabled,this._enabled=e}},pixelRange:{get:function(){return this._pixelRange},set:function(e){this._clusterDirty=this._clusterDirty||e!==this._pixelRange,this._pixelRange=e}},minimumClusterSize:{get:function(){return this._minimumClusterSize},set:function(e){this._clusterDirty=this._clusterDirty||e!==this._minimumClusterSize,this._minimumClusterSize=e}},clusterEvent:{get:function(){return this._clusterEvent}},clusterBillboards:{get:function(){return this._clusterBillboards},set:function(e){this._clusterDirty=this._clusterDirty||e!==this._clusterBillboards,this._clusterBillboards=e}},clusterLabels:{get:function(){return this._clusterLabels},set:function(e){this._clusterDirty=this._clusterDirty||e!==this._clusterLabels,this._clusterLabels=e}},clusterPoints:{get:function(){return this._clusterPoints},set:function(e){this._clusterDirty=this._clusterDirty||e!==this._clusterPoints,this._clusterPoints=e}}}),EntityCluster.prototype.getLabel=createGetEntity("_labelCollection",LabelCollection,"_unusedLabelIndices","labelIndex"),EntityCluster.prototype.removeLabel=function(e){var t,i,r=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];defined(this._labelCollection)&&defined(r)&&defined(r.labelIndex)&&(t=r.labelIndex,r.labelIndex=void 0,removeEntityIndicesIfUnused(this,e.id),(i=this._labelCollection.get(t)).show=!1,i.text="",i.id=void 0,this._unusedLabelIndices.push(t),this._clusterDirty=!0)},EntityCluster.prototype.getBillboard=createGetEntity("_billboardCollection",BillboardCollection,"_unusedBillboardIndices","billboardIndex"),EntityCluster.prototype.removeBillboard=function(e){var t,i,r=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];defined(this._billboardCollection)&&defined(r)&&defined(r.billboardIndex)&&(t=r.billboardIndex,r.billboardIndex=void 0,removeEntityIndicesIfUnused(this,e.id),(i=this._billboardCollection.get(t)).id=void 0,i.show=!1,i.image=void 0,this._unusedBillboardIndices.push(t),this._clusterDirty=!0)},EntityCluster.prototype.getPoint=createGetEntity("_pointCollection",PointPrimitiveCollection,"_unusedPointIndices","pointIndex"),EntityCluster.prototype.removePoint=function(e){var t,i,r=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];defined(this._pointCollection)&&defined(r)&&defined(r.pointIndex)&&(t=r.pointIndex,r.pointIndex=void 0,removeEntityIndicesIfUnused(this,e.id),(i=this._pointCollection.get(t)).show=!1,i.id=void 0,this._unusedPointIndices.push(t),this._clusterDirty=!0)},EntityCluster.prototype.update=function(e){var t;defined(this._labelCollection)&&0<this._labelCollection.length&&0===this._labelCollection.get(0)._glyphs.length&&(t=e.commandList,e.commandList=[],this._labelCollection.update(e),e.commandList=t),defined(this._billboardCollection)&&0<this._billboardCollection.length&&!defined(this._billboardCollection.get(0).width)&&(t=e.commandList,e.commandList=[],this._billboardCollection.update(e),e.commandList=t),this._enabledDirty&&(this._enabledDirty=!1,updateEnable(this),this._clusterDirty=!0),this._clusterDirty&&(this._clusterDirty=!1,this._cluster()),defined(this._clusterLabelCollection)&&this._clusterLabelCollection.update(e),defined(this._clusterBillboardCollection)&&this._clusterBillboardCollection.update(e),defined(this._clusterPointCollection)&&this._clusterPointCollection.update(e),defined(this._labelCollection)&&this._labelCollection.update(e),defined(this._billboardCollection)&&this._billboardCollection.update(e),defined(this._pointCollection)&&this._pointCollection.update(e)},EntityCluster.prototype.destroy=function(){this._labelCollection=this._labelCollection&&this._labelCollection.destroy(),this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),this._pointCollection=this._pointCollection&&this._pointCollection.destroy(),this._clusterLabelCollection=this._clusterLabelCollection&&this._clusterLabelCollection.destroy(),this._clusterBillboardCollection=this._clusterBillboardCollection&&this._clusterBillboardCollection.destroy(),this._clusterPointCollection=this._clusterPointCollection&&this._clusterPointCollection.destroy(),defined(this._removeEventListener)&&(this._removeEventListener(),this._removeEventListener=void 0),this._labelCollection=void 0,this._billboardCollection=void 0,this._pointCollection=void 0,this._clusterBillboardCollection=void 0,this._clusterLabelCollection=void 0,this._clusterPointCollection=void 0,this._collectionIndicesByEntity=void 0,this._unusedLabelIndices=[],this._unusedBillboardIndices=[],this._unusedPointIndices=[],this._previousClusters=[],this._previousHeight=void 0,this._enabledDirty=!1,this._pixelRangeDirty=!1,this._minimumClusterSizeDirty=!1},Object.defineProperties(CustomDataSource.prototype,{name:{get:function(){return this._name},set:function(e){this._name!==e&&(this._name=e,this._changed.raiseEvent(this))}},clock:{get:function(){return this._clock},set:function(e){this._clock!==e&&(this._clock=e,this._changed.raiseEvent(this))}},entities:{get:function(){return this._entityCollection}},isLoading:{get:function(){return this._isLoading},set:function(e){DataSource.setLoading(this,e)}},changedEvent:{get:function(){return this._changed}},errorEvent:{get:function(){return this._error}},loadingEvent:{get:function(){return this._loading}},show:{get:function(){return this._entityCollection.show},set:function(e){this._entityCollection.show=e}},clustering:{get:function(){return this._entityCluster},set:function(e){this._entityCluster=e}}}),CustomDataSource.prototype.update=function(e){return!0};var defaultOffset$2=Cartesian3.ZERO,offsetScratch$5=new Cartesian3,positionScratch$7=new Cartesian3,scratchColor$a=new Color;function CylinderGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.length=void 0,this.topRadius=void 0,this.bottomRadius=void 0,this.slices=void 0,this.numberOfVerticalLines=void 0,this.offsetAttribute=void 0}function CylinderGeometryUpdater(e,t){GeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new CylinderGeometryOptions(e),geometryPropertyName:"cylinder",observedPropertyNames:["availability","position","orientation","cylinder"]}),this._onEntityPropertyChanged(e,"cylinder",e.cylinder,void 0)}function DynamicCylinderGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}function DataSourceClock(){this._definitionChanged=new Event,this._startTime=void 0,this._stopTime=void 0,this._currentTime=void 0,this._clockRange=void 0,this._clockStep=void 0,this._multiplier=void 0}defined(Object.create)&&(CylinderGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),CylinderGeometryUpdater.prototype.constructor=CylinderGeometryUpdater),Object.defineProperties(CylinderGeometryUpdater.prototype,{terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}}),CylinderGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),a=this._distanceDisplayConditionProperty.getValue(e),o={show:n,distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a),color:void 0,offset:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$a)),defined(t)||(t=Color.WHITE),o.color=ColorGeometryInstanceAttribute.fromColor(t)),defined(this._options.offsetAttribute)&&(o.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$2,offsetScratch$5))),new GeometryInstance({id:i,geometry:new CylinderGeometry(this._options),modelMatrix:i.computeModelMatrixForHeightReference(e,i.cylinder.heightReference,.5*this._options.length,this._scene.mapProjection.ellipsoid),attributes:o})},CylinderGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$a),n=this._distanceDisplayConditionProperty.getValue(e),a={show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n),offset:void 0};return defined(this._options.offsetAttribute)&&(a.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$2,offsetScratch$5))),new GeometryInstance({id:t,geometry:new CylinderOutlineGeometry(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.cylinder.heightReference,.5*this._options.length,this._scene.mapProjection.ellipsoid),attributes:a})},CylinderGeometryUpdater.prototype._computeCenter=function(e,t){return Property.getValueOrUndefined(this._entity.position,e,t)},CylinderGeometryUpdater.prototype._isHidden=function(e,t){return!defined(e.position)||!defined(t.length)||!defined(t.topRadius)||!defined(t.bottomRadius)||GeometryUpdater.prototype._isHidden.call(this,e,t)},CylinderGeometryUpdater.prototype._isDynamic=function(e,t){return!(e.position.isConstant&&Property.isConstant(e.orientation)&&t.length.isConstant&&t.topRadius.isConstant&&t.bottomRadius.isConstant&&Property.isConstant(t.slices)&&Property.isConstant(t.outlineWidth)&&Property.isConstant(t.numberOfVerticalLines))},CylinderGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),r=this._options;r.vertexFormat=this._materialProperty instanceof ColorMaterialProperty?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,r.length=t.length.getValue(Iso8601.MINIMUM_VALUE),r.topRadius=t.topRadius.getValue(Iso8601.MINIMUM_VALUE),r.bottomRadius=t.bottomRadius.getValue(Iso8601.MINIMUM_VALUE),r.slices=Property.getValueOrUndefined(t.slices,Iso8601.MINIMUM_VALUE),r.numberOfVerticalLines=Property.getValueOrUndefined(t.numberOfVerticalLines,Iso8601.MINIMUM_VALUE),r.offsetAttribute=i!==HeightReference$1.NONE?GeometryOffsetAttribute$1.ALL:void 0},CylinderGeometryUpdater.prototype._onEntityPropertyChanged=heightReferenceOnEntityPropertyChanged,CylinderGeometryUpdater.DynamicGeometryUpdater=DynamicCylinderGeometryUpdater,defined(Object.create)&&(DynamicCylinderGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicCylinderGeometryUpdater.prototype.constructor=DynamicCylinderGeometryUpdater),DynamicCylinderGeometryUpdater.prototype._isHidden=function(e,t,i){var r=this._options;return!defined(Property.getValueOrUndefined(e.position,i,positionScratch$7))||!defined(r.length)||!defined(r.topRadius)||!defined(r.bottomRadius)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicCylinderGeometryUpdater.prototype._setOptions=function(e,t,i){var r=Property.getValueOrDefault(t.heightReference,i,HeightReference$1.NONE),n=this._options;n.length=Property.getValueOrUndefined(t.length,i),n.topRadius=Property.getValueOrUndefined(t.topRadius,i),n.bottomRadius=Property.getValueOrUndefined(t.bottomRadius,i),n.slices=Property.getValueOrUndefined(t.slices,i),n.numberOfVerticalLines=Property.getValueOrUndefined(t.numberOfVerticalLines,i),n.offsetAttribute=r!==HeightReference$1.NONE?GeometryOffsetAttribute$1.ALL:void 0},Object.defineProperties(DataSourceClock.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},startTime:createRawPropertyDescriptor("startTime"),stopTime:createRawPropertyDescriptor("stopTime"),currentTime:createRawPropertyDescriptor("currentTime"),clockRange:createRawPropertyDescriptor("clockRange"),clockStep:createRawPropertyDescriptor("clockStep"),multiplier:createRawPropertyDescriptor("multiplier")}),DataSourceClock.prototype.clone=function(e){return defined(e)||(e=new DataSourceClock),e.startTime=this.startTime,e.stopTime=this.stopTime,e.currentTime=this.currentTime,e.clockRange=this.clockRange,e.clockStep=this.clockStep,e.multiplier=this.multiplier,e},DataSourceClock.prototype.equals=function(e){return this===e||defined(e)&&JulianDate.equals(this.startTime,e.startTime)&&JulianDate.equals(this.stopTime,e.stopTime)&&JulianDate.equals(this.currentTime,e.currentTime)&&this.clockRange===e.clockRange&&this.clockStep===e.clockStep&&this.multiplier===e.multiplier},DataSourceClock.prototype.merge=function(e){this.startTime=defaultValue(this.startTime,e.startTime),this.stopTime=defaultValue(this.stopTime,e.stopTime),this.currentTime=defaultValue(this.currentTime,e.currentTime),this.clockRange=defaultValue(this.clockRange,e.clockRange),this.clockStep=defaultValue(this.clockStep,e.clockStep),this.multiplier=defaultValue(this.multiplier,e.multiplier)},DataSourceClock.prototype.getValue=function(e){return defined(e)||(e=new Clock),e.startTime=defaultValue(this.startTime,e.startTime),e.stopTime=defaultValue(this.stopTime,e.stopTime),e.currentTime=defaultValue(this.currentTime,e.currentTime),e.clockRange=defaultValue(this.clockRange,e.clockRange),e.multiplier=defaultValue(this.multiplier,e.multiplier),e.clockStep=defaultValue(this.clockStep,e.clockStep),e};var defaultColor$2=Color.WHITE,defaultCellAlpha=.1,defaultLineCount=new Cartesian2(8,8),defaultLineOffset=new Cartesian2(0,0),defaultLineThickness=new Cartesian2(1,1);function GridMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._color=void 0,this._colorSubscription=void 0,this._cellAlpha=void 0,this._cellAlphaSubscription=void 0,this._lineCount=void 0,this._lineCountSubscription=void 0,this._lineThickness=void 0,this._lineThicknessSubscription=void 0,this._lineOffset=void 0,this._lineOffsetSubscription=void 0,this.color=e.color,this.cellAlpha=e.cellAlpha,this.lineCount=e.lineCount,this.lineThickness=e.lineThickness,this.lineOffset=e.lineOffset}function PolylineArrowMaterialProperty(e){this._definitionChanged=new Event,this._color=void 0,this._colorSubscription=void 0,this.color=e}Object.defineProperties(GridMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._color)&&Property.isConstant(this._cellAlpha)&&Property.isConstant(this._lineCount)&&Property.isConstant(this._lineThickness)&&Property.isConstant(this._lineOffset)}},definitionChanged:{get:function(){return this._definitionChanged}},color:createPropertyDescriptor("color"),cellAlpha:createPropertyDescriptor("cellAlpha"),lineCount:createPropertyDescriptor("lineCount"),lineThickness:createPropertyDescriptor("lineThickness"),lineOffset:createPropertyDescriptor("lineOffset")}),GridMaterialProperty.prototype.getType=function(e){return"Grid"},GridMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.color=Property.getValueOrClonedDefault(this._color,e,defaultColor$2,t.color),t.cellAlpha=Property.getValueOrDefault(this._cellAlpha,e,defaultCellAlpha),t.lineCount=Property.getValueOrClonedDefault(this._lineCount,e,defaultLineCount,t.lineCount),t.lineThickness=Property.getValueOrClonedDefault(this._lineThickness,e,defaultLineThickness,t.lineThickness),t.lineOffset=Property.getValueOrClonedDefault(this._lineOffset,e,defaultLineOffset,t.lineOffset),t},GridMaterialProperty.prototype.equals=function(e){return this===e||e instanceof GridMaterialProperty&&Property.equals(this._color,e._color)&&Property.equals(this._cellAlpha,e._cellAlpha)&&Property.equals(this._lineCount,e._lineCount)&&Property.equals(this._lineThickness,e._lineThickness)&&Property.equals(this._lineOffset,e._lineOffset)},Object.defineProperties(PolylineArrowMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._color)}},definitionChanged:{get:function(){return this._definitionChanged}},color:createPropertyDescriptor("color")}),PolylineArrowMaterialProperty.prototype.getType=function(e){return"PolylineArrow"},PolylineArrowMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.color=Property.getValueOrClonedDefault(this._color,e,Color.WHITE,t.color),t},PolylineArrowMaterialProperty.prototype.equals=function(e){return this===e||e instanceof PolylineArrowMaterialProperty&&Property.equals(this._color,e._color)};var defaultColor$3=Color.WHITE,defaultGapColor=Color.TRANSPARENT,defaultDashLength=16,defaultDashPattern=255;function PolylineDashMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._color=void 0,this._colorSubscription=void 0,this._gapColor=void 0,this._gapColorSubscription=void 0,this._dashLength=void 0,this._dashLengthSubscription=void 0,this._dashPattern=void 0,this._dashPatternSubscription=void 0,this.color=e.color,this.gapColor=e.gapColor,this.dashLength=e.dashLength,this.dashPattern=e.dashPattern}Object.defineProperties(PolylineDashMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._color)&&Property.isConstant(this._gapColor)&&Property.isConstant(this._dashLength)&&Property.isConstant(this._dashPattern)}},definitionChanged:{get:function(){return this._definitionChanged}},color:createPropertyDescriptor("color"),gapColor:createPropertyDescriptor("gapColor"),dashLength:createPropertyDescriptor("dashLength"),dashPattern:createPropertyDescriptor("dashPattern")}),PolylineDashMaterialProperty.prototype.getType=function(e){return"PolylineDash"},PolylineDashMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.color=Property.getValueOrClonedDefault(this._color,e,defaultColor$3,t.color),t.gapColor=Property.getValueOrClonedDefault(this._gapColor,e,defaultGapColor,t.gapColor),t.dashLength=Property.getValueOrDefault(this._dashLength,e,defaultDashLength,t.dashLength),t.dashPattern=Property.getValueOrDefault(this._dashPattern,e,defaultDashPattern,t.dashPattern),t},PolylineDashMaterialProperty.prototype.equals=function(e){return this===e||e instanceof PolylineDashMaterialProperty&&Property.equals(this._color,e._color)&&Property.equals(this._gapColor,e._gapColor)&&Property.equals(this._dashLength,e._dashLength)&&Property.equals(this._dashPattern,e._dashPattern)};var defaultColor$4=Color.WHITE,defaultGlowPower=.25,defaultTaperPower=1;function PolylineGlowMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._color=void 0,this._colorSubscription=void 0,this._glowPower=void 0,this._glowPowerSubscription=void 0,this._taperPower=void 0,this._taperPowerSubscription=void 0,this.color=e.color,this.glowPower=e.glowPower,this.taperPower=e.taperPower}Object.defineProperties(PolylineGlowMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._color)&&Property.isConstant(this._glow)}},definitionChanged:{get:function(){return this._definitionChanged}},color:createPropertyDescriptor("color"),glowPower:createPropertyDescriptor("glowPower"),taperPower:createPropertyDescriptor("taperPower")}),PolylineGlowMaterialProperty.prototype.getType=function(e){return"PolylineGlow"},PolylineGlowMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.color=Property.getValueOrClonedDefault(this._color,e,defaultColor$4,t.color),t.glowPower=Property.getValueOrDefault(this._glowPower,e,defaultGlowPower,t.glowPower),t.taperPower=Property.getValueOrDefault(this._taperPower,e,defaultTaperPower,t.taperPower),t},PolylineGlowMaterialProperty.prototype.equals=function(e){return this===e||e instanceof PolylineGlowMaterialProperty&&Property.equals(this._color,e._color)&&Property.equals(this._glowPower,e._glowPower)&&Property.equals(this._taperPower,e._taperPower)};var defaultColor$5=Color.WHITE,defaultOutlineColor$1=Color.BLACK,defaultOutlineWidth=1;function PolylineOutlineMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._color=void 0,this._colorSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this.color=e.color,this.outlineColor=e.outlineColor,this.outlineWidth=e.outlineWidth}function PositionPropertyArray(e,t){this._value=void 0,this._definitionChanged=new Event,this._eventHelper=new EventHelper,this._referenceFrame=defaultValue(t,ReferenceFrame$1.FIXED),this.setValue(e)}function PropertyArray(e){this._value=void 0,this._definitionChanged=new Event,this._eventHelper=new EventHelper,this.setValue(e)}function resolve$1(e){if(!defined(r=e._targetProperty)){var t=e._targetEntity;if(!defined(t)){if(!defined(t=e._targetCollection.getById(e._targetId)))return void(e._targetEntity=e._targetProperty=void 0);t.definitionChanged.addEventListener(ReferenceProperty.prototype._onTargetEntityDefinitionChanged,e),e._targetEntity=t}for(var i=e._targetPropertyNames,r=e._targetEntity,n=0,a=i.length;n<a&&defined(r);++n)r=r[i[n]];e._targetProperty=r}return r}function ReferenceProperty(e,t,i){this._targetCollection=e,this._targetId=t,this._targetPropertyNames=i,this._targetProperty=void 0,this._targetEntity=void 0,this._definitionChanged=new Event,e.collectionChanged.addEventListener(ReferenceProperty.prototype._onCollectionChanged,this)}Object.defineProperties(PolylineOutlineMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._color)&&Property.isConstant(this._outlineColor)&&Property.isConstant(this._outlineWidth)}},definitionChanged:{get:function(){return this._definitionChanged}},color:createPropertyDescriptor("color"),outlineColor:createPropertyDescriptor("outlineColor"),outlineWidth:createPropertyDescriptor("outlineWidth")}),PolylineOutlineMaterialProperty.prototype.getType=function(e){return"PolylineOutline"},PolylineOutlineMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.color=Property.getValueOrClonedDefault(this._color,e,defaultColor$5,t.color),t.outlineColor=Property.getValueOrClonedDefault(this._outlineColor,e,defaultOutlineColor$1,t.outlineColor),t.outlineWidth=Property.getValueOrDefault(this._outlineWidth,e,defaultOutlineWidth),t},PolylineOutlineMaterialProperty.prototype.equals=function(e){return this===e||e instanceof PolylineOutlineMaterialProperty&&Property.equals(this._color,e._color)&&Property.equals(this._outlineColor,e._outlineColor)&&Property.equals(this._outlineWidth,e._outlineWidth)},Object.defineProperties(PositionPropertyArray.prototype,{isConstant:{get:function(){var e=this._value;if(!defined(e))return!0;for(var t=e.length,i=0;i<t;i++)if(!Property.isConstant(e[i]))return!1;return!0}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}}}),PositionPropertyArray.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,ReferenceFrame$1.FIXED,t)},PositionPropertyArray.prototype.getValueInReferenceFrame=function(e,t,i){var r=this._value;if(defined(r)){var n=r.length;defined(i)||(i=new Array(n));for(var a=0,o=0;a<n;){var s=r[a].getValueInReferenceFrame(e,t,i[a]);defined(s)&&(i[o]=s,o++),a++}return i.length=o,i}},PositionPropertyArray.prototype.setValue=function(e){var t=this._eventHelper;if(t.removeAll(),defined(e)){this._value=e.slice();for(var i=e.length,r=0;r<i;r++){var n=e[r];defined(n)&&t.add(n.definitionChanged,PositionPropertyArray.prototype._raiseDefinitionChanged,this)}}else this._value=void 0;this._definitionChanged.raiseEvent(this)},PositionPropertyArray.prototype.equals=function(e){return this===e||e instanceof PositionPropertyArray&&this._referenceFrame===e._referenceFrame&&Property.arrayEquals(this._value,e._value)},PositionPropertyArray.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)},Object.defineProperties(PropertyArray.prototype,{isConstant:{get:function(){var e=this._value;if(!defined(e))return!0;for(var t=e.length,i=0;i<t;i++)if(!Property.isConstant(e[i]))return!1;return!0}},definitionChanged:{get:function(){return this._definitionChanged}}}),PropertyArray.prototype.getValue=function(e,t){var i=this._value;if(defined(i)){var r=i.length;defined(t)||(t=new Array(r));for(var n=0,a=0;n<r;){var o=this._value[n].getValue(e,t[n]);defined(o)&&(t[a]=o,a++),n++}return t.length=a,t}},PropertyArray.prototype.setValue=function(e){var t=this._eventHelper;if(t.removeAll(),defined(e)){this._value=e.slice();for(var i=e.length,r=0;r<i;r++){var n=e[r];defined(n)&&t.add(n.definitionChanged,PropertyArray.prototype._raiseDefinitionChanged,this)}}else this._value=void 0;this._definitionChanged.raiseEvent(this)},PropertyArray.prototype.equals=function(e){return this===e||e instanceof PropertyArray&&Property.arrayEquals(this._value,e._value)},PropertyArray.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)},Object.defineProperties(ReferenceProperty.prototype,{isConstant:{get:function(){return Property.isConstant(resolve$1(this))}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){var e=resolve$1(this);return defined(e)?e.referenceFrame:void 0}},targetId:{get:function(){return this._targetId}},targetCollection:{get:function(){return this._targetCollection}},targetPropertyNames:{get:function(){return this._targetPropertyNames}},resolvedProperty:{get:function(){return resolve$1(this)}}}),ReferenceProperty.fromString=function(e,t){for(var i,r=[],n=!0,a=!1,o="",s=0;s<t.length;++s){var l=t.charAt(s);a?(o+=l,a=!1):"\\"===l?a=!0:n&&"#"===l?(i=o,n=!1,o=""):n||"."!==l?o+=l:(r.push(o),o="")}return r.push(o),new ReferenceProperty(e,i,r)},ReferenceProperty.prototype.getValue=function(e,t){var i=resolve$1(this);return defined(i)?i.getValue(e,t):void 0},ReferenceProperty.prototype.getValueInReferenceFrame=function(e,t,i){var r=resolve$1(this);return defined(r)?r.getValueInReferenceFrame(e,t,i):void 0},ReferenceProperty.prototype.getType=function(e){var t=resolve$1(this);return defined(t)?t.getType(e):void 0},ReferenceProperty.prototype.equals=function(e){if(this===e)return!0;var t=this._targetPropertyNames,i=e._targetPropertyNames;if(this._targetCollection!==e._targetCollection||this._targetId!==e._targetId||t.length!==i.length)return!1;for(var r=this._targetPropertyNames.length,n=0;n<r;n++)if(t[n]!==i[n])return!1;return!0},ReferenceProperty.prototype._onTargetEntityDefinitionChanged=function(e,t,i,r){defined(this._targetProperty)&&this._targetPropertyNames[0]===t&&(this._targetProperty=void 0,this._definitionChanged.raiseEvent(this))},ReferenceProperty.prototype._onCollectionChanged=function(e,t,i){var r=this._targetEntity;defined(r)&&-1!==i.indexOf(r)?(r.definitionChanged.removeEventListener(ReferenceProperty.prototype._onTargetEntityDefinitionChanged,this),this._targetEntity=this._targetProperty=void 0):defined(r)||defined(r=resolve$1(this))&&this._definitionChanged.raiseEvent(this)};var Rotation={packedLength:1,pack:function(e,t,i){return t[i=defaultValue(i,0)]=e,t},unpack:function(e,t,i){return e[t=defaultValue(t,0)]},convertPackedArrayForInterpolation:function(e,t,i,r){var n;defined(r)||(r=[]),t=defaultValue(t,0);for(var a=0,o=(i=defaultValue(i,e.length))-t+1;a<o;a++){var s=e[t+a];0===a||Math.abs(n-s)<Math.PI?r[a]=s:r[a]=s-CesiumMath.TWO_PI,n=s}},unpackInterpolationResult:function(e,t,i,r,n){return(n=e[0])<0?n+CesiumMath.TWO_PI:n}},PackableNumber={packedLength:1,pack:function(e,t,i){t[i=defaultValue(i,0)]=e},unpack:function(e,t,i){return e[t=defaultValue(t,0)]}};function arrayInsert(e,t,i){var r=e.length,n=i.length,a=r+n;if(e.length=a,r!==t)for(var o=r-1,s=a-1;t<=s;s--)e[s]=e[o--];for(s=0;s<n;s++)e[t++]=i[s]}function convertDate(e,t){return e instanceof JulianDate?e:"string"==typeof e?JulianDate.fromIso8601(e):JulianDate.addSeconds(t,e,new JulianDate)}var timesSpliceArgs=[],valuesSpliceArgs=[];function mergeNewSamples(e,t,i,r,n){for(var a,o,s,l,c,u,d=0;d<r.length;){var h=0,p=0;if((s=binarySearch(t,convertDate(r[d],e),JulianDate.compare))<0){for(l=(s=~s)*n,o=void 0,u=t[s];d<r.length&&(c=convertDate(r[d],e),!(defined(o)&&0<=JulianDate.compare(o,c)||defined(u)&&0<=JulianDate.compare(c,u)));){for(timesSpliceArgs[h++]=c,d+=1,a=0;a<n;a++)valuesSpliceArgs[p++]=r[d],d+=1;o=c}0<h&&(valuesSpliceArgs.length=p,arrayInsert(i,l,valuesSpliceArgs),timesSpliceArgs.length=h,arrayInsert(t,s,timesSpliceArgs))}else{for(a=0;a<n;a++)d++,i[s*n+a]=r[d];d++}}}function SampledProperty(e,t){var i=e;i===Number&&(i=PackableNumber);var r=i.packedLength,n=defaultValue(i.packedInterpolationLength,r),a=0;if(defined(t)){for(var o=t.length,s=new Array(o),l=0;l<o;l++){var c=t[l];c===Number&&(c=PackableNumber);var u=c.packedLength;r+=u,n+=defaultValue(c.packedInterpolationLength,u),s[l]=c}a=o}this._type=e,this._innerType=i,this._interpolationDegree=1,this._interpolationAlgorithm=LinearApproximation,this._numberOfPoints=0,this._times=[],this._values=[],this._xTable=[],this._yTable=[],this._packedLength=r,this._packedInterpolationLength=n,this._updateTableLength=!0,this._interpolationResult=new Array(n),this._definitionChanged=new Event,this._derivativeTypes=t,this._innerDerivativeTypes=s,this._inputOrder=a,this._forwardExtrapolationType=ExtrapolationType$1.NONE,this._forwardExtrapolationDuration=0,this._backwardExtrapolationType=ExtrapolationType$1.NONE,this._backwardExtrapolationDuration=0}function removeSamples(e,t,i){var r=e._packedLength;e._times.splice(t,i),e._values.splice(t*r,i*r),e._updateTableLength=!0,e._definitionChanged.raiseEvent(e)}function SampledPositionProperty(e,t){var i;if(0<(t=defaultValue(t,0))){i=new Array(t);for(var r=0;r<t;r++)i[r]=Cartesian3}this._numberOfDerivatives=t,this._property=new SampledProperty(Cartesian3,i),this._definitionChanged=new Event,this._referenceFrame=defaultValue(e,ReferenceFrame$1.FIXED),this._property._definitionChanged.addEventListener(function(){this._definitionChanged.raiseEvent(this)},this)}Object.defineProperties(SampledProperty.prototype,{isConstant:{get:function(){return 0===this._values.length}},definitionChanged:{get:function(){return this._definitionChanged}},type:{get:function(){return this._type}},derivativeTypes:{get:function(){return this._derivativeTypes}},interpolationDegree:{get:function(){return this._interpolationDegree}},interpolationAlgorithm:{get:function(){return this._interpolationAlgorithm}},forwardExtrapolationType:{get:function(){return this._forwardExtrapolationType},set:function(e){this._forwardExtrapolationType!==e&&(this._forwardExtrapolationType=e,this._definitionChanged.raiseEvent(this))}},forwardExtrapolationDuration:{get:function(){return this._forwardExtrapolationDuration},set:function(e){this._forwardExtrapolationDuration!==e&&(this._forwardExtrapolationDuration=e,this._definitionChanged.raiseEvent(this))}},backwardExtrapolationType:{get:function(){return this._backwardExtrapolationType},set:function(e){this._backwardExtrapolationType!==e&&(this._backwardExtrapolationType=e,this._definitionChanged.raiseEvent(this))}},backwardExtrapolationDuration:{get:function(){return this._backwardExtrapolationDuration},set:function(e){this._backwardExtrapolationDuration!==e&&(this._backwardExtrapolationDuration=e,this._definitionChanged.raiseEvent(this))}}}),SampledProperty.prototype.getValue=function(e,t){var i=this._times,r=i.length;if(0!==r){var n=this._innerType,a=this._values,o=binarySearch(i,e,JulianDate.compare);if(o<0){if(0===(o=~o)){var s=i[o],l=this._backwardExtrapolationDuration;if(this._backwardExtrapolationType===ExtrapolationType$1.NONE||0!==l&&JulianDate.secondsDifference(s,e)>l)return;if(this._backwardExtrapolationType===ExtrapolationType$1.HOLD)return n.unpack(a,0,t)}if(r<=o){var c=i[o=r-1];if(l=this._forwardExtrapolationDuration,this._forwardExtrapolationType===ExtrapolationType$1.NONE||0!==l&&JulianDate.secondsDifference(e,c)>l)return;if(this._forwardExtrapolationType===ExtrapolationType$1.HOLD)return o=r-1,n.unpack(a,o*n.packedLength,t)}var u,d=this._xTable,h=this._yTable,p=this._interpolationAlgorithm,m=this._packedInterpolationLength,f=this._inputOrder;this._updateTableLength&&(this._updateTableLength=!1,(u=Math.min(p.getRequiredDataPoints(this._interpolationDegree,f),r))!==this._numberOfPoints&&(this._numberOfPoints=u,d.length=u,h.length=u*m));var g=this._numberOfPoints-1;if(g<1)return;var _,y,v=0,C=r-1;1+g<=C-v+1&&((_=o-(g/2|0)-1)<v&&(_=v),C<(y=_+g)&&(_=(y=C)-g)<v&&(_=v),v=_,C=y);for(var S=C-v+1,T=0;T<S;++T)d[T]=JulianDate.secondsDifference(i[v+T],i[C]);if(defined(n.convertPackedArrayForInterpolation))n.convertPackedArrayForInterpolation(a,v,C,h);else for(var x=0,b=this._packedLength,E=v*b,P=(C+1)*b;E<P;)h[x]=a[E],E++,x++;var A,w,D=JulianDate.secondsDifference(e,i[C]);return w=0!==f&&defined(p.interpolate)?(A=Math.floor(m/(f+1)),p.interpolate(D,d,h,A,f,f,this._interpolationResult)):p.interpolateOrderZero(D,d,h,m,this._interpolationResult),defined(n.unpackInterpolationResult)?n.unpackInterpolationResult(w,a,v,C,t):n.unpack(w,0,t)}return n.unpack(a,o*this._packedLength,t)}},SampledProperty.prototype.setInterpolationOptions=function(e){var t,i,r;defined(e)&&(t=!1,i=e.interpolationAlgorithm,r=e.interpolationDegree,defined(i)&&this._interpolationAlgorithm!==i&&(this._interpolationAlgorithm=i,t=!0),defined(r)&&this._interpolationDegree!==r&&(this._interpolationDegree=r,t=!0),t&&(this._updateTableLength=!0,this._definitionChanged.raiseEvent(this)))},SampledProperty.prototype.addSample=function(e,t,i){var r=this._innerDerivativeTypes,n=defined(r),a=this._innerType,o=[];if(o.push(e),a.pack(t,o,o.length),n)for(var s=r.length,l=0;l<s;l++)r[l].pack(i[l],o,o.length);mergeNewSamples(void 0,this._times,this._values,o,this._packedLength),this._updateTableLength=!0,this._definitionChanged.raiseEvent(this)},SampledProperty.prototype.addSamples=function(e,t,i){for(var r=this._innerDerivativeTypes,n=defined(r),a=this._innerType,o=e.length,s=[],l=0;l<o;l++)if(s.push(e[l]),a.pack(t[l],s,s.length),n)for(var c=i[l],u=r.length,d=0;d<u;d++)r[d].pack(c[d],s,s.length);mergeNewSamples(void 0,this._times,this._values,s,this._packedLength),this._updateTableLength=!0,this._definitionChanged.raiseEvent(this)},SampledProperty.prototype.addSamplesPackedArray=function(e,t){mergeNewSamples(t,this._times,this._values,e,this._packedLength),this._updateTableLength=!0,this._definitionChanged.raiseEvent(this)},SampledProperty.prototype.removeSample=function(e){var t=binarySearch(this._times,e,JulianDate.compare);return!(t<0)&&(removeSamples(this,t,1),!0)},SampledProperty.prototype.removeSamples=function(e){var t=this._times,i=binarySearch(t,e.start,JulianDate.compare);i<0?i=~i:e.isStartIncluded||++i;var r=binarySearch(t,e.stop,JulianDate.compare);r<0?r=~r:e.isStopIncluded&&++r,removeSamples(this,i,r-i)},SampledProperty.prototype.equals=function(e){if(this===e)return!0;if(!defined(e))return!1;if(this._type!==e._type||this._interpolationDegree!==e._interpolationDegree||this._interpolationAlgorithm!==e._interpolationAlgorithm)return!1;var t,i=this._derivativeTypes,r=defined(i),n=e._derivativeTypes;if(r!==defined(n))return!1;if(r){if((a=i.length)!==n.length)return!1;for(t=0;t<a;t++)if(i[t]!==n[t])return!1}var a,o=this._times,s=e._times;if((a=o.length)!==s.length)return!1;for(t=0;t<a;t++)if(!JulianDate.equals(o[t],s[t]))return!1;var l=this._values,c=e._values;for(a=l.length,t=0;t<a;t++)if(l[t]!==c[t])return!1;return!0},SampledProperty._mergeNewSamples=mergeNewSamples,Object.defineProperties(SampledPositionProperty.prototype,{isConstant:{get:function(){return this._property.isConstant}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}},interpolationDegree:{get:function(){return this._property.interpolationDegree}},interpolationAlgorithm:{get:function(){return this._property.interpolationAlgorithm}},numberOfDerivatives:{get:function(){return this._numberOfDerivatives}},forwardExtrapolationType:{get:function(){return this._property.forwardExtrapolationType},set:function(e){this._property.forwardExtrapolationType=e}},forwardExtrapolationDuration:{get:function(){return this._property.forwardExtrapolationDuration},set:function(e){this._property.forwardExtrapolationDuration=e}},backwardExtrapolationType:{get:function(){return this._property.backwardExtrapolationType},set:function(e){this._property.backwardExtrapolationType=e}},backwardExtrapolationDuration:{get:function(){return this._property.backwardExtrapolationDuration},set:function(e){this._property.backwardExtrapolationDuration=e}}}),SampledPositionProperty.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,ReferenceFrame$1.FIXED,t)},SampledPositionProperty.prototype.getValueInReferenceFrame=function(e,t,i){if(defined(i=this._property.getValue(e,i)))return PositionProperty.convertToReferenceFrame(e,i,this._referenceFrame,t,i)},SampledPositionProperty.prototype.setInterpolationOptions=function(e){this._property.setInterpolationOptions(e)},SampledPositionProperty.prototype.addSample=function(e,t,i){this._numberOfDerivatives;this._property.addSample(e,t,i)},SampledPositionProperty.prototype.addSamples=function(e,t,i){this._property.addSamples(e,t,i)},SampledPositionProperty.prototype.addSamplesPackedArray=function(e,t){this._property.addSamplesPackedArray(e,t)},SampledPositionProperty.prototype.removeSample=function(e){return this._property.removeSample(e)},SampledPositionProperty.prototype.removeSamples=function(e){this._property.removeSamples(e)},SampledPositionProperty.prototype.equals=function(e){return this===e||e instanceof SampledPositionProperty&&Property.equals(this._property,e._property)&&this._referenceFrame===e._referenceFrame};var StripeOrientation={HORIZONTAL:0,VERTICAL:1},StripeOrientation$1=Object.freeze(StripeOrientation),defaultOrientation=StripeOrientation$1.HORIZONTAL,defaultEvenColor$1=Color.WHITE,defaultOddColor$1=Color.BLACK,defaultOffset$3=0,defaultRepeat$2=1;function StripeMaterialProperty(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._definitionChanged=new Event,this._orientation=void 0,this._orientationSubscription=void 0,this._evenColor=void 0,this._evenColorSubscription=void 0,this._oddColor=void 0,this._oddColorSubscription=void 0,this._offset=void 0,this._offsetSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this.orientation=e.orientation,this.evenColor=e.evenColor,this.oddColor=e.oddColor,this.offset=e.offset,this.repeat=e.repeat}function TimeIntervalCollectionPositionProperty(e){this._definitionChanged=new Event,this._intervals=new TimeIntervalCollection,this._intervals.changedEvent.addEventListener(TimeIntervalCollectionPositionProperty.prototype._intervalsChanged,this),this._referenceFrame=defaultValue(e,ReferenceFrame$1.FIXED)}function TimeIntervalCollectionProperty(){this._definitionChanged=new Event,this._intervals=new TimeIntervalCollection,this._intervals.changedEvent.addEventListener(TimeIntervalCollectionProperty.prototype._intervalsChanged,this)}function VelocityVectorProperty(e,t){this._position=void 0,this._subscription=void 0,this._definitionChanged=new Event,this._normalize=defaultValue(t,!0),this.position=e}Object.defineProperties(StripeMaterialProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._orientation)&&Property.isConstant(this._evenColor)&&Property.isConstant(this._oddColor)&&Property.isConstant(this._offset)&&Property.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},orientation:createPropertyDescriptor("orientation"),evenColor:createPropertyDescriptor("evenColor"),oddColor:createPropertyDescriptor("oddColor"),offset:createPropertyDescriptor("offset"),repeat:createPropertyDescriptor("repeat")}),StripeMaterialProperty.prototype.getType=function(e){return"Stripe"},StripeMaterialProperty.prototype.getValue=function(e,t){return defined(t)||(t={}),t.horizontal=Property.getValueOrDefault(this._orientation,e,defaultOrientation)===StripeOrientation$1.HORIZONTAL,t.evenColor=Property.getValueOrClonedDefault(this._evenColor,e,defaultEvenColor$1,t.evenColor),t.oddColor=Property.getValueOrClonedDefault(this._oddColor,e,defaultOddColor$1,t.oddColor),t.offset=Property.getValueOrDefault(this._offset,e,defaultOffset$3),t.repeat=Property.getValueOrDefault(this._repeat,e,defaultRepeat$2),t},StripeMaterialProperty.prototype.equals=function(e){return this===e||e instanceof StripeMaterialProperty&&Property.equals(this._orientation,e._orientation)&&Property.equals(this._evenColor,e._evenColor)&&Property.equals(this._oddColor,e._oddColor)&&Property.equals(this._offset,e._offset)&&Property.equals(this._repeat,e._repeat)},Object.defineProperties(TimeIntervalCollectionPositionProperty.prototype,{isConstant:{get:function(){return this._intervals.isEmpty}},definitionChanged:{get:function(){return this._definitionChanged}},intervals:{get:function(){return this._intervals}},referenceFrame:{get:function(){return this._referenceFrame}}}),TimeIntervalCollectionPositionProperty.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,ReferenceFrame$1.FIXED,t)},TimeIntervalCollectionPositionProperty.prototype.getValueInReferenceFrame=function(e,t,i){var r=this._intervals.findDataForIntervalContainingDate(e);if(defined(r))return PositionProperty.convertToReferenceFrame(e,r,this._referenceFrame,t,i)},TimeIntervalCollectionPositionProperty.prototype.equals=function(e){return this===e||e instanceof TimeIntervalCollectionPositionProperty&&this._intervals.equals(e._intervals,Property.equals)&&this._referenceFrame===e._referenceFrame},TimeIntervalCollectionPositionProperty.prototype._intervalsChanged=function(){this._definitionChanged.raiseEvent(this)},Object.defineProperties(TimeIntervalCollectionProperty.prototype,{isConstant:{get:function(){return this._intervals.isEmpty}},definitionChanged:{get:function(){return this._definitionChanged}},intervals:{get:function(){return this._intervals}}}),TimeIntervalCollectionProperty.prototype.getValue=function(e,t){var i=this._intervals.findDataForIntervalContainingDate(e);return defined(i)&&"function"==typeof i.clone?i.clone(t):i},TimeIntervalCollectionProperty.prototype.equals=function(e){return this===e||e instanceof TimeIntervalCollectionProperty&&this._intervals.equals(e._intervals,Property.equals)},TimeIntervalCollectionProperty.prototype._intervalsChanged=function(){this._definitionChanged.raiseEvent(this)},Object.defineProperties(VelocityVectorProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._position)}},definitionChanged:{get:function(){return this._definitionChanged}},position:{get:function(){return this._position},set:function(e){var t=this._position;t!==e&&(defined(t)&&this._subscription(),defined(this._position=e)&&(this._subscription=e._definitionChanged.addEventListener(function(){this._definitionChanged.raiseEvent(this)},this)),this._definitionChanged.raiseEvent(this))}},normalize:{get:function(){return this._normalize},set:function(e){this._normalize!==e&&(this._normalize=e,this._definitionChanged.raiseEvent(this))}}});var position1Scratch=new Cartesian3,position2Scratch=new Cartesian3,timeScratch=new JulianDate,step=1/60;function VelocityOrientationProperty(e,t){this._velocityVectorProperty=new VelocityVectorProperty(e,!0),this._subscription=void 0,this._ellipsoid=void 0,this._definitionChanged=new Event,this.ellipsoid=defaultValue(t,Ellipsoid.WGS84);var i=this;this._velocityVectorProperty.definitionChanged.addEventListener(function(){i._definitionChanged.raiseEvent(i)})}VelocityVectorProperty.prototype.getValue=function(e,t){return this._getValue(e,t)},VelocityVectorProperty.prototype._getValue=function(e,t,i){defined(t)||(t=new Cartesian3);var r=this._position;if(Property.isConstant(r))return this._normalize?void 0:Cartesian3.clone(Cartesian3.ZERO,t);var n=r.getValue(e,position1Scratch),a=r.getValue(JulianDate.addSeconds(e,step,timeScratch),position2Scratch);if(defined(n)&&(defined(a)||(a=n,defined(n=r.getValue(JulianDate.addSeconds(e,-step,timeScratch),position2Scratch))))){if(Cartesian3.equals(n,a))return this._normalize?void 0:Cartesian3.clone(Cartesian3.ZERO,t);defined(i)&&n.clone(i);var o=Cartesian3.subtract(a,n,t);return this._normalize?Cartesian3.normalize(o,t):Cartesian3.divideByScalar(o,step,t)}},VelocityVectorProperty.prototype.equals=function(e){return this===e||e instanceof VelocityVectorProperty&&Property.equals(this._position,e._position)},Object.defineProperties(VelocityOrientationProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._velocityVectorProperty)}},definitionChanged:{get:function(){return this._definitionChanged}},position:{get:function(){return this._velocityVectorProperty.position},set:function(e){this._velocityVectorProperty.position=e}},ellipsoid:{get:function(){return this._ellipsoid},set:function(e){this._ellipsoid!==e&&(this._ellipsoid=e,this._definitionChanged.raiseEvent(this))}}});var positionScratch$8=new Cartesian3,velocityScratch=new Cartesian3,rotationScratch=new Matrix3,currentId;function UnitCartesian3(){}function createReferenceProperty(e,t){return"#"===t[0]&&(t=currentId+t),ReferenceProperty.fromString(e,t)}function createSpecializedProperty(e,t,i){if(defined(i.reference))return createReferenceProperty(t,i.reference);if(defined(i.velocityReference)){var r=createReferenceProperty(t,i.velocityReference);switch(e){case Cartesian3:case UnitCartesian3:return new VelocityVectorProperty(r,e===UnitCartesian3);case Quaternion:return new VelocityOrientationProperty(r)}}throw new RuntimeError(JSON.stringify(i)+" is not valid CZML.")}function createAdapterProperty(i,r){return new CallbackProperty(function(e,t){return r(i.getValue(e,t))},i.isConstant)}VelocityOrientationProperty.prototype.getValue=function(e,t){var i=this._velocityVectorProperty._getValue(e,velocityScratch,positionScratch$8);if(defined(i))return Transforms.rotationMatrixFromPositionVelocity(positionScratch$8,i,this._ellipsoid,rotationScratch),Quaternion.fromRotationMatrix(rotationScratch,t)},VelocityOrientationProperty.prototype.equals=function(e){return this===e||e instanceof VelocityOrientationProperty&&Property.equals(this._velocityVectorProperty,e._velocityVectorProperty)&&(this._ellipsoid===e._ellipsoid||this._ellipsoid.equals(e._ellipsoid))},UnitCartesian3.packedLength=Cartesian3.packedLength,UnitCartesian3.unpack=Cartesian3.unpack,UnitCartesian3.pack=Cartesian3.pack;var scratchCartesian$6=new Cartesian3,scratchSpherical=new Spherical,scratchCartographic$8=new Cartographic,scratchTimeInterval=new TimeInterval,scratchQuaternion=new Quaternion;function unwrapColorInterval(e){var t=e.rgbaf;if(defined(t))return t;var i=e.rgba;if(defined(i)){var r=i.length;if(r===Color.packedLength)return[Color.byteToFloat(i[0]),Color.byteToFloat(i[1]),Color.byteToFloat(i[2]),Color.byteToFloat(i[3])];t=new Array(r);for(var n=0;n<r;n+=5)t[n]=i[n],t[n+1]=Color.byteToFloat(i[n+1]),t[n+2]=Color.byteToFloat(i[n+2]),t[n+3]=Color.byteToFloat(i[n+3]),t[n+4]=Color.byteToFloat(i[n+4]);return t}}function unwrapUriInterval(e,t){var i=defaultValue(e.uri,e);return defined(t)?t.getDerivedResource({url:i}):Resource.createIfNeeded(i)}function unwrapRectangleInterval(e){var t=e.wsen;if(defined(t))return t;var i=e.wsenDegrees;if(defined(i)){var r=i.length;if(r===Rectangle.packedLength)return[CesiumMath.toRadians(i[0]),CesiumMath.toRadians(i[1]),CesiumMath.toRadians(i[2]),CesiumMath.toRadians(i[3])];t=new Array(r);for(var n=0;n<r;n+=5)t[n]=i[n],t[n+1]=CesiumMath.toRadians(i[n+1]),t[n+2]=CesiumMath.toRadians(i[n+2]),t[n+3]=CesiumMath.toRadians(i[n+3]),t[n+4]=CesiumMath.toRadians(i[n+4]);return t}}function convertUnitSphericalToCartesian(e){var t=e.length;if(scratchSpherical.magnitude=1,2===t)return scratchSpherical.clock=e[0],scratchSpherical.cone=e[1],Cartesian3.fromSpherical(scratchSpherical,scratchCartesian$6),[scratchCartesian$6.x,scratchCartesian$6.y,scratchCartesian$6.z];for(var i=new Array(t/3*4),r=0,n=0;r<t;r+=3,n+=4)i[n]=e[r],scratchSpherical.clock=e[r+1],scratchSpherical.cone=e[r+2],Cartesian3.fromSpherical(scratchSpherical,scratchCartesian$6),i[n+1]=scratchCartesian$6.x,i[n+2]=scratchCartesian$6.y,i[n+3]=scratchCartesian$6.z;return i}function convertSphericalToCartesian(e){var t=e.length;if(3===t)return scratchSpherical.clock=e[0],scratchSpherical.cone=e[1],scratchSpherical.magnitude=e[2],Cartesian3.fromSpherical(scratchSpherical,scratchCartesian$6),[scratchCartesian$6.x,scratchCartesian$6.y,scratchCartesian$6.z];for(var i=new Array(t),r=0;r<t;r+=4)i[r]=e[r],scratchSpherical.clock=e[r+1],scratchSpherical.cone=e[r+2],scratchSpherical.magnitude=e[r+3],Cartesian3.fromSpherical(scratchSpherical,scratchCartesian$6),i[r+1]=scratchCartesian$6.x,i[r+2]=scratchCartesian$6.y,i[r+3]=scratchCartesian$6.z;return i}function convertCartographicRadiansToCartesian(e){var t=e.length;if(3===t)return scratchCartographic$8.longitude=e[0],scratchCartographic$8.latitude=e[1],scratchCartographic$8.height=e[2],Ellipsoid.WGS84.cartographicToCartesian(scratchCartographic$8,scratchCartesian$6),[scratchCartesian$6.x,scratchCartesian$6.y,scratchCartesian$6.z];for(var i=new Array(t),r=0;r<t;r+=4)i[r]=e[r],scratchCartographic$8.longitude=e[r+1],scratchCartographic$8.latitude=e[r+2],scratchCartographic$8.height=e[r+3],Ellipsoid.WGS84.cartographicToCartesian(scratchCartographic$8,scratchCartesian$6),i[r+1]=scratchCartesian$6.x,i[r+2]=scratchCartesian$6.y,i[r+3]=scratchCartesian$6.z;return i}function convertCartographicDegreesToCartesian(e){var t=e.length;if(3===t)return scratchCartographic$8.longitude=CesiumMath.toRadians(e[0]),scratchCartographic$8.latitude=CesiumMath.toRadians(e[1]),scratchCartographic$8.height=e[2],Ellipsoid.WGS84.cartographicToCartesian(scratchCartographic$8,scratchCartesian$6),[scratchCartesian$6.x,scratchCartesian$6.y,scratchCartesian$6.z];for(var i=new Array(t),r=0;r<t;r+=4)i[r]=e[r],scratchCartographic$8.longitude=CesiumMath.toRadians(e[r+1]),scratchCartographic$8.latitude=CesiumMath.toRadians(e[r+2]),scratchCartographic$8.height=e[r+3],Ellipsoid.WGS84.cartographicToCartesian(scratchCartographic$8,scratchCartesian$6),i[r+1]=scratchCartesian$6.x,i[r+2]=scratchCartesian$6.y,i[r+3]=scratchCartesian$6.z;return i}function unwrapCartesianInterval(e){var t=e.cartesian;if(defined(t))return t;var i=e.cartesianVelocity;if(defined(i))return i;var r=e.unitCartesian;if(defined(r))return r;var n=e.unitSpherical;if(defined(n))return convertUnitSphericalToCartesian(n);var a=e.spherical;if(defined(a))return convertSphericalToCartesian(a);var o=e.cartographicRadians;if(defined(o))return convertCartographicRadiansToCartesian(o);var s=e.cartographicDegrees;if(defined(s))return convertCartographicDegreesToCartesian(s);throw new RuntimeError(JSON.stringify(e)+" is not a valid CZML interval.")}function normalizePackedCartesianArray(e,t){Cartesian3.unpack(e,t,scratchCartesian$6),Cartesian3.normalize(scratchCartesian$6,scratchCartesian$6),Cartesian3.pack(scratchCartesian$6,e,t)}function unwrapUnitCartesianInterval(e){var t=unwrapCartesianInterval(e);if(3===t.length)return normalizePackedCartesianArray(t,0),t;for(var i=1;i<t.length;i+=4)normalizePackedCartesianArray(t,i);return t}function normalizePackedQuaternionArray(e,t){Quaternion.unpack(e,t,scratchQuaternion),Quaternion.normalize(scratchQuaternion,scratchQuaternion),Quaternion.pack(scratchQuaternion,e,t)}function unwrapQuaternionInterval(e){var t=e.unitQuaternion;if(defined(t)){if(4===t.length)return normalizePackedQuaternionArray(t,0),t;for(var i=1;i<t.length;i+=5)normalizePackedQuaternionArray(t,i)}return t}function getPropertyType(e){return"boolean"==typeof e?Boolean:"number"==typeof e?Number:"string"==typeof e?String:e.hasOwnProperty("array")?Array:e.hasOwnProperty("boolean")?Boolean:e.hasOwnProperty("boundingRectangle")?BoundingRectangle:e.hasOwnProperty("cartesian2")?Cartesian2:e.hasOwnProperty("cartesian")||e.hasOwnProperty("spherical")||e.hasOwnProperty("cartographicRadians")||e.hasOwnProperty("cartographicDegrees")?Cartesian3:e.hasOwnProperty("unitCartesian")||e.hasOwnProperty("unitSpherical")?UnitCartesian3:e.hasOwnProperty("rgba")||e.hasOwnProperty("rgbaf")?Color:e.hasOwnProperty("arcType")?ArcType$1:e.hasOwnProperty("classificationType")?ClassificationType$1:e.hasOwnProperty("colorBlendMode")?ColorBlendMode$1:e.hasOwnProperty("cornerType")?CornerType$1:e.hasOwnProperty("heightReference")?HeightReference$1:e.hasOwnProperty("horizontalOrigin")?HorizontalOrigin$1:e.hasOwnProperty("date")?JulianDate:e.hasOwnProperty("labelStyle")?LabelStyle$1:e.hasOwnProperty("number")?Number:e.hasOwnProperty("nearFarScalar")?NearFarScalar:e.hasOwnProperty("distanceDisplayCondition")?DistanceDisplayCondition:e.hasOwnProperty("object")||e.hasOwnProperty("value")?Object:e.hasOwnProperty("unitQuaternion")?Quaternion:e.hasOwnProperty("shadowMode")?ShadowMode$1:e.hasOwnProperty("string")?String:e.hasOwnProperty("stripeOrientation")?StripeOrientation$1:e.hasOwnProperty("wsen")||e.hasOwnProperty("wsenDegrees")?Rectangle:e.hasOwnProperty("uri")?URI:e.hasOwnProperty("verticalOrigin")?VerticalOrigin$1:Object}function unwrapInterval(e,t,i){switch(e){case ArcType$1:return ArcType$1[defaultValue(t.arcType,t)];case Array:return t.array;case Boolean:return defaultValue(t.boolean,t);case BoundingRectangle:return t.boundingRectangle;case Cartesian2:return t.cartesian2;case Cartesian3:return unwrapCartesianInterval(t);case UnitCartesian3:return unwrapUnitCartesianInterval(t);case Color:return unwrapColorInterval(t);case ClassificationType$1:return ClassificationType$1[defaultValue(t.classificationType,t)];case ColorBlendMode$1:return ColorBlendMode$1[defaultValue(t.colorBlendMode,t)];case CornerType$1:return CornerType$1[defaultValue(t.cornerType,t)];case HeightReference$1:return HeightReference$1[defaultValue(t.heightReference,t)];case HorizontalOrigin$1:return HorizontalOrigin$1[defaultValue(t.horizontalOrigin,t)];case Image:return unwrapUriInterval(t,i);case JulianDate:return JulianDate.fromIso8601(defaultValue(t.date,t));case LabelStyle$1:return LabelStyle$1[defaultValue(t.labelStyle,t)];case Number:return defaultValue(t.number,t);case NearFarScalar:return t.nearFarScalar;case DistanceDisplayCondition:return t.distanceDisplayCondition;case Object:return defaultValue(defaultValue(t.object,t.value),t);case Quaternion:return unwrapQuaternionInterval(t);case Rotation:return defaultValue(t.number,t);case ShadowMode$1:return ShadowMode$1[defaultValue(defaultValue(t.shadowMode,t.shadows),t)];case String:return defaultValue(t.string,t);case StripeOrientation$1:return StripeOrientation$1[defaultValue(t.stripeOrientation,t)];case Rectangle:return unwrapRectangleInterval(t);case URI:return unwrapUriInterval(t,i);case VerticalOrigin$1:return VerticalOrigin$1[defaultValue(t.verticalOrigin,t)];default:throw new RuntimeError(e)}}var interpolators={HERMITE:HermitePolynomialApproximation,LAGRANGE:LagrangePolynomialApproximation,LINEAR:LinearApproximation};function updateInterpolationSettings(e,t){var i=e.interpolationAlgorithm,r=e.interpolationDegree;(defined(i)||defined(r))&&t.setInterpolationOptions({interpolationAlgorithm:interpolators[i],interpolationDegree:r});var n=e.forwardExtrapolationType;defined(n)&&(t.forwardExtrapolationType=ExtrapolationType$1[n]);var a=e.forwardExtrapolationDuration;defined(a)&&(t.forwardExtrapolationDuration=a);var o=e.backwardExtrapolationType;defined(o)&&(t.backwardExtrapolationType=ExtrapolationType$1[o]);var s=e.backwardExtrapolationDuration;defined(s)&&(t.backwardExtrapolationDuration=s)}var iso8601Scratch={iso8601:void 0};function intervalFromString(e){if(defined(e))return iso8601Scratch.iso8601=e,TimeInterval.fromIso8601(iso8601Scratch)}function wrapPropertyInInfiniteInterval(e){var t=Iso8601.MAXIMUM_INTERVAL.clone();return t.data=e,t}function convertPropertyToComposite(e){var t=new CompositeProperty;return t.intervals.addInterval(wrapPropertyInInfiniteInterval(e)),t}function convertPositionPropertyToComposite(e){var t=new CompositePositionProperty(e.referenceFrame);return t.intervals.addInterval(wrapPropertyInInfiniteInterval(e)),t}function processProperty(e,t,i,r,n,a,o){var s,l,c,u=intervalFromString(r.interval);defined(n)&&(u=defined(u)?TimeInterval.intersect(u,n,scratchTimeInterval):n);var d=!defined(r.reference)&&!defined(r.velocityReference),h=defined(u)&&!u.equals(Iso8601.MAXIMUM_INTERVAL);if(!0===r.delete)return h?removePropertyData(t[i],u):void(t[i]=void 0);var p=!1;if(d){if(!defined(l=unwrapInterval(e,r,a)))return;s=defaultValue(e.packedLength,1),c=defaultValue(l.length,1),p=!defined(r.array)&&"string"!=typeof l&&s<c&&e!==Object}var m="function"==typeof e.unpack&&e!==Rotation;if(p||h){var f,g=t[i],_=r.epoch;if(defined(_)&&(f=JulianDate.fromIso8601(_)),p&&!h)return g instanceof SampledProperty||(t[i]=g=new SampledProperty(e)),g.addSamplesPackedArray(l,f),void updateInterpolationSettings(r,g);if(!p&&h)return(u=u.clone()).data=d?m?e.unpack(l,0):l:createSpecializedProperty(e,o,r),defined(g)||(t[i]=g=new(d?TimeIntervalCollectionProperty:CompositeProperty)),d&&g instanceof TimeIntervalCollectionProperty||(g instanceof CompositeProperty||(t[i]=g=convertPropertyToComposite(g)),d&&(u.data=new ConstantProperty(u.data))),void g.intervals.addInterval(u);defined(g)||(t[i]=g=new CompositeProperty),g instanceof CompositeProperty||(t[i]=g=convertPropertyToComposite(g));var y,v=g.intervals;defined(y=v.findInterval(u))&&y.data instanceof SampledProperty||((y=u.clone()).data=new SampledProperty(e),v.addInterval(y)),y.data.addSamplesPackedArray(l,f),updateInterpolationSettings(r,y.data)}else t[i]=d?new ConstantProperty(m?e.unpack(l,0):l):createSpecializedProperty(e,o,r)}function removePropertyData(e,t){if(e instanceof SampledProperty)e.removeSamples(t);else if(e instanceof TimeIntervalCollectionProperty)e.intervals.removeInterval(t);else if(e instanceof CompositeProperty){for(var i=e.intervals,r=0;r<i.length;++r){var n=TimeInterval.intersect(i.get(r),t,scratchTimeInterval);n.isEmpty||removePropertyData(n.data,t)}i.removeInterval(t)}else;}function processPacketData(e,t,i,r,n,a,o){if(defined(r))if(Array.isArray(r))for(var s=0,l=r.length;s<l;++s)processProperty(e,t,i,r[s],n,a,o);else processProperty(e,t,i,r,n,a,o)}function processPositionProperty(e,t,i,r,n,a){var o=intervalFromString(i.interval);defined(r)&&(o=defined(o)?TimeInterval.intersect(o,r,scratchTimeInterval):r);var s,l,c=defined(i.cartesianVelocity)?1:0,u=Cartesian3.packedLength*(1+c),d=!defined(i.reference),h=defined(o)&&!o.equals(Iso8601.MAXIMUM_INTERVAL);if(!0===i.delete)return h?removePositionPropertyData(e[t],o):void(e[t]=void 0);var p=!1;if(d&&(defined(i.referenceFrame)&&(l=ReferenceFrame$1[i.referenceFrame]),l=defaultValue(l,ReferenceFrame$1.FIXED),p=u<defaultValue((s=unwrapCartesianInterval(i)).length,1)),p||h){var m,f=e[t],g=i.epoch;if(defined(g)&&(m=JulianDate.fromIso8601(g)),p&&!h)return f instanceof SampledPositionProperty&&(!defined(l)||f.referenceFrame===l)||(e[t]=f=new SampledPositionProperty(l,c)),f.addSamplesPackedArray(s,m),void updateInterpolationSettings(i,f);if(!p&&h)return(o=o.clone()).data=d?Cartesian3.unpack(s):createReferenceProperty(a,i.reference),defined(f)||(f=new(d?TimeIntervalCollectionPositionProperty:CompositePositionProperty)(l),e[t]=f),d&&f instanceof TimeIntervalCollectionPositionProperty&&defined(l)&&f.referenceFrame===l||(f instanceof CompositePositionProperty||(e[t]=f=convertPositionPropertyToComposite(f)),d&&(o.data=new ConstantPositionProperty(o.data,l))),void f.intervals.addInterval(o);defined(f)?f instanceof CompositePositionProperty||(e[t]=f=convertPositionPropertyToComposite(f)):e[t]=f=new CompositePositionProperty(l);var _,y=f.intervals;defined(_=y.findInterval(o))&&_.data instanceof SampledPositionProperty&&(!defined(l)||_.data.referenceFrame===l)||((_=o.clone()).data=new SampledPositionProperty(l,c),y.addInterval(_)),_.data.addSamplesPackedArray(s,m),updateInterpolationSettings(i,_.data)}else e[t]=d?new ConstantPositionProperty(Cartesian3.unpack(s),l):createReferenceProperty(a,i.reference)}function removePositionPropertyData(e,t){if(e instanceof SampledPositionProperty)e.removeSamples(t);else if(e instanceof TimeIntervalCollectionPositionProperty)e.intervals.removeInterval(t);else if(e instanceof CompositePositionProperty){for(var i=e.intervals,r=0;r<i.length;++r){var n=TimeInterval.intersect(i.get(r),t,scratchTimeInterval);n.isEmpty||removePositionPropertyData(n.data,t)}i.removeInterval(t)}else;}function processPositionPacketData(e,t,i,r,n,a){if(defined(i))if(Array.isArray(i))for(var o=0,s=i.length;o<s;++o)processPositionProperty(e,t,i[o],r,n,a);else processPositionProperty(e,t,i,r,n,a)}function processShapePacketData(e,t,i,r){defined(i.references)?processReferencesArrayPacketData(e,t,i.references,i.interval,r,PropertyArray,CompositeProperty):(defined(i.cartesian)&&(i.array=Cartesian2.unpackArray(i.cartesian)),defined(i.array)&&processPacketData(Array,e,t,i,void 0,void 0,r))}function processMaterialProperty(e,t,i,r,n,a){var o=intervalFromString(i.interval);defined(r)&&(o=defined(o)?TimeInterval.intersect(o,r,scratchTimeInterval):r);var s,l,c,u,d=e[t];defined(o)?(d instanceof CompositeMaterialProperty||(d=new CompositeMaterialProperty,e[t]=d),defined(c=(l=d.intervals).findInterval({start:o.start,stop:o.stop}))?s=c.data:(c=o.clone(),l.addInterval(c))):s=d,defined(i.solidColor)?(s instanceof ColorMaterialProperty||(s=new ColorMaterialProperty),processPacketData(Color,s,"color",(u=i.solidColor).color,void 0,void 0,a)):defined(i.grid)?(s instanceof GridMaterialProperty||(s=new GridMaterialProperty),processPacketData(Color,s,"color",(u=i.grid).color,void 0,n,a),processPacketData(Number,s,"cellAlpha",u.cellAlpha,void 0,n,a),processPacketData(Cartesian2,s,"lineCount",u.lineCount,void 0,n,a),processPacketData(Cartesian2,s,"lineThickness",u.lineThickness,void 0,n,a),processPacketData(Cartesian2,s,"lineOffset",u.lineOffset,void 0,n,a)):defined(i.image)?(s instanceof ImageMaterialProperty||(s=new ImageMaterialProperty),u=i.image,processPacketData(Image,s,"image",u.image,void 0,n,a),processPacketData(Cartesian2,s,"repeat",u.repeat,void 0,n,a),processPacketData(Color,s,"color",u.color,void 0,n,a),processPacketData(Boolean,s,"transparent",u.transparent,void 0,n,a)):defined(i.stripe)?(s instanceof StripeMaterialProperty||(s=new StripeMaterialProperty),u=i.stripe,processPacketData(StripeOrientation$1,s,"orientation",u.orientation,void 0,n,a),processPacketData(Color,s,"evenColor",u.evenColor,void 0,n,a),processPacketData(Color,s,"oddColor",u.oddColor,void 0,n,a),processPacketData(Number,s,"offset",u.offset,void 0,n,a),processPacketData(Number,s,"repeat",u.repeat,void 0,n,a)):defined(i.polylineOutline)?(s instanceof PolylineOutlineMaterialProperty||(s=new PolylineOutlineMaterialProperty),processPacketData(Color,s,"color",(u=i.polylineOutline).color,void 0,n,a),processPacketData(Color,s,"outlineColor",u.outlineColor,void 0,n,a),processPacketData(Number,s,"outlineWidth",u.outlineWidth,void 0,n,a)):defined(i.polylineGlow)?(s instanceof PolylineGlowMaterialProperty||(s=new PolylineGlowMaterialProperty),processPacketData(Color,s,"color",(u=i.polylineGlow).color,void 0,n,a),processPacketData(Number,s,"glowPower",u.glowPower,void 0,n,a),processPacketData(Number,s,"taperPower",u.taperPower,void 0,n,a)):defined(i.polylineArrow)?(s instanceof PolylineArrowMaterialProperty||(s=new PolylineArrowMaterialProperty),processPacketData(Color,s,"color",(u=i.polylineArrow).color,void 0,void 0,a)):defined(i.polylineDash)?(s instanceof PolylineDashMaterialProperty||(s=new PolylineDashMaterialProperty),processPacketData(Color,s,"color",(u=i.polylineDash).color,void 0,void 0,a),processPacketData(Color,s,"gapColor",u.gapColor,void 0,void 0,a),processPacketData(Number,s,"dashLength",u.dashLength,void 0,n,a),processPacketData(Number,s,"dashPattern",u.dashPattern,void 0,n,a)):defined(i.checkerboard)&&(s instanceof CheckerboardMaterialProperty||(s=new CheckerboardMaterialProperty),processPacketData(Color,s,"evenColor",(u=i.checkerboard).evenColor,void 0,n,a),processPacketData(Color,s,"oddColor",u.oddColor,void 0,n,a),processPacketData(Cartesian2,s,"repeat",u.repeat,void 0,n,a)),defined(c)?c.data=s:e[t]=s}function processMaterialPacketData(e,t,i,r,n,a){if(defined(i))if(Array.isArray(i))for(var o=0,s=i.length;o<s;++o)processMaterialProperty(e,t,i[o],r,n,a);else processMaterialProperty(e,t,i,r,n,a)}function processName(e,t,i,r){defined(t.name)&&(e.name=t.name)}function processDescription(e,t,i,r){var n=t.description;defined(n)&&processPacketData(String,e,"description",n,void 0,r,i)}function processPosition(e,t,i,r){var n=t.position;defined(n)&&processPositionPacketData(e,"position",n,void 0,r,i)}function processViewFrom(e,t,i,r){var n=t.viewFrom;defined(n)&&processPacketData(Cartesian3,e,"viewFrom",n,void 0,r,i)}function processOrientation(e,t,i,r){var n=t.orientation;defined(n)&&processPacketData(Quaternion,e,"orientation",n,void 0,r,i)}function processProperties(e,t,i,r){var n=t.properties;if(defined(n))for(var a in defined(e.properties)||(e.properties=new PropertyBag),n)if(n.hasOwnProperty(a)){e.properties.hasProperty(a)||e.properties.addProperty(a);var o=n[a];if(Array.isArray(o))for(var s=0,l=o.length;s<l;++s)processProperty(getPropertyType(o[s]),e.properties,a,o[s],void 0,r,i);else processProperty(getPropertyType(o),e.properties,a,o,void 0,r,i)}}function processReferencesArrayPacketData(e,t,i,r,n,a,o){var s,l,c=i.map(function(e){return createReferenceProperty(n,e)});defined(r)?(r=intervalFromString(r),(s=e[t])instanceof o||((l=new o).intervals.addInterval(wrapPropertyInInfiniteInterval(s)),e[t]=s=l),r.data=new a(c),s.intervals.addInterval(r)):e[t]=new a(c)}function processArrayPacketData(e,t,i,r){var n=i.references;defined(n)?processReferencesArrayPacketData(e,t,n,i.interval,r,PropertyArray,CompositeProperty):processPacketData(Array,e,t,i,void 0,void 0,r)}function processArray(e,t,i,r){if(defined(i))if(Array.isArray(i))for(var n=0,a=i.length;n<a;++n)processArrayPacketData(e,t,i[n],r);else processArrayPacketData(e,t,i,r)}function processPositionArrayPacketData(e,t,i,r){var n=i.references;defined(n)?processReferencesArrayPacketData(e,t,n,i.interval,r,PositionPropertyArray,CompositePositionProperty):(defined(i.cartesian)?i.array=Cartesian3.unpackArray(i.cartesian):defined(i.cartographicRadians)?i.array=Cartesian3.fromRadiansArrayHeights(i.cartographicRadians):defined(i.cartographicDegrees)&&(i.array=Cartesian3.fromDegreesArrayHeights(i.cartographicDegrees)),defined(i.array)&&processPacketData(Array,e,t,i,void 0,void 0,r))}function processPositionArray(e,t,i,r){if(defined(i))if(Array.isArray(i))for(var n=0,a=i.length;n<a;++n)processPositionArrayPacketData(e,t,i[n],r);else processPositionArrayPacketData(e,t,i,r)}function unpackCartesianArray(e){return Cartesian3.unpackArray(e)}function unpackCartographicRadiansArray(e){return Cartesian3.fromRadiansArrayHeights(e)}function unpackCartographicDegreesArray(e){return Cartesian3.fromDegreesArrayHeights(e)}function processPositionArrayOfArraysPacketData(e,t,i,r){var n,a=i.references;defined(a)?(n=a.map(function(e){var t={};return processReferencesArrayPacketData(t,"positions",e,i.interval,r,PositionPropertyArray,CompositePositionProperty),t.positions}),e[t]=new PositionPropertyArray(n)):(defined(i.cartesian)?i.array=i.cartesian.map(unpackCartesianArray):defined(i.cartographicRadians)?i.array=i.cartographicRadians.map(unpackCartographicRadiansArray):defined(i.cartographicDegrees)&&(i.array=i.cartographicDegrees.map(unpackCartographicDegreesArray)),defined(i.array)&&processPacketData(Array,e,t,i,void 0,void 0,r))}function processPositionArrayOfArrays(e,t,i,r){if(defined(i))if(Array.isArray(i))for(var n=0,a=i.length;n<a;++n)processPositionArrayOfArraysPacketData(e,t,i[n],r);else processPositionArrayOfArraysPacketData(e,t,i,r)}function processShape(e,t,i,r){if(defined(i))if(Array.isArray(i))for(var n=0,a=i.length;n<a;n++)processShapePacketData(e,t,i[n],r);else processShapePacketData(e,t,i,r)}function processAvailability(e,t,i,r){var n,a=t.availability;if(defined(a)){if(Array.isArray(a))for(var o=0,s=a.length;o<s;++o)defined(n)||(n=new TimeIntervalCollection),n.addInterval(intervalFromString(a[o]));else(n=new TimeIntervalCollection).addInterval(intervalFromString(a));e.availability=n}}function processAlignedAxis(e,t,i,r,n){defined(t)&&processPacketData(UnitCartesian3,e,"alignedAxis",t,i,r,n)}function processBillboard(e,t,i,r){var n,a,o=t.billboard;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.billboard)||(e.billboard=a=new BillboardGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Image,a,"image",o.image,n,r,i),processPacketData(Number,a,"scale",o.scale,n,r,i),processPacketData(Cartesian2,a,"pixelOffset",o.pixelOffset,n,r,i),processPacketData(Cartesian3,a,"eyeOffset",o.eyeOffset,n,r,i),processPacketData(HorizontalOrigin$1,a,"horizontalOrigin",o.horizontalOrigin,n,r,i),processPacketData(VerticalOrigin$1,a,"verticalOrigin",o.verticalOrigin,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Color,a,"color",o.color,n,r,i),processPacketData(Rotation,a,"rotation",o.rotation,n,r,i),processAlignedAxis(a,o.alignedAxis,n,r,i),processPacketData(Boolean,a,"sizeInMeters",o.sizeInMeters,n,r,i),processPacketData(Number,a,"width",o.width,n,r,i),processPacketData(Number,a,"height",o.height,n,r,i),processPacketData(NearFarScalar,a,"scaleByDistance",o.scaleByDistance,n,r,i),processPacketData(NearFarScalar,a,"translucencyByDistance",o.translucencyByDistance,n,r,i),processPacketData(NearFarScalar,a,"pixelOffsetScaleByDistance",o.pixelOffsetScaleByDistance,n,r,i),processPacketData(BoundingRectangle,a,"imageSubRegion",o.imageSubRegion,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(Number,a,"disableDepthTestDistance",o.disableDepthTestDistance,n,r,i))}function processBox(e,t,i,r){var n,a,o=t.box;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.box)||(e.box=a=new BoxGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Cartesian3,a,"dimensions",o.dimensions,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i))}function processCorridor(e,t,i,r){var n,a,o=t.corridor;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.corridor)||(e.corridor=a=new CorridorGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPositionArray(a,"positions",o.positions,i),processPacketData(Number,a,"width",o.width,n,r,i),processPacketData(Number,a,"height",o.height,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Number,a,"extrudedHeight",o.extrudedHeight,n,r,i),processPacketData(HeightReference$1,a,"extrudedHeightReference",o.extrudedHeightReference,n,r,i),processPacketData(CornerType$1,a,"cornerType",o.cornerType,n,r,i),processPacketData(Number,a,"granularity",o.granularity,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(ClassificationType$1,a,"classificationType",o.classificationType,n,r,i),processPacketData(Number,a,"zIndex",o.zIndex,n,r,i))}function processCylinder(e,t,i,r){var n,a,o=t.cylinder;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.cylinder)||(e.cylinder=a=new CylinderGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Number,a,"length",o.length,n,r,i),processPacketData(Number,a,"topRadius",o.topRadius,n,r,i),processPacketData(Number,a,"bottomRadius",o.bottomRadius,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(Number,a,"numberOfVerticalLines",o.numberOfVerticalLines,n,r,i),processPacketData(Number,a,"slices",o.slices,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i))}function processDocument(e,t){var i=e.version;if(defined(i)&&"string"==typeof i){var r=i.split(".");if(2===r.length){if("1"!==r[0])throw new RuntimeError("Cesium only supports CZML version 1.");t._version=i}}if(!defined(t._version))throw new RuntimeError("CZML version information invalid. It is expected to be a property on the document object in the <Major>.<Minor> version format.");var n=t._documentPacket;defined(e.name)&&(n.name=e.name);var a,o=e.clock;defined(o)&&(defined(a=n.clock)?(a.interval=defaultValue(o.interval,a.interval),a.currentTime=defaultValue(o.currentTime,a.currentTime),a.range=defaultValue(o.range,a.range),a.step=defaultValue(o.step,a.step),a.multiplier=defaultValue(o.multiplier,a.multiplier)):n.clock={interval:o.interval,currentTime:o.currentTime,range:o.range,step:o.step,multiplier:o.multiplier})}function processEllipse(e,t,i,r){var n,a,o=t.ellipse;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.ellipse)||(e.ellipse=a=new EllipseGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Number,a,"semiMajorAxis",o.semiMajorAxis,n,r,i),processPacketData(Number,a,"semiMinorAxis",o.semiMinorAxis,n,r,i),processPacketData(Number,a,"height",o.height,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Number,a,"extrudedHeight",o.extrudedHeight,n,r,i),processPacketData(HeightReference$1,a,"extrudedHeightReference",o.extrudedHeightReference,n,r,i),processPacketData(Rotation,a,"rotation",o.rotation,n,r,i),processPacketData(Rotation,a,"stRotation",o.stRotation,n,r,i),processPacketData(Number,a,"granularity",o.granularity,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(Number,a,"numberOfVerticalLines",o.numberOfVerticalLines,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(ClassificationType$1,a,"classificationType",o.classificationType,n,r,i),processPacketData(Number,a,"zIndex",o.zIndex,n,r,i))}function processEllipsoid(e,t,i,r){var n,a,o=t.ellipsoid;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.ellipsoid)||(e.ellipsoid=a=new EllipsoidGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Cartesian3,a,"radii",o.radii,n,r,i),processPacketData(Cartesian3,a,"innerRadii",o.innerRadii,n,r,i),processPacketData(Number,a,"minimumClock",o.minimumClock,n,r,i),processPacketData(Number,a,"maximumClock",o.maximumClock,n,r,i),processPacketData(Number,a,"minimumCone",o.minimumCone,n,r,i),processPacketData(Number,a,"maximumCone",o.maximumCone,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(Number,a,"stackPartitions",o.stackPartitions,n,r,i),processPacketData(Number,a,"slicePartitions",o.slicePartitions,n,r,i),processPacketData(Number,a,"subdivisions",o.subdivisions,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i))}function processLabel(e,t,i,r){var n,a,o=t.label;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.label)||(e.label=a=new LabelGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(String,a,"text",o.text,n,r,i),processPacketData(String,a,"font",o.font,n,r,i),processPacketData(LabelStyle$1,a,"style",o.style,n,r,i),processPacketData(Number,a,"scale",o.scale,n,r,i),processPacketData(Boolean,a,"showBackground",o.showBackground,n,r,i),processPacketData(Color,a,"backgroundColor",o.backgroundColor,n,r,i),processPacketData(Cartesian2,a,"backgroundPadding",o.backgroundPadding,n,r,i),processPacketData(Cartesian2,a,"pixelOffset",o.pixelOffset,n,r,i),processPacketData(Cartesian3,a,"eyeOffset",o.eyeOffset,n,r,i),processPacketData(HorizontalOrigin$1,a,"horizontalOrigin",o.horizontalOrigin,n,r,i),processPacketData(VerticalOrigin$1,a,"verticalOrigin",o.verticalOrigin,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Color,a,"fillColor",o.fillColor,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(NearFarScalar,a,"translucencyByDistance",o.translucencyByDistance,n,r,i),processPacketData(NearFarScalar,a,"pixelOffsetScaleByDistance",o.pixelOffsetScaleByDistance,n,r,i),processPacketData(NearFarScalar,a,"scaleByDistance",o.scaleByDistance,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(Number,a,"disableDepthTestDistance",o.disableDepthTestDistance,n,r,i))}function processModel(e,t,i,r){var n=t.model;if(defined(n)){var a,o,s=intervalFromString(n.interval),l=e.model;defined(l)||(e.model=l=new ModelGraphics),processPacketData(Boolean,l,"show",n.show,s,r,i),processPacketData(URI,l,"uri",n.gltf,s,r,i),processPacketData(Number,l,"scale",n.scale,s,r,i),processPacketData(Number,l,"minimumPixelSize",n.minimumPixelSize,s,r,i),processPacketData(Number,l,"maximumScale",n.maximumScale,s,r,i),processPacketData(Boolean,l,"incrementallyLoadTextures",n.incrementallyLoadTextures,s,r,i),processPacketData(Boolean,l,"runAnimations",n.runAnimations,s,r,i),processPacketData(Boolean,l,"clampAnimations",n.clampAnimations,s,r,i),processPacketData(ShadowMode$1,l,"shadows",n.shadows,s,r,i),processPacketData(HeightReference$1,l,"heightReference",n.heightReference,s,r,i),processPacketData(Color,l,"silhouetteColor",n.silhouetteColor,s,r,i),processPacketData(Number,l,"silhouetteSize",n.silhouetteSize,s,r,i),processPacketData(Color,l,"color",n.color,s,r,i),processPacketData(ColorBlendMode$1,l,"colorBlendMode",n.colorBlendMode,s,r,i),processPacketData(Number,l,"colorBlendAmount",n.colorBlendAmount,s,r,i),processPacketData(DistanceDisplayCondition,l,"distanceDisplayCondition",n.distanceDisplayCondition,s,r,i);var c=n.nodeTransformations;if(defined(c))if(Array.isArray(c))for(a=0,o=c.length;a<o;++a)processNodeTransformations(l,c[a],s,r,i);else processNodeTransformations(l,c,s,r,i);var u=n.articulations;if(defined(u))if(Array.isArray(u))for(a=0,o=u.length;a<o;++a)processArticulations(l,u[a],s,r,i);else processArticulations(l,u,s,r,i)}}function processNodeTransformations(e,t,i,r,n){var a=intervalFromString(t.interval);defined(i)&&(a=defined(a)?TimeInterval.intersect(a,i,scratchTimeInterval):i);for(var o=e.nodeTransformations,s=Object.keys(t),l=0,c=s.length;l<c;++l){var u,d,h=s[l];"interval"!==h&&(defined(u=t[h])&&(defined(o)||(e.nodeTransformations=o=new PropertyBag),o.hasProperty(h)||o.addProperty(h),defined(d=o[h])||(o[h]=d=new NodeTransformationProperty),processPacketData(Cartesian3,d,"translation",u.translation,a,r,n),processPacketData(Quaternion,d,"rotation",u.rotation,a,r,n),processPacketData(Cartesian3,d,"scale",u.scale,a,r,n)))}}function processArticulations(e,t,i,r,n){var a=intervalFromString(t.interval);defined(i)&&(a=defined(a)?TimeInterval.intersect(a,i,scratchTimeInterval):i);for(var o=e.articulations,s=Object.keys(t),l=0,c=s.length;l<c;++l){var u,d=s[l];"interval"!==d&&(defined(u=t[d])&&(defined(o)||(e.articulations=o=new PropertyBag),o.hasProperty(d)||o.addProperty(d),processPacketData(Number,o,d,u,a,r,n)))}}function processPath(e,t,i,r){var n,a,o=t.path;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.path)||(e.path=a=new PathGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Number,a,"leadTime",o.leadTime,n,r,i),processPacketData(Number,a,"trailTime",o.trailTime,n,r,i),processPacketData(Number,a,"width",o.width,n,r,i),processPacketData(Number,a,"resolution",o.resolution,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i))}function processPoint(e,t,i,r){var n,a,o=t.point;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.point)||(e.point=a=new PointGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Number,a,"pixelSize",o.pixelSize,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Color,a,"color",o.color,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(NearFarScalar,a,"scaleByDistance",o.scaleByDistance,n,r,i),processPacketData(NearFarScalar,a,"translucencyByDistance",o.translucencyByDistance,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(Number,a,"disableDepthTestDistance",o.disableDepthTestDistance,n,r,i))}function PolygonHierarchyProperty(e){this.polygon=e,this._definitionChanged=new Event}function processPolygon(e,t,i,r){var n,a,o=t.polygon;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.polygon)||(e.polygon=a=new PolygonGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPositionArray(a,"_positions",o.positions,i),processPositionArrayOfArrays(a,"_holes",o.holes,i),(defined(a._positions)||defined(a._holes))&&(a.hierarchy=new PolygonHierarchyProperty(a)),processPacketData(Number,a,"height",o.height,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Number,a,"extrudedHeight",o.extrudedHeight,n,r,i),processPacketData(HeightReference$1,a,"extrudedHeightReference",o.extrudedHeightReference,n,r,i),processPacketData(Rotation,a,"stRotation",o.stRotation,n,r,i),processPacketData(Number,a,"granularity",o.granularity,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(Boolean,a,"perPositionHeight",o.perPositionHeight,n,r,i),processPacketData(Boolean,a,"closeTop",o.closeTop,n,r,i),processPacketData(Boolean,a,"closeBottom",o.closeBottom,n,r,i),processPacketData(ArcType$1,a,"arcType",o.arcType,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(ClassificationType$1,a,"classificationType",o.classificationType,n,r,i),processPacketData(Number,a,"zIndex",o.zIndex,n,r,i))}function adaptFollowSurfaceToArcType(e){return e?ArcType$1.GEODESIC:ArcType$1.NONE}function processPolyline(e,t,i,r){var n,a,o,s=t.polyline;defined(s)&&(n=intervalFromString(s.interval),defined(a=e.polyline)||(e.polyline=a=new PolylineGraphics),processPacketData(Boolean,a,"show",s.show,n,r,i),processPositionArray(a,"positions",s.positions,i),processPacketData(Number,a,"width",s.width,n,r,i),processPacketData(Number,a,"granularity",s.granularity,n,r,i),processMaterialPacketData(a,"material",s.material,n,r,i),processMaterialPacketData(a,"depthFailMaterial",s.depthFailMaterial,n,r,i),processPacketData(ArcType$1,a,"arcType",s.arcType,n,r,i),processPacketData(Boolean,a,"clampToGround",s.clampToGround,n,r,i),processPacketData(ShadowMode$1,a,"shadows",s.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",s.distanceDisplayCondition,n,r,i),processPacketData(ClassificationType$1,a,"classificationType",s.classificationType,n,r,i),processPacketData(Number,a,"zIndex",s.zIndex,n,r,i),defined(s.followSurface)&&!defined(s.arcType)&&(o={},processPacketData(Boolean,o,"followSurface",s.followSurface,n,r,i),a.arcType=createAdapterProperty(o.followSurface,adaptFollowSurfaceToArcType)))}function processPolylineVolume(e,t,i,r){var n,a,o=t.polylineVolume;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.polylineVolume)||(e.polylineVolume=a=new PolylineVolumeGraphics),processPositionArray(a,"positions",o.positions,i),processShape(a,"shape",o.shape,i),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(CornerType$1,a,"cornerType",o.cornerType,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(Number,a,"granularity",o.granularity,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i))}function processRectangle(e,t,i,r){var n,a,o=t.rectangle;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.rectangle)||(e.rectangle=a=new RectangleGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(Rectangle,a,"coordinates",o.coordinates,n,r,i),processPacketData(Number,a,"height",o.height,n,r,i),processPacketData(HeightReference$1,a,"heightReference",o.heightReference,n,r,i),processPacketData(Number,a,"extrudedHeight",o.extrudedHeight,n,r,i),processPacketData(HeightReference$1,a,"extrudedHeightReference",o.extrudedHeightReference,n,r,i),processPacketData(Rotation,a,"rotation",o.rotation,n,r,i),processPacketData(Rotation,a,"stRotation",o.stRotation,n,r,i),processPacketData(Number,a,"granularity",o.granularity,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i),processPacketData(ClassificationType$1,a,"classificationType",o.classificationType,n,r,i),processPacketData(Number,a,"zIndex",o.zIndex,n,r,i))}function processTileset(e,t,i,r){var n,a,o=t.tileset;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.tileset)||(e.tileset=a=new Cesium3DTilesetGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPacketData(URI,a,"uri",o.uri,n,r,i),processPacketData(Number,a,"maximumScreenSpaceError",o.maximumScreenSpaceError,n,r,i))}function processWall(e,t,i,r){var n,a,o=t.wall;defined(o)&&(n=intervalFromString(o.interval),defined(a=e.wall)||(e.wall=a=new WallGraphics),processPacketData(Boolean,a,"show",o.show,n,r,i),processPositionArray(a,"positions",o.positions,i),processArray(a,"minimumHeights",o.minimumHeights,i),processArray(a,"maximumHeights",o.maximumHeights,i),processPacketData(Number,a,"granularity",o.granularity,n,r,i),processPacketData(Boolean,a,"fill",o.fill,n,r,i),processMaterialPacketData(a,"material",o.material,n,r,i),processPacketData(Boolean,a,"outline",o.outline,n,r,i),processPacketData(Color,a,"outlineColor",o.outlineColor,n,r,i),processPacketData(Number,a,"outlineWidth",o.outlineWidth,n,r,i),processPacketData(ShadowMode$1,a,"shadows",o.shadows,n,r,i),processPacketData(DistanceDisplayCondition,a,"distanceDisplayCondition",o.distanceDisplayCondition,n,r,i))}function processCzmlPacket(e,t,i,r,n){var a=e.id;if(defined(a)||(a=createGuid()),currentId=a,!defined(n._version)&&"document"!==a)throw new RuntimeError("The first CZML packet is required to be the document object.");if(!0===e.delete)t.removeById(a);else if("document"===a)processDocument(e,n);else{var o=t.getOrCreateEntity(a),s=e.parent;defined(s)&&(o.parent=t.getOrCreateEntity(s));for(var l=i.length-1;-1<l;l--)i[l](o,e,t,r)}currentId=void 0}function updateClock(e){var t=e._documentPacket.clock;if(!defined(t)){if(!defined(e._clock)){var i=e._entityCollection.computeAvailability();if(!i.start.equals(Iso8601.MINIMUM_VALUE)){var r,n=i.start,a=i.stop,o=JulianDate.secondsDifference(a,n),s=Math.round(o/120);return(r=new DataSourceClock).startTime=JulianDate.clone(n),r.stopTime=JulianDate.clone(a),r.clockRange=ClockRange$1.LOOP_STOP,r.multiplier=s,r.currentTime=JulianDate.clone(n),r.clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER,e._clock=r,!0}}return!1}defined(e._clock)?r=e._clock.clone():((r=new DataSourceClock).startTime=Iso8601.MINIMUM_VALUE.clone(),r.stopTime=Iso8601.MAXIMUM_VALUE.clone(),r.currentTime=Iso8601.MINIMUM_VALUE.clone(),r.clockRange=ClockRange$1.LOOP_STOP,r.clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER,r.multiplier=1);var l=intervalFromString(t.interval);return defined(l)&&(r.startTime=l.start,r.stopTime=l.stop),defined(t.currentTime)&&(r.currentTime=JulianDate.fromIso8601(t.currentTime)),defined(t.range)&&(r.clockRange=defaultValue(ClockRange$1[t.range],ClockRange$1.LOOP_STOP)),defined(t.step)&&(r.clockStep=defaultValue(ClockStep$1[t.step],ClockStep$1.SYSTEM_CLOCK_MULTIPLIER)),defined(t.multiplier)&&(r.multiplier=t.multiplier),!r.equals(e._clock)&&(e._clock=r.clone(e._clock),!0)}function load(t,e,i,r){var n=e,a=(i=defaultValue(i,defaultValue.EMPTY_OBJECT)).sourceUri,o=i.credit;if("string"==typeof o&&(o=new Credit(o)),t._credit=o,"string"==typeof e||e instanceof Resource){n=(e=Resource.createIfNeeded(e)).fetchJson(),a=defaultValue(a,e.clone());var s=t._resourceCredits,l=e.credits;if(defined(l))for(var c=l.length,u=0;u<c;u++)s.push(l[u])}return a=Resource.createIfNeeded(a),DataSource.setLoading(t,!0),when(n,function(e){return loadCzml(t,e,a,r)}).otherwise(function(e){return DataSource.setLoading(t,!1),t._error.raiseEvent(t,e),console.log(e),when.reject(e)})}function loadCzml(e,t,i,r){DataSource.setLoading(e,!0);var n=e._entityCollection;r&&(e._version=void 0,e._documentPacket=new DocumentPacket,n.removeAll()),CzmlDataSource._processCzml(t,n,i,void 0,e);var a=updateClock(e),o=e._documentPacket;return defined(o.name)&&e._name!==o.name?(e._name=o.name,a=!0):!defined(e._name)&&defined(i)&&(e._name=getFilenameFromUri(i.getUrlComponent()),a=!0),DataSource.setLoading(e,!1),a&&e._changed.raiseEvent(e),e}function DocumentPacket(){this.name=void 0,this.clock=void 0}function CzmlDataSource(e){this._name=e,this._changed=new Event,this._error=new Event,this._isLoading=!1,this._loading=new Event,this._clock=void 0,this._documentPacket=new DocumentPacket,this._version=void 0,this._entityCollection=new EntityCollection(this),this._entityCluster=new EntityCluster,this._credit=void 0,this._resourceCredits=[]}function DataSourceCollection(){this._dataSources=[],this._dataSourceAdded=new Event,this._dataSourceRemoved=new Event,this._dataSourceMoved=new Event}function getIndex(e,t){return e.indexOf(t)}function swapDataSources(e,t,i){var r,n=e._dataSources,a=n.length-1;(t=CesiumMath.clamp(t,0,a))!==(i=CesiumMath.clamp(i,0,a))&&(r=n[t],n[t]=n[i],n[i]=r,e.dataSourceMoved.raiseEvent(r,i,t))}function PrimitiveCollection(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._primitives=[],this._guid=createGuid(),this._zIndex=void 0,this.show=defaultValue(e.show,!0),this.destroyPrimitives=defaultValue(e.destroyPrimitives,!0)}function getPrimitiveIndex(e,t){return e._primitives.indexOf(t)}function OrderedGroundPrimitiveCollection(){this._length=0,this._collections={},this._collectionsArray=[],this.show=!0}function DynamicGeometryBatch(e,t){this._primitives=e,this._orderedGroundPrimitives=t,this._dynamicUpdaters=new AssociativeArray}Object.defineProperties(PolygonHierarchyProperty.prototype,{isConstant:{get:function(){var e=this.polygon._positions,t=this.polygon._holes;return(!defined(e)||e.isConstant)&&(!defined(t)||t.isConstant)}},definitionChanged:{get:function(){return this._definitionChanged}}}),PolygonHierarchyProperty.prototype.getValue=function(e,t){var i,r;return defined(this.polygon._positions)&&(i=this.polygon._positions.getValue(e)),defined(this.polygon._holes)&&defined(r=this.polygon._holes.getValue(e))&&(r=r.map(function(e){return new PolygonHierarchy(e)})),defined(t)?(t.positions=i,t.holes=r,t):new PolygonHierarchy(i,r)},PolygonHierarchyProperty.prototype.equals=function(e){return this===e||e instanceof PolygonHierarchyProperty&&Property.equals(this.polygon._positions,e.polygon._positions)&&Property.equals(this.polygon._holes,e.polygon._holes)},CzmlDataSource.load=function(e,t){return(new CzmlDataSource).load(e,t)},Object.defineProperties(CzmlDataSource.prototype,{name:{get:function(){return this._name}},clock:{get:function(){return this._clock}},entities:{get:function(){return this._entityCollection}},isLoading:{get:function(){return this._isLoading}},changedEvent:{get:function(){return this._changed}},errorEvent:{get:function(){return this._error}},loadingEvent:{get:function(){return this._loading}},show:{get:function(){return this._entityCollection.show},set:function(e){this._entityCollection.show=e}},clustering:{get:function(){return this._entityCluster},set:function(e){this._entityCluster=e}},credit:{get:function(){return this._credit}}}),CzmlDataSource.updaters=[processBillboard,processBox,processCorridor,processCylinder,processEllipse,processEllipsoid,processLabel,processModel,processName,processDescription,processPath,processPoint,processPolygon,processPolyline,processPolylineVolume,processProperties,processRectangle,processPosition,processTileset,processViewFrom,processWall,processOrientation,processAvailability],CzmlDataSource.prototype.process=function(e,t){return load(this,e,t,!1)},CzmlDataSource.prototype.load=function(e,t){return load(this,e,t,!0)},CzmlDataSource.prototype.update=function(e){return!0},CzmlDataSource.processPacketData=processPacketData,CzmlDataSource.processPositionPacketData=processPositionPacketData,CzmlDataSource.processMaterialPacketData=processMaterialPacketData,CzmlDataSource._processCzml=function(e,t,i,r,n){if(r=defaultValue(r,CzmlDataSource.updaters),Array.isArray(e))for(var a=0,o=e.length;a<o;++a)processCzmlPacket(e[a],t,r,i,n);else processCzmlPacket(e,t,r,i,n)},Object.defineProperties(DataSourceCollection.prototype,{length:{get:function(){return this._dataSources.length}},dataSourceAdded:{get:function(){return this._dataSourceAdded}},dataSourceRemoved:{get:function(){return this._dataSourceRemoved}},dataSourceMoved:{get:function(){return this._dataSourceMoved}}}),DataSourceCollection.prototype.add=function(e){var t=this,i=this._dataSources;return when(e,function(e){return i===t._dataSources&&(t._dataSources.push(e),t._dataSourceAdded.raiseEvent(t,e)),e})},DataSourceCollection.prototype.remove=function(e,t){t=defaultValue(t,!1);var i=this._dataSources.indexOf(e);return-1!==i&&(this._dataSources.splice(i,1),this._dataSourceRemoved.raiseEvent(this,e),t&&"function"==typeof e.destroy&&e.destroy(),!0)},DataSourceCollection.prototype.removeAll=function(e){e=defaultValue(e,!1);for(var t=this._dataSources,i=0,r=t.length;i<r;++i){var n=t[i];this._dataSourceRemoved.raiseEvent(this,n),e&&"function"==typeof n.destroy&&n.destroy()}this._dataSources=[]},DataSourceCollection.prototype.contains=function(e){return-1!==this.indexOf(e)},DataSourceCollection.prototype.indexOf=function(e){return this._dataSources.indexOf(e)},DataSourceCollection.prototype.get=function(e){return this._dataSources[e]},DataSourceCollection.prototype.getByName=function(t){return this._dataSources.filter(function(e){return e.name===t})},DataSourceCollection.prototype.raise=function(e){var t=getIndex(this._dataSources,e);swapDataSources(this,t,t+1)},DataSourceCollection.prototype.lower=function(e){var t=getIndex(this._dataSources,e);swapDataSources(this,t,t-1)},DataSourceCollection.prototype.raiseToTop=function(e){var t=getIndex(this._dataSources,e);t!==this._dataSources.length-1&&(this._dataSources.splice(t,1),this._dataSources.push(e),this.dataSourceMoved.raiseEvent(e,this._dataSources.length-1,t))},DataSourceCollection.prototype.lowerToBottom=function(e){var t=getIndex(this._dataSources,e);0!==t&&(this._dataSources.splice(t,1),this._dataSources.splice(0,0,e),this.dataSourceMoved.raiseEvent(e,0,t))},DataSourceCollection.prototype.isDestroyed=function(){return!1},DataSourceCollection.prototype.destroy=function(){return this.removeAll(!0),destroyObject(this)},Object.defineProperties(PrimitiveCollection.prototype,{length:{get:function(){return this._primitives.length}}}),PrimitiveCollection.prototype.add=function(e,t){var i=defined(t),r=e._external=e._external||{};return(r._composites=r._composites||{})[this._guid]={collection:this},i?this._primitives.splice(t,0,e):this._primitives.push(e),e},PrimitiveCollection.prototype.remove=function(e){if(this.contains(e)){var t=this._primitives.indexOf(e);if(-1!==t)return this._primitives.splice(t,1),delete e._external._composites[this._guid],this.destroyPrimitives&&e.destroy(),!0}return!1},PrimitiveCollection.prototype.removeAndDestroy=function(e){var t=this.remove(e);return t&&!this.destroyPrimitives&&e.destroy(),t},PrimitiveCollection.prototype.removeAll=function(){for(var e=this._primitives,t=e.length,i=0;i<t;++i)delete e[i]._external._composites[this._guid],this.destroyPrimitives&&e[i].destroy();this._primitives=[]},PrimitiveCollection.prototype.contains=function(e){return!!(defined(e)&&e._external&&e._external._composites&&e._external._composites[this._guid])},PrimitiveCollection.prototype.raise=function(e){var t,i,r;!defined(e)||(t=getPrimitiveIndex(this,e))!==(i=this._primitives).length-1&&(r=i[t],i[t]=i[t+1],i[t+1]=r)},PrimitiveCollection.prototype.raiseToTop=function(e){var t,i;!defined(e)||(t=getPrimitiveIndex(this,e))!==(i=this._primitives).length-1&&(i.splice(t,1),i.push(e))},PrimitiveCollection.prototype.lower=function(e){var t,i,r;defined(e)&&(t=getPrimitiveIndex(this,e),i=this._primitives,0!==t&&(r=i[t],i[t]=i[t-1],i[t-1]=r))},PrimitiveCollection.prototype.lowerToBottom=function(e){var t,i;defined(e)&&(t=getPrimitiveIndex(this,e),i=this._primitives,0!==t&&(i.splice(t,1),i.unshift(e)))},PrimitiveCollection.prototype.get=function(e){return this._primitives[e]},PrimitiveCollection.prototype.update=function(e){if(this.show)for(var t=this._primitives,i=0;i<t.length;++i)t[i].update(e)},PrimitiveCollection.prototype.prePassesUpdate=function(e){for(var t=this._primitives,i=0;i<t.length;++i){var r=t[i];defined(r.prePassesUpdate)&&r.prePassesUpdate(e)}},PrimitiveCollection.prototype.updateForPass=function(e,t){for(var i=this._primitives,r=0;r<i.length;++r){var n=i[r];defined(n.updateForPass)&&n.updateForPass(e,t)}},PrimitiveCollection.prototype.postPassesUpdate=function(e){for(var t=this._primitives,i=0;i<t.length;++i){var r=t[i];defined(r.postPassesUpdate)&&r.postPassesUpdate(e)}},PrimitiveCollection.prototype.isDestroyed=function(){return!1},PrimitiveCollection.prototype.destroy=function(){return this.removeAll(),destroyObject(this)},Object.defineProperties(OrderedGroundPrimitiveCollection.prototype,{length:{get:function(){return this._length}}}),OrderedGroundPrimitiveCollection.prototype.add=function(e,t){t=defaultValue(t,0);var i=this._collections[t];if(!defined(i)){(i=new PrimitiveCollection({destroyPrimitives:!1}))._zIndex=t,this._collections[t]=i;for(var r=this._collectionsArray,n=0;n<r.length&&r[n]._zIndex<t;)n++;r.splice(n,0,i)}return i.add(e),this._length++,e._zIndex=t,e},OrderedGroundPrimitiveCollection.prototype.set=function(e,t){return t===e._zIndex||(this.remove(e,!0),this.add(e,t)),e},OrderedGroundPrimitiveCollection.prototype.remove=function(e,t){if(this.contains(e)){var i=e._zIndex,r=this._collections[i],n=t?r.remove(e):r.removeAndDestroy(e);return n&&this._length--,0===r.length&&(this._collectionsArray.splice(this._collectionsArray.indexOf(r),1),this._collections[i]=void 0,r.destroy()),n}return!1},OrderedGroundPrimitiveCollection.prototype.removeAll=function(){for(var e=this._collectionsArray,t=0;t<e.length;t++){var i=e[t];i.destroyPrimitives=!0,i.destroy()}this._collections={},this._collectionsArray=[],this._length=0},OrderedGroundPrimitiveCollection.prototype.contains=function(e){if(!defined(e))return!1;var t=this._collections[e._zIndex];return defined(t)&&t.contains(e)},OrderedGroundPrimitiveCollection.prototype.update=function(e){if(this.show)for(var t=this._collectionsArray,i=0;i<t.length;i++)t[i].update(e)},OrderedGroundPrimitiveCollection.prototype.isDestroyed=function(){return!1},OrderedGroundPrimitiveCollection.prototype.destroy=function(){return this.removeAll(),destroyObject(this)},DynamicGeometryBatch.prototype.add=function(e,t){this._dynamicUpdaters.set(t.id,t.createDynamicUpdater(this._primitives,this._orderedGroundPrimitives))},DynamicGeometryBatch.prototype.remove=function(e){var t=e.id,i=this._dynamicUpdaters.get(t);defined(i)&&(this._dynamicUpdaters.remove(t),i.destroy())},DynamicGeometryBatch.prototype.update=function(e){for(var t=this._dynamicUpdaters.values,i=0,r=t.length;i<r;i++)t[i].update(e);return!0},DynamicGeometryBatch.prototype.removeAllPrimitives=function(){for(var e=this._dynamicUpdaters.values,t=0,i=e.length;t<i;t++)e[t].destroy();this._dynamicUpdaters.removeAll()},DynamicGeometryBatch.prototype.getBoundingSphere=function(e,t){return defined(e=this._dynamicUpdaters.get(e.id))&&defined(e.getBoundingSphere)?e.getBoundingSphere(t):BoundingSphereState$1.FAILED};var scratchColor$b=new Color,defaultOffset$4=Cartesian3.ZERO,offsetScratch$6=new Cartesian3,scratchRectangle$4=new Rectangle;function EllipseGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.center=void 0,this.semiMajorAxis=void 0,this.semiMinorAxis=void 0,this.rotation=void 0,this.height=void 0,this.extrudedHeight=void 0,this.granularity=void 0,this.stRotation=void 0,this.numberOfVerticalLines=void 0,this.offsetAttribute=void 0}function EllipseGeometryUpdater(e,t){GroundGeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new EllipseGeometryOptions(e),geometryPropertyName:"ellipse",observedPropertyNames:["availability","position","ellipse"]}),this._onEntityPropertyChanged(e,"ellipse",e.ellipse,void 0)}function DynamicEllipseGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}defined(Object.create)&&(EllipseGeometryUpdater.prototype=Object.create(GroundGeometryUpdater.prototype),EllipseGeometryUpdater.prototype.constructor=EllipseGeometryUpdater),EllipseGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n={show:new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(e)),offset:void 0,color:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$b)),defined(t)||(t=Color.WHITE),n.color=ColorGeometryInstanceAttribute.fromColor(t)),defined(this._options.offsetAttribute)&&(n.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$4,offsetScratch$6))),new GeometryInstance({id:i,geometry:new EllipseGeometry(this._options),attributes:n})},EllipseGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$b),n=this._distanceDisplayConditionProperty.getValue(e),a={show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n),offset:void 0};return defined(this._options.offsetAttribute)&&(a.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$4,offsetScratch$6))),new GeometryInstance({id:t,geometry:new EllipseOutlineGeometry(this._options),attributes:a})},EllipseGeometryUpdater.prototype._computeCenter=function(e,t){return Property.getValueOrUndefined(this._entity.position,e,t)},EllipseGeometryUpdater.prototype._isHidden=function(e,t){return!defined(e.position)||!defined(t.semiMajorAxis)||!defined(t.semiMinorAxis)||GeometryUpdater.prototype._isHidden.call(this,e,t)},EllipseGeometryUpdater.prototype._isDynamic=function(e,t){return!e.position.isConstant||!t.semiMajorAxis.isConstant||!t.semiMinorAxis.isConstant||!Property.isConstant(t.rotation)||!Property.isConstant(t.height)||!Property.isConstant(t.extrudedHeight)||!Property.isConstant(t.granularity)||!Property.isConstant(t.stRotation)||!Property.isConstant(t.outlineWidth)||!Property.isConstant(t.numberOfVerticalLines)||!Property.isConstant(t.zIndex)||this._onTerrain&&!Property.isConstant(this._materialProperty)&&!(this._materialProperty instanceof ColorMaterialProperty)},EllipseGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=Property.getValueOrUndefined(t.height,Iso8601.MINIMUM_VALUE),r=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),n=Property.getValueOrUndefined(t.extrudedHeight,Iso8601.MINIMUM_VALUE),a=Property.getValueOrDefault(t.extrudedHeightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE);defined(n)&&!defined(i)&&(i=0);var o=this._options;o.vertexFormat=this._materialProperty instanceof ColorMaterialProperty?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,o.center=e.position.getValue(Iso8601.MINIMUM_VALUE,o.center),o.semiMajorAxis=t.semiMajorAxis.getValue(Iso8601.MINIMUM_VALUE,o.semiMajorAxis),o.semiMinorAxis=t.semiMinorAxis.getValue(Iso8601.MINIMUM_VALUE,o.semiMinorAxis),o.rotation=Property.getValueOrUndefined(t.rotation,Iso8601.MINIMUM_VALUE),o.granularity=Property.getValueOrUndefined(t.granularity,Iso8601.MINIMUM_VALUE),o.stRotation=Property.getValueOrUndefined(t.stRotation,Iso8601.MINIMUM_VALUE),o.numberOfVerticalLines=Property.getValueOrUndefined(t.numberOfVerticalLines,Iso8601.MINIMUM_VALUE),o.offsetAttribute=GroundGeometryUpdater.computeGeometryOffsetAttribute(i,r,n,a),o.height=GroundGeometryUpdater.getGeometryHeight(i,r),(n=GroundGeometryUpdater.getGeometryExtrudedHeight(n,a))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(n=ApproximateTerrainHeights.getMinimumMaximumHeights(EllipseGeometry.computeRectangle(o,scratchRectangle$4)).minimumTerrainHeight),o.extrudedHeight=n},EllipseGeometryUpdater.DynamicGeometryUpdater=DynamicEllipseGeometryUpdater,defined(Object.create)&&(DynamicEllipseGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicEllipseGeometryUpdater.prototype.constructor=DynamicEllipseGeometryUpdater),DynamicEllipseGeometryUpdater.prototype._isHidden=function(e,t,i){var r=this._options;return!defined(r.center)||!defined(r.semiMajorAxis)||!defined(r.semiMinorAxis)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicEllipseGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options,n=Property.getValueOrUndefined(t.height,i),a=Property.getValueOrDefault(t.heightReference,i,HeightReference$1.NONE),o=Property.getValueOrUndefined(t.extrudedHeight,i),s=Property.getValueOrDefault(t.extrudedHeightReference,i,HeightReference$1.NONE);defined(o)&&!defined(n)&&(n=0),r.center=Property.getValueOrUndefined(e.position,i,r.center),r.semiMajorAxis=Property.getValueOrUndefined(t.semiMajorAxis,i),r.semiMinorAxis=Property.getValueOrUndefined(t.semiMinorAxis,i),r.rotation=Property.getValueOrUndefined(t.rotation,i),r.granularity=Property.getValueOrUndefined(t.granularity,i),r.stRotation=Property.getValueOrUndefined(t.stRotation,i),r.numberOfVerticalLines=Property.getValueOrUndefined(t.numberOfVerticalLines,i),r.offsetAttribute=GroundGeometryUpdater.computeGeometryOffsetAttribute(n,a,o,s),r.height=GroundGeometryUpdater.getGeometryHeight(n,a),(o=GroundGeometryUpdater.getGeometryExtrudedHeight(o,s))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(o=ApproximateTerrainHeights.getMinimumMaximumHeights(EllipseGeometry.computeRectangle(r,scratchRectangle$4)).minimumTerrainHeight),r.extrudedHeight=o};var defaultMaterial$1=new ColorMaterialProperty(Color.WHITE),defaultOffset$5=Cartesian3.ZERO,offsetScratch$7=new Cartesian3,radiiScratch=new Cartesian3,innerRadiiScratch=new Cartesian3,scratchColor$c=new Color,unitSphere=new Cartesian3(1,1,1);function EllipsoidGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.radii=void 0,this.innerRadii=void 0,this.minimumClock=void 0,this.maximumClock=void 0,this.minimumCone=void 0,this.maximumCone=void 0,this.stackPartitions=void 0,this.slicePartitions=void 0,this.subdivisions=void 0,this.offsetAttribute=void 0}function EllipsoidGeometryUpdater(e,t){GeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new EllipsoidGeometryOptions(e),geometryPropertyName:"ellipsoid",observedPropertyNames:["availability","position","orientation","ellipsoid"]}),this._onEntityPropertyChanged(e,"ellipsoid",e.ellipsoid,void 0)}function DynamicEllipsoidGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i),this._scene=e._scene,this._modelMatrix=new Matrix4,this._attributes=void 0,this._outlineAttributes=void 0,this._lastSceneMode=void 0,this._lastShow=void 0,this._lastOutlineShow=void 0,this._lastOutlineWidth=void 0,this._lastOutlineColor=void 0,this._lastOffset=new Cartesian3,this._material={}}defined(Object.create)&&(EllipsoidGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),EllipsoidGeometryUpdater.prototype.constructor=EllipsoidGeometryUpdater),Object.defineProperties(EllipsoidGeometryUpdater.prototype,{terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}}),EllipsoidGeometryUpdater.prototype.createFillGeometryInstance=function(e,t,i){var r,n,a=this._entity,o=a.isAvailable(e),s=new ShowGeometryInstanceAttribute(o&&a.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),l=this._distanceDisplayConditionProperty.getValue(e),c={show:s,distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(l),color:void 0,offset:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||o)&&(n=this._materialProperty.color.getValue(e,scratchColor$c)),defined(n)||(n=Color.WHITE),r=ColorGeometryInstanceAttribute.fromColor(n),c.color=r),defined(this._options.offsetAttribute)&&(c.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$5,offsetScratch$7))),new GeometryInstance({id:a,geometry:new EllipsoidGeometry(this._options),modelMatrix:t?void 0:a.computeModelMatrixForHeightReference(e,a.ellipsoid.heightReference,.5*this._options.radii.z,this._scene.mapProjection.ellipsoid,i),attributes:c})},EllipsoidGeometryUpdater.prototype.createOutlineGeometryInstance=function(e,t,i){var r=this._entity,n=r.isAvailable(e),a=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$c),o=this._distanceDisplayConditionProperty.getValue(e),s={show:new ShowGeometryInstanceAttribute(n&&r.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(a),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(o),offset:void 0};return defined(this._options.offsetAttribute)&&(s.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$5,offsetScratch$7))),new GeometryInstance({id:r,geometry:new EllipsoidOutlineGeometry(this._options),modelMatrix:t?void 0:r.computeModelMatrixForHeightReference(e,r.ellipsoid.heightReference,.5*this._options.radii.z,this._scene.mapProjection.ellipsoid,i),attributes:s})},EllipsoidGeometryUpdater.prototype._computeCenter=function(e,t){return Property.getValueOrUndefined(this._entity.position,e,t)},EllipsoidGeometryUpdater.prototype._isHidden=function(e,t){return!defined(e.position)||!defined(t.radii)||GeometryUpdater.prototype._isHidden.call(this,e,t)},EllipsoidGeometryUpdater.prototype._isDynamic=function(e,t){return!(e.position.isConstant&&Property.isConstant(e.orientation)&&t.radii.isConstant&&Property.isConstant(t.innerRadii)&&Property.isConstant(t.stackPartitions)&&Property.isConstant(t.slicePartitions)&&Property.isConstant(t.outlineWidth)&&Property.isConstant(t.minimumClock)&&Property.isConstant(t.maximumClock)&&Property.isConstant(t.minimumCone)&&Property.isConstant(t.maximumCone)&&Property.isConstant(t.subdivisions))},EllipsoidGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),r=this._options;r.vertexFormat=this._materialProperty instanceof ColorMaterialProperty?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,r.radii=t.radii.getValue(Iso8601.MINIMUM_VALUE,r.radii),r.innerRadii=Property.getValueOrUndefined(t.innerRadii,r.radii),r.minimumClock=Property.getValueOrUndefined(t.minimumClock,Iso8601.MINIMUM_VALUE),r.maximumClock=Property.getValueOrUndefined(t.maximumClock,Iso8601.MINIMUM_VALUE),r.minimumCone=Property.getValueOrUndefined(t.minimumCone,Iso8601.MINIMUM_VALUE),r.maximumCone=Property.getValueOrUndefined(t.maximumCone,Iso8601.MINIMUM_VALUE),r.stackPartitions=Property.getValueOrUndefined(t.stackPartitions,Iso8601.MINIMUM_VALUE),r.slicePartitions=Property.getValueOrUndefined(t.slicePartitions,Iso8601.MINIMUM_VALUE),r.subdivisions=Property.getValueOrUndefined(t.subdivisions,Iso8601.MINIMUM_VALUE),r.offsetAttribute=i!==HeightReference$1.NONE?GeometryOffsetAttribute$1.ALL:void 0},EllipsoidGeometryUpdater.prototype._onEntityPropertyChanged=heightReferenceOnEntityPropertyChanged,EllipsoidGeometryUpdater.DynamicGeometryUpdater=DynamicEllipsoidGeometryUpdater,defined(Object.create)&&(DynamicEllipsoidGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicEllipsoidGeometryUpdater.prototype.constructor=DynamicEllipsoidGeometryUpdater),DynamicEllipsoidGeometryUpdater.prototype.update=function(e){var t=this._entity,i=t.ellipsoid;if(!t.isShowing||!t.isAvailable(e)||!Property.getValueOrDefault(i.show,e,!0))return defined(this._primitive)&&(this._primitive.show=!1),void(defined(this._outlinePrimitive)&&(this._outlinePrimitive.show=!1));var r=Property.getValueOrUndefined(i.radii,e,radiiScratch),n=defined(r)?t.computeModelMatrixForHeightReference(e,i.heightReference,.5*r.z,this._scene.mapProjection.ellipsoid,this._modelMatrix):void 0;if(!defined(n)||!defined(r))return defined(this._primitive)&&(this._primitive.show=!1),void(defined(this._outlinePrimitive)&&(this._outlinePrimitive.show=!1));var a,o,s,l,c,u,d,h,p,m=Property.getValueOrDefault(i.fill,e,!0),f=Property.getValueOrDefault(i.outline,e,!1),g=Property.getValueOrClonedDefault(i.outlineColor,e,Color.BLACK,scratchColor$c),_=MaterialProperty.getValue(e,defaultValue(i.material,defaultMaterial$1),this._material),y=Property.getValueOrUndefined(i.innerRadii,e,innerRadiiScratch),v=Property.getValueOrUndefined(i.minimumClock,e),C=Property.getValueOrUndefined(i.maximumClock,e),S=Property.getValueOrUndefined(i.minimumCone,e),T=Property.getValueOrUndefined(i.maximumCone,e),x=Property.getValueOrUndefined(i.stackPartitions,e),b=Property.getValueOrUndefined(i.slicePartitions,e),E=Property.getValueOrUndefined(i.subdivisions,e),P=Property.getValueOrDefault(i.outlineWidth,e,1),A=Property.getValueOrDefault(i.heightReference,e,HeightReference$1.NONE),w=A!==HeightReference$1.NONE?GeometryOffsetAttribute$1.ALL:void 0,D=this._scene.mode,M=D===SceneMode$1.SCENE3D&&A===HeightReference$1.NONE,I=this._options,R=this._geometryUpdater.shadowsProperty.getValue(e),O=this._geometryUpdater.distanceDisplayConditionProperty.getValue(e),L=Property.getValueOrDefault(this._geometryUpdater.terrainOffsetProperty,e,defaultOffset$5,offsetScratch$7);!M||this._lastSceneMode!==D||!defined(this._primitive)||I.stackPartitions!==x||I.slicePartitions!==b||defined(y)&&!Cartesian3.equals(I.innerRadii!==y)||I.minimumClock!==v||I.maximumClock!==C||I.minimumCone!==S||I.maximumCone!==T||I.subdivisions!==E||this._lastOutlineWidth!==P||I.offsetAttribute!==w?((a=this._primitives).removeAndDestroy(this._primitive),a.removeAndDestroy(this._outlinePrimitive),this._primitive=void 0,this._outlinePrimitive=void 0,this._lastSceneMode=D,this._lastOutlineWidth=P,I.stackPartitions=x,I.slicePartitions=b,I.subdivisions=E,I.offsetAttribute=w,I.radii=Cartesian3.clone(M?unitSphere:r,I.radii),defined(y)?M?(o=Cartesian3.magnitude(r),I.innerRadii=Cartesian3.fromElements(y.x/o,y.y/o,y.z/o,I.innerRadii)):I.innerRadii=Cartesian3.clone(y,I.innerRadii):I.innerRadii=void 0,I.minimumClock=v,I.maximumClock=C,I.minimumCone=S,I.maximumCone=T,s=new MaterialAppearance({material:_,translucent:_.isTranslucent(),closed:!0}),I.vertexFormat=s.vertexFormat,l=this._geometryUpdater.createFillGeometryInstance(e,M,this._modelMatrix),this._primitive=a.add(new Primitive({geometryInstances:l,appearance:s,asynchronous:!1,shadows:R})),c=this._geometryUpdater.createOutlineGeometryInstance(e,M,this._modelMatrix),this._outlinePrimitive=a.add(new Primitive({geometryInstances:c,appearance:new PerInstanceColorAppearance({flat:!0,translucent:255!==c.attributes.color.value[3],renderState:{lineWidth:this._geometryUpdater._scene.clampLineWidth(P)}}),asynchronous:!1,shadows:R})),this._lastShow=m,this._lastOutlineShow=f,this._lastOutlineColor=Color.clone(g,this._lastOutlineColor),this._lastDistanceDisplayCondition=O,this._lastOffset=Cartesian3.clone(L,this._lastOffset)):this._primitive.ready&&(u=this._primitive,d=this._outlinePrimitive,u.show=!0,d.show=!0,u.appearance.material=_,defined(h=this._attributes)||(h=u.getGeometryInstanceAttributes(t),this._attributes=h),m!==this._lastShow&&(h.show=ShowGeometryInstanceAttribute.toValue(m,h.show),this._lastShow=m),defined(p=this._outlineAttributes)||(p=d.getGeometryInstanceAttributes(t),this._outlineAttributes=p),f!==this._lastOutlineShow&&(p.show=ShowGeometryInstanceAttribute.toValue(f,p.show),this._lastOutlineShow=f),Color.equals(g,this._lastOutlineColor)||(p.color=ColorGeometryInstanceAttribute.toValue(g,p.color),Color.clone(g,this._lastOutlineColor)),DistanceDisplayCondition.equals(O,this._lastDistanceDisplayCondition)||(h.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(O,h.distanceDisplayCondition),p.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(O,p.distanceDisplayCondition),DistanceDisplayCondition.clone(O,this._lastDistanceDisplayCondition)),Cartesian3.equals(L,this._lastOffset)||(h.offset=OffsetGeometryInstanceAttribute.toValue(L,h.offset),p.offset=OffsetGeometryInstanceAttribute.toValue(L,h.offset),Cartesian3.clone(L,this._lastOffset))),M&&(r.x=Math.max(r.x,.001),r.y=Math.max(r.y,.001),r.z=Math.max(r.z,.001),n=Matrix4.multiplyByScale(n,r,n),this._primitive.modelMatrix=n,this._outlinePrimitive.modelMatrix=n)};var positionScratch$9=new Cartesian3,scratchColor$d=new Color;function PlaneGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.plane=void 0,this.dimensions=void 0}function PlaneGeometryUpdater(e,t){GeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new PlaneGeometryOptions(e),geometryPropertyName:"plane",observedPropertyNames:["availability","position","orientation","plane"]}),this._onEntityPropertyChanged(e,"plane",e.plane,void 0)}function DynamicPlaneGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}defined(Object.create)&&(PlaneGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),PlaneGeometryUpdater.prototype.constructor=PlaneGeometryUpdater),PlaneGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),a=this._distanceDisplayConditionProperty.getValue(e),o=DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a),s=this._materialProperty instanceof ColorMaterialProperty?(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$d)),defined(t)||(t=Color.WHITE),{show:n,distanceDisplayCondition:o,color:ColorGeometryInstanceAttribute.fromColor(t)}):{show:n,distanceDisplayCondition:o},l=i.plane,c=this._options,u=i.computeModelMatrix(e),d=Property.getValueOrDefault(l.plane,e,c.plane),h=Property.getValueOrUndefined(l.dimensions,e,c.dimensions),u=createPrimitiveMatrix(c.plane=d,c.dimensions=h,u,this._scene.mapProjection.ellipsoid,u);return new GeometryInstance({id:i,geometry:new PlaneGeometry(this._options),modelMatrix:u,attributes:s})},PlaneGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$d),n=this._distanceDisplayConditionProperty.getValue(e),a=t.plane,o=this._options,s=t.computeModelMatrix(e),l=Property.getValueOrDefault(a.plane,e,o.plane),c=Property.getValueOrUndefined(a.dimensions,e,o.dimensions),s=createPrimitiveMatrix(o.plane=l,o.dimensions=c,s,this._scene.mapProjection.ellipsoid,s);return new GeometryInstance({id:t,geometry:new PlaneOutlineGeometry,modelMatrix:s,attributes:{show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n)}})},PlaneGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.plane)||!defined(t.dimensions)||!defined(e.position)||GeometryUpdater.prototype._isHidden.call(this,e,t)},PlaneGeometryUpdater.prototype._getIsClosed=function(e){return!1},PlaneGeometryUpdater.prototype._isDynamic=function(e,t){return!(e.position.isConstant&&Property.isConstant(e.orientation)&&t.plane.isConstant&&t.dimensions.isConstant&&Property.isConstant(t.outlineWidth))},PlaneGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=this._materialProperty instanceof ColorMaterialProperty,r=this._options;r.vertexFormat=i?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,r.plane=t.plane.getValue(Iso8601.MINIMUM_VALUE,r.plane),r.dimensions=t.dimensions.getValue(Iso8601.MINIMUM_VALUE,r.dimensions)},PlaneGeometryUpdater.DynamicGeometryUpdater=DynamicPlaneGeometryUpdater,defined(Object.create)&&(DynamicPlaneGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicPlaneGeometryUpdater.prototype.constructor=DynamicPlaneGeometryUpdater),DynamicPlaneGeometryUpdater.prototype._isHidden=function(e,t,i){var r=this._options;return!defined(Property.getValueOrUndefined(e.position,i,positionScratch$9))||!defined(r.plane)||!defined(r.dimensions)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicPlaneGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options;r.plane=Property.getValueOrDefault(t.plane,i,r.plane),r.dimensions=Property.getValueOrUndefined(t.dimensions,i,r.dimensions)};var scratchAxis$1=new Cartesian3,scratchAxis2=new Cartesian3,scratchTranslation=new Cartesian3,scratchNormal$7=new Cartesian3,scratchScale$7=new Cartesian3,scratchQuaternion$1=new Quaternion,scratchMatrix3$1=new Matrix3;function createPrimitiveMatrix(e,t,i,r,n){var a=e.normal,o=e.distance,s=Cartesian3.multiplyByScalar(a,-o,scratchTranslation),s=Matrix4.multiplyByPoint(i,s,s),l=Matrix4.multiplyByPointAsVector(i,a,scratchNormal$7);Cartesian3.normalize(l,l);var c=r.geodeticSurfaceNormal(s,scratchAxis2);CesiumMath.equalsEpsilon(Math.abs(Cartesian3.dot(c,l)),1,CesiumMath.EPSILON8)&&(c=Cartesian3.clone(Cartesian3.UNIT_Z,c),CesiumMath.equalsEpsilon(Math.abs(Cartesian3.dot(c,l)),1,CesiumMath.EPSILON8)&&(c=Cartesian3.clone(Cartesian3.UNIT_X,c)));var u=Cartesian3.cross(c,l,scratchAxis$1),c=Cartesian3.cross(l,u,c);Cartesian3.normalize(u,u),Cartesian3.normalize(c,c);var d=scratchMatrix3$1;Matrix3.setColumn(d,0,u,d),Matrix3.setColumn(d,1,c,d),Matrix3.setColumn(d,2,l,d);var h=Quaternion.fromRotationMatrix(d,scratchQuaternion$1),p=Cartesian2.clone(t,scratchScale$7);return p.z=1,Matrix4.fromTranslationQuaternionRotationScale(s,h,p,n)}PlaneGeometryUpdater.createPrimitiveMatrix=createPrimitiveMatrix;var heightAndPerPositionHeightWarning="Entity polygons cannot have both height and perPositionHeight. height will be ignored",heightReferenceAndPerPositionHeightWarning="heightReference is not supported for entity polygons with perPositionHeight. heightReference will be ignored",scratchColor$e=new Color,defaultOffset$6=Cartesian3.ZERO,offsetScratch$8=new Cartesian3,scratchRectangle$5=new Rectangle,scratch2DPositions=[],cart2Scratch=new Cartesian2;function PolygonGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.polygonHierarchy=void 0,this.perPositionHeight=void 0,this.closeTop=void 0,this.closeBottom=void 0,this.height=void 0,this.extrudedHeight=void 0,this.granularity=void 0,this.stRotation=void 0,this.offsetAttribute=void 0,this.arcType=void 0}function PolygonGeometryUpdater(e,t){GroundGeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new PolygonGeometryOptions(e),geometryPropertyName:"polygon",observedPropertyNames:["availability","polygon"]}),this._onEntityPropertyChanged(e,"polygon",e.polygon,void 0)}function DyanmicPolygonGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}defined(Object.create)&&(PolygonGeometryUpdater.prototype=Object.create(GroundGeometryUpdater.prototype),PolygonGeometryUpdater.prototype.constructor=PolygonGeometryUpdater),PolygonGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=this._options,a={show:new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(e)),offset:void 0,color:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$e)),defined(t)||(t=Color.WHITE),a.color=ColorGeometryInstanceAttribute.fromColor(t)),defined(n.offsetAttribute)&&(a.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$6,offsetScratch$8))),new GeometryInstance({id:i,geometry:new(n.perPositionHeight&&!defined(n.extrudedHeight)?CoplanarPolygonGeometry:PolygonGeometry)(n),attributes:a})},PolygonGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=this._options,n=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$e),a=this._distanceDisplayConditionProperty.getValue(e),o={show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(n),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a),offset:void 0};return defined(r.offsetAttribute)&&(o.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$6,offsetScratch$8))),new GeometryInstance({id:t,geometry:new(r.perPositionHeight&&!defined(r.extrudedHeight)?CoplanarPolygonOutlineGeometry:PolygonOutlineGeometry)(r),attributes:o})},PolygonGeometryUpdater.prototype._computeCenter=function(e,t){var i=Property.getValueOrUndefined(this._entity.polygon.hierarchy,e);if(defined(i)){var r=i.positions;if(0!==r.length){for(var n=this._scene.mapProjection.ellipsoid,a=EllipsoidTangentPlane.fromPoints(r,n),o=a.projectPointsOntoPlane(r,scratch2DPositions),s=o.length,l=0,c=s-1,u=new Cartesian2,d=0;d<s;c=d++){var h=o[d],p=o[c],m=h.x*p.y-p.x*h.y,f=Cartesian2.add(h,p,cart2Scratch),f=Cartesian2.multiplyByScalar(f,m,f),u=Cartesian2.add(u,f,u);l+=m}var g=1/(3*l);return u=Cartesian2.multiplyByScalar(u,g,u),a.projectPointOntoEllipsoid(u,t)}}},PolygonGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.hierarchy)||GeometryUpdater.prototype._isHidden.call(this,e,t)},PolygonGeometryUpdater.prototype._isOnTerrain=function(e,t){var i=GroundGeometryUpdater.prototype._isOnTerrain.call(this,e,t),r=t.perPositionHeight,n=defined(r)&&(!r.isConstant||r.getValue(Iso8601.MINIMUM_VALUE));return i&&!n},PolygonGeometryUpdater.prototype._isDynamic=function(e,t){return!t.hierarchy.isConstant||!Property.isConstant(t.height)||!Property.isConstant(t.extrudedHeight)||!Property.isConstant(t.granularity)||!Property.isConstant(t.stRotation)||!Property.isConstant(t.outlineWidth)||!Property.isConstant(t.perPositionHeight)||!Property.isConstant(t.closeTop)||!Property.isConstant(t.closeBottom)||!Property.isConstant(t.zIndex)||!Property.isConstant(t.arcType)||this._onTerrain&&!Property.isConstant(this._materialProperty)&&!(this._materialProperty instanceof ColorMaterialProperty)},PolygonGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=this._materialProperty instanceof ColorMaterialProperty,r=this._options;r.vertexFormat=i?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat;var n,a=t.hierarchy.getValue(Iso8601.MINIMUM_VALUE),o=Property.getValueOrUndefined(t.height,Iso8601.MINIMUM_VALUE),s=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),l=Property.getValueOrUndefined(t.extrudedHeight,Iso8601.MINIMUM_VALUE),c=Property.getValueOrDefault(t.extrudedHeightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),u=Property.getValueOrDefault(t.perPositionHeight,Iso8601.MINIMUM_VALUE,!1),o=GroundGeometryUpdater.getGeometryHeight(o,s);u?(defined(o)&&(o=void 0,oneTimeWarning(heightAndPerPositionHeightWarning)),s!==HeightReference$1.NONE&&u&&(o=void 0,oneTimeWarning(heightReferenceAndPerPositionHeightWarning))):(defined(l)&&!defined(o)&&(o=0),n=GroundGeometryUpdater.computeGeometryOffsetAttribute(o,s,l,c)),r.polygonHierarchy=a,r.granularity=Property.getValueOrUndefined(t.granularity,Iso8601.MINIMUM_VALUE),r.stRotation=Property.getValueOrUndefined(t.stRotation,Iso8601.MINIMUM_VALUE),r.perPositionHeight=u,r.closeTop=Property.getValueOrDefault(t.closeTop,Iso8601.MINIMUM_VALUE,!0),r.closeBottom=Property.getValueOrDefault(t.closeBottom,Iso8601.MINIMUM_VALUE,!0),r.offsetAttribute=n,r.height=o,r.arcType=Property.getValueOrDefault(t.arcType,Iso8601.MINIMUM_VALUE,ArcType$1.GEODESIC),(l=GroundGeometryUpdater.getGeometryExtrudedHeight(l,c))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(l=ApproximateTerrainHeights.getMinimumMaximumHeights(PolygonGeometry.computeRectangle(r,scratchRectangle$5)).minimumTerrainHeight),r.extrudedHeight=l},PolygonGeometryUpdater.prototype._getIsClosed=function(e){var t=e.height,i=e.extrudedHeight,r=defined(i)&&i!==t;return!e.perPositionHeight&&(!r&&0===t||r&&e.closeTop&&e.closeBottom)},PolygonGeometryUpdater.DynamicGeometryUpdater=DyanmicPolygonGeometryUpdater,defined(Object.create)&&(DyanmicPolygonGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DyanmicPolygonGeometryUpdater.prototype.constructor=DyanmicPolygonGeometryUpdater),DyanmicPolygonGeometryUpdater.prototype._isHidden=function(e,t,i){return!defined(this._options.polygonHierarchy)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DyanmicPolygonGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options;r.polygonHierarchy=Property.getValueOrUndefined(t.hierarchy,i);var n,a=Property.getValueOrUndefined(t.height,i),o=Property.getValueOrDefault(t.heightReference,i,HeightReference$1.NONE),s=Property.getValueOrDefault(t.extrudedHeightReference,i,HeightReference$1.NONE),l=Property.getValueOrUndefined(t.extrudedHeight,i),c=Property.getValueOrUndefined(t.perPositionHeight,i),a=GroundGeometryUpdater.getGeometryHeight(a,s);c?(defined(a)&&(a=void 0,oneTimeWarning(heightAndPerPositionHeightWarning)),o!==HeightReference$1.NONE&&c&&(a=void 0,oneTimeWarning(heightReferenceAndPerPositionHeightWarning))):(defined(l)&&!defined(a)&&(a=0),n=GroundGeometryUpdater.computeGeometryOffsetAttribute(a,o,l,s)),r.granularity=Property.getValueOrUndefined(t.granularity,i),r.stRotation=Property.getValueOrUndefined(t.stRotation,i),r.perPositionHeight=Property.getValueOrUndefined(t.perPositionHeight,i),r.closeTop=Property.getValueOrDefault(t.closeTop,i,!0),r.closeBottom=Property.getValueOrDefault(t.closeBottom,i,!0),r.offsetAttribute=n,r.height=a,r.arcType=Property.getValueOrDefault(t.arcType,i,ArcType$1.GEODESIC),(l=GroundGeometryUpdater.getGeometryExtrudedHeight(l,s))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(l=ApproximateTerrainHeights.getMinimumMaximumHeights(PolygonGeometry.computeRectangle(r,scratchRectangle$5)).minimumTerrainHeight),r.extrudedHeight=l};var scratchColor$f=new Color;function PolylineVolumeGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.polylinePositions=void 0,this.shapePositions=void 0,this.cornerType=void 0,this.granularity=void 0}function PolylineVolumeGeometryUpdater(e,t){GeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new PolylineVolumeGeometryOptions(e),geometryPropertyName:"polylineVolume",observedPropertyNames:["availability","polylineVolume"]}),this._onEntityPropertyChanged(e,"polylineVolume",e.polylineVolume,void 0)}function DynamicPolylineVolumeGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}defined(Object.create)&&(PolylineVolumeGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),PolylineVolumeGeometryUpdater.prototype.constructor=PolylineVolumeGeometryUpdater),PolylineVolumeGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),a=this._distanceDisplayConditionProperty.getValue(e),o=DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a),s=this._materialProperty instanceof ColorMaterialProperty?(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$f)),defined(t)||(t=Color.WHITE),{show:n,distanceDisplayCondition:o,color:ColorGeometryInstanceAttribute.fromColor(t)}):{show:n,distanceDisplayCondition:o};return new GeometryInstance({id:i,geometry:new PolylineVolumeGeometry(this._options),attributes:s})},PolylineVolumeGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$f),n=this._distanceDisplayConditionProperty.getValue(e);return new GeometryInstance({id:t,geometry:new PolylineVolumeOutlineGeometry(this._options),attributes:{show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n)}})},PolylineVolumeGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.positions)||!defined(t.shape)||GeometryUpdater.prototype._isHidden.call(this,e,t)},PolylineVolumeGeometryUpdater.prototype._isDynamic=function(e,t){return!(t.positions.isConstant&&t.shape.isConstant&&Property.isConstant(t.granularity)&&Property.isConstant(t.outlineWidth)&&Property.isConstant(t.cornerType))},PolylineVolumeGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=t.granularity,r=t.cornerType,n=this._options,a=this._materialProperty instanceof ColorMaterialProperty;n.vertexFormat=a?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,n.polylinePositions=t.positions.getValue(Iso8601.MINIMUM_VALUE,n.polylinePositions),n.shapePositions=t.shape.getValue(Iso8601.MINIMUM_VALUE,n.shape),n.granularity=defined(i)?i.getValue(Iso8601.MINIMUM_VALUE):void 0,n.cornerType=defined(r)?r.getValue(Iso8601.MINIMUM_VALUE):void 0},PolylineVolumeGeometryUpdater.DynamicGeometryUpdater=DynamicPolylineVolumeGeometryUpdater,defined(Object.create)&&(DynamicPolylineVolumeGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicPolylineVolumeGeometryUpdater.prototype.constructor=DynamicPolylineVolumeGeometryUpdater),DynamicPolylineVolumeGeometryUpdater.prototype._isHidden=function(e,t,i){var r=this._options;return!defined(r.polylinePositions)||!defined(r.shapePositions)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicPolylineVolumeGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options;r.polylinePositions=Property.getValueOrUndefined(t.positions,i,r.polylinePositions),r.shapePositions=Property.getValueOrUndefined(t.shape,i),r.granularity=Property.getValueOrUndefined(t.granularity,i),r.cornerType=Property.getValueOrUndefined(t.cornerType,i)};var scratchColor$g=new Color,defaultOffset$7=Cartesian3.ZERO,offsetScratch$9=new Cartesian3,scratchRectangle$6=new Rectangle,scratchCenterRect=new Rectangle,scratchCarto$1=new Cartographic;function RectangleGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.rectangle=void 0,this.height=void 0,this.extrudedHeight=void 0,this.granularity=void 0,this.stRotation=void 0,this.rotation=void 0,this.offsetAttribute=void 0}function RectangleGeometryUpdater(e,t){GroundGeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new RectangleGeometryOptions(e),geometryPropertyName:"rectangle",observedPropertyNames:["availability","rectangle"]}),this._onEntityPropertyChanged(e,"rectangle",e.rectangle,void 0)}function DynamicRectangleGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}defined(Object.create)&&(RectangleGeometryUpdater.prototype=Object.create(GroundGeometryUpdater.prototype),RectangleGeometryUpdater.prototype.constructor=RectangleGeometryUpdater),RectangleGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n={show:new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(e)),offset:void 0,color:void 0};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$g)),defined(t)||(t=Color.WHITE),n.color=ColorGeometryInstanceAttribute.fromColor(t)),defined(this._options.offsetAttribute)&&(n.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$7,offsetScratch$9))),new GeometryInstance({id:i,geometry:new RectangleGeometry(this._options),attributes:n})},RectangleGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$g),n=this._distanceDisplayConditionProperty.getValue(e),a={show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n),offset:void 0};return defined(this._options.offsetAttribute)&&(a.offset=OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty,e,defaultOffset$7,offsetScratch$9))),new GeometryInstance({id:t,geometry:new RectangleOutlineGeometry(this._options),attributes:a})},RectangleGeometryUpdater.prototype._computeCenter=function(e,t){var i=Property.getValueOrUndefined(this._entity.rectangle.coordinates,e,scratchCenterRect);if(defined(i)){var r=Rectangle.center(i,scratchCarto$1);return Cartographic.toCartesian(r,Ellipsoid.WGS84,t)}},RectangleGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.coordinates)||GeometryUpdater.prototype._isHidden.call(this,e,t)},RectangleGeometryUpdater.prototype._isDynamic=function(e,t){return!t.coordinates.isConstant||!Property.isConstant(t.height)||!Property.isConstant(t.extrudedHeight)||!Property.isConstant(t.granularity)||!Property.isConstant(t.stRotation)||!Property.isConstant(t.rotation)||!Property.isConstant(t.outlineWidth)||!Property.isConstant(t.zIndex)||this._onTerrain&&!Property.isConstant(this._materialProperty)&&!(this._materialProperty instanceof ColorMaterialProperty)},RectangleGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=this._materialProperty instanceof ColorMaterialProperty,r=Property.getValueOrUndefined(t.height,Iso8601.MINIMUM_VALUE),n=Property.getValueOrDefault(t.heightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE),a=Property.getValueOrUndefined(t.extrudedHeight,Iso8601.MINIMUM_VALUE),o=Property.getValueOrDefault(t.extrudedHeightReference,Iso8601.MINIMUM_VALUE,HeightReference$1.NONE);defined(a)&&!defined(r)&&(r=0);var s=this._options;s.vertexFormat=i?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,s.rectangle=t.coordinates.getValue(Iso8601.MINIMUM_VALUE,s.rectangle),s.granularity=Property.getValueOrUndefined(t.granularity,Iso8601.MINIMUM_VALUE),s.stRotation=Property.getValueOrUndefined(t.stRotation,Iso8601.MINIMUM_VALUE),s.rotation=Property.getValueOrUndefined(t.rotation,Iso8601.MINIMUM_VALUE),s.offsetAttribute=GroundGeometryUpdater.computeGeometryOffsetAttribute(r,n,a,o),s.height=GroundGeometryUpdater.getGeometryHeight(r,n),(a=GroundGeometryUpdater.getGeometryExtrudedHeight(a,o))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(a=ApproximateTerrainHeights.getMinimumMaximumHeights(RectangleGeometry.computeRectangle(s,scratchRectangle$6)).minimumTerrainHeight),s.extrudedHeight=a},RectangleGeometryUpdater.DynamicGeometryUpdater=DynamicRectangleGeometryUpdater,defined(Object.create)&&(DynamicRectangleGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicRectangleGeometryUpdater.prototype.constructor=DynamicRectangleGeometryUpdater),DynamicRectangleGeometryUpdater.prototype._isHidden=function(e,t,i){return!defined(this._options.rectangle)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicRectangleGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options,n=Property.getValueOrUndefined(t.height,i),a=Property.getValueOrDefault(t.heightReference,i,HeightReference$1.NONE),o=Property.getValueOrUndefined(t.extrudedHeight,i),s=Property.getValueOrDefault(t.extrudedHeightReference,i,HeightReference$1.NONE);defined(o)&&!defined(n)&&(n=0),r.rectangle=Property.getValueOrUndefined(t.coordinates,i,r.rectangle),r.granularity=Property.getValueOrUndefined(t.granularity,i),r.stRotation=Property.getValueOrUndefined(t.stRotation,i),r.rotation=Property.getValueOrUndefined(t.rotation,i),r.offsetAttribute=GroundGeometryUpdater.computeGeometryOffsetAttribute(n,a,o,s),r.height=GroundGeometryUpdater.getGeometryHeight(n,a),(o=GroundGeometryUpdater.getGeometryExtrudedHeight(o,s))===GroundGeometryUpdater.CLAMP_TO_GROUND&&(o=ApproximateTerrainHeights.getMinimumMaximumHeights(RectangleGeometry.computeRectangle(r,scratchRectangle$6)).minimumTerrainHeight),r.extrudedHeight=o};var colorScratch$2=new Color,distanceDisplayConditionScratch$1=new DistanceDisplayCondition,defaultDistanceDisplayCondition$1=new DistanceDisplayCondition,defaultOffset$8=Cartesian3.ZERO,offsetScratch$a=new Cartesian3;function Batch(e,t,i,r,n,a,o){var s;this.translucent=t,this.appearanceType=i,this.depthFailAppearanceType=r,this.depthFailMaterialProperty=n,this.depthFailMaterial=void 0,this.closed=a,this.shadows=o,this.primitives=e,this.createPrimitive=!1,this.waitingOnCreate=!1,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new AssociativeArray,this.updaters=new AssociativeArray,this.updatersWithAttributes=new AssociativeArray,this.attributes=new AssociativeArray,this.subscriptions=new AssociativeArray,this.showsUpdated=new AssociativeArray,this.itemsToRemove=[],this.invalidated=!1,defined(n)&&(s=n.definitionChanged.addEventListener(Batch.prototype.onMaterialChanged,this)),this.removeMaterialSubscription=s}function StaticGeometryColorBatch(e,t,i,r,n){this._solidItems=[],this._translucentItems=[],this._primitives=e,this._appearanceType=t,this._depthFailAppearanceType=i,this._closed=r,this._shadows=n}function removeItem(e,t){for(var i=e.length-1;0<=i;i--){var r=e[i];if(r.remove(t))return 0===r.updaters.length&&(e.splice(i,1),r.destroy()),1}}function moveItems(e,t,i){for(var r=!1,n=t.length,a=0;a<n;++a){var o=t[a],s=o.itemsToRemove,l=s.length;if(0<l)for(a=0;a<l;a++){var c=s[a];o.remove(c),e.add(i,c),r=!0}}return r}function updateItems(e,t,i,r){for(var n=t.length,a=n-1;0<=a;a--){var o=t[a];if(o.invalidated){t.splice(a,1);for(var s=o.updaters.values,l=s.length,c=0;c<l;c++)e.add(i,s[c]);o.destroy()}}for(n=t.length,a=0;a<n;++a)r=t[a].update(i)&&r;return r}function getBoundingSphere(e,t,i){for(var r=e.length,n=0;n<r;n++){var a=e[n];if(a.contains(t))return a.getBoundingSphere(t,i)}return BoundingSphereState$1.FAILED}function removeAllPrimitives(e){for(var t=e.length,i=0;i<t;i++)e[i].destroy();e.length=0}Batch.prototype.onMaterialChanged=function(){this.invalidated=!0},Batch.prototype.isMaterial=function(e){var t=this.depthFailMaterialProperty,i=e.depthFailMaterialProperty;return i===t||!!defined(t)&&t.equals(i)},Batch.prototype.add=function(n,e){var a,t=n.id;this.createPrimitive=!0,this.geometry.set(t,e),this.updaters.set(t,n),n.hasConstantFill&&n.fillMaterialProperty.isConstant&&Property.isConstant(n.distanceDisplayConditionProperty)&&Property.isConstant(n.terrainOffsetProperty)?(a=this).subscriptions.set(t,n.entity.definitionChanged.addEventListener(function(e,t,i,r){"isShowing"===t&&a.showsUpdated.set(n.id,n)})):this.updatersWithAttributes.set(t,n)},Batch.prototype.remove=function(e){var t=e.id;if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.updatersWithAttributes.remove(t);var i=this.subscriptions.get(t);return defined(i)&&(i(),this.subscriptions.remove(t),this.showsUpdated.remove(t)),!0}return!1},Batch.prototype.update=function(e){var t=!0,i=0,r=this.primitive,n=this.primitives;if(this.createPrimitive){var a,o,s=this.geometry.values;0<s.length?(defined(r)&&(defined(this.oldPrimitive)?n.remove(r):this.oldPrimitive=r),defined(this.depthFailAppearanceType)&&(defined(this.depthFailMaterialProperty)&&(this.depthFailMaterial=MaterialProperty.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial)),a=new this.depthFailAppearanceType({material:this.depthFailMaterial,translucent:this.translucent,closed:this.closed})),r=new Primitive({show:!1,asynchronous:!0,geometryInstances:s.slice(),appearance:new this.appearanceType({translucent:this.translucent,closed:this.closed}),depthFailAppearance:a,shadows:this.shadows}),n.add(r),t=!1):(defined(r)&&(n.remove(r),r=void 0),defined(o=this.oldPrimitive)&&(n.remove(o),this.oldPrimitive=void 0)),this.attributes.removeAll(),this.primitive=r,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(defined(r)&&r.ready){r.show=!0,defined(this.oldPrimitive)&&(n.remove(this.oldPrimitive),this.oldPrimitive=void 0),!defined(this.depthFailAppearanceType)||this.depthFailMaterialProperty instanceof ColorMaterialProperty||(this.depthFailMaterial=MaterialProperty.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),this.primitive.depthFailAppearance.material=this.depthFailMaterial);for(var l=this.updatersWithAttributes.values,c=l.length,u=this.waitingOnCreate,d=0;d<c;d++){var h,p,m,f,g=l[d],_=this.geometry.get(g.id),y=this.attributes.get(_.id.id);defined(y)||(y=r.getGeometryInstanceAttributes(_.id),this.attributes.set(_.id.id,y)),g.fillMaterialProperty.isConstant&&!u||(h=g.fillMaterialProperty.color,p=Property.getValueOrDefault(h,e,Color.WHITE,colorScratch$2),Color.equals(y._lastColor,p)||(y._lastColor=Color.clone(p,y._lastColor),y.color=ColorGeometryInstanceAttribute.toValue(p,y.color),(this.translucent&&255===y.color[3]||!this.translucent&&255!==y.color[3])&&(this.itemsToRemove[i++]=g))),defined(this.depthFailAppearanceType)&&g.depthFailMaterialProperty instanceof ColorMaterialProperty&&(!g.depthFailMaterialProperty.isConstant||u)&&(m=g.depthFailMaterialProperty.color,f=Property.getValueOrDefault(m,e,Color.WHITE,colorScratch$2),Color.equals(y._lastDepthFailColor,f)||(y._lastDepthFailColor=Color.clone(f,y._lastDepthFailColor),y.depthFailColor=ColorGeometryInstanceAttribute.toValue(f,y.depthFailColor)));var v=g.entity.isShowing&&(g.hasConstantFill||g.isFilled(e));v!==(1===y.show[0])&&(y.show=ShowGeometryInstanceAttribute.toValue(v,y.show));var C,S=g.distanceDisplayConditionProperty;Property.isConstant(S)||(C=Property.getValueOrDefault(S,e,defaultDistanceDisplayCondition$1,distanceDisplayConditionScratch$1),DistanceDisplayCondition.equals(C,y._lastDistanceDisplayCondition)||(y._lastDistanceDisplayCondition=DistanceDisplayCondition.clone(C,y._lastDistanceDisplayCondition),y.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(C,y.distanceDisplayCondition)));var T,x=g.terrainOffsetProperty;Property.isConstant(x)||(T=Property.getValueOrDefault(x,e,defaultOffset$8,offsetScratch$a),Cartesian3.equals(T,y._lastOffset)||(y._lastOffset=Cartesian3.clone(T,y._lastOffset),y.offset=OffsetGeometryInstanceAttribute.toValue(T,y.offset)))}this.updateShows(r),this.waitingOnCreate=!1}else defined(r)&&!r.ready&&(t=!1);return this.itemsToRemove.length=i,t},Batch.prototype.updateShows=function(e){for(var t=this.showsUpdated.values,i=t.length,r=0;r<i;r++){var n=t[r],a=this.geometry.get(n.id),o=this.attributes.get(a.id.id);defined(o)||(o=e.getGeometryInstanceAttributes(a.id),this.attributes.set(a.id.id,o));var s=n.entity.isShowing;s!==(1===o.show[0])&&(o.show=ShowGeometryInstanceAttribute.toValue(s,o.show),a.attributes.show.value[0]=o.show[0])}this.showsUpdated.removeAll()},Batch.prototype.contains=function(e){return this.updaters.contains(e.id)},Batch.prototype.getBoundingSphere=function(e,t){var i=this.primitive;if(!i.ready)return BoundingSphereState$1.PENDING;var r=i.getGeometryInstanceAttributes(e.entity);return!defined(r)||!defined(r.boundingSphere)||defined(r.show)&&0===r.show[0]?BoundingSphereState$1.FAILED:(r.boundingSphere.clone(t),BoundingSphereState$1.DONE)},Batch.prototype.destroy=function(){var e=this.primitive,t=this.primitives;defined(e)&&t.remove(e);var i=this.oldPrimitive;defined(i)&&t.remove(i),defined(this.removeMaterialSubscription)&&this.removeMaterialSubscription()},StaticGeometryColorBatch.prototype.add=function(e,t){for(var i,r=t.createFillGeometryInstance(e),n=255===r.attributes.color.value[3]?(i=this._solidItems,!1):(i=this._translucentItems,!0),a=i.length,o=0;o<a;o++){var s=i[o];if(s.isMaterial(t))return void s.add(t,r)}var l=new Batch(this._primitives,n,this._appearanceType,this._depthFailAppearanceType,t.depthFailMaterialProperty,this._closed,this._shadows);l.add(t,r),i.push(l)},StaticGeometryColorBatch.prototype.remove=function(e){removeItem(this._solidItems,e)||removeItem(this._translucentItems,e)},StaticGeometryColorBatch.prototype.update=function(e){var t=updateItems(this,this._solidItems,e,!0),t=updateItems(this,this._translucentItems,e,t)&&t,i=moveItems(this,this._solidItems,e),r=moveItems(this,this._translucentItems,e);return(i||r)&&(t=updateItems(this,this._solidItems,e,t)&&t,t=updateItems(this,this._translucentItems,e,t)&&t),t},StaticGeometryColorBatch.prototype.getBoundingSphere=function(e,t){var i=getBoundingSphere(this._solidItems,e,t);return i===BoundingSphereState$1.FAILED?getBoundingSphere(this._translucentItems,e,t):i},StaticGeometryColorBatch.prototype.removeAllPrimitives=function(){removeAllPrimitives(this._solidItems),removeAllPrimitives(this._translucentItems)};var distanceDisplayConditionScratch$2=new DistanceDisplayCondition,defaultDistanceDisplayCondition$2=new DistanceDisplayCondition,defaultOffset$9=Cartesian3.ZERO,offsetScratch$b=new Cartesian3;function Batch$1(e,t,i,r,n,a,o){this.primitives=e,this.appearanceType=t,this.materialProperty=i,this.depthFailAppearanceType=r,this.depthFailMaterialProperty=n,this.closed=a,this.shadows=o,this.updaters=new AssociativeArray,this.createPrimitive=!0,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new AssociativeArray,this.material=void 0,this.depthFailMaterial=void 0,this.updatersWithAttributes=new AssociativeArray,this.attributes=new AssociativeArray,this.invalidated=!1,this.removeMaterialSubscription=i.definitionChanged.addEventListener(Batch$1.prototype.onMaterialChanged,this),this.subscriptions=new AssociativeArray,this.showsUpdated=new AssociativeArray}Batch$1.prototype.onMaterialChanged=function(){this.invalidated=!0},Batch$1.prototype.isMaterial=function(e){var t=this.materialProperty,i=e.fillMaterialProperty,r=this.depthFailMaterialProperty,n=e.depthFailMaterialProperty;if(i===t&&n===r)return!0;var a=defined(t)&&t.equals(i);return a=(!defined(r)&&!defined(n)||defined(r)&&r.equals(n))&&a},Batch$1.prototype.add=function(e,n){var a,t=n.id;this.updaters.set(t,n),this.geometry.set(t,n.createFillGeometryInstance(e)),n.hasConstantFill&&n.fillMaterialProperty.isConstant&&Property.isConstant(n.distanceDisplayConditionProperty)&&Property.isConstant(n.terrainOffsetProperty)?(a=this).subscriptions.set(t,n.entity.definitionChanged.addEventListener(function(e,t,i,r){"isShowing"===t&&a.showsUpdated.set(n.id,n)})):this.updatersWithAttributes.set(t,n),this.createPrimitive=!0},Batch$1.prototype.remove=function(e){var t=e.id;if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.updatersWithAttributes.remove(t);var i=this.subscriptions.get(t);return defined(i)&&(i(),this.subscriptions.remove(t),this.showsUpdated.remove(t)),!0}return!1};var colorScratch$3=new Color;function StaticGeometryPerMaterialBatch(e,t,i,r,n){this._items=[],this._primitives=e,this._appearanceType=t,this._depthFailAppearanceType=i,this._closed=r,this._shadows=n}Batch$1.prototype.update=function(e){var t,i,r=!0,n=this.primitive,a=this.primitives,o=this.geometry.values;if(this.createPrimitive)0<o.length?(defined(n)&&(defined(this.oldPrimitive)?a.remove(n):this.oldPrimitive=n),this.material=MaterialProperty.getValue(e,this.materialProperty,this.material),defined(this.depthFailMaterialProperty)&&(this.depthFailMaterial=MaterialProperty.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),t=new this.depthFailAppearanceType({material:this.depthFailMaterial,translucent:this.depthFailMaterial.isTranslucent(),closed:this.closed})),n=new Primitive({show:!1,asynchronous:!0,geometryInstances:o.slice(),appearance:new this.appearanceType({material:this.material,translucent:this.material.isTranslucent(),closed:this.closed}),depthFailAppearance:t,shadows:this.shadows}),a.add(n),r=!1):(defined(n)&&(a.remove(n),n=void 0),defined(i=this.oldPrimitive)&&(a.remove(i),this.oldPrimitive=void 0)),this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1;else if(defined(n)&&n.ready){n.show=!0,defined(this.oldPrimitive)&&(a.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.material=MaterialProperty.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material,!defined(this.depthFailAppearanceType)||this.depthFailMaterialProperty instanceof ColorMaterialProperty||(this.depthFailMaterial=MaterialProperty.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),this.primitive.depthFailAppearance.material=this.depthFailMaterial);for(var s=this.updatersWithAttributes.values,l=s.length,c=0;c<l;c++){var u,d,h=s[c],p=h.entity,m=this.geometry.get(h.id),f=this.attributes.get(m.id.id);defined(f)||(f=n.getGeometryInstanceAttributes(m.id),this.attributes.set(m.id.id,f)),defined(this.depthFailAppearanceType)&&this.depthFailMaterialProperty instanceof ColorMaterialProperty&&!h.depthFailMaterialProperty.isConstant&&(u=h.depthFailMaterialProperty.color,d=Property.getValueOrDefault(u,e,Color.WHITE,colorScratch$3),Color.equals(f._lastDepthFailColor,d)||(f._lastDepthFailColor=Color.clone(d,f._lastDepthFailColor),f.depthFailColor=ColorGeometryInstanceAttribute.toValue(d,f.depthFailColor)));var g=p.isShowing&&(h.hasConstantFill||h.isFilled(e));g!==(1===f.show[0])&&(f.show=ShowGeometryInstanceAttribute.toValue(g,f.show));var _,y=h.distanceDisplayConditionProperty;Property.isConstant(y)||(_=Property.getValueOrDefault(y,e,defaultDistanceDisplayCondition$2,distanceDisplayConditionScratch$2),DistanceDisplayCondition.equals(_,f._lastDistanceDisplayCondition)||(f._lastDistanceDisplayCondition=DistanceDisplayCondition.clone(_,f._lastDistanceDisplayCondition),f.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(_,f.distanceDisplayCondition)));var v,C=h.terrainOffsetProperty;Property.isConstant(C)||(v=Property.getValueOrDefault(C,e,defaultOffset$9,offsetScratch$b),Cartesian3.equals(v,f._lastOffset)||(f._lastOffset=Cartesian3.clone(v,f._lastOffset),f.offset=OffsetGeometryInstanceAttribute.toValue(v,f.offset)))}this.updateShows(n)}else defined(n)&&!n.ready&&(r=!1);return r},Batch$1.prototype.updateShows=function(e){for(var t=this.showsUpdated.values,i=t.length,r=0;r<i;r++){var n=t[r],a=n.entity,o=this.geometry.get(n.id),s=this.attributes.get(o.id.id);defined(s)||(s=e.getGeometryInstanceAttributes(o.id),this.attributes.set(o.id.id,s));var l=a.isShowing;l!==(1===s.show[0])&&(s.show=ShowGeometryInstanceAttribute.toValue(l,s.show),o.attributes.show.value[0]=s.show[0])}this.showsUpdated.removeAll()},Batch$1.prototype.contains=function(e){return this.updaters.contains(e.id)},Batch$1.prototype.getBoundingSphere=function(e,t){var i=this.primitive;if(!i.ready)return BoundingSphereState$1.PENDING;var r=i.getGeometryInstanceAttributes(e.entity);return!defined(r)||!defined(r.boundingSphere)||defined(r.show)&&0===r.show[0]?BoundingSphereState$1.FAILED:(r.boundingSphere.clone(t),BoundingSphereState$1.DONE)},Batch$1.prototype.destroy=function(){var e=this.primitive,t=this.primitives;defined(e)&&t.remove(e);var i=this.oldPrimitive;defined(i)&&t.remove(i),this.removeMaterialSubscription()},StaticGeometryPerMaterialBatch.prototype.add=function(e,t){for(var i=this._items,r=i.length,n=0;n<r;n++){var a=i[n];if(a.isMaterial(t))return void a.add(e,t)}var o=new Batch$1(this._primitives,this._appearanceType,t.fillMaterialProperty,this._depthFailAppearanceType,t.depthFailMaterialProperty,this._closed,this._shadows);o.add(e,t),i.push(o)},StaticGeometryPerMaterialBatch.prototype.remove=function(e){for(var t=this._items,i=t.length-1;0<=i;i--){var r=t[i];if(r.remove(e)){0===r.updaters.length&&(t.splice(i,1),r.destroy());break}}},StaticGeometryPerMaterialBatch.prototype.update=function(e){for(var t=this._items,i=t.length-1;0<=i;i--){var r=t[i];if(r.invalidated){t.splice(i,1);for(var n=r.updaters.values,a=n.length,o=0;o<a;o++)this.add(e,n[o]);r.destroy()}}var s=!0;for(i=0;i<t.length;i++)s=t[i].update(e)&&s;return s},StaticGeometryPerMaterialBatch.prototype.getBoundingSphere=function(e,t){for(var i=this._items,r=i.length,n=0;n<r;n++){var a=i[n];if(a.contains(e))return a.getBoundingSphere(e,t)}return BoundingSphereState$1.FAILED},StaticGeometryPerMaterialBatch.prototype.removeAllPrimitives=function(){for(var e=this._items,t=e.length,i=0;i<t;i++)e[i].destroy();this._items.length=0};var colorScratch$4=new Color,distanceDisplayConditionScratch$3=new DistanceDisplayCondition,defaultDistanceDisplayCondition$3=new DistanceDisplayCondition;function Batch$2(e,t,i,r){this.primitives=e,this.zIndex=r,this.classificationType=t,this.color=i,this.createPrimitive=!1,this.waitingOnCreate=!1,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new AssociativeArray,this.updaters=new AssociativeArray,this.updatersWithAttributes=new AssociativeArray,this.attributes=new AssociativeArray,this.subscriptions=new AssociativeArray,this.showsUpdated=new AssociativeArray,this.itemsToRemove=[],this.isDirty=!1,this.rectangleCollisionCheck=new RectangleCollisionChecker}function StaticGroundGeometryColorBatch(e,t){this._batches=[],this._primitives=e,this._classificationType=t}Batch$2.prototype.overlapping=function(e){return this.rectangleCollisionCheck.collides(e)},Batch$2.prototype.add=function(n,e){var a,t=n.id;this.createPrimitive=!0,this.geometry.set(t,e),this.updaters.set(t,n),this.rectangleCollisionCheck.insert(t,e.geometry.rectangle),n.hasConstantFill&&n.fillMaterialProperty.isConstant&&Property.isConstant(n.distanceDisplayConditionProperty)?(a=this).subscriptions.set(t,n.entity.definitionChanged.addEventListener(function(e,t,i,r){"isShowing"===t&&a.showsUpdated.set(n.id,n)})):this.updatersWithAttributes.set(t,n)},Batch$2.prototype.remove=function(e){var t=e.id,i=this.geometry.get(t);if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.rectangleCollisionCheck.remove(t,i.geometry.rectangle),this.updatersWithAttributes.remove(t);var r=this.subscriptions.get(t);return defined(r)&&(r(),this.subscriptions.remove(t),this.showsUpdated.remove(t)),!0}return!1},Batch$2.prototype.update=function(e){var t=!0,i=this.primitive,r=this.primitives;if(this.createPrimitive){var n,a=this.geometry.values;0<a.length?(defined(i)&&(defined(this.oldPrimitive)?r.remove(i):this.oldPrimitive=i),i=new GroundPrimitive({show:!1,asynchronous:!0,geometryInstances:a.slice(),classificationType:this.classificationType}),r.add(i,this.zIndex),t=!1):(defined(i)&&(r.remove(i),i=void 0),defined(n=this.oldPrimitive)&&(r.remove(n),this.oldPrimitive=void 0)),this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(defined(i)&&i.ready){i.show=!0,defined(this.oldPrimitive)&&(r.remove(this.oldPrimitive),this.oldPrimitive=void 0);for(var o=this.updatersWithAttributes.values,s=o.length,l=this.waitingOnCreate,c=0;c<s;c++){var u,d,h=o[c],p=this.geometry.get(h.id),m=this.attributes.get(p.id.id);defined(m)||(m=i.getGeometryInstanceAttributes(p.id),this.attributes.set(p.id.id,m)),h.fillMaterialProperty.isConstant&&!l||(u=h.fillMaterialProperty.color,d=Property.getValueOrDefault(u,e,Color.WHITE,colorScratch$4),Color.equals(m._lastColor,d)||(m._lastColor=Color.clone(d,m._lastColor),m.color=ColorGeometryInstanceAttribute.toValue(d,m.color)));var f=h.entity.isShowing&&(h.hasConstantFill||h.isFilled(e));f!==(1===m.show[0])&&(m.show=ShowGeometryInstanceAttribute.toValue(f,m.show));var g,_=h.distanceDisplayConditionProperty;Property.isConstant(_)||(g=Property.getValueOrDefault(_,e,defaultDistanceDisplayCondition$3,distanceDisplayConditionScratch$3),DistanceDisplayCondition.equals(g,m._lastDistanceDisplayCondition)||(m._lastDistanceDisplayCondition=DistanceDisplayCondition.clone(g,m._lastDistanceDisplayCondition),m.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(g,m.distanceDisplayCondition)))}this.updateShows(i),this.waitingOnCreate=!1}else defined(i)&&!i.ready&&(t=!1);return this.itemsToRemove.length=0,t},Batch$2.prototype.updateShows=function(e){for(var t=this.showsUpdated.values,i=t.length,r=0;r<i;r++){var n=t[r],a=this.geometry.get(n.id),o=this.attributes.get(a.id.id);defined(o)||(o=e.getGeometryInstanceAttributes(a.id),this.attributes.set(a.id.id,o));var s=n.entity.isShowing;s!==(1===o.show[0])&&(o.show=ShowGeometryInstanceAttribute.toValue(s,o.show),a.attributes.show.value[0]=o.show[0])}this.showsUpdated.removeAll()},Batch$2.prototype.contains=function(e){return this.updaters.contains(e.id)},Batch$2.prototype.getBoundingSphere=function(e,t){var i=this.primitive;if(!i.ready)return BoundingSphereState$1.PENDING;var r=i.getBoundingSphere(e.entity);return defined(r)?(r.clone(t),BoundingSphereState$1.DONE):BoundingSphereState$1.FAILED},Batch$2.prototype.removeAllPrimitives=function(){var e=this.primitives,t=this.primitive;defined(t)&&(e.remove(t),this.primitive=void 0,this.geometry.removeAll(),this.updaters.removeAll());var i=this.oldPrimitive;defined(i)&&(e.remove(i),this.oldPrimitive=void 0)},StaticGroundGeometryColorBatch.prototype.add=function(e,t){for(var i,r=t.createFillGeometryInstance(e),n=this._batches,a=Property.getValueOrDefault(t.zIndex,0),o=n.length,s=0;s<o;++s){var l=n[s];if(l.zIndex===a&&!l.overlapping(r.geometry.rectangle)){i=l;break}}return defined(i)||(i=new Batch$2(this._primitives,this._classificationType,r.attributes.color.value,a),n.push(i)),i.add(t,r),i},StaticGroundGeometryColorBatch.prototype.remove=function(e){for(var t=this._batches,i=t.length,r=0;r<i;++r)if(t[r].remove(e))return},StaticGroundGeometryColorBatch.prototype.update=function(e){for(var t,i=!0,r=this._batches,n=r.length,a=0;a<n;++a)i=r[a].update(e)&&i;for(a=0;a<n;++a)for(var o=r[a],s=o.itemsToRemove,l=s.length,c=0;c<l;c++){t=s[c],o.remove(t);var u=this.add(e,t);o.isDirty=!0,u.isDirty=!0}for(a=n-1;0<=a;--a){var d=r[a];d.isDirty&&(i=r[a].update(e)&&i,d.isDirty=!1),0===d.geometry.length&&r.splice(a,1)}return i},StaticGroundGeometryColorBatch.prototype.getBoundingSphere=function(e,t){for(var i=this._batches,r=i.length,n=0;n<r;++n){var a=i[n];if(a.contains(e))return a.getBoundingSphere(e,t)}return BoundingSphereState$1.FAILED},StaticGroundGeometryColorBatch.prototype.removeAllPrimitives=function(){for(var e=this._batches,t=e.length,i=0;i<t;++i)e[i].removeAllPrimitives()};var distanceDisplayConditionScratch$4=new DistanceDisplayCondition,defaultDistanceDisplayCondition$4=new DistanceDisplayCondition;function Batch$3(e,t,i,r,n,a){this.primitives=e,this.classificationType=t,this.appearanceType=i,this.materialProperty=r,this.updaters=new AssociativeArray,this.createPrimitive=!0,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new AssociativeArray,this.material=void 0,this.updatersWithAttributes=new AssociativeArray,this.attributes=new AssociativeArray,this.invalidated=!1,this.removeMaterialSubscription=r.definitionChanged.addEventListener(Batch$3.prototype.onMaterialChanged,this),this.subscriptions=new AssociativeArray,this.showsUpdated=new AssociativeArray,this.usingSphericalTextureCoordinates=n,this.zIndex=a,this.rectangleCollisionCheck=new RectangleCollisionChecker}function StaticGroundGeometryPerMaterialBatch(e,t,i){this._items=[],this._primitives=e,this._classificationType=t,this._appearanceType=i}Batch$3.prototype.onMaterialChanged=function(){this.invalidated=!0},Batch$3.prototype.overlapping=function(e){return this.rectangleCollisionCheck.collides(e)},Batch$3.prototype.isMaterial=function(e){var t=this.materialProperty,i=e.fillMaterialProperty;return i===t||i instanceof ColorMaterialProperty&&t instanceof ColorMaterialProperty||defined(t)&&t.equals(i)},Batch$3.prototype.add=function(e,n,t){var a,i=n.id;this.updaters.set(i,n),this.geometry.set(i,t),this.rectangleCollisionCheck.insert(i,t.geometry.rectangle),n.hasConstantFill&&n.fillMaterialProperty.isConstant&&Property.isConstant(n.distanceDisplayConditionProperty)?(a=this).subscriptions.set(i,n.entity.definitionChanged.addEventListener(function(e,t,i,r){"isShowing"===t&&a.showsUpdated.set(n.id,n)})):this.updatersWithAttributes.set(i,n),this.createPrimitive=!0},Batch$3.prototype.remove=function(e){var t=e.id,i=this.geometry.get(t);if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.rectangleCollisionCheck.remove(t,i.geometry.rectangle),this.updatersWithAttributes.remove(t);var r=this.subscriptions.get(t);return defined(r)&&(r(),this.subscriptions.remove(t)),!0}return!1},Batch$3.prototype.update=function(e){var t,i=!0,r=this.primitive,n=this.primitives,a=this.geometry.values;if(this.createPrimitive)0<a.length?(defined(r)&&(defined(this.oldPrimitive)?n.remove(r):this.oldPrimitive=r),this.material=MaterialProperty.getValue(e,this.materialProperty,this.material),r=new GroundPrimitive({show:!1,asynchronous:!0,geometryInstances:a.slice(),appearance:new this.appearanceType({material:this.material}),classificationType:this.classificationType}),n.add(r,this.zIndex),i=!1):(defined(r)&&(n.remove(r),r=void 0),defined(t=this.oldPrimitive)&&(n.remove(t),this.oldPrimitive=void 0)),this.attributes.removeAll(),this.primitive=r,this.createPrimitive=!1;else if(defined(r)&&r.ready){r.show=!0,defined(this.oldPrimitive)&&(n.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.material=MaterialProperty.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material;for(var o=this.updatersWithAttributes.values,s=o.length,l=0;l<s;l++){var c=o[l],u=c.entity,d=this.geometry.get(c.id),h=this.attributes.get(d.id.id);defined(h)||(h=r.getGeometryInstanceAttributes(d.id),this.attributes.set(d.id.id,h));var p=u.isShowing&&(c.hasConstantFill||c.isFilled(e));p!==(1===h.show[0])&&(h.show=ShowGeometryInstanceAttribute.toValue(p,h.show));var m,f=c.distanceDisplayConditionProperty;Property.isConstant(f)||(m=Property.getValueOrDefault(f,e,defaultDistanceDisplayCondition$4,distanceDisplayConditionScratch$4),DistanceDisplayCondition.equals(m,h._lastDistanceDisplayCondition)||(h._lastDistanceDisplayCondition=DistanceDisplayCondition.clone(m,h._lastDistanceDisplayCondition),h.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(m,h.distanceDisplayCondition)))}this.updateShows(r)}else defined(r)&&!r.ready&&(i=!1);return i},Batch$3.prototype.updateShows=function(e){for(var t=this.showsUpdated.values,i=t.length,r=0;r<i;r++){var n=t[r],a=n.entity,o=this.geometry.get(n.id),s=this.attributes.get(o.id.id);defined(s)||(s=e.getGeometryInstanceAttributes(o.id),this.attributes.set(o.id.id,s));var l=a.isShowing;l!==(1===s.show[0])&&(s.show=ShowGeometryInstanceAttribute.toValue(l,s.show),o.attributes.show.value[0]=s.show[0])}this.showsUpdated.removeAll()},Batch$3.prototype.contains=function(e){return this.updaters.contains(e.id)},Batch$3.prototype.getBoundingSphere=function(e,t){var i=this.primitive;if(!i.ready)return BoundingSphereState$1.PENDING;var r=i.getGeometryInstanceAttributes(e.entity);return!defined(r)||!defined(r.boundingSphere)||defined(r.show)&&0===r.show[0]?BoundingSphereState$1.FAILED:(r.boundingSphere.clone(t),BoundingSphereState$1.DONE)},Batch$3.prototype.destroy=function(){var e=this.primitive,t=this.primitives;defined(e)&&t.remove(e);var i=this.oldPrimitive;defined(i)&&t.remove(i),this.removeMaterialSubscription()},StaticGroundGeometryPerMaterialBatch.prototype.add=function(e,t){for(var i=this._items,r=i.length,n=t.createFillGeometryInstance(e),a=ShadowVolumeAppearance.shouldUseSphericalCoordinates(n.geometry.rectangle),o=Property.getValueOrDefault(t.zIndex,0),s=0;s<r;++s){var l=i[s];if(l.isMaterial(t)&&l.usingSphericalTextureCoordinates===a&&l.zIndex===o&&!l.overlapping(n.geometry.rectangle))return void l.add(e,t,n)}var c=new Batch$3(this._primitives,this._classificationType,this._appearanceType,t.fillMaterialProperty,a,o);c.add(e,t,n),i.push(c)},StaticGroundGeometryPerMaterialBatch.prototype.remove=function(e){for(var t=this._items,i=t.length-1;0<=i;i--){var r=t[i];if(r.remove(e)){0===r.updaters.length&&(t.splice(i,1),r.destroy());break}}},StaticGroundGeometryPerMaterialBatch.prototype.update=function(e){for(var t=this._items,i=t.length-1;0<=i;i--){var r=t[i];if(r.invalidated){t.splice(i,1);for(var n=r.updaters.values,a=n.length,o=0;o<a;o++)this.add(e,n[o]);r.destroy()}}var s=!0;for(i=0;i<t.length;i++)s=t[i].update(e)&&s;return s},StaticGroundGeometryPerMaterialBatch.prototype.getBoundingSphere=function(e,t){for(var i=this._items,r=i.length,n=0;n<r;n++){var a=i[n];if(a.contains(e))return a.getBoundingSphere(e,t)}return BoundingSphereState$1.FAILED},StaticGroundGeometryPerMaterialBatch.prototype.removeAllPrimitives=function(){for(var e=this._items,t=e.length,i=0;i<t;i++)e[i].destroy();this._items.length=0};var colorScratch$5=new Color,distanceDisplayConditionScratch$5=new DistanceDisplayCondition,defaultDistanceDisplayCondition$5=new DistanceDisplayCondition,defaultOffset$a=Cartesian3.ZERO,offsetScratch$c=new Cartesian3;function Batch$4(e,t,i,r){this.translucent=t,this.width=i,this.shadows=r,this.primitives=e,this.createPrimitive=!1,this.waitingOnCreate=!1,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new AssociativeArray,this.updaters=new AssociativeArray,this.updatersWithAttributes=new AssociativeArray,this.attributes=new AssociativeArray,this.itemsToRemove=[],this.subscriptions=new AssociativeArray,this.showsUpdated=new AssociativeArray}function StaticOutlineGeometryBatch(e,t,i){this._primitives=e,this._scene=t,this._shadows=i,this._solidBatches=new AssociativeArray,this._translucentBatches=new AssociativeArray}Batch$4.prototype.add=function(n,e){var a,t=n.id;this.createPrimitive=!0,this.geometry.set(t,e),this.updaters.set(t,n),n.hasConstantOutline&&n.outlineColorProperty.isConstant&&Property.isConstant(n.distanceDisplayConditionProperty)&&Property.isConstant(n.terrainOffsetProperty)?(a=this).subscriptions.set(t,n.entity.definitionChanged.addEventListener(function(e,t,i,r){"isShowing"===t&&a.showsUpdated.set(n.id,n)})):this.updatersWithAttributes.set(t,n)},Batch$4.prototype.remove=function(e){var t=e.id;if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.updatersWithAttributes.remove(t);var i=this.subscriptions.get(t);return defined(i)&&(i(),this.subscriptions.remove(t),this.showsUpdated.remove(t)),!0}return!1},Batch$4.prototype.update=function(e){var t=!0,i=0,r=this.primitive,n=this.primitives;if(this.createPrimitive){var a,o=this.geometry.values;0<o.length?(defined(r)&&(defined(this.oldPrimitive)?n.remove(r):this.oldPrimitive=r),r=new Primitive({show:!1,asynchronous:!0,geometryInstances:o.slice(),appearance:new PerInstanceColorAppearance({flat:!0,translucent:this.translucent,renderState:{lineWidth:this.width}}),shadows:this.shadows}),n.add(r),t=!1):(defined(r)&&(n.remove(r),r=void 0),defined(a=this.oldPrimitive)&&(n.remove(a),this.oldPrimitive=void 0)),this.attributes.removeAll(),this.primitive=r,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(defined(r)&&r.ready){r.show=!0,defined(this.oldPrimitive)&&(n.remove(this.oldPrimitive),this.oldPrimitive=void 0);for(var s=this.updatersWithAttributes.values,l=s.length,c=this.waitingOnCreate,u=0;u<l;u++){var d,h,p=s[u],m=this.geometry.get(p.id),f=this.attributes.get(m.id.id);defined(f)||(f=r.getGeometryInstanceAttributes(m.id),this.attributes.set(m.id.id,f)),p.outlineColorProperty.isConstant&&!c||(d=p.outlineColorProperty,h=Property.getValueOrDefault(d,e,Color.WHITE,colorScratch$5),Color.equals(f._lastColor,h)||(f._lastColor=Color.clone(h,f._lastColor),f.color=ColorGeometryInstanceAttribute.toValue(h,f.color),(this.translucent&&255===f.color[3]||!this.translucent&&255!==f.color[3])&&(this.itemsToRemove[i++]=p)));var g=p.entity.isShowing&&(p.hasConstantOutline||p.isOutlineVisible(e));g!==(1===f.show[0])&&(f.show=ShowGeometryInstanceAttribute.toValue(g,f.show));var _,y=p.distanceDisplayConditionProperty;Property.isConstant(y)||(_=Property.getValueOrDefault(y,e,defaultDistanceDisplayCondition$5,distanceDisplayConditionScratch$5),DistanceDisplayCondition.equals(_,f._lastDistanceDisplayCondition)||(f._lastDistanceDisplayCondition=DistanceDisplayCondition.clone(_,f._lastDistanceDisplayCondition),f.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(_,f.distanceDisplayCondition)));var v,C=p.terrainOffsetProperty;Property.isConstant(C)||(v=Property.getValueOrDefault(C,e,defaultOffset$a,offsetScratch$c),Cartesian3.equals(v,f._lastOffset)||(f._lastOffset=Cartesian3.clone(v,f._lastOffset),f.offset=OffsetGeometryInstanceAttribute.toValue(v,f.offset)))}this.updateShows(r),this.waitingOnCreate=!1}else defined(r)&&!r.ready&&(t=!1);return this.itemsToRemove.length=i,t},Batch$4.prototype.updateShows=function(e){for(var t=this.showsUpdated.values,i=t.length,r=0;r<i;r++){var n=t[r],a=this.geometry.get(n.id),o=this.attributes.get(a.id.id);defined(o)||(o=e.getGeometryInstanceAttributes(a.id),this.attributes.set(a.id.id,o));var s=n.entity.isShowing;s!==(1===o.show[0])&&(o.show=ShowGeometryInstanceAttribute.toValue(s,o.show),a.attributes.show.value[0]=o.show[0])}this.showsUpdated.removeAll()},Batch$4.prototype.contains=function(e){return this.updaters.contains(e.id)},Batch$4.prototype.getBoundingSphere=function(e,t){var i=this.primitive;if(!i.ready)return BoundingSphereState$1.PENDING;var r=i.getGeometryInstanceAttributes(e.entity);return!defined(r)||!defined(r.boundingSphere)||defined(r.show)&&0===r.show[0]?BoundingSphereState$1.FAILED:(r.boundingSphere.clone(t),BoundingSphereState$1.DONE)},Batch$4.prototype.removeAllPrimitives=function(){var e=this.primitives,t=this.primitive;defined(t)&&(e.remove(t),this.primitive=void 0,this.geometry.removeAll(),this.updaters.removeAll());var i=this.oldPrimitive;defined(i)&&(e.remove(i),this.oldPrimitive=void 0)},StaticOutlineGeometryBatch.prototype.add=function(e,t){var i,r,n=t.createOutlineGeometryInstance(e),a=this._scene.clampLineWidth(t.outlineWidth);255===n.attributes.color.value[3]?defined(r=(i=this._solidBatches).get(a))||(r=new Batch$4(this._primitives,!1,a,this._shadows),i.set(a,r)):defined(r=(i=this._translucentBatches).get(a))||(r=new Batch$4(this._primitives,!0,a,this._shadows),i.set(a,r)),r.add(t,n)},StaticOutlineGeometryBatch.prototype.remove=function(e){for(var t=this._solidBatches.values,i=t.length,r=0;r<i;r++)if(t[r].remove(e))return;var n=this._translucentBatches.values,a=n.length;for(r=0;r<a;r++)if(n[r].remove(e))return},StaticOutlineGeometryBatch.prototype.update=function(e){var t,i,r,n,a,o=this._solidBatches.values,s=o.length,l=this._translucentBatches.values,c=l.length,u=!0,d=!1;do{for(d=!1,i=0;i<s;i++){u=(n=o[i]).update(e);var h=(a=n.itemsToRemove).length;if(0<h)for(d=!0,t=0;t<h;t++)r=a[t],n.remove(r),this.add(e,r)}for(i=0;i<c;i++){u=(n=l[i]).update(e);var p=(a=n.itemsToRemove).length;if(0<p)for(d=!0,t=0;t<p;t++)r=a[t],n.remove(r),this.add(e,r)}}while(d);return u},StaticOutlineGeometryBatch.prototype.getBoundingSphere=function(e,t){for(var i=this._solidBatches.values,r=i.length,n=0;n<r;n++){var a=i[n];if(a.contains(e))return a.getBoundingSphere(e,t)}var o=this._translucentBatches.values,s=o.length;for(n=0;n<s;n++){var l=o[n];if(l.contains(e))return l.getBoundingSphere(e,t)}return BoundingSphereState$1.FAILED},StaticOutlineGeometryBatch.prototype.removeAllPrimitives=function(){for(var e=this._solidBatches.values,t=e.length,i=0;i<t;i++)e[i].removeAllPrimitives();var r=this._translucentBatches.values,n=r.length;for(i=0;i<n;i++)r[i].removeAllPrimitives()};var scratchColor$h=new Color;function WallGeometryOptions(e){this.id=e,this.vertexFormat=void 0,this.positions=void 0,this.minimumHeights=void 0,this.maximumHeights=void 0,this.granularity=void 0}function WallGeometryUpdater(e,t){GeometryUpdater.call(this,{entity:e,scene:t,geometryOptions:new WallGeometryOptions(e),geometryPropertyName:"wall",observedPropertyNames:["availability","wall"]}),this._onEntityPropertyChanged(e,"wall",e.wall,void 0)}function DynamicWallGeometryUpdater(e,t,i){DynamicGeometryUpdater.call(this,e,t,i)}defined(Object.create)&&(WallGeometryUpdater.prototype=Object.create(GeometryUpdater.prototype),WallGeometryUpdater.prototype.constructor=WallGeometryUpdater),WallGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),a=this._distanceDisplayConditionProperty.getValue(e),o=DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a),s=this._materialProperty instanceof ColorMaterialProperty?(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$h)),defined(t)||(t=Color.WHITE),{show:n,distanceDisplayCondition:o,color:ColorGeometryInstanceAttribute.fromColor(t)}):{show:n,distanceDisplayCondition:o};return new GeometryInstance({id:i,geometry:new WallGeometry(this._options),attributes:s})},WallGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){var t=this._entity,i=t.isAvailable(e),r=Property.getValueOrDefault(this._outlineColorProperty,e,Color.BLACK,scratchColor$h),n=this._distanceDisplayConditionProperty.getValue(e);return new GeometryInstance({id:t,geometry:new WallOutlineGeometry(this._options),attributes:{show:new ShowGeometryInstanceAttribute(i&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:ColorGeometryInstanceAttribute.fromColor(r),distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(n)}})},WallGeometryUpdater.prototype._isHidden=function(e,t){return!defined(t.positions)||GeometryUpdater.prototype._isHidden.call(this,e,t)},WallGeometryUpdater.prototype._getIsClosed=function(e){return!1},WallGeometryUpdater.prototype._isDynamic=function(e,t){return!(t.positions.isConstant&&Property.isConstant(t.minimumHeights)&&Property.isConstant(t.maximumHeights)&&Property.isConstant(t.outlineWidth)&&Property.isConstant(t.granularity))},WallGeometryUpdater.prototype._setStaticOptions=function(e,t){var i=t.minimumHeights,r=t.maximumHeights,n=t.granularity,a=this._materialProperty instanceof ColorMaterialProperty,o=this._options;o.vertexFormat=a?PerInstanceColorAppearance.VERTEX_FORMAT:MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat,o.positions=t.positions.getValue(Iso8601.MINIMUM_VALUE,o.positions),o.minimumHeights=defined(i)?i.getValue(Iso8601.MINIMUM_VALUE,o.minimumHeights):void 0,o.maximumHeights=defined(r)?r.getValue(Iso8601.MINIMUM_VALUE,o.maximumHeights):void 0,o.granularity=defined(n)?n.getValue(Iso8601.MINIMUM_VALUE):void 0},WallGeometryUpdater.DynamicGeometryUpdater=DynamicWallGeometryUpdater,defined(Object.create)&&(DynamicWallGeometryUpdater.prototype=Object.create(DynamicGeometryUpdater.prototype),DynamicWallGeometryUpdater.prototype.constructor=DynamicWallGeometryUpdater),DynamicWallGeometryUpdater.prototype._isHidden=function(e,t,i){return!defined(this._options.positions)||DynamicGeometryUpdater.prototype._isHidden.call(this,e,t,i)},DynamicWallGeometryUpdater.prototype._setOptions=function(e,t,i){var r=this._options;r.positions=Property.getValueOrUndefined(t.positions,i,r.positions),r.minimumHeights=Property.getValueOrUndefined(t.minimumHeights,i,r.minimumHeights),r.maximumHeights=Property.getValueOrUndefined(t.maximumHeights,i,r.maximumHeights),r.granularity=Property.getValueOrUndefined(t.granularity,i)};var emptyArray=[],geometryUpdaters=[BoxGeometryUpdater,CylinderGeometryUpdater,CorridorGeometryUpdater,EllipseGeometryUpdater,EllipsoidGeometryUpdater,PlaneGeometryUpdater,PolygonGeometryUpdater,PolylineVolumeGeometryUpdater,RectangleGeometryUpdater,WallGeometryUpdater];function GeometryUpdaterSet(e,t){this.entity=e,this.scene=t;var i=new Array(geometryUpdaters.length),r=new Event;function n(e){r.raiseEvent(e)}for(var a=new EventHelper,o=0;o<i.length;o++){var s=new geometryUpdaters[o](e,t);a.add(s.geometryChanged,n),i[o]=s}this.updaters=i,this.geometryChanged=r,this.eventHelper=a,this._removeEntitySubscription=e.definitionChanged.addEventListener(GeometryUpdaterSet.prototype._onEntityPropertyChanged,this)}function GeometryVisualizer(e,t,i,r){i=defaultValue(i,e.primitives),r=defaultValue(r,e.groundPrimitives),this._scene=e,this._primitives=i,this._groundPrimitives=r,this._entityCollection=void 0,this._addedObjects=new AssociativeArray,this._removedObjects=new AssociativeArray,this._changedObjects=new AssociativeArray;var n=ShadowMode$1.NUMBER_OF_SHADOW_MODES;this._outlineBatches=new Array(2*n),this._closedColorBatches=new Array(2*n),this._closedMaterialBatches=new Array(2*n),this._openColorBatches=new Array(2*n),this._openMaterialBatches=new Array(2*n);var a,o=Entity.supportsMaterialsforEntitiesOnTerrain(e);for(this._supportsMaterialsforEntitiesOnTerrain=o,a=0;a<n;++a)this._outlineBatches[a]=new StaticOutlineGeometryBatch(i,e,a,!1),this._outlineBatches[n+a]=new StaticOutlineGeometryBatch(i,e,a,!0),this._closedColorBatches[a]=new StaticGeometryColorBatch(i,PerInstanceColorAppearance,void 0,!0,a,!0),this._closedColorBatches[n+a]=new StaticGeometryColorBatch(i,PerInstanceColorAppearance,void 0,!0,a,!1),this._closedMaterialBatches[a]=new StaticGeometryPerMaterialBatch(i,MaterialAppearance,void 0,!0,a,!0),this._closedMaterialBatches[n+a]=new StaticGeometryPerMaterialBatch(i,MaterialAppearance,void 0,!0,a,!1),this._openColorBatches[a]=new StaticGeometryColorBatch(i,PerInstanceColorAppearance,void 0,!1,a,!0),this._openColorBatches[n+a]=new StaticGeometryColorBatch(i,PerInstanceColorAppearance,void 0,!1,a,!1),this._openMaterialBatches[a]=new StaticGeometryPerMaterialBatch(i,MaterialAppearance,void 0,!1,a,!0),this._openMaterialBatches[n+a]=new StaticGeometryPerMaterialBatch(i,MaterialAppearance,void 0,!1,a,!1);var s=ClassificationType$1.NUMBER_OF_CLASSIFICATION_TYPES,l=new Array(s),c=[];if(o)for(a=0;a<s;++a)c.push(new StaticGroundGeometryPerMaterialBatch(r,a,MaterialAppearance)),l[a]=new StaticGroundGeometryColorBatch(r,a);else for(a=0;a<s;++a)l[a]=new StaticGroundGeometryColorBatch(r,a);this._groundColorBatches=l,this._groundMaterialBatches=c,this._dynamicBatch=new DynamicGeometryBatch(i,r),this._batches=this._outlineBatches.concat(this._closedColorBatches,this._closedMaterialBatches,this._openColorBatches,this._openMaterialBatches,this._groundColorBatches,this._groundMaterialBatches,this._dynamicBatch),this._subscriptions=new AssociativeArray,this._updaterSets=new AssociativeArray,(this._entityCollection=t).collectionChanged.addEventListener(GeometryVisualizer.prototype._onCollectionChanged,this),this._onCollectionChanged(t,t.values,emptyArray)}GeometryUpdaterSet.prototype._onEntityPropertyChanged=function(e,t,i,r){for(var n=this.updaters,a=0;a<n.length;a++)n[a]._onEntityPropertyChanged(e,t,i,r)},GeometryUpdaterSet.prototype.forEach=function(e){for(var t=this.updaters,i=0;i<t.length;i++)e(t[i])},GeometryUpdaterSet.prototype.destroy=function(){this.eventHelper.removeAll();for(var e=this.updaters,t=0;t<e.length;t++)e[t].destroy();this._removeEntitySubscription(),destroyObject(this)},GeometryVisualizer.prototype.update=function(t){for(var e,i,r,n=this._addedObjects,a=n.values,o=this._removedObjects,s=o.values,l=this._changedObjects,c=l.values,u=this,d=c.length-1;-1<d;d--)i=(e=c[d]).id,(r=this._updaterSets.get(i)).entity===e?r.forEach(function(e){u._removeUpdater(e),u._insertUpdaterIntoBatch(t,e)}):(s.push(e),a.push(e));for(d=s.length-1;-1<d;d--)i=(e=s[d]).id,(r=this._updaterSets.get(i)).forEach(this._removeUpdater.bind(this)),r.destroy(),this._updaterSets.remove(i),this._subscriptions.get(i)(),this._subscriptions.remove(i);for(d=a.length-1;-1<d;d--)i=(e=a[d]).id,r=new GeometryUpdaterSet(e,this._scene),this._updaterSets.set(i,r),r.forEach(function(e){u._insertUpdaterIntoBatch(t,e)}),this._subscriptions.set(i,r.geometryChanged.addEventListener(GeometryVisualizer._onGeometryChanged,this));n.removeAll(),o.removeAll(),l.removeAll();var h=!0,p=this._batches,m=p.length;for(d=0;d<m;d++)h=p[d].update(t)&&h;return h};var getBoundingSphereArrayScratch=[],getBoundingSphereBoundingSphereScratch=new BoundingSphere;GeometryVisualizer.prototype.getBoundingSphere=function(e,t){for(var i=getBoundingSphereArrayScratch,r=getBoundingSphereBoundingSphereScratch,n=0,a=BoundingSphereState$1.DONE,o=this._batches,s=o.length,l=e.id,c=this._updaterSets.get(l).updaters,u=0;u<c.length;u++)for(var d=c[u],h=0;h<s;h++){if((a=o[h].getBoundingSphere(d,r))===BoundingSphereState$1.PENDING)return BoundingSphereState$1.PENDING;a===BoundingSphereState$1.DONE&&(i[n]=BoundingSphere.clone(r,i[n]),n++)}return 0===n?BoundingSphereState$1.FAILED:(i.length=n,BoundingSphere.fromBoundingSpheres(i,t),BoundingSphereState$1.DONE)},GeometryVisualizer.prototype.isDestroyed=function(){return!1},GeometryVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(GeometryVisualizer.prototype._onCollectionChanged,this),this._addedObjects.removeAll(),this._removedObjects.removeAll();for(var e=this._batches,t=e.length,i=0;i<t;i++)e[i].removeAllPrimitives();var r=this._subscriptions.values,t=r.length;for(i=0;i<t;i++)r[i]();this._subscriptions.removeAll();var n=this._updaterSets.values;for(t=n.length,i=0;i<t;i++)n[i].destroy();return this._updaterSets.removeAll(),destroyObject(this)},GeometryVisualizer.prototype._removeUpdater=function(e){for(var t=this._batches,i=t.length,r=0;r<i;r++)t[r].remove(e)},GeometryVisualizer.prototype._insertUpdaterIntoBatch=function(e,t){var i,r,n;t.isDynamic?this._dynamicBatch.add(e,t):((t.outlineEnabled||t.fillEnabled)&&(i=t.shadowsProperty.getValue(e)),r=ShadowMode$1.NUMBER_OF_SHADOW_MODES,t.outlineEnabled&&(defined(t.terrainOffsetProperty)?this._outlineBatches[r+i].add(e,t):this._outlineBatches[i].add(e,t)),t.fillEnabled&&(t.onTerrain?(n=t.classificationTypeProperty.getValue(e),t.fillMaterialProperty instanceof ColorMaterialProperty?this._groundColorBatches[n].add(e,t):this._groundMaterialBatches[n].add(e,t)):t.isClosed?t.fillMaterialProperty instanceof ColorMaterialProperty?defined(t.terrainOffsetProperty)?this._closedColorBatches[r+i].add(e,t):this._closedColorBatches[i].add(e,t):defined(t.terrainOffsetProperty)?this._closedMaterialBatches[r+i].add(e,t):this._closedMaterialBatches[i].add(e,t):t.fillMaterialProperty instanceof ColorMaterialProperty?defined(t.terrainOffsetProperty)?this._openColorBatches[r+i].add(e,t):this._openColorBatches[i].add(e,t):defined(t.terrainOffsetProperty)?this._openMaterialBatches[r+i].add(e,t):this._openMaterialBatches[i].add(e,t)))},GeometryVisualizer._onGeometryChanged=function(e){var t=this._removedObjects,i=this._changedObjects,r=e.entity,n=r.id;defined(t.get(n))||defined(i.get(n))||i.set(n,r)},GeometryVisualizer.prototype._onCollectionChanged=function(e,t,i){for(var r,n,a=this._addedObjects,o=this._removedObjects,s=this._changedObjects,l=i.length-1;-1<l;l--)r=(n=i[l]).id,a.remove(r)||(o.set(r,n),s.remove(r));for(l=t.length-1;-1<l;l--)r=(n=t[l]).id,o.remove(r)?s.set(r,n):a.set(r,n)};var defaultScale$2=1,defaultFont="30px sans-serif",defaultStyle=LabelStyle$1.FILL,defaultFillColor=Color.WHITE,defaultOutlineColor$2=Color.BLACK,defaultOutlineWidth$1=1,defaultShowBackground=!1,defaultBackgroundColor$1=new Color(.165,.165,.165,.8),defaultBackgroundPadding$1=new Cartesian2(7,5),defaultPixelOffset$1=Cartesian2.ZERO,defaultEyeOffset$1=Cartesian3.ZERO,defaultHeightReference$1=HeightReference$1.NONE,defaultHorizontalOrigin$1=HorizontalOrigin$1.CENTER,defaultVerticalOrigin$1=VerticalOrigin$1.CENTER,positionScratch$a=new Cartesian3,fillColorScratch=new Color,outlineColorScratch=new Color,backgroundColorScratch=new Color,backgroundPaddingScratch=new Cartesian2,eyeOffsetScratch$1=new Cartesian3,pixelOffsetScratch$1=new Cartesian2,translucencyByDistanceScratch$1=new NearFarScalar,pixelOffsetScaleByDistanceScratch$1=new NearFarScalar,scaleByDistanceScratch$1=new NearFarScalar,distanceDisplayConditionScratch$6=new DistanceDisplayCondition;function EntityData$1(e){this.entity=e,this.label=void 0,this.index=void 0}function LabelVisualizer(e,t){t.collectionChanged.addEventListener(LabelVisualizer.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new AssociativeArray,this._onCollectionChanged(t,t.values,[],[])}function returnPrimitive$1(e,t,i){defined(e)&&(e.label=void 0,i.removeLabel(t))}LabelVisualizer.prototype.update=function(e){for(var t=this._items.values,i=this._cluster,r=0,n=t.length;r<n;r++){var a,o,s,l,c=t[r],u=c.entity,d=u._label,h=c.label,p=u.isShowing&&u.isAvailable(e)&&Property.getValueOrDefault(d._show,e,!0);p&&(o=Property.getValueOrUndefined(u._position,e,positionScratch$a),a=Property.getValueOrUndefined(d._text,e),p=defined(o)&&defined(a)),p?(Property.isConstant(u._position)||(i._clusterDirty=!0),s=!1,l=Property.getValueOrDefault(d._heightReference,e,defaultHeightReference$1),defined(h)||((h=i.getLabel(u)).id=u,c.label=h,s=Cartesian3.equals(h.position,o)&&h.heightReference===l),h.show=!0,h.position=o,h.text=a,h.scale=Property.getValueOrDefault(d._scale,e,defaultScale$2),h.font=Property.getValueOrDefault(d._font,e,defaultFont),h.style=Property.getValueOrDefault(d._style,e,defaultStyle),h.fillColor=Property.getValueOrDefault(d._fillColor,e,defaultFillColor,fillColorScratch),h.outlineColor=Property.getValueOrDefault(d._outlineColor,e,defaultOutlineColor$2,outlineColorScratch),h.outlineWidth=Property.getValueOrDefault(d._outlineWidth,e,defaultOutlineWidth$1),h.showBackground=Property.getValueOrDefault(d._showBackground,e,defaultShowBackground),h.backgroundColor=Property.getValueOrDefault(d._backgroundColor,e,defaultBackgroundColor$1,backgroundColorScratch),h.backgroundPadding=Property.getValueOrDefault(d._backgroundPadding,e,defaultBackgroundPadding$1,backgroundPaddingScratch),h.pixelOffset=Property.getValueOrDefault(d._pixelOffset,e,defaultPixelOffset$1,pixelOffsetScratch$1),h.eyeOffset=Property.getValueOrDefault(d._eyeOffset,e,defaultEyeOffset$1,eyeOffsetScratch$1),h.heightReference=l,h.horizontalOrigin=Property.getValueOrDefault(d._horizontalOrigin,e,defaultHorizontalOrigin$1),h.verticalOrigin=Property.getValueOrDefault(d._verticalOrigin,e,defaultVerticalOrigin$1),h.translucencyByDistance=Property.getValueOrUndefined(d._translucencyByDistance,e,translucencyByDistanceScratch$1),h.pixelOffsetScaleByDistance=Property.getValueOrUndefined(d._pixelOffsetScaleByDistance,e,pixelOffsetScaleByDistanceScratch$1),h.scaleByDistance=Property.getValueOrUndefined(d._scaleByDistance,e,scaleByDistanceScratch$1),h.distanceDisplayCondition=Property.getValueOrUndefined(d._distanceDisplayCondition,e,distanceDisplayConditionScratch$6),h.disableDepthTestDistance=Property.getValueOrUndefined(d._disableDepthTestDistance,e),s&&h._updateClamping()):returnPrimitive$1(c,u,i)}return!0},LabelVisualizer.prototype.getBoundingSphere=function(e,t){var i=this._items.get(e.id);if(!defined(i)||!defined(i.label))return BoundingSphereState$1.FAILED;var r=i.label;return t.center=Cartesian3.clone(defaultValue(r._clampedPosition,r.position),t.center),t.radius=0,BoundingSphereState$1.DONE},LabelVisualizer.prototype.isDestroyed=function(){return!1},LabelVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(LabelVisualizer.prototype._onCollectionChanged,this);for(var e=this._entityCollection.values,t=0;t<e.length;t++)this._cluster.removeLabel(e[t]);return destroyObject(this)},LabelVisualizer.prototype._onCollectionChanged=function(e,t,i,r){for(var n,a=this._items,o=this._cluster,s=t.length-1;-1<s;s--)defined((n=t[s])._label)&&defined(n._position)&&a.set(n.id,new EntityData$1(n));for(s=r.length-1;-1<s;s--)defined((n=r[s])._label)&&defined(n._position)?a.contains(n.id)||a.set(n.id,new EntityData$1(n)):(returnPrimitive$1(a.get(n.id),n,o),a.remove(n.id));for(s=i.length-1;-1<s;s--)n=i[s],returnPrimitive$1(a.get(n.id),n,o),a.remove(n.id)};var defaultScale$3=1,defaultMinimumPixelSize=0,defaultIncrementallyLoadTextures=!0,defaultClampAnimations=!0,defaultShadows$1=ShadowMode$1.ENABLED,defaultHeightReference$2=HeightReference$1.NONE,defaultSilhouetteColor=Color.RED,defaultSilhouetteSize=0,defaultColor$6=Color.WHITE,defaultColorBlendMode=ColorBlendMode$1.HIGHLIGHT,defaultColorBlendAmount=.5,defaultImageBasedLightingFactor=new Cartesian2(1,1),modelMatrixScratch$1=new Matrix4,nodeMatrixScratch=new Matrix4;function ModelVisualizer(e,t){t.collectionChanged.addEventListener(ModelVisualizer.prototype._onCollectionChanged,this),this._scene=e,this._primitives=e.primitives,this._entityCollection=t,this._modelHash={},this._entitiesToVisualize=new AssociativeArray,this._onCollectionChanged(t,t.values,[],[])}function removeModel(e,t,i,r){var n=i[t.id];defined(n)&&(r.removeAndDestroy(n.modelPrimitive),delete i[t.id])}function clearNodeTransformationsArticulationsScratch(e,t){var i=t[e.id];defined(i)&&(i.nodeTransformationsScratch={},i.articulationsScratch={})}function checkModelLoad(e,t,i){e.readyPromise.otherwise(function(e){console.error(e),i[t.id].loadFail=!0})}function ScaledPositionProperty(e){this._definitionChanged=new Event,this._value=void 0,this._removeSubscription=void 0,this.setValue(e)}ModelVisualizer.prototype.update=function(e){for(var t=this._entitiesToVisualize.values,i=this._modelHash,r=this._primitives,n=0,a=t.length;n<a;n++){var o,s,l=t[n],c=l._model,u=i[l.id],d=l.isShowing&&l.isAvailable(e)&&Property.getValueOrDefault(c._show,e,!0);if(d&&(s=l.computeModelMatrix(e,modelMatrixScratch$1),o=Resource.createIfNeeded(Property.getValueOrUndefined(c._uri,e)),d=defined(s)&&defined(o)),d){var h=defined(u)?u.modelPrimitive:void 0;if(defined(h)&&o.url===u.url||(defined(h)&&(r.removeAndDestroy(h),delete i[l.id]),(h=Model.fromGltf({url:o,incrementallyLoadTextures:Property.getValueOrDefault(c._incrementallyLoadTextures,e,defaultIncrementallyLoadTextures),scene:this._scene})).id=l,r.add(h),u={modelPrimitive:h,url:o.url,animationsRunning:!1,nodeTransformationsScratch:{},articulationsScratch:{},loadFail:!1},i[l.id]=u,checkModelLoad(h,l,i)),h.show=!0,h.scale=Property.getValueOrDefault(c._scale,e,defaultScale$3),h.minimumPixelSize=Property.getValueOrDefault(c._minimumPixelSize,e,defaultMinimumPixelSize),h.maximumScale=Property.getValueOrUndefined(c._maximumScale,e),h.modelMatrix=Matrix4.clone(s,h.modelMatrix),h.shadows=Property.getValueOrDefault(c._shadows,e,defaultShadows$1),h.heightReference=Property.getValueOrDefault(c._heightReference,e,defaultHeightReference$2),h.distanceDisplayCondition=Property.getValueOrUndefined(c._distanceDisplayCondition,e),h.silhouetteColor=Property.getValueOrDefault(c._silhouetteColor,e,defaultSilhouetteColor,h._silhouetteColor),h.silhouetteSize=Property.getValueOrDefault(c._silhouetteSize,e,defaultSilhouetteSize),h.color=Property.getValueOrDefault(c._color,e,defaultColor$6,h._color),h.colorBlendMode=Property.getValueOrDefault(c._colorBlendMode,e,defaultColorBlendMode),h.colorBlendAmount=Property.getValueOrDefault(c._colorBlendAmount,e,defaultColorBlendAmount),h.clippingPlanes=Property.getValueOrUndefined(c._clippingPlanes,e),h.clampAnimations=Property.getValueOrDefault(c._clampAnimations,e,defaultClampAnimations),h.imageBasedLightingFactor=Property.getValueOrDefault(c._imageBasedLightingFactor,e,defaultImageBasedLightingFactor),h.lightColor=Property.getValueOrUndefined(c._lightColor,e),h.ready){var p=Property.getValueOrDefault(c._runAnimations,e,!0);u.animationsRunning!==p&&(p?h.activeAnimations.addAll({loop:ModelAnimationLoop$1.REPEAT}):h.activeAnimations.removeAll(),u.animationsRunning=p);var m=Property.getValueOrUndefined(c._nodeTransformations,e,u.nodeTransformationsScratch);if(defined(m))for(var f=Object.keys(m),g=0,_=f.length;g<_;++g){var y,v,C=f[g],S=m[C];defined(S)&&(defined(y=h.getNode(C))&&(v=Matrix4.fromTranslationRotationScale(S,nodeMatrixScratch),y.matrix=Matrix4.multiply(y.originalMatrix,v,v)))}var T=!1,x=Property.getValueOrUndefined(c._articulations,e,u.articulationsScratch);if(defined(x))for(var b=Object.keys(x),E=0,P=b.length;E<P;++E){var A=b[E],w=x[A];defined(w)&&(T=!0,h.setArticulationStage(A,w))}T&&h.applyArticulations()}}else defined(u)&&(u.modelPrimitive.show=!1)}return!0},ModelVisualizer.prototype.isDestroyed=function(){return!1},ModelVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(ModelVisualizer.prototype._onCollectionChanged,this);for(var e=this._entitiesToVisualize.values,t=this._modelHash,i=this._primitives,r=e.length-1;-1<r;r--)removeModel(this,e[r],t,i);return destroyObject(this)},ModelVisualizer.prototype.getBoundingSphere=function(e,t){var i=this._modelHash[e.id];if(!defined(i)||i.loadFail)return BoundingSphereState$1.FAILED;var r=i.modelPrimitive;if(!defined(r)||!r.show)return BoundingSphereState$1.FAILED;if(!r.ready)return BoundingSphereState$1.PENDING;if(r.heightReference===HeightReference$1.NONE)BoundingSphere.transform(r.boundingSphere,r.modelMatrix,t);else{if(!defined(r._clampedModelMatrix))return BoundingSphereState$1.PENDING;BoundingSphere.transform(r.boundingSphere,r._clampedModelMatrix,t)}return BoundingSphereState$1.DONE},ModelVisualizer.prototype._onCollectionChanged=function(e,t,i,r){for(var n,a=this._entitiesToVisualize,o=this._modelHash,s=this._primitives,l=t.length-1;-1<l;l--)defined((n=t[l])._model)&&defined(n._position)&&a.set(n.id,n);for(l=r.length-1;-1<l;l--)defined((n=r[l])._model)&&defined(n._position)?(clearNodeTransformationsArticulationsScratch(n,o),a.set(n.id,n)):(removeModel(this,n,o,s),a.remove(n.id));for(l=i.length-1;-1<l;l--)removeModel(this,n=i[l],o,s),a.remove(n.id)},Object.defineProperties(ScaledPositionProperty.prototype,{isConstant:{get:function(){return Property.isConstant(this._value)}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return defined(this._value)?this._value.referenceFrame:ReferenceFrame$1.FIXED}}}),ScaledPositionProperty.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,ReferenceFrame$1.FIXED,t)},ScaledPositionProperty.prototype.setValue=function(e){this._value!==e&&(this._value=e,defined(this._removeSubscription)&&(this._removeSubscription(),this._removeSubscription=void 0),defined(e)&&(this._removeSubscription=e.definitionChanged.addEventListener(this._raiseDefinitionChanged,this)),this._definitionChanged.raiseEvent(this))},ScaledPositionProperty.prototype.getValueInReferenceFrame=function(e,t,i){if(defined(this._value))return defined(i=this._value.getValueInReferenceFrame(e,t,i))?Ellipsoid.WGS84.scaleToGeodeticSurface(i,i):void 0},ScaledPositionProperty.prototype.equals=function(e){return this===e||e instanceof ScaledPositionProperty&&this._value===e._value},ScaledPositionProperty.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)};var defaultResolution=60,defaultWidth=1,scratchTimeInterval$1=new TimeInterval,subSampleCompositePropertyScratch=new TimeInterval,subSampleIntervalPropertyScratch=new TimeInterval;function EntityData$2(e){this.entity=e,this.polyline=void 0,this.index=void 0,this.updater=void 0}function subSampleSampledProperty(e,t,i,r,n,a,o,s,l){var c=s,u=e.getValueInReferenceFrame(t,a,l[c]);defined(u)&&(l[c++]=u);for(var d,h,p,m,f,g=!defined(n)||JulianDate.lessThanOrEquals(n,t)||JulianDate.greaterThanOrEquals(n,i),_=0,y=r.length,v=r[_],C=i,S=!1;_<y;){if(!g&&JulianDate.greaterThanOrEquals(v,n)&&(defined(u=e.getValueInReferenceFrame(n,a,l[c]))&&(l[c++]=u),g=!0),JulianDate.greaterThan(v,t)&&JulianDate.lessThan(v,C)&&!v.equals(n)&&defined(u=e.getValueInReferenceFrame(v,a,l[c]))&&(l[c++]=u),_<y-1)if(0<o&&!S&&(m=r[_+1],(S=o<(f=JulianDate.secondsDifference(m,v)))&&(d=Math.ceil(f/o),h=0,p=f/Math.max(d,2),d=Math.max(d-1,1))),S&&h<d){v=JulianDate.addSeconds(v,p,new JulianDate),h++;continue}S=!1,v=r[++_]}return defined(u=e.getValueInReferenceFrame(i,a,l[c]))&&(l[c++]=u),c}function subSampleGenericProperty(e,t,i,r,n,a,o,s){for(var l,c=0,u=o,d=t,h=Math.max(a,60),p=!defined(r)||JulianDate.lessThanOrEquals(r,t)||JulianDate.greaterThanOrEquals(r,i);JulianDate.lessThan(d,i);)!p&&JulianDate.greaterThanOrEquals(d,r)&&(p=!0,defined(l=e.getValueInReferenceFrame(r,n,s[u]))&&(s[u]=l,u++)),defined(l=e.getValueInReferenceFrame(d,n,s[u]))&&(s[u]=l,u++),c++,d=JulianDate.addSeconds(t,h*c,new JulianDate);return defined(l=e.getValueInReferenceFrame(i,n,s[u]))&&(s[u]=l,u++),u}function subSampleIntervalProperty(e,t,i,r,n,a,o,s){subSampleIntervalPropertyScratch.start=t,subSampleIntervalPropertyScratch.stop=i;for(var l=o,c=e.intervals,u=0;u<c.length;u++){var d,h,p=c.get(u);TimeInterval.intersect(p,subSampleIntervalPropertyScratch,scratchTimeInterval$1).isEmpty||(d=p.start,p.isStartIncluded||(d=p.isStopIncluded?p.stop:JulianDate.addSeconds(p.start,JulianDate.secondsDifference(p.stop,p.start)/2,new JulianDate)),defined(h=e.getValueInReferenceFrame(d,n,s[l]))&&(s[l]=h,l++))}return l}function subSampleConstantProperty(e,t,i,r,n,a,o,s){var l=e.getValueInReferenceFrame(t,n,s[o]);return defined(l)&&(s[o++]=l),o}function subSampleCompositeProperty(e,t,i,r,n,a,o,s){subSampleCompositePropertyScratch.start=t,subSampleCompositePropertyScratch.stop=i;for(var l=o,c=e.intervals,u=0;u<c.length;u++){var d,h,p,m,f=c.get(u);TimeInterval.intersect(f,subSampleCompositePropertyScratch,scratchTimeInterval$1).isEmpty||(d=f.start,h=f.stop,p=t,JulianDate.greaterThan(d,p)&&(p=d),m=i,JulianDate.lessThan(h,m)&&(m=h),l=reallySubSample(f.data,p,m,r,n,a,l,s))}return l}function reallySubSample(e,t,i,r,n,a,o,s){for(;e instanceof ReferenceProperty;)e=e.resolvedProperty;return o=e instanceof SampledPositionProperty?subSampleSampledProperty(e,t,i,e._property._times,r,n,a,o,s):(e instanceof CompositePositionProperty?subSampleCompositeProperty:e instanceof TimeIntervalCollectionPositionProperty?subSampleIntervalProperty:e instanceof ConstantPositionProperty||e instanceof ScaledPositionProperty&&Property.isConstant(e)?subSampleConstantProperty:subSampleGenericProperty)(e,t,i,r,n,a,o,s)}function subSample(e,t,i,r,n,a,o){defined(o)||(o=[]);var s=reallySubSample(e,t,i,r,n,a,0,o);return o.length=s,o}var toFixedScratch=new Matrix3;function PolylineUpdater(e,t){this._unusedIndexes=[],this._polylineCollection=new PolylineCollection,this._scene=e,this._referenceFrame=t,e.primitives.add(this._polylineCollection)}function PathVisualizer(e,t){t.collectionChanged.addEventListener(PathVisualizer.prototype._onCollectionChanged,this),this._scene=e,this._updaters={},this._entityCollection=t,this._items=new AssociativeArray,this._onCollectionChanged(t,t.values,[],[])}PolylineUpdater.prototype.update=function(e){var t;this._referenceFrame===ReferenceFrame$1.INERTIAL&&(defined(t=Transforms.computeIcrfToFixedMatrix(e,toFixedScratch))||(t=Transforms.computeTemeToPseudoFixedMatrix(e,toFixedScratch)),Matrix4.fromRotationTranslation(t,Cartesian3.ZERO,this._polylineCollection.modelMatrix))},PolylineUpdater.prototype.updateObject=function(e,t){var i,r,n,a,o,s,l,c,u,d,h,p,m,f=t.entity,g=f._path,_=f._position,y=g._show,v=t.polyline,C=f.isShowing&&(!defined(y)||y.getValue(e));C&&(n=Property.getValueOrUndefined(g._leadTime,e),a=Property.getValueOrUndefined(g._trailTime,e),s=defined(o=f._availability),l=defined(n),c=defined(a),(C=s||l&&c)&&(c&&(i=JulianDate.addSeconds(e,-a,new JulianDate)),l&&(r=JulianDate.addSeconds(e,n,new JulianDate)),s&&(u=o.start,d=o.stop,c&&!JulianDate.greaterThan(u,i)||(i=u),l&&!JulianDate.lessThan(d,r)||(r=d)),C=JulianDate.lessThan(i,r))),C?(defined(v)||(0<(h=this._unusedIndexes).length?(p=h.pop(),v=this._polylineCollection.get(p),t.index=p):(t.index=this._polylineCollection.length,v=this._polylineCollection.add()),v.id=f,t.polyline=v),m=Property.getValueOrDefault(g._resolution,e,defaultResolution),v.show=!0,v.positions=subSample(_,i,r,e,this._referenceFrame,m,v.positions.slice()),v.material=MaterialProperty.getValue(e,g._material,v.material),v.width=Property.getValueOrDefault(g._width,e,defaultWidth),v.distanceDisplayCondition=Property.getValueOrUndefined(g._distanceDisplayCondition,e,v.distanceDisplayCondition)):defined(v)&&(this._unusedIndexes.push(t.index),t.polyline=void 0,v.show=!1,t.index=void 0)},PolylineUpdater.prototype.removeObject=function(e){var t=e.polyline;defined(t)&&(this._unusedIndexes.push(e.index),e.polyline=void 0,t.show=!1,t.id=void 0,e.index=void 0)},PolylineUpdater.prototype.destroy=function(){return this._scene.primitives.remove(this._polylineCollection),destroyObject(this)},PathVisualizer.prototype.update=function(e){var t=this._updaters;for(var i in t)t.hasOwnProperty(i)&&t[i].update(e);var r=this._items.values;if(0===r.length&&defined(this._updaters)&&0<Object.keys(this._updaters).length){for(var n in t)t.hasOwnProperty(n)&&t[n].destroy();this._updaters={}}for(var a=0,o=r.length;a<o;a++){var s=r[a],l=s.entity._position,c=s.updater,u=ReferenceFrame$1.FIXED;this._scene.mode===SceneMode$1.SCENE3D&&(u=l.referenceFrame);var d=this._updaters[u];c===d&&defined(d)?d.updateObject(e,s):(defined(c)&&c.removeObject(s),defined(d)||((d=new PolylineUpdater(this._scene,u)).update(e),this._updaters[u]=d),defined(s.updater=d)&&d.updateObject(e,s))}return!0},PathVisualizer.prototype.isDestroyed=function(){return!1},PathVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(PathVisualizer.prototype._onCollectionChanged,this);var e=this._updaters;for(var t in e)e.hasOwnProperty(t)&&e[t].destroy();return destroyObject(this)},PathVisualizer.prototype._onCollectionChanged=function(e,t,i,r){for(var n,a,o=this._items,s=t.length-1;-1<s;s--)defined((n=t[s])._path)&&defined(n._position)&&o.set(n.id,new EntityData$2(n));for(s=r.length-1;-1<s;s--)defined((n=r[s])._path)&&defined(n._position)?o.contains(n.id)||o.set(n.id,new EntityData$2(n)):defined(a=o.get(n.id))&&(defined(a.updater)&&a.updater.removeObject(a),o.remove(n.id));for(s=i.length-1;-1<s;s--)n=i[s],defined(a=o.get(n.id))&&(defined(a.updater)&&a.updater.removeObject(a),o.remove(n.id))},PathVisualizer._subSample=subSample;var defaultColor$7=Color.WHITE,defaultOutlineColor$3=Color.BLACK,defaultOutlineWidth$2=0,defaultPixelSize=1,defaultDisableDepthTestDistance=0,colorScratch$6=new Color,positionScratch$b=new Cartesian3,outlineColorScratch$1=new Color,scaleByDistanceScratch$2=new NearFarScalar,translucencyByDistanceScratch$2=new NearFarScalar,distanceDisplayConditionScratch$7=new DistanceDisplayCondition;function EntityData$3(e){this.entity=e,this.pointPrimitive=void 0,this.billboard=void 0,this.color=void 0,this.outlineColor=void 0,this.pixelSize=void 0,this.outlineWidth=void 0}function PointVisualizer(e,t){t.collectionChanged.addEventListener(PointVisualizer.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new AssociativeArray,this._onCollectionChanged(t,t.values,[],[])}function returnPrimitive$2(e,t,i){if(defined(e)){if(defined(e.pointPrimitive))return e.pointPrimitive=void 0,void i.removePoint(t);defined(e.billboard)&&(e.billboard=void 0,i.removeBillboard(t))}}PointVisualizer.prototype.update=function(e){for(var t=this._items.values,i=this._cluster,r=0,n=t.length;r<n;r++){var a,o,s,l,c,u,d,h,p,m,f,g=t[r],_=g.entity,y=_._point,v=g.pointPrimitive,C=g.billboard,S=Property.getValueOrDefault(y._heightReference,e,HeightReference$1.NONE);_.isShowing&&_.isAvailable(e)&&Property.getValueOrDefault(y._show,e,!0)&&defined(a=Property.getValueOrUndefined(_._position,e,positionScratch$b))?(Property.isConstant(_._position)||(i._clusterDirty=!0),o=f=!1,S===HeightReference$1.NONE||defined(C)?S!==HeightReference$1.NONE||defined(v)||(defined(C)&&(returnPrimitive$2(g,_,i),C=void 0),(v=i.getPoint(_)).id=_,g.pointPrimitive=v):(defined(v)&&(returnPrimitive$2(g,_,i),v=void 0),(C=i.getBillboard(_)).id=_,C.image=void 0,g.billboard=C,f=!0,o=Cartesian3.equals(C.position,a)&&C.heightReference===S),defined(v)?(v.show=!0,v.position=a,v.scaleByDistance=Property.getValueOrUndefined(y._scaleByDistance,e,scaleByDistanceScratch$2),v.translucencyByDistance=Property.getValueOrUndefined(y._translucencyByDistance,e,translucencyByDistanceScratch$2),v.color=Property.getValueOrDefault(y._color,e,defaultColor$7,colorScratch$6),v.outlineColor=Property.getValueOrDefault(y._outlineColor,e,defaultOutlineColor$3,outlineColorScratch$1),v.outlineWidth=Property.getValueOrDefault(y._outlineWidth,e,defaultOutlineWidth$2),v.pixelSize=Property.getValueOrDefault(y._pixelSize,e,defaultPixelSize),v.distanceDisplayCondition=Property.getValueOrUndefined(y._distanceDisplayCondition,e,distanceDisplayConditionScratch$7),v.disableDepthTestDistance=Property.getValueOrDefault(y._disableDepthTestDistance,e,defaultDisableDepthTestDistance)):defined(C)&&(C.show=!0,C.position=a,C.scaleByDistance=Property.getValueOrUndefined(y._scaleByDistance,e,scaleByDistanceScratch$2),C.translucencyByDistance=Property.getValueOrUndefined(y._translucencyByDistance,e,translucencyByDistanceScratch$2),C.distanceDisplayCondition=Property.getValueOrUndefined(y._distanceDisplayCondition,e,distanceDisplayConditionScratch$7),C.disableDepthTestDistance=Property.getValueOrDefault(y._disableDepthTestDistance,e,defaultDisableDepthTestDistance),C.heightReference=S,s=Property.getValueOrDefault(y._color,e,defaultColor$7,colorScratch$6),l=Property.getValueOrDefault(y._outlineColor,e,defaultOutlineColor$3,outlineColorScratch$1),c=Math.round(Property.getValueOrDefault(y._outlineWidth,e,defaultOutlineWidth$2)),u=Math.max(1,Math.round(Property.getValueOrDefault(y._pixelSize,e,defaultPixelSize))),(f=0<c?(C.scale=1,f||c!==g.outlineWidth||u!==g.pixelSize||!Color.equals(s,g.color)||!Color.equals(l,g.outlineColor)):(C.scale=u/50,u=50,f||c!==g.outlineWidth||!Color.equals(s,g.color)||!Color.equals(l,g.outlineColor)))&&(g.color=Color.clone(s,g.color),g.outlineColor=Color.clone(l,g.outlineColor),g.pixelSize=u,g.outlineWidth=c,d=s.alpha,h=s.toCssColorString(),p=l.toCssColorString(),m=JSON.stringify([h,u,p,c]),C.setImage(m,createBillboardPointCallback(d,h,p,c,u))),o&&C._updateClamping())):returnPrimitive$2(g,_,i)}return!0},PointVisualizer.prototype.getBoundingSphere=function(e,t){var i=this._items.get(e.id);if(!defined(i)||!defined(i.pointPrimitive)&&!defined(i.billboard))return BoundingSphereState$1.FAILED;if(defined(i.pointPrimitive))t.center=Cartesian3.clone(i.pointPrimitive.position,t.center);else{var r=i.billboard;if(!defined(r._clampedPosition))return BoundingSphereState$1.PENDING;t.center=Cartesian3.clone(r._clampedPosition,t.center)}return t.radius=0,BoundingSphereState$1.DONE},PointVisualizer.prototype.isDestroyed=function(){return!1},PointVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(PointVisualizer.prototype._onCollectionChanged,this);for(var e=this._entityCollection.values,t=0;t<e.length;t++)this._cluster.removePoint(e[t]);return destroyObject(this)},PointVisualizer.prototype._onCollectionChanged=function(e,t,i,r){for(var n,a=this._items,o=this._cluster,s=t.length-1;-1<s;s--)defined((n=t[s])._point)&&defined(n._position)&&a.set(n.id,new EntityData$3(n));for(s=r.length-1;-1<s;s--)defined((n=r[s])._point)&&defined(n._position)?a.contains(n.id)||a.set(n.id,new EntityData$3(n)):(returnPrimitive$2(a.get(n.id),n,o),a.remove(n.id));for(s=i.length-1;-1<s;s--)n=i[s],returnPrimitive$2(a.get(n.id),n,o),a.remove(n.id)};var defaultZIndex$1=new ConstantProperty(0),polylineCollections={},scratchColor$i=new Color,defaultMaterial$2=new ColorMaterialProperty(Color.WHITE),defaultShow$1=new ConstantProperty(!0),defaultShadows$2=new ConstantProperty(ShadowMode$1.DISABLED),defaultDistanceDisplayCondition$6=new ConstantProperty(new DistanceDisplayCondition),defaultClassificationType$1=new ConstantProperty(ClassificationType$1.BOTH);function GeometryOptions(){this.vertexFormat=void 0,this.positions=void 0,this.width=void 0,this.arcType=void 0,this.granularity=void 0}function GroundGeometryOptions(){this.positions=void 0,this.width=void 0,this.arcType=void 0,this.granularity=void 0}function PolylineGeometryUpdater(e,t){this._entity=e,this._scene=t,this._entitySubscription=e.definitionChanged.addEventListener(PolylineGeometryUpdater.prototype._onEntityPropertyChanged,this),this._fillEnabled=!1,this._dynamic=!1,this._geometryChanged=new Event,this._showProperty=void 0,this._materialProperty=void 0,this._shadowsProperty=void 0,this._distanceDisplayConditionProperty=void 0,this._classificationTypeProperty=void 0,this._depthFailMaterialProperty=void 0,this._geometryOptions=new GeometryOptions,this._groundGeometryOptions=new GroundGeometryOptions,this._id="polyline-"+e.id,this._clampToGround=!1,this._supportsPolylinesOnTerrain=Entity.supportsPolylinesOnTerrain(t),this._zIndex=0,this._onEntityPropertyChanged(e,"polyline",e.polyline,void 0)}Object.defineProperties(PolylineGeometryUpdater.prototype,{id:{get:function(){return this._id}},entity:{get:function(){return this._entity}},fillEnabled:{get:function(){return this._fillEnabled}},hasConstantFill:{get:function(){return!this._fillEnabled||!defined(this._entity.availability)&&Property.isConstant(this._showProperty)}},fillMaterialProperty:{get:function(){return this._materialProperty}},depthFailMaterialProperty:{get:function(){return this._depthFailMaterialProperty}},outlineEnabled:{value:!1},hasConstantOutline:{value:!0},outlineColorProperty:{value:void 0},shadowsProperty:{get:function(){return this._shadowsProperty}},distanceDisplayConditionProperty:{get:function(){return this._distanceDisplayConditionProperty}},classificationTypeProperty:{get:function(){return this._classificationTypeProperty}},isDynamic:{get:function(){return this._dynamic}},isClosed:{value:!1},geometryChanged:{get:function(){return this._geometryChanged}},arcType:{get:function(){return this._arcType}},clampToGround:{get:function(){return this._clampToGround&&this._supportsPolylinesOnTerrain}},zIndex:{get:function(){return this._zIndex}}}),PolylineGeometryUpdater.prototype.isOutlineVisible=function(e){return!1},PolylineGeometryUpdater.prototype.isFilled=function(e){var t=this._entity;return defaultValue(this._fillEnabled&&t.isAvailable(e)&&this._showProperty.getValue(e),!1)},PolylineGeometryUpdater.prototype.createFillGeometryInstance=function(e){var t,i=this._entity,r=i.isAvailable(e),n=new ShowGeometryInstanceAttribute(r&&i.isShowing&&this._showProperty.getValue(e)),a=this._distanceDisplayConditionProperty.getValue(e),o={show:n,distanceDisplayCondition:DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(a)};return this._materialProperty instanceof ColorMaterialProperty&&(defined(this._materialProperty.color)&&(this._materialProperty.color.isConstant||r)&&(t=this._materialProperty.color.getValue(e,scratchColor$i)),defined(t)||(t=Color.WHITE),o.color=ColorGeometryInstanceAttribute.fromColor(t)),this.clampToGround?new GeometryInstance({id:i,geometry:new GroundPolylineGeometry(this._groundGeometryOptions),attributes:o}):(defined(this._depthFailMaterialProperty)&&this._depthFailMaterialProperty instanceof ColorMaterialProperty&&(defined(this._depthFailMaterialProperty.color)&&(this._depthFailMaterialProperty.color.isConstant||r)&&(t=this._depthFailMaterialProperty.color.getValue(e,scratchColor$i)),defined(t)||(t=Color.WHITE),o.depthFailColor=ColorGeometryInstanceAttribute.fromColor(t)),new GeometryInstance({id:i,geometry:new PolylineGeometry(this._geometryOptions),attributes:o}))},PolylineGeometryUpdater.prototype.createOutlineGeometryInstance=function(e){},PolylineGeometryUpdater.prototype.isDestroyed=function(){return!1},PolylineGeometryUpdater.prototype.destroy=function(){this._entitySubscription(),destroyObject(this)},PolylineGeometryUpdater.prototype._onEntityPropertyChanged=function(e,t,i,r){if("availability"===t||"polyline"===t){var n=this._entity.polyline;if(defined(n)){var a=n.positions,o=n.show;if(defined(o)&&o.isConstant&&!o.getValue(Iso8601.MINIMUM_VALUE)||!defined(a))this._fillEnabled&&(this._fillEnabled=!1,this._geometryChanged.raiseEvent(this));else{var s=n.zIndex,l=defaultValue(n.material,defaultMaterial$2),c=l instanceof ColorMaterialProperty;this._materialProperty=l,this._depthFailMaterialProperty=n.depthFailMaterial,this._showProperty=defaultValue(o,defaultShow$1),this._shadowsProperty=defaultValue(n.shadows,defaultShadows$2),this._distanceDisplayConditionProperty=defaultValue(n.distanceDisplayCondition,defaultDistanceDisplayCondition$6),this._classificationTypeProperty=defaultValue(n.classificationType,defaultClassificationType$1),this._fillEnabled=!0,this._zIndex=defaultValue(s,defaultZIndex$1);var u=n.width,d=n.arcType,h=n.clampToGround,p=n.granularity;if(a.isConstant&&Property.isConstant(u)&&Property.isConstant(d)&&Property.isConstant(p)&&Property.isConstant(h)&&Property.isConstant(s)){var m,f=this._geometryOptions,g=a.getValue(Iso8601.MINIMUM_VALUE,f.positions);if(!defined(g)||g.length<2)return void(this._fillEnabled&&(this._fillEnabled=!1,this._geometryChanged.raiseEvent(this)));m=c&&(!defined(this._depthFailMaterialProperty)||this._depthFailMaterialProperty instanceof ColorMaterialProperty)?PolylineColorAppearance.VERTEX_FORMAT:PolylineMaterialAppearance.VERTEX_FORMAT,f.vertexFormat=m,f.positions=g,f.width=defined(u)?u.getValue(Iso8601.MINIMUM_VALUE):void 0,f.arcType=defined(d)?d.getValue(Iso8601.MINIMUM_VALUE):void 0,f.granularity=defined(p)?p.getValue(Iso8601.MINIMUM_VALUE):void 0;var _=this._groundGeometryOptions;_.positions=g,_.width=f.width,_.arcType=f.arcType,_.granularity=f.granularity,this._clampToGround=!!defined(h)&&h.getValue(Iso8601.MINIMUM_VALUE),!this._clampToGround&&defined(s)&&oneTimeWarning("Entity polylines must have clampToGround: true when using zIndex. zIndex will be ignored."),this._dynamic=!1,this._geometryChanged.raiseEvent(this)}else this._dynamic||(this._dynamic=!0,this._geometryChanged.raiseEvent(this))}}else this._fillEnabled&&(this._fillEnabled=!1,this._geometryChanged.raiseEvent(this))}},PolylineGeometryUpdater.prototype.createDynamicUpdater=function(e,t){return new DynamicGeometryUpdater$1(e,t,this)};var generateCartesianArcOptions={positions:void 0,granularity:void 0,height:void 0,ellipsoid:void 0};function DynamicGeometryUpdater$1(e,t,i){this._line=void 0,this._primitives=e,this._groundPrimitives=t,this._groundPolylinePrimitive=void 0,this._material=void 0,this._geometryUpdater=i,this._positions=[]}function getLine(e){if(defined(e._line))return e._line;var t=e._geometryUpdater._scene.id,i=polylineCollections[t],r=e._primitives;!defined(i)||i.isDestroyed()?(i=new PolylineCollection,polylineCollections[t]=i,r.add(i)):r.contains(i)||r.add(i);var n=i.add();return n.id=e._geometryUpdater._entity,e._line=n}DynamicGeometryUpdater$1.prototype.update=function(e){var t=this._geometryUpdater,i=t._entity,r=i.polyline,n=r.positions,a=Property.getValueOrUndefined(n,e,this._positions);t._clampToGround=Property.getValueOrDefault(r._clampToGround,e,!1),t._groundGeometryOptions.positions=a,t._groundGeometryOptions.width=Property.getValueOrDefault(r._width,e,1),t._groundGeometryOptions.arcType=Property.getValueOrDefault(r._arcType,e,ArcType$1.GEODESIC),t._groundGeometryOptions.granularity=Property.getValueOrDefault(r._granularity,e,9999);var o=this._groundPrimitives;if(defined(this._groundPolylinePrimitive)&&(o.remove(this._groundPolylinePrimitive),this._groundPolylinePrimitive=void 0),t.clampToGround){if(!i.isShowing||!i.isAvailable(e)||!Property.getValueOrDefault(r._show,e,!0))return;if(!defined(a)||a.length<2)return;var s,l,c=t.fillMaterialProperty;return c instanceof ColorMaterialProperty?l=new PolylineColorAppearance:(l=new PolylineMaterialAppearance({material:s=MaterialProperty.getValue(e,c,this._material),translucent:s.isTranslucent()}),this._material=s),this._groundPolylinePrimitive=o.add(new GroundPolylinePrimitive({geometryInstances:t.createFillGeometryInstance(e),appearance:l,classificationType:t.classificationTypeProperty.getValue(e),asynchronous:!1}),Property.getValueOrUndefined(t.zIndex,e)),void(defined(this._line)&&(this._line.show=!1))}var u,d,h=getLine(this);!(i.isShowing&&i.isAvailable(e)&&Property.getValueOrDefault(r._show,e,!0))||!defined(a)||a.length<2?h.show=!1:(u=ArcType$1.GEODESIC,u=Property.getValueOrDefault(r._arcType,e,u),d=t._scene.globe,u!==ArcType$1.NONE&&defined(d)&&(generateCartesianArcOptions.ellipsoid=d.ellipsoid,generateCartesianArcOptions.positions=a,generateCartesianArcOptions.granularity=Property.getValueOrUndefined(r._granularity,e),generateCartesianArcOptions.height=PolylinePipeline.extractHeights(a,d.ellipsoid),a=u===ArcType$1.GEODESIC?PolylinePipeline.generateCartesianArc(generateCartesianArcOptions):PolylinePipeline.generateCartesianRhumbArc(generateCartesianArcOptions)),h.show=!0,h.positions=a.slice(),h.material=MaterialProperty.getValue(e,t.fillMaterialProperty,h.material),h.width=Property.getValueOrDefault(r._width,e,1),h.distanceDisplayCondition=Property.getValueOrUndefined(r._distanceDisplayCondition,e,h.distanceDisplayCondition))},DynamicGeometryUpdater$1.prototype.getBoundingSphere=function(e){if(this._geometryUpdater.clampToGround){var t=this._groundPolylinePrimitive;if(defined(t)&&t.show&&t.ready){var i=t.getGeometryInstanceAttributes(this._geometryUpdater._entity);if(defined(i)&&defined(i.boundingSphere))return BoundingSphere.clone(i.boundingSphere,e),BoundingSphereState$1.DONE}return defined(t)&&!t.ready?BoundingSphereState$1.PENDING:BoundingSphereState$1.DONE}var r=getLine(this);return r.show&&0<r.positions.length?(BoundingSphere.fromPoints(r.positions,e),BoundingSphereState$1.DONE):BoundingSphereState$1.FAILED},DynamicGeometryUpdater$1.prototype.isDestroyed=function(){return!1},DynamicGeometryUpdater$1.prototype.destroy=function(){var e=this._geometryUpdater._scene.id,t=polylineCollections[e];defined(t)&&(t.remove(this._line),0===t.length&&(this._primitives.removeAndDestroy(t),delete polylineCollections[e])),defined(this._groundPolylinePrimitive)&&this._groundPrimitives.remove(this._groundPolylinePrimitive),destroyObject(this)};var scratchColor$j=new Color,distanceDisplayConditionScratch$8=new DistanceDisplayCondition,defaultDistanceDisplayCondition$7=new DistanceDisplayCondition;function Batch$5(e,t,i,r,n){var a=i instanceof ColorMaterialProperty?PolylineColorAppearance:PolylineMaterialAppearance;this.orderedGroundPrimitives=e,this.classificationType=t,this.appearanceType=a,this.materialProperty=i,this.updaters=new AssociativeArray,this.createPrimitive=!0,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new AssociativeArray,this.material=void 0,this.updatersWithAttributes=new AssociativeArray,this.attributes=new AssociativeArray,this.invalidated=!1,this.removeMaterialSubscription=i.definitionChanged.addEventListener(Batch$5.prototype.onMaterialChanged,this),this.subscriptions=new AssociativeArray,this.showsUpdated=new AssociativeArray,this.zIndex=r,this._asynchronous=n}function StaticGroundPolylinePerMaterialBatch(e,t,i){this._items=[],this._orderedGroundPrimitives=e,this._classificationType=t,this._asynchronous=defaultValue(i,!0)}Batch$5.prototype.onMaterialChanged=function(){this.invalidated=!0},Batch$5.prototype.isMaterial=function(e){var t=this.materialProperty,i=e.fillMaterialProperty;return i===t||i instanceof ColorMaterialProperty&&t instanceof ColorMaterialProperty||defined(t)&&t.equals(i)},Batch$5.prototype.add=function(e,n,t){var a,i=n.id;this.updaters.set(i,n),this.geometry.set(i,t),n.hasConstantFill&&n.fillMaterialProperty.isConstant&&Property.isConstant(n.distanceDisplayConditionProperty)?(a=this).subscriptions.set(i,n.entity.definitionChanged.addEventListener(function(e,t,i,r){"isShowing"===t&&a.showsUpdated.set(n.id,n)})):this.updatersWithAttributes.set(i,n),this.createPrimitive=!0},Batch$5.prototype.remove=function(e){var t=e.id;if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.updatersWithAttributes.remove(t);var i=this.subscriptions.get(t);return defined(i)&&(i(),this.subscriptions.remove(t)),!0}return!1},Batch$5.prototype.update=function(e){var t,i=!0,r=this.primitive,n=this.orderedGroundPrimitives,a=this.geometry.values;if(this.createPrimitive)0<a.length?(defined(r)&&(defined(this.oldPrimitive)?n.remove(r):this.oldPrimitive=r),r=new GroundPolylinePrimitive({show:!1,asynchronous:this._asynchronous,geometryInstances:a.slice(),appearance:new this.appearanceType,classificationType:this.classificationType}),this.appearanceType===PolylineMaterialAppearance&&(this.material=MaterialProperty.getValue(e,this.materialProperty,this.material),r.appearance.material=this.material),n.add(r,this.zIndex),i=!1):(defined(r)&&(n.remove(r),r=void 0),defined(t=this.oldPrimitive)&&(n.remove(t),this.oldPrimitive=void 0)),this.attributes.removeAll(),this.primitive=r,this.createPrimitive=!1;else if(defined(r)&&r.ready){r.show=!0,defined(this.oldPrimitive)&&(n.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.appearanceType===PolylineMaterialAppearance&&(this.material=MaterialProperty.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material);for(var o=this.updatersWithAttributes.values,s=o.length,l=0;l<s;l++){var c,u,d=o[l],h=d.entity,p=this.geometry.get(d.id),m=this.attributes.get(p.id.id);defined(m)||(m=r.getGeometryInstanceAttributes(p.id),this.attributes.set(p.id.id,m)),d.fillMaterialProperty.isConstant||(c=d.fillMaterialProperty.color,u=Property.getValueOrDefault(c,e,Color.WHITE,scratchColor$j),Color.equals(m._lastColor,u)||(m._lastColor=Color.clone(u,m._lastColor),m.color=ColorGeometryInstanceAttribute.toValue(u,m.color)));var f=h.isShowing&&(d.hasConstantFill||d.isFilled(e));f!==(1===m.show[0])&&(m.show=ShowGeometryInstanceAttribute.toValue(f,m.show));var g,_=d.distanceDisplayConditionProperty;Property.isConstant(_)||(g=Property.getValueOrDefault(_,e,defaultDistanceDisplayCondition$7,distanceDisplayConditionScratch$8),DistanceDisplayCondition.equals(g,m._lastDistanceDisplayCondition)||(m._lastDistanceDisplayCondition=DistanceDisplayCondition.clone(g,m._lastDistanceDisplayCondition),m.distanceDisplayCondition=DistanceDisplayConditionGeometryInstanceAttribute.toValue(g,m.distanceDisplayCondition)))}this.updateShows(r)}else defined(r)&&!r.ready&&(i=!1);return i},Batch$5.prototype.updateShows=function(e){for(var t=this.showsUpdated.values,i=t.length,r=0;r<i;r++){var n=t[r],a=n.entity,o=this.geometry.get(n.id),s=this.attributes.get(o.id.id);defined(s)||(s=e.getGeometryInstanceAttributes(o.id),this.attributes.set(o.id.id,s));var l=a.isShowing;l!==(1===s.show[0])&&(s.show=ShowGeometryInstanceAttribute.toValue(l,s.show),o.attributes.show.value[0]=s.show[0])}this.showsUpdated.removeAll()},Batch$5.prototype.contains=function(e){return this.updaters.contains(e.id)},Batch$5.prototype.getBoundingSphere=function(e,t){var i=this.primitive;if(!i.ready)return BoundingSphereState$1.PENDING;var r=i.getGeometryInstanceAttributes(e.entity);return!defined(r)||!defined(r.boundingSphere)||defined(r.show)&&0===r.show[0]?BoundingSphereState$1.FAILED:(r.boundingSphere.clone(t),BoundingSphereState$1.DONE)},Batch$5.prototype.destroy=function(){var e=this.primitive,t=this.orderedGroundPrimitives;defined(e)&&t.remove(e);var i=this.oldPrimitive;defined(i)&&t.remove(i),this.removeMaterialSubscription()},StaticGroundPolylinePerMaterialBatch.prototype.add=function(e,t){for(var i=this._items,r=i.length,n=t.createFillGeometryInstance(e),a=Property.getValueOrDefault(t.zIndex,0),o=0;o<r;++o){var s=i[o];if(s.isMaterial(t)&&s.zIndex===a)return void s.add(e,t,n)}var l=new Batch$5(this._orderedGroundPrimitives,this._classificationType,t.fillMaterialProperty,a,this._asynchronous);l.add(e,t,n),i.push(l)},StaticGroundPolylinePerMaterialBatch.prototype.remove=function(e){for(var t=this._items,i=t.length-1;0<=i;i--){var r=t[i];if(r.remove(e)){0===r.updaters.length&&(t.splice(i,1),r.destroy());break}}},StaticGroundPolylinePerMaterialBatch.prototype.update=function(e){for(var t=this._items,i=t.length-1;0<=i;i--){var r=t[i];if(r.invalidated){t.splice(i,1);for(var n=r.updaters.values,a=n.length,o=0;o<a;o++)this.add(e,n[o]);r.destroy()}}var s=!0;for(i=0;i<t.length;i++)s=t[i].update(e)&&s;return s},StaticGroundPolylinePerMaterialBatch.prototype.getBoundingSphere=function(e,t){for(var i=this._items,r=i.length,n=0;n<r;n++){var a=i[n];if(a.contains(e))return a.getBoundingSphere(e,t)}return BoundingSphereState$1.FAILED},StaticGroundPolylinePerMaterialBatch.prototype.removeAllPrimitives=function(){for(var e=this._items,t=e.length,i=0;i<t;i++)e[i].destroy();this._items.length=0};var emptyArray$1=[];function removeUpdater(e,t){for(var i=e._batches,r=i.length,n=0;n<r;n++)i[n].remove(t)}function insertUpdaterIntoBatch(e,t,i){var r,n,a,o;i.isDynamic?e._dynamicBatch.add(t,i):i.clampToGround&&i.fillEnabled?(r=i.classificationTypeProperty.getValue(t),e._groundBatches[r].add(t,i)):(i.fillEnabled&&(n=i.shadowsProperty.getValue(t)),a=0,defined(i.depthFailMaterialProperty)&&(a=i.depthFailMaterialProperty instanceof ColorMaterialProperty?1:2),defined(n)&&(o=n+a*ShadowMode$1.NUMBER_OF_SHADOW_MODES),i.fillEnabled&&(i.fillMaterialProperty instanceof ColorMaterialProperty?e._colorBatches[o].add(t,i):e._materialBatches[o].add(t,i)))}function PolylineVisualizer(e,t,i,r){var n;r=defaultValue(r,e.groundPrimitives),i=defaultValue(i,e.primitives),this._scene=e,this._primitives=i,this._entityCollection=void 0,this._addedObjects=new AssociativeArray,this._removedObjects=new AssociativeArray,this._changedObjects=new AssociativeArray;var a=ShadowMode$1.NUMBER_OF_SHADOW_MODES;for(this._colorBatches=new Array(3*a),this._materialBatches=new Array(3*a),n=0;n<a;++n)this._colorBatches[n]=new StaticGeometryColorBatch(i,PolylineColorAppearance,void 0,!1,n),this._materialBatches[n]=new StaticGeometryPerMaterialBatch(i,PolylineMaterialAppearance,void 0,!1,n),this._colorBatches[n+a]=new StaticGeometryColorBatch(i,PolylineColorAppearance,PolylineColorAppearance,!1,n),this._materialBatches[n+a]=new StaticGeometryPerMaterialBatch(i,PolylineMaterialAppearance,PolylineColorAppearance,!1,n),this._colorBatches[n+2*a]=new StaticGeometryColorBatch(i,PolylineColorAppearance,PolylineMaterialAppearance,!1,n),this._materialBatches[n+2*a]=new StaticGeometryPerMaterialBatch(i,PolylineMaterialAppearance,PolylineMaterialAppearance,!1,n);this._dynamicBatch=new DynamicGeometryBatch(i,r);var o=ClassificationType$1.NUMBER_OF_CLASSIFICATION_TYPES;for(this._groundBatches=new Array(o),n=0;n<o;++n)this._groundBatches[n]=new StaticGroundPolylinePerMaterialBatch(r,n);this._batches=this._colorBatches.concat(this._materialBatches,this._dynamicBatch,this._groundBatches),this._subscriptions=new AssociativeArray,this._updaters=new AssociativeArray,(this._entityCollection=t).collectionChanged.addEventListener(PolylineVisualizer.prototype._onCollectionChanged,this),this._onCollectionChanged(t,t.values,emptyArray$1)}PolylineVisualizer.prototype.update=function(e){for(var t,i,r,n=this._addedObjects,a=n.values,o=this._removedObjects,s=o.values,l=this._changedObjects,c=l.values,u=c.length-1;-1<u;u--)i=(t=c[u]).id,(r=this._updaters.get(i)).entity===t?(removeUpdater(this,r),insertUpdaterIntoBatch(this,e,r)):(s.push(t),a.push(t));for(u=s.length-1;-1<u;u--)i=(t=s[u]).id,r=this._updaters.get(i),removeUpdater(this,r),r.destroy(),this._updaters.remove(i),this._subscriptions.get(i)(),this._subscriptions.remove(i);for(u=a.length-1;-1<u;u--)i=(t=a[u]).id,r=new PolylineGeometryUpdater(t,this._scene),this._updaters.set(i,r),insertUpdaterIntoBatch(this,e,r),this._subscriptions.set(i,r.geometryChanged.addEventListener(PolylineVisualizer._onGeometryChanged,this));n.removeAll(),o.removeAll(),l.removeAll();var d=!0,h=this._batches,p=h.length;for(u=0;u<p;u++)d=h[u].update(e)&&d;return d};var getBoundingSphereArrayScratch$1=[],getBoundingSphereBoundingSphereScratch$1=new BoundingSphere;function DataSourceDisplay(e){GroundPrimitive.initializeTerrainHeights(),GroundPolylinePrimitive.initializeTerrainHeights();var t=e.scene,i=e.dataSourceCollection;this._eventHelper=new EventHelper,this._eventHelper.add(i.dataSourceAdded,this._onDataSourceAdded,this),this._eventHelper.add(i.dataSourceRemoved,this._onDataSourceRemoved,this),this._eventHelper.add(i.dataSourceMoved,this._onDataSourceMoved,this),this._eventHelper.add(t.postRender,this._postRender,this),this._dataSourceCollection=i,this._scene=t,this._visualizersCallback=defaultValue(e.visualizersCallback,DataSourceDisplay.defaultVisualizersCallback);var r=!1,n=new PrimitiveCollection,a=new PrimitiveCollection;0<i.length&&(t.primitives.add(n),t.groundPrimitives.add(a),r=!0),this._primitives=n,this._groundPrimitives=a;for(var o=0,s=i.length;o<s;o++)this._onDataSourceAdded(i,i.get(o));var l,c,u,d,h=new CustomDataSource;this._onDataSourceAdded(void 0,h),this._defaultDataSource=h,r||(l=this,c=function(){t.primitives.add(n),t.groundPrimitives.add(a),u(),d(),l._removeDefaultDataSourceListener=void 0,l._removeDataSourceCollectionListener=void 0},u=h.entities.collectionChanged.addEventListener(c),d=i.dataSourceAdded.addEventListener(c)),this._removeDefaultDataSourceListener=u,this._removeDataSourceCollectionListener=d,this._ready=!1}PolylineVisualizer.prototype.getBoundingSphere=function(e,t){for(var i=getBoundingSphereArrayScratch$1,r=getBoundingSphereBoundingSphereScratch$1,n=0,a=BoundingSphereState$1.DONE,o=this._batches,s=o.length,l=this._updaters.get(e.id),c=0;c<s;c++){if((a=o[c].getBoundingSphere(l,r))===BoundingSphereState$1.PENDING)return BoundingSphereState$1.PENDING;a===BoundingSphereState$1.DONE&&(i[n]=BoundingSphere.clone(r,i[n]),n++)}return 0===n?BoundingSphereState$1.FAILED:(i.length=n,BoundingSphere.fromBoundingSpheres(i,t),BoundingSphereState$1.DONE)},PolylineVisualizer.prototype.isDestroyed=function(){return!1},PolylineVisualizer.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(PolylineVisualizer.prototype._onCollectionChanged,this),this._addedObjects.removeAll(),this._removedObjects.removeAll();for(var e=this._batches,t=e.length,i=0;i<t;i++)e[i].removeAllPrimitives();var r=this._subscriptions.values,t=r.length;for(i=0;i<t;i++)r[i]();return this._subscriptions.removeAll(),destroyObject(this)},PolylineVisualizer._onGeometryChanged=function(e){var t=this._removedObjects,i=this._changedObjects,r=e.entity,n=r.id;defined(t.get(n))||defined(i.get(n))||i.set(n,r)},PolylineVisualizer.prototype._onCollectionChanged=function(e,t,i){for(var r,n,a=this._addedObjects,o=this._removedObjects,s=this._changedObjects,l=i.length-1;-1<l;l--)r=(n=i[l]).id,a.remove(r)||(o.set(r,n),s.remove(r));for(l=t.length-1;-1<l;l--)r=(n=t[l]).id,o.remove(r)?s.set(r,n):a.set(r,n)},DataSourceDisplay.defaultVisualizersCallback=function(e,t,i){var r=i.entities;return[new BillboardVisualizer(t,r),new GeometryVisualizer(e,r,i._primitives,i._groundPrimitives),new LabelVisualizer(t,r),new ModelVisualizer(e,r),new Cesium3DTilesetVisualizer(e,r),new PointVisualizer(t,r),new PathVisualizer(e,r),new PolylineVisualizer(e,r,i._primitives,i._groundPrimitives)]},Object.defineProperties(DataSourceDisplay.prototype,{scene:{get:function(){return this._scene}},dataSources:{get:function(){return this._dataSourceCollection}},defaultDataSource:{get:function(){return this._defaultDataSource}},ready:{get:function(){return this._ready}}}),DataSourceDisplay.prototype.isDestroyed=function(){return!1},DataSourceDisplay.prototype.destroy=function(){this._eventHelper.removeAll();for(var e=this._dataSourceCollection,t=0,i=e.length;t<i;++t)this._onDataSourceRemoved(this._dataSourceCollection,e.get(t));return this._onDataSourceRemoved(void 0,this._defaultDataSource),defined(this._removeDefaultDataSourceListener)?(this._removeDefaultDataSourceListener(),this._removeDataSourceCollectionListener()):(this._scene.primitives.remove(this._primitives),this._scene.groundPrimitives.remove(this._groundPrimitives)),destroyObject(this)},DataSourceDisplay.prototype.update=function(e){if(!ApproximateTerrainHeights.initialized)return this._ready=!1;for(var t,i,r,n=!0,a=this._dataSourceCollection,o=a.length,s=0;s<o;s++){var l=a.get(s);for(defined(l.update)&&(n=l.update(e)&&n),r=(i=l._visualizers).length,t=0;t<r;t++)n=i[t].update(e)&&n}for(r=(i=this._defaultDataSource._visualizers).length,t=0;t<r;t++)n=i[t].update(e)&&n;return this._ready=n},DataSourceDisplay.prototype._postRender=function(){for(var e=this._scene.frameState,t=this._dataSourceCollection,i=t.length,r=0;r<i;r++){var n=t.get(r),a=n.credit;defined(a)&&e.creditDisplay.addCredit(a);var o=n._resourceCredits;if(defined(o))for(var s=o.length,l=0;l<s;l++)e.creditDisplay.addCredit(o[l])}};var getBoundingSphereArrayScratch$2=[],getBoundingSphereBoundingSphereScratch$2=new BoundingSphere;DataSourceDisplay.prototype.getBoundingSphere=function(e,t,i){if(!this._ready)return BoundingSphereState$1.PENDING;var r=this._defaultDataSource;if(!r.entities.contains(e)){r=void 0;for(var n=this._dataSourceCollection,a=n.length,o=0;o<a;o++){var s=n.get(o);if(s.entities.contains(e)){r=s;break}}}if(!defined(r))return BoundingSphereState$1.FAILED;var l=getBoundingSphereArrayScratch$2,c=getBoundingSphereBoundingSphereScratch$2,u=0,d=BoundingSphereState$1.DONE,h=r._visualizers,p=h.length;for(o=0;o<p;o++){if(defined(h[o].getBoundingSphere)){if(d=h[o].getBoundingSphere(e,c),!t&&d===BoundingSphereState$1.PENDING)return BoundingSphereState$1.PENDING;d===BoundingSphereState$1.DONE&&(l[u]=BoundingSphere.clone(c,l[u]),u++)}}return 0===u?BoundingSphereState$1.FAILED:(l.length=u,BoundingSphere.fromBoundingSpheres(l,i),BoundingSphereState$1.DONE)},DataSourceDisplay.prototype._onDataSourceAdded=function(e,t){var i=this._scene,r=this._primitives,n=this._groundPrimitives,a=r.add(new PrimitiveCollection),o=n.add(new OrderedGroundPrimitiveCollection);t._primitives=a,t._groundPrimitives=o;var s=t.clustering;s._initialize(i),a.add(s),t._visualizers=this._visualizersCallback(i,s,t)},DataSourceDisplay.prototype._onDataSourceRemoved=function(e,t){var i=this._primitives,r=this._groundPrimitives,n=t._primitives,a=t._groundPrimitives,o=t.clustering;n.remove(o);for(var s=t._visualizers,l=s.length,c=0;c<l;c++)s[c].destroy();i.remove(n),r.remove(a),t._visualizers=void 0},DataSourceDisplay.prototype._onDataSourceMoved=function(e,t,i){var r=this._primitives,n=this._groundPrimitives,a=e._primitives,o=e._groundPrimitives;t===i+1?(r.raise(a),n.raise(o)):t===i-1?(r.lower(a),n.lower(o)):0===t?(r.lowerToBottom(a),n.lowerToBottom(o),r.raise(a),n.raise(o)):(r.raiseToTop(a),n.raiseToTop(o))};var updateTransformMatrix3Scratch1=new Matrix3,updateTransformMatrix3Scratch2=new Matrix3,updateTransformMatrix3Scratch3=new Matrix3,updateTransformMatrix4Scratch=new Matrix4,updateTransformCartesian3Scratch1=new Cartesian3,updateTransformCartesian3Scratch2=new Cartesian3,updateTransformCartesian3Scratch3=new Cartesian3,updateTransformCartesian3Scratch4=new Cartesian3,updateTransformCartesian3Scratch5=new Cartesian3,updateTransformCartesian3Scratch6=new Cartesian3,deltaTime=new JulianDate,northUpAxisFactor=1.25;function updateTransform(e,t,i,r,n,a,o){var s,l,c,u,d,h,p,m,f,g,_,y,v,C,S,T,x,b,E,P=e.scene.mode,A=n.getValue(a,e._lastCartesian);defined(A)&&(l=s=!1,P===SceneMode$1.SCENE3D&&(JulianDate.addSeconds(a,.001,deltaTime),defined(h=n.getValue(deltaTime,updateTransformCartesian3Scratch1))||(JulianDate.addSeconds(a,-.001,deltaTime),h=n.getValue(deltaTime,updateTransformCartesian3Scratch1),l=!0),defined(h)&&(p=Transforms.computeFixedToIcrfMatrix(a,updateTransformMatrix3Scratch1),m=Transforms.computeFixedToIcrfMatrix(deltaTime,updateTransformMatrix3Scratch2),defined(p)&&defined(m)?f=Matrix3.transpose(p,updateTransformMatrix3Scratch3):(f=Transforms.computeTemeToPseudoFixedMatrix(a,updateTransformMatrix3Scratch3),p=Matrix3.transpose(f,updateTransformMatrix3Scratch1),m=Transforms.computeTemeToPseudoFixedMatrix(deltaTime,updateTransformMatrix3Scratch2),Matrix3.transpose(m,m)),g=Matrix3.multiplyByVector(p,A,updateTransformCartesian3Scratch5),_=Matrix3.multiplyByVector(m,h,updateTransformCartesian3Scratch6),Cartesian3.subtract(g,_,updateTransformCartesian3Scratch4),y=1e3*Cartesian3.magnitude(updateTransformCartesian3Scratch4),(C=-(v=CesiumMath.GRAVITATIONALPARAMETER)/(y*y-2*v/Cartesian3.magnitude(g)))<0||C>northUpAxisFactor*o.maximumRadius?(c=updateTransformCartesian3Scratch2,Cartesian3.normalize(A,c),Cartesian3.negate(c,c),d=Cartesian3.clone(Cartesian3.UNIT_Z,updateTransformCartesian3Scratch3),u=Cartesian3.cross(d,c,updateTransformCartesian3Scratch1),Cartesian3.magnitude(u)>CesiumMath.EPSILON7&&(Cartesian3.normalize(c,c),Cartesian3.normalize(u,u),d=Cartesian3.cross(c,u,updateTransformCartesian3Scratch3),Cartesian3.normalize(d,d),s=!0)):Cartesian3.equalsEpsilon(A,h,CesiumMath.EPSILON7)||(d=updateTransformCartesian3Scratch2,Cartesian3.normalize(g,d),Cartesian3.normalize(_,_),u=Cartesian3.cross(d,_,updateTransformCartesian3Scratch3),l&&(u=Cartesian3.multiplyByScalar(u,-1,u)),Cartesian3.equalsEpsilon(u,Cartesian3.ZERO,CesiumMath.EPSILON7)||(c=Cartesian3.cross(u,d,updateTransformCartesian3Scratch1),Matrix3.multiplyByVector(f,c,c),Matrix3.multiplyByVector(f,u,u),Matrix3.multiplyByVector(f,d,d),Cartesian3.normalize(c,c),Cartesian3.normalize(u,u),Cartesian3.normalize(d,d),s=!0)))),defined(e.boundingSphere)&&(A=e.boundingSphere.center),r&&(S=Cartesian3.clone(t.position,updateTransformCartesian3Scratch4),T=Cartesian3.clone(t.direction,updateTransformCartesian3Scratch5),x=Cartesian3.clone(t.up,updateTransformCartesian3Scratch6)),b=updateTransformMatrix4Scratch,s?(b[0]=c.x,b[1]=c.y,b[2]=c.z,b[3]=0,b[4]=u.x,b[5]=u.y,b[6]=u.z,b[7]=0,b[8]=d.x,b[9]=d.y,b[10]=d.z,b[11]=0,b[12]=A.x,b[13]=A.y,b[14]=A.z,b[15]=0):Transforms.eastNorthUpToFixedFrame(A,o,b),t._setTransform(b),r&&(Cartesian3.clone(S,t.position),Cartesian3.clone(T,t.direction),Cartesian3.clone(x,t.up),Cartesian3.cross(T,x,t.right))),i&&(E=P===SceneMode$1.SCENE2D||Cartesian3.equals(e._offset3D,Cartesian3.ZERO)?void 0:e._offset3D,t.lookAtTransform(t.transform,E))}function EntityView(e,t,i){this.entity=e,this.scene=t,this.ellipsoid=defaultValue(i,Ellipsoid.WGS84),this.boundingSphere=void 0,this._lastEntity=void 0,this._mode=void 0,this._lastCartesian=new Cartesian3,this._defaultOffset3D=void 0,this._offset3D=new Cartesian3}Object.defineProperties(EntityView,{defaultOffset3D:{get:function(){return this._defaultOffset3D},set:function(e){this._defaultOffset3D=Cartesian3.clone(e,new Cartesian3)}}}),EntityView.defaultOffset3D=new Cartesian3(-14e3,3500,3500);var scratchHeadingPitchRange=new HeadingPitchRange,scratchCartesian$7=new Cartesian3;EntityView.prototype.update=function(e,t){var i,r,n,a,o,s,l,c,u,d,h,p=this.scene,m=this.ellipsoid,f=p.mode;f===SceneMode$1.MORPHING||defined(r=(i=this.entity).position)&&(n=i!==this._lastEntity,a=f!==this._mode,o=p.camera,s=n||a,l=!0,n?!(u=defined(c=i.viewFrom))&&defined(t)?(scratchHeadingPitchRange.pitch=-CesiumMath.PI_OVER_FOUR,scratchHeadingPitchRange.range=0,defined(d=r.getValue(e,scratchCartesian$7))&&(h=2-1/Math.max(1,Cartesian3.magnitude(d)/m.maximumRadius),scratchHeadingPitchRange.pitch*=h),o.viewBoundingSphere(t,scratchHeadingPitchRange),this.boundingSphere=t,l=s=!1):u&&defined(c.getValue(e,this._offset3D))||Cartesian3.clone(EntityView._defaultOffset3D,this._offset3D):a||this._mode===SceneMode$1.SCENE2D||Cartesian3.clone(o.position,this._offset3D),this._lastEntity=i,this._mode=f,updateTransform(this,o,s,l,r,e,m))};var tmp$3={},xHg,yHg;xHg=tmp$3,yHg=function(e){function t(e){return e}function m(e){var t,n=h(e.transform),a=1/0,o=a,s=-a,l=-a;function i(e){(e=n(e))[0]<a&&(a=e[0]),e[0]>s&&(s=e[0]),e[1]<o&&(o=e[1]),e[1]>l&&(l=e[1])}function r(e){switch(e.type){case"GeometryCollection":e.geometries.forEach(r);break;case"Point":i(e.coordinates);break;case"MultiPoint":e.coordinates.forEach(i)}}for(t in e.arcs.forEach(function(e){for(var t,i=-1,r=e.length;++i<r;)(t=n(e[i],i))[0]<a&&(a=t[0]),t[0]>s&&(s=t[0]),t[1]<o&&(o=t[1]),t[1]>l&&(l=t[1])}),e.objects)r(e.objects[t]);return[a,o,s,l]}function a(t,e){return"GeometryCollection"===e.type?{type:"FeatureCollection",features:e.geometries.map(function(e){return i(t,e)})}:i(t,e)}var h=function(e){if(null==e)return t;var a,o,s=e.scale[0],l=e.scale[1],c=e.translate[0],u=e.translate[1];return function(e,t){t||(a=o=0);var i=2,r=e.length,n=new Array(r);for(n[0]=(a+=e[0])*s+c,n[1]=(o+=e[1])*l+u;i<r;)n[i]=e[i],++i;return n}},c=function(e,t){for(var i,r=e.length,n=r-t;n<--r;)i=e[n],e[n++]=e[r],e[r]=i};function i(e,t){var i=t.id,r=t.bbox,n=null==t.properties?{}:t.properties,a=o(e,t);return null==i&&null==r?{type:"Feature",properties:n,geometry:a}:null==r?{type:"Feature",id:i,properties:n,geometry:a}:{type:"Feature",id:i,bbox:r,properties:n,geometry:a}}function o(e,t){var a=h(e.transform),o=e.arcs;function n(e){return a(e)}function s(e){for(var t=[],i=0,r=e.length;i<r;++i)!function(e,t){t.length&&t.pop();for(var i=o[e<0?~e:e],r=0,n=i.length;r<n;++r)t.push(a(i[r],r));e<0&&c(t,n)}(e[i],t);return t.length<2&&t.push(t[0]),t}function i(e){for(var t=s(e);t.length<4;)t.push(t[0]);return t}function l(e){return e.map(i)}return function e(t){var i,r=t.type;switch(r){case"GeometryCollection":return{type:r,geometries:t.geometries.map(e)};case"Point":i=n(t.coordinates);break;case"MultiPoint":i=t.coordinates.map(n);break;case"LineString":i=s(t.arcs);break;case"MultiLineString":i=t.arcs.map(s);break;case"Polygon":i=l(t.arcs);break;case"MultiPolygon":i=t.arcs.map(l);break;default:return null}return{type:r,coordinates:i}}(t)}function p(l,n){var a={},c={},u={},o=[],s=-1;function e(e,t){for(var i in e){var r=e[i];delete t[r.start],delete r.start,delete r.end,r.forEach(function(e){a[e<0?~e:e]=1}),o.push(r)}}return n.forEach(function(e,t){var i,r=l.arcs[e<0?~e:e];r.length<3&&!r[1][0]&&!r[1][1]&&(i=n[++s],n[s]=e,n[t]=i)}),n.forEach(function(e){var t,i,r,n,a=function(e){var t,i=l.arcs[e<0?~e:e],r=i[0];l.transform?(t=[0,0],i.forEach(function(e){t[0]+=e[0],t[1]+=e[1]})):t=i[i.length-1];return e<0?[t,r]:[r,t]}(e),o=a[0],s=a[1];(t=u[o])?(delete u[t.end],t.push(e),t.end=s,(i=c[s])?(delete c[i.start],r=i===t?t:t.concat(i),c[r.start=t.start]=u[r.end=i.end]=r):c[t.start]=u[t.end]=t):(t=c[s])?(delete c[t.start],t.unshift(e),t.start=o,(i=u[o])?(delete u[i.end],n=i===t?t:i.concat(t),c[n.start=i.start]=u[n.end=t.end]=n):c[t.start]=u[t.end]=t):c[(t=[e]).start=o]=u[t.end=s]=t}),e(u,c),e(c,u),n.forEach(function(e){a[e<0?~e:e]||o.push([e])}),o}function r(e,t,i){var r,n,a,o,s,l,c;if(1<arguments.length)o=i,l=[],c=[],function e(t){switch((s=t).type){case"GeometryCollection":t.geometries.forEach(e);break;case"LineString":d(t.arcs);break;case"MultiLineString":case"Polygon":h(t.arcs);break;case"MultiPolygon":t.arcs.forEach(h)}}(t),c.forEach(null==o?function(e){l.push(e[0].i)}:function(e){o(e[0].g,e[e.length-1].g)&&l.push(e[0].i)}),r=l;else for(n=0,r=new Array(a=e.arcs.length);n<a;++n)r[n]=n;function u(e){var t=e<0?~e:e;(c[t]||(c[t]=[])).push({i:e,g:s})}function d(e){e.forEach(u)}function h(e){e.forEach(d)}return{type:"MultiLineString",arcs:p(e,r)}}function n(s,e){var l={},i=[],r=[];function n(t){t.forEach(function(e){e.forEach(function(e){(l[e=e<0?~e:e]||(l[e]=[])).push(t)})}),i.push(t)}function c(e){return function(e){for(var t,i=-1,r=e.length,n=e[r-1],a=0;++i<r;)t=n,n=e[i],a+=t[0]*n[1]-t[1]*n[0];return Math.abs(a)}(o(s,{type:"Polygon",arcs:[e]}).coordinates[0])}return e.forEach(function e(t){switch(t.type){case"GeometryCollection":t.geometries.forEach(e);break;case"Polygon":n(t.arcs);break;case"MultiPolygon":t.arcs.forEach(n)}}),i.forEach(function(e){if(!e._){var t=[],i=[e];for(e._=1,r.push(t);e=i.pop();)t.push(e),e.forEach(function(e){e.forEach(function(e){l[e<0?~e:e].forEach(function(e){e._||(e._=1,i.push(e))})})})}}),i.forEach(function(e){delete e._}),{type:"MultiPolygon",arcs:r.map(function(e){var t,i=[];if(e.forEach(function(e){e.forEach(function(e){e.forEach(function(e){l[e<0?~e:e].length<2&&i.push(e)})})}),1<(t=(i=p(s,i)).length))for(var r,n,a=1,o=c(i[0]);a<t;++a)(r=c(i[a]))>o&&(n=i[0],i[0]=i[a],i[a]=n,o=r);return i})}}function f(e,t){for(var i=0,r=e.length;i<r;){var n=i+r>>>1;e[n]<t?i=1+n:r=n}return i}function g(e){if(null==e)return t;var s,l,c=e.scale[0],u=e.scale[1],d=e.translate[0],h=e.translate[1];return function(e,t){t||(s=l=0);var i=2,r=e.length,n=new Array(r),a=Math.round((e[0]-d)/c),o=Math.round((e[1]-h)/u);for(n[0]=a-s,s=a,n[1]=o-l,l=o;i<r;)n[i]=e[i],++i;return n}}function E(n,a,o,e,s){3===arguments.length&&(e=Array,s=null);for(var l=new e(n=1<<Math.max(4,Math.ceil(Math.log(n)/Math.LN2))),c=n-1,t=0;t<n;++t)l[t]=s;return{add:function(e){for(var t=a(e)&c,i=l[t],r=0;i!=s;){if(o(i,e))return!0;if(++r>=n)throw new Error("full hashset");i=l[t=t+1&c]}return l[t]=e,!0},has:function(e){for(var t=a(e)&c,i=l[t],r=0;i!=s;){if(o(i,e))return!0;if(++r>=n)break;i=l[t=t+1&c]}return!1},values:function(){for(var e=[],t=0,i=l.length;t<i;++t){var r=l[t];r!=s&&e.push(r)}return e}}}function P(a,o,s,e,l,t){3===arguments.length&&(e=t=Array,l=null);for(var c=new e(a=1<<Math.max(4,Math.ceil(Math.log(a)/Math.LN2))),u=new t(a),d=a-1,i=0;i<a;++i)c[i]=l;return{set:function(e,t){for(var i=o(e)&d,r=c[i],n=0;r!=l;){if(s(r,e))return u[i]=t;if(++n>=a)throw new Error("full hashmap");r=c[i=i+1&d]}return c[i]=e,u[i]=t},maybeSet:function(e,t){for(var i=o(e)&d,r=c[i],n=0;r!=l;){if(s(r,e))return u[i];if(++n>=a)throw new Error("full hashmap");r=c[i=i+1&d]}return c[i]=e,u[i]=t},get:function(e,t){for(var i=o(e)&d,r=c[i],n=0;r!=l;){if(s(r,e))return u[i];if(++n>=a)break;r=c[i=i+1&d]}return t},keys:function(){for(var e=[],t=0,i=c.length;t<i;++t){var r=c[t];r!=l&&e.push(r)}return e}}}function A(e,t){return e[0]===t[0]&&e[1]===t[1]}function w(e){var t=l[0]^l[1];return 2147483647&(t=t<<5^t>>7^l[2]^l[3])}function C(e){for(var n=e.coordinates,t=e.lines,i=e.rings,r=function(){for(var e=P(1.4*n.length,S,T,Int32Array,-1,Int32Array),t=new Int32Array(n.length),i=0,r=n.length;i<r;++i)t[i]=e.maybeSet(i,i);return t}(),o=new Int32Array(n.length),s=new Int32Array(n.length),l=new Int32Array(n.length),c=new Int8Array(n.length),u=0,a=0,d=n.length;a<d;++a)o[a]=s[a]=l[a]=-1;for(a=0,d=t.length;a<d;++a){var h=t[a],p=h[0],m=h[1],f=r[p],g=r[++p];for(++u,c[f]=1;++p<=m;)C(a,f,f=g,g=r[p]);++u,c[g]=1}for(a=0,d=n.length;a<d;++a)o[a]=-1;for(a=0,d=i.length;a<d;++a){var _=i[a],y=_[0]+1,v=_[1];for(C(a,r[v-1],f=r[y-1],g=r[y]);++y<=v;)C(a,f,f=g,g=r[y])}function C(e,t,i,r){var n,a;o[i]!==e&&(o[i]=e,0<=(n=s[i])?(a=l[i],n===t&&a===r||n===r&&a===t||(++u,c[i]=1)):(s[i]=t,l[i]=r))}function S(e){return w(n[e])}function T(e,t){return A(n[e],n[t])}o=s=l=null;var x,b=E(1.4*u,w,A);for(a=0,d=n.length;a<d;++a)c[x=r[a]]&&b.add(n[x]);return b}function _(e){for(var t,i,r,n,a,o=C(e),s=e.coordinates,l=e.lines,c=e.rings,u=0,d=l.length;u<d;++u)for(var h=l[u],p=h[0],m=h[1];++p<m;)o.has(s[p])&&(t={0:p,1:h[1]},h[1]=p,h=h.next=t);for(u=0,d=c.length;u<d;++u)for(var f=c[u],g=f[0],_=g,y=f[1],v=o.has(s[g]);++_<y;)o.has(s[_])&&(v?(t={0:_,1:f[1]},f[1]=_,f=f.next=t):(a=(n=y)-_,S(i=s,r=g,n),S(i,r,r+a),S(i,r+a,n),s[y]=s[g],v=!0,_=g));return e}var s=new ArrayBuffer(16),l=new Uint32Array(s);function S(e,t,i){for(var r,n=t+(i---t>>1);t<n;++t,--i)r=e[t],e[t]=e[i],e[i]=r}function y(e){var t,i,u=e.coordinates,r=e.lines,n=e.rings,a=r.length+n.length;for(delete e.lines,delete e.rings,o=0,s=r.length;o<s;++o)for(t=r[o];t=t.next;)++a;for(o=0,s=n.length;o<s;++o)for(i=n[o];i=i.next;)++a;for(var c=P(2*a*1.4,w,A),d=e.arcs=[],o=0,s=r.length;o<s;++o)for(t=r[o];l(t),t=t.next;);for(o=0,s=n.length;o<s;++o)if((i=n[o]).next)for(;l(i),i=i.next;);else!function(e){var t,i,r,n,a;if(i=c.get(t=u[e[0]]))for(n=0,a=i.length;n<a;++n){if(h(r=i[n],e))return e[0]=r[0],e[1]=r[1];if(p(r,e))return e[0]=r[1],e[1]=r[0]}if(i=c.get(t=u[e[0]+m(e)]))for(n=0,a=i.length;n<a;++n){if(h(r=i[n],e))return e[0]=r[0],e[1]=r[1];if(p(r,e))return e[0]=r[1],e[1]=r[0]}i?i.push(e):c.set(t,[e]);d.push(e)}(i);function l(e){var t,i,r,n,a,o,s,l;if(r=c.get(t=u[e[0]]))for(s=0,l=r.length;s<l;++s)if(function(e,t){var i=e[0],r=t[0],n=e[1],a=t[1];if(i-n!=r-a)return!1;for(;i<=n;++i,++r)if(!A(u[i],u[r]))return!1;return!0}(n=r[s],e))return e[0]=n[0],void(e[1]=n[1]);if(a=c.get(i=u[e[1]]))for(s=0,l=a.length;s<l;++s)if(function(e,t){var i=e[0],r=t[0],n=e[1],a=t[1];if(i-n!=r-a)return!1;for(;i<=n;++i,--a)if(!A(u[i],u[a]))return!1;return!0}(o=a[s],e))return e[1]=o[0],void(e[0]=o[1]);r?r.push(e):c.set(t,[e]),a?a.push(e):c.set(i,[e]),d.push(e)}function h(e,t){var i=e[0],r=t[0],n=e[1]-i;if(n==t[1]-r){for(var a=m(e),o=m(t),s=0;s<n;++s)if(!A(u[i+(s+a)%n],u[r+(s+o)%n]))return;return 1}}function p(e,t){var i=e[0],r=t[0],n=e[1],a=t[1],o=n-i;if(o==a-r){for(var s=m(e),l=o-m(t),c=0;c<o;++c)if(!A(u[i+(c+s)%o],u[a-(c+l)%o]))return;return 1}}function m(e){for(var t=e[0],i=e[1],r=t,n=r,a=u[r];++r<i;){var o=u[r];(o[0]<a[0]||o[0]===a[0]&&o[1]<a[1])&&(n=r,a=o)}return n-t}return e}function v(e){var t,i,r={};for(t in e)r[t]=null==(i=e[t])?{type:null}:("FeatureCollection"===i.type?function(e){var t={type:"GeometryCollection",geometries:e.features.map(u)};return null!=e.bbox&&(t.bbox=e.bbox),t}:"Feature"===i.type?u:d)(i);return r}function u(e){var t,i=d(e.geometry);for(t in null!=e.id&&(i.id=e.id),null!=e.bbox&&(i.bbox=e.bbox),e.properties){i.properties=e.properties;break}return i}function d(e){if(null==e)return{type:null};var t="GeometryCollection"===e.type?{type:"GeometryCollection",geometries:e.geometries.map(d)}:"Point"===e.type||"MultiPoint"===e.type?{type:e.type,coordinates:e.coordinates}:{type:e.type,arcs:e.coordinates};return null!=e.bbox&&(t.bbox=e.bbox),t}function T(e){var t,i=e[0],r=e[1];return r<i&&(t=i,i=r,r=t),i+31*r}function x(e,t){var i,r=e[0],n=e[1],a=t[0],o=t[1];return n<r&&(i=r,r=n,n=i),o<a&&(i=a,a=o,o=i),r===a&&n===o}function b(){return!0}function D(e){return e}function M(e){return null!=e.type}function I(e){var t,l=new Array(e.arcs.length),c=0;function i(e){switch(e.type){case"GeometryCollection":e.geometries.forEach(i);break;case"Polygon":r(e.arcs);break;case"MultiPolygon":e.arcs.forEach(r)}}function r(e){for(var t=0,i=e.length;t<i;++t,++c)for(var r=e[t],n=0,a=r.length;n<a;++n){var o=r[n];o<0&&(o=~o);var s=l[o];null==s?l[o]=c:s!==c&&(l[o]=-1)}}for(t in e.objects)i(e.objects[t]);return function(e){for(var t,i=0,r=e.length;i<r;++i)if(-1===l[(t=e[i])<0?~t:t])return!0;return!1}}function R(e){var t=e[0],i=e[1],r=e[2];return Math.abs((t[0]-r[0])*(i[1]-t[1])-(t[0]-i[0])*(r[1]-t[1]))/2}function O(e){for(var t,i=-1,r=e.length,n=e[r-1],a=0;++i<r;)t=n,n=e[i],a+=t[0]*n[1]-t[1]*n[0];return Math.abs(a)/2}function L(i,r,n){return r=null==r?Number.MIN_VALUE:+r,null==n&&(n=O),function(e,t){return n(a(i,{type:"Polygon",arcs:[e]}).geometry.coordinates[0],t)>=r}}function F(e,t){return e[1][2]-t[1][2]}function N(e){return[e[0],e[1],0]}function B(e,t){return t-e}var V=Math.PI,k=2*V,z=V/4,$=V/180,U=Math.abs,G=Math.atan2,H=Math.cos,W=Math.sin;function q(e,t){for(var i,r,n=0,a=e.length,o=0,s=e[t?n++:a-1],l=s[0]*$,c=s[1]*$/2+z,u=H(c),d=W(c);n<a;++n){i=l,l=(s=e[n])[0]*$,c=s[1]*$/2+z,r=u,u=H(c),d;var h=l-i,p=0<=h?1:-1,m=p*h,f=d*(d=W(c)),g=r*u+f*H(m),_=f*p*W(m);o+=G(_,g)}return o}e.bbox=m,e.feature=a,e.mesh=function(e){return o(e,r.apply(this,arguments))},e.meshArcs=r,e.merge=function(e){return o(e,n.apply(this,arguments))},e.mergeArcs=n,e.neighbors=function(e){var r={},t=e.map(function(){return[]});function i(e,i){e.forEach(function(e){e<0&&(e=~e);var t=r[e];t?t.push(i):r[e]=[i]})}function n(e,t){e.forEach(function(e){i(e,t)})}var a={LineString:i,MultiLineString:n,Polygon:n,MultiPolygon:function(e,t){e.forEach(function(e){n(e,t)})}};for(var o in e.forEach(function t(e,i){"GeometryCollection"===e.type?e.geometries.forEach(function(e){t(e,i)}):e.type in a&&a[e.type](e.arcs,i)}),r)for(var s=r[o],l=s.length,c=0;c<l;++c)for(var u=c+1;u<l;++u){var d,h=s[c],p=s[u];(d=t[h])[o=f(d,p)]!==p&&d.splice(o,0,p),(d=t[p])[o=f(d,h)]!==h&&d.splice(o,0,h)}return t},e.quantize=function(e,t){if(e.transform)throw new Error("already quantized");if(t&&t.scale)s=e.bbox;else{if(!(2<=(i=Math.floor(t))))throw new Error("n must be ≥2");var i,r=(s=e.bbox||m(e))[0],n=s[1],a=s[2],o=s[3];t={scale:[a-r?(a-r)/(i-1):1,o-n?(o-n)/(i-1):1],translate:[r,n]}}var s,l,c=g(t),u=e.objects,d={};function h(e){return c(e)}function p(e){var t;switch(e.type){case"GeometryCollection":t={type:"GeometryCollection",geometries:e.geometries.map(p)};break;case"Point":t={type:"Point",coordinates:h(e.coordinates)};break;case"MultiPoint":t={type:"MultiPoint",coordinates:e.coordinates.map(h)};break;default:return e}return null!=e.id&&(t.id=e.id),null!=e.bbox&&(t.bbox=e.bbox),null!=e.properties&&(t.properties=e.properties),t}for(l in u)d[l]=p(u[l]);return{type:"Topology",bbox:s,transform:t,objects:d,arcs:e.arcs.map(function(e){var t,i=0,r=1,n=e.length,a=new Array(n);for(a[0]=c(e[0],0);++i<n;)((t=c(e[i],i))[0]||t[1])&&(a[r++]=t);return 1===r&&(a[r++]=[0,0]),a.length=r,a})}},e.transform=h,e.untransform=g,e.topology=function(e,t){var i=function(e){var r=1/0,n=1/0,a=-1/0,o=-1/0;function t(e){null!=e&&i.hasOwnProperty(e.type)&&i[e.type](e)}var i={GeometryCollection:function(e){e.geometries.forEach(t)},Point:function(e){s(e.coordinates)},MultiPoint:function(e){e.coordinates.forEach(s)},LineString:function(e){l(e.arcs)},MultiLineString:function(e){e.arcs.forEach(l)},Polygon:function(e){e.arcs.forEach(l)},MultiPolygon:function(e){e.arcs.forEach(c)}};function s(e){var t=e[0],i=e[1];t<r&&(r=t),a<t&&(a=t),i<n&&(n=i),o<i&&(o=i)}function l(e){e.forEach(s)}function c(e){e.forEach(l)}for(var u in e)t(e[u]);return r<=a&&n<=o?[r,n,a,o]:void 0}(e=v(e)),r=0<t&&i&&function(e,t,i){var d=t[0],h=t[1],r=t[2],n=t[3],p=r-d?(i-1)/(r-d):1,m=n-h?(i-1)/(n-h):1;function a(e){return[Math.round((e[0]-d)*p),Math.round((e[1]-h)*m)]}function o(e,t){for(var i,r,n,a,o,s=-1,l=0,c=e.length,u=new Array(c);++s<c;)i=e[s],a=Math.round((i[0]-d)*p),o=Math.round((i[1]-h)*m),a===r&&o===n||(u[l++]=[r=a,n=o]);for(u.length=l;l<t;)l=u.push([u[0][0],u[0][1]]);return u}function s(e){return o(e,2)}function l(e){return o(e,4)}function c(e){return e.map(l)}function u(e){null!=e&&f.hasOwnProperty(e.type)&&f[e.type](e)}var f={GeometryCollection:function(e){e.geometries.forEach(u)},Point:function(e){e.coordinates=a(e.coordinates)},MultiPoint:function(e){e.coordinates=e.coordinates.map(a)},LineString:function(e){e.arcs=s(e.arcs)},MultiLineString:function(e){e.arcs=e.arcs.map(s)},Polygon:function(e){e.arcs=c(e.arcs)},MultiPolygon:function(e){e.arcs=e.arcs.map(c)}};for(var g in e)u(e[g]);return{scale:[1/p,1/m],translate:[d,h]}}(e,i,t),n=y(_(function(e){var n=-1,a=[],o=[],s=[];function t(e){e&&i.hasOwnProperty(e.type)&&i[e.type](e)}var i={GeometryCollection:function(e){e.geometries.forEach(t)},LineString:function(e){e.arcs=r(e.arcs)},MultiLineString:function(e){e.arcs=e.arcs.map(r)},Polygon:function(e){e.arcs=e.arcs.map(l)},MultiPolygon:function(e){e.arcs=e.arcs.map(c)}};function r(e){for(var t=0,i=e.length;t<i;++t)s[++n]=e[t];var r={0:n-i+1,1:n};return a.push(r),r}function l(e){for(var t=0,i=e.length;t<i;++t)s[++n]=e[t];var r={0:n-i+1,1:n};return o.push(r),r}function c(e){return e.map(l)}for(var u in e)t(e[u]);return{type:"Topology",coordinates:s,lines:a,rings:o,objects:e}}(e))),a=n.coordinates,o=P(1.4*n.arcs.length,T,x);function s(e){e&&l.hasOwnProperty(e.type)&&l[e.type](e)}e=n.objects,n.bbox=i,n.arcs=n.arcs.map(function(e,t){return o.set(e,t),a.slice(e[0],e[1]+1)}),delete n.coordinates,a=null;var l={GeometryCollection:function(e){e.geometries.forEach(s)},LineString:function(e){e.arcs=c(e.arcs)},MultiLineString:function(e){e.arcs=e.arcs.map(c)},Polygon:function(e){e.arcs=e.arcs.map(c)},MultiPolygon:function(e){e.arcs=e.arcs.map(u)}};function c(e){var t=[];do{var i=o.get(e);t.push(e[0]<e[1]?i:~i)}while(e=e.next);return t}function u(e){return e.map(c)}for(var d in e)s(e[d]);return r&&(n.transform=r,n.arcs=function(e){for(var t=-1,i=e.length;++t<i;){for(var r,n,a=e[t],o=0,s=1,l=a.length,c=a[0],u=c[0],d=c[1];++o<l;)r=(c=a[o])[0],n=c[1],r===u&&n===d||(a[s++]=[r-u,n-d],u=r,d=n);1===s&&(a[s++]=[0,0]),a.length=s}return e}(n.arcs)),n},e.filter=function(e,i){var t,r=e.objects,n={};function a(e){var t,i;switch(e.type){case"Polygon":t=(i=o(e.arcs))?{type:"Polygon",arcs:i}:{type:null};break;case"MultiPolygon":t=(i=e.arcs.map(o).filter(D)).length?{type:"MultiPolygon",arcs:i}:{type:null};break;case"GeometryCollection":t=(i=e.geometries.map(a).filter(M)).length?{type:"GeometryCollection",geometries:i}:{type:null};break;default:return e}return null!=e.id&&(t.id=e.id),null!=e.bbox&&(t.bbox=e.bbox),null!=e.properties&&(t.properties=e.properties),t}function o(e){return e.length&&(t=e[0],i(t,!1))?[e[0]].concat(e.slice(1).filter(s)):null;var t}function s(e){return i(e,!0)}for(t in null==i&&(i=b),r)n[t]=a(r[t]);return function(e){var t,i,r=e.objects,n={},a=e.arcs,o=a.length,s=-1,l=new Array(o),c=0,u=-1;function d(e){switch(e.type){case"GeometryCollection":e.geometries.forEach(d);break;case"LineString":p(e.arcs);break;case"MultiLineString":case"Polygon":e.arcs.forEach(p);break;case"MultiPolygon":e.arcs.forEach(m)}}function h(e){e<0&&(e=~e),l[e]||(l[e]=1,++c)}function p(e){e.forEach(h)}function m(e){e.forEach(p)}function f(e){var t;switch(e.type){case"GeometryCollection":t={type:"GeometryCollection",geometries:e.geometries.map(f)};break;case"LineString":t={type:"LineString",arcs:_(e.arcs)};break;case"MultiLineString":t={type:"MultiLineString",arcs:e.arcs.map(_)};break;case"Polygon":t={type:"Polygon",arcs:e.arcs.map(_)};break;case"MultiPolygon":t={type:"MultiPolygon",arcs:e.arcs.map(y)};break;default:return e}return null!=e.id&&(t.id=e.id),null!=e.bbox&&(t.bbox=e.bbox),null!=e.properties&&(t.properties=e.properties),t}function g(e){return e<0?~l[~e]:l[e]}function _(e){return e.map(g)}function y(e){return e.map(_)}for(i in r)d(r[i]);for(t=new Array(c);++s<o;)l[s]&&(l[s]=++u,t[u]=a[s]);for(i in r)n[i]=f(r[i]);return{type:"Topology",bbox:e.bbox,transform:e.transform,objects:n,arcs:t}}({type:"Topology",bbox:e.bbox,transform:e.transform,objects:n,arcs:e.arcs})},e.filterAttached=I,e.filterAttachedWeight=function(e,t,i){var r=I(e),n=L(e,t,i);return function(e,t){return r(e,t)||n(e,t)}},e.filterWeight=L,e.planarRingArea=O,e.planarTriangleArea=R,e.presimplify=function(e,l){var t,o,s,c=e.transform?h(e.transform):N,u=(o=[],s=0,(t={}).push=function(e){return r(o[e._=s]=e,s++),s},t.pop=function(){if(!(s<=0)){var e,t=o[0];return 0<--s&&(e=o[s],n(o[e._=0]=e,0)),t}},t.remove=function(e){var t,i=e._;if(o[i]===e)return i!==--s&&(F(t=o[s],e)<0?r:n)(o[t._=i]=t,i),i},t);function r(e,t){for(;0<t;){var i=(t+1>>1)-1,r=o[i];if(0<=F(e,r))break;o[r._=t]=r,o[e._=t=i]=e}}function n(e,t){for(;;){var i=t+1<<1,r=i-1,n=t,a=o[n];if(r<s&&F(o[r],a)<0&&(a=o[n=r]),i<s&&F(o[i],a)<0&&(a=o[n=i]),n===t)break;o[a._=t]=a,o[e._=t=n]=e}}null==l&&(l=R);var i=e.arcs.map(function(e){for(var t,i=[],r=0,n=1,a=(e=e.map(c)).length-1;n<a;++n)(t=[e[n-1],e[n],e[n+1]])[1][2]=l(t),i.push(t),u.push(t);for(e[0][2]=e[a][2]=1/0,n=0,a=i.length;n<a;++n)(t=i[n]).previous=i[n-1],t.next=i[n+1];for(;t=u.pop();){var o=t.previous,s=t.next;t[1][2]<r?t[1][2]=r:r=t[1][2],o&&(o.next=s,o[2]=t[2],d(o)),s&&(s.previous=o,s[0]=t[0],d(s))}return e});function d(e){u.remove(e),e[1][2]=l(e),u.push(e)}return{type:"Topology",bbox:e.bbox,objects:e.objects,arcs:i}},e.quantile=function(e,t){var i=[];return e.arcs.forEach(function(e){e.forEach(function(e){isFinite(e[2])&&i.push(e[2])})}),i.length&&function(e,t){if(!(i=e.length))return;if((t=+t)<=0||i<2)return e[0];if(1<=t)return e[i-1];var i,r=(i-1)*t,n=Math.floor(r),a=e[n],o=e[n+1];return a+(o-a)*(r-n)}(i.sort(B),t)},e.simplify=function(e,o){o=null==o?Number.MIN_VALUE:+o;var t=e.arcs.map(function(e){for(var t,i=-1,r=0,n=e.length,a=new Array(n);++i<n;)(t=e[i])[2]>=o&&(a[r++]=[t[0],t[1]]);return a.length=r,a});return{type:"Topology",transform:e.transform,bbox:e.bbox,objects:e.objects,arcs:t}},e.sphericalRingArea=function(e,t){var i=q(e,!0);return t&&(i*=-1),2*(i<0?k+i:i)},e.sphericalTriangleArea=function(e){return 2*U(q(e,!1))},Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?yHg(exports):yHg(xHg.topojson=xHg.topojson||{});var topojson=tmp$3.topojson;function defaultCrsFunction(e){return Cartesian3.fromDegrees(e[0],e[1],e[2])}var crsNames={"urn:ogc:def:crs:OGC:1.3:CRS84":defaultCrsFunction,"EPSG:4326":defaultCrsFunction,"urn:ogc:def:crs:EPSG::4326":defaultCrsFunction},crsLinkHrefs={},crsLinkTypes={},defaultMarkerSize=48,defaultMarkerSymbol,defaultMarkerColor=Color.ROYALBLUE,defaultStroke=Color.YELLOW,defaultStrokeWidth=2,defaultFill$1=Color.fromBytes(255,255,0,100),defaultClampToGround=!1,sizes={small:24,medium:48,large:64},simpleStyleIdentifiers=["title","description","marker-size","marker-symbol","marker-color","stroke","stroke-opacity","stroke-width","fill","fill-opacity"];function defaultDescribe(e,t){var i="";for(var r in e)if(e.hasOwnProperty(r)){if(r===t||-1!==simpleStyleIdentifiers.indexOf(r))continue;var n=e[r];defined(n)&&(i+="object"==typeof n?"<tr><th>"+r+"</th><td>"+defaultDescribe(n)+"</td></tr>":"<tr><th>"+r+"</th><td>"+n+"</td></tr>")}return 0<i.length&&(i='<table class="cesium-infoBox-defaultTable"><tbody>'+i+"</tbody></table>"),i}function createDescriptionCallback(i,r,n){var a;return function(e,t){return defined(a)||(a=i(r,n)),a}}function defaultDescribeProperty(e,t){return new CallbackProperty(createDescriptionCallback(defaultDescribe,e,t),!0)}function createObject(e,t,i){var r=e.id;if(defined(r)&&"Feature"===e.type){for(var n=2,a=r;defined(t.getById(a));)a=r+"_"+n,n++;r=a}else r=createGuid();var o=t.getOrCreateEntity(r),s=e.properties;if(defined(s)){var l,c=(o.properties=s).title;if(defined(c))o.name=c,l="title";else{var u=Number.MAX_VALUE;for(var d in s)if(s.hasOwnProperty(d)&&s[d]){var h=d.toLowerCase();if(1<u&&"title"===h){u=1,l=d;break}2<u&&"name"===h?(u=2,l=d):3<u&&/title/i.test(d)?(u=3,l=d):4<u&&/name/i.test(d)&&(u=4,l=d)}defined(l)&&(o.name=s[l])}var p=s.description;null!==p&&(o.description=defined(p)?new ConstantProperty(p):i(s,l))}return o}function coordinatesArrayToCartesianArray(e,t){for(var i=new Array(e.length),r=0;r<e.length;r++)i[r]=t(e[r]);return i}var geoJsonObjectTypes={Feature:processFeature,FeatureCollection:processFeatureCollection,GeometryCollection:processGeometryCollection,LineString:processLineString,MultiLineString:processMultiLineString,MultiPoint:processMultiPoint,MultiPolygon:processMultiPolygon,Point:processPoint$1,Polygon:processPolygon$1,Topology:processTopology},geometryTypes={GeometryCollection:processGeometryCollection,LineString:processLineString,MultiLineString:processMultiLineString,MultiPoint:processMultiPoint,MultiPolygon:processMultiPolygon,Point:processPoint$1,Polygon:processPolygon$1,Topology:processTopology};function processFeature(e,t,i,r,n){if(null!==t.geometry){if(!defined(t.geometry))throw new RuntimeError("feature.geometry is required.");var a=t.geometry.type,o=geometryTypes[a];if(!defined(o))throw new RuntimeError("Unknown geometry type: "+a);o(e,t,t.geometry,r,n)}else createObject(t,e._entityCollection,n.describe)}function processFeatureCollection(e,t,i,r,n){for(var a=t.features,o=0,s=a.length;o<s;o++)processFeature(e,a[o],void 0,r,n)}function processGeometryCollection(e,t,i,r,n){for(var a=i.geometries,o=0,s=a.length;o<s;o++){var l=a[o],c=l.type,u=geometryTypes[c];if(!defined(u))throw new RuntimeError("Unknown geometry type: "+c);u(e,t,l,r,n)}}function createPoint(e,t,i,r,n){var a,o,s,l=n.markerSymbol,c=n.markerColor,u=n.markerSize,d=t.properties;defined(d)&&(defined(a=d["marker-color"])&&(c=Color.fromCssColorString(a)),u=defaultValue(sizes[d["marker-size"]],u),defined(o=d["marker-symbol"])&&(l=o)),s=defined(l)?1===l.length?e._pinBuilder.fromText(l.toUpperCase(),c,u):e._pinBuilder.fromMakiIconId(l,c,u):e._pinBuilder.fromColor(c,u);var h=new BillboardGraphics;h.verticalOrigin=new ConstantProperty(VerticalOrigin$1.BOTTOM),2===r.length&&n.clampToGround&&(h.heightReference=HeightReference$1.CLAMP_TO_GROUND);var p=createObject(t,e._entityCollection,n.describe);p.billboard=h,p.position=new ConstantPositionProperty(i(r));var m=when(s).then(function(e){h.image=new ConstantProperty(e)}).otherwise(function(){h.image=new ConstantProperty(e._pinBuilder.fromColor(c,u))});e._promises.push(m)}function processPoint$1(e,t,i,r,n){createPoint(e,t,r,i.coordinates,n)}function processMultiPoint(e,t,i,r,n){for(var a=i.coordinates,o=0;o<a.length;o++)createPoint(e,t,r,a[o],n)}function createLineString(e,t,i,r,n){var a,o,s,l,c=n.strokeMaterialProperty,u=n.strokeWidthProperty,d=t.properties;defined(d)&&(defined(a=d["stroke-width"])&&(u=new ConstantProperty(a)),defined(s=d.stroke)&&(o=Color.fromCssColorString(s)),defined(l=d["stroke-opacity"])&&1!==l&&(defined(o)||(o=c.color.clone()),o.alpha=l),defined(o)&&(c=new ColorMaterialProperty(o)));var h=createObject(t,e._entityCollection,n.describe),p=new PolylineGraphics;(h.polyline=p).clampToGround=n.clampToGround,p.material=c,p.width=u,p.positions=new ConstantProperty(coordinatesArrayToCartesianArray(r,i)),p.arcType=ArcType$1.RHUMB}function processLineString(e,t,i,r,n){createLineString(e,t,r,i.coordinates,n)}function processMultiLineString(e,t,i,r,n){for(var a=i.coordinates,o=0;o<a.length;o++)createLineString(e,t,r,a[o],n)}function createPolygon(e,t,i,r,n){if(0!==r.length&&0!==r[0].length){var a,o,s,l,c,u,d=n.strokeMaterialProperty.color,h=n.fillMaterialProperty,p=n.strokeWidthProperty,m=t.properties;defined(m)&&(defined(a=m["stroke-width"])&&(p=new ConstantProperty(a)),defined(s=m.stroke)&&(o=Color.fromCssColorString(s)),defined(l=m["stroke-opacity"])&&1!==l&&(defined(o)||(o=n.strokeMaterialProperty.color.clone()),o.alpha=l),defined(o)&&(d=new ConstantProperty(o)),defined(u=m.fill)&&((c=Color.fromCssColorString(u)).alpha=h.color.alpha),defined(l=m["fill-opacity"])&&l!==h.color.alpha&&(defined(c)||(c=h.color.clone()),c.alpha=l),defined(c)&&(h=new ColorMaterialProperty(c)));var f=new PolygonGraphics;f.outline=new ConstantProperty(!0),f.outlineColor=d,f.outlineWidth=p,f.material=h,f.arcType=ArcType$1.RHUMB;for(var g=[],_=1,y=r.length;_<y;_++)g.push(new PolygonHierarchy(coordinatesArrayToCartesianArray(r[_],i)));var v=r[0];f.hierarchy=new ConstantProperty(new PolygonHierarchy(coordinatesArrayToCartesianArray(v,i),g)),2<v[0].length?f.perPositionHeight=new ConstantProperty(!0):n.clampToGround||(f.height=0),createObject(t,e._entityCollection,n.describe).polygon=f}}function processPolygon$1(e,t,i,r,n){createPolygon(e,t,r,i.coordinates,n)}function processMultiPolygon(e,t,i,r,n){for(var a=i.coordinates,o=0;o<a.length;o++)createPolygon(e,t,r,a[o],n)}function processTopology(e,t,i,r,n){for(var a in i.objects){var o;i.objects.hasOwnProperty(a)&&(o=topojson.feature(i,i.objects[a]),(0,geoJsonObjectTypes[o.type])(e,o,o,r,n))}}function GeoJsonDataSource(e){this._name=e,this._changed=new Event,this._error=new Event,this._isLoading=!1,this._loading=new Event,this._entityCollection=new EntityCollection(this),this._promises=[],this._pinBuilder=new PinBuilder,this._entityCluster=new EntityCluster,this._credit=void 0,this._resourceCredits=[]}function load$1(t,i,r,e){var n;defined(e)&&(n=getFilenameFromUri(e)),defined(n)&&t._name!==n&&(t._name=n,t._changed.raiseEvent(t));var a=geoJsonObjectTypes[i.type];if(!defined(a))throw new RuntimeError("Unsupported GeoJSON object type: "+i.type);var o=i.crs,s=null!==o?defaultCrsFunction:null;if(defined(o)){if(!defined(o.properties))throw new RuntimeError("crs.properties is undefined.");var l=o.properties;if("name"===o.type){if(!defined(s=crsNames[l.name]))throw new RuntimeError("Unknown crs name: "+l.name)}else if("link"===o.type){var c=crsLinkHrefs[l.href];if(defined(c)||(c=crsLinkTypes[l.type]),!defined(c))throw new RuntimeError("Unable to resolve crs link: "+JSON.stringify(l));s=c(l)}else{if("EPSG"!==o.type)throw new RuntimeError("Unknown crs type: "+o.type);if(!defined(s=crsNames["EPSG:"+l.code]))throw new RuntimeError("Unknown crs EPSG code: "+l.code)}}return when(s,function(e){return t._entityCollection.removeAll(),null!==e&&a(t,i,i,e,r),when.all(t._promises,function(){return t._promises.length=0,DataSource.setLoading(t,!1),t})})}function KmlCamera(e,t){this.position=e,this.headingPitchRoll=t}GeoJsonDataSource.load=function(e,t){return(new GeoJsonDataSource).load(e,t)},Object.defineProperties(GeoJsonDataSource,{markerSize:{get:function(){return defaultMarkerSize},set:function(e){defaultMarkerSize=e}},markerSymbol:{get:function(){return defaultMarkerSymbol},set:function(e){defaultMarkerSymbol=e}},markerColor:{get:function(){return defaultMarkerColor},set:function(e){defaultMarkerColor=e}},stroke:{get:function(){return defaultStroke},set:function(e){defaultStroke=e}},strokeWidth:{get:function(){return defaultStrokeWidth},set:function(e){defaultStrokeWidth=e}},fill:{get:function(){return defaultFill$1},set:function(e){defaultFill$1=e}},clampToGround:{get:function(){return defaultClampToGround},set:function(e){defaultClampToGround=e}},crsNames:{get:function(){return crsNames}},crsLinkHrefs:{get:function(){return crsLinkHrefs}},crsLinkTypes:{get:function(){return crsLinkTypes}}}),Object.defineProperties(GeoJsonDataSource.prototype,{name:{get:function(){return this._name},set:function(e){this._name!==e&&(this._name=e,this._changed.raiseEvent(this))}},clock:{value:void 0,writable:!1},entities:{get:function(){return this._entityCollection}},isLoading:{get:function(){return this._isLoading}},changedEvent:{get:function(){return this._changed}},errorEvent:{get:function(){return this._error}},loadingEvent:{get:function(){return this._loading}},show:{get:function(){return this._entityCollection.show},set:function(e){this._entityCollection.show=e}},clustering:{get:function(){return this._entityCluster},set:function(e){this._entityCluster=e}},credit:{get:function(){return this._credit}}}),GeoJsonDataSource.prototype.load=function(e,t){DataSource.setLoading(this,!0);var i=(t=defaultValue(t,defaultValue.EMPTY_OBJECT)).credit;"string"==typeof i&&(i=new Credit(i)),this._credit=i;var r=e,n=t.sourceUri;if("string"==typeof e||e instanceof Resource){r=(e=Resource.createIfNeeded(e)).fetchJson(),n=defaultValue(n,e.getUrlComponent());var a=this._resourceCredits,o=e.credits;if(defined(o))for(var s=o.length,l=0;l<s;l++)a.push(o[l])}t={describe:defaultValue(t.describe,defaultDescribeProperty),markerSize:defaultValue(t.markerSize,defaultMarkerSize),markerSymbol:defaultValue(t.markerSymbol,defaultMarkerSymbol),markerColor:defaultValue(t.markerColor,defaultMarkerColor),strokeWidthProperty:new ConstantProperty(defaultValue(t.strokeWidth,defaultStrokeWidth)),strokeMaterialProperty:new ColorMaterialProperty(defaultValue(t.stroke,defaultStroke)),fillMaterialProperty:new ColorMaterialProperty(defaultValue(t.fill,defaultFill$1)),clampToGround:defaultValue(t.clampToGround,defaultClampToGround)};var c=this;return when(r,function(e){return load$1(c,e,t,n)}).otherwise(function(e){return DataSource.setLoading(c,!1),c._error.raiseEvent(c,e),console.log(e),when.reject(e)})},GeoJsonDataSource.prototype.update=function(e){return!0};var tmp$4={},u$g,y$g,z$g,A$g,C$g,D$g,E$g,F$g,G$g,H$g,I$g,J$g,K$g,L$g,M$g,N$g,O$g,S$g,T$g,U$g,V$g,W$g,X$g,Y$g,Z$g,$$g,_$g,a_g,b_g,c_g,d_g,e_g,f_g,h_g;function p$g(e,t,i){var r;return e.length>t&&(r=null==i?(i="…",3):i.length,e=e.substring(0,t-r)+i),e}function q$g(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var i=0,r=e.length;i<r;i++)if(e[i]===t)return i;return-1}function r$g(e,t){for(var i=e.length-1;0<=i;i--)!0===t(e[i])&&e.splice(i,1)}function t$g(e){throw new Error("Unhandled case for value: '"+e+"'")}function B$g(e,t){function i(){this.constructor=e}A$g(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}tmp$4.Autolinker=(u$g=function(){function e(e){void 0===e&&(e={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=e.tagName||"",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||""}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||""},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr("class",e)},e.prototype.addClass=function(e){for(var t,i=this.getClass(),r=this.whitespaceRegex,n=i?i.split(r):[],a=e.split(r);t=a.shift();)-1===q$g(n,t)&&n.push(t);return this.getAttrs().class=n.join(" "),this},e.prototype.removeClass=function(e){for(var t,i=this.getClass(),r=this.whitespaceRegex,n=i?i.split(r):[],a=e.split(r);n.length&&(t=a.shift());){var o=q$g(n,t);-1!==o&&n.splice(o,1)}return this.getAttrs().class=n.join(" "),this},e.prototype.getClass=function(){return this.getAttrs().class||""},e.prototype.hasClass=function(e){return-1!==(" "+this.getClass()+" ").indexOf(" "+e+" ")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||""},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return["<",e,t=t?" "+t:"",">",this.getInnerHtml(),"</",e,">"].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var i in e)e.hasOwnProperty(i)&&t.push(i+'="'+e[i]+'"');return t.join(" ")},e}(),y$g=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||""}return e.prototype.build=function(e){return new u$g({tagName:"a",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},i=this.createCssClass(e);return i&&(t.class=i),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var i=[t],r=e.getCssClassSuffixes(),n=0,a=r.length;n<a;n++)i.push(t+"-"+r[n]);return i.join(" ")}return""},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var i=t.length,r=t.location;return("smart"===r?function(e,t,o){var i,r;i=null==o?(o="…",r=3,8):(r=o.length,o.length);function n(e){var t="";return e.scheme&&e.host&&(t+=e.scheme+"://"),e.host&&(t+=e.host),e.path&&(t+="/"+e.path),e.query&&(t+="?"+e.query),e.fragment&&(t+="#"+e.fragment),t}function a(e,t){var i=t/2,r=Math.ceil(i),n=-1*Math.floor(i),a="";return n<0&&(a=e.substr(n)),e.substr(0,r)+o+a}if(e.length<=t)return e;var s=t-r,l=function(e){var t={},i=e,r=i.match(/^([a-z]+):\/\//i);return r&&(t.scheme=r[1],i=i.substr(r[0].length)),(r=i.match(/^(.*?)(?=(\?|#|\/|$))/i))&&(t.host=r[1],i=i.substr(r[0].length)),(r=i.match(/^\/(.*?)(?=(\?|#|$))/i))&&(t.path=r[1],i=i.substr(r[0].length)),(r=i.match(/^\?(.*?)(?=(#|$))/i))&&(t.query=r[1],i=i.substr(r[0].length)),(r=i.match(/^#(.*?)$/i))&&(t.fragment=r[1]),t}(e);{var c;!l.query||(c=l.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i))&&(l.query=l.query.substr(0,c[1].length),e=n(l))}if(e.length<=t)return e;l.host&&(l.host=l.host.replace(/^www\./,""),e=n(l));if(e.length<=t)return e;var u="";l.host&&(u+=l.host);if(u.length>=s)return l.host.length==t?(l.host.substr(0,t-r)+o).substr(0,s+i):a(u,s).substr(0,s+i);var d="";l.path&&(d+="/"+l.path);l.query&&(d+="?"+l.query);if(d){if(s<=(u+d).length){if((u+d).length==t)return(u+d).substr(0,t);var h=s-u.length;return(u+a(d,h)).substr(0,s+i)}u+=d}if(l.fragment){var p="#"+l.fragment;if(s<=(u+p).length){if((u+p).length==t)return(u+p).substr(0,t);var m=s-u.length;return(u+a(p,m)).substr(0,s+i)}u+=p}if(l.scheme&&l.host){var f=l.scheme+"://";if((u+f).length<s)return(f+u).substr(0,t)}if(u.length<=t)return u;var g="";0<s&&(g=u.substr(-1*Math.floor(s/2)));return(u.substr(0,Math.ceil(s/2))+o+g).substr(0,s+i)}:"middle"===r?function(e,t,i){if(e.length<=t)return e;var r,n;n=null==i?(i="…",r=8,3):(r=i.length,i.length);var a=t-n,o="";0<a&&(o=e.substr(-1*Math.floor(a/2)));return(e.substr(0,Math.ceil(a/2))+i+o).substr(0,a+r)}:p$g)(e,i)},e}(),z$g=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),A$g=function(e,t){return(A$g=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},C$g=function(){return(C$g=Object.assign||function(e){for(var t,i=1,r=arguments.length;i<r;i++)for(var n in t=arguments[i])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},D$g=function(i){function e(e){var t=i.call(this,e)||this;return t.email="",t.email=e.email,t}return B$g(e,i),e.prototype.getType=function(){return"email"},e.prototype.getEmail=function(){return this.email},e.prototype.getAnchorHref=function(){return"mailto:"+this.email},e.prototype.getAnchorText=function(){return this.email},e}(z$g),E$g=function(i){function e(e){var t=i.call(this,e)||this;return t.serviceName="",t.hashtag="",t.serviceName=e.serviceName,t.hashtag=e.hashtag,t}return B$g(e,i),e.prototype.getType=function(){return"hashtag"},e.prototype.getServiceName=function(){return this.serviceName},e.prototype.getHashtag=function(){return this.hashtag},e.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case"twitter":return"https://twitter.com/hashtag/"+t;case"facebook":return"https://www.facebook.com/hashtag/"+t;case"instagram":return"https://instagram.com/explore/tags/"+t;default:throw new Error("Unknown service name to point hashtag to: "+e)}},e.prototype.getAnchorText=function(){return"#"+this.hashtag},e}(z$g),F$g=function(i){function e(e){var t=i.call(this,e)||this;return t.serviceName="twitter",t.mention="",t.mention=e.mention,t.serviceName=e.serviceName,t}return B$g(e,i),e.prototype.getType=function(){return"mention"},e.prototype.getMention=function(){return this.mention},e.prototype.getServiceName=function(){return this.serviceName},e.prototype.getAnchorHref=function(){switch(this.serviceName){case"twitter":return"https://twitter.com/"+this.mention;case"instagram":return"https://instagram.com/"+this.mention;case"soundcloud":return"https://soundcloud.com/"+this.mention;default:throw new Error("Unknown service name to point mention to: "+this.serviceName)}},e.prototype.getAnchorText=function(){return"@"+this.mention},e.prototype.getCssClassSuffixes=function(){var e=i.prototype.getCssClassSuffixes.call(this),t=this.getServiceName();return t&&e.push(t),e},e}(z$g),G$g=function(i){function e(e){var t=i.call(this,e)||this;return t.number="",t.plusSign=!1,t.number=e.number,t.plusSign=e.plusSign,t}return B$g(e,i),e.prototype.getType=function(){return"phone"},e.prototype.getPhoneNumber=function(){return this.number},e.prototype.getNumber=function(){return this.getPhoneNumber()},e.prototype.getAnchorHref=function(){return"tel:"+(this.plusSign?"+":"")+this.number},e.prototype.getAnchorText=function(){return this.matchedText},e}(z$g),H$g=function(i){function e(e){var t=i.call(this,e)||this;return t.url="",t.urlMatchType="scheme",t.protocolUrlMatch=!1,t.protocolRelativeMatch=!1,t.stripPrefix={scheme:!0,www:!0},t.stripTrailingSlash=!0,t.decodePercentEncoding=!0,t.schemePrefixRegex=/^(https?:\/\/)?/i,t.wwwPrefixRegex=/^(https?:\/\/)?(www\.)?/i,t.protocolRelativeRegex=/^\/\//,t.protocolPrepended=!1,t.urlMatchType=e.urlMatchType,t.url=e.url,t.protocolUrlMatch=e.protocolUrlMatch,t.protocolRelativeMatch=e.protocolRelativeMatch,t.stripPrefix=e.stripPrefix,t.stripTrailingSlash=e.stripTrailingSlash,t.decodePercentEncoding=e.decodePercentEncoding,t}return B$g(e,i),e.prototype.getType=function(){return"url"},e.prototype.getUrlMatchType=function(){return this.urlMatchType},e.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url="http://"+e,this.protocolPrepended=!0),e},e.prototype.getAnchorHref=function(){return this.getUrl().replace(/&/g,"&")},e.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},e.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,"")},e.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,"$1")},e.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,"")},e.prototype.removeTrailingSlash=function(e){return"/"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},e.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,""").replace(/%26/gi,"&").replace(/%27/gi,"'").replace(/%3C/gi,"<").replace(/%3E/gi,">");try{return decodeURIComponent(t)}catch(e){return t}},e}(z$g),I$g=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},J$g=/[A-Za-z]/,K$g=/[0-9]/,L$g=/\s/,M$g=/['"]/,N$g=/[\x00-\x1F\x7F]/,V$g="(?:["+(S$g=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source)+"]{1,3}\\.){3}["+S$g+"]{1,3}",W$g="["+(U$g=T$g=(O$g=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source)+/\u00a9\u00ae\u2000-\u3300\ud83c\ud000-\udfff\ud83d\ud000-\udfff\ud83e\ud000-\udfff/.source+/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source+S$g)+"](?:["+U$g+"\\-]{0,61}["+U$g+"])?",X$g=function(e){return"(?=("+W$g+"))\\"+e},Y$g=function(e){return"(?:"+X$g(e)+"(?:\\."+X$g(e+1)+"){0,126}|"+V$g+")"},Z$g=new RegExp("["+U$g+"]"),$$g=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,_$g=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.localPartCharRegex=new RegExp("["+U$g+"!#$%&'*+/=?^_`{|}~-]"),e.strictTldRegex=new RegExp("^"+$$g.source+"$"),e}return B$g(e,t),e.prototype.parseMatches=function(r){for(var e,t,i,n,a,o,s,l,c,u=this.tagBuilder,d=this.localPartCharRegex,h=this.strictTldRegex,p=[],m=r.length,f=new a_g,g={m:"a",a:"i",i:"l",l:"t",t:"o",o:":"},_=0,y=0,v=f;_<m;){var C=r.charAt(_);switch(y){case 0:"m"===(c=C)?S(1):d.test(c)&&S();break;case 1:s=r.charAt(_-1),l=C,":"===s?d.test(l)?(y=2,v=new a_g(C$g({},v,{hasMailtoPrefix:!0}))):T():g[s]===l||(d.test(l)?y=2:"."===l?y=3:"@"===l?y=4:T());break;case 2:"."===(o=C)?y=3:"@"===o?y=4:d.test(o)||T();break;case 3:"."!==(a=C)&&"@"!==a&&d.test(a)?y=2:T();break;case 4:n=C,Z$g.test(n)?y=5:T();break;case 5:"."===(i=C)?y=7:"-"===i?y=6:Z$g.test(i)||x();break;case 6:"-"!==(t=C)&&"."!==t&&Z$g.test(t)?y=5:x();break;case 7:"."!==(e=C)&&"-"!==e&&Z$g.test(e)?(y=5,v=new a_g(C$g({},v,{hasDomainDot:!0}))):x();break;default:t$g(y)}_++}return x(),p;function S(e){void 0===e&&(e=2),y=e,v=new a_g({idx:_})}function T(){y=0,v=f}function x(){var e,t,i;v.hasDomainDot&&(e=r.slice(v.idx,_),/[-.]$/.test(e)&&(e=e.slice(0,-1)),t=v.hasMailtoPrefix?e.slice("mailto:".length):e,i=(t.split(".").pop()||"").toLowerCase(),h.test(i)&&p.push(new D$g({tagBuilder:u,matchedText:e,offset:v.idx,email:t}))),T()}},e}(I$g),a_g=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},b_g=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split("://")[1]),-1<t.split("/")[0].indexOf("..")},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),i=t&&t[0].toLowerCase();return"javascript:"!==i&&"vbscript:"!==i},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf("."))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+O$g+"]"),e.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,e}(),c_g=function(r){function e(e){var t,i=r.call(this,e)||this;return i.stripPrefix={scheme:!0,www:!0},i.stripTrailingSlash=!0,i.decodePercentEncoding=!0,i.matcherRegex=(t=new RegExp("[/?#](?:["+U$g+"\\-+&@#/%=~_()|'$*\\[\\]?!:,.;✓]*["+U$g+"\\-+&@#/%=~_()|'$*\\[\\]✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,Y$g(2),")","|","(","(//)?",/(?:www\.)/.source,Y$g(6),")","|","(","(//)?",Y$g(10)+"\\.",$$g.source,"(?![-"+T$g+"])",")",")","(?::[0-9]+)?","(?:"+t.source+")?"].join(""),"gi")),i.wordCharRegExp=new RegExp("["+U$g+"]"),i.stripPrefix=e.stripPrefix,i.stripTrailingSlash=e.stripTrailingSlash,i.decodePercentEncoding=e.decodePercentEncoding,i}return B$g(e,r),e.prototype.parseMatches=function(p){for(var m,e=this.matcherRegex,f=this.stripPrefix,g=this.stripTrailingSlash,_=this.decodePercentEncoding,y=this.tagBuilder,v=[],C=this;null!==(m=e.exec(p));)!function(){var e,t=m[0],i=m[1],r=m[4],n=m[5],a=m[9],o=m.index,s=n||a,l=p.charAt(o-1);if(!b_g.isValid(t,i))return;if(0<o&&"@"===l)return;if(0<o&&s&&C.wordCharRegExp.test(l))return;/\?$/.test(t)&&(t=t.substr(0,t.length-1)),C.matchHasUnbalancedClosingParen(t)?t=t.substr(0,t.length-1):-1<(e=C.matchHasInvalidCharAfterTld(t,i))&&(t=t.substr(0,e));var c,u=["http://","https://"].find(function(e){return!!i&&-1!==i.indexOf(e)});u&&(c=t.indexOf(u),t=t.substr(c),i=i.substr(c),o+=c);var d=i?"scheme":r?"www":"tld",h=!!i;v.push(new H$g({tagBuilder:y,matchedText:t,offset:o,urlMatchType:d,url:t,protocolUrlMatch:h,protocolRelativeMatch:!!s,stripPrefix:f,stripTrailingSlash:g,decodePercentEncoding:_}))}();return v},e.prototype.matchHasUnbalancedClosingParen=function(e){var t,i=e.charAt(e.length-1);if(")"===i)t="(";else{if("]"!==i)return!1;t="["}for(var r=0,n=0,a=e.length-1;n<a;n++){var o=e.charAt(n);o===t?r++:o===i&&(r=Math.max(r-1,0))}return 0===r},e.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var i=0;t&&(i=e.indexOf(":"),e=e.slice(i));var r=new RegExp("^((.?//)?[-."+U$g+"]*[-"+U$g+"]\\.[-"+U$g+"]+)").exec(e);return null===r?-1:(i+=r[1].length,e=e.slice(r[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(e)?i:-1)},e}(I$g),d_g=function(i){function e(e){var t=i.call(this,e)||this;return t.serviceName="twitter",t.matcherRegex=new RegExp("#[_"+U$g+"]{1,139}(?![_"+U$g+"])","g"),t.nonWordCharRegex=new RegExp("[^"+U$g+"]"),t.serviceName=e.serviceName,t}return B$g(e,i),e.prototype.parseMatches=function(e){for(var t,i=this.matcherRegex,r=this.nonWordCharRegex,n=this.serviceName,a=this.tagBuilder,o=[];null!==(t=i.exec(e));){var s,l,c=t.index,u=e.charAt(c-1);0!==c&&!r.test(u)||(s=t[0],l=t[0].slice(1),o.push(new E$g({tagBuilder:a,matchedText:s,offset:c,serviceName:n,hashtag:l})))}return o},e}(I$g),e_g=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.matcherRegex=/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/g,e}return B$g(e,t),e.prototype.parseMatches=function(e){for(var t,i=this.matcherRegex,r=this.tagBuilder,n=[];null!==(t=i.exec(e));){var a=t[0],o=a.replace(/[^0-9,;#]/g,""),s=!(!t[1]&&!t[2]),l=0==t.index?"":e.substr(t.index-1,1),c=e.substr(t.index+a.length,1),u=!l.match(/\d/)&&!c.match(/\d/);this.testMatch(t[3])&&this.testMatch(a)&&u&&n.push(new G$g({tagBuilder:r,matchedText:a,offset:t.index,number:o,plusSign:s}))}return n},e.prototype.testMatch=function(e){return/\D/.test(e)},e}(I$g),f_g=function(i){function e(e){var t=i.call(this,e)||this;return t.serviceName="twitter",t.matcherRegexes={twitter:new RegExp("@[_"+U$g+"]{1,50}(?![_"+U$g+"])","g"),instagram:new RegExp("@[_."+U$g+"]{1,30}(?![_"+U$g+"])","g"),soundcloud:new RegExp("@[-_."+U$g+"]{1,50}(?![-_"+U$g+"])","g")},t.nonWordCharRegex=new RegExp("[^"+U$g+"]"),t.serviceName=e.serviceName,t}return B$g(e,i),e.prototype.parseMatches=function(e){var t,i=this.serviceName,r=this.matcherRegexes[this.serviceName],n=this.nonWordCharRegex,a=this.tagBuilder,o=[];if(!r)return o;for(;null!==(t=r.exec(e));){var s,l,c=t.index,u=e.charAt(c-1);0!==c&&!n.test(u)||(l=(s=t[0].replace(/\.+$/g,"")).slice(1),o.push(new F$g({tagBuilder:a,matchedText:s,offset:c,serviceName:i,mention:l})))}return o},e}(I$g),h_g=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||"tag",this.name=e.name||"",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},function(){function r(e){void 0===e&&(e={}),this.version=r.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(e.urls),this.email="boolean"==typeof e.email?e.email:this.email,this.phone="boolean"==typeof e.phone?e.phone:this.phone,this.hashtag=e.hashtag||this.hashtag,this.mention=e.mention||this.mention,this.newWindow="boolean"==typeof e.newWindow?e.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(e.stripPrefix),this.stripTrailingSlash="boolean"==typeof e.stripTrailingSlash?e.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding="boolean"==typeof e.decodePercentEncoding?e.decodePercentEncoding:this.decodePercentEncoding;var t=this.mention;if(!1!==t&&"twitter"!==t&&"instagram"!==t&&"soundcloud"!==t)throw new Error("invalid `mention` cfg - see docs");var i=this.hashtag;if(!1!==i&&"twitter"!==i&&"facebook"!==i&&"instagram"!==i)throw new Error("invalid `hashtag` cfg - see docs");this.truncate=this.normalizeTruncateCfg(e.truncate),this.className=e.className||this.className,this.replaceFn=e.replaceFn||this.replaceFn,this.context=e.context||this}return r.link=function(e,t){var i=new r(t);return i.link(e)},r.parse=function(e,t){var i=new r(t);return i.parse(e)},r.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),"boolean"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:"boolean"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:"boolean"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:"boolean"!=typeof e.tldMatches||e.tldMatches}},r.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),"boolean"==typeof e?{scheme:e,www:e}:{scheme:"boolean"!=typeof e.scheme||e.scheme,www:"boolean"!=typeof e.www||e.www}},r.prototype.normalizeTruncateCfg=function(e){return"number"==typeof e?{length:e,location:"end"}:function(e,t){for(var i in t)t.hasOwnProperty(i)&&void 0===e[i]&&(e[i]=t[i]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:"end"})},r.prototype.parse=function(e){var n=this,t=["a","style","script"],a=0,o=[];return function(t,e){var i=e.onOpenTag,r=e.onCloseTag,n=e.onText,a=e.onComment,o=e.onDoctype,s=new h_g,l=0,c=t.length,u=0,d=0,h=s;for(;l<c;){var p=t.charAt(l);switch(u){case 0:!function(e){"<"===e&&f()}(p);break;case 1:!function(e){"!"===e?u=13:"/"===e?(u=2,h=new h_g(C$g({},h,{isClosing:!0}))):"<"===e?f():h=J$g.test(e)?(u=3,new h_g(C$g({},h,{isOpening:!0}))):(u=0,s)}(p);break;case 2:!function(e){">"!==e&&J$g.test(e)?u=3:m()}(p);break;case 3:!function(e){L$g.test(e)?(h=new h_g(C$g({},h,{name:_()})),u=4):"<"===e?f():"/"===e?(h=new h_g(C$g({},h,{name:_()})),u=12):">"===e?(h=new h_g(C$g({},h,{name:_()})),g()):J$g.test(e)||K$g.test(e)||":"===e||m()}(p);break;case 4:!function(e){L$g.test(e)||("/"===e?u=12:">"===e?g():"<"===e?f():"="===e||M$g.test(e)||N$g.test(e)?m():u=5)}(p);break;case 5:!function(e){L$g.test(e)?u=6:"/"===e?u=12:"="===e?u=7:">"===e?g():"<"===e?f():M$g.test(e)&&m()}(p);break;case 6:!function(e){L$g.test(e)||("/"===e?u=12:"="===e?u=7:">"===e?g():"<"===e?f():M$g.test(e)?m():u=5)}(p);break;case 7:!function(e){L$g.test(e)||('"'===e?u=8:"'"===e?u=9:/[>=`]/.test(e)?m():"<"===e?f():u=10)}(p);break;case 8:!function(e){'"'===e&&(u=11)}(p);break;case 9:!function(e){"'"===e&&(u=11)}(p);break;case 10:!function(e){L$g.test(e)?u=4:">"===e?g():"<"===e&&f()}(p);break;case 11:!function(e){L$g.test(e)?u=4:"/"===e?u=12:">"===e?g():"<"===e?f():(u=4,l--)}(p);break;case 12:!function(e){">"===e?(h=new h_g(C$g({},h,{isClosing:!0})),g()):u=4}(p);break;case 13:"--"===t.substr(l,2)?(l+=2,h=new h_g(C$g({},h,{type:"comment"})),u=14):"DOCTYPE"===t.substr(l,7).toUpperCase()?(l+=7,h=new h_g(C$g({},h,{type:"doctype"})),u=20):m();break;case 14:!function(e){"-"===e?u=15:">"===e?m():u=16}(p);break;case 15:!function(e){"-"===e?u=18:">"===e?m():u=16}(p);break;case 16:!function(e){"-"===e&&(u=17)}(p);break;case 17:!function(e){u="-"===e?18:16}(p);break;case 18:!function(e){">"===e?g():"!"===e?u=19:"-"===e||(u=16)}(p);break;case 19:!function(e){"-"===e?u=17:">"===e?g():u=16}(p);break;case 20:!function(e){">"===e?g():"<"===e&&f()}(p);break;default:t$g(u)}l++}d<l&&function(){var e=t.slice(d,l);n(e,d),d=l+1}();function m(){u=0,h=s}function f(){u=1,h=new h_g({idx:l})}function g(){var e=t.slice(d,h.idx);e&&n(e,d),"comment"===h.type?a(h.idx):"doctype"===h.type?o(h.idx):(h.isOpening&&i(h.name,h.idx),h.isClosing&&r(h.name,h.idx)),m(),d=l+1}function _(){var e=h.idx+(h.isClosing?2:1);return t.slice(e,l).toLowerCase()}}(e,{onOpenTag:function(e){0<=t.indexOf(e)&&a++},onText:function(e,t){var i,r;0===a&&(i=function(e,t){if(!t.global)throw new Error("`splitRegex` must have the 'g' flag set");var i,r=[],n=0;for(;i=t.exec(e);)r.push(e.substring(n,i.index)),r.push(i[0]),n=i.index+i[0].length;return r.push(e.substring(n)),r}(e,/( | |<|<|>|>|"|"|')/gi),r=t,i.forEach(function(e,t){var i;t%2==0&&(i=n.parseText(e,r),o.push.apply(o,i)),r+=e.length}))},onCloseTag:function(e){0<=t.indexOf(e)&&(a=Math.max(a-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},r.prototype.compactMatches=function(e){e.sort(function(e,t){return e.getOffset()-t.getOffset()});for(var t=0;t<e.length-1;t++){var i=e[t],r=i.getOffset(),n=i.getMatchedText().length,a=r+n;if(t+1<e.length){if(e[t+1].getOffset()===r){var o=e[t+1].getMatchedText().length>n?t:t+1;e.splice(o,1);continue}e[t+1].getOffset()<a&&e.splice(t+1,1)}}return e},r.prototype.removeUnwantedMatches=function(e){return this.hashtag||r$g(e,function(e){return"hashtag"===e.getType()}),this.email||r$g(e,function(e){return"email"===e.getType()}),this.phone||r$g(e,function(e){return"phone"===e.getType()}),this.mention||r$g(e,function(e){return"mention"===e.getType()}),this.urls.schemeMatches||r$g(e,function(e){return"url"===e.getType()&&"scheme"===e.getUrlMatchType()}),this.urls.wwwMatches||r$g(e,function(e){return"url"===e.getType()&&"www"===e.getUrlMatchType()}),this.urls.tldMatches||r$g(e,function(e){return"url"===e.getType()&&"tld"===e.getUrlMatchType()}),e},r.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var i=this.getMatchers(),r=[],n=0,a=i.length;n<a;n++){for(var o=i[n].parseMatches(e),s=0,l=o.length;s<l;s++)o[s].setOffset(t+o[s].getOffset());r.push.apply(r,o)}return r},r.prototype.link=function(e){if(!e)return"";for(var t=this.parse(e),i=[],r=0,n=0,a=t.length;n<a;n++){var o=t[n];i.push(e.substring(r,o.getOffset())),i.push(this.createMatchReturnVal(o)),r=o.getOffset()+o.getMatchedText().length}return i.push(e.substring(r)),i.join("")},r.prototype.createMatchReturnVal=function(e){var t;if(this.replaceFn&&(t=this.replaceFn.call(this.context,e)),"string"==typeof t)return t;if(!1===t)return e.getMatchedText();if(t instanceof u$g)return t.toAnchorString();var i=e.buildTag();return i.toAnchorString()},r.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new d_g({tagBuilder:e,serviceName:this.hashtag}),new _$g({tagBuilder:e}),new e_g({tagBuilder:e}),new f_g({tagBuilder:e,serviceName:this.mention}),new c_g({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},r.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e=e||(this.tagBuilder=new y$g({newWindow:this.newWindow,truncate:this.truncate,className:this.className}))},r.version="3.11.0",r.AnchorTagBuilder=y$g,r.HtmlTag=u$g,r.matcher={Email:_$g,Hashtag:d_g,Matcher:I$g,Mention:f_g,Phone:e_g,Url:c_g},r.match={Email:D$g,Hashtag:E$g,Match:z$g,Mention:F$g,Phone:G$g,Url:H$g},r}());var Autolinker=tmp$4.Autolinker,tmp$5={};!function(x){var a,e,h="File format is not recognized.",o="File contains encrypted entry.",s="File is using Zip64 (4gb+ file size).",p="Error while reading zip file.",t="Error while reading file data.",g=524288,b="inflate.js",S="deflate.js",l="text/plain",T="message";try{a=0===new Blob([new DataView(new ArrayBuffer(0))]).size}catch(e){}function E(){var r=-1,n=this;n.append=function(e){for(var t=n.table,i=0;i<e.length;i++)r=r>>>8^t[255&(r^e[i])]},n.get=function(){return~r}}function P(e,t){var i=new ArrayBuffer(e),r=new Uint8Array(i);return t&&r.set(t,0),{buffer:i,array:r,view:new DataView(i)}}function i(){}function r(r){var n,a=this;a.size=0,a.init=function(e,t){var i=new Blob([r],{type:l});(n=new c(i)).init(function(){a.size=n.size,e()},t)},a.readUint8Array=function(e,t,i,r){n.readUint8Array(e,t,i,r)}}function n(c){var u,i=this;i.size=0,i.init=function(e){for(var t=c.length;"="==c.charAt(t-1);)t--;u=c.indexOf(",")+1,i.size=Math.floor(.75*(t-u)),e()},i.readUint8Array=function(e,t,i){for(var r=P(t),n=4*Math.floor(e/3),a=4*Math.ceil((e+t)/3),o=window.atob(c.substring(n+u,a+u)),s=e-3*Math.floor(n/4),l=s;l<s+t;l++)r.array[l-s]=o.charCodeAt(l);i(r.array)}}function c(l){this.size=0,this.init=function(e){this.size=l.size,e()},this.readUint8Array=function(e,t,i,r){var n,a,o,s=new FileReader;s.onload=function(e){i(new Uint8Array(e.target.result))},s.onerror=r,s.readAsArrayBuffer((a=e,o=t,(n=l).slice?n.slice(a,a+o):n.webkitSlice?n.webkitSlice(a,a+o):n.mozSlice?n.mozSlice(a,a+o):n.msSlice?n.msSlice(a,a+o):void 0))}}function u(){}function d(r){var n;this.init=function(e){n=new Blob([],{type:l}),e()},this.writeUint8Array=function(e,t){n=new Blob([n,a?e:e.buffer],{type:l}),t()},this.getData=function(t,e){var i=new FileReader;i.onload=function(e){t(e.target.result)},i.onerror=e,i.readAsText(n,r)}}function m(t){var a="",o="";this.init=function(e){a+="data:"+(t||"")+";base64,",e()},this.writeUint8Array=function(e,t){var i,r=o.length,n=o;for(o="",i=0;i<3*Math.floor((r+e.length)/3)-r;i++)n+=String.fromCharCode(e[i]);for(;i<e.length;i++)o+=String.fromCharCode(e[i]);2<n.length?a+=window.btoa(n):o=n,t()},this.getData=function(e){e(a+window.btoa(o))}}function f(i){var r;this.init=function(e){r=new Blob([],{type:i}),e()},this.writeUint8Array=function(e,t){r=new Blob([r,a?e:e.buffer],{type:i}),t()},this.getData=function(e){e(r)}}function A(t,e,r,i,n,a,o,s,l,c){var u,d,h=0;function p(){t.removeEventListener(T,m,!1),s(d)}function m(e){var t=e.data,i=t.data;t.onappend&&(d+=i.length,r.writeUint8Array(i,function(){a(!1,i),f()},c)),t.onflush&&(i?(d+=i.length,r.writeUint8Array(i,function(){a(!1,i),p()},c)):p()),t.progress&&o&&o(u+t.current,n)}function f(){(u=h*g)<n?e.readUint8Array(i+u,Math.min(g,n-u),function(e){t.postMessage({append:!0,data:e}),h++,o&&o(u,n),a(!0,e)},l):t.postMessage({flush:!0})}d=0,t.addEventListener(T,m,!1),f()}function w(r,t,n,a,o,s,l,c,u,d){var h,p=0,m=0;!function i(){var e;(h=p*g)<o?t.readUint8Array(a+h,Math.min(g,o-h),function(e){var t=r.append(e,function(){l&&l(a+h,o)});m+=t.length,s(!0,e),n.writeUint8Array(t,function(){s(!1,t),p++,setTimeout(i,1)},d),l&&l(h,o)},u):(e=r.flush())?(m+=e.length,n.writeUint8Array(e,function(){s(!1,e),c(m)},d)):c(m)}()}function D(e,r,n,a,o,s,l,c,u){var d=0,h=new E;!function t(){var i=d*g;i<a?e.readUint8Array(n+i,Math.min(g,a-i),function(e){o&&h.append(e),l&&l(i,a,e),r.writeUint8Array(e,function(){d++,t()},u)},c):s(a,h.get())}()}function _(e){for(var t,i="",r=["Ç","ü","é","â","ä","à","å","ç","ê","ë","è","ï","î","ì","Ä","Å","É","æ","Æ","ô","ö","ò","û","ù","ÿ","Ö","Ü","ø","£","Ø","×","ƒ","á","í","ó","ú","ñ","Ñ","ª","º","¿","®","¬","½","¼","¡","«","»","_","_","_","¦","¦","Á","Â","À","©","¦","¦","+","+","¢","¥","+","+","-","-","+","-","+","ã","Ã","+","+","-","-","¦","-","+","¤","ð","Ð","Ê","Ë","È","i","Í","Î","Ï","+","+","_","_","¦","Ì","_","Ó","ß","Ô","Ò","õ","Õ","µ","þ","Þ","Ú","Û","Ù","ý","Ý","¯","´","­","±","_","¾","¶","§","÷","¸","°","¨","·","¹","³","²","_"," "],n=0;n<e.length;n++)i+=127<(t=255&e.charCodeAt(n))?r[t-128]:String.fromCharCode(t);return i}function y(e){return decodeURIComponent(escape(e))}function v(e){for(var t="",i=0;i<e.length;i++)t+=String.fromCharCode(e[i]);return t}function M(e,t,i,r,n){e.version=t.view.getUint16(i,!0),e.bitFlag=t.view.getUint16(i+2,!0),e.compressionMethod=t.view.getUint16(i+4,!0),e.lastModDateRaw=t.view.getUint32(i+6,!0),e.lastModDate=function(e){var t=(4294901760&e)>>16,i=65535&e;try{return new Date(1980+((65024&t)>>9),((480&t)>>5)-1,31&t,(63488&i)>>11,(2016&i)>>5,2*(31&i),0)}catch(e){}}(e.lastModDateRaw),1!=(1&e.bitFlag)?(!r&&8==(8&e.bitFlag)||(e.crc32=t.view.getUint32(i+10,!0),e.compressedSize=t.view.getUint32(i+14,!0),e.uncompressedSize=t.view.getUint32(i+18,!0)),4294967295!==e.compressedSize&&4294967295!==e.uncompressedSize?(e.filenameLength=t.view.getUint16(i+22,!0),e.extraFieldLength=t.view.getUint16(i+24,!0)):n(s)):n(o)}function C(T,u){function d(){}return d.prototype.getData=function(m,n,f,g){var _,y=this;function a(e,t){_&&_.terminate(),_=null,e&&e(t)}function v(e,t){var i,r;g&&(i=t,(r=P(4)).view.setUint32(0,i),y.crc32!=r.view.getUint32(0))?C():m.getData(function(e){a(n,e)})}function C(){a(u,t)}function S(){a(u,"Error while writing file data.")}T.readUint8Array(y.offset,30,function(e){var p,t=P(e.length,e);1347093252==t.view.getUint32(0)?(M(y,t,4,!1,u),p=y.offset+30+y.filenameLength+y.extraFieldLength,m.init(function(){function e(e,t){o&&!e&&h.append(t)}function t(e){s(e,h.get())}var i,r,n,a,o,s,l,c,u,d,h;0===y.compressionMethod?D(T,m,p,y.compressedSize,g,v,f,C,S):(i=T,r=m,n=p,a=y.compressedSize,o=g,s=v,l=f,c=C,u=S,h=new E,x.zip.useWebWorkers?A(d=new Worker(x.zip.workerScriptsPath+b),i,r,n,a,e,l,t,c,u):w(new x.zip.Inflater,i,r,n,a,e,l,t,c,u),_=d)},S)):u(h)},C)},{getEntries:function(c){T.size<22?u(h):function i(r,n){T.readUint8Array(T.size-r,r,function(e){var t=P(e.length,e).view;1347093766!=t.getUint32(0)?i(r+1,n):n(t)},function(){u(p)})}(22,function(e){var t=e.getUint32(16,!0),l=e.getUint16(8,!0);T.readUint8Array(t,T.size-t,function(e){for(var t,i,r,n=0,a=[],o=P(e.length,e),s=0;s<l;s++){if(t=new d,1347092738!=o.view.getUint32(n))return void u(h);M(t,o,n+6,!0,u),t.commentLength=o.view.getUint16(n+32,!0),t.directory=16==(16&o.view.getUint8(n+38)),t.offset=o.view.getUint32(n+42,!0),i=v(o.array.subarray(n+46,n+46+t.filenameLength)),t.filename=(2048==(2048&t.bitFlag)?y:_)(i),t.directory||"/"!=t.filename.charAt(t.filename.length-1)||(t.directory=!0),r=v(o.array.subarray(n+46+t.filenameLength+t.extraFieldLength,n+46+t.filenameLength+t.extraFieldLength+t.commentLength)),t.comment=(2048==(2048&t.bitFlag)?y:_)(r),a.push(t),n+=46+t.filenameLength+t.extraFieldLength+t.commentLength}c(a)},function(){u(p)})})},close:function(e){e&&e()}}}function I(e){return unescape(encodeURIComponent(e))}function R(e){for(var t=[],i=0;i<e.length;i++)t.push(e.charCodeAt(i));return t}function O(f,s,g){var _,l={},c=[],u=0;function y(e,t){_&&_.terminate(),_=null,e&&e(t)}function v(){y(s,"Error while writing zip file.")}function C(){y(s,t)}return{add:function(i,d,r,h,p){var n,a,o;function m(e,t){var i=P(16);u+=e||0,i.view.setUint32(0,1347094280),void 0!==t&&(n.view.setUint32(10,t,!0),i.view.setUint32(4,t,!0)),d&&(i.view.setUint32(8,e,!0),n.view.setUint32(14,e,!0),i.view.setUint32(12,d.size,!0),n.view.setUint32(18,d.size,!0)),f.writeUint8Array(i.array,function(){u+=16,y(r)},v)}function e(){var e,t;p=p||{},i=i.trim(),p.directory&&"/"!=i.charAt(i.length-1)&&(i+="/"),l.hasOwnProperty(i)?s("File already exists."):(a=R(I(i)),c.push(i),e=function(){function t(e,t){e&&u.append(t)}function i(e){a(e,u.get())}var r,n,e,a,o,s,l,c,u;d?g||0===p.level?D(d,f,0,d.size,!0,m,h,C,v):(r=d,n=f,e=p.level,a=m,o=h,s=C,l=v,u=new E,x.zip.useWebWorkers?((c=new Worker(x.zip.workerScriptsPath+S)).addEventListener(T,function e(){c.removeEventListener(T,e,!1),A(c,r,n,0,r.size,t,o,i,s,l)},!1),c.postMessage({init:!0,level:e})):w(new x.zip.Deflater,r,n,0,r.size,t,o,i,s,l),_=c):m()},o=p.lastModDate||new Date,n=P(26),l[i]={headerArray:n.array,directory:p.directory,filename:a,offset:u,comment:R(I(p.comment||""))},n.view.setUint32(0,335546376),p.version&&n.view.setUint8(0,p.version),g||0===p.level||p.directory||n.view.setUint16(4,2048),n.view.setUint16(6,(o.getHours()<<6|o.getMinutes())<<5|o.getSeconds()/2,!0),n.view.setUint16(8,(o.getFullYear()-1980<<4|o.getMonth()+1)<<5|o.getDate(),!0),n.view.setUint16(22,a.length,!0),(t=P(30+a.length)).view.setUint32(0,1347093252),t.array.set(n.array,4),t.array.set(a,30),u+=t.array.length,f.writeUint8Array(t.array,e,v))}d?d.init(e,C):e()},close:function(e){for(var t,i,r=0,n=0,a=0;a<c.length;a++)r+=46+(i=l[c[a]]).filename.length+i.comment.length;for(t=P(r+22),a=0;a<c.length;a++)i=l[c[a]],t.view.setUint32(n,1347092738),t.view.setUint16(n+4,5120),t.array.set(i.headerArray,n+6),t.view.setUint16(n+32,i.comment.length,!0),i.directory&&t.view.setUint8(n+38,16),t.view.setUint32(n+42,i.offset,!0),t.array.set(i.filename,n+46),t.array.set(i.comment,n+46+i.filename.length),n+=46+i.filename.length+i.comment.length;t.view.setUint32(n,1347093766),t.view.setUint16(n+8,c.length,!0),t.view.setUint16(n+10,c.length,!0),t.view.setUint32(n+12,r,!0),t.view.setUint32(n+16,u,!0),f.writeUint8Array(t.array,function(){y(function(){f.getData(e)})},v)}}}E.prototype.table=function(){for(var e,t,i=[],r=0;r<256;r++){for(t=r,e=0;e<8;e++)1&t?t=t>>>1^3988292384:t>>>=1;i[r]=t}return i}(),(r.prototype=new i).constructor=r,(n.prototype=new i).constructor=n,(c.prototype=new i).constructor=c,u.prototype.getData=function(e){e(this.data)},(d.prototype=new u).constructor=d,(m.prototype=new u).constructor=m,(f.prototype=new u).constructor=f,x.zip={Reader:i,Writer:u,BlobReader:c,Data64URIReader:n,TextReader:r,BlobWriter:f,Data64URIWriter:m,TextWriter:d,createReader:function(e,t,i){e.init(function(){t(C(e,i))},i)},createWriter:function(e,t,i,r){e.init(function(){t(O(e,i,r))},i)},useWebWorkers:!0},Object.defineProperties(x.zip,{workerScriptsPath:{get:function(){return void 0===e&&(e=buildModuleUrl("ThirdParty/Workers/")),e}}})}(tmp$5);var zip=tmp$5.zip;function KmlLookAt(e,t){this.position=e,this.headingPitchRange=t}function KmlTour(e,t){this.id=t,this.name=e,this.playlistIndex=0,this.playlist=[],this.tourStart=new Event,this.tourEnd=new Event,this.entryStart=new Event,this.entryEnd=new Event,this._activeEntries=[]}function cancelAllEntries(e){for(var t=e.pop();void 0!==t;t=e.pop())t.stop()}function playEntry(e,t,i){var r,n,a=this.playlist[this.playlistIndex];a?(r=playNext.bind(this,e,t,i),this._activeEntries.push(a),this.entryStart.raiseEvent(a),a.blocking?a.play(r,e.scene.camera,t):(n=this,a.play(function(){n.entryEnd.raiseEvent(a);var e=n._activeEntries.indexOf(a);0<=e&&n._activeEntries.splice(e,1)}),r(e,t,i))):defined(i)&&i(!1)}function playNext(e,t,i,r){var n,a=this.playlist[this.playlistIndex];this.entryEnd.raiseEvent(a,r),r?i(r):(0<=(n=this._activeEntries.indexOf(a))&&this._activeEntries.splice(n,1),this.playlistIndex++,playEntry.call(this,e,t,i))}function KmlTourFlyTo(e,t,i){this.type="KmlTourFlyTo",this.blocking=!0,this.activeCamera=null,this.activeCallback=null,this.duration=e,this.view=i,this.flyToMode=t}function KmlTourWait(e){this.type="KmlTourWait",this.blocking=!0,this.duration=e,this.timeout=null}KmlTour.prototype.addPlaylistEntry=function(e){this.playlist.push(e)},KmlTour.prototype.play=function(e,t){this.tourStart.raiseEvent();var i=this;playEntry.call(this,e,t,function(e){i.playlistIndex=0,e||cancelAllEntries(i._activeEntries),i.tourEnd.raiseEvent(e)})},KmlTour.prototype.stop=function(){cancelAllEntries(this._activeEntries)},KmlTourFlyTo.prototype.play=function(t,e,i){var r;this.activeCamera=e,defined(t)&&null!==t&&((r=this).activeCallback=function(e){delete r.activeCallback,delete r.activeCamera,t(!defined(e)&&e)});var n,a=this.getCameraOptions(i);this.view.headingPitchRoll?e.flyTo(a):this.view.headingPitchRange&&(n=new BoundingSphere(this.view.position),e.flyToBoundingSphere(n,a))},KmlTourFlyTo.prototype.stop=function(){defined(this.activeCamera)&&this.activeCamera.cancelFlight(),defined(this.activeCallback)&&this.activeCallback(!0)},KmlTourFlyTo.prototype.getCameraOptions=function(e){var t={duration:this.duration};return defined(this.activeCallback)&&(t.complete=this.activeCallback),"smooth"===this.flyToMode&&(t.easingFunction=EasingFunction$1.LINEAR_NONE),this.view.headingPitchRoll?(t.destination=this.view.position,t.orientation=this.view.headingPitchRoll):this.view.headingPitchRange&&(t.offset=this.view.headingPitchRange),defined(e)&&(t=combine(t,e)),t},KmlTourWait.prototype.play=function(e){var t=this;this.activeCallback=e,this.timeout=setTimeout(function(){delete t.activeCallback,e(!1)},1e3*this.duration)},KmlTourWait.prototype.stop=function(){clearTimeout(this.timeout),defined(this.activeCallback)&&this.activeCallback(!0)};var MimeTypes={avi:"video/x-msvideo",bmp:"image/bmp",bz2:"application/x-bzip2",chm:"application/vnd.ms-htmlhelp",css:"text/css",csv:"text/csv",doc:"application/msword",dvi:"application/x-dvi",eps:"application/postscript",flv:"video/x-flv",gif:"image/gif",gz:"application/x-gzip",htm:"text/html",html:"text/html",ico:"image/vnd.microsoft.icon",jnlp:"application/x-java-jnlp-file",jpeg:"image/jpeg",jpg:"image/jpeg",m3u:"audio/x-mpegurl",m4v:"video/mp4",mathml:"application/mathml+xml",mid:"audio/midi",midi:"audio/midi",mov:"video/quicktime",mp3:"audio/mpeg",mp4:"video/mp4",mp4v:"video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",odp:"application/vnd.oasis.opendocument.presentation",ods:"application/vnd.oasis.opendocument.spreadsheet",odt:"application/vnd.oasis.opendocument.text",ogg:"application/ogg",pdf:"application/pdf",png:"image/png",pps:"application/vnd.ms-powerpoint",ppt:"application/vnd.ms-powerpoint",ps:"application/postscript",qt:"video/quicktime",rdf:"application/rdf+xml",rss:"application/rss+xml",rtf:"application/rtf",svg:"image/svg+xml",swf:"application/x-shockwave-flash",text:"text/plain",tif:"image/tiff",tiff:"image/tiff",txt:"text/plain",wav:"audio/x-wav",wma:"audio/x-ms-wma",wmv:"video/x-ms-wmv",xml:"application/xml",zip:"application/zip",detectFromFilename:function(e){var t=getExtensionFromUri(t=e.toLowerCase());return MimeTypes[t]}},parser;"undefined"!=typeof DOMParser&&(parser=new DOMParser);var autolinker=new Autolinker({stripPrefix:!1,email:!1,replaceFn:function(e){if(!e.protocolUrlMatch)return!1}}),BILLBOARD_SIZE=32,BILLBOARD_NEAR_DISTANCE=2414016,BILLBOARD_NEAR_RATIO=1,BILLBOARD_FAR_DISTANCE=16093e3,BILLBOARD_FAR_RATIO=.1,kmlNamespaces=[null,void 0,"http://www.opengis.net/kml/2.2","http://earth.google.com/kml/2.2","http://earth.google.com/kml/2.1","http://earth.google.com/kml/2.0"],gxNamespaces=["http://www.google.com/kml/ext/2.2"],atomNamespaces=["http://www.w3.org/2005/Atom"],namespaces={kml:kmlNamespaces,gx:gxNamespaces,atom:atomNamespaces,kmlgx:kmlNamespaces.concat(gxNamespaces)},featureTypes={Document:processDocument$1,Folder:processFolder,Placemark:processPlacemark,NetworkLink:processNetworkLink,GroundOverlay:processGroundOverlay,PhotoOverlay:processUnsupportedFeature,ScreenOverlay:processUnsupportedFeature,Tour:processTour};function DeferredLoading(e){this._dataSource=e,this._deferred=when.defer(),this._stack=[],this._promises=[],this._timeoutSet=!1,this._used=!1,this._started=0,this._timeThreshold=1e3}function isZipFile(e){var t=e.slice(0,Math.min(4,e.size)),i=when.defer(),r=new FileReader;return r.addEventListener("load",function(){i.resolve(1347093252===new DataView(r.result).getUint32(0,!1))}),r.addEventListener("error",function(){i.reject(r.error)}),r.readAsArrayBuffer(t),i.promise}function readBlobAsText(e){var t=when.defer(),i=new FileReader;return i.addEventListener("load",function(){t.resolve(i.result)}),i.addEventListener("error",function(){t.reject(i.error)}),i.readAsText(e),t.promise}function insertNamespaces(e){var t,i,r,n={xsi:"http://www.w3.org/2001/XMLSchema-instance"};for(var a in n)n.hasOwnProperty(a)&&(r="xmlns:"+a+"=",RegExp("[< ]"+a+":").test(e)&&-1===e.indexOf(r)&&(defined(t)||(t=e.substr(0,e.indexOf("<kml")+4),i=e.substr(t.length)),t+=" "+r+'"'+n[a]+'"'));return defined(t)&&(e=t+i),e}function removeDuplicateNamespaces(e){for(var t,i,r,n=e.indexOf("xmlns:"),a=e.indexOf(">",n);-1!==n&&n<a;)t=e.slice(n,e.indexOf('"',n)),i=n,n=-1!==(n=e.indexOf(t,n+1))?(r=e.indexOf('"',e.indexOf('"',n)+1),(e=e.slice(0,n-1)+e.slice(r+1,e.length)).indexOf("xmlns:",i-1)):e.indexOf("xmlns:",i+1);return e}function loadXmlFromZip(e,t,i){e.getData(new zip.TextWriter,function(e){e=removeDuplicateNamespaces(e=insertNamespaces(e)),t.kml=parser.parseFromString(e,"application/xml"),i.resolve()})}function loadDataUriFromZip(t,i,r){var e=defaultValue(MimeTypes.detectFromFilename(t.filename),"application/octet-stream");t.getData(new zip.Data64URIWriter(e),function(e){i[t.filename]=e,r.resolve()})}function embedDataUris(e,t,i,r){for(var n=r.keys,a=new URI("."),o=e.querySelectorAll(t),s=0;s<o.length;s++){var l,c=o[s],u=new URI(c.getAttribute(i)).resolve(a).toString(),d=n.indexOf(u);-1!==d&&(l=n[d],c.setAttribute(i,r[l]),"a"===t&&null===c.getAttribute("download")&&c.setAttribute("download",l))}}function applyBasePath(e,t,i,r){for(var n=e.querySelectorAll(t),a=0;a<n.length;a++){var o=n[a],s=resolveHref(o.getAttribute(i),r);o.setAttribute(i,s.url)}}function createEntity(e,t,i){var r=defined(r=queryStringAttribute(e,"id"))&&0!==r.length?r:createGuid();defined(i)&&(r=i+r);var n=t.getById(r);return defined(n)&&(r=createGuid(),defined(i)&&(r=i+r)),defined((n=t.add(new Entity({id:r}))).kml)||(n.addProperty("kml"),n.kml=new KmlFeatureData),n}function isExtrudable(e,t){return"absolute"===e||"relativeToGround"===e||"relativeToSeaFloor"===t}function readCoordinate(e,t){if(!defined(e))return Cartesian3.fromDegrees(0,0,0,t);var i=e.match(/[^\s,\n]+/g);if(!defined(i))return Cartesian3.fromDegrees(0,0,0,t);var r=parseFloat(i[0]),n=parseFloat(i[1]),a=parseFloat(i[2]),r=isNaN(r)?0:r,n=isNaN(n)?0:n,a=isNaN(a)?0:a;return Cartesian3.fromDegrees(r,n,a,t)}function readCoordinates(e,t){if(defined(e)){var i=e.textContent.match(/[^\s\n]+/g);if(defined(i)){for(var r=i.length,n=new Array(r),a=0,o=0;o<r;o++)n[a++]=readCoordinate(i[o],t);return n}}}function queryNumericAttribute(e,t){if(defined(e)){var i=e.getAttribute(t);if(null!==i){var r=parseFloat(i);return isNaN(r)?void 0:r}}}function queryStringAttribute(e,t){if(defined(e)){var i=e.getAttribute(t);return null!==i?i:void 0}}function queryFirstNode(e,t,i){if(defined(e))for(var r=e.childNodes,n=r.length,a=0;a<n;a++){var o=r[a];if(o.localName===t&&-1!==i.indexOf(o.namespaceURI))return o}}function queryNodes(e,t,i){if(defined(e)){for(var r=[],n=e.getElementsByTagNameNS("*",t),a=n.length,o=0;o<a;o++){var s=n[o];s.localName===t&&-1!==i.indexOf(s.namespaceURI)&&r.push(s)}return r}}function queryChildNodes(e,t,i){if(!defined(e))return[];for(var r=[],n=e.childNodes,a=n.length,o=0;o<a;o++){var s=n[o];s.localName===t&&-1!==i.indexOf(s.namespaceURI)&&r.push(s)}return r}function queryNumericValue(e,t,i){var r=queryFirstNode(e,t,i);if(defined(r)){var n=parseFloat(r.textContent);return isNaN(n)?void 0:n}}function queryStringValue(e,t,i){var r=queryFirstNode(e,t,i);if(defined(r))return r.textContent.trim()}function queryBooleanValue(e,t,i){var r=queryFirstNode(e,t,i);if(defined(r)){var n=r.textContent.trim();return"1"===n||/^true$/i.test(n)}}function resolveHref(e,t,i){var r,n,a;if(defined(e))return defined(i)&&(defined(a=i[e=e.replace(/\\/g,"/")])?r=new Resource({url:a}):(n=new URI(t.getUrlComponent()),defined(a=i[new URI(e).resolve(n)])&&(r=new Resource({url:a})))),defined(r)||(r=t.getDerivedResource({url:e})),r}Object.defineProperties(DeferredLoading.prototype,{dataSource:{get:function(){return this._dataSource}}}),DeferredLoading.prototype.addNodes=function(e,t){this._stack.push({nodes:e,index:0,processingData:t}),this._used=!0},DeferredLoading.prototype.addPromise=function(e){this._promises.push(e)},DeferredLoading.prototype.wait=function(){var e=this._deferred;return this._used||e.resolve(),when.join(e.promise,when.all(this._promises))},DeferredLoading.prototype.process=function(){var e=1===this._stack.length;return e&&(this._started=KmlDataSource._getTimestamp()),this._process(e)},DeferredLoading.prototype._giveUpTime=function(){var e;this._timeoutSet||(this._timeoutSet=!0,this._timeThreshold=50,e=this,setTimeout(function(){e._timeoutSet=!1,e._started=KmlDataSource._getTimestamp(),e._process(!0)},0))},DeferredLoading.prototype._nextNode=function(){var e=this._stack,t=e[e.length-1],i=t.index,r=t.nodes;if(i!==r.length)return++t.index,r[i]},DeferredLoading.prototype._pop=function(){var e=this._stack;return e.pop(),0!==e.length||(this._deferred.resolve(),!1)},DeferredLoading.prototype._process=function(e){for(var t=this.dataSource,i=this._stack[this._stack.length-1].processingData,r=this._nextNode();defined(r);){var n=featureTypes[r.localName];if(defined(n)&&(-1!==namespaces.kml.indexOf(r.namespaceURI)||-1!==namespaces.gx.indexOf(r.namespaceURI))&&(n(t,r,i,this),this._timeoutSet||KmlDataSource._getTimestamp()>this._started+this._timeThreshold))return void this._giveUpTime();r=this._nextNode()}this._pop()&&e&&this._process(!0)};var colorOptions={maximumRed:void 0,red:void 0,maximumGreen:void 0,green:void 0,maximumBlue:void 0,blue:void 0};function parseColorString(e,t){if(defined(e)&&!/^\s*$/gm.test(e)){"#"===e[0]&&(e=e.substring(1));var i=parseInt(e.substring(0,2),16)/255,r=parseInt(e.substring(2,4),16)/255,n=parseInt(e.substring(4,6),16)/255,a=parseInt(e.substring(6,8),16)/255;return t?(0<a?(colorOptions.maximumRed=a,colorOptions.red=void 0):(colorOptions.maximumRed=void 0,colorOptions.red=0),0<n?(colorOptions.maximumGreen=n,colorOptions.green=void 0):(colorOptions.maximumGreen=void 0,colorOptions.green=0),0<r?(colorOptions.maximumBlue=r,colorOptions.blue=void 0):(colorOptions.maximumBlue=void 0,colorOptions.blue=0),colorOptions.alpha=i,Color.fromRandom(colorOptions)):new Color(a,n,r,i)}}function queryColorValue(e,t,i){var r=queryStringValue(e,t,i);if(defined(r))return parseColorString(r,"random"===queryStringValue(e,"colorMode",i))}function processTimeStamp(e){var t=queryFirstNode(e,"TimeStamp",namespaces.kmlgx),i=queryStringValue(t,"when",namespaces.kmlgx);if(defined(t)&&defined(i)&&0!==i.length){var r=JulianDate.fromIso8601(i),n=new TimeIntervalCollection;return n.addInterval(new TimeInterval({start:r,stop:Iso8601.MAXIMUM_VALUE})),n}}function processTimeSpan(e){var t=queryFirstNode(e,"TimeSpan",namespaces.kmlgx);if(defined(t)){var i,r,n=queryFirstNode(t,"begin",namespaces.kmlgx),a=defined(n)?JulianDate.fromIso8601(n.textContent):void 0,o=queryFirstNode(t,"end",namespaces.kmlgx),s=defined(o)?JulianDate.fromIso8601(o.textContent):void 0;return defined(a)&&defined(s)?(JulianDate.lessThan(s,a)&&(r=a,a=s,s=r),(i=new TimeIntervalCollection).addInterval(new TimeInterval({start:a,stop:s}))):defined(a)?(i=new TimeIntervalCollection).addInterval(new TimeInterval({start:a,stop:Iso8601.MAXIMUM_VALUE})):defined(s)&&(i=new TimeIntervalCollection).addInterval(new TimeInterval({start:Iso8601.MINIMUM_VALUE,stop:s})),i}}function createDefaultBillboard(){var e=new BillboardGraphics;return e.width=BILLBOARD_SIZE,e.height=BILLBOARD_SIZE,e.scaleByDistance=new NearFarScalar(BILLBOARD_NEAR_DISTANCE,BILLBOARD_NEAR_RATIO,BILLBOARD_FAR_DISTANCE,BILLBOARD_FAR_RATIO),e.pixelOffsetScaleByDistance=new NearFarScalar(BILLBOARD_NEAR_DISTANCE,BILLBOARD_NEAR_RATIO,BILLBOARD_FAR_DISTANCE,BILLBOARD_FAR_RATIO),e}function createDefaultPolygon(){var e=new PolygonGraphics;return e.outline=!0,e.outlineColor=Color.WHITE,e}function createDefaultLabel(){var e=new LabelGraphics;return e.translucencyByDistance=new NearFarScalar(3e6,1,5e6,0),e.pixelOffset=new Cartesian2(17,0),e.horizontalOrigin=HorizontalOrigin$1.LEFT,e.font="16px sans-serif",e.style=LabelStyle$1.FILL_AND_OUTLINE,e}function getIconHref(e,t,i,r,n){var a,o,s,l=queryStringValue(e,"href",namespaces.kml);if(defined(l)&&0!==l.length){0===l.indexOf("root://icons/palette-")&&(a=l.charAt(21),o=defaultValue(queryNumericValue(e,"x",namespaces.gx),0),s=defaultValue(queryNumericValue(e,"y",namespaces.gx),0),o=Math.min(o/32,7),l="https://maps.google.com/mapfiles/kml/pal"+a+"/icon"+(8*(s=7-Math.min(s/32,7))+o)+".png");var c=resolveHref(l,i,r);if(n){var u=queryStringValue(e,"refreshMode",namespaces.kml),d=queryStringValue(e,"viewRefreshMode",namespaces.kml);"onInterval"===u||"onExpire"===u?oneTimeWarning("kml-refreshMode-"+u,"KML - Unsupported Icon refreshMode: "+u):"onStop"!==d&&"onRegion"!==d||oneTimeWarning("kml-refreshMode-"+d,"KML - Unsupported Icon viewRefreshMode: "+d);var h=defaultValue(queryStringValue(e,"viewBoundScale",namespaces.kml),1),p="onStop"===d?"BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]":"",m=defaultValue(queryStringValue(e,"viewFormat",namespaces.kml),p),f=queryStringValue(e,"httpQuery",namespaces.kml);defined(m)&&c.setQueryParameters(queryToObject(cleanupString(m))),defined(f)&&c.setQueryParameters(queryToObject(cleanupString(f)));var g=t._ellipsoid;return processNetworkLinkQueryString(c,t._camera,t._canvas,h,t._lastCameraView.bbox,g),c}return c}}function processBillboardIcon(e,t,i,r,n){var a=queryNumericValue(t,"scale",namespaces.kml),o=queryNumericValue(t,"heading",namespaces.kml),s=queryColorValue(t,"color",namespaces.kml),l=queryFirstNode(t,"Icon",namespaces.kml),c=getIconHref(l,e,r,n,!1);defined(l)&&!defined(c)&&(c=!1);var u,d,h=queryNumericValue(l,"x",namespaces.gx),p=queryNumericValue(l,"y",namespaces.gx),m=queryNumericValue(l,"w",namespaces.gx),f=queryNumericValue(l,"h",namespaces.gx),g=queryFirstNode(t,"hotSpot",namespaces.kml),_=queryNumericAttribute(g,"x"),y=queryNumericAttribute(g,"y"),v=queryStringAttribute(g,"xunits"),C=queryStringAttribute(g,"yunits"),S=i.billboard;defined(S)||(S=createDefaultBillboard(),i.billboard=S),S.image=c,S.scale=a,S.color=s,(defined(h)||defined(p)||defined(m)||defined(f))&&(S.imageSubRegion=new BoundingRectangle(h,p,m,f)),defined(o)&&0!==o&&(S.rotation=CesiumMath.toRadians(-o),S.alignedAxis=Cartesian3.UNIT_Z),a=defaultValue(a,1),defined(_)&&("pixels"===v?u=-_*a:"insetPixels"===v?u=(_-BILLBOARD_SIZE)*a:"fraction"===v&&(u=-_*BILLBOARD_SIZE*a),u+=.5*BILLBOARD_SIZE*a),defined(y)&&("pixels"===C?d=y*a:"insetPixels"===C?d=(-y+BILLBOARD_SIZE)*a:"fraction"===C&&(d=y*BILLBOARD_SIZE*a),d-=.5*BILLBOARD_SIZE*a),(defined(u)||defined(d))&&(S.pixelOffset=new Cartesian2(u,d))}function applyStyle(e,t,i,r,n){for(var a=0,o=t.childNodes.length;a<o;a++){var s,l,c,u,d,h,p,m=t.childNodes.item(a);"IconStyle"===m.localName?processBillboardIcon(e,m,i,r,n):"LabelStyle"===m.localName?(defined(s=i.label)||(s=createDefaultLabel(),i.label=s),s.scale=defaultValue(queryNumericValue(m,"scale",namespaces.kml),s.scale),s.fillColor=defaultValue(queryColorValue(m,"color",namespaces.kml),s.fillColor),s.text=i.name):"LineStyle"===m.localName?(defined(l=i.polyline)||(l=new PolylineGraphics,i.polyline=l),l.width=queryNumericValue(m,"width",namespaces.kml),l.material=queryColorValue(m,"color",namespaces.kml),defined(queryColorValue(m,"outerColor",namespaces.gx))&&oneTimeWarning("kml-gx:outerColor","KML - gx:outerColor is not supported in a LineStyle"),defined(queryNumericValue(m,"outerWidth",namespaces.gx))&&oneTimeWarning("kml-gx:outerWidth","KML - gx:outerWidth is not supported in a LineStyle"),defined(queryNumericValue(m,"physicalWidth",namespaces.gx))&&oneTimeWarning("kml-gx:physicalWidth","KML - gx:physicalWidth is not supported in a LineStyle"),defined(queryBooleanValue(m,"labelVisibility",namespaces.gx))&&oneTimeWarning("kml-gx:labelVisibility","KML - gx:labelVisibility is not supported in a LineStyle")):"PolyStyle"===m.localName?(defined(c=i.polygon)||(c=createDefaultPolygon(),i.polygon=c),c.material=defaultValue(queryColorValue(m,"color",namespaces.kml),c.material),c.fill=defaultValue(queryBooleanValue(m,"fill",namespaces.kml),c.fill),c.outline=defaultValue(queryBooleanValue(m,"outline",namespaces.kml),c.outline)):"BalloonStyle"===m.localName?(u=defaultValue(parseColorString(queryStringValue(m,"bgColor",namespaces.kml)),Color.WHITE),d=defaultValue(parseColorString(queryStringValue(m,"textColor",namespaces.kml)),Color.BLACK),h=queryStringValue(m,"text",namespaces.kml),i.addProperty("balloonStyle"),i.balloonStyle={bgColor:u,textColor:d,text:h}):"ListStyle"===m.localName&&("radioFolder"!==(p=queryStringValue(m,"listItemType",namespaces.kml))&&"checkOffOnly"!==p||oneTimeWarning("kml-listStyle-"+p,"KML - Unsupported ListStyle with listItemType: "+p))}}function computeFinalStyle(e,t,i,r,n){for(var a,o=new Entity,s=-1,l=t.childNodes,c=l.length,u=0;u<c;u++){var d=l[u];"Style"!==d.localName&&"StyleMap"!==d.localName||(s=u)}if(-1!==s){var h=l[s];if("Style"===h.localName)applyStyle(e,h,o,r,n);else for(var p=queryChildNodes(h,"Pair",namespaces.kml),m=0;m<p.length;m++){var f,g=p[m],_=queryStringValue(g,"key",namespaces.kml);"normal"===_?defined(f=queryStringValue(g,"styleUrl",namespaces.kml))?(defined(a=i.getById(f))||(a=i.getById("#"+f)),defined(a)&&o.merge(a)):applyStyle(e,queryFirstNode(g,"Style",namespaces.kml),o,r,n):oneTimeWarning("kml-styleMap-"+_,"KML - Unsupported StyleMap key: "+_)}}var y,v,C,S=queryStringValue(t,"styleUrl",namespaces.kml);return defined(S)&&("#"!==(C=S)[0]&&-1!==S.indexOf("#")&&(v=(y=S.split("#"))[0],C=r.getDerivedResource({url:v}).getUrlComponent()+"#"+y[1]),defined(a=i.getById(C))||(a=i.getById("#"+C)),defined(a)&&o.merge(a)),o}function processExternalStyles(t,i,r){return i.fetchXML().then(function(e){return processStyles(t,e,r,i,!0)})}function processStyles(e,t,i,r,n,a){var o,s,l=queryNodes(t,"Style",namespaces.kml);if(defined(l))for(var c=l.length,u=0;u<c;u++)defined(y=queryStringAttribute(s=l[u],"id"))&&(y="#"+y,n&&defined(r)&&(y=r.getUrlComponent()+y),defined(i.getById(y))||(o=new Entity({id:y}),i.add(o),applyStyle(e,s,o,r,a)));var d=queryNodes(t,"StyleMap",namespaces.kml);if(defined(d)){var h=d.length;for(u=0;u<h;u++){var p=d[u];if(defined(y=queryStringAttribute(p,"id")))for(var m=queryChildNodes(p,"Pair",namespaces.kml),f=0;f<m.length;f++){var g,_,y,v=m[f],C=queryStringValue(v,"key",namespaces.kml);"normal"===C?(y="#"+y,n&&defined(r)&&(y=r.getUrlComponent()+y),defined(i.getById(y))||(o=i.getOrCreateEntity(y),defined(g=queryStringValue(v,"styleUrl",namespaces.kml))?("#"!==g[0]&&(g="#"+g),n&&defined(r)&&(g=r.getUrlComponent()+g),defined(_=i.getById(g))&&o.merge(_)):applyStyle(e,s=queryFirstNode(v,"Style",namespaces.kml),o,r,a))):oneTimeWarning("kml-styleMap-"+C,"KML - Unsupported StyleMap key: "+C)}}}var S=[],T=t.getElementsByTagName("styleUrl"),x=T.length;for(u=0;u<x;u++){var b,E,P,A=T[u].textContent;"#"===A[0]||2===(b=A.split("#")).length&&(E=b[0],P=r.getDerivedResource({url:E}),S.push(processExternalStyles(e,P,i)))}return S}function createDropLine(e,t,i){var r=new ReferenceProperty(e,t.id,["position"]),n=new ScaledPositionProperty(t.position);t.polyline=defined(i.polyline)?i.polyline.clone():new PolylineGraphics,t.polyline.positions=new PositionPropertyArray([r,n])}function heightReferenceFromAltitudeMode(e,t){return!defined(e)&&!defined(t)||"clampToGround"===e?HeightReference$1.CLAMP_TO_GROUND:"relativeToGround"===e?HeightReference$1.RELATIVE_TO_GROUND:"absolute"===e?HeightReference$1.NONE:"clampToSeaFloor"===t?(oneTimeWarning("kml-gx:altitudeMode-clampToSeaFloor","KML - <gx:altitudeMode>:clampToSeaFloor is currently not supported, using <kml:altitudeMode>:clampToGround."),HeightReference$1.CLAMP_TO_GROUND):"relativeToSeaFloor"===t?(oneTimeWarning("kml-gx:altitudeMode-relativeToSeaFloor","KML - <gx:altitudeMode>:relativeToSeaFloor is currently not supported, using <kml:altitudeMode>:relativeToGround."),HeightReference$1.RELATIVE_TO_GROUND):(defined(e)?oneTimeWarning("kml-altitudeMode-unknown","KML - Unknown <kml:altitudeMode>:"+e+", using <kml:altitudeMode>:CLAMP_TO_GROUND."):oneTimeWarning("kml-gx:altitudeMode-unknown","KML - Unknown <gx:altitudeMode>:"+t+", using <kml:altitudeMode>:CLAMP_TO_GROUND."),HeightReference$1.CLAMP_TO_GROUND)}function createPositionPropertyFromAltitudeMode(e,t,i){return"relativeToSeaFloor"===i||"absolute"===t||"relativeToGround"===t?e:((defined(t)&&"clampToGround"!==t||defined(i)&&"clampToSeaFloor"!==i)&&oneTimeWarning("kml-altitudeMode-unknown","KML - Unknown altitudeMode: "+defaultValue(t,i)),new ScaledPositionProperty(e))}function createPositionPropertyArrayFromAltitudeMode(e,t,i,r){if(defined(e)){if("relativeToSeaFloor"===i||"absolute"===t||"relativeToGround"===t)return e;(defined(t)&&"clampToGround"!==t||defined(i)&&"clampToSeaFloor"!==i)&&oneTimeWarning("kml-altitudeMode-unknown","KML - Unknown altitudeMode: "+defaultValue(t,i));for(var n=e.length,a=0;a<n;a++){var o=e[a];r.scaleToGeodeticSurface(o,o)}return e}}function processPositionGraphics(e,t,i,r){var n=t.label;defined(n)||(n=defined(i.label)?i.label.clone():createDefaultLabel(),t.label=n),n.text=t.name;var a=t.billboard;defined(a)||(a=defined(i.billboard)?i.billboard.clone():createDefaultBillboard(),t.billboard=a),defined(a.image)?a.image.getValue()||(a.image=void 0):a.image=e._pinBuilder.fromColor(Color.YELLOW,64);var o;defined(a.scale)&&(0!==(o=a.scale.getValue())?n.pixelOffset=new Cartesian2(16*o+1,0):(n.pixelOffset=void 0,n.horizontalOrigin=void 0)),defined(r)&&e._clampToGround&&(a.heightReference=r,n.heightReference=r)}function processPathGraphics(e,t){var i=e.path;defined(i)||((i=new PathGraphics).leadTime=0,e.path=i);var r=t.polyline;defined(r)&&(i.material=r.material,i.width=r.width)}function processPoint$2(e,t,i,r,n){var a=queryStringValue(i,"coordinates",namespaces.kml),o=queryStringValue(i,"altitudeMode",namespaces.kml),s=queryStringValue(i,"altitudeMode",namespaces.gx),l=queryBooleanValue(i,"extrude",namespaces.kml),c=readCoordinate(a,e._ellipsoid);return r.position=c,processPositionGraphics(e,r,n,heightReferenceFromAltitudeMode(o,s)),l&&isExtrudable(o,s)&&createDropLine(t,r,n),!0}function processLineStringOrLinearRing(e,t,i,r,n){var a,o,s,l=queryFirstNode(i,"coordinates",namespaces.kml),c=queryStringValue(i,"altitudeMode",namespaces.kml),u=queryStringValue(i,"altitudeMode",namespaces.gx),d=queryBooleanValue(i,"extrude",namespaces.kml),h=queryBooleanValue(i,"tessellate",namespaces.kml),p=isExtrudable(c,u),m=queryNumericValue(i,"drawOrder",namespaces.gx),f=e._ellipsoid,g=readCoordinates(l,f),_=n.polyline;return p&&d?(a=new WallGraphics,(r.wall=a).positions=g,defined(o=n.polygon)&&(a.fill=o.fill,a.material=o.material),a.outline=!0,defined(_)?(a.outlineColor=defined(_.material)?_.material.color:Color.WHITE,a.outlineWidth=_.width):defined(o)&&(a.outlineColor=defined(o.material)?o.material.color:Color.WHITE)):e._clampToGround&&!p&&h?((s=new PolylineGraphics).clampToGround=!0,(r.polyline=s).positions=g,defined(_)?(s.material=defined(_.material)?_.material.color.getValue(Iso8601.MINIMUM_VALUE):Color.WHITE,s.width=defaultValue(_.width,1)):(s.material=Color.WHITE,s.width=1),s.zIndex=m):(defined(m)&&oneTimeWarning("kml-gx:drawOrder","KML - gx:drawOrder is not supported in LineStrings when clampToGround is false"),e._clampToGround&&!h&&oneTimeWarning("kml-line-tesselate","Ignoring clampToGround for KML lines without the tessellate flag."),_=defined(_)?_.clone():new PolylineGraphics,(r.polyline=_).positions=createPositionPropertyArrayFromAltitudeMode(g,c,u,f),h&&!p||(_.arcType=ArcType$1.NONE)),!0}function processPolygon$2(e,t,i,r,n){var a=queryFirstNode(i,"outerBoundaryIs",namespaces.kml),o=queryFirstNode(a,"LinearRing",namespaces.kml),s=queryFirstNode(o,"coordinates",namespaces.kml),l=e._ellipsoid,c=readCoordinates(s,l),u=queryBooleanValue(i,"extrude",namespaces.kml),d=isExtrudable(queryStringValue(i,"altitudeMode",namespaces.kml),queryStringValue(i,"altitudeMode",namespaces.gx)),h=defined(n.polygon)?n.polygon.clone():createDefaultPolygon(),p=n.polyline;if(defined(p)&&(h.outlineColor=defined(p.material)?p.material.color:Color.WHITE,h.outlineWidth=p.width),r.polygon=h,d?(h.perPositionHeight=!0,h.extrudedHeight=u?0:void 0):e._clampToGround||(h.height=0),defined(c)){for(var m=new PolygonHierarchy(c),f=queryChildNodes(i,"innerBoundaryIs",namespaces.kml),g=0;g<f.length;g++){o=queryChildNodes(f[g],"LinearRing",namespaces.kml);for(var _=0;_<o.length;_++)defined(c=readCoordinates(queryFirstNode(o[_],"coordinates",namespaces.kml),l))&&m.holes.push(new PolygonHierarchy(c))}h.hierarchy=m}return!0}function processTrack(e,t,i,r,n){var a=queryStringValue(i,"altitudeMode",namespaces.kml),o=queryStringValue(i,"altitudeMode",namespaces.gx),s=queryChildNodes(i,"coord",namespaces.gx),l=queryChildNodes(i,"angles",namespaces.gx),c=queryChildNodes(i,"when",namespaces.kml),u=queryBooleanValue(i,"extrude",namespaces.kml),d=isExtrudable(a,o),h=e._ellipsoid;0<l.length&&oneTimeWarning("kml-gx:angles","KML - gx:angles are not supported in gx:Tracks");for(var p=Math.min(s.length,c.length),m=[],f=[],g=0;g<p;g++){var _=readCoordinate(s[g].textContent,h);m.push(_),f.push(JulianDate.fromIso8601(c[g].textContent))}var y=new SampledPositionProperty;return y.addSamples(f,m),r.position=y,processPositionGraphics(e,r,n,heightReferenceFromAltitudeMode(a,o)),processPathGraphics(r,n),r.availability=new TimeIntervalCollection,0<c.length&&r.availability.addInterval(new TimeInterval({start:f[0],stop:f[f.length-1]})),d&&u&&createDropLine(t,r,n),!0}function addToMultiTrack(e,t,i,r,n,a,o,s,l){var c=e[0],u=e[e.length-1],d=new SampledPositionProperty;d.addSamples(e,t),i.intervals.addInterval(new TimeInterval({start:c,stop:u,isStartIncluded:l,isStopIncluded:l,data:createPositionPropertyFromAltitudeMode(d,o,s)})),r.addInterval(new TimeInterval({start:c,stop:u,isStartIncluded:l,isStopIncluded:l})),n.intervals.addInterval(new TimeInterval({start:c,stop:u,isStartIncluded:l,isStopIncluded:l,data:a}))}function processMultiTrack(e,t,i,r,n){for(var a,o,s=queryBooleanValue(i,"interpolate",namespaces.gx),l=queryChildNodes(i,"Track",namespaces.gx),c=!1,u=new TimeIntervalCollectionProperty,d=new TimeIntervalCollection,h=new CompositePositionProperty,p=e._ellipsoid,m=0,f=l.length;m<f;m++){for(var g=l[m],_=queryChildNodes(g,"when",namespaces.kml),y=queryChildNodes(g,"coord",namespaces.gx),v=queryStringValue(g,"altitudeMode",namespaces.kml),C=queryStringValue(g,"altitudeMode",namespaces.gx),S=isExtrudable(v,C),T=queryBooleanValue(g,"extrude",namespaces.kml),x=Math.min(y.length,_.length),b=[],E=[],P=0;P<x;P++){var A=readCoordinate(y[P].textContent,p);b.push(A),E.push(JulianDate.fromIso8601(_[P].textContent))}s&&(defined(a)&&addToMultiTrack([a,E[0]],[o,b[0]],h,d,u,!1,"absolute",void 0,!1),a=E[x-1],o=b[b.length-1]),addToMultiTrack(E,b,h,d,u,S&&T,v,C,!0),c=c||S&&T}return r.availability=d,r.position=h,processPositionGraphics(e,r,n),processPathGraphics(r,n),c&&(createDropLine(t,r,n),r.polyline.show=u),!0}var geometryTypes$1={Point:processPoint$2,LineString:processLineStringOrLinearRing,LinearRing:processLineStringOrLinearRing,Polygon:processPolygon$2,Track:processTrack,MultiTrack:processMultiTrack,MultiGeometry:processMultiGeometry,Model:processUnsupportedGeometry},scratchDiv;function processMultiGeometry(e,t,i,r,n,a){for(var o=i.childNodes,s=!1,l=0,c=o.length;l<c;l++){var u,d=o.item(l),h=geometryTypes$1[d.localName];defined(h)&&((u=createEntity(d,t,a)).parent=r,u.name=r.name,u.availability=r.availability,u.description=r.description,u.kml=r.kml,h(e,t,d,u,n)&&(s=!0))}return s}function processUnsupportedGeometry(e,t,i,r,n){return oneTimeWarning("kml-unsupportedGeometry","KML - Unsupported geometry: "+i.localName),!1}function processExtendedData(e,t){var i=queryFirstNode(e,"ExtendedData",namespaces.kml);if(defined(i)){defined(queryFirstNode(i,"SchemaData",namespaces.kml))&&oneTimeWarning("kml-schemaData","KML - SchemaData is unsupported"),defined(queryStringAttribute(i,"xmlns:prefix"))&&oneTimeWarning("kml-extendedData","KML - ExtendedData with xmlns:prefix is unsupported");var r={},n=queryChildNodes(i,"Data",namespaces.kml);if(defined(n))for(var a=n.length,o=0;o<a;o++){var s=n[o],l=queryStringAttribute(s,"name");defined(l)&&(r[l]={displayName:queryStringValue(s,"displayName",namespaces.kml),value:queryStringValue(s,"value",namespaces.kml)})}t.kml.extendedData=r}}function processDescription$1(e,t,i,r,n){var a,o,s=t.kml,l=s.extendedData,c=queryStringValue(e,"description",namespaces.kml),u=defaultValue(t.balloonStyle,i.balloonStyle),d=Color.WHITE,h=Color.BLACK,p=c;if(defined(u)&&(d=defaultValue(u.bgColor,Color.WHITE),h=defaultValue(u.textColor,Color.BLACK),p=defaultValue(u.text,c)),defined(p)){if(p=(p=(p=(p=(p=(p=p.replace("$[name]",defaultValue(t.name,""))).replace("$[description]",defaultValue(c,""))).replace("$[address]",defaultValue(s.address,""))).replace("$[Snippet]",defaultValue(s.snippet,""))).replace("$[id]",t.id)).replace("$[geDirections]",""),defined(l)){var m=p.match(/\$\[.+?\]/g);if(null!==m)for(C=0;C<m.length;C++){var f,g=m[C],_=g.substr(2,g.length-3),y=/\/displayName$/.test(_);defined(f=l[_=_.replace(/\/displayName$/,"")])&&(f=y?f.displayName:f.value),defined(f)&&(p=p.replace(g,defaultValue(f,"")))}}}else if(defined(l)&&0<(o=Object.keys(l)).length){for(p='<table class="cesium-infoBox-defaultTable cesium-infoBox-defaultTable-lighter"><tbody>',C=0;C<o.length;C++)p+="<tr><th>"+defaultValue((f=l[a=o[C]]).displayName,a)+"</th><td>"+defaultValue(f.value,"")+"</td></tr>";p+="</tbody></table>"}if(defined(p)){p=autolinker.link(p),scratchDiv.innerHTML=p;for(var v=scratchDiv.querySelectorAll("a"),C=0;C<v.length;C++)v[C].setAttribute("target","_blank");defined(r)&&1<r.keys.length&&(embedDataUris(scratchDiv,"a","href",r),embedDataUris(scratchDiv,"img","src",r)),applyBasePath(scratchDiv,"a","href",n),applyBasePath(scratchDiv,"img","src",n);var S='<div class="cesium-infoBox-description-lighter" style="';S+="overflow:auto;",S+="word-wrap:break-word;",S+="background-color:"+d.toCssColorString()+";",S+="color:"+h.toCssColorString()+";",S+='">',S+=scratchDiv.innerHTML+"</div>",scratchDiv.innerHTML="",t.description=S}}function processFeature$1(e,t,i){var r=i.entityCollection,n=i.parentEntity,a=i.sourceResource,o=i.uriResolver,s=createEntity(t,r,i.context),l=s.kml,c=computeFinalStyle(e,t,i.styleCollection,a,o),u=queryStringValue(t,"name",namespaces.kml);s.name=u,s.parent=n;var d=processTimeSpan(t);defined(d)||(d=processTimeStamp(t)),s.availability=d,mergeAvailabilityWithParent(s);var h=queryBooleanValue(t,"visibility",namespaces.kml);s.show=function e(t){return!t||t.show&&e(t.parent)}(n)&&defaultValue(h,!0);var p=queryFirstNode(t,"author",namespaces.atom),m=l.author;m.name=queryStringValue(p,"name",namespaces.atom),m.uri=queryStringValue(p,"uri",namespaces.atom),m.email=queryStringValue(p,"email",namespaces.atom);var f=queryFirstNode(t,"link",namespaces.atom),g=l.link;g.href=queryStringAttribute(f,"href"),g.hreflang=queryStringAttribute(f,"hreflang"),g.rel=queryStringAttribute(f,"rel"),g.type=queryStringAttribute(f,"type"),g.title=queryStringAttribute(f,"title"),g.length=queryStringAttribute(f,"length"),l.address=queryStringValue(t,"address",namespaces.kml),l.phoneNumber=queryStringValue(t,"phoneNumber",namespaces.kml),l.snippet=queryStringValue(t,"Snippet",namespaces.kml),processExtendedData(t,s),processDescription$1(t,s,c,o,a);var _=e._ellipsoid;return processLookAt(t,s,_),processCamera(t,s,_),defined(queryFirstNode(t,"Region",namespaces.kml))&&oneTimeWarning("kml-region","KML - Placemark Regions are unsupported"),{entity:s,styleEntity:c}}function processDocument$1(e,t,i,r){r.addNodes(t.childNodes,i),r.process()}function processFolder(e,t,i,r){var n=processFeature$1(e,t,i),a=clone(i);a.parentEntity=n.entity,processDocument$1(e,t,a,r)}function processPlacemark(e,t,i,r){for(var n=processFeature$1(e,t,i),a=n.entity,o=n.styleEntity,s=!1,l=t.childNodes,c=0,u=l.length;c<u&&!s;c++){var d=l.item(c),h=geometryTypes$1[d.localName];defined(h)&&(h(e,i.entityCollection,d,a,o,a.id),s=!0)}s||(a.merge(o),processPositionGraphics(e,a,o))}"undefined"!=typeof document&&(scratchDiv=document.createElement("div"));var playlistNodeProcessors={FlyTo:processTourFlyTo,Wait:processTourWait,SoundCue:processTourUnsupportedNode,AnimatedUpdate:processTourUnsupportedNode,TourControl:processTourUnsupportedNode};function processTour(e,t,i,r){var n=new KmlTour(queryStringValue(t,"name",namespaces.kml),queryStringAttribute(t,"id")),a=queryFirstNode(t,"Playlist",namespaces.gx);if(a)for(var o=e._ellipsoid,s=a.childNodes,l=0;l<s.length;l++){var c,u=s[l];u.localName&&((c=playlistNodeProcessors[u.localName])?c(n,u,o):console.log("Unknown KML Tour playlist entry type "+u.localName))}defined(e.kmlTours)||(e.kmlTours=[]),e.kmlTours.push(n)}function processTourUnsupportedNode(e,t){oneTimeWarning("KML Tour unsupported node "+t.localName)}function processTourWait(e,t){var i=queryNumericValue(t,"duration",namespaces.gx);e.addPlaylistEntry(new KmlTourWait(i))}function processTourFlyTo(e,t,i){var r=queryNumericValue(t,"duration",namespaces.gx),n=queryStringValue(t,"flyToMode",namespaces.gx),a={kml:{}};processLookAt(t,a,i),processCamera(t,a,i);var o=new KmlTourFlyTo(r,n,a.kml.lookAt||a.kml.camera);e.addPlaylistEntry(o)}function processCamera(e,t,i){var r,n,a,o,s,l,c,u,d=queryFirstNode(e,"Camera",namespaces.kml);defined(d)&&(r=defaultValue(queryNumericValue(d,"longitude",namespaces.kml),0),n=defaultValue(queryNumericValue(d,"latitude",namespaces.kml),0),a=defaultValue(queryNumericValue(d,"altitude",namespaces.kml),0),o=defaultValue(queryNumericValue(d,"heading",namespaces.kml),0),s=defaultValue(queryNumericValue(d,"tilt",namespaces.kml),0),l=defaultValue(queryNumericValue(d,"roll",namespaces.kml),0),c=Cartesian3.fromDegrees(r,n,a,i),u=HeadingPitchRoll.fromDegrees(o,s-90,l),t.kml.camera=new KmlCamera(c,u))}function processLookAt(e,t,i){var r,n,a,o,s,l,c,u,d=queryFirstNode(e,"LookAt",namespaces.kml);defined(d)&&(r=defaultValue(queryNumericValue(d,"longitude",namespaces.kml),0),n=defaultValue(queryNumericValue(d,"latitude",namespaces.kml),0),a=defaultValue(queryNumericValue(d,"altitude",namespaces.kml),0),l=queryNumericValue(d,"heading",namespaces.kml),s=queryNumericValue(d,"tilt",namespaces.kml),o=defaultValue(queryNumericValue(d,"range",namespaces.kml),0),s=CesiumMath.toRadians(defaultValue(s,0)),c=new HeadingPitchRange(l=CesiumMath.toRadians(defaultValue(l,0)),s-CesiumMath.PI_OVER_TWO,o),u=Cartesian3.fromDegrees(r,n,a,i),t.kml.lookAt=new KmlLookAt(u,c))}function processGroundOverlay(e,t,i,r){var n,a,o,s,l,c,u,d,h=processFeature$1(e,t,i).entity,p=!1,m=e._ellipsoid,f=readCoordinates(queryFirstNode(t,"LatLonQuad",namespaces.gx),m),g=queryNumericValue(t,"drawOrder",namespaces.kml);defined(f)?((n=createDefaultPolygon()).hierarchy=new PolygonHierarchy(f),n.zIndex=g,h.polygon=n,p=!0):((n=new RectangleGraphics).zIndex=g,h.rectangle=n,defined(a=queryFirstNode(t,"LatLonBox",namespaces.kml))&&(o=queryNumericValue(a,"west",namespaces.kml),s=queryNumericValue(a,"south",namespaces.kml),l=queryNumericValue(a,"east",namespaces.kml),c=queryNumericValue(a,"north",namespaces.kml),defined(o)&&(o=CesiumMath.negativePiToPi(CesiumMath.toRadians(o))),defined(s)&&(s=CesiumMath.clampToLatitudeRange(CesiumMath.toRadians(s))),defined(l)&&(l=CesiumMath.negativePiToPi(CesiumMath.toRadians(l))),defined(c)&&(c=CesiumMath.clampToLatitudeRange(CesiumMath.toRadians(c))),n.coordinates=new Rectangle(o,s,l,c),defined(u=queryNumericValue(a,"rotation",namespaces.kml))&&(d=CesiumMath.toRadians(u),n.rotation=d,n.stRotation=d)));var _,y,v,C,S=queryFirstNode(t,"Icon",namespaces.kml),T=getIconHref(S,e,i.sourceResource,i.uriResolver,!0);defined(T)?(p&&oneTimeWarning("kml-gx:LatLonQuad","KML - gx:LatLonQuad Icon does not support texture projection."),_=queryNumericValue(S,"x",namespaces.gx),y=queryNumericValue(S,"y",namespaces.gx),v=queryNumericValue(S,"w",namespaces.gx),C=queryNumericValue(S,"h",namespaces.gx),(defined(_)||defined(y)||defined(v)||defined(C))&&oneTimeWarning("kml-groundOverlay-xywh","KML - gx:x, gx:y, gx:w, gx:h aren't supported for GroundOverlays"),n.material=T,n.material.color=queryColorValue(t,"color",namespaces.kml),n.material.transparent=!0):n.material=queryColorValue(t,"color",namespaces.kml);var x=queryStringValue(t,"altitudeMode",namespaces.kml);defined(x)?"absolute"===x?(n.height=queryNumericValue(t,"altitude",namespaces.kml),n.zIndex=void 0):"clampToGround"!==x&&oneTimeWarning("kml-altitudeMode-unknown","KML - Unknown altitudeMode: "+x):"relativeToSeaFloor"===(x=queryStringValue(t,"altitudeMode",namespaces.gx))?(oneTimeWarning("kml-altitudeMode-relativeToSeaFloor","KML - altitudeMode relativeToSeaFloor is currently not supported, treating as absolute."),n.height=queryNumericValue(t,"altitude",namespaces.kml),n.zIndex=void 0):"clampToSeaFloor"===x?oneTimeWarning("kml-altitudeMode-clampToSeaFloor","KML - altitudeMode clampToSeaFloor is currently not supported, treating as clampToGround."):defined(x)&&oneTimeWarning("kml-altitudeMode-unknown","KML - Unknown altitudeMode: "+x)}function processUnsupportedFeature(e,t,i,r){e._unsupportedNode.raiseEvent(e,i.parentEntity,t,i.entityCollection,i.styleCollection,i.sourceResource,i.uriResolver),oneTimeWarning("kml-unsupportedFeature-"+t.nodeName,"KML - Unsupported feature: "+t.nodeName)}var RefreshMode={INTERVAL:0,EXPIRE:1,STOP:2};function cleanupString(e){if(!defined(e)||0===e.length)return"";var t=e[0];return"&"!==t&&"?"!==t||(e=e.substring(1)),e}var zeroRectangle=new Rectangle,scratchCartographic$9=new Cartographic,scratchCartesian2$9=new Cartesian2,scratchCartesian3$a=new Cartesian3;function processNetworkLinkQueryString(e,t,i,r,n,a){function o(e){return e<-CesiumMath.PI_OVER_TWO?-CesiumMath.PI_OVER_TWO:e>CesiumMath.PI_OVER_TWO?CesiumMath.PI_OVER_TWO:e}function s(e){return e>CesiumMath.PI?e-CesiumMath.TWO_PI:e<-CesiumMath.PI?e+CesiumMath.TWO_PI:e}var l,c,u,d,h,p,m,f,g,_,y,v=objectToQuery(e.queryParameters);v=v.replace(/%5B/g,"[").replace(/%5D/g,"]"),v=defined(t)&&t._mode!==SceneMode$1.MORPHING?(n=defaultValue(n,zeroRectangle),defined(i)&&(scratchCartesian2$9.x=.5*i.clientWidth,scratchCartesian2$9.y=.5*i.clientHeight,l=t.pickEllipsoid(scratchCartesian2$9,a,scratchCartesian3$a)),defined(l)?c=a.cartesianToCartographic(l,scratchCartographic$9):(c=Rectangle.center(n,scratchCartographic$9),l=a.cartographicToCartesian(c)),defined(r)&&!CesiumMath.equalsEpsilon(r,1,CesiumMath.EPSILON9)&&(u=n.width*r*.5,d=n.height*r*.5,n=new Rectangle(s(c.longitude-u),o(c.latitude-d),s(c.longitude+u),o(c.latitude+d))),v=(v=(v=(v=v.replace("[bboxWest]",CesiumMath.toDegrees(n.west).toString())).replace("[bboxSouth]",CesiumMath.toDegrees(n.south).toString())).replace("[bboxEast]",CesiumMath.toDegrees(n.east).toString())).replace("[bboxNorth]",CesiumMath.toDegrees(n.north).toString()),h=CesiumMath.toDegrees(c.longitude).toString(),p=CesiumMath.toDegrees(c.latitude).toString(),v=(v=(v=(v=(v=(v=(v=(v=v.replace("[lookatLon]",h)).replace("[lookatLat]",p)).replace("[lookatTilt]",CesiumMath.toDegrees(t.pitch).toString())).replace("[lookatHeading]",CesiumMath.toDegrees(t.heading).toString())).replace("[lookatRange]",Cartesian3.distance(t.positionWC,l))).replace("[lookatTerrainLon]",h)).replace("[lookatTerrainLat]",p)).replace("[lookatTerrainAlt]",c.height.toString()),a.cartesianToCartographic(t.positionWC,scratchCartographic$9),v=(v=(v=v.replace("[cameraLon]",CesiumMath.toDegrees(scratchCartographic$9.longitude).toString())).replace("[cameraLat]",CesiumMath.toDegrees(scratchCartographic$9.latitude).toString())).replace("[cameraAlt]",CesiumMath.toDegrees(scratchCartographic$9.height).toString()),_=g="",defined(f=(m=t.frustum).aspectRatio)&&(y=CesiumMath.toDegrees(m.fov),1<f?_=(g=y)/f:g=(_=y)*f),(v=v.replace("[horizFov]",g.toString())).replace("[vertFov]",_.toString())):(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=(v=v.replace("[bboxWest]","-180")).replace("[bboxSouth]","-90")).replace("[bboxEast]","180")).replace("[bboxNorth]","90")).replace("[lookatLon]","")).replace("[lookatLat]","")).replace("[lookatRange]","")).replace("[lookatTilt]","")).replace("[lookatHeading]","")).replace("[lookatTerrainLon]","")).replace("[lookatTerrainLat]","")).replace("[lookatTerrainAlt]","")).replace("[cameraLon]","")).replace("[cameraLat]","")).replace("[cameraAlt]","")).replace("[horizFov]","")).replace("[vertFov]",""),v=(v=(v=(v=(v=(v=defined(i)?(v=v.replace("[horizPixels]",i.clientWidth)).replace("[vertPixels]",i.clientHeight):(v=v.replace("[horizPixels]","")).replace("[vertPixels]","")).replace("[terrainEnabled]","1")).replace("[clientVersion]","1")).replace("[kmlVersion]","2.2")).replace("[clientName]","Cesium")).replace("[language]","English"),e.setQueryParameters(queryToObject(v))}function processNetworkLink(f,e,t,i){var g,_,r,n,a,o,s,y,l,v,c,C=processFeature$1(f,e,t).entity,u=t.sourceResource,d=t.uriResolver,S=queryFirstNode(e,"Link",namespaces.kml);defined(S)||(S=queryFirstNode(e,"Url",namespaces.kml)),!defined(S)||defined(y=queryStringValue(S,"href",namespaces.kml))&&(y=resolveHref(r=y,u,t.uriResolver),/^data:/.test(y.getUrlComponent())?/\.kmz/i.test(u.getUrlComponent())||(r=u.getDerivedResource({url:r})):(r=y.clone(),g=queryStringValue(S,"viewRefreshMode",namespaces.kml),_=defaultValue(queryStringValue(S,"viewBoundScale",namespaces.kml),1),n="onStop"===g?"BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]":"",a=defaultValue(queryStringValue(S,"viewFormat",namespaces.kml),n),o=queryStringValue(S,"httpQuery",namespaces.kml),defined(a)&&y.setQueryParameters(queryToObject(cleanupString(a))),defined(o)&&y.setQueryParameters(queryToObject(cleanupString(o))),s=f._ellipsoid,processNetworkLinkQueryString(y,f._camera,f._canvas,_,f._lastCameraView.bbox,s)),l={sourceUri:r,uriResolver:d,context:C.id},v=new EntityCollection,c=load$2(f,v,y,l).then(function(e){var t=f._entityCollection,i=v.values;t.suspendEvents();for(var r=0;r<i.length;r++){var n=i[r];defined(n.parent)||(n.parent=C,mergeAvailabilityWithParent(n)),t.add(n)}t.resumeEvents();var a=queryStringValue(S,"refreshMode",namespaces.kml),o=defaultValue(queryNumericValue(S,"refreshInterval",namespaces.kml),0);if("onInterval"===a&&0<o||"onExpire"===a||"onStop"===g){var s,l=queryFirstNode(e,"NetworkLinkControl",namespaces.kml),c=defined(l),u=JulianDate.now(),d={id:createGuid(),href:y,cookie:{},lastUpdated:u,updating:!1,entity:C,viewBoundScale:_,needsUpdate:!1,cameraUpdateTime:u},h=0;if(c&&(d.cookie=queryToObject(defaultValue(queryStringValue(l,"cookie",namespaces.kml),"")),h=defaultValue(queryNumericValue(l,"minRefreshPeriod",namespaces.kml),0)),"onInterval"===a)c&&(o=Math.max(h,o)),d.refreshMode=RefreshMode.INTERVAL,d.time=o;else if("onExpire"===a){if(c&&(s=queryStringValue(l,"expires",namespaces.kml)),defined(s))try{var p=JulianDate.fromIso8601(s),m=JulianDate.secondsDifference(p,u);0<m&&m<h&&JulianDate.addSeconds(u,h,p),d.refreshMode=RefreshMode.EXPIRE,d.time=p}catch(e){oneTimeWarning("kml-refreshMode-onInterval-onExpire","KML - NetworkLinkControl expires is not a valid date")}else oneTimeWarning("kml-refreshMode-onExpire","KML - refreshMode of onExpire requires the NetworkLinkControl to have an expires element")}else f._camera?(d.refreshMode=RefreshMode.STOP,d.time=defaultValue(queryNumericValue(S,"viewRefreshTime",namespaces.kml),0)):oneTimeWarning("kml-refrehMode-onStop-noCamera","A NetworkLink with viewRefreshMode=onStop requires a camera be passed in when creating the KmlDataSource");defined(d.refreshMode)&&f._networkLinks.set(d.id,d)}else"onRegion"===g&&oneTimeWarning("kml-refrehMode-onRegion","KML - Unsupported viewRefreshMode: onRegion")}).otherwise(function(e){oneTimeWarning("An error occured during loading "+y.url),f._error.raiseEvent(f,e)}),i.addPromise(c))}function processFeatureNode(e,t,i,r){var n=featureTypes[t.localName];return defined(n)?n(e,t,i,r):processUnsupportedFeature(e,t,i)}function loadKml(a,o,s,l,c,u){o.removeAll();var e=s.documentElement,t=queryStringValue("Document"===e.localName?e:queryFirstNode(e,"Document",namespaces.kml),"name",namespaces.kml);defined(t)||(t=getFilenameFromUri(l.getUrlComponent())),defined(a._name)||(a._name=t);var d=new KmlDataSource._DeferredLoading(a),h=new EntityCollection(a);return when.all(processStyles(a,s,h,l,!1,c)).then(function(){var e=s.documentElement;if("kml"===e.localName)for(var t=e.childNodes,i=0;i<t.length;i++){var r=t[i];if(defined(featureTypes[r.localName])){e=r;break}}var n={parentEntity:void 0,entityCollection:o,styleCollection:h,sourceResource:l,uriResolver:c,context:u};return o.suspendEvents(),processFeatureNode(a,e,n,d),o.resumeEvents(),d.wait().then(function(){return s.documentElement})})}function loadKmz(c,u,e,d){var h=when.defer();return zip.createReader(new zip.BlobReader(e),function(l){l.getEntries(function(e){for(var t,i,r=[],n={},a=0;a<e.length;a++){var o,s=e[a];s.directory||(o=when.defer(),r.push(o.promise),!/\.kml$/i.test(s.filename)||defined(t)&&/\//i.test(s.filename)?loadDataUriFromZip(s,n,o):(defined(t)&&loadDataUriFromZip(t,n,i),t=s,i=o))}defined(t)&&loadXmlFromZip(t,n,i),when.all(r).then(function(){return l.close(),defined(n.kml)?(n.keys=Object.keys(n),loadKml(c,u,n.kml,d,n)):void h.reject(new RuntimeError("KMZ file does not contain a KML document."))}).then(h.resolve).otherwise(h.reject)})},function(e){h.reject(e)}),h.promise}function load$2(r,n,e,t){var a=(t=defaultValue(t,defaultValue.EMPTY_OBJECT)).sourceUri,o=t.uriResolver,s=t.context,i=e;if("string"==typeof e||e instanceof Resource){i=(e=Resource.createIfNeeded(e)).fetchBlob(),a=defaultValue(a,e.clone());var l=r._resourceCredits,c=e.credits;if(defined(c))for(var u=c.length,d=0;d<u;d++)l.push(c[d])}else a=defaultValue(a,Resource.DEFAULT.clone());return a=Resource.createIfNeeded(a),when(i).then(function(t){return t instanceof Blob?isZipFile(t).then(function(e){return e?loadKmz(r,n,t,a):readBlobAsText(t).then(function(e){var t,i;e=removeDuplicateNamespaces(e=insertNamespaces(e));try{t=parser.parseFromString(e,"application/xml")}catch(e){i=e.toString()}if(defined(i)||t.body||"parsererror"===t.documentElement.tagName)throw new RuntimeError((defined(i)?i:t.documentElement.firstChild.nodeValue)||t.body.innerText);return loadKml(r,n,t,a,o,s)})}):loadKml(r,n,t,a,o,s)}).otherwise(function(e){return r._error.raiseEvent(r,e),console.log(e),when.reject(e)})}function KmlDataSource(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).camera,i=e.canvas;this._changed=new Event,this._error=new Event,this._loading=new Event,this._refresh=new Event,this._unsupportedNode=new Event,this._clock=void 0,this._entityCollection=new EntityCollection(this),this._name=void 0,this._isLoading=!1,this._pinBuilder=new PinBuilder,this._networkLinks=new AssociativeArray,this._entityCluster=new EntityCluster,this._canvas=i,this._camera=t,this._lastCameraView={position:defined(t)?Cartesian3.clone(t.positionWC):void 0,direction:defined(t)?Cartesian3.clone(t.directionWC):void 0,up:defined(t)?Cartesian3.clone(t.upWC):void 0,bbox:defined(t)?t.computeViewRectangle():Rectangle.clone(Rectangle.MAX_VALUE)},this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.WGS84);var r=e.credit;"string"==typeof r&&(r=new Credit(r)),this._credit=r,this._resourceCredits=[]}function mergeAvailabilityWithParent(e){var t,i,r=e.parent;!defined(r)||defined(t=r.availability)&&(defined(i=e.availability)?i.intersect(t):e.availability=t)}function getNetworkLinkUpdateCallback(T,x,b,E,P){return function(e){if(E.contains(x.id)){var t=!1,i=queryFirstNode(e,"NetworkLinkControl",namespaces.kml),r=0;if(defined(i)){if(defined(queryFirstNode(i,"Update",namespaces.kml)))return oneTimeWarning("kml-networkLinkControl-update","KML - NetworkLinkControl updates aren't supported."),x.updating=!1,void E.remove(x.id);x.cookie=queryToObject(defaultValue(queryStringValue(i,"cookie",namespaces.kml),"")),r=defaultValue(queryNumericValue(i,"minRefreshPeriod",namespaces.kml),0)}var n,a=JulianDate.now(),o=x.refreshMode;if(o===RefreshMode.INTERVAL)defined(i)&&(x.time=Math.max(r,x.time));else if(o===RefreshMode.EXPIRE){if(defined(i)&&(n=queryStringValue(i,"expires",namespaces.kml)),defined(n))try{var s=JulianDate.fromIso8601(n),l=JulianDate.secondsDifference(s,a);0<l&&l<r&&JulianDate.addSeconds(a,r,s),x.time=s}catch(e){oneTimeWarning("kml-networkLinkControl-expires","KML - NetworkLinkControl expires is not a valid date"),t=!0}else oneTimeWarning("kml-refreshMode-onExpire","KML - refreshMode of onExpire requires the NetworkLinkControl to have an expires element"),t=!0}var c=x.entity,u=T._entityCollection,d=b.values;u.suspendEvents();for(var h=u.values.slice(),p=0;p<h.length;++p){var m=h[p];m.parent===c&&(m.parent=void 0,function e(t){u.remove(t);for(var i=t._children,r=i.length,n=0;n<r;++n)e(i[n])}(m))}for(u.resumeEvents(),u.suspendEvents(),p=0;p<d.length;p++){var f=d[p];defined(f.parent)||(f.parent=c,mergeAvailabilityWithParent(f)),u.add(f)}u.resumeEvents(),t?E.remove(x.id):x.lastUpdated=a;var g,_=u.computeAvailability(),y=_.start,v=_.stop,C=JulianDate.equals(y,Iso8601.MINIMUM_VALUE),S=JulianDate.equals(v,Iso8601.MAXIMUM_VALUE);C&&S||((g=T._clock).startTime===y&&g.stopTime===v||(g.startTime=y,g.stopTime=v,T._changed.raiseEvent(T))),x.updating=!1,x.needsUpdate=!1,T._refresh.raiseEvent(T,P.getUrlComponent(!0))}}}KmlDataSource.load=function(e,t){return new KmlDataSource(t=defaultValue(t,defaultValue.EMPTY_OBJECT)).load(e,t)},Object.defineProperties(KmlDataSource.prototype,{name:{get:function(){return this._name},set:function(e){this._name!==e&&(this._name=e,this._changed.raiseEvent(this))}},clock:{get:function(){return this._clock}},entities:{get:function(){return this._entityCollection}},isLoading:{get:function(){return this._isLoading}},changedEvent:{get:function(){return this._changed}},errorEvent:{get:function(){return this._error}},loadingEvent:{get:function(){return this._loading}},refreshEvent:{get:function(){return this._refresh}},unsupportedNodeEvent:{get:function(){return this._unsupportedNode}},show:{get:function(){return this._entityCollection.show},set:function(e){this._entityCollection.show=e}},clustering:{get:function(){return this._entityCluster},set:function(e){this._entityCluster=e}},credit:{get:function(){return this._credit}}}),KmlDataSource.prototype.load=function(e,t){t=defaultValue(t,defaultValue.EMPTY_OBJECT),DataSource.setLoading(this,!0);var l=this._name;this._name=void 0,this._clampToGround=defaultValue(t.clampToGround,!1);var c=this;return load$2(this,this._entityCollection,e,t).then(function(){var e,t,i=c._entityCollection.computeAvailability(),r=i.start,n=i.stop,a=JulianDate.equals(r,Iso8601.MINIMUM_VALUE),o=JulianDate.equals(n,Iso8601.MAXIMUM_VALUE);a&&o||(a&&((t=new Date).setHours(0,0,0,0),r=JulianDate.fromDate(t)),o&&((t=new Date).setHours(24,0,0,0),n=JulianDate.fromDate(t)),(e=new DataSourceClock).startTime=r,e.stopTime=n,e.currentTime=JulianDate.clone(r),e.clockRange=ClockRange$1.LOOP_STOP,e.clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER,e.multiplier=Math.round(Math.min(Math.max(JulianDate.secondsDifference(n,r)/60,1),31556900)));var s=!1;return e!==c._clock&&(c._clock=e,s=!0),l!==c._name&&(s=!0),s&&c._changed.raiseEvent(c),DataSource.setLoading(c,!1),c}).otherwise(function(e){return DataSource.setLoading(c,!1),c._error.raiseEvent(c,e),console.log(e),when.reject(e)})};var entitiesToIgnore=new AssociativeArray;function KmlFeatureData(){this.author={name:void 0,uri:void 0,email:void 0},this.link={href:void 0,hreflang:void 0,rel:void 0,type:void 0,title:void 0,length:void 0},this.address=void 0,this.phoneNumber=void 0,this.snippet=void 0,this.extendedData=void 0}function Visualizer(){DeveloperError.throwInstantiationError()}KmlDataSource.prototype.update=function(e){var t=this._networkLinks;if(0===t.length)return!0;var o=JulianDate.now(),s=this;entitiesToIgnore.removeAll();var l=!1,c=this._lastCameraView,i=this._camera;!defined(i)||i.positionWC.equalsEpsilon(c.position,CesiumMath.EPSILON7)&&i.directionWC.equalsEpsilon(c.direction,CesiumMath.EPSILON7)&&i.upWC.equalsEpsilon(c.up,CesiumMath.EPSILON7)||(c.position=Cartesian3.clone(i.positionWC),c.direction=Cartesian3.clone(i.directionWC),c.up=Cartesian3.clone(i.upWC),c.bbox=i.computeViewRectangle(),l=!0);var u=new AssociativeArray,d=!1;return t.values.forEach(function(i){var e,t,r,n,a=i.entity;entitiesToIgnore.contains(a.id)||(i.updating||(e=!1,i.refreshMode===RefreshMode.INTERVAL?JulianDate.secondsDifference(o,i.lastUpdated)>i.time&&(e=!0):i.refreshMode===RefreshMode.EXPIRE?JulianDate.greaterThan(o,i.time)&&(e=!0):i.refreshMode===RefreshMode.STOP&&(l&&(i.needsUpdate=!0,i.cameraUpdateTime=o),i.needsUpdate&&JulianDate.secondsDifference(o,i.cameraUpdateTime)>=i.time&&(e=!0)),e&&(function e(t){for(var i=t._children,r=i.length,n=0;n<r;++n){var a=i[n];entitiesToIgnore.set(a.id,a),e(a)}}(a),i.updating=!0,t=new EntityCollection,(r=i.href.clone()).setQueryParameters(i.cookie),n=defaultValue(s._ellipsoid,Ellipsoid.WGS84),processNetworkLinkQueryString(r,s._camera,s._canvas,i.viewBoundScale,c.bbox,n),load$2(s,t,r,{context:a.id}).then(getNetworkLinkUpdateCallback(s,i,t,u,r)).otherwise(function(e){var t="NetworkLink "+i.href+" refresh failed: "+e;console.log(t),s._error.raiseEvent(s,t)}),d=!0)),u.set(i.id,i))}),d&&(this._networkLinks=u,this._changed.raiseEvent(this)),!0},KmlDataSource._DeferredLoading=DeferredLoading,KmlDataSource._getTimestamp=getTimestamp$1,Visualizer.prototype.update=DeveloperError.throwInstantiationError,Visualizer.prototype.getBoundingSphere=DeveloperError.throwInstantiationError,Visualizer.prototype.isDestroyed=DeveloperError.throwInstantiationError,Visualizer.prototype.destroy=DeveloperError.throwInstantiationError;var BILLBOARD_SIZE$1=32,kmlNamespace="http://www.opengis.net/kml/2.2",gxNamespace="http://www.google.com/kml/ext/2.2",xmlnsNamespace="http://www.w3.org/2000/xmlns/";function ExternalFileHandler(e){this._files={},this._promises=[],this._count=0,this._modelCallback=e}var imageTypeRegex=/^data:image\/([^,;]+)/;function getModelBlobHander(t,i){return function(e){t._files[i]=e}}function ValueGetter(e){this._time=e}function StyleCache(){this._ids={},this._styles={},this._count=0}function IdManager(){this._ids={}}function exportKml(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).entities,i=defaultValue(e.kmz,!1),r=exportKml._createState(e),n=t.values.filter(function(e){return!defined(e.parent)}),a=r.kmlDoc,o=a.documentElement;o.setAttributeNS(xmlnsNamespace,"xmlns:gx",gxNamespace);var s=a.createElement("Document");o.appendChild(s),recurseEntities(r,s,n),r.styleCache.save(s);var l=r.externalFileHandler;return l.promise.then(function(){var e=(new XMLSerializer).serializeToString(r.kmlDoc);return i?createKmz(e,l.files):{kml:e,externalFiles:l.files}})}function createKmz(e,i){var r=when.defer();return zip.createWriter(new zip.BlobWriter,function(t){addKmlToZip(t,e).then(function(){var e=Object.keys(i);return addExternalFilesToZip(t,e,i,0)}).then(function(){t.close(function(e){r.resolve({kmz:e})})})}),r.promise}function addKmlToZip(e,t){var i=when.defer();return e.add("doc.kml",new zip.TextReader(t),function(){i.resolve()}),i.promise}function addExternalFilesToZip(e,t,i,r){if(t.length!==r){var n=t[r],a=when.defer();return e.add(n,new zip.BlobReader(i[n]),function(){a.resolve()}),a.promise.then(function(){return addExternalFilesToZip(e,t,i,r+1)})}}function recurseEntities(e,t,i){for(var r=e.kmlDoc,n=e.styleCache,a=e.valueGetter,o=e.idManager,s=i.length,l=0;l<s;++l){var c,u,d,h=i[l],p=[];createPoint$1(e,h,u=[],d=[]),createLineString$1(e,h.polyline,u,d),createPolygon$1(e,h.rectangle,u,d,p),createPolygon$1(e,h.polygon,u,d,p),createModel$1(e,h,h.model,u,d);var m=h.availability;defined(m)&&(c=r.createElement("TimeSpan"),JulianDate.equals(m.start,Iso8601.MINIMUM_VALUE)||c.appendChild(createBasicElementWithText(r,"begin",JulianDate.toIso8601(m.start))),JulianDate.equals(m.stop,Iso8601.MAXIMUM_VALUE)||c.appendChild(createBasicElementWithText(r,"end",JulianDate.toIso8601(m.stop))));for(var f=0;f<p.length;++f){var g=p[f];g.setAttribute("id",o.get(h.id)),g.appendChild(createBasicElementWithText(r,"name",h.name)),g.appendChild(createBasicElementWithText(r,"visibility",h.show)),g.appendChild(createBasicElementWithText(r,"description",h.description)),defined(c)&&g.appendChild(c),t.appendChild(g)}var _=u.length;if(0<_){var y=r.createElement("Placemark");y.setAttribute("id",o.get(h.id));var v,C,S,T,x=h.name,b=h.label;defined(b)&&(v=r.createElement("LabelStyle"),x=defined(C=a.get(b.text))&&0<C.length?C:x,defined(S=a.getColor(b.fillColor))&&(v.appendChild(createBasicElementWithText(r,"color",S)),v.appendChild(createBasicElementWithText(r,"colorMode","normal"))),defined(T=a.get(b.scale))&&v.appendChild(createBasicElementWithText(r,"scale",T)),d.push(v)),y.appendChild(createBasicElementWithText(r,"name",x)),y.appendChild(createBasicElementWithText(r,"visibility",h.show)),y.appendChild(createBasicElementWithText(r,"description",h.description)),defined(c)&&y.appendChild(c),t.appendChild(y);var E=d.length;if(0<E){for(var P=r.createElement("Style"),A=0;A<E;++A)P.appendChild(d[A]);y.appendChild(createBasicElementWithText(r,"styleUrl",n.get(P)))}if(1===u.length)y.appendChild(u[0]);else if(1<u.length){for(var w=r.createElement("MultiGeometry"),D=0;D<_;++D)w.appendChild(u[D]);y.appendChild(w)}}var M,I=h._children;0<I.length&&((M=r.createElement("Folder")).setAttribute("id",o.get(h.id)),M.appendChild(createBasicElementWithText(r,"name",h.name)),M.appendChild(createBasicElementWithText(r,"visibility",h.show)),M.appendChild(createBasicElementWithText(r,"description",h.description)),t.appendChild(M),recurseEntities(e,M,I))}}ExternalFileHandler.prototype.texture=function(e){var t=this;if("string"==typeof e||e instanceof Resource){if(!(e=Resource.createIfNeeded(e)).isDataUri)return e.url;var i=e.url.match(imageTypeRegex),r="texture_"+ ++this._count;defined(i)&&(r+="."+i[1]);var n=e.fetchBlob().then(function(e){t._files[r]=e});return this._promises.push(n),r}if(e instanceof HTMLCanvasElement){var a=when.defer();return this._promises.push(a.promise),r="texture_"+ ++this._count+".png",e.toBlob(function(e){t._files[r]=e,a.resolve()}),r}return""},ExternalFileHandler.prototype.model=function(e,t){var i=this._modelCallback;if(!defined(i))throw new RuntimeError("Encountered a model entity while exporting to KML, but no model callback was supplied.");var r,n={},a=i(e,t,n);for(var o in n){n.hasOwnProperty(o)&&(r=when(n[o]),this._promises.push(r),r.then(getModelBlobHander(this,o)))}return a},Object.defineProperties(ExternalFileHandler.prototype,{promise:{get:function(){return when.all(this._promises)}},files:{get:function(){return this._files}}}),ValueGetter.prototype.get=function(e,t,i){var r;return defined(e)&&(r=defined(e.getValue)?e.getValue(this._time,i):e),defaultValue(r,t)},ValueGetter.prototype.getColor=function(e,t){var i=this.get(e,t);if(defined(i))return colorToString(i)},ValueGetter.prototype.getMaterialType=function(e){if(defined(e))return e.getType(this._time)},StyleCache.prototype.get=function(e){var t=this._ids,i=e.innerHTML;if(defined(t[i]))return t[i];var r="style-"+ ++this._count;return e.setAttribute("id",r),r="#"+r,t[i]=r,this._styles[i]=e,r},StyleCache.prototype.save=function(e){var t=this._styles,i=e.childNodes[0];for(var r in t)t.hasOwnProperty(r)&&e.insertBefore(t[r],i)},IdManager.prototype.get=function(e){if(!defined(e))return this.get(createGuid());var t=this._ids;return defined(t[e])?e.toString()+"-"+ ++t[e]:(t[e]=0,e)},exportKml._createState=function(e){var t=e.entities,i=new StyleCache,r=t.computeAvailability(),n=defined(e.time)?e.time:r.start,a=defaultValue(e.defaultAvailability,r),o=defaultValue(e.sampleDuration,60);a.start===Iso8601.MINIMUM_VALUE?a.stop===Iso8601.MAXIMUM_VALUE?a=new TimeInterval:JulianDate.addSeconds(a.stop,-10*o,a.start):a.stop===Iso8601.MAXIMUM_VALUE&&JulianDate.addSeconds(a.start,10*o,a.stop);var s=new ExternalFileHandler(e.modelCallback);return{kmlDoc:document.implementation.createDocument(kmlNamespace,"kml"),ellipsoid:defaultValue(e.ellipsoid,Ellipsoid.WGS84),idManager:new IdManager,styleCache:i,externalFileHandler:s,time:n,valueGetter:new ValueGetter(n),sampleDuration:o,defaultAvailability:new TimeIntervalCollection([a])}};var scratchCartesian3$b=new Cartesian3,scratchCartographic$a=new Cartographic,scratchJulianDate$2=new JulianDate;function createPoint$1(e,t,i,r){var n,a,o,s,l,c=e.kmlDoc,u=e.ellipsoid,d=e.valueGetter,h=defaultValue(t.billboard,t.point);(defined(h)||defined(t.path))&&((n=t.position).isConstant?(d.get(n,void 0,scratchCartesian3$b),a=createBasicElementWithText(c,"coordinates",getCoordinates(scratchCartesian3$b,u)),o=c.createElement("Point"),(s=c.createElement("altitudeMode")).appendChild(getAltitudeMode(e,h.heightReference)),o.appendChild(s),o.appendChild(a),i.push(o),l=(h instanceof BillboardGraphics?createIconStyleFromBillboard:createIconStyleFromPoint)(e,h),r.push(l)):createTracks(e,t,h,i,r))}function createTracks(e,t,i,r,n){var a,o=e.kmlDoc,s=e.ellipsoid,l=e.valueGetter,c=t.position,u=!0;c instanceof CompositePositionProperty?(a=c.intervals,u=!1):a=defaultValue(t.availability,e.defaultAvailability);var d,h,p=i instanceof ModelGraphics,m=[];for(M=0;M<a.length;++M){var f=a.get(M),g=u?c:f.data,_=o.createElement("altitudeMode");g instanceof ScaledPositionProperty?(g=g._value,_.appendChild(getAltitudeMode(e,HeightReference$1.CLAMP_TO_GROUND))):defined(i)?_.appendChild(getAltitudeMode(e,i.heightReference)):_.appendChild(getAltitudeMode(e,HeightReference$1.NONE));var y=[],v=[];if(g.isConstant){l.get(g,void 0,scratchCartesian3$b);var C=createBasicElementWithText(o,"coordinates",getCoordinates(scratchCartesian3$b,s));y.push(JulianDate.toIso8601(f.start)),v.push(C),y.push(JulianDate.toIso8601(f.stop)),v.push(C)}else if(g instanceof SampledPositionProperty)for(d=g._property._times,T=0;T<d.length;++T)y.push(JulianDate.toIso8601(d[T])),g.getValueInReferenceFrame(d[T],ReferenceFrame$1.FIXED,scratchCartesian3$b),v.push(getCoordinates(scratchCartesian3$b,s));else if(g instanceof SampledProperty){d=g._times;for(var S=g._values,T=0;T<d.length;++T)y.push(JulianDate.toIso8601(d[T])),Cartesian3.fromArray(S,3*T,scratchCartesian3$b),v.push(getCoordinates(scratchCartesian3$b,s))}else{var x=e.sampleDuration;f.start.clone(scratchJulianDate$2),f.isStartIncluded||JulianDate.addSeconds(scratchJulianDate$2,x,scratchJulianDate$2);for(var b=f.stop;JulianDate.lessThan(scratchJulianDate$2,b);)g.getValue(scratchJulianDate$2,scratchCartesian3$b),y.push(JulianDate.toIso8601(scratchJulianDate$2)),v.push(getCoordinates(scratchCartesian3$b,s)),JulianDate.addSeconds(scratchJulianDate$2,x,scratchJulianDate$2);f.isStopIncluded&&JulianDate.equals(scratchJulianDate$2,b)&&(g.getValue(scratchJulianDate$2,scratchCartesian3$b),y.push(JulianDate.toIso8601(scratchJulianDate$2)),v.push(getCoordinates(scratchCartesian3$b,s)))}var E=o.createElementNS(gxNamespace,"Track");E.appendChild(_);for(var P=0;P<y.length;++P){var A=createBasicElementWithText(o,"when",y[P]),w=createBasicElementWithText(o,"coord",v[P],gxNamespace);E.appendChild(A),E.appendChild(w)}p&&E.appendChild(createModelGeometry(e,i)),m.push(E)}if(1===m.length)r.push(m[0]);else if(1<m.length){for(var D=o.createElementNS(gxNamespace,"MultiTrack"),M=0;M<m.length;++M)D.appendChild(m[M]);r.push(D)}defined(i)&&!p&&(h=(i instanceof BillboardGraphics?createIconStyleFromBillboard:createIconStyleFromPoint)(e,i),n.push(h));var I,R,O,L=t.path;defined(L)&&(I=l.get(L.width),(defined(R=L.material)||defined(I))&&(O=o.createElement("LineStyle"),defined(I)&&O.appendChild(createBasicElementWithText(o,"width",I)),processMaterial(e,R,O),n.push(O)))}function createIconStyleFromPoint(e,t){var i=e.kmlDoc,r=e.valueGetter,n=i.createElement("IconStyle"),a=r.getColor(t.color);defined(a)&&(n.appendChild(createBasicElementWithText(i,"color",a)),n.appendChild(createBasicElementWithText(i,"colorMode","normal")));var o=r.get(t.pixelSize);return defined(o)&&n.appendChild(createBasicElementWithText(i,"scale",o/BILLBOARD_SIZE$1)),n}function createIconStyleFromBillboard(e,t){var i,r,n=e.kmlDoc,a=e.valueGetter,o=e.externalFileHandler,s=n.createElement("IconStyle"),l=a.get(t.image);defined(l)&&(l=o.texture(l),(i=n.createElement("Icon")).appendChild(createBasicElementWithText(n,"href",l)),defined(r=a.get(t.imageSubRegion))&&(i.appendChild(createBasicElementWithText(n,"x",r.x,gxNamespace)),i.appendChild(createBasicElementWithText(n,"y",r.y,gxNamespace)),i.appendChild(createBasicElementWithText(n,"w",r.width,gxNamespace)),i.appendChild(createBasicElementWithText(n,"h",r.height,gxNamespace))),s.appendChild(i));var c=a.getColor(t.color);defined(c)&&(s.appendChild(createBasicElementWithText(n,"color",c)),s.appendChild(createBasicElementWithText(n,"colorMode","normal")));var u=a.get(t.scale);defined(u)&&s.appendChild(createBasicElementWithText(n,"scale",u));var d,h,p,m,f,g=a.get(t.pixelOffset);defined(g)&&(u=defaultValue(u,1),Cartesian2.divideByScalar(g,u,g),d=a.get(t.width,BILLBOARD_SIZE$1),h=a.get(t.height,BILLBOARD_SIZE$1),(p=a.get(t.horizontalOrigin,HorizontalOrigin$1.CENTER))===HorizontalOrigin$1.CENTER?g.x-=.5*d:p===HorizontalOrigin$1.RIGHT&&(g.x-=d),(m=a.get(t.verticalOrigin,VerticalOrigin$1.CENTER))===VerticalOrigin$1.TOP?g.y+=h:m===VerticalOrigin$1.CENTER&&(g.y+=.5*h),(f=n.createElement("hotSpot")).setAttribute("x",-g.x),f.setAttribute("y",g.y),f.setAttribute("xunits","pixels"),f.setAttribute("yunits","pixels"),s.appendChild(f));var _=a.get(t.rotation),y=a.get(t.alignedAxis);return defined(_)&&Cartesian3.equals(Cartesian3.UNIT_Z,y)&&(0===(_=CesiumMath.toDegrees(-_))&&(_=360),s.appendChild(createBasicElementWithText(n,"heading",_))),s}function createLineString$1(e,t,i,r){var n,a,o,s,l,c,u,d,h,p=e.kmlDoc,m=e.ellipsoid,f=e.valueGetter;defined(t)&&(n=p.createElement("LineString"),a=p.createElement("altitudeMode"),s=(o=f.get(t.clampToGround,!1))?(n.appendChild(createBasicElementWithText(p,"tessellate",!0)),p.createTextNode("clampToGround")):p.createTextNode("absolute"),a.appendChild(s),n.appendChild(a),l=t.positions,c=createBasicElementWithText(p,"coordinates",getCoordinates(f.get(l),m)),n.appendChild(c),u=f.get(t.zIndex),o&&defined(u)&&n.appendChild(createBasicElementWithText(p,"drawOrder",u,gxNamespace)),i.push(n),d=p.createElement("LineStyle"),defined(h=f.get(t.width))&&d.appendChild(createBasicElementWithText(p,"width",h)),processMaterial(e,t.material,d),r.push(d))}function getRectangleBoundaries(e,t,i){var r,n=e.kmlDoc,a=e.valueGetter,o=a.get(t.height,0);0<i&&(o=i);for(var s=t.coordinates,l=a.get(s),c=[],u=[Rectangle.northeast,Rectangle.southeast,Rectangle.southwest,Rectangle.northwest],d=0;d<4;++d)u[d](l,scratchCartographic$a),c.push(CesiumMath.toDegrees(scratchCartographic$a.longitude)+","+CesiumMath.toDegrees(scratchCartographic$a.latitude)+","+o);r=createBasicElementWithText(n,"coordinates",c.join(" "));var h=n.createElement("outerBoundaryIs"),p=n.createElement("LinearRing");return p.appendChild(r),h.appendChild(p),[h]}function getLinearRing(e,t,i,r){for(var n=e.kmlDoc,a=e.ellipsoid,o=[],s=t.length,l=0;l<s;++l)Cartographic.fromCartesian(t[l],a,scratchCartographic$a),o.push(CesiumMath.toDegrees(scratchCartographic$a.longitude)+","+CesiumMath.toDegrees(scratchCartographic$a.latitude)+","+(r?scratchCartographic$a.height:i));var c=createBasicElementWithText(n,"coordinates",o.join(" ")),u=n.createElement("LinearRing");return u.appendChild(c),u}function getPolygonBoundaries(e,t,i){var r=e.kmlDoc,n=e.valueGetter,a=n.get(t.height,0),o=n.get(t.perPositionHeight,!1);!o&&0<i&&(a=i);var s=[],l=t.hierarchy,c=n.get(l),u=Array.isArray(c)?c:c.positions,d=r.createElement("outerBoundaryIs");d.appendChild(getLinearRing(e,u,a,o)),s.push(d);var h=c.holes;if(defined(h))for(var p=h.length,m=0;m<p;++m){var f=r.createElement("innerBoundaryIs");f.appendChild(getLinearRing(e,h[m].positions,a,o)),s.push(f)}return s}function createPolygon$1(e,t,i,r,n){var a=e.kmlDoc,o=e.valueGetter;if(defined(t)){var s=t instanceof RectangleGraphics;if(s&&"Image"===o.getMaterialType(t.material))createGroundOverlay(e,t,n);else{var l=a.createElement("Polygon"),c=o.get(t.extrudedHeight,0);0<c&&l.appendChild(createBasicElementWithText(a,"extrude",!0));for(var u=(s?getRectangleBoundaries:getPolygonBoundaries)(e,t,c),d=u.length,h=0;h<d;++h)l.appendChild(u[h]);var p=a.createElement("altitudeMode");p.appendChild(getAltitudeMode(e,t.heightReference)),l.appendChild(p),i.push(l);var m=a.createElement("PolyStyle"),f=o.get(t.fill,!1);f&&m.appendChild(createBasicElementWithText(a,"fill",f)),processMaterial(e,t.material,m);var g,_,y,v=o.get(t.outline,!1);v&&(m.appendChild(createBasicElementWithText(a,"outline",v)),g=a.createElement("LineStyle"),_=o.get(t.outlineWidth,1),g.appendChild(createBasicElementWithText(a,"width",_)),y=o.getColor(t.outlineColor,Color.BLACK),g.appendChild(createBasicElementWithText(a,"color",y)),g.appendChild(createBasicElementWithText(a,"colorMode","normal")),r.push(g)),r.push(m)}}}function createGroundOverlay(e,t,i){var r=e.kmlDoc,n=e.valueGetter,a=e.externalFileHandler,o=r.createElement("GroundOverlay"),s=r.createElement("altitudeMode");s.appendChild(getAltitudeMode(e,t.heightReference)),o.appendChild(s);var l=n.get(t.height);defined(l)&&o.appendChild(createBasicElementWithText(r,"altitude",l));var c=n.get(t.coordinates),u=r.createElement("LatLonBox");u.appendChild(createBasicElementWithText(r,"north",CesiumMath.toDegrees(c.north))),u.appendChild(createBasicElementWithText(r,"south",CesiumMath.toDegrees(c.south))),u.appendChild(createBasicElementWithText(r,"east",CesiumMath.toDegrees(c.east))),u.appendChild(createBasicElementWithText(r,"west",CesiumMath.toDegrees(c.west))),o.appendChild(u);var d=n.get(t.material),h=a.texture(d.image),p=r.createElement("Icon");p.appendChild(createBasicElementWithText(r,"href",h)),o.appendChild(p),defined(d.color)&&o.appendChild(createBasicElementWithText(r,"color",colorToString(d.color))),i.push(o)}function createModelGeometry(e,t){var i,r=e.kmlDoc,n=e.valueGetter,a=e.externalFileHandler,o=r.createElement("Model"),s=n.get(t.scale);defined(s)&&((i=r.createElement("scale")).appendChild(createBasicElementWithText(r,"x",s)),i.appendChild(createBasicElementWithText(r,"y",s)),i.appendChild(createBasicElementWithText(r,"z",s)),o.appendChild(i));var l=r.createElement("Link"),c=a.model(t,e.time);return l.appendChild(createBasicElementWithText(r,"href",c)),o.appendChild(l),o}function createModel$1(e,t,i,r,n){var a,o,s,l,c=e.kmlDoc,u=e.ellipsoid,d=e.valueGetter;defined(i)&&((a=t.position).isConstant?(o=createModelGeometry(e,i),(s=c.createElement("altitudeMode")).appendChild(getAltitudeMode(e,i.heightReference)),o.appendChild(s),d.get(a,void 0,scratchCartesian3$b),Cartographic.fromCartesian(scratchCartesian3$b,u,scratchCartographic$a),(l=c.createElement("Location")).appendChild(createBasicElementWithText(c,"longitude",CesiumMath.toDegrees(scratchCartographic$a.longitude))),l.appendChild(createBasicElementWithText(c,"latitude",CesiumMath.toDegrees(scratchCartographic$a.latitude))),l.appendChild(createBasicElementWithText(c,"altitude",scratchCartographic$a.height)),o.appendChild(l),r.push(o)):createTracks(e,t,i,r,n))}function processMaterial(e,t,i){var r=e.kmlDoc,n=e.valueGetter;if(defined(t)){var a,o=n.get(t);if(defined(o)){switch(n.getMaterialType(t)){case"Image":a=colorToString(Color.WHITE);break;case"Color":case"Grid":case"PolylineGlow":case"PolylineArrow":case"PolylineDash":a=colorToString(o.color);break;case"PolylineOutline":a=colorToString(o.color);var s=colorToString(o.outlineColor),l=o.outlineWidth;i.appendChild(createBasicElementWithText(r,"outerColor",s,gxNamespace)),i.appendChild(createBasicElementWithText(r,"outerWidth",l,gxNamespace));break;case"Stripe":a=colorToString(o.oddColor)}defined(a)&&(i.appendChild(createBasicElementWithText(r,"color",a)),i.appendChild(createBasicElementWithText(r,"colorMode","normal")))}}}function getAltitudeMode(e,t){var i,r=e.kmlDoc;switch(e.valueGetter.get(t,HeightReference$1.NONE)){case HeightReference$1.NONE:i=r.createTextNode("absolute");break;case HeightReference$1.CLAMP_TO_GROUND:i=r.createTextNode("clampToGround");break;case HeightReference$1.RELATIVE_TO_GROUND:i=r.createTextNode("relativeToGround")}return i}function getCoordinates(e,t){Array.isArray(e)||(e=[e]);for(var i=e.length,r=[],n=0;n<i;++n)Cartographic.fromCartesian(e[n],t,scratchCartographic$a),r.push(CesiumMath.toDegrees(scratchCartographic$a.longitude)+","+CesiumMath.toDegrees(scratchCartographic$a.latitude)+","+scratchCartographic$a.height);return r.join(" ")}function createBasicElementWithText(e,t,i,r){"boolean"==typeof(i=defaultValue(i,""))&&(i=i?"1":"0");var n=defined(r)?e.createElementNS(r,t):e.createElement(t),a="string"===i&&-1!==i.indexOf("<")?e.createCDATASection(i):e.createTextNode(i);return n.appendChild(a),n}function colorToString(e){for(var t="",i=e.toBytes(),r=3;0<=r;--r)t+=i[r]<16?"0"+i[r].toString(16):i[r].toString(16);return t}var ViewportQuadVS="attribute vec4 position;\nattribute vec2 textureCoordinates;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\ngl_Position = position;\nv_textureCoordinates = textureCoordinates;\n}\n",renderStateScratch;function ComputeEngine(e){this._context=e}var drawCommandScratch=new DrawCommand({primitiveType:PrimitiveType$1.TRIANGLES}),clearCommandScratch=new ClearCommand({color:new Color(0,0,0,0)});function createFramebuffer$1(e,t){return new Framebuffer({context:e,colorTextures:[t],destroyAttachments:!1})}function createViewportQuadShader(e,t){return ShaderProgram.fromCache({context:e,vertexShaderSource:ViewportQuadVS,fragmentShaderSource:t,attributeLocations:{position:0,textureCoordinates:1}})}function createRenderState(e,t){return defined(renderStateScratch)&&renderStateScratch.viewport.width===e&&renderStateScratch.viewport.height===t||(renderStateScratch=RenderState.fromCache({viewport:new BoundingRectangle(0,0,e,t)})),renderStateScratch}function PassState(e){this.context=e,this.framebuffer=void 0,this.blendingEnabled=void 0,this.scissorTest=void 0,this.viewport=void 0}function ShaderCache(e){this._context=e,this._shaders={},this._numberOfShaders=0,this._shadersToRelease={}}function destroyShader(e,t){for(var i=t.derivedKeywords,r=i.length,n=0;n<r;++n){var a=i[n]+t.keyword;destroyShader(e,e._shaders[a])}delete e._shaders[t.keyword],t.shaderProgram.finalDestroy()}function TextureCache(){this._textures={},this._numberOfTextures=0,this._texturesToRelease={}}function SunLight(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.color=Color.clone(defaultValue(e.color,Color.WHITE)),this.intensity=defaultValue(e.intensity,2)}function UniformState(){this.globeDepthTexture=void 0,this.gamma=void 0,this._viewport=new BoundingRectangle,this._viewportCartesian4=new Cartesian4,this._viewportDirty=!1,this._viewportOrthographicMatrix=Matrix4.clone(Matrix4.IDENTITY),this._viewportTransformation=Matrix4.clone(Matrix4.IDENTITY),this._model=Matrix4.clone(Matrix4.IDENTITY),this._view=Matrix4.clone(Matrix4.IDENTITY),this._inverseView=Matrix4.clone(Matrix4.IDENTITY),this._projection=Matrix4.clone(Matrix4.IDENTITY),this._infiniteProjection=Matrix4.clone(Matrix4.IDENTITY),this._entireFrustum=new Cartesian2,this._currentFrustum=new Cartesian2,this._frustumPlanes=new Cartesian4,this._farDepthFromNearPlusOne=void 0,this._log2FarDepthFromNearPlusOne=void 0,this._oneOverLog2FarDepthFromNearPlusOne=void 0,this._frameState=void 0,this._temeToPseudoFixed=Matrix3.clone(Matrix4.IDENTITY),this._view3DDirty=!0,this._view3D=new Matrix4,this._inverseView3DDirty=!0,this._inverseView3D=new Matrix4,this._inverseModelDirty=!0,this._inverseModel=new Matrix4,this._inverseTransposeModelDirty=!0,this._inverseTransposeModel=new Matrix3,this._viewRotation=new Matrix3,this._inverseViewRotation=new Matrix3,this._viewRotation3D=new Matrix3,this._inverseViewRotation3D=new Matrix3,this._inverseProjectionDirty=!0,this._inverseProjection=new Matrix4,this._modelViewDirty=!0,this._modelView=new Matrix4,this._modelView3DDirty=!0,this._modelView3D=new Matrix4,this._modelViewRelativeToEyeDirty=!0,this._modelViewRelativeToEye=new Matrix4,this._inverseModelViewDirty=!0,this._inverseModelView=new Matrix4,this._inverseModelView3DDirty=!0,this._inverseModelView3D=new Matrix4,this._viewProjectionDirty=!0,this._viewProjection=new Matrix4,this._inverseViewProjectionDirty=!0,this._inverseViewProjection=new Matrix4,this._modelViewProjectionDirty=!0,this._modelViewProjection=new Matrix4,this._inverseModelViewProjectionDirty=!0,this._inverseModelViewProjection=new Matrix4,this._modelViewProjectionRelativeToEyeDirty=!0,this._modelViewProjectionRelativeToEye=new Matrix4,this._modelViewInfiniteProjectionDirty=!0,this._modelViewInfiniteProjection=new Matrix4,this._normalDirty=!0,this._normal=new Matrix3,this._normal3DDirty=!0,this._normal3D=new Matrix3,this._inverseNormalDirty=!0,this._inverseNormal=new Matrix3,this._inverseNormal3DDirty=!0,this._inverseNormal3D=new Matrix3,this._encodedCameraPositionMCDirty=!0,this._encodedCameraPositionMC=new EncodedCartesian3,this._cameraPosition=new Cartesian3,this._sunPositionWC=new Cartesian3,this._sunPositionColumbusView=new Cartesian3,this._sunDirectionWC=new Cartesian3,this._sunDirectionEC=new Cartesian3,this._moonDirectionEC=new Cartesian3,this._lightDirectionWC=new Cartesian3,this._lightDirectionEC=new Cartesian3,this._lightColor=new Cartesian3,this._lightColorHdr=new Cartesian3,this._pass=void 0,this._mode=void 0,this._mapProjection=void 0,this._ellipsoid=void 0,this._cameraDirection=new Cartesian3,this._cameraRight=new Cartesian3,this._cameraUp=new Cartesian3,this._frustum2DWidth=0,this._eyeHeight=0,this._eyeHeight2D=new Cartesian2,this._pixelRatio=1,this._orthographicIn3D=!1,this._backgroundColor=new Color,this._brdfLut=void 0,this._environmentMap=void 0,this._sphericalHarmonicCoefficients=void 0,this._specularEnvironmentMaps=void 0,this._specularEnvironmentMapsDimensions=new Cartesian2,this._specularEnvironmentMapsMaximumLOD=void 0,this._fogDensity=void 0,this._invertClassificationColor=void 0,this._imagerySplitPosition=0,this._pixelSizePerMeter=void 0,this._geometricToleranceOverMeter=void 0,this._minimumDisableDepthTestDistance=void 0}function setView(e,t){Matrix4.clone(t,e._view),Matrix4.getMatrix3(t,e._viewRotation),e._view3DDirty=!0,e._inverseView3DDirty=!0,e._modelViewDirty=!0,e._modelView3DDirty=!0,e._modelViewRelativeToEyeDirty=!0,e._inverseModelViewDirty=!0,e._inverseModelView3DDirty=!0,e._viewProjectionDirty=!0,e._inverseViewProjectionDirty=!0,e._modelViewProjectionDirty=!0,e._modelViewProjectionRelativeToEyeDirty=!0,e._modelViewInfiniteProjectionDirty=!0,e._normalDirty=!0,e._inverseNormalDirty=!0,e._normal3DDirty=!0,e._inverseNormal3DDirty=!0}function setInverseView(e,t){Matrix4.clone(t,e._inverseView),Matrix4.getMatrix3(t,e._inverseViewRotation)}function setProjection(e,t){Matrix4.clone(t,e._projection),e._inverseProjectionDirty=!0,e._viewProjectionDirty=!0,e._inverseViewProjectionDirty=!0,e._modelViewProjectionDirty=!0,e._modelViewProjectionRelativeToEyeDirty=!0}function setInfiniteProjection(e,t){Matrix4.clone(t,e._infiniteProjection),e._modelViewInfiniteProjectionDirty=!0}function setCamera(e,t){Cartesian3.clone(t.positionWC,e._cameraPosition),Cartesian3.clone(t.directionWC,e._cameraDirection),Cartesian3.clone(t.rightWC,e._cameraRight),Cartesian3.clone(t.upWC,e._cameraUp);var i=t.positionCartographic;defined(i)?e._eyeHeight=i.height:e._eyeHeight=-e._ellipsoid.maximumRadius,e._encodedCameraPositionMCDirty=!0}ComputeEngine.prototype.execute=function(e){defined(e.preExecute)&&e.preExecute(e);var t=e.outputTexture,i=t.width,r=t.height,n=this._context,a=defined(e.vertexArray)?e.vertexArray:n.getViewportQuadVertexArray(),o=defined(e.shaderProgram)?e.shaderProgram:createViewportQuadShader(n,e.fragmentShaderSource),s=createFramebuffer$1(n,t),l=createRenderState(i,r),c=e.uniformMap,u=clearCommandScratch;u.framebuffer=s,u.renderState=l,u.execute(n);var d=drawCommandScratch;d.vertexArray=a,d.renderState=l,d.shaderProgram=o,d.uniformMap=c,d.framebuffer=s,d.execute(n),s.destroy(),e.persists||(o.destroy(),defined(e.vertexArray)&&a.destroy()),defined(e.postExecute)&&e.postExecute(t)},ComputeEngine.prototype.isDestroyed=function(){return!1},ComputeEngine.prototype.destroy=function(){return destroyObject(this)},Object.defineProperties(ShaderCache.prototype,{numberOfShaders:{get:function(){return this._numberOfShaders}}}),ShaderCache.prototype.replaceShaderProgram=function(e){return defined(e.shaderProgram)&&e.shaderProgram.destroy(),this.getShaderProgram(e)},ShaderCache.prototype.getShaderProgram=function(e){var t=e.vertexShaderSource,i=e.fragmentShaderSource,r=e.attributeLocations;"string"==typeof t&&(t=new ShaderSource({sources:[t]})),"string"==typeof i&&(i=new ShaderSource({sources:[i]}));var n,a,o,s=t.createCombinedVertexShader(this._context),l=i.createCombinedFragmentShader(this._context),c=s+l+JSON.stringify(r);return defined(this._shaders[c])?(o=this._shaders[c],delete this._shadersToRelease[c]):(o={cache:this,shaderProgram:a=new ShaderProgram({gl:(n=this._context)._gl,logShaderCompilation:n.logShaderCompilation,debugShaders:n.debugShaders,vertexShaderSource:t,vertexShaderText:s,fragmentShaderSource:i,fragmentShaderText:l,attributeLocations:r}),keyword:c,derivedKeywords:[],count:0},a._cachedShader=o,this._shaders[c]=o,++this._numberOfShaders),++o.count,o.shaderProgram},ShaderCache.prototype.replaceDerivedShaderProgram=function(e,t,i){var r,n=e._cachedShader,a=t+n.keyword,o=this._shaders[a];return defined(o)&&(destroyShader(this,o),-1<(r=n.derivedKeywords.indexOf(t))&&n.derivedKeywords.splice(r,1)),this.createDerivedShaderProgram(e,t,i)},ShaderCache.prototype.getDerivedShaderProgram=function(e,t){var i=t+e._cachedShader.keyword,r=this._shaders[i];if(defined(r))return r.shaderProgram},ShaderCache.prototype.createDerivedShaderProgram=function(e,t,i){var r=e._cachedShader,n=t+r.keyword,a=i.vertexShaderSource,o=i.fragmentShaderSource,s=i.attributeLocations;"string"==typeof a&&(a=new ShaderSource({sources:[a]})),"string"==typeof o&&(o=new ShaderSource({sources:[o]}));var l=this._context,c=a.createCombinedVertexShader(l),u=o.createCombinedFragmentShader(l),d=new ShaderProgram({gl:l._gl,logShaderCompilation:l.logShaderCompilation,debugShaders:l.debugShaders,vertexShaderSource:a,vertexShaderText:c,fragmentShaderSource:o,fragmentShaderText:u,attributeLocations:s}),h={cache:this,shaderProgram:d,keyword:n,derivedKeywords:[],count:0};return r.derivedKeywords.push(t),d._cachedShader=h,this._shaders[n]=h,d},ShaderCache.prototype.destroyReleasedShaderPrograms=function(){var e=this._shadersToRelease;for(var t in e){e.hasOwnProperty(t)&&(destroyShader(this,e[t]),--this._numberOfShaders)}this._shadersToRelease={}},ShaderCache.prototype.releaseShaderProgram=function(e){var t;!defined(e)||(t=e._cachedShader)&&0==--t.count&&(this._shadersToRelease[t.keyword]=t)},ShaderCache.prototype.isDestroyed=function(){return!1},ShaderCache.prototype.destroy=function(){var e=this._shaders;for(var t in e)e.hasOwnProperty(t)&&e[t].shaderProgram.finalDestroy();return destroyObject(this)},Object.defineProperties(TextureCache.prototype,{numberOfTextures:{get:function(){return this._numberOfTextures}}}),TextureCache.prototype.getTexture=function(e){var t=this._textures[e];if(defined(t))return delete this._texturesToRelease[e],++t.count,t.texture},TextureCache.prototype.addTexture=function(e,t){var i={texture:t,count:1};t.finalDestroy=t.destroy;var r=this;t.destroy=function(){0==--i.count&&(r._texturesToRelease[e]=i)},this._textures[e]=i,++this._numberOfTextures},TextureCache.prototype.destroyReleasedTextures=function(){var e,t=this._texturesToRelease;for(var i in t){t.hasOwnProperty(i)&&(e=t[i],delete this._textures[i],e.texture.finalDestroy(),--this._numberOfTextures)}this._texturesToRelease={}},TextureCache.prototype.isDestroyed=function(){return!1},TextureCache.prototype.destroy=function(){var e=this._textures;for(var t in e)e.hasOwnProperty(t)&&e[t].texture.finalDestroy();return destroyObject(this)},Object.defineProperties(UniformState.prototype,{frameState:{get:function(){return this._frameState}},viewport:{get:function(){return this._viewport},set:function(e){var t,i;BoundingRectangle.equals(e,this._viewport)||(BoundingRectangle.clone(e,this._viewport),t=this._viewport,(i=this._viewportCartesian4).x=t.x,i.y=t.y,i.z=t.width,i.w=t.height,this._viewportDirty=!0)}},viewportCartesian4:{get:function(){return this._viewportCartesian4}},viewportOrthographic:{get:function(){return cleanViewport(this),this._viewportOrthographicMatrix}},viewportTransformation:{get:function(){return cleanViewport(this),this._viewportTransformation}},model:{get:function(){return this._model},set:function(e){Matrix4.clone(e,this._model),this._modelView3DDirty=!0,this._inverseModelView3DDirty=!0,this._inverseModelDirty=!0,this._inverseTransposeModelDirty=!0,this._modelViewDirty=!0,this._inverseModelViewDirty=!0,this._modelViewRelativeToEyeDirty=!0,this._inverseModelViewDirty=!0,this._modelViewProjectionDirty=!0,this._inverseModelViewProjectionDirty=!0,this._modelViewProjectionRelativeToEyeDirty=!0,this._modelViewInfiniteProjectionDirty=!0,this._normalDirty=!0,this._inverseNormalDirty=!0,this._normal3DDirty=!0,this._inverseNormal3DDirty=!0,this._encodedCameraPositionMCDirty=!0}},inverseModel:{get:function(){return this._inverseModelDirty&&(this._inverseModelDirty=!1,Matrix4.inverse(this._model,this._inverseModel)),this._inverseModel}},inverseTransposeModel:{get:function(){var e=this._inverseTransposeModel;return this._inverseTransposeModelDirty&&(this._inverseTransposeModelDirty=!1,Matrix4.getMatrix3(this.inverseModel,e),Matrix3.transpose(e,e)),e}},view:{get:function(){return this._view}},view3D:{get:function(){return updateView3D(this),this._view3D}},viewRotation:{get:function(){return updateView3D(this),this._viewRotation}},viewRotation3D:{get:function(){return updateView3D(this),this._viewRotation3D}},inverseView:{get:function(){return this._inverseView}},inverseView3D:{get:function(){return updateInverseView3D(this),this._inverseView3D}},inverseViewRotation:{get:function(){return this._inverseViewRotation}},inverseViewRotation3D:{get:function(){return updateInverseView3D(this),this._inverseViewRotation3D}},projection:{get:function(){return this._projection}},inverseProjection:{get:function(){return cleanInverseProjection(this),this._inverseProjection}},infiniteProjection:{get:function(){return this._infiniteProjection}},modelView:{get:function(){return cleanModelView(this),this._modelView}},modelView3D:{get:function(){return cleanModelView3D(this),this._modelView3D}},modelViewRelativeToEye:{get:function(){return cleanModelViewRelativeToEye(this),this._modelViewRelativeToEye}},inverseModelView:{get:function(){return cleanInverseModelView(this),this._inverseModelView}},inverseModelView3D:{get:function(){return cleanInverseModelView3D(this),this._inverseModelView3D}},viewProjection:{get:function(){return cleanViewProjection(this),this._viewProjection}},inverseViewProjection:{get:function(){return cleanInverseViewProjection(this),this._inverseViewProjection}},modelViewProjection:{get:function(){return cleanModelViewProjection(this),this._modelViewProjection}},inverseModelViewProjection:{get:function(){return cleanInverseModelViewProjection(this),this._inverseModelViewProjection}},modelViewProjectionRelativeToEye:{get:function(){return cleanModelViewProjectionRelativeToEye(this),this._modelViewProjectionRelativeToEye}},modelViewInfiniteProjection:{get:function(){return cleanModelViewInfiniteProjection(this),this._modelViewInfiniteProjection}},normal:{get:function(){return cleanNormal(this),this._normal}},normal3D:{get:function(){return cleanNormal3D(this),this._normal3D}},inverseNormal:{get:function(){return cleanInverseNormal(this),this._inverseNormal}},inverseNormal3D:{get:function(){return cleanInverseNormal3D(this),this._inverseNormal3D}},entireFrustum:{get:function(){return this._entireFrustum}},currentFrustum:{get:function(){return this._currentFrustum}},frustumPlanes:{get:function(){return this._frustumPlanes}},farDepthFromNearPlusOne:{get:function(){return this._farDepthFromNearPlusOne}},log2FarDepthFromNearPlusOne:{get:function(){return this._log2FarDepthFromNearPlusOne}},oneOverLog2FarDepthFromNearPlusOne:{get:function(){return this._oneOverLog2FarDepthFromNearPlusOne}},eyeHeight:{get:function(){return this._eyeHeight}},eyeHeight2D:{get:function(){return this._eyeHeight2D}},sunPositionWC:{get:function(){return this._sunPositionWC}},sunPositionColumbusView:{get:function(){return this._sunPositionColumbusView}},sunDirectionWC:{get:function(){return this._sunDirectionWC}},sunDirectionEC:{get:function(){return this._sunDirectionEC}},moonDirectionEC:{get:function(){return this._moonDirectionEC}},lightDirectionWC:{get:function(){return this._lightDirectionWC}},lightDirectionEC:{get:function(){return this._lightDirectionEC}},lightColor:{get:function(){return this._lightColor}},lightColorHdr:{get:function(){return this._lightColorHdr}},encodedCameraPositionMCHigh:{get:function(){return cleanEncodedCameraPositionMC(this),this._encodedCameraPositionMC.high}},encodedCameraPositionMCLow:{get:function(){return cleanEncodedCameraPositionMC(this),this._encodedCameraPositionMC.low}},temeToPseudoFixedMatrix:{get:function(){return this._temeToPseudoFixed}},pixelRatio:{get:function(){return this._pixelRatio}},fogDensity:{get:function(){return this._fogDensity}},geometricToleranceOverMeter:{get:function(){return this._geometricToleranceOverMeter}},pass:{get:function(){return this._pass}},backgroundColor:{get:function(){return this._backgroundColor}},brdfLut:{get:function(){return this._brdfLut}},environmentMap:{get:function(){return this._environmentMap}},sphericalHarmonicCoefficients:{get:function(){return this._sphericalHarmonicCoefficients}},specularEnvironmentMaps:{get:function(){return this._specularEnvironmentMaps}},specularEnvironmentMapsDimensions:{get:function(){return this._specularEnvironmentMapsDimensions}},specularEnvironmentMapsMaximumLOD:{get:function(){return this._specularEnvironmentMapsMaximumLOD}},imagerySplitPosition:{get:function(){return this._imagerySplitPosition}},minimumDisableDepthTestDistance:{get:function(){return this._minimumDisableDepthTestDistance}},invertClassificationColor:{get:function(){return this._invertClassificationColor}},orthographicIn3D:{get:function(){return this._orthographicIn3D}},ellipsoid:{get:function(){return defaultValue(this._ellipsoid,Ellipsoid.WGS84)}}});var transformMatrix=new Matrix3,sunCartographicScratch=new Cartographic;function setSunAndMoonDirections(e,t){defined(Transforms.computeIcrfToFixedMatrix(t.time,transformMatrix))||(transformMatrix=Transforms.computeTemeToPseudoFixedMatrix(t.time,transformMatrix));var i=Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame(t.time,e._sunPositionWC);Matrix3.multiplyByVector(transformMatrix,i,i),Cartesian3.normalize(i,e._sunDirectionWC),i=Matrix3.multiplyByVector(e.viewRotation3D,i,e._sunDirectionEC),Cartesian3.normalize(i,i),i=Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame(t.time,e._moonDirectionEC),Matrix3.multiplyByVector(transformMatrix,i,i),Matrix3.multiplyByVector(e.viewRotation3D,i,i),Cartesian3.normalize(i,i);var r=t.mapProjection,n=r.ellipsoid.cartesianToCartographic(e._sunPositionWC,sunCartographicScratch);r.project(n,e._sunPositionColumbusView)}UniformState.prototype.updateCamera=function(e){setView(this,e.viewMatrix),setInverseView(this,e.inverseViewMatrix),setCamera(this,e),this._entireFrustum.x=e.frustum.near,this._entireFrustum.y=e.frustum.far,this.updateFrustum(e.frustum),this._orthographicIn3D=this._mode!==SceneMode$1.SCENE2D&&e.frustum instanceof OrthographicFrustum},UniformState.prototype.updateFrustum=function(e){setProjection(this,e.projectionMatrix),defined(e.infiniteProjectionMatrix)&&setInfiniteProjection(this,e.infiniteProjectionMatrix),this._currentFrustum.x=e.near,this._currentFrustum.y=e.far,this._farDepthFromNearPlusOne=e.far-e.near+1,this._log2FarDepthFromNearPlusOne=CesiumMath.log2(this._farDepthFromNearPlusOne),this._oneOverLog2FarDepthFromNearPlusOne=1/this._log2FarDepthFromNearPlusOne,defined(e._offCenterFrustum)&&(e=e._offCenterFrustum),this._frustumPlanes.x=e.top,this._frustumPlanes.y=e.bottom,this._frustumPlanes.z=e.left,this._frustumPlanes.w=e.right},UniformState.prototype.updatePass=function(e){this._pass=e};var EMPTY_ARRAY=[],defaultLight=new SunLight;function cleanViewport(e){var t;e._viewportDirty&&(t=e._viewport,Matrix4.computeOrthographicOffCenter(t.x,t.x+t.width,t.y,t.y+t.height,0,1,e._viewportOrthographicMatrix),Matrix4.computeViewportTransformation(t,0,1,e._viewportTransformation),e._viewportDirty=!1)}function cleanInverseProjection(e){e._inverseProjectionDirty&&(e._inverseProjectionDirty=!1,e._mode===SceneMode$1.SCENE2D||e._mode===SceneMode$1.MORPHING||e._orthographicIn3D?Matrix4.clone(Matrix4.ZERO,e._inverseProjection):Matrix4.inverse(e._projection,e._inverseProjection))}function cleanModelView(e){e._modelViewDirty&&(e._modelViewDirty=!1,Matrix4.multiplyTransformation(e._view,e._model,e._modelView))}function cleanModelView3D(e){e._modelView3DDirty&&(e._modelView3DDirty=!1,Matrix4.multiplyTransformation(e.view3D,e._model,e._modelView3D))}function cleanInverseModelView(e){e._inverseModelViewDirty&&(e._inverseModelViewDirty=!1,Matrix4.inverse(e.modelView,e._inverseModelView))}function cleanInverseModelView3D(e){e._inverseModelView3DDirty&&(e._inverseModelView3DDirty=!1,Matrix4.inverse(e.modelView3D,e._inverseModelView3D))}function cleanViewProjection(e){e._viewProjectionDirty&&(e._viewProjectionDirty=!1,Matrix4.multiply(e._projection,e._view,e._viewProjection))}function cleanInverseViewProjection(e){e._inverseViewProjectionDirty&&(e._inverseViewProjectionDirty=!1,Matrix4.inverse(e.viewProjection,e._inverseViewProjection))}function cleanModelViewProjection(e){e._modelViewProjectionDirty&&(e._modelViewProjectionDirty=!1,Matrix4.multiply(e._projection,e.modelView,e._modelViewProjection))}function cleanModelViewRelativeToEye(e){var t,i;e._modelViewRelativeToEyeDirty&&(e._modelViewRelativeToEyeDirty=!1,t=e.modelView,(i=e._modelViewRelativeToEye)[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=0,i[13]=0,i[14]=0,i[15]=t[15])}function cleanInverseModelViewProjection(e){e._inverseModelViewProjectionDirty&&(e._inverseModelViewProjectionDirty=!1,Matrix4.inverse(e.modelViewProjection,e._inverseModelViewProjection))}function cleanModelViewProjectionRelativeToEye(e){e._modelViewProjectionRelativeToEyeDirty&&(e._modelViewProjectionRelativeToEyeDirty=!1,Matrix4.multiply(e._projection,e.modelViewRelativeToEye,e._modelViewProjectionRelativeToEye))}function cleanModelViewInfiniteProjection(e){e._modelViewInfiniteProjectionDirty&&(e._modelViewInfiniteProjectionDirty=!1,Matrix4.multiply(e._infiniteProjection,e.modelView,e._modelViewInfiniteProjection))}function cleanNormal(e){var t;e._normalDirty&&(e._normalDirty=!1,t=e._normal,Matrix4.getMatrix3(e.inverseModelView,t),Matrix3.getRotation(t,t),Matrix3.transpose(t,t))}function cleanNormal3D(e){var t;e._normal3DDirty&&(e._normal3DDirty=!1,t=e._normal3D,Matrix4.getMatrix3(e.inverseModelView3D,t),Matrix3.getRotation(t,t),Matrix3.transpose(t,t))}function cleanInverseNormal(e){e._inverseNormalDirty&&(e._inverseNormalDirty=!1,Matrix4.getMatrix3(e.inverseModelView,e._inverseNormal),Matrix3.getRotation(e._inverseNormal,e._inverseNormal))}function cleanInverseNormal3D(e){e._inverseNormal3DDirty&&(e._inverseNormal3DDirty=!1,Matrix4.getMatrix3(e.inverseModelView3D,e._inverseNormal3D),Matrix3.getRotation(e._inverseNormal3D,e._inverseNormal3D))}UniformState.prototype.update=function(e){this._mode=e.mode,this._mapProjection=e.mapProjection,this._ellipsoid=e.mapProjection.ellipsoid,this._pixelRatio=e.pixelRatio;var t=e.camera;this.updateCamera(t),e.mode===SceneMode$1.SCENE2D?(this._frustum2DWidth=t.frustum.right-t.frustum.left,this._eyeHeight2D.x=.5*this._frustum2DWidth,this._eyeHeight2D.y=this._eyeHeight2D.x*this._eyeHeight2D.x):(this._frustum2DWidth=0,this._eyeHeight2D.x=0,this._eyeHeight2D.y=0),setSunAndMoonDirections(this,e);var i=defaultValue(e.light,defaultLight);i instanceof SunLight?(this._lightDirectionWC=Cartesian3.clone(this._sunDirectionWC,this._lightDirectionWC),this._lightDirectionEC=Cartesian3.clone(this._sunDirectionEC,this._lightDirectionEC)):(this._lightDirectionWC=Cartesian3.normalize(Cartesian3.negate(i.direction,this._lightDirectionWC),this._lightDirectionWC),this._lightDirectionEC=Matrix3.multiplyByVector(this.viewRotation3D,this._lightDirectionWC,this._lightDirectionEC));var r=i.color,n=Cartesian3.fromElements(r.red,r.green,r.blue,this._lightColorHdr),n=Cartesian3.multiplyByScalar(n,i.intensity,n),a=Cartesian3.maximumComponent(n);1<a?Cartesian3.divideByScalar(n,a,this._lightColor):Cartesian3.clone(n,this._lightColor);var o=e.brdfLutGenerator,s=defined(o)?o.colorTexture:void 0;this._brdfLut=s,this._environmentMap=defaultValue(e.environmentMap,e.context.defaultCubeMap),this._sphericalHarmonicCoefficients=defaultValue(e.sphericalHarmonicCoefficients,EMPTY_ARRAY),this._specularEnvironmentMaps=e.specularEnvironmentMaps,this._specularEnvironmentMapsMaximumLOD=e.specularEnvironmentMapsMaximumLOD,defined(this._specularEnvironmentMaps)&&Cartesian2.clone(this._specularEnvironmentMaps.dimensions,this._specularEnvironmentMapsDimensions),this._fogDensity=e.fog.density,this._invertClassificationColor=e.invertClassificationColor,this._frameState=e,this._temeToPseudoFixed=Transforms.computeTemeToPseudoFixedMatrix(e.time,this._temeToPseudoFixed),this._imagerySplitPosition=e.imagerySplitPosition*e.context.drawingBufferWidth;var l=t.frustum.fov,c=this._viewport,u=defined(l)?c.height>c.width?2*Math.tan(.5*l)/c.height:2*Math.tan(.5*l)/c.width:1/Math.max(c.width,c.height);this._geometricToleranceOverMeter=u*e.maximumScreenSpaceError,Color.clone(e.backgroundColor,this._backgroundColor),this._minimumDisableDepthTestDistance=e.minimumDisableDepthTestDistance,this._minimumDisableDepthTestDistance*=this._minimumDisableDepthTestDistance,this._minimumDisableDepthTestDistance===Number.POSITIVE_INFINITY&&(this._minimumDisableDepthTestDistance=-1)};var cameraPositionMC=new Cartesian3;function cleanEncodedCameraPositionMC(e){e._encodedCameraPositionMCDirty&&(e._encodedCameraPositionMCDirty=!1,Matrix4.multiplyByPoint(e.inverseModel,e._cameraPosition,cameraPositionMC),EncodedCartesian3.fromCartesian(cameraPositionMC,e._encodedCameraPositionMC))}var view2Dto3DPScratch=new Cartesian3,view2Dto3DRScratch=new Cartesian3,view2Dto3DUScratch=new Cartesian3,view2Dto3DDScratch=new Cartesian3,view2Dto3DCartographicScratch=new Cartographic,view2Dto3DCartesian3Scratch=new Cartesian3,view2Dto3DMatrix4Scratch=new Matrix4;function view2Dto3D(e,t,i,r,n,a,o,s){var l=view2Dto3DPScratch;l.x=e.y,l.y=e.z,l.z=e.x;var c=view2Dto3DRScratch;c.x=i.y,c.y=i.z,c.z=i.x;var u=view2Dto3DUScratch;u.x=r.y,u.y=r.z,u.z=r.x;var d=view2Dto3DDScratch;d.x=t.y,d.y=t.z,d.z=t.x,a===SceneMode$1.SCENE2D&&(l.z=.5*n);var h=o.unproject(l,view2Dto3DCartographicScratch);h.longitude=CesiumMath.clamp(h.longitude,-Math.PI,Math.PI),h.latitude=CesiumMath.clamp(h.latitude,-CesiumMath.PI_OVER_TWO,CesiumMath.PI_OVER_TWO);var p=o.ellipsoid,m=p.cartographicToCartesian(h,view2Dto3DCartesian3Scratch),f=Transforms.eastNorthUpToFixedFrame(m,p,view2Dto3DMatrix4Scratch);return Matrix4.multiplyByPointAsVector(f,c,c),Matrix4.multiplyByPointAsVector(f,u,u),Matrix4.multiplyByPointAsVector(f,d,d),defined(s)||(s=new Matrix4),s[0]=c.x,s[1]=u.x,s[2]=-d.x,s[3]=0,s[4]=c.y,s[5]=u.y,s[6]=-d.y,s[7]=0,s[8]=c.z,s[9]=u.z,s[10]=-d.z,s[11]=0,s[12]=-Cartesian3.dot(c,m),s[13]=-Cartesian3.dot(u,m),s[14]=Cartesian3.dot(d,m),s[15]=1,s}function updateView3D(e){e._view3DDirty&&(e._mode===SceneMode$1.SCENE3D?Matrix4.clone(e._view,e._view3D):view2Dto3D(e._cameraPosition,e._cameraDirection,e._cameraRight,e._cameraUp,e._frustum2DWidth,e._mode,e._mapProjection,e._view3D),Matrix4.getMatrix3(e._view3D,e._viewRotation3D),e._view3DDirty=!1)}function updateInverseView3D(e){e._inverseView3DDirty&&(Matrix4.inverseTransformation(e.view3D,e._inverseView3D),Matrix4.getMatrix3(e._inverseView3D,e._inverseViewRotation3D),e._inverseView3DDirty=!1)}function errorToString(e,t){var i="WebGL Error: ";switch(t){case e.INVALID_ENUM:i+="INVALID_ENUM";break;case e.INVALID_VALUE:i+="INVALID_VALUE";break;case e.INVALID_OPERATION:i+="INVALID_OPERATION";break;case e.OUT_OF_MEMORY:i+="OUT_OF_MEMORY";break;case e.CONTEXT_LOST_WEBGL:i+="CONTEXT_LOST_WEBGL lost";break;default:i+="Unknown ("+t+")"}return i}function createErrorMessage(e,t,i,r){for(var n=errorToString(e,r)+": "+t.name+"(",a=0;a<i.length;++a)0!==a&&(n+=", "),n+=i[a];return n+=");"}function throwOnError(e,t,i){var r=e.getError();if(r!==e.NO_ERROR)throw new RuntimeError(createErrorMessage(e,t,i,r))}function makeGetterSetter(t,i,r){return{get:function(){var e=t[i];return r(t,"get: "+i,e),t[i]},set:function(e){t[i]=e,r(t,"set: "+i,e)}}}function wrapGL(i,r){if(!defined(r))return i;var e={};for(var t in i){var n=i[t];n instanceof Function?e[t]=function(t){return function(){var e=t.apply(i,arguments);return r(i,t,arguments),e}}(n):Object.defineProperty(e,t,makeGetterSetter(i,t,r))}return e}function getExtension(e,t){for(var i=t.length,r=0;r<i;++r){var n=e.getExtension(t[r]);if(n)return n}}function Context(e,t){if("undefined"==typeof WebGLRenderingContext)throw new RuntimeError("The browser does not support WebGL. Visit http://get.webgl.org.");this._canvas=e,(t=defaultValue(t=clone(t,!0),{})).allowTextureFilterAnisotropic=defaultValue(t.allowTextureFilterAnisotropic,!0);var i=defaultValue(t.webgl,{});i.alpha=defaultValue(i.alpha,!1),i.stencil=defaultValue(i.stencil,!0);var r,n=defaultValue(t.requestWebgl2,!1)&&"undefined"!=typeof WebGL2RenderingContext,a=!1,o=t.getWebGLStub;if(defined(o))r=o(e,i);else if(n&&defined(r=e.getContext("webgl2",i)||e.getContext("experimental-webgl2",i)||void 0)&&(a=!0),defined(r)||(r=e.getContext("webgl",i)||e.getContext("experimental-webgl",i)||void 0),!defined(r))throw new RuntimeError("The browser supports WebGL, but initialization failed.");this._originalGLContext=r,this._gl=r,this._webgl2=a,this._id=createGuid(),this.validateFramebuffer=!1,this.validateShaderProgram=!1,this.logShaderCompilation=!1,this._throwOnWebGLError=!1,this._shaderCache=new ShaderCache(this),this._textureCache=new TextureCache;var s=r;this._stencilBits=s.getParameter(s.STENCIL_BITS),ContextLimits._maximumCombinedTextureImageUnits=s.getParameter(s.MAX_COMBINED_TEXTURE_IMAGE_UNITS),ContextLimits._maximumCubeMapSize=s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE),ContextLimits._maximumFragmentUniformVectors=s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS),ContextLimits._maximumTextureImageUnits=s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS),ContextLimits._maximumRenderbufferSize=s.getParameter(s.MAX_RENDERBUFFER_SIZE),ContextLimits._maximumTextureSize=s.getParameter(s.MAX_TEXTURE_SIZE),ContextLimits._maximumVaryingVectors=s.getParameter(s.MAX_VARYING_VECTORS),ContextLimits._maximumVertexAttributes=s.getParameter(s.MAX_VERTEX_ATTRIBS),ContextLimits._maximumVertexTextureImageUnits=s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS),ContextLimits._maximumVertexUniformVectors=s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS);var l=s.getParameter(s.ALIASED_LINE_WIDTH_RANGE);ContextLimits._minimumAliasedLineWidth=l[0],ContextLimits._maximumAliasedLineWidth=l[1];var c=s.getParameter(s.ALIASED_POINT_SIZE_RANGE);ContextLimits._minimumAliasedPointSize=c[0],ContextLimits._maximumAliasedPointSize=c[1];var u=s.getParameter(s.MAX_VIEWPORT_DIMS);ContextLimits._maximumViewportWidth=u[0],ContextLimits._maximumViewportHeight=u[1];var d=s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT);ContextLimits._highpFloatSupported=0!==d.precision;var h=s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_INT);ContextLimits._highpIntSupported=0!==h.rangeMax,this._antialias=s.getContextAttributes().antialias,this._standardDerivatives=!!getExtension(s,["OES_standard_derivatives"]),this._blendMinmax=!!getExtension(s,["EXT_blend_minmax"]),this._elementIndexUint=!!getExtension(s,["OES_element_index_uint"]),this._depthTexture=!!getExtension(s,["WEBGL_depth_texture","WEBKIT_WEBGL_depth_texture"]),this._fragDepth=!!getExtension(s,["EXT_frag_depth"]),this._debugShaders=getExtension(s,["WEBGL_debug_shaders"]),this._textureFloat=!!getExtension(s,["OES_texture_float"]),this._textureHalfFloat=!!getExtension(s,["OES_texture_half_float"]),this._textureFloatLinear=!!getExtension(s,["OES_texture_float_linear"]),this._textureHalfFloatLinear=!!getExtension(s,["OES_texture_half_float_linear"]),this._colorBufferFloat=!!getExtension(s,["EXT_color_buffer_float","WEBGL_color_buffer_float"]),this._floatBlend=!!getExtension(s,["EXT_float_blend"]),this._colorBufferHalfFloat=!!getExtension(s,["EXT_color_buffer_half_float"]),this._s3tc=!!getExtension(s,["WEBGL_compressed_texture_s3tc","MOZ_WEBGL_compressed_texture_s3tc","WEBKIT_WEBGL_compressed_texture_s3tc"]),this._pvrtc=!!getExtension(s,["WEBGL_compressed_texture_pvrtc","WEBKIT_WEBGL_compressed_texture_pvrtc"]),this._etc1=!!getExtension(s,["WEBGL_compressed_texture_etc1"]);var p,m,f,g,_,y,v,C,S,T,x,b=t.allowTextureFilterAnisotropic?getExtension(s,["EXT_texture_filter_anisotropic","WEBKIT_EXT_texture_filter_anisotropic"]):void 0;this._textureFilterAnisotropic=b,ContextLimits._maximumTextureFilterAnisotropy=defined(b)?s.getParameter(b.MAX_TEXTURE_MAX_ANISOTROPY_EXT):1,a?(g=this,_=function(){return g._gl.createVertexArray()},y=function(e){g._gl.bindVertexArray(e)},v=function(e){g._gl.deleteVertexArray(e)},C=function(e,t,i,r,n){s.drawElementsInstanced(e,t,i,r,n)},S=function(e,t,i,r){s.drawArraysInstanced(e,t,i,r)},T=function(e,t){s.vertexAttribDivisor(e,t)},x=function(e){s.drawBuffers(e)}):(defined(p=getExtension(s,["OES_vertex_array_object"]))&&(_=function(){return p.createVertexArrayOES()},y=function(e){p.bindVertexArrayOES(e)},v=function(e){p.deleteVertexArrayOES(e)}),defined(m=getExtension(s,["ANGLE_instanced_arrays"]))&&(C=function(e,t,i,r,n){m.drawElementsInstancedANGLE(e,t,i,r,n)},S=function(e,t,i,r){m.drawArraysInstancedANGLE(e,t,i,r)},T=function(e,t){m.vertexAttribDivisorANGLE(e,t)}),defined(f=getExtension(s,["WEBGL_draw_buffers"]))&&(x=function(e){f.drawBuffersWEBGL(e)})),this.glCreateVertexArray=_,this.glBindVertexArray=y,this.glDeleteVertexArray=v,this.glDrawElementsInstanced=C,this.glDrawArraysInstanced=S,this.glVertexAttribDivisor=T,this.glDrawBuffers=x,this._vertexArrayObject=!!p,this._instancedArrays=!!m,this._drawBuffers=!!f,ContextLimits._maximumDrawBuffers=this.drawBuffers?s.getParameter(WebGLConstants$1.MAX_DRAW_BUFFERS):1,ContextLimits._maximumColorAttachments=this.drawBuffers?s.getParameter(WebGLConstants$1.MAX_COLOR_ATTACHMENTS):1,this._clearColor=new Color(0,0,0,0),this._clearDepth=1,this._clearStencil=0;var E=new UniformState,P=new PassState(this),A=RenderState.fromCache();this._defaultPassState=P,this._defaultRenderState=A,this._defaultTexture=void 0,this._defaultCubeMap=void 0,this._us=E,this._currentRenderState=A,this._currentPassState=P,this._currentFramebuffer=void 0,this._maxFrameTextureUnitIndex=0,this._vertexAttribDivisors=[],this._previousDrawInstanced=!1;for(var w=0;w<ContextLimits._maximumVertexAttributes;w++)this._vertexAttribDivisors.push(0);this._pickObjects={},this._nextPickColor=new Uint32Array(1),this.options=t,this.cache={},RenderState.apply(s,A,P)}var defaultFramebufferMarker={},scratchBackBufferArray;function applyRenderState(e,t,i,r){var n=e._currentRenderState,a=e._currentPassState;e._currentRenderState=t,e._currentPassState=i,RenderState.partialApply(e._gl,n,t,a,i,r)}function bindFramebuffer(e,t){var i,r;t!==e._currentFramebuffer&&(e._currentFramebuffer=t,i=scratchBackBufferArray,defined(t)?(t._bind(),i=t._getActiveColorAttachments()):(r=e._gl).bindFramebuffer(r.FRAMEBUFFER,null),e.drawBuffers&&e.glDrawBuffers(i))}Object.defineProperties(Context.prototype,{id:{get:function(){return this._id}},webgl2:{get:function(){return this._webgl2}},canvas:{get:function(){return this._canvas}},shaderCache:{get:function(){return this._shaderCache}},textureCache:{get:function(){return this._textureCache}},uniformState:{get:function(){return this._us}},stencilBits:{get:function(){return this._stencilBits}},stencilBuffer:{get:function(){return 8<=this._stencilBits}},antialias:{get:function(){return this._antialias}},standardDerivatives:{get:function(){return this._standardDerivatives||this._webgl2}},floatBlend:{get:function(){return this._floatBlend}},blendMinmax:{get:function(){return this._blendMinmax||this._webgl2}},elementIndexUint:{get:function(){return this._elementIndexUint||this._webgl2}},depthTexture:{get:function(){return this._depthTexture||this._webgl2}},floatingPointTexture:{get:function(){return this._webgl2||this._textureFloat}},halfFloatingPointTexture:{get:function(){return this._webgl2||this._textureHalfFloat}},textureFloatLinear:{get:function(){return this._textureFloatLinear}},textureHalfFloatLinear:{get:function(){return this._webgl2&&this._textureFloatLinear||!this._webgl2&&this._textureHalfFloatLinear}},textureFilterAnisotropic:{get:function(){return!!this._textureFilterAnisotropic}},s3tc:{get:function(){return this._s3tc}},pvrtc:{get:function(){return this._pvrtc}},etc1:{get:function(){return this._etc1}},vertexArrayObject:{get:function(){return this._vertexArrayObject||this._webgl2}},fragmentDepth:{get:function(){return this._fragDepth||this._webgl2}},instancedArrays:{get:function(){return this._instancedArrays||this._webgl2}},colorBufferFloat:{get:function(){return this._colorBufferFloat}},colorBufferHalfFloat:{get:function(){return this._webgl2&&this._colorBufferFloat||!this._webgl2&&this._colorBufferHalfFloat}},drawBuffers:{get:function(){return this._drawBuffers||this._webgl2}},debugShaders:{get:function(){return this._debugShaders}},throwOnWebGLError:{get:function(){return this._throwOnWebGLError},set:function(e){this._throwOnWebGLError=e,this._gl=wrapGL(this._originalGLContext,e?throwOnError:void 0)}},defaultTexture:{get:function(){return void 0===this._defaultTexture&&(this._defaultTexture=new Texture({context:this,source:{width:1,height:1,arrayBufferView:new Uint8Array([255,255,255,255])},flipY:!1})),this._defaultTexture}},defaultCubeMap:{get:function(){var e;return void 0===this._defaultCubeMap&&(e={width:1,height:1,arrayBufferView:new Uint8Array([255,255,255,255])},this._defaultCubeMap=new CubeMap({context:this,source:{positiveX:e,negativeX:e,positiveY:e,negativeY:e,positiveZ:e,negativeZ:e},flipY:!1})),this._defaultCubeMap}},drawingBufferHeight:{get:function(){return this._gl.drawingBufferHeight}},drawingBufferWidth:{get:function(){return this._gl.drawingBufferWidth}},defaultFramebuffer:{get:function(){return defaultFramebufferMarker}}}),"undefined"!=typeof WebGLRenderingContext&&(scratchBackBufferArray=[WebGLConstants$1.BACK]);var defaultClearCommand=new ClearCommand;function beginDraw(e,t,i,r,n){bindFramebuffer(e,t),applyRenderState(e,n,i,!1),r._bind(),e._maxFrameTextureUnitIndex=Math.max(e._maxFrameTextureUnitIndex,r.maximumTextureUnitIndex)}function continueDraw(e,t,i,r){var n=t._primitiveType,a=t._vertexArray,o=t._offset,s=t._count,l=t.instanceCount;e._us.model=defaultValue(t._modelMatrix,Matrix4.IDENTITY),i._setUniforms(r,e._us,e.validateShaderProgram),a._bind();var c=a.indexBuffer;defined(c)?(o*=c.bytesPerIndex,s=defaultValue(s,c.numberOfIndices),0===l?e._gl.drawElements(n,s,c.indexDatatype,o):e.glDrawElementsInstanced(n,s,c.indexDatatype,o,l)):(s=defaultValue(s,a.numberOfVertices),0===l?e._gl.drawArrays(n,o,s):e.glDrawArraysInstanced(n,o,s,l)),a._unBind()}Context.prototype.clear=function(e,t){e=defaultValue(e,defaultClearCommand),t=defaultValue(t,this._defaultPassState);var i=this._gl,r=0,n=e.color,a=e.depth,o=e.stencil;defined(n)&&(Color.equals(this._clearColor,n)||(Color.clone(n,this._clearColor),i.clearColor(n.red,n.green,n.blue,n.alpha)),r|=i.COLOR_BUFFER_BIT),defined(a)&&(a!==this._clearDepth&&(this._clearDepth=a,i.clearDepth(a)),r|=i.DEPTH_BUFFER_BIT),defined(o)&&(o!==this._clearStencil&&(this._clearStencil=o,i.clearStencil(o)),r|=i.STENCIL_BUFFER_BIT),applyRenderState(this,defaultValue(e.renderState,this._defaultRenderState),t,!0),bindFramebuffer(this,defaultValue(e.framebuffer,t.framebuffer)),i.clear(r)},Context.prototype.draw=function(e,t,i,r){t=defaultValue(t,this._defaultPassState);var n=defaultValue(e._framebuffer,t.framebuffer),a=defaultValue(e._renderState,this._defaultRenderState);i=defaultValue(i,e._shaderProgram),r=defaultValue(r,e._uniformMap),beginDraw(this,n,t,i,a),continueDraw(this,e,i,r)},Context.prototype.endFrame=function(){var e=this._gl;e.useProgram(null),this._currentFramebuffer=void 0,e.bindFramebuffer(e.FRAMEBUFFER,null),this.drawBuffers&&this.glDrawBuffers(scratchBackBufferArray);for(var t=this._maxFrameTextureUnitIndex,i=this._maxFrameTextureUnitIndex=0;i<t;++i)e.activeTexture(e.TEXTURE0+i),e.bindTexture(e.TEXTURE_2D,null),e.bindTexture(e.TEXTURE_CUBE_MAP,null)},Context.prototype.readPixels=function(e){var t=this._gl;e=defaultValue(e,defaultValue.EMPTY_OBJECT);var i=Math.max(defaultValue(e.x,0),0),r=Math.max(defaultValue(e.y,0),0),n=defaultValue(e.width,t.drawingBufferWidth),a=defaultValue(e.height,t.drawingBufferHeight),o=e.framebuffer,s=PixelDatatype$1.UNSIGNED_BYTE;defined(o)&&0<o.numberOfColorAttachments&&(s=o.getColorTexture(0).pixelDatatype);var l=PixelFormat$1.createTypedArray(PixelFormat$1.RGBA,s,n,a);return bindFramebuffer(this,o),t.readPixels(i,r,n,a,PixelFormat$1.RGBA,PixelDatatype$1.toWebGLConstant(s,this),l),l};var viewportQuadAttributeLocations={position:0,textureCoordinates:1};function PickId(e,t,i){this._pickObjects=e,this.key=t,this.color=i}Context.prototype.getViewportQuadVertexArray=function(){var e,t=this.cache.viewportQuad_vertexArray;return defined(t)||(e=new Geometry({attributes:{position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:[-1,-1,1,-1,1,1,-1,1]}),textureCoordinates:new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:2,values:[0,0,1,0,1,1,0,1]})},indices:new Uint16Array([0,1,2,0,2,3]),primitiveType:PrimitiveType$1.TRIANGLES}),t=VertexArray.fromGeometry({context:this,geometry:e,attributeLocations:viewportQuadAttributeLocations,bufferUsage:BufferUsage$1.STATIC_DRAW,interleave:!0}),this.cache.viewportQuad_vertexArray=t),t},Context.prototype.createViewportQuadCommand=function(e,t){return t=defaultValue(t,defaultValue.EMPTY_OBJECT),new DrawCommand({vertexArray:this.getViewportQuadVertexArray(),primitiveType:PrimitiveType$1.TRIANGLES,renderState:t.renderState,shaderProgram:ShaderProgram.fromCache({context:this,vertexShaderSource:ViewportQuadVS,fragmentShaderSource:e,attributeLocations:viewportQuadAttributeLocations}),uniformMap:t.uniformMap,owner:t.owner,framebuffer:t.framebuffer,pass:t.pass})},Context.prototype.getObjectByPickColor=function(e){return this._pickObjects[e.toRgba()]},Object.defineProperties(PickId.prototype,{object:{get:function(){return this._pickObjects[this.key]},set:function(e){this._pickObjects[this.key]=e}}}),PickId.prototype.destroy=function(){delete this._pickObjects[this.key]},Context.prototype.createPickId=function(e){++this._nextPickColor[0];var t=this._nextPickColor[0];if(0===t)throw new RuntimeError("Out of unique Pick IDs.");return this._pickObjects[t]=e,new PickId(this._pickObjects,t,Color.fromRgba(t))},Context.prototype.isDestroyed=function(){return!1},Context.prototype.destroy=function(){var e,t=this.cache;for(var i in t){!t.hasOwnProperty(i)||defined((e=t[i]).destroy)&&e.destroy()}return this._shaderCache=this._shaderCache.destroy(),this._textureCache=this._textureCache.destroy(),this._defaultTexture=this._defaultTexture&&this._defaultTexture.destroy(),this._defaultCubeMap=this._defaultCubeMap&&this._defaultCubeMap.destroy(),destroyObject(this)};var RenderbufferFormat={RGBA4:WebGLConstants$1.RGBA4,RGB5_A1:WebGLConstants$1.RGB5_A1,RGB565:WebGLConstants$1.RGB565,DEPTH_COMPONENT16:WebGLConstants$1.DEPTH_COMPONENT16,STENCIL_INDEX8:WebGLConstants$1.STENCIL_INDEX8,DEPTH_STENCIL:WebGLConstants$1.DEPTH_STENCIL,validate:function(e){return e===RenderbufferFormat.RGBA4||e===RenderbufferFormat.RGB5_A1||e===RenderbufferFormat.RGB565||e===RenderbufferFormat.DEPTH_COMPONENT16||e===RenderbufferFormat.STENCIL_INDEX8||e===RenderbufferFormat.DEPTH_STENCIL}},RenderbufferFormat$1=Object.freeze(RenderbufferFormat);function Renderbuffer(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context._gl,i=defaultValue(e.format,RenderbufferFormat$1.RGBA4),r=defined(e.width)?e.width:t.drawingBufferWidth,n=defined(e.height)?e.height:t.drawingBufferHeight;this._gl=t,this._format=i,this._width=r,this._height=n,this._renderbuffer=this._gl.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,this._renderbuffer),t.renderbufferStorage(t.RENDERBUFFER,i,r,n),t.bindRenderbuffer(t.RENDERBUFFER,null)}function loadCubeMap(t,e){var i={flipY:!0,preferImageBitmap:!0},r=[Resource.createIfNeeded(e.positiveX).fetchImage(i),Resource.createIfNeeded(e.negativeX).fetchImage(i),Resource.createIfNeeded(e.positiveY).fetchImage(i),Resource.createIfNeeded(e.negativeY).fetchImage(i),Resource.createIfNeeded(e.positiveZ).fetchImage(i),Resource.createIfNeeded(e.negativeZ).fetchImage(i)];return when.all(r,function(e){return new CubeMap({context:t,source:{positiveX:e[0],negativeX:e[1],positiveY:e[2],negativeY:e[3],positiveZ:e[4],negativeZ:e[5]}})})}function DiscardMissingTileImagePolicy(l){l=defaultValue(l,defaultValue.EMPTY_OBJECT),this._pixelsToCheck=l.pixelsToCheck,this._missingImagePixels=void 0,this._missingImageByteLength=void 0,this._isReady=!1;var e=Resource.createIfNeeded(l.missingImageUrl),c=this;e.fetchImage({preferBlob:!0,preferImageBitmap:!0,flipY:!0}).then(function(e){defined(e.blob)&&(c._missingImageByteLength=e.blob.size);var t=getImagePixels(e);if(l.disableCheckIfAllPixelsAreTransparent){for(var i=!0,r=e.width,n=l.pixelsToCheck,a=0,o=n.length;i&&a<o;++a){var s=n[a];0<t[3+(4*s.x+s.y*r)]&&(i=!1)}i&&(t=void 0)}c._missingImagePixels=t,c._isReady=!0}).otherwise(function(){c._missingImagePixels=void 0,c._isReady=!0})}function ImageryLayerFeatureInfo(){this.name=void 0,this.description=void 0,this.position=void 0,this.data=void 0,this.imageryLayer=void 0}function ImageryProvider(){this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0,DeveloperError.throwInstantiationError()}Object.defineProperties(Renderbuffer.prototype,{format:{get:function(){return this._format}},width:{get:function(){return this._width}},height:{get:function(){return this._height}}}),Renderbuffer.prototype._getRenderbuffer=function(){return this._renderbuffer},Renderbuffer.prototype.isDestroyed=function(){return!1},Renderbuffer.prototype.destroy=function(){return this._gl.deleteRenderbuffer(this._renderbuffer),destroyObject(this)},DiscardMissingTileImagePolicy.prototype.isReady=function(){return this._isReady},DiscardMissingTileImagePolicy.prototype.shouldDiscardImage=function(e){var t=this._pixelsToCheck,i=this._missingImagePixels;if(!defined(i))return!1;if(defined(e.blob)&&e.blob.size!==this._missingImageByteLength)return!1;for(var r=getImagePixels(e),n=e.width,a=0,o=t.length;a<o;++a)for(var s=t[a],l=4*s.x+s.y*n,c=0;c<4;++c){var u=l+c;if(r[u]!==i[u])return!1}return!0},ImageryLayerFeatureInfo.prototype.configureNameFromProperties=function(e){var t,i,r=10;for(var n in e){e.hasOwnProperty(n)&&e[n]&&(i=n.toLowerCase(),1<r&&"name"===i?(r=1,t=n):2<r&&"title"===i?(r=2,t=n):3<r&&/name/i.test(n)?(r=3,t=n):4<r&&/title/i.test(n)&&(r=4,t=n))}defined(t)&&(this.name=e[t])},ImageryLayerFeatureInfo.prototype.configureDescriptionFromProperties=function(e){this.description=function e(t){var i,r='<table class="cesium-infoBox-defaultTable">';for(var n in t)!t.hasOwnProperty(n)||defined(i=t[n])&&(r+="object"==typeof i?"<tr><td>"+n+"</td><td>"+e(i)+"</td></tr>":"<tr><td>"+n+"</td><td>"+i+"</td></tr>");return r+="</table>"}(e)},Object.defineProperties(ImageryProvider.prototype,{ready:{get:DeveloperError.throwInstantiationError},readyPromise:{get:DeveloperError.throwInstantiationError},rectangle:{get:DeveloperError.throwInstantiationError},tileWidth:{get:DeveloperError.throwInstantiationError},tileHeight:{get:DeveloperError.throwInstantiationError},maximumLevel:{get:DeveloperError.throwInstantiationError},minimumLevel:{get:DeveloperError.throwInstantiationError},tilingScheme:{get:DeveloperError.throwInstantiationError},tileDiscardPolicy:{get:DeveloperError.throwInstantiationError},errorEvent:{get:DeveloperError.throwInstantiationError},credit:{get:DeveloperError.throwInstantiationError},proxy:{get:DeveloperError.throwInstantiationError},hasAlphaChannel:{get:DeveloperError.throwInstantiationError}}),ImageryProvider.prototype.getTileCredits=function(e,t,i){DeveloperError.throwInstantiationError()},ImageryProvider.prototype.requestImage=function(e,t,i,r){DeveloperError.throwInstantiationError()},ImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){DeveloperError.throwInstantiationError()};var ktxRegex$2=/\.ktx$/i,crnRegex$2=/\.crn$/i;function ArcGisMapServerImageryProvider(l){l=defaultValue(l,defaultValue.EMPTY_OBJECT),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var e=Resource.createIfNeeded(l.url);e.appendForwardSlash(),defined(l.token)&&e.setQueryParameters({token:l.token}),this._resource=e,this._tileDiscardPolicy=l.tileDiscardPolicy,this._tileWidth=defaultValue(l.tileWidth,256),this._tileHeight=defaultValue(l.tileHeight,256),this._maximumLevel=l.maximumLevel,this._tilingScheme=defaultValue(l.tilingScheme,new GeographicTilingScheme({ellipsoid:l.ellipsoid})),this._useTiles=defaultValue(l.usePreCachedTilesIfAvailable,!0),this._rectangle=defaultValue(l.rectangle,this._tilingScheme.rectangle),this._layers=l.layers;var t=l.credit;"string"==typeof t&&(t=new Credit(t)),this._credit=t,this.enablePickFeatures=defaultValue(l.enablePickFeatures,!0),this._errorEvent=new Event,this._ready=!1,this._readyPromise=when.defer();var c,u=this;function i(e){var t=e.tileInfo;if(defined(t)){if(u._tileWidth=t.rows,u._tileHeight=t.cols,102100===t.spatialReference.wkid||102113===t.spatialReference.wkid)u._tilingScheme=new WebMercatorTilingScheme({ellipsoid:l.ellipsoid});else{if(4326!==e.tileInfo.spatialReference.wkid){var i="Tile spatial reference WKID "+e.tileInfo.spatialReference.wkid+" is not supported.";return void(c=TileProviderError.handleError(c,u,u._errorEvent,i,void 0,void 0,void 0,d))}u._tilingScheme=new GeographicTilingScheme({ellipsoid:l.ellipsoid})}if(u._maximumLevel=e.tileInfo.lods.length-1,defined(e.fullExtent)){if(defined(e.fullExtent.spatialReference)&&defined(e.fullExtent.spatialReference.wkid))if(102100===e.fullExtent.spatialReference.wkid||102113===e.fullExtent.spatialReference.wkid){var r=new WebMercatorProjection,n=e.fullExtent,a=r.unproject(new Cartesian3(Math.max(n.xmin,-u._tilingScheme.ellipsoid.maximumRadius*Math.PI),Math.max(n.ymin,-u._tilingScheme.ellipsoid.maximumRadius*Math.PI),0)),o=r.unproject(new Cartesian3(Math.min(n.xmax,u._tilingScheme.ellipsoid.maximumRadius*Math.PI),Math.min(n.ymax,u._tilingScheme.ellipsoid.maximumRadius*Math.PI),0));u._rectangle=new Rectangle(a.longitude,a.latitude,o.longitude,o.latitude)}else{if(4326!==e.fullExtent.spatialReference.wkid){var s="fullExtent.spatialReference WKID "+e.fullExtent.spatialReference.wkid+" is not supported.";return void(c=TileProviderError.handleError(c,u,u._errorEvent,s,void 0,void 0,void 0,d))}u._rectangle=Rectangle.fromDegrees(e.fullExtent.xmin,e.fullExtent.ymin,e.fullExtent.xmax,e.fullExtent.ymax)}}else u._rectangle=u._tilingScheme.rectangle;defined(u._tileDiscardPolicy)||(u._tileDiscardPolicy=new DiscardMissingTileImagePolicy({missingImageUrl:buildImageResource(u,0,0,u._maximumLevel).url,pixelsToCheck:[new Cartesian2(0,0),new Cartesian2(200,20),new Cartesian2(20,200),new Cartesian2(80,110),new Cartesian2(160,130)],disableCheckIfAllPixelsAreTransparent:!0})),u._useTiles=!0}else u._useTiles=!1;defined(e.copyrightText)&&0<e.copyrightText.length&&(u._credit=new Credit(e.copyrightText)),u._ready=!0,u._readyPromise.resolve(!0),TileProviderError.handleSuccess(c)}function r(e){var t="An error occurred while accessing "+u._resource.url+".";c=TileProviderError.handleError(c,u,u._errorEvent,t,void 0,void 0,void 0,d),u._readyPromise.reject(new RuntimeError(t))}function d(){when(u._resource.getDerivedResource({queryParameters:{f:"json"}}).fetchJsonp(),i,r)}this._useTiles?d():(this._ready=!0,this._readyPromise.resolve(!0))}function buildImageResource(e,t,i,r,n){var a,o,s=e._useTiles?e._resource.getDerivedResource({url:"tile/"+r+"/"+i+"/"+t,request:n}):(o={bbox:(a=e._tilingScheme.tileXYToNativeRectangle(t,i,r)).west+","+a.south+","+a.east+","+a.north,size:e._tileWidth+","+e._tileHeight,format:"png",transparent:!0,f:"image"},e._tilingScheme.projection instanceof GeographicProjection?(o.bboxSR=4326,o.imageSR=4326):(o.bboxSR=3857,o.imageSR=3857),e.layers&&(o.layers="show:"+e.layers),e._resource.getDerivedResource({url:"export",request:n,queryParameters:o}));return s}function AutoExposure(){this._uniformMap=void 0,this._command=void 0,this._colorTexture=void 0,this._depthTexture=void 0,this._ready=!1,this._name="czm_autoexposure",this._logDepthChanged=void 0,this._useLogDepth=void 0,this._framebuffers=void 0,this._previousLuminance=void 0,this._commands=void 0,this._clearCommand=void 0,this._minMaxLuminance=new Cartesian2,this.enabled=!0,this._enabled=!0,this.minimumLuminance=.1,this.maximumLuminance=10}function destroyFramebuffers(e){var t=e._framebuffers;if(defined(t)){for(var i=t.length,r=0;r<i;++r)t[r].destroy();e._framebuffers=void 0,e._previousLuminance.destroy(),e._previousLuminance=void 0}}function createFramebuffers(e,t){destroyFramebuffers(e);for(var i=e._width,r=e._height,n=PixelFormat$1.RGBA,a=t.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT,o=Math.ceil(Math.log(Math.max(i,r))/Math.log(3)),s=new Array(o),l=0;l<o;++l)i=Math.max(Math.ceil(i/3),1),r=Math.max(Math.ceil(r/3),1),s[l]=new Framebuffer({context:t,colorTextures:[new Texture({context:t,width:i,height:r,pixelFormat:n,pixelDatatype:a,sampler:Sampler.NEAREST})]});var c=s[o-1].getColorTexture(0);e._previousLuminance=new Framebuffer({context:t,colorTextures:[new Texture({context:t,width:c.width,height:c.height,pixelFormat:n,pixelDatatype:a,sampler:Sampler.NEAREST})]}),e._framebuffers=s}function destroyCommands(e){var t=e._commands;if(defined(t)){for(var i=t.length,r=0;r<i;++r)t[r].shaderProgram.destroy();e._commands=void 0}}function createUniformMap$4(e,t){var i,r;return(r=0===t?{colorTexture:function(){return e._colorTexture},colorTextureDimensions:function(){return e._colorTexture.dimensions}}:(i=e._framebuffers[t-1].getColorTexture(0),{colorTexture:function(){return i},colorTextureDimensions:function(){return i.dimensions}})).minMaxLuminance=function(){return e._minMaxLuminance},r.previousLuminance=function(){return e._previousLuminance.getColorTexture(0)},r}function getShaderSource(e,t){var i="uniform sampler2D colorTexture; \nvarying vec2 v_textureCoordinates; \nfloat sampleTexture(vec2 offset) { \n";return i+=0===e?" vec4 color = texture2D(colorTexture, v_textureCoordinates + offset); \n return czm_luminance(color.rgb); \n":" return texture2D(colorTexture, v_textureCoordinates + offset).r; \n",i+="}\n\n",i+="uniform vec2 colorTextureDimensions; \nuniform vec2 minMaxLuminance; \nuniform sampler2D previousLuminance; \nvoid main() { \n float color = 0.0; \n float xStep = 1.0 / colorTextureDimensions.x; \n float yStep = 1.0 / colorTextureDimensions.y; \n int count = 0; \n for (int i = 0; i < 3; ++i) { \n for (int j = 0; j < 3; ++j) { \n vec2 offset; \n offset.x = -xStep + float(i) * xStep; \n offset.y = -yStep + float(j) * yStep; \n if (offset.x < 0.0 || offset.x > 1.0 || offset.y < 0.0 || offset.y > 1.0) { \n continue; \n } \n color += sampleTexture(offset); \n ++count; \n } \n } \n if (count > 0) { \n color /= float(count); \n } \n",e===t-1&&(i+=" float previous = texture2D(previousLuminance, vec2(0.5)).r; \n color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); \n color = previous + (color - previous) / (60.0 * 1.5); \n color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); \n"),i+=" gl_FragColor = vec4(color); \n} \n"}function createCommands$5(e,t){destroyCommands(e);for(var i=e._framebuffers,r=i.length,n=new Array(r),a=0;a<r;++a)n[a]=t.createViewportQuadCommand(getShaderSource(a,r),{framebuffer:i[a],uniformMap:createUniformMap$4(e,a)});e._commands=n}ImageryProvider.loadImage=function(e,t){var i=Resource.createIfNeeded(t);return ktxRegex$2.test(i.url)?loadKTX(i):crnRegex$2.test(i.url)?loadCRN(i):defined(e)&&defined(e.tileDiscardPolicy)?i.fetchImage({preferBlob:!0,preferImageBitmap:!0,flipY:!0}):i.fetchImage({preferImageBitmap:!0,flipY:!0})},Object.defineProperties(ArcGisMapServerImageryProvider.prototype,{url:{get:function(){return this._resource._url}},token:{get:function(){return this._resource.queryParameters.token}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},credit:{get:function(){return this._credit}},usingPrecachedTiles:{get:function(){return this._useTiles}},hasAlphaChannel:{get:function(){return!0}},layers:{get:function(){return this._layers}}}),ArcGisMapServerImageryProvider.prototype.getTileCredits=function(e,t,i){},ArcGisMapServerImageryProvider.prototype.requestImage=function(e,t,i,r){return ImageryProvider.loadImage(this,buildImageResource(this,e,t,i,r))},ArcGisMapServerImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){if(this.enablePickFeatures){var a,o,s,l,c=this._tilingScheme.tileXYToNativeRectangle(e,t,i);l=this._tilingScheme.projection instanceof GeographicProjection?(o=CesiumMath.toDegrees(r),s=CesiumMath.toDegrees(n),"4326"):(o=(a=this._tilingScheme.projection.project(new Cartographic(r,n,0))).x,s=a.y,"3857");var u="visible";defined(this._layers)&&(u+=":"+this._layers);var d={f:"json",tolerance:2,geometryType:"esriGeometryPoint",geometry:o+","+s,mapExtent:c.west+","+c.south+","+c.east+","+c.north,imageDisplay:this._tileWidth+","+this._tileHeight+",96",sr:l,layers:u};return this._resource.getDerivedResource({url:"identify",queryParameters:d}).fetchJson().then(function(e){var t=[],i=e.results;if(!defined(i))return t;for(var r=0;r<i.length;++r){var n,a,o=i[r],s=new ImageryLayerFeatureInfo;s.data=o,s.name=o.value,s.properties=o.attributes,s.configureDescriptionFromProperties(o.attributes),"esriGeometryPoint"===o.geometryType&&o.geometry&&(4326===(n=o.geometry.spatialReference&&o.geometry.spatialReference.wkid?o.geometry.spatialReference.wkid:4326)||4283===n?s.position=Cartographic.fromDegrees(o.geometry.x,o.geometry.y,o.geometry.z):102100!==n&&900913!==n&&3857!==n||(a=new WebMercatorProjection,s.position=a.unproject(new Cartesian3(o.geometry.x,o.geometry.y,o.geometry.z)))),t.push(s)}return t})}},Object.defineProperties(AutoExposure.prototype,{ready:{get:function(){return this._ready}},name:{get:function(){return this._name}},outputTexture:{get:function(){var e=this._framebuffers;if(defined(e))return e[e.length-1].getColorTexture(0)}}}),AutoExposure.prototype.clear=function(e){var t=this._framebuffers;if(defined(t)){var i=this._clearCommand;defined(i)||(i=this._clearCommand=new ClearCommand({color:new Color(0,0,0,0),framebuffer:void 0}));for(var r=t.length,n=0;n<r;++n)i.framebuffer=t[n],i.execute(e)}},AutoExposure.prototype.update=function(e){var t=e.drawingBufferWidth,i=e.drawingBufferHeight;t===this._width&&i===this._height||(this._width=t,this._height=i,createFramebuffers(this,e),createCommands$5(this,e),this._ready||(this._ready=!0)),this._minMaxLuminance.x=this.minimumLuminance,this._minMaxLuminance.y=this.maximumLuminance;var r=this._framebuffers,n=r[r.length-1];r[r.length-1]=this._previousLuminance,this._commands[this._commands.length-1].framebuffer=this._previousLuminance,this._previousLuminance=n},AutoExposure.prototype.execute=function(e,t){this._colorTexture=t;var i=this._commands;if(defined(i))for(var r=i.length,n=0;n<r;++n)i[n].execute(e)},AutoExposure.prototype.isDestroyed=function(){return!1},AutoExposure.prototype.destroy=function(){return destroyFramebuffers(this),destroyCommands(this),destroyObject(this)};var BingMapsStyle={AERIAL:"Aerial",AERIAL_WITH_LABELS:"AerialWithLabels",AERIAL_WITH_LABELS_ON_DEMAND:"AerialWithLabelsOnDemand",ROAD:"Road",ROAD_ON_DEMAND:"RoadOnDemand",CANVAS_DARK:"CanvasDark",CANVAS_LIGHT:"CanvasLight",CANVAS_GRAY:"CanvasGray",ORDNANCE_SURVEY:"OrdnanceSurvey",COLLINS_BART:"CollinsBart"},BingMapsStyle$1=Object.freeze(BingMapsStyle),emptyImage;function DiscardEmptyTileImagePolicy(e){}function BingMapsImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=BingMapsApi._getKeyNoDeprecate(e.key);this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=1,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0,this._key=t,this._resource=Resource.createIfNeeded(e.url),this._resource.appendForwardSlash(),this._tileProtocol=e.tileProtocol,this._mapStyle=defaultValue(e.mapStyle,BingMapsStyle$1.AERIAL),this._culture=defaultValue(e.culture,""),this._tileDiscardPolicy=e.tileDiscardPolicy,defined(this._tileDiscardPolicy)||(this._tileDiscardPolicy=new DiscardEmptyTileImagePolicy),this._proxy=e.proxy,this._credit=new Credit('<a href="http://www.bing.com"><img src="'+BingMapsImageryProvider.logoUrl+'" title="Bing Imagery"/></a>'),this._tilingScheme=new WebMercatorTilingScheme({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,ellipsoid:e.ellipsoid}),this._tileWidth=void 0,this._tileHeight=void 0,this._maximumLevel=void 0,this._imageUrlTemplate=void 0,this._imageUrlSubdomains=void 0,this._errorEvent=new Event,this._ready=!1,this._readyPromise=when.defer();var i=this._tileProtocol;defined(i)?0<i.length&&":"===i[i.length-1]&&(i=i.substr(0,i.length-1)):i="http:"===document.location.protocol?"http":"https";var d,r=this._resource.getDerivedResource({url:"REST/v1/Imagery/Metadata/"+this._mapStyle,queryParameters:{incl:"ImageryProviders",key:this._key,uriScheme:i}}),h=this;function n(e){if(1===e.resourceSets.length){var t=e.resourceSets[0].resources[0];h._tileWidth=t.imageWidth,h._tileHeight=t.imageHeight,h._maximumLevel=t.zoomMax-1,h._imageUrlSubdomains=t.imageUrlSubdomains,h._imageUrlTemplate=t.imageUrl;for(var i=h._attributionList=t.imageryProviders,r=0,n=(i=i||(h._attributionList=[])).length;r<n;++r){var a=i[r];if(a.credit instanceof Credit)break;a.credit=new Credit(a.attribution);for(var o=a.coverageAreas,s=0,l=a.coverageAreas.length;s<l;++s){var c=o[s],u=c.bbox;c.bbox=new Rectangle(CesiumMath.toRadians(u[1]),CesiumMath.toRadians(u[0]),CesiumMath.toRadians(u[3]),CesiumMath.toRadians(u[2]))}}h._ready=!0,h._readyPromise.resolve(!0),TileProviderError.handleSuccess(d)}else p()}function p(e){var t="An error occurred while accessing "+r.url+".";d=TileProviderError.handleError(d,h,h._errorEvent,t,void 0,void 0,void 0,o),h._readyPromise.reject(new RuntimeError(t))}var a=r.url;function o(){var e=r.fetchJsonp("jsonp");(BingMapsImageryProvider._metadataCache[a]=e).then(n).otherwise(p)}var s=BingMapsImageryProvider._metadataCache[a];defined(s)?s.then(n).otherwise(p):o()}DiscardEmptyTileImagePolicy.prototype.isReady=function(){return!0},DiscardEmptyTileImagePolicy.prototype.shouldDiscardImage=function(e){return DiscardEmptyTileImagePolicy.EMPTY_IMAGE===e},Object.defineProperties(DiscardEmptyTileImagePolicy,{EMPTY_IMAGE:{get:function(){return defined(emptyImage)||((emptyImage=new Image).src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),emptyImage}}}),Object.defineProperties(BingMapsImageryProvider.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},key:{get:function(){return this._key}},mapStyle:{get:function(){return this._mapStyle}},culture:{get:function(){return this._culture}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!1}}});var rectangleScratch$5=new Rectangle;function buildImageResource$1(e,t,i,r,n){var a=e._imageUrlTemplate,o=e._imageUrlSubdomains,s=(t+i+r)%o.length;return e._resource.getDerivedResource({url:a,request:n,templateValues:{quadkey:BingMapsImageryProvider.tileXYToQuadKey(t,i,r),subdomain:o[s],culture:e._culture},queryParameters:{n:"z"}})}BingMapsImageryProvider.prototype.getTileCredits=function(e,t,i){var r=this._tilingScheme.tileXYToRectangle(e,t,i,rectangleScratch$5);return getRectangleAttribution(this._attributionList,i,r)},BingMapsImageryProvider.prototype.requestImage=function(e,t,i,r){var n=ImageryProvider.loadImage(this,buildImageResource$1(this,e,t,i,r));if(defined(n))return n.otherwise(function(e){return defined(e.blob)&&0===e.blob.size?DiscardEmptyTileImagePolicy.EMPTY_IMAGE:when.reject(e)})},BingMapsImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){},BingMapsImageryProvider.tileXYToQuadKey=function(e,t,i){for(var r="",n=i;0<=n;--n){var a=1<<n,o=0;0!=(e&a)&&(o|=1),0!=(t&a)&&(o|=2),r+=o}return r},BingMapsImageryProvider.quadKeyToTileXY=function(e){for(var t=0,i=0,r=e.length-1,n=r;0<=n;--n){var a=1<<n,o=+e[r-n];0!=(1&o)&&(t|=a),0!=(2&o)&&(i|=a)}return{x:t,y:i,level:r}},BingMapsImageryProvider._logoUrl=void 0,Object.defineProperties(BingMapsImageryProvider,{logoUrl:{get:function(){return defined(BingMapsImageryProvider._logoUrl)||(BingMapsImageryProvider._logoUrl=buildModuleUrl("Assets/Images/bing_maps_credit.png")),BingMapsImageryProvider._logoUrl},set:function(e){BingMapsImageryProvider._logoUrl=e}}});var intersectionScratch$1=new Rectangle;function getRectangleAttribution(e,t,i){++t;for(var r=[],n=0,a=e.length;n<a;++n){for(var o=e[n],s=o.coverageAreas,l=!1,c=0,u=o.coverageAreas.length;!l&&c<u;++c){var d=s[c];t>=d.zoomMin&&t<=d.zoomMax&&defined(Rectangle.intersection(i,d.bbox,intersectionScratch$1))&&(l=!0)}l&&r.push(o.credit)}return r}BingMapsImageryProvider._metadataCache={};var defaultDimensions=new Cartesian3(1,1,1);function BoxEmitter(e){e=defaultValue(e,defaultDimensions),this._dimensions=Cartesian3.clone(e)}Object.defineProperties(BoxEmitter.prototype,{dimensions:{get:function(){return this._dimensions},set:function(e){Cartesian3.clone(e,this._dimensions)}}});var scratchHalfDim=new Cartesian3;BoxEmitter.prototype.emit=function(e){var t=this._dimensions,i=Cartesian3.multiplyByScalar(t,.5,scratchHalfDim),r=CesiumMath.randomBetween(-i.x,i.x),n=CesiumMath.randomBetween(-i.y,i.y),a=CesiumMath.randomBetween(-i.z,i.z);e.position=Cartesian3.fromElements(r,n,a,e.position),e.velocity=Cartesian3.normalize(e.position,e.velocity)};var BrdfLutGeneratorFS="varying vec2 v_textureCoordinates;\nconst float M_PI = 3.141592653589793;\nfloat vdcRadicalInverse(int i)\n{\nfloat r;\nfloat base = 2.0;\nfloat value = 0.0;\nfloat invBase = 1.0 / base;\nfloat invBi = invBase;\nfor (int x = 0; x < 100; x++)\n{\nif (i <= 0)\n{\nbreak;\n}\nr = mod(float(i), base);\nvalue += r * invBi;\ninvBi *= invBase;\ni = int(float(i) * invBase);\n}\nreturn value;\n}\nvec2 hammersley2D(int i, int N)\n{\nreturn vec2(float(i) / float(N), vdcRadicalInverse(i));\n}\nvec3 importanceSampleGGX(vec2 xi, float roughness, vec3 N)\n{\nfloat a = roughness * roughness;\nfloat phi = 2.0 * M_PI * xi.x;\nfloat cosTheta = sqrt((1.0 - xi.y) / (1.0 + (a * a - 1.0) * xi.y));\nfloat sinTheta = sqrt(1.0 - cosTheta * cosTheta);\nvec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\nvec3 upVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\nvec3 tangentX = normalize(cross(upVector, N));\nvec3 tangentY = cross(N, tangentX);\nreturn tangentX * H.x + tangentY * H.y + N * H.z;\n}\nfloat G1_Smith(float NdotV, float k)\n{\nreturn NdotV / (NdotV * (1.0 - k) + k);\n}\nfloat G_Smith(float roughness, float NdotV, float NdotL)\n{\nfloat k = roughness * roughness / 2.0;\nreturn G1_Smith(NdotV, k) * G1_Smith(NdotL, k);\n}\nvec2 integrateBrdf(float roughness, float NdotV)\n{\nvec3 V = vec3(sqrt(1.0 - NdotV * NdotV), 0.0, NdotV);\nfloat A = 0.0;\nfloat B = 0.0;\nconst int NumSamples = 1024;\nfor (int i = 0; i < NumSamples; i++)\n{\nvec2 xi = hammersley2D(i, NumSamples);\nvec3 H = importanceSampleGGX(xi, roughness, vec3(0.0, 0.0, 1.0));\nvec3 L = 2.0 * dot(V, H) * H - V;\nfloat NdotL = clamp(L.z, 0.0, 1.0);\nfloat NdotH = clamp(H.z, 0.0, 1.0);\nfloat VdotH = clamp(dot(V, H), 0.0, 1.0);\nif (NdotL > 0.0)\n{\nfloat G = G_Smith(roughness, NdotV, NdotL);\nfloat G_Vis = G * VdotH / (NdotH * NdotV);\nfloat Fc = pow(1.0 - VdotH, 5.0);\nA += (1.0 - Fc) * G_Vis;\nB += Fc * G_Vis;\n}\n}\nreturn vec2(A, B) / float(NumSamples);\n}\nvoid main()\n{\ngl_FragColor = vec4(integrateBrdf(v_textureCoordinates.y, v_textureCoordinates.x), 0.0, 1.0);\n}\n";function BrdfLutGenerator(){this._framebuffer=void 0,this._colorTexture=void 0,this._drawCommand=void 0}function createCommand$1(e,t){var i=e._framebuffer,r=t.createViewportQuadCommand(BrdfLutGeneratorFS,{framebuffer:i,renderState:RenderState.fromCache({viewport:new BoundingRectangle(0,0,256,256)})});e._drawCommand=r}function createFramebuffer$2(e,t){var i=new Texture({context:t,width:256,height:256,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),r=new Framebuffer({context:t,colorTextures:[e._colorTexture=i],destroyAttachments:!1});e._framebuffer=r}Object.defineProperties(BrdfLutGenerator.prototype,{colorTexture:{get:function(){return this._colorTexture}}}),BrdfLutGenerator.prototype.update=function(e){var t;defined(this._colorTexture)||(createFramebuffer$2(this,t=e.context),createCommand$1(this,t),this._drawCommand.execute(t),this._framebuffer=this._framebuffer&&this._framebuffer.destroy(),this._drawCommand.shaderProgram=this._drawCommand.shaderProgram&&this._drawCommand.shaderProgram.destroy())},BrdfLutGenerator.prototype.isDestroyed=function(){return!1},BrdfLutGenerator.prototype.destroy=function(){return this._colorTexture=this._colorTexture&&this._colorTexture.destroy(),destroyObject(this)};var CameraFlightPath={};function getAltitude(e,t,i){if(e instanceof PerspectiveFrustum){var r=Math.tan(.5*e.fovy),n=e.near,a=e.near*r,o=e.aspectRatio*a;return Math.max(t*n/o,i*n/a)}return e instanceof PerspectiveOffCenterFrustum?(n=e.near,a=e.top,o=e.right,Math.max(t*n/o,i*n/a)):Math.max(t,i)}var scratchCart=new Cartesian3,scratchCart2$2=new Cartesian3;function createPitchFunction(n,a,o,e){if(defined(e)&&o(.5)>e){var s=o(0),l=o(1),t=o(.5),c=t-s,u=t-l;return function(e){var t=o(e);if(e<=.5){var i=(t-s)/c;return CesiumMath.lerp(n,-CesiumMath.PI_OVER_TWO,i)}var r=(t-l)/u;return CesiumMath.lerp(-CesiumMath.PI_OVER_TWO,a,1-r)}}return function(e){return CesiumMath.lerp(n,a,e)}}function createHeightFunction(e,t,i,r,n){var a,o,s,l,c,u,d,h=n,p=Math.max(i,r);if(defined(h)||(a=e.position,o=e.up,s=e.right,l=e.frustum,c=Cartesian3.subtract(a,t,scratchCart),u=Cartesian3.magnitude(Cartesian3.multiplyByScalar(o,Cartesian3.dot(c,o),scratchCart2$2)),d=Cartesian3.magnitude(Cartesian3.multiplyByScalar(s,Cartesian3.dot(c,s),scratchCart2$2)),h=Math.min(.2*getAltitude(l,u,d),1e9)),p<h){var m=-Math.pow(1e6*(h-i),1/8),f=Math.pow(1e6*(h-r),1/8);return function(e){var t=e*(f-m)+m;return-Math.pow(t,8)/1e6+h}}return function(e){return CesiumMath.lerp(i,r,e)}}function adjustAngleForLERP(e,t){return CesiumMath.equalsEpsilon(e,CesiumMath.TWO_PI,CesiumMath.EPSILON11)&&(e=0),t>e+Math.PI?e+=CesiumMath.TWO_PI:t<e-Math.PI&&(e-=CesiumMath.TWO_PI),e}var scratchStart=new Cartesian3;function createUpdateCV(e,i,r,n,a,o,t){var s=e.camera,l=Cartesian3.clone(s.position,scratchStart),c=s.pitch,u=adjustAngleForLERP(s.heading,n),d=adjustAngleForLERP(s.roll,o),h=createHeightFunction(s,r,l.z,r.z,t);return function(e){var t=e.time/i;s.setView({orientation:{heading:CesiumMath.lerp(u,n,t),pitch:CesiumMath.lerp(c,a,t),roll:CesiumMath.lerp(d,o,t)}}),Cartesian2.lerp(l,r,t,s.position),s.position.z=h(t)}}function useLongestFlight(e,t){e.longitude<t.longitude?e.longitude+=CesiumMath.TWO_PI:t.longitude+=CesiumMath.TWO_PI}function useShortestFlight(e,t){var i=e.longitude-t.longitude;i<-CesiumMath.PI?e.longitude+=CesiumMath.TWO_PI:i>CesiumMath.PI&&(t.longitude+=CesiumMath.TWO_PI)}var scratchStartCart=new Cartographic,scratchEndCart=new Cartographic;function createUpdate3D(e,r,t,n,i,a,o,s,l,c){var u=e.camera,d=e.mapProjection.ellipsoid,h=Cartographic.clone(u.positionCartographic,scratchStartCart),p=u.pitch,m=adjustAngleForLERP(u.heading,n),f=adjustAngleForLERP(u.roll,a),g=d.cartesianToCartographic(t,scratchEndCart);h.longitude=CesiumMath.zeroToTwoPi(h.longitude),g.longitude=CesiumMath.zeroToTwoPi(g.longitude);var _,y,v,C,S,T,x=!1;defined(s)&&(_=CesiumMath.zeroToTwoPi(s),y=Math.min(h.longitude,g.longitude),v=Math.max(h.longitude,g.longitude),C=y<=_&&_<=v,defined(l)?(S=Math.abs(h.longitude-g.longitude),T=CesiumMath.TWO_PI-S,(C?S:T)<(C?T:S)*l&&!C&&(x=!0)):C||(x=!0)),(x?useLongestFlight:useShortestFlight)(h,g);var b,E,P,A,w=createHeightFunction(u,t,h.height,g.height,o),D=createPitchFunction(p,i,w,c);return b=h.longitude,E=g.longitude,P=h.latitude,A=g.latitude,function(e){var t=e.time/r,i=Cartesian3.fromRadians(CesiumMath.lerp(b,E,t),CesiumMath.lerp(P,A,t),w(t));u.setView({destination:i,orientation:{heading:CesiumMath.lerp(m,n,t),pitch:D(t),roll:CesiumMath.lerp(f,a,t)}})}}function createUpdate2D(e,o,s,l,t,i,r){var c=e.camera,u=Cartesian3.clone(c.position,scratchStart),d=adjustAngleForLERP(c.heading,l),n=c.frustum.right-c.frustum.left,h=createHeightFunction(c,s,n,s.z,r);return function(e){var t=e.time/o;c.setView({orientation:{heading:CesiumMath.lerp(d,l,t)}}),Cartesian2.lerp(u,s,t,c.position);var i=h(t),r=c.frustum,n=r.top/r.right,a=.5*(i-(r.right-r.left));r.right+=a,r.left-=a,r.top=n*r.right,r.bottom=-r.top}}var scratchCartographic$b=new Cartographic,scratchDestination=new Cartesian3;function emptyFlight(e,t){return{startObject:{},stopObject:{},duration:0,complete:e,cancel:t}}function wrapCallback(e,t){return function(){"function"==typeof t&&t(),e.enableInputs=!0}}CameraFlightPath.createTween=function(e,t){var i=(t=defaultValue(t,defaultValue.EMPTY_OBJECT)).destination,r=e.mode;if(r===SceneMode$1.MORPHING)return emptyFlight();var n=defaultValue(t.convert,!0),a=e.mapProjection,o=a.ellipsoid,s=t.maximumHeight,l=t.flyOverLongitude,c=t.flyOverLongitudeWeight,u=t.pitchAdjustHeight,d=t.easingFunction;n&&r!==SceneMode$1.SCENE3D&&(o.cartesianToCartographic(i,scratchCartographic$b),i=a.project(scratchCartographic$b,scratchDestination));var h=e.camera,p=t.endTransform;defined(p)&&h._setTransform(p);var m=t.duration;defined(m)||(m=Math.ceil(Cartesian3.distance(h.position,i)/1e6)+2,m=Math.min(m,3));var f=defaultValue(t.heading,0),g=defaultValue(t.pitch,-CesiumMath.PI_OVER_TWO),_=defaultValue(t.roll,0),y=e.screenSpaceCameraController;y.enableInputs=!1;var v=wrapCallback(y,t.complete),C=wrapCallback(y,t.cancel),S=h.frustum,T=e.mode===SceneMode$1.SCENE2D;if(T=(T=(T=(T=T&&Cartesian2.equalsEpsilon(h.position,i,CesiumMath.EPSILON6))&&CesiumMath.equalsEpsilon(Math.max(S.right-S.left,S.top-S.bottom),i.z,CesiumMath.EPSILON6))||e.mode!==SceneMode$1.SCENE2D&&Cartesian3.equalsEpsilon(i,h.position,CesiumMath.EPSILON10))&&CesiumMath.equalsEpsilon(CesiumMath.negativePiToPi(f),CesiumMath.negativePiToPi(h.heading),CesiumMath.EPSILON10)&&CesiumMath.equalsEpsilon(CesiumMath.negativePiToPi(g),CesiumMath.negativePiToPi(h.pitch),CesiumMath.EPSILON10)&&CesiumMath.equalsEpsilon(CesiumMath.negativePiToPi(_),CesiumMath.negativePiToPi(h.roll),CesiumMath.EPSILON10))return emptyFlight(v,C);var x=new Array(4);if(x[SceneMode$1.SCENE2D]=createUpdate2D,x[SceneMode$1.SCENE3D]=createUpdate3D,x[SceneMode$1.COLUMBUS_VIEW]=createUpdateCV,m<=0){return emptyFlight(function(){x[r](e,1,i,f,g,_,s,l,c,u)({time:1}),"function"==typeof v&&v()},C)}var b,E=x[r](e,m,i,f,g,_,s,l,c,u);return defined(d)||(b=h.positionCartographic.height,d=(r===SceneMode$1.SCENE3D?o.cartesianToCartographic(i).height:i.z)<b&&11500<b?EasingFunction$1.CUBIC_OUT:EasingFunction$1.QUINTIC_IN_OUT),{duration:m,easingFunction:d,startObject:{time:0},stopObject:{time:m},update:E,complete:v,cancel:C}};var MapMode2D={ROTATE:0,INFINITE_SCROLL:1},MapMode2D$1=Object.freeze(MapMode2D);function Camera(e){this._scene=e,this._transform=Matrix4.clone(Matrix4.IDENTITY),this._invTransform=Matrix4.clone(Matrix4.IDENTITY),this._actualTransform=Matrix4.clone(Matrix4.IDENTITY),this._actualInvTransform=Matrix4.clone(Matrix4.IDENTITY),this._transformChanged=!1,this.position=new Cartesian3,this._position=new Cartesian3,this._positionWC=new Cartesian3,this._positionCartographic=new Cartographic,this._oldPositionWC=void 0,this.positionWCDeltaMagnitude=0,this.positionWCDeltaMagnitudeLastFrame=0,this.timeSinceMoved=0,this._lastMovedTimestamp=0,this.direction=new Cartesian3,this._direction=new Cartesian3,this._directionWC=new Cartesian3,this.up=new Cartesian3,this._up=new Cartesian3,this._upWC=new Cartesian3,this.right=new Cartesian3,this._right=new Cartesian3,this._rightWC=new Cartesian3,this.frustum=new PerspectiveFrustum,this.frustum.aspectRatio=e.drawingBufferWidth/e.drawingBufferHeight,this.frustum.fov=CesiumMath.toRadians(60),this.defaultMoveAmount=1e5,this.defaultLookAmount=Math.PI/60,this.defaultRotateAmount=Math.PI/3600,this.defaultZoomAmount=1e5,this.constrainedAxis=void 0,this.maximumZoomFactor=1.5,this._moveStart=new Event,this._moveEnd=new Event,this._changed=new Event,this._changedPosition=void 0,this._changedDirection=void 0,this._changedFrustum=void 0,this.percentageChanged=.5,this._viewMatrix=new Matrix4,this._invViewMatrix=new Matrix4,updateViewMatrix(this),this._mode=SceneMode$1.SCENE3D,this._modeChanged=!0;var t=e.mapProjection;this._projection=t,this._maxCoord=t.project(new Cartographic(Math.PI,CesiumMath.PI_OVER_TWO)),this._max2Dfrustum=void 0,rectangleCameraPosition3D(this,Camera.DEFAULT_VIEW_RECTANGLE,this.position,!0);var i=Cartesian3.magnitude(this.position);i+=i*Camera.DEFAULT_VIEW_FACTOR,Cartesian3.normalize(this.position,this.position),Cartesian3.multiplyByScalar(this.position,i,this.position)}function updateViewMatrix(e){Matrix4.computeView(e._position,e._direction,e._up,e._right,e._viewMatrix),Matrix4.multiply(e._viewMatrix,e._actualInvTransform,e._viewMatrix),Matrix4.inverseTransformation(e._viewMatrix,e._invViewMatrix)}function updateCameraDeltas(e){var t;defined(e._oldPositionWC)?(e.positionWCDeltaMagnitudeLastFrame=e.positionWCDeltaMagnitude,t=Cartesian3.subtract(e.positionWC,e._oldPositionWC,e._oldPositionWC),e.positionWCDeltaMagnitude=Cartesian3.magnitude(t),e._oldPositionWC=Cartesian3.clone(e.positionWC,e._oldPositionWC),0<e.positionWCDeltaMagnitude?(e.timeSinceMoved=0,e._lastMovedTimestamp=getTimestamp$1()):e.timeSinceMoved=Math.max(getTimestamp$1()-e._lastMovedTimestamp,0)/1e3):e._oldPositionWC=Cartesian3.clone(e.positionWC,e._oldPositionWC)}function convertTransformForColumbusView(e){Transforms.basisTo2D(e._projection,e._transform,e._actualTransform)}Camera.TRANSFORM_2D=new Matrix4(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1),Camera.TRANSFORM_2D_INVERSE=Matrix4.inverseTransformation(Camera.TRANSFORM_2D,new Matrix4),Camera.DEFAULT_VIEW_RECTANGLE=Rectangle.fromDegrees(-95,-20,-70,90),Camera.DEFAULT_VIEW_FACTOR=.5,Camera.DEFAULT_OFFSET=new HeadingPitchRange(0,-CesiumMath.PI_OVER_FOUR,0),Camera.prototype.canPreloadFlight=function(){return defined(this._currentFlight)&&this._mode!==SceneMode$1.SCENE2D},Camera.prototype._updateCameraChanged=function(){var e=this;if(updateCameraDeltas(e),0!==e._changed.numberOfListeners){var t=e.percentageChanged;if(e._mode!==SceneMode$1.SCENE2D){if(!defined(e._changedDirection))return e._changedPosition=Cartesian3.clone(e.positionWC,e._changedPosition),void(e._changedDirection=Cartesian3.clone(e.directionWC,e._changedDirection));var i=CesiumMath.acosClamped(Cartesian3.dot(e.directionWC,e._changedDirection)),r=defined(e.frustum.fovy)?i/(.5*e.frustum.fovy):i,n=Cartesian3.distance(e.positionWC,e._changedPosition)/e.positionCartographic.height;(t<r||t<n)&&(e._changed.raiseEvent(Math.max(r,n)),e._changedPosition=Cartesian3.clone(e.positionWC,e._changedPosition),e._changedDirection=Cartesian3.clone(e.directionWC,e._changedDirection))}else{if(!defined(e._changedFrustum))return e._changedPosition=Cartesian3.clone(e.position,e._changedPosition),void(e._changedFrustum=e.frustum.clone());var a,o,s=e.position,l=e._changedPosition,c=e.frustum,u=e._changedFrustum,d=s.x+c.left,h=s.x+c.right,p=l.x+u.left,m=l.x+u.right,f=s.y+c.bottom,g=s.y+c.top,_=l.y+u.bottom,y=l.y+u.top,v=Math.max(d,p),C=Math.min(h,m),S=Math.max(f,_),T=Math.min(g,y);t<(o=C<=v||g<=S?1:1-(C-v)*(T-S)/(((a=d<p&&m<h&&f<_&&y<g?c:u).right-a.left)*(a.top-a.bottom)))&&(e._changed.raiseEvent(o),e._changedPosition=Cartesian3.clone(e.position,e._changedPosition),e._changedFrustum=e.frustum.clone(e._changedFrustum))}}};var scratchCartographic$c=new Cartographic,scratchCartesian3Projection$1=new Cartesian3,scratchCartesian3$c=new Cartesian3,scratchCartesian4Origin=new Cartesian4,scratchCartesian4NewOrigin=new Cartesian4,scratchCartesian4NewXAxis=new Cartesian4,scratchCartesian4NewYAxis=new Cartesian4,scratchCartesian4NewZAxis=new Cartesian4;function convertTransformFor2D(e){var t=e._projection,i=t.ellipsoid,r=Matrix4.getColumn(e._transform,3,scratchCartesian4Origin),n=i.cartesianToCartographic(r,scratchCartographic$c),a=t.project(n,scratchCartesian3Projection$1),o=scratchCartesian4NewOrigin;o.x=a.z,o.y=a.x,o.z=a.y,o.w=1;var s=Cartesian4.clone(Cartesian4.UNIT_X,scratchCartesian4NewZAxis),l=Cartesian4.add(Matrix4.getColumn(e._transform,0,scratchCartesian3$c),r,scratchCartesian3$c);i.cartesianToCartographic(l,n),t.project(n,a);var c=scratchCartesian4NewXAxis;c.x=a.z,c.y=a.x,c.z=a.y,c.w=0,Cartesian3.subtract(c,o,c),c.x=0;var u,d=scratchCartesian4NewYAxis;Cartesian3.magnitudeSquared(c)>CesiumMath.EPSILON10?Cartesian3.cross(s,c,d):(u=Cartesian4.add(Matrix4.getColumn(e._transform,1,scratchCartesian3$c),r,scratchCartesian3$c),i.cartesianToCartographic(u,n),t.project(n,a),d.x=a.z,d.y=a.x,d.z=a.y,d.w=0,Cartesian3.subtract(d,o,d),d.x=0,Cartesian3.magnitudeSquared(d)<CesiumMath.EPSILON10&&(Cartesian4.clone(Cartesian4.UNIT_Y,c),Cartesian4.clone(Cartesian4.UNIT_Z,d))),Cartesian3.cross(d,s,c),Cartesian3.normalize(c,c),Cartesian3.cross(s,c,d),Cartesian3.normalize(d,d),Matrix4.setColumn(e._actualTransform,0,c,e._actualTransform),Matrix4.setColumn(e._actualTransform,1,d,e._actualTransform),Matrix4.setColumn(e._actualTransform,2,s,e._actualTransform),Matrix4.setColumn(e._actualTransform,3,o,e._actualTransform)}var scratchCartesian$8=new Cartesian3;function updateMembers(e){var t=e._mode,i=!1,r=0;t===SceneMode$1.SCENE2D&&(i=(r=e.frustum.right-e.frustum.left)!==e._positionCartographic.height);var n=e._position,a=!Cartesian3.equals(n,e.position)||i;a&&(n=Cartesian3.clone(e.position,e._position));var o=e._direction,s=!Cartesian3.equals(o,e.direction);s&&(Cartesian3.normalize(e.direction,e.direction),o=Cartesian3.clone(e.direction,e._direction));var l=e._up,c=!Cartesian3.equals(l,e.up);c&&(Cartesian3.normalize(e.up,e.up),l=Cartesian3.clone(e.up,e._up));var u=e._right,d=!Cartesian3.equals(u,e.right);d&&(Cartesian3.normalize(e.right,e.right),u=Cartesian3.clone(e.right,e._right));var h=e._transformChanged||e._modeChanged;e._transformChanged=!1,h&&(Matrix4.inverseTransformation(e._transform,e._invTransform),e._mode===SceneMode$1.COLUMBUS_VIEW||e._mode===SceneMode$1.SCENE2D?Matrix4.equals(Matrix4.IDENTITY,e._transform)?Matrix4.clone(Camera.TRANSFORM_2D,e._actualTransform):(e._mode===SceneMode$1.COLUMBUS_VIEW?convertTransformForColumbusView:convertTransformFor2D)(e):Matrix4.clone(e._transform,e._actualTransform),Matrix4.inverseTransformation(e._actualTransform,e._actualInvTransform),e._modeChanged=!1);var p,m,f,g,_,y=e._actualTransform;(a||h)&&(e._positionWC=Matrix4.multiplyByPoint(y,n,e._positionWC),t===SceneMode$1.SCENE3D||t===SceneMode$1.MORPHING?e._positionCartographic=e._projection.ellipsoid.cartesianToCartographic(e._positionWC,e._positionCartographic):((p=scratchCartesian$8).x=e._positionWC.y,p.y=e._positionWC.z,p.z=e._positionWC.x,t===SceneMode$1.SCENE2D&&(p.z=r),e._projection.unproject(p,e._positionCartographic))),(s||c||d)&&(m=Cartesian3.dot(o,Cartesian3.cross(l,u,scratchCartesian$8)),Math.abs(1-m)>CesiumMath.EPSILON2&&(f=1/Cartesian3.magnitudeSquared(l),g=Cartesian3.dot(l,o)*f,_=Cartesian3.multiplyByScalar(o,g,scratchCartesian$8),l=Cartesian3.normalize(Cartesian3.subtract(l,_,e._up),e._up),Cartesian3.clone(l,e.up),u=Cartesian3.cross(o,l,e._right),Cartesian3.clone(u,e.right))),(s||h)&&(e._directionWC=Matrix4.multiplyByPointAsVector(y,o,e._directionWC),Cartesian3.normalize(e._directionWC,e._directionWC)),(c||h)&&(e._upWC=Matrix4.multiplyByPointAsVector(y,l,e._upWC),Cartesian3.normalize(e._upWC,e._upWC)),(d||h)&&(e._rightWC=Matrix4.multiplyByPointAsVector(y,u,e._rightWC),Cartesian3.normalize(e._rightWC,e._rightWC)),(a||s||c||d||h)&&updateViewMatrix(e)}function getHeading(e,t){var i=CesiumMath.equalsEpsilon(Math.abs(e.z),1,CesiumMath.EPSILON3)?Math.atan2(t.y,t.x)-CesiumMath.PI_OVER_TWO:Math.atan2(e.y,e.x)-CesiumMath.PI_OVER_TWO;return CesiumMath.TWO_PI-CesiumMath.zeroToTwoPi(i)}function getPitch(e){return CesiumMath.PI_OVER_TWO-CesiumMath.acosClamped(e.z)}function getRoll(e,t,i){var r=0;return CesiumMath.equalsEpsilon(Math.abs(e.z),1,CesiumMath.EPSILON3)||(r=Math.atan2(-i.z,t.z),r=CesiumMath.zeroToTwoPi(r+CesiumMath.TWO_PI)),r}var scratchHPRMatrix1=new Matrix4,scratchHPRMatrix2=new Matrix4;Object.defineProperties(Camera.prototype,{transform:{get:function(){return this._transform}},inverseTransform:{get:function(){return updateMembers(this),this._invTransform}},viewMatrix:{get:function(){return updateMembers(this),this._viewMatrix}},inverseViewMatrix:{get:function(){return updateMembers(this),this._invViewMatrix}},positionCartographic:{get:function(){return updateMembers(this),this._positionCartographic}},positionWC:{get:function(){return updateMembers(this),this._positionWC}},directionWC:{get:function(){return updateMembers(this),this._directionWC}},upWC:{get:function(){return updateMembers(this),this._upWC}},rightWC:{get:function(){return updateMembers(this),this._rightWC}},heading:{get:function(){if(this._mode!==SceneMode$1.MORPHING){var e=this._projection.ellipsoid,t=Matrix4.clone(this._transform,scratchHPRMatrix1),i=Transforms.eastNorthUpToFixedFrame(this.positionWC,e,scratchHPRMatrix2);this._setTransform(i);var r=getHeading(this.direction,this.up);return this._setTransform(t),r}}},pitch:{get:function(){if(this._mode!==SceneMode$1.MORPHING){var e=this._projection.ellipsoid,t=Matrix4.clone(this._transform,scratchHPRMatrix1),i=Transforms.eastNorthUpToFixedFrame(this.positionWC,e,scratchHPRMatrix2);this._setTransform(i);var r=getPitch(this.direction);return this._setTransform(t),r}}},roll:{get:function(){if(this._mode!==SceneMode$1.MORPHING){var e=this._projection.ellipsoid,t=Matrix4.clone(this._transform,scratchHPRMatrix1),i=Transforms.eastNorthUpToFixedFrame(this.positionWC,e,scratchHPRMatrix2);this._setTransform(i);var r=getRoll(this.direction,this.up,this.right);return this._setTransform(t),r}}},moveStart:{get:function(){return this._moveStart}},moveEnd:{get:function(){return this._moveEnd}},changed:{get:function(){return this._changed}}}),Camera.prototype.update=function(e){var t,i,r=!1;e!==this._mode&&(this._mode=e,this._modeChanged=e!==SceneMode$1.MORPHING,r=this._mode===SceneMode$1.SCENE2D),r&&(i=(t=this._max2Dfrustum=this.frustum.clone()).top/t.right,t.right=2*this._maxCoord.x,t.left=-t.right,t.top=i*t.right,t.bottom=-t.top),this._mode===SceneMode$1.SCENE2D&&clampMove2D(this,this.position)};var setTransformPosition=new Cartesian3,setTransformUp=new Cartesian3,setTransformDirection=new Cartesian3;Camera.prototype._setTransform=function(e){var t=Cartesian3.clone(this.positionWC,setTransformPosition),i=Cartesian3.clone(this.upWC,setTransformUp),r=Cartesian3.clone(this.directionWC,setTransformDirection);Matrix4.clone(e,this._transform),this._transformChanged=!0,updateMembers(this);var n=this._actualInvTransform;Matrix4.multiplyByPoint(n,t,this.position),Matrix4.multiplyByPointAsVector(n,r,this.direction),Matrix4.multiplyByPointAsVector(n,i,this.up),Cartesian3.cross(this.direction,this.up,this.right),updateMembers(this)};var scratchAdjustOrthographicFrustumMousePosition=new Cartesian2,scratchPickRay=new Ray,scratchRayIntersection=new Cartesian3,scratchDepthIntersection=new Cartesian3;function calculateOrthographicFrustumWidth(e){if(!Matrix4.equals(Matrix4.IDENTITY,e.transform))return Cartesian3.magnitude(e.position);var t,i,r,n,a,o=e._scene,s=o.globe,l=scratchAdjustOrthographicFrustumMousePosition;return l.x=o.drawingBufferWidth/2,l.y=o.drawingBufferHeight/2,defined(s)&&(t=e.getPickRay(l,scratchPickRay),i=s.pickWorldCoordinates(t,o,!0,scratchRayIntersection)),o.pickPositionSupported&&(r=o.pickPositionWorldCoordinates(l,scratchDepthIntersection)),defined(i)||defined(r)?(n=defined(r)?Cartesian3.distance(r,e.positionWC):Number.POSITIVE_INFINITY,a=defined(i)?Cartesian3.distance(i,e.positionWC):Number.POSITIVE_INFINITY,Math.min(n,a)):Math.max(e.positionCartographic.height,0)}Camera.prototype._adjustOrthographicFrustum=function(e){this.frustum instanceof OrthographicFrustum&&(!e&&this._positionCartographic.height<15e4||(this.frustum.width=calculateOrthographicFrustumWidth(this)))};var scratchSetViewCartesian=new Cartesian3,scratchSetViewTransform1=new Matrix4,scratchSetViewTransform2=new Matrix4,scratchSetViewQuaternion=new Quaternion,scratchSetViewMatrix3=new Matrix3,scratchSetViewCartographic=new Cartographic;function setView3D(e,t,i){var r=Matrix4.clone(e.transform,scratchSetViewTransform1),n=Transforms.eastNorthUpToFixedFrame(t,e._projection.ellipsoid,scratchSetViewTransform2);e._setTransform(n),Cartesian3.clone(Cartesian3.ZERO,e.position),i.heading=i.heading-CesiumMath.PI_OVER_TWO;var a=Quaternion.fromHeadingPitchRoll(i,scratchSetViewQuaternion),o=Matrix3.fromQuaternion(a,scratchSetViewMatrix3);Matrix3.getColumn(o,0,e.direction),Matrix3.getColumn(o,2,e.up),Cartesian3.cross(e.direction,e.up,e.right),e._setTransform(r),e._adjustOrthographicFrustum(!0)}function setViewCV(e,t,i,r){var n,a,o=Matrix4.clone(e.transform,scratchSetViewTransform1);e._setTransform(Matrix4.IDENTITY),Cartesian3.equals(t,e.positionWC)||(r&&(a=(n=e._projection).ellipsoid.cartesianToCartographic(t,scratchSetViewCartographic),t=n.project(a,scratchSetViewCartesian)),Cartesian3.clone(t,e.position)),i.heading=i.heading-CesiumMath.PI_OVER_TWO;var s=Quaternion.fromHeadingPitchRoll(i,scratchSetViewQuaternion),l=Matrix3.fromQuaternion(s,scratchSetViewMatrix3);Matrix3.getColumn(l,0,e.direction),Matrix3.getColumn(l,2,e.up),Cartesian3.cross(e.direction,e.up,e.right),e._setTransform(o),e._adjustOrthographicFrustum(!0)}function setView2D(e,t,i,r){var n,a,o,s,l,c,u,d,h=Matrix4.clone(e.transform,scratchSetViewTransform1);e._setTransform(Matrix4.IDENTITY),Cartesian3.equals(t,e.positionWC)||(r&&(a=(n=e._projection).ellipsoid.cartesianToCartographic(t,scratchSetViewCartographic),t=n.project(a,scratchSetViewCartesian)),Cartesian2.clone(t,e.position),s=-(o=.5*-t.z),l=e.frustum,o<s&&(c=l.top/l.right,l.right=s,l.left=o,l.top=l.right*c,l.bottom=-l.top)),e._scene.mapMode2D===MapMode2D$1.ROTATE&&(i.heading=i.heading-CesiumMath.PI_OVER_TWO,i.pitch=-CesiumMath.PI_OVER_TWO,i.roll=0,u=Quaternion.fromHeadingPitchRoll(i,scratchSetViewQuaternion),d=Matrix3.fromQuaternion(u,scratchSetViewMatrix3),Matrix3.getColumn(d,2,e.up),Cartesian3.cross(e.direction,e.up,e.right)),e._setTransform(h)}var scratchToHPRDirection=new Cartesian3,scratchToHPRUp=new Cartesian3,scratchToHPRRight=new Cartesian3;function directionUpToHeadingPitchRoll(e,t,i,r){var n,a,o,s=Cartesian3.clone(i.direction,scratchToHPRDirection),l=Cartesian3.clone(i.up,scratchToHPRUp);e._scene.mode===SceneMode$1.SCENE3D&&(n=e._projection.ellipsoid,a=Transforms.eastNorthUpToFixedFrame(t,n,scratchHPRMatrix1),o=Matrix4.inverseTransformation(a,scratchHPRMatrix2),Matrix4.multiplyByPointAsVector(o,s,s),Matrix4.multiplyByPointAsVector(o,l,l));var c=Cartesian3.cross(s,l,scratchToHPRRight);return r.heading=getHeading(s,l),r.pitch=getPitch(s),r.roll=getRoll(s,l,c),r}var scratchSetViewOptions={destination:void 0,orientation:{direction:void 0,up:void 0,heading:void 0,pitch:void 0,roll:void 0},convert:void 0,endTransform:void 0},scratchHpr=new HeadingPitchRoll;Camera.prototype.setView=function(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t,i,r=defaultValue(e.orientation,defaultValue.EMPTY_OBJECT),n=this._mode;n!==SceneMode$1.MORPHING&&(defined(e.endTransform)&&this._setTransform(e.endTransform),t=defaultValue(e.convert,!0),defined(i=defaultValue(e.destination,Cartesian3.clone(this.positionWC,scratchSetViewCartesian)))&&defined(i.west)&&(i=this.getRectangleCameraCoordinates(i,scratchSetViewCartesian),t=!1),defined(r.direction)&&(r=directionUpToHeadingPitchRoll(this,i,r,scratchSetViewOptions.orientation)),scratchHpr.heading=defaultValue(r.heading,0),scratchHpr.pitch=defaultValue(r.pitch,-CesiumMath.PI_OVER_TWO),scratchHpr.roll=defaultValue(r.roll,0),n===SceneMode$1.SCENE3D?setView3D(this,i,scratchHpr):(n===SceneMode$1.SCENE2D?setView2D:setViewCV)(this,i,scratchHpr,t))};var pitchScratch=new Cartesian3;function clampMove2D(e,t){var i,r=e._scene.mapMode2D===MapMode2D$1.ROTATE,n=e._maxCoord.x,a=e._maxCoord.y,o=r?-(i=n):(i=t.x-2*n,t.x+2*n);t.x>n&&(t.x=i),t.x<-n&&(t.x=o),t.y>a&&(t.y=a),t.y<-a&&(t.y=-a)}Camera.prototype.flyHome=function(e){var t,i,r,n,a=this._mode;a===SceneMode$1.MORPHING&&this._scene.completeMorph(),a===SceneMode$1.SCENE2D?this.flyTo({destination:Camera.DEFAULT_VIEW_RECTANGLE,duration:e,endTransform:Matrix4.IDENTITY}):a===SceneMode$1.SCENE3D?(t=this.getRectangleCameraCoordinates(Camera.DEFAULT_VIEW_RECTANGLE),i=Cartesian3.magnitude(t),i+=i*Camera.DEFAULT_VIEW_FACTOR,Cartesian3.normalize(t,t),Cartesian3.multiplyByScalar(t,i,t),this.flyTo({destination:t,duration:e,endTransform:Matrix4.IDENTITY})):a===SceneMode$1.COLUMBUS_VIEW&&(r=this._projection.ellipsoid.maximumRadius,n=new Cartesian3(0,-1,1),n=Cartesian3.multiplyByScalar(Cartesian3.normalize(n,n),5*r,n),this.flyTo({destination:n,duration:e,orientation:{heading:0,pitch:-Math.acos(Cartesian3.normalize(n,pitchScratch).z),roll:0},endTransform:Matrix4.IDENTITY,convert:!1}))},Camera.prototype.worldToCameraCoordinates=function(e,t){return defined(t)||(t=new Cartesian4),updateMembers(this),Matrix4.multiplyByVector(this._actualInvTransform,e,t)},Camera.prototype.worldToCameraCoordinatesPoint=function(e,t){return defined(t)||(t=new Cartesian3),updateMembers(this),Matrix4.multiplyByPoint(this._actualInvTransform,e,t)},Camera.prototype.worldToCameraCoordinatesVector=function(e,t){return defined(t)||(t=new Cartesian3),updateMembers(this),Matrix4.multiplyByPointAsVector(this._actualInvTransform,e,t)},Camera.prototype.cameraToWorldCoordinates=function(e,t){return defined(t)||(t=new Cartesian4),updateMembers(this),Matrix4.multiplyByVector(this._actualTransform,e,t)},Camera.prototype.cameraToWorldCoordinatesPoint=function(e,t){return defined(t)||(t=new Cartesian3),updateMembers(this),Matrix4.multiplyByPoint(this._actualTransform,e,t)},Camera.prototype.cameraToWorldCoordinatesVector=function(e,t){return defined(t)||(t=new Cartesian3),updateMembers(this),Matrix4.multiplyByPointAsVector(this._actualTransform,e,t)};var moveScratch=new Cartesian3;Camera.prototype.move=function(e,t){var i=this.position;Cartesian3.multiplyByScalar(e,t,moveScratch),Cartesian3.add(i,moveScratch,i),this._mode===SceneMode$1.SCENE2D&&clampMove2D(this,i),this._adjustOrthographicFrustum(!0)},Camera.prototype.moveForward=function(e){e=defaultValue(e,this.defaultMoveAmount),this._mode===SceneMode$1.SCENE2D?zoom2D(this,e):this.move(this.direction,e)},Camera.prototype.moveBackward=function(e){e=defaultValue(e,this.defaultMoveAmount),this._mode===SceneMode$1.SCENE2D?zoom2D(this,-e):this.move(this.direction,-e)},Camera.prototype.moveUp=function(e){e=defaultValue(e,this.defaultMoveAmount),this.move(this.up,e)},Camera.prototype.moveDown=function(e){e=defaultValue(e,this.defaultMoveAmount),this.move(this.up,-e)},Camera.prototype.moveRight=function(e){e=defaultValue(e,this.defaultMoveAmount),this.move(this.right,e)},Camera.prototype.moveLeft=function(e){e=defaultValue(e,this.defaultMoveAmount),this.move(this.right,-e)},Camera.prototype.lookLeft=function(e){e=defaultValue(e,this.defaultLookAmount),this._mode!==SceneMode$1.SCENE2D&&this.look(this.up,-e)},Camera.prototype.lookRight=function(e){e=defaultValue(e,this.defaultLookAmount),this._mode!==SceneMode$1.SCENE2D&&this.look(this.up,e)},Camera.prototype.lookUp=function(e){e=defaultValue(e,this.defaultLookAmount),this._mode!==SceneMode$1.SCENE2D&&this.look(this.right,-e)},Camera.prototype.lookDown=function(e){e=defaultValue(e,this.defaultLookAmount),this._mode!==SceneMode$1.SCENE2D&&this.look(this.right,e)};var lookScratchQuaternion=new Quaternion,lookScratchMatrix=new Matrix3;Camera.prototype.look=function(e,t){var i=defaultValue(t,this.defaultLookAmount),r=Quaternion.fromAxisAngle(e,-i,lookScratchQuaternion),n=Matrix3.fromQuaternion(r,lookScratchMatrix),a=this.direction,o=this.up,s=this.right;Matrix3.multiplyByVector(n,a,a),Matrix3.multiplyByVector(n,o,o),Matrix3.multiplyByVector(n,s,s)},Camera.prototype.twistLeft=function(e){e=defaultValue(e,this.defaultLookAmount),this.look(this.direction,e)},Camera.prototype.twistRight=function(e){e=defaultValue(e,this.defaultLookAmount),this.look(this.direction,-e)};var rotateScratchQuaternion=new Quaternion,rotateScratchMatrix=new Matrix3;Camera.prototype.rotate=function(e,t){var i=defaultValue(t,this.defaultRotateAmount),r=Quaternion.fromAxisAngle(e,-i,rotateScratchQuaternion),n=Matrix3.fromQuaternion(r,rotateScratchMatrix);Matrix3.multiplyByVector(n,this.position,this.position),Matrix3.multiplyByVector(n,this.direction,this.direction),Matrix3.multiplyByVector(n,this.up,this.up),Cartesian3.cross(this.direction,this.up,this.right),Cartesian3.cross(this.right,this.direction,this.up),this._adjustOrthographicFrustum(!1)},Camera.prototype.rotateDown=function(e){rotateVertical(this,e=defaultValue(e,this.defaultRotateAmount))},Camera.prototype.rotateUp=function(e){rotateVertical(this,-(e=defaultValue(e,this.defaultRotateAmount)))};var rotateVertScratchP=new Cartesian3,rotateVertScratchA=new Cartesian3,rotateVertScratchTan=new Cartesian3,rotateVertScratchNegate=new Cartesian3;function rotateVertical(e,t){var i,r,n,a,o,s,l,c=e.position;defined(e.constrainedAxis)&&!Cartesian3.equalsEpsilon(e.position,Cartesian3.ZERO,CesiumMath.EPSILON2)?(i=Cartesian3.normalize(c,rotateVertScratchP),r=Cartesian3.equalsEpsilon(i,e.constrainedAxis,CesiumMath.EPSILON2),n=Cartesian3.equalsEpsilon(i,Cartesian3.negate(e.constrainedAxis,rotateVertScratchNegate),CesiumMath.EPSILON2),r||n?(r&&t<0||n&&0<t)&&e.rotate(e.right,t):(a=Cartesian3.normalize(e.constrainedAxis,rotateVertScratchA),o=Cartesian3.dot(i,a),s=CesiumMath.acosClamped(o),0<t&&s<t&&(t=s-CesiumMath.EPSILON4),o=Cartesian3.dot(i,Cartesian3.negate(a,rotateVertScratchNegate)),s=CesiumMath.acosClamped(o),t<0&&s<-t&&(t=-s+CesiumMath.EPSILON4),l=Cartesian3.cross(a,i,rotateVertScratchTan),e.rotate(l,t))):e.rotate(e.right,t)}function rotateHorizontal(e,t){defined(e.constrainedAxis)?e.rotate(e.constrainedAxis,t):e.rotate(e.up,t)}function zoom2D(e,t){var i,r,n,a,o,s,l,c=e.frustum;t*=.5,Math.abs(c.top)+Math.abs(c.bottom)>Math.abs(c.left)+Math.abs(c.right)?(r=c.top-t,n=c.bottom+t,a=e._maxCoord.y,e._scene.mapMode2D===MapMode2D$1.ROTATE&&(a*=e.maximumZoomFactor),a<n&&(r=-(n=a)),r<=n&&(n=-(r=1)),i=c.right/c.top,c.top=r,c.bottom=n,c.right=c.top*i,c.left=-c.right):(o=c.right-t,s=c.left+t,l=e._maxCoord.x,e._scene.mapMode2D===MapMode2D$1.ROTATE&&(l*=e.maximumZoomFactor),l<o&&(s=-(o=l)),o<=s&&(s=-(o=1)),i=c.top/c.right,c.right=o,c.left=s,c.top=c.right*i,c.bottom=-c.top)}function zoom3D(e,t){e.move(e.direction,t)}Camera.prototype.rotateRight=function(e){rotateHorizontal(this,-(e=defaultValue(e,this.defaultRotateAmount)))},Camera.prototype.rotateLeft=function(e){rotateHorizontal(this,e=defaultValue(e,this.defaultRotateAmount))},Camera.prototype.zoomIn=function(e){e=defaultValue(e,this.defaultZoomAmount),(this._mode===SceneMode$1.SCENE2D?zoom2D:zoom3D)(this,e)},Camera.prototype.zoomOut=function(e){e=defaultValue(e,this.defaultZoomAmount),(this._mode===SceneMode$1.SCENE2D?zoom2D:zoom3D)(this,-e)},Camera.prototype.getMagnitude=function(){return this._mode===SceneMode$1.SCENE3D?Cartesian3.magnitude(this.position):this._mode===SceneMode$1.COLUMBUS_VIEW?Math.abs(this.position.z):this._mode===SceneMode$1.SCENE2D?Math.max(this.frustum.right-this.frustum.left,this.frustum.top-this.frustum.bottom):void 0};var scratchLookAtMatrix4=new Matrix4;Camera.prototype.lookAt=function(e,t){var i=Transforms.eastNorthUpToFixedFrame(e,Ellipsoid.WGS84,scratchLookAtMatrix4);this.lookAtTransform(i,t)};var scratchLookAtHeadingPitchRangeOffset=new Cartesian3,scratchLookAtHeadingPitchRangeQuaternion1=new Quaternion,scratchLookAtHeadingPitchRangeQuaternion2=new Quaternion,scratchHeadingPitchRangeMatrix3=new Matrix3;function offsetFromHeadingPitchRange(e,t,i){t=CesiumMath.clamp(t,-CesiumMath.PI_OVER_TWO,CesiumMath.PI_OVER_TWO),e=CesiumMath.zeroToTwoPi(e)-CesiumMath.PI_OVER_TWO;var r=Quaternion.fromAxisAngle(Cartesian3.UNIT_Y,-t,scratchLookAtHeadingPitchRangeQuaternion1),n=Quaternion.fromAxisAngle(Cartesian3.UNIT_Z,-e,scratchLookAtHeadingPitchRangeQuaternion2),a=Quaternion.multiply(n,r,n),o=Matrix3.fromQuaternion(a,scratchHeadingPitchRangeMatrix3),s=Cartesian3.clone(Cartesian3.UNIT_X,scratchLookAtHeadingPitchRangeOffset);return Matrix3.multiplyByVector(o,s,s),Cartesian3.negate(s,s),Cartesian3.multiplyByScalar(s,i,s),s}Camera.prototype.lookAtTransform=function(e,t){if(this._setTransform(e),defined(t)){var i=defined(t.heading)?offsetFromHeadingPitchRange(t.heading,t.pitch,t.range):t;if(this._mode===SceneMode$1.SCENE2D){Cartesian2.clone(Cartesian2.ZERO,this.position),Cartesian3.negate(i,this.up),this.up.z=0,Cartesian3.magnitudeSquared(this.up)<CesiumMath.EPSILON10&&Cartesian3.clone(Cartesian3.UNIT_Y,this.up),Cartesian3.normalize(this.up,this.up),this._setTransform(Matrix4.IDENTITY),Cartesian3.negate(Cartesian3.UNIT_Z,this.direction),Cartesian3.cross(this.direction,this.up,this.right),Cartesian3.normalize(this.right,this.right);var r=this.frustum,n=r.top/r.right;return r.right=.5*Cartesian3.magnitude(i),r.left=-r.right,r.top=n*r.right,r.bottom=-r.top,void this._setTransform(e)}Cartesian3.clone(i,this.position),Cartesian3.negate(this.position,this.direction),Cartesian3.normalize(this.direction,this.direction),Cartesian3.cross(this.direction,Cartesian3.UNIT_Z,this.right),Cartesian3.magnitudeSquared(this.right)<CesiumMath.EPSILON10&&Cartesian3.clone(Cartesian3.UNIT_X,this.right),Cartesian3.normalize(this.right,this.right),Cartesian3.cross(this.right,this.direction,this.up),Cartesian3.normalize(this.up,this.up),this._adjustOrthographicFrustum(!0)}};var viewRectangle3DCartographic1=new Cartographic,viewRectangle3DCartographic2=new Cartographic,viewRectangle3DNorthEast=new Cartesian3,viewRectangle3DSouthWest=new Cartesian3,viewRectangle3DNorthWest=new Cartesian3,viewRectangle3DSouthEast=new Cartesian3,viewRectangle3DNorthCenter=new Cartesian3,viewRectangle3DSouthCenter=new Cartesian3,viewRectangle3DCenter=new Cartesian3,viewRectangle3DEquator=new Cartesian3,defaultRF={direction:new Cartesian3,right:new Cartesian3,up:new Cartesian3},viewRectangle3DEllipsoidGeodesic;function computeD(e,t,i,r){return Math.abs(Cartesian3.dot(t,i))/r-Cartesian3.dot(e,i)}function rectangleCameraPosition3D(e,t,i,r){var n=e._projection.ellipsoid,a=r?e:defaultRF,o=t.north,s=t.south,l=t.east,c=t.west;l<c&&(l+=CesiumMath.TWO_PI);var u,d,h,p=.5*(c+l),m=s<-CesiumMath.PI_OVER_TWO+CesiumMath.RADIANS_PER_DEGREE&&o>CesiumMath.PI_OVER_TWO-CesiumMath.RADIANS_PER_DEGREE?0:((u=viewRectangle3DCartographic1).longitude=p,u.latitude=o,u.height=0,(d=viewRectangle3DCartographic2).longitude=p,d.latitude=s,d.height=0,defined(h=viewRectangle3DEllipsoidGeodesic)&&h.ellipsoid===n||(viewRectangle3DEllipsoidGeodesic=h=new EllipsoidGeodesic(void 0,void 0,n)),h.setEndPoints(u,d),h.interpolateUsingFraction(.5,viewRectangle3DCartographic1).latitude),f=viewRectangle3DCartographic1;f.longitude=p,f.latitude=m,f.height=0;var g=n.cartographicToCartesian(f,viewRectangle3DCenter),_=viewRectangle3DCartographic1;_.longitude=l,_.latitude=o;var y=n.cartographicToCartesian(_,viewRectangle3DNorthEast);_.longitude=c;var v=n.cartographicToCartesian(_,viewRectangle3DNorthWest);_.longitude=p;var C=n.cartographicToCartesian(_,viewRectangle3DNorthCenter);_.latitude=s;var S=n.cartographicToCartesian(_,viewRectangle3DSouthCenter);_.longitude=l;var T=n.cartographicToCartesian(_,viewRectangle3DSouthEast);_.longitude=c;var x=n.cartographicToCartesian(_,viewRectangle3DSouthWest);Cartesian3.subtract(v,g,v),Cartesian3.subtract(T,g,T),Cartesian3.subtract(y,g,y),Cartesian3.subtract(x,g,x),Cartesian3.subtract(C,g,C),Cartesian3.subtract(S,g,S);var b=n.geodeticSurfaceNormal(g,a.direction);Cartesian3.negate(b,b);var E=Cartesian3.cross(b,Cartesian3.UNIT_Z,a.right);Cartesian3.normalize(E,E);var P,A,w,D,M,I,R,O,L,F,N,B=Cartesian3.cross(E,b,a.up);return e.frustum instanceof OrthographicFrustum?(P=Math.max(Cartesian3.distance(y,v),Cartesian3.distance(T,x)),(I=(A=Math.max(Cartesian3.distance(y,T),Cartesian3.distance(v,x)))*(M=e.frustum._offCenterFrustum.right/e.frustum._offCenterFrustum.top))<P?D=(w=P)/M:(D=A,w=I),N=Math.max(w,D)):(R=Math.tan(.5*e.frustum.fovy),O=e.frustum.aspectRatio*R,N=Math.max(computeD(b,B,v,R),computeD(b,B,T,R),computeD(b,B,y,R),computeD(b,B,x,R),computeD(b,B,C,R),computeD(b,B,S,R),computeD(b,E,v,O),computeD(b,E,T,O),computeD(b,E,y,O),computeD(b,E,x,O),computeD(b,E,C,O),computeD(b,E,S,O)),s<0&&0<o&&((L=viewRectangle3DCartographic1).longitude=c,L.latitude=0,L.height=0,F=n.cartographicToCartesian(L,viewRectangle3DEquator),Cartesian3.subtract(F,g,F),N=Math.max(N,computeD(b,B,F,R),computeD(b,E,F,O)),L.longitude=l,F=n.cartographicToCartesian(L,viewRectangle3DEquator),Cartesian3.subtract(F,g,F),N=Math.max(N,computeD(b,B,F,R),computeD(b,E,F,O)))),Cartesian3.add(g,Cartesian3.multiplyByScalar(b,-N,viewRectangle3DEquator),i)}var viewRectangleCVCartographic=new Cartographic,viewRectangleCVNorthEast=new Cartesian3,viewRectangleCVSouthWest=new Cartesian3;function rectangleCameraPositionColumbusView(e,t,i){var r=e._projection;t.west>t.east&&(t=Rectangle.MAX_VALUE);var n=e._actualTransform,a=e._actualInvTransform,o=viewRectangleCVCartographic;o.longitude=t.east,o.latitude=t.north;var s=r.project(o,viewRectangleCVNorthEast);Matrix4.multiplyByPoint(n,s,s),Matrix4.multiplyByPoint(a,s,s),o.longitude=t.west,o.latitude=t.south;var l,c,u,d,h=r.project(o,viewRectangleCVSouthWest);return Matrix4.multiplyByPoint(n,h,h),Matrix4.multiplyByPoint(a,h,h),i.x=.5*(s.x-h.x)+h.x,i.y=.5*(s.y-h.y)+h.y,defined(e.frustum.fovy)?(l=Math.tan(.5*e.frustum.fovy),c=e.frustum.aspectRatio*l,i.z=.5*Math.max((s.x-h.x)/c,(s.y-h.y)/l)):(u=s.x-h.x,d=s.y-h.y,i.z=Math.max(u,d)),i}var viewRectangle2DCartographic=new Cartographic,viewRectangle2DNorthEast=new Cartesian3,viewRectangle2DSouthWest=new Cartesian3;function rectangleCameraPosition2D(e,t,i){var r=e._projection,n=t.east;t.west>t.east&&(e._scene.mapMode2D===MapMode2D$1.INFINITE_SCROLL?n+=CesiumMath.TWO_PI:n=(t=Rectangle.MAX_VALUE).east);var a=viewRectangle2DCartographic;a.longitude=n,a.latitude=t.north;var o=r.project(a,viewRectangle2DNorthEast);a.longitude=t.west,a.latitude=t.south;var s,l,c=r.project(a,viewRectangle2DSouthWest),u=.5*Math.abs(o.x-c.x),d=.5*Math.abs(o.y-c.y),h=e.frustum.right/e.frustum.top,p=d*h;return p<u?l=(s=u)/h:(l=d,s=p),d=Math.max(2*s,2*l),i.x=.5*(o.x-c.x)+c.x,i.y=.5*(o.y-c.y)+c.y,(a=r.unproject(i,a)).height=d,i=r.project(a,i)}Camera.prototype.getRectangleCameraCoordinates=function(e,t){var i=this._mode;return defined(t)||(t=new Cartesian3),i===SceneMode$1.SCENE3D?rectangleCameraPosition3D(this,e,t):i===SceneMode$1.COLUMBUS_VIEW?rectangleCameraPositionColumbusView(this,e,t):i===SceneMode$1.SCENE2D?rectangleCameraPosition2D(this,e,t):void 0};var pickEllipsoid3DRay=new Ray;function pickEllipsoid3D(e,t,i,r){i=defaultValue(i,Ellipsoid.WGS84);var n=e.getPickRay(t,pickEllipsoid3DRay),a=IntersectionTests.rayEllipsoid(n,i);if(a){var o=0<a.start?a.start:a.stop;return Ray.getPoint(n,o,r)}}var pickEllipsoid2DRay=new Ray;function pickMap2D(e,t,i,r){var n=e.getPickRay(t,pickEllipsoid2DRay).origin,n=Cartesian3.fromElements(n.y,n.z,0,n),a=i.unproject(n);if(!(a.latitude<-CesiumMath.PI_OVER_TWO||a.latitude>CesiumMath.PI_OVER_TWO))return i.ellipsoid.cartographicToCartesian(a,r)}var pickEllipsoidCVRay=new Ray;function pickMapColumbusView(e,t,i,r){var n=e.getPickRay(t,pickEllipsoidCVRay),a=-n.origin.x/n.direction.x;Ray.getPoint(n,a,r);var o=i.unproject(new Cartesian3(r.y,r.z,0));if(!(o.latitude<-CesiumMath.PI_OVER_TWO||o.latitude>CesiumMath.PI_OVER_TWO||o.longitude<-Math.PI||o.longitude>Math.PI))return i.ellipsoid.cartographicToCartesian(o,r)}Camera.prototype.pickEllipsoid=function(e,t,i){var r=this._scene.canvas;if(0!==r.clientWidth&&0!==r.clientHeight){if(defined(i)||(i=new Cartesian3),t=defaultValue(t,Ellipsoid.WGS84),this._mode===SceneMode$1.SCENE3D)i=pickEllipsoid3D(this,e,t,i);else if(this._mode===SceneMode$1.SCENE2D)i=pickMap2D(this,e,this._projection,i);else{if(this._mode!==SceneMode$1.COLUMBUS_VIEW)return;i=pickMapColumbusView(this,e,this._projection,i)}return i}};var pickPerspCenter=new Cartesian3,pickPerspXDir=new Cartesian3,pickPerspYDir=new Cartesian3;function getPickRayPerspective(e,t,i){var r=e._scene.canvas,n=r.clientWidth,a=r.clientHeight,o=Math.tan(.5*e.frustum.fovy),s=e.frustum.aspectRatio*o,l=e.frustum.near,c=2/n*t.x-1,u=2/a*(a-t.y)-1,d=e.positionWC;Cartesian3.clone(d,i.origin);var h=Cartesian3.multiplyByScalar(e.directionWC,l,pickPerspCenter);Cartesian3.add(d,h,h);var p=Cartesian3.multiplyByScalar(e.rightWC,c*l*s,pickPerspXDir),m=Cartesian3.multiplyByScalar(e.upWC,u*l*o,pickPerspYDir),f=Cartesian3.add(h,p,i.direction);return Cartesian3.add(f,m,f),Cartesian3.subtract(f,d,f),Cartesian3.normalize(f,f),i}var scratchDirection$1=new Cartesian3;function getPickRayOrthographic(e,t,i){var r=e._scene.canvas,n=r.clientWidth,a=r.clientHeight,o=e.frustum;defined(o._offCenterFrustum)&&(o=o._offCenterFrustum);var s=2/n*t.x-1;s*=.5*(o.right-o.left);var l=2/a*(a-t.y)-1;l*=.5*(o.top-o.bottom);var c=i.origin;return Cartesian3.clone(e.position,c),Cartesian3.multiplyByScalar(e.right,s,scratchDirection$1),Cartesian3.add(scratchDirection$1,c,c),Cartesian3.multiplyByScalar(e.up,l,scratchDirection$1),Cartesian3.add(scratchDirection$1,c,c),Cartesian3.clone(e.directionWC,i.direction),e._mode!==SceneMode$1.COLUMBUS_VIEW&&e._mode!==SceneMode$1.SCENE2D||Cartesian3.fromElements(i.origin.z,i.origin.x,i.origin.y,i.origin),i}Camera.prototype.getPickRay=function(e,t){defined(t)||(t=new Ray);var i=this.frustum;return(defined(i.aspectRatio)&&defined(i.fov)&&defined(i.near)?getPickRayPerspective:getPickRayOrthographic)(this,e,t)};var scratchToCenter$1=new Cartesian3,scratchProj=new Cartesian3;Camera.prototype.distanceToBoundingSphere=function(e){var t=Cartesian3.subtract(this.positionWC,e.center,scratchToCenter$1),i=Cartesian3.multiplyByScalar(this.directionWC,Cartesian3.dot(t,this.directionWC),scratchProj);return Math.max(0,Cartesian3.magnitude(i)-e.radius)};var scratchPixelSize=new Cartesian2;function createAnimationTemplateCV(i,r,e,t,n,a){var o=Cartesian3.clone(r);return e.y>t?o.y-=e.y-t:e.y<-t&&(o.y+=-t-e.y),e.z>n?o.z-=e.z-n:e.z<-n&&(o.z+=-n-e.z),{easingFunction:EasingFunction$1.EXPONENTIAL_OUT,startObject:{time:0},stopObject:{time:1},duration:a,update:function(e){var t=Cartesian3.lerp(r,o,e.time,new Cartesian3);i.worldToCameraCoordinatesPoint(t,i.position)}}}Camera.prototype.getPixelSize=function(e,t,i){var r=this.distanceToBoundingSphere(e),n=this.frustum.getPixelDimensions(t,i,r,this._scene.pixelRatio,scratchPixelSize);return Math.max(n.x,n.y)};var normalScratch$4=new Cartesian3,centerScratch$4=new Cartesian3,posScratch=new Cartesian3,scratchCartesian3Subtract=new Cartesian3;function createAnimationCV(e,t){var i=e.position,r=e.direction,n=e.worldToCameraCoordinatesVector(Cartesian3.UNIT_X,normalScratch$4),a=-Cartesian3.dot(n,i)/Cartesian3.dot(n,r),o=Cartesian3.add(i,Cartesian3.multiplyByScalar(r,a,centerScratch$4),centerScratch$4);e.cameraToWorldCoordinatesPoint(o,o),i=e.cameraToWorldCoordinatesPoint(e.position,posScratch);var s=Math.tan(.5*e.frustum.fovy),l=e.frustum.aspectRatio*s,c=Cartesian3.magnitude(Cartesian3.subtract(i,o,scratchCartesian3Subtract)),u=l*c,d=s*c,h=e._maxCoord.x,p=e._maxCoord.y,m=Math.max(u-h,h),f=Math.max(d-p,p);if(i.z<-m||i.z>m||i.y<-f||i.y>f){var g=o.y<-m||o.y>m,_=o.z<-f||o.z>f;if(g||_)return createAnimationTemplateCV(e,i,o,m,f,t)}}Camera.prototype.createCorrectPositionTween=function(e){if(this._mode===SceneMode$1.COLUMBUS_VIEW)return createAnimationCV(this,e)};var scratchFlyToDestination=new Cartesian3,newOptions={destination:void 0,heading:void 0,pitch:void 0,roll:void 0,duration:void 0,complete:void 0,cancel:void 0,endTransform:void 0,maximumHeight:void 0,easingFunction:void 0};function distanceToBoundingSphere3D(e,t){var i=e.frustum,r=Math.tan(.5*i.fovy),n=i.aspectRatio*r;return Math.max(t/n,t/r)}function distanceToBoundingSphere2D(e,t){var i,r,n=e.frustum;defined(n._offCenterFrustum)&&(n=n._offCenterFrustum);var a=n.right/n.top,o=t*a;return o<t?r=(i=t)/a:(r=t,i=o),1.5*Math.max(i,r)}Camera.prototype.cancelFlight=function(){defined(this._currentFlight)&&(this._currentFlight.cancelTween(),this._currentFlight=void 0)},Camera.prototype.completeFlight=function(){var e;defined(this._currentFlight)&&(this._currentFlight.cancelTween(),(e={destination:void 0,orientation:{heading:void 0,pitch:void 0,roll:void 0}}).destination=newOptions.destination,e.orientation.heading=newOptions.heading,e.orientation.pitch=newOptions.pitch,e.orientation.roll=newOptions.roll,this.setView(e),defined(this._currentFlight.complete)&&this._currentFlight.complete(),this._currentFlight=void 0)},Camera.prototype.flyTo=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).destination;if(this._mode!==SceneMode$1.MORPHING){this.cancelFlight();var i=defaultValue(e.orientation,defaultValue.EMPTY_OBJECT);if(defined(i.direction)&&(i=directionUpToHeadingPitchRoll(this,t,i,scratchSetViewOptions.orientation)),defined(e.duration)&&e.duration<=0){var r=scratchSetViewOptions;return r.destination=e.destination,r.orientation.heading=i.heading,r.orientation.pitch=i.pitch,r.orientation.roll=i.roll,r.convert=e.convert,r.endTransform=e.endTransform,this.setView(r),void("function"==typeof e.complete&&e.complete())}var n=defined(t.west);n&&(t=this.getRectangleCameraCoordinates(t,scratchFlyToDestination));var a,o=this;newOptions.destination=t,newOptions.heading=i.heading,newOptions.pitch=i.pitch,newOptions.roll=i.roll,newOptions.duration=e.duration,newOptions.complete=function(){a===o._currentFlight&&(o._currentFlight=void 0),defined(e.complete)&&e.complete()},newOptions.cancel=e.cancel,newOptions.endTransform=e.endTransform,newOptions.convert=!n&&e.convert,newOptions.maximumHeight=e.maximumHeight,newOptions.pitchAdjustHeight=e.pitchAdjustHeight,newOptions.flyOverLongitude=e.flyOverLongitude,newOptions.flyOverLongitudeWeight=e.flyOverLongitudeWeight,newOptions.easingFunction=e.easingFunction;var s,l=this._scene,c=CameraFlightPath.createTween(l,newOptions);0!==c.duration?(a=l.tweens.add(c),this._currentFlight=a,s=this._scene.preloadFlightCamera,this._mode!==SceneMode$1.SCENE2D&&(defined(s)||(s=Camera.clone(this)),s.setView({destination:t,orientation:i}),this._scene.preloadFlightCullingVolume=s.frustum.computeCullingVolume(s.positionWC,s.directionWC,s.upWC))):"function"==typeof c.complete&&c.complete()}};var MINIMUM_ZOOM=100;function adjustBoundingSphereOffset(e,t,i){i=HeadingPitchRange.clone(defined(i)?i:Camera.DEFAULT_OFFSET);var r,n=e._scene.screenSpaceCameraController.minimumZoomDistance,a=e._scene.screenSpaceCameraController.maximumZoomDistance,o=i.range;return defined(o)&&0!==o||(0===(r=t.radius)?i.range=MINIMUM_ZOOM:e.frustum instanceof OrthographicFrustum||e._mode===SceneMode$1.SCENE2D?i.range=distanceToBoundingSphere2D(e,r):i.range=distanceToBoundingSphere3D(e,r),i.range=CesiumMath.clamp(i.range,n,a)),i}Camera.prototype.viewBoundingSphere=function(e,t){t=adjustBoundingSphereOffset(this,e,t),this.lookAt(e.center,t)};var scratchflyToBoundingSphereTransform=new Matrix4,scratchflyToBoundingSphereDestination=new Cartesian3,scratchflyToBoundingSphereDirection=new Cartesian3,scratchflyToBoundingSphereUp=new Cartesian3,scratchflyToBoundingSphereRight=new Cartesian3,scratchFlyToBoundingSphereCart4=new Cartesian4,scratchFlyToBoundingSphereQuaternion=new Quaternion,scratchFlyToBoundingSphereMatrix3=new Matrix3;Camera.prototype.flyToBoundingSphere=function(e,t){t=defaultValue(t,defaultValue.EMPTY_OBJECT);var i=this._mode===SceneMode$1.SCENE2D||this._mode===SceneMode$1.COLUMBUS_VIEW;this._setTransform(Matrix4.IDENTITY);var r,n,a,o,s,l=adjustBoundingSphereOffset(this,e,t.offset),c=i?Cartesian3.multiplyByScalar(Cartesian3.UNIT_Z,l.range,scratchflyToBoundingSphereDestination):offsetFromHeadingPitchRange(l.heading,l.pitch,l.range),u=Transforms.eastNorthUpToFixedFrame(e.center,Ellipsoid.WGS84,scratchflyToBoundingSphereTransform);Matrix4.multiplyByPoint(u,c,c),i||(o=Cartesian3.subtract(e.center,c,scratchflyToBoundingSphereDirection),Cartesian3.normalize(o,o),r=Matrix4.multiplyByPointAsVector(u,Cartesian3.UNIT_Z,scratchflyToBoundingSphereUp),1-Math.abs(Cartesian3.dot(o,r))<CesiumMath.EPSILON6&&(n=Quaternion.fromAxisAngle(o,l.heading,scratchFlyToBoundingSphereQuaternion),a=Matrix3.fromQuaternion(n,scratchFlyToBoundingSphereMatrix3),Cartesian3.fromCartesian4(Matrix4.getColumn(u,1,scratchFlyToBoundingSphereCart4),r),Matrix3.multiplyByVector(a,r,r)),s=Cartesian3.cross(o,r,scratchflyToBoundingSphereRight),Cartesian3.cross(s,o,r),Cartesian3.normalize(r,r)),this.flyTo({destination:c,orientation:{direction:o,up:r},duration:t.duration,complete:t.complete,cancel:t.cancel,endTransform:t.endTransform,maximumHeight:t.maximumHeight,easingFunction:t.easingFunction,flyOverLongitude:t.flyOverLongitude,flyOverLongitudeWeight:t.flyOverLongitudeWeight,pitchAdjustHeight:t.pitchAdjustHeight})};var scratchCartesian3_1=new Cartesian3,scratchCartesian3_2=new Cartesian3,scratchCartesian3_3=new Cartesian3,scratchCartesian3_4=new Cartesian3,horizonPoints=[new Cartesian3,new Cartesian3,new Cartesian3,new Cartesian3];function computeHorizonQuad(e,t){var i,r=t.radii,n=e.positionWC,a=Cartesian3.multiplyComponents(t.oneOverRadii,n,scratchCartesian3_1),o=Cartesian3.magnitude(a),s=Cartesian3.normalize(a,scratchCartesian3_2),l=Cartesian3.equalsEpsilon(s,Cartesian3.UNIT_Z,CesiumMath.EPSILON10)?(i=new Cartesian3(0,1,0),new Cartesian3(0,0,1)):(i=Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z,s,scratchCartesian3_3),scratchCartesian3_3),Cartesian3.normalize(Cartesian3.cross(s,i,scratchCartesian3_4),scratchCartesian3_4)),c=Math.sqrt(Cartesian3.magnitudeSquared(a)-1),u=Cartesian3.multiplyByScalar(s,1/o,scratchCartesian3_1),d=c/o,h=Cartesian3.multiplyByScalar(i,d,scratchCartesian3_2),p=Cartesian3.multiplyByScalar(l,d,scratchCartesian3_3),m=Cartesian3.add(u,p,horizonPoints[0]);Cartesian3.subtract(m,h,m),Cartesian3.multiplyComponents(r,m,m);var f=Cartesian3.subtract(u,p,horizonPoints[1]);Cartesian3.subtract(f,h,f),Cartesian3.multiplyComponents(r,f,f);var g=Cartesian3.subtract(u,p,horizonPoints[2]);Cartesian3.add(g,h,g),Cartesian3.multiplyComponents(r,g,g);var _=Cartesian3.add(u,p,horizonPoints[3]);return Cartesian3.add(_,h,_),Cartesian3.multiplyComponents(r,_,_),horizonPoints}var scratchPickCartesian2=new Cartesian2,scratchRectCartesian=new Cartesian3,cartoArray=[new Cartographic,new Cartographic,new Cartographic,new Cartographic];function addToResult(e,t,i,r,n,a){scratchPickCartesian2.x=e,scratchPickCartesian2.y=t;var o=r.pickEllipsoid(scratchPickCartesian2,n,scratchRectCartesian);return defined(o)?(cartoArray[i]=n.cartesianToCartographic(o,cartoArray[i]),1):(cartoArray[i]=n.cartesianToCartographic(a[i],cartoArray[i]),0)}Camera.prototype.computeViewRectangle=function(e,t){e=defaultValue(e,Ellipsoid.WGS84);var i=this.frustum.computeCullingVolume(this.positionWC,this.directionWC,this.upWC),r=new BoundingSphere(Cartesian3.ZERO,e.maximumRadius);if(i.computeVisibility(r)!==Intersect$1.OUTSIDE){var n=this._scene.canvas,a=n.clientWidth,o=n.clientHeight,s=0,l=computeHorizonQuad(this,e);if(s+=addToResult(0,0,0,this,e,l),s+=addToResult(0,o,1,this,e,l),s+=addToResult(a,o,2,this,e,l),(s+=addToResult(a,0,3,this,e,l))<2)return Rectangle.MAX_VALUE;t=Rectangle.fromCartographicArray(cartoArray,t);for(var c=0,u=cartoArray[3].longitude,d=0;d<4;++d){var h=cartoArray[d].longitude,p=Math.abs(h-u);p>CesiumMath.PI?c+=CesiumMath.TWO_PI-p:c+=p,u=h}return CesiumMath.equalsEpsilon(Math.abs(c),CesiumMath.TWO_PI,CesiumMath.EPSILON9)&&(t.west=-CesiumMath.PI,t.east=CesiumMath.PI,0<=cartoArray[0].latitude?t.north=CesiumMath.PI_OVER_TWO:t.south=-CesiumMath.PI_OVER_TWO),t}},Camera.prototype.switchToPerspectiveFrustum=function(){var e;this._mode===SceneMode$1.SCENE2D||this.frustum instanceof PerspectiveFrustum||(e=this._scene,this.frustum=new PerspectiveFrustum,this.frustum.aspectRatio=e.drawingBufferWidth/e.drawingBufferHeight,this.frustum.fov=CesiumMath.toRadians(60))},Camera.prototype.switchToOrthographicFrustum=function(){var e,t;this._mode===SceneMode$1.SCENE2D||this.frustum instanceof OrthographicFrustum||(e=calculateOrthographicFrustumWidth(this),t=this._scene,this.frustum=new OrthographicFrustum,this.frustum.aspectRatio=t.drawingBufferWidth/t.drawingBufferHeight,this.frustum.width=e)},Camera.clone=function(e,t){return defined(t)||(t=new Camera(e._scene)),Cartesian3.clone(e.position,t.position),Cartesian3.clone(e.direction,t.direction),Cartesian3.clone(e.up,t.up),Cartesian3.clone(e.right,t.right),Matrix4.clone(e._transform,t.transform),t._transformChanged=!0,t.frustum=e.frustum.clone(),t};var CameraEventType={LEFT_DRAG:0,RIGHT_DRAG:1,MIDDLE_DRAG:2,WHEEL:3,PINCH:4},CameraEventType$1=Object.freeze(CameraEventType);function getKey(e,t){var i=e;return defined(t)&&(i+="+"+t),i}function clonePinchMovement(e,t){Cartesian2.clone(e.distance.startPosition,t.distance.startPosition),Cartesian2.clone(e.distance.endPosition,t.distance.endPosition),Cartesian2.clone(e.angleAndHeight.startPosition,t.angleAndHeight.startPosition),Cartesian2.clone(e.angleAndHeight.endPosition,t.angleAndHeight.endPosition)}function listenToPinch(t,e,n){var a=getKey(CameraEventType$1.PINCH,e),o=t._update,s=t._isDown,i=t._eventStartPosition,r=t._pressTime,l=t._releaseTime;o[a]=!0,s[a]=!1,i[a]=new Cartesian2;var c=t._movement[a];defined(c)||(c=t._movement[a]={}),c.distance={startPosition:new Cartesian2,endPosition:new Cartesian2},c.angleAndHeight={startPosition:new Cartesian2,endPosition:new Cartesian2},c.prevAngle=0,t._eventHandler.setInputAction(function(e){t._buttonsDown++,s[a]=!0,r[a]=new Date,Cartesian2.lerp(e.position1,e.position2,.5,i[a])},ScreenSpaceEventType$1.PINCH_START,e),t._eventHandler.setInputAction(function(){t._buttonsDown=Math.max(t._buttonsDown-1,0),s[a]=!1,l[a]=new Date},ScreenSpaceEventType$1.PINCH_END,e),t._eventHandler.setInputAction(function(e){if(s[a]){o[a]?(clonePinchMovement(e,c),o[a]=!1,c.prevAngle=c.angleAndHeight.startPosition.x):(Cartesian2.clone(e.distance.endPosition,c.distance.endPosition),Cartesian2.clone(e.angleAndHeight.endPosition,c.angleAndHeight.endPosition));for(var t=c.angleAndHeight.endPosition.x,i=c.prevAngle,r=2*Math.PI;t>=i+Math.PI;)t-=r;for(;t<i-Math.PI;)t+=r;c.angleAndHeight.endPosition.x=-t*n.clientWidth/12,c.angleAndHeight.startPosition.x=-i*n.clientWidth/12}},ScreenSpaceEventType$1.PINCH_MOVE,e)}function listenToWheel(e,t){var i=getKey(CameraEventType$1.WHEEL,t),r=e._update;r[i]=!0;var n=e._movement[i];defined(n)||(n=e._movement[i]={}),n.startPosition=new Cartesian2,n.endPosition=new Cartesian2,e._eventHandler.setInputAction(function(e){var t=15*CesiumMath.toRadians(e);r[i]?(Cartesian2.clone(Cartesian2.ZERO,n.startPosition),n.endPosition.x=0,n.endPosition.y=t,r[i]=!1):n.endPosition.y=n.endPosition.y+t},ScreenSpaceEventType$1.WHEEL,t)}function listenMouseButtonDownUp(t,e,i){var r=getKey(i,e),n=t._isDown,a=t._eventStartPosition,o=t._pressTime,s=t._releaseTime;n[r]=!1,a[r]=new Cartesian2;var l,c,u=t._lastMovement[r];defined(u)||(u=t._lastMovement[r]={startPosition:new Cartesian2,endPosition:new Cartesian2,valid:!1}),i===CameraEventType$1.LEFT_DRAG?(l=ScreenSpaceEventType$1.LEFT_DOWN,c=ScreenSpaceEventType$1.LEFT_UP):i===CameraEventType$1.RIGHT_DRAG?(l=ScreenSpaceEventType$1.RIGHT_DOWN,c=ScreenSpaceEventType$1.RIGHT_UP):i===CameraEventType$1.MIDDLE_DRAG&&(l=ScreenSpaceEventType$1.MIDDLE_DOWN,c=ScreenSpaceEventType$1.MIDDLE_UP),t._eventHandler.setInputAction(function(e){t._buttonsDown++,u.valid=!1,n[r]=!0,o[r]=new Date,Cartesian2.clone(e.position,a[r])},l,e),t._eventHandler.setInputAction(function(){t._buttonsDown=Math.max(t._buttonsDown-1,0),n[r]=!1,s[r]=new Date},c,e)}function cloneMouseMovement(e,t){Cartesian2.clone(e.startPosition,t.startPosition),Cartesian2.clone(e.endPosition,t.endPosition)}function listenMouseMove(n,a){var e,t,o=n._update,s=n._movement,l=n._lastMovement,c=n._isDown;for(var i in CameraEventType$1){!CameraEventType$1.hasOwnProperty(i)||defined(e=CameraEventType$1[i])&&(t=getKey(e,a),o[t]=!0,defined(n._lastMovement[t])||(n._lastMovement[t]={startPosition:new Cartesian2,endPosition:new Cartesian2,valid:!1}),defined(n._movement[t])||(n._movement[t]={startPosition:new Cartesian2,endPosition:new Cartesian2}))}n._eventHandler.setInputAction(function(e){for(var t in CameraEventType$1){var i,r;!CameraEventType$1.hasOwnProperty(t)||defined(i=CameraEventType$1[t])&&(r=getKey(i,a),c[r]&&(o[r]?(cloneMouseMovement(s[r],l[r]),l[r].valid=!0,cloneMouseMovement(e,s[r]),o[r]=!1):Cartesian2.clone(e.endPosition,s[r].endPosition)))}Cartesian2.clone(e.endPosition,n._currentMousePosition)},ScreenSpaceEventType$1.MOUSE_MOVE,a)}function CameraEventAggregator(e){for(var t in this._eventHandler=new ScreenSpaceEventHandler(e),this._update={},this._movement={},this._lastMovement={},this._isDown={},this._eventStartPosition={},this._pressTime={},this._releaseTime={},this._buttonsDown=0,this._currentMousePosition=new Cartesian2,listenToWheel(this,void 0),listenToPinch(this,void 0,e),listenMouseButtonDownUp(this,void 0,CameraEventType$1.LEFT_DRAG),listenMouseButtonDownUp(this,void 0,CameraEventType$1.RIGHT_DRAG),listenMouseButtonDownUp(this,void 0,CameraEventType$1.MIDDLE_DRAG),listenMouseMove(this,void 0),KeyboardEventModifier$1){var i;!KeyboardEventModifier$1.hasOwnProperty(t)||defined(i=KeyboardEventModifier$1[t])&&(listenToWheel(this,i),listenToPinch(this,i,e),listenMouseButtonDownUp(this,i,CameraEventType$1.LEFT_DRAG),listenMouseButtonDownUp(this,i,CameraEventType$1.RIGHT_DRAG),listenMouseButtonDownUp(this,i,CameraEventType$1.MIDDLE_DRAG),listenMouseMove(this,i))}}function Cesium3DTileContent(e,t,i,r,n){this.featurePropertiesDirty=!1}function Cesium3DTilePassState(e){this.pass=e.pass,this.commandList=e.commandList,this.camera=e.camera,this.cullingVolume=e.cullingVolume,this.ready=!1}function ConditionsExpression(e,t){this._conditionsExpression=clone(e,!0),this._conditions=e.conditions,this._runtimeConditions=void 0,setRuntime(this,t)}function Statement(e,t){this.condition=e,this.expression=t}function setRuntime(e,t){var i=[],r=e._conditions;if(defined(r)){for(var n=r.length,a=0;a<n;++a){var o=r[a],s=String(o[0]),l=String(o[1]);i.push(new Statement(new Expression(s,t),new Expression(l,t)))}e._runtimeConditions=i}}function Cesium3DTileStyle(e){var t;this._style={},this._ready=!1,this._show=void 0,this._color=void 0,this._pointSize=void 0,this._pointOutlineColor=void 0,this._pointOutlineWidth=void 0,this._labelColor=void 0,this._labelOutlineColor=void 0,this._labelOutlineWidth=void 0,this._font=void 0,this._labelStyle=void 0,this._labelText=void 0,this._backgroundColor=void 0,this._backgroundPadding=void 0,this._backgroundEnabled=void 0,this._scaleByDistance=void 0,this._translucencyByDistance=void 0,this._distanceDisplayCondition=void 0,this._heightOffset=void 0,this._anchorLineEnabled=void 0,this._anchorLineColor=void 0,this._image=void 0,this._disableDepthTestDistance=void 0,this._horizontalOrigin=void 0,this._verticalOrigin=void 0,this._labelHorizontalOrigin=void 0,this._labelVerticalOrigin=void 0,this._meta=void 0,this._colorShaderFunction=void 0,this._showShaderFunction=void 0,this._pointSizeShaderFunction=void 0,this._colorShaderFunctionReady=!1,this._showShaderFunctionReady=!1,this._pointSizeShaderFunctionReady=!1,this._colorShaderTranslucent=!1,t="string"==typeof e||e instanceof Resource?Resource.createIfNeeded(e).fetchJson(e):when.resolve(e);var i=this;this._readyPromise=t.then(function(e){return setup(i,e),i})}function setup(e,t){t=defaultValue(clone(t,!0),e._style),e._style=t,e.show=t.show,e.color=t.color,e.pointSize=t.pointSize,e.pointOutlineColor=t.pointOutlineColor,e.pointOutlineWidth=t.pointOutlineWidth,e.labelColor=t.labelColor,e.labelOutlineColor=t.labelOutlineColor,e.labelOutlineWidth=t.labelOutlineWidth,e.labelStyle=t.labelStyle,e.font=t.font,e.labelText=t.labelText,e.backgroundColor=t.backgroundColor,e.backgroundPadding=t.backgroundPadding,e.backgroundEnabled=t.backgroundEnabled,e.scaleByDistance=t.scaleByDistance,e.translucencyByDistance=t.translucencyByDistance,e.distanceDisplayCondition=t.distanceDisplayCondition,e.heightOffset=t.heightOffset,e.anchorLineEnabled=t.anchorLineEnabled,e.anchorLineColor=t.anchorLineColor,e.image=t.image,e.disableDepthTestDistance=t.disableDepthTestDistance,e.horizontalOrigin=t.horizontalOrigin,e.verticalOrigin=t.verticalOrigin,e.labelHorizontalOrigin=t.labelHorizontalOrigin,e.labelVerticalOrigin=t.labelVerticalOrigin;var i={};if(defined(t.meta)){var r=t.defines,n=defaultValue(t.meta,defaultValue.EMPTY_OBJECT);for(var a in n)n.hasOwnProperty(a)&&(i[a]=new Expression(n[a],r))}e._meta=i,e._ready=!0}function getExpression(e,t){var i=defaultValue(e._style,defaultValue.EMPTY_OBJECT).defines;if(defined(t))return"boolean"==typeof t||"number"==typeof t?new Expression(String(t)):"string"==typeof t?new Expression(t,i):defined(t.conditions)?new ConditionsExpression(t,i):t}function getJsonFromExpression(e){if(defined(e))return defined(e.expression)?e.expression:defined(e.conditionsExpression)?clone(e.conditionsExpression,!0):e}function CircleEmitter(e){e=defaultValue(e,1),this._radius=defaultValue(e,1)}Object.defineProperties(CameraEventAggregator.prototype,{currentMousePosition:{get:function(){return this._currentMousePosition}},anyButtonDown:{get:function(){var e=!(this._update[getKey(CameraEventType$1.WHEEL)]&&this._update[getKey(CameraEventType$1.WHEEL,KeyboardEventModifier$1.SHIFT)]&&this._update[getKey(CameraEventType$1.WHEEL,KeyboardEventModifier$1.CTRL)]&&this._update[getKey(CameraEventType$1.WHEEL,KeyboardEventModifier$1.ALT)]);return 0<this._buttonsDown||e}}}),CameraEventAggregator.prototype.isMoving=function(e,t){var i=getKey(e,t);return!this._update[i]},CameraEventAggregator.prototype.getMovement=function(e,t){var i=getKey(e,t);return this._movement[i]},CameraEventAggregator.prototype.getLastMovement=function(e,t){var i=getKey(e,t),r=this._lastMovement[i];if(r.valid)return r},CameraEventAggregator.prototype.isButtonDown=function(e,t){var i=getKey(e,t);return this._isDown[i]},CameraEventAggregator.prototype.getStartMousePosition=function(e,t){if(e===CameraEventType$1.WHEEL)return this._currentMousePosition;var i=getKey(e,t);return this._eventStartPosition[i]},CameraEventAggregator.prototype.getButtonPressTime=function(e,t){var i=getKey(e,t);return this._pressTime[i]},CameraEventAggregator.prototype.getButtonReleaseTime=function(e,t){var i=getKey(e,t);return this._releaseTime[i]},CameraEventAggregator.prototype.reset=function(){for(var e in this._update)this._update.hasOwnProperty(e)&&(this._update[e]=!0)},CameraEventAggregator.prototype.isDestroyed=function(){return!1},CameraEventAggregator.prototype.destroy=function(){return this._eventHandler=this._eventHandler&&this._eventHandler.destroy(),destroyObject(this)},Object.defineProperties(Cesium3DTileContent.prototype,{featuresLength:{get:function(){DeveloperError.throwInstantiationError()}},pointsLength:{get:function(){DeveloperError.throwInstantiationError()}},trianglesLength:{get:function(){DeveloperError.throwInstantiationError()}},geometryByteLength:{get:function(){DeveloperError.throwInstantiationError()}},texturesByteLength:{get:function(){DeveloperError.throwInstantiationError()}},batchTableByteLength:{get:function(){DeveloperError.throwInstantiationError()}},innerContents:{get:function(){DeveloperError.throwInstantiationError()}},readyPromise:{get:function(){DeveloperError.throwInstantiationError()}},tileset:{get:function(){DeveloperError.throwInstantiationError()}},tile:{get:function(){DeveloperError.throwInstantiationError()}},url:{get:function(){DeveloperError.throwInstantiationError()}},batchTable:{get:function(){DeveloperError.throwInstantiationError()}}}),Cesium3DTileContent.prototype.hasProperty=function(e,t){DeveloperError.throwInstantiationError()},Cesium3DTileContent.prototype.getFeature=function(e){DeveloperError.throwInstantiationError()},Cesium3DTileContent.prototype.applyDebugSettings=function(e,t){DeveloperError.throwInstantiationError()},Cesium3DTileContent.prototype.applyStyle=function(e){DeveloperError.throwInstantiationError()},Cesium3DTileContent.prototype.update=function(e,t){DeveloperError.throwInstantiationError()},Cesium3DTileContent.prototype.isDestroyed=function(){DeveloperError.throwInstantiationError()},Cesium3DTileContent.prototype.destroy=function(){DeveloperError.throwInstantiationError()},Object.defineProperties(ConditionsExpression.prototype,{conditionsExpression:{get:function(){return this._conditionsExpression}}}),ConditionsExpression.prototype.evaluate=function(e,t){var i=this._runtimeConditions;if(defined(i))for(var r=i.length,n=0;n<r;++n){var a=i[n];if(a.condition.evaluate(e))return a.expression.evaluate(e,t)}},ConditionsExpression.prototype.evaluateColor=function(e,t){var i=this._runtimeConditions;if(defined(i))for(var r=i.length,n=0;n<r;++n){var a=i[n];if(a.condition.evaluate(e))return a.expression.evaluateColor(e,t)}},ConditionsExpression.prototype.getShaderFunction=function(e,t,i,r){var n=this._runtimeConditions;if(defined(n)&&0!==n.length){for(var a="",o=n.length,s=0;s<o;++s){var l=n[s];a+=" "+(0===s?"if":"else if")+" ("+l.condition.getShaderExpression(t,i)+") \n { \n return "+l.expression.getShaderExpression(t,i)+"; \n } \n"}return a=r+" "+e+"() \n{ \n"+a+" return "+r+"(1.0); \n} \n"}},Object.defineProperties(Cesium3DTileStyle.prototype,{style:{get:function(){return this._style}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise}},show:{get:function(){return this._show},set:function(e){this._show=getExpression(this,e),this._style.show=getJsonFromExpression(this._show),this._showShaderFunctionReady=!1}},color:{get:function(){return this._color},set:function(e){this._color=getExpression(this,e),this._style.color=getJsonFromExpression(this._color),this._colorShaderFunctionReady=!1}},pointSize:{get:function(){return this._pointSize},set:function(e){this._pointSize=getExpression(this,e),this._style.pointSize=getJsonFromExpression(this._pointSize),this._pointSizeShaderFunctionReady=!1}},pointOutlineColor:{get:function(){return this._pointOutlineColor},set:function(e){this._pointOutlineColor=getExpression(this,e),this._style.pointOutlineColor=getJsonFromExpression(this._pointOutlineColor)}},pointOutlineWidth:{get:function(){return this._pointOutlineWidth},set:function(e){this._pointOutlineWidth=getExpression(this,e),this._style.pointOutlineWidth=getJsonFromExpression(this._pointOutlineWidth)}},labelColor:{get:function(){return this._labelColor},set:function(e){this._labelColor=getExpression(this,e),this._style.labelColor=getJsonFromExpression(this._labelColor)}},labelOutlineColor:{get:function(){return this._labelOutlineColor},set:function(e){this._labelOutlineColor=getExpression(this,e),this._style.labelOutlineColor=getJsonFromExpression(this._labelOutlineColor)}},labelOutlineWidth:{get:function(){return this._labelOutlineWidth},set:function(e){this._labelOutlineWidth=getExpression(this,e),this._style.labelOutlineWidth=getJsonFromExpression(this._labelOutlineWidth)}},font:{get:function(){return this._font},set:function(e){this._font=getExpression(this,e),this._style.font=getJsonFromExpression(this._font)}},labelStyle:{get:function(){return this._labelStyle},set:function(e){this._labelStyle=getExpression(this,e),this._style.labelStyle=getJsonFromExpression(this._labelStyle)}},labelText:{get:function(){return this._labelText},set:function(e){this._labelText=getExpression(this,e),this._style.labelText=getJsonFromExpression(this._labelText)}},backgroundColor:{get:function(){return this._backgroundColor},set:function(e){this._backgroundColor=getExpression(this,e),this._style.backgroundColor=getJsonFromExpression(this._backgroundColor)}},backgroundPadding:{get:function(){return this._backgroundPadding},set:function(e){this._backgroundPadding=getExpression(this,e),this._style.backgroundPadding=getJsonFromExpression(this._backgroundPadding)}},backgroundEnabled:{get:function(){return this._backgroundEnabled},set:function(e){this._backgroundEnabled=getExpression(this,e),this._style.backgroundEnabled=getJsonFromExpression(this._backgroundEnabled)}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){this._scaleByDistance=getExpression(this,e),this._style.scaleByDistance=getJsonFromExpression(this._scaleByDistance)}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){this._translucencyByDistance=getExpression(this,e),this._style.translucencyByDistance=getJsonFromExpression(this._translucencyByDistance)}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){this._distanceDisplayCondition=getExpression(this,e),this._style.distanceDisplayCondition=getJsonFromExpression(this._distanceDisplayCondition)}},heightOffset:{get:function(){return this._heightOffset},set:function(e){this._heightOffset=getExpression(this,e),this._style.heightOffset=getJsonFromExpression(this._heightOffset)}},anchorLineEnabled:{get:function(){return this._anchorLineEnabled},set:function(e){this._anchorLineEnabled=getExpression(this,e),this._style.anchorLineEnabled=getJsonFromExpression(this._anchorLineEnabled)}},anchorLineColor:{get:function(){return this._anchorLineColor},set:function(e){this._anchorLineColor=getExpression(this,e),this._style.anchorLineColor=getJsonFromExpression(this._anchorLineColor)}},image:{get:function(){return this._image},set:function(e){this._image=getExpression(this,e),this._style.image=getJsonFromExpression(this._image)}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance=getExpression(this,e),this._style.disableDepthTestDistance=getJsonFromExpression(this._disableDepthTestDistance)}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin=getExpression(this,e),this._style.horizontalOrigin=getJsonFromExpression(this._horizontalOrigin)}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){this._verticalOrigin=getExpression(this,e),this._style.verticalOrigin=getJsonFromExpression(this._verticalOrigin)}},labelHorizontalOrigin:{get:function(){return this._labelHorizontalOrigin},set:function(e){this._labelHorizontalOrigin=getExpression(this,e),this._style.labelHorizontalOrigin=getJsonFromExpression(this._labelHorizontalOrigin)}},labelVerticalOrigin:{get:function(){return this._labelVerticalOrigin},set:function(e){this._labelVerticalOrigin=getExpression(this,e),this._style.labelVerticalOrigin=getJsonFromExpression(this._labelVerticalOrigin)}},meta:{get:function(){return this._meta},set:function(e){this._meta=e}}}),Cesium3DTileStyle.prototype.getColorShaderFunction=function(e,t,i){return this._colorShaderFunctionReady?i.translucent=this._colorShaderTranslucent:(this._colorShaderFunctionReady=!0,this._colorShaderFunction=defined(this.color)?this.color.getShaderFunction(e,t,i,"vec4"):void 0,this._colorShaderTranslucent=i.translucent),this._colorShaderFunction},Cesium3DTileStyle.prototype.getShowShaderFunction=function(e,t,i){return this._showShaderFunctionReady||(this._showShaderFunctionReady=!0,this._showShaderFunction=defined(this.show)?this.show.getShaderFunction(e,t,i,"bool"):void 0),this._showShaderFunction},Cesium3DTileStyle.prototype.getPointSizeShaderFunction=function(e,t,i){return this._pointSizeShaderFunctionReady||(this._pointSizeShaderFunctionReady=!0,this._pointSizeShaderFunction=defined(this.pointSize)?this.pointSize.getShaderFunction(e,t,i,"float"):void 0),this._pointSizeShaderFunction},Object.defineProperties(CircleEmitter.prototype,{radius:{get:function(){return this._radius},set:function(e){this._radius=e}}}),CircleEmitter.prototype.emit=function(e){var t=CesiumMath.randomBetween(0,CesiumMath.TWO_PI),i=CesiumMath.randomBetween(0,this._radius),r=i*Math.cos(t),n=i*Math.sin(t);e.position=Cartesian3.fromElements(r,n,0,e.position),e.velocity=Cartesian3.clone(Cartesian3.UNIT_Z,e.velocity)};var defaultAngle=CesiumMath.toRadians(30);function ConeEmitter(e){this._angle=defaultValue(e,defaultAngle)}Object.defineProperties(ConeEmitter.prototype,{angle:{get:function(){return this._angle},set:function(e){this._angle=e}}}),ConeEmitter.prototype.emit=function(e){var t=Math.tan(this._angle),i=CesiumMath.randomBetween(0,CesiumMath.TWO_PI),r=CesiumMath.randomBetween(0,t),n=r*Math.cos(i),a=r*Math.sin(i);e.velocity=Cartesian3.fromElements(n,a,1,e.velocity),Cartesian3.normalize(e.velocity,e.velocity),e.position=Cartesian3.clone(Cartesian3.ZERO,e.position)};var mobileWidth=576,lightboxHeight=100,textColor="#ffffff",highlightColor="#48b";function contains$1(e,t){for(var i=e.length,r=0;r<i;r++){var n=e[r];if(Credit.equals(n,t))return 1}}function swapCesiumCredit(e){var t=e._previousCesiumCredit,i=e._currentCesiumCredit;Credit.equals(i,t)||(defined(t)&&e._cesiumCreditContainer.removeChild(t.element),defined(i)&&e._cesiumCreditContainer.appendChild(i.element),e._previousCesiumCredit=i)}var delimiterClassName="cesium-credit-delimiter",defaultCredit;function createDelimiterElement(e){var t=document.createElement("span");return t.textContent=e,t.className=delimiterClassName,t}function createCreditElement(e,t){var i;return defined(t)&&((i=document.createElement(t))._creditId=e._creditId,i.appendChild(e),e=i),e}function displayCredits(e,t,i,r){for(var n=e.childNodes,a=-1,o=0;o<t.length;++o){var s,l,c,u,d=t[o];defined(d)&&(a=o,defined(i)&&(a*=2,0<o&&(s=a-1,n.length<=s?e.appendChild(createDelimiterElement(i)):(l=n[s]).className!==delimiterClassName&&e.replaceChild(createDelimiterElement(i),l))),c=d.element,n.length<=a?e.appendChild(createCreditElement(c,r)):(u=n[a])._creditId!==d._id&&e.replaceChild(createCreditElement(c,r),u))}for(++a;a<n.length;)e.removeChild(n[a])}function styleLightboxContainer(e){var t=e._lightboxCredits,i=e.viewport.clientWidth,r=e.viewport.clientHeight;i!==e._lastViewportWidth&&(i<mobileWidth?(t.className="cesium-credit-lightbox cesium-credit-lightbox-mobile",t.style.marginTop="0"):(t.className="cesium-credit-lightbox cesium-credit-lightbox-expanded",t.style.marginTop=Math.floor(.5*(r-t.clientHeight))+"px"),e._lastViewportWidth=i),mobileWidth<=i&&r!==e._lastViewportHeight&&(t.style.marginTop=Math.floor(.5*(r-t.clientHeight))+"px",e._lastViewportHeight=r)}function addStyle(e,t){var i=e+" {";for(var r in t)t.hasOwnProperty(r)&&(i+=r+": "+t[r]+"; ");return i+=" }\n"}function appendCss(){var e="";e+=addStyle(".cesium-credit-lightbox-overlay",{display:"none","z-index":"1",position:"absolute",top:"0",left:"0",width:"100%",height:"100%","background-color":"rgba(80, 80, 80, 0.8)"}),e+=addStyle(".cesium-credit-lightbox",{"background-color":"#303336",color:textColor,position:"relative","min-height":lightboxHeight+"px",margin:"auto"}),e+=addStyle(".cesium-credit-lightbox > ul > li a, .cesium-credit-lightbox > ul > li a:visited",{color:textColor}),e+=addStyle(".cesium-credit-lightbox > ul > li a:hover",{color:highlightColor}),e+=addStyle(".cesium-credit-lightbox.cesium-credit-lightbox-expanded",{border:"1px solid #444","border-radius":"5px","max-width":"370px"}),e+=addStyle(".cesium-credit-lightbox.cesium-credit-lightbox-mobile",{height:"100%",width:"100%"}),e+=addStyle(".cesium-credit-lightbox-title",{padding:"20px 20px 0 20px"}),e+=addStyle(".cesium-credit-lightbox-close",{"font-size":"18pt",cursor:"pointer",position:"absolute",top:"0",right:"6px",color:textColor}),e+=addStyle(".cesium-credit-lightbox-close:hover",{color:highlightColor}),e+=addStyle(".cesium-credit-lightbox > ul",{margin:"0",padding:"12px 20px 12px 40px","font-size":"13px"}),e+=addStyle(".cesium-credit-lightbox > ul > li",{"padding-bottom":"6px"}),e+=addStyle(".cesium-credit-lightbox > ul > li *",{padding:"0",margin:"0"}),e+=addStyle(".cesium-credit-expand-link",{"padding-left":"5px",cursor:"pointer","text-decoration":"underline",color:textColor}),e+=addStyle(".cesium-credit-expand-link:hover",{color:highlightColor}),e+=addStyle(".cesium-credit-text",{color:textColor}),e+=addStyle(".cesium-credit-textContainer *, .cesium-credit-logoContainer *",{display:"inline"});var t=document.head,i=document.createElement("style");i.innerHTML=e,t.insertBefore(i,t.firstChild)}function CreditDisplay(e,t,i){var r=this;i=defaultValue(i,document.body);var n=document.createElement("div");n.className="cesium-credit-lightbox-overlay",i.appendChild(n);var a=document.createElement("div");function o(e){a.contains(e.target)||r.hideLightbox()}a.className="cesium-credit-lightbox",n.appendChild(a),n.addEventListener("click",o,!1);var s=document.createElement("div");s.className="cesium-credit-lightbox-title",s.textContent="Data provided by:",a.appendChild(s);var l=document.createElement("a");l.onclick=this.hideLightbox.bind(this),l.innerHTML="×",l.className="cesium-credit-lightbox-close",a.appendChild(l);var c=document.createElement("ul");a.appendChild(c);var u=document.createElement("div");u.className="cesium-credit-logoContainer",u.style.display="inline",e.appendChild(u);var d=document.createElement("div");d.className="cesium-credit-textContainer",d.style.display="inline",e.appendChild(d);var h=document.createElement("a");h.className="cesium-credit-expand-link",h.onclick=this.showLightbox.bind(this),h.textContent="Data attribution",e.appendChild(h),appendCss();var p=Credit.clone(CreditDisplay.cesiumCredit);this._delimiter=defaultValue(t," • "),this._screenContainer=d,this._cesiumCreditContainer=u,this._lastViewportHeight=void 0,this._lastViewportWidth=void 0,this._lightboxCredits=a,this._creditList=c,this._lightbox=n,this._hideLightbox=o,this._expandLink=h,this._expanded=!1,this._defaultCredits=[],this._cesiumCredit=p,this._previousCesiumCredit=void 0,this._currentCesiumCredit=p,this._currentFrameCredits={screenCredits:new AssociativeArray,lightboxCredits:new AssociativeArray},this._defaultCredit=void 0,this.viewport=i,this.container=e}function getDefaultCredit(){var e;return defined(defaultCredit)||(0!==(e=buildModuleUrl("Assets/Images/ion-credit.png")).indexOf("http://")&&0!==e.indexOf("https://")&&(e=new URI(e).getPath()),defaultCredit=new Credit('<a href="https://cesium.com/" target="_blank"><img src="'+e+'" title="Cesium ion"/></a>',!0)),CreditDisplay._cesiumCreditInitialized||(CreditDisplay._cesiumCredit=defaultCredit,CreditDisplay._cesiumCreditInitialized=!0),defaultCredit}function DebugAppearance(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).attributeName,i=e.perInstanceAttribute;defined(i)||(i=!1);var r,n=defaultValue(e.glslDatatype,"vec3"),a="v_"+t;if("normal"===t||"tangent"===t||"bitangent"===t)r="vec4 getColor() { return vec4(("+a+" + vec3(1.0)) * 0.5, 1.0); }\n";else switch("st"===t&&(n="vec2"),n){case"float":r="vec4 getColor() { return vec4(vec3("+a+"), 1.0); }\n";break;case"vec2":r="vec4 getColor() { return vec4("+a+", 0.0, 1.0); }\n";break;case"vec3":r="vec4 getColor() { return vec4("+a+", 1.0); }\n";break;case"vec4":r="vec4 getColor() { return "+a+"; }\n"}var o="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute float batchId;\n"+(i?"":"attribute "+n+" "+t+";\n")+"varying "+n+" "+a+";\nvoid main()\n{\nvec4 p = czm_translateRelativeToEye(position3DHigh, position3DLow);\n"+(i?a+" = czm_batchTable_"+t+"(batchId);\n":a+" = "+t+";\n")+"gl_Position = czm_modelViewProjectionRelativeToEye * p;\n}",s="varying "+n+" "+a+";\n"+r+"\nvoid main()\n{\ngl_FragColor = getColor();\n}";this.material=void 0,this.translucent=defaultValue(e.translucent,!1),this._vertexShaderSource=defaultValue(e.vertexShaderSource,o),this._fragmentShaderSource=defaultValue(e.fragmentShaderSource,s),this._renderState=Appearance.getDefaultRenderState(!1,!1,e.renderState),this._closed=defaultValue(e.closed,!1),this._attributeName=t,this._glslDatatype=n}function DebugCameraPrimitive(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._camera=e.camera,this._frustumSplits=e.frustumSplits,this._color=defaultValue(e.color,Color.CYAN),this._updateOnChange=defaultValue(e.updateOnChange,!0),this.show=defaultValue(e.show,!0),this.id=e.id,this._id=void 0,this._outlinePrimitives=[],this._planesPrimitives=[]}CreditDisplay.prototype.addCredit=function(e){if(e._isIon)return defined(this._defaultCredit)||(this._defaultCredit=Credit.clone(getDefaultCredit())),void(this._currentCesiumCredit=this._defaultCredit);e.showOnScreen?this._currentFrameCredits.screenCredits.set(e.id,e):this._currentFrameCredits.lightboxCredits.set(e.id,e)},CreditDisplay.prototype.addDefaultCredit=function(e){var t=this._defaultCredits;contains$1(t,e)||t.push(e)},CreditDisplay.prototype.removeDefaultCredit=function(e){var t=this._defaultCredits,i=t.indexOf(e);-1!==i&&t.splice(i,1)},CreditDisplay.prototype.showLightbox=function(){this._lightbox.style.display="block",this._expanded=!0},CreditDisplay.prototype.hideLightbox=function(){this._lightbox.style.display="none",this._expanded=!1},CreditDisplay.prototype.update=function(){this._expanded&&styleLightboxContainer(this)},CreditDisplay.prototype.beginFrame=function(){var e=this._currentFrameCredits,t=e.screenCredits;t.removeAll();for(var i=this._defaultCredits,r=0;r<i.length;++r){var n=i[r];t.set(n.id,n)}e.lightboxCredits.removeAll(),Credit.equals(CreditDisplay.cesiumCredit,this._cesiumCredit)||(this._cesiumCredit=Credit.clone(CreditDisplay.cesiumCredit)),this._currentCesiumCredit=this._cesiumCredit},CreditDisplay.prototype.endFrame=function(){var e=this._currentFrameCredits.screenCredits.values;displayCredits(this._screenContainer,e,this._delimiter,void 0);var t=this._currentFrameCredits.lightboxCredits.values;this._expandLink.style.display=0<t.length?"inline":"none",displayCredits(this._creditList,t,void 0,"li"),swapCesiumCredit(this)},CreditDisplay.prototype.destroy=function(){return this._lightbox.removeEventListener("click",this._hideLightbox,!1),this.container.removeChild(this._cesiumCreditContainer),this.container.removeChild(this._screenContainer),this.container.removeChild(this._expandLink),this.viewport.removeChild(this._lightbox),destroyObject(this)},CreditDisplay.prototype.isDestroyed=function(){return!1},CreditDisplay._cesiumCredit=void 0,CreditDisplay._cesiumCreditInitialized=!1,Object.defineProperties(CreditDisplay,{cesiumCredit:{get:function(){return getDefaultCredit(),CreditDisplay._cesiumCredit},set:function(e){CreditDisplay._cesiumCredit=e,CreditDisplay._cesiumCreditInitialized=!0}}}),Object.defineProperties(DebugAppearance.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},attributeName:{get:function(){return this._attributeName}},glslDatatype:{get:function(){return this._glslDatatype}}}),DebugAppearance.prototype.getFragmentShaderSource=Appearance.prototype.getFragmentShaderSource,DebugAppearance.prototype.isTranslucent=Appearance.prototype.isTranslucent,DebugAppearance.prototype.getRenderState=Appearance.prototype.getRenderState;var scratchRight$1=new Cartesian3,scratchRotation$1=new Matrix3,scratchOrientation=new Quaternion,scratchPerspective=new PerspectiveFrustum,scratchPerspectiveOffCenter=new PerspectiveOffCenterFrustum,scratchOrthographic=new OrthographicFrustum,scratchOrthographicOffCenter=new OrthographicOffCenterFrustum,scratchColor$k=new Color,scratchSplits=[1,1e5];function DebugInspector(){this._cachedShowFrustumsShaders={}}function getAttributeLocations$2(e){var t={},i=e.vertexAttributes;for(var r in i)i.hasOwnProperty(r)&&(t[r]=i[r].index);return t}function createDebugShowFrustumsShaderProgram(e,t){var i=e.context,r=t,n=r.fragmentShaderSource.clone(),a=[];n.sources=n.sources.map(function(e){e=ShaderSource.replaceMain(e,"czm_Debug_main");for(var t,i=/gl_FragData\[(\d+)\]/g;null!==(t=i.exec(e));)-1===a.indexOf(t[1])&&a.push(t[1]);return e});var o,s=a.length,l="";if(l+="uniform vec3 debugShowCommandsColor;\n",l+="uniform vec3 debugShowFrustumsColor;\n",l+="void main() \n{ \n czm_Debug_main(); \n",0<s)for(o=0;o<s;++o)l+=" gl_FragData["+a[o]+"].rgb *= debugShowCommandsColor;\n",l+=" gl_FragData["+a[o]+"].rgb *= debugShowFrustumsColor;\n";else l+=" gl_FragColor.rgb *= debugShowCommandsColor;\n",l+=" gl_FragColor.rgb *= debugShowFrustumsColor;\n";l+="}",n.sources.push(l);var c=getAttributeLocations$2(r);return ShaderProgram.fromCache({context:i,vertexShaderSource:r.vertexShaderSource,fragmentShaderSource:n,attributeLocations:c})}DebugCameraPrimitive.prototype.update=function(e){if(this.show){var t,i,r=this._planesPrimitives,n=this._outlinePrimitives;if(this._updateOnChange){for(i=r.length,t=0;t<i;++t)n[t]=n[t]&&n[t].destroy(),r[t]=r[t]&&r[t].destroy();r.length=0,n.length=0}if(0===r.length){var a=this._camera,o=a.frustum,s=o instanceof PerspectiveFrustum?scratchPerspective:o instanceof PerspectiveOffCenterFrustum?scratchPerspectiveOffCenter:o instanceof OrthographicFrustum?scratchOrthographic:scratchOrthographicOffCenter;s=o.clone(s);var l=this._frustumSplits,c=!defined(l)||l.length<=1?((l=scratchSplits)[0]=this._camera.frustum.near,l[1]=this._camera.frustum.far,1):l.length-1,u=a.positionWC,d=a.directionWC,h=a.upWC,p=a.rightWC,p=Cartesian3.negate(p,scratchRight$1),m=scratchRotation$1;Matrix3.setColumn(m,0,p,m),Matrix3.setColumn(m,1,h,m),Matrix3.setColumn(m,2,d,m);var f=Quaternion.fromRotationMatrix(m,scratchOrientation);for(r.length=n.length=c,t=0;t<c;++t)s.near=l[t],s.far=l[t+1],r[t]=new Primitive({geometryInstances:new GeometryInstance({geometry:new FrustumGeometry({origin:u,orientation:f,frustum:s,_drawNearPlane:0===t}),attributes:{color:ColorGeometryInstanceAttribute.fromColor(Color.fromAlpha(this._color,.1,scratchColor$k))},id:this.id,pickPrimitive:this}),appearance:new PerInstanceColorAppearance({translucent:!0,flat:!0}),asynchronous:!1}),n[t]=new Primitive({geometryInstances:new GeometryInstance({geometry:new FrustumOutlineGeometry({origin:u,orientation:f,frustum:s,_drawNearPlane:0===t}),attributes:{color:ColorGeometryInstanceAttribute.fromColor(this._color)},id:this.id,pickPrimitive:this}),appearance:new PerInstanceColorAppearance({translucent:!1,flat:!0}),asynchronous:!1})}for(i=r.length,t=0;t<i;++t)n[t].update(e),r[t].update(e)}},DebugCameraPrimitive.prototype.isDestroyed=function(){return!1},DebugCameraPrimitive.prototype.destroy=function(){for(var e=this._planesPrimitives.length,t=0;t<e;++t)this._outlinePrimitives[t]=this._outlinePrimitives[t]&&this._outlinePrimitives[t].destroy(),this._planesPrimitives[t]=this._planesPrimitives[t]&&this._planesPrimitives[t].destroy();return destroyObject(this)};var scratchFrustumColor=new Color;function createDebugShowFrustumsUniformMap(e,t){var i=defined(t.uniformMap)?t.uniformMap:{};return defined(i.debugShowCommandsColor)||defined(i.debugShowFrustumsColor)||(i.debugShowCommandsColor=function(){return e.debugShowCommands?(defined(t._debugColor)||(t._debugColor=Color.fromRandom()),t._debugColor):Color.WHITE},i.debugShowFrustumsColor=function(){return e.debugShowFrustums?(scratchFrustumColor.red=1&t.debugOverlappingFrustums?1:0,scratchFrustumColor.green=2&t.debugOverlappingFrustums?1:0,scratchFrustumColor.blue=4&t.debugOverlappingFrustums?1:0,scratchFrustumColor.alpha=1,scratchFrustumColor):Color.WHITE}),i}var scratchShowFrustumCommand=new DrawCommand;function DebugModelMatrixPrimitive(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.length=defaultValue(e.length,1e7),this._length=void 0,this.width=defaultValue(e.width,2),this._width=void 0,this.show=defaultValue(e.show,!0),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=new Matrix4,this.id=e.id,this._id=void 0,this._primitive=void 0}DebugInspector.prototype.executeDebugShowFrustumsCommand=function(e,t,i){var r=t.shaderProgram.id,n=this._cachedShowFrustumsShaders[r];defined(n)||(n=createDebugShowFrustumsShaderProgram(e,t.shaderProgram),this._cachedShowFrustumsShaders[r]=n);var a=DrawCommand.shallowClone(t,scratchShowFrustumCommand);a.shaderProgram=n,a.uniformMap=createDebugShowFrustumsUniformMap(e,t),a.execute(e.context,i)},DebugModelMatrixPrimitive.prototype.update=function(e){var t,i,r;this.show&&(defined(this._primitive)&&Matrix4.equals(this._modelMatrix,this.modelMatrix)&&this._length===this.length&&this._width===this.width&&this._id===this.id||(this._modelMatrix=Matrix4.clone(this.modelMatrix,this._modelMatrix),this._length=this.length,this._width=this.width,this._id=this.id,defined(this._primitive)&&this._primitive.destroy(),0===this.modelMatrix[12]&&0===this.modelMatrix[13]&&0===this.modelMatrix[14]&&(this.modelMatrix[14]=.01),t=new GeometryInstance({geometry:new PolylineGeometry({positions:[Cartesian3.ZERO,Cartesian3.UNIT_X],width:this.width,vertexFormat:PolylineColorAppearance.VERTEX_FORMAT,colors:[Color.RED,Color.RED],arcType:ArcType$1.NONE}),modelMatrix:Matrix4.multiplyByUniformScale(this.modelMatrix,this.length,new Matrix4),id:this.id,pickPrimitive:this}),i=new GeometryInstance({geometry:new PolylineGeometry({positions:[Cartesian3.ZERO,Cartesian3.UNIT_Y],width:this.width,vertexFormat:PolylineColorAppearance.VERTEX_FORMAT,colors:[Color.GREEN,Color.GREEN],arcType:ArcType$1.NONE}),modelMatrix:Matrix4.multiplyByUniformScale(this.modelMatrix,this.length,new Matrix4),id:this.id,pickPrimitive:this}),r=new GeometryInstance({geometry:new PolylineGeometry({positions:[Cartesian3.ZERO,Cartesian3.UNIT_Z],width:this.width,vertexFormat:PolylineColorAppearance.VERTEX_FORMAT,colors:[Color.BLUE,Color.BLUE],arcType:ArcType$1.NONE}),modelMatrix:Matrix4.multiplyByUniformScale(this.modelMatrix,this.length,new Matrix4),id:this.id,pickPrimitive:this}),this._primitive=new Primitive({geometryInstances:[t,i,r],appearance:new PolylineColorAppearance,asynchronous:!1})),this._primitive.update(e))},DebugModelMatrixPrimitive.prototype.isDestroyed=function(){return!1},DebugModelMatrixPrimitive.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),destroyObject(this)};var DepthPlaneFS="varying vec4 positionEC;\nvoid main()\n{\nvec3 position;\nvec3 direction;\nif (czm_orthographicIn3D == 1.0)\n{\nvec2 uv = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw;\nvec2 minPlane = vec2(czm_frustumPlanes.z, czm_frustumPlanes.y);\nvec2 maxPlane = vec2(czm_frustumPlanes.w, czm_frustumPlanes.x);\nposition = vec3(mix(minPlane, maxPlane, uv), 0.0);\ndirection = vec3(0.0, 0.0, -1.0);\n}\nelse\n{\nposition = vec3(0.0);\ndirection = normalize(positionEC.xyz);\n}\nczm_ray ray = czm_ray(position, direction);\nvec3 ellipsoid_center = czm_view[3].xyz;\nczm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii);\nif (!czm_isEmpty(intersection))\n{\ngl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n}\nelse\n{\ndiscard;\n}\nczm_writeLogDepth();\n}\n",DepthPlaneVS="attribute vec4 position;\nvarying vec4 positionEC;\nvoid main()\n{\npositionEC = czm_modelView * position;\ngl_Position = czm_projection * positionEC;\nczm_vertexLogDepth();\n}\n";function DepthPlane(){this._rs=void 0,this._sp=void 0,this._va=void 0,this._command=void 0,this._mode=void 0,this._useLogDepth=!1}var depthQuadScratch=FeatureDetection.supportsTypedArrays()?new Float32Array(12):[],scratchCartesian1$7=new Cartesian3,scratchCartesian2$a=new Cartesian3,scratchCartesian3$d=new Cartesian3,scratchCartesian4$5=new Cartesian3,scratchCartesian5$2=new Cartesian3;function computeDepthQuad(e,t){var i,r,n,a,o,s,l,c,u,d,h,p=e.radii,m=t.camera;h=m.frustum instanceof OrthographicFrustum?(c=Cartesian3.ZERO,d=m.rightWC,m.upWC):(i=m.positionWC,r=Cartesian3.multiplyComponents(e.oneOverRadii,i,scratchCartesian1$7),n=Cartesian3.normalize(r,scratchCartesian2$a),a=Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z,r,scratchCartesian3$d),scratchCartesian3$d),o=Cartesian3.normalize(Cartesian3.cross(n,a,scratchCartesian4$5),scratchCartesian4$5),s=Cartesian3.magnitude(r),l=Math.sqrt(s*s-1),c=Cartesian3.multiplyByScalar(n,1/s,scratchCartesian1$7),u=l/s,d=Cartesian3.multiplyByScalar(a,u,scratchCartesian2$a),Cartesian3.multiplyByScalar(o,u,scratchCartesian3$d));var f=Cartesian3.add(c,h,scratchCartesian5$2);Cartesian3.subtract(f,d,f),Cartesian3.multiplyComponents(p,f,f),Cartesian3.pack(f,depthQuadScratch,0);var g=Cartesian3.subtract(c,h,scratchCartesian5$2);Cartesian3.subtract(g,d,g),Cartesian3.multiplyComponents(p,g,g),Cartesian3.pack(g,depthQuadScratch,3);var _=Cartesian3.add(c,h,scratchCartesian5$2);Cartesian3.add(_,d,_),Cartesian3.multiplyComponents(p,_,_),Cartesian3.pack(_,depthQuadScratch,6);var y=Cartesian3.subtract(c,h,scratchCartesian5$2);return Cartesian3.add(y,d,y),Cartesian3.multiplyComponents(p,y,y),Cartesian3.pack(y,depthQuadScratch,9),depthQuadScratch}function DerivedCommand(){}DepthPlane.prototype.update=function(e){var t,i,r,n,a,o,s;this._mode=e.mode,e.mode===SceneMode$1.SCENE3D&&(t=e.context,i=e.mapProjection.ellipsoid,r=e.useLogDepth,defined(this._command)||(this._rs=RenderState.fromCache({cull:{enabled:!0},depthTest:{enabled:!0},colorMask:{red:!1,green:!1,blue:!1,alpha:!1}}),this._command=new DrawCommand({renderState:this._rs,boundingVolume:new BoundingSphere(Cartesian3.ZERO,i.maximumRadius),pass:Pass$1.OPAQUE,owner:this})),defined(this._sp)&&this._useLogDepth===r||(this._useLogDepth=r,n=new ShaderSource({sources:[DepthPlaneVS]}),a=new ShaderSource({sources:[DepthPlaneFS]}),r&&(a.sources.push("#ifdef GL_EXT_frag_depth \n#extension GL_EXT_frag_depth : enable \n#endif \n\n"),a.defines.push("LOG_DEPTH"),n.defines.push("LOG_DEPTH")),this._sp=ShaderProgram.replaceCache({shaderProgram:this._sp,context:t,vertexShaderSource:n,fragmentShaderSource:a,attributeLocations:{position:0}}),this._command.shaderProgram=this._sp),o=computeDepthQuad(i,e),defined(this._va)?this._va.getAttribute(0).vertexBuffer.copyFromArrayView(o):(s=new Geometry({attributes:{position:new GeometryAttribute({componentDatatype:ComponentDatatype$1.FLOAT,componentsPerAttribute:3,values:o})},indices:[0,1,2,2,1,3],primitiveType:PrimitiveType$1.TRIANGLES}),this._va=VertexArray.fromGeometry({context:t,geometry:s,attributeLocations:{position:0},bufferUsage:BufferUsage$1.DYNAMIC_DRAW}),this._command.vertexArray=this._va))},DepthPlane.prototype.execute=function(e,t){this._mode===SceneMode$1.SCENE3D&&this._command.execute(e,t)},DepthPlane.prototype.isDestroyed=function(){return!1},DepthPlane.prototype.destroy=function(){this._sp=this._sp&&this._sp.destroy(),this._va=this._va&&this._va.destroy()};var fragDepthRegex=/\bgl_FragDepthEXT\b/,discardRegex=/\bdiscard\b/;function getDepthOnlyShaderProgram(e,t){var i=e.shaderCache.getDerivedShaderProgram(t,"depthOnly");if(!defined(i)){for(var r=t._attributeLocations,n=t.fragmentShaderSource,a=!1,o=n.sources,s=o.length,l=0;l<s;++l)if(fragDepthRegex.test(o[l])||discardRegex.test(o[l])){a=!0;break}var c=!1,u=n.defines,s=u.length;for(l=0;l<s;++l)if("LOG_DEPTH"===u[l]){c=!0;break}a||c?!a&&c&&(n=new ShaderSource({defines:["LOG_DEPTH"],sources:["#ifdef GL_EXT_frag_depth \n#extension GL_EXT_frag_depth : enable \n#endif \n\nvoid main() \n{ \n gl_FragColor = vec4(1.0); \n czm_writeLogDepth(); \n} \n"]})):n=new ShaderSource({sources:["void main() \n{ \n gl_FragColor = vec4(1.0); \n} \n"]}),i=e.shaderCache.createDerivedShaderProgram(t,"depthOnly",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:n,attributeLocations:r})}return i}function getDepthOnlyRenderState(e,t){var i,r=e._depthOnlyRenderStateCache,n=r[t.id];return defined(n)||((i=RenderState.getState(t)).depthMask=!0,i.colorMask={red:!1,green:!1,blue:!1,alpha:!1},n=RenderState.fromCache(i),r[t.id]=n),n}DerivedCommand.createDepthOnlyDerivedCommand=function(e,t,i,r){var n,a;return defined(r)||(r={}),defined(r.depthOnlyCommand)&&(n=r.depthOnlyCommand.shaderProgram,a=r.depthOnlyCommand.renderState),r.depthOnlyCommand=DrawCommand.shallowClone(t,r.depthOnlyCommand),defined(n)&&r.shaderProgramId===t.shaderProgram.id?(r.depthOnlyCommand.shaderProgram=n,r.depthOnlyCommand.renderState=a):(r.depthOnlyCommand.shaderProgram=getDepthOnlyShaderProgram(i,t.shaderProgram),r.depthOnlyCommand.renderState=getDepthOnlyRenderState(e,t.renderState),r.shaderProgramId=t.shaderProgram.id),r};var writeLogDepthRegex=/\s+czm_writeLogDepth\(/,vertexlogDepthRegex=/\s+czm_vertexLogDepth\(/,extensionRegex=/\s*#extension\s+GL_EXT_frag_depth\s*:\s*enable/;function getLogDepthShaderProgram(e,t){var i=e.shaderCache.getDerivedShaderProgram(t,"logDepth");if(!defined(i)){var r=t._attributeLocations,n=t.vertexShaderSource.clone(),a=t.fragmentShaderSource.clone();n.defines=defined(n.defines)?n.defines.slice(0):[],n.defines.push("LOG_DEPTH"),a.defines=defined(a.defines)?a.defines.slice(0):[],a.defines.push("LOG_DEPTH");for(var o=!1,s=n.sources,l=s.length,c=0;c<l;++c)if(vertexlogDepthRegex.test(s[c])){o=!0;break}if(!o){for(c=0;c<l;++c)s[c]=ShaderSource.replaceMain(s[c],"czm_log_depth_main");s.push("\n\nvoid main() \n{ \n czm_log_depth_main(); \n czm_vertexLogDepth(); \n} \n")}for(l=(s=a.sources).length,o=!1,c=0;c<l;++c)writeLogDepthRegex.test(s[c])&&(o=!0);-1!==a.defines.indexOf("LOG_DEPTH_WRITE")&&(o=!0);var u=!0;for(c=0;c<l;++c)extensionRegex.test(s[c])&&(u=!1);var d="";if(u&&(d+="#ifdef GL_EXT_frag_depth \n#extension GL_EXT_frag_depth : enable \n#endif \n\n"),!o){for(c=0;c<l;c++)s[c]=ShaderSource.replaceMain(s[c],"czm_log_depth_main");d+="\nvoid main() \n{ \n czm_log_depth_main(); \n czm_writeLogDepth(); \n} \n"}s.push(d),i=e.shaderCache.createDerivedShaderProgram(t,"logDepth",{vertexShaderSource:n,fragmentShaderSource:a,attributeLocations:r})}return i}function getPickShaderProgram(e,t,i){var r=e.shaderCache.getDerivedShaderProgram(t,"pick");if(!defined(r)){for(var n=t._attributeLocations,a=t.fragmentShaderSource,o=a.sources,s=o.length,l="void main() \n{ \n czm_non_pick_main(); \n if (gl_FragColor.a == 0.0) { \n discard; \n } \n gl_FragColor = "+i+"; \n} \n",c=new Array(s+1),u=0;u<s;++u)c[u]=ShaderSource.replaceMain(o[u],"czm_non_pick_main");c[s]=l,a=new ShaderSource({sources:c,defines:a.defines}),r=e.shaderCache.createDerivedShaderProgram(t,"pick",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:a,attributeLocations:n})}return r}function getPickRenderState(e,t){var i,r=e.picking.pickRenderStateCache,n=r[t.id];return defined(n)||((i=RenderState.getState(t)).blending.enabled=!1,i.depthMask=!0,n=RenderState.fromCache(i),r[t.id]=n),n}function getHdrShaderProgram(e,t){var i,r,n,a=e.shaderCache.getDerivedShaderProgram(t,"HDR");return defined(a)||(i=t._attributeLocations,r=t.vertexShaderSource.clone(),n=t.fragmentShaderSource.clone(),r.defines=defined(r.defines)?r.defines.slice(0):[],r.defines.push("HDR"),n.defines=defined(n.defines)?n.defines.slice(0):[],n.defines.push("HDR"),a=e.shaderCache.createDerivedShaderProgram(t,"HDR",{vertexShaderSource:r,fragmentShaderSource:n,attributeLocations:i})),a}function DeviceOrientationCameraController(e){this._scene=e,this._lastAlpha=void 0,this._lastBeta=void 0,this._lastGamma=void 0,this._alpha=void 0,this._beta=void 0,this._gamma=void 0;var i=this;function t(e){var t=e.alpha;if(!defined(t))return i._alpha=void 0,i._beta=void 0,void(i._gamma=void 0);i._alpha=CesiumMath.toRadians(t),i._beta=CesiumMath.toRadians(e.beta),i._gamma=CesiumMath.toRadians(e.gamma)}window.addEventListener("deviceorientation",t,!1),this._removeListener=function(){window.removeEventListener("deviceorientation",t,!1)}}DerivedCommand.createLogDepthCommand=function(e,t,i){var r;return defined(i)||(i={}),defined(i.command)&&(r=i.command.shaderProgram),i.command=DrawCommand.shallowClone(e,i.command),defined(r)&&i.shaderProgramId===e.shaderProgram.id?i.command.shaderProgram=r:(i.command.shaderProgram=getLogDepthShaderProgram(t,e.shaderProgram),i.shaderProgramId=e.shaderProgram.id),i},DerivedCommand.createPickDerivedCommand=function(e,t,i,r){var n,a;return defined(r)||(r={}),defined(r.pickCommand)&&(n=r.pickCommand.shaderProgram,a=r.pickCommand.renderState),r.pickCommand=DrawCommand.shallowClone(t,r.pickCommand),defined(n)&&r.shaderProgramId===t.shaderProgram.id?(r.pickCommand.shaderProgram=n,r.pickCommand.renderState=a):(r.pickCommand.shaderProgram=getPickShaderProgram(i,t.shaderProgram,t.pickId),r.pickCommand.renderState=getPickRenderState(e,t.renderState),r.shaderProgramId=t.shaderProgram.id),r},DerivedCommand.createHdrCommand=function(e,t,i){var r;return defined(i)||(i={}),defined(i.command)&&(r=i.command.shaderProgram),i.command=DrawCommand.shallowClone(e,i.command),defined(r)&&i.shaderProgramId===e.shaderProgram.id?i.command.shaderProgram=r:(i.command.shaderProgram=getHdrShaderProgram(t,e.shaderProgram),i.shaderProgramId=e.shaderProgram.id),i};var scratchQuaternion1=new Quaternion,scratchQuaternion2=new Quaternion,scratchMatrix3$2=new Matrix3;function rotate(e,t,i,r){var n=e.direction,a=e.right,o=e.up,s=Quaternion.fromAxisAngle(n,i,scratchQuaternion2),l=Quaternion.fromAxisAngle(a,r,scratchQuaternion1),c=Quaternion.multiply(l,s,l),u=Quaternion.fromAxisAngle(o,t,scratchQuaternion2);Quaternion.multiply(u,c,c);var d=Matrix3.fromQuaternion(c,scratchMatrix3$2);Matrix3.multiplyByVector(d,a,a),Matrix3.multiplyByVector(d,o,o),Matrix3.multiplyByVector(d,n,n)}function DirectionalLight(e){this.direction=Cartesian3.clone(e.direction),this.color=Color.clone(defaultValue(e.color,Color.WHITE)),this.intensity=defaultValue(e.intensity,1)}DeviceOrientationCameraController.prototype.update=function(){var e,t,i;defined(this._alpha)&&(defined(this._lastAlpha)||(this._lastAlpha=this._alpha,this._lastBeta=this._beta,this._lastGamma=this._gamma),e=this._lastAlpha-this._alpha,t=this._lastBeta-this._beta,i=this._lastGamma-this._gamma,rotate(this._scene.camera,-e,t,i),this._lastAlpha=this._alpha,this._lastBeta=this._beta,this._lastGamma=this._gamma)},DeviceOrientationCameraController.prototype.isDestroyed=function(){return!1},DeviceOrientationCameraController.prototype.destroy=function(){return this._removeListener(),destroyObject(this)};var EllipsoidFS="#ifdef WRITE_DEPTH\n#ifdef GL_EXT_frag_depth\n#extension GL_EXT_frag_depth : enable\n#endif\n#endif\nuniform vec3 u_radii;\nuniform vec3 u_oneOverEllipsoidRadiiSquared;\nvarying vec3 v_positionEC;\nvec4 computeEllipsoidColor(czm_ray ray, float intersection, float side)\n{\nvec3 positionEC = czm_pointAlongRay(ray, intersection);\nvec3 positionMC = (czm_inverseModelView * vec4(positionEC, 1.0)).xyz;\nvec3 geodeticNormal = normalize(czm_geodeticSurfaceNormal(positionMC, vec3(0.0), u_oneOverEllipsoidRadiiSquared));\nvec3 sphericalNormal = normalize(positionMC / u_radii);\nvec3 normalMC = geodeticNormal * side;\nvec3 normalEC = normalize(czm_normal * normalMC);\nvec2 st = czm_ellipsoidWgs84TextureCoordinates(sphericalNormal);\nvec3 positionToEyeEC = -positionEC;\nczm_materialInput materialInput;\nmaterialInput.s = st.s;\nmaterialInput.st = st;\nmaterialInput.str = (positionMC + u_radii) / u_radii;\nmaterialInput.normalEC = normalEC;\nmaterialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(positionMC, normalEC);\nmaterialInput.positionToEyeEC = positionToEyeEC;\nczm_material material = czm_getMaterial(materialInput);\n#ifdef ONLY_SUN_LIGHTING\nreturn czm_private_phong(normalize(positionToEyeEC), material, czm_sunDirectionEC);\n#else\nreturn czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);\n#endif\n}\nvoid main()\n{\nfloat maxRadius = max(u_radii.x, max(u_radii.y, u_radii.z)) * 1.5;\nvec3 direction = normalize(v_positionEC);\nvec3 ellipsoidCenter = czm_modelView[3].xyz;\nfloat t1 = -1.0;\nfloat t2 = -1.0;\nfloat b = -2.0 * dot(direction, ellipsoidCenter);\nfloat c = dot(ellipsoidCenter, ellipsoidCenter) - maxRadius * maxRadius;\nfloat discriminant = b * b - 4.0 * c;\nif (discriminant >= 0.0) {\nt1 = (-b - sqrt(discriminant)) * 0.5;\nt2 = (-b + sqrt(discriminant)) * 0.5;\n}\nif (t1 < 0.0 && t2 < 0.0) {\ndiscard;\n}\nfloat t = min(t1, t2);\nif (t < 0.0) {\nt = 0.0;\n}\nczm_ray ray = czm_ray(t * direction, direction);\nvec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z);\nczm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii);\nif (czm_isEmpty(intersection))\n{\ndiscard;\n}\nvec4 outsideFaceColor = (intersection.start != 0.0) ? computeEllipsoidColor(ray, intersection.start, 1.0) : vec4(0.0);\nvec4 insideFaceColor = (outsideFaceColor.a < 1.0) ? computeEllipsoidColor(ray, intersection.stop, -1.0) : vec4(0.0);\ngl_FragColor = mix(insideFaceColor, outsideFaceColor, outsideFaceColor.a);\ngl_FragColor.a = 1.0 - (1.0 - insideFaceColor.a) * (1.0 - outsideFaceColor.a);\n#ifdef WRITE_DEPTH\n#ifdef GL_EXT_frag_depth\nt = (intersection.start != 0.0) ? intersection.start : intersection.stop;\nvec3 positionEC = czm_pointAlongRay(ray, t);\nvec4 positionCC = czm_projection * vec4(positionEC, 1.0);\n#ifdef LOG_DEPTH\nczm_writeLogDepth(1.0 + positionCC.w);\n#else\nfloat z = positionCC.z / positionCC.w;\nfloat n = czm_depthRange.near;\nfloat f = czm_depthRange.far;\ngl_FragDepthEXT = (z * (f - n) + f + n) * 0.5;\n#endif\n#endif\n#endif\n}\n",EllipsoidVS="attribute vec3 position;\nuniform vec3 u_radii;\nvarying vec3 v_positionEC;\nvoid main()\n{\nvec4 p = vec4(u_radii * position, 1.0);\nv_positionEC = (czm_modelView * p).xyz;\ngl_Position = czm_modelViewProjection * p;\ngl_Position.z = clamp(gl_Position.z, czm_depthRange.near, czm_depthRange.far);\nczm_vertexLogDepth();\n}\n",attributeLocations$4={position:0};function EllipsoidPrimitive(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.center=Cartesian3.clone(defaultValue(e.center,Cartesian3.ZERO)),this._center=new Cartesian3,this.radii=Cartesian3.clone(e.radii),this._radii=new Cartesian3,this._oneOverEllipsoidRadiiSquared=new Cartesian3,this._boundingSphere=new BoundingSphere,this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._modelMatrix=new Matrix4,this._computedModelMatrix=new Matrix4,this.show=defaultValue(e.show,!0),this.material=defaultValue(e.material,Material.fromType(Material.ColorType)),this._material=void 0,this._translucent=void 0,this.id=e.id,this._id=void 0,this.debugShowBoundingVolume=defaultValue(e.debugShowBoundingVolume,!1),this.onlySunLighting=defaultValue(e.onlySunLighting,!1),this._onlySunLighting=!1,this._depthTestEnabled=defaultValue(e.depthTestEnabled,!0),this._useLogDepth=!1,this._sp=void 0,this._rs=void 0,this._va=void 0,this._pickSP=void 0,this._pickId=void 0,this._colorCommand=new DrawCommand({owner:defaultValue(e._owner,this)}),this._pickCommand=new DrawCommand({owner:defaultValue(e._owner,this),pickOnly:!0});var t=this;this._uniforms={u_radii:function(){return t.radii},u_oneOverEllipsoidRadiiSquared:function(){return t._oneOverEllipsoidRadiiSquared}},this._pickUniforms={czm_pickColor:function(){return t._pickId.color}}}function getVertexArray(e){if(defined(i=e.cache.ellipsoidPrimitive_vertexArray))return i;var t=BoxGeometry.createGeometry(BoxGeometry.fromDimensions({dimensions:new Cartesian3(2,2,2),vertexFormat:VertexFormat.POSITION_ONLY})),i=VertexArray.fromGeometry({context:e,geometry:t,attributeLocations:attributeLocations$4,bufferUsage:BufferUsage$1.STATIC_DRAW,interleave:!0});return e.cache.ellipsoidPrimitive_vertexArray=i}var logDepthExtension="#ifdef GL_EXT_frag_depth \n#extension GL_EXT_frag_depth : enable \n#endif \n\n";EllipsoidPrimitive.prototype.update=function(e){var t,i,r,n,a,o,s,l,c,u,d,h,p,m,f,g;this.show&&e.mode===SceneMode$1.SCENE3D&&defined(this.center)&&defined(this.radii)&&(t=e.context,i=this.material.isTranslucent(),r=this._translucent!==i,defined(this._rs)&&!r||(this._translucent=i,this._rs=RenderState.fromCache({cull:{enabled:!0,face:CullFace$1.FRONT},depthTest:{enabled:this._depthTestEnabled},depthMask:!i&&t.fragmentDepth,blending:i?BlendingState$1.ALPHA_BLEND:void 0})),defined(this._va)||(this._va=getVertexArray(t)),n=!1,a=this.radii,Cartesian3.equals(this._radii,a)||(Cartesian3.clone(a,this._radii),(o=this._oneOverEllipsoidRadiiSquared).x=1/(a.x*a.x),o.y=1/(a.y*a.y),o.z=1/(a.z*a.z),n=!0),Matrix4.equals(this.modelMatrix,this._modelMatrix)&&Cartesian3.equals(this.center,this._center)||(Matrix4.clone(this.modelMatrix,this._modelMatrix),Cartesian3.clone(this.center,this._center),Matrix4.multiplyByTranslation(this.modelMatrix,this.center,this._computedModelMatrix),n=!0),n&&(Cartesian3.clone(Cartesian3.ZERO,this._boundingSphere.center),this._boundingSphere.radius=Cartesian3.maximumComponent(a),BoundingSphere.transform(this._boundingSphere,this._computedModelMatrix,this._boundingSphere)),s=this._material!==this.material,this._material=this.material,this._material.update(t),l=this.onlySunLighting!==this._onlySunLighting,this._onlySunLighting=this.onlySunLighting,c=e.useLogDepth,u=this._useLogDepth!==c,this._useLogDepth=c,d=this._colorCommand,(s||l||r||u)&&(h=new ShaderSource({sources:[EllipsoidVS]}),p=new ShaderSource({sources:[this.material.shaderSource,EllipsoidFS]}),this.onlySunLighting&&p.defines.push("ONLY_SUN_LIGHTING"),!i&&t.fragmentDepth&&p.defines.push("WRITE_DEPTH"),this._useLogDepth&&(h.defines.push("LOG_DEPTH"),p.defines.push("LOG_DEPTH"),p.sources.push(logDepthExtension)),this._sp=ShaderProgram.replaceCache({context:t,shaderProgram:this._sp,vertexShaderSource:h,fragmentShaderSource:p,attributeLocations:attributeLocations$4}),d.vertexArray=this._va,d.renderState=this._rs,d.shaderProgram=this._sp,d.uniformMap=combine(this._uniforms,this.material._uniforms),d.executeInClosestFrustum=i),m=e.commandList,(f=e.passes).render&&(d.boundingVolume=this._boundingSphere,d.debugShowBoundingVolume=this.debugShowBoundingVolume,d.modelMatrix=this._computedModelMatrix,d.pass=i?Pass$1.TRANSLUCENT:Pass$1.OPAQUE,m.push(d)),f.pick&&(g=this._pickCommand,defined(this._pickId)&&this._id===this.id||(this._id=this.id,this._pickId=this._pickId&&this._pickId.destroy(),this._pickId=t.createPickId({primitive:this,id:this.id})),(s||l||!defined(this._pickSP)||u)&&(h=new ShaderSource({sources:[EllipsoidVS]}),p=new ShaderSource({sources:[this.material.shaderSource,EllipsoidFS],pickColorQualifier:"uniform"}),this.onlySunLighting&&p.defines.push("ONLY_SUN_LIGHTING"),!i&&t.fragmentDepth&&p.defines.push("WRITE_DEPTH"),this._useLogDepth&&(h.defines.push("LOG_DEPTH"),p.defines.push("LOG_DEPTH"),p.sources.push(logDepthExtension)),this._pickSP=ShaderProgram.replaceCache({context:t,shaderProgram:this._pickSP,vertexShaderSource:h,fragmentShaderSource:p,attributeLocations:attributeLocations$4}),g.vertexArray=this._va,g.renderState=this._rs,g.shaderProgram=this._pickSP,g.uniformMap=combine(combine(this._uniforms,this._pickUniforms),this.material._uniforms),g.executeInClosestFrustum=i),g.boundingVolume=this._boundingSphere,g.modelMatrix=this._computedModelMatrix,g.pass=i?Pass$1.TRANSLUCENT:Pass$1.OPAQUE,m.push(g)))},EllipsoidPrimitive.prototype.isDestroyed=function(){return!1},EllipsoidPrimitive.prototype.destroy=function(){return this._sp=this._sp&&this._sp.destroy(),this._pickSP=this._pickSP&&this._pickSP.destroy(),this._pickId=this._pickId&&this._pickId.destroy(),destroyObject(this)};var EllipsoidSurfaceAppearanceFS="varying vec3 v_positionMC;\nvarying vec3 v_positionEC;\nvarying vec2 v_st;\nvoid main()\n{\nczm_materialInput materialInput;\nvec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)));\n#ifdef FACE_FORWARD\nnormalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n#endif\nmaterialInput.s = v_st.s;\nmaterialInput.st = v_st;\nmaterialInput.str = vec3(v_st, 0.0);\nmaterialInput.normalEC = normalEC;\nmaterialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC);\nvec3 positionToEyeEC = -v_positionEC;\nmaterialInput.positionToEyeEC = positionToEyeEC;\nczm_material material = czm_getMaterial(materialInput);\n#ifdef FLAT\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n#else\ngl_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);\n#endif\n}\n",EllipsoidSurfaceAppearanceVS="attribute vec3 position3DHigh;\nattribute vec3 position3DLow;\nattribute vec2 st;\nattribute float batchId;\nvarying vec3 v_positionMC;\nvarying vec3 v_positionEC;\nvarying vec2 v_st;\nvoid main()\n{\nvec4 p = czm_computePosition();\nv_positionMC = position3DHigh + position3DLow;\nv_positionEC = (czm_modelViewRelativeToEye * p).xyz;\nv_st = st;\ngl_Position = czm_modelViewProjectionRelativeToEye * p;\n}\n";function EllipsoidSurfaceAppearance(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=defaultValue(e.translucent,!0),i=defaultValue(e.aboveGround,!1);this.material=defined(e.material)?e.material:Material.fromType(Material.ColorType),this.translucent=defaultValue(e.translucent,!0),this._vertexShaderSource=defaultValue(e.vertexShaderSource,EllipsoidSurfaceAppearanceVS),this._fragmentShaderSource=defaultValue(e.fragmentShaderSource,EllipsoidSurfaceAppearanceFS),this._renderState=Appearance.getDefaultRenderState(t,!i,e.renderState),this._closed=!1,this._flat=defaultValue(e.flat,!1),this._faceForward=defaultValue(e.faceForward,i),this._aboveGround=i}function Fog(){this.enabled=!0,this.density=2e-4,this.screenSpaceErrorFactor=2,this.minimumBrightness=.03}Object.defineProperties(EllipsoidSurfaceAppearance.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return EllipsoidSurfaceAppearance.VERTEX_FORMAT}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}},aboveGround:{get:function(){return this._aboveGround}}}),EllipsoidSurfaceAppearance.VERTEX_FORMAT=VertexFormat.POSITION_AND_ST,EllipsoidSurfaceAppearance.prototype.getFragmentShaderSource=Appearance.prototype.getFragmentShaderSource,EllipsoidSurfaceAppearance.prototype.isTranslucent=Appearance.prototype.isTranslucent,EllipsoidSurfaceAppearance.prototype.getRenderState=Appearance.prototype.getRenderState;for(var heightsTable=[359.393,800.749,1275.6501,2151.1192,3141.7763,4777.5198,6281.2493,12364.307,15900.765,49889.0549,78026.8259,99260.7344,120036.3873,151011.0158,156091.1953,203849.3112,274866.9803,319916.3149,493552.0528,628733.5874],densityTable=[2e-5,2e-4,1e-4,7e-5,5e-5,4e-5,3e-5,19e-6,1e-5,85e-7,62e-7,58e-7,53e-7,52e-7,51e-7,42e-7,4e-6,34e-7,26e-7,22e-7],i$3=0;i$3<densityTable.length;++i$3)densityTable[i$3]*=1e6;for(var tableStartDensity=densityTable[1],tableEndDensity=densityTable[densityTable.length-1],j=0;j<densityTable.length;++j)densityTable[j]=(densityTable[j]-tableEndDensity)/(tableStartDensity-tableEndDensity);var tableLastIndex=0;function findInterval(e){var t,i=heightsTable,r=i.length;if(e<i[0])return tableLastIndex=0;if(e>i[r-1])return tableLastIndex=r-2;if(e>=i[tableLastIndex]){if(tableLastIndex+1<r&&e<i[tableLastIndex+1])return tableLastIndex;if(tableLastIndex+2<r&&e<i[tableLastIndex+2])return++tableLastIndex}else if(0<=tableLastIndex-1&&e>=i[tableLastIndex-1])return--tableLastIndex;for(t=0;t<r-2&&!(e>=i[t]&&e<i[t+1]);++t);return tableLastIndex=t}var scratchPositionNormal$1=new Cartesian3;function FrameRateMonitor(e){this._scene=e.scene,this.samplingWindow=defaultValue(e.samplingWindow,FrameRateMonitor.defaultSettings.samplingWindow),this.quietPeriod=defaultValue(e.quietPeriod,FrameRateMonitor.defaultSettings.quietPeriod),this.warmupPeriod=defaultValue(e.warmupPeriod,FrameRateMonitor.defaultSettings.warmupPeriod),this.minimumFrameRateDuringWarmup=defaultValue(e.minimumFrameRateDuringWarmup,FrameRateMonitor.defaultSettings.minimumFrameRateDuringWarmup),this.minimumFrameRateAfterWarmup=defaultValue(e.minimumFrameRateAfterWarmup,FrameRateMonitor.defaultSettings.minimumFrameRateAfterWarmup),this._lowFrameRate=new Event,this._nominalFrameRate=new Event,this._frameTimes=[],this._needsQuietPeriod=!0,this._quietPeriodEndTime=0,this._warmupPeriodEndTime=0,this._frameRateIsLow=!1,this._lastFramesPerSecond=void 0,this._pauseCount=0;var i=this;this._preUpdateRemoveListener=this._scene.preUpdate.addEventListener(function(e,t){update$5(i)}),this._hiddenPropertyName=void 0!==document.hidden?"hidden":void 0!==document.mozHidden?"mozHidden":void 0!==document.msHidden?"msHidden":void 0!==document.webkitHidden?"webkitHidden":void 0;var t=void 0!==document.hidden?"visibilitychange":void 0!==document.mozHidden?"mozvisibilitychange":void 0!==document.msHidden?"msvisibilitychange":void 0!==document.webkitHidden?"webkitvisibilitychange":void 0;function r(){visibilityChanged(i)}this._visibilityChangeRemoveListener=void 0,defined(t)&&(document.addEventListener(t,r,!1),this._visibilityChangeRemoveListener=function(){document.removeEventListener(t,r,!1)})}function update$5(e,t){if(!(0<e._pauseCount)){var i=getTimestamp$1();if(e._needsQuietPeriod)e._needsQuietPeriod=!1,e._frameTimes.length=0,e._quietPeriodEndTime=i+e.quietPeriod/TimeConstants$1.SECONDS_PER_MILLISECOND,e._warmupPeriodEndTime=e._quietPeriodEndTime+(e.warmupPeriod+e.samplingWindow)/TimeConstants$1.SECONDS_PER_MILLISECOND;else if(i>=e._quietPeriodEndTime){e._frameTimes.push(i);var r=i-e.samplingWindow/TimeConstants$1.SECONDS_PER_MILLISECOND;if(2<=e._frameTimes.length&&e._frameTimes[0]<=r){for(;2<=e._frameTimes.length&&e._frameTimes[1]<r;)e._frameTimes.shift();var n=(i-e._frameTimes[0])/(e._frameTimes.length-1);e._lastFramesPerSecond=1e3/n,1e3/(i>e._warmupPeriodEndTime?e.minimumFrameRateAfterWarmup:e.minimumFrameRateDuringWarmup)<n?e._frameRateIsLow||(e._frameRateIsLow=!0,e._needsQuietPeriod=!0,e.lowFrameRate.raiseEvent(e.scene,e._lastFramesPerSecond)):e._frameRateIsLow&&(e._frameRateIsLow=!1,e._needsQuietPeriod=!0,e.nominalFrameRate.raiseEvent(e.scene,e._lastFramesPerSecond))}}}}function visibilityChanged(e){document[e._hiddenPropertyName]?e.pause():e.unpause()}function FrameState(e,t,i){this.context=e,this.commandList=[],this.shadowMaps=[],this.brdfLutGenerator=void 0,this.environmentMap=void 0,this.sphericalHarmonicCoefficients=void 0,this.specularEnvironmentMaps=void 0,this.specularEnvironmentMapsMaximumLOD=void 0,this.mode=SceneMode$1.SCENE3D,this.morphTime=SceneMode$1.getMorphTime(SceneMode$1.SCENE3D),this.frameNumber=0,this.newFrame=!1,this.time=void 0,this.jobScheduler=i,this.mapProjection=void 0,this.camera=void 0,this.cameraUnderground=!1,this.globeTranslucencyState=void 0,this.cullingVolume=void 0,this.occluder=void 0,this.maximumScreenSpaceError=void 0,this.pixelRatio=1,this.passes={render:!1,pick:!1,depth:!1,postProcess:!1,offscreen:!1},this.creditDisplay=t,this.afterRender=[],this.scene3DOnly=!1,this.fog={enabled:!1,density:void 0,sse:void 0,minimumBrightness:void 0},this.terrainExaggeration=1,this.shadowState={shadowsEnabled:!0,shadowMaps:[],lightShadowMaps:[],nearPlane:1,farPlane:5e3,closestObjectSize:1e3,lastDirtyTime:0,outOfView:!0},this.imagerySplitPosition=0,this.frustumSplits=[],this.backgroundColor=void 0,this.light=void 0,this.minimumDisableDepthTestDistance=void 0,this.invertClassification=!1,this.invertClassificationColor=void 0,this.useLogDepth=!1,this.tilesetPassState=void 0,this.minimumTerrainHeight=0}function FrustumCommands(e,t){this.near=defaultValue(e,0),this.far=defaultValue(t,0);for(var i=Pass$1.NUMBER_OF_PASSES,r=new Array(i),n=new Array(i),a=0;a<i;++a)r[a]=[],n[a]=0;this.commands=r,this.indices=n}function GetFeatureInfoFormat(e,t,i){this.type=e,defined(t)||("json"===e?t="application/json":"xml"===e?t="text/xml":"html"===e?t="text/html":"text"===e&&(t="text/plain")),this.format=t,defined(i)||("json"===e?i=geoJsonToFeatureInfo:"xml"===e?i=xmlToFeatureInfo:"html"!==e&&"text"!==e||(i=textToFeatureInfo)),this.callback=i}function geoJsonToFeatureInfo(e){for(var t=[],i=e.features,r=0;r<i.length;++r){var n,a,o=i[r],s=new ImageryLayerFeatureInfo;s.data=o,s.properties=o.properties,s.configureNameFromProperties(o.properties),s.configureDescriptionFromProperties(o.properties),defined(o.geometry)&&"Point"===o.geometry.type&&(n=o.geometry.coordinates[0],a=o.geometry.coordinates[1],s.position=Cartographic.fromDegrees(n,a)),t.push(s)}return t}Fog.prototype.update=function(e){var t,i,r,n,a,o,s,l;(e.fog.enabled=this.enabled)&&(!defined(i=(t=e.camera).positionCartographic)||8e5<i.height||e.mode!==SceneMode$1.SCENE3D?e.fog.enabled=!1:(n=findInterval(r=i.height),a=CesiumMath.clamp((r-heightsTable[n])/(heightsTable[n+1]-heightsTable[n]),0,1),s=(s=CesiumMath.lerp(densityTable[n],densityTable[n+1],a))*((o=1e6*this.density)-o/tableStartDensity*tableEndDensity)*1e-6,l=Cartesian3.normalize(t.positionWC,scratchPositionNormal$1),s*=1-Math.abs(Cartesian3.dot(t.directionWC,l)),e.fog.density=s,e.fog.sse=this.screenSpaceErrorFactor,e.fog.minimumBrightness=this.minimumBrightness))},FrameRateMonitor.defaultSettings={samplingWindow:5,quietPeriod:2,warmupPeriod:5,minimumFrameRateDuringWarmup:4,minimumFrameRateAfterWarmup:8},FrameRateMonitor.fromScene=function(e){return defined(e._frameRateMonitor)&&!e._frameRateMonitor.isDestroyed()||(e._frameRateMonitor=new FrameRateMonitor({scene:e})),e._frameRateMonitor},Object.defineProperties(FrameRateMonitor.prototype,{scene:{get:function(){return this._scene}},lowFrameRate:{get:function(){return this._lowFrameRate}},nominalFrameRate:{get:function(){return this._nominalFrameRate}},lastFramesPerSecond:{get:function(){return this._lastFramesPerSecond}}}),FrameRateMonitor.prototype.pause=function(){++this._pauseCount,1===this._pauseCount&&(this._frameTimes.length=0,this._lastFramesPerSecond=void 0)},FrameRateMonitor.prototype.unpause=function(){--this._pauseCount,this._pauseCount<=0&&(this._pauseCount=0,this._needsQuietPeriod=!0)},FrameRateMonitor.prototype.isDestroyed=function(){return!1},FrameRateMonitor.prototype.destroy=function(){return this._preUpdateRemoveListener(),defined(this._visibilityChangeRemoveListener)&&this._visibilityChangeRemoveListener(),destroyObject(this)};var mapInfoMxpNamespace="http://www.mapinfo.com/mxp",esriWmsNamespace="http://www.esri.com/wms",wfsNamespace="http://www.opengis.net/wfs",gmlNamespace="http://www.opengis.net/gml";function xmlToFeatureInfo(e){var t=e.documentElement;if("MultiFeatureCollection"===t.localName&&t.namespaceURI===mapInfoMxpNamespace)return mapInfoXmlToFeatureInfo(e);if("FeatureInfoResponse"===t.localName&&t.namespaceURI===esriWmsNamespace)return esriXmlToFeatureInfo(e);if("FeatureCollection"===t.localName&&t.namespaceURI===wfsNamespace)return gmlToFeatureInfo(e);if("ServiceExceptionReport"===t.localName)throw new RuntimeError((new XMLSerializer).serializeToString(t));return("msGMLOutput"===t.localName?msGmlToFeatureInfo:unknownXmlToFeatureInfo)(e)}function mapInfoXmlToFeatureInfo(e){for(var t=[],i=e.documentElement.getElementsByTagNameNS(mapInfoMxpNamespace,"Feature"),r=0;r<i.length;++r){for(var n=i[r],a={},o=n.getElementsByTagNameNS(mapInfoMxpNamespace,"Val"),s=0;s<o.length;++s){var l,c,u=o[s];u.hasAttribute("ref")&&(l=u.getAttribute("ref"),c=u.textContent.trim(),a[l]=c)}var d=new ImageryLayerFeatureInfo;d.data=n,d.properties=a,d.configureNameFromProperties(a),d.configureDescriptionFromProperties(a),t.push(d)}return t}function esriXmlToFeatureInfo(e){var t=e.documentElement,i=[],r=t.getElementsByTagNameNS("*","FIELDS");if(0<r.length)for(var n=0;n<r.length;++n){for(var a=r[n],o={},s=a.attributes,l=0;l<s.length;++l){var c=s[l];o[c.name]=c.value}i.push(imageryLayerFeatureInfoFromDataAndProperties(a,o))}else for(var u=t.getElementsByTagNameNS("*","FeatureInfo"),d=0;d<u.length;++d){var h=u[d];o={};for(var p=h.childNodes,m=0;m<p.length;++m){var f=p[m];f.nodeType===Node.ELEMENT_NODE&&(o[f.localName]=f.textContent)}i.push(imageryLayerFeatureInfoFromDataAndProperties(h,o))}return i}function gmlToFeatureInfo(e){for(var t=[],i=e.documentElement.getElementsByTagNameNS(gmlNamespace,"featureMember"),r=0;r<i.length;++r){var n=i[r],a={};getGmlPropertiesRecursively(n,a),t.push(imageryLayerFeatureInfoFromDataAndProperties(n,a))}return t}function msGmlToFeatureInfo(e){for(var t,i=[],r=e.documentElement.childNodes,n=0;n<r.length;n++)if(r[n].nodeType===Node.ELEMENT_NODE){t=r[n];break}if(!defined(t))throw new RuntimeError("Unable to find first child of the feature info xml document");for(var a=t.childNodes,o=0;o<a.length;++o){var s,l=a[o];l.nodeType===Node.ELEMENT_NODE&&(getGmlPropertiesRecursively(l,s={}),i.push(imageryLayerFeatureInfoFromDataAndProperties(l,s)))}return i}function getGmlPropertiesRecursively(e,t){for(var i=!0,r=0;r<e.childNodes.length;++r){var n=e.childNodes[r];n.nodeType===Node.ELEMENT_NODE&&(i=!1),"Point"!==n.localName&&"LineString"!==n.localName&&"Polygon"!==n.localName&&"boundedBy"!==n.localName&&n.hasChildNodes()&&getGmlPropertiesRecursively(n,t)&&(t[n.localName]=n.textContent)}return i}function imageryLayerFeatureInfoFromDataAndProperties(e,t){var i=new ImageryLayerFeatureInfo;return i.data=e,i.properties=t,i.configureNameFromProperties(t),i.configureDescriptionFromProperties(t),i}function unknownXmlToFeatureInfo(e){var t=(new XMLSerializer).serializeToString(e),i=document.createElement("div"),r=document.createElement("pre");r.textContent=t,i.appendChild(r);var n=new ImageryLayerFeatureInfo;return n.data=e,n.description=i.innerHTML,[n]}var emptyBodyRegex=/<body>\s*<\/body>/im,wmsServiceExceptionReportRegex=/<ServiceExceptionReport([\s\S]*)<\/ServiceExceptionReport>/im,titleRegex=/<title>([\s\S]*)<\/title>/im;function textToFeatureInfo(e){if(!emptyBodyRegex.test(e)&&!wmsServiceExceptionReportRegex.test(e)){var t,i=titleRegex.exec(e);i&&1<i.length&&(t=i[1]);var r=new ImageryLayerFeatureInfo;return r.name=t,r.description=e,r.data=e,[r]}}var GlobeFS="uniform vec4 u_initialColor;\n#if TEXTURE_UNITS > 0\nuniform sampler2D u_dayTextures[TEXTURE_UNITS];\nuniform vec4 u_dayTextureTranslationAndScale[TEXTURE_UNITS];\nuniform bool u_dayTextureUseWebMercatorT[TEXTURE_UNITS];\n#ifdef APPLY_ALPHA\nuniform float u_dayTextureAlpha[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_DAY_NIGHT_ALPHA\nuniform float u_dayTextureNightAlpha[TEXTURE_UNITS];\nuniform float u_dayTextureDayAlpha[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_SPLIT\nuniform float u_dayTextureSplit[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_BRIGHTNESS\nuniform float u_dayTextureBrightness[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_CONTRAST\nuniform float u_dayTextureContrast[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_HUE\nuniform float u_dayTextureHue[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_SATURATION\nuniform float u_dayTextureSaturation[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_GAMMA\nuniform float u_dayTextureOneOverGamma[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_IMAGERY_CUTOUT\nuniform vec4 u_dayTextureCutoutRectangles[TEXTURE_UNITS];\n#endif\n#ifdef APPLY_COLOR_TO_ALPHA\nuniform vec4 u_colorsToAlpha[TEXTURE_UNITS];\n#endif\nuniform vec4 u_dayTextureTexCoordsRectangle[TEXTURE_UNITS];\n#endif\n#ifdef SHOW_REFLECTIVE_OCEAN\nuniform sampler2D u_waterMask;\nuniform vec4 u_waterMaskTranslationAndScale;\nuniform float u_zoomedOutOceanSpecularIntensity;\n#endif\n#ifdef SHOW_OCEAN_WAVES\nuniform sampler2D u_oceanNormalMap;\n#endif\n#if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE)\nuniform vec2 u_lightingFadeDistance;\n#endif\n#ifdef TILE_LIMIT_RECTANGLE\nuniform vec4 u_cartographicLimitRectangle;\n#endif\n#ifdef GROUND_ATMOSPHERE\nuniform vec2 u_nightFadeDistance;\n#endif\n#ifdef ENABLE_CLIPPING_PLANES\nuniform highp sampler2D u_clippingPlanes;\nuniform mat4 u_clippingPlanesMatrix;\nuniform vec4 u_clippingPlanesEdgeStyle;\n#endif\n#if defined(FOG) && defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING))\nuniform float u_minimumBrightness;\n#endif\n#ifdef COLOR_CORRECT\nuniform vec3 u_hsbShift;\n#endif\n#ifdef HIGHLIGHT_FILL_TILE\nuniform vec4 u_fillHighlightColor;\n#endif\n#ifdef TRANSLUCENT\nuniform vec4 u_frontFaceAlphaByDistance;\nuniform vec4 u_backFaceAlphaByDistance;\nuniform vec4 u_translucencyRectangle;\n#endif\n#ifdef UNDERGROUND_COLOR\nuniform vec4 u_undergroundColor;\nuniform vec4 u_undergroundColorAlphaByDistance;\n#endif\nvarying vec3 v_positionMC;\nvarying vec3 v_positionEC;\nvarying vec3 v_textureCoordinates;\nvarying vec3 v_normalMC;\nvarying vec3 v_normalEC;\n#ifdef APPLY_MATERIAL\nvarying float v_height;\nvarying float v_slope;\nvarying float v_aspect;\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT)\nvarying float v_distance;\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE)\nvarying vec3 v_fogRayleighColor;\nvarying vec3 v_fogMieColor;\n#endif\n#ifdef GROUND_ATMOSPHERE\nvarying vec3 v_rayleighColor;\nvarying vec3 v_mieColor;\n#endif\n#if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT)\nfloat interpolateByDistance(vec4 nearFarScalar, float distance)\n{\nfloat startDistance = nearFarScalar.x;\nfloat startValue = nearFarScalar.y;\nfloat endDistance = nearFarScalar.z;\nfloat endValue = nearFarScalar.w;\nfloat t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0);\nreturn mix(startValue, endValue, t);\n}\n#endif\n#if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) || defined(APPLY_MATERIAL)\nvec4 alphaBlend(vec4 sourceColor, vec4 destinationColor)\n{\nreturn sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a);\n}\n#endif\n#ifdef TRANSLUCENT\nbool inTranslucencyRectangle()\n{\nreturn\nv_textureCoordinates.x > u_translucencyRectangle.x &&\nv_textureCoordinates.x < u_translucencyRectangle.z &&\nv_textureCoordinates.y > u_translucencyRectangle.y &&\nv_textureCoordinates.y < u_translucencyRectangle.w;\n}\n#endif\nvec4 sampleAndBlend(\nvec4 previousColor,\nsampler2D textureToSample,\nvec2 tileTextureCoordinates,\nvec4 textureCoordinateRectangle,\nvec4 textureCoordinateTranslationAndScale,\nfloat textureAlpha,\nfloat textureNightAlpha,\nfloat textureDayAlpha,\nfloat textureBrightness,\nfloat textureContrast,\nfloat textureHue,\nfloat textureSaturation,\nfloat textureOneOverGamma,\nfloat split,\nvec4 colorToAlpha,\nfloat nightBlend)\n{\nvec2 alphaMultiplier = step(textureCoordinateRectangle.st, tileTextureCoordinates);\ntextureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y;\nalphaMultiplier = step(vec2(0.0), textureCoordinateRectangle.pq - tileTextureCoordinates);\ntextureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y;\n#if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING)\ntextureAlpha *= mix(textureDayAlpha, textureNightAlpha, nightBlend);\n#endif\nvec2 translation = textureCoordinateTranslationAndScale.xy;\nvec2 scale = textureCoordinateTranslationAndScale.zw;\nvec2 textureCoordinates = tileTextureCoordinates * scale + translation;\nvec4 value = texture2D(textureToSample, textureCoordinates);\nvec3 color = value.rgb;\nfloat alpha = value.a;\n#ifdef APPLY_COLOR_TO_ALPHA\nvec3 colorDiff = abs(color.rgb - colorToAlpha.rgb);\ncolorDiff.r = max(max(colorDiff.r, colorDiff.g), colorDiff.b);\nalpha = czm_branchFreeTernary(colorDiff.r < colorToAlpha.a, 0.0, alpha);\n#endif\n#if !defined(APPLY_GAMMA)\nvec4 tempColor = czm_gammaCorrect(vec4(color, alpha));\ncolor = tempColor.rgb;\nalpha = tempColor.a;\n#else\ncolor = pow(color, vec3(textureOneOverGamma));\n#endif\n#ifdef APPLY_SPLIT\nfloat splitPosition = czm_imagerySplitPosition;\nif (split < 0.0 && gl_FragCoord.x > splitPosition) {\nalpha = 0.0;\n}\nelse if (split > 0.0 && gl_FragCoord.x < splitPosition) {\nalpha = 0.0;\n}\n#endif\n#ifdef APPLY_BRIGHTNESS\ncolor = mix(vec3(0.0), color, textureBrightness);\n#endif\n#ifdef APPLY_CONTRAST\ncolor = mix(vec3(0.5), color, textureContrast);\n#endif\n#ifdef APPLY_HUE\ncolor = czm_hue(color, textureHue);\n#endif\n#ifdef APPLY_SATURATION\ncolor = czm_saturation(color, textureSaturation);\n#endif\nfloat sourceAlpha = alpha * textureAlpha;\nfloat outAlpha = mix(previousColor.a, 1.0, sourceAlpha);\noutAlpha += sign(outAlpha) - 1.0;\nvec3 outColor = mix(previousColor.rgb * previousColor.a, color, sourceAlpha) / outAlpha;\nreturn vec4(outColor, max(outAlpha, 0.0));\n}\nvec3 colorCorrect(vec3 rgb) {\n#ifdef COLOR_CORRECT\nvec3 hsb = czm_RGBToHSB(rgb);\nhsb.x += u_hsbShift.x;\nhsb.y = clamp(hsb.y + u_hsbShift.y, 0.0, 1.0);\nhsb.z = hsb.z > czm_epsilon7 ? hsb.z + u_hsbShift.z : 0.0;\nrgb = czm_HSBToRGB(hsb);\n#endif\nreturn rgb;\n}\nvec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend);\nvec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float specularMapValue, float fade);\n#ifdef GROUND_ATMOSPHERE\nvec3 computeGroundAtmosphereColor(vec3 fogColor, vec4 finalColor, vec3 atmosphereLightDirection, float cameraDist);\n#endif\nconst float fExposure = 2.0;\nvoid main()\n{\n#ifdef TILE_LIMIT_RECTANGLE\nif (v_textureCoordinates.x < u_cartographicLimitRectangle.x || u_cartographicLimitRectangle.z < v_textureCoordinates.x ||\nv_textureCoordinates.y < u_cartographicLimitRectangle.y || u_cartographicLimitRectangle.w < v_textureCoordinates.y)\n{\ndiscard;\n}\n#endif\n#ifdef ENABLE_CLIPPING_PLANES\nfloat clipDistance = clip(gl_FragCoord, u_clippingPlanes, u_clippingPlanesMatrix);\n#endif\n#if defined(SHOW_REFLECTIVE_OCEAN) || defined(ENABLE_DAYNIGHT_SHADING) || defined(HDR)\nvec3 normalMC = czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0));\nvec3 normalEC = czm_normal3D * normalMC;\n#endif\n#if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING)\nfloat nightBlend = 1.0 - clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0, 0.0, 1.0);\n#else\nfloat nightBlend = 0.0;\n#endif\nvec4 color = computeDayColor(u_initialColor, clamp(v_textureCoordinates, 0.0, 1.0), nightBlend);\n#ifdef SHOW_TILE_BOUNDARIES\nif (v_textureCoordinates.x < (1.0/256.0) || v_textureCoordinates.x > (255.0/256.0) ||\nv_textureCoordinates.y < (1.0/256.0) || v_textureCoordinates.y > (255.0/256.0))\n{\ncolor = vec4(1.0, 0.0, 0.0, 1.0);\n}\n#endif\n#if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE)\nfloat cameraDist;\nif (czm_sceneMode == czm_sceneMode2D)\n{\ncameraDist = max(czm_frustumPlanes.x - czm_frustumPlanes.y, czm_frustumPlanes.w - czm_frustumPlanes.z) * 0.5;\n}\nelse if (czm_sceneMode == czm_sceneModeColumbusView)\n{\ncameraDist = -czm_view[3].z;\n}\nelse\n{\ncameraDist = length(czm_view[3]);\n}\nfloat fadeOutDist = u_lightingFadeDistance.x;\nfloat fadeInDist = u_lightingFadeDistance.y;\nif (czm_sceneMode != czm_sceneMode3D) {\nvec3 radii = czm_ellipsoidRadii;\nfloat maxRadii = max(radii.x, max(radii.y, radii.z));\nfadeOutDist -= maxRadii;\nfadeInDist -= maxRadii;\n}\nfloat fade = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.0, 1.0);\n#else\nfloat fade = 0.0;\n#endif\n#ifdef SHOW_REFLECTIVE_OCEAN\nvec2 waterMaskTranslation = u_waterMaskTranslationAndScale.xy;\nvec2 waterMaskScale = u_waterMaskTranslationAndScale.zw;\nvec2 waterMaskTextureCoordinates = v_textureCoordinates.xy * waterMaskScale + waterMaskTranslation;\nwaterMaskTextureCoordinates.y = 1.0 - waterMaskTextureCoordinates.y;\nfloat mask = texture2D(u_waterMask, waterMaskTextureCoordinates).r;\nif (mask > 0.0)\n{\nmat3 enuToEye = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalEC);\nvec2 ellipsoidTextureCoordinates = czm_ellipsoidWgs84TextureCoordinates(normalMC);\nvec2 ellipsoidFlippedTextureCoordinates = czm_ellipsoidWgs84TextureCoordinates(normalMC.zyx);\nvec2 textureCoordinates = mix(ellipsoidTextureCoordinates, ellipsoidFlippedTextureCoordinates, czm_morphTime * smoothstep(0.9, 0.95, normalMC.z));\ncolor = computeWaterColor(v_positionEC, textureCoordinates, enuToEye, color, mask, fade);\n}\n#endif\n#ifdef APPLY_MATERIAL\nczm_materialInput materialInput;\nmaterialInput.st = v_textureCoordinates.st;\nmaterialInput.normalEC = normalize(v_normalEC);\nmaterialInput.slope = v_slope;\nmaterialInput.height = v_height;\nmaterialInput.aspect = v_aspect;\nczm_material material = czm_getMaterial(materialInput);\nvec4 materialColor = vec4(material.diffuse, material.alpha);\ncolor = alphaBlend(materialColor, color);\n#endif\n#ifdef ENABLE_VERTEX_LIGHTING\nfloat diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalize(v_normalEC)) * 0.9 + 0.3, 0.0, 1.0);\nvec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a);\n#elif defined(ENABLE_DAYNIGHT_SHADING)\nfloat diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0 + 0.3, 0.0, 1.0);\ndiffuseIntensity = mix(1.0, diffuseIntensity, fade);\nvec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a);\n#else\nvec4 finalColor = color;\n#endif\n#ifdef ENABLE_CLIPPING_PLANES\nvec4 clippingPlanesEdgeColor = vec4(1.0);\nclippingPlanesEdgeColor.rgb = u_clippingPlanesEdgeStyle.rgb;\nfloat clippingPlanesEdgeWidth = u_clippingPlanesEdgeStyle.a;\nif (clipDistance < clippingPlanesEdgeWidth)\n{\nfinalColor = clippingPlanesEdgeColor;\n}\n#endif\n#ifdef HIGHLIGHT_FILL_TILE\nfinalColor = vec4(mix(finalColor.rgb, u_fillHighlightColor.rgb, u_fillHighlightColor.a), finalColor.a);\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE)\nvec3 fogColor = colorCorrect(v_fogMieColor) + finalColor.rgb * colorCorrect(v_fogRayleighColor);\n#ifndef HDR\nfogColor = vec3(1.0) - exp(-fExposure * fogColor);\n#endif\n#endif\n#if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN)\nvec3 atmosphereLightDirection = czm_sunDirectionWC;\n#else\nvec3 atmosphereLightDirection = czm_lightDirectionWC;\n#endif\n#ifdef FOG\n#if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING))\nfloat darken = clamp(dot(normalize(czm_viewerPositionWC), atmosphereLightDirection), u_minimumBrightness, 1.0);\nfogColor *= darken;\n#endif\n#ifdef HDR\nconst float modifier = 0.15;\nfinalColor = vec4(czm_fog(v_distance, finalColor.rgb, fogColor, modifier), finalColor.a);\n#else\nfinalColor = vec4(czm_fog(v_distance, finalColor.rgb, fogColor), finalColor.a);\n#endif\n#endif\n#ifdef GROUND_ATMOSPHERE\nif (!czm_backFacing())\n{\nvec3 groundAtmosphereColor = computeGroundAtmosphereColor(fogColor, finalColor, atmosphereLightDirection, cameraDist);\nfinalColor = vec4(mix(finalColor.rgb, groundAtmosphereColor, fade), finalColor.a);\n}\n#endif\n#ifdef UNDERGROUND_COLOR\nif (czm_backFacing())\n{\nfloat distanceFromEllipsoid = max(czm_eyeHeight, 0.0);\nfloat distance = max(v_distance - distanceFromEllipsoid, 0.0);\nfloat blendAmount = interpolateByDistance(u_undergroundColorAlphaByDistance, distance);\nvec4 undergroundColor = vec4(u_undergroundColor.rgb, u_undergroundColor.a * blendAmount);\nfinalColor = alphaBlend(undergroundColor, finalColor);\n}\n#endif\n#ifdef TRANSLUCENT\nif (inTranslucencyRectangle())\n{\nvec4 alphaByDistance = gl_FrontFacing ? u_frontFaceAlphaByDistance : u_backFaceAlphaByDistance;\nfinalColor.a *= interpolateByDistance(alphaByDistance, v_distance);\n}\n#endif\ngl_FragColor = finalColor;\n}\n#ifdef GROUND_ATMOSPHERE\nvec3 computeGroundAtmosphereColor(vec3 fogColor, vec4 finalColor, vec3 atmosphereLightDirection, float cameraDist)\n{\n#if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING))\nfloat mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0), 1.0);\nvec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);\nxy *= czm_viewport.zw * mpp * 0.5;\nvec3 direction = normalize(vec3(xy, -czm_currentFrustum.x));\nczm_ray ray = czm_ray(vec3(0.0), direction);\nvec3 ellipsoid_center = czm_view[3].xyz;\nczm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii);\nvec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start);\nellipsoidPosition = (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz;\nAtmosphereColor atmosColor = computeGroundAtmosphereFromSpace(ellipsoidPosition, true, atmosphereLightDirection);\nvec3 groundAtmosphereColor = colorCorrect(atmosColor.mie) + finalColor.rgb * colorCorrect(atmosColor.rayleigh);\n#ifndef HDR\ngroundAtmosphereColor = vec3(1.0) - exp(-fExposure * groundAtmosphereColor);\n#endif\nfloat fadeInDist = u_nightFadeDistance.x;\nfloat fadeOutDist = u_nightFadeDistance.y;\nfloat sunlitAtmosphereIntensity = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.0, 1.0);\n#ifdef HDR\nsunlitAtmosphereIntensity = max(sunlitAtmosphereIntensity * sunlitAtmosphereIntensity, 0.03);\n#endif\ngroundAtmosphereColor = mix(groundAtmosphereColor, fogColor, sunlitAtmosphereIntensity);\n#else\nvec3 groundAtmosphereColor = fogColor;\n#endif\n#ifdef HDR\ngroundAtmosphereColor = czm_saturation(groundAtmosphereColor, 1.6);\n#endif\nreturn groundAtmosphereColor;\n}\n#endif\n#ifdef SHOW_REFLECTIVE_OCEAN\nfloat waveFade(float edge0, float edge1, float x)\n{\nfloat y = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\nreturn pow(1.0 - y, 5.0);\n}\nfloat linearFade(float edge0, float edge1, float x)\n{\nreturn clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n}\nconst float oceanFrequencyLowAltitude = 825000.0;\nconst float oceanAnimationSpeedLowAltitude = 0.004;\nconst float oceanOneOverAmplitudeLowAltitude = 1.0 / 2.0;\nconst float oceanSpecularIntensity = 0.5;\nconst float oceanFrequencyHighAltitude = 125000.0;\nconst float oceanAnimationSpeedHighAltitude = 0.008;\nconst float oceanOneOverAmplitudeHighAltitude = 1.0 / 2.0;\nvec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float maskValue, float fade)\n{\nvec3 positionToEyeEC = -positionEyeCoordinates;\nfloat positionToEyeECLength = length(positionToEyeEC);\nvec3 normalizedPositionToEyeEC = normalize(normalize(positionToEyeEC));\nfloat waveIntensity = waveFade(70000.0, 1000000.0, positionToEyeECLength);\n#ifdef SHOW_OCEAN_WAVES\nfloat time = czm_frameNumber * oceanAnimationSpeedHighAltitude;\nvec4 noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyHighAltitude, time, 0.0);\nvec3 normalTangentSpaceHighAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeHighAltitude);\ntime = czm_frameNumber * oceanAnimationSpeedLowAltitude;\nnoise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyLowAltitude, time, 0.0);\nvec3 normalTangentSpaceLowAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeLowAltitude);\nfloat highAltitudeFade = linearFade(0.0, 60000.0, positionToEyeECLength);\nfloat lowAltitudeFade = 1.0 - linearFade(20000.0, 60000.0, positionToEyeECLength);\nvec3 normalTangentSpace =\n(highAltitudeFade * normalTangentSpaceHighAltitude) +\n(lowAltitudeFade * normalTangentSpaceLowAltitude);\nnormalTangentSpace = normalize(normalTangentSpace);\nnormalTangentSpace.xy *= waveIntensity;\nnormalTangentSpace = normalize(normalTangentSpace);\n#else\nvec3 normalTangentSpace = vec3(0.0, 0.0, 1.0);\n#endif\nvec3 normalEC = enuToEye * normalTangentSpace;\nconst vec3 waveHighlightColor = vec3(0.3, 0.45, 0.6);\nfloat diffuseIntensity = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * maskValue;\nvec3 diffuseHighlight = waveHighlightColor * diffuseIntensity * (1.0 - fade);\n#ifdef SHOW_OCEAN_WAVES\nfloat tsPerturbationRatio = normalTangentSpace.z;\nvec3 nonDiffuseHighlight = mix(waveHighlightColor * 5.0 * (1.0 - tsPerturbationRatio), vec3(0.0), diffuseIntensity);\n#else\nvec3 nonDiffuseHighlight = vec3(0.0);\n#endif\nfloat specularIntensity = czm_getSpecular(czm_lightDirectionEC, normalizedPositionToEyeEC, normalEC, 10.0);\nfloat surfaceReflectance = mix(0.0, mix(u_zoomedOutOceanSpecularIntensity, oceanSpecularIntensity, waveIntensity), maskValue);\nfloat specular = specularIntensity * surfaceReflectance;\n#ifdef HDR\nspecular *= 1.4;\nfloat e = 0.2;\nfloat d = 3.3;\nfloat c = 1.7;\nvec3 color = imageryColor.rgb + (c * (vec3(e) + imageryColor.rgb * d) * (diffuseHighlight + nonDiffuseHighlight + specular));\n#else\nvec3 color = imageryColor.rgb + diffuseHighlight + nonDiffuseHighlight + specular;\n#endif\nreturn vec4(color, imageryColor.a);\n}\n#endif // #ifdef SHOW_REFLECTIVE_OCEAN\n",GlobeVS="#ifdef QUANTIZATION_BITS12\nattribute vec4 compressed0;\nattribute float compressed1;\n#else\nattribute vec4 position3DAndHeight;\nattribute vec4 textureCoordAndEncodedNormals;\n#endif\nuniform vec3 u_center3D;\nuniform mat4 u_modifiedModelView;\nuniform mat4 u_modifiedModelViewProjection;\nuniform vec4 u_tileRectangle;\nuniform vec2 u_southAndNorthLatitude;\nuniform vec2 u_southMercatorYAndOneOverHeight;\nvarying vec3 v_positionMC;\nvarying vec3 v_positionEC;\nvarying vec3 v_textureCoordinates;\nvarying vec3 v_normalMC;\nvarying vec3 v_normalEC;\n#ifdef APPLY_MATERIAL\nvarying float v_slope;\nvarying float v_aspect;\nvarying float v_height;\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT)\nvarying float v_distance;\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE)\nvarying vec3 v_fogMieColor;\nvarying vec3 v_fogRayleighColor;\n#endif\nvec4 getPosition(vec3 position, float height, vec2 textureCoordinates);\nfloat get2DYPositionFraction(vec2 textureCoordinates);\nvec4 getPosition3DMode(vec3 position, float height, vec2 textureCoordinates)\n{\nreturn u_modifiedModelViewProjection * vec4(position, 1.0);\n}\nfloat get2DMercatorYPositionFraction(vec2 textureCoordinates)\n{\nconst float maxTileWidth = 0.003068;\nfloat positionFraction = textureCoordinates.y;\nfloat southLatitude = u_southAndNorthLatitude.x;\nfloat northLatitude = u_southAndNorthLatitude.y;\nif (northLatitude - southLatitude > maxTileWidth)\n{\nfloat southMercatorY = u_southMercatorYAndOneOverHeight.x;\nfloat oneOverMercatorHeight = u_southMercatorYAndOneOverHeight.y;\nfloat currentLatitude = mix(southLatitude, northLatitude, textureCoordinates.y);\ncurrentLatitude = clamp(currentLatitude, -czm_webMercatorMaxLatitude, czm_webMercatorMaxLatitude);\npositionFraction = czm_latitudeToWebMercatorFraction(currentLatitude, southMercatorY, oneOverMercatorHeight);\n}\nreturn positionFraction;\n}\nfloat get2DGeographicYPositionFraction(vec2 textureCoordinates)\n{\nreturn textureCoordinates.y;\n}\nvec4 getPositionPlanarEarth(vec3 position, float height, vec2 textureCoordinates)\n{\nfloat yPositionFraction = get2DYPositionFraction(textureCoordinates);\nvec4 rtcPosition2D = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0);\nreturn u_modifiedModelViewProjection * rtcPosition2D;\n}\nvec4 getPosition2DMode(vec3 position, float height, vec2 textureCoordinates)\n{\nreturn getPositionPlanarEarth(position, 0.0, textureCoordinates);\n}\nvec4 getPositionColumbusViewMode(vec3 position, float height, vec2 textureCoordinates)\n{\nreturn getPositionPlanarEarth(position, height, textureCoordinates);\n}\nvec4 getPositionMorphingMode(vec3 position, float height, vec2 textureCoordinates)\n{\nvec3 position3DWC = position + u_center3D;\nfloat yPositionFraction = get2DYPositionFraction(textureCoordinates);\nvec4 position2DWC = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0);\nvec4 morphPosition = czm_columbusViewMorph(position2DWC, vec4(position3DWC, 1.0), czm_morphTime);\nreturn czm_modelViewProjection * morphPosition;\n}\n#ifdef QUANTIZATION_BITS12\nuniform vec2 u_minMaxHeight;\nuniform mat4 u_scaleAndBias;\n#endif\nvoid main()\n{\n#ifdef QUANTIZATION_BITS12\nvec2 xy = czm_decompressTextureCoordinates(compressed0.x);\nvec2 zh = czm_decompressTextureCoordinates(compressed0.y);\nvec3 position = vec3(xy, zh.x);\nfloat height = zh.y;\nvec2 textureCoordinates = czm_decompressTextureCoordinates(compressed0.z);\nheight = height * (u_minMaxHeight.y - u_minMaxHeight.x) + u_minMaxHeight.x;\nposition = (u_scaleAndBias * vec4(position, 1.0)).xyz;\n#if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL)) && defined(INCLUDE_WEB_MERCATOR_Y)\nfloat webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x;\nfloat encodedNormal = compressed1;\n#elif defined(INCLUDE_WEB_MERCATOR_Y)\nfloat webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x;\nfloat encodedNormal = 0.0;\n#elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL)\nfloat webMercatorT = textureCoordinates.y;\nfloat encodedNormal = compressed0.w;\n#else\nfloat webMercatorT = textureCoordinates.y;\nfloat encodedNormal = 0.0;\n#endif\n#else\nvec3 position = position3DAndHeight.xyz;\nfloat height = position3DAndHeight.w;\nvec2 textureCoordinates = textureCoordAndEncodedNormals.xy;\n#if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL)) && defined(INCLUDE_WEB_MERCATOR_Y)\nfloat webMercatorT = textureCoordAndEncodedNormals.z;\nfloat encodedNormal = textureCoordAndEncodedNormals.w;\n#elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL)\nfloat webMercatorT = textureCoordinates.y;\nfloat encodedNormal = textureCoordAndEncodedNormals.z;\n#elif defined(INCLUDE_WEB_MERCATOR_Y)\nfloat webMercatorT = textureCoordAndEncodedNormals.z;\nfloat encodedNormal = 0.0;\n#else\nfloat webMercatorT = textureCoordinates.y;\nfloat encodedNormal = 0.0;\n#endif\n#endif\nvec3 position3DWC = position + u_center3D;\ngl_Position = getPosition(position, height, textureCoordinates);\nv_textureCoordinates = vec3(textureCoordinates, webMercatorT);\n#if defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL)\nv_positionEC = (u_modifiedModelView * vec4(position, 1.0)).xyz;\nv_positionMC = position3DWC;\nvec3 normalMC = czm_octDecode(encodedNormal);\nv_normalMC = normalMC;\nv_normalEC = czm_normal3D * v_normalMC;\n#elif defined(SHOW_REFLECTIVE_OCEAN) || defined(ENABLE_DAYNIGHT_SHADING) || defined(GENERATE_POSITION) || defined(HDR)\nv_positionEC = (u_modifiedModelView * vec4(position, 1.0)).xyz;\nv_positionMC = position3DWC;\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE)\nAtmosphereColor atmosFogColor = computeGroundAtmosphereFromSpace(position3DWC, false, vec3(0.0));\nv_fogMieColor = atmosFogColor.mie;\nv_fogRayleighColor = atmosFogColor.rayleigh;\n#endif\n#if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT)\nv_distance = length((czm_modelView3D * vec4(position3DWC, 1.0)).xyz);\n#endif\n#ifdef APPLY_MATERIAL\nfloat northPoleZ = czm_ellipsoidRadii.z;\nvec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ);\nvec3 ellipsoidNormal = normalize(v_positionMC);\nvec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal));\nfloat dotProd = abs(dot(ellipsoidNormal, v_normalMC));\nv_slope = acos(dotProd);\nvec3 normalRejected = ellipsoidNormal * dotProd;\nvec3 normalProjected = v_normalMC - normalRejected;\nvec3 aspectVector = normalize(normalProjected);\nv_aspect = acos(dot(aspectVector, vectorEastMC));\nfloat determ = dot(cross(vectorEastMC, aspectVector), ellipsoidNormal);\nv_aspect = czm_branchFreeTernary(determ < 0.0, 2.0 * czm_pi - v_aspect, v_aspect);\nv_height = height;\n#endif\n}\n",GroundAtmosphere="const float Kr = 0.0025;\nconst float Km = 0.0015;\nconst float ESun = 15.0;\nconst float fKrESun = Kr * ESun;\nconst float fKmESun = Km * ESun;\nconst float fKr4PI = Kr * 4.0 * czm_pi;\nconst float fKm4PI = Km * 4.0 * czm_pi;\nconst vec3 v3InvWavelength = vec3(5.60204474633241, 9.473284437923038, 19.64380261047721);\nconst float fScaleDepth = 0.25;\nstruct AtmosphereColor\n{\nvec3 mie;\nvec3 rayleigh;\n};\nconst int nSamples = 2;\nconst float fSamples = 2.0;\nfloat scale(float fCos)\n{\nfloat x = 1.0 - fCos;\nreturn fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25))));\n}\nAtmosphereColor computeGroundAtmosphereFromSpace(vec3 v3Pos, bool dynamicLighting, vec3 lightDirectionWC)\n{\nfloat fInnerRadius = czm_ellipsoidRadii.x;\nfloat fOuterRadius = czm_ellipsoidRadii.x * 1.025;\nfloat fOuterRadius2 = fOuterRadius * fOuterRadius;\nfloat fScale = 1.0 / (fOuterRadius - fInnerRadius);\nfloat fScaleOverScaleDepth = fScale / fScaleDepth;\nvec3 v3Ray = v3Pos - czm_viewerPositionWC;\nfloat fFar = length(v3Ray);\nv3Ray /= fFar;\nfloat fCameraHeight = length(czm_viewerPositionWC);\nfloat fCameraHeight2 = fCameraHeight * fCameraHeight;\nfloat B = 2.0 * length(czm_viewerPositionWC) * dot(normalize(czm_viewerPositionWC), v3Ray);\nfloat C = fCameraHeight2 - fOuterRadius2;\nfloat fDet = max(0.0, B*B - 4.0 * C);\nfloat fNear = 0.5 * (-B - sqrt(fDet));\nvec3 v3Start = czm_viewerPositionWC + v3Ray * fNear;\nfFar -= fNear;\nfloat fDepth = exp((fInnerRadius - fOuterRadius) / fScaleDepth);\nfloat fLightAngle = czm_branchFreeTernary(dynamicLighting, dot(lightDirectionWC, v3Pos) / length(v3Pos), 1.0);\nfloat fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);\nfloat fCameraScale = scale(fCameraAngle);\nfloat fLightScale = scale(fLightAngle);\nfloat fCameraOffset = fDepth*fCameraScale;\nfloat fTemp = (fLightScale + fCameraScale);\nfloat fSampleLength = fFar / fSamples;\nfloat fScaledLength = fSampleLength * fScale;\nvec3 v3SampleRay = v3Ray * fSampleLength;\nvec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\nvec3 v3FrontColor = vec3(0.0);\nvec3 v3Attenuate = vec3(0.0);\nfor(int i=0; i<nSamples; i++)\n{\nfloat fHeight = length(v3SamplePoint);\nfloat fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\nfloat fScatter = fDepth*fTemp - fCameraOffset;\nv3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\nv3FrontColor += v3Attenuate * (fDepth * fScaledLength);\nv3SamplePoint += v3SampleRay;\n}\nAtmosphereColor color;\ncolor.mie = v3FrontColor * (v3InvWavelength * fKrESun + fKmESun);\ncolor.rayleigh = v3Attenuate;\nreturn color;\n}\n";function GlobeSurfaceShader(e,t,i,r,n){this.numberOfDayTextures=e,this.flags=t,this.material=i,this.shaderProgram=r,this.clippingShaderState=n}function GlobeSurfaceShaderSet(){this.baseVertexShaderSource=void 0,this.baseFragmentShaderSource=void 0,this._shadersByTexturesFlags=[],this.material=void 0}function getPositionMode(e){var t;switch(e){case SceneMode$1.SCENE3D:t="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPosition3DMode(position, height, textureCoordinates); }";break;case SceneMode$1.SCENE2D:case SceneMode$1.COLUMBUS_VIEW:t="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionColumbusViewMode(position, height, textureCoordinates); }";break;case SceneMode$1.MORPHING:t="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionMorphingMode(position, height, textureCoordinates); }"}return t}function get2DYPositionFraction(e){return e?"float get2DYPositionFraction(vec2 textureCoordinates) { return get2DMercatorYPositionFraction(textureCoordinates); }":"float get2DYPositionFraction(vec2 textureCoordinates) { return get2DGeographicYPositionFraction(textureCoordinates); }"}GlobeSurfaceShaderSet.prototype.getShaderProgram=function(e){var t=e.frameState,i=e.surfaceTile,r=e.numberOfDayTextures,n=e.applyBrightness,a=e.applyContrast,o=e.applyHue,s=e.applySaturation,l=e.applyGamma,c=e.applyAlpha,u=e.applyDayNightAlpha,d=e.applySplit,h=e.showReflectiveOcean,p=e.showOceanWaves,m=e.enableLighting,f=e.dynamicAtmosphereLighting,g=e.dynamicAtmosphereLightingFromSun,_=e.showGroundAtmosphere,y=e.perFragmentGroundAtmosphere,v=e.hasVertexNormals,C=e.useWebMercatorProjection,S=e.enableFog,T=e.enableClippingPlanes,x=e.clippingPlanes,b=e.clippedByBoundaries,E=e.hasImageryLayerCutout,P=e.colorCorrect,A=e.highlightFillTile,w=e.colorToAlpha,D=e.showUndergroundColor,M=e.translucent,I=0,R="",O=i.renderedMesh.encoding;O.quantization===TerrainQuantization$1.BITS12&&(I=1,R="QUANTIZATION_BITS12");var L=0,F="";b&&(L=1,F="TILE_LIMIT_RECTANGLE");var N=0,B="";E&&(N=1,B="APPLY_IMAGERY_CUTOUT");var V=t.mode,k=V|n<<2|a<<3|o<<4|s<<5|l<<6|c<<7|h<<8|p<<9|m<<10|f<<11|g<<12|_<<13|y<<14|v<<15|C<<16|S<<17|I<<18|d<<19|T<<20|L<<21|N<<22|P<<23|A<<24|w<<25|D<<26|M<<27|u<<28,z=0;if(defined(x)&&0<x.length&&(z=T?x.clippingPlanesState:0),defined(j=i.surfaceShader)&&j.numberOfDayTextures===r&&j.flags===k&&j.material===this.material&&j.clippingShaderState===z)return j.shaderProgram;var $=this._shadersByTexturesFlags[r];if(defined($)||($=this._shadersByTexturesFlags[r]=[]),!defined(j=$[k])||j.material!==this.material||j.clippingShaderState!==z){var U=this.baseVertexShaderSource.clone(),G=this.baseFragmentShaderSource.clone();0!==z&&G.sources.unshift(getClippingFunction(x,t.context)),U.defines.push(R),G.defines.push("TEXTURE_UNITS "+r,F,B),n&&G.defines.push("APPLY_BRIGHTNESS"),a&&G.defines.push("APPLY_CONTRAST"),o&&G.defines.push("APPLY_HUE"),s&&G.defines.push("APPLY_SATURATION"),l&&G.defines.push("APPLY_GAMMA"),c&&G.defines.push("APPLY_ALPHA"),u&&G.defines.push("APPLY_DAY_NIGHT_ALPHA"),h&&(G.defines.push("SHOW_REFLECTIVE_OCEAN"),U.defines.push("SHOW_REFLECTIVE_OCEAN")),p&&G.defines.push("SHOW_OCEAN_WAVES"),w&&G.defines.push("APPLY_COLOR_TO_ALPHA"),D&&(U.defines.push("UNDERGROUND_COLOR"),G.defines.push("UNDERGROUND_COLOR")),M&&(U.defines.push("TRANSLUCENT"),G.defines.push("TRANSLUCENT")),m&&(v?(U.defines.push("ENABLE_VERTEX_LIGHTING"),G.defines.push("ENABLE_VERTEX_LIGHTING")):(U.defines.push("ENABLE_DAYNIGHT_SHADING"),G.defines.push("ENABLE_DAYNIGHT_SHADING"))),f&&(G.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"),g&&G.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN")),_&&(U.defines.push("GROUND_ATMOSPHERE"),G.defines.push("GROUND_ATMOSPHERE"),y&&G.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE")),U.defines.push("INCLUDE_WEB_MERCATOR_Y"),G.defines.push("INCLUDE_WEB_MERCATOR_Y"),S&&(U.defines.push("FOG"),G.defines.push("FOG")),d&&G.defines.push("APPLY_SPLIT"),T&&G.defines.push("ENABLE_CLIPPING_PLANES"),P&&G.defines.push("COLOR_CORRECT"),A&&G.defines.push("HIGHLIGHT_FILL_TILE");var H=" vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend)\n {\n vec4 color = initialColor;\n";E&&(H+=" vec4 cutoutAndColorResult;\n bool texelUnclipped;\n");for(var W=0;W<r;++W)H+=E?" cutoutAndColorResult = u_dayTextureCutoutRectangles["+W+"];\n texelUnclipped = v_textureCoordinates.x < cutoutAndColorResult.x || cutoutAndColorResult.z < v_textureCoordinates.x || v_textureCoordinates.y < cutoutAndColorResult.y || cutoutAndColorResult.w < v_textureCoordinates.y;\n cutoutAndColorResult = sampleAndBlend(\n":" color = sampleAndBlend(\n",H+=" color,\n u_dayTextures["+W+"],\n u_dayTextureUseWebMercatorT["+W+"] ? textureCoordinates.xz : textureCoordinates.xy,\n u_dayTextureTexCoordsRectangle["+W+"],\n u_dayTextureTranslationAndScale["+W+"],\n "+(c?"u_dayTextureAlpha["+W+"]":"1.0")+",\n "+(u?"u_dayTextureNightAlpha["+W+"]":"1.0")+",\n"+(u?"u_dayTextureDayAlpha["+W+"]":"1.0")+",\n"+(n?"u_dayTextureBrightness["+W+"]":"0.0")+",\n "+(a?"u_dayTextureContrast["+W+"]":"0.0")+",\n "+(o?"u_dayTextureHue["+W+"]":"0.0")+",\n "+(s?"u_dayTextureSaturation["+W+"]":"0.0")+",\n "+(l?"u_dayTextureOneOverGamma["+W+"]":"0.0")+",\n "+(d?"u_dayTextureSplit["+W+"]":"0.0")+",\n "+(w?"u_colorsToAlpha["+W+"]":"vec4(0.0)")+",\n nightBlend );\n",E&&(H+=" color = czm_branchFreeTernary(texelUnclipped, cutoutAndColorResult, color);\n");H+=" return color;\n }",G.sources.push(H),U.sources.push(getPositionMode(V)),U.sources.push(get2DYPositionFraction(C));var q=ShaderProgram.fromCache({context:t.context,vertexShaderSource:U,fragmentShaderSource:G,attributeLocations:O.getAttributeLocations()}),j=$[k]=new GlobeSurfaceShader(r,k,this.material,q,z)}return(i.surfaceShader=j).shaderProgram},GlobeSurfaceShaderSet.prototype.destroy=function(){var e,t,i=this._shadersByTexturesFlags;for(var r in i)if(i.hasOwnProperty(r)){var n=i[r];if(!defined(n))continue;for(e in n)n.hasOwnProperty(e)&&defined(t=n[e])&&t.shaderProgram.destroy()}return destroyObject(this)};var ImageryState={UNLOADED:0,TRANSITIONING:1,RECEIVED:2,TEXTURE_LOADED:3,READY:4,FAILED:5,INVALID:6,PLACEHOLDER:7},ImageryState$1=Object.freeze(ImageryState),QuadtreeTileLoadState={START:0,LOADING:1,DONE:2,FAILED:3},QuadtreeTileLoadState$1=Object.freeze(QuadtreeTileLoadState),TerrainState$1={FAILED:0,UNLOADED:1,RECEIVING:2,RECEIVED:3,TRANSFORMING:4,TRANSFORMED:5,READY:6},TerrainState$2=Object.freeze(TerrainState$1);function GlobeSurfaceTile(){this.imagery=[],this.waterMaskTexture=void 0,this.waterMaskTranslationAndScale=new Cartesian4(0,0,1,1),this.terrainData=void 0,this.vertexArray=void 0,this.orientedBoundingBox=void 0,this.boundingVolumeSourceTile=void 0,this.tileBoundingRegion=void 0,this.occludeePointInScaledSpace=new Cartesian3,this.terrainState=TerrainState$2.UNLOADED,this.mesh=void 0,this.fill=void 0,this.pickBoundingSphere=new BoundingSphere,this.surfaceShader=void 0,this.isClipped=!0,this.clippedByBoundaries=!1}function getPosition$2(e,t,i,r,n,a){var o;return e.decodePosition(r,n,a),defined(t)&&t!==SceneMode$1.SCENE3D&&(o=i.ellipsoid.cartesianToCartographic(a),i.project(o,a),Cartesian3.fromElements(a.z,a.x,a.y,a)),a}Object.defineProperties(GlobeSurfaceTile.prototype,{eligibleForUnloading:{get:function(){for(var e=this.terrainState,t=!(e===TerrainState$2.RECEIVING||e===TerrainState$2.TRANSFORMING),i=this.imagery,r=0,n=i.length;t&&r<n;++r)var a=i[r],t=!defined(a.loadingImagery)||a.loadingImagery.state!==ImageryState$1.TRANSITIONING;return t}},renderedMesh:{get:function(){return defined(this.vertexArray)?this.mesh:defined(this.fill)?this.fill.mesh:void 0}}});var scratchV0=new Cartesian3,scratchV1=new Cartesian3,scratchV2=new Cartesian3;function prepareNewTile(e,t,i){var r,n,a=t.getTileDataAvailable(e.x,e.y,e.level);defined(a)||!defined(e.parent)||defined(n=(r=e.parent).data)&&defined(n.terrainData)&&(a=n.terrainData.isChildAvailable(r.x,r.y,e.x,e.y)),!1===a&&(e.data.terrainState=TerrainState$2.FAILED);for(var o=0,s=i.length;o<s;++o){var l=i.get(o);l.show&&l._createTileImagerySkeletons(e,t)}}function processTerrainStateMachine(e,t,i,r,n){var a,o=e.data,s=e.parent;o.terrainState===TerrainState$2.FAILED&&void 0!==s&&(void 0!==s.data&&void 0!==s.data.terrainData&&!1!==s.data.terrainData.canUpsample||GlobeSurfaceTile.processStateMachine(s,t,i,r,!0)),o.terrainState===TerrainState$2.FAILED&&upsample(o,e,t,i,e.x,e.y,e.level),o.terrainState===TerrainState$2.UNLOADED&&requestTileGeometry$1(o,i,e.x,e.y,e.level),o.terrainState===TerrainState$2.RECEIVED&&transform$1(o,t,i,e.x,e.y,e.level),o.terrainState===TerrainState$2.TRANSFORMED&&createResources$4(o,t.context,i,e.x,e.y,e.level,n),o.terrainState>=TerrainState$2.RECEIVED&&void 0===o.waterMaskTexture&&i.hasWaterMask&&(void 0!==o.terrainData.waterMask?createWaterMaskTextureIfNeeded(t.context,o):defined(a=o._findAncestorTileWithTerrainData(e))&&defined(a.data.waterMaskTexture)&&(o.waterMaskTexture=a.data.waterMaskTexture,++o.waterMaskTexture.referenceCount,o._computeWaterMaskTranslationAndScale(e,a,o.waterMaskTranslationAndScale)))}function upsample(t,e,i,r,n,a,o){var s,l,c,u,d,h=e.parent;h?(s=h.data.terrainData,l=h.x,c=h.y,u=h.level,!defined(s)||defined(d=s.upsample(r.tilingScheme,l,c,u,n,a,o))&&(t.terrainState=TerrainState$2.RECEIVING,when(d,function(e){t.terrainData=e,t.terrainState=TerrainState$2.RECEIVED},function(){t.terrainState=TerrainState$2.FAILED}))):e.state=QuadtreeTileLoadState$1.FAILED}function requestTileGeometry$1(i,r,n,a,o){function s(e){i.terrainData=e,i.terrainState=TerrainState$2.RECEIVED,i.request=void 0}function l(){if(i.request.state===RequestState$1.CANCELLED)return i.terrainData=void 0,i.terrainState=TerrainState$2.UNLOADED,void(i.request=void 0);i.terrainState=TerrainState$2.FAILED,i.request=void 0;var e="Failed to obtain terrain tile X: "+n+" Y: "+a+" Level: "+o+".";r._requestError=TileProviderError.handleError(r._requestError,r,r.errorEvent,e,n,a,o,t)}function t(){var e=new Request({throttle:!1,throttleByServer:!0,type:RequestType$1.TERRAIN});i.request=e;var t=r.requestTileGeometry(n,a,o,e);defined(t)?(i.terrainState=TerrainState$2.RECEIVING,when(t,s,l)):(i.terrainState=TerrainState$2.UNLOADED,i.request=void 0)}t()}function transform$1(t,e,i,r,n,a){var o=i.tilingScheme,s=t.terrainData.createMesh(o,r,n,a,e.terrainExaggeration);defined(s)&&(t.terrainState=TerrainState$2.TRANSFORMING,when(s,function(e){t.mesh=e,t.orientedBoundingBox=OrientedBoundingBox.clone(e.orientedBoundingBox,t.orientedBoundingBox),t.occludeePointInScaledSpace=Cartesian3.clone(e.occludeePointInScaledSpace,t.occludeePointInScaledSpace),t.terrainState=TerrainState$2.TRANSFORMED},function(){t.terrainState=TerrainState$2.FAILED}))}function createResources$4(e,t,i,r,n,a,o){e.vertexArray=GlobeSurfaceTile._createVertexArrayForMesh(t,e.mesh),e.terrainState=TerrainState$2.READY,e.fill=e.fill&&e.fill.destroy(o)}function getContextWaterMaskData(e){var t,i=e.cache.tile_waterMaskData;return defined(i)||((t=Texture.create({context:e,pixelFormat:PixelFormat$1.LUMINANCE,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,source:{arrayBufferView:new Uint8Array([255]),width:1,height:1}})).referenceCount=1,i={allWaterTexture:t,sampler:new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:TextureMinificationFilter$1.LINEAR,magnificationFilter:TextureMagnificationFilter$1.LINEAR}),destroy:function(){this.allWaterTexture.destroy()}},e.cache.tile_waterMaskData=i),i}function createWaterMaskTextureIfNeeded(e,t){var i=t.terrainData.waterMask,r=getContextWaterMaskData(e),n=i.length;if(1===n){if(0===i[0])return;a=r.allWaterTexture}else{var a,o=Math.sqrt(n);(a=Texture.create({context:e,pixelFormat:PixelFormat$1.LUMINANCE,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,source:{width:o,height:o,arrayBufferView:i},sampler:r.sampler,flipY:!1})).referenceCount=0}++a.referenceCount,t.waterMaskTexture=a,Cartesian4.fromElements(0,0,1,1,t.waterMaskTranslationAndScale)}GlobeSurfaceTile.prototype.pick=function(e,t,i,r,n){var a=this.renderedMesh;if(defined(a)){for(var o=a.vertices,s=a.indices,l=a.encoding,c=s.length,u=Number.MAX_VALUE,d=0;d<c;d+=3){var h=s[d],p=s[d+1],m=s[d+2],f=getPosition$2(l,t,i,o,h,scratchV0),g=getPosition$2(l,t,i,o,p,scratchV1),_=getPosition$2(l,t,i,o,m,scratchV2),y=IntersectionTests.rayTriangleParametric(e,f,g,_,r);defined(y)&&y<u&&0<=y&&(u=y)}return u!==Number.MAX_VALUE?Ray.getPoint(e,u,n):void 0}},GlobeSurfaceTile.prototype.freeResources=function(){defined(this.waterMaskTexture)&&(--this.waterMaskTexture.referenceCount,0===this.waterMaskTexture.referenceCount&&this.waterMaskTexture.destroy(),this.waterMaskTexture=void 0),this.terrainData=void 0,this.terrainState=TerrainState$2.UNLOADED,this.mesh=void 0,this.fill=this.fill&&this.fill.destroy();for(var e=this.imagery,t=0,i=e.length;t<i;++t)e[t].freeResources();this.imagery.length=0,this.freeVertexArray()},GlobeSurfaceTile.prototype.freeVertexArray=function(){GlobeSurfaceTile._freeVertexArray(this.vertexArray),this.vertexArray=void 0,GlobeSurfaceTile._freeVertexArray(this.wireframeVertexArray),this.wireframeVertexArray=void 0},GlobeSurfaceTile.initialize=function(e,t,i){defined(e.data)||(e.data=new GlobeSurfaceTile),e.state===QuadtreeTileLoadState$1.START&&(prepareNewTile(e,t,i),e.state=QuadtreeTileLoadState$1.LOADING)},GlobeSurfaceTile.processStateMachine=function(e,t,i,r,n,a){GlobeSurfaceTile.initialize(e,i,r);var o=e.data;if(e.state===QuadtreeTileLoadState$1.LOADING&&processTerrainStateMachine(e,t,i,r,n),!a){var s=e.renderable;e.renderable=defined(o.vertexArray);var l=o.terrainState===TerrainState$2.READY;e.upsampledFromParent=defined(o.terrainData)&&o.terrainData.wasCreatedByUpsampling();var c=o.processImagery(e,i,t);if(l&&c){var u=e._loadedCallbacks,d={};for(var h in u)u.hasOwnProperty(h)&&(u[h](e)||(d[h]=u[h]));e._loadedCallbacks=d,e.state=QuadtreeTileLoadState$1.DONE}s&&(e.renderable=!0)}},GlobeSurfaceTile.prototype.processImagery=function(e,t,i,r){for(var n=e.data,a=e.upsampledFromParent,o=!1,s=!0,l=n.imagery,c=0,u=l.length;c<u;++c){var d=l[c];if(defined(d.loadingImagery)){if(d.loadingImagery.state===ImageryState$1.PLACEHOLDER){var h=d.loadingImagery.imageryLayer;if(h.imageryProvider.ready){d.freeResources(),l.splice(c,1),h._createTileImagerySkeletons(e,t,c),--c,u=l.length;continue}a=!1}var p=d.processStateMachine(e,i,r),s=s&&p,o=o||p||defined(d.readyImagery),a=a&&defined(d.loadingImagery)&&(d.loadingImagery.state===ImageryState$1.FAILED||d.loadingImagery.state===ImageryState$1.INVALID)}else a=!1}return e.upsampledFromParent=a,e.renderable=e.renderable&&(o||s),s},GlobeSurfaceTile._createVertexArrayForMesh=function(e,t){var i,r=t.vertices,n=Buffer$1.createVertexBuffer({context:e,typedArray:r,usage:BufferUsage$1.STATIC_DRAW}),a=t.encoding.getAttributes(n),o=t.indices.indexBuffers||{},s=o[e.id];return!defined(s)||s.isDestroyed()?(i=t.indices,(s=Buffer$1.createIndexBuffer({context:e,typedArray:i,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.fromSizeInBytes(i.BYTES_PER_ELEMENT)})).vertexArrayDestroyable=!1,s.referenceCount=1,o[e.id]=s,t.indices.indexBuffers=o):++s.referenceCount,new VertexArray({context:e,attributes:a,indexBuffer:s})},GlobeSurfaceTile._freeVertexArray=function(e){var t;defined(e)&&(t=e.indexBuffer,e.destroy(),defined(t)&&!t.isDestroyed()&&defined(t.referenceCount)&&(--t.referenceCount,0===t.referenceCount&&t.destroy()))},GlobeSurfaceTile.prototype._findAncestorTileWithTerrainData=function(e){for(var t=e.parent;defined(t)&&(!defined(t.data)||!defined(t.data.terrainData)||t.data.terrainData.wasCreatedByUpsampling());)t=t.parent;return t},GlobeSurfaceTile.prototype._computeWaterMaskTranslationAndScale=function(e,t,i){var r=t.rectangle,n=e.rectangle,a=n.width,o=n.height,s=a/r.width,l=o/r.height;return i.x=s*(n.west-r.west)/a,i.y=l*(n.south-r.south)/o,i.z=s,i.w=l,i};var ReprojectWebMercatorFS="uniform sampler2D u_texture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\ngl_FragColor = texture2D(u_texture, v_textureCoordinates);\n}\n",ReprojectWebMercatorVS="attribute vec4 position;\nattribute float webMercatorT;\nuniform vec2 u_textureDimensions;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nv_textureCoordinates = vec2(position.x, webMercatorT);\ngl_Position = czm_viewportOrthographic * (position * vec4(u_textureDimensions, 1.0, 1.0));\n}\n";function Imagery(e,t,i,r,n){var a,o,s;this.imageryLayer=e,this.x=t,this.y=i,this.level=r,this.request=void 0,0!==r&&(a=t/2|0,o=i/2|0,s=r-1,this.parent=e.getImageryFromCache(a,o,s)),this.state=ImageryState$1.UNLOADED,this.imageUrl=void 0,this.image=void 0,this.texture=void 0,this.textureWebMercator=void 0,this.credits=void 0,this.referenceCount=0,!defined(n)&&e.imageryProvider.ready&&(n=e.imageryProvider.tilingScheme.tileXYToRectangle(t,i,r)),this.rectangle=n}Imagery.createPlaceholder=function(e){var t=new Imagery(e,0,0,0);return t.addReference(),t.state=ImageryState$1.PLACEHOLDER,t},Imagery.prototype.addReference=function(){++this.referenceCount},Imagery.prototype.releaseReference=function(){return--this.referenceCount,0===this.referenceCount?(this.imageryLayer.removeImageryFromCache(this),defined(this.parent)&&this.parent.releaseReference(),defined(this.image)&&defined(this.image.destroy)&&this.image.destroy(),defined(this.texture)&&this.texture.destroy(),defined(this.textureWebMercator)&&this.texture!==this.textureWebMercator&&this.textureWebMercator.destroy(),destroyObject(this),0):this.referenceCount},Imagery.prototype.processStateMachine=function(e,t,i){this.state!==ImageryState$1.UNLOADED||i||(this.state=ImageryState$1.TRANSITIONING,this.imageryLayer._requestImagery(this)),this.state===ImageryState$1.RECEIVED&&(this.state=ImageryState$1.TRANSITIONING,this.imageryLayer._createTexture(e.context,this));var r=this.state===ImageryState$1.READY&&t&&!this.texture;this.state!==ImageryState$1.TEXTURE_LOADED&&!r||(this.state=ImageryState$1.TRANSITIONING,this.imageryLayer._reprojectTexture(e,this,t))};var ImagerySplitDirection={LEFT:-1,NONE:0,RIGHT:1},ImagerySplitDirection$1=Object.freeze(ImagerySplitDirection);function TileImagery(e,t,i){this.readyImagery=void 0,this.loadingImagery=e,this.textureCoordinateRectangle=t,this.textureTranslationAndScale=void 0,this.useWebMercatorT=i}function ImageryLayer(e,t){this._imageryProvider=e,t=defaultValue(t,defaultValue.EMPTY_OBJECT),this.alpha=defaultValue(t.alpha,defaultValue(e.defaultAlpha,1)),this.nightAlpha=defaultValue(t.nightAlpha,defaultValue(e.defaultNightAlpha,1)),this.dayAlpha=defaultValue(t.dayAlpha,defaultValue(e.defaultDayAlpha,1)),this.brightness=defaultValue(t.brightness,defaultValue(e.defaultBrightness,ImageryLayer.DEFAULT_BRIGHTNESS)),this.contrast=defaultValue(t.contrast,defaultValue(e.defaultContrast,ImageryLayer.DEFAULT_CONTRAST)),this.hue=defaultValue(t.hue,defaultValue(e.defaultHue,ImageryLayer.DEFAULT_HUE)),this.saturation=defaultValue(t.saturation,defaultValue(e.defaultSaturation,ImageryLayer.DEFAULT_SATURATION)),this.gamma=defaultValue(t.gamma,defaultValue(e.defaultGamma,ImageryLayer.DEFAULT_GAMMA)),this.splitDirection=defaultValue(t.splitDirection,defaultValue(e.defaultSplit,ImageryLayer.DEFAULT_SPLIT)),this.minificationFilter=defaultValue(t.minificationFilter,defaultValue(e.defaultMinificationFilter,ImageryLayer.DEFAULT_MINIFICATION_FILTER)),this.magnificationFilter=defaultValue(t.magnificationFilter,defaultValue(e.defaultMagnificationFilter,ImageryLayer.DEFAULT_MAGNIFICATION_FILTER)),this.show=defaultValue(t.show,!0),this._minimumTerrainLevel=t.minimumTerrainLevel,this._maximumTerrainLevel=t.maximumTerrainLevel,this._rectangle=defaultValue(t.rectangle,Rectangle.MAX_VALUE),this._maximumAnisotropy=t.maximumAnisotropy,this._imageryCache={},this._skeletonPlaceholder=new TileImagery(Imagery.createPlaceholder(this)),this._show=!0,this._layerIndex=-1,this._isBaseLayer=!1,this._requestImageError=void 0,this._reprojectComputeCommands=[],this.cutoutRectangle=t.cutoutRectangle,this.colorToAlpha=t.colorToAlpha,this.colorToAlphaThreshold=defaultValue(t.colorToAlphaThreshold,ImageryLayer.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD)}TileImagery.prototype.freeResources=function(){defined(this.readyImagery)&&this.readyImagery.releaseReference(),defined(this.loadingImagery)&&this.loadingImagery.releaseReference()},TileImagery.prototype.processStateMachine=function(e,t,i){var r=this.loadingImagery,n=r.imageryLayer;if(r.processStateMachine(t,!this.useWebMercatorT,i),r.state===ImageryState$1.READY)return defined(this.readyImagery)&&this.readyImagery.releaseReference(),this.readyImagery=this.loadingImagery,this.loadingImagery=void 0,this.textureTranslationAndScale=n._calculateTextureTranslationAndScale(e,this),!0;for(var a,o=r.parent;defined(o)&&(o.state!==ImageryState$1.READY||!this.useWebMercatorT&&!defined(o.texture));)o.state!==ImageryState$1.FAILED&&o.state!==ImageryState$1.INVALID&&(a=a||o),o=o.parent;return this.readyImagery!==o&&(defined(this.readyImagery)&&this.readyImagery.releaseReference(),defined(this.readyImagery=o)&&(o.addReference(),this.textureTranslationAndScale=n._calculateTextureTranslationAndScale(e,this))),(r.state===ImageryState$1.FAILED||r.state===ImageryState$1.INVALID)&&(!defined(a)||(a.processStateMachine(t,!this.useWebMercatorT,i),!1))},Object.defineProperties(ImageryLayer.prototype,{imageryProvider:{get:function(){return this._imageryProvider}},rectangle:{get:function(){return this._rectangle}}}),ImageryLayer.DEFAULT_BRIGHTNESS=1,ImageryLayer.DEFAULT_CONTRAST=1,ImageryLayer.DEFAULT_HUE=0,ImageryLayer.DEFAULT_SATURATION=1,ImageryLayer.DEFAULT_GAMMA=1,ImageryLayer.DEFAULT_SPLIT=ImagerySplitDirection$1.NONE,ImageryLayer.DEFAULT_MINIFICATION_FILTER=TextureMinificationFilter$1.LINEAR,ImageryLayer.DEFAULT_MAGNIFICATION_FILTER=TextureMagnificationFilter$1.LINEAR,ImageryLayer.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD=.004,ImageryLayer.prototype.isBaseLayer=function(){return this._isBaseLayer},ImageryLayer.prototype.isDestroyed=function(){return!1},ImageryLayer.prototype.destroy=function(){return destroyObject(this)};var imageryBoundsScratch=new Rectangle,tileImageryBoundsScratch=new Rectangle,clippedRectangleScratch=new Rectangle,terrainRectangleScratch=new Rectangle;function getSamplerKey(e,t,i){return e+":"+t+":"+i}function getImageryCacheKey(e,t,i){return JSON.stringify([e,t,i])}ImageryLayer.prototype.getViewableRectangle=function(){var e=this._imageryProvider,t=this._rectangle;return e.readyPromise.then(function(){return Rectangle.intersection(e.rectangle,t)})},ImageryLayer.prototype._createTileImagerySkeletons=function(e,t,i){var r=e.data;if(defined(this._minimumTerrainLevel)&&e.level<this._minimumTerrainLevel)return!1;if(defined(this._maximumTerrainLevel)&&e.level>this._maximumTerrainLevel)return!1;var n=this._imageryProvider;if(defined(i)||(i=r.imagery.length),!n.ready)return this._skeletonPlaceholder.loadingImagery.addReference(),r.imagery.splice(i,0,this._skeletonPlaceholder),!0;var a=n.tilingScheme.projection instanceof WebMercatorProjection&&e.rectangle.north<WebMercatorProjection.MaximumLatitude&&e.rectangle.south>-WebMercatorProjection.MaximumLatitude,o=Rectangle.intersection(n.rectangle,this._rectangle,imageryBoundsScratch);if(!defined(c=Rectangle.intersection(e.rectangle,o,tileImageryBoundsScratch))){if(!this.isBaseLayer())return!1;var s=o,l=e.rectangle,c=tileImageryBoundsScratch;l.south>=s.north?c.north=c.south=s.north:l.north<=s.south?c.north=c.south=s.south:(c.south=Math.max(l.south,s.south),c.north=Math.min(l.north,s.north)),l.west>=s.east?c.west=c.east=s.east:l.east<=s.west?c.west=c.east=s.west:(c.west=Math.max(l.west,s.west),c.east=Math.min(l.east,s.east))}var u=0;0<c.south?u=c.south:c.north<0&&(u=c.north);var d,h=getLevelWithMaximumTexelSpacing(this,+t.getLevelMaximumGeometricError(e.level),u),h=Math.max(0,h),p=n.maximumLevel;p<h&&(h=p),!defined(n.minimumLevel)||h<(d=n.minimumLevel)&&(h=d);var m=n.tilingScheme,f=m.positionToTileXY(Rectangle.northwest(c),h),g=m.positionToTileXY(Rectangle.southeast(c),h),_=e.rectangle.width/512,y=e.rectangle.height/512,v=m.tileXYToRectangle(f.x,f.y,h);Math.abs(v.south-e.rectangle.north)<y&&f.y<g.y&&++f.y,Math.abs(v.east-e.rectangle.west)<_&&f.x<g.x&&++f.x;var C=m.tileXYToRectangle(g.x,g.y,h);Math.abs(C.north-e.rectangle.south)<y&&g.y>f.y&&--g.y,Math.abs(C.west-e.rectangle.east)<_&&g.x>f.x&&--g.x;var S,T,x=Rectangle.clone(e.rectangle,terrainRectangleScratch),b=m.tileXYToRectangle(f.x,f.y,h),E=Rectangle.intersection(b,o,clippedRectangleScratch);a?(m.rectangleToNativeRectangle(x,x),m.rectangleToNativeRectangle(b,b),m.rectangleToNativeRectangle(E,E),m.rectangleToNativeRectangle(o,o),S=m.tileXYToNativeRectangle.bind(m),_=x.width/512,y=x.height/512):S=m.tileXYToRectangle.bind(m);var P=0,A=1;!this.isBaseLayer()&&Math.abs(E.west-x.west)>=_&&(P=Math.min(1,(E.west-x.west)/x.width)),!this.isBaseLayer()&&Math.abs(E.north-x.north)>=y&&(A=Math.max(0,(E.north-x.south)/x.height));for(var w=A,D=f.x;D<=g.x;D++)if(T=P,b=S(D,f.y,h),defined(E=Rectangle.simpleIntersection(b,o,clippedRectangleScratch))){P=Math.min(1,(E.east-x.west)/x.width),D===g.x&&(this.isBaseLayer()||Math.abs(E.east-x.east)<_)&&(P=1),A=w;for(var M=f.y;M<=g.y;M++){var I,R,O=A,b=S(D,M,h);defined(E=Rectangle.simpleIntersection(b,o,clippedRectangleScratch))&&(A=Math.max(0,(E.south-x.south)/x.height),M===g.y&&(this.isBaseLayer()||Math.abs(E.south-x.south)<y)&&(A=0),I=new Cartesian4(T,A,P,O),R=this.getImageryFromCache(D,M,h),r.imagery.splice(i,0,new TileImagery(R,I,a)),++i)}}return!0},ImageryLayer.prototype._calculateTextureTranslationAndScale=function(e,t){var i,r=t.readyImagery.rectangle,n=e.rectangle;t.useWebMercatorT&&(r=(i=t.readyImagery.imageryLayer.imageryProvider.tilingScheme).rectangleToNativeRectangle(r,imageryBoundsScratch),n=i.rectangleToNativeRectangle(n,terrainRectangleScratch));var a=n.width,o=n.height,s=a/r.width,l=o/r.height;return new Cartesian4(s*(n.west-r.west)/a,l*(n.south-r.south)/o,s,l)},ImageryLayer.prototype._requestImagery=function(i){var r=this._imageryProvider,n=this;function a(e){if(!defined(e))return o();i.image=e,i.state=ImageryState$1.RECEIVED,i.request=void 0,TileProviderError.handleSuccess(n._requestImageError)}function o(e){if(i.request.state===RequestState$1.CANCELLED)return i.state=ImageryState$1.UNLOADED,void(i.request=void 0);i.state=ImageryState$1.FAILED,i.request=void 0;var t="Failed to obtain image tile X: "+i.x+" Y: "+i.y+" Level: "+i.level+".";n._requestImageError=TileProviderError.handleError(n._requestImageError,r,r.errorEvent,t,i.x,i.y,i.level,s,e)}function s(){var e=new Request({throttle:!1,throttleByServer:!0,type:RequestType$1.IMAGERY});i.request=e,i.state=ImageryState$1.TRANSITIONING;var t=r.requestImage(i.x,i.y,i.level,e);if(!defined(t))return i.state=ImageryState$1.UNLOADED,void(i.request=void 0);defined(r.getTileCredits)&&(i.credits=r.getTileCredits(i.x,i.y,i.level)),when(t,a,o)}s()},ImageryLayer.prototype._createTextureWebGL=function(e,t){var i=new Sampler({minificationFilter:this.minificationFilter,magnificationFilter:this.magnificationFilter}),r=t.image;return defined(r.internalFormat)?new Texture({context:e,pixelFormat:r.internalFormat,width:r.width,height:r.height,source:{arrayBufferView:r.bufferView},sampler:i}):new Texture({context:e,source:r,pixelFormat:this._imageryProvider.hasAlphaChannel?PixelFormat$1.RGBA:PixelFormat$1.RGB,sampler:i})},ImageryLayer.prototype._createTexture=function(e,t){var i=this._imageryProvider,r=t.image;if(defined(i.tileDiscardPolicy)){var n=i.tileDiscardPolicy;if(defined(n)){if(!n.isReady())return void(t.state=ImageryState$1.RECEIVED);if(n.shouldDiscardImage(r))return void(t.state=ImageryState$1.INVALID)}}var a=this._createTextureWebGL(e,t);i.tilingScheme.projection instanceof WebMercatorProjection?t.textureWebMercator=a:t.texture=a,t.image=void 0,t.state=ImageryState$1.TEXTURE_LOADED},ImageryLayer.prototype._finalizeReprojectTexture=function(e,t){var i,r,n,a,o,s,l,c,u=this.minificationFilter,d=this.magnificationFilter;u===TextureMinificationFilter$1.LINEAR&&d===TextureMagnificationFilter$1.LINEAR&&!PixelFormat$1.isCompressedFormat(t.pixelFormat)&&CesiumMath.isPowerOfTwo(t.width)&&CesiumMath.isPowerOfTwo(t.height)?(u=TextureMinificationFilter$1.LINEAR_MIPMAP_LINEAR,i=ContextLimits.maximumTextureFilterAnisotropy,n=getSamplerKey(u,d,r=Math.min(i,defaultValue(this._maximumAnisotropy,i))),defined(a=e.cache.imageryLayerMipmapSamplers)||(a={},e.cache.imageryLayerMipmapSamplers=a),defined(o=a[n])||(o=a[n]=new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:u,magnificationFilter:d,maximumAnisotropy:r})),t.generateMipmap(MipmapHint$1.NICEST),t.sampler=o):(s=getSamplerKey(u,d,0),defined(l=e.cache.imageryLayerNonMipmapSamplers)||(l={},e.cache.imageryLayerNonMipmapSamplers=l),defined(c=l[s])||(c=l[s]=new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:u,magnificationFilter:d})),t.sampler=c)},ImageryLayer.prototype._reprojectTexture=function(e,t,i){var r,n,a=t.textureWebMercator||t.texture,o=t.rectangle,s=e.context;(i=defaultValue(i,!0))&&!(this._imageryProvider.tilingScheme.projection instanceof GeographicProjection)&&1e-5<o.width/a.width?(r=this,t.addReference(),n=new ComputeCommand({persists:!0,owner:this,preExecute:function(e){reprojectToGeographic(e,s,a,t.rectangle)},postExecute:function(e){t.texture=e,r._finalizeReprojectTexture(s,e),t.state=ImageryState$1.READY,t.releaseReference()}}),this._reprojectComputeCommands.push(n)):(i&&(t.texture=a),this._finalizeReprojectTexture(s,a),t.state=ImageryState$1.READY)},ImageryLayer.prototype.queueReprojectionCommands=function(e){for(var t=this._reprojectComputeCommands,i=t.length,r=0;r<i;++r)e.commandList.push(t[r]);t.length=0},ImageryLayer.prototype.cancelReprojections=function(){this._reprojectComputeCommands.length=0},ImageryLayer.prototype.getImageryFromCache=function(e,t,i,r){var n=getImageryCacheKey(e,t,i),a=this._imageryCache[n];return defined(a)||(a=new Imagery(this,e,t,i,r),this._imageryCache[n]=a),a.addReference(),a},ImageryLayer.prototype.removeImageryFromCache=function(e){var t=getImageryCacheKey(e.x,e.y,e.level);delete this._imageryCache[t]};var uniformMap={u_textureDimensions:function(){return this.textureDimensions},u_texture:function(){return this.texture},textureDimensions:new Cartesian2,texture:void 0},float32ArrayScratch=FeatureDetection.supportsTypedArrays()?new Float32Array(128):void 0;function reprojectToGeographic(e,t,i,r){var n=t.cache.imageryLayer_reproject;if(!defined(n)){n=t.cache.imageryLayer_reproject={vertexArray:void 0,shaderProgram:void 0,sampler:void 0,destroy:function(){defined(this.framebuffer)&&this.framebuffer.destroy(),defined(this.vertexArray)&&this.vertexArray.destroy(),defined(this.shaderProgram)&&this.shaderProgram.destroy()}};for(var a=new Float32Array(256),o=0,s=0;s<64;++s){var l=s/63;a[o++]=0,a[o++]=l,a[o++]=1,a[o++]=l}var c={position:0,webMercatorT:1},u=TerrainProvider.getRegularGridIndices(2,64),d=Buffer$1.createIndexBuffer({context:t,typedArray:u,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT});n.vertexArray=new VertexArray({context:t,attributes:[{index:c.position,vertexBuffer:Buffer$1.createVertexBuffer({context:t,typedArray:a,usage:BufferUsage$1.STATIC_DRAW}),componentsPerAttribute:2},{index:c.webMercatorT,vertexBuffer:Buffer$1.createVertexBuffer({context:t,sizeInBytes:512,usage:BufferUsage$1.STREAM_DRAW}),componentsPerAttribute:1}],indexBuffer:d});var h=new ShaderSource({sources:[ReprojectWebMercatorVS]});n.shaderProgram=ShaderProgram.fromCache({context:t,vertexShaderSource:h,fragmentShaderSource:ReprojectWebMercatorFS,attributeLocations:c}),n.sampler=new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:TextureMinificationFilter$1.LINEAR,magnificationFilter:TextureMagnificationFilter$1.LINEAR})}i.sampler=n.sampler;var p=i.width,m=i.height;uniformMap.textureDimensions.x=p,uniformMap.textureDimensions.y=m,uniformMap.texture=i;var f=Math.sin(r.south),g=.5*Math.log((1+f)/(1-f));f=Math.sin(r.north);var _=1/(.5*Math.log((1+f)/(1-f))-g),y=new Texture({context:t,width:p,height:m,pixelFormat:i.pixelFormat,pixelDatatype:i.pixelDatatype,preMultiplyAlpha:i.preMultiplyAlpha});CesiumMath.isPowerOfTwo(p)&&CesiumMath.isPowerOfTwo(m)&&y.generateMipmap(MipmapHint$1.NICEST);for(var v=r.south,C=r.north,S=float32ArrayScratch,T=0,x=0;x<64;++x){var b=x/63,E=CesiumMath.lerp(v,C,b),f=Math.sin(E),P=(.5*Math.log((1+f)/(1-f))-g)*_;S[T++]=P,S[T++]=P}n.vertexArray.getAttribute(1).vertexBuffer.copyFromArrayView(S),e.shaderProgram=n.shaderProgram,e.outputTexture=y,e.uniformMap=uniformMap,e.vertexArray=n.vertexArray}function getLevelWithMaximumTexelSpacing(e,t,i){var r=e._imageryProvider,n=r.tilingScheme,a=n.ellipsoid,o=e._imageryProvider.tilingScheme.projection instanceof GeographicProjection?1:Math.cos(i),s=n.rectangle,l=a.maximumRadius*s.width*o/(r.tileWidth*n.getNumberOfXTilesAtLevel(0))/t,c=Math.log(l)/Math.log(2);return 0|Math.round(c)}var TileSelectionResult={NONE:0,CULLED:1,RENDERED:2,REFINED:3,RENDERED_AND_KICKED:6,REFINED_AND_KICKED:7,CULLED_BUT_NEEDED:9,wasKicked:function(e){return e>=TileSelectionResult.RENDERED_AND_KICKED},originalResult:function(e){return 3&e},kick:function(e){return 4|e}};function TerrainFillMesh(e){this.tile=e,this.frameLastUpdated=void 0,this.westMeshes=[],this.westTiles=[],this.southMeshes=[],this.southTiles=[],this.eastMeshes=[],this.eastTiles=[],this.northMeshes=[],this.northTiles=[],this.southwestMesh=void 0,this.southwestTile=void 0,this.southeastMesh=void 0,this.southeastTile=void 0,this.northwestMesh=void 0,this.northwestTile=void 0,this.northeastMesh=void 0,this.northeastTile=void 0,this.changedThisFrame=!0,this.visitedFrame=void 0,this.enqueuedFrame=void 0,this.mesh=void 0,this.vertexArray=void 0,this.waterMaskTexture=void 0,this.waterMaskTranslationAndScale=new Cartesian4}TerrainFillMesh.prototype.update=function(e,t,i){this.changedThisFrame&&(createFillMesh(e,t,this.tile,i),this.changedThisFrame=!1)},TerrainFillMesh.prototype.destroy=function(e){defined(this.vertexArray)&&(defined(e)?e.push(this.vertexArray):GlobeSurfaceTile._freeVertexArray(this.vertexArray,e),this.vertexArray=void 0),defined(this.waterMaskTexture)&&(--this.waterMaskTexture.referenceCount,0===this.waterMaskTexture.referenceCount&&this.waterMaskTexture.destroy(),this.waterMaskTexture=void 0)};var traversalQueueScratch=new Queue;function visitRenderedTiles(e,t,i,r,n,a,o,s,l){if(void 0!==r){for(var c=r;c&&(c._lastSelectionResultFrame!==n||TileSelectionResult.wasKicked(c._lastSelectionResult)||TileSelectionResult.originalResult(c._lastSelectionResult)===TileSelectionResult.CULLED);){if(o)return;var u=c.parent;if(a>=TileEdge.NORTHWEST&&void 0!==u)switch(a){case TileEdge.NORTHWEST:c=c===u.northwestChild?u:void 0;break;case TileEdge.NORTHEAST:c=c===u.northeastChild?u:void 0;break;case TileEdge.SOUTHWEST:c=c===u.southwestChild?u:void 0;break;case TileEdge.SOUTHEAST:c=c===u.southeastChild?u:void 0}else c=u}if(void 0!==c){if(c._lastSelectionResult===TileSelectionResult.RENDERED)return!defined(c.data.vertexArray)&&void visitTile$2(e,t,i,c,a,n,s,l);if(TileSelectionResult.originalResult(r._lastSelectionResult)!==TileSelectionResult.CULLED)switch(a){case TileEdge.WEST:visitRenderedTiles(e,t,i,r.northwestChild,n,a,!0,s,l),visitRenderedTiles(e,t,i,r.southwestChild,n,a,!0,s,l);break;case TileEdge.EAST:visitRenderedTiles(e,t,i,r.southeastChild,n,a,!0,s,l),visitRenderedTiles(e,t,i,r.northeastChild,n,a,!0,s,l);break;case TileEdge.SOUTH:visitRenderedTiles(e,t,i,r.southwestChild,n,a,!0,s,l),visitRenderedTiles(e,t,i,r.southeastChild,n,a,!0,s,l);break;case TileEdge.NORTH:visitRenderedTiles(e,t,i,r.northeastChild,n,a,!0,s,l),visitRenderedTiles(e,t,i,r.northwestChild,n,a,!0,s,l);break;case TileEdge.NORTHWEST:visitRenderedTiles(e,t,i,r.northwestChild,n,a,!0,s,l);break;case TileEdge.NORTHEAST:visitRenderedTiles(e,t,i,r.northeastChild,n,a,!0,s,l);break;case TileEdge.SOUTHWEST:visitRenderedTiles(e,t,i,r.southwestChild,n,a,!0,s,l);break;case TileEdge.SOUTHEAST:visitRenderedTiles(e,t,i,r.southeastChild,n,a,!0,s,l);break;default:throw new DeveloperError("Invalid edge")}}}}function visitTile$2(e,t,i,r,n,a,o,s){var l=r.data;if(void 0===l.fill)l.fill=new TerrainFillMesh(r);else if(l.fill.visitedFrame===a)return;l.fill.enqueuedFrame!==a&&(l.fill.enqueuedFrame=a,l.fill.changedThisFrame=!1,o.enqueue(r)),propagateEdge(e,t,i,r,n,s)}function propagateEdge(e,t,i,r,n,a){var o,s,l,c,u,d=r.data.fill,h=i.data.fill,p=defined(h)?(h.visitedFrame=t.frameNumber,h.changedThisFrame&&(createFillMesh(e,t,i,a),h.changedThisFrame=!1),i.data.fill.mesh):i.data.mesh;switch(n){case TileEdge.WEST:o=d.westMeshes,s=d.westTiles;break;case TileEdge.SOUTH:o=d.southMeshes,s=d.southTiles;break;case TileEdge.EAST:o=d.eastMeshes,s=d.eastTiles;break;case TileEdge.NORTH:o=d.northMeshes,s=d.northTiles;break;case TileEdge.NORTHWEST:return d.changedThisFrame=d.changedThisFrame||d.northwestMesh!==p,d.northwestMesh=p,void(d.northwestTile=i);case TileEdge.NORTHEAST:return d.changedThisFrame=d.changedThisFrame||d.northeastMesh!==p,d.northeastMesh=p,void(d.northeastTile=i);case TileEdge.SOUTHWEST:return d.changedThisFrame=d.changedThisFrame||d.southwestMesh!==p,d.southwestMesh=p,void(d.southwestTile=i);case TileEdge.SOUTHEAST:return d.changedThisFrame=d.changedThisFrame||d.southeastMesh!==p,d.southeastMesh=p,void(d.southeastTile=i)}if(i.level<=r.level)return d.changedThisFrame=d.changedThisFrame||o[0]!==p||1!==o.length,o[0]=p,s[0]=i,o.length=1,void(s.length=1);var m,f=i.rectangle,g=r.rectangle;switch(n){case TileEdge.WEST:for(m=(g.north-g.south)*CesiumMath.EPSILON5,l=0;l<s.length&&(u=s[l].rectangle,!CesiumMath.greaterThan(f.north,u.south,m));++l);for(c=l;c<s.length&&(u=s[c].rectangle,!CesiumMath.greaterThanOrEquals(f.south,u.north,m));++c);break;case TileEdge.SOUTH:for(m=(g.east-g.west)*CesiumMath.EPSILON5,l=0;l<s.length&&(u=s[l].rectangle,!CesiumMath.lessThan(f.west,u.east,m));++l);for(c=l;c<s.length&&(u=s[c].rectangle,!CesiumMath.lessThanOrEquals(f.east,u.west,m));++c);break;case TileEdge.EAST:for(m=(g.north-g.south)*CesiumMath.EPSILON5,l=0;l<s.length&&(u=s[l].rectangle,!CesiumMath.lessThan(f.south,u.north,m));++l);for(c=l;c<s.length&&(u=s[c].rectangle,!CesiumMath.lessThanOrEquals(f.north,u.south,m));++c);break;case TileEdge.NORTH:for(m=(g.east-g.west)*CesiumMath.EPSILON5,l=0;l<s.length&&(u=s[l].rectangle,!CesiumMath.greaterThan(f.east,u.west,m));++l);for(c=l;c<s.length&&(u=s[c].rectangle,!CesiumMath.greaterThanOrEquals(f.west,u.east,m));++c);}c-l==1?(d.changedThisFrame=d.changedThisFrame||o[l]!==p,o[l]=p,s[l]=i):(d.changedThisFrame=!0,o.splice(l,c-l,p),s.splice(l,c-l,i))}TerrainFillMesh.updateFillTiles=function(e,t,i,r){var n=e._quadtree,a=n._levelZeroTiles,o=n._lastSelectionFrameNumber,s=traversalQueueScratch;s.clear();for(var l=0;l<t.length;++l){defined(t[l].data.vertexArray)&&s.enqueue(t[l])}for(var c=s.dequeue();void 0!==c;){var u=c.findTileToWest(a),d=c.findTileToSouth(a),h=c.findTileToEast(a),p=c.findTileToNorth(a);visitRenderedTiles(e,i,c,u,o,TileEdge.EAST,!1,s,r),visitRenderedTiles(e,i,c,d,o,TileEdge.NORTH,!1,s,r),visitRenderedTiles(e,i,c,h,o,TileEdge.WEST,!1,s,r),visitRenderedTiles(e,i,c,p,o,TileEdge.SOUTH,!1,s,r);var m=u.findTileToNorth(a),f=u.findTileToSouth(a),g=h.findTileToNorth(a),_=h.findTileToSouth(a);visitRenderedTiles(e,i,c,m,o,TileEdge.SOUTHEAST,!1,s,r),visitRenderedTiles(e,i,c,g,o,TileEdge.SOUTHWEST,!1,s,r),visitRenderedTiles(e,i,c,f,o,TileEdge.NORTHEAST,!1,s,r),visitRenderedTiles(e,i,c,_,o,TileEdge.NORTHWEST,!1,s,r),c=s.dequeue()}};var cartographicScratch$3=new Cartographic,centerCartographicScratch=new Cartographic,cartesianScratch=new Cartesian3,normalScratch$5=new Cartesian3,octEncodedNormalScratch=new Cartesian2,uvScratch2=new Cartesian2,uvScratch=new Cartesian2;function HeightAndNormal(){this.height=0,this.encodedNormal=new Cartesian2}function fillMissingCorner(e,t,i,r,n,a,o,s,l){if(defined(n))return n;var c,u,d,h=defined(a)&&defined(o)?.5*(a.height+o.height):defined(a)?a.height:defined(o)?o.height:defined(s)?s.height:(d=u=0,defined(c=e.tile.data.tileBoundingRegion)&&(u=c.minimumHeight,d=c.maximumHeight),.5*(u+d));return getVertexWithHeightAtCorner(e,t,i,r,h,l),l}var heightRangeScratch={minimumHeight:0,maximumHeight:0},swVertexScratch=new HeightAndNormal,seVertexScratch=new HeightAndNormal,nwVertexScratch=new HeightAndNormal,neVertexScratch=new HeightAndNormal,heightmapBuffer="undefined"!=typeof Uint8Array?new Uint8Array(81):void 0;function createFillMesh(e,t,i,r){GlobeSurfaceTile.initialize(i,e.terrainProvider,e._imageryLayers);var n=i.data,a=n.fill,o=i.rectangle,s=i.tilingScheme.ellipsoid,l=getCorner(a,s,0,1,a.northwestTile,a.northwestMesh,a.northTiles,a.northMeshes,a.westTiles,a.westMeshes,nwVertexScratch),c=getCorner(a,s,0,0,a.southwestTile,a.southwestMesh,a.westTiles,a.westMeshes,a.southTiles,a.southMeshes,swVertexScratch),u=getCorner(a,s,1,0,a.southeastTile,a.southeastMesh,a.southTiles,a.southMeshes,a.eastTiles,a.eastMeshes,seVertexScratch),l=fillMissingCorner(a,s,0,1,l,c,d=getCorner(a,s,1,1,a.northeastTile,a.northeastMesh,a.eastTiles,a.eastMeshes,a.northTiles,a.northMeshes,neVertexScratch),u,nwVertexScratch),c=fillMissingCorner(a,s,0,0,c,l,u,d,swVertexScratch),u=fillMissingCorner(a,s,1,1,u,c,d,l,seVertexScratch),d=fillMissingCorner(a,s,1,1,d,u,l,c,neVertexScratch),h=c.height,p=u.height,m=l.height,f=d.height,g=Math.min(h,p,m,f),_=Math.max(h,p,m,f),y=.5*(g+_),v=e.getLevelMaximumGeometricError(i.level),C=s.maximumRadius-v,S=4*Math.acos(C/s.maximumRadius);if(S*=1.5,o.width>S&&_-g<=v){var T=new HeightmapTerrainData({width:9,height:9,buffer:heightmapBuffer,structure:{heightOffset:_}});a.mesh=T._createMeshSync(i.tilingScheme,i.x,i.y,i.level,1)}else{var x=new TerrainEncoding(void 0,void 0,void 0,void 0,!0,!0),b=centerCartographicScratch;b.longitude=.5*(o.east+o.west),b.latitude=.5*(o.north+o.south),b.height=y,x.center=s.cartographicToCartesian(b,x.center);for(var E=5,P=a.westMeshes,A=0,w=P.length;A<w;++A)E+=P[A].eastIndicesNorthToSouth.length;for(A=0,w=(P=a.southMeshes).length;A<w;++A)E+=P[A].northIndicesWestToEast.length;for(A=0,w=(P=a.eastMeshes).length;A<w;++A)E+=P[A].westIndicesSouthToNorth.length;for(A=0,w=(P=a.northMeshes).length;A<w;++A)E+=P[A].southIndicesEastToWest.length;var D=heightRangeScratch;D.minimumHeight=g,D.maximumHeight=_;var M=x.getStride(),I=new Float32Array(E*M),R=0,O=R=addEdge(a,s,x,I,R=addVertexWithComputedPosition(s,o,x,I,0,0,1,l.height,l.encodedNormal,1,D),a.westTiles,a.westMeshes,TileEdge.EAST,D),L=R=addEdge(a,s,x,I,R=addVertexWithComputedPosition(s,o,x,I,R,0,0,c.height,c.encodedNormal,0,D),a.southTiles,a.southMeshes,TileEdge.NORTH,D),F=R=addEdge(a,s,x,I,R=addVertexWithComputedPosition(s,o,x,I,R,1,0,u.height,u.encodedNormal,0,D),a.eastTiles,a.eastMeshes,TileEdge.WEST,D);R=addEdge(a,s,x,I,R=addVertexWithComputedPosition(s,o,x,I,R,1,1,d.height,d.encodedNormal,1,D),a.northTiles,a.northMeshes,TileEdge.SOUTH,D),g=D.minimumHeight,_=D.maximumHeight;var N=OrientedBoundingBox.fromRectangle(o,g,_,i.tilingScheme.ellipsoid),B=WebMercatorProjection.geodeticLatitudeToMercatorAngle(o.south),V=1/(WebMercatorProjection.geodeticLatitudeToMercatorAngle(o.north)-B),k=(WebMercatorProjection.geodeticLatitudeToMercatorAngle(b.latitude)-B)*V;s.geodeticSurfaceNormalCartographic(cartographicScratch$3,normalScratch$5);var z=AttributeCompression.octEncode(normalScratch$5,octEncodedNormalScratch),$=R;x.encode(I,R*M,N.center,Cartesian2.fromElements(.5,.5,uvScratch),y,z,k);var U,G,H=++R,W=3*(H-1);G=W*(H<256?1:2)<=(I.length-H*M)*Float32Array.BYTES_PER_ELEMENT?(U=H*M*Float32Array.BYTES_PER_ELEMENT,new(H<256?Uint8Array:Uint16Array)(I.buffer,U,W)):new(H<256?Uint8Array:Uint16Array)(W),I=new Float32Array(I.buffer,0,H*M);var q=0;for(A=0;A<H-2;++A)G[q++]=$,G[q++]=A,G[q++]=A+1;G[q++]=$,G[q++]=A,G[q++]=0;var j=[];for(A=O;0<=A;--A)j.push(A);var Y=[];for(A=L;O<=A;--A)Y.push(A);var X=[];for(A=F;L<=A;--A)X.push(A);var Q=[];for(Q.push(0),A=$-1;F<=A;--A)Q.push(A);a.mesh=new TerrainMesh(x.center,I,G,W,H,g,_,BoundingSphere.fromOrientedBoundingBox(N),computeOccludeePoint(e,N.center,o,g,_),x.getStride(),N,x,t.terrainExaggeration,j,Y,X,Q)}var J=t.context;defined(a.vertexArray)&&(defined(r)?r.push(a.vertexArray):GlobeSurfaceTile._freeVertexArray(a.vertexArray)),a.vertexArray=GlobeSurfaceTile._createVertexArrayForMesh(J,a.mesh),n.processImagery(i,e.terrainProvider,t,!0);var Z,K=a.waterMaskTexture;a.waterMaskTexture=void 0,!e.terrainProvider.hasWaterMask||defined(Z=n._findAncestorTileWithTerrainData(i))&&defined(Z.data.waterMaskTexture)&&(a.waterMaskTexture=Z.data.waterMaskTexture,++a.waterMaskTexture.referenceCount,n._computeWaterMaskTranslationAndScale(i,Z,a.waterMaskTranslationAndScale)),defined(K)&&(--K.referenceCount,0===K.referenceCount&&K.destroy())}function addVertexWithComputedPosition(e,t,i,r,n,a,o,s,l,c,u){var d=cartographicScratch$3;d.longitude=CesiumMath.lerp(t.west,t.east,a),d.latitude=CesiumMath.lerp(t.south,t.north,o),d.height=s;var h=e.cartographicToCartesian(d,cartesianScratch),p=uvScratch2;return p.x=a,p.y=o,i.encode(r,n*i.getStride(),h,p,s,l,c),u.minimumHeight=Math.min(u.minimumHeight,s),u.maximumHeight=Math.max(u.maximumHeight,s),n+1}var sourceRectangleScratch=new Rectangle;function transformTextureCoordinates(e,t,i,r){var n=e.rectangle,a=t.rectangle;0===t.x&&1===i.x&&e.x===e.tilingScheme.getNumberOfXTilesAtLevel(e.level)-1?((n=Rectangle.clone(e.rectangle,sourceRectangleScratch)).west-=CesiumMath.TWO_PI,n.east-=CesiumMath.TWO_PI):0===e.x&&0===i.x&&t.x===t.tilingScheme.getNumberOfXTilesAtLevel(t.level)-1&&((n=Rectangle.clone(e.rectangle,sourceRectangleScratch)).west+=CesiumMath.TWO_PI,n.east+=CesiumMath.TWO_PI);var o=n.east-n.west,s=(a.west-n.west)/o,l=(a.east-n.west)/o,c=n.north-n.south,u=(a.south-n.south)/c,d=(a.north-n.south)/c,h=(i.x-s)/(l-s),p=(i.y-u)/(d-u);return Math.abs(h)<Math.EPSILON5?h=0:Math.abs(h-1)<Math.EPSILON5&&(h=1),Math.abs(p)<Math.EPSILON5?p=0:Math.abs(p-1)<Math.EPSILON5&&(p=1),r.x=h,r.y=p,r}var encodedNormalScratch=new Cartesian2;function getVertexFromTileAtCorner(e,t,i,r,n){var a,o=e.encoding,s=e.vertices;n.height=o.decodeHeight(s,t),o.hasVertexNormals?o.getOctEncodedNormal(s,t,n.encodedNormal):((a=n.encodedNormal).x=0,a.y=0)}var encodedNormalScratch2=new Cartesian2,cartesianScratch2=new Cartesian3;function getInterpolatedVertexAtCorner(e,t,i,r,n,a,o,s,l,c){var u,d,h,p,m,f=r.encoding,g=r.vertices,_=transformTextureCoordinates(t,i,f.decodeTextureCoordinates(g,n,uvScratch),uvScratch),y=transformTextureCoordinates(t,i,f.decodeTextureCoordinates(g,a,uvScratch2),uvScratch2),v=l?(o-_.x)/(y.x-_.x):(s-_.y)/(y.y-_.y),C=f.decodeHeight(g,n),S=f.decodeHeight(g,a),T=i.rectangle;cartographicScratch$3.longitude=CesiumMath.lerp(T.west,T.east,o),cartographicScratch$3.latitude=CesiumMath.lerp(T.south,T.north,s),c.height=cartographicScratch$3.height=CesiumMath.lerp(C,S,v),f.hasVertexNormals?(u=f.getOctEncodedNormal(g,n,encodedNormalScratch),d=f.getOctEncodedNormal(g,a,encodedNormalScratch2),h=AttributeCompression.octDecode(u.x,u.y,cartesianScratch),p=AttributeCompression.octDecode(d.x,d.y,cartesianScratch2),m=Cartesian3.lerp(h,p,v,cartesianScratch),Cartesian3.normalize(m,m)):m=e.geodeticSurfaceNormalCartographic(cartographicScratch$3,cartesianScratch),AttributeCompression.octEncode(m,c.encodedNormal)}function getVertexWithHeightAtCorner(e,t,i,r,n,a){a.height=n;var o=t.geodeticSurfaceNormalCartographic(cartographicScratch$3,cartesianScratch);AttributeCompression.octEncode(o,a.encodedNormal)}function getCorner(e,t,i,r,n,a,o,s,l,c,u){var d;return getCornerFromEdge(e,t,s,o,!1,i,r,u)||getCornerFromEdge(e,t,c,l,!0,i,r,u)?u:meshIsUsable(n,a)?(getVertexFromTileAtCorner(a,0===i?0===r?a.eastIndicesNorthToSouth[0]:a.southIndicesEastToWest[0]:0===r?a.northIndicesWestToEast[0]:a.westIndicesSouthToNorth[0],i,r,u),u):defined(d=0===i?0===r?getClosestHeightToCorner(e.westMeshes,e.westTiles,TileEdge.EAST,e.southMeshes,e.southTiles,TileEdge.NORTH):getClosestHeightToCorner(e.northMeshes,e.northTiles,TileEdge.SOUTH,e.westMeshes,e.westTiles,TileEdge.EAST):0===r?getClosestHeightToCorner(e.southMeshes,e.southTiles,TileEdge.NORTH,e.eastMeshes,e.eastTiles,TileEdge.WEST):getClosestHeightToCorner(e.eastMeshes,e.eastTiles,TileEdge.WEST,e.northMeshes,e.northTiles,TileEdge.SOUTH))?(getVertexWithHeightAtCorner(e,t,i,r,d,u),u):void 0}function getClosestHeightToCorner(e,t,i,r,n,a,o,s){var l=getNearestHeightOnEdge(e,t,!1,i),c=getNearestHeightOnEdge(r,n,!0,a);return defined(l)&&defined(c)?.5*(l+c):defined(l)?l:c}function addEdge(e,t,i,r,n,a,o,s,l){for(var c=0;c<a.length;++c)n=addEdgeMesh(e,t,i,r,n,a[c],o[c],s,l);return n}function addEdgeMesh(e,t,i,r,n,a,o,s,l){var c=a.rectangle;s===TileEdge.EAST&&0===e.tile.x?((c=Rectangle.clone(a.rectangle,sourceRectangleScratch)).west-=CesiumMath.TWO_PI,c.east-=CesiumMath.TWO_PI):s===TileEdge.WEST&&0===a.x&&((c=Rectangle.clone(a.rectangle,sourceRectangleScratch)).west+=CesiumMath.TWO_PI,c.east+=CesiumMath.TWO_PI);var u,d,h,p,m=e.tile.rectangle;switch(0<n&&(i.decodeTextureCoordinates(r,n-1,uvScratch),u=uvScratch.x,d=uvScratch.y),s){case TileEdge.WEST:h=o.westIndicesSouthToNorth,p=!1;break;case TileEdge.NORTH:h=o.northIndicesWestToEast,p=!0;break;case TileEdge.EAST:h=o.eastIndicesNorthToSouth,p=!1;break;case TileEdge.SOUTH:h=o.southIndicesEastToWest,p=!0}var f,g,_=a,y=e.tile,v=o.encoding,C=o.vertices,S=i.getStride();v.hasWebMercatorT&&(f=WebMercatorProjection.geodeticLatitudeToMercatorAngle(m.south),g=1/(WebMercatorProjection.geodeticLatitudeToMercatorAngle(m.north)-f));for(var T=0;T<h.length;++T){var x=h[T],b=v.decodeTextureCoordinates(C,x,uvScratch);transformTextureCoordinates(_,y,b,b);var E,P,A,w,D,M,I,R=b.x,O=b.y,L=p?R:O;L<0||1<L||Math.abs(R-u)<CesiumMath.EPSILON5&&Math.abs(O-d)<CesiumMath.EPSILON5||(E=Math.abs(R)<CesiumMath.EPSILON5||Math.abs(R-1)<CesiumMath.EPSILON5,P=Math.abs(O)<CesiumMath.EPSILON5||Math.abs(O-1)<CesiumMath.EPSILON5,E&&P||(A=v.decodePosition(C,x,cartesianScratch),w=v.decodeHeight(C,x),v.hasVertexNormals?D=v.getOctEncodedNormal(C,x,octEncodedNormalScratch):((D=octEncodedNormalScratch).x=0,D.y=0),I=O,v.hasWebMercatorT&&(M=CesiumMath.lerp(m.south,m.north,O),I=(WebMercatorProjection.geodeticLatitudeToMercatorAngle(M)-f)*g),i.encode(r,n*S,A,b,w,D,I),l.minimumHeight=Math.min(l.minimumHeight,w),l.maximumHeight=Math.max(l.maximumHeight,w),++n))}return n}function getNearestHeightOnEdge(e,t,i,r,n,a){for(var o,s,l=i?(o=0,s=e.length,1):(o=e.length-1,s=-1),c=o;c!==s;c+=l){var u,d=e[c];if(meshIsUsable(t[c],d)){switch(r){case TileEdge.WEST:u=d.westIndicesSouthToNorth;break;case TileEdge.SOUTH:u=d.southIndicesEastToWest;break;case TileEdge.EAST:u=d.eastIndicesNorthToSouth;break;case TileEdge.NORTH:u=d.northIndicesWestToEast}var h=u[i?0:u.length-1];if(defined(h))return d.encoding.decodeHeight(d.vertices,h)}}}function meshIsUsable(e,t){return defined(t)&&(!defined(e.data.fill)||!e.data.fill.changedThisFrame)}function getCornerFromEdge(r,e,t,i,n,a,o,s){var l,c,u,d,h,p=i[n?0:t.length-1],m=t[n?0:t.length-1];if(meshIsUsable(p,m)&&(u=0===a?0===o?(l=n?m.northIndicesWestToEast:m.eastIndicesNorthToSouth,c=n):(l=n?m.eastIndicesNorthToSouth:m.southIndicesEastToWest,c=!n,!1):0===o?(l=n?m.westIndicesSouthToNorth:m.northIndicesWestToEast,c=!n,!0):(l=n?m.southIndicesEastToWest:m.westIndicesSouthToNorth,!(c=n)),0<l.length)){h=l[d=n?0:l.length-1],m.encoding.decodeTextureCoordinates(m.vertices,h,uvScratch);var f=transformTextureCoordinates(p,r.tile,uvScratch,uvScratch);if(f.x===a&&f.y===o)return getVertexFromTileAtCorner(m,h,a,o,s),!0;if(!((d=binarySearch(l,c?a:o,function(e,t){m.encoding.decodeTextureCoordinates(m.vertices,e,uvScratch);var i=transformTextureCoordinates(p,r.tile,uvScratch,uvScratch);return u?c?i.x-a:i.y-o:c?a-i.x:o-i.y}))<0))return getVertexFromTileAtCorner(m,l[d],a,o,s),!0;if(0<(d=~d)&&d<l.length)return getInterpolatedVertexAtCorner(e,p,r.tile,m,l[d-1],l[d],a,o,c,s),!0}return!1}var cornerPositionsScratch=[new Cartesian3,new Cartesian3,new Cartesian3,new Cartesian3];function computeOccludeePoint(e,t,i,r,n,a){var o=e.quadtree._occluders.ellipsoid,s=o.ellipsoid,l=cornerPositionsScratch;return Cartesian3.fromRadians(i.west,i.south,n,s,l[0]),Cartesian3.fromRadians(i.east,i.south,n,s,l[1]),Cartesian3.fromRadians(i.west,i.north,n,s,l[2]),Cartesian3.fromRadians(i.east,i.north,n,s,l[3]),o.computeHorizonCullingPointPossiblyUnderEllipsoid(t,l,r,a)}function GlobeSurfaceTileProvider(e){this.lightingFadeOutDistance=65e5,this.lightingFadeInDistance=9e6,this.hasWaterMask=!1,this.oceanNormalMap=void 0,this.zoomedOutOceanSpecularIntensity=.5,this.enableLighting=!1,this.dynamicAtmosphereLighting=!1,this.dynamicAtmosphereLightingFromSun=!1,this.showGroundAtmosphere=!1,this.shadows=ShadowMode$1.RECEIVE_ONLY,this.fillHighlightColor=void 0,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this.showSkirts=!0,this.backFaceCulling=!0,this.undergroundColor=void 0,this.undergroundColorAlphaByDistance=void 0,this.materialUniformMap=void 0,this._materialUniformMap=void 0,this._quadtree=void 0,this._terrainProvider=e.terrainProvider,this._imageryLayers=e.imageryLayers,this._surfaceShaderSet=e.surfaceShaderSet,this._renderState=void 0,this._blendRenderState=void 0,this._disableCullingRenderState=void 0,this._disableCullingBlendRenderState=void 0,this._errorEvent=new Event,this._imageryLayers.layerAdded.addEventListener(GlobeSurfaceTileProvider.prototype._onLayerAdded,this),this._imageryLayers.layerRemoved.addEventListener(GlobeSurfaceTileProvider.prototype._onLayerRemoved,this),this._imageryLayers.layerMoved.addEventListener(GlobeSurfaceTileProvider.prototype._onLayerMoved,this),this._imageryLayers.layerShownOrHidden.addEventListener(GlobeSurfaceTileProvider.prototype._onLayerShownOrHidden,this),this._imageryLayersUpdatedEvent=new Event,this._layerOrderChanged=!1,this._tilesToRenderByTextureCount=[],this._drawCommands=[],this._uniformMaps=[],this._usedDrawCommands=0,this._vertexArraysToDestroy=[],this._debug={wireframe:!1,boundingSphereTile:void 0},this._baseColor=void 0,this._firstPassInitialColor=void 0,this.baseColor=new Color(0,0,.5,1),this._clippingPlanes=void 0,this.cartographicLimitRectangle=Rectangle.clone(Rectangle.MAX_VALUE),this._hasLoadedTilesThisFrame=!1,this._hasFillTilesThisFrame=!1}function sortTileImageryByLayerIndex(e,t){var i=e.loadingImagery;defined(i)||(i=e.readyImagery);var r=t.loadingImagery;return defined(r)||(r=t.readyImagery),i.imageryLayer._layerIndex-r.imageryLayer._layerIndex}function updateCredits(e,t){var i=t.creditDisplay;e._terrainProvider.ready&&defined(e._terrainProvider.credit)&&i.addCredit(e._terrainProvider.credit);for(var r=e._imageryLayers,n=0,a=r.length;n<a;++n){var o=r.get(n).imageryProvider;o.ready&&defined(o.credit)&&i.addCredit(o.credit)}}function pushCommand(e,t){var i,r=t.globeTranslucencyState;r.translucent?(i=e.renderState.blending.enabled,r.pushDerivedCommands(e,i,t)):t.commandList.push(e)}Object.defineProperties(GlobeSurfaceTileProvider.prototype,{baseColor:{get:function(){return this._baseColor},set:function(e){this._baseColor=e,this._firstPassInitialColor=Cartesian4.fromColor(e,this._firstPassInitialColor)}},quadtree:{get:function(){return this._quadtree},set:function(e){this._quadtree=e}},ready:{get:function(){return this._terrainProvider.ready&&(0===this._imageryLayers.length||this._imageryLayers.get(0).imageryProvider.ready)}},tilingScheme:{get:function(){return this._terrainProvider.tilingScheme}},errorEvent:{get:function(){return this._errorEvent}},imageryLayersUpdatedEvent:{get:function(){return this._imageryLayersUpdatedEvent}},terrainProvider:{get:function(){return this._terrainProvider},set:function(e){this._terrainProvider!==e&&(this._terrainProvider=e,defined(this._quadtree)&&this._quadtree.invalidateAllTiles())}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){ClippingPlaneCollection.setOwner(e,this,"_clippingPlanes")}}}),GlobeSurfaceTileProvider.prototype.update=function(e){this._imageryLayers._update()},GlobeSurfaceTileProvider.prototype.initialize=function(e){this._imageryLayers.queueReprojectionCommands(e),this._layerOrderChanged&&(this._layerOrderChanged=!1,this._quadtree.forEachLoadedTile(function(e){e.data.imagery.sort(sortTileImageryByLayerIndex)})),updateCredits(this,e);for(var t=this._vertexArraysToDestroy,i=t.length,r=0;r<i;++r)GlobeSurfaceTile._freeVertexArray(t[r]);t.length=0},GlobeSurfaceTileProvider.prototype.beginUpdate=function(e){for(var t=this._tilesToRenderByTextureCount,i=0,r=t.length;i<r;++i){var n=t[i];defined(n)&&(n.length=0)}var a=this._clippingPlanes;defined(a)&&a.enabled&&a.update(e),this._usedDrawCommands=0,this._hasLoadedTilesThisFrame=!1,this._hasFillTilesThisFrame=!1},GlobeSurfaceTileProvider.prototype.endUpdate=function(e){var t;defined(this._renderState)||(this._renderState=RenderState.fromCache({cull:{enabled:!0},depthTest:{enabled:!0,func:DepthFunction$1.LESS}}),this._blendRenderState=RenderState.fromCache({cull:{enabled:!0},depthTest:{enabled:!0,func:DepthFunction$1.LESS_OR_EQUAL},blending:BlendingState$1.ALPHA_BLEND}),(t=clone(this._renderState,!0)).cull.enabled=!1,this._disableCullingRenderState=RenderState.fromCache(t),(t=clone(this._blendRenderState,!0)).cull.enabled=!1,this._disableCullingBlendRenderState=RenderState.fromCache(t)),this._hasFillTilesThisFrame&&this._hasLoadedTilesThisFrame&&TerrainFillMesh.updateFillTiles(this,this._quadtree._tilesToRender,e,this._vertexArraysToDestroy);for(var i=this._tilesToRenderByTextureCount,r=0,n=i.length;r<n;++r){var a=i[r];if(defined(a))for(var o=0,s=a.length;o<s;++o){var l=a[o],c=l.data.tileBoundingRegion;addDrawCommandsForTile(this,l,e),e.minimumTerrainHeight=Math.min(e.minimumTerrainHeight,c.minimumHeight)}}},GlobeSurfaceTileProvider.prototype.updateForPick=function(e){for(var t=this._drawCommands,i=0,r=this._usedDrawCommands;i<r;++i)pushCommand(t[i],e)},GlobeSurfaceTileProvider.prototype.cancelReprojections=function(){this._imageryLayers.cancelReprojections()},GlobeSurfaceTileProvider.prototype.getLevelMaximumGeometricError=function(e){return this._terrainProvider.getLevelMaximumGeometricError(e)},GlobeSurfaceTileProvider.prototype.loadTile=function(e,t){var i,r=t.data,n=!0;defined(r)&&(n=r.boundingVolumeSourceTile!==t||t._lastSelectionResult===TileSelectionResult.CULLED_BUT_NEEDED,i=r.terrainState),GlobeSurfaceTile.processStateMachine(t,e,this.terrainProvider,this._imageryLayers,this._vertexArraysToDestroy,n),r=t.data,n&&i!==t.data.terrainState&&this.computeTileVisibility(t,e,this.quadtree.occluders)!==Visibility$1.NONE&&r.boundingVolumeSourceTile===t&&(n=!1,GlobeSurfaceTile.processStateMachine(t,e,this.terrainProvider,this._imageryLayers,this._vertexArraysToDestroy,n))};var boundingSphereScratch$1=new BoundingSphere,rectangleIntersectionScratch=new Rectangle,splitCartographicLimitRectangleScratch=new Rectangle,rectangleCenterScratch$3=new Cartographic;function clipRectangleAntimeridian(e,t){if(t.west<t.east)return t;var i=Rectangle.clone(t,splitCartographicLimitRectangleScratch);return 0<Rectangle.center(e,rectangleCenterScratch$3).longitude?i.east=CesiumMath.PI:i.west=-CesiumMath.PI,i}function isUndergroundVisible(e,t){if(t.cameraUnderground)return!0;if(t.globeTranslucencyState.translucent)return!0;if(e.backFaceCulling)return!1;var i=e._clippingPlanes;return!(!defined(i)||!i.enabled)||!Rectangle.equals(e.cartographicLimitRectangle,Rectangle.MAX_VALUE)}GlobeSurfaceTileProvider.prototype.computeTileVisibility=function(e,t,i){var r=this.computeDistanceToTile(e,t);e._distance=r;var n=isUndergroundVisible(this,t);if(t.fog.enabled&&!n&&1<=CesiumMath.fog(r,t.fog.density))return Visibility$1.NONE;var a=e.data,o=a.tileBoundingRegion;if(void 0===a.boundingVolumeSourceTile)return Visibility$1.PARTIAL;var s=t.cullingVolume,l=a.orientedBoundingBox;!defined(l)&&defined(a.renderedMesh)&&(l=a.renderedMesh.boundingSphere3D),a.clippedByBoundaries=!1;var c=clipRectangleAntimeridian(e.rectangle,this.cartographicLimitRectangle),u=Rectangle.simpleIntersection(c,e.rectangle,rectangleIntersectionScratch);if(!defined(u))return Visibility$1.NONE;if(Rectangle.equals(u,e.rectangle)||(a.clippedByBoundaries=!0),t.mode!==SceneMode$1.SCENE3D&&(l=boundingSphereScratch$1,BoundingSphere.fromRectangleWithHeights2D(e.rectangle,t.mapProjection,o.minimumHeight,o.maximumHeight,l),Cartesian3.fromElements(l.center.z,l.center.x,l.center.y,l.center),t.mode===SceneMode$1.MORPHING&&defined(a.renderedMesh)&&(l=BoundingSphere.union(a.renderedMesh.boundingSphere3D,l,l))),!defined(l))return Visibility$1.PARTIAL;var d,h=this._clippingPlanes;if(defined(h)&&h.enabled){var p=h.computeIntersectionWithBoundingVolume(l);if(e.isClipped=p!==Intersect$1.INSIDE,p===Intersect$1.OUTSIDE)return Visibility$1.NONE}var m=s.computeVisibility(l);if(m===Intersect$1.OUTSIDE?d=Visibility$1.NONE:m===Intersect$1.INTERSECTING?d=Visibility$1.PARTIAL:m===Intersect$1.INSIDE&&(d=Visibility$1.FULL),d===Visibility$1.NONE)return d;var f=t.mode===SceneMode$1.SCENE3D&&t.camera.frustum instanceof OrthographicFrustum;if(t.mode!==SceneMode$1.SCENE3D||f||!defined(i)||n)return d;var g=a.occludeePointInScaledSpace;return!defined(g)||i.ellipsoid.isScaledSpacePointVisiblePossiblyUnderEllipsoid(g,o.minimumHeight)?d:Visibility$1.NONE},GlobeSurfaceTileProvider.prototype.canRefine=function(e){return!!defined(e.data.terrainData)||void 0!==this.terrainProvider.getTileDataAvailable(2*e.x,2*e.y,e.level+1)};var readyImageryScratch=[],canRenderTraversalStack=[];GlobeSurfaceTileProvider.prototype.canRenderWithoutLosingDetail=function(e,t){var i=e.data,r=readyImageryScratch;r.length=this._imageryLayers.length;var n,a=!1,o=!1;for(defined(i)&&(a=i.terrainState===TerrainState$2.READY,o=!0,n=i.imagery),g=0,_=r.length;g<_;++g)r[g]=o;if(defined(n))for(g=0,_=n.length;g<_;++g){var s=n[g],l=s.loadingImagery,c=!defined(l)||l.state===ImageryState$1.FAILED||l.state===ImageryState$1.INVALID,u=(s.loadingImagery||s.readyImagery).imageryLayer._layerIndex;r[u]=c&&r[u]}var d=this.quadtree._lastSelectionFrameNumber,h=canRenderTraversalStack;for(h.length=0,h.push(e.southwestChild,e.southeastChild,e.northwestChild,e.northeastChild);0<h.length;){var p=h.pop(),m=p._lastSelectionResultFrame===d?p._lastSelectionResult:TileSelectionResult.NONE;if(m===TileSelectionResult.RENDERED){if(!defined(p.data))continue;if(!a&&p.data.terrainState===TerrainState$2.READY)return!1;for(var f=p.data.imagery,g=0,_=f.length;g<_;++g){var y=f[g],v=y.loadingImagery,C=!defined(v)||v.state===ImageryState$1.FAILED||v.state===ImageryState$1.INVALID,S=(y.loadingImagery||y.readyImagery).imageryLayer._layerIndex;if(C&&!r[S])return!1}}else m===TileSelectionResult.REFINED&&h.push(p.southwestChild,p.southeastChild,p.northwestChild,p.northeastChild)}return!0};var tileDirectionScratch=new Cartesian3;GlobeSurfaceTileProvider.prototype.computeTileLoadPriority=function(e,t){var i=e.data;if(void 0===i)return 0;var r=i.orientedBoundingBox;if(void 0===r)return 0;var n=t.camera.positionWC,a=t.camera.directionWC,o=Cartesian3.subtract(r.center,n,tileDirectionScratch),s=Cartesian3.magnitude(o);return s<CesiumMath.EPSILON5?0:(Cartesian3.divideByScalar(o,s,o),(1-Cartesian3.dot(o,a))*e._distance)};var modifiedModelViewScratch$3=new Matrix4,modifiedModelViewProjectionScratch=new Matrix4,tileRectangleScratch=new Cartesian4,localizedCartographicLimitRectangleScratch=new Cartesian4,localizedTranslucencyRectangleScratch=new Cartesian4,rtcScratch$3=new Cartesian3,centerEyeScratch=new Cartesian3,southwestScratch=new Cartesian3,northeastScratch=new Cartesian3;GlobeSurfaceTileProvider.prototype.showTileThisFrame=function(e,t){for(var i=0,r=e.data.imagery,n=0,a=r.length;n<a;++n){var o=r[n];defined(o.readyImagery)&&0!==o.readyImagery.imageryLayer.alpha&&++i}var s=this._tilesToRenderByTextureCount[i];defined(s)||(s=[],this._tilesToRenderByTextureCount[i]=s),s.push(e),defined(e.data.vertexArray)?this._hasLoadedTilesThisFrame=!0:this._hasFillTilesThisFrame=!0;var l=this._debug;++l.tilesRendered,l.texturesRendered+=i};var cornerPositionsScratch$1=[new Cartesian3,new Cartesian3,new Cartesian3,new Cartesian3];function computeOccludeePoint$1(e,t,i,r,n,a){var o=e.quadtree._occluders.ellipsoid,s=o.ellipsoid,l=cornerPositionsScratch$1;return Cartesian3.fromRadians(i.west,i.south,n,s,l[0]),Cartesian3.fromRadians(i.east,i.south,n,s,l[1]),Cartesian3.fromRadians(i.west,i.north,n,s,l[2]),Cartesian3.fromRadians(i.east,i.north,n,s,l[3]),o.computeHorizonCullingPointPossiblyUnderEllipsoid(t,l,r,a)}function updateTileBoundingRegion(e,t,i){var r=e.data;void 0===r&&(r=e.data=new GlobeSurfaceTile),void 0===r.tileBoundingRegion&&(r.tileBoundingRegion=new TileBoundingRegion({computeBoundingVolumes:!1,rectangle:e.rectangle,ellipsoid:e.tilingScheme.ellipsoid,minimumHeight:0,maximumHeight:0}));var n=r.terrainData,a=r.mesh,o=r.tileBoundingRegion;if(void 0!==a&&void 0!==a.minimumHeight&&void 0!==a.maximumHeight)return o.minimumHeight=a.minimumHeight,o.maximumHeight=a.maximumHeight,e;if(void 0!==n&&void 0!==n._minimumHeight&&void 0!==n._maximumHeight)return o.minimumHeight=n._minimumHeight*i.terrainExaggeration,o.maximumHeight=n._maximumHeight*i.terrainExaggeration,e;o.minimumHeight=Number.NaN,o.maximumHeight=Number.NaN;for(var s=e.parent;void 0!==s;){var l=s.data;if(void 0!==l){var c=l.mesh;if(void 0!==c&&void 0!==c.minimumHeight&&void 0!==c.maximumHeight)return o.minimumHeight=c.minimumHeight,o.maximumHeight=c.maximumHeight,s;var u=l.terrainData;if(void 0!==u&&void 0!==u._minimumHeight&&void 0!==u._maximumHeight)return o.minimumHeight=u._minimumHeight*i.terrainExaggeration,o.maximumHeight=u._maximumHeight*i.terrainExaggeration,s}s=s.parent}}function getTileReadyCallback(l,c,u){return function(e){for(var t=-1,i=e.data.imagery,r=i.length,n=0;n<r;++n)if((s=defaultValue((a=i[n]).readyImagery,a.loadingImagery)).imageryLayer===c){t=n;break}if(-1!==t){var a,o=t+l,s=defined(a=i[o])?defaultValue(a.readyImagery,a.loadingImagery):void 0;if(!defined(s)||s.imageryLayer!==c)return!c._createTileImagerySkeletons(e,u,o);for(n=t;n<o;++n)i[n].freeResources();i.splice(t,l)}return!0}}GlobeSurfaceTileProvider.prototype.computeDistanceToTile=function(e,t){var i=updateTileBoundingRegion(e,this.terrainProvider,t),r=e.data,n=r.tileBoundingRegion;if(void 0===i)return 9999999999;r.boundingVolumeSourceTile!==i&&(r.boundingVolumeSourceTile=i,defined(e.rectangle)&&(r.orientedBoundingBox=OrientedBoundingBox.fromRectangle(e.rectangle,n.minimumHeight,n.maximumHeight,e.tilingScheme.ellipsoid,r.orientedBoundingBox),r.occludeePointInScaledSpace=computeOccludeePoint$1(this,r.orientedBoundingBox.center,e.rectangle,n.minimumHeight,n.maximumHeight,r.occludeePointInScaledSpace)));var a,o,s=n.minimumHeight,l=n.maximumHeight;r.boundingVolumeSourceTile!==e&&(a=t.camera.positionCartographic.height,o=Math.abs(a-s),Math.abs(a-l)<o?(n.minimumHeight=s,n.maximumHeight=s):(n.minimumHeight=l,n.maximumHeight=l));var c=n.distanceToCamera(t);return n.minimumHeight=s,n.maximumHeight=l,c},GlobeSurfaceTileProvider.prototype.isDestroyed=function(){return!1},GlobeSurfaceTileProvider.prototype.destroy=function(){return this._tileProvider=this._tileProvider&&this._tileProvider.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),destroyObject(this)},GlobeSurfaceTileProvider.prototype._onLayerAdded=function(l,e){var c,t,i,r;l.show&&(c=this._terrainProvider,t=this,i=l.imageryProvider,r=this._imageryLayersUpdatedEvent,i._reload=function(){l._imageryCache={},t._quadtree.forEachLoadedTile(function(e){if(!defined(e._loadedCallbacks[l._layerIndex])){for(var t,i=e.data.imagery,r=i.length,n=-1,a=0,o=0;o<r;++o){var s=i[o];if(defaultValue(s.readyImagery,s.loadingImagery).imageryLayer===l)-1===n&&(n=o),++a;else if(-1!==n)break}-1!==n&&(t=n+a,l._createTileImagerySkeletons(e,c,t)&&(e._loadedCallbacks[l._layerIndex]=getTileReadyCallback(a,l,c),e.state=QuadtreeTileLoadState$1.LOADING))}})},this._quadtree.forEachLoadedTile(function(e){l._createTileImagerySkeletons(e,c)&&(e.state=QuadtreeTileLoadState$1.LOADING,0===e.level||e._lastSelectionResultFrame===t.quadtree._lastSelectionFrameNumber&&e._lastSelectionResult===TileSelectionResult.RENDERED||(e.renderable=!1))}),this._layerOrderChanged=!0,r.raiseEvent())},GlobeSurfaceTileProvider.prototype._onLayerRemoved=function(l,e){this._quadtree.forEachLoadedTile(function(e){for(var t=e.data.imagery,i=-1,r=0,n=0,a=t.length;n<a;++n){var o=t[n],s=o.loadingImagery;if(defined(s)||(s=o.readyImagery),s.imageryLayer===l)-1===i&&(i=n),o.freeResources(),++r;else if(-1!==i)break}-1!==i&&t.splice(i,r)}),defined(l.imageryProvider)&&(l.imageryProvider._reload=void 0),this._imageryLayersUpdatedEvent.raiseEvent()},GlobeSurfaceTileProvider.prototype._onLayerMoved=function(e,t,i){this._layerOrderChanged=!0,this._imageryLayersUpdatedEvent.raiseEvent()},GlobeSurfaceTileProvider.prototype._onLayerShownOrHidden=function(e,t,i){i?this._onLayerAdded(e,t):this._onLayerRemoved(e,t)};var scratchClippingPlaneMatrix$2=new Matrix4,getDebugOrientedBoundingBox,getDebugBoundingSphere,debugDestroyPrimitive,dmi,emi,ami,bmi,cmi;function createTileUniformMap(r,t){var e={u_initialColor:function(){return this.properties.initialColor},u_fillHighlightColor:function(){return this.properties.fillHighlightColor},u_zoomedOutOceanSpecularIntensity:function(){return this.properties.zoomedOutOceanSpecularIntensity},u_oceanNormalMap:function(){return this.properties.oceanNormalMap},u_lightingFadeDistance:function(){return this.properties.lightingFadeDistance},u_nightFadeDistance:function(){return this.properties.nightFadeDistance},u_center3D:function(){return this.properties.center3D},u_tileRectangle:function(){return this.properties.tileRectangle},u_modifiedModelView:function(){var e=r.context.uniformState.view,t=Matrix4.multiplyByPoint(e,this.properties.rtc,centerEyeScratch);return Matrix4.setTranslation(e,t,modifiedModelViewScratch$3),modifiedModelViewScratch$3},u_modifiedModelViewProjection:function(){var e=r.context.uniformState.view,t=r.context.uniformState.projection,i=Matrix4.multiplyByPoint(e,this.properties.rtc,centerEyeScratch);return Matrix4.setTranslation(e,i,modifiedModelViewProjectionScratch),Matrix4.multiply(t,modifiedModelViewProjectionScratch,modifiedModelViewProjectionScratch),modifiedModelViewProjectionScratch},u_dayTextures:function(){return this.properties.dayTextures},u_dayTextureTranslationAndScale:function(){return this.properties.dayTextureTranslationAndScale},u_dayTextureTexCoordsRectangle:function(){return this.properties.dayTextureTexCoordsRectangle},u_dayTextureUseWebMercatorT:function(){return this.properties.dayTextureUseWebMercatorT},u_dayTextureAlpha:function(){return this.properties.dayTextureAlpha},u_dayTextureNightAlpha:function(){return this.properties.dayTextureNightAlpha},u_dayTextureDayAlpha:function(){return this.properties.dayTextureDayAlpha},u_dayTextureBrightness:function(){return this.properties.dayTextureBrightness},u_dayTextureContrast:function(){return this.properties.dayTextureContrast},u_dayTextureHue:function(){return this.properties.dayTextureHue},u_dayTextureSaturation:function(){return this.properties.dayTextureSaturation},u_dayTextureOneOverGamma:function(){return this.properties.dayTextureOneOverGamma},u_dayIntensity:function(){return this.properties.dayIntensity},u_southAndNorthLatitude:function(){return this.properties.southAndNorthLatitude},u_southMercatorYAndOneOverHeight:function(){return this.properties.southMercatorYAndOneOverHeight},u_waterMask:function(){return this.properties.waterMask},u_waterMaskTranslationAndScale:function(){return this.properties.waterMaskTranslationAndScale},u_minMaxHeight:function(){return this.properties.minMaxHeight},u_scaleAndBias:function(){return this.properties.scaleAndBias},u_dayTextureSplit:function(){return this.properties.dayTextureSplit},u_dayTextureCutoutRectangles:function(){return this.properties.dayTextureCutoutRectangles},u_clippingPlanes:function(){var e=t._clippingPlanes;return defined(e)&&defined(e.texture)?e.texture:r.context.defaultTexture},u_cartographicLimitRectangle:function(){return this.properties.localizedCartographicLimitRectangle},u_clippingPlanesMatrix:function(){var e=t._clippingPlanes;return defined(e)?Matrix4.multiply(r.context.uniformState.view,e.modelMatrix,scratchClippingPlaneMatrix$2):Matrix4.IDENTITY},u_clippingPlanesEdgeStyle:function(){var e=this.properties.clippingPlanesEdgeColor;return e.alpha=this.properties.clippingPlanesEdgeWidth,e},u_minimumBrightness:function(){return r.fog.minimumBrightness},u_hsbShift:function(){return this.properties.hsbShift},u_colorsToAlpha:function(){return this.properties.colorsToAlpha},u_frontFaceAlphaByDistance:function(){return this.properties.frontFaceAlphaByDistance},u_backFaceAlphaByDistance:function(){return this.properties.backFaceAlphaByDistance},u_translucencyRectangle:function(){return this.properties.localizedTranslucencyRectangle},u_undergroundColor:function(){return this.properties.undergroundColor},u_undergroundColorAlphaByDistance:function(){return this.properties.undergroundColorAlphaByDistance},properties:{initialColor:new Cartesian4(0,0,.5,1),fillHighlightColor:new Color(0,0,0,0),zoomedOutOceanSpecularIntensity:.5,oceanNormalMap:void 0,lightingFadeDistance:new Cartesian2(65e5,9e6),nightFadeDistance:new Cartesian2(1e7,4e7),hsbShift:new Cartesian3,center3D:void 0,rtc:new Cartesian3,modifiedModelView:new Matrix4,tileRectangle:new Cartesian4,dayTextures:[],dayTextureTranslationAndScale:[],dayTextureTexCoordsRectangle:[],dayTextureUseWebMercatorT:[],dayTextureAlpha:[],dayTextureNightAlpha:[],dayTextureDayAlpha:[],dayTextureBrightness:[],dayTextureContrast:[],dayTextureHue:[],dayTextureSaturation:[],dayTextureOneOverGamma:[],dayTextureSplit:[],dayTextureCutoutRectangles:[],dayIntensity:0,colorsToAlpha:[],southAndNorthLatitude:new Cartesian2,southMercatorYAndOneOverHeight:new Cartesian2,waterMask:void 0,waterMaskTranslationAndScale:new Cartesian4,minMaxHeight:new Cartesian2,scaleAndBias:new Matrix4,clippingPlanesEdgeColor:Color.clone(Color.WHITE),clippingPlanesEdgeWidth:0,localizedCartographicLimitRectangle:new Cartesian4,frontFaceAlphaByDistance:new Cartesian4,backFaceAlphaByDistance:new Cartesian4,localizedTranslucencyRectangle:new Cartesian4,undergroundColor:Color.clone(Color.TRANSPARENT),undergroundColorAlphaByDistance:new Cartesian4}};return defined(t.materialUniformMap)?combine(e,t.materialUniformMap):e}function createWireframeVertexArrayIfNecessary(e,t,i){var r,n,a=i.data;if(defined(a.vertexArray)?(r=a.mesh,n=a.vertexArray):defined(a.fill)&&defined(a.fill.vertexArray)&&(r=a.fill.mesh,n=a.fill.vertexArray),defined(r)&&defined(n)){if(defined(a.wireframeVertexArray)){if(a.wireframeVertexArray.mesh===r)return;a.wireframeVertexArray.destroy(),a.wireframeVertexArray=void 0}a.wireframeVertexArray=createWireframeVertexArray(e,n,r),a.wireframeVertexArray.mesh=r}}function createWireframeVertexArray(e,t,i){var r={indices:i.indices,primitiveType:PrimitiveType$1.TRIANGLES};GeometryPipeline.toWireframe(r);var n=r.indices,a=Buffer$1.createIndexBuffer({context:e,typedArray:n,usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.fromSizeInBytes(n.BYTES_PER_ELEMENT)});return new VertexArray({context:e,attributes:t._attributes,indexBuffer:a})}function fmi(e){return new Primitive({geometryInstances:e,appearance:new PerInstanceColorAppearance({translucent:!1,flat:!0}),asynchronous:!1})}ami=new GeometryInstance({geometry:BoxOutlineGeometry.fromDimensions({dimensions:new Cartesian3(2,2,2)})}),bmi=new GeometryInstance({geometry:new SphereOutlineGeometry({radius:1})}),cmi=new Matrix4,getDebugOrientedBoundingBox=function(e,t){return e===dmi?emi:(debugDestroyPrimitive(),dmi=e,cmi=Matrix4.fromRotationTranslation(e.halfAxes,e.center,cmi),ami.modelMatrix=cmi,ami.attributes.color=ColorGeometryInstanceAttribute.fromColor(t),emi=fmi(ami))},getDebugBoundingSphere=function(e,t){return e===dmi?emi:(debugDestroyPrimitive(),dmi=e,cmi=Matrix4.fromTranslation(e.center,cmi),cmi=Matrix4.multiplyByUniformScale(cmi,e.radius,cmi),bmi.modelMatrix=cmi,bmi.attributes.color=ColorGeometryInstanceAttribute.fromColor(t),emi=fmi(bmi))},debugDestroyPrimitive=function(){defined(emi)&&(emi.destroy(),dmi=emi=void 0)};var otherPassesInitialColor=new Cartesian4(0,0,0,0),surfaceShaderSetOptionsScratch={frameState:void 0,surfaceTile:void 0,numberOfDayTextures:void 0,applyBrightness:void 0,applyContrast:void 0,applyHue:void 0,applySaturation:void 0,applyGamma:void 0,applyAlpha:void 0,applyDayNightAlpha:void 0,applySplit:void 0,showReflectiveOcean:void 0,showOceanWaves:void 0,enableLighting:void 0,dynamicAtmosphereLighting:void 0,dynamicAtmosphereLightingFromSun:void 0,showGroundAtmosphere:void 0,perFragmentGroundAtmosphere:void 0,hasVertexNormals:void 0,useWebMercatorProjection:void 0,enableFog:void 0,enableClippingPlanes:void 0,clippingPlanes:void 0,clippedByBoundaries:void 0,hasImageryLayerCutout:void 0,colorCorrect:void 0,colorToAlpha:void 0},defaultUndergroundColor=Color.TRANSPARENT,defaultundergroundColorAlphaByDistance=new NearFarScalar;function addDrawCommandsForTile(e,t,i){var r=t.data;defined(r.vertexArray)||(void 0===r.fill&&(r.fill=new TerrainFillMesh(t)),r.fill.update(e,i));var n=i.creditDisplay,a=r.terrainData;if(defined(a)&&defined(a.credits))for(var o=a.credits,s=0,l=o.length;s<l;++s)n.addCredit(o[s]);var c=ContextLimits.maximumTextureImageUnits,u=r.waterMaskTexture,d=r.waterMaskTranslationAndScale;!defined(u)&&defined(r.fill)&&(u=r.fill.waterMaskTexture,d=r.fill.waterMaskTranslationAndScale);var h,p=i.cameraUnderground,m=i.globeTranslucencyState,f=m.translucent,g=m.frontFaceAlphaByDistance,_=m.backFaceAlphaByDistance,y=m.rectangle,v=defaultValue(e.undergroundColor,defaultUndergroundColor),C=defaultValue(e.undergroundColorAlphaByDistance,defaultundergroundColorAlphaByDistance),S=isUndergroundVisible(e,i)&&i.mode===SceneMode$1.SCENE3D&&0<v.alpha&&(0<C.nearValue||0<C.farValue),T=e.hasWaterMask&&defined(u),x=e.oceanNormalMap,b=T&&defined(x),E=e.terrainProvider.ready&&e.terrainProvider.hasVertexNormals,P=i.fog.enabled&&!p,A=e.showGroundAtmosphere&&i.mode===SceneMode$1.SCENE3D,w=ShadowMode$1.castShadows(e.shadows)&&!f,D=ShadowMode$1.receiveShadows(e.shadows)&&!f,M=e.hueShift,I=e.saturationShift,R=e.brightnessShift,O=!(CesiumMath.equalsEpsilon(M,0,CesiumMath.EPSILON7)&&CesiumMath.equalsEpsilon(I,0,CesiumMath.EPSILON7)&&CesiumMath.equalsEpsilon(R,0,CesiumMath.EPSILON7)),L=!1;A&&(h=Cartesian3.magnitude(i.camera.positionWC),L=e.nightFadeOutDistance<h),T&&--c,b&&--c,defined(i.shadowState)&&i.shadowState.shadowsEnabled&&--c,defined(e.clippingPlanes)&&e.clippingPlanes.enabled&&--c,c-=m.numberOfTextureUniforms;var F,N,B,V,k,z,$=r.renderedMesh,U=$.center,G=$.encoding,H=tileRectangleScratch,W=0,q=0,j=0,Y=0,X=!1;i.mode!==SceneMode$1.SCENE3D&&(N=(F=i.mapProjection).project(Rectangle.southwest(t.rectangle),southwestScratch),B=F.project(Rectangle.northeast(t.rectangle),northeastScratch),H.x=N.x,H.y=N.y,H.z=B.x,H.w=B.y,i.mode!==SceneMode$1.MORPHING&&((U=rtcScratch$3).x=0,U.y=.5*(H.z+H.x),U.z=.5*(H.w+H.y),H.x-=U.y,H.y-=U.z,H.z-=U.y,H.w-=U.z),i.mode===SceneMode$1.SCENE2D&&G.quantization===TerrainQuantization$1.BITS12&&(V=1/(Math.pow(2,12)-1)*.5,k=(H.z-H.x)*V,z=(H.w-H.y)*V,H.x-=k,H.y-=z,H.z+=k,H.w+=z),F instanceof WebMercatorProjection&&(W=t.rectangle.south,q=t.rectangle.north,j=WebMercatorProjection.geodeticLatitudeToMercatorAngle(W),Y=1/(WebMercatorProjection.geodeticLatitudeToMercatorAngle(q)-j),X=!0));var Q=surfaceShaderSetOptionsScratch;Q.frameState=i,Q.surfaceTile=r,Q.showReflectiveOcean=T,Q.showOceanWaves=b,Q.enableLighting=e.enableLighting,Q.dynamicAtmosphereLighting=e.dynamicAtmosphereLighting,Q.dynamicAtmosphereLightingFromSun=e.dynamicAtmosphereLightingFromSun,Q.showGroundAtmosphere=A,Q.perFragmentGroundAtmosphere=L,Q.hasVertexNormals=E,Q.useWebMercatorProjection=X,Q.clippedByBoundaries=r.clippedByBoundaries;var J=r.imagery,Z=0,K=J.length,ee=e.showSkirts&&!p&&!f,te=e.backFaceCulling&&!p&&!f,ie=te?e._renderState:e._disableCullingRenderState,re=te?e._blendRenderState:e._disableCullingBlendRenderState,ne=ie,ae=e._firstPassInitialColor,oe=i.context;if(defined(e._debug.boundingSphereTile)||debugDestroyPrimitive(),e._materialUniformMap!==e.materialUniformMap){e._materialUniformMap=e.materialUniformMap;for(var se=e._drawCommands.length,le=0;le<se;++le)e._uniformMaps[le]=createTileUniformMap(i,e)}do{var ce,ue,de,he=0;e._drawCommands.length<=e._usedDrawCommands?((ce=new DrawCommand).owner=t,ce.cull=!1,ce.boundingVolume=new BoundingSphere,ce.orientedBoundingBox=void 0,ue=createTileUniformMap(i,e),e._drawCommands.push(ce),e._uniformMaps.push(ue)):(ce=e._drawCommands[e._usedDrawCommands],ue=e._uniformMaps[e._usedDrawCommands]),ce.owner=t,++e._usedDrawCommands,t===e._debug.boundingSphereTile&&(defined(de=r.orientedBoundingBox)?getDebugOrientedBoundingBox(de,Color.RED).update(i):defined($)&&defined($.boundingSphere3D)&&getDebugBoundingSphere($.boundingSphere3D,Color.RED).update(i));var pe=ue.properties;Cartesian4.clone(ae,pe.initialColor),pe.oceanNormalMap=x,pe.lightingFadeDistance.x=e.lightingFadeOutDistance,pe.lightingFadeDistance.y=e.lightingFadeInDistance,pe.nightFadeDistance.x=e.nightFadeOutDistance,pe.nightFadeDistance.y=e.nightFadeInDistance,pe.zoomedOutOceanSpecularIntensity=e.zoomedOutOceanSpecularIntensity;var me=p?_:g,fe=p?g:_;defined(me)&&(Cartesian4.fromElements(me.near,me.nearValue,me.far,me.farValue,pe.frontFaceAlphaByDistance),Cartesian4.fromElements(fe.near,fe.nearValue,fe.far,fe.farValue,pe.backFaceAlphaByDistance)),Cartesian4.fromElements(C.near,C.nearValue,C.far,C.farValue,pe.undergroundColorAlphaByDistance),Color.clone(v,pe.undergroundColor);var ge=!defined(r.vertexArray)&&defined(e.fillHighlightColor)&&0<e.fillHighlightColor.alpha;ge&&Color.clone(e.fillHighlightColor,pe.fillHighlightColor),pe.center3D=$.center,Cartesian3.clone(U,pe.rtc),Cartesian4.clone(H,pe.tileRectangle),pe.southAndNorthLatitude.x=W,pe.southAndNorthLatitude.y=q,pe.southMercatorYAndOneOverHeight.x=j,pe.southMercatorYAndOneOverHeight.y=Y;var _e=localizedCartographicLimitRectangleScratch,ye=clipRectangleAntimeridian(t.rectangle,e.cartographicLimitRectangle),ve=localizedTranslucencyRectangleScratch,Ce=clipRectangleAntimeridian(t.rectangle,y);Cartesian3.fromElements(M,I,R,pe.hsbShift);var Se=t.rectangle,Te=1/Se.width,xe=1/Se.height;_e.x=(ye.west-Se.west)*Te,_e.y=(ye.south-Se.south)*xe,_e.z=(ye.east-Se.west)*Te,_e.w=(ye.north-Se.south)*xe,Cartesian4.clone(_e,pe.localizedCartographicLimitRectangle),ve.x=(Ce.west-Se.west)*Te,ve.y=(Ce.south-Se.south)*xe,ve.z=(Ce.east-Se.west)*Te,ve.w=(Ce.north-Se.south)*xe,Cartesian4.clone(ve,pe.localizedTranslucencyRectangle);for(var be=P&&CesiumMath.fog(t._distance,i.fog.density)>CesiumMath.EPSILON3,O=O&&(be||A),Ee=!1,Pe=!1,Ae=!1,we=!1,De=!1,Me=!1,Ie=!1,Re=!1,Oe=!1,Le=!1;he<c&&Z<K;){var Fe=J[Z],Ne=Fe.readyImagery;if(++Z,defined(Ne)&&0!==Ne.imageryLayer.alpha){var Be=Fe.useWebMercatorT?Ne.textureWebMercator:Ne.texture,Ve=Ne.imageryLayer;defined(Fe.textureTranslationAndScale)||(Fe.textureTranslationAndScale=Ve._calculateTextureTranslationAndScale(t,Fe)),pe.dayTextures[he]=Be,pe.dayTextureTranslationAndScale[he]=Fe.textureTranslationAndScale,pe.dayTextureTexCoordsRectangle[he]=Fe.textureCoordinateRectangle,pe.dayTextureUseWebMercatorT[he]=Fe.useWebMercatorT,pe.dayTextureAlpha[he]=Ve.alpha,Me=Me||1!==pe.dayTextureAlpha[he],pe.dayTextureNightAlpha[he]=Ve.nightAlpha,Ie=Ie||1!==pe.dayTextureNightAlpha[he],pe.dayTextureDayAlpha[he]=Ve.dayAlpha,Ie=Ie||1!==pe.dayTextureDayAlpha[he],pe.dayTextureBrightness[he]=Ve.brightness,Ee=Ee||pe.dayTextureBrightness[he]!==ImageryLayer.DEFAULT_BRIGHTNESS,pe.dayTextureContrast[he]=Ve.contrast,Pe=Pe||pe.dayTextureContrast[he]!==ImageryLayer.DEFAULT_CONTRAST,pe.dayTextureHue[he]=Ve.hue,Ae=Ae||pe.dayTextureHue[he]!==ImageryLayer.DEFAULT_HUE,pe.dayTextureSaturation[he]=Ve.saturation,we=we||pe.dayTextureSaturation[he]!==ImageryLayer.DEFAULT_SATURATION,pe.dayTextureOneOverGamma[he]=1/Ve.gamma,De=De||pe.dayTextureOneOverGamma[he]!==1/ImageryLayer.DEFAULT_GAMMA,pe.dayTextureSplit[he]=Ve.splitDirection,Re=Re||0!==pe.dayTextureSplit[he];var ke,ze=pe.dayTextureCutoutRectangles[he];defined(ze)||(ze=pe.dayTextureCutoutRectangles[he]=new Cartesian4),Cartesian4.clone(Cartesian4.ZERO,ze),defined(Ve.cutoutRectangle)&&(ke=clipRectangleAntimeridian(Se,Ve.cutoutRectangle),Oe=defined(Rectangle.simpleIntersection(ke,Se,rectangleIntersectionScratch))||Oe,ze.x=(ke.west-Se.west)*Te,ze.y=(ke.south-Se.south)*xe,ze.z=(ke.east-Se.west)*Te,ze.w=(ke.north-Se.south)*xe);var $e=pe.colorsToAlpha[he];defined($e)||($e=pe.colorsToAlpha[he]=new Cartesian4);var Ue,Ge=defined(Ve.colorToAlpha)&&0<Ve.colorToAlphaThreshold,Le=Le||Ge;if(Ge?(Ue=Ve.colorToAlpha,$e.x=Ue.red,$e.y=Ue.green,$e.z=Ue.blue,$e.w=Ve.colorToAlphaThreshold):$e.w=-1,defined(Ne.credits))for(var He=Ne.credits,We=0,qe=He.length;We<qe;++We)n.addCredit(He[We]);++he}}pe.dayTextures.length=he,pe.waterMask=u,Cartesian4.clone(d,pe.waterMaskTranslationAndScale),pe.minMaxHeight.x=G.minimumHeight,pe.minMaxHeight.y=G.maximumHeight,Matrix4.clone(G.matrix,pe.scaleAndBias);var je=e._clippingPlanes,Ye=defined(je)&&je.enabled&&t.isClipped;Ye&&(pe.clippingPlanesEdgeColor=Color.clone(je.edgeColor,pe.clippingPlanesEdgeColor),pe.clippingPlanesEdgeWidth=je.edgeWidth),Q.numberOfDayTextures=he,Q.applyBrightness=Ee,Q.applyContrast=Pe,Q.applyHue=Ae,Q.applySaturation=we,Q.applyGamma=De,Q.applyAlpha=Me,Q.applyDayNightAlpha=Ie,Q.applySplit=Re,Q.enableFog=be,Q.enableClippingPlanes=Ye,Q.clippingPlanes=je,Q.hasImageryLayerCutout=Oe,Q.colorCorrect=O,Q.highlightFillTile=ge,Q.colorToAlpha=Le,Q.showUndergroundColor=S,Q.translucent=f;var Xe=r.renderedMesh.indices.length;ee||(Xe=r.renderedMesh.indexCountWithoutSkirts),ce.shaderProgram=e._surfaceShaderSet.getShaderProgram(Q),ce.castShadows=w,ce.receiveShadows=D,ce.renderState=ne,ce.primitiveType=PrimitiveType$1.TRIANGLES,ce.vertexArray=r.vertexArray||r.fill.vertexArray,ce.count=Xe,ce.uniformMap=ue,ce.pass=Pass$1.GLOBE,e._debug.wireframe&&(createWireframeVertexArrayIfNecessary(oe,e,t),defined(r.wireframeVertexArray)&&(ce.vertexArray=r.wireframeVertexArray,ce.primitiveType=PrimitiveType$1.LINES,ce.count=2*Xe));var Qe,Je=ce.boundingVolume,Ze=ce.orientedBoundingBox;i.mode!==SceneMode$1.SCENE3D?(Qe=r.tileBoundingRegion,BoundingSphere.fromRectangleWithHeights2D(t.rectangle,i.mapProjection,Qe.minimumHeight,Qe.maximumHeight,Je),Cartesian3.fromElements(Je.center.z,Je.center.x,Je.center.y,Je.center),i.mode===SceneMode$1.MORPHING&&(Je=BoundingSphere.union($.boundingSphere3D,Je,Je))):(ce.boundingVolume=BoundingSphere.clone($.boundingSphere3D,Je),ce.orientedBoundingBox=OrientedBoundingBox.clone(r.orientedBoundingBox,Ze)),ce.dirty=!0,f&&m.updateDerivedCommands(ce,i),pushCommand(ce,i),ne=re,ae=otherPassesInitialColor}while(Z<K)}function GlobeTranslucency(){this._enabled=!1,this._frontFaceAlpha=1,this._frontFaceAlphaByDistance=void 0,this._backFaceAlpha=1,this._backFaceAlphaByDistance=void 0,this._rectangle=Rectangle.clone(Rectangle.MAX_VALUE)}function ImageryLayerCollection(){this._layers=[],this.layerAdded=new Event,this.layerRemoved=new Event,this.layerMoved=new Event,this.layerShownOrHidden=new Event}function getLayerIndex(e,t){return e.indexOf(t)}function swapLayers(e,t,i){var r,n=e._layers;(t=CesiumMath.clamp(t,0,n.length-1))!==(i=CesiumMath.clamp(i,0,n.length-1))&&(r=n[t],n[t]=n[i],n[i]=r,e._update(),e.layerMoved.raiseEvent(r,i,t))}Object.defineProperties(GlobeTranslucency.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this._enabled=e}},frontFaceAlpha:{get:function(){return this._frontFaceAlpha},set:function(e){this._frontFaceAlpha=e}},frontFaceAlphaByDistance:{get:function(){return this._frontFaceAlphaByDistance},set:function(e){this._frontFaceAlphaByDistance=NearFarScalar.clone(e,this._frontFaceAlphaByDistance)}},backFaceAlpha:{get:function(){return this._backFaceAlpha},set:function(e){this._backFaceAlpha=e}},backFaceAlphaByDistance:{get:function(){return this._backFaceAlphaByDistance},set:function(e){this._backFaceAlphaByDistance=NearFarScalar.clone(e,this._backFaceAlphaByDistance)}},rectangle:{get:function(){return this._rectangle},set:function(e){defined(e)||(e=Rectangle.clone(Rectangle.MAX_VALUE)),Rectangle.clone(e,this._rectangle)}}}),Object.defineProperties(ImageryLayerCollection.prototype,{length:{get:function(){return this._layers.length}}}),ImageryLayerCollection.prototype.add=function(e,t){defined(t)?this._layers.splice(t,0,e):(t=this._layers.length,this._layers.push(e)),this._update(),this.layerAdded.raiseEvent(e,t)},ImageryLayerCollection.prototype.addImageryProvider=function(e,t){var i=new ImageryLayer(e);return this.add(i,t),i},ImageryLayerCollection.prototype.remove=function(e,t){t=defaultValue(t,!0);var i=this._layers.indexOf(e);return-1!==i&&(this._layers.splice(i,1),this._update(),this.layerRemoved.raiseEvent(e,i),t&&e.destroy(),!0)},ImageryLayerCollection.prototype.removeAll=function(e){e=defaultValue(e,!0);for(var t=this._layers,i=0,r=t.length;i<r;i++){var n=t[i];this.layerRemoved.raiseEvent(n,i),e&&n.destroy()}this._layers=[]},ImageryLayerCollection.prototype.contains=function(e){return-1!==this.indexOf(e)},ImageryLayerCollection.prototype.indexOf=function(e){return this._layers.indexOf(e)},ImageryLayerCollection.prototype.get=function(e){return this._layers[e]},ImageryLayerCollection.prototype.raise=function(e){var t=getLayerIndex(this._layers,e);swapLayers(this,t,t+1)},ImageryLayerCollection.prototype.lower=function(e){var t=getLayerIndex(this._layers,e);swapLayers(this,t,t-1)},ImageryLayerCollection.prototype.raiseToTop=function(e){var t=getLayerIndex(this._layers,e);t!==this._layers.length-1&&(this._layers.splice(t,1),this._layers.push(e),this._update(),this.layerMoved.raiseEvent(e,this._layers.length-1,t))},ImageryLayerCollection.prototype.lowerToBottom=function(e){var t=getLayerIndex(this._layers,e);0!==t&&(this._layers.splice(t,1),this._layers.splice(0,0,e),this._update(),this.layerMoved.raiseEvent(e,0,t))};var applicableRectangleScratch=new Rectangle,comparisonPoint;function QuadtreeOccluders(e){this._ellipsoid=new EllipsoidalOccluder(e.ellipsoid,Cartesian3.ZERO)}function QuadtreeTile(e){this._tilingScheme=e.tilingScheme,this._x=e.x,this._y=e.y,this._level=e.level,this._parent=e.parent,this._rectangle=this._tilingScheme.tileXYToRectangle(this._x,this._y,this._level),this._southwestChild=void 0,this._southeastChild=void 0,this._northwestChild=void 0,this._northeastChild=void 0,this.replacementPrevious=void 0,this.replacementNext=void 0,this._distance=0,this._loadPriority=0,this._customData=[],this._frameUpdated=void 0,this._lastSelectionResult=TileSelectionResult.NONE,this._lastSelectionResultFrame=void 0,this._loadedCallbacks={},this.state=QuadtreeTileLoadState$1.START,this.renderable=!1,this.upsampledFromParent=!1,this.data=void 0}function freeTile(e){defined(e)&&e.freeResources()}function TileReplacementQueue(){this.head=void 0,this.tail=void 0,this.count=0,this._lastBeforeStartOfFrame=void 0}function remove$1(e,t){var i=t.replacementPrevious,r=t.replacementNext;t===e._lastBeforeStartOfFrame&&(e._lastBeforeStartOfFrame=r),t===e.head?e.head=r:i.replacementNext=r,t===e.tail?e.tail=i:r.replacementPrevious=i,t.replacementPrevious=void 0,t.replacementNext=void 0,--e.count}function QuadtreePrimitive(e){this._tileProvider=e.tileProvider,(this._tileProvider.quadtree=this)._debug={enableDebugOutput:!1,maxDepth:0,maxDepthVisited:0,tilesVisited:0,tilesCulled:0,tilesRendered:0,tilesWaitingForChildren:0,lastMaxDepth:-1,lastMaxDepthVisited:-1,lastTilesVisited:-1,lastTilesCulled:-1,lastTilesRendered:-1,lastTilesWaitingForChildren:-1,suspendLodUpdate:!1};var t=this._tileProvider.tilingScheme.ellipsoid;this._tilesToRender=[],this._tileLoadQueueHigh=[],this._tileLoadQueueMedium=[],this._tileLoadQueueLow=[],this._tileReplacementQueue=new TileReplacementQueue,this._levelZeroTiles=void 0,this._loadQueueTimeSlice=5,this._tilesInvalidated=!1,this._addHeightCallbacks=[],this._removeHeightCallbacks=[],this._tileToUpdateHeights=[],this._lastTileIndex=0,this._updateHeightsTimeSlice=2,this._cameraPositionCartographic=void 0,this._cameraReferenceFrameOriginCartographic=void 0,this.maximumScreenSpaceError=defaultValue(e.maximumScreenSpaceError,2),this.tileCacheSize=defaultValue(e.tileCacheSize,100),this.loadingDescendantLimit=20,this.preloadAncestors=!0,this.preloadSiblings=!1,this._occluders=new QuadtreeOccluders({ellipsoid:t}),this._tileLoadProgressEvent=new Event,this._lastTileLoadQueueLength=0,this._lastSelectionFrameNumber=void 0}function invalidateAllTiles(e){var t=e._tileReplacementQueue;t.head=void 0,t.tail=void 0,t.count=0,clearTileLoadQueue(e);var i=e._levelZeroTiles;if(defined(i))for(var r=0;r<i.length;++r){for(var n=i[r].customData,a=n.length,o=0;o<a;++o){var s=n[o];s.level=0,e._addHeightCallbacks.push(s)}i[r].freeResources()}e._levelZeroTiles=void 0,e._tileProvider.cancelReprojections()}function clearTileLoadQueue(e){var t=e._debug;t.maxDepth=0,t.maxDepthVisited=0,t.tilesVisited=0,t.tilesCulled=0,t.tilesRendered=0,t.tilesWaitingForChildren=0,e._tileLoadQueueHigh.length=0,e._tileLoadQueueMedium.length=0,e._tileLoadQueueLow.length=0}function updateTileLoadProgress(e,t){var i=e._tileLoadQueueHigh.length+e._tileLoadQueueMedium.length+e._tileLoadQueueLow.length;i===e._lastTileLoadQueueLength&&!e._tilesInvalidated||(t.afterRender.push(Event.prototype.raiseEvent.bind(e._tileLoadProgressEvent,i)),e._lastTileLoadQueueLength=i);var r=e._debug;r.enableDebugOutput&&!r.suspendLodUpdate&&(r.maxDepth=e._tilesToRender.reduce(function(e,t){return Math.max(e,t.level)},-1),r.tilesRendered=e._tilesToRender.length,r.tilesVisited===r.lastTilesVisited&&r.tilesRendered===r.lastTilesRendered&&r.tilesCulled===r.lastTilesCulled&&r.maxDepth===r.lastMaxDepth&&r.tilesWaitingForChildren===r.lastTilesWaitingForChildren&&r.maxDepthVisited===r.lastMaxDepthVisited||(console.log("Visited "+r.tilesVisited+", Rendered: "+r.tilesRendered+", Culled: "+r.tilesCulled+", Max Depth Rendered: "+r.maxDepth+", Max Depth Visited: "+r.maxDepthVisited+", Waiting for children: "+r.tilesWaitingForChildren),r.lastTilesVisited=r.tilesVisited,r.lastTilesRendered=r.tilesRendered,r.lastTilesCulled=r.tilesCulled,r.lastMaxDepth=r.maxDepth,r.lastTilesWaitingForChildren=r.tilesWaitingForChildren,r.lastMaxDepthVisited=r.maxDepthVisited))}ImageryLayerCollection.prototype.pickImageryLayerFeatures=function(e,t){var i=t.globe.pick(e,t);if(defined(i)){for(var r,s=t.globe.ellipsoid.cartesianToCartographic(i),n=t.globe._surface._tilesToRender,a=0;!defined(r)&&a<n.length;++a){var o=n[a];Rectangle.contains(o.rectangle,s)&&(r=o)}if(defined(r)){for(var l=r.data.imagery,c=[],u=[],d=l.length-1;0<=d;--d){var h,p,m,f,g=l[d],_=g.readyImagery;defined(_)&&(defined((h=_.imageryLayer.imageryProvider).pickFeatures)&&Rectangle.contains(_.rectangle,s)&&(m=1/1024,(p=applicableRectangleScratch).west=CesiumMath.lerp(r.rectangle.west,r.rectangle.east,g.textureCoordinateRectangle.x-m),p.east=CesiumMath.lerp(r.rectangle.west,r.rectangle.east,g.textureCoordinateRectangle.z+m),p.south=CesiumMath.lerp(r.rectangle.south,r.rectangle.north,g.textureCoordinateRectangle.y-m),p.north=CesiumMath.lerp(r.rectangle.south,r.rectangle.north,g.textureCoordinateRectangle.w+m),!Rectangle.contains(p,s)||defined(f=h.pickFeatures(_.x,_.y,_.level,s.longitude,s.latitude))&&(c.push(f),u.push(_.imageryLayer))))}if(0!==c.length)return when.all(c,function(e){for(var t=[],i=0;i<e.length;++i){var r=e[i],n=u[i];if(defined(r)&&0<r.length)for(var a=0;a<r.length;++a){var o=r[a];o.imageryLayer=n,defined(o.position)||(o.position=s),t.push(o)}}return t})}}},ImageryLayerCollection.prototype.queueReprojectionCommands=function(e){for(var t=this._layers,i=0,r=t.length;i<r;++i)t[i].queueReprojectionCommands(e)},ImageryLayerCollection.prototype.cancelReprojections=function(){for(var e=this._layers,t=0,i=e.length;t<i;++t)e[t].cancelReprojections()},ImageryLayerCollection.prototype.isDestroyed=function(){return!1},ImageryLayerCollection.prototype.destroy=function(){return this.removeAll(!0),destroyObject(this)},ImageryLayerCollection.prototype._update=function(){for(var e,t,i=!0,r=this._layers,n=0,a=r.length;n<a;++n)(t=r[n])._layerIndex=n,t.show?(t._isBaseLayer=i,i=!1):t._isBaseLayer=!1,t.show!==t._show&&(defined(t._show)&&(defined(e)||(e=[]),e.push(t)),t._show=t.show);if(defined(e))for(n=0,a=e.length;n<a;++n)t=e[n],this.layerShownOrHidden.raiseEvent(t,t._layerIndex,t.show)},Object.defineProperties(QuadtreeOccluders.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}}),QuadtreeTile.createLevelZeroTiles=function(e){for(var t=e.getNumberOfXTilesAtLevel(0),i=e.getNumberOfYTilesAtLevel(0),r=new Array(t*i),n=0,a=0;a<i;++a)for(var o=0;o<t;++o)r[n++]=new QuadtreeTile({tilingScheme:e,x:o,y:a,level:0});return r},QuadtreeTile.prototype._updateCustomData=function(e,t,i){var r,n,a=this.customData;if(defined(t)&&defined(i)){for(a=a.filter(function(e){return-1===i.indexOf(e)}),this._customData=a,n=this._rectangle,l=0;l<t.length;++l)r=t[l],Rectangle.contains(n,r.positionCartographic)&&a.push(r);this._frameUpdated=e}else{var o=this._parent;if(defined(o)&&this._frameUpdated!==o._frameUpdated){a.length=0,n=this._rectangle;for(var s=o.customData,l=0;l<s.length;++l)r=s[l],Rectangle.contains(n,r.positionCartographic)&&a.push(r);this._frameUpdated=o._frameUpdated}}},Object.defineProperties(QuadtreeTile.prototype,{tilingScheme:{get:function(){return this._tilingScheme}},x:{get:function(){return this._x}},y:{get:function(){return this._y}},level:{get:function(){return this._level}},parent:{get:function(){return this._parent}},rectangle:{get:function(){return this._rectangle}},children:{get:function(){return[this.northwestChild,this.northeastChild,this.southwestChild,this.southeastChild]}},southwestChild:{get:function(){return defined(this._southwestChild)||(this._southwestChild=new QuadtreeTile({tilingScheme:this.tilingScheme,x:2*this.x,y:2*this.y+1,level:this.level+1,parent:this})),this._southwestChild}},southeastChild:{get:function(){return defined(this._southeastChild)||(this._southeastChild=new QuadtreeTile({tilingScheme:this.tilingScheme,x:2*this.x+1,y:2*this.y+1,level:this.level+1,parent:this})),this._southeastChild}},northwestChild:{get:function(){return defined(this._northwestChild)||(this._northwestChild=new QuadtreeTile({tilingScheme:this.tilingScheme,x:2*this.x,y:2*this.y,level:this.level+1,parent:this})),this._northwestChild}},northeastChild:{get:function(){return defined(this._northeastChild)||(this._northeastChild=new QuadtreeTile({tilingScheme:this.tilingScheme,x:2*this.x+1,y:2*this.y,level:this.level+1,parent:this})),this._northeastChild}},customData:{get:function(){return this._customData}},needsLoading:{get:function(){return this.state<QuadtreeTileLoadState$1.DONE}},eligibleForUnloading:{get:function(){var e=!0;return defined(this.data)&&(defined(e=this.data.eligibleForUnloading)||(e=!0)),e}}}),QuadtreeTile.prototype.findLevelZeroTile=function(e,t,i){var r=this.tilingScheme.getNumberOfXTilesAtLevel(0);if(t<0?t+=r:r<=t&&(t-=r),!(i<0||i>=this.tilingScheme.getNumberOfYTilesAtLevel(0)))return e.filter(function(e){return e.x===t&&e.y===i})[0]},QuadtreeTile.prototype.findTileToWest=function(e){var t=this.parent;if(void 0===t)return this.findLevelZeroTile(e,this.x-1,this.y);if(t.southeastChild===this)return t.southwestChild;if(t.northeastChild===this)return t.northwestChild;var i=t.findTileToWest(e);return void 0!==i?t.southwestChild===this?i.southeastChild:i.northeastChild:void 0},QuadtreeTile.prototype.findTileToEast=function(e){var t=this.parent;if(void 0===t)return this.findLevelZeroTile(e,this.x+1,this.y);if(t.southwestChild===this)return t.southeastChild;if(t.northwestChild===this)return t.northeastChild;var i=t.findTileToEast(e);return void 0!==i?t.southeastChild===this?i.southwestChild:i.northwestChild:void 0},QuadtreeTile.prototype.findTileToSouth=function(e){var t=this.parent;if(void 0===t)return this.findLevelZeroTile(e,this.x,this.y+1);if(t.northwestChild===this)return t.southwestChild;if(t.northeastChild===this)return t.southeastChild;var i=t.findTileToSouth(e);return void 0!==i?t.southwestChild===this?i.northwestChild:i.northeastChild:void 0},QuadtreeTile.prototype.findTileToNorth=function(e){var t=this.parent;if(void 0===t)return this.findLevelZeroTile(e,this.x,this.y-1);if(t.southwestChild===this)return t.northwestChild;if(t.southeastChild===this)return t.northeastChild;var i=t.findTileToNorth(e);return void 0!==i?t.northwestChild===this?i.southwestChild:i.southeastChild:void 0},QuadtreeTile.prototype.freeResources=function(){this.state=QuadtreeTileLoadState$1.START,this.renderable=!1,this.upsampledFromParent=!1,defined(this.data)&&defined(this.data.freeResources)&&this.data.freeResources(),freeTile(this._southwestChild),this._southwestChild=void 0,freeTile(this._southeastChild),this._southeastChild=void 0,freeTile(this._northwestChild),this._northwestChild=void 0,freeTile(this._northeastChild),this._northeastChild=void 0},TileReplacementQueue.prototype.markStartOfRenderFrame=function(){this._lastBeforeStartOfFrame=this.head},TileReplacementQueue.prototype.trimTiles=function(e){for(var t=this.tail,i=!0;i&&defined(this._lastBeforeStartOfFrame)&&this.count>e&&defined(t);){i=t!==this._lastBeforeStartOfFrame;var r=t.replacementPrevious;t.eligibleForUnloading&&(t.freeResources(),remove$1(this,t)),t=r}},TileReplacementQueue.prototype.markTileRendered=function(e){var t=this.head;if(t!==e){if(++this.count,!defined(t))return e.replacementPrevious=void 0,e.replacementNext=void 0,this.head=e,void(this.tail=e);(defined(e.replacementPrevious)||defined(e.replacementNext))&&remove$1(this,e),e.replacementPrevious=void 0,(e.replacementNext=t).replacementPrevious=e,this.head=e}else e===this._lastBeforeStartOfFrame&&(this._lastBeforeStartOfFrame=e.replacementNext)},Object.defineProperties(QuadtreePrimitive.prototype,{tileProvider:{get:function(){return this._tileProvider}},tileLoadProgressEvent:{get:function(){return this._tileLoadProgressEvent}},occluders:{get:function(){return this._occluders}}}),QuadtreePrimitive.prototype.invalidateAllTiles=function(){this._tilesInvalidated=!0},QuadtreePrimitive.prototype.forEachLoadedTile=function(e){for(var t=this._tileReplacementQueue.head;defined(t);)t.state!==QuadtreeTileLoadState$1.START&&e(t),t=t.replacementNext},QuadtreePrimitive.prototype.forEachRenderedTile=function(e){for(var t=this._tilesToRender,i=0,r=t.length;i<r;++i)e(t[i])},QuadtreePrimitive.prototype.updateHeight=function(e,t){var r=this,n={positionOnEllipsoidSurface:void 0,positionCartographic:e,level:-1,callback:t,removeFunc:function(){for(var e=r._addHeightCallbacks,t=e.length,i=0;i<t;++i)if(e[i]===n){e.splice(i,1);break}r._removeHeightCallbacks.push(n)}};return r._addHeightCallbacks.push(n),n.removeFunc},QuadtreePrimitive.prototype.update=function(e){defined(this._tileProvider.update)&&this._tileProvider.update(e)},QuadtreePrimitive.prototype.beginFrame=function(e){e.passes.render&&(this._tilesInvalidated&&(invalidateAllTiles(this),this._tilesInvalidated=!1),this._tileProvider.initialize(e),clearTileLoadQueue(this),this._debug.suspendLodUpdate||this._tileReplacementQueue.markStartOfRenderFrame())},QuadtreePrimitive.prototype.render=function(e){var t=e.passes,i=this._tileProvider;t.render&&(i.beginUpdate(e),selectTilesForRendering(this,e),createRenderCommandsForSelectedTiles(this,e),i.endUpdate(e)),t.pick&&0<this._tilesToRender.length&&i.updateForPick(e)},QuadtreePrimitive.prototype.endFrame=function(e){e.passes.render&&e.mode!==SceneMode$1.MORPHING&&(processTileLoadQueue(this,e),updateHeights(this,e),updateTileLoadProgress(this,e))},QuadtreePrimitive.prototype.isDestroyed=function(){return!1},QuadtreePrimitive.prototype.destroy=function(){this._tileProvider=this._tileProvider&&this._tileProvider.destroy()};var centerScratch$5=new Cartographic;function compareDistanceToPoint(e,t){var i=Rectangle.center(e.rectangle,centerScratch$5),r=i.longitude-comparisonPoint.longitude,n=i.latitude-comparisonPoint.latitude,a=(i=Rectangle.center(t.rectangle,centerScratch$5)).longitude-comparisonPoint.longitude,o=i.latitude-comparisonPoint.latitude;return r*r+n*n-(a*a+o*o)}var cameraOriginScratch=new Cartesian3,rootTraversalDetails=[];function selectTilesForRendering(e,t){var i,r=e._debug;if(!r.suspendLodUpdate){e._tilesToRender.length=0;var n,a=e._tileProvider;if(!defined(e._levelZeroTiles)){if(!a.ready)return;var o=a.tilingScheme;e._levelZeroTiles=QuadtreeTile.createLevelZeroTiles(o);var s=e._levelZeroTiles.length;if(rootTraversalDetails.length<s)for(rootTraversalDetails=new Array(s),i=0;i<s;++i)void 0===rootTraversalDetails[i]&&(rootTraversalDetails[i]=new TraversalDetails)}e._occluders.ellipsoid.cameraPosition=t.camera.positionWC;var l=e._levelZeroTiles,c=1<l.length?e._occluders:void 0;comparisonPoint=t.camera.positionCartographic,l.sort(compareDistanceToPoint);var u,d=e._addHeightCallbacks,h=e._removeHeightCallbacks,p=t.frameNumber;if(0<d.length||0<h.length){for(i=0,u=l.length;i<u;++i)(n=l[i])._updateCustomData(p,d,h);d.length=0,h.length=0}var m=t.camera;e._cameraPositionCartographic=m.positionCartographic;var f=Matrix4.getTranslation(m.transform,cameraOriginScratch);for(e._cameraReferenceFrameOriginCartographic=e.tileProvider.tilingScheme.ellipsoid.cartesianToCartographic(f,e._cameraReferenceFrameOriginCartographic),i=0,u=l.length;i<u;++i)n=l[i],e._tileReplacementQueue.markTileRendered(n),n.renderable?visitIfVisible(e,n,a,t,c,!1,rootTraversalDetails[i]):(queueTileLoad(e,e._tileLoadQueueHigh,n,t),++r.tilesWaitingForChildren);e._lastSelectionFrameNumber=p}}function queueTileLoad(e,t,i,r){i.needsLoading&&(void 0!==e.tileProvider.computeTileLoadPriority&&(i._loadPriority=e.tileProvider.computeTileLoadPriority(i,r)),t.push(i))}function TraversalDetails(){this.allAreRenderable=!0,this.anyWereRenderedLastFrame=!1,this.notYetRenderableCount=0}function TraversalQuadDetails(){this.southwest=new TraversalDetails,this.southeast=new TraversalDetails,this.northwest=new TraversalDetails,this.northeast=new TraversalDetails}TraversalQuadDetails.prototype.combine=function(e){var t=this.southwest,i=this.southeast,r=this.northwest,n=this.northeast;e.allAreRenderable=t.allAreRenderable&&i.allAreRenderable&&r.allAreRenderable&&n.allAreRenderable,e.anyWereRenderedLastFrame=t.anyWereRenderedLastFrame||i.anyWereRenderedLastFrame||r.anyWereRenderedLastFrame||n.anyWereRenderedLastFrame,e.notYetRenderableCount=t.notYetRenderableCount+i.notYetRenderableCount+r.notYetRenderableCount+n.notYetRenderableCount};for(var traversalQuadsByLevel=new Array(31),i$4=0;i$4<traversalQuadsByLevel.length;++i$4)traversalQuadsByLevel[i$4]=new TraversalQuadDetails;function visitTile$3(e,t,i,r,n){var a=e._debug;++a.tilesVisited,e._tileReplacementQueue.markTileRendered(i),i._updateCustomData(t.frameNumber),i.level>a.maxDepthVisited&&(a.maxDepthVisited=i.level);var o=screenSpaceError(e,t,i)<e.maximumScreenSpaceError,s=i.southwestChild,l=i.southeastChild,c=i.northwestChild,u=i.northeastChild,d=e._lastSelectionFrameNumber,h=i._lastSelectionResultFrame===d?i._lastSelectionResult:TileSelectionResult.NONE,p=e.tileProvider;if(o||r){var m=TileSelectionResult.originalResult(h)===TileSelectionResult.RENDERED,f=TileSelectionResult.originalResult(h)===TileSelectionResult.CULLED||h===TileSelectionResult.NONE,g=i.state===QuadtreeTileLoadState$1.DONE,_=m||f||g;if(_||defined(p.canRenderWithoutLosingDetail)&&(_=p.canRenderWithoutLosingDetail(i)),_)return o&&queueTileLoad(e,e._tileLoadQueueMedium,i,t),addTileToRenderList(e,i),n.allAreRenderable=i.renderable,n.anyWereRenderedLastFrame=h===TileSelectionResult.RENDERED,n.notYetRenderableCount=i.renderable?0:1,i._lastSelectionResultFrame=t.frameNumber,i._lastSelectionResult=TileSelectionResult.RENDERED,void(n.anyWereRenderedLastFrame||e._tileToUpdateHeights.push(i));r=!0,o&&queueTileLoad(e,e._tileLoadQueueHigh,i,t)}if(p.canRefine(i)){if(s.upsampledFromParent&&l.upsampledFromParent&&c.upsampledFromParent&&u.upsampledFromParent)return addTileToRenderList(e,i),queueTileLoad(e,e._tileLoadQueueMedium,i,t),e._tileReplacementQueue.markTileRendered(s),e._tileReplacementQueue.markTileRendered(l),e._tileReplacementQueue.markTileRendered(c),e._tileReplacementQueue.markTileRendered(u),n.allAreRenderable=i.renderable,n.anyWereRenderedLastFrame=h===TileSelectionResult.RENDERED,n.notYetRenderableCount=i.renderable?0:1,i._lastSelectionResultFrame=t.frameNumber,i._lastSelectionResult=TileSelectionResult.RENDERED,void(n.anyWereRenderedLastFrame||e._tileToUpdateHeights.push(i));i._lastSelectionResultFrame=t.frameNumber,i._lastSelectionResult=TileSelectionResult.REFINED;var y=e._tilesToRender.length,v=e._tileLoadQueueLow.length,C=e._tileLoadQueueMedium.length,S=e._tileLoadQueueHigh.length,T=e._tileToUpdateHeights.length;if(visitVisibleChildrenNearToFar(e,s,l,c,u,t,r,n),y!==e._tilesToRender.length){var x=n.allAreRenderable,b=n.anyWereRenderedLastFrame,E=n.notYetRenderableCount,P=!1;if(!x&&!b){for(var A=e._tilesToRender,w=y;w<A.length;++w)for(var D=A[w];void 0!==D&&D._lastSelectionResult!==TileSelectionResult.KICKED&&D!==i;)D._lastSelectionResult=TileSelectionResult.kick(D._lastSelectionResult),D=D.parent;e._tilesToRender.length=y,e._tileToUpdateHeights.length=T,addTileToRenderList(e,i),i._lastSelectionResult=TileSelectionResult.RENDERED;var M=h===TileSelectionResult.RENDERED;!M&&E>e.loadingDescendantLimit&&(e._tileLoadQueueLow.length=v,e._tileLoadQueueMedium.length=C,e._tileLoadQueueHigh.length=S,queueTileLoad(e,e._tileLoadQueueMedium,i,t),n.notYetRenderableCount=i.renderable?0:1,P=!0),n.allAreRenderable=i.renderable,(n.anyWereRenderedLastFrame=M)||e._tileToUpdateHeights.push(i),++a.tilesWaitingForChildren}e.preloadAncestors&&!P&&queueTileLoad(e,e._tileLoadQueueLow,i,t)}}else i._lastSelectionResultFrame=t.frameNumber,i._lastSelectionResult=TileSelectionResult.RENDERED,addTileToRenderList(e,i),queueTileLoad(e,e._tileLoadQueueHigh,i,t),n.allAreRenderable=i.renderable,n.anyWereRenderedLastFrame=h===TileSelectionResult.RENDERED,n.notYetRenderableCount=i.renderable?0:1}function visitVisibleChildrenNearToFar(e,t,i,r,n,a,o,s){var l=a.camera.positionCartographic,c=e._tileProvider,u=e._occluders,d=traversalQuadsByLevel[t.level],h=d.southwest,p=d.southeast,m=d.northwest,f=d.northeast;l.longitude<t.rectangle.east?l.latitude<t.rectangle.north?(visitIfVisible(e,t,c,a,u,o,h),visitIfVisible(e,i,c,a,u,o,p),visitIfVisible(e,r,c,a,u,o,m),visitIfVisible(e,n,c,a,u,o,f)):(visitIfVisible(e,r,c,a,u,o,m),visitIfVisible(e,t,c,a,u,o,h),visitIfVisible(e,n,c,a,u,o,f),visitIfVisible(e,i,c,a,u,o,p)):l.latitude<t.rectangle.north?(visitIfVisible(e,i,c,a,u,o,p),visitIfVisible(e,t,c,a,u,o,h),visitIfVisible(e,n,c,a,u,o,f),visitIfVisible(e,r,c,a,u,o,m)):(visitIfVisible(e,n,c,a,u,o,f),visitIfVisible(e,r,c,a,u,o,m),visitIfVisible(e,i,c,a,u,o,p),visitIfVisible(e,t,c,a,u,o,h)),d.combine(s)}function containsNeededPosition(e,t){var i=t.rectangle;return defined(e._cameraPositionCartographic)&&Rectangle.contains(i,e._cameraPositionCartographic)||defined(e._cameraReferenceFrameOriginCartographic)&&Rectangle.contains(i,e._cameraReferenceFrameOriginCartographic)}function visitIfVisible(e,t,i,r,n,a,o){if(i.computeTileVisibility(t,r,n)!==Visibility$1.NONE)return visitTile$3(e,r,t,a,o);var s,l;++e._debug.tilesCulled,e._tileReplacementQueue.markTileRendered(t),o.allAreRenderable=!0,o.anyWereRenderedLastFrame=!1,o.notYetRenderableCount=0,containsNeededPosition(e,t)?(defined(t.data)&&defined(t.data.vertexArray)||queueTileLoad(e,e._tileLoadQueueMedium,t,r),s=e._lastSelectionFrameNumber,(l=t._lastSelectionResultFrame===s?t._lastSelectionResult:TileSelectionResult.NONE)!==TileSelectionResult.CULLED_BUT_NEEDED&&l!==TileSelectionResult.RENDERED&&e._tileToUpdateHeights.push(t),t._lastSelectionResult=TileSelectionResult.CULLED_BUT_NEEDED):(!e.preloadSiblings&&0!==t.level||queueTileLoad(e,e._tileLoadQueueLow,t,r),t._lastSelectionResult=TileSelectionResult.CULLED),t._lastSelectionResultFrame=r.frameNumber}function screenSpaceError(e,t,i){if(t.mode===SceneMode$1.SCENE2D||t.camera.frustum instanceof OrthographicFrustum||t.camera.frustum instanceof OrthographicOffCenterFrustum)return screenSpaceError2D(e,t,i);var r=e._tileProvider.getLevelMaximumGeometricError(i.level),n=i._distance,a=r*t.context.drawingBufferHeight/(n*t.camera.frustum.sseDenominator);return t.fog.enabled&&(a-=CesiumMath.fog(n,t.fog.density)*t.fog.sse),a/=t.pixelRatio}function screenSpaceError2D(e,t,i){var r=t.camera.frustum;defined(r._offCenterFrustum)&&(r=r._offCenterFrustum);var n=t.context,a=n.drawingBufferWidth,o=n.drawingBufferHeight,s=e._tileProvider.getLevelMaximumGeometricError(i.level)/(Math.max(r.top-r.bottom,r.right-r.left)/Math.max(a,o));return t.fog.enabled&&t.mode!==SceneMode$1.SCENE2D&&(s-=CesiumMath.fog(i._distance,t.fog.density)*t.fog.sse),s/=t.pixelRatio}function addTileToRenderList(e,t){e._tilesToRender.push(t)}function processTileLoadQueue(e,t){var i,r,n,a=e._tileLoadQueueHigh,o=e._tileLoadQueueMedium,s=e._tileLoadQueueLow;0===a.length&&0===o.length&&0===s.length||(e._tileReplacementQueue.trimTiles(e.tileCacheSize),i=getTimestamp$1()+e._loadQueueTimeSlice,n=processSinglePriorityLoadQueue(e,t,r=e._tileProvider,i,a,!1),n=processSinglePriorityLoadQueue(e,t,r,i,o,n),processSinglePriorityLoadQueue(e,t,r,i,s,n))}function sortByLoadPriority(e,t){return e._loadPriority-t._loadPriority}function processSinglePriorityLoadQueue(e,t,i,r,n,a){void 0!==i.computeTileLoadPriority&&n.sort(sortByLoadPriority);for(var o=0,s=n.length;o<s&&(getTimestamp$1()<r||!a);++o){var l=n[o];e._tileReplacementQueue.markTileRendered(l),i.loadTile(t,l),a=!0}return a}var scratchRay=new Ray,scratchCartographic$d=new Cartographic,scratchPosition$b=new Cartesian3,scratchArray=[];function updateHeights(e,t){if(e.tileProvider.ready){var i=scratchArray;i.length=0;for(var r=e._tileToUpdateHeights,n=e._tileProvider.terrainProvider,a=getTimestamp$1()+e._updateHeightsTimeSlice,o=t.mode,s=t.mapProjection,l=e.tileProvider.tilingScheme.ellipsoid;0<r.length;){var c=r[0];if(defined(c.data)&&defined(c.data.mesh)){for(var u=c.customData,d=u.length,h=!1,p=e._lastTileIndex;p<d;++p){var m,f,g,_,y=u[p];if(c.level>y.level){defined(y.positionOnEllipsoidSurface)||(y.positionOnEllipsoidSurface=Cartesian3.fromRadians(y.positionCartographic.longitude,y.positionCartographic.latitude,0,l)),o===SceneMode$1.SCENE3D?(m=l.geodeticSurfaceNormal(y.positionOnEllipsoidSurface,scratchRay.direction),defined(l.getSurfaceNormalIntersectionWithZAxis(y.positionOnEllipsoidSurface,11500,scratchRay.origin))||(defined(c.data.tileBoundingRegion)&&(f=c.data.tileBoundingRegion.minimumHeight),g=Math.min(defaultValue(f,0),-11500),_=Cartesian3.multiplyByScalar(m,Math.abs(g)+1,scratchPosition$b),Cartesian3.subtract(y.positionOnEllipsoidSurface,_,scratchRay.origin))):(Cartographic.clone(y.positionCartographic,scratchCartographic$d),scratchCartographic$d.height=-11500,s.project(scratchCartographic$d,scratchPosition$b),Cartesian3.fromElements(scratchPosition$b.z,scratchPosition$b.x,scratchPosition$b.y,scratchPosition$b),Cartesian3.clone(scratchPosition$b,scratchRay.origin),Cartesian3.clone(Cartesian3.UNIT_X,scratchRay.direction));var v=c.data.pick(scratchRay,o,s,!1,scratchPosition$b);defined(v)&&(y.callback(v),y.level=c.level)}else if(c.level===y.level){for(var C,S=c.children,T=S.length,x=0;x<T&&(C=S[x],!Rectangle.contains(C.rectangle,y.positionCartographic));++x);var b=n.getTileDataAvailable(C.x,C.y,C.level),E=c.parent;(defined(b)&&!b||defined(E)&&defined(E.data)&&defined(E.data.terrainData)&&!E.data.terrainData.isChildAvailable(E.x,E.y,C.x,C.y))&&y.removeFunc()}if(getTimestamp$1()>=a){h=!0;break}}if(h){e._lastTileIndex=p;break}e._lastTileIndex=0,r.shift()}else{var P=c._lastSelectionResultFrame===e._lastSelectionFrameNumber?c._lastSelectionResult:TileSelectionResult.NONE;P!==TileSelectionResult.RENDERED&&P!==TileSelectionResult.CULLED_BUT_NEEDED||i.push(c),r.shift(),e._lastTileIndex=0}}for(p=0;p<i.length;p++)r.push(i[p])}}function createRenderCommandsForSelectedTiles(e,t){for(var i=e._tileProvider,r=e._tilesToRender,n=0,a=r.length;n<a;++n){var o=r[n];i.showTileThisFrame(o,t)}}function Globe(e){var t=new EllipsoidTerrainProvider({ellipsoid:e=defaultValue(e,Ellipsoid.WGS84)}),i=new ImageryLayerCollection;this._ellipsoid=e,this._imageryLayerCollection=i,this._surfaceShaderSet=new GlobeSurfaceShaderSet,this._material=void 0,this._surface=new QuadtreePrimitive({tileProvider:new GlobeSurfaceTileProvider({terrainProvider:t,imageryLayers:i,surfaceShaderSet:this._surfaceShaderSet})}),this._terrainProvider=t,this._terrainProviderChanged=new Event,this._undergroundColor=Color.clone(Color.BLACK),this._undergroundColorAlphaByDistance=new NearFarScalar(e.maximumRadius/1e3,0,e.maximumRadius/5,1),this._translucency=new GlobeTranslucency,makeShadersDirty(this),this.show=!0,this._oceanNormalMapResourceDirty=!0,this._oceanNormalMapResource=new Resource({url:buildModuleUrl("Assets/Textures/waterNormalsSmall.jpg")}),this.maximumScreenSpaceError=2,this.tileCacheSize=100,this.loadingDescendantLimit=20,this.preloadAncestors=!0,this.preloadSiblings=!1,this.fillHighlightColor=void 0,this.enableLighting=!1,this.dynamicAtmosphereLighting=!0,this.dynamicAtmosphereLightingFromSun=!1,this.showGroundAtmosphere=!0,this.lightingFadeOutDistance=1e7,this.lightingFadeInDistance=2e7,this.nightFadeOutDistance=1e7,this.nightFadeInDistance=5e7,this.showWaterEffect=!0,this.depthTestAgainstTerrain=!1,this.shadows=ShadowMode$1.RECEIVE_ONLY,this.atmosphereHueShift=0,this.atmosphereSaturationShift=0,this.atmosphereBrightnessShift=0,this.showSkirts=!0,this.backFaceCulling=!0,this._oceanNormalMap=void 0,this._zoomedOutOceanSpecularIntensity=void 0}function makeShadersDirty(e){var t=[],i=defined(e._material)&&(e._material.shaderSource.match(/slope/)||e._material.shaderSource.match("normalEC")),r=[GroundAtmosphere];!defined(e._material)||i&&!e._terrainProvider.requestVertexNormals?e._surface._tileProvider.materialUniformMap=void 0:(r.push(e._material.shaderSource),t.push("APPLY_MATERIAL"),e._surface._tileProvider.materialUniformMap=e._material._uniforms),r.push(GlobeFS),e._surfaceShaderSet.baseVertexShaderSource=new ShaderSource({sources:[GroundAtmosphere,GlobeVS],defines:t}),e._surfaceShaderSet.baseFragmentShaderSource=new ShaderSource({sources:r,defines:t}),e._surfaceShaderSet.material=e._material}function createComparePickTileFunction(i){return function(e,t){return BoundingSphere.distanceSquaredTo(e.pickBoundingSphere,i)-BoundingSphere.distanceSquaredTo(t.pickBoundingSphere,i)}}Object.defineProperties(Globe.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},imageryLayers:{get:function(){return this._imageryLayerCollection}},imageryLayersUpdatedEvent:{get:function(){return this._surface.tileProvider.imageryLayersUpdatedEvent}},tilesLoaded:{get:function(){return!defined(this._surface)||this._surface.tileProvider.ready&&0===this._surface._tileLoadQueueHigh.length&&0===this._surface._tileLoadQueueMedium.length&&0===this._surface._tileLoadQueueLow.length}},baseColor:{get:function(){return this._surface.tileProvider.baseColor},set:function(e){this._surface.tileProvider.baseColor=e}},clippingPlanes:{get:function(){return this._surface.tileProvider.clippingPlanes},set:function(e){this._surface.tileProvider.clippingPlanes=e}},cartographicLimitRectangle:{get:function(){return this._surface.tileProvider.cartographicLimitRectangle},set:function(e){defined(e)||(e=Rectangle.clone(Rectangle.MAX_VALUE)),this._surface.tileProvider.cartographicLimitRectangle=e}},oceanNormalMapUrl:{get:function(){return this._oceanNormalMapResource.url},set:function(e){this._oceanNormalMapResource.url=e,this._oceanNormalMapResourceDirty=!0}},terrainProvider:{get:function(){return this._terrainProvider},set:function(e){e!==this._terrainProvider&&(this._terrainProvider=e,this._terrainProviderChanged.raiseEvent(e),defined(this._material)&&makeShadersDirty(this))}},terrainProviderChanged:{get:function(){return this._terrainProviderChanged}},tileLoadProgressEvent:{get:function(){return this._surface.tileLoadProgressEvent}},material:{get:function(){return this._material},set:function(e){this._material!==e&&(this._material=e,makeShadersDirty(this))}},undergroundColor:{get:function(){return this._undergroundColor},set:function(e){this._undergroundColor=Color.clone(e,this._undergroundColor)}},undergroundColorAlphaByDistance:{get:function(){return this._undergroundColorAlphaByDistance},set:function(e){this._undergroundColorAlphaByDistance=NearFarScalar.clone(e,this._undergroundColorAlphaByDistance)}},translucency:{get:function(){return this._translucency}}});var scratchArray$1=[],scratchSphereIntersectionResult={start:0,stop:0};Globe.prototype.pickWorldCoordinates=function(e,t,i,r){i=defaultValue(i,!0);var n=t.mode,a=t.mapProjection,o=scratchArray$1;o.length=0;for(var s,l,c=this._surface._tilesToRender,u=c.length,d=0;d<u;++d){var h=(s=c[d]).data;if(defined(h)){var p=h.pickBoundingSphere;if(n!==SceneMode$1.SCENE3D)h.pickBoundingSphere=p=BoundingSphere.fromRectangleWithHeights2D(s.rectangle,a,h.tileBoundingRegion.minimumHeight,h.tileBoundingRegion.maximumHeight,p),Cartesian3.fromElements(p.center.z,p.center.x,p.center.y,p.center);else{if(!defined(h.renderedMesh))continue;BoundingSphere.clone(h.renderedMesh.boundingSphere3D,p)}defined(IntersectionTests.raySphere(e,p,scratchSphereIntersectionResult))&&o.push(h)}}for(o.sort(createComparePickTileFunction(e.origin)),u=o.length,d=0;d<u&&!defined(l=o[d].pick(e,t.mode,t.mapProjection,i,r));++d);return l};var cartoScratch$2=new Cartographic;Globe.prototype.pick=function(e,t,i){var r;return defined(i=this.pickWorldCoordinates(e,t,!0,i))&&t.mode!==SceneMode$1.SCENE3D&&(i=Cartesian3.fromElements(i.y,i.z,i.x,i),r=t.mapProjection.unproject(i,cartoScratch$2),i=t.globe.ellipsoid.cartographicToCartesian(r,i)),i};var scratchGetHeightCartesian=new Cartesian3,scratchGetHeightIntersection=new Cartesian3,scratchGetHeightCartographic=new Cartographic,scratchGetHeightRay=new Ray;function tileIfContainsCartographic(e,t){return defined(e)&&Rectangle.contains(e.rectangle,t)?e:void 0}Globe.prototype.getHeight=function(e){var t=this._surface._levelZeroTiles;if(defined(t)){for(var i,r=t.length,n=0;n<r&&(i=t[n],!Rectangle.contains(i.rectangle,e));++n);if(!(r<=n)){for(var a=i;defined(i);)defined(i=tileIfContainsCartographic(i._southwestChild,e)||tileIfContainsCartographic(i._southeastChild,e)||tileIfContainsCartographic(i._northwestChild,e)||i._northeastChild)&&defined(i.data)&&defined(i.data.renderedMesh)&&(a=i);if(defined(i=a)&&defined(i.data)&&defined(i.data.renderedMesh)){var o,s,l,c=this._surface._tileProvider.tilingScheme.ellipsoid,u=Cartesian3.fromRadians(e.longitude,e.latitude,0,c,scratchGetHeightCartesian),d=scratchGetHeightRay,h=c.geodeticSurfaceNormal(u,d.direction);defined(c.getSurfaceNormalIntersectionWithZAxis(u,11500,d.origin))||(defined(i.data.tileBoundingRegion)&&(o=i.data.tileBoundingRegion.minimumHeight),s=Math.min(defaultValue(o,0),-11500),l=Cartesian3.multiplyByScalar(h,Math.abs(s)+1,scratchGetHeightIntersection),Cartesian3.subtract(u,l,d.origin));var p=i.data.pick(d,void 0,void 0,!1,scratchGetHeightIntersection);if(defined(p))return c.cartesianToCartographic(p,scratchGetHeightCartographic).height}}}},Globe.prototype.update=function(e){this.show&&e.passes.render&&this._surface.update(e)},Globe.prototype.beginFrame=function(t){var e,i,r,n=this._surface,a=n.tileProvider,o=this.terrainProvider,s=this.showWaterEffect&&o.ready&&o.hasWaterMask;s&&this._oceanNormalMapResourceDirty&&(this._oceanNormalMapResourceDirty=!1,e=this._oceanNormalMapResource,defined(i=e.url)?(r=this,when(e.fetchImage(),function(e){i===r._oceanNormalMapResource.url&&(r._oceanNormalMap=r._oceanNormalMap&&r._oceanNormalMap.destroy(),r._oceanNormalMap=new Texture({context:t.context,source:e}))})):this._oceanNormalMap=this._oceanNormalMap&&this._oceanNormalMap.destroy());var l=t.passes,c=t.mode;l.render&&(this.showGroundAtmosphere?this._zoomedOutOceanSpecularIntensity=.4:this._zoomedOutOceanSpecularIntensity=.5,n.maximumScreenSpaceError=this.maximumScreenSpaceError,n.tileCacheSize=this.tileCacheSize,n.loadingDescendantLimit=this.loadingDescendantLimit,n.preloadAncestors=this.preloadAncestors,n.preloadSiblings=this.preloadSiblings,a.terrainProvider=this.terrainProvider,a.lightingFadeOutDistance=this.lightingFadeOutDistance,a.lightingFadeInDistance=this.lightingFadeInDistance,a.nightFadeOutDistance=this.nightFadeOutDistance,a.nightFadeInDistance=this.nightFadeInDistance,a.zoomedOutOceanSpecularIntensity=c===SceneMode$1.SCENE3D?this._zoomedOutOceanSpecularIntensity:0,a.hasWaterMask=s,a.oceanNormalMap=this._oceanNormalMap,a.enableLighting=this.enableLighting,a.dynamicAtmosphereLighting=this.dynamicAtmosphereLighting,a.dynamicAtmosphereLightingFromSun=this.dynamicAtmosphereLightingFromSun,a.showGroundAtmosphere=this.showGroundAtmosphere,a.shadows=this.shadows,a.hueShift=this.atmosphereHueShift,a.saturationShift=this.atmosphereSaturationShift,a.brightnessShift=this.atmosphereBrightnessShift,a.fillHighlightColor=this.fillHighlightColor,a.showSkirts=this.showSkirts,a.backFaceCulling=this.backFaceCulling,a.undergroundColor=this._undergroundColor,a.undergroundColorAlphaByDistance=this._undergroundColorAlphaByDistance,n.beginFrame(t))},Globe.prototype.render=function(e){this.show&&(defined(this._material)&&this._material.update(e.context),this._surface.render(e))},Globe.prototype.endFrame=function(e){this.show&&e.passes.render&&this._surface.endFrame(e)},Globe.prototype.isDestroyed=function(){return!1},Globe.prototype.destroy=function(){return this._surfaceShaderSet=this._surfaceShaderSet&&this._surfaceShaderSet.destroy(),this._surface=this._surface&&this._surface.destroy(),this._oceanNormalMap=this._oceanNormalMap&&this._oceanNormalMap.destroy(),destroyObject(this)};var PassThrough="uniform sampler2D colorTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\ngl_FragColor = texture2D(colorTexture, v_textureCoordinates);\n}\n",PassThroughDepth="uniform sampler2D u_depthTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\ngl_FragColor = czm_packDepth(texture2D(u_depthTexture, v_textureCoordinates).r);\n}\n";function GlobeDepth(){this._globeColorTexture=void 0,this._primitiveColorTexture=void 0,this._depthStencilTexture=void 0,this._globeDepthTexture=void 0,this._tempGlobeDepthTexture=void 0,this._tempCopyDepthTexture=void 0,this._globeColorFramebuffer=void 0,this._primitiveColorFramebuffer=void 0,this._copyDepthFramebuffer=void 0,this._tempCopyDepthFramebuffer=void 0,this._updateDepthFramebuffer=void 0,this._clearGlobeColorCommand=void 0,this._clearPrimitiveColorCommand=void 0,this._copyColorCommand=void 0,this._copyDepthCommand=void 0,this._tempCopyDepthCommand=void 0,this._updateDepthCommand=void 0,this._mergeColorCommand=void 0,this._viewport=new BoundingRectangle,this._rs=void 0,this._rsBlend=void 0,this._rsUpdate=void 0,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useLogDepth=void 0,this._useHdr=void 0,this._clearGlobeDepth=void 0,this._debugGlobeDepthViewportCommand=void 0}function executeDebugGlobeDepth(e,t,i,r){var n;defined(e._debugGlobeDepthViewportCommand)&&r===e._useLogDepth||(n=new ShaderSource({defines:[r?"LOG_DEPTH":""],sources:["uniform sampler2D u_depthTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\n float z_window = czm_unpackDepth(texture2D(u_depthTexture, v_textureCoordinates));\n z_window = czm_reverseLogDepth(z_window); \n float n_range = czm_depthRange.near;\n float f_range = czm_depthRange.far;\n float z_ndc = (2.0 * z_window - n_range - f_range) / (f_range - n_range);\n float scale = pow(z_ndc * 0.5 + 0.5, 8.0);\n gl_FragColor = vec4(mix(vec3(0.0), vec3(1.0), scale), 1.0);\n}\n"]}),e._debugGlobeDepthViewportCommand=t.createViewportQuadCommand(n,{uniformMap:{u_depthTexture:function(){return e._globeDepthTexture}},owner:e}),e._useLogDepth=r),e._debugGlobeDepthViewportCommand.execute(t,i)}function destroyTextures(e){e._globeColorTexture=e._globeColorTexture&&!e._globeColorTexture.isDestroyed()&&e._globeColorTexture.destroy(),e._depthStencilTexture=e._depthStencilTexture&&!e._depthStencilTexture.isDestroyed()&&e._depthStencilTexture.destroy(),e._globeDepthTexture=e._globeDepthTexture&&!e._globeDepthTexture.isDestroyed()&&e._globeDepthTexture.destroy()}function destroyFramebuffers$1(e){e._globeColorFramebuffer=e._globeColorFramebuffer&&!e._globeColorFramebuffer.isDestroyed()&&e._globeColorFramebuffer.destroy(),e._copyDepthFramebuffer=e._copyDepthFramebuffer&&!e._copyDepthFramebuffer.isDestroyed()&&e._copyDepthFramebuffer.destroy()}function destroyUpdateDepthResources(e){e._tempCopyDepthFramebuffer=e._tempCopyDepthFramebuffer&&!e._tempCopyDepthFramebuffer.isDestroyed()&&e._tempCopyDepthFramebuffer.destroy(),e._updateDepthFramebuffer=e._updateDepthFramebuffer&&!e._updateDepthFramebuffer.isDestroyed()&&e._updateDepthFramebuffer.destroy(),e._tempGlobeDepthTexture=e._tempGlobeDepthTexture&&!e._tempGlobeDepthTexture.isDestroyed()&&e._tempGlobeDepthTexture.destroy()}function createUpdateDepthResources(e,t,i,r,n){e._tempGlobeDepthTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),e._tempCopyDepthFramebuffer=new Framebuffer({context:t,colorTextures:[e._tempGlobeDepthTexture],destroyAttachments:!1}),e._updateDepthFramebuffer=new Framebuffer({context:t,colorTextures:[e._globeDepthTexture],depthStencilTexture:n.framebuffer.depthStencilTexture,destroyAttachments:!1})}function createTextures$1(e,t,i,r,n){var a=n?t.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT:PixelDatatype$1.UNSIGNED_BYTE;e._globeColorTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:a,sampler:Sampler.NEAREST}),e._depthStencilTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8}),e._globeDepthTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST})}function createFramebuffers$1(e,t){e._globeColorFramebuffer=new Framebuffer({context:t,colorTextures:[e._globeColorTexture],depthStencilTexture:e._depthStencilTexture,destroyAttachments:!1}),e._copyDepthFramebuffer=new Framebuffer({context:t,colorTextures:[e._globeDepthTexture],destroyAttachments:!1})}function createPrimitiveFramebuffer(e,t,i,r,n){var a=n?t.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT:PixelDatatype$1.UNSIGNED_BYTE;e._primitiveColorTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:a,sampler:Sampler.NEAREST}),e._primitiveColorFramebuffer=new Framebuffer({context:t,colorTextures:[e._primitiveColorTexture],depthStencilTexture:e._depthStencilTexture,destroyAttachments:!1})}function destroyPrimitiveFramebuffer(e){e._primitiveColorTexture=e._primitiveColorTexture&&!e._primitiveColorTexture.isDestroyed()&&e._primitiveColorTexture.destroy(),e._primitiveColorFramebuffer=e._primitiveColorFramebuffer&&!e._primitiveColorFramebuffer.isDestroyed()&&e._primitiveColorFramebuffer.destroy()}function updateFramebuffers(e,t,i,r,n,a){var o=e._globeColorTexture,s=!defined(o)||o.width!==i||o.height!==r||n!==e._useHdr;s&&(destroyTextures(e),destroyFramebuffers$1(e),createTextures$1(e,t,i,r,n),createFramebuffers$1(e,t)),!s&&a===e._clearGlobeDepth||(destroyPrimitiveFramebuffer(e),a&&createPrimitiveFramebuffer(e,t,i,r,n))}function updateCopyCommands(e,t,i,r,n){e._viewport.width=i,e._viewport.height=r;var a=!BoundingRectangle.equals(e._viewport,n.viewport),o=a!==e._useScissorTest;e._useScissorTest=a,BoundingRectangle.equals(e._scissorRectangle,n.viewport)||(e._scissorRectangle=BoundingRectangle.clone(n.viewport,e._scissorRectangle),o=!0),defined(e._rs)&&BoundingRectangle.equals(e._viewport,e._rs.viewport)&&!o||(e._rs=RenderState.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}}),e._rsBlend=RenderState.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},blending:BlendingState$1.ALPHA_BLEND}),e._rsUpdate=RenderState.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},stencilTest:{enabled:!0,frontFunction:StencilFunction$1.EQUAL,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.KEEP},backFunction:StencilFunction$1.NEVER,reference:StencilConstants$1.CESIUM_3D_TILE_MASK,mask:StencilConstants$1.CESIUM_3D_TILE_MASK}})),defined(e._copyDepthCommand)||(e._copyDepthCommand=t.createViewportQuadCommand(PassThroughDepth,{uniformMap:{u_depthTexture:function(){return e._depthStencilTexture}},owner:e})),e._copyDepthCommand.framebuffer=e._copyDepthFramebuffer,e._copyDepthCommand.renderState=e._rs,defined(e._copyColorCommand)||(e._copyColorCommand=t.createViewportQuadCommand(PassThrough,{uniformMap:{colorTexture:function(){return e._globeColorTexture}},owner:e})),e._copyColorCommand.renderState=e._rs,defined(e._tempCopyDepthCommand)||(e._tempCopyDepthCommand=t.createViewportQuadCommand(PassThroughDepth,{uniformMap:{u_depthTexture:function(){return e._tempCopyDepthTexture}},owner:e})),e._tempCopyDepthCommand.framebuffer=e._tempCopyDepthFramebuffer,e._tempCopyDepthCommand.renderState=e._rs,defined(e._updateDepthCommand)||(e._updateDepthCommand=t.createViewportQuadCommand(PassThrough,{uniformMap:{colorTexture:function(){return e._tempGlobeDepthTexture}},owner:e})),e._updateDepthCommand.framebuffer=e._updateDepthFramebuffer,e._updateDepthCommand.renderState=e._rsUpdate,defined(e._clearGlobeColorCommand)||(e._clearGlobeColorCommand=new ClearCommand({color:new Color(0,0,0,0),stencil:0,owner:e})),e._clearGlobeColorCommand.framebuffer=e._globeColorFramebuffer,defined(e._clearPrimitiveColorCommand)||(e._clearPrimitiveColorCommand=new ClearCommand({color:new Color(0,0,0,0),stencil:0,owner:e})),e._clearPrimitiveColorCommand.framebuffer=e._primitiveColorFramebuffer,defined(e._mergeColorCommand)||(e._mergeColorCommand=t.createViewportQuadCommand(PassThrough,{uniformMap:{colorTexture:function(){return e._primitiveColorTexture}},owner:e})),e._mergeColorCommand.framebuffer=e._globeColorFramebuffer,e._mergeColorCommand.renderState=e._rsBlend}function GlobeTranslucencyFramebuffer(){this._colorTexture=void 0,this._depthStencilTexture=void 0,this._depthStencilRenderbuffer=void 0,this._framebuffer=void 0,this._packedDepthTexture=void 0,this._packedDepthFramebuffer=void 0,this._renderState=void 0,this._packedDepthCommand=void 0,this._clearCommand=void 0,this._viewport=new BoundingRectangle,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHdr=void 0}function destroyResources(e){e._colorTexture=e._colorTexture&&!e._colorTexture.isDestroyed()&&e._colorTexture.destroy(),e._depthStencilTexture=e._depthStencilTexture&&!e._depthStencilTexture.isDestroyed()&&e._depthStencilTexture.destroy(),e._depthStencilRenderbuffer=e._depthStencilRenderbuffer&&!e._depthStencilRenderbuffer.isDestroyed()&&e._depthStencilRenderbuffer.destroy(),e._framebuffer=e._framebuffer&&!e._framebuffer.isDestroyed()&&e._framebuffer.destroy(),e._packedDepthTexture=e._packedDepthTexture&&!e._packedDepthTexture.isDestroyed()&&e._packedDepthTexture.destroy(),e._packedDepthFramebuffer=e._packedDepthFramebuffer&&!e._packedDepthFramebuffer.isDestroyed()&&e._packedDepthFramebuffer.destroy()}function createResources$5(e,t,i,r,n){var a=n?t.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT:PixelDatatype$1.UNSIGNED_BYTE;e._colorTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:a,sampler:Sampler.NEAREST}),t.depthTexture?e._depthStencilTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8}):e._depthStencilRenderbuffer=new Renderbuffer({context:t,width:i,height:r,format:RenderbufferFormat$1.DEPTH_STENCIL}),e._framebuffer=new Framebuffer({context:t,colorTextures:[e._colorTexture],depthStencilTexture:e._depthStencilTexture,depthStencilRenderbuffer:e._depthStencilRenderbuffer,destroyAttachments:!1}),e._packedDepthTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),e._packedDepthFramebuffer=new Framebuffer({context:t,colorTextures:[e._packedDepthTexture],destroyAttachments:!1})}function updateResources(e,t,i,r,n){var a=e._colorTexture;defined(a)&&a.width===i&&a.height===r&&n===e._useHdr||(destroyResources(e),createResources$5(e,t,i,r,n))}function updateCommands(e,t,i,r,n){e._viewport.width=i,e._viewport.height=r;var a=!BoundingRectangle.equals(e._viewport,n.viewport),o=a!==e._useScissorTest;e._useScissorTest=a,BoundingRectangle.equals(e._scissorRectangle,n.viewport)||(e._scissorRectangle=BoundingRectangle.clone(n.viewport,e._scissorRectangle),o=!0),defined(e._renderState)&&BoundingRectangle.equals(e._viewport,e._renderState.viewport)&&!o||(e._renderState=RenderState.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}})),defined(e._packedDepthCommand)||(e._packedDepthCommand=t.createViewportQuadCommand(PassThroughDepth,{uniformMap:{u_depthTexture:function(){return e._depthStencilTexture}},owner:e})),defined(e._clearCommand)||(e._clearCommand=new ClearCommand({color:new Color(0,0,0,0),depth:1,stencil:0,owner:e})),e._packedDepthCommand.framebuffer=e._packedDepthFramebuffer,e._packedDepthCommand.renderState=e._renderState,e._clearCommand.framebuffer=e._framebuffer,e._clearCommand.renderState=e._renderState}Object.defineProperties(GlobeDepth.prototype,{framebuffer:{get:function(){return this._globeColorFramebuffer}},primitiveFramebuffer:{get:function(){return this._primitiveColorFramebuffer}}}),GlobeDepth.prototype.executeDebugGlobeDepth=function(e,t,i){executeDebugGlobeDepth(this,e,t,i)},GlobeDepth.prototype.update=function(e,t,i,r,n){var a=i.width,o=i.height;updateFramebuffers(this,e,a,o,r,n),updateCopyCommands(this,e,a,o,t),e.uniformState.globeDepthTexture=void 0,this._useHdr=r,this._clearGlobeDepth=n},GlobeDepth.prototype.executeCopyDepth=function(e,t){defined(this._copyDepthCommand)&&(this._copyDepthCommand.execute(e,t),e.uniformState.globeDepthTexture=this._globeDepthTexture)},GlobeDepth.prototype.executeUpdateDepth=function(e,t,i){var r,n,a=t.framebuffer.depthStencilTexture;i||a!==this._depthStencilTexture?defined(this._updateDepthCommand)&&(defined(this._updateDepthFramebuffer)&&this._updateDepthFramebuffer.depthStencilTexture===a&&this._updateDepthFramebuffer.getColorTexture(0)===this._globeDepthTexture||(r=this._globeDepthTexture.width,n=this._globeDepthTexture.height,destroyUpdateDepthResources(this),createUpdateDepthResources(this,e,r,n,t),updateCopyCommands(this,e,r,n,t)),this._tempCopyDepthTexture=a,this._tempCopyDepthCommand.execute(e,t),this._updateDepthCommand.execute(e,t)):defined(this._copyDepthCommand)&&this._copyDepthCommand.execute(e,t)},GlobeDepth.prototype.executeCopyColor=function(e,t){defined(this._copyColorCommand)&&this._copyColorCommand.execute(e,t)},GlobeDepth.prototype.executeMergeColor=function(e,t){defined(this._mergeColorCommand)&&this._mergeColorCommand.execute(e,t)},GlobeDepth.prototype.clear=function(e,t,i){var r=this._clearGlobeColorCommand;defined(r)&&(Color.clone(i,r.color),r.execute(e,t)),defined(r=this._clearPrimitiveColorCommand)&&defined(this._primitiveColorFramebuffer)&&r.execute(e,t)},GlobeDepth.prototype.isDestroyed=function(){return!1},GlobeDepth.prototype.destroy=function(){return destroyTextures(this),destroyFramebuffers$1(this),destroyPrimitiveFramebuffer(this),destroyUpdateDepthResources(this),defined(this._copyColorCommand)&&(this._copyColorCommand.shaderProgram=this._copyColorCommand.shaderProgram.destroy()),defined(this._copyDepthCommand)&&(this._copyDepthCommand.shaderProgram=this._copyDepthCommand.shaderProgram.destroy()),defined(this._tempCopyDepthCommand)&&(this._tempCopyDepthCommand.shaderProgram=this._tempCopyDepthCommand.shaderProgram.destroy()),defined(this._updateDepthCommand)&&(this._updateDepthCommand.shaderProgram=this._updateDepthCommand.shaderProgram.destroy()),defined(this._mergeColorCommand)&&(this._mergeColorCommand.shaderProgram=this._mergeColorCommand.shaderProgram.destroy()),defined(this._debugGlobeDepthViewportCommand)&&(this._debugGlobeDepthViewportCommand.shaderProgram=this._debugGlobeDepthViewportCommand.shaderProgram.destroy()),destroyObject(this)},Object.defineProperties(GlobeTranslucencyFramebuffer.prototype,{classificationTexture:{get:function(){return this._colorTexture}},classificationFramebuffer:{get:function(){return this._framebuffer}}}),GlobeTranslucencyFramebuffer.prototype.updateAndClear=function(e,t,i,r){var n=t.width,a=t.height;updateResources(this,i,n,a,e),updateCommands(this,i,n,a,r),this._useHdr=e},GlobeTranslucencyFramebuffer.prototype.clearClassification=function(e,t){this._clearCommand.execute(e,t)},GlobeTranslucencyFramebuffer.prototype.packDepth=function(e,t){return this._packedDepthCommand.execute(e,t),this._packedDepthTexture},GlobeTranslucencyFramebuffer.prototype.isDestroyed=function(){return!1},GlobeTranslucencyFramebuffer.prototype.destroy=function(){return destroyResources(this),destroyObject(this)};var DerivedCommandType={OPAQUE_FRONT_FACE:0,OPAQUE_BACK_FACE:1,DEPTH_ONLY_FRONT_FACE:2,DEPTH_ONLY_BACK_FACE:3,DEPTH_ONLY_FRONT_AND_BACK_FACE:4,TRANSLUCENT_FRONT_FACE:5,TRANSLUCENT_BACK_FACE:6,TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST:7,TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST:8,PICK_FRONT_FACE:9,PICK_BACK_FACE:10,DERIVED_COMMANDS_MAXIMUM_LENGTH:11},derivedCommandsMaximumLength=DerivedCommandType.DERIVED_COMMANDS_MAXIMUM_LENGTH,DerivedCommandNames=["opaqueFrontFaceCommand","opaqueBackFaceCommand","depthOnlyFrontFaceCommand","depthOnlyBackFaceCommand","depthOnlyFrontAndBackFaceCommand","translucentFrontFaceCommand","translucentBackFaceCommand","translucentFrontFaceManualDepthTestCommand","translucentBackFaceManualDepthTestCommand","pickFrontFaceCommand","pickBackFaceCommand"];function GlobeTranslucencyState(){this._frontFaceAlphaByDistance=new NearFarScalar(0,1,0,1),this._backFaceAlphaByDistance=new NearFarScalar(0,1,0,1),this._frontFaceTranslucent=!1,this._backFaceTranslucent=!1,this._requiresManualDepthTest=!1,this._sunVisibleThroughGlobe=!1,this._environmentVisible=!1,this._useDepthPlane=!1,this._numberOfTextureUniforms=0,this._globeTranslucencyFramebuffer=void 0,this._rectangle=Rectangle.clone(Rectangle.MAX_VALUE),this._derivedCommandKey=0,this._derivedCommandsDirty=!1,this._derivedCommandPacks=void 0,this._derivedCommandTypes=new Array(derivedCommandsMaximumLength),this._derivedBlendCommandTypes=new Array(derivedCommandsMaximumLength),this._derivedPickCommandTypes=new Array(derivedCommandsMaximumLength),this._derivedCommandTypesToUpdate=new Array(derivedCommandsMaximumLength),this._derivedCommandsLength=0,this._derivedBlendCommandsLength=0,this._derivedPickCommandsLength=0,this._derivedCommandsToUpdateLength=0}function updateAlphaByDistance(e,t,i,r){return e?defined(i)?(NearFarScalar.clone(i,r),r.nearValue*=t,r.farValue*=t):(r.nearValue=t,r.farValue=t):(r.nearValue=1,r.farValue=1),r}function isFaceTranslucent(e,t,i){return e&&(i.baseColor.alpha<1||t.nearValue<1||t.farValue<1)}function isSunVisibleThroughGlobe(e,t){var i=e._frontFaceTranslucent,r=e._backFaceTranslucent;return i&&(t.cameraUnderground||r)}function isEnvironmentVisible(e,t){return!t.cameraUnderground||e._frontFaceTranslucent}function useDepthPlane(e,t){return!t.cameraUnderground&&!e._frontFaceTranslucent}function requiresManualDepthTest(e,t,i){return e._frontFaceTranslucent&&!e._backFaceTranslucent&&!i.depthTestAgainstTerrain&&t.mode!==SceneMode$1.SCENE2D&&t.context.depthTexture}function getNumberOfTextureUniforms(e){var t=0;return e._frontFaceTranslucent&&++t,e._requiresManualDepthTest&&++t,t}function gatherDerivedCommandRequirements(e,t){e._derivedCommandsLength=getDerivedCommandTypes(e,t,!1,!1,e._derivedCommandTypes),e._derivedBlendCommandsLength=getDerivedCommandTypes(e,t,!0,!1,e._derivedBlendCommandTypes),e._derivedPickCommandsLength=getDerivedCommandTypes(e,t,!1,!0,e._derivedPickCommandTypes);for(var i=0,r=0;r<e._derivedCommandsLength;++r)i|=1<<e._derivedCommandTypes[r];for(r=0;r<e._derivedBlendCommandsLength;++r)i|=1<<e._derivedBlendCommandTypes[r];for(r=0;r<e._derivedPickCommandsLength;++r)i|=1<<e._derivedPickCommandTypes[r];var n=0;for(r=0;r<derivedCommandsMaximumLength;++r)0<(i&1<<r)&&(e._derivedCommandTypesToUpdate[n++]=r);e._derivedCommandsToUpdateLength=n;var a=i!==e._derivedCommandKey;e._derivedCommandKey=i,e._derivedCommandsDirty=a,!defined(e._derivedCommandPacks)&&e._frontFaceTranslucent&&(e._derivedCommandPacks=createDerivedCommandPacks())}function getDerivedCommandTypes(e,t,i,r,n){var a=0,o=e._frontFaceTranslucent,s=e._backFaceTranslucent;if(!o)return a;var l=t.cameraUnderground,c=e._requiresManualDepthTest,u=r?DerivedCommandType.PICK_FRONT_FACE:c?DerivedCommandType.TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST:DerivedCommandType.TRANSLUCENT_FRONT_FACE,d=r?DerivedCommandType.PICK_BACK_FACE:c?DerivedCommandType.TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST:DerivedCommandType.TRANSLUCENT_BACK_FACE;return t.mode===SceneMode$1.SCENE2D?(n[a++]=DerivedCommandType.DEPTH_ONLY_FRONT_FACE,n[a++]=u):s?(i||(n[a++]=DerivedCommandType.DEPTH_ONLY_FRONT_AND_BACK_FACE),l?(n[a++]=u,n[a++]=d):(n[a++]=d,n[a++]=u)):l?(i||(n[a++]=DerivedCommandType.DEPTH_ONLY_BACK_FACE),n[a++]=DerivedCommandType.OPAQUE_FRONT_FACE,n[a++]=d):(i||(n[a++]=DerivedCommandType.DEPTH_ONLY_FRONT_FACE),n[a++]=DerivedCommandType.OPAQUE_BACK_FACE,n[a++]=u),a}function removeDefine(e,t){var i=e.indexOf(t);-1<i&&e.splice(i,1)}function hasDefine(e,t){return-1<e.indexOf(t)}function getOpaqueFrontFaceShaderProgram(e,t){removeDefine(e.defines,"TRANSLUCENT"),removeDefine(t.defines,"TRANSLUCENT")}function getOpaqueBackFaceShaderProgram(e,t){removeDefine(e.defines,"GROUND_ATMOSPHERE"),removeDefine(t.defines,"GROUND_ATMOSPHERE"),removeDefine(e.defines,"FOG"),removeDefine(t.defines,"FOG"),removeDefine(e.defines,"TRANSLUCENT"),removeDefine(t.defines,"TRANSLUCENT")}function getDepthOnlyShaderProgram$1(e,t){hasDefine(t.defines,"TILE_LIMIT_RECTANGLE")||hasDefine(t.defines,"ENABLE_CLIPPING_PLANES")||(t.sources=["void main() \n{ \n gl_FragColor = vec4(1.0); \n} \n"])}function getTranslucentShaderProgram(e,t){for(var i=t.sources,r=i.length,n=0;n<r;++n)i[n]=ShaderSource.replaceMain(i[n],"czm_globe_translucency_main");i.push("\n\nuniform sampler2D u_classificationTexture; \nvoid main() \n{ \n vec2 st = gl_FragCoord.xy / czm_viewport.zw; \n#ifdef MANUAL_DEPTH_TEST \n float logDepthOrDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, st)); \n if (logDepthOrDepth != 0.0) \n { \n vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); \n float depthEC = eyeCoordinate.z / eyeCoordinate.w; \n if (v_positionEC.z < depthEC) \n { \n discard; \n } \n } \n#endif \n czm_globe_translucency_main(); \n vec4 classificationColor = texture2D(u_classificationTexture, st); \n if (classificationColor.a > 0.0) \n { \n // Reverse premultiplication process to get the correct composited result of the classification primitives \n classificationColor.rgb /= classificationColor.a; \n } \n gl_FragColor = classificationColor * vec4(classificationColor.aaa, 1.0) + gl_FragColor * (1.0 - classificationColor.a); \n} \n")}function getTranslucentBackFaceShaderProgram(e,t){getTranslucentShaderProgram(e,t),removeDefine(e.defines,"GROUND_ATMOSPHERE"),removeDefine(t.defines,"GROUND_ATMOSPHERE"),removeDefine(e.defines,"FOG"),removeDefine(t.defines,"FOG")}function getTranslucentFrontFaceManualDepthTestShaderProgram(e,t){getTranslucentShaderProgram(e,t),e.defines.push("GENERATE_POSITION"),t.defines.push("MANUAL_DEPTH_TEST")}function getTranslucentBackFaceManualDepthTestShaderProgram(e,t){getTranslucentBackFaceShaderProgram(e,t),e.defines.push("GENERATE_POSITION"),t.defines.push("MANUAL_DEPTH_TEST")}function getPickShaderProgram$1(e,t){t.sources=["uniform sampler2D u_classificationTexture; \nvoid main() \n{ \n vec2 st = gl_FragCoord.xy / czm_viewport.zw; \n vec4 pickColor = texture2D(u_classificationTexture, st); \n if (pickColor == vec4(0.0)) \n { \n discard; \n } \n gl_FragColor = pickColor; \n} \n"]}function getDerivedShaderProgram(e,t,i,r,n,a){if(!defined(n))return t;if(!r&&defined(i))return i;var o,s,l,c=e.shaderCache.getDerivedShaderProgram(t,a);return defined(c)||(o=t._attributeLocations,s=t.vertexShaderSource.clone(),l=t.fragmentShaderSource.clone(),s.defines=defined(s.defines)?s.defines.slice(0):[],l.defines=defined(l.defines)?l.defines.slice(0):[],n(s,l),c=e.shaderCache.createDerivedShaderProgram(t,a,{vertexShaderSource:s,fragmentShaderSource:l,attributeLocations:o})),c}function getOpaqueFrontFaceRenderState(e){e.cull.face=CullFace$1.BACK,e.cull.enabled=!0}function getOpaqueBackFaceRenderState(e){e.cull.face=CullFace$1.FRONT,e.cull.enabled=!0}function getDepthOnlyFrontFaceRenderState(e){e.cull.face=CullFace$1.BACK,e.cull.enabled=!0,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function getDepthOnlyBackFaceRenderState(e){e.cull.face=CullFace$1.FRONT,e.cull.enabled=!0,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function getDepthOnlyFrontAndBackFaceRenderState(e){e.cull.enabled=!1,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function getTranslucentFrontFaceRenderState(e){e.cull.face=CullFace$1.BACK,e.cull.enabled=!0,e.depthMask=!1,e.blending=BlendingState$1.ALPHA_BLEND}function getTranslucentBackFaceRenderState(e){e.cull.face=CullFace$1.FRONT,e.cull.enabled=!0,e.depthMask=!1,e.blending=BlendingState$1.ALPHA_BLEND}function getPickFrontFaceRenderState(e){e.cull.face=CullFace$1.BACK,e.cull.enabled=!0,e.blending.enabled=!1}function getPickBackFaceRenderState(e){e.cull.face=CullFace$1.FRONT,e.cull.enabled=!0,e.blending.enabled=!1}function getDerivedRenderState(e,t,i,r,n){if(!defined(r))return e;if(!i&&defined(t))return t;var a,o=n[e.id];return defined(o)||(r(a=RenderState.getState(e)),o=RenderState.fromCache(a),n[e.id]=o),o}function getTranslucencyUniformMap(e){return{u_classificationTexture:function(){return e._globeTranslucencyFramebuffer.classificationTexture}}}function getDerivedUniformMap(e,t,i,r,n){return defined(n)?!r&&defined(i)?i:combine(t,n(e),!1):t}function DerivedCommandPack(e){this.pass=e.pass,this.pickOnly=e.pickOnly,this.getShaderProgramFunction=e.getShaderProgramFunction,this.getRenderStateFunction=e.getRenderStateFunction,this.getUniformMapFunction=e.getUniformMapFunction,this.renderStateCache={}}function createDerivedCommandPacks(){return[new DerivedCommandPack({pass:Pass$1.GLOBE,pickOnly:!1,getShaderProgramFunction:getOpaqueFrontFaceShaderProgram,getRenderStateFunction:getOpaqueFrontFaceRenderState,getUniformMapFunction:void 0}),new DerivedCommandPack({pass:Pass$1.GLOBE,pickOnly:!1,getShaderProgramFunction:getOpaqueBackFaceShaderProgram,getRenderStateFunction:getOpaqueBackFaceRenderState,getUniformMapFunction:void 0}),new DerivedCommandPack({pass:Pass$1.GLOBE,pickOnly:!1,getShaderProgramFunction:getDepthOnlyShaderProgram$1,getRenderStateFunction:getDepthOnlyFrontFaceRenderState,getUniformMapFunction:void 0}),new DerivedCommandPack({pass:Pass$1.GLOBE,pickOnly:!1,getShaderProgramFunction:getDepthOnlyShaderProgram$1,getRenderStateFunction:getDepthOnlyBackFaceRenderState,getUniformMapFunction:void 0}),new DerivedCommandPack({pass:Pass$1.GLOBE,pickOnly:!1,getShaderProgramFunction:getDepthOnlyShaderProgram$1,getRenderStateFunction:getDepthOnlyFrontAndBackFaceRenderState,getUniformMapFunction:void 0}),new DerivedCommandPack({pass:Pass$1.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:getTranslucentShaderProgram,getRenderStateFunction:getTranslucentFrontFaceRenderState,getUniformMapFunction:getTranslucencyUniformMap}),new DerivedCommandPack({pass:Pass$1.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:getTranslucentBackFaceShaderProgram,getRenderStateFunction:getTranslucentBackFaceRenderState,getUniformMapFunction:getTranslucencyUniformMap}),new DerivedCommandPack({pass:Pass$1.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:getTranslucentFrontFaceManualDepthTestShaderProgram,getRenderStateFunction:getTranslucentFrontFaceRenderState,getUniformMapFunction:getTranslucencyUniformMap}),new DerivedCommandPack({pass:Pass$1.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:getTranslucentBackFaceManualDepthTestShaderProgram,getRenderStateFunction:getTranslucentBackFaceRenderState,getUniformMapFunction:getTranslucencyUniformMap}),new DerivedCommandPack({pass:Pass$1.TRANSLUCENT,pickOnly:!0,getShaderProgramFunction:getPickShaderProgram$1,getRenderStateFunction:getPickFrontFaceRenderState,getUniformMapFunction:getTranslucencyUniformMap}),new DerivedCommandPack({pass:Pass$1.TRANSLUCENT,pickOnly:!0,getShaderProgramFunction:getPickShaderProgram$1,getRenderStateFunction:getPickBackFaceRenderState,getUniformMapFunction:getTranslucencyUniformMap})]}Object.defineProperties(GlobeTranslucencyState.prototype,{frontFaceAlphaByDistance:{get:function(){return this._frontFaceAlphaByDistance}},backFaceAlphaByDistance:{get:function(){return this._backFaceAlphaByDistance}},translucent:{get:function(){return this._frontFaceTranslucent}},sunVisibleThroughGlobe:{get:function(){return this._sunVisibleThroughGlobe}},environmentVisible:{get:function(){return this._environmentVisible}},useDepthPlane:{get:function(){return this._useDepthPlane}},numberOfTextureUniforms:{get:function(){return this._numberOfTextureUniforms}},rectangle:{get:function(){return this._rectangle}}}),GlobeTranslucencyState.prototype.update=function(e){var t=e.globe;if(!defined(t)||!t.show)return this._frontFaceTranslucent=!1,this._backFaceTranslucent=!1,this._sunVisibleThroughGlobe=!0,this._environmentVisible=!0,void(this._useDepthPlane=!1);this._frontFaceAlphaByDistance=updateAlphaByDistance(t.translucency.enabled,t.translucency.frontFaceAlpha,t.translucency.frontFaceAlphaByDistance,this._frontFaceAlphaByDistance),this._backFaceAlphaByDistance=updateAlphaByDistance(t.translucency.enabled,t.translucency.backFaceAlpha,t.translucency.backFaceAlphaByDistance,this._backFaceAlphaByDistance),this._frontFaceTranslucent=isFaceTranslucent(t.translucency.enabled,this._frontFaceAlphaByDistance,t),this._backFaceTranslucent=isFaceTranslucent(t.translucency.enabled,this._backFaceAlphaByDistance,t),this._requiresManualDepthTest=requiresManualDepthTest(this,e,t),this._sunVisibleThroughGlobe=isSunVisibleThroughGlobe(this,e),this._environmentVisible=isEnvironmentVisible(this,e),this._useDepthPlane=useDepthPlane(this,e),this._numberOfTextureUniforms=getNumberOfTextureUniforms(this),this._rectangle=Rectangle.clone(t.translucency.rectangle,this._rectangle),gatherDerivedCommandRequirements(this,e)};var derivedCommandNames=new Array(derivedCommandsMaximumLength),derivedCommandPacks=new Array(derivedCommandsMaximumLength);function updateDerivedCommands(e,t,i,r,n,a,o){var s=t.derivedCommands.globeTranslucency,l=e._derivedCommandsDirty;if(t.dirty||!defined(s)||l){t.dirty=!1,defined(s)||(s={},t.derivedCommands.globeTranslucency=s);var c=o.frameNumber,u=defaultValue(s.uniformMapDirtyFrame,0),d=defaultValue(s.shaderProgramDirtyFrame,0),h=defaultValue(s.renderStateDirtyFrame,0),p=s.uniformMap!==t.uniformMap,m=s.shaderProgramId!==t.shaderProgram.id,f=s.renderStateId!==t.renderState.id;p&&(s.uniformMapDirtyFrame=c),m&&(s.shaderProgramDirtyFrame=c),f&&(s.renderStateDirtyFrame=c),s.uniformMap=t.uniformMap,s.shaderProgramId=t.shaderProgram.id,s.renderStateId=t.renderState.id;for(var g=0;g<i;++g){var _,y,v=a[g],C=r[g],S=n[g],T=defined(x=s[S])?(_=x.uniformMap,y=x.shaderProgram,x.renderState):y=_=void 0,x=DrawCommand.shallowClone(t,x),b=defaultValue((s[S]=x).derivedCommands.uniformMapDirtyFrame,0),E=defaultValue(x.derivedCommands.shaderProgramDirtyFrame,0),P=defaultValue(x.derivedCommands.renderStateDirtyFrame,0),A=p||b<u,w=m||E<d,D=f||P<h;A&&(x.derivedCommands.uniformMapDirtyFrame=c),w&&(x.derivedCommands.shaderProgramDirtyFrame=c),D&&(x.derivedCommands.renderStateDirtyFrame=c),x.derivedCommands.type=C,x.pass=v.pass,x.pickOnly=v.pickOnly,x.uniformMap=getDerivedUniformMap(e,t.uniformMap,_,A,v.getUniformMapFunction),x.shaderProgram=getDerivedShaderProgram(o.context,t.shaderProgram,y,w,v.getShaderProgramFunction,S),x.renderState=getDerivedRenderState(t.renderState,T,D,v.getRenderStateFunction,v.renderStateCache)}}}function executeCommandsMatchingType(e,t,i,r,n,a,o){for(var s=0;s<t;++s){var l=e[s],c=l.derivedCommands.type;(!defined(o)||-1<o.indexOf(c))&&i(l,r,n,a)}}function executeCommands(e,t,i,r,n,a){for(var o=0;o<t;++o)i(e[o],r,n,a)}GlobeTranslucencyState.prototype.updateDerivedCommands=function(e,t){var i=this._derivedCommandTypesToUpdate,r=this._derivedCommandsToUpdateLength;if(0!==r){for(var n=0;n<r;++n)derivedCommandPacks[n]=this._derivedCommandPacks[i[n]],derivedCommandNames[n]=DerivedCommandNames[i[n]];updateDerivedCommands(this,e,r,i,derivedCommandNames,derivedCommandPacks,t)}},GlobeTranslucencyState.prototype.pushDerivedCommands=function(e,t,i){var r=i.passes.pick;if(!r||!t){var n=this._derivedCommandTypes,a=this._derivedCommandsLength;if(r?(n=this._derivedPickCommandTypes,a=this._derivedPickCommandsLength):t&&(n=this._derivedBlendCommandTypes,a=this._derivedBlendCommandsLength),0!==a)for(var o=e.derivedCommands.globeTranslucency,s=0;s<a;++s){var l=DerivedCommandNames[n[s]];i.commandList.push(o[l])}else i.commandList.push(e)}};var opaqueTypes=[DerivedCommandType.OPAQUE_FRONT_FACE,DerivedCommandType.OPAQUE_BACK_FACE],depthOnlyTypes=[DerivedCommandType.DEPTH_ONLY_FRONT_FACE,DerivedCommandType.DEPTH_ONLY_BACK_FACE,DerivedCommandType.DEPTH_ONLY_FRONT_AND_BACK_FACE];function GoogleEarthEnterpriseDiscardPolicy(){this._image=new Image}function GoogleEarthEnterpriseImageryProvider(e){var i;e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0,i=defined(e.metadata)?e.metadata:new GoogleEarthEnterpriseMetadata(Resource.createIfNeeded(e.url)),this._metadata=i,this._tileDiscardPolicy=e.tileDiscardPolicy,this._tilingScheme=new GeographicTilingScheme({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new Rectangle(-CesiumMath.PI,-CesiumMath.PI,CesiumMath.PI,CesiumMath.PI),ellipsoid:e.ellipsoid});var t=e.credit;"string"==typeof t&&(t=new Credit(t)),this._credit=t,this._tileWidth=256,this._tileHeight=256,this._maximumLevel=23,defined(this._tileDiscardPolicy)||(this._tileDiscardPolicy=new GoogleEarthEnterpriseDiscardPolicy),this._errorEvent=new Event,this._ready=!1;var r,n=this;this._readyPromise=i.readyPromise.then(function(e){if(i.imageryPresent)return TileProviderError.handleSuccess(r),n._ready=e;var t=new RuntimeError("The server "+i.url+" doesn't have imagery");return r=TileProviderError.handleError(r,n,n._errorEvent,t.message,void 0,void 0,void 0,t),when.reject(t)}).otherwise(function(e){return r=TileProviderError.handleError(r,n,n._errorEvent,e.message,void 0,void 0,void 0,e),when.reject(e)})}function buildImageResource$2(e,t,i,r,n,a){var o=GoogleEarthEnterpriseMetadata.tileXYToQuadKey(i,r,n),s=defined(s=t.imageryVersion)&&0<s?s:1;return e._metadata.resource.getDerivedResource({url:"flatfile?f1-0"+o+"-i."+s.toString(),request:a})}function getImageType(e){var t="JFIF";if(e[6]===t.charCodeAt(0)&&e[7]===t.charCodeAt(1)&&e[8]===t.charCodeAt(2)&&e[9]===t.charCodeAt(3))return"image/jpeg";return e[1]==="PNG".charCodeAt(0)&&e[2]==="PNG".charCodeAt(1)&&e[3]==="PNG".charCodeAt(2)?"image/png":void 0}function decodeEarthImageryPacket(e){for(var t=protobuf.Reader.create(e),i=t.len,r={};t.pos<i;){var n=t.uint32();switch(n>>>3){case 1:r.imageType=t.uint32();break;case 2:r.imageData=t.bytes();break;case 3:r.alphaType=t.uint32();break;case 4:r.imageAlpha=t.bytes();break;case 5:var a=r.copyrightIds;if(defined(a)||(a=r.copyrightIds=[]),2==(7&n))for(var o=t.uint32()+t.pos;t.pos<o;)a.push(t.uint32());else a.push(t.uint32());break;default:t.skipType(7&n)}}var s=r.imageType;if(defined(s))switch(s){case 0:r.imageType="image/jpeg";break;case 4:r.imageType="image/png";break;default:throw new RuntimeError("GoogleEarthEnterpriseImageryProvider: Unsupported image type.")}var l=r.alphaType;return defined(l)&&0!==l&&(console.log("GoogleEarthEnterpriseImageryProvider: External alpha not supported."),delete r.alphaType,delete r.imageAlpha),r}function GoogleEarthEnterpriseMapsProvider(a){a=defaultValue(a,{}),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=1.9,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var e=a.url,t=defaultValue(a.path,"/default_map"),i=Resource.createIfNeeded(e).getDerivedResource({url:"/"===t[0]?t.substring(1):t});i.appendForwardSlash(),this._resource=i,this._url=e,this._path=t,this._tileDiscardPolicy=a.tileDiscardPolicy,this._channel=a.channel,this._requestType="ImageryMaps",this._credit=new Credit('<a href="http://www.google.com/enterprise/mapsearth/products/earthenterprise.html"><img src="'+GoogleEarthEnterpriseMapsProvider.logoUrl+'" title="Google Imagery"/></a>'),this._tilingScheme=void 0,this._version=void 0,this._tileWidth=256,this._tileHeight=256,this._maximumLevel=a.maximumLevel,this._errorEvent=new Event,this._ready=!1,this._readyPromise=when.defer();var o,r=i.getDerivedResource({url:"query",queryParameters:{request:"Json",vars:"geeServerDefs",is2d:"t"}}),s=this;function n(t){var i,e;try{i=JSON.parse(t)}catch(e){i=JSON.parse(t.replace(/([\[\{,])[\n\r ]*([A-Za-z0-9]+)[\n\r ]*:/g,'$1"$2":'))}for(var r,n=0;n<i.layers.length;n++)if(i.layers[n].id===s._channel){e=i.layers[n];break}if(!defined(e))throw r="Could not find layer with channel (id) of "+s._channel+".",o=TileProviderError.handleError(o,s,s._errorEvent,r,void 0,void 0,void 0,c),new RuntimeError(r);if(!defined(e.version))throw r="Could not find a version in channel (id) "+s._channel+".",o=TileProviderError.handleError(o,s,s._errorEvent,r,void 0,void 0,void 0,c),new RuntimeError(r);if(s._version=e.version,defined(i.projection)&&"flat"===i.projection)s._tilingScheme=new GeographicTilingScheme({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new Rectangle(-Math.PI,-Math.PI,Math.PI,Math.PI),ellipsoid:a.ellipsoid});else{if(defined(i.projection)&&"mercator"!==i.projection)throw r="Unsupported projection "+i.projection+".",o=TileProviderError.handleError(o,s,s._errorEvent,r,void 0,void 0,void 0,c),new RuntimeError(r);s._tilingScheme=new WebMercatorTilingScheme({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,ellipsoid:a.ellipsoid})}s._ready=!0,s._readyPromise.resolve(!0),TileProviderError.handleSuccess(o)}function l(e){var t="An error occurred while accessing "+r.url+".";o=TileProviderError.handleError(o,s,s._errorEvent,t,void 0,void 0,void 0,c),s._readyPromise.reject(new RuntimeError(t))}function c(){when(r.fetchText(),n,l)}c()}GlobeTranslucencyState.prototype.executeGlobeCommands=function(e,t,i,r,n){var a=r.context,o=e.commands[Pass$1.GLOBE],s=e.indices[Pass$1.GLOBE];0!==s&&((this._globeTranslucencyFramebuffer=i).clearClassification(a,n),executeCommandsMatchingType(o,s,t,r,a,n,opaqueTypes))},GlobeTranslucencyState.prototype.executeGlobeClassificationCommands=function(e,t,i,r,n){var a,o,s,l,c,u=r.context,d=e.commands[Pass$1.GLOBE],h=e.indices[Pass$1.GLOBE],p=e.commands[Pass$1.TERRAIN_CLASSIFICATION],m=e.indices[Pass$1.TERRAIN_CLASSIFICATION];0!==h&&0!==m&&(a=this._frontFaceTranslucent,o=this._backFaceTranslucent,a&&o||executeCommands(p,m,t,r,u,n),(a||o)&&(this._globeTranslucencyFramebuffer=i,s=u.uniformState.globeDepthTexture,l=n.framebuffer,n.framebuffer=i.classificationFramebuffer,executeCommandsMatchingType(d,h,t,r,u,n,depthOnlyTypes),u.depthTexture&&(c=i.packDepth(u,n),u.uniformState.globeDepthTexture=c),executeCommands(p,m,t,r,u,n),u.uniformState.globeDepthTexture=s,n.framebuffer=l))},GoogleEarthEnterpriseDiscardPolicy.prototype.isReady=function(){return!0},GoogleEarthEnterpriseDiscardPolicy.prototype.shouldDiscardImage=function(e){return e===this._image},Object.defineProperties(GoogleEarthEnterpriseImageryProvider.prototype,{url:{get:function(){return this._metadata.url}},proxy:{get:function(){return this._metadata.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!1}}}),GoogleEarthEnterpriseImageryProvider.prototype.getTileCredits=function(e,t,i){var r=this._metadata,n=r.getTileInformation(e,t,i);if(defined(n)){var a=r.providers[n.imageryProvider];if(defined(a))return[a]}},GoogleEarthEnterpriseImageryProvider.prototype.requestImage=function(e,t,i,r){var a=this._tileDiscardPolicy._image,o=this._metadata,n=GoogleEarthEnterpriseMetadata.tileXYToQuadKey(e,t,i),s=o.getTileInformation(e,t,i);if(!defined(s)){if(o.isValid(n)){var l=new Request({throttle:r.throttle,throttleByServer:r.throttleByServer,type:r.type,priorityFunction:r.priorityFunction});return void o.populateSubtree(e,t,i,l)}return a}if(!s.hasImagery())return a;var c=buildImageResource$2(this,s,e,t,i,r).fetchArrayBuffer();return defined(c)?c.then(function(e){decodeGoogleEarthEnterpriseData(o.key,e);var t,i,r=new Uint8Array(e),n=o.protoImagery;return defined(n)&&n||(i=getImageType(r)),defined(i)||defined(n)&&!n||(i=(t=decodeEarthImageryPacket(r)).imageType,r=t.imageData),defined(i)&&defined(r)?loadImageFromTypedArray({uint8Array:r,format:i,flipY:!0}):a}):void 0},GoogleEarthEnterpriseImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){},Object.defineProperties(GoogleEarthEnterpriseMapsProvider.prototype,{url:{get:function(){return this._url}},path:{get:function(){return this._path}},proxy:{get:function(){return this._resource.proxy}},channel:{get:function(){return this._channel}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},version:{get:function(){return this._version}},requestType:{get:function(){return this._requestType}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}}}),GoogleEarthEnterpriseMapsProvider.prototype.getTileCredits=function(e,t,i){},GoogleEarthEnterpriseMapsProvider.prototype.requestImage=function(e,t,i,r){var n=this._resource.getDerivedResource({url:"query",request:r,queryParameters:{request:this._requestType,channel:this._channel,version:this._version,x:e,y:t,z:i+1}});return ImageryProvider.loadImage(this,n)},GoogleEarthEnterpriseMapsProvider.prototype.pickFeatures=function(e,t,i,r,n){},GoogleEarthEnterpriseMapsProvider._logoUrl=void 0,Object.defineProperties(GoogleEarthEnterpriseMapsProvider,{logoUrl:{get:function(){return defined(GoogleEarthEnterpriseMapsProvider._logoUrl)||(GoogleEarthEnterpriseMapsProvider._logoUrl=buildModuleUrl("Assets/Images/google_earth_credit.png")),GoogleEarthEnterpriseMapsProvider._logoUrl},set:function(e){GoogleEarthEnterpriseMapsProvider._logoUrl=e}}});var defaultColor$8=new Color(1,1,1,.4),defaultGlowColor=new Color(0,1,0,.05),defaultBackgroundColor$2=new Color(0,.5,0,.2);function GridImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0,this._tilingScheme=defined(e.tilingScheme)?e.tilingScheme:new GeographicTilingScheme({ellipsoid:e.ellipsoid}),this._cells=defaultValue(e.cells,8),this._color=defaultValue(e.color,defaultColor$8),this._glowColor=defaultValue(e.glowColor,defaultGlowColor),this._glowWidth=defaultValue(e.glowWidth,6),this._backgroundColor=defaultValue(e.backgroundColor,defaultBackgroundColor$2),this._errorEvent=new Event,this._tileWidth=defaultValue(e.tileWidth,256),this._tileHeight=defaultValue(e.tileHeight,256),this._canvasSize=defaultValue(e.canvasSize,256),this._canvas=this._createGridCanvas(),this._readyPromise=when.resolve(!0)}function InvertClassification(){this.previousFramebuffer=void 0,this._previousFramebuffer=void 0,this._texture=void 0,this._classifiedTexture=void 0,this._depthStencilTexture=void 0,this._fbo=void 0,this._fboClassified=void 0,this._rsUnclassified=void 0,this._rsClassified=void 0,this._unclassifiedCommand=void 0,this._classifiedCommand=void 0,this._translucentCommand=void 0,this._clearColorCommand=new ClearCommand({color:new Color(0,0,0,0),owner:this}),this._clearCommand=new ClearCommand({color:new Color(0,0,0,0),depth:1,stencil:0});var e=this;this._uniformMap={colorTexture:function(){return e._texture},depthTexture:function(){return e._depthStencilTexture},classifiedTexture:function(){return e._classifiedTexture}}}Object.defineProperties(GridImageryProvider.prototype,{proxy:{get:function(){}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){}},minimumLevel:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return!0}},readyPromise:{get:function(){return this._readyPromise}},credit:{get:function(){}},hasAlphaChannel:{get:function(){return!0}}}),GridImageryProvider.prototype._drawGrid=function(e){for(var t=this._canvasSize,i=0;i<=this._cells;++i){var r=1+i/this._cells*(t-1);e.moveTo(r,0),e.lineTo(r,t),e.moveTo(0,r),e.lineTo(t,r)}e.stroke()},GridImageryProvider.prototype._createGridCanvas=function(){var e=document.createElement("canvas");e.width=this._canvasSize,e.height=this._canvasSize;var t=this._canvasSize,i=e.getContext("2d"),r=this._backgroundColor.toCssColorString();i.fillStyle=r,i.fillRect(0,0,t,t);var n=this._glowColor.toCssColorString();i.strokeStyle=n,i.lineWidth=this._glowWidth,i.strokeRect(0,0,t,t),this._drawGrid(i),i.lineWidth=.5*this._glowWidth,i.strokeRect(0,0,t,t),this._drawGrid(i);var a=this._color.toCssColorString();return i.strokeStyle=a,i.lineWidth=2,i.strokeRect(0,0,t,t),i.lineWidth=1,this._drawGrid(i),e},GridImageryProvider.prototype.getTileCredits=function(e,t,i){},GridImageryProvider.prototype.requestImage=function(e,t,i,r){return this._canvas},GridImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){},Object.defineProperties(InvertClassification.prototype,{unclassifiedCommand:{get:function(){return this._unclassifiedCommand}}}),InvertClassification.isTranslucencySupported=function(e){return e.depthTexture&&e.fragmentDepth};var rsUnclassified={depthMask:!1,stencilTest:{enabled:!0,frontFunction:StencilFunction$1.EQUAL,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.KEEP},backFunction:StencilFunction$1.NEVER,reference:0,mask:StencilConstants$1.CLASSIFICATION_MASK},blending:BlendingState$1.ALPHA_BLEND},rsClassified={depthMask:!1,stencilTest:{enabled:!0,frontFunction:StencilFunction$1.NOT_EQUAL,frontOperation:{fail:StencilOperation$1.KEEP,zFail:StencilOperation$1.KEEP,zPass:StencilOperation$1.KEEP},backFunction:StencilFunction$1.NEVER,reference:0,mask:StencilConstants$1.CLASSIFICATION_MASK},blending:BlendingState$1.ALPHA_BLEND},rsDefault={depthMask:!0,depthTest:{enabled:!0},stencilTest:StencilConstants$1.setCesium3DTileBit(),stencilMask:StencilConstants$1.CESIUM_3D_TILE_MASK,blending:BlendingState$1.ALPHA_BLEND},translucentFS="#extension GL_EXT_frag_depth : enable\nuniform sampler2D colorTexture;\nuniform sampler2D depthTexture;\nuniform sampler2D classifiedTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\n vec4 color = texture2D(colorTexture, v_textureCoordinates);\n if (color.a == 0.0)\n {\n discard;\n }\n bool isClassified = all(equal(texture2D(classifiedTexture, v_textureCoordinates), vec4(0.0)));\n#ifdef UNCLASSIFIED\n vec4 highlightColor = czm_invertClassificationColor;\n if (isClassified)\n {\n discard;\n }\n#else\n vec4 highlightColor = vec4(1.0);\n if (!isClassified)\n {\n discard;\n }\n#endif\n gl_FragColor = color * highlightColor;\n gl_FragDepthEXT = texture2D(depthTexture, v_textureCoordinates).r;\n}\n",opaqueFS="uniform sampler2D colorTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\n vec4 color = texture2D(colorTexture, v_textureCoordinates);\n if (color.a == 0.0)\n {\n discard;\n }\n#ifdef UNCLASSIFIED\n gl_FragColor = color * czm_invertClassificationColor;\n#else\n gl_FragColor = color;\n#endif\n}\n";InvertClassification.prototype.update=function(e){var t=this._texture,i=!defined(t)||this.previousFramebuffer!==this._previousFramebuffer;this._previousFramebuffer=this.previousFramebuffer;var r,n,a,o,s,l=e.drawingBufferWidth,c=e.drawingBufferHeight,u=!defined(t)||t.width!==l||t.height!==c;(u||i)&&(this._texture=this._texture&&this._texture.destroy(),this._classifiedTexture=this._classifiedTexture&&this._classifiedTexture.destroy(),this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),this._texture=new Texture({context:e,width:l,height:c,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:TextureMinificationFilter$1.LINEAR,magnificationFilter:TextureMagnificationFilter$1.LINEAR})}),defined(this._previousFramebuffer)||(this._classifiedTexture=new Texture({context:e,width:l,height:c,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:TextureMinificationFilter$1.LINEAR,magnificationFilter:TextureMagnificationFilter$1.LINEAR})}),this._depthStencilTexture=new Texture({context:e,width:l,height:c,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8}))),defined(this._fbo)&&!u&&!i||(this._fbo=this._fbo&&this._fbo.destroy(),this._fboClassified=this._fboClassified&&this._fboClassified.destroy(),defined(this._previousFramebuffer)?(r=this._previousFramebuffer.depthStencilTexture,n=this._previousFramebuffer.depthStencilRenderbuffer):r=this._depthStencilTexture,this._fbo=new Framebuffer({context:e,colorTextures:[this._texture],depthStencilTexture:r,depthStencilRenderbuffer:n,destroyAttachments:!1}),defined(this._previousFramebuffer)||(this._fboClassified=new Framebuffer({context:e,colorTextures:[this._classifiedTexture],depthStencilTexture:r,destroyAttachments:!1}))),defined(this._rsUnclassified)||(this._rsUnclassified=RenderState.fromCache(rsUnclassified),this._rsClassified=RenderState.fromCache(rsClassified),this._rsDefault=RenderState.fromCache(rsDefault)),defined(this._unclassifiedCommand)&&!i||(defined(this._unclassifiedCommand)&&(this._unclassifiedCommand.shaderProgram=this._unclassifiedCommand.shaderProgram&&this._unclassifiedCommand.shaderProgram.destroy(),this._classifiedCommand.shaderProgram=this._classifiedCommand.shaderProgram&&this._classifiedCommand.shaderProgram.destroy()),o=new ShaderSource({defines:["UNCLASSIFIED"],sources:[a=defined(this._previousFramebuffer)?opaqueFS:translucentFS]}),s=new ShaderSource({sources:[a]}),this._unclassifiedCommand=e.createViewportQuadCommand(o,{renderState:defined(this._previousFramebuffer)?this._rsUnclassified:this._rsDefault,uniformMap:this._uniformMap,owner:this}),this._classifiedCommand=e.createViewportQuadCommand(s,{renderState:defined(this._previousFramebuffer)?this._rsClassified:this._rsDefault,uniformMap:this._uniformMap,owner:this}),defined(this._translucentCommand)&&(this._translucentCommand.shaderProgram=this._translucentCommand.shaderProgram&&this._translucentCommand.shaderProgram.destroy()),defined(this._previousFramebuffer)||(this._translucentCommand=e.createViewportQuadCommand(PassThrough,{renderState:this._rsUnclassified,uniformMap:this._uniformMap,owner:this})))},InvertClassification.prototype.clear=function(e,t){var i=t.framebuffer;defined(this._previousFramebuffer)?(t.framebuffer=this._fbo,this._clearColorCommand.execute(e,t)):(t.framebuffer=this._fbo,this._clearCommand.execute(e,t),t.framebuffer=this._fboClassified,this._clearCommand.execute(e,t)),t.framebuffer=i},InvertClassification.prototype.executeClassified=function(e,t){var i;defined(this._previousFramebuffer)||(i=t.framebuffer,t.framebuffer=this._fboClassified,this._translucentCommand.execute(e,t),t.framebuffer=i),this._classifiedCommand.execute(e,t)},InvertClassification.prototype.executeUnclassified=function(e,t){this._unclassifiedCommand.execute(e,t)},InvertClassification.prototype.isDestroyed=function(){return!1},InvertClassification.prototype.destroy=function(){return this._fbo=this._fbo&&this._fbo.destroy(),this._texture=this._texture&&this._texture.destroy(),this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),defined(this._unclassifiedCommand)&&(this._unclassifiedCommand.shaderProgram=this._unclassifiedCommand.shaderProgram&&this._unclassifiedCommand.shaderProgram.destroy(),this._classifiedCommand.shaderProgram=this._classifiedCommand.shaderProgram&&this._classifiedCommand.shaderProgram.destroy()),destroyObject(this)};var templateRegex=/{[^}]+}/g,tags={x:xTag,y:yTag,z:zTag,s:sTag,reverseX:reverseXTag,reverseY:reverseYTag,reverseZ:reverseZTag,westDegrees:westDegreesTag,southDegrees:southDegreesTag,eastDegrees:eastDegreesTag,northDegrees:northDegreesTag,westProjected:westProjectedTag,southProjected:southProjectedTag,eastProjected:eastProjectedTag,northProjected:northProjectedTag,width:widthTag,height:heightTag},pickFeaturesTags=combine(tags,{i:iTag,j:jTag,reverseI:reverseITag,reverseJ:reverseJTag,longitudeDegrees:longitudeDegreesTag,latitudeDegrees:latitudeDegreesTag,longitudeProjected:longitudeProjectedTag,latitudeProjected:latitudeProjectedTag,format:formatTag});function UrlTemplateImageryProvider(e){this._errorEvent=new Event,this._resource=void 0,this._urlSchemeZeroPadding=void 0,this._pickFeaturesResource=void 0,this._tileWidth=void 0,this._tileHeight=void 0,this._maximumLevel=void 0,this._minimumLevel=void 0,this._tilingScheme=void 0,this._rectangle=void 0,this._tileDiscardPolicy=void 0,this._credit=void 0,this._hasAlphaChannel=void 0,this._readyPromise=void 0,this._tags=void 0,this._pickFeaturesTags=void 0,this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0,this.enablePickFeatures=!0,this.reinitialize(e)}Object.defineProperties(UrlTemplateImageryProvider.prototype,{url:{get:function(){return this._resource.url}},urlSchemeZeroPadding:{get:function(){return this._urlSchemeZeroPadding}},pickFeaturesUrl:{get:function(){return this._pickFeaturesResource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return this._minimumLevel}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return defined(this._resource)}},readyPromise:{get:function(){return this._readyPromise}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return this._hasAlphaChannel}}}),UrlTemplateImageryProvider.prototype.reinitialize=function(e){var s=this;s._readyPromise=when(e).then(function(e){var t=e.customTags,i=combine(tags,t),r=combine(pickFeaturesTags,t),n=Resource.createIfNeeded(e.url),a=Resource.createIfNeeded(e.pickFeaturesUrl);s.enablePickFeatures=defaultValue(e.enablePickFeatures,s.enablePickFeatures),s._urlSchemeZeroPadding=defaultValue(e.urlSchemeZeroPadding,s.urlSchemeZeroPadding),s._tileDiscardPolicy=e.tileDiscardPolicy,s._getFeatureInfoFormats=e.getFeatureInfoFormats,s._subdomains=e.subdomains,Array.isArray(s._subdomains)?s._subdomains=s._subdomains.slice():defined(s._subdomains)&&0<s._subdomains.length?s._subdomains=s._subdomains.split(""):s._subdomains=["a","b","c"],s._tileWidth=defaultValue(e.tileWidth,256),s._tileHeight=defaultValue(e.tileHeight,256),s._minimumLevel=defaultValue(e.minimumLevel,0),s._maximumLevel=e.maximumLevel,s._tilingScheme=defaultValue(e.tilingScheme,new WebMercatorTilingScheme({ellipsoid:e.ellipsoid})),s._rectangle=defaultValue(e.rectangle,s._tilingScheme.rectangle),s._rectangle=Rectangle.intersection(s._rectangle,s._tilingScheme.rectangle),s._hasAlphaChannel=defaultValue(e.hasAlphaChannel,!0);var o=e.credit;return"string"==typeof o&&(o=new Credit(o)),s._credit=o,s._resource=n,s._tags=i,s._pickFeaturesResource=a,s._pickFeaturesTags=r,!0})},UrlTemplateImageryProvider.prototype.getTileCredits=function(e,t,i){},UrlTemplateImageryProvider.prototype.requestImage=function(e,t,i,r){return ImageryProvider.loadImage(this,buildImageResource$3(this,e,t,i,r))},UrlTemplateImageryProvider.prototype.pickFeatures=function(r,n,a,o,s){if(this.enablePickFeatures&&defined(this._pickFeaturesResource)&&0!==this._getFeatureInfoFormats.length){var l=0,c=this;return function e(){if(l>=c._getFeatureInfoFormats.length)return when([]);var t=c._getFeatureInfoFormats[l],i=buildPickFeaturesResource(c,r,n,a,o,s,t.format);return++l,"json"===t.type?i.fetchJson().then(t.callback).otherwise(e):"xml"===t.type?i.fetchXML().then(t.callback).otherwise(e):"text"===t.type||"html"===t.type?i.fetchText().then(t.callback).otherwise(e):i.fetch({responseType:t.format}).then(function(e,t){return e.callback(t)}.bind(void 0,t)).otherwise(e)}()}};var degreesScratchComputed=!1,degreesScratch=new Rectangle,projectedScratchComputed=!1,projectedScratch=new Rectangle;function buildImageResource$3(i,r,n,a,e){projectedScratchComputed=degreesScratchComputed=!1;var t=i._resource,o=t.getUrlComponent(!0),s=i._tags,l={},c=o.match(templateRegex);return defined(c)&&c.forEach(function(e){var t=e.substring(1,e.length-1);defined(s[t])&&(l[t]=s[t](i,r,n,a))}),t.getDerivedResource({request:e,templateValues:l})}var ijScratchComputed=!1,ijScratch=new Cartesian2,longitudeLatitudeProjectedScratchComputed=!1;function buildPickFeaturesResource(i,r,n,a,o,s,l){longitudeLatitudeProjectedScratchComputed=ijScratchComputed=projectedScratchComputed=degreesScratchComputed=!1;var e=i._pickFeaturesResource,t=e.getUrlComponent(!0),c=i._pickFeaturesTags,u={},d=t.match(templateRegex);return defined(d)&&d.forEach(function(e){var t=e.substring(1,e.length-1);defined(c[t])&&(u[t]=c[t](i,r,n,a,o,s,l))}),e.getDerivedResource({templateValues:u})}function padWithZerosIfNecessary(e,t,i){var r,n;return e&&e.urlSchemeZeroPadding&&e.urlSchemeZeroPadding.hasOwnProperty(t)&&("string"!=typeof(r=e.urlSchemeZeroPadding[t])||1<(n=r.length)&&(i=i.length>=n?i:new Array(n-i.toString().length+1).join("0")+i)),i}function xTag(e,t,i,r){return padWithZerosIfNecessary(e,"{x}",t)}function reverseXTag(e,t,i,r){var n=e.tilingScheme.getNumberOfXTilesAtLevel(r)-t-1;return padWithZerosIfNecessary(e,"{reverseX}",n)}function yTag(e,t,i,r){return padWithZerosIfNecessary(e,"{y}",i)}function reverseYTag(e,t,i,r){var n=e.tilingScheme.getNumberOfYTilesAtLevel(r)-i-1;return padWithZerosIfNecessary(e,"{reverseY}",n)}function reverseZTag(e,t,i,r){var n=e.maximumLevel;return padWithZerosIfNecessary(e,"{reverseZ}",defined(n)&&r<n?n-r-1:r)}function zTag(e,t,i,r){return padWithZerosIfNecessary(e,"{z}",r)}function sTag(e,t,i,r){var n=(t+i+r)%e._subdomains.length;return e._subdomains[n]}function computeDegrees(e,t,i,r){degreesScratchComputed||(e.tilingScheme.tileXYToRectangle(t,i,r,degreesScratch),degreesScratch.west=CesiumMath.toDegrees(degreesScratch.west),degreesScratch.south=CesiumMath.toDegrees(degreesScratch.south),degreesScratch.east=CesiumMath.toDegrees(degreesScratch.east),degreesScratch.north=CesiumMath.toDegrees(degreesScratch.north),degreesScratchComputed=!0)}function westDegreesTag(e,t,i,r){return computeDegrees(e,t,i,r),degreesScratch.west}function southDegreesTag(e,t,i,r){return computeDegrees(e,t,i,r),degreesScratch.south}function eastDegreesTag(e,t,i,r){return computeDegrees(e,t,i,r),degreesScratch.east}function northDegreesTag(e,t,i,r){return computeDegrees(e,t,i,r),degreesScratch.north}function computeProjected(e,t,i,r){projectedScratchComputed||(e.tilingScheme.tileXYToNativeRectangle(t,i,r,projectedScratch),projectedScratchComputed=!0)}function westProjectedTag(e,t,i,r){return computeProjected(e,t,i,r),projectedScratch.west}function southProjectedTag(e,t,i,r){return computeProjected(e,t,i,r),projectedScratch.south}function eastProjectedTag(e,t,i,r){return computeProjected(e,t,i,r),projectedScratch.east}function northProjectedTag(e,t,i,r){return computeProjected(e,t,i,r),projectedScratch.north}function widthTag(e,t,i,r){return e.tileWidth}function heightTag(e,t,i,r){return e.tileHeight}function iTag(e,t,i,r,n,a,o){return computeIJ(e,t,i,r,n,a),ijScratch.x}function jTag(e,t,i,r,n,a,o){return computeIJ(e,t,i,r,n,a),ijScratch.y}function reverseITag(e,t,i,r,n,a,o){return computeIJ(e,t,i,r,n,a),e.tileWidth-ijScratch.x-1}function reverseJTag(e,t,i,r,n,a,o){return computeIJ(e,t,i,r,n,a),e.tileHeight-ijScratch.y-1}var rectangleScratch$6=new Rectangle,longitudeLatitudeProjectedScratch=new Cartesian3;function computeIJ(e,t,i,r,n,a,o){var s,l;ijScratchComputed||(computeLongitudeLatitudeProjected(e,t,i,r,n,a),s=longitudeLatitudeProjectedScratch,l=e.tilingScheme.tileXYToNativeRectangle(t,i,r,rectangleScratch$6),ijScratch.x=e.tileWidth*(s.x-l.west)/l.width|0,ijScratch.y=e.tileHeight*(l.north-s.y)/l.height|0,ijScratchComputed=!0)}function longitudeDegreesTag(e,t,i,r,n,a,o){return CesiumMath.toDegrees(n)}function latitudeDegreesTag(e,t,i,r,n,a,o){return CesiumMath.toDegrees(a)}function longitudeProjectedTag(e,t,i,r,n,a,o){return computeLongitudeLatitudeProjected(e,t,i,r,n,a),longitudeLatitudeProjectedScratch.x}function latitudeProjectedTag(e,t,i,r,n,a,o){return computeLongitudeLatitudeProjected(e,t,i,r,n,a),longitudeLatitudeProjectedScratch.y}var cartographicScratch$4=new Cartographic;function computeLongitudeLatitudeProjected(e,t,i,r,n,a,o){var s;longitudeLatitudeProjectedScratchComputed||(e.tilingScheme.projection instanceof GeographicProjection?(longitudeLatitudeProjectedScratch.x=CesiumMath.toDegrees(n),longitudeLatitudeProjectedScratch.y=CesiumMath.toDegrees(a)):((s=cartographicScratch$4).longitude=n,s.latitude=a,e.tilingScheme.projection.project(s,longitudeLatitudeProjectedScratch)),longitudeLatitudeProjectedScratchComputed=!0)}function formatTag(e,t,i,r,n,a,o){return o}function TileMapServiceImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t,i=when.defer();UrlTemplateImageryProvider.call(this,i.promise),this._tmsResource=void 0,this._xmlResource=void 0,this._options=e,this._deferred=i,this._metadataError=void 0,this._metadataSuccess=this._metadataSuccess.bind(this),this._metadataFailure=this._metadataFailure.bind(this),this._requestMetadata=this._requestMetadata.bind(this);var r=this;when(e.url).then(function(e){(t=Resource.createIfNeeded(e)).appendForwardSlash(),r._tmsResource=t,r._xmlResource=t.getDerivedResource({url:"tilemapresource.xml"}),r._requestMetadata()}).otherwise(function(e){i.reject(e)})}function confineRectangleToTilingScheme(e,t){return e.west<t.rectangle.west&&(e.west=t.rectangle.west),e.east>t.rectangle.east&&(e.east=t.rectangle.east),e.south<t.rectangle.south&&(e.south=t.rectangle.south),e.north>t.rectangle.north&&(e.north=t.rectangle.north),e}function calculateSafeMinimumDetailLevel(e,t,i){var r=e.positionToTileXY(Rectangle.southwest(t),i),n=e.positionToTileXY(Rectangle.northeast(t),i);return 4<(Math.abs(n.x-r.x)+1)*(Math.abs(n.y-r.y)+1)?0:i}defined(Object.create)&&(TileMapServiceImageryProvider.prototype=Object.create(UrlTemplateImageryProvider.prototype),TileMapServiceImageryProvider.prototype.constructor=TileMapServiceImageryProvider),TileMapServiceImageryProvider.prototype._requestMetadata=function(){this._xmlResource.fetchXML().then(this._metadataSuccess).otherwise(this._metadataFailure)},TileMapServiceImageryProvider.prototype._metadataSuccess=function(e){for(var t,i,r,n,a=/tileformat/i,o=/tileset/i,s=/tilesets/i,l=/boundingbox/i,c=[],u=this._xmlResource,d=this._metadataError,h=this._deferred,p=this._requestMetadata,m=e.childNodes[0].childNodes,f=0;f<m.length;f++)if(a.test(m.item(f).nodeName))t=m.item(f);else if(s.test(m.item(f).nodeName)){r=m.item(f);for(var g=m.item(f).childNodes,_=0;_<g.length;_++)o.test(g.item(_).nodeName)&&c.push(g.item(_))}else l.test(m.item(f).nodeName)&&(i=m.item(f));if(!defined(r)||!defined(i))return n="Unable to find expected tilesets or bbox attributes in "+u.url+".",(d=TileProviderError.handleError(d,this,this.errorEvent,n,void 0,void 0,void 0,p)).retry||h.reject(new RuntimeError(n)),void(this._metadataError=d);var y=this._options,v=defaultValue(y.fileExtension,t.getAttribute("extension")),C=defaultValue(y.tileWidth,parseInt(t.getAttribute("width"),10)),S=defaultValue(y.tileHeight,parseInt(t.getAttribute("height"),10)),T=defaultValue(y.minimumLevel,parseInt(c[0].getAttribute("order"),10)),x=defaultValue(y.maximumLevel,parseInt(c[c.length-1].getAttribute("order"),10)),b=r.getAttribute("profile"),E=y.tilingScheme;if(!defined(E))if("geodetic"===b||"global-geodetic"===b)E=new GeographicTilingScheme({ellipsoid:y.ellipsoid});else{if("mercator"!==b&&"global-mercator"!==b)return n=u.url+"specifies an unsupported profile attribute, "+b+".",(d=TileProviderError.handleError(d,this,this.errorEvent,n,void 0,void 0,void 0,p)).retry||h.reject(new RuntimeError(n)),void(this._metadataError=d);E=new WebMercatorTilingScheme({ellipsoid:y.ellipsoid})}var P,A,w,D,M,I,R=Rectangle.clone(y.rectangle);defined(R)||(A=defaultValue(y.flipXY,!1)?(P=new Cartesian2(parseFloat(i.getAttribute("miny")),parseFloat(i.getAttribute("minx"))),new Cartesian2(parseFloat(i.getAttribute("maxy")),parseFloat(i.getAttribute("maxx")))):(P=new Cartesian2(parseFloat(i.getAttribute("minx")),parseFloat(i.getAttribute("miny"))),new Cartesian2(parseFloat(i.getAttribute("maxx")),parseFloat(i.getAttribute("maxy")))),w="geodetic"===b||"mercator"===b,I=E.projection instanceof GeographicProjection||w?(M=Cartographic.fromDegrees(P.x,P.y),Cartographic.fromDegrees(A.x,A.y)):(M=(D=E.projection).unproject(P),D.unproject(A)),R=new Rectangle(M.longitude,M.latitude,I.longitude,I.latitude)),T=calculateSafeMinimumDetailLevel(E,R=confineRectangleToTilingScheme(R,E),T);var O=this._tmsResource.getDerivedResource({url:"{z}/{x}/{reverseY}."+v});h.resolve({url:O,tilingScheme:E,rectangle:R,tileWidth:C,tileHeight:S,minimumLevel:T,maximumLevel:x,tileDiscardPolicy:y.tileDiscardPolicy,credit:y.credit})},TileMapServiceImageryProvider.prototype._metadataFailure=function(e){var t=this._options,i=defaultValue(t.fileExtension,"png"),r=defaultValue(t.tileWidth,256),n=defaultValue(t.tileHeight,256),a=t.maximumLevel,o=defined(t.tilingScheme)?t.tilingScheme:new WebMercatorTilingScheme({ellipsoid:t.ellipsoid}),s=defaultValue(t.rectangle,o.rectangle),l=calculateSafeMinimumDetailLevel(o,s=confineRectangleToTilingScheme(s,o),t.maximumLevel),c=this._tmsResource.getDerivedResource({url:"{z}/{x}/{reverseY}."+i});this._deferred.resolve({url:c,tilingScheme:o,rectangle:s,tileWidth:r,tileHeight:n,minimumLevel:l,maximumLevel:a,tileDiscardPolicy:t.tileDiscardPolicy,credit:t.credit})};var trailingSlashRegex=/\/$/,defaultCredit$1=new Credit('© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback/">Improve this map</a></strong>');function MapboxImageryProvider(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).mapId,i=MapboxApi.getAccessToken(e.accessToken);this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var r=Resource.createIfNeeded(defaultValue(e.url,"https://{s}.tiles.mapbox.com/v4/"));this._mapId=t,this._accessToken=i;var n=defaultValue(e.format,"png");/\./.test(n)||(n="."+n),this._format=n;var a,o=r.getUrlComponent();trailingSlashRegex.test(o)||(o+="/"),o+=t+"/{z}/{x}/{y}"+this._format,r.url=o,r.setQueryParameters({access_token:i}),defined(e.credit)?"string"==typeof(a=e.credit)&&(a=new Credit(a)):a=defaultCredit$1,this._resource=r,this._imageryProvider=new UrlTemplateImageryProvider({url:r,credit:a,ellipsoid:e.ellipsoid,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,rectangle:e.rectangle})}function SingleTileImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var i=Resource.createIfNeeded(e.url),t=new GeographicTilingScheme({rectangle:defaultValue(e.rectangle,Rectangle.MAX_VALUE),numberOfLevelZeroTilesX:1,numberOfLevelZeroTilesY:1,ellipsoid:e.ellipsoid});this._tilingScheme=t,this._resource=i,this._image=void 0,this._texture=void 0,this._tileWidth=0,this._tileHeight=0,this._errorEvent=new Event,this._ready=!1,this._readyPromise=when.defer();var r=e.credit;"string"==typeof r&&(r=new Credit(r)),this._credit=r;var n,a=this;function o(e){a._image=e,a._tileWidth=e.width,a._tileHeight=e.height,a._ready=!0,a._readyPromise.resolve(!0),TileProviderError.handleSuccess(a._errorEvent)}function s(e){var t="Failed to load image "+i.url+".";n=TileProviderError.handleError(n,a,a._errorEvent,t,0,0,0,l,e),a._readyPromise.reject(new RuntimeError(t))}function l(){ImageryProvider.loadImage(null,i).then(o).otherwise(s)}l()}function TimeDynamicImagery(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._tileCache={},this._tilesRequestedForInterval=[];var t=this._clock=e.clock;this._times=e.times,this._requestImageFunction=e.requestImageFunction,this._reloadFunction=e.reloadFunction,this._currentIntervalIndex=-1,t.onTick.addEventListener(this._clockOnTick,this),this._clockOnTick(t)}function getKey$1(e,t,i){return e+"-"+t+"-"+i}function getKeyElements(e){var t=e.split("-");if(3===t.length)return{x:Number(t[0]),y:Number(t[1]),level:Number(t[2])}}function getApproachingInterval(e){var t=e._times;if(defined(t)){var i=e._clock,r=i.currentTime,n=i.canAnimate&&i.shouldAnimate,a=i.multiplier;if(n||0===a){var o,s=t.indexOf(r);if(!(s<0)){var l=t.get(s);return 0<a?(o=JulianDate.secondsDifference(l.stop,r),++s):(o=JulianDate.secondsDifference(l.start,r),--s),o/=a,0<=s&&o<=5?t.get(s):void 0}}}}function addToCache(e,t,i){var r=e._times.indexOf(i.start),n=e._tileCache,a=n[r];defined(a)||(a=n[r]={});var o=t.key;if(defined(a[o]))return!0;var s=getKeyElements(o),l=new Request({throttle:!0,throttleByServer:!0,type:RequestType$1.IMAGERY,priorityFunction:t.priorityFunction}),c=e._requestImageFunction(s.x,s.y,s.level,l,i);return!!defined(c)&&(a[o]={promise:c,request:l},!0)}function WebMapServiceImageryProvider(e){if(defined((e=defaultValue(e,defaultValue.EMPTY_OBJECT)).times)&&!defined(e.clock))throw new DeveloperError("options.times was specified, so options.clock is required.");this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var t=Resource.createIfNeeded(e.url),i=t.clone();t.setQueryParameters(WebMapServiceImageryProvider.DefaultParameters,!0),i.setQueryParameters(WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters,!0),defined(e.parameters)&&t.setQueryParameters(objectToLowercase(e.parameters)),defined(e.getFeatureInfoParameters)&&i.setQueryParameters(objectToLowercase(e.getFeatureInfoParameters));var a=this;this._reload=void 0,defined(e.times)&&(this._timeDynamicImagery=new TimeDynamicImagery({clock:e.clock,times:e.times,requestImageFunction:function(e,t,i,r,n){return requestImage(a,e,t,i,r,n)},reloadFunction:function(){defined(a._reload)&&a._reload()}}));var r={};r.layers=e.layers,r.bbox="{westProjected},{southProjected},{eastProjected},{northProjected}",r.width="{width}",r.height="{height}",1.3<=parseFloat(t.queryParameters.version)?r.crs=defaultValue(e.crs,e.tilingScheme&&e.tilingScheme.projection instanceof WebMercatorProjection?"EPSG:3857":"CRS:84"):r.srs=defaultValue(e.srs,e.tilingScheme&&e.tilingScheme.projection instanceof WebMercatorProjection?"EPSG:3857":"EPSG:4326"),t.setQueryParameters(r,!0),i.setQueryParameters(r,!0);var n={query_layers:e.layers,x:"{i}",y:"{j}",info_format:"{format}"};i.setQueryParameters(n,!0),this._resource=t,this._pickFeaturesResource=i,this._layers=e.layers,this._tileProvider=new UrlTemplateImageryProvider({url:t,pickFeaturesUrl:i,tilingScheme:defaultValue(e.tilingScheme,new GeographicTilingScheme({ellipsoid:e.ellipsoid})),rectangle:e.rectangle,tileWidth:e.tileWidth,tileHeight:e.tileHeight,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,subdomains:e.subdomains,tileDiscardPolicy:e.tileDiscardPolicy,credit:e.credit,getFeatureInfoFormats:defaultValue(e.getFeatureInfoFormats,WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats),enablePickFeatures:e.enablePickFeatures})}function requestImage(e,t,i,r,n,a){var o=defined(a)?a.data:void 0,s=e._tileProvider;return defined(o)&&s._resource.setQueryParameters(o),s.requestImage(t,i,r,n)}function pickFeatures(e,t,i,r,n,a,o){var s=defined(o)?o.data:void 0,l=e._tileProvider;return defined(s)&&l._pickFeaturesResource.setQueryParameters(s),l.pickFeatures(t,i,r,n,a)}function objectToLowercase(e){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i.toLowerCase()]=e[i]);return t}Object.defineProperties(MapboxImageryProvider.prototype,{url:{get:function(){return this._imageryProvider.url}},ready:{get:function(){return this._imageryProvider.ready}},readyPromise:{get:function(){return this._imageryProvider.readyPromise}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._imageryProvider.errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},proxy:{get:function(){return this._imageryProvider.proxy}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}}}),MapboxImageryProvider.prototype.getTileCredits=function(e,t,i){},MapboxImageryProvider.prototype.requestImage=function(e,t,i,r){return this._imageryProvider.requestImage(e,t,i,r)},MapboxImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){return this._imageryProvider.pickFeatures(e,t,i,r,n)},MapboxImageryProvider._defaultCredit=defaultCredit$1,Object.defineProperties(SingleTileImageryProvider.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return 0}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise.promise}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}}}),SingleTileImageryProvider.prototype.getTileCredits=function(e,t,i){},SingleTileImageryProvider.prototype.requestImage=function(e,t,i,r){return this._image},SingleTileImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){},Object.defineProperties(TimeDynamicImagery.prototype,{clock:{get:function(){return this._clock},set:function(e){this._clock!==e&&(this._clock=e,this._clockOnTick(e),this._reloadFunction())}},times:{get:function(){return this._times},set:function(e){this._times!==e&&(this._times=e,this._clockOnTick(this._clock),this._reloadFunction())}},currentInterval:{get:function(){return this._times.get(this._currentIntervalIndex)}}}),TimeDynamicImagery.prototype.getFromCache=function(e,t,i,r){var n,a,o=getKey$1(e,t,i),s=this._tileCache[this._currentIntervalIndex];return defined(s)&&defined(s[o])&&(a=(n=s[o]).promise.otherwise(function(e){throw r.state=n.request.state,e}),delete s[o]),a},TimeDynamicImagery.prototype.checkApproachingInterval=function(e,t,i,r){var n=getKey$1(e,t,i),a=this._tilesRequestedForInterval,o=getApproachingInterval(this),s={key:n,priorityFunction:r.priorityFunction};defined(o)&&addToCache(this,s,o)||a.push(s),512<=a.length&&a.splice(0,256)},TimeDynamicImagery.prototype._clockOnTick=function(e){var t=e.currentTime,i=this._times.indexOf(t),r=this._currentIntervalIndex;if(i!==r){var n=this._tileCache[r];for(var a in n)n.hasOwnProperty(a)&&n[a].request.cancel();return delete this._tileCache[r],this._tilesRequestedForInterval=[],this._currentIntervalIndex=i,void this._reloadFunction()}var o=getApproachingInterval(this);if(defined(o))for(var s=this._tilesRequestedForInterval,l=!0;l&&0!==s.length;){var c=s.pop();(l=addToCache(this,c,o))||s.push(c)}},Object.defineProperties(WebMapServiceImageryProvider.prototype,{url:{get:function(){return this._resource._url}},proxy:{get:function(){return this._resource.proxy}},layers:{get:function(){return this._layers}},tileWidth:{get:function(){return this._tileProvider.tileWidth}},tileHeight:{get:function(){return this._tileProvider.tileHeight}},maximumLevel:{get:function(){return this._tileProvider.maximumLevel}},minimumLevel:{get:function(){return this._tileProvider.minimumLevel}},tilingScheme:{get:function(){return this._tileProvider.tilingScheme}},rectangle:{get:function(){return this._tileProvider.rectangle}},tileDiscardPolicy:{get:function(){return this._tileProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._tileProvider.errorEvent}},ready:{get:function(){return this._tileProvider.ready}},readyPromise:{get:function(){return this._tileProvider.readyPromise}},credit:{get:function(){return this._tileProvider.credit}},hasAlphaChannel:{get:function(){return this._tileProvider.hasAlphaChannel}},enablePickFeatures:{get:function(){return this._tileProvider.enablePickFeatures},set:function(e){this._tileProvider.enablePickFeatures=e}},clock:{get:function(){return this._timeDynamicImagery.clock},set:function(e){this._timeDynamicImagery.clock=e}},times:{get:function(){return this._timeDynamicImagery.times},set:function(e){this._timeDynamicImagery.times=e}}}),WebMapServiceImageryProvider.prototype.getTileCredits=function(e,t,i){return this._tileProvider.getTileCredits(e,t,i)},WebMapServiceImageryProvider.prototype.requestImage=function(e,t,i,r){var n,a,o=this._timeDynamicImagery;return defined(o)&&(a=o.currentInterval,n=o.getFromCache(e,t,i,r)),defined(n)||(n=requestImage(this,e,t,i,r,a)),defined(n)&&defined(o)&&o.checkApproachingInterval(e,t,i,r),n},WebMapServiceImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){var a=this._timeDynamicImagery;return pickFeatures(this,e,t,i,r,n,defined(a)?a.currentInterval:void 0)},WebMapServiceImageryProvider.DefaultParameters=Object.freeze({service:"WMS",version:"1.1.1",request:"GetMap",styles:"",format:"image/jpeg"}),WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters=Object.freeze({service:"WMS",version:"1.1.1",request:"GetFeatureInfo"}),WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats=Object.freeze([Object.freeze(new GetFeatureInfoFormat("json","application/json")),Object.freeze(new GetFeatureInfoFormat("xml","text/xml")),Object.freeze(new GetFeatureInfoFormat("text","text/html"))]);var defaultParameters=Object.freeze({service:"WMTS",version:"1.0.0",request:"GetTile"});function WebMapTileServiceImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var t,i=Resource.createIfNeeded(e.url),r=e.style,n=e.tileMatrixSetID;0<=i.url.indexOf("{")?(t={style:r,Style:r,TileMatrixSet:n},i.setTemplateValues(t),this._useKvp=!1):(i.setQueryParameters(defaultParameters),this._useKvp=!0),this._resource=i,this._layer=e.layer,this._style=r,this._tileMatrixSetID=n,this._tileMatrixLabels=e.tileMatrixLabels,this._format=defaultValue(e.format,"image/jpeg"),this._tileDiscardPolicy=e.tileDiscardPolicy,this._tilingScheme=defined(e.tilingScheme)?e.tilingScheme:new WebMercatorTilingScheme({ellipsoid:e.ellipsoid}),this._tileWidth=defaultValue(e.tileWidth,256),this._tileHeight=defaultValue(e.tileHeight,256),this._minimumLevel=defaultValue(e.minimumLevel,0),this._maximumLevel=e.maximumLevel,this._rectangle=defaultValue(e.rectangle,this._tilingScheme.rectangle),this._dimensions=e.dimensions;var a=this;this._reload=void 0,defined(e.times)&&(this._timeDynamicImagery=new TimeDynamicImagery({clock:e.clock,times:e.times,requestImageFunction:function(e,t,i,r,n){return requestImage$1(a,e,t,i,r,n)},reloadFunction:function(){defined(a._reload)&&a._reload()}})),this._readyPromise=when.resolve(!0);var o=this._tilingScheme.positionToTileXY(Rectangle.southwest(this._rectangle),this._minimumLevel),s=this._tilingScheme.positionToTileXY(Rectangle.northeast(this._rectangle),this._minimumLevel);Math.abs(s.x-o.x),Math.abs(s.y-o.y);this._errorEvent=new Event;var l=e.credit;this._credit="string"==typeof l?new Credit(l):l,this._subdomains=e.subdomains,Array.isArray(this._subdomains)?this._subdomains=this._subdomains.slice():defined(this._subdomains)&&0<this._subdomains.length?this._subdomains=this._subdomains.split(""):this._subdomains=["a","b","c"]}function requestImage$1(e,t,i,r,n,a){var o,s,l,c=e._tileMatrixLabels,u=defined(c)?c[r]:r.toString(),d=e._subdomains,h=e._dimensions,p=defined(a)?a.data:void 0;return e._useKvp?((o={}).tilematrix=u,o.layer=e._layer,o.style=e._style,o.tilerow=i,o.tilecol=t,o.tilematrixset=e._tileMatrixSetID,o.format=e._format,defined(h)&&(o=combine(o,h)),defined(p)&&(o=combine(o,p)),l=e._resource.getDerivedResource({queryParameters:o,request:n})):(s={TileMatrix:u,TileRow:i.toString(),TileCol:t.toString(),s:d[(t+i+r)%d.length]},(l=e._resource.getDerivedResource({request:n})).setTemplateValues(s),defined(h)&&l.setTemplateValues(h),defined(p)&&l.setTemplateValues(p)),ImageryProvider.loadImage(e,l)}function createFactory(t){return function(e){return new t(e)}}Object.defineProperties(WebMapTileServiceImageryProvider.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return this._minimumLevel}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},format:{get:function(){return this._format}},ready:{value:!0},readyPromise:{get:function(){return this._readyPromise}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}},clock:{get:function(){return this._timeDynamicImagery.clock},set:function(e){this._timeDynamicImagery.clock=e}},times:{get:function(){return this._timeDynamicImagery.times},set:function(e){this._timeDynamicImagery.times=e}},dimensions:{get:function(){return this._dimensions},set:function(e){this._dimensions!==e&&(this._dimensions=e,defined(this._reload)&&this._reload())}}}),WebMapTileServiceImageryProvider.prototype.getTileCredits=function(e,t,i){},WebMapTileServiceImageryProvider.prototype.requestImage=function(e,t,i,r){var n,a,o=this._timeDynamicImagery;return defined(o)&&(a=o.currentInterval,n=o.getFromCache(e,t,i,r)),defined(n)||(n=requestImage$1(this,e,t,i,r,a)),defined(n)&&defined(o)&&o.checkApproachingInterval(e,t,i,r),n},WebMapTileServiceImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){};var ImageryProviderMapping={ARCGIS_MAPSERVER:createFactory(ArcGisMapServerImageryProvider),BING:createFactory(BingMapsImageryProvider),GOOGLE_EARTH:createFactory(GoogleEarthEnterpriseMapsProvider),MAPBOX:createFactory(MapboxImageryProvider),SINGLE_TILE:createFactory(SingleTileImageryProvider),TMS:createFactory(TileMapServiceImageryProvider),URL_TEMPLATE:createFactory(UrlTemplateImageryProvider),WMS:createFactory(WebMapServiceImageryProvider),WMTS:createFactory(WebMapTileServiceImageryProvider)};function IonImageryProvider(e){var n=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).assetId;this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0,this._ready=!1,this._tileCredits=void 0,this._errorEvent=new Event;var a=this,o=IonResource._createEndpointResource(n,e),t=e.assetId.toString()+e.accessToken+e.server,i=IonImageryProvider._endpointCache[t];defined(i)||(i=o.fetchJson(),IonImageryProvider._endpointCache[t]=i),this._readyPromise=i.then(function(e){if("IMAGERY"!==e.type)return when.reject(new RuntimeError("Cesium ion asset "+n+" is not an imagery asset."));var t,i=e.externalType;if(defined(i)){var r=ImageryProviderMapping[i];if(!defined(r))return when.reject(new RuntimeError("Unrecognized Cesium ion imagery type: "+i));t=r(e.options)}else t=new TileMapServiceImageryProvider({url:new IonResource(e,o)});return a._tileCredits=IonResource.getCreditsFromEndpoint(e,o),t.errorEvent.addEventListener(function(e){(e.provider=a)._errorEvent.raiseEvent(e)}),(a._imageryProvider=t).readyPromise.then(function(){return a._ready=!0})})}Object.defineProperties(IonImageryProvider.prototype,{ready:{get:function(){return this._ready}},readyPromise:{get:function(){return this._readyPromise}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel},proxy:{get:function(){}}}}),IonImageryProvider.prototype.getTileCredits=function(e,t,i){var r=this._imageryProvider.getTileCredits(e,t,i);return defined(r)?this._tileCredits.concat(r):this._tileCredits},IonImageryProvider.prototype.requestImage=function(e,t,i,r){return this._imageryProvider.requestImage(e,t,i,r)},IonImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){return this._imageryProvider.pickFeatures(e,t,i,r,n)},IonImageryProvider._endpointCache={};var IonWorldImageryStyle={AERIAL:2,AERIAL_WITH_LABELS:3,ROAD:4},IonWorldImageryStyle$1=Object.freeze(IonWorldImageryStyle);function JobTypeBudget(e){this._total=e,this.usedThisFrame=0,this.stolenFromMeThisFrame=0,this.starvedThisFrame=!1,this.starvedLastFrame=!1}function JobScheduler(e){var t=new Array(JobType$1.NUMBER_OF_JOB_TYPES);t[JobType$1.TEXTURE]=new JobTypeBudget(defined(e)?e[JobType$1.TEXTURE]:10),t[JobType$1.PROGRAM]=new JobTypeBudget(defined(e)?e[JobType$1.PROGRAM]:10),t[JobType$1.BUFFER]=new JobTypeBudget(defined(e)?e[JobType$1.BUFFER]:30);for(var i=t.length,r=0,n=0;n<i;++n)r+=t[n].total;var a=new Array(i);for(n=0;n<i;++n)a[n]=!1;this._totalBudget=r,this._totalUsedThisFrame=0,this._budgets=t,this._executedThisFrame=a}function Light(){}Object.defineProperties(JobTypeBudget.prototype,{total:{get:function(){return this._total}}}),JobScheduler.getTimestamp=getTimestamp$1,Object.defineProperties(JobScheduler.prototype,{totalBudget:{get:function(){return this._totalBudget}}}),JobScheduler.prototype.disableThisFrame=function(){this._totalUsedThisFrame=this._totalBudget},JobScheduler.prototype.resetBudgets=function(){for(var e=this._budgets,t=e.length,i=0;i<t;++i){var r=e[i];r.starvedLastFrame=r.starvedThisFrame,r.starvedThisFrame=!1,r.usedThisFrame=0,r.stolenFromMeThisFrame=0}this._totalUsedThisFrame=0},JobScheduler.prototype.execute=function(e,t){var i,r=this._budgets,n=r[t],a=this._executedThisFrame[t];if(this._totalUsedThisFrame>=this._totalBudget&&a)return!(n.starvedThisFrame=!0);if(n.usedThisFrame+n.stolenFromMeThisFrame>=n.total){for(var o=r.length,s=0;s<o&&(!((i=r[s]).usedThisFrame+i.stolenFromMeThisFrame<i.total)||i.starvedLastFrame);++s);if(s===o&&a)return!1;a&&(n.starvedThisFrame=!0)}var l=JobScheduler.getTimestamp();e.execute();var c=JobScheduler.getTimestamp()-l;return this._totalUsedThisFrame+=c,i?i.stolenFromMeThisFrame+=c:n.usedThisFrame+=c,this._executedThisFrame[t]=!0},Object.defineProperties(Light.prototype,{color:{get:DeveloperError.throwInstantiationError},intensity:{get:DeveloperError.throwInstantiationError}});var trailingSlashRegex$1=/\/$/,defaultCredit$2=new Credit('© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback/">Improve this map</a></strong>');function MapboxStyleImageryProvider(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).styleId,i=MapboxApi.getAccessToken(e.accessToken);this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0;var r=Resource.createIfNeeded(defaultValue(e.url,"https://api.mapbox.com/styles/v1/"));this._styleId=t,this._accessToken=i;var n=defaultValue(e.tilesize,512);this._tilesize=n;var a=defaultValue(e.username,"mapbox");this._username=a;var o,s=defined(e.scaleFactor)?"@2x":"",l=r.getUrlComponent();trailingSlashRegex$1.test(l)||(l+="/"),l+=this._username+"/"+t+"/tiles/"+this._tilesize+"/{z}/{x}/{y}"+s,r.url=l,r.setQueryParameters({access_token:i}),defined(e.credit)?"string"==typeof(o=e.credit)&&(o=new Credit(o)):o=defaultCredit$2,this._resource=r,this._imageryProvider=new UrlTemplateImageryProvider({url:r,credit:o,ellipsoid:e.ellipsoid,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,rectangle:e.rectangle})}function Moon(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).textureUrl;defined(t)||(t=buildModuleUrl("Assets/Textures/moonSmall.jpg")),this.show=defaultValue(e.show,!0),this.textureUrl=t,this._ellipsoid=defaultValue(e.ellipsoid,Ellipsoid.MOON),this.onlySunLighting=defaultValue(e.onlySunLighting,!0),this._ellipsoidPrimitive=new EllipsoidPrimitive({radii:this.ellipsoid.radii,material:Material.fromType(Material.ImageType),depthTestEnabled:!1,_owner:this}),this._ellipsoidPrimitive.material.translucent=!1,this._axes=new IauOrientationAxes}Object.defineProperties(MapboxStyleImageryProvider.prototype,{url:{get:function(){return this._imageryProvider.url}},ready:{get:function(){return this._imageryProvider.ready}},readyPromise:{get:function(){return this._imageryProvider.readyPromise}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._imageryProvider.errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},proxy:{get:function(){return this._imageryProvider.proxy}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}}}),MapboxStyleImageryProvider.prototype.getTileCredits=function(e,t,i){},MapboxStyleImageryProvider.prototype.requestImage=function(e,t,i,r){return this._imageryProvider.requestImage(e,t,i,r)},MapboxStyleImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){return this._imageryProvider.pickFeatures(e,t,i,r,n)},MapboxStyleImageryProvider._defaultCredit=defaultCredit$2,Object.defineProperties(Moon.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});var icrfToFixed=new Matrix3,rotationScratch$1=new Matrix3,translationScratch=new Cartesian3,scratchCommandList$1=[];function NeverTileDiscardPolicy(e){}Moon.prototype.update=function(e){if(this.show){var t=this._ellipsoidPrimitive;t.material.uniforms.image=this.textureUrl,t.onlySunLighting=this.onlySunLighting;var i=e.time;defined(Transforms.computeIcrfToFixedMatrix(i,icrfToFixed))||Transforms.computeTemeToPseudoFixedMatrix(i,icrfToFixed);var r=this._axes.evaluate(i,rotationScratch$1);Matrix3.transpose(r,r),Matrix3.multiply(icrfToFixed,r,r);var n=Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame(i,translationScratch);Matrix3.multiplyByVector(icrfToFixed,n,n),Matrix4.fromRotationTranslation(r,n,t.modelMatrix);var a=e.commandList;return(e.commandList=scratchCommandList$1).length=0,t.update(e),e.commandList=a,1===scratchCommandList$1.length?scratchCommandList$1[0]:void 0}},Moon.prototype.isDestroyed=function(){return!1},Moon.prototype.destroy=function(){return this._ellipsoidPrimitive=this._ellipsoidPrimitive&&this._ellipsoidPrimitive.destroy(),destroyObject(this)},NeverTileDiscardPolicy.prototype.isReady=function(){return!0},NeverTileDiscardPolicy.prototype.shouldDiscardImage=function(e){return!1};var AdjustTranslucentFS="#ifdef MRT\n#extension GL_EXT_draw_buffers : enable\n#endif\nuniform vec4 u_bgColor;\nuniform sampler2D u_depthTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nif (texture2D(u_depthTexture, v_textureCoordinates).r < 1.0)\n{\n#ifdef MRT\ngl_FragData[0] = u_bgColor;\ngl_FragData[1] = vec4(u_bgColor.a);\n#else\ngl_FragColor = u_bgColor;\n#endif\nreturn;\n}\ndiscard;\n}\n",CompositeOITFS="uniform sampler2D u_opaque;\nuniform sampler2D u_accumulation;\nuniform sampler2D u_revealage;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nvec4 opaque = texture2D(u_opaque, v_textureCoordinates);\nvec4 accum = texture2D(u_accumulation, v_textureCoordinates);\nfloat r = texture2D(u_revealage, v_textureCoordinates).r;\n#ifdef MRT\nvec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a);\n#else\nvec4 transparent = vec4(accum.rgb / clamp(accum.a, 1e-4, 5e4), r);\n#endif\ngl_FragColor = (1.0 - transparent.a) * transparent + transparent.a * opaque;\nif (opaque != czm_backgroundColor)\n{\ngl_FragColor.a = 1.0;\n}\n}\n";function OIT(e){this._translucentMultipassSupport=!1,this._translucentMRTSupport=!1;var t=e.colorBufferFloat&&e.depthTexture;this._translucentMRTSupport=e.drawBuffers&&t,this._translucentMultipassSupport=!this._translucentMRTSupport&&t,this._opaqueFBO=void 0,this._opaqueTexture=void 0,this._depthStencilTexture=void 0,this._accumulationTexture=void 0,this._translucentFBO=void 0,this._alphaFBO=void 0,this._adjustTranslucentFBO=void 0,this._adjustAlphaFBO=void 0,this._opaqueClearCommand=new ClearCommand({color:new Color(0,0,0,0),owner:this}),this._translucentMRTClearCommand=new ClearCommand({color:new Color(0,0,0,1),owner:this}),this._translucentMultipassClearCommand=new ClearCommand({color:new Color(0,0,0,0),owner:this}),this._alphaClearCommand=new ClearCommand({color:new Color(1,1,1,1),owner:this}),this._translucentRenderStateCache={},this._alphaRenderStateCache={},this._compositeCommand=void 0,this._adjustTranslucentCommand=void 0,this._adjustAlphaCommand=void 0,this._viewport=new BoundingRectangle,this._rs=void 0,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHDR=!1}function destroyTextures$1(e){e._accumulationTexture=e._accumulationTexture&&!e._accumulationTexture.isDestroyed()&&e._accumulationTexture.destroy(),e._revealageTexture=e._revealageTexture&&!e._revealageTexture.isDestroyed()&&e._revealageTexture.destroy()}function destroyFramebuffers$2(e){e._translucentFBO=e._translucentFBO&&!e._translucentFBO.isDestroyed()&&e._translucentFBO.destroy(),e._alphaFBO=e._alphaFBO&&!e._alphaFBO.isDestroyed()&&e._alphaFBO.destroy(),e._adjustTranslucentFBO=e._adjustTranslucentFBO&&!e._adjustTranslucentFBO.isDestroyed()&&e._adjustTranslucentFBO.destroy(),e._adjustAlphaFBO=e._adjustAlphaFBO&&!e._adjustAlphaFBO.isDestroyed()&&e._adjustAlphaFBO.destroy()}function destroyResources$1(e){destroyTextures$1(e),destroyFramebuffers$2(e)}function updateTextures(e,t,i,r){destroyTextures$1(e),e._accumulationTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.FLOAT});var n=new Float32Array(i*r*4);e._revealageTexture=new Texture({context:t,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.FLOAT,source:{arrayBufferView:n,width:i,height:r},flipY:!1})}function updateFramebuffers$1(e,t){destroyFramebuffers$2(e);var i,r,n,a,o=WebGLConstants$1.FRAMEBUFFER_COMPLETE,s=!0;return e._translucentMRTSupport&&(e._translucentFBO=new Framebuffer({context:t,colorTextures:[e._accumulationTexture,e._revealageTexture],depthStencilTexture:e._depthStencilTexture,destroyAttachments:!1}),e._adjustTranslucentFBO=new Framebuffer({context:t,colorTextures:[e._accumulationTexture,e._revealageTexture],destroyAttachments:!1}),e._translucentFBO.status===o&&e._adjustTranslucentFBO.status===o||(destroyFramebuffers$2(e),e._translucentMRTSupport=!1)),e._translucentMRTSupport||(e._translucentFBO=new Framebuffer({context:t,colorTextures:[e._accumulationTexture],depthStencilTexture:e._depthStencilTexture,destroyAttachments:!1}),e._alphaFBO=new Framebuffer({context:t,colorTextures:[e._revealageTexture],depthStencilTexture:e._depthStencilTexture,destroyAttachments:!1}),e._adjustTranslucentFBO=new Framebuffer({context:t,colorTextures:[e._accumulationTexture],destroyAttachments:!1}),e._adjustAlphaFBO=new Framebuffer({context:t,colorTextures:[e._revealageTexture],destroyAttachments:!1}),i=e._translucentFBO.status===o,r=e._alphaFBO.status===o,n=e._adjustTranslucentFBO.status===o,a=e._adjustAlphaFBO.status===o,i&&r&&n&&a||(destroyResources$1(e),s=e._translucentMultipassSupport=!1)),s}OIT.prototype.update=function(e,t,i,r){var n,a,o,s,l,c,u,d,h;this.isSupported()&&(this._opaqueFBO=i,this._opaqueTexture=i.getColorTexture(0),this._depthStencilTexture=i.depthStencilTexture,n=this._opaqueTexture.width,a=this._opaqueTexture.height,(s=!defined(o=this._accumulationTexture)||o.width!==n||o.height!==a||r!==this._useHDR)&&updateTextures(this,e,n,a),(defined(this._translucentFBO)&&!s||updateFramebuffers$1(this,e))&&(this._useHDR=r,defined((l=this)._compositeCommand)||(c=new ShaderSource({sources:[CompositeOITFS]}),this._translucentMRTSupport&&c.defines.push("MRT"),u={u_opaque:function(){return l._opaqueTexture},u_accumulation:function(){return l._accumulationTexture},u_revealage:function(){return l._revealageTexture}},this._compositeCommand=e.createViewportQuadCommand(c,{uniformMap:u,owner:this})),defined(this._adjustTranslucentCommand)||(this._translucentMRTSupport?(c=new ShaderSource({defines:["MRT"],sources:[AdjustTranslucentFS]}),u={u_bgColor:function(){return l._translucentMRTClearCommand.color},u_depthTexture:function(){return l._depthStencilTexture}},this._adjustTranslucentCommand=e.createViewportQuadCommand(c,{uniformMap:u,owner:this})):this._translucentMultipassSupport&&(c=new ShaderSource({sources:[AdjustTranslucentFS]}),u={u_bgColor:function(){return l._translucentMultipassClearCommand.color},u_depthTexture:function(){return l._depthStencilTexture}},this._adjustTranslucentCommand=e.createViewportQuadCommand(c,{uniformMap:u,owner:this}),u={u_bgColor:function(){return l._alphaClearCommand.color},u_depthTexture:function(){return l._depthStencilTexture}},this._adjustAlphaCommand=e.createViewportQuadCommand(c,{uniformMap:u,owner:this}))),this._viewport.width=n,this._viewport.height=a,h=(d=!BoundingRectangle.equals(this._viewport,t.viewport))!==this._useScissorTest,this._useScissorTest=d,BoundingRectangle.equals(this._scissorRectangle,t.viewport)||(this._scissorRectangle=BoundingRectangle.clone(t.viewport,this._scissorRectangle),h=!0),defined(this._rs)&&BoundingRectangle.equals(this._viewport,this._rs.viewport)&&!h||(this._rs=RenderState.fromCache({viewport:this._viewport,scissorTest:{enabled:this._useScissorTest,rectangle:this._scissorRectangle}})),defined(this._compositeCommand)&&(this._compositeCommand.renderState=this._rs),this._adjustTranslucentCommand&&(this._adjustTranslucentCommand.renderState=this._rs),defined(this._adjustAlphaCommand)&&(this._adjustAlphaCommand.renderState=this._rs)))};var translucentMRTBlend={enabled:!0,color:new Color(0,0,0,0),equationRgb:BlendEquation$1.ADD,equationAlpha:BlendEquation$1.ADD,functionSourceRgb:BlendFunction$1.ONE,functionDestinationRgb:BlendFunction$1.ONE,functionSourceAlpha:BlendFunction$1.ZERO,functionDestinationAlpha:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA},translucentColorBlend={enabled:!0,color:new Color(0,0,0,0),equationRgb:BlendEquation$1.ADD,equationAlpha:BlendEquation$1.ADD,functionSourceRgb:BlendFunction$1.ONE,functionDestinationRgb:BlendFunction$1.ONE,functionSourceAlpha:BlendFunction$1.ONE,functionDestinationAlpha:BlendFunction$1.ONE},translucentAlphaBlend={enabled:!0,color:new Color(0,0,0,0),equationRgb:BlendEquation$1.ADD,equationAlpha:BlendEquation$1.ADD,functionSourceRgb:BlendFunction$1.ZERO,functionDestinationRgb:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA,functionSourceAlpha:BlendFunction$1.ZERO,functionDestinationAlpha:BlendFunction$1.ONE_MINUS_SOURCE_ALPHA};function getTranslucentRenderState$2(e,t,i,r){var n,a=i[r.id];return defined(a)||((n=RenderState.getState(r)).depthMask=!1,n.blending=t,a=RenderState.fromCache(n),i[r.id]=a),a}function getTranslucentMRTRenderState(e,t,i){return getTranslucentRenderState$2(t,translucentMRTBlend,e._translucentRenderStateCache,i)}function getTranslucentColorRenderState(e,t,i){return getTranslucentRenderState$2(t,translucentColorBlend,e._translucentRenderStateCache,i)}function getTranslucentAlphaRenderState(e,t,i){return getTranslucentRenderState$2(t,translucentAlphaBlend,e._alphaRenderStateCache,i)}var mrtShaderSource=" vec3 Ci = czm_gl_FragColor.rgb * czm_gl_FragColor.a;\n float ai = czm_gl_FragColor.a;\n float wzi = czm_alphaWeight(ai);\n gl_FragData[0] = vec4(Ci * wzi, ai);\n gl_FragData[1] = vec4(ai * wzi);\n",colorShaderSource=" vec3 Ci = czm_gl_FragColor.rgb * czm_gl_FragColor.a;\n float ai = czm_gl_FragColor.a;\n float wzi = czm_alphaWeight(ai);\n gl_FragColor = vec4(Ci, ai) * wzi;\n",alphaShaderSource=" float ai = czm_gl_FragColor.a;\n gl_FragColor = vec4(ai);\n";function getTranslucentShaderProgram$1(e,t,i,r){var n,a,o=e.shaderCache.getDerivedShaderProgram(t,i);return defined(o)||(n=t._attributeLocations,(a=t.fragmentShaderSource.clone()).sources=a.sources.map(function(e){return e=(e=(e=(e=ShaderSource.replaceMain(e,"czm_translucent_main")).replace(/gl_FragColor/g,"czm_gl_FragColor")).replace(/\bdiscard\b/g,"czm_discard = true")).replace(/czm_phong/g,"czm_translucentPhong")}),a.sources.splice(0,0,(-1!==r.indexOf("gl_FragData")?"#extension GL_EXT_draw_buffers : enable \n":"")+"vec4 czm_gl_FragColor;\nbool czm_discard = false;\n"),a.sources.push("void main()\n{\n czm_translucent_main();\n if (czm_discard)\n {\n discard;\n }\n"+r+"}\n"),o=e.shaderCache.createDerivedShaderProgram(t,i,{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:a,attributeLocations:n})),o}function getTranslucentMRTShaderProgram(e,t){return getTranslucentShaderProgram$1(e,t,"translucentMRT",mrtShaderSource)}function getTranslucentColorShaderProgram(e,t){return getTranslucentShaderProgram$1(e,t,"translucentMultipass",colorShaderSource)}function getTranslucentAlphaShaderProgram(e,t){return getTranslucentShaderProgram$1(e,t,"alphaMultipass",alphaShaderSource)}function executeTranslucentCommandsSortedMultipass(e,t,i,r,n,a){var o,s,l=t.context,c=t.frameState.useLogDepth,u=t._hdr,d=r.framebuffer,h=n.length,p=t.frameState.shadowState.lightShadowsEnabled;r.framebuffer=e._adjustTranslucentFBO,e._adjustTranslucentCommand.execute(l,r),r.framebuffer=e._adjustAlphaFBO,e._adjustAlphaCommand.execute(l,r);var m=e._opaqueFBO;for(r.framebuffer=e._translucentFBO,s=0;s<h;++s)o=n[s],o=c?o.derivedCommands.logDepth.command:o,o=u?o.derivedCommands.hdr.command:o,i(p&&o.receiveShadows?o.derivedCommands.oit.shadows.translucentCommand:o.derivedCommands.oit.translucentCommand,t,l,r,m);for(defined(a)&&(o=a.unclassifiedCommand,i(p&&o.receiveShadows?o.derivedCommands.oit.shadows.translucentCommand:o.derivedCommands.oit.translucentCommand,t,l,r,m)),r.framebuffer=e._alphaFBO,s=0;s<h;++s)o=n[s],o=c?o.derivedCommands.logDepth.command:o,o=u?o.derivedCommands.hdr.command:o,i(p&&o.receiveShadows?o.derivedCommands.oit.shadows.alphaCommand:o.derivedCommands.oit.alphaCommand,t,l,r,m);defined(a)&&(o=a.unclassifiedCommand,i(p&&o.receiveShadows?o.derivedCommands.oit.shadows.alphaCommand:o.derivedCommands.oit.alphaCommand,t,l,r,m)),r.framebuffer=d}function executeTranslucentCommandsSortedMRT(e,t,i,r,n,a){var o=t.context,s=t.frameState.useLogDepth,l=t._hdr,c=r.framebuffer,u=n.length,d=t.frameState.shadowState.lightShadowsEnabled;r.framebuffer=e._adjustTranslucentFBO,e._adjustTranslucentCommand.execute(o,r);var h,p=e._opaqueFBO;r.framebuffer=e._translucentFBO;for(var m=0;m<u;++m)h=n[m],h=s?h.derivedCommands.logDepth.command:h,h=l?h.derivedCommands.hdr.command:h,i(d&&h.receiveShadows?h.derivedCommands.oit.shadows.translucentCommand:h.derivedCommands.oit.translucentCommand,t,o,r,p);defined(a)&&(h=a.unclassifiedCommand,i(d&&h.receiveShadows?h.derivedCommands.oit.shadows.translucentCommand:h.derivedCommands.oit.translucentCommand,t,o,r,p)),r.framebuffer=c}OIT.prototype.createDerivedCommands=function(e,t,i){var r,n,a,o,s,l;return defined(i)||(i={}),this._translucentMRTSupport?(defined(i.translucentCommand)&&(r=i.translucentCommand.shaderProgram,n=i.translucentCommand.renderState),i.translucentCommand=DrawCommand.shallowClone(e,i.translucentCommand),defined(r)&&i.shaderProgramId===e.shaderProgram.id?(i.translucentCommand.shaderProgram=r,i.translucentCommand.renderState=n):(i.translucentCommand.shaderProgram=getTranslucentMRTShaderProgram(t,e.shaderProgram),i.translucentCommand.renderState=getTranslucentMRTRenderState(this,t,e.renderState),i.shaderProgramId=e.shaderProgram.id)):(defined(i.translucentCommand)&&(a=i.translucentCommand.shaderProgram,o=i.translucentCommand.renderState,s=i.alphaCommand.shaderProgram,l=i.alphaCommand.renderState),i.translucentCommand=DrawCommand.shallowClone(e,i.translucentCommand),i.alphaCommand=DrawCommand.shallowClone(e,i.alphaCommand),defined(a)&&i.shaderProgramId===e.shaderProgram.id?(i.translucentCommand.shaderProgram=a,i.translucentCommand.renderState=o,i.alphaCommand.shaderProgram=s,i.alphaCommand.renderState=l):(i.translucentCommand.shaderProgram=getTranslucentColorShaderProgram(t,e.shaderProgram),i.translucentCommand.renderState=getTranslucentColorRenderState(this,t,e.renderState),i.alphaCommand.shaderProgram=getTranslucentAlphaShaderProgram(t,e.shaderProgram),i.alphaCommand.renderState=getTranslucentAlphaRenderState(this,t,e.renderState),i.shaderProgramId=e.shaderProgram.id)),i},OIT.prototype.executeCommands=function(e,t,i,r,n){(this._translucentMRTSupport?executeTranslucentCommandsSortedMRT:executeTranslucentCommandsSortedMultipass)(this,e,t,i,r,n)},OIT.prototype.execute=function(e,t){this._compositeCommand.execute(e,t)},OIT.prototype.clear=function(e,t,i){var r=t.framebuffer;t.framebuffer=this._opaqueFBO,Color.clone(i,this._opaqueClearCommand.color),this._opaqueClearCommand.execute(e,t),t.framebuffer=this._translucentFBO,(this._translucentMRTSupport?this._translucentMRTClearCommand:this._translucentMultipassClearCommand).execute(e,t),this._translucentMultipassSupport&&(t.framebuffer=this._alphaFBO,this._alphaClearCommand.execute(e,t)),t.framebuffer=r},OIT.prototype.isSupported=function(){return this._translucentMRTSupport||this._translucentMultipassSupport},OIT.prototype.isDestroyed=function(){return!1},OIT.prototype.destroy=function(){return destroyResources$1(this),defined(this._compositeCommand)&&(this._compositeCommand.shaderProgram=this._compositeCommand.shaderProgram&&this._compositeCommand.shaderProgram.destroy()),defined(this._adjustTranslucentCommand)&&(this._adjustTranslucentCommand.shaderProgram=this._adjustTranslucentCommand.shaderProgram&&this._adjustTranslucentCommand.shaderProgram.destroy()),defined(this._adjustAlphaCommand)&&(this._adjustAlphaCommand.shaderProgram=this._adjustAlphaCommand.shaderProgram&&this._adjustAlphaCommand.shaderProgram.destroy()),destroyObject(this)};var defaultCredit$3=new Credit("MapQuest, Open Street Map and contributors, CC-BY-SA");function OpenStreetMapImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=Resource.createIfNeeded(defaultValue(e.url,"https://a.tile.openstreetmap.org/"));t.appendForwardSlash(),t.url+="{z}/{x}/{y}."+defaultValue(e.fileExtension,"png");var i=new WebMercatorTilingScheme({ellipsoid:e.ellipsoid}),r=defaultValue(e.minimumLevel,0),n=e.maximumLevel,a=defaultValue(e.rectangle,i.rectangle),o=i.positionToTileXY(Rectangle.southwest(a),r),s=i.positionToTileXY(Rectangle.northeast(a),r),l=(Math.abs(s.x-o.x),Math.abs(s.y-o.y),defaultValue(e.credit,defaultCredit$3));"string"==typeof l&&(l=new Credit(l)),UrlTemplateImageryProvider.call(this,{url:t,credit:l,tilingScheme:i,tileWidth:256,tileHeight:256,minimumLevel:r,maximumLevel:n,rectangle:a})}defined(Object.create)&&(OpenStreetMapImageryProvider.prototype=Object.create(UrlTemplateImageryProvider.prototype),OpenStreetMapImageryProvider.prototype.constructor=OpenStreetMapImageryProvider);var defaultSize=new Cartesian2(1,1);function Particle(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.mass=defaultValue(e.mass,1),this.position=Cartesian3.clone(defaultValue(e.position,Cartesian3.ZERO)),this.velocity=Cartesian3.clone(defaultValue(e.velocity,Cartesian3.ZERO)),this.life=defaultValue(e.life,Number.MAX_VALUE),this.image=e.image,this.startColor=Color.clone(defaultValue(e.startColor,Color.WHITE)),this.endColor=Color.clone(defaultValue(e.endColor,Color.WHITE)),this.startScale=defaultValue(e.startScale,1),this.endScale=defaultValue(e.endScale,1),this.imageSize=Cartesian2.clone(defaultValue(e.imageSize,defaultSize)),this._age=0,this._normalizedAge=0,this._billboard=void 0}Object.defineProperties(Particle.prototype,{age:{get:function(){return this._age}},normalizedAge:{get:function(){return this._normalizedAge}}});var deltaScratch=new Cartesian3;function ParticleBurst(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.time=defaultValue(e.time,0),this.minimum=defaultValue(e.minimum,0),this.maximum=defaultValue(e.maximum,50),this._complete=!1}function ParticleEmitter(e){}Particle.prototype.update=function(e,t){return Cartesian3.multiplyByScalar(this.velocity,e,deltaScratch),Cartesian3.add(this.position,deltaScratch,this.position),defined(t)&&t(this,e),this._age+=e,this.life===Number.MAX_VALUE?this._normalizedAge=0:this._normalizedAge=this._age/this.life,this._age<=this.life},Object.defineProperties(ParticleBurst.prototype,{complete:{get:function(){return this._complete}}}),ParticleEmitter.prototype.emit=function(e){DeveloperError.throwInstantiationError()};var defaultImageSize=new Cartesian2(1,1);function ParticleSystem(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.show=defaultValue(e.show,!0),this.updateCallback=e.updateCallback,this.loop=defaultValue(e.loop,!0),this.image=defaultValue(e.image,void 0);var t=e.emitter;defined(t)||(t=new CircleEmitter(.5)),this._emitter=t,this._bursts=e.bursts,this._modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this._emitterModelMatrix=Matrix4.clone(defaultValue(e.emitterModelMatrix,Matrix4.IDENTITY)),this._matrixDirty=!0,this._combinedMatrix=new Matrix4,this._startColor=Color.clone(defaultValue(e.color,defaultValue(e.startColor,Color.WHITE))),this._endColor=Color.clone(defaultValue(e.color,defaultValue(e.endColor,Color.WHITE))),this._startScale=defaultValue(e.scale,defaultValue(e.startScale,1)),this._endScale=defaultValue(e.scale,defaultValue(e.endScale,1)),this._emissionRate=defaultValue(e.emissionRate,5),this._minimumSpeed=defaultValue(e.speed,defaultValue(e.minimumSpeed,1)),this._maximumSpeed=defaultValue(e.speed,defaultValue(e.maximumSpeed,1)),this._minimumParticleLife=defaultValue(e.particleLife,defaultValue(e.minimumParticleLife,5)),this._maximumParticleLife=defaultValue(e.particleLife,defaultValue(e.maximumParticleLife,5)),this._minimumMass=defaultValue(e.mass,defaultValue(e.minimumMass,1)),this._maximumMass=defaultValue(e.mass,defaultValue(e.maximumMass,1)),this._minimumImageSize=Cartesian2.clone(defaultValue(e.imageSize,defaultValue(e.minimumImageSize,defaultImageSize))),this._maximumImageSize=Cartesian2.clone(defaultValue(e.imageSize,defaultValue(e.maximumImageSize,defaultImageSize))),this._sizeInMeters=defaultValue(e.sizeInMeters,!1),this._lifetime=defaultValue(e.lifetime,Number.MAX_VALUE),this._billboardCollection=void 0,this._particles=[],this._particlePool=[],this._previousTime=void 0,this._currentTime=0,this._carryOver=0,this._complete=new Event,this._isComplete=!1,this._updateParticlePool=!0,this._particleEstimate=0}function updateParticlePool(e){var t=e._emissionRate,i=e._maximumParticleLife,r=0,n=e._bursts;if(defined(n))for(var a=n.length,o=0;o<a;++o)r+=n[o].maximum;for(var s=e._billboardCollection,l=e.image,c=Math.ceil(t*i+r),u=e._particles,d=e._particlePool,h=Math.max(c-u.length-d.length,0),p=0;p<h;++p){var m=new Particle;m._billboard=s.add({image:l}),d.push(m)}e._particleEstimate=c}function getOrCreateParticle(e){var t=e._particlePool.pop();return defined(t)||(t=new Particle),t}function addParticleToPool(e,t){e._particlePool.push(t)}function freeParticlePool(e){for(var t=e._particles,i=e._particlePool,r=e._billboardCollection,n=t.length,a=i.length,o=e._particleEstimate,s=a-Math.max(o-n-a,0),l=s;l<a;++l){var c=i[l];r.remove(c._billboard)}i.length=s}function removeBillboard(e){defined(e._billboard)&&(e._billboard.show=!1)}function updateBillboard(e,t){var i=t._billboard;defined(i)||(i=t._billboard=e._billboardCollection.add({image:t.image})),i.width=t.imageSize.x,i.height=t.imageSize.y,i.position=t.position,i.sizeInMeters=e.sizeInMeters,i.show=!0;var r=CesiumMath.lerp(t.startColor.red,t.endColor.red,t.normalizedAge),n=CesiumMath.lerp(t.startColor.green,t.endColor.green,t.normalizedAge),a=CesiumMath.lerp(t.startColor.blue,t.endColor.blue,t.normalizedAge),o=CesiumMath.lerp(t.startColor.alpha,t.endColor.alpha,t.normalizedAge);i.color=new Color(r,n,a,o),i.scale=CesiumMath.lerp(t.startScale,t.endScale,t.normalizedAge)}function addParticle(e,t){t.startColor=Color.clone(e._startColor,t.startColor),t.endColor=Color.clone(e._endColor,t.endColor),t.startScale=e._startScale,t.endScale=e._endScale,t.image=e.image,t.life=CesiumMath.randomBetween(e._minimumParticleLife,e._maximumParticleLife),t.mass=CesiumMath.randomBetween(e._minimumMass,e._maximumMass),t.imageSize.x=CesiumMath.randomBetween(e._minimumImageSize.x,e._maximumImageSize.x),t.imageSize.y=CesiumMath.randomBetween(e._minimumImageSize.y,e._maximumImageSize.y),t._normalizedAge=0,t._age=0;var i=CesiumMath.randomBetween(e._minimumSpeed,e._maximumSpeed);Cartesian3.multiplyByScalar(t.velocity,i,t.velocity),e._particles.push(t)}function calculateNumberToEmit(e,t){if(e._isComplete)return 0;var i=(t=CesiumMath.mod(t,e._lifetime))*e._emissionRate,r=Math.floor(i);if(e._carryOver+=i-r,1<e._carryOver&&(r++,--e._carryOver),defined(e.bursts))for(var n=e.bursts.length,a=0;a<n;a++){var o=e.bursts[a],s=e._currentTime;defined(o)&&!o._complete&&s>o.time&&(r+=CesiumMath.randomBetween(o.minimum,o.maximum),o._complete=!0)}return r}Object.defineProperties(ParticleSystem.prototype,{emitter:{get:function(){return this._emitter},set:function(e){this._emitter=e}},bursts:{get:function(){return this._bursts},set:function(e){this._bursts=e,this._updateParticlePool=!0}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._matrixDirty=this._matrixDirty||!Matrix4.equals(this._modelMatrix,e),Matrix4.clone(e,this._modelMatrix)}},emitterModelMatrix:{get:function(){return this._emitterModelMatrix},set:function(e){this._matrixDirty=this._matrixDirty||!Matrix4.equals(this._emitterModelMatrix,e),Matrix4.clone(e,this._emitterModelMatrix)}},startColor:{get:function(){return this._startColor},set:function(e){Color.clone(e,this._startColor)}},endColor:{get:function(){return this._endColor},set:function(e){Color.clone(e,this._endColor)}},startScale:{get:function(){return this._startScale},set:function(e){this._startScale=e}},endScale:{get:function(){return this._endScale},set:function(e){this._endScale=e}},emissionRate:{get:function(){return this._emissionRate},set:function(e){this._emissionRate=e,this._updateParticlePool=!0}},minimumSpeed:{get:function(){return this._minimumSpeed},set:function(e){this._minimumSpeed=e}},maximumSpeed:{get:function(){return this._maximumSpeed},set:function(e){this._maximumSpeed=e}},minimumParticleLife:{get:function(){return this._minimumParticleLife},set:function(e){this._minimumParticleLife=e}},maximumParticleLife:{get:function(){return this._maximumParticleLife},set:function(e){this._maximumParticleLife=e,this._updateParticlePool=!0}},minimumMass:{get:function(){return this._minimumMass},set:function(e){this._minimumMass=e}},maximumMass:{get:function(){return this._maximumMass},set:function(e){this._maximumMass=e}},minimumImageSize:{get:function(){return this._minimumImageSize},set:function(e){this._minimumImageSize=e}},maximumImageSize:{get:function(){return this._maximumImageSize},set:function(e){this._maximumImageSize=e}},sizeInMeters:{get:function(){return this._sizeInMeters},set:function(e){this._sizeInMeters=e}},lifetime:{get:function(){return this._lifetime},set:function(e){this._lifetime=e}},complete:{get:function(){return this._complete}},isComplete:{get:function(){return this._isComplete}}});var rotatedVelocityScratch=new Cartesian3;function getElement(e){return"string"==typeof e&&(e=document.getElementById(e)),e}function PerformanceDisplay(e){var t=getElement((e=defaultValue(e,defaultValue.EMPTY_OBJECT)).container);this._container=t;var i=document.createElement("div");i.className="cesium-performanceDisplay";var r=document.createElement("div");r.className="cesium-performanceDisplay-fps",this._fpsText=document.createTextNode(""),r.appendChild(this._fpsText);var n=document.createElement("div");n.className="cesium-performanceDisplay-ms",this._msText=document.createTextNode(""),n.appendChild(this._msText),i.appendChild(n),i.appendChild(r),this._container.appendChild(i),this._lastFpsSampleTime=getTimestamp$1(),this._lastMsSampleTime=getTimestamp$1(),this._fpsFrameCount=0,this._msFrameCount=0,this._throttled=!1;var a=document.createElement("div");a.className="cesium-performanceDisplay-throttled",this._throttledText=document.createTextNode(""),a.appendChild(this._throttledText),i.appendChild(a)}function PickDepth(){this._framebuffer=void 0,this._depthTexture=void 0,this._textureToCopy=void 0,this._copyDepthCommand=void 0,this._useLogDepth=void 0,this._debugPickDepthViewportCommand=void 0}function executeDebugPickDepth(e,t,i,r){var n;defined(e._debugPickDepthViewportCommand)&&r===e._useLogDepth||(n=new ShaderSource({defines:[r?"LOG_DEPTH":""],sources:["uniform sampler2D u_texture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\n float z_window = czm_unpackDepth(texture2D(u_texture, v_textureCoordinates));\n z_window = czm_reverseLogDepth(z_window); \n float n_range = czm_depthRange.near;\n float f_range = czm_depthRange.far;\n float z_ndc = (2.0 * z_window - n_range - f_range) / (f_range - n_range);\n float scale = pow(z_ndc * 0.5 + 0.5, 8.0);\n gl_FragColor = vec4(mix(vec3(0.0), vec3(1.0), scale), 1.0);\n}\n"]}),e._debugPickDepthViewportCommand=t.createViewportQuadCommand(n,{uniformMap:{u_texture:function(){return e._depthTexture}},owner:e}),e._useLogDepth=r),e._debugPickDepthViewportCommand.execute(t,i)}function destroyTextures$2(e){e._depthTexture=e._depthTexture&&!e._depthTexture.isDestroyed()&&e._depthTexture.destroy()}function destroyFramebuffers$3(e){e._framebuffer=e._framebuffer&&!e._framebuffer.isDestroyed()&&e._framebuffer.destroy()}function createTextures$2(e,t,i,r){e._depthTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE})}function createFramebuffers$2(e,t,i,r){destroyTextures$2(e),destroyFramebuffers$3(e),createTextures$2(e,t,i,r),e._framebuffer=new Framebuffer({context:t,colorTextures:[e._depthTexture],destroyAttachments:!1})}function updateFramebuffers$2(e,t,i){var r=i.width,n=i.height,a=e._depthTexture,o=!defined(a)||a.width!==r||a.height!==n;defined(e._framebuffer)&&!o||createFramebuffers$2(e,t,r,n)}function updateCopyCommands$1(e,t,i){defined(e._copyDepthCommand)||(e._copyDepthCommand=t.createViewportQuadCommand("uniform sampler2D u_texture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\n gl_FragColor = czm_packDepth(texture2D(u_texture, v_textureCoordinates).r);\n}\n",{renderState:RenderState.fromCache(),uniformMap:{u_texture:function(){return e._textureToCopy}},owner:e})),e._textureToCopy=i,e._copyDepthCommand.framebuffer=e._framebuffer}ParticleSystem.prototype.update=function(e){if(this.show){defined(this._billboardCollection)||(this._billboardCollection=new BillboardCollection),this._updateParticlePool&&(updateParticlePool(this),this._updateParticlePool=!1);var t=0;this._previousTime&&(t=JulianDate.secondsDifference(e.time,this._previousTime)),t<0&&(t=0);var i,r=this._particles,n=this._emitter,a=this.updateCallback,o=r.length;for(c=0;c<o;++c)(i=r[c]).update(t,a)?updateBillboard(this,i):(removeBillboard(i),addParticleToPool(this,i),r[c]=r[o-1],--c,--o);r.length=o;var s=calculateNumberToEmit(this,t);if(0<s&&defined(n)){this._matrixDirty&&(this._combinedMatrix=Matrix4.multiply(this.modelMatrix,this.emitterModelMatrix,this._combinedMatrix),this._matrixDirty=!1);for(var l=this._combinedMatrix,c=0;c<s;c++)i=getOrCreateParticle(this),this._emitter.emit(i),Cartesian3.add(i.position,i.velocity,rotatedVelocityScratch),Matrix4.multiplyByPoint(l,rotatedVelocityScratch,rotatedVelocityScratch),i.position=Matrix4.multiplyByPoint(l,i.position,i.position),Cartesian3.subtract(rotatedVelocityScratch,i.position,i.velocity),Cartesian3.normalize(i.velocity,i.velocity),addParticle(this,i),updateBillboard(this,i)}if(this._billboardCollection.update(e),this._previousTime=JulianDate.clone(e.time,this._previousTime),this._currentTime+=t,this._lifetime!==Number.MAX_VALUE&&this._currentTime>this._lifetime)if(this.loop){if(this._currentTime=CesiumMath.mod(this._currentTime,this._lifetime),this.bursts){var u=this.bursts.length;for(c=0;c<u;c++)this.bursts[c]._complete=!1}}else this._isComplete=!0,this._complete.raiseEvent(this);e.frameNumber%120==0&&freeParticlePool(this)}},ParticleSystem.prototype.isDestroyed=function(){return!1},ParticleSystem.prototype.destroy=function(){return this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),destroyObject(this)},Object.defineProperties(PerformanceDisplay.prototype,{throttled:{get:function(){return this._throttled},set:function(e){this._throttled!==e&&(this._throttledText.nodeValue=e?"(throttled)":"",this._throttled=e)}}}),PerformanceDisplay.prototype.update=function(e){var t=getTimestamp$1(),i=defaultValue(e,!0);this._fpsFrameCount++;var r,n=t-this._lastFpsSampleTime;1e3<n&&(r="N/A",i&&(r=1e3*this._fpsFrameCount/n|0),this._fpsText.nodeValue=r+" FPS",this._lastFpsSampleTime=t,this._fpsFrameCount=0),this._msFrameCount++;var a,o=t-this._lastMsSampleTime;200<o&&(a="N/A",i&&(a=(o/this._msFrameCount).toFixed(2)),this._msText.nodeValue=a+" MS",this._lastMsSampleTime=t,this._msFrameCount=0)},PerformanceDisplay.prototype.destroy=function(){return destroyObject(this)},PickDepth.prototype.executeDebugPickDepth=function(e,t,i){executeDebugPickDepth(this,e,t,i)},PickDepth.prototype.update=function(e,t){updateFramebuffers$2(this,e,t),updateCopyCommands$1(this,e,t)};var scratchPackedDepth=new Cartesian4,packedDepthScale=new Cartesian4(1,1/255,1/65025,1/16581375);function PickDepthFramebuffer(){this._depthStencilTexture=void 0,this._framebuffer=void 0,this._passState=void 0}function destroyResources$2(e){e._framebuffer=e._framebuffer&&e._framebuffer.destroy(),e._depthStencilTexture=e._depthStencilTexture&&e._depthStencilTexture.destroy()}function createResources$6(e,t){var i=t.drawingBufferWidth,r=t.drawingBufferHeight;e._depthStencilTexture=new Texture({context:t,width:i,height:r,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8}),e._framebuffer=new Framebuffer({context:t,depthStencilTexture:e._depthStencilTexture,destroyAttachments:!1});var n=new PassState(t);n.blendingEnabled=!1,n.scissorTest={enabled:!0,rectangle:new BoundingRectangle},n.viewport=new BoundingRectangle,e._passState=n}function PickFramebuffer(e){var t=new PassState(e);t.blendingEnabled=!1,t.scissorTest={enabled:!0,rectangle:new BoundingRectangle},t.viewport=new BoundingRectangle,this._context=e,this._fb=void 0,this._passState=t,this._width=0,this._height=0}PickDepth.prototype.getDepth=function(e,t,i){if(defined(this._framebuffer)){var r=e.readPixels({x:t,y:i,width:1,height:1,framebuffer:this._framebuffer}),n=Cartesian4.unpack(r,0,scratchPackedDepth);return Cartesian4.divideByScalar(n,255,n),Cartesian4.dot(n,packedDepthScale)}},PickDepth.prototype.executeCopyDepth=function(e,t){this._copyDepthCommand.execute(e,t)},PickDepth.prototype.isDestroyed=function(){return!1},PickDepth.prototype.destroy=function(){return destroyTextures$2(this),destroyFramebuffers$3(this),defined(this._copyDepthCommand)&&(this._copyDepthCommand.shaderProgram=defined(this._copyDepthCommand.shaderProgram)&&this._copyDepthCommand.shaderProgram.destroy()),destroyObject(this)},PickDepthFramebuffer.prototype.update=function(e,t,i){var r=i.width,n=i.height;defined(this._framebuffer)&&r===this._depthStencilTexture.width&&n===this._depthStencilTexture.height||(destroyResources$2(this),createResources$6(this,e));var a=this._framebuffer,o=this._passState;return o.framebuffer=a,o.viewport.width=r,o.viewport.height=n,o.scissorTest.rectangle.x=t.x,o.scissorTest.rectangle.y=n-t.y,o.scissorTest.rectangle.width=1,o.scissorTest.rectangle.height=1,o},PickDepthFramebuffer.prototype.isDestroyed=function(){return!1},PickDepthFramebuffer.prototype.destroy=function(){return destroyResources$2(this),destroyObject(this)},PickFramebuffer.prototype.begin=function(e,t){var i=this._context,r=t.width,n=t.height;return BoundingRectangle.clone(e,this._passState.scissorTest.rectangle),defined(this._fb)&&this._width===r&&this._height===n||(this._width=r,this._height=n,this._fb=this._fb&&this._fb.destroy(),this._fb=new Framebuffer({context:i,colorTextures:[new Texture({context:i,width:r,height:n})],depthStencilRenderbuffer:new Renderbuffer({context:i,width:r,height:n,format:RenderbufferFormat$1.DEPTH_STENCIL})}),this._passState.framebuffer=this._fb),this._passState.viewport.width=r,this._passState.viewport.height=n,this._passState};var colorScratch$7=new Color;function SceneFramebuffer(){this._colorTexture=void 0,this._idTexture=void 0,this._depthStencilTexture=void 0,this._depthStencilRenderbuffer=void 0,this._framebuffer=void 0,this._idFramebuffer=void 0,this._idClearColor=new Color(0,0,0,0),this._useHdr=void 0,this._clearCommand=new ClearCommand({color:new Color(0,0,0,0),depth:1,owner:this})}function destroyResources$3(e){e._framebuffer=e._framebuffer&&e._framebuffer.destroy(),e._idFramebuffer=e._idFramebuffer&&e._idFramebuffer.destroy(),e._colorTexture=e._colorTexture&&e._colorTexture.destroy(),e._idTexture=e._idTexture&&e._idTexture.destroy(),e._depthStencilTexture=e._depthStencilTexture&&e._depthStencilTexture.destroy(),e._depthStencilRenderbuffer=e._depthStencilRenderbuffer&&e._depthStencilRenderbuffer.destroy(),e._depthStencilIdTexture=e._depthStencilIdTexture&&e._depthStencilIdTexture.destroy(),e._depthStencilIdRenderbuffer=e._depthStencilIdRenderbuffer&&e._depthStencilIdRenderbuffer.destroy(),e._framebuffer=void 0,e._idFramebuffer=void 0,e._colorTexture=void 0,e._idTexture=void 0,e._depthStencilTexture=void 0,e._depthStencilRenderbuffer=void 0,e._depthStencilIdTexture=void 0,e._depthStencilIdRenderbuffer=void 0}function ShadowMapShader(){}function ShadowMap(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).context;this._enabled=defaultValue(e.enabled,!0),this._softShadows=defaultValue(e.softShadows,!1),this._normalOffset=defaultValue(e.normalOffset,!0),this.dirty=!0,this.fromLightSource=defaultValue(e.fromLightSource,!0),this.darkness=defaultValue(e.darkness,.3),this._darkness=this.darkness,this.maximumDistance=defaultValue(e.maximumDistance,5e3),this._outOfView=!1,this._outOfViewPrevious=!1;var i,r=this._needsUpdate=!0;(FeatureDetection.isInternetExplorer()||FeatureDetection.isEdge()||(FeatureDetection.isChrome()||FeatureDetection.isFirefox())&&FeatureDetection.isWindows()&&!t.depthTexture)&&(r=!1),this._polygonOffsetSupported=r,this._terrainBias={polygonOffset:r,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:.5,normalShading:!0,normalShadingSmooth:.3,depthBias:1e-4},this._primitiveBias={polygonOffset:r,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:.1,normalShading:!0,normalShadingSmooth:.05,depthBias:2e-5},this._pointBias={polygonOffset:!1,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:0,normalShading:!0,normalShadingSmooth:.1,depthBias:5e-4},this._depthAttachment=void 0,this._colorAttachment=void 0,this._shadowMapMatrix=new Matrix4,this._shadowMapTexture=void 0,this._lightDirectionEC=new Cartesian3,this._lightPositionEC=new Cartesian4,this._distance=0,this._lightCamera=e.lightCamera,this._shadowMapCamera=new ShadowMapCamera,this._shadowMapCullingVolume=void 0,this._sceneCamera=void 0,this._boundingSphere=new BoundingSphere,this._isPointLight=defaultValue(e.isPointLight,!1),this._pointLightRadius=defaultValue(e.pointLightRadius,100),this._cascadesEnabled=!this._isPointLight&&defaultValue(e.cascadesEnabled,!0),this._numberOfCascades=this._cascadesEnabled?defaultValue(e.numberOfCascades,4):0,this._fitNearFar=!0,this._maximumCascadeDistances=[25,150,700,Number.MAX_VALUE],this._textureSize=new Cartesian2,this._isSpotLight=!1,this._cascadesEnabled?this._shadowMapCamera.frustum=new OrthographicOffCenterFrustum:defined(this._lightCamera.frustum.fov)&&(this._isSpotLight=!0),this._cascadeSplits=[new Cartesian4,new Cartesian4],this._cascadeMatrices=[new Matrix4,new Matrix4,new Matrix4,new Matrix4],this._cascadeDistances=new Cartesian4,i=this._isPointLight?6:this._cascadesEnabled?this._numberOfCascades:1,this._passes=new Array(i);for(var n=0;n<i;++n)this._passes[n]=new ShadowPass(t);this.debugShow=!1,this.debugFreezeFrame=!1,this._debugFreezeFrame=!1,this._debugCascadeColors=!1,this._debugLightFrustum=void 0,this._debugCameraFrustum=void 0,this._debugCascadeFrustums=new Array(this._numberOfCascades),this._debugShadowViewCommand=void 0,this._usesDepthTexture=t.depthTexture,this._isPointLight&&(this._usesDepthTexture=!1),this._primitiveRenderState=void 0,this._terrainRenderState=void 0,this._pointRenderState=void 0,createRenderStates$5(this),this._clearCommand=new ClearCommand({depth:1,color:new Color}),this._clearPassState=new PassState(t),this._size=defaultValue(e.size,2048),this.size=this._size}function ShadowPass(e){this.camera=new ShadowMapCamera,this.passState=new PassState(e),this.framebuffer=void 0,this.textureOffsets=void 0,this.commandList=[],this.cullingVolume=void 0}function createRenderState$1(e,t){return RenderState.fromCache({cull:{enabled:!0,face:CullFace$1.BACK},depthTest:{enabled:!0},colorMask:{red:e,green:e,blue:e,alpha:e},depthMask:!0,polygonOffset:{enabled:t.polygonOffset,factor:t.polygonOffsetFactor,units:t.polygonOffsetUnits}})}function createRenderStates$5(e){var t=!e._usesDepthTexture;e._primitiveRenderState=createRenderState$1(t,e._primitiveBias),e._terrainRenderState=createRenderState$1(t,e._terrainBias),e._pointRenderState=createRenderState$1(t,e._pointBias)}function destroyFramebuffer$1(e){for(var t=e._passes.length,i=0;i<t;++i){var r=e._passes[i],n=r.framebuffer;defined(n)&&!n.isDestroyed()&&n.destroy(),r.framebuffer=void 0}e._depthAttachment=e._depthAttachment&&e._depthAttachment.destroy(),e._colorAttachment=e._colorAttachment&&e._colorAttachment.destroy()}function createFramebufferColor(e,t){for(var i=new Renderbuffer({context:t,width:e._textureSize.x,height:e._textureSize.y,format:RenderbufferFormat$1.DEPTH_COMPONENT16}),r=new Texture({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),n=new Framebuffer({context:t,depthRenderbuffer:i,colorTextures:[r],destroyAttachments:!1}),a=e._passes.length,o=0;o<a;++o){var s=e._passes[o];s.framebuffer=n,s.passState.framebuffer=n}e._shadowMapTexture=r,e._depthAttachment=i,e._colorAttachment=r}function createFramebufferDepth(e,t){for(var i=new Texture({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8,sampler:Sampler.NEAREST}),r=new Framebuffer({context:t,depthStencilTexture:i,destroyAttachments:!1}),n=e._passes.length,a=0;a<n;++a){var o=e._passes[a];o.framebuffer=r,o.passState.framebuffer=r}e._shadowMapTexture=i,e._depthAttachment=i}function createFramebufferCube(e,t){for(var i=new Renderbuffer({context:t,width:e._textureSize.x,height:e._textureSize.y,format:RenderbufferFormat$1.DEPTH_COMPONENT16}),r=new CubeMap({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),n=[r.negativeX,r.negativeY,r.negativeZ,r.positiveX,r.positiveY,r.positiveZ],a=0;a<6;++a){var o=new Framebuffer({context:t,depthRenderbuffer:i,colorTextures:[n[a]],destroyAttachments:!1}),s=e._passes[a];s.framebuffer=o,s.passState.framebuffer=o}e._shadowMapTexture=r,e._depthAttachment=i,e._colorAttachment=r}function createFramebuffer$3(e,t){(e._isPointLight?createFramebufferCube:e._usesDepthTexture?createFramebufferDepth:createFramebufferColor)(e,t)}function checkFramebuffer(e,t){e._usesDepthTexture&&e._passes[0].framebuffer.status!==WebGLConstants$1.FRAMEBUFFER_COMPLETE&&(e._usesDepthTexture=!1,createRenderStates$5(e),destroyFramebuffer$1(e),createFramebuffer$3(e,t))}function updateFramebuffer(e,t){defined(e._passes[0].framebuffer)&&e._shadowMapTexture.width===e._textureSize.x||(destroyFramebuffer$1(e),createFramebuffer$3(e,t),checkFramebuffer(e,t),clearFramebuffer(e,t))}function clearFramebuffer(e,t,i){i=defaultValue(i,0),!e._isPointLight&&0!==i||(e._clearCommand.framebuffer=e._passes[i].framebuffer,e._clearCommand.execute(t,e._clearPassState))}function resize(e,t){e._size=t;var i,r=e._passes,n=r.length,a=e._textureSize;e._isPointLight?(t=ContextLimits.maximumCubeMapSize>=t?t:ContextLimits.maximumCubeMapSize,a.x=t,i=new BoundingRectangle(0,0,a.y=t,t),r[0].passState.viewport=i,r[1].passState.viewport=i,r[2].passState.viewport=i,r[3].passState.viewport=i,r[4].passState.viewport=i,r[5].passState.viewport=i):1===n?(t=ContextLimits.maximumTextureSize>=t?t:ContextLimits.maximumTextureSize,a.x=t,a.y=t,r[0].passState.viewport=new BoundingRectangle(0,0,t,t)):4===n&&(t=ContextLimits.maximumTextureSize>=2*t?t:ContextLimits.maximumTextureSize/2,a.x=2*t,a.y=2*t,r[0].passState.viewport=new BoundingRectangle(0,0,t,t),r[1].passState.viewport=new BoundingRectangle(t,0,t,t),r[2].passState.viewport=new BoundingRectangle(0,t,t,t),r[3].passState.viewport=new BoundingRectangle(t,t,t,t)),e._clearPassState.viewport=new BoundingRectangle(0,0,a.x,a.y);for(var o=0;o<n;++o){var s=r[o],l=s.passState.viewport,c=l.x/a.x,u=l.y/a.y,d=l.width/a.x,h=l.height/a.y;s.textureOffsets=new Matrix4(d,0,0,c,0,h,0,u,0,0,1,0,0,0,0,1)}}PickFramebuffer.prototype.end=function(e){for(var t,i=defaultValue(e.width,1),r=defaultValue(e.height,1),n=this._context,a=n.readPixels({x:e.x,y:e.y,width:i,height:r,framebuffer:this._fb}),o=Math.max(i,r),s=o*o,l=Math.floor(.5*i),c=Math.floor(.5*r),u=0,d=0,h=0,p=-1,m=0;m<s;++m){if(-l<=u&&u<=l&&-c<=d&&d<=c){var f=4*((c-d)*i+u+l);colorScratch$7.red=Color.byteToFloat(a[f]),colorScratch$7.green=Color.byteToFloat(a[1+f]),colorScratch$7.blue=Color.byteToFloat(a[2+f]),colorScratch$7.alpha=Color.byteToFloat(a[3+f]);var g=n.getObjectByPickColor(colorScratch$7);if(defined(g))return g}(u===d||u<0&&-u===d||0<u&&u===1-d)&&(t=h,h=-p,p=t),u+=h,d+=p}},PickFramebuffer.prototype.isDestroyed=function(){return!1},PickFramebuffer.prototype.destroy=function(){return this._fb=this._fb&&this._fb.destroy(),destroyObject(this)},SceneFramebuffer.prototype.update=function(e,t,i){var r,n=t.width,a=t.height,o=this._colorTexture;defined(o)&&o.width===n&&o.height===a&&i===this._useHdr||(destroyResources$3(this),r=(this._useHdr=i)?e.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT:PixelDatatype$1.UNSIGNED_BYTE,this._colorTexture=new Texture({context:e,width:n,height:a,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:r,sampler:Sampler.NEAREST}),this._idTexture=new Texture({context:e,width:n,height:a,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,sampler:Sampler.NEAREST}),e.depthTexture?(this._depthStencilTexture=new Texture({context:e,width:n,height:a,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8,sampler:Sampler.NEAREST}),this._depthStencilIdTexture=new Texture({context:e,width:n,height:a,pixelFormat:PixelFormat$1.DEPTH_STENCIL,pixelDatatype:PixelDatatype$1.UNSIGNED_INT_24_8,sampler:Sampler.NEAREST})):(this._depthStencilRenderbuffer=new Renderbuffer({context:e,width:n,height:a,format:RenderbufferFormat$1.DEPTH_STENCIL}),this._depthStencilIdRenderbuffer=new Renderbuffer({context:e,width:n,height:a,format:RenderbufferFormat$1.DEPTH_STENCIL})),this._framebuffer=new Framebuffer({context:e,colorTextures:[this._colorTexture],depthStencilTexture:this._depthStencilTexture,depthStencilRenderbuffer:this._depthStencilRenderbuffer,destroyAttachments:!1}),this._idFramebuffer=new Framebuffer({context:e,colorTextures:[this._idTexture],depthStencilTexture:this._depthStencilIdTexture,depthStencilRenderbuffer:this._depthStencilIdRenderbuffer,destroyAttachments:!1}))},SceneFramebuffer.prototype.clear=function(e,t,i){var r=t.framebuffer;t.framebuffer=this._framebuffer,Color.clone(i,this._clearCommand.color),this._clearCommand.execute(e,t),t.framebuffer=this._idFramebuffer,Color.clone(this._idClearColor,this._clearCommand.color),this._clearCommand.execute(e,t),t.framebuffer=r},SceneFramebuffer.prototype.getFramebuffer=function(){return this._framebuffer},SceneFramebuffer.prototype.getIdFramebuffer=function(){return this._idFramebuffer},SceneFramebuffer.prototype.isDestroyed=function(){return!1},SceneFramebuffer.prototype.destroy=function(){return destroyResources$3(this),destroyObject(this)},ShadowMapShader.getShadowCastShaderKeyword=function(e,t,i,r){return"castShadow "+e+" "+t+" "+i+" "+r},ShadowMapShader.createShadowCastVertexShader=function(e,t,i){var r=e.defines.slice(0),n=e.sources.slice(0);r.push("SHADOW_MAP"),i&&r.push("GENERATE_POSITION");var a=defined(ShaderSource.findPositionVarying(e));if(t&&!a){for(var o=n.length,s=0;s<o;++s)n[s]=ShaderSource.replaceMain(n[s],"czm_shadow_cast_main");n.push("varying vec3 v_positionEC; \nvoid main() \n{ \n czm_shadow_cast_main(); \n v_positionEC = (czm_inverseProjection * gl_Position).xyz; \n}")}return new ShaderSource({defines:r,sources:n})},ShadowMapShader.createShadowCastFragmentShader=function(e,t,i,r){var n=e.defines.slice(0),a=e.sources.slice(0),o=ShaderSource.findPositionVarying(e),s=defined(o);s||(o="v_positionEC");for(var l=a.length,c=0;c<l;++c)a[c]=ShaderSource.replaceMain(a[c],"czm_shadow_cast_main");var u="";return t&&(s||(u+="varying vec3 v_positionEC; \n"),u+="uniform vec4 shadowMap_lightPositionEC; \n"),u+=r?"void main() \n{ \n":"void main() \n{ \n czm_shadow_cast_main(); \n if (gl_FragColor.a == 0.0) \n { \n discard; \n } \n",u+=t?" float distance = length("+o+"); \n if (distance >= shadowMap_lightPositionEC.w) \n { \n discard; \n } \n distance /= shadowMap_lightPositionEC.w; // radius \n gl_FragColor = czm_packDepth(distance); \n":i?" gl_FragColor = vec4(1.0); \n":" gl_FragColor = czm_packDepth(gl_FragCoord.z); \n",u+="} \n",a.push(u),new ShaderSource({defines:n,sources:a})},ShadowMapShader.getShadowReceiveShaderKeyword=function(e,t,i,r){return"receiveShadow "+e._usesDepthTexture+e._polygonOffsetSupported+e._isPointLight+e._isSpotLight+(1<e._numberOfCascades)+e.debugCascadeColors+e.softShadows+t+i+r},ShadowMapShader.createShadowReceiveVertexShader=function(e,t,i){var r=e.defines.slice(0),n=e.sources.slice(0);return r.push("SHADOW_MAP"),t&&(i?r.push("GENERATE_POSITION_AND_NORMAL"):r.push("GENERATE_POSITION")),new ShaderSource({defines:r,sources:n})},ShadowMapShader.createShadowReceiveFragmentShader=function(e,t,i,r,n){for(var a=ShaderSource.findNormalVarying(e),o=!r&&defined(a)||r&&n,s=ShaderSource.findPositionVarying(e),l=defined(s),c=t._usesDepthTexture,u=t._polygonOffsetSupported,d=t._isPointLight,h=t._isSpotLight,p=1<t._numberOfCascades,m=t.debugCascadeColors,f=t.softShadows,g=d?t._pointBias:r?t._terrainBias:t._primitiveBias,_=e.defines.slice(0),y=e.sources.slice(0),v=y.length,C=0;C<v;++C)y[C]=ShaderSource.replaceMain(y[C],"czm_shadow_receive_main");d?_.push("USE_CUBE_MAP_SHADOW"):c&&_.push("USE_SHADOW_DEPTH_TEXTURE"),f&&!d&&_.push("USE_SOFT_SHADOWS"),p&&i&&r&&(o?_.push("ENABLE_VERTEX_LIGHTING"):_.push("ENABLE_DAYNIGHT_SHADING")),i&&g.normalShading&&o&&(_.push("USE_NORMAL_SHADING"),0<g.normalShadingSmooth&&_.push("USE_NORMAL_SHADING_SMOOTH"));var S="";return S+=d?"uniform samplerCube shadowMap_textureCube; \n":"uniform sampler2D shadowMap_texture; \n",S+="uniform mat4 shadowMap_matrix; \nuniform vec3 shadowMap_lightDirectionEC; \nuniform vec4 shadowMap_lightPositionEC; \nuniform vec4 shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness; \nuniform vec4 shadowMap_texelSizeDepthBiasAndNormalShadingSmooth; \n#ifdef LOG_DEPTH \nvarying vec3 v_logPositionEC; \n#endif \nvec4 getPositionEC() \n{ \n"+(l?" return vec4("+s+", 1.0); \n":"#ifndef LOG_DEPTH \n return czm_windowToEyeCoordinates(gl_FragCoord); \n#else \n return vec4(v_logPositionEC, 1.0); \n#endif \n")+"} \nvec3 getNormalEC() \n{ \n"+(o?" return normalize("+a+"); \n":" return vec3(1.0); \n")+"} \nvoid applyNormalOffset(inout vec4 positionEC, vec3 normalEC, float nDotL) \n{ \n"+(g.normalOffset&&o?" float normalOffset = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.x; \n float normalOffsetScale = 1.0 - nDotL; \n vec3 offset = normalOffset * normalOffsetScale * normalEC; \n positionEC.xyz += offset; \n":"")+"} \n",S+="void main() \n{ \n czm_shadow_receive_main(); \n vec4 positionEC = getPositionEC(); \n vec3 normalEC = getNormalEC(); \n float depth = -positionEC.z; \n",S+=" czm_shadowParameters shadowParameters; \n shadowParameters.texelStepSize = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy; \n shadowParameters.depthBias = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z; \n shadowParameters.normalShadingSmooth = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w; \n shadowParameters.darkness = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w; \n",r?S+=" shadowParameters.depthBias *= max(depth * 0.01, 1.0); \n":u||(S+=" shadowParameters.depthBias *= mix(1.0, 100.0, depth * 0.0015); \n"),S+=d?" vec3 directionEC = positionEC.xyz - shadowMap_lightPositionEC.xyz; \n float distance = length(directionEC); \n directionEC = normalize(directionEC); \n float radius = shadowMap_lightPositionEC.w; \n // Stop early if the fragment is beyond the point light radius \n if (distance > radius) \n { \n return; \n } \n vec3 directionWC = czm_inverseViewRotation * directionEC; \n shadowParameters.depth = distance / radius; \n shadowParameters.nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); \n shadowParameters.texCoords = directionWC; \n float visibility = czm_shadowVisibility(shadowMap_textureCube, shadowParameters); \n":h?" vec3 directionEC = normalize(positionEC.xyz - shadowMap_lightPositionEC.xyz); \n float nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); \n applyNormalOffset(positionEC, normalEC, nDotL); \n vec4 shadowPosition = shadowMap_matrix * positionEC; \n // Spot light uses a perspective projection, so perform the perspective divide \n shadowPosition /= shadowPosition.w; \n // Stop early if the fragment is not in the shadow bounds \n if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) \n { \n return; \n } \n shadowParameters.texCoords = shadowPosition.xy; \n shadowParameters.depth = shadowPosition.z; \n shadowParameters.nDotL = nDotL; \n float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); \n":p?" float maxDepth = shadowMap_cascadeSplits[1].w; \n // Stop early if the eye depth exceeds the last cascade \n if (depth > maxDepth) \n { \n return; \n } \n // Get the cascade based on the eye-space depth \n vec4 weights = czm_cascadeWeights(depth); \n // Apply normal offset \n float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); \n applyNormalOffset(positionEC, normalEC, nDotL); \n // Transform position into the cascade \n vec4 shadowPosition = czm_cascadeMatrix(weights) * positionEC; \n // Get visibility \n shadowParameters.texCoords = shadowPosition.xy; \n shadowParameters.depth = shadowPosition.z; \n shadowParameters.nDotL = nDotL; \n float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); \n // Fade out shadows that are far away \n float shadowMapMaximumDistance = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.z; \n float fade = max((depth - shadowMapMaximumDistance * 0.8) / (shadowMapMaximumDistance * 0.2), 0.0); \n visibility = mix(visibility, 1.0, fade); \n"+(m?" // Draw cascade colors for debugging \n gl_FragColor *= czm_cascadeColor(weights); \n":""):" float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); \n applyNormalOffset(positionEC, normalEC, nDotL); \n vec4 shadowPosition = shadowMap_matrix * positionEC; \n // Stop early if the fragment is not in the shadow bounds \n if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) \n { \n return; \n } \n shadowParameters.texCoords = shadowPosition.xy; \n shadowParameters.depth = shadowPosition.z; \n shadowParameters.nDotL = nDotL; \n float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); \n",S+=" gl_FragColor.rgb *= visibility; \n} \n",y.push(S),new ShaderSource({defines:_,sources:y})},ShadowMap.MAXIMUM_DISTANCE=2e4,ShadowMap.prototype.debugCreateRenderStates=function(){createRenderStates$5(this)},Object.defineProperties(ShadowMap.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this.dirty=this._enabled!==e,this._enabled=e}},normalOffset:{get:function(){return this._normalOffset},set:function(e){this.dirty=this._normalOffset!==e,this._normalOffset=e,this._terrainBias.normalOffset=e,this._primitiveBias.normalOffset=e,this._pointBias.normalOffset=e}},softShadows:{get:function(){return this._softShadows},set:function(e){this.dirty=this._softShadows!==e,this._softShadows=e}},size:{get:function(){return this._size},set:function(e){resize(this,e)}},outOfView:{get:function(){return this._outOfView}},shadowMapCullingVolume:{get:function(){return this._shadowMapCullingVolume}},passes:{get:function(){return this._passes}},isPointLight:{get:function(){return this._isPointLight}},debugCascadeColors:{get:function(){return this._debugCascadeColors},set:function(e){this.dirty=this._debugCascadeColors!==e,this._debugCascadeColors=e}}});var scratchViewport$2=new BoundingRectangle;function createDebugShadowViewCommand(e,t){var i=e._isPointLight?"uniform samplerCube shadowMap_textureCube; \nvarying vec2 v_textureCoordinates; \nvoid main() \n{ \n vec2 uv = v_textureCoordinates; \n vec3 dir; \n \n if (uv.y < 0.5) \n { \n if (uv.x < 0.333) \n { \n dir.x = -1.0; \n dir.y = uv.x * 6.0 - 1.0; \n dir.z = uv.y * 4.0 - 1.0; \n } \n else if (uv.x < 0.666) \n { \n dir.y = -1.0; \n dir.x = uv.x * 6.0 - 3.0; \n dir.z = uv.y * 4.0 - 1.0; \n } \n else \n { \n dir.z = -1.0; \n dir.x = uv.x * 6.0 - 5.0; \n dir.y = uv.y * 4.0 - 1.0; \n } \n } \n else \n { \n if (uv.x < 0.333) \n { \n dir.x = 1.0; \n dir.y = uv.x * 6.0 - 1.0; \n dir.z = uv.y * 4.0 - 3.0; \n } \n else if (uv.x < 0.666) \n { \n dir.y = 1.0; \n dir.x = uv.x * 6.0 - 3.0; \n dir.z = uv.y * 4.0 - 3.0; \n } \n else \n { \n dir.z = 1.0; \n dir.x = uv.x * 6.0 - 5.0; \n dir.y = uv.y * 4.0 - 3.0; \n } \n } \n \n float shadow = czm_unpackDepth(textureCube(shadowMap_textureCube, dir)); \n gl_FragColor = vec4(vec3(shadow), 1.0); \n} \n":"uniform sampler2D shadowMap_texture; \nvarying vec2 v_textureCoordinates; \nvoid main() \n{ \n"+(e._usesDepthTexture?" float shadow = texture2D(shadowMap_texture, v_textureCoordinates).r; \n":" float shadow = czm_unpackDepth(texture2D(shadowMap_texture, v_textureCoordinates)); \n")+" gl_FragColor = vec4(vec3(shadow), 1.0); \n} \n",r=t.createViewportQuadCommand(i,{uniformMap:{shadowMap_texture:function(){return e._shadowMapTexture},shadowMap_textureCube:function(){return e._shadowMapTexture}}});return r.pass=Pass$1.OVERLAY,r}function updateDebugShadowViewCommand(e,t){var i=t.context,r=t.context.drawingBufferWidth,n=t.context.drawingBufferHeight,a=.3*Math.min(r,n),o=scratchViewport$2;o.x=r-a,o.y=0,o.width=a,o.height=a;var s=e._debugShadowViewCommand;defined(s)||(s=createDebugShadowViewCommand(e,i),e._debugShadowViewCommand=s),defined(s.renderState)&&BoundingRectangle.equals(s.renderState.viewport,o)||(s.renderState=RenderState.fromCache({viewport:BoundingRectangle.clone(o)})),t.commandList.push(e._debugShadowViewCommand)}var frustumCornersNDC$1=new Array(8);frustumCornersNDC$1[0]=new Cartesian4(-1,-1,-1,1),frustumCornersNDC$1[1]=new Cartesian4(1,-1,-1,1),frustumCornersNDC$1[2]=new Cartesian4(1,1,-1,1),frustumCornersNDC$1[3]=new Cartesian4(-1,1,-1,1),frustumCornersNDC$1[4]=new Cartesian4(-1,-1,1,1),frustumCornersNDC$1[5]=new Cartesian4(1,-1,1,1),frustumCornersNDC$1[6]=new Cartesian4(1,1,1,1),frustumCornersNDC$1[7]=new Cartesian4(-1,1,1,1);for(var scratchMatrix$4=new Matrix4,scratchFrustumCorners$1=new Array(8),i$5=0;i$5<8;++i$5)scratchFrustumCorners$1[i$5]=new Cartesian4;function createDebugPointLight(e,t){return new Primitive({geometryInstances:[new GeometryInstance({geometry:new BoxOutlineGeometry({minimum:new Cartesian3(-.5,-.5,-.5),maximum:new Cartesian3(.5,.5,.5)}),attributes:{color:ColorGeometryInstanceAttribute.fromColor(t)}}),new GeometryInstance({geometry:new SphereOutlineGeometry({radius:.5}),attributes:{color:ColorGeometryInstanceAttribute.fromColor(t)}})],appearance:new PerInstanceColorAppearance({translucent:!1,flat:!0}),asynchronous:!1,modelMatrix:e})}var debugOutlineColors=[Color.RED,Color.GREEN,Color.BLUE,Color.MAGENTA],scratchScale$8=new Cartesian3;function applyDebugSettings$1(e,t){updateDebugShadowViewCommand(e,t);var i,r,n,a,o,s=e.debugFreezeFrame&&!e._debugFreezeFrame;if(e._debugFreezeFrame=e.debugFreezeFrame,e.debugFreezeFrame&&(s&&(e._debugCameraFrustum=e._debugCameraFrustum&&e._debugCameraFrustum.destroy(),e._debugCameraFrustum=new DebugCameraPrimitive({camera:e._sceneCamera,color:Color.CYAN,updateOnChange:!1})),e._debugCameraFrustum.update(t)),e._cascadesEnabled){if(e.debugFreezeFrame){s&&(e._debugLightFrustum=e._debugLightFrustum&&e._debugLightFrustum.destroy(),e._debugLightFrustum=new DebugCameraPrimitive({camera:e._shadowMapCamera,color:Color.YELLOW,updateOnChange:!1})),e._debugLightFrustum.update(t);for(var l=0;l<e._numberOfCascades;++l)s&&(e._debugCascadeFrustums[l]=e._debugCascadeFrustums[l]&&e._debugCascadeFrustums[l].destroy(),e._debugCascadeFrustums[l]=new DebugCameraPrimitive({camera:e._passes[l].camera,color:debugOutlineColors[l],updateOnChange:!1})),e._debugCascadeFrustums[l].update(t)}}else e._isPointLight?defined(e._debugLightFrustum)&&!e._needsUpdate||(i=e._shadowMapCamera.positionWC,r=Quaternion.IDENTITY,n=2*e._pointLightRadius,a=Cartesian3.fromElements(n,n,n,scratchScale$8),o=Matrix4.fromTranslationQuaternionRotationScale(i,r,a,scratchMatrix$4),e._debugLightFrustum=e._debugLightFrustum&&e._debugLightFrustum.destroy(),e._debugLightFrustum=createDebugPointLight(o,Color.YELLOW)):defined(e._debugLightFrustum)&&!e._needsUpdate||(e._debugLightFrustum=new DebugCameraPrimitive({camera:e._shadowMapCamera,color:Color.YELLOW,updateOnChange:!1})),e._debugLightFrustum.update(t)}function ShadowMapCamera(){this.viewMatrix=new Matrix4,this.inverseViewMatrix=new Matrix4,this.frustum=void 0,this.positionCartographic=new Cartographic,this.positionWC=new Cartesian3,this.directionWC=Cartesian3.clone(Cartesian3.UNIT_Z),this.upWC=Cartesian3.clone(Cartesian3.UNIT_Y),this.rightWC=Cartesian3.clone(Cartesian3.UNIT_X),this.viewProjectionMatrix=new Matrix4}ShadowMapCamera.prototype.clone=function(e){Matrix4.clone(e.viewMatrix,this.viewMatrix),Matrix4.clone(e.inverseViewMatrix,this.inverseViewMatrix),this.frustum=e.frustum.clone(this.frustum),Cartographic.clone(e.positionCartographic,this.positionCartographic),Cartesian3.clone(e.positionWC,this.positionWC),Cartesian3.clone(e.directionWC,this.directionWC),Cartesian3.clone(e.upWC,this.upWC),Cartesian3.clone(e.rightWC,this.rightWC)};var scaleBiasMatrix=new Matrix4(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);ShadowMapCamera.prototype.getViewProjection=function(){var e=this.viewMatrix,t=this.frustum.projectionMatrix;return Matrix4.multiply(t,e,this.viewProjectionMatrix),Matrix4.multiply(scaleBiasMatrix,this.viewProjectionMatrix,this.viewProjectionMatrix),this.viewProjectionMatrix};var scratchSplits$1=new Array(5),scratchFrustum=new PerspectiveFrustum,scratchCascadeDistances=new Array(4),scratchMin$3=new Cartesian3,scratchMax$3=new Cartesian3;function computeCascades(e,t){var i=e._shadowMapCamera,r=e._sceneCamera,n=r.frustum.near,a=r.frustum.far,o=e._numberOfCascades,s=a-n,l=a/n,c=.9,u=!1;t.shadowState.closestObjectSize<200&&(u=!0,c=.9);var d=scratchCascadeDistances,h=scratchSplits$1;for(h[0]=n,h[o]=a,y=0;y<o;++y){var p=(y+1)/o,m=n*Math.pow(l,p),f=n+s*p,g=CesiumMath.lerp(f,m,c);h[y+1]=g,d[y]=g-h[y]}if(u){for(y=0;y<o;++y)d[y]=Math.min(d[y],e._maximumCascadeDistances[y]);for(var _=h[0],y=0;y<o-1;++y)_+=d[y],h[y+1]=_}Cartesian4.unpack(h,0,e._cascadeSplits[0]),Cartesian4.unpack(h,1,e._cascadeSplits[1]),Cartesian4.unpack(d,0,e._cascadeDistances);var v=i.frustum,C=v.left,S=v.right,T=v.bottom,x=v.top,b=v.near,E=v.far,P=i.positionWC,A=i.directionWC,w=i.upWC,D=r.frustum.clone(scratchFrustum),M=i.getViewProjection();for(y=0;y<o;++y){D.near=h[y],D.far=h[y+1];for(var I=Matrix4.multiply(D.projectionMatrix,r.viewMatrix,scratchMatrix$4),R=Matrix4.inverse(I,scratchMatrix$4),O=Matrix4.multiply(M,R,scratchMatrix$4),L=Cartesian3.fromElements(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,scratchMin$3),F=Cartesian3.fromElements(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,scratchMax$3),N=0;N<8;++N){var B=Cartesian4.clone(frustumCornersNDC$1[N],scratchFrustumCorners$1[N]);Matrix4.multiplyByVector(O,B,B),Cartesian3.divideByScalar(B,B.w,B),Cartesian3.minimumByComponent(B,L,L),Cartesian3.maximumByComponent(B,F,F)}L.x=Math.max(L.x,0),L.y=Math.max(L.y,0),L.z=0,F.x=Math.min(F.x,1),F.y=Math.min(F.y,1),F.z=Math.min(F.z,1);var V=e._passes[y],k=V.camera;k.clone(i);var z=k.frustum;z.left=C+L.x*(S-C),z.right=C+F.x*(S-C),z.bottom=T+L.y*(x-T),z.top=T+F.y*(x-T),z.near=b+L.z*(E-b),z.far=b+F.z*(E-b),V.cullingVolume=k.frustum.computeCullingVolume(P,A,w);var $=e._cascadeMatrices[y];Matrix4.multiply(k.getViewProjection(),r.inverseViewMatrix,$),Matrix4.multiply(V.textureOffsets,$,$)}}var scratchLightView=new Matrix4,scratchRight$2=new Cartesian3,scratchUp=new Cartesian3,scratchTranslation$1=new Cartesian3;function fitShadowMapToScene(e,t){var i=e._shadowMapCamera,r=e._sceneCamera,n=Matrix4.multiply(r.frustum.projectionMatrix,r.viewMatrix,scratchMatrix$4),a=Matrix4.inverse(n,scratchMatrix$4),o=i.directionWC,s=r.directionWC;Cartesian3.equalsEpsilon(o,s,CesiumMath.EPSILON10)&&(s=r.upWC);var l=Cartesian3.cross(o,s,scratchRight$2),s=Cartesian3.cross(l,o,scratchUp);Cartesian3.normalize(s,s),Cartesian3.normalize(l,l);for(var c=Cartesian3.fromElements(0,0,0,scratchTranslation$1),u=Matrix4.computeView(c,o,s,l,scratchLightView),d=Matrix4.multiply(u,a,scratchMatrix$4),h=Cartesian3.fromElements(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,scratchMin$3),p=Cartesian3.fromElements(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,scratchMax$3),m=0;m<8;++m){var f=Cartesian4.clone(frustumCornersNDC$1[m],scratchFrustumCorners$1[m]);Matrix4.multiplyByVector(d,f,f),Cartesian3.divideByScalar(f,f.w,f),Cartesian3.minimumByComponent(f,h,h),Cartesian3.maximumByComponent(f,p,p)}p.z+=1e3,h.z-=10;var g=scratchTranslation$1;g.x=-.5*(h.x+p.x),g.y=-.5*(h.y+p.y),g.z=-p.z;var _=Matrix4.fromTranslation(g,scratchMatrix$4),u=Matrix4.multiply(_,u,u),y=.5*(p.x-h.x),v=.5*(p.y-h.y),C=p.z-h.z,S=i.frustum;S.left=-y,S.right=y,S.bottom=-v,S.top=v,S.near=.01,S.far=C,Matrix4.clone(u,i.viewMatrix),Matrix4.inverse(u,i.inverseViewMatrix),Matrix4.getTranslation(i.inverseViewMatrix,i.positionWC),t.mapProjection.ellipsoid.cartesianToCartographic(i.positionWC,i.positionCartographic),Cartesian3.clone(o,i.directionWC),Cartesian3.clone(s,i.upWC),Cartesian3.clone(l,i.rightWC)}var directions=[new Cartesian3(-1,0,0),new Cartesian3(0,-1,0),new Cartesian3(0,0,-1),new Cartesian3(1,0,0),new Cartesian3(0,1,0),new Cartesian3(0,0,1)],ups=[new Cartesian3(0,-1,0),new Cartesian3(0,0,-1),new Cartesian3(0,-1,0),new Cartesian3(0,-1,0),new Cartesian3(0,0,1),new Cartesian3(0,-1,0)],rights=[new Cartesian3(0,0,1),new Cartesian3(1,0,0),new Cartesian3(-1,0,0),new Cartesian3(0,0,-1),new Cartesian3(1,0,0),new Cartesian3(1,0,0)];function computeOmnidirectional(e,t){var i=new PerspectiveFrustum;i.fov=CesiumMath.PI_OVER_TWO,i.near=1,i.far=e._pointLightRadius,i.aspectRatio=1;for(var r=0;r<6;++r){var n=e._passes[r].camera;n.positionWC=e._shadowMapCamera.positionWC,n.positionCartographic=t.mapProjection.ellipsoid.cartesianToCartographic(n.positionWC,n.positionCartographic),n.directionWC=directions[r],n.upWC=ups[r],n.rightWC=rights[r],Matrix4.computeView(n.positionWC,n.directionWC,n.upWC,n.rightWC,n.viewMatrix),Matrix4.inverse(n.viewMatrix,n.inverseViewMatrix),n.frustum=i}}var scratchCartesian1$8=new Cartesian3,scratchCartesian2$b=new Cartesian3,scratchBoundingSphere$4=new BoundingSphere,scratchCenter$5=scratchBoundingSphere$4.center;function checkVisibility(e,t){var i,r,n=e._sceneCamera,a=e._shadowMapCamera,o=scratchBoundingSphere$4;if(e._cascadesEnabled){if(n.frustum.near>=e.maximumDistance)return e._outOfView=!0,void(e._needsUpdate=!1);var s=t.mapProjection.ellipsoid.geodeticSurfaceNormal(n.positionWC,scratchCartesian1$8),l=Cartesian3.negate(a.directionWC,scratchCartesian2$b),c=Cartesian3.dot(s,l),u=CesiumMath.clamp(c/.1,0,1);if(e._darkness=CesiumMath.lerp(1,e.darkness,u),c<0)return e._outOfView=!0,void(e._needsUpdate=!1);e._needsUpdate=!0,e._outOfView=!1}else{e._isPointLight?(o.center=a.positionWC,o.radius=e._pointLightRadius):(i=a.frustum.far/2,r=Cartesian3.add(a.positionWC,Cartesian3.multiplyByScalar(a.directionWC,i,scratchCenter$5),scratchCenter$5),o.center=r,o.radius=i),e._outOfView=t.cullingVolume.computeVisibility(o)===Intersect$1.OUTSIDE,e._needsUpdate=!e._outOfView&&!e._boundingSphere.equals(o),BoundingSphere.clone(o,e._boundingSphere)}}function updateCameras(e,t){var i=t.camera,r=e._lightCamera,n=e._sceneCamera,a=e._shadowMapCamera;e._cascadesEnabled?Cartesian3.clone(r.directionWC,a.directionWC):e._isPointLight?Cartesian3.clone(r.positionWC,a.positionWC):a.clone(r);var o,s,l=e._lightDirectionEC;Matrix4.multiplyByPointAsVector(i.viewMatrix,a.directionWC,l),Cartesian3.normalize(l,l),Cartesian3.negate(l,l),Matrix4.multiplyByPoint(i.viewMatrix,a.positionWC,e._lightPositionEC),e._lightPositionEC.w=e._pointLightRadius,s=e._fitNearFar?(o=Math.min(t.shadowState.nearPlane,e.maximumDistance),Math.min(t.shadowState.farPlane,e.maximumDistance+1)):(o=i.frustum.near,e.maximumDistance),e._sceneCamera=Camera.clone(i,n),i.frustum.clone(e._sceneCamera.frustum),e._sceneCamera.frustum.near=o,e._sceneCamera.frustum.far=s,e._distance=s-o,checkVisibility(e,t),!e._outOfViewPrevious&&e._outOfView&&(e._needsUpdate=!0),e._outOfViewPrevious=e._outOfView}ShadowMap.prototype.update=function(e){var t,i,r,n,a;updateCameras(this,e),this._needsUpdate&&(updateFramebuffer(this,e.context),this._isPointLight&&computeOmnidirectional(this,e),this._cascadesEnabled&&(fitShadowMapToScene(this,e),1<this._numberOfCascades&&computeCascades(this,e)),this._isPointLight?this._shadowMapCullingVolume=CullingVolume.fromBoundingSphere(this._boundingSphere):(i=(t=this._shadowMapCamera).positionWC,r=t.directionWC,n=t.upWC,this._shadowMapCullingVolume=t.frustum.computeCullingVolume(i,r,n),1===this._passes.length&&this._passes[0].camera.clone(t))),1===this._passes.length&&(a=this._sceneCamera.inverseViewMatrix,Matrix4.multiply(this._shadowMapCamera.getViewProjection(),a,this._shadowMapMatrix)),this.debugShow&&applyDebugSettings$1(this,e)},ShadowMap.prototype.updatePass=function(e,t){clearFramebuffer(this,e,t)};var scratchTexelStepSize=new Cartesian2;function combineUniforms(t,e,i){var r=t._isPointLight?t._pointBias:i?t._terrainBias:t._primitiveBias;return combine(e,{shadowMap_texture:function(){return t._shadowMapTexture},shadowMap_textureCube:function(){return t._shadowMapTexture},shadowMap_matrix:function(){return t._shadowMapMatrix},shadowMap_cascadeSplits:function(){return t._cascadeSplits},shadowMap_cascadeMatrices:function(){return t._cascadeMatrices},shadowMap_lightDirectionEC:function(){return t._lightDirectionEC},shadowMap_lightPositionEC:function(){return t._lightPositionEC},shadowMap_cascadeDistances:function(){return t._cascadeDistances},shadowMap_texelSizeDepthBiasAndNormalShadingSmooth:function(){var e=scratchTexelStepSize;return e.x=1/t._textureSize.x,e.y=1/t._textureSize.y,Cartesian4.fromElements(e.x,e.y,r.depthBias,r.normalShadingSmooth,this.combinedUniforms1)},shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness:function(){return Cartesian4.fromElements(r.normalOffsetScale,t._distance,t.maximumDistance,t._darkness,this.combinedUniforms2)},combinedUniforms1:new Cartesian4,combinedUniforms2:new Cartesian4},!1)}function createCastDerivedCommand(e,t,i,r,n,a){var o,s,l,c,u,d,h,p,m,f,g,_,y;return defined(a)&&(y=a.shaderProgram,o=a.renderState,s=a.uniformMap),(a=DrawCommand.shallowClone(i,a)).castShadows=!0,a.receiveShadows=!1,defined(y)&&n===i.shaderProgram.id&&!t||(l=i.shaderProgram,c=i.pass===Pass$1.GLOBE,u=i.pass!==Pass$1.TRANSLUCENT,d=e._isPointLight,h=e._usesDepthTexture,p=ShadowMapShader.getShadowCastShaderKeyword(d,c,h,u),defined(y=r.shaderCache.getDerivedShaderProgram(l,p))||(m=l.vertexShaderSource,f=l.fragmentShaderSource,g=ShadowMapShader.createShadowCastVertexShader(m,d,c),_=ShadowMapShader.createShadowCastFragmentShader(f,d,h,u),y=r.shaderCache.createDerivedShaderProgram(l,p,{vertexShaderSource:g,fragmentShaderSource:_,attributeLocations:l._attributeLocations})),o=e._primitiveRenderState,d?o=e._pointRenderState:c&&(o=e._terrainRenderState),i.renderState.cull.enabled||((o=clone(o,!1)).cull=clone(o.cull,!1),o.cull.enabled=!1,o=RenderState.fromCache(o)),s=combineUniforms(e,i.uniformMap,c)),a.shaderProgram=y,a.renderState=o,a.uniformMap=s,a}function CommandExtent(){this.command=void 0,this.near=void 0,this.far=void 0}function View(e,t,i){var r,n,a=e.context;a.depthTexture&&(r=new GlobeDepth),e._useOIT&&a.depthTexture&&(n=new OIT(a));var o=new PassState(a);o.viewport=BoundingRectangle.clone(i),this.camera=t,this._cameraClone=Camera.clone(t),this._cameraStartFired=!1,this._cameraMovedTime=void 0,this.viewport=i,this.passState=o,this.pickFramebuffer=new PickFramebuffer(a),this.pickDepthFramebuffer=new PickDepthFramebuffer,this.sceneFramebuffer=new SceneFramebuffer,this.globeDepth=r,this.globeTranslucencyFramebuffer=new GlobeTranslucencyFramebuffer,this.oit=n,this.pickDepths=[],this.debugGlobeDepths=[],this.frustumCommandsList=[],this.debugFrustumStatistics=void 0,this._commandExtents=[]}ShadowMap.createReceiveDerivedCommand=function(e,t,i,r,n){defined(n)||(n={});var a,o,s,l,c,u,d,h=0<e.length,p=t.shaderProgram,m=p.vertexShaderSource,f=p.fragmentShaderSource,g=t.pass===Pass$1.GLOBE,_=!1;return g&&(_=t.owner.data.renderedMesh.encoding.hasVertexNormals),t.receiveShadows&&h&&(defined(n.receiveCommand)&&(d=n.receiveCommand.shaderProgram,a=n.receiveCommand.uniformMap),n.receiveCommand=DrawCommand.shallowClone(t,n.receiveCommand),n.castShadows=!1,n.receiveShadows=!0,o=n.receiveShaderCastShadows!==t.castShadows,s=n.receiveShaderProgramId!==t.shaderProgram.id,(!defined(d)||s||i||o)&&(l=ShadowMapShader.getShadowReceiveShaderKeyword(e[0],t.castShadows,g,_),defined(d=r.shaderCache.getDerivedShaderProgram(p,l))||(c=ShadowMapShader.createShadowReceiveVertexShader(m,g,_),u=ShadowMapShader.createShadowReceiveFragmentShader(f,e[0],t.castShadows,g,_),d=r.shaderCache.createDerivedShaderProgram(p,l,{vertexShaderSource:c,fragmentShaderSource:u,attributeLocations:p._attributeLocations})),a=combineUniforms(e[0],t.uniformMap,g)),n.receiveCommand.shaderProgram=d,n.receiveCommand.uniformMap=a,n.receiveShaderProgramId=t.shaderProgram.id,n.receiveShaderCastShadows=t.castShadows),n},ShadowMap.createCastDerivedCommand=function(e,t,i,r,n){if(defined(n)||(n={}),t.castShadows){var a=n.castCommands;defined(a)||(a=n.castCommands=[]);var o=n.castShaderProgramId,s=e.length;a.length=s;for(var l=0;l<s;++l)a[l]=createCastDerivedCommand(e[l],i,t,r,o,a[l]);n.castShaderProgramId=t.shaderProgram.id}return n},ShadowMap.prototype.isDestroyed=function(){return!1},ShadowMap.prototype.destroy=function(){destroyFramebuffer$1(this),this._debugLightFrustum=this._debugLightFrustum&&this._debugLightFrustum.destroy(),this._debugCameraFrustum=this._debugCameraFrustum&&this._debugCameraFrustum.destroy(),this._debugShadowViewCommand=this._debugShadowViewCommand&&this._debugShadowViewCommand.shaderProgram&&this._debugShadowViewCommand.shaderProgram.destroy();for(var e=0;e<this._numberOfCascades;++e)this._debugCascadeFrustums[e]=this._debugCascadeFrustums[e]&&this._debugCascadeFrustums[e].destroy();return destroyObject(this)};var scratchPosition0=new Cartesian3,scratchPosition1=new Cartesian3;function maxComponent(e,t){var i=Math.max(Math.abs(e.x),Math.abs(t.x)),r=Math.max(Math.abs(e.y),Math.abs(t.y)),n=Math.max(Math.abs(e.z),Math.abs(t.z));return Math.max(Math.max(i,r),n)}function cameraEqual(e,t,i){var r=1/Math.max(1,maxComponent(e.position,t.position));return Cartesian3.multiplyByScalar(e.position,r,scratchPosition0),Cartesian3.multiplyByScalar(t.position,r,scratchPosition1),Cartesian3.equalsEpsilon(scratchPosition0,scratchPosition1,i)&&Cartesian3.equalsEpsilon(e.direction,t.direction,i)&&Cartesian3.equalsEpsilon(e.up,t.up,i)&&Cartesian3.equalsEpsilon(e.right,t.right,i)&&Matrix4.equalsEpsilon(e.transform,t.transform,i)&&e.frustum.equalsEpsilon(t.frustum,i)}function updateFrustums(e,t,i,r){var n,a=t.frameState,o=a.camera,s=a.useLogDepth?t.logarithmicDepthFarToNearRatio:t.farToNearRatio,l=t.mode===SceneMode$1.SCENE2D,c=t.nearToFarDistance2D;i=Math.min(Math.max(i,o.frustum.near),o.frustum.far),r=Math.max(Math.min(r,o.frustum.far),i),n=l?(r=Math.min(r,o.position.z+t.nearToFarDistance2D),i=Math.min(i,r),Math.ceil(Math.max(1,r-i)/t.nearToFarDistance2D)):Math.ceil(Math.log(r/i)/Math.log(s));var u=e.frustumCommandsList;u.length=n;for(var d=0;d<n;++d){var h,p=l?(h=Math.min(r-c,i+d*c),Math.min(r,h+c)):(h=Math.max(i,Math.pow(s,d)*i),Math.min(r,s*h)),m=u[d];defined(m)?(m.near=h,m.far=p):m=u[d]=new FrustumCommands(h,p)}}function insertIntoBin(e,t,i,r,n){t.debugShowFrustums&&(i.debugOverlappingFrustums=0);for(var a,o=e.frustumCommandsList,s=o.length,l=0;l<s;++l){var c=o[l],u=c.near;if(!(c.far<r)){if(n<u)break;var d=i.pass,h=c.indices[d]++;if(c.commands[d][h]=i,t.debugShowFrustums&&(i.debugOverlappingFrustums|=1<<l),i.executeInClosestFrustum)break}}t.debugShowFrustums&&((a=e.debugFrustumStatistics.commandsInFrustums)[i.debugOverlappingFrustums]=defined(a[i.debugOverlappingFrustums])?a[i.debugOverlappingFrustums]+1:1,++e.debugFrustumStatistics.totalCommands),t.updateDerivedCommands(i)}View.prototype.checkForCameraUpdates=function(e){var t=this.camera,i=this._cameraClone;return cameraEqual(t,i,CesiumMath.EPSILON15)?(this._cameraStartFired&&getTimestamp$1()-this._cameraMovedTime>e.cameraEventWaitTime&&(t.moveEnd.raiseEvent(),this._cameraStartFired=!1),!1):(this._cameraStartFired||(t.moveStart.raiseEvent(),this._cameraStartFired=!0),this._cameraMovedTime=getTimestamp$1(),Camera.clone(t,i),!0)};var scratchCullingVolume=new CullingVolume,scratchNearFarInterval=new Interval;View.prototype.createPotentiallyVisibleSet=function(e){var t=e.frameState,i=t.camera,r=i.directionWC,n=i.positionWC,a=e._computeCommandList,o=e._overlayCommandList,s=t.commandList;e.debugShowFrustums&&(this.debugFrustumStatistics={totalCommands:0,commandsInFrustums:{}});for(var l=this.frustumCommandsList,c=l.length,u=Pass$1.NUMBER_OF_PASSES,d=0;d<c;++d)for(var h=0;h<u;++h)l[d].indices[h]=0;a.length=0,o.length=0;for(var p=this._commandExtents,m=p.length,f=0,g=+Number.MAX_VALUE,_=-Number.MAX_VALUE,y=t.shadowState.shadowsEnabled,v=+Number.MAX_VALUE,C=-Number.MAX_VALUE,S=Number.MAX_VALUE,T=t.mode===SceneMode$1.SCENE3D?t.occluder:void 0,x=t.cullingVolume,b=scratchCullingVolume.planes,E=0;E<5;++E)b[E]=x.planes[E];x=scratchCullingVolume;for(var P,A,w=s.length,D=0;D<w;++D){var M=s[D],I=M.pass;if(I===Pass$1.COMPUTE)a.push(M);else if(I===Pass$1.OVERLAY)o.push(M);else{var R=M.boundingVolume;if(defined(R)){if(!e.isVisible(M,x,T))continue;var O,L=R.computePlaneDistances(n,r,scratchNearFarInterval),F=L.start,N=L.stop,g=Math.min(g,F),_=Math.max(_,N);y&&M.receiveShadows&&F<ShadowMap.MAXIMUM_DISTANCE&&!(I===Pass$1.GLOBE&&F<-100&&100<N)&&(O=N-F,I!==Pass$1.GLOBE&&F<100&&(S=Math.min(S,O)),v=Math.min(v,F),C=Math.max(C,N))}else M instanceof ClearCommand?(F=i.frustum.near,N=i.frustum.far):(F=i.frustum.near,N=i.frustum.far,g=Math.min(g,F),_=Math.max(_,N));var B=p[f];defined(B)||(B=p[f]=new CommandExtent),B.command=M,B.near=F,B.far=N,f++}}for(y&&(v=Math.min(Math.max(v,i.frustum.near),i.frustum.far),C=Math.max(Math.min(C,i.frustum.far),v)),y&&(t.shadowState.nearPlane=v,t.shadowState.farPlane=C,t.shadowState.closestObjectSize=S),updateFrustums(this,e,g,_),P=0;P<f;P++)insertIntoBin(this,e,(A=p[P]).command,A.near,A.far);if(f<m)for(P=f;P<m&&defined((A=p[P]).command);P++)A.command=void 0;var V=l.length,k=t.frustumSplits;k.length=V+1;for(var z=0;z<V;++z)k[z]=l[z].near,z===V-1&&(k[z+1]=l[z].far)},View.prototype.destroy=function(){this.pickFramebuffer=this.pickFramebuffer&&this.pickFramebuffer.destroy(),this.pickDepthFramebuffer=this.pickDepthFramebuffer&&this.pickDepthFramebuffer.destroy(),this.sceneFramebuffer=this.sceneFramebuffer&&this.sceneFramebuffer.destroy(),this.globeDepth=this.globeDepth&&this.globeDepth.destroy(),this.oit=this.oit&&this.oit.destroy(),this.globeTranslucencyFramebuffer=this.globeTranslucencyFramebuffer&&this.globeTranslucencyFramebuffer.destroy();for(var e=this.pickDepths,t=this.debugGlobeDepths,i=e.length,r=0;r<i;++r)e[r].destroy();for(i=t.length,r=0;r<i;++r)t[r].destroy()};var offscreenDefaultWidth=.1,mostDetailedPreloadTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.MOST_DETAILED_PRELOAD}),mostDetailedPickTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.MOST_DETAILED_PICK}),pickTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PICK});function Picking(e){this._mostDetailedRayPicks=[],this.pickRenderStateCache={},this._pickPositionCache={},this._pickPositionCacheDirty=!1;var t=new BoundingRectangle(0,0,1,1),i=new Camera(e);i.frustum=new OrthographicFrustum({width:offscreenDefaultWidth,aspectRatio:1,near:.1}),this._pickOffscreenView=new View(e,i,t)}Picking.prototype.update=function(){this._pickPositionCacheDirty=!0},Picking.prototype.getPickDepth=function(e,t){var i=e.view.pickDepths,r=i[t];return defined(r)||(r=new PickDepth,i[t]=r),r};var scratchOrthoPickingFrustum=new OrthographicOffCenterFrustum,scratchOrthoOrigin=new Cartesian3,scratchOrthoDirection=new Cartesian3,scratchOrthoPixelSize=new Cartesian2,scratchOrthoPickVolumeMatrix4=new Matrix4;function getPickOrthographicCullingVolume(e,t,i,r,n){var a=e.camera,o=a.frustum;defined(o._offCenterFrustum)&&(o=o._offCenterFrustum);var s=2*(t.x-n.x)/n.width-1;s*=.5*(o.right-o.left);var l=2*(n.height-t.y-n.y)/n.height-1;l*=.5*(o.top-o.bottom);var c=Matrix4.clone(a.transform,scratchOrthoPickVolumeMatrix4);a._setTransform(Matrix4.IDENTITY);var u=Cartesian3.clone(a.position,scratchOrthoOrigin);Cartesian3.multiplyByScalar(a.right,s,scratchOrthoDirection),Cartesian3.add(scratchOrthoDirection,u,u),Cartesian3.multiplyByScalar(a.up,l,scratchOrthoDirection),Cartesian3.add(scratchOrthoDirection,u,u),a._setTransform(c),e.mode===SceneMode$1.SCENE2D&&Cartesian3.fromElements(u.z,u.x,u.y,u);var d=o.getPixelDimensions(n.width,n.height,1,1,scratchOrthoPixelSize),h=scratchOrthoPickingFrustum;return h.right=.5*d.x,h.left=-h.right,h.top=.5*d.y,h.bottom=-h.top,h.near=o.near,h.far=o.far,h.computeCullingVolume(u,a.directionWC,a.upWC)}var scratchPerspPickingFrustum=new PerspectiveOffCenterFrustum,scratchPerspPixelSize=new Cartesian2;function getPickPerspectiveCullingVolume(e,t,i,r,n){var a=e.camera,o=a.frustum,s=o.near,l=Math.tan(.5*o.fovy),c=o.aspectRatio*l,u=(2*(t.x-n.x)/n.width-1)*s*c,d=(2*(n.height-t.y-n.y)/n.height-1)*s*l,h=o.getPixelDimensions(n.width,n.height,1,1,scratchPerspPixelSize),p=h.x*i*.5,m=h.y*r*.5,f=scratchPerspPickingFrustum;return f.top=d+m,f.bottom=d-m,f.right=u+p,f.left=u-p,f.near=s,f.far=o.far,f.computeCullingVolume(a.positionWC,a.directionWC,a.upWC)}function getPickCullingVolume(e,t,i,r,n){var a=e.camera.frustum;return(a instanceof OrthographicFrustum||a instanceof OrthographicOffCenterFrustum?getPickOrthographicCullingVolume:getPickPerspectiveCullingVolume)(e,t,i,r,n)}var scratchRectangleWidth=3,scratchRectangleHeight=3,scratchRectangle$7=new BoundingRectangle(0,0,scratchRectangleWidth,scratchRectangleHeight),scratchPosition$c=new Cartesian2,scratchColorZero=new Color(0,0,0,0);function renderTranslucentDepthForPick(e,t){var i=e.context,r=e.frameState,n=e.environmentState,a=e.defaultView,o=(e.view=a).viewport;o.x=0,o.y=0,o.width=i.drawingBufferWidth,o.height=i.drawingBufferHeight;var s=a.passState;s.viewport=BoundingRectangle.clone(o,s.viewport),e.clearPasses(r.passes),r.passes.pick=!0,r.passes.depth=!0,r.cullingVolume=getPickCullingVolume(e,t,1,1,o),r.tilesetPassState=pickTilesetPassState,e.updateEnvironment(),n.renderTranslucentDepthForPick=!0,s=a.pickDepthFramebuffer.update(i,t,o),e.updateAndExecuteCommands(s,scratchColorZero),e.resolveFramebuffers(s),i.endFrame()}Picking.prototype.pick=function(e,t,i,r){scratchRectangleWidth=defaultValue(i,3),scratchRectangleHeight=defaultValue(r,scratchRectangleWidth);var n=e.context,a=n.uniformState,o=e.frameState,s=e.defaultView,l=(e.view=s).viewport;l.x=0,l.y=0,l.width=n.drawingBufferWidth,l.height=n.drawingBufferHeight;var c=s.passState;c.viewport=BoundingRectangle.clone(l,c.viewport);var u=SceneTransforms.transformWindowToDrawingBuffer(e,t,scratchPosition$c);e.jobScheduler.disableThisFrame(),e.updateFrameState(),o.cullingVolume=getPickCullingVolume(e,u,scratchRectangleWidth,scratchRectangleHeight,l),o.invertClassification=!1,o.passes.pick=!0,o.tilesetPassState=pickTilesetPassState,a.update(o),e.updateEnvironment(),scratchRectangle$7.x=u.x-.5*(scratchRectangleWidth-1),scratchRectangle$7.y=e.drawingBufferHeight-u.y-.5*(scratchRectangleHeight-1),scratchRectangle$7.width=scratchRectangleWidth,scratchRectangle$7.height=scratchRectangleHeight,c=s.pickFramebuffer.begin(scratchRectangle$7,s.viewport),e.updateAndExecuteCommands(c,scratchColorZero),e.resolveFramebuffers(c);var d=s.pickFramebuffer.end(scratchRectangle$7);return n.endFrame(),d};var scratchPerspectiveFrustum=new PerspectiveFrustum,scratchPerspectiveOffCenterFrustum=new PerspectiveOffCenterFrustum,scratchOrthographicFrustum=new OrthographicFrustum,scratchOrthographicOffCenterFrustum=new OrthographicOffCenterFrustum;Picking.prototype.pickPositionWorldCoordinates=function(e,t,i){if(e.useDepthPicking){var r=t.toString();if(this._pickPositionCacheDirty)this._pickPositionCache={},this._pickPositionCacheDirty=!1;else if(this._pickPositionCache.hasOwnProperty(r))return Cartesian3.clone(this._pickPositionCache[r],i);var n=e.frameState,a=e.context,o=a.uniformState,s=e.defaultView;e.view=s;var l=SceneTransforms.transformWindowToDrawingBuffer(e,t,scratchPosition$c);e.pickTranslucentDepth?renderTranslucentDepthForPick(e,l):(e.updateFrameState(),o.update(n),e.updateEnvironment()),l.y=e.drawingBufferHeight-l.y;for(var c=e.camera,u=defined(c.frustum.fov)?c.frustum.clone(scratchPerspectiveFrustum):defined(c.frustum.infiniteProjectionMatrix)?c.frustum.clone(scratchPerspectiveOffCenterFrustum):defined(c.frustum.width)?c.frustum.clone(scratchOrthographicFrustum):c.frustum.clone(scratchOrthographicOffCenterFrustum),d=s.frustumCommandsList,h=d.length,p=0;p<h;++p){var m=this.getPickDepth(e,p).getDepth(a,l.x,l.y);if(defined(m)&&(0<m&&m<1)){var f,g=d[p];return e.mode===SceneMode$1.SCENE2D?(f=c.position.z,c.position.z=f-g.near+1,u.far=Math.max(1,g.far-g.near),u.near=1,o.update(n)):(u.near=g.near*(0!==p?e.opaqueFrustumNearOffset:1),u.far=g.far),o.updateFrustum(u),i=SceneTransforms.drawingBufferToWgs84Coordinates(e,l,m,i),e.mode===SceneMode$1.SCENE2D&&(c.position.z=f,o.update(n)),this._pickPositionCache[r]=Cartesian3.clone(i),i}}this._pickPositionCache[r]=void 0}};var scratchPickPositionCartographic=new Cartographic;function drillPick(e,t){var i,r,n=[],a=[],o=[],s=[];defined(e)||(e=Number.MAX_VALUE);for(var l=t();defined(l);){var c=l.object,u=l.position,d=l.exclude;if(defined(u)&&!defined(c)){n.push(l);break}if(!defined(c)||!defined(c.primitive))break;if(!d&&(n.push(l),--e<=0))break;var h=c.primitive,p=!1;"function"==typeof h.getGeometryInstanceAttributes&&defined(c.id)&&defined(r=h.getGeometryInstanceAttributes(c.id))&&defined(r.show)&&(p=!0,r.show=ShowGeometryInstanceAttribute.toValue(!1,r.show),o.push(r)),c instanceof Cesium3DTileFeature&&(p=!0,c.show=!1,s.push(c)),p||(h.show=!1,a.push(h)),l=t()}for(i=0;i<a.length;++i)a[i].show=!0;for(i=0;i<o.length;++i)(r=o[i]).show=ShowGeometryInstanceAttribute.toValue(!0,r.show);for(i=0;i<s.length;++i)s[i].show=!0;return n}Picking.prototype.pickPosition=function(e,t,i){var r,n,a;return defined(i=this.pickPositionWorldCoordinates(e,t,i))&&e.mode!==SceneMode$1.SCENE3D&&(Cartesian3.fromElements(i.y,i.z,i.x,i),n=(r=e.mapProjection).ellipsoid,a=r.unproject(i,scratchPickPositionCartographic),n.cartographicToCartesian(a,i)),i},Picking.prototype.drillPick=function(t,i,e,r,n){var a=this;return drillPick(e,function(){var e=a.pick(t,i,r,n);if(defined(e))return{object:e,position:void 0,exclude:!1}}).map(function(e){return e.object})};var scratchRight$3=new Cartesian3,scratchUp$1=new Cartesian3;function MostDetailedRayPick(e,t,i){this.ray=e,this.width=t,this.tilesets=i,this.ready=!1,this.deferred=when.defer(),this.promise=this.deferred.promise}function updateOffscreenCameraFromRay(e,t,i,r){var n=t.direction,a=Cartesian3.mostOrthogonalAxis(n,scratchRight$3),o=Cartesian3.cross(n,a,scratchRight$3),s=Cartesian3.cross(n,o,scratchUp$1);return r.position=t.origin,r.direction=n,r.up=s,r.right=o,r.frustum.width=defaultValue(i,offscreenDefaultWidth),r.frustum.computeCullingVolume(r.positionWC,r.directionWC,r.upWC)}function updateMostDetailedRayPick(e,t,i){var r=t.frameState,n=i.ray,a=i.width,o=i.tilesets,s=e._pickOffscreenView.camera,l=updateOffscreenCameraFromRay(e,n,a,s),c=mostDetailedPreloadTilesetPassState;c.camera=s,c.cullingVolume=l;for(var u=!0,d=o.length,h=0;h<d;++h){var p=o[h];p.show&&t.primitives.contains(p)&&(p.updateForPass(r,c),u=u&&c.ready)}return u&&i.deferred.resolve(),u}function getTilesets(e,t,i){for(var r=e.length,n=0;n<r;++n){var a=e.get(n);a.show&&(defined(a.isCesium3DTileset)?defined(t)&&-1!==t.indexOf(a)||i.push(a):a instanceof PrimitiveCollection&&getTilesets(a,t,i))}}function launchMostDetailedRayPick(e,t,i,r,n,a){var o=[];if(getTilesets(t.primitives,r,o),0===o.length)return when.resolve(a());var s=new MostDetailedRayPick(i,n,o);return e._mostDetailedRayPicks.push(s),s.promise.then(function(){return a()})}function isExcluded(e,t){return!(!defined(e)||!defined(t)||0===t.length)&&(-1<t.indexOf(e)||-1<t.indexOf(e.primitive)||-1<t.indexOf(e.id))}function getRayIntersection(e,t,i,r,n,a,o){var s=t.context,l=s.uniformState,c=t.frameState,u=e._pickOffscreenView;updateOffscreenCameraFromRay(e,i,n,(t.view=u).camera),scratchRectangle$7=BoundingRectangle.clone(u.viewport,scratchRectangle$7);var d=u.pickFramebuffer.begin(scratchRectangle$7,u.viewport);t.jobScheduler.disableThisFrame(),t.updateFrameState(),c.invertClassification=!1,c.passes.pick=!0,c.passes.offscreen=!0,c.tilesetPassState=o?mostDetailedPickTilesetPassState:pickTilesetPassState,l.update(c),t.updateEnvironment(),t.updateAndExecuteCommands(d,scratchColorZero),t.resolveFramebuffers(d);var h=u.pickFramebuffer.end(s);if(t.context.depthTexture)for(var p=u.frustumCommandsList.length,m=0;m<p;++m){var f=e.getPickDepth(t,m).getDepth(s,0,0);if(defined(f)&&(0<f&&f<1)){var g=u.frustumCommandsList[m],_=g.near*(0!==m?t.opaqueFrustumNearOffset:1),y=_+f*(g.far-_),v=Ray.getPoint(i,y);break}}if(t.view=t.defaultView,s.endFrame(),defined(h)||defined(v))return{object:h,position:v,exclude:!defined(v)&&a||isExcluded(h,r)}}function getRayIntersections(e,t,i,r,n,a,o,s){return drillPick(r,function(){return getRayIntersection(e,t,i,n,a,o,s)})}function pickFromRay(e,t,i,r,n,a,o){var s=getRayIntersections(e,t,i,1,r,n,a,o);if(0<s.length)return s[0]}function drillPickFromRay(e,t,i,r,n,a,o,s){return getRayIntersections(e,t,i,r,n,a,o,s)}function deferPromiseUntilPostRender(i,e){var r=when.defer();return e.then(function(e){var t=i.postRender.addEventListener(function(){r.resolve(e),t()});i.requestRender()}).otherwise(function(e){r.reject(e)}),r.promise}Picking.prototype.updateMostDetailedRayPicks=function(e){for(var t=this._mostDetailedRayPicks,i=0;i<t.length;++i)updateMostDetailedRayPick(this,e,t[i])&&t.splice(i--,1)},Picking.prototype.pickFromRay=function(e,t,i,r){return pickFromRay(this,e,t,i,r,!1,!1)},Picking.prototype.drillPickFromRay=function(e,t,i,r,n){return drillPickFromRay(this,e,t,i,r,n,!1,!1)},Picking.prototype.pickFromRayMostDetailed=function(e,t,i,r){var n=this;return t=Ray.clone(t),i=defined(i)?i.slice():i,deferPromiseUntilPostRender(e,launchMostDetailedRayPick(n,e,t,i,r,function(){return pickFromRay(n,e,t,i,r,!1,!0)}))},Picking.prototype.drillPickFromRayMostDetailed=function(e,t,i,r,n){var a=this;return t=Ray.clone(t),r=defined(r)?r.slice():r,deferPromiseUntilPostRender(e,launchMostDetailedRayPick(a,e,t,r,n,function(){return drillPickFromRay(a,e,t,i,r,n,!1,!0)}))};var scratchSurfacePosition=new Cartesian3,scratchSurfaceNormal=new Cartesian3,scratchSurfaceRay=new Ray,scratchCartographic$e=new Cartographic;function getRayForSampleHeight(e,t){var i=e.globe,r=defined(i)?i.ellipsoid:e.mapProjection.ellipsoid,n=ApproximateTerrainHeights._defaultMaxTerrainHeight,a=r.geodeticSurfaceNormalCartographic(t,scratchSurfaceNormal),o=Cartographic.toCartesian(t,r,scratchSurfacePosition),s=scratchSurfaceRay;s.origin=o,s.direction=a;var l=new Ray;return Ray.getPoint(s,n,l.origin),Cartesian3.negate(a,l.direction),l}function getRayForClampToHeight(e,t){var i=e.globe,r=defined(i)?i.ellipsoid:e.mapProjection.ellipsoid;return getRayForSampleHeight(e,Cartographic.fromCartesian(t,r,scratchCartographic$e))}function getHeightFromCartesian(e,t){var i=e.globe,r=defined(i)?i.ellipsoid:e.mapProjection.ellipsoid;return Cartographic.fromCartesian(t,r,scratchCartographic$e).height}function sampleHeightMostDetailed(t,i,e,r,n){var a=getRayForSampleHeight(i,e);return launchMostDetailedRayPick(t,i,a,r,n,function(){var e=pickFromRay(t,i,a,r,n,!0,!0);if(defined(e))return getHeightFromCartesian(i,e.position)})}function clampToHeightMostDetailed(t,i,e,r,n,a){var o=getRayForClampToHeight(i,e);return launchMostDetailedRayPick(t,i,o,r,n,function(){var e=pickFromRay(t,i,o,r,n,!0,!0);if(defined(e))return Cartesian3.clone(e.position,a)})}Picking.prototype.sampleHeight=function(e,t,i,r){var n=pickFromRay(this,e,getRayForSampleHeight(e,t),i,r,!0,!1);if(defined(n))return getHeightFromCartesian(e,n.position)},Picking.prototype.clampToHeight=function(e,t,i,r,n){var a=pickFromRay(this,e,getRayForClampToHeight(e,t),i,r,!0,!1);if(defined(a))return Cartesian3.clone(a.position,n)},Picking.prototype.sampleHeightMostDetailed=function(e,r,t,i){t=defined(t)?t.slice():t;for(var n=r.length,a=new Array(n),o=0;o<n;++o)a[o]=sampleHeightMostDetailed(this,e,r[o],t,i);return deferPromiseUntilPostRender(e,when.all(a).then(function(e){for(var t=e.length,i=0;i<t;++i)r[i].height=e[i];return r}))},Picking.prototype.clampToHeightMostDetailed=function(e,r,t,i){t=defined(t)?t.slice():t;for(var n=r.length,a=new Array(n),o=0;o<n;++o)a[o]=clampToHeightMostDetailed(this,e,r[o],t,i,r[o]);return deferPromiseUntilPostRender(e,when.all(a).then(function(e){for(var t=e.length,i=0;i<t;++i)r[i]=e[i];return r}))},Picking.prototype.destroy=function(){this._pickOffscreenView=this._pickOffscreenView&&this._pickOffscreenView.destroy()};var PostProcessStageSampleMode={NEAREST:0,LINEAR:1};function PostProcessStage(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).fragmentShader,i=defaultValue(e.textureScale,1),r=defaultValue(e.pixelFormat,PixelFormat$1.RGBA);this._fragmentShader=t,this._uniforms=e.uniforms,this._textureScale=i,this._forcePowerOfTwo=defaultValue(e.forcePowerOfTwo,!1),this._sampleMode=defaultValue(e.sampleMode,PostProcessStageSampleMode.NEAREST),this._pixelFormat=r,this._pixelDatatype=defaultValue(e.pixelDatatype,PixelDatatype$1.UNSIGNED_BYTE),this._clearColor=defaultValue(e.clearColor,Color.BLACK),this._uniformMap=void 0,this._command=void 0,this._colorTexture=void 0,this._depthTexture=void 0,this._idTexture=void 0,this._actualUniforms={},this._dirtyUniforms=[],this._texturesToRelease=[],this._texturesToCreate=[],this._texturePromise=void 0;var n=new PassState;n.scissorTest={enabled:!0,rectangle:defined(e.scissorRectangle)?BoundingRectangle.clone(e.scissorRectangle):new BoundingRectangle},this._passState=n,this._ready=!1;var a=e.name;defined(a)||(a=createGuid()),this._name=a,this._logDepthChanged=void 0,this._useLogDepth=void 0,this._selectedIdTexture=void 0,this._selected=void 0,this._selectedShadow=void 0,this._parentSelected=void 0,this._parentSelectedShadow=void 0,this._combinedSelected=void 0,this._combinedSelectedShadow=void 0,this._selectedLength=0,this._parentSelectedLength=0,this._selectedDirty=!0,this._textureCache=void 0,this._index=void 0,this.enabled=!0,this._enabled=!0}Object.defineProperties(PostProcessStage.prototype,{ready:{get:function(){return this._ready}},name:{get:function(){return this._name}},fragmentShader:{get:function(){return this._fragmentShader}},uniforms:{get:function(){return this._uniforms}},textureScale:{get:function(){return this._textureScale}},forcePowerOfTwo:{get:function(){return this._forcePowerOfTwo}},sampleMode:{get:function(){return this._sampleMode}},pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},clearColor:{get:function(){return this._clearColor}},scissorRectangle:{get:function(){return this._passState.scissorTest.rectangle}},outputTexture:{get:function(){if(defined(this._textureCache)){var e=this._textureCache.getFramebuffer(this._name);if(defined(e))return e.getColorTexture(0)}}},selected:{get:function(){return this._selected},set:function(e){this._selected=e}},parentSelected:{get:function(){return this._parentSelected},set:function(e){this._parentSelected=e}}});var depthTextureRegex=/uniform\s+sampler2D\s+depthTexture/g;function getUniformValueGetterAndSetter(n,a,o){var e=a[o];return("string"==typeof e||e instanceof HTMLCanvasElement||e instanceof HTMLImageElement||e instanceof HTMLVideoElement||e instanceof ImageData)&&n._dirtyUniforms.push(o),{get:function(){return a[o]},set:function(e){var t=a[o];a[o]=e;var i=n._actualUniforms,r=i[o];defined(r)&&r!==t&&r instanceof Texture&&!defined(n._textureCache.getStageByName(o))&&(n._texturesToRelease.push(r),delete i[o],delete i[o+"Dimensions"]),t instanceof Texture&&n._texturesToRelease.push(t),"string"==typeof e||e instanceof HTMLCanvasElement||e instanceof HTMLImageElement||e instanceof HTMLVideoElement||e instanceof ImageData?n._dirtyUniforms.push(o):i[o]=e}}}function getUniformMapFunction(t,i){return function(){var e=t._actualUniforms[i];return"function"==typeof e?e():e}}function getUniformMapDimensionsFunction(t,i){return function(){var e=t[i]();if(defined(e))return e.dimensions}}function createUniformMap$5(e){if(!defined(e._uniformMap)){var t,i={},r={},n=e._uniforms,a=e._actualUniforms;for(var o in n){n.hasOwnProperty(o)&&("function"!=typeof n[o]?(i[o]=getUniformMapFunction(e,o),r[o]=getUniformValueGetterAndSetter(e,n,o)):(i[o]=n[o],r[o]=n[o]),a[o]=n[o],("string"==typeof(t=i[o]())||t instanceof Texture||t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||t instanceof HTMLVideoElement)&&(i[o+"Dimensions"]=getUniformMapDimensionsFunction(i,o)))}e._uniforms={},Object.defineProperties(e._uniforms,r),e._uniformMap=combine(i,{colorTexture:function(){return e._colorTexture},colorTextureDimensions:function(){return e._colorTexture.dimensions},depthTexture:function(){return e._depthTexture},depthTextureDimensions:function(){return e._depthTexture.dimensions},czm_idTexture:function(){return e._idTexture},czm_selectedIdTexture:function(){return e._selectedIdTexture},czm_selectedIdTextureStep:function(){return 1/e._selectedIdTexture.width}})}}function createDrawCommand(e,t){var i,r;defined(e._command)&&!e._logDepthChanged&&!e._selectedDirty||(i=e._fragmentShader,defined(e._selectedIdTexture)&&(i="#define CZM_SELECTED_FEATURE \nuniform sampler2D czm_idTexture; \nuniform sampler2D czm_selectedIdTexture; \nuniform float czm_selectedIdTextureStep; \nvarying vec2 v_textureCoordinates; \nbool czm_selected(vec2 offset) \n{ \n bool selected = false;\n vec4 id = texture2D(czm_idTexture, v_textureCoordinates + offset); \n for (int i = 0; i < "+e._selectedIdTexture.width+"; ++i) \n { \n vec4 selectedId = texture2D(czm_selectedIdTexture, vec2((float(i) + 0.5) * czm_selectedIdTextureStep, 0.5)); \n if (all(equal(id, selectedId))) \n { \n return true; \n } \n } \n return false; \n} \n\nbool czm_selected() \n{ \n return czm_selected(vec2(0.0)); \n} \n\n"+(i=i.replace(/varying\s+vec2\s+v_textureCoordinates;/g,""))),r=new ShaderSource({defines:[e._useLogDepth?"LOG_DEPTH":""],sources:[i]}),e._command=t.createViewportQuadCommand(r,{uniformMap:e._uniformMap,owner:e}))}function createSampler(e){var t,i=e._sampleMode===PostProcessStageSampleMode.LINEAR?(t=TextureMinificationFilter$1.LINEAR,TextureMagnificationFilter$1.LINEAR):(t=TextureMinificationFilter$1.NEAREST,TextureMagnificationFilter$1.NEAREST),r=e._sampler;defined(r)&&r.minificationFilter===t&&r.magnificationFilter===i||(e._sampler=new Sampler({wrapS:TextureWrap$1.CLAMP_TO_EDGE,wrapT:TextureWrap$1.CLAMP_TO_EDGE,minificationFilter:t,magnificationFilter:i}))}function createLoadImageFunction(t,i){return function(e){t._texturesToCreate.push({name:i,source:e})}}function createStageOutputTextureFunction(e,t){return function(){return e._textureCache.getOutputTexture(t)}}function updateUniformTextures(e,t){var i,r=e._texturesToRelease,n=r.length;for(h=0;h<n;++h)i=(i=r[h])&&i.destroy();r.length=0;var a=e._texturesToCreate,n=a.length;for(h=0;h<n;++h){var o=a[h],s=o.name,l=o.source;e._actualUniforms[s]=new Texture({context:t,source:l})}a.length=0;var c=e._dirtyUniforms;if(0!==c.length||defined(e._texturePromise)){if(0!==c.length&&!defined(e._texturePromise)){n=c.length;for(var u=e._uniforms,d=[],h=0;h<n;++h){var p,m=u[s=c[h]];defined(e._textureCache.getStageByName(m))?e._actualUniforms[s]=createStageOutputTextureFunction(e,m):"string"==typeof m?(p=new Resource({url:m}),d.push(p.fetchImage().then(createLoadImageFunction(e,s)))):e._texturesToCreate.push({name:s,source:m})}(c.length=0)<d.length?(e._ready=!1,e._texturePromise=when.all(d).then(function(){e._ready=!0,e._texturePromise=void 0})):e._ready=!0}}else e._ready=!0}function releaseResources(e){defined(e._command)&&(e._command.shaderProgram=e._command.shaderProgram&&e._command.shaderProgram.destroy(),e._command=void 0),e._selectedIdTexture=e._selectedIdTexture&&e._selectedIdTexture.destroy();var t=e._textureCache;if(defined(t)){var i=e._uniforms,r=e._actualUniforms;for(var n in r)r.hasOwnProperty(n)&&r[n]instanceof Texture&&(defined(t.getStageByName(i[n]))||r[n].destroy(),e._dirtyUniforms.push(n))}}function isSelectedTextureDirty(e){var t=defined(e._selected)?e._selected.length:0,i=defined(e._parentSelected)?e._parentSelected:0,r=(r=e._selected!==e._selectedShadow||t!==e._selectedLength)||e._parentSelected!==e._parentSelectedShadow||i!==e._parentSelectedLength;if(defined(e._selected)&&defined(e._parentSelected)?e._combinedSelected=e._selected.concat(e._parentSelected):defined(e._parentSelected)?e._combinedSelected=e._parentSelected:e._combinedSelected=e._selected,!r&&defined(e._combinedSelected)){if(!defined(e._combinedSelectedShadow))return!0;t=e._combinedSelected.length;for(var n=0;n<t;++n)if(e._combinedSelected[n]!==e._combinedSelectedShadow[n])return!0}return r}function createSelectedTexture(e,t){if(e._selectedDirty){e._selectedIdTexture=e._selectedIdTexture&&e._selectedIdTexture.destroy(),e._selectedIdTexture=void 0;var i=e._combinedSelected;if(defined(i)){for(var r,n,a=0,o=i.length,s=0;s<o;++s)defined((r=i[s]).pickIds)?a+=r.pickIds.length:defined(r.pickId)&&++a;if(0===o||0===a){var l=new Uint8Array(4);return l[0]=255,l[1]=255,l[2]=255,l[3]=255,void(e._selectedIdTexture=new Texture({context:t,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,source:{arrayBufferView:l,width:1,height:1},sampler:Sampler.NEAREST}))}var c=0,u=new Uint8Array(4*a);for(s=0;s<o;++s)if(defined((r=i[s]).pickIds))for(var d=r.pickIds,h=d.length,p=0;p<h;++p)n=d[p].color,u[c]=Color.floatToByte(n.red),u[c+1]=Color.floatToByte(n.green),u[c+2]=Color.floatToByte(n.blue),u[c+3]=Color.floatToByte(n.alpha),c+=4;else defined(r.pickId)&&(n=r.pickId.color,u[c]=Color.floatToByte(n.red),u[c+1]=Color.floatToByte(n.green),u[c+2]=Color.floatToByte(n.blue),u[c+3]=Color.floatToByte(n.alpha),c+=4);e._selectedIdTexture=new Texture({context:t,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,source:{arrayBufferView:u,width:a,height:1},sampler:Sampler.NEAREST})}}}PostProcessStage.prototype._isSupported=function(e){return!depthTextureRegex.test(this._fragmentShader)||e.depthTexture},PostProcessStage.prototype.update=function(e,t){var i,r,n;this.enabled===this._enabled||this.enabled||releaseResources(this),this._enabled=this.enabled,this._enabled&&(this._logDepthChanged=t!==this._useLogDepth,this._useLogDepth=t,this._selectedDirty=isSelectedTextureDirty(this),this._selectedShadow=this._selected,this._parentSelectedShadow=this._parentSelected,this._combinedSelectedShadow=this._combinedSelected,this._selectedLength=defined(this._selected)?this._selected.length:0,this._parentSelectedLength=defined(this._parentSelected)?this._parentSelected.length:0,createSelectedTexture(this,e),createUniformMap$5(this),updateUniformTextures(this,e),createDrawCommand(this,e),createSampler(this),this._selectedDirty=!1,this._ready&&(i=this._textureCache.getFramebuffer(this._name),defined(this._command.framebuffer=i)&&((r=i.getColorTexture(0)).width===e.drawingBufferWidth&&r.height===e.drawingBufferHeight||defined(n=this._renderState)&&r.width===n.viewport.width&&r.height===n.viewport.height||(this._renderState=RenderState.fromCache({viewport:new BoundingRectangle(0,0,r.width,r.height)})),this._command.renderState=n)))},PostProcessStage.prototype.execute=function(e,t,i,r){var n;defined(this._command)&&defined(this._command.framebuffer)&&this._ready&&this._enabled&&(this._colorTexture=t,this._depthTexture=i,this._idTexture=r,Sampler.equals(this._colorTexture.sampler,this._sampler)||(this._colorTexture.sampler=this._sampler),defined(n=0<this.scissorRectangle.width&&0<this.scissorRectangle.height?this._passState:void 0)&&(n.context=e),this._command.execute(e,n))},PostProcessStage.prototype.isDestroyed=function(){return!1},PostProcessStage.prototype.destroy=function(){return releaseResources(this),destroyObject(this)};var AcesTonemapping="uniform sampler2D colorTexture;\nvarying vec2 v_textureCoordinates;\n#ifdef AUTO_EXPOSURE\nuniform sampler2D autoExposure;\n#endif\nvoid main()\n{\nvec4 fragmentColor = texture2D(colorTexture, v_textureCoordinates);\nvec3 color = fragmentColor.rgb;\n#ifdef AUTO_EXPOSURE\ncolor /= texture2D(autoExposure, vec2(0.5)).r;\n#endif\ncolor = czm_acesTonemapping(color);\ncolor = czm_inverseGamma(color);\ngl_FragColor = vec4(color, fragmentColor.a);\n}\n",AmbientOcclusionGenerate="uniform sampler2D randomTexture;\nuniform sampler2D depthTexture;\nuniform float intensity;\nuniform float bias;\nuniform float lengthCap;\nuniform float stepSize;\nuniform float frustumLength;\nvarying vec2 v_textureCoordinates;\nvec4 clipToEye(vec2 uv, float depth)\n{\nvec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0));\nvec4 posEC = czm_inverseProjection * vec4(xy, depth, 1.0);\nposEC = posEC / posEC.w;\nreturn posEC;\n}\nvec3 getNormalXEdge(vec3 posInCamera, float depthU, float depthD, float depthL, float depthR, vec2 pixelSize)\n{\nvec4 posInCameraUp = clipToEye(v_textureCoordinates - vec2(0.0, pixelSize.y), depthU);\nvec4 posInCameraDown = clipToEye(v_textureCoordinates + vec2(0.0, pixelSize.y), depthD);\nvec4 posInCameraLeft = clipToEye(v_textureCoordinates - vec2(pixelSize.x, 0.0), depthL);\nvec4 posInCameraRight = clipToEye(v_textureCoordinates + vec2(pixelSize.x, 0.0), depthR);\nvec3 up = posInCamera.xyz - posInCameraUp.xyz;\nvec3 down = posInCameraDown.xyz - posInCamera.xyz;\nvec3 left = posInCamera.xyz - posInCameraLeft.xyz;\nvec3 right = posInCameraRight.xyz - posInCamera.xyz;\nvec3 DX = length(left) < length(right) ? left : right;\nvec3 DY = length(up) < length(down) ? up : down;\nreturn normalize(cross(DY, DX));\n}\nvoid main(void)\n{\nfloat depth = czm_readDepth(depthTexture, v_textureCoordinates);\nvec4 posInCamera = clipToEye(v_textureCoordinates, depth);\nif (posInCamera.z > frustumLength)\n{\ngl_FragColor = vec4(1.0);\nreturn;\n}\nvec2 pixelSize = czm_pixelRatio / czm_viewport.zw;\nfloat depthU = czm_readDepth(depthTexture, v_textureCoordinates - vec2(0.0, pixelSize.y));\nfloat depthD = czm_readDepth(depthTexture, v_textureCoordinates + vec2(0.0, pixelSize.y));\nfloat depthL = czm_readDepth(depthTexture, v_textureCoordinates - vec2(pixelSize.x, 0.0));\nfloat depthR = czm_readDepth(depthTexture, v_textureCoordinates + vec2(pixelSize.x, 0.0));\nvec3 normalInCamera = getNormalXEdge(posInCamera.xyz, depthU, depthD, depthL, depthR, pixelSize);\nfloat ao = 0.0;\nvec2 sampleDirection = vec2(1.0, 0.0);\nfloat gapAngle = 90.0 * czm_radiansPerDegree;\nfloat randomVal = texture2D(randomTexture, v_textureCoordinates).x;\nfor (int i = 0; i < 4; i++)\n{\nfloat newGapAngle = gapAngle * (float(i) + randomVal);\nfloat cosVal = cos(newGapAngle);\nfloat sinVal = sin(newGapAngle);\nvec2 rotatedSampleDirection = vec2(cosVal * sampleDirection.x - sinVal * sampleDirection.y, sinVal * sampleDirection.x + cosVal * sampleDirection.y);\nfloat localAO = 0.0;\nfloat localStepSize = stepSize;\nfor (int j = 0; j < 6; j++)\n{\nvec2 newCoords = v_textureCoordinates + rotatedSampleDirection * localStepSize * pixelSize;\nif(newCoords.x > 1.0 || newCoords.y > 1.0 || newCoords.x < 0.0 || newCoords.y < 0.0)\n{\nbreak;\n}\nfloat stepDepthInfo = czm_readDepth(depthTexture, newCoords);\nvec4 stepPosInCamera = clipToEye(newCoords, stepDepthInfo);\nvec3 diffVec = stepPosInCamera.xyz - posInCamera.xyz;\nfloat len = length(diffVec);\nif (len > lengthCap)\n{\nbreak;\n}\nfloat dotVal = clamp(dot(normalInCamera, normalize(diffVec)), 0.0, 1.0 );\nfloat weight = len / lengthCap;\nweight = 1.0 - weight * weight;\nif (dotVal < bias)\n{\ndotVal = 0.0;\n}\nlocalAO = max(localAO, dotVal * weight);\nlocalStepSize += stepSize;\n}\nao += localAO;\n}\nao /= 4.0;\nao = 1.0 - clamp(ao, 0.0, 1.0);\nao = pow(ao, intensity);\ngl_FragColor = vec4(vec3(ao), 1.0);\n}\n",AmbientOcclusionModulate="uniform sampler2D colorTexture;\nuniform sampler2D ambientOcclusionTexture;\nuniform bool ambientOcclusionOnly;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nvec3 color = texture2D(colorTexture, v_textureCoordinates).rgb;\nvec3 ao = texture2D(ambientOcclusionTexture, v_textureCoordinates).rgb;\ngl_FragColor.rgb = ambientOcclusionOnly ? ao : ao * color;\n}\n",BlackAndWhite="uniform sampler2D colorTexture;\nuniform float gradations;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nvec3 rgb = texture2D(colorTexture, v_textureCoordinates).rgb;\n#ifdef CZM_SELECTED_FEATURE\nif (czm_selected()) {\ngl_FragColor = vec4(rgb, 1.0);\nreturn;\n}\n#endif\nfloat luminance = czm_luminance(rgb);\nfloat darkness = luminance * gradations;\ndarkness = (darkness - fract(darkness)) / gradations;\ngl_FragColor = vec4(vec3(darkness), 1.0);\n}\n",BloomComposite="uniform sampler2D colorTexture;\nuniform sampler2D bloomTexture;\nuniform bool glowOnly;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nvec4 color = texture2D(colorTexture, v_textureCoordinates);\n#ifdef CZM_SELECTED_FEATURE\nif (czm_selected()) {\ngl_FragColor = color;\nreturn;\n}\n#endif\nvec4 bloom = texture2D(bloomTexture, v_textureCoordinates);\ngl_FragColor = glowOnly ? bloom : bloom + color;\n}\n",Brightness="uniform sampler2D colorTexture;\nuniform float brightness;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nvec3 rgb = texture2D(colorTexture, v_textureCoordinates).rgb;\nvec3 target = vec3(0.0);\ngl_FragColor = vec4(mix(target, rgb, brightness), 1.0);\n}\n",ContrastBias="uniform sampler2D colorTexture;\nuniform float contrast;\nuniform float brightness;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nvec3 sceneColor = texture2D(colorTexture, v_textureCoordinates).xyz;\nsceneColor = czm_RGBToHSB(sceneColor);\nsceneColor.z += brightness;\nsceneColor = czm_HSBToRGB(sceneColor);\nfloat factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast));\nsceneColor = factor * (sceneColor - vec3(0.5)) + vec3(0.5);\ngl_FragColor = vec4(sceneColor, 1.0);\n}\n",DepthOfField="uniform sampler2D colorTexture;\nuniform sampler2D blurTexture;\nuniform sampler2D depthTexture;\nuniform float focalDistance;\nvarying vec2 v_textureCoordinates;\nvec4 toEye(vec2 uv, float depth)\n{\nvec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0));\nvec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0);\nposInCamera = posInCamera / posInCamera.w;\nreturn posInCamera;\n}\nfloat computeDepthBlur(float depth)\n{\nfloat f;\nif (depth < focalDistance)\n{\nf = (focalDistance - depth) / (focalDistance - czm_currentFrustum.x);\n}\nelse\n{\nf = (depth - focalDistance) / (czm_currentFrustum.y - focalDistance);\nf = pow(f, 0.1);\n}\nf *= f;\nf = clamp(f, 0.0, 1.0);\nreturn pow(f, 0.5);\n}\nvoid main(void)\n{\nfloat depth = czm_readDepth(depthTexture, v_textureCoordinates);\nvec4 posInCamera = toEye(v_textureCoordinates, depth);\nfloat d = computeDepthBlur(-posInCamera.z);\ngl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), texture2D(blurTexture, v_textureCoordinates), d);\n}\n",DepthView="uniform sampler2D depthTexture;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nfloat depth = czm_readDepth(depthTexture, v_textureCoordinates);\ngl_FragColor = vec4(vec3(depth), 1.0);\n}\n",EdgeDetection="uniform sampler2D depthTexture;\nuniform float length;\nuniform vec4 color;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nfloat directions[3];\ndirections[0] = -1.0;\ndirections[1] = 0.0;\ndirections[2] = 1.0;\nfloat scalars[3];\nscalars[0] = 3.0;\nscalars[1] = 10.0;\nscalars[2] = 3.0;\nfloat padx = czm_pixelRatio / czm_viewport.z;\nfloat pady = czm_pixelRatio / czm_viewport.w;\n#ifdef CZM_SELECTED_FEATURE\nbool selected = false;\nfor (int i = 0; i < 3; ++i)\n{\nfloat dir = directions[i];\nselected = selected || czm_selected(vec2(-padx, dir * pady));\nselected = selected || czm_selected(vec2(padx, dir * pady));\nselected = selected || czm_selected(vec2(dir * padx, -pady));\nselected = selected || czm_selected(vec2(dir * padx, pady));\nif (selected)\n{\nbreak;\n}\n}\nif (!selected)\n{\ngl_FragColor = vec4(color.rgb, 0.0);\nreturn;\n}\n#endif\nfloat horizEdge = 0.0;\nfloat vertEdge = 0.0;\nfor (int i = 0; i < 3; ++i)\n{\nfloat dir = directions[i];\nfloat scale = scalars[i];\nhorizEdge -= texture2D(depthTexture, v_textureCoordinates + vec2(-padx, dir * pady)).x * scale;\nhorizEdge += texture2D(depthTexture, v_textureCoordinates + vec2(padx, dir * pady)).x * scale;\nvertEdge -= texture2D(depthTexture, v_textureCoordinates + vec2(dir * padx, -pady)).x * scale;\nvertEdge += texture2D(depthTexture, v_textureCoordinates + vec2(dir * padx, pady)).x * scale;\n}\nfloat len = sqrt(horizEdge * horizEdge + vertEdge * vertEdge);\ngl_FragColor = vec4(color.rgb, len > length ? color.a : 0.0);\n}\n",FilmicTonemapping="uniform sampler2D colorTexture;\nvarying vec2 v_textureCoordinates;\n#ifdef AUTO_EXPOSURE\nuniform sampler2D autoExposure;\n#endif\nvoid main()\n{\nvec4 fragmentColor = texture2D(colorTexture, v_textureCoordinates);\nvec3 color = fragmentColor.rgb;\n#ifdef AUTO_EXPOSURE\nfloat exposure = texture2D(autoExposure, vec2(0.5)).r;\ncolor /= exposure;\n#endif\nconst float A = 0.22;\nconst float B = 0.30;\nconst float C = 0.10;\nconst float D = 0.20;\nconst float E = 0.01;\nconst float F = 0.30;\nconst float white = 11.2;\nvec3 c = ((color * (A * color + C * B) + D * E) / (color * ( A * color + B) + D * F)) - E / F;\nfloat w = ((white * (A * white + C * B) + D * E) / (white * ( A * white + B) + D * F)) - E / F;\nc = czm_inverseGamma(c / w);\ngl_FragColor = vec4(c, fragmentColor.a);\n}\n",FXAA="varying vec2 v_textureCoordinates;\nuniform sampler2D colorTexture;\nconst float fxaaQualitySubpix = 0.5;\nconst float fxaaQualityEdgeThreshold = 0.125;\nconst float fxaaQualityEdgeThresholdMin = 0.0833;\nvoid main()\n{\nvec2 fxaaQualityRcpFrame = vec2(1.0) / czm_viewport.zw;\nvec4 color = FxaaPixelShader(\nv_textureCoordinates,\ncolorTexture,\nfxaaQualityRcpFrame,\nfxaaQualitySubpix,\nfxaaQualityEdgeThreshold,\nfxaaQualityEdgeThresholdMin);\nfloat alpha = texture2D(colorTexture, v_textureCoordinates).a;\ngl_FragColor = vec4(color.rgb, alpha);\n}\n",GaussianBlur1D="#define SAMPLES 8\nuniform float delta;\nuniform float sigma;\nuniform float direction;\nuniform sampler2D colorTexture;\n#ifdef USE_STEP_SIZE\nuniform float stepSize;\n#else\nuniform vec2 step;\n#endif\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nvec2 st = v_textureCoordinates;\nvec2 dir = vec2(1.0 - direction, direction);\n#ifdef USE_STEP_SIZE\nvec2 step = vec2(stepSize * (czm_pixelRatio / czm_viewport.zw));\n#else\nvec2 step = step;\n#endif\nvec3 g;\ng.x = 1.0 / (sqrt(czm_twoPi) * sigma);\ng.y = exp((-0.5 * delta * delta) / (sigma * sigma));\ng.z = g.y * g.y;\nvec4 result = texture2D(colorTexture, st) * g.x;\nfor (int i = 1; i < SAMPLES; ++i)\n{\ng.xy *= g.yz;\nvec2 offset = float(i) * dir * step;\nresult += texture2D(colorTexture, st - offset) * g.x;\nresult += texture2D(colorTexture, st + offset) * g.x;\n}\ngl_FragColor = result;\n}\n",LensFlare="uniform sampler2D colorTexture;\nuniform sampler2D dirtTexture;\nuniform sampler2D starTexture;\nuniform vec2 dirtTextureDimensions;\nuniform float distortion;\nuniform float ghostDispersal;\nuniform float haloWidth;\nuniform float dirtAmount;\nuniform float earthRadius;\nuniform float intensity;\nvarying vec2 v_textureCoordinates;\n#define DISTANCE_TO_SPACE 6500000.0\nvec4 getNDCFromWC(vec3 WC, float earthRadius)\n{\nvec4 positionEC = czm_view * vec4(WC, 1.0);\npositionEC = vec4(positionEC.x + earthRadius, positionEC.y, positionEC.z, 1.0);\nvec4 positionWC = czm_eyeToWindowCoordinates(positionEC);\nreturn czm_viewportOrthographic * vec4(positionWC.xy, -positionWC.z, 1.0);\n}\nfloat isInEarth(vec2 texcoord, vec2 sceneSize)\n{\nvec2 NDC = texcoord * 2.0 - 1.0;\nvec4 earthPosSC = getNDCFromWC(vec3(0.0), 0.0);\nvec4 earthPosSCEdge = getNDCFromWC(vec3(0.0), earthRadius * 1.5);\nNDC.xy -= earthPosSC.xy;\nfloat X = abs(NDC.x) * sceneSize.x;\nfloat Y = abs(NDC.y) * sceneSize.y;\nreturn clamp(0.0, 1.0, max(sqrt(X * X + Y * Y) / max(abs(earthPosSCEdge.x * sceneSize.x), 1.0) - 0.8 , 0.0));\n}\nvec4 textureDistorted(sampler2D tex, vec2 texcoord, vec2 direction, vec3 distortion, bool isSpace)\n{\nvec2 sceneSize = czm_viewport.zw;\nvec3 color;\nif(isSpace)\n{\ncolor.r = isInEarth(texcoord + direction * distortion.r, sceneSize) * texture2D(tex, texcoord + direction * distortion.r).r;\ncolor.g = isInEarth(texcoord + direction * distortion.g, sceneSize) * texture2D(tex, texcoord + direction * distortion.g).g;\ncolor.b = isInEarth(texcoord + direction * distortion.b, sceneSize) * texture2D(tex, texcoord + direction * distortion.b).b;\n}\nelse\n{\ncolor.r = texture2D(tex, texcoord + direction * distortion.r).r;\ncolor.g = texture2D(tex, texcoord + direction * distortion.g).g;\ncolor.b = texture2D(tex, texcoord + direction * distortion.b).b;\n}\nreturn vec4(clamp(color, 0.0, 1.0), 0.0);\n}\nvoid main(void)\n{\nvec4 originalColor = texture2D(colorTexture, v_textureCoordinates);\nvec3 rgb = originalColor.rgb;\nbool isSpace = length(czm_viewerPositionWC.xyz) > DISTANCE_TO_SPACE;\nvec4 sunPos = czm_morphTime == 1.0 ? vec4(czm_sunPositionWC, 1.0) : vec4(czm_sunPositionColumbusView.zxy, 1.0);\nvec4 sunPositionEC = czm_view * sunPos;\nvec4 sunPositionWC = czm_eyeToWindowCoordinates(sunPositionEC);\nsunPos = czm_viewportOrthographic * vec4(sunPositionWC.xy, -sunPositionWC.z, 1.0);\nif(!isSpace || !((sunPos.x >= -1.1 && sunPos.x <= 1.1) && (sunPos.y >= -1.1 && sunPos.y <= 1.1)))\n{\ngl_FragColor = originalColor;\nreturn;\n}\nvec2 texcoord = vec2(1.0) - v_textureCoordinates;\nvec2 pixelSize = czm_pixelRatio / czm_viewport.zw;\nvec2 invPixelSize = 1.0 / pixelSize;\nvec3 distortionVec = pixelSize.x * vec3(-distortion, 0.0, distortion);\nvec2 ghostVec = (vec2(0.5) - texcoord) * ghostDispersal;\nvec3 direction = normalize(vec3(ghostVec, 0.0));\nvec4 result = vec4(0.0);\nvec4 ghost = vec4(0.0);\nfor (int i = 0; i < 4; ++i)\n{\nvec2 offset = fract(texcoord + ghostVec * float(i));\nghost += textureDistorted(colorTexture, offset, direction.xy, distortionVec, isSpace);\n}\nresult += ghost;\nvec2 haloVec = normalize(ghostVec) * haloWidth;\nfloat weightForHalo = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5));\nweightForHalo = pow(1.0 - weightForHalo, 5.0);\nresult += textureDistorted(colorTexture, texcoord + haloVec, direction.xy, distortionVec, isSpace) * weightForHalo * 1.5;\nvec2 dirtTexCoords = (v_textureCoordinates * invPixelSize) / dirtTextureDimensions;\nif (dirtTexCoords.x > 1.0)\n{\ndirtTexCoords.x = mod(floor(dirtTexCoords.x), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.x) : fract(dirtTexCoords.x);\n}\nif (dirtTexCoords.y > 1.0)\n{\ndirtTexCoords.y = mod(floor(dirtTexCoords.y), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.y) : fract(dirtTexCoords.y);\n}\nresult += dirtAmount * texture2D(dirtTexture, dirtTexCoords);\nfloat camrot = czm_view[0].z + czm_view[1].y;\nfloat cosValue = cos(camrot);\nfloat sinValue = sin(camrot);\nmat3 rotation = mat3(\ncosValue, -sinValue, 0.0,\nsinValue, cosValue, 0.0,\n0.0, 0.0, 1.0\n);\nvec3 st1 = vec3(v_textureCoordinates * 2.0 - vec2(1.0), 1.0);\nvec3 st2 = vec3((rotation * st1).xy, 1.0);\nvec3 st3 = st2 * 0.5 + vec3(0.5);\nvec2 lensStarTexcoord = st3.xy;\nfloat weightForLensFlare = length(vec3(sunPos.xy, 0.0));\nfloat oneMinusWeightForLensFlare = max(1.0 - weightForLensFlare, 0.0);\nif (!isSpace)\n{\nresult *= oneMinusWeightForLensFlare * intensity * 0.2;\n}\nelse\n{\nresult *= oneMinusWeightForLensFlare * intensity;\nresult *= texture2D(starTexture, lensStarTexcoord) * pow(weightForLensFlare, 1.0) * max((1.0 - length(vec3(st1.xy, 0.0))), 0.0) * 2.0;\n}\nresult += texture2D(colorTexture, v_textureCoordinates);\ngl_FragColor = result;\n}\n",ModifiedReinhardTonemapping="uniform sampler2D colorTexture;\nuniform vec3 white;\nvarying vec2 v_textureCoordinates;\n#ifdef AUTO_EXPOSURE\nuniform sampler2D autoExposure;\n#endif\nvoid main()\n{\nvec4 fragmentColor = texture2D(colorTexture, v_textureCoordinates);\nvec3 color = fragmentColor.rgb;\n#ifdef AUTO_EXPOSURE\nfloat exposure = texture2D(autoExposure, vec2(0.5)).r;\ncolor /= exposure;\n#endif\ncolor = (color * (1.0 + color / white)) / (1.0 + color);\ncolor = czm_inverseGamma(color);\ngl_FragColor = vec4(color, fragmentColor.a);\n}\n",NightVision="uniform sampler2D colorTexture;\nvarying vec2 v_textureCoordinates;\nfloat rand(vec2 co)\n{\nreturn fract(sin(dot(co.xy ,vec2(12.9898, 78.233))) * 43758.5453);\n}\nvoid main(void)\n{\nfloat noiseValue = rand(v_textureCoordinates + sin(czm_frameNumber)) * 0.1;\nvec3 rgb = texture2D(colorTexture, v_textureCoordinates).rgb;\nvec3 green = vec3(0.0, 1.0, 0.0);\ngl_FragColor = vec4((noiseValue + rgb) * green, 1.0);\n}\n",ReinhardTonemapping="uniform sampler2D colorTexture;\nvarying vec2 v_textureCoordinates;\n#ifdef AUTO_EXPOSURE\nuniform sampler2D autoExposure;\n#endif\nvoid main()\n{\nvec4 fragmentColor = texture2D(colorTexture, v_textureCoordinates);\nvec3 color = fragmentColor.rgb;\n#ifdef AUTO_EXPOSURE\nfloat exposure = texture2D(autoExposure, vec2(0.5)).r;\ncolor /= exposure;\n#endif\ncolor = color / (1.0 + color);\ncolor = czm_inverseGamma(color);\ngl_FragColor = vec4(color, fragmentColor.a);\n}\n",Silhouette="uniform sampler2D colorTexture;\nuniform sampler2D silhouetteTexture;\nvarying vec2 v_textureCoordinates;\nvoid main(void)\n{\nvec4 silhouetteColor = texture2D(silhouetteTexture, v_textureCoordinates);\nvec4 color = texture2D(colorTexture, v_textureCoordinates);\ngl_FragColor = mix(color, silhouetteColor, silhouetteColor.a);\n}\n",FXAA3_11="#if (FXAA_QUALITY_PRESET == 10)\n#define FXAA_QUALITY_PS 3\n#define FXAA_QUALITY_P0 1.5\n#define FXAA_QUALITY_P1 3.0\n#define FXAA_QUALITY_P2 12.0\n#endif\n#if (FXAA_QUALITY_PRESET == 11)\n#define FXAA_QUALITY_PS 4\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 3.0\n#define FXAA_QUALITY_P3 12.0\n#endif\n#if (FXAA_QUALITY_PRESET == 12)\n#define FXAA_QUALITY_PS 5\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 4.0\n#define FXAA_QUALITY_P4 12.0\n#endif\n#if (FXAA_QUALITY_PRESET == 13)\n#define FXAA_QUALITY_PS 6\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 4.0\n#define FXAA_QUALITY_P5 12.0\n#endif\n#if (FXAA_QUALITY_PRESET == 14)\n#define FXAA_QUALITY_PS 7\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 4.0\n#define FXAA_QUALITY_P6 12.0\n#endif\n#if (FXAA_QUALITY_PRESET == 15)\n#define FXAA_QUALITY_PS 8\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 2.0\n#define FXAA_QUALITY_P6 4.0\n#define FXAA_QUALITY_P7 12.0\n#endif\n#if (FXAA_QUALITY_PRESET == 20)\n#define FXAA_QUALITY_PS 3\n#define FXAA_QUALITY_P0 1.5\n#define FXAA_QUALITY_P1 2.0\n#define FXAA_QUALITY_P2 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 21)\n#define FXAA_QUALITY_PS 4\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 22)\n#define FXAA_QUALITY_PS 5\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 23)\n#define FXAA_QUALITY_PS 6\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 24)\n#define FXAA_QUALITY_PS 7\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 3.0\n#define FXAA_QUALITY_P6 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 25)\n#define FXAA_QUALITY_PS 8\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 2.0\n#define FXAA_QUALITY_P6 4.0\n#define FXAA_QUALITY_P7 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 26)\n#define FXAA_QUALITY_PS 9\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 2.0\n#define FXAA_QUALITY_P6 2.0\n#define FXAA_QUALITY_P7 4.0\n#define FXAA_QUALITY_P8 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 27)\n#define FXAA_QUALITY_PS 10\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 2.0\n#define FXAA_QUALITY_P6 2.0\n#define FXAA_QUALITY_P7 2.0\n#define FXAA_QUALITY_P8 4.0\n#define FXAA_QUALITY_P9 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 28)\n#define FXAA_QUALITY_PS 11\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 2.0\n#define FXAA_QUALITY_P6 2.0\n#define FXAA_QUALITY_P7 2.0\n#define FXAA_QUALITY_P8 2.0\n#define FXAA_QUALITY_P9 4.0\n#define FXAA_QUALITY_P10 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 29)\n#define FXAA_QUALITY_PS 12\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.5\n#define FXAA_QUALITY_P2 2.0\n#define FXAA_QUALITY_P3 2.0\n#define FXAA_QUALITY_P4 2.0\n#define FXAA_QUALITY_P5 2.0\n#define FXAA_QUALITY_P6 2.0\n#define FXAA_QUALITY_P7 2.0\n#define FXAA_QUALITY_P8 2.0\n#define FXAA_QUALITY_P9 2.0\n#define FXAA_QUALITY_P10 4.0\n#define FXAA_QUALITY_P11 8.0\n#endif\n#if (FXAA_QUALITY_PRESET == 39)\n#define FXAA_QUALITY_PS 12\n#define FXAA_QUALITY_P0 1.0\n#define FXAA_QUALITY_P1 1.0\n#define FXAA_QUALITY_P2 1.0\n#define FXAA_QUALITY_P3 1.0\n#define FXAA_QUALITY_P4 1.0\n#define FXAA_QUALITY_P5 1.5\n#define FXAA_QUALITY_P6 2.0\n#define FXAA_QUALITY_P7 2.0\n#define FXAA_QUALITY_P8 2.0\n#define FXAA_QUALITY_P9 2.0\n#define FXAA_QUALITY_P10 4.0\n#define FXAA_QUALITY_P11 8.0\n#endif\n#define FxaaBool bool\n#define FxaaFloat float\n#define FxaaFloat2 vec2\n#define FxaaFloat3 vec3\n#define FxaaFloat4 vec4\n#define FxaaHalf float\n#define FxaaHalf2 vec2\n#define FxaaHalf3 vec3\n#define FxaaHalf4 vec4\n#define FxaaInt2 vec2\n#define FxaaTex sampler2D\n#define FxaaSat(x) clamp(x, 0.0, 1.0)\n#define FxaaTexTop(t, p) texture2D(t, p)\n#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r))\nFxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }\nFxaaFloat4 FxaaPixelShader(\nFxaaFloat2 pos,\nFxaaTex tex,\nFxaaFloat2 fxaaQualityRcpFrame,\nFxaaFloat fxaaQualitySubpix,\nFxaaFloat fxaaQualityEdgeThreshold,\nFxaaFloat fxaaQualityEdgeThresholdMin\n) {\nFxaaFloat2 posM;\nposM.x = pos.x;\nposM.y = pos.y;\nFxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n#define lumaM rgbyM.y\nFxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));\nFxaaFloat maxSM = max(lumaS, lumaM);\nFxaaFloat minSM = min(lumaS, lumaM);\nFxaaFloat maxESM = max(lumaE, maxSM);\nFxaaFloat minESM = min(lumaE, minSM);\nFxaaFloat maxWN = max(lumaN, lumaW);\nFxaaFloat minWN = min(lumaN, lumaW);\nFxaaFloat rangeMax = max(maxWN, maxESM);\nFxaaFloat rangeMin = min(minWN, minESM);\nFxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\nFxaaFloat range = rangeMax - rangeMin;\nFxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\nFxaaBool earlyExit = range < rangeMaxClamped;\nif(earlyExit)\nreturn rgbyM;\nFxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\nFxaaFloat lumaNS = lumaN + lumaS;\nFxaaFloat lumaWE = lumaW + lumaE;\nFxaaFloat subpixRcpRange = 1.0/range;\nFxaaFloat subpixNSWE = lumaNS + lumaWE;\nFxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;\nFxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;\nFxaaFloat lumaNESE = lumaNE + lumaSE;\nFxaaFloat lumaNWNE = lumaNW + lumaNE;\nFxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\nFxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\nFxaaFloat lumaNWSW = lumaNW + lumaSW;\nFxaaFloat lumaSWSE = lumaSW + lumaSE;\nFxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\nFxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\nFxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\nFxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\nFxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;\nFxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;\nFxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;\nFxaaFloat lengthSign = fxaaQualityRcpFrame.x;\nFxaaBool horzSpan = edgeHorz >= edgeVert;\nFxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\nif(!horzSpan) lumaN = lumaW;\nif(!horzSpan) lumaS = lumaE;\nif(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\nFxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;\nFxaaFloat gradientN = lumaN - lumaM;\nFxaaFloat gradientS = lumaS - lumaM;\nFxaaFloat lumaNN = lumaN + lumaM;\nFxaaFloat lumaSS = lumaS + lumaM;\nFxaaBool pairN = abs(gradientN) >= abs(gradientS);\nFxaaFloat gradient = max(abs(gradientN), abs(gradientS));\nif(pairN) lengthSign = -lengthSign;\nFxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);\nFxaaFloat2 posB;\nposB.x = posM.x;\nposB.y = posM.y;\nFxaaFloat2 offNP;\noffNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\noffNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\nif(!horzSpan) posB.x += lengthSign * 0.5;\nif( horzSpan) posB.y += lengthSign * 0.5;\nFxaaFloat2 posN;\nposN.x = posB.x - offNP.x * FXAA_QUALITY_P0;\nposN.y = posB.y - offNP.y * FXAA_QUALITY_P0;\nFxaaFloat2 posP;\nposP.x = posB.x + offNP.x * FXAA_QUALITY_P0;\nposP.y = posB.y + offNP.y * FXAA_QUALITY_P0;\nFxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;\nFxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));\nFxaaFloat subpixE = subpixC * subpixC;\nFxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));\nif(!pairN) lumaNN = lumaSS;\nFxaaFloat gradientScaled = gradient * 1.0/4.0;\nFxaaFloat lumaMM = lumaM - lumaNN * 0.5;\nFxaaFloat subpixF = subpixD * subpixE;\nFxaaBool lumaMLTZero = lumaMM < 0.0;\nlumaEndN -= lumaNN * 0.5;\nlumaEndP -= lumaNN * 0.5;\nFxaaBool doneN = abs(lumaEndN) >= gradientScaled;\nFxaaBool doneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;\nFxaaBool doneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;\n#if (FXAA_QUALITY_PS > 3)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;\n#if (FXAA_QUALITY_PS > 4)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;\n#if (FXAA_QUALITY_PS > 5)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;\n#if (FXAA_QUALITY_PS > 6)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;\n#if (FXAA_QUALITY_PS > 7)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;\n#if (FXAA_QUALITY_PS > 8)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;\n#if (FXAA_QUALITY_PS > 9)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;\n#if (FXAA_QUALITY_PS > 10)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;\n#if (FXAA_QUALITY_PS > 11)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;\n#if (FXAA_QUALITY_PS > 12)\nif(doneNP) {\nif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\nif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\nif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\nif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\ndoneN = abs(lumaEndN) >= gradientScaled;\ndoneP = abs(lumaEndP) >= gradientScaled;\nif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;\nif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;\ndoneNP = (!doneN) || (!doneP);\nif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;\nif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\n#endif\n}\nFxaaFloat dstN = posM.x - posN.x;\nFxaaFloat dstP = posP.x - posM.x;\nif(!horzSpan) dstN = posM.y - posN.y;\nif(!horzSpan) dstP = posP.y - posM.y;\nFxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\nFxaaFloat spanLength = (dstP + dstN);\nFxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\nFxaaFloat spanLengthRcp = 1.0/spanLength;\nFxaaBool directionN = dstN < dstP;\nFxaaFloat dst = min(dstN, dstP);\nFxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;\nFxaaFloat subpixG = subpixF * subpixF;\nFxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\nFxaaFloat subpixH = subpixG * fxaaQualitySubpix;\nFxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\nFxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\nif(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\nif( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\nreturn FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);\n}\n";function PostProcessStageComposite(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._stages=e.stages,this._inputPreviousStageTexture=defaultValue(e.inputPreviousStageTexture,!0);var t=e.name;defined(t)||(t=createGuid()),this._name=t,this._uniforms=e.uniforms,this._textureCache=void 0,this._index=void 0,this._selected=void 0,this._selectedShadow=void 0,this._parentSelected=void 0,this._parentSelectedShadow=void 0,this._combinedSelected=void 0,this._combinedSelectedShadow=void 0,this._selectedLength=0,this._parentSelectedLength=0,this._selectedDirty=!0}function isSelectedTextureDirty$1(e){var t=defined(e._selected)?e._selected.length:0,i=defined(e._parentSelected)?e._parentSelected:0,r=(r=e._selected!==e._selectedShadow||t!==e._selectedLength)||e._parentSelected!==e._parentSelectedShadow||i!==e._parentSelectedLength;if(defined(e._selected)&&defined(e._parentSelected)?e._combinedSelected=e._selected.concat(e._parentSelected):defined(e._parentSelected)?e._combinedSelected=e._parentSelected:e._combinedSelected=e._selected,!r&&defined(e._combinedSelected)){if(!defined(e._combinedSelectedShadow))return!0;t=e._combinedSelected.length;for(var n=0;n<t;++n)if(e._combinedSelected[n]!==e._combinedSelectedShadow[n])return!0}return r}Object.defineProperties(PostProcessStageComposite.prototype,{ready:{get:function(){for(var e=this._stages,t=e.length,i=0;i<t;++i)if(!e[i].ready)return!1;return!0}},name:{get:function(){return this._name}},enabled:{get:function(){return this._stages[0].enabled},set:function(e){for(var t=this._stages,i=t.length,r=0;r<i;++r)t[r].enabled=e}},uniforms:{get:function(){return this._uniforms}},inputPreviousStageTexture:{get:function(){return this._inputPreviousStageTexture}},length:{get:function(){return this._stages.length}},selected:{get:function(){return this._selected},set:function(e){this._selected=e}},parentSelected:{get:function(){return this._parentSelected},set:function(e){this._parentSelected=e}}}),PostProcessStageComposite.prototype._isSupported=function(e){for(var t=this._stages,i=t.length,r=0;r<i;++r)if(!t[r]._isSupported(e))return!1;return!0},PostProcessStageComposite.prototype.get=function(e){return this._stages[e]},PostProcessStageComposite.prototype.update=function(e,t){this._selectedDirty=isSelectedTextureDirty$1(this),this._selectedShadow=this._selected,this._parentSelectedShadow=this._parentSelected,this._combinedSelectedShadow=this._combinedSelected,this._selectedLength=defined(this._selected)?this._selected.length:0,this._parentSelectedLength=defined(this._parentSelected)?this._parentSelected.length:0;for(var i=this._stages,r=i.length,n=0;n<r;++n){var a=i[n];this._selectedDirty&&(a.parentSelected=this._combinedSelected),a.update(e,t)}},PostProcessStageComposite.prototype.isDestroyed=function(){return!1},PostProcessStageComposite.prototype.destroy=function(){for(var e=this._stages,t=e.length,i=0;i<t;++i)e[i].destroy();return destroyObject(this)};var PostProcessStageLibrary={};function createBlur(e){var t="#define USE_STEP_SIZE\n"+GaussianBlur1D,r=new PostProcessStage({name:e+"_x_direction",fragmentShader:t,uniforms:{delta:1,sigma:2,stepSize:1,direction:0},sampleMode:PostProcessStageSampleMode.LINEAR}),n=new PostProcessStage({name:e+"_y_direction",fragmentShader:t,uniforms:{delta:1,sigma:2,stepSize:1,direction:1},sampleMode:PostProcessStageSampleMode.LINEAR}),i={};return Object.defineProperties(i,{delta:{get:function(){return r.uniforms.delta},set:function(e){var t=r.uniforms,i=n.uniforms;t.delta=i.delta=e}},sigma:{get:function(){return r.uniforms.sigma},set:function(e){var t=r.uniforms,i=n.uniforms;t.sigma=i.sigma=e}},stepSize:{get:function(){return r.uniforms.stepSize},set:function(e){var t=r.uniforms,i=n.uniforms;t.stepSize=i.stepSize=e}}}),new PostProcessStageComposite({name:e,stages:[r,n],uniforms:i})}function getSilhouetteEdgeDetection(e){if(!defined(e))return PostProcessStageLibrary.createEdgeDetectionStage();for(var t=new PostProcessStageComposite({name:"czm_edge_detection_multiple",stages:e,inputPreviousStageTexture:!1}),i={},r="",n="",a=0;a<e.length;++a)r+="uniform sampler2D edgeTexture"+a+"; \n",n+=" vec4 edge"+a+" = texture2D(edgeTexture"+a+", v_textureCoordinates); \n if (edge"+a+".a > 0.0) \n { \n color = edge"+a+"; \n break; \n } \n",i["edgeTexture"+a]=e[a].name;return new PostProcessStageComposite({name:"czm_edge_detection_composite",stages:[t,new PostProcessStage({name:"czm_edge_detection_combine",fragmentShader:r+"varying vec2 v_textureCoordinates; \nvoid main() { \n vec4 color = vec4(0.0); \n for (int i = 0; i < "+e.length+"; i++) \n { \n"+n+" } \n gl_FragColor = color; \n} \n",uniforms:i})]})}PostProcessStageLibrary.createBlurStage=function(){return createBlur("czm_blur")},PostProcessStageLibrary.createDepthOfFieldStage=function(){var t=createBlur("czm_depth_of_field_blur"),i=new PostProcessStage({name:"czm_depth_of_field_composite",fragmentShader:DepthOfField,uniforms:{focalDistance:5,blurTexture:t.name}}),e={};return Object.defineProperties(e,{focalDistance:{get:function(){return i.uniforms.focalDistance},set:function(e){i.uniforms.focalDistance=e}},delta:{get:function(){return t.uniforms.delta},set:function(e){t.uniforms.delta=e}},sigma:{get:function(){return t.uniforms.sigma},set:function(e){t.uniforms.sigma=e}},stepSize:{get:function(){return t.uniforms.stepSize},set:function(e){t.uniforms.stepSize=e}}}),new PostProcessStageComposite({name:"czm_depth_of_field",stages:[t,i],inputPreviousStageTexture:!1,uniforms:e})},PostProcessStageLibrary.isDepthOfFieldSupported=function(e){return e.context.depthTexture},PostProcessStageLibrary.createEdgeDetectionStage=function(){return new PostProcessStage({name:"czm_edge_detection_"+createGuid(),fragmentShader:EdgeDetection,uniforms:{length:.25,color:Color.clone(Color.BLACK)}})},PostProcessStageLibrary.isEdgeDetectionSupported=function(e){return e.context.depthTexture},PostProcessStageLibrary.createSilhouetteStage=function(e){var t=getSilhouetteEdgeDetection(e);return new PostProcessStageComposite({name:"czm_silhouette",stages:[t,new PostProcessStage({name:"czm_silhouette_color_edges",fragmentShader:Silhouette,uniforms:{silhouetteTexture:t.name}})],inputPreviousStageTexture:!1,uniforms:t.uniforms})},PostProcessStageLibrary.isSilhouetteSupported=function(e){return e.context.depthTexture},PostProcessStageLibrary.createBloomStage=function(){var t=new PostProcessStage({name:"czm_bloom_contrast_bias",fragmentShader:ContrastBias,uniforms:{contrast:128,brightness:-.3}}),i=createBlur("czm_bloom_blur"),e=new PostProcessStageComposite({name:"czm_bloom_contrast_bias_blur",stages:[t,i]}),r=new PostProcessStage({name:"czm_bloom_generate_composite",fragmentShader:BloomComposite,uniforms:{glowOnly:!1,bloomTexture:e.name}}),n={};return Object.defineProperties(n,{glowOnly:{get:function(){return r.uniforms.glowOnly},set:function(e){r.uniforms.glowOnly=e}},contrast:{get:function(){return t.uniforms.contrast},set:function(e){t.uniforms.contrast=e}},brightness:{get:function(){return t.uniforms.brightness},set:function(e){t.uniforms.brightness=e}},delta:{get:function(){return i.uniforms.delta},set:function(e){i.uniforms.delta=e}},sigma:{get:function(){return i.uniforms.sigma},set:function(e){i.uniforms.sigma=e}},stepSize:{get:function(){return i.uniforms.stepSize},set:function(e){i.uniforms.stepSize=e}}}),new PostProcessStageComposite({name:"czm_bloom",stages:[e,r],inputPreviousStageTexture:!1,uniforms:n})},PostProcessStageLibrary.createAmbientOcclusionStage=function(){var t=new PostProcessStage({name:"czm_ambient_occlusion_generate",fragmentShader:AmbientOcclusionGenerate,uniforms:{intensity:3,bias:.1,lengthCap:.26,stepSize:1.95,frustumLength:1e3,randomTexture:void 0}}),i=createBlur("czm_ambient_occlusion_blur");i.uniforms.stepSize=.86;var e=new PostProcessStageComposite({name:"czm_ambient_occlusion_generate_blur",stages:[t,i]}),r=new PostProcessStage({name:"czm_ambient_occlusion_composite",fragmentShader:AmbientOcclusionModulate,uniforms:{ambientOcclusionOnly:!1,ambientOcclusionTexture:e.name}}),n={};return Object.defineProperties(n,{intensity:{get:function(){return t.uniforms.intensity},set:function(e){t.uniforms.intensity=e}},bias:{get:function(){return t.uniforms.bias},set:function(e){t.uniforms.bias=e}},lengthCap:{get:function(){return t.uniforms.lengthCap},set:function(e){t.uniforms.lengthCap=e}},stepSize:{get:function(){return t.uniforms.stepSize},set:function(e){t.uniforms.stepSize=e}},frustumLength:{get:function(){return t.uniforms.frustumLength},set:function(e){t.uniforms.frustumLength=e}},randomTexture:{get:function(){return t.uniforms.randomTexture},set:function(e){t.uniforms.randomTexture=e}},delta:{get:function(){return i.uniforms.delta},set:function(e){i.uniforms.delta=e}},sigma:{get:function(){return i.uniforms.sigma},set:function(e){i.uniforms.sigma=e}},blurStepSize:{get:function(){return i.uniforms.stepSize},set:function(e){i.uniforms.stepSize=e}},ambientOcclusionOnly:{get:function(){return r.uniforms.ambientOcclusionOnly},set:function(e){r.uniforms.ambientOcclusionOnly=e}}}),new PostProcessStageComposite({name:"czm_ambient_occlusion",stages:[e,r],inputPreviousStageTexture:!1,uniforms:n})},PostProcessStageLibrary.isAmbientOcclusionSupported=function(e){return e.context.depthTexture};var fxaaFS="#define FXAA_QUALITY_PRESET 39 \n"+FXAA3_11+"\n"+FXAA;function PostProcessStageTextureCache(e){this._collection=e,this._framebuffers=[],this._stageNameToFramebuffer={},this._width=void 0,this._height=void 0,this._updateDependencies=!1}function getLastStageName(e){for(;defined(e.length);)e=e.get(e.length-1);return e.name}function getStageDependencies(e,t,i,r,n){if(!r.enabled||!r._isSupported(t))return n;var a=i[r.name]={};defined(n)&&(a[getLastStageName(e.getStageByName(n))]=!0);var o=r.uniforms;if(defined(o))for(var s=Object.getOwnPropertyNames(o),l=s.length,c=0;c<l;++c){var u,d=o[s[c]];"string"!=typeof d||defined(u=e.getStageByName(d))&&(a[getLastStageName(u)]=!0)}return r.name}function getCompositeDependencies(e,t,i,r,n){if(defined(r.enabled)&&!r.enabled||defined(r._isSupported)&&!r._isSupported(t))return n;for(var a,o,s=n,l=!defined(r.inputPreviousStageTexture)||r.inputPreviousStageTexture,c=n,u=r.length,d=0;d<u;++d){var h=r.get(d),c=(defined(h.length)?getCompositeDependencies:getStageDependencies)(e,t,i,h,n);l&&(n=c)}if(l)for(a=1;a<u;++a)defined(i[o=getLastStageName(r.get(a))])||(i[o]={}),i[o][s]=!0;else for(a=1;a<u;++a)for(var p=i[o=getLastStageName(r.get(a))],m=0;m<a;++m)p[getLastStageName(r.get(m))]=!0;return c}function getDependencies(e,t){var i,r,n,a,o,s={};return defined(e.ambientOcclusion)?(i=e.ambientOcclusion,r=e.bloom,n=e._tonemapping,a=e.fxaa,o=getCompositeDependencies(e,t,s,i,void 0),o=getStageDependencies(e,t,s,n,o=getCompositeDependencies(e,t,s,r,o)),getStageDependencies(e,t,s,a,o=getCompositeDependencies(e,t,s,e,o))):getCompositeDependencies(e,t,s,e,void 0),s}function getFramebuffer(e,t,i){for(var r,n=e._collection.getStageByName(t),a=n._textureScale,o=n._forcePowerOfTwo,s=n._pixelFormat,l=n._pixelDatatype,c=n._clearColor,u=e._framebuffers,d=u.length,h=0;h<d;++h)if(a===(r=u[h]).textureScale&&o===r.forcePowerOfTwo&&s===r.pixelFormat&&l===r.pixelDatatype&&Color.equals(c,r.clearColor)){for(var p=r.stages,m=p.length,f=!1,g=0;g<m;++g)if(i[p[g]]){f=!0;break}if(!f)break}return defined(r)&&h<d?r.stages.push(t):(r={textureScale:a,forcePowerOfTwo:o,pixelFormat:s,pixelDatatype:l,clearColor:c,stages:[t],buffer:void 0,clear:void 0},u.push(r)),r}function createFramebuffers$3(e,t){var i=getDependencies(e._collection,t);for(var r in i)i.hasOwnProperty(r)&&(e._stageNameToFramebuffer[r]=getFramebuffer(e,r,i[r]))}function releaseResources$1(e){for(var t=e._framebuffers,i=t.length,r=0;r<i;++r){var n=t[r];n.buffer=n.buffer&&n.buffer.destroy(),n.buffer=void 0}}function updateFramebuffers$3(e,t){for(var i=e._width,r=e._height,n=e._framebuffers,a=n.length,o=0;o<a;++o){var s=n[o],l=s.textureScale,c=Math.ceil(i*l),u=Math.ceil(r*l),d=Math.min(c,u);s.forcePowerOfTwo&&(CesiumMath.isPowerOfTwo(d)||(d=CesiumMath.nextPowerOfTwo(d)),u=c=d),s.buffer=new Framebuffer({context:t,colorTextures:[new Texture({context:t,width:c,height:u,pixelFormat:s.pixelFormat,pixelDatatype:s.pixelDatatype})]}),s.clear=new ClearCommand({color:s.clearColor,framebuffer:s.buffer})}}PostProcessStageLibrary.createFXAAStage=function(){return new PostProcessStage({name:"czm_FXAA",fragmentShader:fxaaFS,sampleMode:PostProcessStageSampleMode.LINEAR})},PostProcessStageLibrary.createAcesTonemappingStage=function(e){var t=e?"#define AUTO_EXPOSURE\n":"";return new PostProcessStage({name:"czm_aces",fragmentShader:t+=AcesTonemapping,uniforms:{autoExposure:void 0}})},PostProcessStageLibrary.createFilmicTonemappingStage=function(e){var t=e?"#define AUTO_EXPOSURE\n":"";return new PostProcessStage({name:"czm_filmic",fragmentShader:t+=FilmicTonemapping,uniforms:{autoExposure:void 0}})},PostProcessStageLibrary.createReinhardTonemappingStage=function(e){var t=e?"#define AUTO_EXPOSURE\n":"";return new PostProcessStage({name:"czm_reinhard",fragmentShader:t+=ReinhardTonemapping,uniforms:{autoExposure:void 0}})},PostProcessStageLibrary.createModifiedReinhardTonemappingStage=function(e){var t=e?"#define AUTO_EXPOSURE\n":"";return new PostProcessStage({name:"czm_modified_reinhard",fragmentShader:t+=ModifiedReinhardTonemapping,uniforms:{white:Color.WHITE,autoExposure:void 0}})},PostProcessStageLibrary.createAutoExposureStage=function(){return new AutoExposure},PostProcessStageLibrary.createBlackAndWhiteStage=function(){return new PostProcessStage({name:"czm_black_and_white",fragmentShader:BlackAndWhite,uniforms:{gradations:5}})},PostProcessStageLibrary.createBrightnessStage=function(){return new PostProcessStage({name:"czm_brightness",fragmentShader:Brightness,uniforms:{brightness:.5}})},PostProcessStageLibrary.createNightVisionStage=function(){return new PostProcessStage({name:"czm_night_vision",fragmentShader:NightVision})},PostProcessStageLibrary.createDepthViewStage=function(){return new PostProcessStage({name:"czm_depth_view",fragmentShader:DepthView})},PostProcessStageLibrary.createLensFlareStage=function(){return new PostProcessStage({name:"czm_lens_flare",fragmentShader:LensFlare,uniforms:{dirtTexture:buildModuleUrl("Assets/Textures/LensFlare/DirtMask.jpg"),starTexture:buildModuleUrl("Assets/Textures/LensFlare/StarBurst.jpg"),intensity:2,distortion:10,ghostDispersal:.4,haloWidth:.4,dirtAmount:.4,earthRadius:Ellipsoid.WGS84.maximumRadius}})},PostProcessStageTextureCache.prototype.updateDependencies=function(){this._updateDependencies=!0},PostProcessStageTextureCache.prototype.update=function(e){var t,i,r,n=this._collection,a=this._updateDependencies,o=defined(n.ambientOcclusion)&&n.ambientOcclusion.enabled&&n.ambientOcclusion._isSupported(e),s=defined(n.bloom)&&n.bloom.enabled&&n.bloom._isSupported(e),l=defined(n._tonemapping)&&n._tonemapping.enabled&&n._tonemapping._isSupported(e),c=defined(n.fxaa)&&n.fxaa.enabled&&n.fxaa._isSupported(e),u=!defined(n._activeStages)||0<n._activeStages.length||o||s||l||c;(a||!u&&0<this._framebuffers.length)&&(releaseResources$1(this),this._framebuffers.length=0,this._stageNameToFramebuffer={},this._width=void 0,this._height=void 0),(a||u)&&(0===this._framebuffers.length&&createFramebuffers$3(this,e),t=e.drawingBufferWidth,i=e.drawingBufferHeight,r=this._width!==t||this._height!==i,(a||r)&&(this._width=t,this._height=i,this._updateDependencies=!1,releaseResources$1(this),updateFramebuffers$3(this,e)))},PostProcessStageTextureCache.prototype.clear=function(e){for(var t=this._framebuffers,i=0;i<t.length;++i)t[i].clear.execute(e)},PostProcessStageTextureCache.prototype.getStageByName=function(e){return this._collection.getStageByName(e)},PostProcessStageTextureCache.prototype.getOutputTexture=function(e){return this._collection.getOutputTexture(e)},PostProcessStageTextureCache.prototype.getFramebuffer=function(e){var t=this._stageNameToFramebuffer[e];if(defined(t))return t.buffer},PostProcessStageTextureCache.prototype.isDestroyed=function(){return!1},PostProcessStageTextureCache.prototype.destroy=function(){return releaseResources$1(this),destroyObject(this)};var Tonemapper={REINHARD:0,MODIFIED_REINHARD:1,FILMIC:2,ACES:3,validate:function(e){return e===Tonemapper.REINHARD||e===Tonemapper.MODIFIED_REINHARD||e===Tonemapper.FILMIC||e===Tonemapper.ACES}},Tonemapper$1=Object.freeze(Tonemapper),stackScratch=[];function PostProcessStageCollection(){var e=PostProcessStageLibrary.createFXAAStage(),t=PostProcessStageLibrary.createAmbientOcclusionStage(),i=PostProcessStageLibrary.createBloomStage();this._autoExposureEnabled=!1,this._autoExposure=PostProcessStageLibrary.createAutoExposureStage(),this._tonemapping=void 0,this._tonemapper=void 0,this.tonemapper=Tonemapper$1.ACES;var r=this._tonemapping;e.enabled=!1,t.enabled=!1,i.enabled=!1,r.enabled=!1;var n=new PostProcessStageTextureCache(this),a={},o=stackScratch;for(o.push(e,t,i,r);0<o.length;){var s=o.pop();(a[s.name]=s)._textureCache=n;var l=s.length;if(defined(l))for(var c=0;c<l;++c)o.push(s.get(c))}this._stages=[],this._activeStages=[],this._previousActiveStages=[],this._randomTexture=void 0;var u=this;t.uniforms.randomTexture=function(){return u._randomTexture},this._ao=t,this._bloom=i,this._fxaa=e,this._lastLength=void 0,this._aoEnabled=void 0,this._bloomEnabled=void 0,this._tonemappingEnabled=void 0,this._fxaaEnabled=void 0,this._stagesRemoved=!1,this._textureCacheDirty=!1,this._stageNames=a,this._textureCache=n}function removeStages(e){if(e._stagesRemoved){e._stagesRemoved=!1;for(var t=[],i=e._stages,r=i.length,n=0,a=0;n<r;++n){var o=i[n];o&&(o._index=a++,t.push(o))}e._stages=t}}function getOutputTexture(e){for(;defined(e.length);)e=e.get(e.length-1);return e.outputTexture}function execute(e,t,i,r,n){if(defined(e.execute))e.execute(t,i,r,n);else{var a,o=e.length;if(e.inputPreviousStageTexture)for(execute(e.get(0),t,i,r,n),a=1;a<o;++a)execute(e.get(a),t,getOutputTexture(e.get(a-1)),r,n);else for(a=0;a<o;++a)execute(e.get(a),t,i,r,n)}}function QuadtreeTileProvider(){DeveloperError.throwInstantiationError()}function SceneTransitioner(e){this._scene=e,this._currentTweens=[],this._morphHandler=void 0,this._morphCancelled=!1,this._completeMorph=void 0,this._morphToOrthographic=!1}Object.defineProperties(PostProcessStageCollection.prototype,{ready:{get:function(){for(var e=!1,t=this._stages,i=t.length-1;0<=i;--i)var r=t[i],e=e||r.ready&&r.enabled;var n=this._fxaa,a=this._ao,o=this._bloom,s=this._tonemapping;return e=(e=(e=(e=e||n.ready&&n.enabled)||a.ready&&a.enabled)||o.ready&&o.enabled)||s.ready&&s.enabled}},fxaa:{get:function(){return this._fxaa}},ambientOcclusion:{get:function(){return this._ao}},bloom:{get:function(){return this._bloom}},length:{get:function(){return removeStages(this),this._stages.length}},outputTexture:{get:function(){var e=this._fxaa;if(e.enabled&&e.ready)return this.getOutputTexture(e.name);for(var t=this._stages,i=t.length-1;0<=i;--i){var r=t[i];if(defined(r)&&r.ready&&r.enabled)return this.getOutputTexture(r.name)}var n=this._tonemapping;if(n.enabled&&n.ready)return this.getOutputTexture(n.name);var a=this._bloom;if(a.enabled&&a.ready)return this.getOutputTexture(a.name);var o=this._ao;return o.enabled&&o.ready?this.getOutputTexture(o.name):void 0}},hasSelected:{get:function(){for(var e=arraySlice(this._stages);0<e.length;){var t=e.pop();if(defined(t)){if(defined(t.selected))return!0;var i=t.length;if(defined(i))for(var r=0;r<i;++r)e.push(t.get(r))}}return!1}},tonemapper:{get:function(){return this._tonemapper},set:function(e){if(this._tonemapper!==e){defined(this._tonemapping)&&(delete this._stageNames[this._tonemapping.name],this._tonemapping.destroy());var t,i,r=this._autoExposureEnabled;switch(e){case Tonemapper$1.REINHARD:t=PostProcessStageLibrary.createReinhardTonemappingStage(r);break;case Tonemapper$1.MODIFIED_REINHARD:t=PostProcessStageLibrary.createModifiedReinhardTonemappingStage(r);break;case Tonemapper$1.FILMIC:t=PostProcessStageLibrary.createFilmicTonemappingStage(r);break;default:t=PostProcessStageLibrary.createAcesTonemappingStage(r)}r&&(i=this._autoExposure,t.uniforms.autoExposure=function(){return i.outputTexture}),this._tonemapper=e,this._tonemapping=t,defined(this._stageNames)&&((this._stageNames[t.name]=t)._textureCache=this._textureCache),this._textureCacheDirty=!0}}}}),PostProcessStageCollection.prototype.add=function(e){var t=this._stageNames,i=stackScratch;for(i.push(e);0<i.length;){var r=i.pop();(t[r.name]=r)._textureCache=this._textureCache;var n=r.length;if(defined(n))for(var a=0;a<n;++a)i.push(r.get(a))}var o=this._stages;return e._index=o.length,o.push(e),this._textureCacheDirty=!0,e},PostProcessStageCollection.prototype.remove=function(e){if(!this.contains(e))return!1;var t=this._stageNames,i=stackScratch;for(i.push(e);0<i.length;){var r=i.pop();delete t[r.name];var n=r.length;if(defined(n))for(var a=0;a<n;++a)i.push(r.get(a))}return this._stages[e._index]=void 0,this._stagesRemoved=!0,this._textureCacheDirty=!0,e._index=void 0,e._textureCache=void 0,e.destroy(),!0},PostProcessStageCollection.prototype.contains=function(e){return defined(e)&&defined(e._index)&&e._textureCache===this._textureCache},PostProcessStageCollection.prototype.get=function(e){return removeStages(this),this._stages[e]},PostProcessStageCollection.prototype.removeAll=function(){for(var e=this._stages,t=e.length,i=0;i<t;++i)this.remove(e[i]);e.length=0},PostProcessStageCollection.prototype.getStageByName=function(e){return this._stageNames[e]},PostProcessStageCollection.prototype.update=function(e,t,i){removeStages(this);var r=this._activeStages,n=this._activeStages=this._previousActiveStages;this._previousActiveStages=r;var a,o=this._stages,s=n.length=o.length,l=0;for(C=0;C<s;++C)(a=o[C]).ready&&a.enabled&&a._isSupported(e)&&(n[l++]=a);var c=(n.length=l)!==r.length;if(!c)for(C=0;C<l;++C)if(n[C]!==r[C]){c=!0;break}var u=this._ao,d=this._bloom,h=this._autoExposure,p=this._tonemapping,m=this._fxaa;p.enabled=i;var f=u.enabled&&u._isSupported(e),g=d.enabled&&d._isSupported(e),_=p.enabled&&p._isSupported(e),y=m.enabled&&m._isSupported(e);if((c||this._textureCacheDirty||l!==this._lastLength||f!==this._aoEnabled||g!==this._bloomEnabled||_!==this._tonemappingEnabled||y!==this._fxaaEnabled)&&(this._textureCache.updateDependencies(),this._lastLength=l,this._aoEnabled=f,this._bloomEnabled=g,this._tonemappingEnabled=_,this._fxaaEnabled=y,this._textureCacheDirty=!1),defined(this._randomTexture)&&!f&&(this._randomTexture.destroy(),this._randomTexture=void 0),!defined(this._randomTexture)&&f){s=196608;for(var v=new Uint8Array(s),C=0;C<s;C+=3)v[C]=Math.floor(255*Math.random());this._randomTexture=new Texture({context:e,pixelFormat:PixelFormat$1.RGB,pixelDatatype:PixelDatatype$1.UNSIGNED_BYTE,source:{arrayBufferView:v,width:256,height:256},sampler:new Sampler({wrapS:TextureWrap$1.REPEAT,wrapT:TextureWrap$1.REPEAT,minificationFilter:TextureMinificationFilter$1.NEAREST,magnificationFilter:TextureMagnificationFilter$1.NEAREST})})}for(this._textureCache.update(e),m.update(e,t),u.update(e,t),d.update(e,t),p.update(e,t),this._autoExposureEnabled&&h.update(e,t),s=o.length,C=0;C<s;++C)o[C].update(e,t)},PostProcessStageCollection.prototype.clear=function(e){this._textureCache.clear(e),this._autoExposureEnabled&&this._autoExposure.clear(e)},PostProcessStageCollection.prototype.getOutputTexture=function(e){var t=this.getStageByName(e);if(defined(t))return getOutputTexture(t)},PostProcessStageCollection.prototype.execute=function(e,t,i,r){var n=this._activeStages,a=n.length,o=this._fxaa,s=this._ao,l=this._bloom,c=this._autoExposure,u=this._tonemapping,d=s.enabled&&s._isSupported(e),h=l.enabled&&l._isSupported(e),p=this._autoExposureEnabled,m=u.enabled&&u._isSupported(e),f=o.enabled&&o._isSupported(e);if(f||d||h||m||0!==a){var g=t;d&&s.ready&&(execute(s,e,g,i,r),g=getOutputTexture(s)),h&&l.ready&&(execute(l,e,g,i,r),g=getOutputTexture(l)),p&&c.ready&&execute(c,e,g,i,r),m&&u.ready&&(execute(u,e,g,i,r),g=getOutputTexture(u));var _=g;if(0<a){execute(n[0],e,g,i,r);for(var y=1;y<a;++y)execute(n[y],e,getOutputTexture(n[y-1]),i,r);_=getOutputTexture(n[a-1])}f&&o.ready&&execute(o,e,_,i,r)}},PostProcessStageCollection.prototype.copy=function(e,t){var i;defined(this._copyColorCommand)||((i=this)._copyColorCommand=e.createViewportQuadCommand(PassThrough,{uniformMap:{colorTexture:function(){return i.outputTexture}},owner:this})),this._copyColorCommand.framebuffer=t,this._copyColorCommand.execute(e)},PostProcessStageCollection.prototype.isDestroyed=function(){return!1},PostProcessStageCollection.prototype.destroy=function(){return this._fxaa.destroy(),this._ao.destroy(),this._bloom.destroy(),this._autoExposure.destroy(),this._tonemapping.destroy(),this.removeAll(),this._textureCache=this._textureCache&&this._textureCache.destroy(),destroyObject(this)},QuadtreeTileProvider.computeDefaultLevelZeroMaximumGeometricError=function(e){return 2*e.ellipsoid.maximumRadius*Math.PI*.25/(65*e.getNumberOfXTilesAtLevel(0))},Object.defineProperties(QuadtreeTileProvider.prototype,{quadtree:{get:DeveloperError.throwInstantiationError,set:DeveloperError.throwInstantiationError},ready:{get:DeveloperError.throwInstantiationError},tilingScheme:{get:DeveloperError.throwInstantiationError},errorEvent:{get:DeveloperError.throwInstantiationError}}),QuadtreeTileProvider.prototype.update=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.beginUpdate=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.endUpdate=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.getLevelMaximumGeometricError=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.loadTile=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.computeTileVisibility=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.showTileThisFrame=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.computeDistanceToTile=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.isDestroyed=DeveloperError.throwInstantiationError,QuadtreeTileProvider.prototype.destroy=DeveloperError.throwInstantiationError,SceneTransitioner.prototype.completeMorph=function(){defined(this._completeMorph)&&this._completeMorph()},SceneTransitioner.prototype.morphTo2D=function(e,t){defined(this._completeMorph)&&this._completeMorph();var i=this._scene;this._previousMode=i.mode,this._morphToOrthographic=i.camera.frustum instanceof OrthographicFrustum,this._previousMode!==SceneMode$1.SCENE2D&&this._previousMode!==SceneMode$1.MORPHING&&(this._scene.morphStart.raiseEvent(this,this._previousMode,SceneMode$1.SCENE2D,!0),i._mode=SceneMode$1.MORPHING,i.camera._setTransform(Matrix4.IDENTITY),this._previousMode===SceneMode$1.COLUMBUS_VIEW?morphFromColumbusViewTo2D(this,e):morphFrom3DTo2D(this,e,t),0===e&&defined(this._completeMorph)&&this._completeMorph())};var scratchToCVPosition=new Cartesian3,scratchToCVDirection=new Cartesian3,scratchToCVUp=new Cartesian3,scratchToCVPosition2D=new Cartesian3,scratchToCVDirection2D=new Cartesian3,scratchToCVUp2D=new Cartesian3,scratchToCVSurfacePosition=new Cartesian3,scratchToCVCartographic=new Cartographic,scratchToCVToENU=new Matrix4,scratchToCVFrustumPerspective=new PerspectiveFrustum,scratchToCVFrustumOrthographic=new OrthographicFrustum,scratchToCVCamera={position:void 0,direction:void 0,up:void 0,position2D:void 0,direction2D:void 0,up2D:void 0,frustum:void 0};SceneTransitioner.prototype.morphToColumbusView=function(e,t){defined(this._completeMorph)&&this._completeMorph();var i,r,n,a,o,s,l,c,u,d=this._scene;this._previousMode=d.mode,this._previousMode!==SceneMode$1.COLUMBUS_VIEW&&this._previousMode!==SceneMode$1.MORPHING&&(this._scene.morphStart.raiseEvent(this,this._previousMode,SceneMode$1.COLUMBUS_VIEW,!0),d.camera._setTransform(Matrix4.IDENTITY),i=scratchToCVPosition,r=scratchToCVDirection,n=scratchToCVUp,0<e?(i.x=0,i.y=-1,i.z=1,i=Cartesian3.multiplyByScalar(Cartesian3.normalize(i,i),5*t.maximumRadius,i),Cartesian3.negate(Cartesian3.normalize(i,r),r),Cartesian3.cross(Cartesian3.UNIT_X,r,n)):(a=d.camera,this._previousMode===SceneMode$1.SCENE2D?(Cartesian3.clone(a.position,i),i.z=a.frustum.right-a.frustum.left,Cartesian3.negate(Cartesian3.UNIT_Z,r),Cartesian3.clone(Cartesian3.UNIT_Y,n)):(Cartesian3.clone(a.positionWC,i),Cartesian3.clone(a.directionWC,r),Cartesian3.clone(a.upWC,n),o=t.scaleToGeodeticSurface(i,scratchToCVSurfacePosition),s=Transforms.eastNorthUpToFixedFrame(o,t,scratchToCVToENU),Matrix4.inverseTransformation(s,s),d.mapProjection.project(t.cartesianToCartographic(i,scratchToCVCartographic),i),Matrix4.multiplyByPointAsVector(s,r,r),Matrix4.multiplyByPointAsVector(s,n,n))),this._morphToOrthographic?((l=scratchToCVFrustumOrthographic).width=d.camera.frustum.right-d.camera.frustum.left,l.aspectRatio=d.drawingBufferWidth/d.drawingBufferHeight):((l=scratchToCVFrustumPerspective).aspectRatio=d.drawingBufferWidth/d.drawingBufferHeight,l.fov=CesiumMath.toRadians(60)),(c=scratchToCVCamera).position=i,c.direction=r,c.up=n,c.frustum=l,createMorphHandler(this,u=completeColumbusViewCallback(c)),this._previousMode===SceneMode$1.SCENE2D?morphFrom2DToColumbusView(this,e,c,u):(c.position2D=Matrix4.multiplyByPoint(Camera.TRANSFORM_2D,i,scratchToCVPosition2D),c.direction2D=Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D,r,scratchToCVDirection2D),c.up2D=Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D,n,scratchToCVUp2D),d._mode=SceneMode$1.MORPHING,morphFrom3DToColumbusView(this,e,c,u)),0===e&&defined(this._completeMorph)&&this._completeMorph())};var scratchCVTo3DCamera={position:new Cartesian3,direction:new Cartesian3,up:new Cartesian3,frustum:void 0},scratch2DTo3DFrustumPersp=new PerspectiveFrustum;function createMorphHandler(e,t){var i;e._scene.completeMorphOnUserInput&&(e._morphHandler=new ScreenSpaceEventHandler(e._scene.canvas),i=function(){e._morphCancelled=!0,e._scene.camera.cancelFlight(),t(e)},e._completeMorph=i,e._morphHandler.setInputAction(i,ScreenSpaceEventType$1.LEFT_DOWN),e._morphHandler.setInputAction(i,ScreenSpaceEventType$1.MIDDLE_DOWN),e._morphHandler.setInputAction(i,ScreenSpaceEventType$1.RIGHT_DOWN),e._morphHandler.setInputAction(i,ScreenSpaceEventType$1.WHEEL))}function destroyMorphHandler(e){for(var t=e._currentTweens,i=0;i<t.length;++i)t[i].cancelTween();e._currentTweens.length=0,e._morphHandler=e._morphHandler&&e._morphHandler.destroy()}SceneTransitioner.prototype.morphTo3D=function(e,t){defined(this._completeMorph)&&this._completeMorph();var i,r,n,a,o=this._scene;this._previousMode=o.mode,this._previousMode!==SceneMode$1.SCENE3D&&this._previousMode!==SceneMode$1.MORPHING&&(this._scene.morphStart.raiseEvent(this,this._previousMode,SceneMode$1.SCENE3D,!0),o._mode=SceneMode$1.MORPHING,o.camera._setTransform(Matrix4.IDENTITY),this._previousMode===SceneMode$1.SCENE2D?morphFrom2DTo3D(this,e,t):(0<e?(i=scratchCVTo3DCamera,Cartesian3.fromDegrees(0,0,5*t.maximumRadius,t,i.position),Cartesian3.negate(i.position,i.direction),Cartesian3.normalize(i.direction,i.direction),Cartesian3.clone(Cartesian3.UNIT_Z,i.up)):i=getColumbusViewTo3DCamera(this,t),(n=o.camera).frustum instanceof OrthographicFrustum?r=n.frustum.clone():((r=scratch2DTo3DFrustumPersp).aspectRatio=o.drawingBufferWidth/o.drawingBufferHeight,r.fov=CesiumMath.toRadians(60)),i.frustum=r,createMorphHandler(this,a=complete3DCallback(i)),morphFromColumbusViewTo3D(this,e,i,a)),0===e&&defined(this._completeMorph)&&this._completeMorph())},SceneTransitioner.prototype.isDestroyed=function(){return!1},SceneTransitioner.prototype.destroy=function(){return destroyMorphHandler(this),destroyObject(this)};var scratchCVTo3DCartographic=new Cartographic,scratchCVTo3DSurfacePoint=new Cartesian3,scratchCVTo3DFromENU=new Matrix4;function getColumbusViewTo3DCamera(e,t){var i=e._scene,r=i.camera,n=scratchCVTo3DCamera,a=n.position,o=n.direction,s=n.up,l=i.mapProjection.unproject(r.position,scratchCVTo3DCartographic);t.cartographicToCartesian(l,a);var c=t.scaleToGeodeticSurface(a,scratchCVTo3DSurfacePoint),u=Transforms.eastNorthUpToFixedFrame(c,t,scratchCVTo3DFromENU);return Matrix4.multiplyByPointAsVector(u,r.direction,o),Matrix4.multiplyByPointAsVector(u,r.up,s),n}var scratchCVTo3DStartPos=new Cartesian3,scratchCVTo3DStartDir=new Cartesian3,scratchCVTo3DStartUp=new Cartesian3,scratchCVTo3DEndPos=new Cartesian3,scratchCVTo3DEndDir=new Cartesian3,scratchCVTo3DEndUp=new Cartesian3;function morphFromColumbusViewTo3D(e,t,i,r){t*=.5;var n=e._scene,a=n.camera,o=Cartesian3.clone(a.position,scratchCVTo3DStartPos),s=Cartesian3.clone(a.direction,scratchCVTo3DStartDir),l=Cartesian3.clone(a.up,scratchCVTo3DStartUp),c=Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE,i.position,scratchCVTo3DEndPos),u=Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE,i.direction,scratchCVTo3DEndDir),d=Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D_INVERSE,i.up,scratchCVTo3DEndUp);var h=n.tweens.add({duration:t,easingFunction:EasingFunction$1.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:function(e){columbusViewMorph(o,c,e.time,a.position),columbusViewMorph(s,u,e.time,a.direction),columbusViewMorph(l,d,e.time,a.up),Cartesian3.cross(a.direction,a.up,a.right),Cartesian3.normalize(a.right,a.right)},complete:function(){addMorphTimeAnimations(e,n,0,1,t,r)}});e._currentTweens.push(h)}var scratch2DTo3DFrustumOrtho=new OrthographicFrustum,scratch3DToCVStartPos=new Cartesian3,scratch3DToCVStartDir=new Cartesian3,scratch3DToCVStartUp=new Cartesian3,scratch3DToCVEndPos=new Cartesian3,scratch3DToCVEndDir=new Cartesian3,scratch3DToCVEndUp=new Cartesian3;function morphFrom2DTo3D(e,t,i){t/=3;var r,n,a=e._scene,o=a.camera;0<t?(r=scratchCVTo3DCamera,Cartesian3.fromDegrees(0,0,5*i.maximumRadius,i,r.position),Cartesian3.negate(r.position,r.direction),Cartesian3.normalize(r.direction,r.direction),Cartesian3.clone(Cartesian3.UNIT_Z,r.up)):(o.position.z=o.frustum.right-o.frustum.left,r=getColumbusViewTo3DCamera(e,i)),e._morphToOrthographic?((n=scratch2DTo3DFrustumOrtho).aspectRatio=a.drawingBufferWidth/a.drawingBufferHeight,n.width=o.frustum.right-o.frustum.left):((n=scratch2DTo3DFrustumPersp).aspectRatio=a.drawingBufferWidth/a.drawingBufferHeight,n.fov=CesiumMath.toRadians(60)),r.frustum=n;var s,l=complete3DCallback(r);createMorphHandler(e,l),s=e._morphToOrthographic?function(){morphFromColumbusViewTo3D(e,t,r,l)}:function(){morphOrthographicToPerspective(e,t,r,function(){morphFromColumbusViewTo3D(e,t,r,l)})},0<t?(a._mode=SceneMode$1.SCENE2D,o.flyTo({duration:t,destination:Cartesian3.fromDegrees(0,0,5*i.maximumRadius,i,scratch3DToCVEndPos),complete:function(){a._mode=SceneMode$1.MORPHING,s()}})):s()}function columbusViewMorph(e,t,i,r){return Cartesian3.lerp(e,t,i,r)}function morphPerspectiveToOrthographic(e,t,i,r,n){var a,o,s,l,c=e._scene,u=c.camera;u.frustum instanceof OrthographicFrustum||(a=u.frustum.fov,o=.5*CesiumMath.RADIANS_PER_DEGREE,s=i.position.z*Math.tan(.5*a),u.frustum.far=s/Math.tan(.5*o)+1e7,l=c.tweens.add({duration:t,easingFunction:EasingFunction$1.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:function(e){u.frustum.fov=CesiumMath.lerp(a,o,e.time);var t=s/Math.tan(.5*u.frustum.fov);r(u,t)},complete:function(){u.frustum=i.frustum.clone(),n(e)}}),e._currentTweens.push(l))}var scratchCVTo2DStartPos=new Cartesian3,scratchCVTo2DStartDir=new Cartesian3,scratchCVTo2DStartUp=new Cartesian3,scratchCVTo2DEndPos=new Cartesian3,scratchCVTo2DEndDir=new Cartesian3,scratchCVTo2DEndUp=new Cartesian3,scratchCVTo2DFrustum=new OrthographicOffCenterFrustum,scratchCVTo2DRay=new Ray,scratchCVTo2DPickPos=new Cartesian3,scratchCVTo2DCamera={position:void 0,direction:void 0,up:void 0,frustum:void 0};function morphFromColumbusViewTo2D(e,t){t*=.5;var i,r,n,a=e._scene,o=a.camera,s=Cartesian3.clone(o.position,scratchCVTo2DStartPos),l=Cartesian3.clone(o.direction,scratchCVTo2DStartDir),c=Cartesian3.clone(o.up,scratchCVTo2DStartUp),u=Cartesian3.negate(Cartesian3.UNIT_Z,scratchCVTo2DEndDir),d=Cartesian3.clone(Cartesian3.UNIT_Y,scratchCVTo2DEndUp),h=scratchCVTo2DEndPos;0<t?(Cartesian3.clone(Cartesian3.ZERO,scratchCVTo2DEndPos),h.z=5*a.mapProjection.ellipsoid.maximumRadius):(Cartesian3.clone(s,scratchCVTo2DEndPos),i=scratchCVTo2DRay,Matrix4.multiplyByPoint(Camera.TRANSFORM_2D,s,i.origin),Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D,l,i.direction),!defined(r=a.globe)||defined(n=r.pickWorldCoordinates(i,a,!0,scratchCVTo2DPickPos))&&(Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE,n,h),h.z+=Cartesian3.distance(s,h)));var p=scratchCVTo2DFrustum;p.right=.5*h.z,p.left=-p.right,p.top=p.right*(a.drawingBufferHeight/a.drawingBufferWidth),p.bottom=-p.top;var m=scratchCVTo2DCamera;m.position=h,m.direction=u,m.up=d,m.frustum=p;var f=complete2DCallback(m);function g(e,t){e.position.z=t}createMorphHandler(e,f);var _=a.tweens.add({duration:t,easingFunction:EasingFunction$1.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:function(e){columbusViewMorph(s,h,e.time,o.position),columbusViewMorph(l,u,e.time,o.direction),columbusViewMorph(c,d,e.time,o.up),Cartesian3.cross(o.direction,o.up,o.right),Cartesian3.normalize(o.right,o.right),o._adjustOrthographicFrustum(!0)},complete:function(){morphPerspectiveToOrthographic(e,t,m,g,f)}});e._currentTweens.push(_)}var scratch3DTo2DCartographic=new Cartographic,scratch3DTo2DCamera={position:new Cartesian3,direction:new Cartesian3,up:new Cartesian3,position2D:new Cartesian3,direction2D:new Cartesian3,up2D:new Cartesian3,frustum:new OrthographicOffCenterFrustum},scratch3DTo2DEndCamera={position:new Cartesian3,direction:new Cartesian3,up:new Cartesian3,frustum:void 0},scratch3DTo2DPickPosition=new Cartesian3,scratch3DTo2DRay=new Ray,scratch3DTo2DToENU=new Matrix4,scratch3DTo2DSurfacePoint=new Cartesian3;function morphFrom3DTo2D(e,t,i){t*=.5;var r,n,a,o,s,l,c,u=e._scene,d=u.camera,h=scratch3DTo2DCamera;function p(e,t){e.position.x=t}0<t?(Cartesian3.clone(Cartesian3.ZERO,h.position),h.position.z=5*i.maximumRadius,Cartesian3.negate(Cartesian3.UNIT_Z,h.direction),Cartesian3.clone(Cartesian3.UNIT_Y,h.up)):(i.cartesianToCartographic(d.positionWC,scratch3DTo2DCartographic),u.mapProjection.project(scratch3DTo2DCartographic,h.position),Cartesian3.negate(Cartesian3.UNIT_Z,h.direction),Cartesian3.clone(Cartesian3.UNIT_Y,h.up),r=scratch3DTo2DRay,Cartesian3.clone(h.position2D,r.origin),n=Cartesian3.clone(d.directionWC,r.direction),a=i.scaleToGeodeticSurface(d.positionWC,scratch3DTo2DSurfacePoint),o=Transforms.eastNorthUpToFixedFrame(a,i,scratch3DTo2DToENU),Matrix4.inverseTransformation(o,o),Matrix4.multiplyByPointAsVector(o,n,n),Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D,n,n),!defined(s=u.globe)||defined(l=s.pickWorldCoordinates(r,u,!0,scratch3DTo2DPickPosition))&&(c=Cartesian3.distance(h.position2D,l),l.x+=c,Cartesian3.clone(l,h.position2D))),Matrix4.multiplyByPoint(Camera.TRANSFORM_2D,h.position,h.position2D),Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D,h.direction,h.direction2D),Matrix4.multiplyByPointAsVector(Camera.TRANSFORM_2D,h.up,h.up2D);var m=h.frustum;m.right=.5*h.position.z,m.left=-m.right,m.top=m.right*(u.drawingBufferHeight/u.drawingBufferWidth),m.bottom=-m.top;var f=scratch3DTo2DEndCamera;Matrix4.multiplyByPoint(Camera.TRANSFORM_2D_INVERSE,h.position2D,f.position),Cartesian3.clone(h.direction,f.direction),Cartesian3.clone(h.up,f.up),f.frustum=m;var g=complete2DCallback(f);createMorphHandler(e,g),morphFrom3DToColumbusView(e,t,h,function(){morphPerspectiveToOrthographic(e,t,h,p,g)})}function morphOrthographicToPerspective(e,t,i,r){var n=e._scene,a=n.camera,o=a.frustum.right-a.frustum.left;a.frustum=i.frustum.clone();var s=a.frustum.fov,l=.5*CesiumMath.RADIANS_PER_DEGREE,c=o*Math.tan(.5*s);a.frustum.far=c/Math.tan(.5*l)+1e7,a.frustum.fov=l;var u=n.tweens.add({duration:t,easingFunction:EasingFunction$1.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:function(e){a.frustum.fov=CesiumMath.lerp(l,s,e.time),a.position.z=c/Math.tan(.5*a.frustum.fov)},complete:function(){r(e)}});e._currentTweens.push(u)}function morphFrom2DToColumbusView(n,a,o,s){a*=.5;var l=n._scene,c=l.camera,u=Cartesian3.clone(o.position,scratch3DToCVEndPos),d=Cartesian3.clone(o.direction,scratch3DToCVEndDir),h=Cartesian3.clone(o.up,scratch3DToCVEndUp);function e(){c.frustum=o.frustum.clone();var t=Cartesian3.clone(c.position,scratch3DToCVStartPos),i=Cartesian3.clone(c.direction,scratch3DToCVStartDir),r=Cartesian3.clone(c.up,scratch3DToCVStartUp);t.z=u.z;var e=l.tweens.add({duration:a,easingFunction:EasingFunction$1.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:function(e){columbusViewMorph(t,u,e.time,c.position),columbusViewMorph(i,d,e.time,c.direction),columbusViewMorph(r,h,e.time,c.up),Cartesian3.cross(c.direction,c.up,c.right),Cartesian3.normalize(c.right,c.right)},complete:function(){s(n)}});n._currentTweens.push(e)}l._mode=SceneMode$1.MORPHING,n._morphToOrthographic?e():morphOrthographicToPerspective(n,0,o,e)}function morphFrom3DToColumbusView(e,t,i,r){var n=e._scene,a=n.camera,o=Cartesian3.clone(a.position,scratch3DToCVStartPos),s=Cartesian3.clone(a.direction,scratch3DToCVStartDir),l=Cartesian3.clone(a.up,scratch3DToCVStartUp),c=Cartesian3.clone(i.position2D,scratch3DToCVEndPos),u=Cartesian3.clone(i.direction2D,scratch3DToCVEndDir),d=Cartesian3.clone(i.up2D,scratch3DToCVEndUp);var h=n.tweens.add({duration:t,easingFunction:EasingFunction$1.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:function(e){columbusViewMorph(o,c,e.time,a.position),columbusViewMorph(s,u,e.time,a.direction),columbusViewMorph(l,d,e.time,a.up),Cartesian3.cross(a.direction,a.up,a.right),Cartesian3.normalize(a.right,a.right),a._adjustOrthographicFrustum(!0)},complete:function(){addMorphTimeAnimations(e,n,1,0,t,r)}});e._currentTweens.push(h)}function addMorphTimeAnimations(e,t,i,r,n,a){var o={object:t,property:"morphTime",startValue:i,stopValue:r,duration:n,easingFunction:EasingFunction$1.QUARTIC_OUT};defined(a)&&(o.complete=function(){a(e)});var s=t.tweens.addProperty(o);e._currentTweens.push(s)}function complete3DCallback(a){return function(e){var t=e._scene;t._mode=SceneMode$1.SCENE3D,t.morphTime=SceneMode$1.getMorphTime(SceneMode$1.SCENE3D),destroyMorphHandler(e);var i=t.camera;e._previousMode===SceneMode$1.MORPHING&&!e._morphCancelled||(e._morphCancelled=!1,Cartesian3.clone(a.position,i.position),Cartesian3.clone(a.direction,i.direction),Cartesian3.clone(a.up,i.up),Cartesian3.cross(i.direction,i.up,i.right),Cartesian3.normalize(i.right,i.right),i.frustum=a.frustum.clone());var r=i.frustum;t.frameState.useLogDepth&&(r.near=.1,r.far=1e10);var n=defined(e._completeMorph);e._completeMorph=void 0,t.camera.update(t.mode),e._scene.morphComplete.raiseEvent(e,e._previousMode,SceneMode$1.SCENE3D,n)}}function complete2DCallback(n){return function(e){var t=e._scene;t._mode=SceneMode$1.SCENE2D,t.morphTime=SceneMode$1.getMorphTime(SceneMode$1.SCENE2D),destroyMorphHandler(e);var i=t.camera;Cartesian3.clone(n.position,i.position),i.position.z=2*t.mapProjection.ellipsoid.maximumRadius,Cartesian3.clone(n.direction,i.direction),Cartesian3.clone(n.up,i.up),Cartesian3.cross(i.direction,i.up,i.right),Cartesian3.normalize(i.right,i.right),i.frustum=n.frustum.clone();var r=defined(e._completeMorph);e._completeMorph=void 0,t.camera.update(t.mode),e._scene.morphComplete.raiseEvent(e,e._previousMode,SceneMode$1.SCENE2D,r)}}function completeColumbusViewCallback(a){return function(e){var t=e._scene;t._mode=SceneMode$1.COLUMBUS_VIEW,t.morphTime=SceneMode$1.getMorphTime(SceneMode$1.COLUMBUS_VIEW),destroyMorphHandler(e);var i=t.camera;e._previousModeMode===SceneMode$1.MORPHING&&!e._morphCancelled||(e._morphCancelled=!1,Cartesian3.clone(a.position,i.position),Cartesian3.clone(a.direction,i.direction),Cartesian3.clone(a.up,i.up),Cartesian3.cross(i.direction,i.up,i.right),Cartesian3.normalize(i.right,i.right));var r=i.frustum;t.frameState.useLogDepth&&(r.near=.1,r.far=1e10);var n=defined(e._completeMorph);e._completeMorph=void 0,t.camera.update(t.mode),e._scene.morphComplete.raiseEvent(e,e._previousMode,SceneMode$1.COLUMBUS_VIEW,n)}}function Tween(e,t,i,r,n,a,o,s,l,c){this._tweens=e,this._tweenjs=t,this._startObject=clone(i),this._stopObject=clone(r),this._duration=n,this._delay=a,this._easingFunction=o,this._update=s,this._complete=l,this.cancel=c,this.needsStart=!0}function TweenCollection(){this._tweens=[]}function ScreenSpaceCameraController(e){this.enableInputs=!0,this.enableTranslate=!0,this.enableZoom=!0,this.enableRotate=!0,this.enableTilt=!0,this.enableLook=!0,this.inertiaSpin=.9,this.inertiaTranslate=.9,this.inertiaZoom=.8,this.maximumMovementRatio=.1,this.bounceAnimationTime=3,this.minimumZoomDistance=1,this.maximumZoomDistance=Number.POSITIVE_INFINITY,this.translateEventTypes=CameraEventType$1.LEFT_DRAG,this.zoomEventTypes=[CameraEventType$1.RIGHT_DRAG,CameraEventType$1.WHEEL,CameraEventType$1.PINCH],this.rotateEventTypes=CameraEventType$1.LEFT_DRAG,this.tiltEventTypes=[CameraEventType$1.MIDDLE_DRAG,CameraEventType$1.PINCH,{eventType:CameraEventType$1.LEFT_DRAG,modifier:KeyboardEventModifier$1.CTRL},{eventType:CameraEventType$1.RIGHT_DRAG,modifier:KeyboardEventModifier$1.CTRL}],this.lookEventTypes={eventType:CameraEventType$1.LEFT_DRAG,modifier:KeyboardEventModifier$1.SHIFT},this.minimumPickingTerrainHeight=15e4,this._minimumPickingTerrainHeight=this.minimumPickingTerrainHeight,this.minimumCollisionTerrainHeight=15e3,this._minimumCollisionTerrainHeight=this.minimumCollisionTerrainHeight,this.minimumTrackBallHeight=75e5,this._minimumTrackBallHeight=this.minimumTrackBallHeight,this.enableCollisionDetection=!0,this._scene=e,this._globe=void 0,this._ellipsoid=void 0,this._aggregator=new CameraEventAggregator(e.canvas),this._lastInertiaSpinMovement=void 0,this._lastInertiaZoomMovement=void 0,this._lastInertiaTranslateMovement=void 0,this._lastInertiaTiltMovement=void 0,this._inertiaDisablers={_lastInertiaZoomMovement:["_lastInertiaSpinMovement","_lastInertiaTranslateMovement","_lastInertiaTiltMovement"],_lastInertiaTiltMovement:["_lastInertiaSpinMovement","_lastInertiaTranslateMovement"]},this._tweens=new TweenCollection,this._tween=void 0,this._horizontalRotationAxis=void 0,this._tiltCenterMousePosition=new Cartesian2(-1,-1),this._tiltCenter=new Cartesian3,this._rotateMousePosition=new Cartesian2(-1,-1),this._rotateStartPosition=new Cartesian3,this._strafeStartPosition=new Cartesian3,this._strafeMousePosition=new Cartesian2,this._strafeEndMousePosition=new Cartesian2,this._zoomMouseStart=new Cartesian2(-1,-1),this._zoomWorldPosition=new Cartesian3,this._useZoomWorldPosition=!1,this._tiltCVOffMap=!1,this._looking=!1,this._rotating=!1,this._strafing=!1,this._zoomingOnVector=!1,this._zoomingUnderground=!1,this._rotatingZoom=!1,this._adjustedHeightForTerrain=!1,this._cameraUnderground=!1;var t=e.mapProjection;this._maxCoord=t.project(new Cartographic(Math.PI,CesiumMath.PI_OVER_TWO)),this._zoomFactor=5,this._rotateFactor=void 0,this._rotateRateRangeAdjustment=void 0,this._maximumRotateRate=1.77,this._minimumRotateRate=2e-4,this._minimumZoomRate=20,this._maximumZoomRate=5906376272e3,this._minimumUndergroundPickDistance=2e3,this._maximumUndergroundPickDistance=1e4}function decay(e,t){if(e<0)return 0;var i=25*(1-t);return Math.exp(-i*e)}function sameMousePosition(e){return Cartesian2.equalsEpsilon(e.startPosition,e.endPosition,CesiumMath.EPSILON14)}Object.defineProperties(Tween.prototype,{startObject:{get:function(){return this._startObject}},stopObject:{get:function(){return this._stopObject}},duration:{get:function(){return this._duration}},delay:{get:function(){return this._delay}},easingFunction:{get:function(){return this._easingFunction}},update:{get:function(){return this._update}},complete:{get:function(){return this._complete}},tweenjs:{get:function(){return this._tweenjs}}}),Tween.prototype.cancelTween=function(){this._tweens.remove(this)},Object.defineProperties(TweenCollection.prototype,{length:{get:function(){return this._tweens.length}}}),TweenCollection.prototype.add=function(e){if(0===(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).duration)return defined(e.complete)&&e.complete(),new Tween(this);var t=e.duration/TimeConstants$1.SECONDS_PER_MILLISECOND,i=defaultValue(e.delay,0),r=i/TimeConstants$1.SECONDS_PER_MILLISECOND,n=defaultValue(e.easingFunction,EasingFunction$1.LINEAR_NONE),a=e.startObject,o=new TWEEN.Tween(a);o.to(clone(e.stopObject),t),o.delay(r),o.easing(n),defined(e.update)&&o.onUpdate(function(){e.update(a)}),o.onComplete(defaultValue(e.complete,null)),o.repeat(defaultValue(e._repeat,0));var s=new Tween(this,o,e.startObject,e.stopObject,e.duration,i,n,e.update,e.complete,e.cancel);return this._tweens.push(s),s},TweenCollection.prototype.addProperty=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).object,i=e.property,r=e.startValue,n=e.stopValue;return this.add({startObject:{value:r},stopObject:{value:n},duration:defaultValue(e.duration,3),delay:e.delay,easingFunction:e.easingFunction,update:function(e){t[i]=e.value},complete:e.complete,cancel:e.cancel,_repeat:e._repeat})},TweenCollection.prototype.addAlpha=function(e){var r=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).material,n=[];for(var t in r.uniforms)r.uniforms.hasOwnProperty(t)&&defined(r.uniforms[t])&&defined(r.uniforms[t].alpha)&&n.push(t);return this.add({startObject:{alpha:defaultValue(e.startValue,0)},stopObject:{alpha:defaultValue(e.stopValue,1)},duration:defaultValue(e.duration,3),delay:e.delay,easingFunction:e.easingFunction,update:function(e){for(var t=n.length,i=0;i<t;++i)r.uniforms[n[i]].alpha=e.alpha},complete:e.complete,cancel:e.cancel})},TweenCollection.prototype.addOffsetIncrement=function(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).material.uniforms;return this.addProperty({object:t,property:"offset",startValue:t.offset,stopValue:t.offset+1,duration:e.duration,delay:e.delay,easingFunction:e.easingFunction,update:e.update,cancel:e.cancel,_repeat:1/0})},TweenCollection.prototype.remove=function(e){if(!defined(e))return!1;var t=this._tweens.indexOf(e);return-1!==t&&(e.tweenjs.stop(),defined(e.cancel)&&e.cancel(),this._tweens.splice(t,1),!0)},TweenCollection.prototype.removeAll=function(){for(var e=this._tweens,t=0;t<e.length;++t){var i=e[t];i.tweenjs.stop(),defined(i.cancel)&&i.cancel()}e.length=0},TweenCollection.prototype.contains=function(e){return defined(e)&&-1!==this._tweens.indexOf(e)},TweenCollection.prototype.get=function(e){return this._tweens[e]},TweenCollection.prototype.update=function(e){var t=this._tweens,i=0;for(e=defined(e)?e/TimeConstants$1.SECONDS_PER_MILLISECOND:getTimestamp$1();i<t.length;){var r=t[i],n=r.tweenjs;r.needsStart?(r.needsStart=!1,n.start(e)):n.update(e)?i++:(n.stop(),t.splice(i,1))}};var inertiaMaxClickTimeThreshold=.4;function maintainInertia(e,t,i,r,n,a,o){var s=a[o];defined(s)||(s=a[o]={startPosition:new Cartesian2,endPosition:new Cartesian2,motion:new Cartesian2,inertiaEnabled:!0});var l=e.getButtonPressTime(t,i),c=e.getButtonReleaseTime(t,i),u=l&&c&&(c.getTime()-l.getTime())/1e3,d=new Date,h=c&&(d.getTime()-c.getTime())/1e3;if(l&&c&&u<inertiaMaxClickTimeThreshold){var p=decay(h,r),m=e.getLastMovement(t,i);if(!defined(m)||sameMousePosition(m)||!s.inertiaEnabled)return;if(s.motion.x=.5*(m.endPosition.x-m.startPosition.x),s.motion.y=.5*(m.endPosition.y-m.startPosition.y),s.startPosition=Cartesian2.clone(m.startPosition,s.startPosition),s.endPosition=Cartesian2.multiplyByScalar(s.motion,p,s.endPosition),s.endPosition=Cartesian2.add(s.startPosition,s.endPosition,s.endPosition),isNaN(s.endPosition.x)||isNaN(s.endPosition.y)||Cartesian2.distance(s.startPosition,s.endPosition)<.5)return;e.isButtonDown(t,i)||n(a,e.getStartMousePosition(t,i),s)}}function activateInertia(e,t){if(defined(t)){var i=e[t];defined(i)&&(i.inertiaEnabled=!0);var r=e._inertiaDisablers[t];if(defined(r))for(var n=r.length,a=0;a<n;++a)defined(i=e[r[a]])&&(i.inertiaEnabled=!1)}}var scratchEventTypeArray=[];function reactToInput(e,t,i,r,n,a){if(defined(i)){var o=e._aggregator;Array.isArray(i)||(scratchEventTypeArray[0]=i,i=scratchEventTypeArray);for(var s=i.length,l=0;l<s;++l){var c=i[l],u=defined(c.eventType)?c.eventType:c,d=c.modifier,h=o.isMoving(u,d)&&o.getMovement(u,d),p=o.getStartMousePosition(u,d);e.enableInputs&&t&&(h?(r(e,p,h),activateInertia(e,a)):n<1&&maintainInertia(o,u,d,n,r,e,a))}}}var scratchZoomPickRay=new Ray,scratchPickCartesian=new Cartesian3,scratchZoomOffset=new Cartesian2,scratchZoomDirection=new Cartesian3,scratchCenterPixel=new Cartesian2,scratchCenterPosition=new Cartesian3,scratchPositionNormal$2=new Cartesian3,scratchPickNormal=new Cartesian3,scratchZoomAxis=new Cartesian3,scratchCameraPositionNormal=new Cartesian3,scratchTargetNormal=new Cartesian3,scratchCameraPosition$1=new Cartesian3,scratchCameraUpNormal=new Cartesian3,scratchCameraRightNormal=new Cartesian3,scratchForwardNormal=new Cartesian3,scratchPositionToTarget=new Cartesian3,scratchPositionToTargetNormal=new Cartesian3,scratchPan=new Cartesian3,scratchCenterMovement=new Cartesian3,scratchCenter$6=new Cartesian3,scratchCartesian$9=new Cartesian3,scratchCartesianTwo=new Cartesian3,scratchCartesianThree=new Cartesian3,scratchZoomViewOptions={orientation:new HeadingPitchRoll};function handleZoom(e,t,i,r,n,a){var o=1;defined(a)&&(o=CesiumMath.clamp(Math.abs(a),.25,1));var s=e.minimumZoomDistance*o,l=e.maximumZoomDistance,c=r*(n-s),c=CesiumMath.clamp(c,e._minimumZoomRate,e._maximumZoomRate),u=(i.endPosition.y-i.startPosition.y)/e._scene.canvas.clientHeight,d=c*(u=Math.min(u,e.maximumMovementRatio));if(e.enableCollisionDetection||0===e.minimumZoomDistance||!defined(e._globe)){if(0<d&&Math.abs(n-s)<1)return;if(d<0&&Math.abs(n-l)<1)return;n-d<s?d=n-s-1:l<n-d&&(d=n-l)}var h=e._scene,p=h.camera,m=h.mode,f=scratchZoomViewOptions.orientation;if(f.heading=p.heading,f.pitch=p.pitch,f.roll=p.roll,p.frustum instanceof OrthographicFrustum)0<Math.abs(d)&&(p.zoomIn(d),p._adjustOrthographicFrustum());else{var g,_=Cartesian2.equals(t,e._zoomMouseStart),y=e._zoomingOnVector,v=e._rotatingZoom;if(_||(e._zoomMouseStart=Cartesian2.clone(t,e._zoomMouseStart),defined(e._globe)&&(g=m===SceneMode$1.SCENE2D?(g=p.getPickRay(t,scratchZoomPickRay).origin,Cartesian3.fromElements(g.y,g.z,g.x)):pickGlobe(e,t,scratchPickCartesian)),defined(g)?(e._useZoomWorldPosition=!0,e._zoomWorldPosition=Cartesian3.clone(g,e._zoomWorldPosition)):e._useZoomWorldPosition=!1,y=e._zoomingOnVector=!1,v=e._rotatingZoom=!1,e._zoomingUnderground=e._cameraUnderground),e._useZoomWorldPosition){var C,S,T=m===SceneMode$1.COLUMBUS_VIEW;if(p.positionCartographic.height<2e6&&(v=!0),!_||v){if(m===SceneMode$1.SCENE2D){var x,b,E,P=e._zoomWorldPosition,A=p.position;!Cartesian3.equals(P,A)&&p.positionCartographic.height<2*e._maxCoord.x&&(x=p.position.x,b=Cartesian3.subtract(P,A,scratchZoomDirection),Cartesian3.normalize(b,b),E=Cartesian3.distance(P,A)*d/(.5*p.getMagnitude()),p.move(b,.5*E),(p.position.x<0&&0<x||0<p.position.x&&x<0)&&(g=p.getPickRay(t,scratchZoomPickRay).origin,g=Cartesian3.fromElements(g.y,g.z,g.x),e._zoomWorldPosition=Cartesian3.clone(g,e._zoomWorldPosition)))}else if(m===SceneMode$1.SCENE3D){var w=Cartesian3.normalize(p.position,scratchCameraPositionNormal);if(e._cameraUnderground||e._zoomingUnderground||p.positionCartographic.height<3e3&&Math.abs(Cartesian3.dot(p.direction,w))<.6)T=!0;else{var D=h.canvas,M=scratchCenterPixel;M.x=D.clientWidth/2,M.y=D.clientHeight/2;var I,R,O,L,F,N,B=pickGlobe(e,M,scratchCenterPosition);if(defined(B)&&p.positionCartographic.height<1e6){var V=scratchCameraPosition$1;Cartesian3.clone(p.position,V);var k=e._zoomWorldPosition,z=scratchTargetNormal,z=Cartesian3.normalize(k,z);if(Cartesian3.dot(z,w)<0)return;var $=scratchCenter$6,U=scratchForwardNormal;Cartesian3.clone(p.direction,U),Cartesian3.add(V,Cartesian3.multiplyByScalar(U,1e3,scratchCartesian$9),$);var G=scratchPositionToTarget,H=scratchPositionToTargetNormal;Cartesian3.subtract(k,V,G),Cartesian3.normalize(G,H);var W=Cartesian3.dot(w,H);if(0<=W)return void(e._zoomMouseStart.x=-1);var q=Math.acos(-W),j=Cartesian3.magnitude(V),Y=Cartesian3.magnitude(k),X=j-d,Q=Cartesian3.magnitude(G),J=Math.asin(CesiumMath.clamp(Q/Y*Math.sin(q),-1,1))-Math.asin(CesiumMath.clamp(X/Y*Math.sin(q),-1,1))+q,Z=scratchCameraUpNormal;Cartesian3.normalize(V,Z);var K=scratchCameraRightNormal,K=Cartesian3.cross(H,Z,K);K=Cartesian3.normalize(K,K),Cartesian3.normalize(Cartesian3.cross(Z,K,scratchCartesian$9),U),Cartesian3.multiplyByScalar(Cartesian3.normalize($,scratchCartesian$9),Cartesian3.magnitude($)-d,$),Cartesian3.normalize(V,V),Cartesian3.multiplyByScalar(V,X,V);var ee=scratchPan;Cartesian3.multiplyByScalar(Cartesian3.add(Cartesian3.multiplyByScalar(Z,Math.cos(J)-1,scratchCartesianTwo),Cartesian3.multiplyByScalar(U,Math.sin(J),scratchCartesianThree),scratchCartesian$9),X,ee),Cartesian3.add(V,ee,V),Cartesian3.normalize($,Z),Cartesian3.normalize(Cartesian3.cross(Z,K,scratchCartesian$9),U);var te=scratchCenterMovement;return Cartesian3.multiplyByScalar(Cartesian3.add(Cartesian3.multiplyByScalar(Z,Math.cos(J)-1,scratchCartesianTwo),Cartesian3.multiplyByScalar(U,Math.sin(J),scratchCartesianThree),scratchCartesian$9),Cartesian3.magnitude($),te),Cartesian3.add($,te,$),Cartesian3.clone(V,p.position),Cartesian3.normalize(Cartesian3.subtract($,V,scratchCartesian$9),p.direction),Cartesian3.clone(p.direction,p.direction),Cartesian3.cross(p.direction,p.up,p.right),Cartesian3.cross(p.right,p.direction,p.up),void p.setView(scratchZoomViewOptions)}defined(B)?(I=Cartesian3.normalize(B,scratchPositionNormal$2),R=Cartesian3.normalize(e._zoomWorldPosition,scratchPickNormal),0<(O=Cartesian3.dot(R,I))&&O<1&&(L=CesiumMath.acosClamped(O),F=Cartesian3.cross(R,I,scratchZoomAxis),N=d/(Math.abs(L)>CesiumMath.toRadians(20)?.75*p.positionCartographic.height:p.positionCartographic.height-d),p.rotate(F,L*N))):T=!0}}e._rotatingZoom=!T}!_&&T||y?(C=SceneTransforms.wgs84ToWindowCoordinates(h,e._zoomWorldPosition,scratchZoomOffset),S=(m!==SceneMode$1.COLUMBUS_VIEW&&Cartesian2.equals(t,e._zoomMouseStart)&&defined(C)?p.getPickRay(C,scratchZoomPickRay):p.getPickRay(t,scratchZoomPickRay)).direction,m!==SceneMode$1.COLUMBUS_VIEW&&m!==SceneMode$1.SCENE2D||Cartesian3.fromElements(S.y,S.z,S.x,S),p.move(S,d),e._zoomingOnVector=!0):p.zoomIn(d),e._cameraUnderground||p.setView(scratchZoomViewOptions)}else p.zoomIn(d)}}var translate2DStart=new Ray,translate2DEnd=new Ray,scratchTranslateP0=new Cartesian3;function translate2D(e,t,i){var r=e._scene.camera,n=r.getPickRay(i.startPosition,translate2DStart).origin,a=r.getPickRay(i.endPosition,translate2DEnd).origin,n=Cartesian3.fromElements(n.y,n.z,n.x,n),a=Cartesian3.fromElements(a.y,a.z,a.x,a),o=Cartesian3.subtract(n,a,scratchTranslateP0),s=Cartesian3.magnitude(o);0<s&&(Cartesian3.normalize(o,o),r.move(o,s))}function zoom2D$1(e,t,i){defined(i.distance)&&(i=i.distance);var r=e._scene.camera;handleZoom(e,t,i,e._zoomFactor,r.getMagnitude())}var twist2DStart=new Cartesian2,twist2DEnd=new Cartesian2;function twist2D(e,t,i){var r,n,a,o,s,l,c,u,d,h;defined(i.angleAndHeight)?singleAxisTwist2D(e,t,i.angleAndHeight):(n=(r=e._scene).camera,o=(a=r.canvas).clientWidth,s=a.clientHeight,(l=twist2DStart).x=2/o*i.startPosition.x-1,l.y=2/s*(s-i.startPosition.y)-1,l=Cartesian2.normalize(l,l),(c=twist2DEnd).x=2/o*i.endPosition.x-1,c.y=2/s*(s-i.endPosition.y)-1,c=Cartesian2.normalize(c,c),u=CesiumMath.acosClamped(l.x),l.y<0&&(u=CesiumMath.TWO_PI-u),d=CesiumMath.acosClamped(c.x),c.y<0&&(d=CesiumMath.TWO_PI-d),h=d-u,n.twistRight(h))}function singleAxisTwist2D(e,t,i){var r=e._rotateFactor*e._rotateRateRangeAdjustment;r>e._maximumRotateRate&&(r=e._maximumRotateRate),r<e._minimumRotateRate&&(r=e._minimumRotateRate);var n=e._scene,a=n.camera,o=n.canvas,s=(i.endPosition.x-i.startPosition.x)/o.clientWidth,l=r*(s=Math.min(s,e.maximumMovementRatio))*Math.PI*4;a.twistRight(l)}function update2D(e){var t=e._scene.mapMode2D===MapMode2D$1.ROTATE;Matrix4.equals(Matrix4.IDENTITY,e._scene.camera.transform)?(reactToInput(e,e.enableTranslate,e.translateEventTypes,translate2D,e.inertiaTranslate,"_lastInertiaTranslateMovement"),reactToInput(e,e.enableZoom,e.zoomEventTypes,zoom2D$1,e.inertiaZoom,"_lastInertiaZoomMovement"),t&&reactToInput(e,e.enableRotate,e.tiltEventTypes,twist2D,e.inertiaSpin,"_lastInertiaTiltMovement")):(reactToInput(e,e.enableZoom,e.zoomEventTypes,zoom2D$1,e.inertiaZoom,"_lastInertiaZoomMovement"),t&&reactToInput(e,e.enableRotate,e.translateEventTypes,twist2D,e.inertiaSpin,"_lastInertiaSpinMovement"))}var pickGlobeScratchRay=new Ray,scratchDepthIntersection$1=new Cartesian3,scratchRayIntersection$1=new Cartesian3;function pickGlobe(e,t,i){var r=e._scene,n=e._globe,a=r.camera;if(defined(n)){var o,s=!e._cameraUnderground;r.pickPositionSupported&&(o=r.pickPositionWorldCoordinates(t,scratchDepthIntersection$1));var l=a.getPickRay(t,pickGlobeScratchRay),c=n.pickWorldCoordinates(l,r,s,scratchRayIntersection$1);return(defined(o)?Cartesian3.distance(o,a.positionWC):Number.POSITIVE_INFINITY)<(defined(c)?Cartesian3.distance(c,a.positionWC):Number.POSITIVE_INFINITY)?Cartesian3.clone(o,i):Cartesian3.clone(c,i)}}var scratchDistanceCartographic=new Cartographic;function getDistanceFromSurface(e){var t,i=e._ellipsoid,r=e._scene,n=r.camera,a=0;r.mode===SceneMode$1.SCENE3D?defined(t=i.cartesianToCartographic(n.position,scratchDistanceCartographic))&&(a=t.height):a=n.position.z;var o=defaultValue(e._scene.globeHeight,0);return Math.abs(o-a)}var scratchSurfaceNormal$1=new Cartesian3;function getZoomDistanceUnderground(e,t){var i=t.origin,r=t.direction,n=getDistanceFromSurface(e),a=Cartesian3.normalize(i,scratchSurfaceNormal$1),o=Math.abs(Cartesian3.dot(a,r));return n*(o=2*Math.max(o,.5))}function getTiltCenterUnderground(e,t,i,r){var n=Cartesian3.distance(t.origin,i),a=getDistanceFromSurface(e);return CesiumMath.clamp(5*a,e._minimumUndergroundPickDistance,e._maximumUndergroundPickDistance)<n&&(n=Math.min(n,a/5),n=Math.max(n,100)),Ray.getPoint(t,n,r)}function getStrafeStartPositionUnderground(e,t,i,r){var n;return(!defined(i)||(n=Cartesian3.distance(t.origin,i))>e._maximumUndergroundPickDistance)&&(n=getDistanceFromSurface(e)),Ray.getPoint(t,n,r)}var scratchInertialDelta=new Cartesian2;function continueStrafing(e,t){var i=t.endPosition,r=Cartesian2.subtract(t.endPosition,t.startPosition,scratchInertialDelta),n=e._strafeEndMousePosition;Cartesian2.add(n,r,n),t.endPosition=n,strafe(e,t,e._strafeStartPosition),t.endPosition=i}var translateCVStartRay=new Ray,translateCVEndRay=new Ray,translateCVStartPos=new Cartesian3,translateCVEndPos=new Cartesian3,translateCVDifference=new Cartesian3,translateCVOrigin=new Cartesian3,translateCVPlane=new Plane(Cartesian3.UNIT_X,0),translateCVStartMouse=new Cartesian2,translateCVEndMouse=new Cartesian2;function translateCV(e,t,i){if(Cartesian3.equals(t,e._translateMousePosition)||(e._looking=!1),Cartesian3.equals(t,e._strafeMousePosition)||(e._strafing=!1),e._looking)look3D(e,t,i);else if(e._strafing)continueStrafing(e,i);else{var r,n=e._scene.camera,a=e._cameraUnderground,o=Cartesian2.clone(i.startPosition,translateCVStartMouse),s=Cartesian2.clone(i.endPosition,translateCVEndMouse),l=n.getPickRay(o,translateCVStartRay),c=Cartesian3.clone(Cartesian3.ZERO,translateCVOrigin),u=Cartesian3.UNIT_X;if(n.position.z<e._minimumPickingTerrainHeight&&defined(r=pickGlobe(e,o,translateCVStartPos))&&(c.x=r.x),a||c.x>n.position.z&&defined(r)){var d=r;return a&&(d=getStrafeStartPositionUnderground(e,l,r,translateCVStartPos)),Cartesian2.clone(t,e._strafeMousePosition),Cartesian2.clone(t,e._strafeEndMousePosition),Cartesian3.clone(d,e._strafeStartPosition),e._strafing=!0,void strafe(e,i,e._strafeStartPosition)}var h=Plane.fromPointNormal(c,u,translateCVPlane),l=n.getPickRay(o,translateCVStartRay),p=IntersectionTests.rayPlane(l,h,translateCVStartPos),m=n.getPickRay(s,translateCVEndRay),f=IntersectionTests.rayPlane(m,h,translateCVEndPos);if(!defined(p)||!defined(f))return e._looking=!0,look3D(e,t,i),void Cartesian2.clone(t,e._translateMousePosition);var g=Cartesian3.subtract(p,f,translateCVDifference),_=g.x;g.x=g.y,g.y=g.z,g.z=_;var y=Cartesian3.magnitude(g);y>CesiumMath.EPSILON6&&(Cartesian3.normalize(g,g),n.move(g,y))}}var rotateCVWindowPos=new Cartesian2,rotateCVWindowRay=new Ray,rotateCVCenter=new Cartesian3,rotateCVVerticalCenter=new Cartesian3,rotateCVTransform=new Matrix4,rotateCVVerticalTransform=new Matrix4,rotateCVOrigin=new Cartesian3,rotateCVPlane=new Plane(Cartesian3.UNIT_X,0),rotateCVCartesian3=new Cartesian3,rotateCVCart=new Cartographic,rotateCVOldTransform=new Matrix4,rotateCVQuaternion=new Quaternion,rotateCVMatrix=new Matrix3,tilt3DCartesian3=new Cartesian3;function rotateCV(e,t,i){var r;defined(i.angleAndHeight)&&(i=i.angleAndHeight),Cartesian2.equals(t,e._tiltCenterMousePosition)||(e._tiltCVOffMap=!1,e._looking=!1),e._looking?look3D(e,t,i):(r=e._scene.camera,e._tiltCVOffMap||!e.onMap()||Math.abs(r.position.z)>e._minimumPickingTerrainHeight?(e._tiltCVOffMap=!0,rotateCVOnPlane(e,t,i)):rotateCVOnTerrain(e,t,i))}function rotateCVOnPlane(e,t,i){var r=e._scene,n=r.camera,a=r.canvas,o=rotateCVWindowPos;o.x=a.clientWidth/2,o.y=a.clientHeight/2;var s,l=n.getPickRay(o,rotateCVWindowRay),c=Cartesian3.UNIT_X,u=l.origin,d=l.direction,h=Cartesian3.dot(c,d);if(Math.abs(h)>CesiumMath.EPSILON6&&(s=-Cartesian3.dot(c,u)/h),!defined(s)||s<=0)return e._looking=!0,look3D(e,t,i),void Cartesian2.clone(t,e._tiltCenterMousePosition);var p=Cartesian3.multiplyByScalar(d,s,rotateCVCenter);Cartesian3.add(u,p,p);var m=r.mapProjection,f=m.ellipsoid;Cartesian3.fromElements(p.y,p.z,p.x,p);var g=m.unproject(p,rotateCVCart);f.cartographicToCartesian(g,p);var _=Transforms.eastNorthUpToFixedFrame(p,f,rotateCVTransform),y=e._globe,v=e._ellipsoid;e._globe=void 0,e._ellipsoid=Ellipsoid.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;var C=Matrix4.clone(n.transform,rotateCVOldTransform);n._setTransform(_),rotate3D(e,t,i,Cartesian3.UNIT_Z),n._setTransform(C),e._globe=y;var S=(e._ellipsoid=v).maximumRadius;e._rotateFactor=1/S,e._rotateRateRangeAdjustment=S}function rotateCVOnTerrain(e,t,i){var r,n,a=e._scene,o=a.camera,s=e._cameraUnderground,l=Cartesian3.UNIT_X;if(Cartesian2.equals(t,e._tiltCenterMousePosition))r=Cartesian3.clone(e._tiltCenter,rotateCVCenter);else{if(o.position.z<e._minimumPickingTerrainHeight&&(r=pickGlobe(e,t,rotateCVCenter)),!defined(r)){var c,u=(n=o.getPickRay(t,rotateCVWindowRay)).origin,d=n.direction,h=Cartesian3.dot(l,d);if(Math.abs(h)>CesiumMath.EPSILON6&&(c=-Cartesian3.dot(l,u)/h),!defined(c)||c<=0)return e._looking=!0,look3D(e,t,i),void Cartesian2.clone(t,e._tiltCenterMousePosition);r=Cartesian3.multiplyByScalar(d,c,rotateCVCenter),Cartesian3.add(u,r,r)}s&&(defined(n)||(n=o.getPickRay(t,rotateCVWindowRay)),getTiltCenterUnderground(e,n,r,r)),Cartesian2.clone(t,e._tiltCenterMousePosition),Cartesian3.clone(r,e._tiltCenter)}var p=a.canvas,m=rotateCVWindowPos;m.x=p.clientWidth/2,m.y=e._tiltCenterMousePosition.y,n=o.getPickRay(m,rotateCVWindowRay);var f=Cartesian3.clone(Cartesian3.ZERO,rotateCVOrigin);f.x=r.x;var g=Plane.fromPointNormal(f,l,rotateCVPlane),_=IntersectionTests.rayPlane(n,g,rotateCVVerticalCenter),y=o._projection,v=y.ellipsoid;Cartesian3.fromElements(r.y,r.z,r.x,r);var C=y.unproject(r,rotateCVCart);v.cartographicToCartesian(C,r);var S=Transforms.eastNorthUpToFixedFrame(r,v,rotateCVTransform),T=defined(_)?(Cartesian3.fromElements(_.y,_.z,_.x,_),C=y.unproject(_,rotateCVCart),v.cartographicToCartesian(C,_),Transforms.eastNorthUpToFixedFrame(_,v,rotateCVVerticalTransform)):S,x=e._globe,b=e._ellipsoid;e._globe=void 0,e._ellipsoid=Ellipsoid.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;var E=Cartesian3.UNIT_Z,P=Matrix4.clone(o.transform,rotateCVOldTransform);o._setTransform(S);var A,w,D,M=Cartesian3.cross(Cartesian3.UNIT_Z,Cartesian3.normalize(o.position,rotateCVCartesian3),rotateCVCartesian3),I=Cartesian3.dot(o.right,M);rotate3D(e,t,i,E,!1,!0),o._setTransform(T),I<0?(A=i.startPosition.y-i.endPosition.y,(s&&A<0||!s&&0<A)&&(E=void 0),w=o.constrainedAxis,rotate3D(e,t,i,E,!(o.constrainedAxis=void 0),!1),o.constrainedAxis=w):rotate3D(e,t,i,E,!0,!1),defined(o.constrainedAxis)&&(D=Cartesian3.cross(o.direction,o.constrainedAxis,tilt3DCartesian3),Cartesian3.equalsEpsilon(D,Cartesian3.ZERO,CesiumMath.EPSILON6)||(Cartesian3.dot(D,o.right)<0&&Cartesian3.negate(D,D),Cartesian3.cross(D,o.direction,o.up),Cartesian3.cross(o.direction,o.up,o.right),Cartesian3.normalize(o.up,o.up),Cartesian3.normalize(o.right,o.right))),o._setTransform(P),e._globe=x;var R=(e._ellipsoid=b).maximumRadius;e._rotateFactor=1/R,e._rotateRateRangeAdjustment=R;var O,L,F,N,B,V=Cartesian3.clone(o.positionWC,rotateCVCartesian3);e.enableCollisionDetection&&adjustHeightForTerrain(e),Cartesian3.equals(o.positionWC,V)||(o._setTransform(T),o.worldToCameraCoordinatesPoint(V,V),O=Cartesian3.magnitudeSquared(V),Cartesian3.magnitudeSquared(o.position)>O&&(Cartesian3.normalize(o.position,o.position),Cartesian3.multiplyByScalar(o.position,Math.sqrt(O),o.position)),L=Cartesian3.angleBetween(V,o.position),F=Cartesian3.cross(V,o.position,V),Cartesian3.normalize(F,F),N=Quaternion.fromAxisAngle(F,L,rotateCVQuaternion),B=Matrix3.fromQuaternion(N,rotateCVMatrix),Matrix3.multiplyByVector(B,o.direction,o.direction),Matrix3.multiplyByVector(B,o.up,o.up),Cartesian3.cross(o.direction,o.up,o.right),Cartesian3.cross(o.right,o.direction,o.up),o._setTransform(P))}var zoomCVWindowPos=new Cartesian2,zoomCVWindowRay=new Ray,zoomCVIntersection=new Cartesian3;function zoomCV(e,t,i){defined(i.distance)&&(i=i.distance);var r,n=e._scene,a=n.camera,o=n.canvas,s=e._cameraUnderground;s?r=t:((r=zoomCVWindowPos).x=o.clientWidth/2,r.y=o.clientHeight/2);var l,c,u,d,h=a.getPickRay(r,zoomCVWindowRay),p=h.origin,m=h.direction;a.position.z<e._minimumPickingTerrainHeight&&(l=pickGlobe(e,r,zoomCVIntersection)),defined(l)&&(u=Cartesian3.distance(p,l)),s&&(c=getZoomDistanceUnderground(e,h),u=defined(u)?Math.min(u,c):c),defined(u)||(d=Cartesian3.UNIT_X,u=-Cartesian3.dot(d,p)/Cartesian3.dot(d,m)),handleZoom(e,t,i,e._zoomFactor,u)}function updateCV(e){var t,i,r=e._scene.camera;Matrix4.equals(Matrix4.IDENTITY,r.transform)?(t=e._tweens,e._aggregator.anyButtonDown&&t.removeAll(),reactToInput(e,e.enableTilt,e.tiltEventTypes,rotateCV,e.inertiaSpin,"_lastInertiaTiltMovement"),reactToInput(e,e.enableTranslate,e.translateEventTypes,translateCV,e.inertiaTranslate,"_lastInertiaTranslateMovement"),reactToInput(e,e.enableZoom,e.zoomEventTypes,zoomCV,e.inertiaZoom,"_lastInertiaZoomMovement"),reactToInput(e,e.enableLook,e.lookEventTypes,look3D),e._aggregator.anyButtonDown||t.contains(e._tween)||defined(i=r.createCorrectPositionTween(e.bounceAnimationTime))&&(e._tween=t.add(i)),t.update()):(reactToInput(e,e.enableRotate,e.rotateEventTypes,rotate3D,e.inertiaSpin,"_lastInertiaSpinMovement"),reactToInput(e,e.enableZoom,e.zoomEventTypes,zoom3D$1,e.inertiaZoom,"_lastInertiaZoomMovement"))}var scratchStrafeRay=new Ray,scratchStrafePlane=new Plane(Cartesian3.UNIT_X,0),scratchStrafeIntersection=new Cartesian3,scratchStrafeDirection=new Cartesian3,scratchMousePos=new Cartesian3;function strafe(e,t,i){var r=e._scene,n=r.camera,a=n.getPickRay(t.endPosition,scratchStrafeRay),o=Cartesian3.clone(n.direction,scratchStrafeDirection);r.mode===SceneMode$1.COLUMBUS_VIEW&&Cartesian3.fromElements(o.z,o.x,o.y,o);var s=Plane.fromPointNormal(i,o,scratchStrafePlane),l=IntersectionTests.rayPlane(a,s,scratchStrafeIntersection);defined(l)&&(o=Cartesian3.subtract(i,l,o),r.mode===SceneMode$1.COLUMBUS_VIEW&&Cartesian3.fromElements(o.y,o.z,o.x,o),Cartesian3.add(n.position,o,n.position))}var spin3DPick=new Cartesian3,scratchCartographic$f=new Cartographic,scratchRadii$2=new Cartesian3,scratchEllipsoid$e=new Ellipsoid,scratchLookUp=new Cartesian3,scratchNormal$8=new Cartesian3;function spin3D(e,t,i){var r=e._scene.camera,n=e._cameraUnderground,a=e._ellipsoid;if(Matrix4.equals(r.transform,Matrix4.IDENTITY)){var o,s,l=a.geodeticSurfaceNormal(r.position,scratchLookUp);if(Cartesian2.equals(t,e._rotateMousePosition))if(e._looking)look3D(e,t,i,l);else if(e._rotating)rotate3D(e,t,i);else if(e._strafing)continueStrafing(e,i);else{if(Cartesian3.magnitude(r.position)<Cartesian3.magnitude(e._rotateStartPosition))return;o=Cartesian3.magnitude(e._rotateStartPosition),(s=scratchRadii$2).x=s.y=s.z=o,pan3D(e,t,i,a=Ellipsoid.fromCartesian3(s,scratchEllipsoid$e))}else{e._looking=!1,e._rotating=!1,e._strafing=!1;var c,u,d,h,p=a.cartesianToCartographic(r.positionWC,scratchCartographic$f).height;defined(e._globe)&&p<e._minimumPickingTerrainHeight?defined(c=pickGlobe(e,i.startPosition,scratchMousePos))?(h=!1,u=r.getPickRay(i.startPosition,pickGlobeScratchRay),n?(h=!0,getStrafeStartPositionUnderground(e,u,c,c)):(d=a.geodeticSurfaceNormal(c,scratchNormal$8),h=Math.abs(Cartesian3.dot(u.direction,d))<.05||Cartesian3.magnitude(r.position)<Cartesian3.magnitude(c)),h?(Cartesian2.clone(t,e._strafeEndMousePosition),Cartesian3.clone(c,e._strafeStartPosition),e._strafing=!0,strafe(e,i,e._strafeStartPosition)):(o=Cartesian3.magnitude(c),(s=scratchRadii$2).x=s.y=s.z=o,pan3D(e,t,i,a=Ellipsoid.fromCartesian3(s,scratchEllipsoid$e)),Cartesian3.clone(c,e._rotateStartPosition))):(e._looking=!0,look3D(e,t,i,l)):defined(r.pickEllipsoid(i.startPosition,e._ellipsoid,spin3DPick))?(pan3D(e,t,i,e._ellipsoid),Cartesian3.clone(spin3DPick,e._rotateStartPosition)):p>e._minimumTrackBallHeight?(e._rotating=!0,rotate3D(e,t,i)):(e._looking=!0,look3D(e,t,i,l)),Cartesian2.clone(t,e._rotateMousePosition)}}else rotate3D(e,t,i)}function rotate3D(e,t,i,r,n,a){n=defaultValue(n,!1),a=defaultValue(a,!1);var o=e._scene,s=o.camera,l=o.canvas,c=s.constrainedAxis;defined(r)&&(s.constrainedAxis=r);var u=Cartesian3.magnitude(s.position),d=e._rotateFactor*(u-e._rotateRateRangeAdjustment);d>e._maximumRotateRate&&(d=e._maximumRotateRate),d<e._minimumRotateRate&&(d=e._minimumRotateRate);var h=(i.startPosition.x-i.endPosition.x)/l.clientWidth,p=(i.startPosition.y-i.endPosition.y)/l.clientHeight,h=Math.min(h,e.maximumMovementRatio),p=Math.min(p,e.maximumMovementRatio),m=d*h*Math.PI*2,f=d*p*Math.PI;n||s.rotateRight(m),a||s.rotateUp(f),s.constrainedAxis=c}var pan3DP0=Cartesian4.clone(Cartesian4.UNIT_W),pan3DP1=Cartesian4.clone(Cartesian4.UNIT_W),pan3DTemp0=new Cartesian3,pan3DTemp1=new Cartesian3,pan3DTemp2=new Cartesian3,pan3DTemp3=new Cartesian3,pan3DStartMousePosition=new Cartesian2,pan3DEndMousePosition=new Cartesian2;function pan3D(e,t,i,r){var n,a,o,s,l,c,u,d,h,p,m,f,g,_,y,v,C,S,T,x,b,E,P=e._scene.camera,A=Cartesian2.clone(i.startPosition,pan3DStartMousePosition),w=Cartesian2.clone(i.endPosition,pan3DEndMousePosition),D=P.pickEllipsoid(A,r,pan3DP0),M=P.pickEllipsoid(w,r,pan3DP1);if(!defined(D)||!defined(M))return e._rotating=!0,void rotate3D(e,t,i);D=P.worldToCameraCoordinates(D,D),M=P.worldToCameraCoordinates(M,M),defined(P.constrainedAxis)?(n=P.constrainedAxis,a=Cartesian3.mostOrthogonalAxis(n,pan3DTemp0),Cartesian3.cross(a,n,a),Cartesian3.normalize(a,a),o=Cartesian3.cross(n,a,pan3DTemp1),s=Cartesian3.magnitude(D),l=Cartesian3.dot(n,D),c=Math.acos(l/s),u=Cartesian3.multiplyByScalar(n,l,pan3DTemp2),Cartesian3.subtract(D,u,u),Cartesian3.normalize(u,u),d=Cartesian3.magnitude(M),h=Cartesian3.dot(n,M),p=Math.acos(h/d),m=Cartesian3.multiplyByScalar(n,h,pan3DTemp3),Cartesian3.subtract(M,m,m),Cartesian3.normalize(m,m),f=Math.acos(Cartesian3.dot(u,a)),Cartesian3.dot(u,o)<0&&(f=CesiumMath.TWO_PI-f),g=Math.acos(Cartesian3.dot(m,a)),Cartesian3.dot(m,o)<0&&(g=CesiumMath.TWO_PI-g),_=f-g,y=Cartesian3.equalsEpsilon(n,P.position,CesiumMath.EPSILON2)?P.right:Cartesian3.cross(n,P.position,pan3DTemp0),v=Cartesian3.cross(n,y,pan3DTemp0),C=Cartesian3.dot(v,Cartesian3.subtract(D,n,pan3DTemp1)),S=Cartesian3.dot(v,Cartesian3.subtract(M,n,pan3DTemp1)),T=0<C&&0<S?p-c:0<C&&S<=0?0<Cartesian3.dot(P.position,n)?-c-p:c+p:c-p,P.rotateRight(_),P.rotateUp(T)):(Cartesian3.normalize(D,D),Cartesian3.normalize(M,M),x=Cartesian3.dot(D,M),b=Cartesian3.cross(D,M,pan3DTemp0),x<1&&!Cartesian3.equalsEpsilon(b,Cartesian3.ZERO,CesiumMath.EPSILON14)&&(E=Math.acos(x),P.rotate(b,E)))}var zoom3DUnitPosition=new Cartesian3,zoom3DCartographic=new Cartographic;function zoom3D$1(e,t,i){defined(i.distance)&&(i=i.distance);var r,n=e._ellipsoid,a=e._scene,o=a.camera,s=a.canvas,l=e._cameraUnderground;l?r=t:((r=zoomCVWindowPos).x=s.clientWidth/2,r.y=s.clientHeight/2);var c,u,d,h=o.getPickRay(r,zoomCVWindowRay),p=n.cartesianToCartographic(o.position,zoom3DCartographic).height;p<e._minimumPickingTerrainHeight&&(c=pickGlobe(e,r,zoomCVIntersection)),defined(c)&&(d=Cartesian3.distance(h.origin,c)),l&&(u=getZoomDistanceUnderground(e,h),d=defined(d)?Math.min(d,u):u),defined(d)||(d=p);var m=Cartesian3.normalize(o.position,zoom3DUnitPosition);handleZoom(e,t,i,e._zoomFactor,d,Cartesian3.dot(m,o.direction))}var tilt3DWindowPos=new Cartesian2,tilt3DRay=new Ray,tilt3DCenter=new Cartesian3,tilt3DVerticalCenter=new Cartesian3,tilt3DTransform=new Matrix4,tilt3DVerticalTransform=new Matrix4,tilt3DOldTransform=new Matrix4,tilt3DQuaternion=new Quaternion,tilt3DMatrix=new Matrix3,tilt3DCart=new Cartographic,tilt3DLookUp=new Cartesian3;function tilt3D(e,t,i){var r,n,a=e._scene.camera;Matrix4.equals(a.transform,Matrix4.IDENTITY)&&(defined(i.angleAndHeight)&&(i=i.angleAndHeight),Cartesian2.equals(t,e._tiltCenterMousePosition)||(e._tiltOnEllipsoid=!1,e._looking=!1),e._looking?(r=e._ellipsoid.geodeticSurfaceNormal(a.position,tilt3DLookUp),look3D(e,t,i,r)):(n=e._ellipsoid.cartesianToCartographic(a.position,tilt3DCart),e._tiltOnEllipsoid||n.height>e._minimumCollisionTerrainHeight?(e._tiltOnEllipsoid=!0,tilt3DOnEllipsoid(e,t,i)):tilt3DOnTerrain(e,t,i)))}var tilt3DOnEllipsoidCartographic=new Cartographic;function tilt3DOnEllipsoid(e,t,i){var r=e._ellipsoid,n=e._scene,a=n.camera,o=.25*e.minimumZoomDistance,s=r.cartesianToCartographic(a.positionWC,tilt3DOnEllipsoidCartographic).height;if(!(s-o-1<CesiumMath.EPSILON3&&i.endPosition.y-i.startPosition.y<0)){var l=n.canvas,c=tilt3DWindowPos;c.x=l.clientWidth/2,c.y=l.clientHeight/2;var u,d=a.getPickRay(c,tilt3DRay),h=IntersectionTests.rayEllipsoid(d,r);if(defined(h))u=Ray.getPoint(d,h.start,tilt3DCenter);else{if(!(s>e._minimumTrackBallHeight)){e._looking=!0;var p=e._ellipsoid.geodeticSurfaceNormal(a.position,tilt3DLookUp);return look3D(e,t,i,p),void Cartesian2.clone(t,e._tiltCenterMousePosition)}var m=IntersectionTests.grazingAltitudeLocation(d,r);if(!defined(m))return;var f=r.cartesianToCartographic(m,tilt3DCart);f.height=0,u=r.cartographicToCartesian(f,tilt3DCenter)}var g=Transforms.eastNorthUpToFixedFrame(u,r,tilt3DTransform),_=e._globe,y=e._ellipsoid;e._globe=void 0,e._ellipsoid=Ellipsoid.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;var v=Matrix4.clone(a.transform,tilt3DOldTransform);a._setTransform(g),rotate3D(e,t,i,Cartesian3.UNIT_Z),a._setTransform(v),e._globe=_;var C=(e._ellipsoid=y).maximumRadius;e._rotateFactor=1/C,e._rotateRateRangeAdjustment=C}}function tilt3DOnTerrain(e,t,i){var r,n=e._ellipsoid,a=e._scene,o=a.camera,s=e._cameraUnderground;if(Cartesian2.equals(t,e._tiltCenterMousePosition))r=Cartesian3.clone(e._tiltCenter,tilt3DCenter);else{if(!defined(r=pickGlobe(e,t,tilt3DCenter))){var l,c,u=o.getPickRay(t,tilt3DRay);if(!defined(c=IntersectionTests.rayEllipsoid(u,n)))return void(n.cartesianToCartographic(o.position,tilt3DCart).height<=e._minimumTrackBallHeight&&(e._looking=!0,l=e._ellipsoid.geodeticSurfaceNormal(o.position,tilt3DLookUp),look3D(e,t,i,l),Cartesian2.clone(t,e._tiltCenterMousePosition)));r=Ray.getPoint(u,c.start,tilt3DCenter)}s&&(defined(u)||(u=o.getPickRay(t,tilt3DRay)),getTiltCenterUnderground(e,u,r,r)),Cartesian2.clone(t,e._tiltCenterMousePosition),Cartesian3.clone(r,e._tiltCenter)}var d=a.canvas,h=tilt3DWindowPos;h.x=d.clientWidth/2,h.y=e._tiltCenterMousePosition.y,u=o.getPickRay(h,tilt3DRay);var p,m,f,g,_,y,v,C,S,T,x,b,E,P,A,w,D,M,I,R,O=Cartesian3.magnitude(r),L=Cartesian3.fromElements(O,O,O,scratchRadii$2),F=Ellipsoid.fromCartesian3(L,scratchEllipsoid$e);defined(c=IntersectionTests.rayEllipsoid(u,F))&&(p=Cartesian3.magnitude(u.origin)>O?c.start:c.stop,m=Ray.getPoint(u,p,tilt3DVerticalCenter),f=Transforms.eastNorthUpToFixedFrame(r,n,tilt3DTransform),g=Transforms.eastNorthUpToFixedFrame(m,F,tilt3DVerticalTransform),_=e._globe,y=e._ellipsoid,e._globe=void 0,e._ellipsoid=Ellipsoid.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1,v=Cartesian3.UNIT_Z,C=Matrix4.clone(o.transform,tilt3DOldTransform),o._setTransform(f),S=Cartesian3.cross(m,o.positionWC,tilt3DCartesian3),T=Cartesian3.dot(o.rightWC,S),rotate3D(e,t,i,v,!1,!0),o._setTransform(g),T<0?(x=i.startPosition.y-i.endPosition.y,(s&&x<0||!s&&0<x)&&(v=void 0),b=o.constrainedAxis,rotate3D(e,t,i,v,!(o.constrainedAxis=void 0),!1),o.constrainedAxis=b):rotate3D(e,t,i,v,!0,!1),defined(o.constrainedAxis)&&(E=Cartesian3.cross(o.direction,o.constrainedAxis,tilt3DCartesian3),Cartesian3.equalsEpsilon(E,Cartesian3.ZERO,CesiumMath.EPSILON6)||(Cartesian3.dot(E,o.right)<0&&Cartesian3.negate(E,E),Cartesian3.cross(E,o.direction,o.up),Cartesian3.cross(o.direction,o.up,o.right),Cartesian3.normalize(o.up,o.up),Cartesian3.normalize(o.right,o.right))),o._setTransform(C),e._globe=_,P=(e._ellipsoid=y).maximumRadius,e._rotateFactor=1/P,e._rotateRateRangeAdjustment=P,A=Cartesian3.clone(o.positionWC,tilt3DCartesian3),e.enableCollisionDetection&&adjustHeightForTerrain(e),Cartesian3.equals(o.positionWC,A)||(o._setTransform(g),o.worldToCameraCoordinatesPoint(A,A),w=Cartesian3.magnitudeSquared(A),Cartesian3.magnitudeSquared(o.position)>w&&(Cartesian3.normalize(o.position,o.position),Cartesian3.multiplyByScalar(o.position,Math.sqrt(w),o.position)),D=Cartesian3.angleBetween(A,o.position),M=Cartesian3.cross(A,o.position,A),Cartesian3.normalize(M,M),I=Quaternion.fromAxisAngle(M,D,tilt3DQuaternion),R=Matrix3.fromQuaternion(I,tilt3DMatrix),Matrix3.multiplyByVector(R,o.direction,o.direction),Matrix3.multiplyByVector(R,o.up,o.up),Cartesian3.cross(o.direction,o.up,o.right),Cartesian3.cross(o.right,o.direction,o.up),o._setTransform(C)))}var look3DStartPos=new Cartesian2,look3DEndPos=new Cartesian2,look3DStartRay=new Ray,look3DEndRay=new Ray,look3DNegativeRot=new Cartesian3,look3DTan=new Cartesian3;function look3D(e,t,i,r){var n=e._scene.camera,a=look3DStartPos;a.x=i.startPosition.x,a.y=0;var o=look3DEndPos;o.x=i.endPosition.x,o.y=0;var s,l,c=n.getPickRay(a,look3DStartRay),u=n.getPickRay(o,look3DEndRay),d=0;n.frustum instanceof OrthographicFrustum?(s=c.origin,l=u.origin,Cartesian3.add(n.direction,s,s),Cartesian3.add(n.direction,l,l),Cartesian3.subtract(s,n.position,s),Cartesian3.subtract(l,n.position,l),Cartesian3.normalize(s,s),Cartesian3.normalize(l,l)):(s=c.direction,l=u.direction);var h=Cartesian3.dot(s,l);h<1&&(d=Math.acos(h)),d=i.startPosition.x>i.endPosition.x?-d:d;var p,m,f,g,_,y,v=e._horizontalRotationAxis;defined(r)?n.look(r,-d):defined(v)?n.look(v,-d):n.lookLeft(d),a.x=0,a.y=i.startPosition.y,o.x=0,o.y=i.endPosition.y,c=n.getPickRay(a,look3DStartRay),u=n.getPickRay(o,look3DEndRay),d=0,n.frustum instanceof OrthographicFrustum?(s=c.origin,l=u.origin,Cartesian3.add(n.direction,s,s),Cartesian3.add(n.direction,l,l),Cartesian3.subtract(s,n.position,s),Cartesian3.subtract(l,n.position,l),Cartesian3.normalize(s,s),Cartesian3.normalize(l,l)):(s=c.direction,l=u.direction),(h=Cartesian3.dot(s,l))<1&&(d=Math.acos(h)),d=i.startPosition.y>i.endPosition.y?-d:d,defined(r=defaultValue(r,v))?(p=n.direction,m=Cartesian3.negate(r,look3DNegativeRot),f=Cartesian3.equalsEpsilon(p,r,CesiumMath.EPSILON2),g=Cartesian3.equalsEpsilon(p,m,CesiumMath.EPSILON2),f||g?(f&&d<0||g&&0<d)&&n.look(n.right,-d):(h=Cartesian3.dot(p,r),_=CesiumMath.acosClamped(h),0<d&&_<d&&(d=_-CesiumMath.EPSILON4),h=Cartesian3.dot(p,m),_=CesiumMath.acosClamped(h),d<0&&_<-d&&(d=-_+CesiumMath.EPSILON4),y=Cartesian3.cross(r,p,look3DTan),n.look(y,d))):n.lookUp(d)}function update3D(e){reactToInput(e,e.enableRotate,e.rotateEventTypes,spin3D,e.inertiaSpin,"_lastInertiaSpinMovement"),reactToInput(e,e.enableZoom,e.zoomEventTypes,zoom3D$1,e.inertiaZoom,"_lastInertiaZoomMovement"),reactToInput(e,e.enableTilt,e.tiltEventTypes,tilt3D,e.inertiaSpin,"_lastInertiaTiltMovement"),reactToInput(e,e.enableLook,e.lookEventTypes,look3D)}var scratchAdjustHeightTransform=new Matrix4,scratchAdjustHeightCartographic=new Cartographic;function adjustHeightForTerrain(e){e._adjustedHeightForTerrain=!0;var t,i,r,n,a,o,s,l,c,u=e._scene,d=u.mode,h=u.globe;defined(h)&&d!==SceneMode$1.SCENE2D&&d!==SceneMode$1.MORPHING&&(t=u.camera,i=h.ellipsoid,r=u.mapProjection,Matrix4.equals(t.transform,Matrix4.IDENTITY)||(n=Matrix4.clone(t.transform,scratchAdjustHeightTransform),a=Cartesian3.magnitude(t.position),t._setTransform(Matrix4.IDENTITY)),o=scratchAdjustHeightCartographic,d===SceneMode$1.SCENE3D?i.cartesianToCartographic(t.position,o):r.unproject(t.position,o),s=!1,o.height<e._minimumCollisionTerrainHeight&&(defined(l=e._scene.globeHeight)&&(c=l+e.minimumZoomDistance,o.height<c&&(o.height=c,d===SceneMode$1.SCENE3D?i.cartographicToCartesian(o,t.position):r.project(o,t.position),s=!0))),defined(n)&&(t._setTransform(n),s&&(Cartesian3.normalize(t.position,t.position),Cartesian3.negate(t.position,t.direction),Cartesian3.multiplyByScalar(t.position,Math.max(a,e.minimumZoomDistance),t.position),Cartesian3.normalize(t.direction,t.direction),Cartesian3.cross(t.direction,t.up,t.right),Cartesian3.cross(t.right,t.direction,t.up))))}ScreenSpaceCameraController.prototype.onMap=function(){var e=this._scene,t=e.mode,i=e.camera;return t!==SceneMode$1.COLUMBUS_VIEW||Math.abs(i.position.x)-this._maxCoord.x<0&&Math.abs(i.position.y)-this._maxCoord.y<0};var scratchPreviousPosition=new Cartesian3,scratchPreviousDirection=new Cartesian3;ScreenSpaceCameraController.prototype.update=function(){var e=this._scene,t=e.camera,i=e.globe,r=e.mode;Matrix4.equals(t.transform,Matrix4.IDENTITY)?(this._globe=i,this._ellipsoid=defined(this._globe)?this._globe.ellipsoid:e.mapProjection.ellipsoid):(this._globe=void 0,this._ellipsoid=Ellipsoid.UNIT_SPHERE),this._cameraUnderground=e.cameraUnderground&&defined(this._globe),this._minimumCollisionTerrainHeight=this.minimumCollisionTerrainHeight*e.terrainExaggeration,this._minimumPickingTerrainHeight=this.minimumPickingTerrainHeight*e.terrainExaggeration,this._minimumTrackBallHeight=this.minimumTrackBallHeight*e.terrainExaggeration;var n=this._ellipsoid.maximumRadius;this._rotateFactor=1/n,this._rotateRateRangeAdjustment=n,this._adjustedHeightForTerrain=!1;var a=Cartesian3.clone(t.positionWC,scratchPreviousPosition),o=Cartesian3.clone(t.directionWC,scratchPreviousDirection);r===SceneMode$1.SCENE2D?update2D(this):r===SceneMode$1.COLUMBUS_VIEW?(this._horizontalRotationAxis=Cartesian3.UNIT_Z,updateCV(this)):r===SceneMode$1.SCENE3D&&(this._horizontalRotationAxis=void 0,update3D(this)),!this.enableCollisionDetection||this._adjustedHeightForTerrain||Cartesian3.equals(a,t.positionWC)&&Cartesian3.equals(o,t.directionWC)||adjustHeightForTerrain(this),this._aggregator.reset()},ScreenSpaceCameraController.prototype.isDestroyed=function(){return!1},ScreenSpaceCameraController.prototype.destroy=function(){return this._tweens.removeAll(),this._aggregator=this._aggregator&&this._aggregator.destroy(),destroyObject(this)};var AdditiveBlend="uniform sampler2D colorTexture;\nuniform sampler2D colorTexture2;\nuniform vec2 center;\nuniform float radius;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nvec4 color0 = texture2D(colorTexture, v_textureCoordinates);\nvec4 color1 = texture2D(colorTexture2, v_textureCoordinates);\nfloat x = length(gl_FragCoord.xy - center) / radius;\nfloat t = smoothstep(0.5, 0.8, x);\ngl_FragColor = mix(color0 + color1, color1, t);\n}\n",BrightPass="uniform sampler2D colorTexture;\nuniform float avgLuminance;\nuniform float threshold;\nuniform float offset;\nvarying vec2 v_textureCoordinates;\nfloat key(float avg)\n{\nfloat guess = 1.5 - (1.5 / (avg * 0.1 + 1.0));\nreturn max(0.0, guess) + 0.1;\n}\nvoid main()\n{\nvec4 color = texture2D(colorTexture, v_textureCoordinates);\nvec3 xyz = czm_RGBToXYZ(color.rgb);\nfloat luminance = xyz.r;\nfloat scaledLum = key(avgLuminance) * luminance / avgLuminance;\nfloat brightLum = max(scaledLum - threshold, 0.0);\nfloat brightness = brightLum / (offset + brightLum);\nxyz.r = brightness;\ngl_FragColor = vec4(czm_XYZToRGB(xyz), 1.0);\n}\n";function SunPostProcess(){this._sceneFramebuffer=new SceneFramebuffer;var e=new Array(6);e[0]=new PostProcessStage({fragmentShader:PassThrough,textureScale:.125,forcePowerOfTwo:!0,sampleMode:PostProcessStageSampleMode.LINEAR});var t=e[1]=new PostProcessStage({fragmentShader:BrightPass,uniforms:{avgLuminance:.5,threshold:.25,offset:.1},textureScale:.125,forcePowerOfTwo:!0}),i=this;this._delta=1,this._sigma=2,this._blurStep=new Cartesian2,e[2]=new PostProcessStage({fragmentShader:GaussianBlur1D,uniforms:{step:function(){return i._blurStep.x=i._blurStep.y=1/t.outputTexture.width,i._blurStep},delta:function(){return i._delta},sigma:function(){return i._sigma},direction:0},textureScale:.125,forcePowerOfTwo:!0}),e[3]=new PostProcessStage({fragmentShader:GaussianBlur1D,uniforms:{step:function(){return i._blurStep.x=i._blurStep.y=1/t.outputTexture.width,i._blurStep},delta:function(){return i._delta},sigma:function(){return i._sigma},direction:1},textureScale:.125,forcePowerOfTwo:!0}),e[4]=new PostProcessStage({fragmentShader:PassThrough,sampleMode:PostProcessStageSampleMode.LINEAR}),this._uCenter=new Cartesian2,this._uRadius=void 0,e[5]=new PostProcessStage({fragmentShader:AdditiveBlend,uniforms:{center:function(){return i._uCenter},radius:function(){return i._uRadius},colorTexture2:function(){return i._sceneFramebuffer.getFramebuffer().getColorTexture(0)}}}),this._stages=new PostProcessStageComposite({stages:e});for(var r=new PostProcessStageTextureCache(this),n=e.length,a=0;a<n;++a)e[a]._textureCache=r;this._textureCache=r,this.length=e.length}SunPostProcess.prototype.get=function(e){return this._stages.get(e)},SunPostProcess.prototype.getStageByName=function(e){for(var t=this._stages.length,i=0;i<t;++i){var r=this._stages.get(i);if(r.name===e)return r}};var sunPositionECScratch=new Cartesian4,sunPositionWCScratch=new Cartesian2,sizeScratch=new Cartesian2,postProcessMatrix4Scratch=new Matrix4;function updateSunPosition(e,t,i){var r=t.uniformState,n=r.sunPositionWC,a=r.view,o=r.viewProjection,s=r.projection,l=Matrix4.computeViewportTransformation(i,0,1,postProcessMatrix4Scratch),c=Matrix4.multiplyByPoint(a,n,sunPositionECScratch),u=Transforms.pointToGLWindowCoordinates(o,l,n,sunPositionWCScratch);c.x+=CesiumMath.SOLAR_RADIUS;var d=Transforms.pointToGLWindowCoordinates(s,l,c,c),h=30*Cartesian2.magnitude(Cartesian2.subtract(d,u,d))*2,p=sizeScratch;p.x=h,p.y=h,e._uCenter=Cartesian2.clone(u,e._uCenter),e._uRadius=.15*Math.max(p.x,p.y);var m=t.drawingBufferWidth,f=t.drawingBufferHeight,g=e._stages,_=g.get(0),y=_.outputTexture.width,v=_.outputTexture.height,C=new BoundingRectangle;C.width=y,C.height=v,l=Matrix4.computeViewportTransformation(C,0,1,postProcessMatrix4Scratch),u=Transforms.pointToGLWindowCoordinates(o,l,n,sunPositionWCScratch),p.x*=y/m,p.y*=v/f;var S=_.scissorRectangle;S.x=Math.max(u.x-.5*p.x,0),S.y=Math.max(u.y-.5*p.y,0),S.width=Math.min(p.x,m),S.height=Math.min(p.y,f);for(var T=1;T<4;++T)BoundingRectangle.clone(S,g.get(T).scissorRectangle)}SunPostProcess.prototype.clear=function(e,t,i){this._sceneFramebuffer.clear(e,t,i),this._textureCache.clear(e)},SunPostProcess.prototype.update=function(e){var t=e.context,i=e.viewport,r=this._sceneFramebuffer;r.update(t,i);var n=r.getFramebuffer();return this._textureCache.update(t),this._stages.update(t,!1),updateSunPosition(this,t,i),n},SunPostProcess.prototype.execute=function(e){var t=this._sceneFramebuffer.getFramebuffer().getColorTexture(0),i=this._stages,r=i.length;i.get(0).execute(e,t);for(var n=1;n<r;++n)i.get(n).execute(e,i.get(n-1).outputTexture)},SunPostProcess.prototype.copy=function(e,t){var i;defined(this._copyColorCommand)||((i=this)._copyColorCommand=e.createViewportQuadCommand(PassThrough,{uniformMap:{colorTexture:function(){return i._stages.get(i._stages.length-1).outputTexture}},owner:this})),this._copyColorCommand.framebuffer=t,this._copyColorCommand.execute(e)},SunPostProcess.prototype.isDestroyed=function(){return!1},SunPostProcess.prototype.destroy=function(){return this._textureCache.destroy(),this._stages.destroy(),destroyObject(this)};var requestRenderAfterFrame=function(e){return function(){e.frameState.afterRender.push(function(){e.requestRender()})}};function Scene(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).canvas,i=e.creditContainer,r=e.creditViewport,n=clone(e.contextOptions);defined(n)||(n={}),defined(n.webgl)||(n.webgl={}),n.webgl.powerPreference=defaultValue(n.webgl.powerPreference,"high-performance");var a=defined(i),o=new Context(t,n);a||((i=document.createElement("div")).style.position="absolute",i.style.bottom="0",i.style["text-shadow"]="0 0 2px #000000",i.style.color="#ffffff",i.style["font-size"]="10px",i.style["padding-right"]="5px",t.parentNode.appendChild(i)),defined(r)||(r=t.parentNode),this._id=createGuid(),this._jobScheduler=new JobScheduler,this._frameState=new FrameState(o,new CreditDisplay(i," • ",r),this._jobScheduler),this._frameState.scene3DOnly=defaultValue(e.scene3DOnly,!1),this._removeCreditContainer=!a,this._creditContainer=i,this._canvas=t,this._context=o,this._computeEngine=new ComputeEngine(o),this._globe=void 0,this._globeTranslucencyState=new GlobeTranslucencyState,this._primitives=new PrimitiveCollection,this._groundPrimitives=new PrimitiveCollection,this._globeHeight=void 0,this._cameraUnderground=!1,this._logDepthBuffer=o.fragmentDepth,this._logDepthBufferDirty=!0,this._tweens=new TweenCollection,this._shaderFrameCount=0,this._sunPostProcess=void 0,this._computeCommandList=[],this._overlayCommandList=[],this._useOIT=defaultValue(e.orderIndependentTranslucency,!0),this._executeOITFunction=void 0,this._depthPlane=new DepthPlane,this._clearColorCommand=new ClearCommand({color:new Color,stencil:0,owner:this}),this._depthClearCommand=new ClearCommand({depth:1,owner:this}),this._stencilClearCommand=new ClearCommand({stencil:0}),this._classificationStencilClearCommand=new ClearCommand({stencil:0,renderState:RenderState.fromCache({stencilMask:StencilConstants$1.CLASSIFICATION_MASK})}),this._depthOnlyRenderStateCache={},this._transitioner=new SceneTransitioner(this),this._preUpdate=new Event,this._postUpdate=new Event,this._renderError=new Event,this._preRender=new Event,this._postRender=new Event,this._minimumDisableDepthTestDistance=0,this._debugInspector=new DebugInspector,this.rethrowRenderErrors=!1,this.completeMorphOnUserInput=!0,this.morphStart=new Event,this.morphComplete=new Event,this.skyBox=void 0,this.skyAtmosphere=void 0,this.sun=void 0,this.sunBloom=!0,this._sunBloom=void 0,this.moon=void 0,this.backgroundColor=Color.clone(Color.BLACK),this._mode=SceneMode$1.SCENE3D,this._mapProjection=defined(e.mapProjection)?e.mapProjection:new GeographicProjection,this.morphTime=1,this.farToNearRatio=1e3,this.logarithmicDepthFarToNearRatio=1e9,this.nearToFarDistance2D=175e4,this.debugCommandFilter=void 0,this.debugShowCommands=!1,this.debugShowFrustums=!1,this.debugShowFramesPerSecond=!1,this.debugShowGlobeDepth=!1,this.debugShowDepthFrustum=1,this.debugShowFrustumPlanes=!1,this._debugShowFrustumPlanes=!1,this._debugFrustumPlanes=void 0,this.useDepthPicking=!0,this.pickTranslucentDepth=!1,this.cameraEventWaitTime=500,this.fog=new Fog,this._shadowMapCamera=new Camera(this),this.shadowMap=new ShadowMap({context:o,lightCamera:this._shadowMapCamera,enabled:defaultValue(e.shadows,!1)}),this.invertClassification=!1,this.invertClassificationColor=Color.clone(Color.WHITE),this._actualInvertClassificationColor=Color.clone(this._invertClassificationColor),this._invertClassification=new InvertClassification,this.focalLength=void 0,this.eyeSeparation=void 0,this.postProcessStages=new PostProcessStageCollection,this._brdfLutGenerator=new BrdfLutGenerator,this._terrainExaggeration=defaultValue(e.terrainExaggeration,1),this._performanceDisplay=void 0,this._debugVolume=void 0,this._screenSpaceCameraController=new ScreenSpaceCameraController(this),this._cameraUnderground=!1,this._mapMode2D=defaultValue(e.mapMode2D,MapMode2D$1.INFINITE_SCROLL),this._environmentState={skyBoxCommand:void 0,skyAtmosphereCommand:void 0,sunDrawCommand:void 0,sunComputeCommand:void 0,moonCommand:void 0,isSunVisible:!1,isMoonVisible:!1,isReadyForAtmosphere:!1,isSkyAtmosphereVisible:!1,clearGlobeDepth:!1,useDepthPlane:!1,renderTranslucentDepthForPick:!1,originalFramebuffer:void 0,useGlobeDepthFramebuffer:!1,separatePrimitiveFramebuffer:!1,useOIT:!1,useInvertClassification:!1,usePostProcess:!1,usePostProcessSelected:!1,useWebVR:!1},this._useWebVR=!1,this._cameraVR=void 0,this._aspectRatioVR=void 0,this.requestRenderMode=defaultValue(e.requestRenderMode,!1),this._renderRequested=!0,this.maximumRenderTimeChange=defaultValue(e.maximumRenderTimeChange,0),this._lastRenderTime=void 0,this._frameRateMonitor=void 0,this._removeRequestListenerCallback=RequestScheduler.requestCompletedEvent.addEventListener(requestRenderAfterFrame(this)),this._removeTaskProcessorListenerCallback=TaskProcessor.taskCompletedEvent.addEventListener(requestRenderAfterFrame(this)),this._removeGlobeCallbacks=[];var s=new BoundingRectangle(0,0,o.drawingBufferWidth,o.drawingBufferHeight),l=new Camera(this);this._logDepthBuffer&&(l.frustum.near=.1,l.frustum.far=1e10),this.preloadFlightCamera=new Camera(this),this.preloadFlightCullingVolume=void 0,this._picking=new Picking(this),this._defaultView=new View(this,l,s),this._view=this._defaultView,this._hdr=void 0,this._hdrDirty=void 0,this.highDynamicRange=!1,this.gamma=2.2,this.sphericalHarmonicCoefficients=void 0,this.specularEnvironmentMaps=void 0,this._specularEnvironmentMapAtlas=void 0,this.light=new SunLight,updateFrameNumber(this,0,JulianDate.now()),this.updateFrameState(),this.initializeFrame()}function updateGlobeListeners(e,t){for(var i=0;i<e._removeGlobeCallbacks.length;++i)e._removeGlobeCallbacks[i]();e._removeGlobeCallbacks.length=0;var r=[];defined(t)&&(r.push(t.imageryLayersUpdatedEvent.addEventListener(requestRenderAfterFrame(e))),r.push(t.terrainProviderChanged.addEventListener(requestRenderAfterFrame(e)))),e._removeGlobeCallbacks=r}function updateDerivedCommands$1(e,t,i){var r=e._frameState,n=e._context,a=e._view.oit,o=r.shadowState.lightShadowMaps,s=r.shadowState.lightShadowsEnabled,l=t.derivedCommands;defined(t.pickId)&&(l.picking=DerivedCommand.createPickDerivedCommand(e,t,n,l.picking)),t.pickOnly||(l.depth=DerivedCommand.createDepthOnlyDerivedCommand(e,t,n,l.depth)),l.originalCommand=t,e._hdr&&(l.hdr=DerivedCommand.createHdrCommand(t,n,l.hdr),l=(t=l.hdr.command).derivedCommands),s&&t.receiveShadows&&(l.shadows=ShadowMap.createReceiveDerivedCommand(o,t,i,n,l.shadows)),t.pass===Pass$1.TRANSLUCENT&&defined(a)&&a.isSupported()&&(s&&t.receiveShadows?(l.oit=defined(l.oit)?l.oit:{},l.oit.shadows=a.createDerivedCommands(l.shadows.receiveCommand,n,l.oit.shadows)):l.oit=a.createDerivedCommands(t,n,l.oit))}Object.defineProperties(Scene.prototype,{canvas:{get:function(){return this._canvas}},drawingBufferHeight:{get:function(){return this._context.drawingBufferHeight}},drawingBufferWidth:{get:function(){return this._context.drawingBufferWidth}},maximumAliasedLineWidth:{get:function(){return ContextLimits.maximumAliasedLineWidth}},maximumCubeMapSize:{get:function(){return ContextLimits.maximumCubeMapSize}},pickPositionSupported:{get:function(){return this._context.depthTexture}},sampleHeightSupported:{get:function(){return this._context.depthTexture}},clampToHeightSupported:{get:function(){return this._context.depthTexture}},invertClassificationSupported:{get:function(){return this._context.depthTexture}},specularEnvironmentMapsSupported:{get:function(){return OctahedralProjectedCubeMap.isSupported(this._context)}},globe:{get:function(){return this._globe},set:function(e){this._globe=this._globe&&this._globe.destroy(),this._globe=e,updateGlobeListeners(this,e)}},primitives:{get:function(){return this._primitives}},groundPrimitives:{get:function(){return this._groundPrimitives}},camera:{get:function(){return this._view.camera},set:function(e){this._view.camera=e}},view:{get:function(){return this._view},set:function(e){this._view=e}},defaultView:{get:function(){return this._defaultView}},picking:{get:function(){return this._picking}},screenSpaceCameraController:{get:function(){return this._screenSpaceCameraController}},mapProjection:{get:function(){return this._mapProjection}},jobScheduler:{get:function(){return this._jobScheduler}},frameState:{get:function(){return this._frameState}},environmentState:{get:function(){return this._environmentState}},tweens:{get:function(){return this._tweens}},imageryLayers:{get:function(){if(defined(this.globe))return this.globe.imageryLayers}},terrainProvider:{get:function(){if(defined(this.globe))return this.globe.terrainProvider},set:function(e){defined(this.globe)&&(this.globe.terrainProvider=e)}},terrainProviderChanged:{get:function(){if(defined(this.globe))return this.globe.terrainProviderChanged}},preUpdate:{get:function(){return this._preUpdate}},postUpdate:{get:function(){return this._postUpdate}},renderError:{get:function(){return this._renderError}},preRender:{get:function(){return this._preRender}},postRender:{get:function(){return this._postRender}},lastRenderTime:{get:function(){return this._lastRenderTime}},context:{get:function(){return this._context}},debugFrustumStatistics:{get:function(){return this._view.debugFrustumStatistics}},scene3DOnly:{get:function(){return this._frameState.scene3DOnly}},orderIndependentTranslucency:{get:function(){return this._useOIT}},id:{get:function(){return this._id}},mode:{get:function(){return this._mode},set:function(e){e===SceneMode$1.SCENE2D?this.morphTo2D(0):e===SceneMode$1.SCENE3D?this.morphTo3D(0):e===SceneMode$1.COLUMBUS_VIEW&&this.morphToColumbusView(0),this._mode=e}},frustumCommandsList:{get:function(){return this._view.frustumCommandsList}},numberOfFrustums:{get:function(){return this._view.frustumCommandsList.length}},terrainExaggeration:{get:function(){return this._terrainExaggeration}},useWebVR:{get:function(){return this._useWebVR},set:function(e){this._useWebVR=e,this._useWebVR?(this._frameState.creditDisplay.container.style.visibility="hidden",this._cameraVR=new Camera(this),defined(this._deviceOrientationCameraController)||(this._deviceOrientationCameraController=new DeviceOrientationCameraController(this)),this._aspectRatioVR=this.camera.frustum.aspectRatio):(this._frameState.creditDisplay.container.style.visibility="visible",this._cameraVR=void 0,this._deviceOrientationCameraController=this._deviceOrientationCameraController&&!this._deviceOrientationCameraController.isDestroyed()&&this._deviceOrientationCameraController.destroy(),this.camera.frustum.aspectRatio=this._aspectRatioVR,this.camera.frustum.xOffset=0)}},mapMode2D:{get:function(){return this._mapMode2D}},imagerySplitPosition:{get:function(){return this._frameState.imagerySplitPosition},set:function(e){this._frameState.imagerySplitPosition=e}},minimumDisableDepthTestDistance:{get:function(){return this._minimumDisableDepthTestDistance},set:function(e){this._minimumDisableDepthTestDistance=e}},logarithmicDepthBuffer:{get:function(){return this._logDepthBuffer},set:function(e){e=this._context.fragmentDepth&&e,this._logDepthBuffer!==e&&(this._logDepthBuffer=e,this._logDepthBufferDirty=!0)}},gamma:{get:function(){return this._context.uniformState.gamma},set:function(e){this._context.uniformState.gamma=e}},highDynamicRange:{get:function(){return this._hdr},set:function(e){var t=this._context,i=e&&t.depthTexture&&(t.colorBufferFloat||t.colorBufferHalfFloat);this._hdrDirty=i!==this._hdr,this._hdr=i}},highDynamicRangeSupported:{get:function(){var e=this._context;return e.depthTexture&&(e.colorBufferFloat||e.colorBufferHalfFloat)}},cameraUnderground:{get:function(){return this._cameraUnderground}},pixelRatio:{get:function(){return this._frameState.pixelRatio},set:function(e){this._frameState.pixelRatio=e}},opaqueFrustumNearOffset:{get:function(){return.9999}},globeHeight:{get:function(){return this._globeHeight}}}),Scene.prototype.getCompressedTextureFormatSupported=function(e){var t=this.context;return("WEBGL_compressed_texture_s3tc"===e||"s3tc"===e)&&t.s3tc||("WEBGL_compressed_texture_pvrtc"===e||"pvrtc"===e)&&t.pvrtc||("WEBGL_compressed_texture_etc1"===e||"etc1"===e)&&t.etc1},Scene.prototype.updateDerivedCommands=function(e){var t,i,r,n,a,o,s,l,c,u,d,h,p,m;defined(e.derivedCommands)&&(t=this._frameState,i=this._context,r=!1,n=t.shadowState.lastDirtyTime,e.lastDirtyTime!==n&&(e.lastDirtyTime=n,r=e.dirty=!0),a=t.useLogDepth,o=this._hdr,l=defined((s=e.derivedCommands).logDepth),c=defined(s.hdr),u=defined(s.originalCommand),d=a&&!l,h=o&&!c,p=!(a&&o||u),e.dirty=e.dirty||d||h||p,e.dirty&&(e.dirty=!1,m=t.shadowState.shadowMaps,t.shadowState.shadowsEnabled&&e.castShadows&&(s.shadows=ShadowMap.createCastDerivedCommand(m,e,r,i,s.shadows)),(l||d)&&(s.logDepth=DerivedCommand.createLogDepthCommand(e,i,s.logDepth),updateDerivedCommands$1(this,s.logDepth.command,r)),(u||p)&&updateDerivedCommands$1(this,e,r)))};var renderTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.RENDER}),preloadTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PRELOAD}),preloadFlightTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PRELOAD_FLIGHT}),requestRenderModeDeferCheckPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.REQUEST_RENDER_MODE_DEFER_CHECK}),scratchOccluderBoundingSphere=new BoundingSphere,scratchOccluder;function getOccluder(e){var t=e.globe;if(e._mode===SceneMode$1.SCENE3D&&defined(t)&&t.show&&!e._cameraUnderground&&!e._globeTranslucencyState.translucent){var i=t.ellipsoid,r=e.frameState.minimumTerrainHeight;return scratchOccluderBoundingSphere.radius=i.minimumRadius+r,scratchOccluder=Occluder.fromBoundingSphere(scratchOccluderBoundingSphere,e.camera.positionWC,scratchOccluder)}}function updateFrameNumber(e,t,i){var r=e._frameState;r.frameNumber=t,r.time=JulianDate.clone(i,r.time)}Scene.prototype.clearPasses=function(e){e.render=!1,e.pick=!1,e.depth=!1,e.postProcess=!1,e.offscreen=!1},Scene.prototype.updateFrameState=function(){var e=this.camera,t=this._frameState;t.commandList.length=0,t.shadowMaps.length=0,t.brdfLutGenerator=this._brdfLutGenerator,t.environmentMap=this.skyBox&&this.skyBox._cubeMap,t.mode=this._mode,t.morphTime=this.morphTime,t.mapProjection=this.mapProjection,t.camera=e,t.cullingVolume=e.frustum.computeCullingVolume(e.positionWC,e.directionWC,e.upWC),t.occluder=getOccluder(this),t.terrainExaggeration=this._terrainExaggeration,t.minimumTerrainHeight=0,t.minimumDisableDepthTestDistance=this._minimumDisableDepthTestDistance,t.invertClassification=this.invertClassification,t.useLogDepth=this._logDepthBuffer&&!(this.camera.frustum instanceof OrthographicFrustum||this.camera.frustum instanceof OrthographicOffCenterFrustum),t.light=this.light,t.cameraUnderground=this._cameraUnderground,t.globeTranslucencyState=this._globeTranslucencyState,defined(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.ready?(t.specularEnvironmentMaps=this._specularEnvironmentMapAtlas.texture,t.specularEnvironmentMapsMaximumLOD=this._specularEnvironmentMapAtlas.maximumMipmapLevel):(t.specularEnvironmentMaps=void 0,t.specularEnvironmentMapsMaximumLOD=void 0),t.sphericalHarmonicCoefficients=this.sphericalHarmonicCoefficients,this._actualInvertClassificationColor=Color.clone(this.invertClassificationColor,this._actualInvertClassificationColor),InvertClassification.isTranslucencySupported(this._context)||(this._actualInvertClassificationColor.alpha=1),t.invertClassificationColor=this._actualInvertClassificationColor,defined(this.globe)?t.maximumScreenSpaceError=this.globe.maximumScreenSpaceError:t.maximumScreenSpaceError=2,this.clearPasses(t.passes),t.tilesetPassState=void 0},Scene.prototype.isVisible=function(e,t,i){return defined(e)&&(!defined(e.boundingVolume)||!e.cull||t.computeVisibility(e.boundingVolume)!==Intersect$1.OUTSIDE&&(!defined(i)||!e.occlude||!e.boundingVolume.isOccluded(i)))};var transformFrom2D=new Matrix4(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1);function debugShowBoundingVolume(e,t,i,r){var n=t._frameState,a=n.context,o=e.boundingVolume;defined(t._debugVolume)&&t._debugVolume.destroy();var s,l,c,u,d,h=Cartesian3.clone(o.center);n.mode!==SceneMode$1.SCENE3D&&(h=Matrix4.multiplyByPoint(transformFrom2D,h,h),l=(s=n.mapProjection).unproject(h),h=s.ellipsoid.cartographicToCartesian(l)),defined(o.radius)?(c=o.radius,u=GeometryPipeline.toWireframe(EllipsoidGeometry.createGeometry(new EllipsoidGeometry({radii:new Cartesian3(c,c,c),vertexFormat:PerInstanceColorAppearance.FLAT_VERTEX_FORMAT}))),t._debugVolume=new Primitive({geometryInstances:new GeometryInstance({geometry:u,modelMatrix:Matrix4.fromTranslation(h),attributes:{color:new ColorGeometryInstanceAttribute(1,0,0,1)}}),appearance:new PerInstanceColorAppearance({flat:!0,translucent:!1}),asynchronous:!1})):(d=o.halfAxes,u=GeometryPipeline.toWireframe(BoxGeometry.createGeometry(BoxGeometry.fromDimensions({dimensions:new Cartesian3(2,2,2),vertexFormat:PerInstanceColorAppearance.FLAT_VERTEX_FORMAT}))),t._debugVolume=new Primitive({geometryInstances:new GeometryInstance({geometry:u,modelMatrix:Matrix4.fromRotationTranslation(d,h,new Matrix4),attributes:{color:new ColorGeometryInstanceAttribute(1,0,0,1)}}),appearance:new PerInstanceColorAppearance({flat:!0,translucent:!1}),asynchronous:!1}));var p,m=n.commandList,f=n.commandList=[];t._debugVolume.update(n),e=f[0],n.useLogDepth&&(e=DerivedCommand.createLogDepthCommand(e,a).command),defined(r)&&(p=i.framebuffer,i.framebuffer=r),e.execute(a,i),defined(p)&&(i.framebuffer=p),n.commandList=m}function executeCommand(e,t,i,r,n){var a=t._frameState;if(!defined(t.debugCommandFilter)||t.debugCommandFilter(e))if(e instanceof ClearCommand)e.execute(i,r);else{e.debugShowBoundingVolume&&defined(e.boundingVolume)&&debugShowBoundingVolume(e,t,r,n),a.useLogDepth&&defined(e.derivedCommands.logDepth)&&(e=e.derivedCommands.logDepth.command);var o=a.passes;if(!o.pick&&!o.depth&&t._hdr&&defined(e.derivedCommands)&&defined(e.derivedCommands.hdr)&&(e=e.derivedCommands.hdr.command),o.pick||o.depth){if(o.pick&&!o.depth&&defined(e.derivedCommands.picking))return void(e=e.derivedCommands.picking.pickCommand).execute(i,r);if(defined(e.derivedCommands.depth))return void(e=e.derivedCommands.depth.depthOnlyCommand).execute(i,r)}t.debugShowCommands||t.debugShowFrustums?t._debugInspector.executeDebugShowFrustumsCommand(t,e,r):a.shadowState.lightShadowsEnabled&&e.receiveShadows&&defined(e.derivedCommands.shadows)?e.derivedCommands.shadows.receiveCommand.execute(i,r):e.execute(i,r)}}function executeIdCommand(e,t,i,r){var n=t._frameState,a=e.derivedCommands;defined(a)&&(n.useLogDepth&&defined(a.logDepth)&&(e=a.logDepth.command),defined((a=e.derivedCommands).picking)?(e=a.picking.pickCommand).execute(i,r):defined(a.depth)&&(e=a.depth.depthOnlyCommand).execute(i,r))}function backToFront(e,t,i){return t.boundingVolume.distanceSquaredTo(i)-e.boundingVolume.distanceSquaredTo(i)}function frontToBack(e,t,i){return e.boundingVolume.distanceSquaredTo(i)-t.boundingVolume.distanceSquaredTo(i)+CesiumMath.EPSILON12}function executeTranslucentCommandsBackToFront(e,t,i,r,n){var a=e.context;mergeSort(r,backToFront,e.camera.positionWC),defined(n)&&t(n.unclassifiedCommand,e,a,i);for(var o=r.length,s=0;s<o;++s)t(r[s],e,a,i)}function executeTranslucentCommandsFrontToBack(e,t,i,r,n){var a=e.context;mergeSort(r,frontToBack,e.camera.positionWC),defined(n)&&t(n.unclassifiedCommand,e,a,i);for(var o=r.length,s=0;s<o;++s)t(r[s],e,a,i)}function getDebugGlobeDepth(e,t){var i=e._view.debugGlobeDepths,r=i[t];return!defined(r)&&e.context.depthTexture&&(r=new GlobeDepth,i[t]=r),r}transformFrom2D=Matrix4.inverseTransformation(transformFrom2D,transformFrom2D);var scratchPerspectiveFrustum$1=new PerspectiveFrustum,scratchPerspectiveOffCenterFrustum$1=new PerspectiveOffCenterFrustum,scratchOrthographicFrustum$1=new OrthographicFrustum,scratchOrthographicOffCenterFrustum$1=new OrthographicOffCenterFrustum;function executeCommands$1(e,t){var i,r=e.camera,n=e.context,a=e.frameState,o=n.uniformState;o.updateCamera(r),(i=defined(r.frustum.fov)?r.frustum.clone(scratchPerspectiveFrustum$1):defined(r.frustum.infiniteProjectionMatrix)?r.frustum.clone(scratchPerspectiveOffCenterFrustum$1):defined(r.frustum.width)?r.frustum.clone(scratchOrthographicFrustum$1):r.frustum.clone(scratchOrthographicOffCenterFrustum$1)).near=r.frustum.near,i.far=r.frustum.far,o.updateFrustum(i),o.updatePass(Pass$1.ENVIRONMENT);var s,l,c,u=a.passes,d=u.pick,h=e._environmentState,p=e._view,m=h.renderTranslucentDepthForPick,f=h.useWebVR;d||(defined(s=h.skyBoxCommand)&&executeCommand(s,e,n,t),h.isSkyAtmosphereVisible&&executeCommand(h.skyAtmosphereCommand,e,n,t),h.isSunVisible&&(h.sunDrawCommand.execute(n,t),e.sunBloom&&!f&&(l=h.useGlobeDepthFramebuffer?p.globeDepth.framebuffer:h.usePostProcess?p.sceneFramebuffer.getFramebuffer():h.originalFramebuffer,e._sunPostProcess.execute(n),e._sunPostProcess.copy(n,l),t.framebuffer=l)),h.isMoonVisible&&h.moonCommand.execute(n,t)),c=h.useOIT?(defined(e._executeOITFunction)||(e._executeOITFunction=function(e,t,i,r,n){p.oit.executeCommands(e,t,i,r,n)}),e._executeOITFunction):u.render?executeTranslucentCommandsBackToFront:executeTranslucentCommandsFrontToBack;for(var g,_=p.frustumCommandsList,y=_.length,v=h.clearGlobeDepth,C=h.useDepthPlane,S=e._globeTranslucencyState,T=S.translucent,x=e._view.globeTranslucencyFramebuffer,b=(h.separatePrimitiveFramebuffer=!1,e._depthClearCommand),E=e._stencilClearCommand,P=e._classificationStencilClearCommand,A=e._depthPlane,w=h.usePostProcessSelected,D=r.position.z,M=0;M<y;++M){var I=y-M-1,R=_[I];e.mode===SceneMode$1.SCENE2D?(r.position.z=D-R.near+1,i.far=Math.max(1,R.far-R.near),i.near=1,o.update(a)):(i.near=0!=I?R.near*e.opaqueFrustumNearOffset:R.near,i.far=R.far),o.updateFrustum(i);var O,L=e.debugShowGlobeDepth?getDebugGlobeDepth(e,I):p.globeDepth;0,e.debugShowGlobeDepth&&defined(L)&&h.useGlobeDepthFramebuffer&&(L.update(n,t,p.viewport,e._hdr,v),L.clear(n,t,e._clearColorCommand.color),O=t.framebuffer,t.framebuffer=L.framebuffer),b.execute(n,t),n.stencilBuffer&&E.execute(n,t),o.updatePass(Pass$1.GLOBE);var F,N,B,V=R.commands[Pass$1.GLOBE],k=R.indices[Pass$1.GLOBE];if(T)S.executeGlobeCommands(R,executeCommand,x,e,t);else for(g=0;g<k;++g)executeCommand(V[g],e,n,t);if(defined(L)&&h.useGlobeDepthFramebuffer&&L.executeCopyDepth(n,t),e.debugShowGlobeDepth&&defined(L)&&h.useGlobeDepthFramebuffer&&(t.framebuffer=O),!h.renderTranslucentDepthForPick)if(o.updatePass(Pass$1.TERRAIN_CLASSIFICATION),V=R.commands[Pass$1.TERRAIN_CLASSIFICATION],k=R.indices[Pass$1.TERRAIN_CLASSIFICATION],T)S.executeGlobeClassificationCommands(R,executeCommand,x,e,t);else for(g=0;g<k;++g)executeCommand(V[g],e,n,t);if(v&&(b.execute(n,t),C&&A.execute(n,t)),!h.useInvertClassification||d||h.renderTranslucentDepthForPick){for(o.updatePass(Pass$1.CESIUM_3D_TILE),V=R.commands[Pass$1.CESIUM_3D_TILE],k=R.indices[Pass$1.CESIUM_3D_TILE],g=0;g<k;++g)executeCommand(V[g],e,n,t);if(0<k&&(defined(L)&&h.useGlobeDepthFramebuffer&&L.executeUpdateDepth(n,t,v),!h.renderTranslucentDepthForPick))for(o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION),V=R.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION],k=R.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION],g=0;g<k;++g)executeCommand(V[g],e,n,t)}else{e._invertClassification.clear(n,t);var z=t.framebuffer;for(t.framebuffer=e._invertClassification._fbo,o.updatePass(Pass$1.CESIUM_3D_TILE),V=R.commands[Pass$1.CESIUM_3D_TILE],k=R.indices[Pass$1.CESIUM_3D_TILE],g=0;g<k;++g)executeCommand(V[g],e,n,t);for(defined(L)&&h.useGlobeDepthFramebuffer&&L.executeUpdateDepth(n,t,v),o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW),V=R.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW],k=R.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW],g=0;g<k;++g)executeCommand(V[g],e,n,t);for(t.framebuffer=z,e._invertClassification.executeClassified(n,t),1===a.invertClassificationColor.alpha&&e._invertClassification.executeUnclassified(n,t),0<k&&n.stencilBuffer&&P.execute(n,t),o.updatePass(Pass$1.CESIUM_3D_TILE_CLASSIFICATION),V=R.commands[Pass$1.CESIUM_3D_TILE_CLASSIFICATION],k=R.indices[Pass$1.CESIUM_3D_TILE_CLASSIFICATION],g=0;g<k;++g)executeCommand(V[g],e,n,t)}for(0<k&&n.stencilBuffer&&E.execute(n,t),o.updatePass(Pass$1.OPAQUE),V=R.commands[Pass$1.OPAQUE],k=R.indices[Pass$1.OPAQUE],g=0;g<k;++g)executeCommand(V[g],e,n,t);if(0!=I&&e.mode!==SceneMode$1.SCENE2D&&(i.near=R.near,o.updateFrustum(i)),!d&&h.useInvertClassification&&a.invertClassificationColor.alpha<1&&(F=e._invertClassification),o.updatePass(Pass$1.TRANSLUCENT),(V=R.commands[Pass$1.TRANSLUCENT]).length=R.indices[Pass$1.TRANSLUCENT],c(e,executeCommand,t,V,F),n.depthTexture&&e.useDepthPicking&&(h.useGlobeDepthFramebuffer||m)&&(N=m?t.framebuffer.depthStencilTexture:L.framebuffer.depthStencilTexture,(B=e._picking.getPickDepth(e,I)).update(n,N),B.executeCopyDepth(n,t)),!d&&w){var $=t.framebuffer;if(t.framebuffer=p.sceneFramebuffer.getIdFramebuffer(),i.near=0!=I?R.near*e.opaqueFrustumNearOffset:R.near,i.far=R.far,o.updateFrustum(i),o.updatePass(Pass$1.GLOBE),V=R.commands[Pass$1.GLOBE],k=R.indices[Pass$1.GLOBE],T)S.executeGlobeCommands(R,executeIdCommand,x,e,t);else for(g=0;g<k;++g)executeIdCommand(V[g],e,n,t);for(v&&(b.framebuffer=t.framebuffer,b.execute(n,t),b.framebuffer=void 0),v&&C&&A.execute(n,t),o.updatePass(Pass$1.CESIUM_3D_TILE),V=R.commands[Pass$1.CESIUM_3D_TILE],k=R.indices[Pass$1.CESIUM_3D_TILE],g=0;g<k;++g)executeIdCommand(V[g],e,n,t);for(o.updatePass(Pass$1.OPAQUE),V=R.commands[Pass$1.OPAQUE],k=R.indices[Pass$1.OPAQUE],g=0;g<k;++g)executeIdCommand(V[g],e,n,t);for(o.updatePass(Pass$1.TRANSLUCENT),V=R.commands[Pass$1.TRANSLUCENT],k=R.indices[Pass$1.TRANSLUCENT],g=0;g<k;++g)executeIdCommand(V[g],e,n,t);t.framebuffer=$}}}function executeComputeCommands(e){e.context.uniformState.updatePass(Pass$1.COMPUTE);var t=e._environmentState.sunComputeCommand;defined(t)&&t.execute(e._computeEngine);for(var i=e._computeCommandList,r=i.length,n=0;n<r;++n)i[n].execute(e._computeEngine)}function executeOverlayCommands(e,t){e.context.uniformState.updatePass(Pass$1.OVERLAY);for(var i=e.context,r=e._overlayCommandList,n=r.length,a=0;a<n;++a)r[a].execute(i,t)}function insertShadowCastCommands(e,t,i){for(var r=i.shadowMapCullingVolume,n=i.isPointLight,a=i.passes,o=a.length,s=t.length,l=0;l<s;++l){var c=t[l];if(e.updateDerivedCommands(c),c.castShadows&&(c.pass===Pass$1.GLOBE||c.pass===Pass$1.CESIUM_3D_TILE||c.pass===Pass$1.OPAQUE||c.pass===Pass$1.TRANSLUCENT)&&e.isVisible(c,r))if(n)for(var u=0;u<o;++u)a[u].commandList.push(c);else if(1===o)a[0].commandList.push(c);else for(var d=!1,h=o-1;0<=h;--h){var p=a[h].cullingVolume;if(e.isVisible(c,p))a[h].commandList.push(c),d=!0;else if(d)break}}}function executeShadowMapCastCommands(e){var t=e.frameState,i=t.shadowState.shadowMaps,r=i.length;if(t.shadowState.shadowsEnabled)for(var n=e.context,a=n.uniformState,o=0;o<r;++o){var s=i[o];if(!s.outOfView){for(var l=s.passes,c=l.length,u=0;u<c;++u)l[u].commandList.length=0;for(insertShadowCastCommands(e,e.frameState.commandList,s),u=0;u<c;++u){var d=s.passes[u];a.updateCamera(d.camera),s.updatePass(n,u);for(var h=d.commandList.length,p=0;p<h;++p){var m=d.commandList[p];a.updatePass(m.pass),executeCommand(m.derivedCommands.shadows.castCommands[o],e,n,d.passState)}}}}}var scratchEyeTranslation=new Cartesian3;function executeWebVRCommands(e,t,i){var r=e._view,n=r.camera,a=e._environmentState.renderTranslucentDepthForPick;updateAndClearFramebuffers(e,t,i),a||updateAndRenderPrimitives(e),r.createPotentiallyVisibleSet(e),a||(executeComputeCommands(e),executeShadowMapCastCommands(e));var o=t.viewport;o.x=0,o.y=0,o.width=.5*o.width;var s=Camera.clone(n,e._cameraVR);s.frustum=n.frustum;var l=n.frustum.near,c=l*defaultValue(e.focalLength,5),u=defaultValue(e.eyeSeparation,c/30),d=Cartesian3.multiplyByScalar(s.right,.5*u,scratchEyeTranslation);n.frustum.aspectRatio=o.width/o.height;var h=.5*u*l/c;Cartesian3.add(s.position,d,n.position),n.frustum.xOffset=h,executeCommands$1(e,t),o.x=o.width,Cartesian3.subtract(s.position,d,n.position),n.frustum.xOffset=-h,executeCommands$1(e,t),Camera.clone(s,n)}Scene.prototype.updateAndExecuteCommands=function(e,t){var i=this._frameState.mode;this._environmentState.useWebVR?executeWebVRCommands(this,e,t):i!==SceneMode$1.SCENE2D||this._mapMode2D===MapMode2D$1.ROTATE?executeCommandsInViewport(!0,this,e,t):(updateAndClearFramebuffers(this,e,t),execute2DViewportCommands(this,e))};var scratch2DViewportCartographic=new Cartographic(Math.PI,CesiumMath.PI_OVER_TWO),scratch2DViewportMaxCoord=new Cartesian3,scratch2DViewportSavedPosition=new Cartesian3,scratch2DViewportTransform=new Matrix4,scratch2DViewportCameraTransform=new Matrix4,scratch2DViewportEyePoint=new Cartesian3,scratch2DViewportWindowCoords=new Cartesian3,scratch2DViewport=new BoundingRectangle;function execute2DViewportCommands(e,t){var i=e.context,r=e.frameState,n=e.camera,a=t.viewport,o=BoundingRectangle.clone(a,scratch2DViewport);t.viewport=o;var s=scratch2DViewportMaxCoord;e.mapProjection.project(scratch2DViewportCartographic,s);var l=Cartesian3.clone(n.position,scratch2DViewportSavedPosition),c=Matrix4.clone(n.transform,scratch2DViewportCameraTransform),u=n.frustum.clone();n._setTransform(Matrix4.IDENTITY);var d=Matrix4.computeViewportTransformation(o,0,1,scratch2DViewportTransform),h=n.frustum.projectionMatrix,p=n.positionWC.y,m=Cartesian3.fromElements(CesiumMath.sign(p)*s.x-p,0,-n.positionWC.x,scratch2DViewportEyePoint),f=Transforms.pointToGLWindowCoordinates(h,d,m,scratch2DViewportWindowCoords);f.x=Math.floor(f.x);var g,_,y=o.x,v=o.width;0===p||f.x<=y||f.x>=y+v?executeCommandsInViewport(!0,e,t):(Math.abs(y+.5*v-f.x)<1?(o.width=f.x-o.x,n.position.x*=CesiumMath.sign(n.position.x),n.frustum.right=0,r.cullingVolume=n.frustum.computeCullingVolume(n.positionWC,n.directionWC,n.upWC),i.uniformState.update(r),executeCommandsInViewport(!0,e,t),o.x=f.x,n.position.x=-n.position.x,n.frustum.right=-n.frustum.left,n.frustum.left=0):f.x>y+.5*v?(o.width=f.x-y,g=n.frustum.right,n.frustum.right=s.x-p,r.cullingVolume=n.frustum.computeCullingVolume(n.positionWC,n.directionWC,n.upWC),i.uniformState.update(r),executeCommandsInViewport(!0,e,t),o.x=f.x,o.width=y+v-f.x,n.position.x=-n.position.x,n.frustum.left=-n.frustum.right,n.frustum.right=g-2*n.frustum.right):(o.x=f.x,o.width=y+v-f.x,_=n.frustum.left,n.frustum.left=-s.x-p,r.cullingVolume=n.frustum.computeCullingVolume(n.positionWC,n.directionWC,n.upWC),i.uniformState.update(r),executeCommandsInViewport(!0,e,t),o.x=y,o.width=f.x-y,n.position.x=-n.position.x,n.frustum.right=-n.frustum.left,n.frustum.left=_-2*n.frustum.left),r.cullingVolume=n.frustum.computeCullingVolume(n.positionWC,n.directionWC,n.upWC),i.uniformState.update(r),executeCommandsInViewport(!1,e,t)),n._setTransform(c),Cartesian3.clone(l,n.position),n.frustum=u.clone(),t.viewport=a}function executeCommandsInViewport(e,t,i,r){var n=t._environmentState,a=t._view,o=n.renderTranslucentDepthForPick;e||o||(t.frameState.commandList.length=0),o||updateAndRenderPrimitives(t),a.createPotentiallyVisibleSet(t),e&&(defined(r)&&updateAndClearFramebuffers(t,i,r),o||(executeComputeCommands(t),executeShadowMapCastCommands(t))),executeCommands$1(t,i)}var scratchCullingVolume$1=new CullingVolume;function updateDebugFrustumPlanes(e){var t=e._frameState;e.debugShowFrustumPlanes!==e._debugShowFrustumPlanes&&(e.debugShowFrustumPlanes?e._debugFrustumPlanes=new DebugCameraPrimitive({camera:e.camera,updateOnChange:!1,frustumSplits:t.frustumSplits}):e._debugFrustumPlanes=e._debugFrustumPlanes&&e._debugFrustumPlanes.destroy(),e._debugShowFrustumPlanes=e.debugShowFrustumPlanes),defined(e._debugFrustumPlanes)&&e._debugFrustumPlanes.update(t)}function updateShadowMaps(e){var t=e._frameState,i=t.shadowMaps,r=i.length,n=0<r&&!t.passes.pick&&e.mode===SceneMode$1.SCENE3D;if(n!==t.shadowState.shadowsEnabled&&(++t.shadowState.lastDirtyTime,t.shadowState.shadowsEnabled=n),t.shadowState.lightShadowsEnabled=!1,n){for(var a=0;a<r;++a)if(i[a]!==t.shadowState.shadowMaps[a]){++t.shadowState.lastDirtyTime;break}t.shadowState.shadowMaps.length=0;for(var o=t.shadowState.lightShadowMaps.length=0;o<r;++o){var s=i[o];s.update(t),t.shadowState.shadowMaps.push(s),s.fromLightSource&&(t.shadowState.lightShadowMaps.push(s),t.shadowState.lightShadowsEnabled=!0),s.dirty&&(++t.shadowState.lastDirtyTime,s.dirty=!1)}}}function updateAndRenderPrimitives(e){var t=e._frameState;e._groundPrimitives.update(t),e._primitives.update(t),updateDebugFrustumPlanes(e),updateShadowMaps(e),e._globe&&e._globe.render(t)}function updateAndClearFramebuffers(e,t,i){var r=e._context,n=e._frameState,a=e._environmentState,o=e._view,s=e._frameState.passes.pick,l=a.useWebVR;a.originalFramebuffer=t.framebuffer,defined(e.sun)&&e.sunBloom!==e._sunBloom?(e.sunBloom&&!l?e._sunPostProcess=new SunPostProcess:defined(e._sunPostProcess)&&(e._sunPostProcess=e._sunPostProcess.destroy()),e._sunBloom=e.sunBloom):!defined(e.sun)&&defined(e._sunPostProcess)&&(e._sunPostProcess=e._sunPostProcess.destroy(),e._sunBloom=!1);var c=e._clearColorCommand;Color.clone(i,c.color),c.execute(r,t);var u=a.useGlobeDepthFramebuffer=defined(o.globeDepth);u&&(o.globeDepth.update(r,t,o.viewport,e._hdr,a.clearGlobeDepth),o.globeDepth.clear(r,t,i));var d=o.oit,h=a.useOIT=!s&&defined(d)&&d.isSupported();h&&(d.update(r,t,o.globeDepth.framebuffer,e._hdr),d.clear(r,t,i),a.useOIT=d.isSupported());var p,m,f,g=e.postProcessStages,_=a.usePostProcess=!s&&(e._hdr||0<g.length||g.ambientOcclusion.enabled||g.fxaa.enabled||g.bloom.enabled);a.usePostProcessSelected=!1,_&&(o.sceneFramebuffer.update(r,o.viewport,e._hdr),o.sceneFramebuffer.clear(r,t,i),g.update(r,n.useLogDepth,e._hdr),g.clear(r),_=a.usePostProcess=g.ready,a.usePostProcessSelected=_&&g.hasSelected),a.isSunVisible&&e.sunBloom&&!l?(t.framebuffer=e._sunPostProcess.update(t),e._sunPostProcess.clear(r,t,i)):u?t.framebuffer=o.globeDepth.framebuffer:_&&(t.framebuffer=o.sceneFramebuffer.getFramebuffer()),defined(t.framebuffer)&&c.execute(r,t),(a.useInvertClassification=!s&&defined(t.framebuffer)&&e.invertClassification)&&(1===e.frameState.invertClassificationColor.alpha&&a.useGlobeDepthFramebuffer&&(p=o.globeDepth.framebuffer),defined(p)||r.depthTexture?(e._invertClassification.previousFramebuffer=p,e._invertClassification.update(r),e._invertClassification.clear(r,t),e.frameState.invertClassificationColor.alpha<1&&h&&((f=(m=e._invertClassification.unclassifiedCommand).derivedCommands).oit=d.createDerivedCommands(m,r,f.oit))):a.useInvertClassification=!1),e._globeTranslucencyState.translucent&&o.globeTranslucencyFramebuffer.updateAndClear(e._hdr,o.viewport,r,t)}function callAfterRenderFunctions(e){for(var t=e._frameState.afterRender,i=0,r=t.length;i<r;++i)t[i](),e.requestRender();t.length=0}function getGlobeHeight(e){var t=e._globe,i=e.camera.positionCartographic;if(defined(t)&&t.show&&defined(i))return t.getHeight(i)}function isCameraUnderground(e){var t=e.camera,i=e._mode,r=e.globe,n=e._screenSpaceCameraController,a=t.positionCartographic;if(!defined(a))return!1;if(!n.onMap()&&a.height<0)return!0;if(!defined(r)||!r.show||i===SceneMode$1.SCENE2D||i===SceneMode$1.MORPHING)return!1;var o=e._globeHeight;return defined(o)&&a.height<o}function updateDebugShowFramesPerSecond(e,t){var i,r;e.debugShowFramesPerSecond?(defined(e._performanceDisplay)||((i=document.createElement("div")).className="cesium-performanceDisplay-defaultContainer",e._canvas.parentNode.appendChild(i),r=new PerformanceDisplay({container:i}),e._performanceDisplay=r,e._performanceContainer=i),e._performanceDisplay.throttled=e.requestRenderMode,e._performanceDisplay.update(t)):defined(e._performanceDisplay)&&(e._performanceDisplay=e._performanceDisplay&&e._performanceDisplay.destroy(),e._performanceContainer.parentNode.removeChild(e._performanceContainer))}function prePassesUpdate(e){e._jobScheduler.resetBudgets();var t=e._frameState;e.primitives.prePassesUpdate(t),defined(e.globe)&&e.globe.update(t),e._picking.update(),t.creditDisplay.update()}function postPassesUpdate(e){var t=e._frameState;e.primitives.postPassesUpdate(t),RequestScheduler.update()}Scene.prototype.updateEnvironment=function(){var e,t=this._frameState,i=this._view,r=this._environmentState,n=t.passes.render,a=t.passes.offscreen,o=this.skyAtmosphere,s=this.globe,l=this._globeTranslucencyState;!n||this._mode!==SceneMode$1.SCENE2D&&i.camera.frustum instanceof OrthographicFrustum||!l.environmentVisible?(r.skyAtmosphereCommand=void 0,r.skyBoxCommand=void 0,r.sunDrawCommand=void 0,r.sunComputeCommand=void 0,r.moonCommand=void 0):(defined(o)?(defined(s)&&(o.setDynamicAtmosphereColor(s.enableLighting&&s.dynamicAtmosphereLighting,s.dynamicAtmosphereLightingFromSun),r.isReadyForAtmosphere=r.isReadyForAtmosphere||0<s._surface._tilesToRender.length),r.skyAtmosphereCommand=o.update(t,s),defined(r.skyAtmosphereCommand)&&this.updateDerivedCommands(r.skyAtmosphereCommand)):r.skyAtmosphereCommand=void 0,r.skyBoxCommand=defined(this.skyBox)?this.skyBox.update(t,this._hdr):void 0,e=defined(this.sun)?this.sun.update(t,i.passState,this._hdr):void 0,r.sunDrawCommand=defined(e)?e.drawCommand:void 0,r.sunComputeCommand=defined(e)?e.computeCommand:void 0,r.moonCommand=defined(this.moon)?this.moon.update(t):void 0);var c=r.clearGlobeDepth=defined(s)&&s.show&&(!s.depthTestAgainstTerrain||this.mode===SceneMode$1.SCENE2D);(r.useDepthPlane=c&&this.mode===SceneMode$1.SCENE3D&&l.useDepthPlane)&&this._depthPlane.update(t),r.renderTranslucentDepthForPick=!1,r.useWebVR=this._useWebVR&&this.mode!==SceneMode$1.SCENE2D&&!a;for(var u=t.mode!==SceneMode$1.SCENE3D||l.sunVisibleThroughGlobe?void 0:t.occluder,d=t.cullingVolume,h=scratchCullingVolume$1.planes,p=0;p<5;++p)h[p]=d.planes[p];d=scratchCullingVolume$1,r.isSkyAtmosphereVisible=defined(r.skyAtmosphereCommand)&&r.isReadyForAtmosphere,r.isSunVisible=this.isVisible(r.sunDrawCommand,d,u),r.isMoonVisible=this.isVisible(r.moonCommand,d,u);var m=this.specularEnvironmentMaps,f=this._specularEnvironmentMapAtlas;!defined(m)||defined(f)&&f.url===m?!defined(m)&&defined(f)&&(f.destroy(),this._specularEnvironmentMapAtlas=void 0):(f=f&&f.destroy(),this._specularEnvironmentMapAtlas=new OctahedralProjectedCubeMap(m)),defined(this._specularEnvironmentMapAtlas)&&this._specularEnvironmentMapAtlas.update(t)},Scene.prototype.resolveFramebuffers=function(e){var t,i,r,n,a,o=this._context,s=this._frameState,l=this._environmentState,c=this._view,u=c.globeDepth,d=l.useOIT,h=l.useGlobeDepthFramebuffer,p=l.usePostProcess,m=l.originalFramebuffer,f=h?u.framebuffer:void 0,g=c.sceneFramebuffer.getFramebuffer(),_=c.sceneFramebuffer.getIdFramebuffer();l.separatePrimitiveFramebuffer&&u.executeMergeColor(o,e),d&&(e.framebuffer=p?g:m,c.oit.execute(o,e)),p&&(t=h&&!d?f:g,i=this.postProcessStages,r=t.getColorTexture(0),n=_.getColorTexture(0),a=defaultValue(f,g).depthStencilTexture,i.execute(o,r,a,n),i.copy(o,m)),d||p||!h||(e.framebuffer=m,u.executeCopyColor(o,e));var y=s.useLogDepth;this.debugShowGlobeDepth&&h&&getDebugGlobeDepth(this,this.debugShowDepthFrustum-1).executeDebugGlobeDepth(o,e,y),this.debugShowPickDepth&&h&&this._picking.getPickDepth(this,this.debugShowDepthFrustum-1).executeDebugPickDepth(o,e,y)},Scene.prototype.initializeFrame=function(){120==this._shaderFrameCount++&&(this._shaderFrameCount=0,this._context.shaderCache.destroyReleasedShaderPrograms(),this._context.textureCache.destroyReleasedTextures()),this._tweens.update(),this._globeHeight=getGlobeHeight(this),this._cameraUnderground=isCameraUnderground(this),this._globeTranslucencyState.update(this),this._screenSpaceCameraController.update(),defined(this._deviceOrientationCameraController)&&this._deviceOrientationCameraController.update(),this.camera.update(this._mode),this.camera._updateCameraChanged()};var scratchBackgroundColor=new Color;function render(e){var t=e._frameState,i=e.context,r=i.uniformState,n=e._defaultView;e._view=n,e.updateFrameState(),t.passes.render=!0,t.passes.postProcess=e.postProcessStages.hasSelected,t.tilesetPassState=renderTilesetPassState;var a=defaultValue(e.backgroundColor,Color.BLACK);e._hdr&&((a=Color.clone(a,scratchBackgroundColor)).red=Math.pow(a.red,e.gamma),a.green=Math.pow(a.green,e.gamma),a.blue=Math.pow(a.blue,e.gamma)),t.backgroundColor=a,e.fog.update(t),r.update(t);var o=e.shadowMap;defined(o)&&o.enabled&&(!defined(e.light)||e.light instanceof SunLight?Cartesian3.negate(r.sunDirectionWC,e._shadowMapCamera.direction):Cartesian3.clone(e.light.direction,e._shadowMapCamera.direction),t.shadowMaps.push(o)),e._computeCommandList.length=0,e._overlayCommandList.length=0;var s=n.viewport;s.x=0,s.y=0,s.width=i.drawingBufferWidth,s.height=i.drawingBufferHeight;var l=n.passState;l.framebuffer=void 0,l.blendingEnabled=void 0,l.scissorTest=void 0,l.viewport=BoundingRectangle.clone(s,l.viewport),defined(e.globe)&&e.globe.beginFrame(t),e.updateEnvironment(),e.updateAndExecuteCommands(l,a),e.resolveFramebuffers(l),l.framebuffer=void 0,executeOverlayCommands(e,l),defined(e.globe)&&(e.globe.endFrame(t),e.globe.tilesLoaded||(e._renderRequested=!0)),i.endFrame()}function tryAndCatchError(t,e){try{e(t)}catch(e){if(t._renderError.raiseEvent(t,e),t.rethrowRenderErrors)throw e}}function updateMostDetailedRayPicks(e){return e._picking.updateMostDetailedRayPicks(e)}function updatePreloadPass(e){var t=e._frameState;preloadTilesetPassState.camera=t.camera,preloadTilesetPassState.cullingVolume=t.cullingVolume,e.primitives.updateForPass(t,preloadTilesetPassState)}function updatePreloadFlightPass(e){var t=e._frameState;t.camera.canPreloadFlight()&&(preloadFlightTilesetPassState.camera=e.preloadFlightCamera,preloadFlightTilesetPassState.cullingVolume=e.preloadFlightCullingVolume,e.primitives.updateForPass(t,preloadFlightTilesetPassState))}function updateRequestRenderModeDeferCheckPass(e){e.primitives.updateForPass(e._frameState,requestRenderModeDeferCheckPassState)}Scene.prototype.render=function(e){this._preUpdate.raiseEvent(this,e);var t=this._frameState;t.newFrame=!1,defined(e)||(e=JulianDate.now());var i,r=this._view.checkForCameraUpdates(this),n=!this.requestRenderMode||this._renderRequested||r||this._logDepthBufferDirty||this._hdrDirty||this.mode===SceneMode$1.MORPHING;!n&&defined(this.maximumRenderTimeChange)&&defined(this._lastRenderTime)&&(i=Math.abs(JulianDate.secondsDifference(this._lastRenderTime,e)),n=n||i>this.maximumRenderTimeChange),n&&(this._lastRenderTime=JulianDate.clone(e,this._lastRenderTime),this._renderRequested=!1,this._logDepthBufferDirty=!1,this._hdrDirty=!1,updateFrameNumber(this,CesiumMath.incrementWrap(t.frameNumber,15e6,1),e),t.newFrame=!0),tryAndCatchError(this,prePassesUpdate),this.primitives.show&&(tryAndCatchError(this,updateMostDetailedRayPicks),tryAndCatchError(this,updatePreloadPass),tryAndCatchError(this,updatePreloadFlightPass),n||tryAndCatchError(this,updateRequestRenderModeDeferCheckPass)),this._postUpdate.raiseEvent(this,e),n&&(this._preRender.raiseEvent(this,e),t.creditDisplay.beginFrame(),tryAndCatchError(this,render)),updateDebugShowFramesPerSecond(this,n),tryAndCatchError(this,postPassesUpdate),callAfterRenderFunctions(this),n&&(this._postRender.raiseEvent(this,e),t.creditDisplay.endFrame())},Scene.prototype.forceRender=function(e){this._renderRequested=!0,this.render(e)},Scene.prototype.requestRender=function(){this._renderRequested=!0},Scene.prototype.clampLineWidth=function(e){return Math.max(ContextLimits.minimumAliasedLineWidth,Math.min(e,ContextLimits.maximumAliasedLineWidth))},Scene.prototype.pick=function(e,t,i){return this._picking.pick(this,e,t,i)},Scene.prototype.pickPositionWorldCoordinates=function(e,t){return this._picking.pickPositionWorldCoordinates(this,e,t)},Scene.prototype.pickPosition=function(e,t){return this._picking.pickPosition(this,e,t)},Scene.prototype.drillPick=function(e,t,i,r){return this._picking.drillPick(this,e,t,i,r)},Scene.prototype.pickFromRay=function(e,t,i){return this._picking.pickFromRay(this,e,t,i)},Scene.prototype.drillPickFromRay=function(e,t,i,r){return this._picking.drillPickFromRay(this,e,t,i,r)},Scene.prototype.pickFromRayMostDetailed=function(e,t,i){return this._picking.pickFromRayMostDetailed(this,e,t,i)},Scene.prototype.drillPickFromRayMostDetailed=function(e,t,i,r){return this._picking.drillPickFromRayMostDetailed(this,e,t,i,r)},Scene.prototype.sampleHeight=function(e,t,i){return this._picking.sampleHeight(this,e,t,i)},Scene.prototype.clampToHeight=function(e,t,i,r){return this._picking.clampToHeight(this,e,t,i,r)},Scene.prototype.sampleHeightMostDetailed=function(e,t,i){return this._picking.sampleHeightMostDetailed(this,e,t,i)},Scene.prototype.clampToHeightMostDetailed=function(e,t,i){return this._picking.clampToHeightMostDetailed(this,e,t,i)},Scene.prototype.cartesianToCanvasCoordinates=function(e,t){return SceneTransforms.wgs84ToWindowCoordinates(this,e,t)},Scene.prototype.completeMorph=function(){this._transitioner.completeMorph()},Scene.prototype.morphTo2D=function(e){var t=this.globe,i=defined(t)?t.ellipsoid:this.mapProjection.ellipsoid;e=defaultValue(e,2),this._transitioner.morphTo2D(e,i)},Scene.prototype.morphToColumbusView=function(e){var t=this.globe,i=defined(t)?t.ellipsoid:this.mapProjection.ellipsoid;e=defaultValue(e,2),this._transitioner.morphToColumbusView(e,i)},Scene.prototype.morphTo3D=function(e){var t=this.globe,i=defined(t)?t.ellipsoid:this.mapProjection.ellipsoid;e=defaultValue(e,2),this._transitioner.morphTo3D(e,i)},Scene.prototype.isDestroyed=function(){return!1},Scene.prototype.destroy=function(){this._tweens.removeAll(),this._computeEngine=this._computeEngine&&this._computeEngine.destroy(),this._screenSpaceCameraController=this._screenSpaceCameraController&&this._screenSpaceCameraController.destroy(),this._deviceOrientationCameraController=this._deviceOrientationCameraController&&!this._deviceOrientationCameraController.isDestroyed()&&this._deviceOrientationCameraController.destroy(),this._primitives=this._primitives&&this._primitives.destroy(),this._groundPrimitives=this._groundPrimitives&&this._groundPrimitives.destroy(),this._globe=this._globe&&this._globe.destroy(),this.skyBox=this.skyBox&&this.skyBox.destroy(),this.skyAtmosphere=this.skyAtmosphere&&this.skyAtmosphere.destroy(),this._debugSphere=this._debugSphere&&this._debugSphere.destroy(),this.sun=this.sun&&this.sun.destroy(),this._sunPostProcess=this._sunPostProcess&&this._sunPostProcess.destroy(),this._depthPlane=this._depthPlane&&this._depthPlane.destroy(),this._transitioner=this._transitioner&&this._transitioner.destroy(),this._debugFrustumPlanes=this._debugFrustumPlanes&&this._debugFrustumPlanes.destroy(),this._brdfLutGenerator=this._brdfLutGenerator&&this._brdfLutGenerator.destroy(),this._picking=this._picking&&this._picking.destroy(),this._defaultView=this._defaultView&&this._defaultView.destroy(),this._view=void 0,this._removeCreditContainer&&this._canvas.parentNode.removeChild(this._creditContainer),this.postProcessStages=this.postProcessStages&&this.postProcessStages.destroy(),this._context=this._context&&this._context.destroy(),this._frameState.creditDisplay=this._frameState.creditDisplay&&this._frameState.creditDisplay.destroy(),defined(this._performanceDisplay)&&(this._performanceDisplay=this._performanceDisplay&&this._performanceDisplay.destroy(),this._performanceContainer.parentNode.removeChild(this._performanceContainer)),this._removeRequestListenerCallback(),this._removeTaskProcessorListenerCallback();for(var e=0;e<this._removeGlobeCallbacks.length;++e)this._removeGlobeCallbacks[e]();return this._removeGlobeCallbacks.length=0,destroyObject(this)};var SkyAtmosphereCommon="const float Kr = 0.0025;\nconst float Kr4PI = Kr * 4.0 * czm_pi;\nconst float Km = 0.0015;\nconst float Km4PI = Km * 4.0 * czm_pi;\nconst float ESun = 15.0;\nconst float KmESun = Km * ESun;\nconst float KrESun = Kr * ESun;\nconst vec3 InvWavelength = vec3(\n5.60204474633241,\n9.473284437923038,\n19.643802610477206);\nconst float rayleighScaleDepth = 0.25;\nconst int nSamples = 2;\nconst float fSamples = 2.0;\nconst float g = -0.95;\nconst float g2 = g * g;\n#ifdef COLOR_CORRECT\nuniform vec3 u_hsbShift;\n#endif\nuniform vec3 u_radiiAndDynamicAtmosphereColor;\nfloat scale(float cosAngle)\n{\nfloat x = 1.0 - cosAngle;\nreturn rayleighScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25))));\n}\nvec3 getLightDirection(vec3 positionWC)\n{\nfloat lightEnum = u_radiiAndDynamicAtmosphereColor.z;\nvec3 lightDirection =\npositionWC * float(lightEnum == 0.0) +\nczm_lightDirectionWC * float(lightEnum == 1.0) +\nczm_sunDirectionWC * float(lightEnum == 2.0);\nreturn normalize(lightDirection);\n}\nvoid calculateRayScatteringFromSpace(in vec3 positionWC, in vec3 ray, in float innerRadius, in float outerRadius, inout float far, out vec3 start, out float startOffset)\n{\nfloat cameraHeight = length(positionWC);\nfloat B = 2.0 * dot(positionWC, ray);\nfloat C = cameraHeight * cameraHeight - outerRadius * outerRadius;\nfloat det = max(0.0, B * B - 4.0 * C);\nfloat near = 0.5 * (-B - sqrt(det));\nstart = positionWC + ray * near;\nfar -= near;\nfloat startAngle = dot(ray, start) / outerRadius;\nfloat startDepth = exp(-1.0 / rayleighScaleDepth);\nstartOffset = startDepth * scale(startAngle);\n}\nvoid calculateRayScatteringFromGround(in vec3 positionWC, in vec3 ray, in float atmosphereScale, in float innerRadius, out vec3 start, out float startOffset)\n{\nfloat cameraHeight = length(positionWC);\nstart = positionWC;\nfloat height = length(start);\nfloat depth = exp((atmosphereScale / rayleighScaleDepth ) * (innerRadius - cameraHeight));\nfloat startAngle = dot(ray, start) / height;\nstartOffset = depth*scale(startAngle);\n}\nczm_raySegment rayEllipsoidIntersection(czm_ray ray, vec3 inverseRadii)\n{\nvec3 o = inverseRadii * (czm_inverseView * vec4(ray.origin, 1.0)).xyz;\nvec3 d = inverseRadii * (czm_inverseView * vec4(ray.direction, 0.0)).xyz;\nfloat a = dot(d, d);\nfloat b = dot(d, o);\nfloat c = dot(o, o) - 1.0;\nfloat discriminant = b * b - a * c;\nif (discriminant < 0.0)\n{\nreturn czm_emptyRaySegment;\n}\ndiscriminant = sqrt(discriminant);\nfloat t1 = (-b - discriminant) / a;\nfloat t2 = (-b + discriminant) / a;\nif (t1 < 0.0 && t2 < 0.0)\n{\nreturn czm_emptyRaySegment;\n}\nif (t1 < 0.0 && t2 >= 0.0)\n{\nt1 = 0.0;\n}\nreturn czm_raySegment(t1, t2);\n}\nvec3 getAdjustedPosition(vec3 positionWC, float innerRadius)\n{\nfloat cameraHeight = czm_eyeHeight + innerRadius;\nreturn normalize(positionWC) * cameraHeight;\n}\nvec3 getTranslucentPosition(vec3 positionWC, vec3 outerPositionWC, float innerRadius, out bool intersectsEllipsoid)\n{\nvec3 directionWC = normalize(outerPositionWC - positionWC);\nvec3 directionEC = czm_viewRotation * directionWC;\nczm_ray viewRay = czm_ray(vec3(0.0), directionEC);\nczm_raySegment raySegment = rayEllipsoidIntersection(viewRay, czm_ellipsoidInverseRadii);\nintersectsEllipsoid = raySegment.start >= 0.0;\nif (intersectsEllipsoid)\n{\nreturn positionWC + raySegment.stop * directionWC;\n}\nreturn getAdjustedPosition(positionWC, innerRadius);\n}\nvoid calculateMieColorAndRayleighColor(vec3 outerPositionWC, out vec3 mieColor, out vec3 rayleighColor)\n{\nfloat outerRadius = u_radiiAndDynamicAtmosphereColor.x;\nfloat innerRadius = u_radiiAndDynamicAtmosphereColor.y;\n#ifdef GLOBE_TRANSLUCENT\nbool intersectsEllipsoid = false;\nvec3 startPositionWC = getTranslucentPosition(czm_viewerPositionWC, outerPositionWC, innerRadius, intersectsEllipsoid);\n#else\nvec3 startPositionWC = getAdjustedPosition(czm_viewerPositionWC, innerRadius);\n#endif\nvec3 lightDirection = getLightDirection(startPositionWC);\nvec3 ray = outerPositionWC - startPositionWC;\nfloat far = length(ray);\nray /= far;\nfloat atmosphereScale = 1.0 / (outerRadius - innerRadius);\nvec3 start;\nfloat startOffset;\n#ifdef SKY_FROM_SPACE\n#ifdef GLOBE_TRANSLUCENT\nif (intersectsEllipsoid)\n{\ncalculateRayScatteringFromGround(startPositionWC, ray, atmosphereScale, innerRadius, start, startOffset);\n}\nelse\n{\ncalculateRayScatteringFromSpace(startPositionWC, ray, innerRadius, outerRadius, far, start, startOffset);\n}\n#else\ncalculateRayScatteringFromSpace(startPositionWC, ray, innerRadius, outerRadius, far, start, startOffset);\n#endif\n#else\ncalculateRayScatteringFromGround(startPositionWC, ray, atmosphereScale, innerRadius, start, startOffset);\n#endif\nfloat sampleLength = far / fSamples;\nfloat scaledLength = sampleLength * atmosphereScale;\nvec3 sampleRay = ray * sampleLength;\nvec3 samplePoint = start + sampleRay * 0.5;\nvec3 frontColor = vec3(0.0, 0.0, 0.0);\nfor (int i = 0; i<nSamples; i++)\n{\nfloat height = length(samplePoint);\nfloat depth = exp((atmosphereScale / rayleighScaleDepth ) * (innerRadius - height));\nfloat fLightAngle = dot(lightDirection, samplePoint) / height;\nfloat fCameraAngle = dot(ray, samplePoint) / height;\nfloat fScatter = (startOffset + depth*(scale(fLightAngle) - scale(fCameraAngle)));\nvec3 attenuate = exp(-fScatter * (InvWavelength * Kr4PI + Km4PI));\nfrontColor += attenuate * (depth * scaledLength);\nsamplePoint += sampleRay;\n}\nmieColor = frontColor * KmESun;\nrayleighColor = frontColor * (InvWavelength * KrESun);\nmieColor = min(mieColor, vec3(10000000.0));\nrayleighColor = min(rayleighColor, vec3(10000000.0));\n}\nvec4 calculateFinalColor(vec3 positionWC, vec3 toCamera, vec3 lightDirection, vec3 mieColor, vec3 rayleighColor)\n{\nfloat cosAngle = dot(lightDirection, normalize(toCamera)) / length(toCamera);\nfloat rayleighPhase = 0.75 * (1.0 + cosAngle * cosAngle);\nfloat miePhase = 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + cosAngle * cosAngle) / pow(1.0 + g2 - 2.0 * g * cosAngle, 1.5);\nvec3 rgb = rayleighPhase * rayleighColor + miePhase * mieColor;\nconst float exposure = 2.0;\nvec3 rgbExposure = vec3(1.0) - exp(-exposure * rgb);\n#ifndef HDR\nrgb = rgbExposure;\n#endif\n#ifdef COLOR_CORRECT\nvec3 hsb = czm_RGBToHSB(rgb);\nhsb.x += u_hsbShift.x;\nhsb.y = clamp(hsb.y + u_hsbShift.y, 0.0, 1.0);\nhsb.z = hsb.z > czm_epsilon7 ? hsb.z + u_hsbShift.z : 0.0;\nrgb = czm_HSBToRGB(hsb);\n#endif\nfloat outerRadius = u_radiiAndDynamicAtmosphereColor.x;\nfloat innerRadius = u_radiiAndDynamicAtmosphereColor.y;\nfloat lightEnum = u_radiiAndDynamicAtmosphereColor.z;\nfloat cameraHeight = czm_eyeHeight + innerRadius;\nfloat atmosphereAlpha = clamp((outerRadius - cameraHeight) / (outerRadius - innerRadius), 0.0, 1.0);\nfloat nightAlpha = (lightEnum != 0.0) ? clamp(dot(normalize(positionWC), lightDirection), 0.0, 1.0) : 1.0;\natmosphereAlpha *= pow(nightAlpha, 0.5);\nvec4 finalColor = vec4(rgb, mix(clamp(rgbExposure.b, 0.0, 1.0), 1.0, atmosphereAlpha) * smoothstep(0.0, 1.0, czm_morphTime));\nif (mieColor.b > 1.0)\n{\nfloat strength = mieColor.b;\nfloat minDistance = outerRadius;\nfloat maxDistance = outerRadius * 3.0;\nfloat maxStrengthLerp = 1.0 - clamp((maxDistance - cameraHeight) / (maxDistance - minDistance), 0.0, 1.0);\nfloat maxStrength = mix(100.0, 10000.0, maxStrengthLerp);\nstrength = min(strength, maxStrength);\nfloat alpha = 1.0 - (strength / maxStrength);\nfinalColor.a = alpha;\n}\nreturn finalColor;\n}\n",SkyAtmosphereFS="varying vec3 v_outerPositionWC;\n#ifndef PER_FRAGMENT_ATMOSPHERE\nvarying vec3 v_mieColor;\nvarying vec3 v_rayleighColor;\n#endif\nvoid main (void)\n{\nvec3 toCamera = czm_viewerPositionWC - v_outerPositionWC;\nvec3 lightDirection = getLightDirection(czm_viewerPositionWC);\nvec3 mieColor;\nvec3 rayleighColor;\n#ifdef PER_FRAGMENT_ATMOSPHERE\ncalculateMieColorAndRayleighColor(v_outerPositionWC, mieColor, rayleighColor);\n#else\nmieColor = v_mieColor;\nrayleighColor = v_rayleighColor;\n#endif\ngl_FragColor = calculateFinalColor(czm_viewerPositionWC, toCamera, lightDirection, mieColor, rayleighColor);\n}\n",SkyAtmosphereVS="attribute vec4 position;\nvarying vec3 v_outerPositionWC;\n#ifndef PER_FRAGMENT_ATMOSPHERE\nvarying vec3 v_mieColor;\nvarying vec3 v_rayleighColor;\n#endif\nvoid main(void)\n{\nvec4 positionWC = czm_model * position;\n#ifndef PER_FRAGMENT_ATMOSPHERE\ncalculateMieColorAndRayleighColor(positionWC.xyz, v_mieColor, v_rayleighColor);\n#endif\nv_outerPositionWC = positionWC.xyz;\ngl_Position = czm_modelViewProjection * position;\n}\n";function SkyAtmosphere(e){e=defaultValue(e,Ellipsoid.WGS84),this.show=!0,this.perFragmentAtmosphere=!1,this._ellipsoid=e;var t=Cartesian3.multiplyByScalar(e.radii,1.025,new Cartesian3);this._scaleMatrix=Matrix4.fromScale(t),this._modelMatrix=new Matrix4,this._command=new DrawCommand({owner:this,modelMatrix:this._modelMatrix}),this._spSkyFromSpace=void 0,this._spSkyFromAtmosphere=void 0,this._flags=void 0,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this._hueSaturationBrightness=new Cartesian3;var i=new Cartesian3;i.x=1.025*e.maximumRadius,i.y=e.maximumRadius,i.z=0,this._radiiAndDynamicAtmosphereColor=i;var r=this;this._command.uniformMap={u_radiiAndDynamicAtmosphereColor:function(){return r._radiiAndDynamicAtmosphereColor},u_hsbShift:function(){return r._hueSaturationBrightness.x=r.hueShift,r._hueSaturationBrightness.y=r.saturationShift,r._hueSaturationBrightness.z=r.brightnessShift,r._hueSaturationBrightness}}}Object.defineProperties(SkyAtmosphere.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}}),SkyAtmosphere.prototype.setDynamicAtmosphereColor=function(e,t){var i=e?t?2:1:0;this._radiiAndDynamicAtmosphereColor.z=i};var scratchModelMatrix=new Matrix4;function hasColorCorrection(e){return!(CesiumMath.equalsEpsilon(e.hueShift,0,CesiumMath.EPSILON7)&&CesiumMath.equalsEpsilon(e.saturationShift,0,CesiumMath.EPSILON7)&&CesiumMath.equalsEpsilon(e.brightnessShift,0,CesiumMath.EPSILON7))}SkyAtmosphere.prototype.update=function(e,t){if(this.show){var i=e.mode;if((i===SceneMode$1.SCENE3D||i===SceneMode$1.MORPHING)&&e.passes.render){var r=Matrix4.fromRotationTranslation(e.context.uniformState.inverseViewRotation,Cartesian3.ZERO,scratchModelMatrix),n=Matrix4.multiplyTransformation(r,Axis$1.Y_UP_TO_Z_UP,scratchModelMatrix),a=Matrix4.multiply(this._scaleMatrix,n,scratchModelMatrix);Matrix4.clone(a,this._modelMatrix);var o,s=e.context,l=hasColorCorrection(this),c=e.globeTranslucencyState.translucent,u=this.perFragmentAtmosphere||c||!defined(t)||!t.show,d=this._command;defined(d.vertexArray)||(o=EllipsoidGeometry.createGeometry(new EllipsoidGeometry({radii:new Cartesian3(1,1,1),slicePartitions:256,stackPartitions:256,vertexFormat:VertexFormat.POSITION_ONLY})),d.vertexArray=VertexArray.fromGeometry({context:s,geometry:o,attributeLocations:GeometryPipeline.createAttributeLocations(o),bufferUsage:BufferUsage$1.STATIC_DRAW}),d.renderState=RenderState.fromCache({cull:{enabled:!0,face:CullFace$1.FRONT},blending:BlendingState$1.ALPHA_BLEND,depthMask:!1}));var h,p,m,f=l|u<<2|c<<3;f!==this._flags&&(this._flags=f,h=[],l&&h.push("COLOR_CORRECT"),u&&h.push("PER_FRAGMENT_ATMOSPHERE"),c&&h.push("GLOBE_TRANSLUCENT"),p=new ShaderSource({defines:h.concat("SKY_FROM_SPACE"),sources:[SkyAtmosphereCommon,SkyAtmosphereVS]}),m=new ShaderSource({defines:h.concat("SKY_FROM_SPACE"),sources:[SkyAtmosphereCommon,SkyAtmosphereFS]}),this._spSkyFromSpace=ShaderProgram.fromCache({context:s,vertexShaderSource:p,fragmentShaderSource:m}),p=new ShaderSource({defines:h.concat("SKY_FROM_ATMOSPHERE"),sources:[SkyAtmosphereCommon,SkyAtmosphereVS]}),m=new ShaderSource({defines:h.concat("SKY_FROM_ATMOSPHERE"),sources:[SkyAtmosphereCommon,SkyAtmosphereFS]}),this._spSkyFromAtmosphere=ShaderProgram.fromCache({context:s,vertexShaderSource:p,fragmentShaderSource:m}));var g=e.camera.positionWC;return Cartesian3.magnitude(g)>this._radiiAndDynamicAtmosphereColor.x?d.shaderProgram=this._spSkyFromSpace:d.shaderProgram=this._spSkyFromAtmosphere,d}}},SkyAtmosphere.prototype.isDestroyed=function(){return!1},SkyAtmosphere.prototype.destroy=function(){var e=this._command;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),this._spSkyFromSpace=this._spSkyFromSpace&&this._spSkyFromSpace.destroy(),this._spSkyFromAtmosphere=this._spSkyFromAtmosphere&&this._spSkyFromAtmosphere.destroy(),destroyObject(this)};var SkyBoxFS="uniform samplerCube u_cubeMap;\nvarying vec3 v_texCoord;\nvoid main()\n{\nvec4 color = textureCube(u_cubeMap, normalize(v_texCoord));\ngl_FragColor = vec4(czm_gammaCorrect(color).rgb, czm_morphTime);\n}\n",SkyBoxVS="attribute vec3 position;\nvarying vec3 v_texCoord;\nvoid main()\n{\nvec3 p = czm_viewRotation * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position));\ngl_Position = czm_projection * vec4(p, 1.0);\nv_texCoord = position.xyz;\n}\n";function SkyBox(e){this.sources=e.sources,this._sources=void 0,this.show=defaultValue(e.show,!0),this._command=new DrawCommand({modelMatrix:Matrix4.clone(Matrix4.IDENTITY),owner:this}),this._cubeMap=void 0,this._attributeLocations=void 0,this._useHdr=void 0}function SphereEmitter(e){e=defaultValue(e,1),this._radius=defaultValue(e,1)}function StyleExpression(){}SkyBox.prototype.update=function(e,t){var i=this;if(this.show&&(e.mode===SceneMode$1.SCENE3D||e.mode===SceneMode$1.MORPHING)&&e.passes.render){var r,n=e.context;this._sources!==this.sources&&(this._sources=this.sources,"string"==typeof(r=this.sources).positiveX?loadCubeMap(n,this._sources).then(function(e){i._cubeMap=i._cubeMap&&i._cubeMap.destroy(),i._cubeMap=e}):(this._cubeMap=this._cubeMap&&this._cubeMap.destroy(),this._cubeMap=new CubeMap({context:n,source:r})));var a,o,s,l=this._command;if(defined(l.vertexArray)||(l.uniformMap={u_cubeMap:function(){return i._cubeMap}},a=BoxGeometry.createGeometry(BoxGeometry.fromDimensions({dimensions:new Cartesian3(2,2,2),vertexFormat:VertexFormat.POSITION_ONLY})),o=this._attributeLocations=GeometryPipeline.createAttributeLocations(a),l.vertexArray=VertexArray.fromGeometry({context:n,geometry:a,attributeLocations:o,bufferUsage:BufferUsage$1.STATIC_DRAW}),l.renderState=RenderState.fromCache({blending:BlendingState$1.ALPHA_BLEND})),defined(l.shaderProgram)&&this._useHdr===t||(s=new ShaderSource({defines:[t?"HDR":""],sources:[SkyBoxFS]}),l.shaderProgram=ShaderProgram.fromCache({context:n,vertexShaderSource:SkyBoxVS,fragmentShaderSource:s,attributeLocations:this._attributeLocations}),this._useHdr=t),defined(this._cubeMap))return l}},SkyBox.prototype.isDestroyed=function(){return!1},SkyBox.prototype.destroy=function(){var e=this._command;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy(),this._cubeMap=this._cubeMap&&this._cubeMap.destroy(),destroyObject(this)},Object.defineProperties(SphereEmitter.prototype,{radius:{get:function(){return this._radius},set:function(e){this._radius=e}}}),SphereEmitter.prototype.emit=function(e){var t=CesiumMath.randomBetween(0,CesiumMath.TWO_PI),i=CesiumMath.randomBetween(0,CesiumMath.PI),r=CesiumMath.randomBetween(0,this._radius),n=r*Math.cos(t)*Math.sin(i),a=r*Math.sin(t)*Math.sin(i),o=r*Math.cos(i);e.position=Cartesian3.fromElements(n,a,o,e.position),e.velocity=Cartesian3.normalize(e.position,e.velocity)},StyleExpression.prototype.evaluate=function(e,t){DeveloperError.throwInstantiationError()},StyleExpression.prototype.evaluateColor=function(e,t){DeveloperError.throwInstantiationError()},StyleExpression.prototype.getShaderFunction=function(e,t,i,r){DeveloperError.throwInstantiationError()};var SunFS="uniform sampler2D u_texture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nvec4 color = texture2D(u_texture, v_textureCoordinates);\ngl_FragColor = czm_gammaCorrect(color);\n}\n",SunTextureFS="uniform float u_radiusTS;\nvarying vec2 v_textureCoordinates;\nvec2 rotate(vec2 p, vec2 direction)\n{\nreturn vec2(p.x * direction.x - p.y * direction.y, p.x * direction.y + p.y * direction.x);\n}\nvec4 addBurst(vec2 position, vec2 direction, float lengthScalar)\n{\nvec2 rotatedPosition = rotate(position, direction) * vec2(25.0, 0.75);\nfloat radius = length(rotatedPosition) * lengthScalar;\nfloat burst = 1.0 - smoothstep(0.0, 0.55, radius);\nreturn vec4(burst);\n}\nvoid main()\n{\nfloat lengthScalar = 2.0 / sqrt(2.0);\nvec2 position = v_textureCoordinates - vec2(0.5);\nfloat radius = length(position) * lengthScalar;\nfloat surface = step(radius, u_radiusTS);\nvec4 color = vec4(vec2(1.0), surface + 0.2, surface);\nfloat glow = 1.0 - smoothstep(0.0, 0.55, radius);\ncolor.ba += mix(vec2(0.0), vec2(1.0), glow) * 0.75;\nvec4 burst = vec4(0.0);\nburst += 0.4 * addBurst(position, vec2(0.38942, 0.92106), lengthScalar);\nburst += 0.4 * addBurst(position, vec2(0.99235, 0.12348), lengthScalar);\nburst += 0.4 * addBurst(position, vec2(0.60327, -0.79754), lengthScalar);\nburst += 0.3 * addBurst(position, vec2(0.31457, 0.94924), lengthScalar);\nburst += 0.3 * addBurst(position, vec2(0.97931, 0.20239), lengthScalar);\nburst += 0.3 * addBurst(position, vec2(0.66507, -0.74678), lengthScalar);\ncolor += clamp(burst, vec4(0.0), vec4(1.0)) * 0.15;\ngl_FragColor = clamp(color, vec4(0.0), vec4(1.0));\n}\n",SunVS="attribute vec2 direction;\nuniform float u_size;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nvec4 position;\nif (czm_morphTime == 1.0)\n{\nposition = vec4(czm_sunPositionWC, 1.0);\n}\nelse\n{\nposition = vec4(czm_sunPositionColumbusView.zxy, 1.0);\n}\nvec4 positionEC = czm_view * position;\nvec4 positionWC = czm_eyeToWindowCoordinates(positionEC);\nvec2 halfSize = vec2(u_size * 0.5);\nhalfSize *= ((direction * 2.0) - 1.0);\ngl_Position = czm_viewportOrthographic * vec4(positionWC.xy + halfSize, -positionWC.z, 1.0);\nv_textureCoordinates = direction;\n}\n";function Sun(){this.show=!0,this._drawCommand=new DrawCommand({primitiveType:PrimitiveType$1.TRIANGLES,boundingVolume:new BoundingSphere,owner:this}),this._commands={drawCommand:this._drawCommand,computeCommand:void 0},this._boundingVolume=new BoundingSphere,this._boundingVolume2D=new BoundingSphere,this._texture=void 0,this._drawingBufferWidth=void 0,this._drawingBufferHeight=void 0,this._radiusTS=void 0,this._size=void 0,this.glowFactor=1,this._glowFactorDirty=!1,this._useHdr=void 0;var e=this;this._uniformMap={u_texture:function(){return e._texture},u_size:function(){return e._size}}}Object.defineProperties(Sun.prototype,{glowFactor:{get:function(){return this._glowFactor},set:function(e){e=Math.max(e,0),this._glowFactor=e,this._glowFactorDirty=!0}}});var scratchPositionWC=new Cartesian2,scratchLimbWC=new Cartesian2,scratchPositionEC=new Cartesian4,scratchCartesian4$6=new Cartesian4;function TileBoundingVolume(){}function TileCoordinatesImageryProvider(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this._tilingScheme=defined(e.tilingScheme)?e.tilingScheme:new GeographicTilingScheme({ellipsoid:e.ellipsoid}),this._color=defaultValue(e.color,Color.YELLOW),this._errorEvent=new Event,this._tileWidth=defaultValue(e.tileWidth,256),this._tileHeight=defaultValue(e.tileHeight,256),this._readyPromise=when.resolve(!0),this.defaultAlpha=void 0,this.defaultNightAlpha=void 0,this.defaultDayAlpha=void 0,this.defaultBrightness=void 0,this.defaultContrast=void 0,this.defaultHue=void 0,this.defaultSaturation=void 0,this.defaultGamma=void 0,this.defaultMinificationFilter=void 0,this.defaultMagnificationFilter=void 0}function TileDiscardPolicy(e){DeveloperError.throwInstantiationError()}Sun.prototype.update=function(e,t,i){if(this.show){var r=e.mode;if(r!==SceneMode$1.SCENE2D&&r!==SceneMode$1.MORPHING&&e.passes.render){var n,a,o,s,l=e.context,c=t.viewport.width,u=t.viewport.height;defined(this._texture)&&c===this._drawingBufferWidth&&u===this._drawingBufferHeight&&!this._glowFactorDirty&&i===this._useHdr||(this._texture=this._texture&&this._texture.destroy(),this._drawingBufferWidth=c,this._drawingBufferHeight=u,this._glowFactorDirty=!1,this._useHdr=i,n=Math.max(c,u),n=Math.pow(2,Math.ceil(Math.log(n)/Math.log(2))-2),n=Math.max(1,n),a=i?l.halfFloatingPointTexture?PixelDatatype$1.HALF_FLOAT:PixelDatatype$1.FLOAT:PixelDatatype$1.UNSIGNED_BYTE,this._texture=new Texture({context:l,width:n,height:n,pixelFormat:PixelFormat$1.RGBA,pixelDatatype:a}),this._glowLengthTS=5*this._glowFactor,this._radiusTS=1/(1+2*this._glowLengthTS)*.5,s={u_radiusTS:function(){return o._radiusTS}},(o=this)._commands.computeCommand=new ComputeCommand({fragmentShaderSource:SunTextureFS,outputTexture:this._texture,uniformMap:s,persists:!1,owner:this,postExecute:function(){o._commands.computeCommand=void 0}}));var d,h,p,m,f,g=this._drawCommand;defined(g.vertexArray)||(d={direction:0},(h=new Uint8Array(8))[0]=0,h[1]=0,h[2]=255,h[3]=0,h[4]=255,h[5]=255,h[6]=0,h[7]=255,p=Buffer$1.createVertexBuffer({context:l,typedArray:h,usage:BufferUsage$1.STATIC_DRAW}),m=[{index:d.direction,vertexBuffer:p,componentsPerAttribute:2,normalize:!0,componentDatatype:ComponentDatatype$1.UNSIGNED_BYTE}],f=Buffer$1.createIndexBuffer({context:l,typedArray:new Uint16Array([0,1,2,0,2,3]),usage:BufferUsage$1.STATIC_DRAW,indexDatatype:IndexDatatype$1.UNSIGNED_SHORT}),g.vertexArray=new VertexArray({context:l,attributes:m,indexBuffer:f}),g.shaderProgram=ShaderProgram.fromCache({context:l,vertexShaderSource:SunVS,fragmentShaderSource:SunFS,attributeLocations:d}),g.renderState=RenderState.fromCache({blending:BlendingState$1.ALPHA_BLEND}),g.uniformMap=this._uniformMap);var _=l.uniformState.sunPositionWC,y=l.uniformState.sunPositionColumbusView,v=this._boundingVolume,C=this._boundingVolume2D;Cartesian3.clone(_,v.center),C.center.x=y.z,C.center.y=y.x,C.center.z=y.y,v.radius=CesiumMath.SOLAR_RADIUS+CesiumMath.SOLAR_RADIUS*this._glowLengthTS,C.radius=v.radius,r===SceneMode$1.SCENE3D?BoundingSphere.clone(v,g.boundingVolume):r===SceneMode$1.COLUMBUS_VIEW&&BoundingSphere.clone(C,g.boundingVolume);var S=SceneTransforms.computeActualWgs84Position(e,_,scratchCartesian4$6),T=Cartesian3.magnitude(Cartesian3.subtract(S,e.camera.position,scratchCartesian4$6)),x=l.uniformState.projection,b=scratchPositionEC;b.x=0,b.y=0,b.z=-T,b.w=1;var E=Matrix4.multiplyByVector(x,b,scratchCartesian4$6),P=SceneTransforms.clipToGLWindowCoordinates(t.viewport,E,scratchPositionWC);b.x=CesiumMath.SOLAR_RADIUS;var A=Matrix4.multiplyByVector(x,b,scratchCartesian4$6),w=SceneTransforms.clipToGLWindowCoordinates(t.viewport,A,scratchLimbWC);return this._size=Cartesian2.magnitude(Cartesian2.subtract(w,P,scratchCartesian4$6)),this._size=2*this._size*(1+2*this._glowLengthTS),this._size=Math.ceil(this._size),this._commands}}},Sun.prototype.isDestroyed=function(){return!1},Sun.prototype.destroy=function(){var e=this._drawCommand;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy(),this._texture=this._texture&&this._texture.destroy(),destroyObject(this)},TileBoundingVolume.prototype.boundingVolume=void 0,TileBoundingVolume.prototype.boundingSphere=void 0,TileBoundingVolume.prototype.distanceToCamera=function(e){DeveloperError.throwInstantiationError()},TileBoundingVolume.prototype.intersectPlane=function(e){DeveloperError.throwInstantiationError()},TileBoundingVolume.prototype.createDebugVolume=function(e){DeveloperError.throwInstantiationError()},Object.defineProperties(TileCoordinatesImageryProvider.prototype,{proxy:{get:function(){}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){}},minimumLevel:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},ready:{get:function(){return!0}},readyPromise:{get:function(){return this._readyPromise}},credit:{get:function(){}},hasAlphaChannel:{get:function(){return!0}}}),TileCoordinatesImageryProvider.prototype.getTileCredits=function(e,t,i){},TileCoordinatesImageryProvider.prototype.requestImage=function(e,t,i,r){var n=document.createElement("canvas");n.width=256,n.height=256;var a=n.getContext("2d"),o=this._color.toCssColorString();return a.strokeStyle=o,a.lineWidth=2,a.strokeRect(1,1,255,255),a.font="bold 25px Arial",a.textAlign="center",a.fillStyle=o,a.fillText("L: "+i,124,86),a.fillText("X: "+e,124,136),a.fillText("Y: "+t,124,186),n},TileCoordinatesImageryProvider.prototype.pickFeatures=function(e,t,i,r,n){},TileDiscardPolicy.prototype.isReady=DeveloperError.throwInstantiationError,TileDiscardPolicy.prototype.shouldDiscardImage=DeveloperError.throwInstantiationError;var TileState={START:0,LOADING:1,READY:2,UPSAMPLED_ONLY:3},TileState$1=Object.freeze(TileState);function TimeDynamicPointCloud(e){e=defaultValue(e,defaultValue.EMPTY_OBJECT),this.show=defaultValue(e.show,!0),this.modelMatrix=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),this.shadows=defaultValue(e.shadows,ShadowMode$1.ENABLED),this.maximumMemoryUsage=defaultValue(e.maximumMemoryUsage,256),this.shading=new PointCloudShading(e.shading),this.style=e.style,this.frameFailed=new Event,this.frameChanged=new Event,this._clock=e.clock,this._intervals=e.intervals,this._clippingPlanes=void 0,this.clippingPlanes=e.clippingPlanes,this._pointCloudEyeDomeLighting=new PointCloudEyeDomeLighting,this._loadTimestamp=void 0,this._clippingPlanesState=0,this._styleDirty=!1,this._pickId=void 0,this._totalMemoryUsageInBytes=0,this._frames=[],this._previousInterval=void 0,this._nextInterval=void 0,this._lastRenderedFrame=void 0,this._clockMultiplier=0,this._readyPromise=when.defer(),this._runningSum=0,this._runningLength=0,this._runningIndex=0,this._runningSamples=arrayFill(new Array(5),0),this._runningAverage=0}function getFragmentShaderLoaded$1(e){return"uniform vec4 czm_pickColor;\n"+e}function getUniformMapLoaded$1(t){return function(e){return combine(e,{czm_pickColor:function(){return t._pickId.color}})}}function getPickIdLoaded$1(){return"czm_pickColor"}Object.defineProperties(TimeDynamicPointCloud.prototype,{clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){ClippingPlaneCollection.setOwner(e,this,"_clippingPlanes")}},totalMemoryUsageInBytes:{get:function(){return this._totalMemoryUsageInBytes}},boundingSphere:{get:function(){if(defined(this._lastRenderedFrame))return this._lastRenderedFrame.pointCloud.boundingSphere}},readyPromise:{get:function(){return this._readyPromise.promise}}}),TimeDynamicPointCloud.prototype.makeStyleDirty=function(){this._styleDirty=!0},TimeDynamicPointCloud.prototype._getAverageLoadTime=function(){return 0===this._runningLength?.05:this._runningAverage};var scratchDate$1=new JulianDate;function getClockMultiplier(e){var t=e._clock,i=t.canAnimate&&t.shouldAnimate,r=t.multiplier;return i?r:0}function getIntervalIndex(e,t){return e._intervals.indexOf(t.start)}function getNextInterval(e,t){var i=e._intervals,r=e._clock,n=getClockMultiplier(e);if(0!==n){var a=e._getAverageLoadTime(),o=JulianDate.addSeconds(r.currentTime,a*n,scratchDate$1),s=i.indexOf(o);return s===getIntervalIndex(e,t)&&(0<=n?++s:--s),i.get(s)}}function getCurrentInterval(e){var t=e._intervals,i=e._clock.currentTime,r=t.indexOf(i);return t.get(r)}function reachedInterval(e,t,i){var r=getClockMultiplier(e),n=getIntervalIndex(e,t),a=getIntervalIndex(e,i);return 0<=r?a<=n:n<=a}function handleFrameFailure(i,r){return function(e){var t=defined(e.message)?e.message:e.toString();0<i.frameFailed.numberOfListeners?i.frameFailed.raiseEvent({uri:r,message:t}):(console.log("A frame failed to load: "+r),console.log("Error: "+t))}}function requestFrame(t,e,i){var r,n,a,o=getIntervalIndex(t,e),s=t._frames,l=s[o];return defined(l)||(n=defined(r=e.data.transform)?Matrix4.fromArray(r):void 0,a=e.data.uri,l={pointCloud:void 0,transform:n,timestamp:getTimestamp$1(),sequential:!0,ready:!1,touchedFrameNumber:i.frameNumber},s[o]=l,Resource.fetchArrayBuffer({url:a}).then(function(e){return l.pointCloud=new PointCloud({arrayBuffer:e,cull:!0,fragmentShaderLoaded:getFragmentShaderLoaded$1,uniformMapLoaded:getUniformMapLoaded$1(t),pickIdLoaded:getPickIdLoaded$1}),l.pointCloud.readyPromise}).otherwise(handleFrameFailure(t,a))),l}function updateAverageLoadTime(e,t){e._runningSum+=t,e._runningSum-=e._runningSamples[e._runningIndex],e._runningSamples[e._runningIndex]=t,e._runningLength=Math.min(e._runningLength+1,e._runningSamples.length),e._runningIndex=(e._runningIndex+1)%e._runningSamples.length,e._runningAverage=e._runningSum/e._runningLength}function prepareFrame(e,t,i,r){t.touchedFrameNumber<r.frameNumber-1&&(t.sequential=!1);var n,a,o=t.pointCloud;defined(o)&&!t.ready&&(a=(n=r.commandList).length,renderFrame(e,t,i,r),o.ready&&(t.ready=!0,e._totalMemoryUsageInBytes+=o.geometryByteLength,n.length=a,t.sequential&&updateAverageLoadTime(e,(getTimestamp$1()-t.timestamp)/1e3))),t.touchedFrameNumber=r.frameNumber}var scratchModelMatrix$1=new Matrix4;function getGeometricError$1(e,t){var i=e.shading;return defined(i)&&defined(i.baseResolution)?i.baseResolution:defined(t.boundingSphere)?CesiumMath.cbrt(t.boundingSphere.volume()/t.pointsLength):0}function getMaximumAttenuation(e){var t=e.shading;return defined(t)&&defined(t.maximumAttenuation)?t.maximumAttenuation:10}var defaultShading$1=new PointCloudShading;function renderFrame(e,t,i,r){var n=defaultValue(e.shading,defaultShading$1),a=t.pointCloud,o=defaultValue(t.transform,Matrix4.IDENTITY);a.modelMatrix=Matrix4.multiplyTransformation(e.modelMatrix,o,scratchModelMatrix$1),a.style=e.style,a.time=i.timeSinceLoad,a.shadows=e.shadows,a.clippingPlanes=e._clippingPlanes,a.isClipped=i.isClipped,a.attenuation=n.attenuation,a.backFaceCulling=n.backFaceCulling,a.normalShading=n.normalShading,a.geometricError=getGeometricError$1(e,a),a.geometricErrorScale=n.geometricErrorScale,a.maximumAttenuation=getMaximumAttenuation(e),a.update(r),t.touchedFrameNumber=r.frameNumber}function loadFrame(e,t,i,r){prepareFrame(e,requestFrame(e,t,r),i,r)}function getUnloadCondition(t){return function(e){return e.touchedFrameNumber<t.frameNumber}}function unloadFrames(e,t){for(var i=e._frames,r=i.length,n=0;n<r;++n){var a,o=i[n];defined(o)&&(defined(t)&&!t(o)||(a=o.pointCloud,o.ready&&(e._totalMemoryUsageInBytes-=a.geometryByteLength),defined(a)&&a.destroy(),o===e._lastRenderedFrame&&(e._lastRenderedFrame=void 0),i[n]=void 0))}}function getFrame(e,t){var i=getIntervalIndex(e,t),r=e._frames[i];if(defined(r)&&r.ready)return r}function updateInterval(e,t,i,r,n){return defined(i)&&(i.ready||(loadFrame(e,t,r,n),i.ready))}function getNearestReadyInterval(e,t,i,r,n){var a,o,s=e._intervals,l=e._frames,c=getIntervalIndex(e,i),u=getIntervalIndex(e,t);if(u<=c){for(a=c;u<=a;--a)if(updateInterval(e,o=s.get(a),l[a],r,n))return o}else for(a=c;a<=u;++a)if(updateInterval(e,o=s.get(a),l[a],r,n))return o;return t}function setFramesDirty(e,t,i){for(var r=e._frames,n=r.length,a=0;a<n;++a){var o=r[a];defined(o)&&defined(o.pointCloud)&&(o.pointCloud.clippingPlanesDirty=t,o.pointCloud.styleDirty=i)}}var updateState={timeSinceLoad:0,isClipped:!1,clippingPlanesDirty:!1};TimeDynamicPointCloud.prototype.update=function(e){var t,i,r,n,a,o,s,l,c,u,d,h,p,m,f,g,_,y,v,C;e.mode!==SceneMode$1.MORPHING&&this.show&&(defined(this._pickId)||(this._pickId=e.context.createPickId({primitive:this})),defined(this._loadTimestamp)||(this._loadTimestamp=JulianDate.clone(e.time)),t=Math.max(1e3*JulianDate.secondsDifference(e.time,this._loadTimestamp),0),r=0,n=!1,(a=defined(i=this._clippingPlanes)&&i.enabled)&&(i.update(e),r=i.clippingPlanesState),this._clippingPlanesState!==r&&(this._clippingPlanesState=r,n=!0),o=this._styleDirty,this._styleDirty=!1,(n||o)&&setFramesDirty(this,n,o),updateState.timeSinceLoad=t,updateState.isClipped=a,s=this.shading,l=this._pointCloudEyeDomeLighting,u=(c=e.commandList).length,d=this._previousInterval,h=this._nextInterval,defined(p=getCurrentInterval(this))&&(m=!1,g=0===(f=getClockMultiplier(this)),f!==this._clockMultiplier&&(m=!0,this._clockMultiplier=f),defined(d)&&!g||(d=p),defined(h)&&!m&&!reachedInterval(this,p,h)||(h=getNextInterval(this,p)),defined(_=getFrame(this,d=getNearestReadyInterval(this,d,p,updateState,e)))||(loadFrame(this,d,updateState,e),_=this._lastRenderedFrame),defined(_)&&renderFrame(this,_,updateState,e),defined(h)&&loadFrame(this,h,updateState,e),y=this,defined(_)&&!defined(this._lastRenderedFrame)&&e.afterRender.push(function(){y._readyPromise.resolve(y)}),defined(_)&&_!==this._lastRenderedFrame&&0<y.frameChanged.numberOfListeners&&e.afterRender.push(function(){y.frameChanged.raiseEvent(y)}),this._previousInterval=d,this._nextInterval=h,this._lastRenderedFrame=_,v=this._totalMemoryUsageInBytes,1024*this.maximumMemoryUsage*1024<v&&unloadFrames(this,getUnloadCondition(e)),C=c.length-u,defined(s)&&s.attenuation&&s.eyeDomeLighting&&0<C&&l.update(e,u,s,this.boundingSphere)))},TimeDynamicPointCloud.prototype.isDestroyed=function(){return!1},TimeDynamicPointCloud.prototype.destroy=function(){return unloadFrames(this),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._pickId=this._pickId&&this._pickId.destroy(),destroyObject(this)};var ViewportQuadFS="varying vec2 v_textureCoordinates;\nvoid main()\n{\nczm_materialInput materialInput;\nmaterialInput.s = v_textureCoordinates.s;\nmaterialInput.st = v_textureCoordinates;\nmaterialInput.str = vec3(v_textureCoordinates, 0.0);\nmaterialInput.normalEC = vec3(0.0, 0.0, -1.0);\nczm_material material = czm_getMaterial(materialInput);\ngl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n}\n";function ViewportQuad(e,t){this.show=!0,defined(e)||(e=new BoundingRectangle),this.rectangle=BoundingRectangle.clone(e),defined(t)||(t=Material.fromType(Material.ColorType,{color:new Color(1,1,1,1)})),this.material=t,this._material=void 0,this._overlayCommand=void 0,this._rs=void 0}function computeFlyToLocationForRectangle(t,i){var r=i.terrainProvider,e=i.mapProjection,n=e.ellipsoid,a=i.camera.getRectangleCameraCoordinates(t),o=i.mode===SceneMode$1.SCENE3D?n.cartesianToCartographic(a):e.unproject(a);return defined(r)?r.readyPromise.then(function(){if(!defined(r.availability)||i.mode===SceneMode$1.SCENE2D)return o;var e=[Rectangle.center(t),Rectangle.southeast(t),Rectangle.southwest(t),Rectangle.northeast(t),Rectangle.northwest(t)];return computeFlyToLocationForRectangle._sampleTerrainMostDetailed(r,e).then(function(e){var t=e.reduce(function(e,t){return Math.max(t.height,e)},-Number.MAX_VALUE),i=o;return i.height+=t,i})}):when.resolve(o)}function createOsmBuildings(e){var t=new Cesium3DTileset(e=combine(e,{url:IonResource.fromAssetId(96188)})),i=e.style;return defined(i)||(i=new Cesium3DTileStyle({color:"Boolean(${feature['cesium#color']}) ? color(${feature['cesium#color']}) : "+defaultValue(e.defaultColor,Color.WHITE).toCssColorString()})),t.style=i,t}function createTangentSpaceDebugPrimitive(e){var t=[],i=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).geometry;defined(i.attributes)&&defined(i.primitiveType)||(i=i.constructor.createGeometry(i));var r=i.attributes,n=Matrix4.clone(defaultValue(e.modelMatrix,Matrix4.IDENTITY)),a=defaultValue(e.length,1e4);if(defined(r.normal)&&t.push(new GeometryInstance({geometry:GeometryPipeline.createLineSegmentsForVectors(i,"normal",a),attributes:{color:new ColorGeometryInstanceAttribute(1,0,0,1)},modelMatrix:n})),defined(r.tangent)&&t.push(new GeometryInstance({geometry:GeometryPipeline.createLineSegmentsForVectors(i,"tangent",a),attributes:{color:new ColorGeometryInstanceAttribute(0,1,0,1)},modelMatrix:n})),defined(r.bitangent)&&t.push(new GeometryInstance({geometry:GeometryPipeline.createLineSegmentsForVectors(i,"bitangent",a),attributes:{color:new ColorGeometryInstanceAttribute(0,0,1,1)},modelMatrix:n})),0<t.length)return new Primitive({asynchronous:!1,geometryInstances:t,appearance:new PerInstanceColorAppearance({flat:!0,translucent:!1})})}function createWorldImagery(e){return e=defaultValue(e,defaultValue.EMPTY_OBJECT),new IonImageryProvider({assetId:defaultValue(e.style,IonWorldImageryStyle$1.AERIAL)})}ViewportQuad.prototype.update=function(e){var t,i,r;this.show&&(defined(t=this._rs)&&BoundingRectangle.equals(t.viewport,this.rectangle)||(this._rs=RenderState.fromCache({blending:BlendingState$1.ALPHA_BLEND,viewport:this.rectangle})),e.passes.render&&(i=e.context,this._material===this.material&&defined(this._overlayCommand)||(this._material=this.material,defined(this._overlayCommand)&&this._overlayCommand.shaderProgram.destroy(),r=new ShaderSource({sources:[this._material.shaderSource,ViewportQuadFS]}),this._overlayCommand=i.createViewportQuadCommand(r,{renderState:this._rs,uniformMap:this._material._uniforms,owner:this}),this._overlayCommand.pass=Pass$1.OVERLAY),this._material.update(i),this._overlayCommand.uniformMap=this._material._uniforms,e.commandList.push(this._overlayCommand)))},ViewportQuad.prototype.isDestroyed=function(){return!1},ViewportQuad.prototype.destroy=function(){return defined(this._overlayCommand)&&(this._overlayCommand.shaderProgram=this._overlayCommand.shaderProgram&&this._overlayCommand.shaderProgram.destroy()),destroyObject(this)},computeFlyToLocationForRectangle._sampleTerrainMostDetailed=sampleTerrainMostDetailed;var tmp$6={},jEj,kEj,lEj,mEj,nEj,oEj,VFj_unstuff,VFj_unstuffLUT,VFj_unstuff2,VFj_unstuffLUT2,VFj_originalUnstuff,VFj_originalUnstuff2,WFj,XFj,mMj,nMj,fEj,gEj,hEj,iEj;jEj={defaultNoDataValue:-34027999387901484e22,decode:function(e,t){var i=(t=t||{}).encodedMaskData||null===t.encodedMaskData,r=nEj(e,t.inputOffset||0,i),n=null!==t.noDataValue?t.noDataValue:jEj.defaultNoDataValue,a=kEj(r,t.pixelType||Float32Array,t.encodedMaskData,n,t.returnMask),o={width:r.width,height:r.height,pixelData:a.resultPixels,minValue:a.minValue,maxValue:r.pixels.maxValue,noDataValue:n};return a.resultMask&&(o.maskData=a.resultMask),t.returnEncodedMask&&r.mask&&(o.encodedMaskData=r.mask.bitset?r.mask.bitset:null),t.returnFileInfo&&(o.fileInfo=lEj(r),t.computeUsedBitDepths&&(o.fileInfo.bitDepths=mEj(r))),o}},kEj=function(e,t,i,r,n){var a,o,s,l=0,c=e.pixels.numBlocksX,u=e.pixels.numBlocksY,d=Math.floor(e.width/c),h=Math.floor(e.height/u),p=2*e.maxZError,m=Number.MAX_VALUE;i=i||(e.mask?e.mask.bitset:null),o=new t(e.width*e.height),n&&i&&(s=new Uint8Array(e.width*e.height));for(var f,g,_=new Float32Array(d*h),y=0;y<=u;y++){var v=y!==u?h:e.height%u;if(0!==v)for(var C=0;C<=c;C++){var S=C!==c?d:e.width%c;if(0!==S){var T,x,b,E,P=y*e.width*h+C*d,A=e.width-S,w=e.pixels.blocks[l];if(w.encoding<2?(T=0===w.encoding?w.rawData:(oEj(w.stuffedData,w.bitsPerPixel,w.numValidPixels,w.offset,p,_,e.pixels.maxValue),_),x=0):b=2===w.encoding?0:w.offset,i)for(g=0;g<v;g++){for(7&P&&(E=i[P>>3],E<<=7&P),f=0;f<S;f++)7&P||(E=i[P>>3]),128&E?(s&&(s[P]=1),m=(a=w.encoding<2?T[x++]:b)<m?a:m,o[P++]=a):(s&&(s[P]=0),o[P++]=r),E<<=1;P+=A}else if(w.encoding<2)for(g=0;g<v;g++){for(f=0;f<S;f++)m=(a=T[x++])<m?a:m,o[P++]=a;P+=A}else for(m=b<m?b:m,g=0;g<v;g++){for(f=0;f<S;f++)o[P++]=b;P+=A}if(1===w.encoding&&x!==w.numValidPixels)throw"Block and Mask do not match";l++}}}return{resultPixels:o,resultMask:s,minValue:m}},lEj=function(e){return{fileIdentifierString:e.fileIdentifierString,fileVersion:e.fileVersion,imageType:e.imageType,height:e.height,width:e.width,maxZError:e.maxZError,eofOffset:e.eofOffset,mask:e.mask?{numBlocksX:e.mask.numBlocksX,numBlocksY:e.mask.numBlocksY,numBytes:e.mask.numBytes,maxValue:e.mask.maxValue}:null,pixels:{numBlocksX:e.pixels.numBlocksX,numBlocksY:e.pixels.numBlocksY,numBytes:e.pixels.numBytes,maxValue:e.pixels.maxValue,noDataValue:e.noDataValue}}},mEj=function(e){for(var t=e.pixels.numBlocksX*e.pixels.numBlocksY,i={},r=0;r<t;r++){var n=e.pixels.blocks[r];0===n.encoding?i.float32=!0:1===n.encoding?i[n.bitsPerPixel]=!0:i[0]=!0}return Object.keys(i)},nEj=function(e,t,i){var r={},n=new Uint8Array(e,t,10);if(r.fileIdentifierString=String.fromCharCode.apply(null,n),"CntZImage"!==r.fileIdentifierString.trim())throw"Unexpected file identifier string: "+r.fileIdentifierString;t+=10;var a=new DataView(e,t,24);if(r.fileVersion=a.getInt32(0,!0),r.imageType=a.getInt32(4,!0),r.height=a.getUint32(8,!0),r.width=a.getUint32(12,!0),r.maxZError=a.getFloat64(16,!0),t+=24,!i)if(a=new DataView(e,t,16),r.mask={},r.mask.numBlocksY=a.getUint32(0,!0),r.mask.numBlocksX=a.getUint32(4,!0),r.mask.numBytes=a.getUint32(8,!0),r.mask.maxValue=a.getFloat32(12,!0),t+=16,0<r.mask.numBytes){var o=new Uint8Array(Math.ceil(r.width*r.height/8)),s=(a=new DataView(e,t,r.mask.numBytes)).getInt16(0,!0),l=2,c=0;do{if(0<s)for(;s--;)o[c++]=a.getUint8(l++);else for(var u=a.getUint8(l++),s=-s;s--;)o[c++]=u;s=a.getInt16(l,!0),l+=2}while(l<r.mask.numBytes);if(-32768!==s||c<o.length)throw"Unexpected end of mask RLE encoding";r.mask.bitset=o,t+=r.mask.numBytes}else 0==(r.mask.numBytes|r.mask.numBlocksY|r.mask.maxValue)&&(r.mask.bitset=new Uint8Array(Math.ceil(r.width*r.height/8)));a=new DataView(e,t,16),r.pixels={},r.pixels.numBlocksY=a.getUint32(0,!0),r.pixels.numBlocksX=a.getUint32(4,!0),r.pixels.numBytes=a.getUint32(8,!0),r.pixels.maxValue=a.getFloat32(12,!0),t+=16;var d=r.pixels.numBlocksX,h=r.pixels.numBlocksY,p=d+(0<r.width%d?1:0),m=h+(0<r.height%h?1:0);r.pixels.blocks=new Array(p*m);for(var f=0,g=0;g<m;g++)for(var _=0;_<p;_++){var y=0,v=e.byteLength-t;a=new DataView(e,t,Math.min(10,v));var C={};r.pixels.blocks[f++]=C;var S,T,x,b=a.getUint8(0);if(y++,C.encoding=63&b,3<C.encoding)throw"Invalid block encoding ("+C.encoding+")";if(2!==C.encoding){if(0!==b&&2!==b){if(b>>=6,2===(C.offsetType=b))C.offset=a.getInt8(1),y++;else if(1===b)C.offset=a.getInt16(1,!0),y+=2;else{if(0!==b)throw"Invalid block offset type";C.offset=a.getFloat32(1,!0),y+=4}if(1===C.encoding)if(b=a.getUint8(y),y++,C.bitsPerPixel=63&b,b>>=6,2===(C.numValidPixelsType=b))C.numValidPixels=a.getUint8(y),y++;else if(1===b)C.numValidPixels=a.getUint16(y,!0),y+=2;else{if(0!==b)throw"Invalid valid pixel count type";C.numValidPixels=a.getUint32(y,!0),y+=4}}if(t+=y,3!==C.encoding)if(0===C.encoding){var E=(r.pixels.numBytes-1)/4;if(E!==Math.floor(E))throw"uncompressed block has invalid length";x=new ArrayBuffer(4*E),new Uint8Array(x).set(new Uint8Array(e,t,4*E));var P=new Float32Array(x);C.rawData=P,t+=4*E}else{1===C.encoding&&(S=Math.ceil(C.numValidPixels*C.bitsPerPixel/8),T=Math.ceil(S/4),x=new ArrayBuffer(4*T),new Uint8Array(x).set(new Uint8Array(e,t,S)),C.stuffedData=new Uint32Array(x),t+=S)}}else t++}return r.eofOffset=t,r},oEj=function(e,t,i,r,n,a,o){var s,l,c,u,d=(1<<t)-1,h=0,p=0,m=Math.ceil((o-r)/n),f=4*e.length-Math.ceil(t*i/8);for(e[e.length-1]<<=8*f,s=0;s<i;s++){0===p&&(u=e[h++],p=32),t<=p?(c=u>>>p-t&d,p-=t):(c=(u&d)<<(l=t-p)&d,c+=(u=e[h++])>>>(p=32-l)),a[s]=c<m?r+c*n:o}return a},fEj=jEj,VFj_unstuff=function(e,t,i,r,n,a,o,s){var l,c,u,d,h,p=(1<<i)-1,m=0,f=0,g=4*e.length-Math.ceil(i*r/8);if(e[e.length-1]<<=8*g,n)for(l=0;l<r;l++)0===f&&(u=e[m++],f=32),i<=f?(c=u>>>f-i&p,f-=i):(c=(u&p)<<(d=i-f)&p,c+=(u=e[m++])>>>(f=32-d)),t[l]=n[c];else for(h=Math.ceil((s-a)/o),l=0;l<r;l++)0===f&&(u=e[m++],f=32),i<=f?(c=u>>>f-i&p,f-=i):(c=(u&p)<<(d=i-f)&p,c+=(u=e[m++])>>>(f=32-d)),t[l]=c<h?a+c*o:s},VFj_unstuffLUT=function(e,t,i,r,n,a){var o,s,l=(1<<t)-1,c=0,u=0,d=0,h=0,p=[],m=4*e.length-Math.ceil(t*i/8);e[e.length-1]<<=8*m;for(var f=Math.ceil((a-r)/n),u=0;u<i;u++)0===d&&(s=e[c++],d=32),t<=d?(h=s>>>d-t&l,d-=t):(h=(s&l)<<(o=t-d)&l,h+=(s=e[c++])>>>(d=32-o)),p[u]=h<f?r+h*n:a;return p.unshift(r),p},VFj_unstuff2=function(e,t,i,r,n,a,o,s){var l,c,u,d=(1<<i)-1,h=0,p=0,m=0;if(n)for(g=0;g<r;g++)0===p&&(c=e[h++],p=32,m=0),i<=p?(l=c>>>m&d,p-=i,m+=i):(l=c>>>m&d,p=32-(u=i-p),l|=((c=e[h++])&(1<<u)-1)<<i-u,m=u),t[g]=n[l];else for(var f=Math.ceil((s-a)/o),g=0;g<r;g++)0===p&&(c=e[h++],p=32,m=0),i<=p?(l=c>>>m&d,p-=i,m+=i):(l=c>>>m&d,p=32-(u=i-p),l|=((c=e[h++])&(1<<u)-1)<<i-u,m=u),t[g]=l<f?a+l*o:s;return t},VFj_unstuffLUT2=function(e,t,i,r,n,a){for(var o,s,l=(1<<t)-1,c=0,u=0,d=0,h=0,p=0,m=[],f=Math.ceil((a-r)/n),u=0;u<i;u++)0===d&&(s=e[c++],d=32,p=0),t<=d?(h=s>>>p&l,d-=t,p+=t):(h=s>>>p&l,d=32-(o=t-d),h|=((s=e[c++])&(1<<o)-1)<<t-o,p=o),m[u]=h<f?r+h*n:a;return m.unshift(r),m},VFj_originalUnstuff=function(e,t,i,r){var n,a,o,s,l=(1<<i)-1,c=0,u=0,d=4*e.length-Math.ceil(i*r/8);for(e[e.length-1]<<=8*d,n=0;n<r;n++)0===u&&(o=e[c++],u=32),i<=u?(a=o>>>u-i&l,u-=i):(a=(o&l)<<(s=i-u)&l,a+=(o=e[c++])>>>(u=32-s)),t[n]=a;return t},VFj_originalUnstuff2=function(e,t,i,r){for(var n,a,o,s=(1<<i)-1,l=0,c=0,u=0,d=0;d<r;d++)0===c&&(a=e[l++],c=32,u=0),i<=c?(n=a>>>u&s,c-=i,u+=i):(n=a>>>u&s,c=32-(o=i-c),n|=((a=e[l++])&(1<<o)-1)<<i-o,u=o),t[d]=n;return t},WFj={HUFFMAN_LUT_BITS_MAX:12,computeChecksumFletcher32:function(e){for(var t=65535,i=65535,r=e.length,n=Math.floor(r/2),a=0;n;){var o=359<=n?359:n;for(n-=o;t+=e[a++]<<8,i+=t+=e[a++],--o;);t=(65535&t)+(t>>>16),i=(65535&i)+(i>>>16)}return 1&r&&(i+=t+=e[a]<<8),((i=(65535&i)+(i>>>16))<<16|(t=(65535&t)+(t>>>16)))>>>0},readHeaderInfo:function(e,t){var i=t.ptr,r=new Uint8Array(e,i,6),n={};if(n.fileIdentifierString=String.fromCharCode.apply(null,r),0!==n.fileIdentifierString.lastIndexOf("Lerc2",0))throw"Unexpected file identifier string (expect Lerc2 ): "+n.fileIdentifierString;i+=6;var a,o=new DataView(e,i,8),s=o.getInt32(0,!0);if(i+=4,3<=(n.fileVersion=s)&&(n.checksum=o.getUint32(4,!0),i+=4),o=new DataView(e,i,12),n.height=o.getUint32(0,!0),n.width=o.getUint32(4,!0),i+=8,4<=s?(n.numDims=o.getUint32(8,!0),i+=4):n.numDims=1,o=new DataView(e,i,40),n.numValidPixel=o.getUint32(0,!0),n.microBlockSize=o.getInt32(4,!0),n.blobSize=o.getInt32(8,!0),n.imageType=o.getInt32(12,!0),n.maxZError=o.getFloat64(16,!0),n.zMin=o.getFloat64(24,!0),n.zMax=o.getFloat64(32,!0),i+=40,t.headerInfo=n,t.ptr=i,3<=s&&(a=4<=s?52:48,this.computeChecksumFletcher32(new Uint8Array(e,i-a,n.blobSize-14))!==n.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(e,t){var i=t.headerInfo,r=this.getDataTypeArray(i.imageType),n=i.numDims*this.getDataTypeSize(i.imageType),a=this.readSubArray(e,t.ptr,r,n),o=this.readSubArray(e,t.ptr+n,r,n);t.ptr+=2*n;for(var s=!0,l=0;l<i.numDims;l++)if(a[l]!==o[l]){s=!1;break}return i.minValues=a,i.maxValues=o,s},readSubArray:function(e,t,i,r){var n,a=i===Uint8Array?new Uint8Array(e,t,r):(n=new ArrayBuffer(r),new Uint8Array(n).set(new Uint8Array(e,t,r)),new i(n));return a},readMask:function(e,t){var i,r,n=t.ptr,a=t.headerInfo,o=a.width*a.height,s=a.numValidPixel,l=new DataView(e,n,4),c={};if(c.numBytes=l.getUint32(0,!0),n+=4,(0===s||o===s)&&0!==c.numBytes)throw"invalid mask";if(0===s)i=new Uint8Array(Math.ceil(o/8)),c.bitset=i,r=new Uint8Array(o),t.pixels.resultMask=r,n+=c.numBytes;else if(0<c.numBytes){i=new Uint8Array(Math.ceil(o/8));var u,d=(l=new DataView(e,n,c.numBytes)).getInt16(0,!0),h=2,p=0;do{if(0<d)for(;d--;)i[p++]=l.getUint8(h++);else for(u=l.getUint8(h++),d=-d;d--;)i[p++]=u;d=l.getInt16(h,!0),h+=2}while(h<c.numBytes);if(-32768!==d||p<i.length)throw"Unexpected end of mask RLE encoding";r=new Uint8Array(o);for(var m=0,f=0,f=0;f<o;f++)7&f?(m=i[f>>3],m<<=7&f):m=i[f>>3],128&m&&(r[f]=1);t.pixels.resultMask=r,c.bitset=i,n+=c.numBytes}return t.ptr=n,t.mask=c,!0},readDataOneSweep:function(e,t,i){var r,n=t.ptr,a=t.headerInfo,o=a.numDims,s=a.width*a.height,l=a.imageType,c=a.numValidPixel*WFj.getDataTypeSize(l)*o,u=t.pixels.resultMask,d=i===Uint8Array?new Uint8Array(e,n,c):(r=new ArrayBuffer(c),new Uint8Array(r).set(new Uint8Array(e,n,c)),new i(r));if(d.length===s*o)t.pixels.resultPixels=d;else{t.pixels.resultPixels=new i(s*o);var h,p=0,m=0,f=0;if(1<o)for(f=0;f<o;f++)for(h=f*s,m=0;m<s;m++)u[m]&&(t.pixels.resultPixels[h+m]=d[p++]);else for(m=0;m<s;m++)u[m]&&(t.pixels.resultPixels[m]=d[p++])}return n+=c,t.ptr=n,!0},readHuffmanTree:function(e,t){var i=this.HUFFMAN_LUT_BITS_MAX,r=new DataView(e,t.ptr,16);if(t.ptr+=16,r.getInt32(0,!0)<2)throw"unsupported Huffman version";var n=r.getInt32(4,!0),a=r.getInt32(8,!0),o=r.getInt32(12,!0);if(o<=a)return!1;var s=new Uint32Array(o-a);WFj.decodeBits(e,t,s);for(var l,c,u,d=[],h=a;h<o;h++)d[l=h-(h<n?0:n)]={first:s[h-a],second:null};var p=e.byteLength-t.ptr,m=Math.ceil(p/4),f=new ArrayBuffer(4*m);new Uint8Array(f).set(new Uint8Array(e,t.ptr,p));var g=new Uint32Array(f),_=0,y=0,v=g[0];for(h=a;h<o;h++)0<(u=d[l=h-(h<n?0:n)].first)&&(d[l].second=v<<_>>>32-u,u<=32-_?32===(_+=u)&&(_=0,v=g[++y]):(_+=u-32,v=g[++y],d[l].second|=v>>>32-_));var C=0,S=0,T=new XFj;for(h=0;h<d.length;h++)void 0!==d[h]&&(C=Math.max(C,d[h].first));S=i<=C?i:C,30<=C&&console.log("WARning, large NUM LUT BITS IS "+C);var x,b,E,P,A,w=[];for(h=a;h<o;h++)if(0<(u=d[l=h-(h<n?0:n)].first))if(x=[u,l],u<=S)for(b=d[l].second<<S-u,E=1<<S-u,c=0;c<E;c++)w[b|c]=x;else for(b=d[l].second,A=T,P=u-1;0<=P;P--)A=b>>>P&1?(A.right||(A.right=new XFj),A.right):(A.left||(A.left=new XFj),A.left),0!==P||A.val||(A.val=x[1]);return{decodeLut:w,numBitsLUTQick:S,numBitsLUT:C,tree:T,stuffedData:g,srcPtr:y,bitPos:_}},readHuffman:function(e,t,i){var r,n,a,o,s,l,c,u,d,h=t.headerInfo,p=h.numDims,m=t.headerInfo.height,f=t.headerInfo.width,g=f*m,_=this.readHuffmanTree(e,t),y=_.decodeLut,v=_.tree,C=_.stuffedData,S=_.srcPtr,T=_.bitPos,x=_.numBitsLUTQick,b=_.numBitsLUT,E=0===t.headerInfo.imageType?128:0,P=t.pixels.resultMask,A=0;0<T&&(S++,T=0);for(var w=C[S],D=1===t.encodeMode,M=new i(g*p),I=M,R=0;R<h.numDims;R++){if(1<p&&(I=new i(M.buffer,g*R,g),A=0),t.headerInfo.numValidPixel===f*m)for(l=u=0;l<m;l++)for(c=0;c<f;c++,u++){if(n=0,s=o=w<<T>>>32-x,32-T<x&&(s=o|=C[S+1]>>>64-T-x),y[s])n=y[s][1],T+=y[s][0];else for(s=o=w<<T>>>32-b,32-T<b&&(s=o|=C[S+1]>>>64-T-b),r=v,d=0;d<b;d++)if(!(r=o>>>b-d-1&1?r.right:r.left).left&&!r.right){n=r.val,T=T+d+1;break}32<=T&&(T-=32,w=C[++S]),a=n-E,D?(a+=!(0<c)&&0<l?I[u-f]:A,a&=255,A=I[u]=a):I[u]=a}else for(l=u=0;l<m;l++)for(c=0;c<f;c++,u++)if(P[u]){if(n=0,s=o=w<<T>>>32-x,32-T<x&&(s=o|=C[S+1]>>>64-T-x),y[s])n=y[s][1],T+=y[s][0];else for(s=o=w<<T>>>32-b,32-T<b&&(s=o|=C[S+1]>>>64-T-b),r=v,d=0;d<b;d++)if(!(r=o>>>b-d-1&1?r.right:r.left).left&&!r.right){n=r.val,T=T+d+1;break}32<=T&&(T-=32,w=C[++S]),a=n-E,D?(!(0<c&&P[u-1])&&0<l&&P[u-f]?a+=I[u-f]:a+=A,a&=255,A=I[u]=a):I[u]=a}t.ptr=t.ptr+4*(S+1)+(0<T?4:0)}t.pixels.resultPixels=M},decodeBits:function(e,t,i,r,n){var a=t.headerInfo,o=a.fileVersion,s=0,l=5<=e.byteLength-t.ptr?5:e.byteLength-t.ptr,c=new DataView(e,t.ptr,l),u=c.getUint8(0);s++;var d=u>>6,h=0==d?4:3-d,p=0<(32&u),m=31&u,f=0;if(1==h)f=c.getUint8(s),s++;else if(2==h)f=c.getUint16(s,!0),s+=2;else{if(4!=h)throw"Invalid valid pixel count type";f=c.getUint32(s,!0),s+=4}var g,_,y,v,C,S,T,x,b,E=2*a.maxZError,P=1<a.numDims?a.maxValues[n]:a.zMax;if(p){for(t.counter.lut++,x=c.getUint8(s),s++,v=Math.ceil((x-1)*m/8),C=Math.ceil(v/4),_=new ArrayBuffer(4*C),y=new Uint8Array(_),t.ptr+=s,y.set(new Uint8Array(e,t.ptr,v)),T=new Uint32Array(_),t.ptr+=v,b=0;x-1>>>b;)b++;v=Math.ceil(f*b/8),C=Math.ceil(v/4),_=new ArrayBuffer(4*C),(y=new Uint8Array(_)).set(new Uint8Array(e,t.ptr,v)),g=new Uint32Array(_),t.ptr+=v,S=(3<=o?VFj_unstuffLUT2:VFj_unstuffLUT)(T,m,x-1,r,E,P),(3<=o?VFj_unstuff2:VFj_unstuff)(g,i,b,f,S)}else t.counter.bitstuffer++,b=m,t.ptr+=s,0<b&&(v=Math.ceil(f*b/8),C=Math.ceil(v/4),_=new ArrayBuffer(4*C),(y=new Uint8Array(_)).set(new Uint8Array(e,t.ptr,v)),g=new Uint32Array(_),t.ptr+=v,3<=o?null===r?VFj_originalUnstuff2(g,i,b,f):VFj_unstuff2(g,i,b,f,!1,r,E,P):null===r?VFj_originalUnstuff(g,i,b,f):VFj_unstuff(g,i,b,f,!1,r,E,P))},readTiles:function(e,t,i){var r=t.headerInfo,n=r.width,a=r.height,o=r.microBlockSize,s=r.imageType,l=WFj.getDataTypeSize(s),c=Math.ceil(n/o),u=Math.ceil(a/o);t.pixels.numBlocksY=u,t.pixels.numBlocksX=c;for(var d,h,p,m,f,g,_,y,v,C,S,T,x,b,E,P=t.pixels.ptr=0,A=0,w=0,D=0,M=0,I=0,R=0,O=0,L=new i(o*o),F=a%o||o,N=n%o||o,B=r.numDims,V=t.pixels.resultMask,k=t.pixels.resultPixels,w=0;w<u;w++)for(d=w!==u-1?o:F,D=0;D<c;D++)for(M=w*n*o+D*o,g=n-(h=D!==c-1?o:N),E=0;E<B;E++){if(1<B&&(k=new i(t.pixels.resultPixels.buffer,n*a*E*l,n*a)),p=e.byteLength-t.ptr,v={},O=0,O++,f=(m=(y=new DataView(e,t.ptr,Math.min(10,p))).getUint8(0))>>6&255,(m>>2&15)!=(D*o>>3&15))throw"integrity issue";if(3<(T=3&m))throw t.ptr+=O,"Invalid block encoding ("+T+")";if(2!=T)if(0==T){if(t.counter.uncompressed++,t.ptr+=O,I=(I=d*h*l)<(_=e.byteLength-t.ptr)?I:_,C=new ArrayBuffer(I%l==0?I:I+l-I%l),new Uint8Array(C).set(new Uint8Array(e,t.ptr,I)),S=new i(C),R=0,V)for(P=0;P<d;P++){for(A=0;A<h;A++)V[M]&&(k[M]=S[R++]),M++;M+=g}else for(P=0;P<d;P++){for(A=0;A<h;A++)k[M++]=S[R++];M+=g}t.ptr+=R*l}else if(x=WFj.getDataTypeUsed(s,f),b=WFj.getOnePixel(v,O,x,y),O+=WFj.getDataTypeSize(x),3==T)if(t.ptr+=O,t.counter.constantoffset++,V)for(P=0;P<d;P++){for(A=0;A<h;A++)V[M]&&(k[M]=b),M++;M+=g}else for(P=0;P<d;P++){for(A=0;A<h;A++)k[M++]=b;M+=g}else if(t.ptr+=O,WFj.decodeBits(e,t,L,b,E),O=0,V)for(P=0;P<d;P++){for(A=0;A<h;A++)V[M]&&(k[M]=L[O++]),M++;M+=g}else for(P=0;P<d;P++){for(A=0;A<h;A++)k[M++]=L[O++];M+=g}else t.counter.constant++,t.ptr+=O}},formatFileInfo:function(e){return{fileIdentifierString:e.headerInfo.fileIdentifierString,fileVersion:e.headerInfo.fileVersion,imageType:e.headerInfo.imageType,height:e.headerInfo.height,width:e.headerInfo.width,numValidPixel:e.headerInfo.numValidPixel,microBlockSize:e.headerInfo.microBlockSize,blobSize:e.headerInfo.blobSize,maxZError:e.headerInfo.maxZError,pixelType:WFj.getPixelType(e.headerInfo.imageType),eofOffset:e.eofOffset,mask:e.mask?{numBytes:e.mask.numBytes}:null,pixels:{numBlocksX:e.pixels.numBlocksX,numBlocksY:e.pixels.numBlocksY,maxValue:e.headerInfo.zMax,minValue:e.headerInfo.zMin,noDataValue:e.noDataValue}}},constructConstantSurface:function(e){var t,i=e.headerInfo.zMax,r=e.headerInfo.numDims,n=e.headerInfo.height*e.headerInfo.width,a=n*r,o=0,s=0,l=e.pixels.resultMask;if(l)if(1<r)for(o=0;o<r;o++)for(t=o*n,s=0;s<n;s++)l[s]&&(e.pixels.resultPixels[t+s]=i);else for(s=0;s<n;s++)l[s]&&(e.pixels.resultPixels[s]=i);else if(e.pixels.resultPixels.fill)e.pixels.resultPixels.fill(i);else for(s=0;s<a;s++)e.pixels.resultPixels[s]=i},getDataTypeArray:function(e){var t;switch(e){case 0:t=Int8Array;break;case 1:t=Uint8Array;break;case 2:t=Int16Array;break;case 3:t=Uint16Array;break;case 4:t=Int32Array;break;case 5:t=Uint32Array;break;case 6:t=Float32Array;break;case 7:t=Float64Array;break;default:t=Float32Array}return t},getPixelType:function(e){var t;switch(e){case 0:t="S8";break;case 1:t="U8";break;case 2:t="S16";break;case 3:t="U16";break;case 4:t="S32";break;case 5:t="U32";break;case 6:t="F32";break;case 7:t="F64";break;default:t="F32"}return t},isValidPixelValue:function(e,t){if(null===t)return!1;var i;switch(e){case 0:i=-128<=t&&t<=127;break;case 1:i=0<=t&&t<=255;break;case 2:i=-32768<=t&&t<=32767;break;case 3:i=0<=t&&t<=65536;break;case 4:i=-2147483648<=t&&t<=2147483647;break;case 5:i=0<=t&&t<=4294967296;break;case 6:i=-34027999387901484e22<=t&&t<=34027999387901484e22;break;case 7:i=5e-324<=t&&t<=17976931348623157e292;break;default:i=!1}return i},getDataTypeSize:function(e){var t=0;switch(e){case 0:case 1:t=1;break;case 2:case 3:t=2;break;case 4:case 5:case 6:t=4;break;case 7:t=8;break;default:t=e}return t},getDataTypeUsed:function(e,t){var i=e;switch(e){case 2:case 4:i=e-t;break;case 3:case 5:i=e-2*t;break;case 6:i=0===t?e:1===t?2:1;break;case 7:i=0===t?e:e-2*t+1;break;default:i=e}return i},getOnePixel:function(e,t,i,r){var n=0;switch(i){case 0:n=r.getInt8(t);break;case 1:n=r.getUint8(t);break;case 2:n=r.getInt16(t,!0);break;case 3:n=r.getUint16(t,!0);break;case 4:n=r.getInt32(t,!0);break;case 5:n=r.getUInt32(t,!0);break;case 6:n=r.getFloat32(t,!0);break;case 7:n=r.getFloat64(t,!0);break;default:throw"the decoder does not understand this pixel type"}return n}},XFj=function(e,t,i){this.val=e,this.left=t,this.right=i},gEj={decode:function(e,t){var i=(t=t||{}).noDataValue,r=0,n={};if(n.ptr=t.inputOffset||0,n.pixels={},WFj.readHeaderInfo(e,n)){var a=n.headerInfo,o=a.fileVersion,s=WFj.getDataTypeArray(a.imageType);WFj.readMask(e,n),a.numValidPixel===a.width*a.height||n.pixels.resultMask||(n.pixels.resultMask=t.maskData);var l,c=a.width*a.height;if(n.pixels.resultPixels=new s(c*a.numDims),n.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0},0!==a.numValidPixel)if(a.zMax===a.zMin)WFj.constructConstantSurface(n);else if(4<=o&&WFj.checkMinMaxRanges(e,n))WFj.constructConstantSurface(n);else{var u=new DataView(e,n.ptr,2),d=u.getUint8(0);if(n.ptr++,d)WFj.readDataOneSweep(e,n,s);else if(1<o&&a.imageType<=1&&Math.abs(a.maxZError-.5)<1e-5){var h=u.getUint8(1);if(n.ptr++,2<(n.encodeMode=h)||o<4&&1<h)throw"Invalid Huffman flag "+h;h?WFj.readHuffman(e,n,s):WFj.readTiles(e,n,s)}else WFj.readTiles(e,n,s)}n.eofOffset=n.ptr,t.inputOffset?(l=n.headerInfo.blobSize+t.inputOffset-n.ptr,1<=Math.abs(l)&&(n.eofOffset=t.inputOffset+n.headerInfo.blobSize)):(l=n.headerInfo.blobSize-n.ptr,1<=Math.abs(l)&&(n.eofOffset=n.headerInfo.blobSize));var p={width:a.width,height:a.height,pixelData:n.pixels.resultPixels,minValue:a.zMin,maxValue:a.zMax,validPixelCount:a.numValidPixel,dimCount:a.numDims,dimStats:{minValues:a.minValues,maxValues:a.maxValues},maskData:n.pixels.resultMask};if(n.pixels.resultMask&&WFj.isValidPixelValue(a.imageType,i)){for(var m=n.pixels.resultMask,r=0;r<c;r++)m[r]||(p.pixelData[r]=i);p.noDataValue=i}return n.noDataValue=i,t.returnFileInfo&&(p.fileInfo=WFj.formatFileInfo(n)),p}},getBandCount:function(e){for(var t=0,i=0,r={ptr:0,pixels:{}};i<e.byteLength-58;)WFj.readHeaderInfo(e,r),i+=r.headerInfo.blobSize,t++,r.ptr=i;return t}},mMj=new ArrayBuffer(4),nMj=new Uint8Array(mMj),hEj=(new Uint32Array(mMj)[0]=1)===nMj[0],iEj={decode:function(e,t){if(!hEj)throw"Big endian system is not supported.";var i,r,n=(t=t||{}).inputOffset||0,a=new Uint8Array(e,n,10),o=String.fromCharCode.apply(null,a);if("CntZImage"===o.trim())i=fEj,r=1;else{if("Lerc2"!==o.substring(0,5))throw"Unexpected file identifier string: "+o;i=gEj,r=2}for(var s,l,c,u,d,h,p=0,m=e.byteLength-10,f=[],g={width:0,height:0,pixels:[],pixelType:t.pixelType,mask:null,statistics:[]};n<m;){var _=i.decode(e,{inputOffset:n,encodedMaskData:s,maskData:c,returnMask:0===p,returnEncodedMask:0===p,returnFileInfo:!0,pixelType:t.pixelType||null,noDataValue:t.noDataValue||null}),n=_.fileInfo.eofOffset;0===p&&(s=_.encodedMaskData,c=_.maskData,g.width=_.width,g.height=_.height,g.dimCount=_.dimCount||1,g.pixelType=_.pixelType||_.fileInfo.pixelType,g.mask=_.maskData),1<r&&_.fileInfo.mask&&0<_.fileInfo.mask.numBytes&&f.push(_.maskData),p++,g.pixels.push(_.pixelData),g.statistics.push({minValue:_.minValue,maxValue:_.maxValue,noDataValue:_.noDataValue,dimStats:_.dimStats})}if(1<r&&1<f.length){for(h=g.width*g.height,g.bandMasks=f,(c=new Uint8Array(h)).set(f[0]),u=1;u<f.length;u++)for(l=f[u],d=0;d<h;d++)c[d]=c[d]&l[d];g.maskData=c}return g}},tmp$6.Lerc=iEj;var LercDecode=tmp$6.Lerc,tmp$7={},IMj,JMj;IMj=tmp$7,JMj=function(){return n={},r.m=i=[function(e,t,i){var r=function(e,t,i){return t&&n(e.prototype,t),i&&n(e,i),e};function n(e,t){for(var i=0;i<t.length;i++){var r=t[i];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var a=i(1),o=a.webm,s=a.mp4,l="undefined"!=typeof navigator&&parseFloat((""+(/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))<10&&!window.MSStream,c=(r(u,[{key:"_addSourceToVideo",value:function(e,t,i){var r=document.createElement("source");r.src=i,r.type="video/"+t,e.appendChild(r)}},{key:"enable",value:function(){l?(this.disable(),console.warn("\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n "),this.noSleepTimer=window.setInterval(function(){document.hidden||(window.location.href=window.location.href.split("#")[0],window.setTimeout(window.stop,0))},15e3)):this.noSleepVideo.play()}},{key:"disable",value:function(){l?this.noSleepTimer&&(console.warn("\n NoSleep now disabled for older iOS devices.\n "),window.clearInterval(this.noSleepTimer),this.noSleepTimer=null):this.noSleepVideo.pause()}}]),u);function u(){var e=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u),l?this.noSleepTimer=null:(this.noSleepVideo=document.createElement("video"),this.noSleepVideo.setAttribute("muted",""),this.noSleepVideo.setAttribute("title","No Sleep"),this.noSleepVideo.setAttribute("playsinline",""),this._addSourceToVideo(this.noSleepVideo,"webm",o),this._addSourceToVideo(this.noSleepVideo,"mp4",s),this.noSleepVideo.addEventListener("loadedmetadata",function(){e.noSleepVideo.duration<=1?e.noSleepVideo.setAttribute("loop",""):e.noSleepVideo.addEventListener("timeupdate",function(){.5<e.noSleepVideo.currentTime&&(e.noSleepVideo.currentTime=Math.random())})}))}e.exports=c},function(e,t,i){e.exports={webm:"data:video/webm;base64,GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA=",mp4:"data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQAD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"}}],r.c=n,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0);function r(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return i[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}var i,n},IMj.NoSleep=JMj();var NoSleep=tmp$7.NoSleep,oldValue;"undefined"!=typeof ko&&(oldValue=ko),function(R){var S=this||(0,eval)("this"),T=S.document,C=S.navigator,x=S.jQuery,b=S.JSON;x||"undefined"==typeof jQuery||(x=jQuery),function(e,r){function i(e,t){return null===e||typeof e in l?e===t:!1}function a(e,t){var i;return function(){i||(i=I.a.setTimeout(function(){i=R;e()},t))}}function o(e,t){var i;return function(){clearTimeout(i);i=I.a.setTimeout(e,t)}}function c(e,t){t&&"change"!==t?"beforeChange"===t?this.pc(e):this.gb(e,t):this.qc(e)}function n(e,t){null!==t&&t.s&&t.s()}function s(e,t){var i=this.qd,r=i[p];r.ra||(this.Qb&&this.mb[t]?(i.uc(t,e,this.mb[t]),this.mb[t]=null,--this.Qb):r.I[t]||i.uc(t,e,r.J?{da:e}:i.$c(e)),e.Ja&&e.gd())}var I="undefined"!==typeof e?e:{};I.b=function(e,t){for(var i=e.split("."),r=I,n=0;n<i.length-1;n++)r=r[i[n]];r[i[i.length-1]]=t},I.L=function(e,t,i){e[t]=i},I.version="3.5.1",I.b("version",I.version),I.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1},I.a=function(){function d(e,t){for(var i in e)a.call(e,i)&&t(i,e[i])}function e(e,t){if(t)for(var i in t)a.call(t,i)&&(e[i]=t[i]);return e}function t(e,t){e.__proto__=t;return e}function n(e,t,i,r){var n=e[t].match(u)||[];I.a.D(i.match(u),function(e){I.a.Na(n,e,r)});e[t]=n.join(" ")}var a=Object.prototype.hasOwnProperty,i={__proto__:[]}instanceof Array,r="function"===typeof Symbol,o={},s={};o[C&&/Firefox\/2/i.test(C.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];o.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");d(o,function(e,t){if(t.length)for(var i=0,r=t.length;i<r;i++)s[t[i]]=e});var l={propertychange:!0},c=T&&function(){for(var e=3,t=T.createElement("div"),i=t.getElementsByTagName("i");t.innerHTML="\x3c!--[if gt IE "+ ++e+"]><i></i><![endif]--\x3e",i[0];);return 4<e?e:R}(),u=/\S+/g,h;return{Jc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],D:function(e,t,i){for(var r=0,n=e.length;r<n;r++)t.call(i,e[r],r,e)},A:"function"==typeof Array.prototype.indexOf?function(e,t){return Array.prototype.indexOf.call(e,t)}:function(e,t){for(var i=0,r=e.length;i<r;i++)if(e[i]===t)return i;return-1},Lb:function(e,t,i){for(var r=0,n=e.length;r<n;r++)if(t.call(i,e[r],r,e))return e[r];return R},Pa:function(e,t){var i=I.a.A(e,t);0<i?e.splice(i,1):0===i&&e.shift()},wc:function(e){var t=[];e&&I.a.D(e,function(e){0>I.a.A(t,e)&&t.push(e)});return t},Mb:function(e,t,i){var r=[];if(e)for(var n=0,a=e.length;n<a;n++)r.push(t.call(i,e[n],n));return r},jb:function(e,t,i){var r=[];if(e)for(var n=0,a=e.length;n<a;n++)t.call(i,e[n],n)&&r.push(e[n]);return r},Nb:function(e,t){if(t instanceof Array)e.push.apply(e,t);else for(var i=0,r=t.length;i<r;i++)e.push(t[i]);return e},Na:function(e,t,i){var r=I.a.A(I.a.bc(e),t);0>r?i&&e.push(t):i||e.splice(r,1)},Ba:i,extend:e,setPrototypeOf:t,Ab:i?t:e,P:d,Ga:function(e,t,i){if(!e)return e;var r={},n;for(n in e)a.call(e,n)&&(r[n]=t.call(i,e[n],n,e));return r},Tb:function(e){for(;e.firstChild;)I.removeNode(e.firstChild)},Yb:function(e){e=I.a.la(e);for(var t=(e[0]&&e[0].ownerDocument||T).createElement("div"),i=0,r=e.length;i<r;i++)t.appendChild(I.oa(e[i]));return t},Ca:function(e,t){for(var i=0,r=e.length,n=[];i<r;i++){var a=e[i].cloneNode(!0);n.push(t?I.oa(a):a)}return n},va:function(e,t){I.a.Tb(e);if(t)for(var i=0,r=t.length;i<r;i++)e.appendChild(t[i])},Xc:function(e,t){var i=e.nodeType?[e]:e;if(0<i.length){for(var r=i[0],n=r.parentNode,a=0,o=t.length;a<o;a++)n.insertBefore(t[a],r);a=0;for(o=i.length;a<o;a++)I.removeNode(i[a])}},Ua:function(e,t){if(e.length){for(t=8===t.nodeType&&t.parentNode||t;e.length&&e[0].parentNode!==t;)e.splice(0,1);for(;1<e.length&&e[e.length-1].parentNode!==t;)e.length--;if(1<e.length){var i=e[0],r=e[e.length-1];for(e.length=0;i!==r;)e.push(i),i=i.nextSibling;e.push(r)}}return e},Zc:function(e,t){7>c?e.setAttribute("selected",t):e.selected=t},Db:function(e){return null===e||e===R?"":e.trim?e.trim():e.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},Ud:function(e,t){e=e||"";return t.length>e.length?!1:e.substring(0,t.length)===t},vd:function(e,t){if(e===t)return!0;if(11===e.nodeType)return!1;if(t.contains)return t.contains(1!==e.nodeType?e.parentNode:e);if(t.compareDocumentPosition)return 16==(t.compareDocumentPosition(e)&16);for(;e&&e!=t;)e=e.parentNode;return!!e},Sb:function(e){return I.a.vd(e,e.ownerDocument.documentElement)},kd:function(e){return!!I.a.Lb(e,I.a.Sb)},R:function(e){return e&&e.tagName&&e.tagName.toLowerCase()},Ac:function(e){return I.onError?function(){try{return e.apply(this,arguments)}catch(e){throw I.onError&&I.onError(e),e}}:e},setTimeout:function(e,t){return setTimeout(I.a.Ac(e),t)},Gc:function(e){setTimeout(function(){I.onError&&I.onError(e);throw e},0)},B:function(t,e,i){var r=I.a.Ac(i);i=l[e];if(I.options.useOnlyNativeEvents||i||!x)if(i||"function"!=typeof t.addEventListener)if("undefined"!=typeof t.attachEvent){var n=function(e){r.call(t,e)},a="on"+e;t.attachEvent(a,n);I.a.K.za(t,function(){t.detachEvent(a,n)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else t.addEventListener(e,r,!1);else h||(h="function"==typeof x(t).on?"on":"bind"),x(t)[h](e,r)},Fb:function(e,t){if(!e||!e.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var i;"input"===I.a.R(e)&&e.type&&"click"==t.toLowerCase()?(i=e.type,i="checkbox"==i||"radio"==i):i=!1;if(I.options.useOnlyNativeEvents||!x||i)if("function"==typeof T.createEvent)if("function"==typeof e.dispatchEvent)i=T.createEvent(s[t]||"HTMLEvents"),i.initEvent(t,!0,!0,S,0,0,0,0,0,!1,!1,!1,!1,0,e),e.dispatchEvent(i);else throw Error("The supplied element doesn't support dispatchEvent");else if(i&&e.click)e.click();else if("undefined"!=typeof e.fireEvent)e.fireEvent("on"+t);else throw Error("Browser doesn't support triggering events");else x(e).trigger(t)},f:function(e){return I.O(e)?e():e},bc:function(e){return I.O(e)?e.v():e},Eb:function(t,e,i){var r;e&&("object"===typeof t.classList?(r=t.classList[i?"add":"remove"],I.a.D(e.match(u),function(e){r.call(t.classList,e)})):"string"===typeof t.className.baseVal?n(t.className,"baseVal",e,i):n(t,"className",e,i))},Bb:function(e,t){var i=I.a.f(t);if(null===i||i===R)i="";var r=I.h.firstChild(e);!r||3!=r.nodeType||I.h.nextSibling(r)?I.h.va(e,[e.ownerDocument.createTextNode(i)]):r.data=i;I.a.Ad(e)},Yc:function(e,t){e.name=t;if(7>=c)try{var i=e.name.replace(/[&<>'"]/g,function(e){return"&#"+e.charCodeAt(0)+";"});e.mergeAttributes(T.createElement("<input name='"+i+"'/>"),!1)}catch(e){}},Ad:function(e){9<=c&&(e=1==e.nodeType?e:e.parentNode,e.style&&(e.style.zoom=e.style.zoom))},wd:function(e){if(c){var t=e.style.width;e.style.width=0;e.style.width=t}},Pd:function(e,t){e=I.a.f(e);t=I.a.f(t);for(var i=[],r=e;r<=t;r++)i.push(r);return i},la:function(e){for(var t=[],i=0,r=e.length;i<r;i++)t.push(e[i]);return t},Da:function(e){return r?Symbol(e):e},Zd:6===c,$d:7===c,W:c,Lc:function(e,t){for(var i=I.a.la(e.getElementsByTagName("input")).concat(I.a.la(e.getElementsByTagName("textarea"))),r="string"==typeof t?function(e){return e.name===t}:function(e){return t.test(e.name)},n=[],a=i.length-1;0<=a;a--)r(i[a])&&n.push(i[a]);return n},Nd:function(e){return"string"==typeof e&&(e=I.a.Db(e))?b&&b.parse?b.parse(e):new Function("return "+e)():null},hc:function(e,t,i){if(!b||!b.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");return b.stringify(I.a.f(e),t,i)},Od:function(e,t,i){i=i||{};var r=i.params||{},n=i.includeFields||this.Jc,a=e;if("object"==typeof e&&"form"===I.a.R(e))for(var a=e.action,o=n.length-1;0<=o;o--)for(var s=I.a.Lc(e,n[o]),l=s.length-1;0<=l;l--)r[s[l].name]=s[l].value;t=I.a.f(t);var c=T.createElement("form");c.style.display="none";c.action=a;c.method="post";for(var u in t)e=T.createElement("input"),e.type="hidden",e.name=u,e.value=I.a.hc(I.a.f(t[u])),c.appendChild(e);d(r,function(e,t){var i=T.createElement("input");i.type="hidden";i.name=e;i.value=t;c.appendChild(i)});T.body.appendChild(c);i.submitter?i.submitter(c):c.submit();setTimeout(function(){c.parentNode.removeChild(c)},0)}}}(),I.b("utils",I.a),I.b("utils.arrayForEach",I.a.D),I.b("utils.arrayFirst",I.a.Lb),I.b("utils.arrayFilter",I.a.jb),I.b("utils.arrayGetDistinctValues",I.a.wc),I.b("utils.arrayIndexOf",I.a.A),I.b("utils.arrayMap",I.a.Mb),I.b("utils.arrayPushAll",I.a.Nb),I.b("utils.arrayRemoveItem",I.a.Pa),I.b("utils.cloneNodes",I.a.Ca),I.b("utils.createSymbolOrString",I.a.Da),I.b("utils.extend",I.a.extend),I.b("utils.fieldsIncludedWithJsonPost",I.a.Jc),I.b("utils.getFormFields",I.a.Lc),I.b("utils.objectMap",I.a.Ga),I.b("utils.peekObservable",I.a.bc),I.b("utils.postJson",I.a.Od),I.b("utils.parseJson",I.a.Nd),I.b("utils.registerEventHandler",I.a.B),I.b("utils.stringifyJson",I.a.hc),I.b("utils.range",I.a.Pd),I.b("utils.toggleDomNodeCssClass",I.a.Eb),I.b("utils.triggerEvent",I.a.Fb),I.b("utils.unwrapObservable",I.a.f),I.b("utils.objectForEach",I.a.P),I.b("utils.addOrRemoveItem",I.a.Na),I.b("utils.setTextContent",I.a.Bb),I.b("unwrap",I.a.f),Function.prototype.bind||(Function.prototype.bind=function(t){var i=this;if(1===arguments.length)return function(){return i.apply(t,arguments)};var r=Array.prototype.slice.call(arguments,1);return function(){var e=r.slice(0);e.push.apply(e,arguments);return i.apply(t,e)}}),I.a.g=new function(){var r=0,n="__ko__"+(new Date).getTime(),a={},o,e;I.a.W?(o=function(e,t){var i=e[n];if(!i||"null"===i||!a[i]){if(!t)return R;i=e[n]="ko"+r++;a[i]={}}return a[i]},e=function(e){var t=e[n];return t?(delete a[t],e[n]=null,!0):!1}):(o=function(e,t){var i=e[n];!i&&t&&(i=e[n]={});return i},e=function(e){return e[n]?(delete e[n],!0):!1});return{get:function(e,t){var i=o(e,!1);return i&&i[t]},set:function(e,t,i){(e=o(e,i!==R))&&(e[t]=i)},Ub:function(e,t,i){e=o(e,!0);return e[t]||(e[t]=i)},clear:e,Z:function(){return r+++n}}},I.b("utils.domData",I.a.g),I.b("utils.domData.clear",I.a.g.clear),I.a.K=new function(){function r(e,t){var i=I.a.g.get(e,o);i===R&&t&&(i=[],I.a.g.set(e,o,i));return i}function a(e){var t=r(e,!1);if(t)for(var t=t.slice(0),i=0;i<t.length;i++)t[i](e);I.a.g.clear(e);I.a.K.cleanExternalData(e);s[e.nodeType]&&n(e.childNodes,!0)}function n(e,t){for(var i=[],r,n=0;n<e.length;n++)if(!t||8===e[n].nodeType)if(a(i[i.length]=r=e[n]),e[n]!==r)for(;n--&&-1==I.a.A(i,e[n]););}var o=I.a.g.Z(),t={1:!0,8:!0,9:!0},s={1:!0,9:!0};return{za:function(e,t){if("function"!=typeof t)throw Error("Callback must be a function");r(e,!0).push(t)},yb:function(e,t){var i=r(e,!1);i&&(I.a.Pa(i,t),0==i.length&&I.a.g.set(e,o,R))},oa:function(e){I.u.G(function(){t[e.nodeType]&&(a(e),s[e.nodeType]&&n(e.getElementsByTagName("*")))});return e},removeNode:function(e){I.oa(e);e.parentNode&&e.parentNode.removeChild(e)},cleanExternalData:function(e){x&&"function"==typeof x.cleanData&&x.cleanData([e])}}},I.oa=I.a.K.oa,I.removeNode=I.a.K.removeNode,I.b("cleanNode",I.oa),I.b("removeNode",I.removeNode),I.b("utils.domNodeDisposal",I.a.K),I.b("utils.domNodeDisposal.addDisposeCallback",I.a.K.za),I.b("utils.domNodeDisposal.removeDisposeCallback",I.a.K.yb),function(){var s=[0,"",""],e=[1,"<table>","</table>"],t=[3,"<table><tbody><tr>","</tr></tbody></table>"],i=[1,"<select multiple='multiple'>","</select>"],l={thead:e,tbody:e,tfoot:e,tr:[2,"<table><tbody>","</tbody></table>"],td:t,th:t,option:i,optgroup:i},c=8>=I.a.W;I.a.ua=function(e,t){var i;if(x)if(x.parseHTML)i=x.parseHTML(e,t)||[];else{if((i=x.clean([e],t))&&i[0]){for(var r=i[0];r.parentNode&&11!==r.parentNode.nodeType;)r=r.parentNode;r.parentNode&&r.parentNode.removeChild(r)}}else{(i=t)||(i=T);var r=i.parentWindow||i.defaultView||S,n=I.a.Db(e).toLowerCase(),a=i.createElement("div"),o;o=(n=n.match(/^(?:\x3c!--.*?--\x3e\s*?)*?<([a-z]+)[\s>]/))&&l[n[1]]||s;n=o[0];o="ignored<div>"+o[1]+e+o[2]+"</div>";"function"==typeof r.innerShiv?a.appendChild(r.innerShiv(o)):(c&&i.body.appendChild(a),a.innerHTML=o,c&&a.parentNode.removeChild(a));for(;n--;)a=a.lastChild;i=I.a.la(a.lastChild.childNodes)}return i};I.a.Md=function(e,t){var i=I.a.ua(e,t);return i.length&&i[0].parentElement||I.a.Yb(i)};I.a.fc=function(e,t){I.a.Tb(e);t=I.a.f(t);if(null!==t&&t!==R)if("string"!=typeof t&&(t=t.toString()),x)x(e).html(t);else for(var i=I.a.ua(t,e.ownerDocument),r=0;r<i.length;r++)e.appendChild(i[r])}}(),I.b("utils.parseHtmlFragment",I.a.ua),I.b("utils.setHtml",I.a.fc),I.aa=function(){function s(e,t){if(e)if(8==e.nodeType){var i=I.aa.Uc(e.nodeValue);null!=i&&t.push({ud:e,Kd:i})}else if(1==e.nodeType)for(var i=0,r=e.childNodes,n=r.length;i<n;i++)s(r[i],t)}var r={};return{Xb:function(e){if("function"!=typeof e)throw Error("You can only pass a function to ko.memoization.memoize()");var t=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);r[t]=e;return"\x3c!--[ko_memo:"+t+"]--\x3e"},bd:function(e,t){var i=r[e];if(i===R)throw Error("Couldn't find any memo with ID "+e+". Perhaps it's already been unmemoized.");try{return i.apply(null,t||[]),!0}finally{delete r[e]}},cd:function(e,t){var i=[];s(e,i);for(var r=0,n=i.length;r<n;r++){var a=i[r].ud,o=[a];t&&I.a.Nb(o,t);I.aa.bd(i[r].Kd,o);a.nodeValue="";a.parentNode&&a.parentNode.removeChild(a)}},Uc:function(e){return(e=e.match(/^\[ko_memo\:(.*?)\]$/))?e[1]:null}}}(),I.b("memoization",I.aa),I.b("memoization.memoize",I.aa.Xb),I.b("memoization.unmemoize",I.aa.bd),I.b("memoization.parseMemoText",I.aa.Uc),I.b("memoization.unmemoizeDomNodeAndDescendants",I.aa.cd),I.na=function(){function e(){if(n)for(var e=n,t=0,i;o<n;)if(i=r[o++]){if(o>e){if(5e3<=++t){o=n;I.a.Gc(Error("'Too much recursion' after processing "+t+" task groups."));break}e=n}try{i()}catch(e){I.a.Gc(e)}}}function t(){e();o=n=r.length=0}var i,r=[],n=0,a=1,o=0;S.MutationObserver?i=function(e){var t=T.createElement("div");new MutationObserver(e).observe(t,{attributes:!0});return function(){t.classList.toggle("foo")}}(t):i=T&&"onreadystatechange"in T.createElement("script")?function(e){var t=T.createElement("script");t.onreadystatechange=function(){t.onreadystatechange=null;T.documentElement.removeChild(t);t=null;e()};T.documentElement.appendChild(t)}:function(e){setTimeout(e,0)};return{scheduler:i,zb:function(e){n||I.na.scheduler(t);r[n++]=e;return a++},cancel:function(e){e=e-(a-n);e>=o&&e<n&&(r[e]=null)},resetForTesting:function(){var e=n-o;o=n=r.length=0;return e},Sd:e}}(),I.b("tasks",I.na),I.b("tasks.schedule",I.na.zb),I.b("tasks.runEarly",I.na.Sd),I.Ta={throttle:function(t,i){t.throttleEvaluation=i;var r=null;return I.$({read:t,write:function(e){clearTimeout(r);r=I.a.setTimeout(function(){t(e)},i)}})},rateLimit:function(e,t){var i,r,n;"number"==typeof t?i=t:(i=t.timeout,r=t.method);e.Hb=!1;n="function"==typeof r?r:"notifyWhenChangesStop"==r?o:a;e.ub(function(e){return n(e,i,t)})},deferred:function(r,e){if(!0!==e)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");r.Hb||(r.Hb=!0,r.ub(function(e){var t,i=!1;return function(){if(!i){I.na.cancel(t);t=I.na.zb(e);try{i=!0,r.notifySubscribers(R,"dirty")}finally{i=!1}}}}))},notify:function(e,t){e.equalityComparer="always"==t?null:i}};var l={undefined:1,boolean:1,number:1,string:1};I.b("extenders",I.Ta),I.ic=function(e,t,i){this.da=e;this.lc=t;this.mc=i;this.Ib=!1;this.fb=this.Jb=null;I.L(this,"dispose",this.s);I.L(this,"disposeWhenNodeIsRemoved",this.l)},I.ic.prototype.s=function(){this.Ib||(this.fb&&I.a.K.yb(this.Jb,this.fb),this.Ib=!0,this.mc(),this.da=this.lc=this.mc=this.Jb=this.fb=null)},I.ic.prototype.l=function(e){this.Jb=e;I.a.K.za(e,this.fb=this.s.bind(this))},I.T=function(){I.a.Ab(this,t);t.qb(this)};var t={qb:function(e){e.U={change:[]};e.sc=1},subscribe:function(e,t,i){var r=this;i=i||"change";var n=new I.ic(r,t?e.bind(t):e,function(){I.a.Pa(r.U[i],n);r.hb&&r.hb(i)});r.Qa&&r.Qa(i);r.U[i]||(r.U[i]=[]);r.U[i].push(n);return n},notifySubscribers:function(e,t){t=t||"change";"change"===t&&this.Gb();if(this.Wa(t)){var i="change"===t&&this.ed||this.U[t].slice(0);try{I.u.xc();for(var r=0,n;n=i[r];++r)n.Ib||n.lc(e)}finally{I.u.end()}}},ob:function(){return this.sc},Dd:function(e){return this.ob()!==e},Gb:function(){++this.sc},ub:function(e){var i=this,t=I.O(i),r,n,a,o,s;i.gb||(i.gb=i.notifySubscribers,i.notifySubscribers=c);var l=e(function(){i.Ja=!1;t&&o===i&&(o=i.nc?i.nc():i());var e=n||s&&i.sb(a,o);s=n=r=!1;e&&i.gb(a=o)});i.qc=function(e,t){t&&i.Ja||(s=!t);i.ed=i.U.change.slice(0);i.Ja=r=!0;o=e;l()};i.pc=function(e){r||(a=e,i.gb(e,"beforeChange"))};i.rc=function(){s=!0};i.gd=function(){i.sb(a,i.v(!0))&&(n=!0)}},Wa:function(e){return this.U[e]&&this.U[e].length},Bd:function(e){if(e)return this.U[e]&&this.U[e].length||0;var i=0;I.a.P(this.U,function(e,t){"dirty"!==e&&(i+=t.length)});return i},sb:function(e,t){return!this.equalityComparer||!this.equalityComparer(e,t)},toString:function(){return"[object Object]"},extend:function(e){var r=this;e&&I.a.P(e,function(e,t){var i=I.Ta[e];"function"==typeof i&&(r=i(r,t)||r)});return r}};I.L(t,"init",t.qb),I.L(t,"subscribe",t.subscribe),I.L(t,"extend",t.extend),I.L(t,"getSubscriptionsCount",t.Bd),I.a.Ba&&I.a.setPrototypeOf(t,Function.prototype),I.T.fn=t,I.Qc=function(e){return null!=e&&"function"==typeof e.subscribe&&"function"==typeof e.notifySubscribers},I.b("subscribable",I.T),I.b("isSubscribable",I.Qc),I.S=I.u=function(){function r(e){t.push(i);i=e}function n(){i=t.pop()}var t=[],i,a=0;return{xc:r,end:n,cc:function(e){if(i){if(!I.Qc(e))throw Error("Only subscribable things can act as dependencies");i.od.call(i.pd,e,e.fd||(e.fd=++a))}},G:function(e,t,i){try{return r(),e.apply(t,i||[])}finally{n()}},qa:function(){if(i)return i.o.qa()},Va:function(){if(i)return i.o.Va()},Ya:function(){if(i)return i.Ya},o:function(){if(i)return i.o}}}(),I.b("computedContext",I.S),I.b("computedContext.getDependenciesCount",I.S.qa),I.b("computedContext.getDependencies",I.S.Va),I.b("computedContext.isInitial",I.S.Ya),I.b("computedContext.registerDependency",I.S.cc),I.b("ignoreDependencies",I.Yd=I.u.G);var u=I.a.Da("_latestValue");I.ta=function(e){function t(){if(0<arguments.length)return t.sb(t[u],arguments[0])&&(t.ya(),t[u]=arguments[0],t.xa()),this;I.u.cc(t);return t[u]}t[u]=e;I.a.Ba||I.a.extend(t,I.T.fn);I.T.fn.qb(t);I.a.Ab(t,d);I.options.deferUpdates&&I.Ta.deferred(t,!0);return t};var d={equalityComparer:i,v:function(){return this[u]},xa:function(){this.notifySubscribers(this[u],"spectate");this.notifySubscribers(this[u])},ya:function(){this.notifySubscribers(this[u],"beforeChange")}};I.a.Ba&&I.a.setPrototypeOf(d,I.T.fn);var h=I.ta.Ma="__ko_proto__";d[h]=I.ta,I.O=function(e){if((e="function"==typeof e&&e[h])&&e!==d[h]&&e!==I.o.fn[h])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");return!!e},I.Za=function(e){return"function"==typeof e&&(e[h]===d[h]||e[h]===I.o.fn[h]&&e.Nc)},I.b("observable",I.ta),I.b("isObservable",I.O),I.b("isWriteableObservable",I.Za),I.b("isWritableObservable",I.Za),I.b("observable.fn",d),I.L(d,"peek",d.v),I.L(d,"valueHasMutated",d.xa),I.L(d,"valueWillMutate",d.ya),I.Ha=function(e){e=e||[];if("object"!=typeof e||!("length"in e))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");e=I.ta(e);I.a.Ab(e,I.Ha.fn);return e.extend({trackArrayChanges:!0})},I.Ha.fn={remove:function(t){for(var e=this.v(),i=[],r="function"!=typeof t||I.O(t)?function(e){return e===t}:t,n=0;n<e.length;n++){var a=e[n];if(r(a)){0===i.length&&this.ya();if(e[n]!==a)throw Error("Array modified during remove; cannot remove item");i.push(a);e.splice(n,1);n--}}i.length&&this.xa();return i},removeAll:function(t){if(t===R){var e=this.v(),i=e.slice(0);this.ya();e.splice(0,e.length);this.xa();return i}return t?this.remove(function(e){return 0<=I.a.A(t,e)}):[]},destroy:function(t){var e=this.v(),i="function"!=typeof t||I.O(t)?function(e){return e===t}:t;this.ya();for(var r=e.length-1;0<=r;r--){var n=e[r];i(n)&&(n._destroy=!0)}this.xa()},destroyAll:function(t){return t===R?this.destroy(function(){return!0}):t?this.destroy(function(e){return 0<=I.a.A(t,e)}):[]},indexOf:function(e){var t=this();return I.a.A(t,e)},replace:function(e,t){var i=this.indexOf(e);0<=i&&(this.ya(),this.v()[i]=t,this.xa())},sorted:function(e){var t=this().slice(0);return e?t.sort(e):t.sort()},reversed:function(){return this().slice(0).reverse()}},I.a.Ba&&I.a.setPrototypeOf(I.Ha.fn,I.ta.fn),I.a.D("pop push reverse shift sort splice unshift".split(" "),function(i){I.Ha.fn[i]=function(){var e=this.v();this.ya();this.zc(e,i,arguments);var t=e[i].apply(e,arguments);this.xa();return t===e?this:t}}),I.a.D(["slice"],function(t){I.Ha.fn[t]=function(){var e=this();return e[t].apply(e,arguments)}}),I.Pc=function(e){return I.O(e)&&"function"==typeof e.remove&&"function"==typeof e.push},I.b("observableArray",I.Ha),I.b("isObservableArray",I.Pc),I.Ta.trackArrayChanges=function(i,e){function t(){function e(){if(p){var e=[].concat(i.v()||[]),t;if(i.Wa("arrayChange")){if(!h||1<p)h=I.a.Pb(a,e,i.Ob);t=h}a=e;h=null;p=0;t&&t.length&&i.notifySubscribers(t,"arrayChange")}}d?e():(d=!0,n=i.subscribe(function(){++p},null,"spectate"),a=[].concat(i.v()||[]),h=null,r=i.subscribe(e))}i.Ob={};e&&"object"==typeof e&&I.a.extend(i.Ob,e);i.Ob.sparse=!0;if(!i.zc){var d=!1,h=null,r,n,p=0,a,o=i.Qa,s=i.hb;i.Qa=function(e){o&&o.call(i,e);"arrayChange"===e&&t()};i.hb=function(e){s&&s.call(i,e);"arrayChange"!==e||i.Wa("arrayChange")||(r&&r.s(),n&&n.s(),n=r=null,d=!1,a=R)};i.zc=function(e,t,i){function r(e,t,i){return n[n.length]={status:e,value:t,index:i}}if(d&&!p){var n=[],a=e.length,o=i.length,s=0;switch(t){case"push":s=a;case"unshift":for(t=0;t<o;t++)r("added",i[t],s+t);break;case"pop":s=a-1;case"shift":a&&r("deleted",e[s],s);break;case"splice":t=Math.min(Math.max(0,0>i[0]?a+i[0]:i[0]),a);for(var a=1===o?a:Math.min(t+(i[1]||0),a),o=t+o-2,s=Math.max(a,o),l=[],c=[],u=2;t<s;++t,++u)t<a&&c.push(r("deleted",e[t],t)),t<o&&l.push(r("added",i[u],t));I.a.Kc(c,l);break;default:return}h=n}}}};var p=I.a.Da("_state");I.o=I.$=function(e,t,i){function r(){if(0<arguments.length){if("function"===typeof n)n.apply(a.nb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}a.ra||I.u.cc(r);(a.ka||a.J&&r.Xa())&&r.ha();return a.X}"object"===typeof e?i=e:(i=i||{},e&&(i.read=e));if("function"!=typeof i.read)throw Error("Pass a function that returns the value of the ko.computed");var n=i.write,a={X:R,sa:!0,ka:!0,rb:!1,jc:!1,ra:!1,wb:!1,J:!1,Wc:i.read,nb:t||i.owner,l:i.disposeWhenNodeIsRemoved||i.l||null,Sa:i.disposeWhen||i.Sa,Rb:null,I:{},V:0,Ic:null};r[p]=a;r.Nc="function"===typeof n;I.a.Ba||I.a.extend(r,I.T.fn);I.T.fn.qb(r);I.a.Ab(r,m);i.pure?(a.wb=!0,a.J=!0,I.a.extend(r,f)):i.deferEvaluation&&I.a.extend(r,g);I.options.deferUpdates&&I.Ta.deferred(r,!0);a.l&&(a.jc=!0,a.l.nodeType||(a.l=null));a.J||i.deferEvaluation||r.ha();a.l&&r.ja()&&I.a.K.za(a.l,a.Rb=function(){r.s()});return r};var m={equalityComparer:i,qa:function(){return this[p].V},Va:function(){var i=[];I.a.P(this[p].I,function(e,t){i[t.Ka]=t.da});return i},Vb:function(t){if(!this[p].V)return!1;var e=this.Va();return-1!==I.a.A(e,t)?!0:!!I.a.Lb(e,function(e){return e.Vb&&e.Vb(t)})},uc:function(e,t,i){if(this[p].wb&&t===this)throw Error("A 'pure' computed must not be called recursively");this[p].I[e]=i;i.Ka=this[p].V++;i.La=t.ob()},Xa:function(){var e,t,i=this[p].I;for(e in i)if(Object.prototype.hasOwnProperty.call(i,e)&&(t=i[e],this.Ia&&t.da.Ja||t.da.Dd(t.La)))return!0},Jd:function(){this.Ia&&!this[p].rb&&this.Ia(!1)},ja:function(){var e=this[p];return e.ka||0<e.V},Rd:function(){this.Ja?this[p].ka&&(this[p].sa=!0):this.Hc()},$c:function(e){if(e.Hb){var t=e.subscribe(this.Jd,this,"dirty"),i=e.subscribe(this.Rd,this);return{da:e,s:function(){t.s();i.s()}}}return e.subscribe(this.Hc,this)},Hc:function(){var e=this,t=e.throttleEvaluation;t&&0<=t?(clearTimeout(this[p].Ic),this[p].Ic=I.a.setTimeout(function(){e.ha(!0)},t)):e.Ia?e.Ia(!0):e.ha(!0)},ha:function(e){var t=this[p],i=t.Sa,r=!1;if(!t.rb&&!t.ra){if(t.l&&!I.a.Sb(t.l)||i&&i()){if(!t.jc){this.s();return}}else t.jc=!1;t.rb=!0;try{r=this.zd(e)}finally{t.rb=!1}return r}},zd:function(e){var t=this[p],i=!1,r=t.wb?R:!t.V,i={qd:this,mb:t.I,Qb:t.V};I.u.xc({pd:i,od:s,o:this,Ya:r});t.I={};t.V=0;var n=this.yd(t,i);t.V?i=this.sb(t.X,n):(this.s(),i=!0);i&&(t.J?this.Gb():this.notifySubscribers(t.X,"beforeChange"),t.X=n,this.notifySubscribers(t.X,"spectate"),!t.J&&e&&this.notifySubscribers(t.X),this.rc&&this.rc());r&&this.notifySubscribers(t.X,"awake");return i},yd:function(e,t){try{var i=e.Wc;return e.nb?i.call(e.nb):i()}finally{I.u.end(),t.Qb&&!e.J&&I.a.P(t.mb,n),e.sa=e.ka=!1}},v:function(e){var t=this[p];(t.ka&&(e||!t.V)||t.J&&this.Xa())&&this.ha();return t.X},ub:function(e){I.T.fn.ub.call(this,e);this.nc=function(){this[p].J||(this[p].sa?this.ha():this[p].ka=!1);return this[p].X};this.Ia=function(e){this.pc(this[p].X);this[p].ka=!0;e&&(this[p].sa=!0);this.qc(this,!e)}},s:function(){var e=this[p];!e.J&&e.I&&I.a.P(e.I,function(e,t){t.s&&t.s()});e.l&&e.Rb&&I.a.K.yb(e.l,e.Rb);e.I=R;e.V=0;e.ra=!0;e.sa=!1;e.ka=!1;e.J=!1;e.l=R;e.Sa=R;e.Wc=R;this.Nc||(e.nb=R)}},f={Qa:function(e){var n=this,a=n[p];if(!a.ra&&a.J&&"change"==e){a.J=!1;if(a.sa||n.Xa())a.I=null,a.V=0,n.ha()&&n.Gb();else{var i=[];I.a.P(a.I,function(e,t){i[t.Ka]=e});I.a.D(i,function(e,t){var i=a.I[e],r=n.$c(i.da);r.Ka=t;r.La=i.La;a.I[e]=r});n.Xa()&&n.ha()&&n.Gb()}a.ra||n.notifySubscribers(a.X,"awake")}},hb:function(e){var i=this[p];i.ra||"change"!=e||this.Wa("change")||(I.a.P(i.I,function(e,t){t.s&&(i.I[e]={da:t.da,Ka:t.Ka,La:t.La},t.s())}),i.J=!0,this.notifySubscribers(R,"asleep"))},ob:function(){var e=this[p];e.J&&(e.sa||this.Xa())&&this.ha();return I.T.fn.ob.call(this)}},g={Qa:function(e){"change"!=e&&"beforeChange"!=e||this.v()}};I.a.Ba&&I.a.setPrototypeOf(m,I.T.fn);var _=I.ta.Ma;m[_]=I.o,I.Oc=function(e){return"function"==typeof e&&e[_]===m[_]},I.Fd=function(e){return I.Oc(e)&&e[p]&&e[p].wb},I.b("computed",I.o),I.b("dependentObservable",I.o),I.b("isComputed",I.Oc),I.b("isPureComputed",I.Fd),I.b("computed.fn",m),I.L(m,"peek",m.v),I.L(m,"dispose",m.s),I.L(m,"isActive",m.ja),I.L(m,"getDependenciesCount",m.qa),I.L(m,"getDependencies",m.Va),I.xb=function(e,t){if("function"===typeof e)return I.o(e,t,{pure:!0});e=I.a.extend({},e);e.pure=!0;return I.o(e,t)},I.b("pureComputed",I.xb),function(){function s(r,n,a){a=a||new t;r=n(r);if("object"!=typeof r||null===r||r===R||r instanceof RegExp||r instanceof Date||r instanceof String||r instanceof Number||r instanceof Boolean)return r;var o=r instanceof Array?[]:{};a.save(r,o);e(r,function(e){var t=n(r[e]);switch(typeof t){case"boolean":case"number":case"string":case"function":o[e]=t;break;case"object":case"undefined":var i=a.get(t);o[e]=i!==R?i:s(t,n,a)}});return o}function e(e,t){if(e instanceof Array){for(var i=0;i<e.length;i++)t(i);"function"==typeof e.toJSON&&t("toJSON")}else for(i in e)t(i)}function t(){this.keys=[];this.values=[]}I.ad=function(e){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");return s(e,function(e){for(var t=0;I.O(e)&&10>t;t++)e=e();return e})};I.toJSON=function(e,t,i){e=I.ad(e);return I.a.hc(e,t,i)};t.prototype={constructor:t,save:function(e,t){var i=I.a.A(this.keys,e);0<=i?this.values[i]=t:(this.keys.push(e),this.values.push(t))},get:function(e){e=I.a.A(this.keys,e);return 0<=e?this.values[e]:R}}}(),I.b("toJS",I.ad),I.b("toJSON",I.toJSON),I.Wd=function(r,e,n){function t(t){var e=I.xb(r,n).extend({ma:"always"}),i=e.subscribe(function(e){e&&(i.s(),t(e))});e.notifySubscribers(e.v());return i}return"function"!==typeof Promise||e?t(e.bind(n)):new Promise(t)},I.b("when",I.Wd),function(){I.w={M:function(e){switch(I.a.R(e)){case"option":return!0===e.__ko__hasDomDataOptionValue__?I.a.g.get(e,I.c.options.$b):7>=I.a.W?e.getAttributeNode("value")&&e.getAttributeNode("value").specified?e.value:e.text:e.value;case"select":return 0<=e.selectedIndex?I.w.M(e.options[e.selectedIndex]):R;default:return e.value}},cb:function(e,t,i){switch(I.a.R(e)){case"option":"string"===typeof t?(I.a.g.set(e,I.c.options.$b,R),"__ko__hasDomDataOptionValue__"in e&&delete e.__ko__hasDomDataOptionValue__,e.value=t):(I.a.g.set(e,I.c.options.$b,t),e.__ko__hasDomDataOptionValue__=!0,e.value="number"===typeof t?t:"");break;case"select":if(""===t||null===t)t=R;for(var r=-1,n=0,a=e.options.length,o;n<a;++n)if(o=I.w.M(e.options[n]),o==t||""===o&&t===R){r=n;break}if(i||0<=r||t===R&&1<e.size)e.selectedIndex=r,6===I.a.W&&I.a.setTimeout(function(){e.selectedIndex=r},0);break;default:if(null===t||t===R)t="";e.value=t}}}}(),I.b("selectExtensions",I.w),I.b("selectExtensions.readValue",I.w.M),I.b("selectExtensions.writeValue",I.w.cb),I.m=function(){function r(e){e=I.a.Db(e);123===e.charCodeAt(0)&&(e=e.slice(1,-1));e+="\n,";var t=[],i=e.match(d),r,n=[],a=0;if(1<i.length){for(var o=0,s;s=i[o];++o){var l=s.charCodeAt(0);if(44===l){if(0>=a){t.push(r&&n.length?{key:r,value:n.join("")}:{unknown:r||n.join("")});r=a=0;n=[];continue}}else if(58===l){if(!a&&!r&&1===n.length){r=n.pop();continue}}else if(47===l&&1<s.length&&(47===s.charCodeAt(1)||42===s.charCodeAt(1)))continue;else 47===l&&o&&1<s.length?(l=i[o-1].match(h))&&!p[l[0]]&&(e=e.substr(e.indexOf(s)+1),i=e.match(d),o=-1,s="/"):40===l||123===l||91===l?++a:41===l||125===l||93===l?--a:r||n.length||34!==l&&39!==l||(s=s.slice(1,-1));n.push(s)}if(0<a)throw Error("Unbalanced parentheses, braces, or brackets")}return t}var c=["true","false","null","undefined"],u=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,d=RegExp("\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|`(?:\\\\.|[^`])*`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.*\n|/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,\"'`{}()/:[\\]]*[^\\s,\"'`{}()/:[\\]]|[^\\s]","g"),h=/[\])"'A-Za-z0-9_$]+$/,p={in:1,return:1,typeof:1},m={};return{Ra:[],wa:m,ac:r,vb:function(e,t){function n(e,t){var i;if(!l){var r=I.getBindingHandler(e);if(r&&r.preprocess&&!(t=r.preprocess(t,e,n)))return;if(r=m[e])i=t,0<=I.a.A(c,i)?i=!1:(r=i.match(u),i=null===r?!1:r[1]?"Object("+r[1]+")"+r[2]:i),r=i;r&&o.push("'"+("string"==typeof m[e]?m[e]:e)+"':function(_z){"+i+"=_z}")}s&&(t="function(){return "+t+" }");a.push("'"+e+"':"+t)}t=t||{};var a=[],o=[],s=t.valueAccessors,l=t.bindingParams,i="string"===typeof e?r(e):e;I.a.D(i,function(e){n(e.key||e.unknown,e.value)});o.length&&n("_ko_property_writers","{"+o.join(",")+" }");return a.join(",")},Id:function(e,t){for(var i=0;i<e.length;i++)if(e[i].key==t)return!0;return!1},eb:function(e,t,i,r,n){if(e&&I.O(e))!I.Za(e)||n&&e.v()===r||e(r);else if((e=t.get("_ko_property_writers"))&&e[i])e[i](r)}}}(),I.b("expressionRewriting",I.m),I.b("expressionRewriting.bindingRewriteValidators",I.m.Ra),I.b("expressionRewriting.parseObjectLiteral",I.m.ac),I.b("expressionRewriting.preProcessBindings",I.m.vb),I.b("expressionRewriting._twoWayBindings",I.m.wa),I.b("jsonExpressionRewriting",I.m),I.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",I.m.vb),function(){function a(e){return 8==e.nodeType&&i.test(t?e.text:e.nodeValue)}function o(e){return 8==e.nodeType&&n.test(t?e.text:e.nodeValue)}function r(e,t){for(var i=e,r=1,n=[];i=i.nextSibling;){if(o(i)&&(I.a.g.set(i,c,!0),r--,0===r))return n;n.push(i);a(i)&&r++}if(!t)throw Error("Cannot find closing comment tag to match: "+e.nodeValue);return null}function s(e,t){var i=r(e,t);return i?0<i.length?i[i.length-1].nextSibling:e.nextSibling:null}var t=T&&"\x3c!--test--\x3e"===T.createComment("test").text,i=t?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,n=t?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0},c="__ko_matchedEndComment__";I.h={ea:{},childNodes:function(e){return a(e)?r(e):e.childNodes},Ea:function(e){if(a(e)){e=I.h.childNodes(e);for(var t=0,i=e.length;t<i;t++)I.removeNode(e[t])}else I.a.Tb(e)},va:function(e,t){if(a(e)){I.h.Ea(e);for(var i=e.nextSibling,r=0,n=t.length;r<n;r++)i.parentNode.insertBefore(t[r],i)}else I.a.va(e,t)},Vc:function(e,t){var i;a(e)?(i=e.nextSibling,e=e.parentNode):i=e.firstChild;i?t!==i&&e.insertBefore(t,i):e.appendChild(t)},Wb:function(e,t,i){i?(i=i.nextSibling,a(e)&&(e=e.parentNode),i?t!==i&&e.insertBefore(t,i):e.appendChild(t)):I.h.Vc(e,t)},firstChild:function(e){if(a(e))return!e.nextSibling||o(e.nextSibling)?null:e.nextSibling;if(e.firstChild&&o(e.firstChild))throw Error("Found invalid end comment, as the first child of "+e);return e.firstChild},nextSibling:function(e){a(e)&&(e=s(e));if(e.nextSibling&&o(e.nextSibling)){var t=e.nextSibling;if(o(t)&&!I.a.g.get(t,c))throw Error("Found end comment without a matching opening comment, as child of "+e);return null}return e.nextSibling},Cd:a,Vd:function(e){return(e=(t?e.text:e.nodeValue).match(i))?e[1]:null},Sc:function(e){if(l[I.a.R(e)]){var t=e.firstChild;if(t){do{if(1===t.nodeType){var i;i=t.firstChild;var r=null;if(i){do{if(r)r.push(i);else if(a(i)){var n=s(i,!0);n?i=n:r=[i]}else o(i)&&(r=[i])}while(i=i.nextSibling)}if(i=r)for(r=t.nextSibling,n=0;n<i.length;n++)r?e.insertBefore(i[n],r):e.appendChild(i[n])}}while(t=t.nextSibling)}}}}}(),I.b("virtualElements",I.h),I.b("virtualElements.allowedBindings",I.h.ea),I.b("virtualElements.emptyNode",I.h.Ea),I.b("virtualElements.insertAfter",I.h.Wb),I.b("virtualElements.prepend",I.h.Vc),I.b("virtualElements.setDomNodeChildren",I.h.va),function(){I.ga=function(){this.nd={}};I.a.extend(I.ga.prototype,{nodeHasBindings:function(e){switch(e.nodeType){case 1:return null!=e.getAttribute("data-bind")||I.j.getComponentNameForNode(e);case 8:return I.h.Cd(e);default:return!1}},getBindings:function(e,t){var i=this.getBindingsString(e,t),i=i?this.parseBindingsString(i,t,e):null;return I.j.tc(i,e,t,!1)},getBindingAccessors:function(e,t){var i=this.getBindingsString(e,t),i=i?this.parseBindingsString(i,t,e,{valueAccessors:!0}):null;return I.j.tc(i,e,t,!0)},getBindingsString:function(e){switch(e.nodeType){case 1:return e.getAttribute("data-bind");case 8:return I.h.Vd(e);default:return null}},parseBindingsString:function(t,e,i,r){try{var n=this.nd,a=t+(r&&r.valueAccessors||""),o;if(!(o=n[a])){var s,l="with($context){with($data||{}){return{"+I.m.vb(t,r)+"}}}";s=new Function("$context","$element",l);o=n[a]=s}return o(e,i)}catch(e){throw e.message="Unable to parse bindings.\nBindings value: "+t+"\nMessage: "+e.message,e}}});I.ga.instance=new I.ga}(),I.b("bindingProvider",I.ga),function(){function r(e){var t=(e=I.a.g.get(e,C))&&e.N;t&&(e.N=null,t.Tc())}function n(e,t,i){this.node=e;this.yc=t;this.kb=[];this.H=!1;t.N||I.a.K.za(e,r);i&&i.N&&(i.N.kb.push(e),this.Kb=i)}function a(e){return function(){return e}}function p(e){return e()}function o(i){return I.a.Ga(I.u.G(i),function(e,t){return function(){return i()[t]}})}function s(e,t,i){return"function"===typeof e?o(e.bind(null,t,i)):I.a.Ga(e,a)}function m(e,t){return o(this.getBindings.bind(this,e,t))}function l(e,t){var i=I.h.firstChild(t);if(i){var r,n=I.ga.instance,a=n.preprocessNode;if(a){for(;r=i;)i=I.h.nextSibling(r),a.call(n,r);i=I.h.firstChild(t)}for(;r=i;)i=I.h.nextSibling(r),c(e,r)}I.i.ma(t,I.i.H)}function c(e,t){var i=e,r=1===t.nodeType;r&&I.h.Sc(t);if(r||I.ga.instance.nodeHasBindings(t))i=u(t,null,e).bindingContextForDescendants;i&&!y[I.a.R(t)]&&l(i,t)}function f(r){var n=[],a={},o=[];I.a.P(r,function t(e){if(!a[e]){var i=I.getBindingHandler(e);i&&(i.after&&(o.push(e),I.a.D(i.after,function(e){if(r[e]){if(-1!==I.a.A(o,e))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+o.join(", "));t(e)}}),o.length--),n.push({key:e,Mc:i}));a[e]=!0}});return n}function u(n,e,t){var i=I.a.g.Ub(n,C,{}),r=i.hd;if(!e){if(r)throw Error("You cannot apply bindings multiple times to the same element.");i.hd=!0}r||(i.context=t);i.Zb||(i.Zb={});var a;if(e&&"function"!==typeof e)a=e;else{var o=I.ga.instance,s=o.getBindingAccessors||m,l=I.$(function(){if(a=e?e(t,n):s.call(o,n,t)){if(t[g])t[g]();if(t[_])t[_]()}return a},null,{l:n});a&&l.ja()||(l=null)}var c=t,u;if(a){var d=function(){return I.a.Ga(l?l():a,p)},h=l?function(e){return function(){return p(l()[e])}}:function(e){return a[e]};d.get=function(e){return a[e]&&p(h(e))};d.has=function(e){return e in a};I.i.H in a&&I.i.subscribe(n,I.i.H,function(){var e=(0,a[I.i.H])();if(e){var t=I.h.childNodes(n);t.length&&e(t,I.Ec(t[0]))}});I.i.pa in a&&(c=I.i.Cb(n,t),I.i.subscribe(n,I.i.pa,function(){var e=(0,a[I.i.pa])();e&&I.h.firstChild(n)&&e(n)}));i=f(a);I.a.D(i,function(e){var t=e.Mc.init,i=e.Mc.update,r=e.key;if(8===n.nodeType&&!I.h.ea[r])throw Error("The binding '"+r+"' cannot be used with virtual elements");try{"function"==typeof t&&I.u.G(function(){var e=t(n,h(r),d,c.$data,c);if(e&&e.controlsDescendantBindings){if(u!==R)throw Error("Multiple bindings ("+u+" and "+r+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=r}}),"function"==typeof i&&I.$(function(){i(n,h(r),d,c.$data,c)},null,{l:n})}catch(e){throw e.message='Unable to process binding "'+r+": "+a[r]+'"\nMessage: '+e.message,e}})}i=u===R;return{shouldBindDescendants:i,bindingContextForDescendants:i&&c}}function d(e,t){return e&&e instanceof I.fa?e:new I.fa(e,R,R,t)}var g=I.a.Da("_subscribable"),h=I.a.Da("_ancestorBindingInfo"),_=I.a.Da("_dataDependency");I.c={};var y={script:!0,textarea:!0,template:!0};I.getBindingHandler=function(e){return I.c[e]};var v={};I.fa=function(e,i,r,n,t){function a(){var e=c?l():l,t=I.a.f(e);i?(I.a.extend(o,i),h in i&&(o[h]=i[h])):(o.$parents=[],o.$root=t,o.ko=I);o[g]=u;s?t=o.$data:(o.$rawData=e,o.$data=t);r&&(o[r]=t);n&&n(o,i,t);if(i&&i[g]&&!I.S.o().Vb(i[g]))i[g]();d&&(o[_]=d);return o.$data}var o=this,s=e===v,l=s?R:e,c="function"==typeof l&&!I.O(l),u,d=t&&t.dataDependency;t&&t.exportDependencies?a():(u=I.xb(a),u.v(),u.ja()?u.equalityComparer=null:o[g]=R)};I.fa.prototype.createChildContext=function(t,i,r,e){!e&&i&&"object"==typeof i&&(e=i,i=e.as,r=e.extend);if(i&&e&&e.noChildContext){var n="function"==typeof t&&!I.O(t);return new I.fa(v,this,null,function(e){r&&r(e);e[i]=n?t():t},e)}return new I.fa(t,this,i,function(e,t){e.$parentContext=t;e.$parent=t.$data;e.$parents=(t.$parents||[]).slice(0);e.$parents.unshift(e.$parent);r&&r(e)},e)};I.fa.prototype.extend=function(t,e){return new I.fa(v,this,null,function(e){I.a.extend(e,"function"==typeof t?t(e):t)},e)};var C=I.a.g.Z();n.prototype.Tc=function(){this.Kb&&this.Kb.N&&this.Kb.N.sd(this.node)};n.prototype.sd=function(e){I.a.Pa(this.kb,e);!this.kb.length&&this.H&&this.Cc()};n.prototype.Cc=function(){this.H=!0;this.yc.N&&!this.kb.length&&(this.yc.N=null,I.a.K.yb(this.node,r),I.i.ma(this.node,I.i.pa),this.Tc())};I.i={H:"childrenComplete",pa:"descendantsComplete",subscribe:function(e,t,i,r,n){var a=I.a.g.Ub(e,C,{});a.Fa||(a.Fa=new I.T);n&&n.notifyImmediately&&a.Zb[t]&&I.u.G(i,r,[e]);return a.Fa.subscribe(i,r,t)},ma:function(e,t){var i=I.a.g.get(e,C);if(i&&(i.Zb[t]=!0,i.Fa&&i.Fa.notifySubscribers(e,t),t==I.i.H))if(i.N)i.N.Cc();else if(i.N===R&&i.Fa&&i.Fa.Wa(I.i.pa))throw Error("descendantsComplete event not supported for bindings on this node")},Cb:function(e,t){var i=I.a.g.Ub(e,C,{});i.N||(i.N=new n(e,i,t[h]));return t[h]==i?t:t.extend(function(e){e[h]=i})}};I.Td=function(e){return(e=I.a.g.get(e,C))&&e.context};I.ib=function(e,t,i){1===e.nodeType&&I.h.Sc(e);return u(e,t,d(i))};I.ld=function(e,t,i){i=d(i);return I.ib(e,s(t,i,e),i)};I.Oa=function(e,t){1!==t.nodeType&&8!==t.nodeType||l(d(e),t)};I.vc=function(e,t,i){!x&&S.jQuery&&(x=S.jQuery);if(2>arguments.length){if(t=T.body,!t)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?")}else if(!t||1!==t.nodeType&&8!==t.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");c(d(e,i),t)};I.Dc=function(e){return!e||1!==e.nodeType&&8!==e.nodeType?R:I.Td(e)};I.Ec=function(e){return(e=I.Dc(e))?e.$data:R};I.b("bindingHandlers",I.c);I.b("bindingEvent",I.i);I.b("bindingEvent.subscribe",I.i.subscribe);I.b("bindingEvent.startPossiblyAsyncContentBinding",I.i.Cb);I.b("applyBindings",I.vc);I.b("applyBindingsToDescendants",I.Oa);I.b("applyBindingAccessorsToNode",I.ib);I.b("applyBindingsToNode",I.ld);I.b("contextFor",I.Dc);I.b("dataFor",I.Ec)}(),function(s){function r(r,e){var n=Object.prototype.hasOwnProperty.call(o,r)?o[r]:s,a;n?n.subscribe(e):(n=o[r]=new I.T,n.subscribe(e),t(r,function(e,t){var i=!(!t||!t.synchronous);c[r]={definition:e,Gd:i};delete o[r];a||i?n.notifySubscribers(e):I.na.zb(function(){n.notifySubscribers(e)})}),a=!0)}function t(e,i){l("getConfig",[e],function(t){t?l("loadComponent",[e,t],function(e){i(e,t)}):i(null,null)})}function l(t,i,r,n){n||(n=I.j.loaders.slice(0));var e=n.shift();if(e){var a=e[t];if(a){var o=!1;if(a.apply(e,i.concat(function(e){o?r(null):null!==e?r(e):l(t,i,r,n)}))!==s&&(o=!0,!e.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.")}else l(t,i,r,n)}else r(null)}var o={},c={};I.j={get:function(e,t){var i=Object.prototype.hasOwnProperty.call(c,e)?c[e]:s;i?i.Gd?I.u.G(function(){t(i.definition)}):I.na.zb(function(){t(i.definition)}):r(e,t)},Bc:function(e){delete c[e]},oc:l};I.j.loaders=[];I.b("components",I.j);I.b("components.get",I.j.get);I.b("components.clearCachedDefinition",I.j.Bc)}(),function(){function n(t,e,i,r){function n(){0===--o&&r(a)}var a={},o=2,s=i.template;i=i.viewModel;s?l(e,s,function(e){I.j.oc("loadTemplate",[t,e],function(e){a.template=e;n()})}):n();i?l(e,i,function(e){I.j.oc("loadViewModel",[t,e],function(e){a[u]=e;n()})}):n()}function a(e,t,i){if("function"===typeof t)i(function(e){return new t(e)});else if("function"===typeof t[u])i(t[u]);else if("instance"in t){var r=t.instance;i(function(){return r})}else"viewModel"in t?a(e,t.viewModel,i):e("Unknown viewModel value: "+t)}function o(e){switch(I.a.R(e)){case"script":return I.a.ua(e.text);case"textarea":return I.a.ua(e.value);case"template":if(s(e.content))return I.a.Ca(e.content.childNodes)}return I.a.Ca(e.childNodes)}function s(e){return S.DocumentFragment?e instanceof DocumentFragment:e&&11===e.nodeType}function l(e,t,i){"string"===typeof t.require?r||S.require?(r||S.require)([t.require],function(e){e&&"object"===typeof e&&e.Xd&&e["default"]&&(e=e["default"]);i(e)}):e("Uses require, but no AMD loader is present"):i(t)}function c(t){return function(e){throw Error("Component '"+t+"': "+e)}}var i={};I.j.register=function(e,t){if(!t)throw Error("Invalid configuration for "+e);if(I.j.tb(e))throw Error("Component "+e+" is already registered");i[e]=t};I.j.tb=function(e){return Object.prototype.hasOwnProperty.call(i,e)};I.j.unregister=function(e){delete i[e];I.j.Bc(e)};I.j.Fc={getConfig:function(e,t){t(I.j.tb(e)?i[e]:null)},loadComponent:function(t,e,i){var r=c(t);l(r,e,function(e){n(t,r,e,i)})},loadTemplate:function(e,t,i){e=c(e);if("string"===typeof t)i(I.a.ua(t));else if(t instanceof Array)i(t);else if(s(t))i(I.a.la(t.childNodes));else if(t.element)if(t=t.element,S.HTMLElement?t instanceof HTMLElement:t&&t.tagName&&1===t.nodeType)i(o(t));else if("string"===typeof t){var r=T.getElementById(t);r?i(o(r)):e("Cannot find element with ID "+t)}else e("Unknown element type: "+t);else e("Unknown template value: "+t)},loadViewModel:function(e,t,i){a(c(e),t,i)}};var u="createViewModel";I.b("components.register",I.j.register);I.b("components.isRegistered",I.j.tb);I.b("components.unregister",I.j.unregister);I.b("components.defaultLoader",I.j.Fc);I.j.loaders.push(I.j.Fc);I.j.dd=i}(),function(){function o(i,e){var t=i.getAttribute("params");if(t){var t=n.parseBindingsString(t,e,i,{valueAccessors:!0,bindingParams:!0}),t=I.a.Ga(t,function(e){return I.o(e,null,{l:i})}),r=I.a.Ga(t,function(t){var e=t.v();return t.ja()?I.o({read:function(){return I.a.f(t())},write:I.Za(e)&&function(e){t()(e)},l:i}):e});Object.prototype.hasOwnProperty.call(r,"$raw")||(r.$raw=t);return r}return{$raw:{}}}I.j.getComponentNameForNode=function(e){var t=I.a.R(e);if(I.j.tb(t)&&(-1!=t.indexOf("-")||"[object HTMLUnknownElement]"==""+e||8>=I.a.W&&e.tagName===t))return t};I.j.tc=function(e,t,i,r){if(1===t.nodeType){var n=I.j.getComponentNameForNode(t);if(n){e=e||{};if(e.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var a={name:n,params:o(t,i)};e.component=r?function(){return a}:a}}return e};var n=new I.ga;9>I.a.W&&(I.j.register=function(t){return function(e){return t.apply(this,arguments)}}(I.j.register),T.createDocumentFragment=function(i){return function(){var e=i(),t=I.j.dd;return e}}(T.createDocumentFragment))}(),function(){function p(e,t,i){t=t.template;if(!t)throw Error("Component '"+e+"' has no template");e=I.a.Ca(t);I.h.va(i,e)}function m(e,t,i){var r=e.createViewModel;return r?r.call(e,t,i):t}var f=0;I.c.component={init:function(o,t,e,i,s){function l(){var e=c&&c.dispose;"function"===typeof e&&e.call(c);d&&d.s();u=c=d=null}var c,u,d,h=I.a.la(I.h.childNodes(o));I.h.Ea(o);I.a.K.za(o,l);I.o(function(){var e=I.a.f(t()),i,r;"string"===typeof e?i=e:(i=I.a.f(e.name),r=I.a.f(e.params));if(!i)throw Error("No component name specified");var n=I.i.Cb(o,s),a=u=++f;I.j.get(i,function(e){if(u===a){l();if(!e)throw Error("Unknown component '"+i+"'");p(i,e,o);var t=m(e,r,{element:o,templateNodes:h});e=n.createChildContext(t,{extend:function(e){e.$component=t;e.$componentTemplateNodes=h}});t&&t.koDescendantsComplete&&(d=I.i.subscribe(o,I.i.pa,t.koDescendantsComplete,t));c=t;I.Oa(e,o)}})},null,{l:o});return{controlsDescendantBindings:!0}}};I.h.ea.component=!0}();var y={class:"className",for:"htmlFor"};I.c.attr={update:function(n,e){var t=I.a.f(e())||{};I.a.P(t,function(e,t){t=I.a.f(t);var i=e.indexOf(":"),i="lookupNamespaceURI"in n&&0<i&&n.lookupNamespaceURI(e.substr(0,i)),r=!1===t||null===t||t===R;r?i?n.removeAttributeNS(i,e):n.removeAttribute(e):t=t.toString();8>=I.a.W&&e in y?(e=y[e],r?n.removeAttribute(e):n[e]=t):r||(i?n.setAttributeNS(i,e,t):n.setAttribute(e,t));"name"===e&&I.a.Yc(n,r?"":t)})}},function(){I.c.checked={after:["value","attr"],init:function(a,o,s){function e(){var e=a.checked,t=l();if(!I.S.Ya()&&(e||!u&&!I.S.qa())){var i=I.u.G(o);if(d){var r=h?i.v():i,n=p;p=t;n!==t?e&&(I.a.Na(r,t,!0),I.a.Na(r,n,!1)):I.a.Na(r,t,e);h&&I.Za(i)&&i(r)}else c&&(t===R?t=e:e||(t=R)),I.m.eb(i,s,"checked",t,!0)}}function t(){var e=I.a.f(o()),t=l();d?(a.checked=0<=I.a.A(e,t),p=t):a.checked=c&&t===R?!!e:l()===e}var l=I.xb(function(){if(s.has("checkedValue"))return I.a.f(s.get("checkedValue"));if(r)return s.has("value")?I.a.f(s.get("value")):a.value}),c="checkbox"==a.type,u="radio"==a.type;if(c||u){var i=o(),d=c&&I.a.f(i)instanceof Array,h=!(d&&i.push&&i.splice),r=u||d,p=d?l():R;u&&!a.name&&I.c.uniqueName.init(a,function(){return!0});I.o(e,null,{l:a});I.a.B(a,"click",e);I.o(t,null,{l:a});i=R}}};I.m.wa.checked=!0;I.c.checkedValue={update:function(e,t){e.value=I.a.f(t())}}}(),I.c["class"]={update:function(e,t){var i=I.a.Db(I.a.f(t()));I.a.Eb(e,e.__ko__cssValue,!1);e.__ko__cssValue=i;I.a.Eb(e,i,!0)}},I.c.css={update:function(i,e){var t=I.a.f(e());null!==t&&"object"==typeof t?I.a.P(t,function(e,t){t=I.a.f(t);I.a.Eb(i,e,t)}):I.c["class"].update(i,e)}},I.c.enable={update:function(e,t){var i=I.a.f(t());i&&e.disabled?e.removeAttribute("disabled"):i||e.disabled||(e.disabled=!0)}},I.c.disable={update:function(e,t){I.c.enable.update(e,function(){return!I.a.f(t())})}},I.c.event={init:function(e,a,o,s,l){var t=a()||{};I.a.P(t,function(n){"string"==typeof n&&I.a.B(e,n,function(e){var t,i=a()[n];if(i){try{var r=I.a.la(arguments);s=l.$data;r.unshift(s);t=i.apply(s,r)}finally{!0!==t&&(e.preventDefault?e.preventDefault():e.returnValue=!1)}!1===o.get(n+"Bubble")&&(e.cancelBubble=!0,e.stopPropagation&&e.stopPropagation())}})})}},I.c.foreach={Rc:function(i){return function(){var e=i(),t=I.a.bc(e);if(!t||"number"==typeof t.length)return{foreach:e,templateEngine:I.ba.Ma};I.a.f(e);return{foreach:t.data,as:t.as,noChildContext:t.noChildContext,includeDestroyed:t.includeDestroyed,afterAdd:t.afterAdd,beforeRemove:t.beforeRemove,afterRender:t.afterRender,beforeMove:t.beforeMove,afterMove:t.afterMove,templateEngine:I.ba.Ma}}},init:function(e,t){return I.c.template.init(e,I.c.foreach.Rc(t))},update:function(e,t,i,r,n){return I.c.template.update(e,I.c.foreach.Rc(t),i,r,n)}},I.m.Ra.foreach=!1,I.h.ea.foreach=!0,I.c.hasfocus={init:function(r,n,a){function e(e){r.__ko_hasfocusUpdating=!0;var t=r.ownerDocument;if("activeElement"in t){var i;try{i=t.activeElement}catch(e){i=t.body}e=i===r}t=n();I.m.eb(t,a,"hasfocus",e,!0);r.__ko_hasfocusLastValue=e;r.__ko_hasfocusUpdating=!1}var t=e.bind(null,!0),i=e.bind(null,!1);I.a.B(r,"focus",t);I.a.B(r,"focusin",t);I.a.B(r,"blur",i);I.a.B(r,"focusout",i);r.__ko_hasfocusLastValue=!1},update:function(e,t){var i=!!I.a.f(t());e.__ko_hasfocusUpdating||e.__ko_hasfocusLastValue===i||(i?e.focus():e.blur(),!i&&e.__ko_hasfocusLastValue&&e.ownerDocument.body.focus(),I.u.G(I.a.Fb,null,[e,i?"focusin":"focusout"]))}},I.m.wa.hasfocus=!0,I.c.hasFocus=I.c.hasfocus,I.m.wa.hasFocus="hasfocus",I.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(e,t){I.a.fc(e,t())}},function(){function e(e,p,m){I.c[e]={init:function(n,a,e,t,o){var s,l,c={},u,d,h;if(p){t=e.get("as");var i=e.get("noChildContext");h=!(t&&i);c={as:t,noChildContext:i,exportDependencies:h}}d=(u="render"==e.get("completeOn"))||e.has(I.i.pa);I.o(function(){var e=I.a.f(a()),t=!m!==!e,i=!l,r;if(h||t!==s){d&&(o=I.i.Cb(n,o));if(t){if(!p||h)c.dataDependency=I.S.o();r=p?o.createChildContext("function"==typeof e?e:a,c):I.S.qa()?o.extend(null,c):o}i&&I.S.qa()&&(l=I.a.Ca(I.h.childNodes(n),!0));t?(i||I.h.va(n,I.a.Ca(l)),I.Oa(r,n)):(I.h.Ea(n),u||I.i.ma(n,I.i.H));s=t}},null,{l:n});return{controlsDescendantBindings:!0}}};I.m.Ra[e]=!1;I.h.ea[e]=!0}e("if");e("ifnot",!1,!0);e("with",!0)}(),I.c.let={init:function(e,t,i,r,n){t=n.extend(t);I.Oa(t,e);return{controlsDescendantBindings:!0}}},I.h.ea.let=!0;var v={};I.c.options={init:function(e){if("select"!==I.a.R(e))throw Error("options binding applies only to SELECT elements");for(;0<e.length;)e.remove(0);return{controlsDescendantBindings:!0}},update:function(r,e,n){function t(){return I.a.jb(r.options,function(e){return e.selected})}function a(e,t,i){var r=typeof t;return"function"==r?t(e):"string"==r?e[t]:i}function i(e,t){if(p&&c)I.i.ma(r,I.i.H);else if(h.length){var i=0<=I.a.A(h,I.w.M(t[0]));I.a.Zc(t[0],i);p&&!i&&I.u.G(I.a.Fb,null,[r,"change"])}}var o=r.multiple,s=0!=r.length&&o?r.scrollTop:null,l=I.a.f(e()),c=n.get("valueAllowUnset")&&n.has("value"),u=n.get("optionsIncludeDestroyed");e={};var d,h=[];c||(o?h=I.a.Mb(t(),I.w.M):0<=r.selectedIndex&&h.push(I.w.M(r.options[r.selectedIndex])));l&&("undefined"==typeof l.length&&(l=[l]),d=I.a.jb(l,function(e){return u||e===R||null===e||!I.a.f(e._destroy)}),n.has("optionsCaption")&&(l=I.a.f(n.get("optionsCaption")),null!==l&&l!==R&&d.unshift(v)));var p=!1;e.beforeRemove=function(e){r.removeChild(e)};l=i;n.has("optionsAfterRender")&&"function"==typeof n.get("optionsAfterRender")&&(l=function(e,t){i(0,t);I.u.G(n.get("optionsAfterRender"),null,[t[0],e!==v?e:R])});I.a.ec(r,d,function(e,t,i){i.length&&(h=!c&&i[0].selected?[I.w.M(i[0])]:[],p=!0);t=r.ownerDocument.createElement("option");e===v?(I.a.Bb(t,n.get("optionsCaption")),I.w.cb(t,R)):(i=a(e,n.get("optionsValue"),e),I.w.cb(t,I.a.f(i)),e=a(e,n.get("optionsText"),i),I.a.Bb(t,e));return[t]},e,l);if(!c){var m;o?m=h.length&&t().length<h.length:m=h.length&&0<=r.selectedIndex?I.w.M(r.options[r.selectedIndex])!==h[0]:h.length||0<=r.selectedIndex;m&&I.u.G(I.a.Fb,null,[r,"change"])}(c||I.S.Ya())&&I.i.ma(r,I.i.H);I.a.wd(r);s&&20<Math.abs(s-r.scrollTop)&&(r.scrollTop=s)}},I.c.options.$b=I.a.g.Z(),I.c.selectedOptions={init:function(r,n,i){function e(){var e=n(),t=[];I.a.D(r.getElementsByTagName("option"),function(e){e.selected&&t.push(I.w.M(e))});I.m.eb(e,i,"selectedOptions",t)}function t(){var i=I.a.f(n()),e=r.scrollTop;i&&"number"==typeof i.length&&I.a.D(r.getElementsByTagName("option"),function(e){var t=0<=I.a.A(i,I.w.M(e));e.selected!=t&&I.a.Zc(e,t)});r.scrollTop=e}if("select"!=I.a.R(r))throw Error("selectedOptions binding applies only to SELECT elements");var a;I.i.subscribe(r,I.i.H,function(){a?e():(I.a.B(r,"change",e),a=I.o(t,null,{l:r}))},null,{notifyImmediately:!0})},update:function(){}},I.m.wa.selectedOptions=!0,I.c.style={update:function(r,e){var t=I.a.f(e()||{});I.a.P(t,function(e,t){t=I.a.f(t);if(null===t||t===R||!1===t)t="";if(x)x(r).css(e,t);else if(/^--/.test(e))r.style.setProperty(e,t);else{e=e.replace(/-(\w)/g,function(e,t){return t.toUpperCase()});var i=r.style[e];r.style[e]=t;t===i||r.style[e]!=i||isNaN(t)||(r.style[e]=t+"px")}})}},I.c.submit={init:function(r,n,e,t,a){if("function"!=typeof n())throw Error("The value for a submit binding must be a function");I.a.B(r,"submit",function(e){var t,i=n();try{t=i.call(a.$data,r)}finally{!0!==t&&(e.preventDefault?e.preventDefault():e.returnValue=!1)}})}},I.c.text={init:function(){return{controlsDescendantBindings:!0}},update:function(e,t){I.a.Bb(e,t())}},I.h.ea.text=!0,function(){if(S&&S.navigator){var e=function(e){if(e)return parseFloat(e[1])},t=S.navigator.userAgent,h,p,m,f,g;(h=S.opera&&S.opera.version&&parseInt(S.opera.version()))||(g=e(t.match(/Edge\/([^ ]+)$/)))||e(t.match(/Chrome\/([^ ]+)/))||(p=e(t.match(/Version\/([^ ]+) Safari/)))||(m=e(t.match(/Firefox\/([^ ]+)/)))||(f=I.a.W||e(t.match(/MSIE ([^ ]+)/)))||(f=e(t.match(/rv:([^ )]+)/)))}if(8<=f&&10>f)var r=I.a.g.Z(),n=I.a.g.Z(),a=function(e){var t=this.activeElement;(t=t&&I.a.g.get(t,n))&&t(e)},_=function(e,t){var i=e.ownerDocument;I.a.g.get(i,r)||(I.a.g.set(i,r,!0),I.a.B(i,"selectionchange",a));I.a.g.set(e,n,t)};I.c.textInput={init:function(i,t,r){function e(e,t){I.a.B(i,e,t)}function n(){var e=I.a.f(t());if(null===e||e===R)e="";c!==R&&e===c?I.a.setTimeout(n,4):i.value!==e&&(d=!0,i.value=e,d=!1,s=i.value)}function a(){l||(c=i.value,l=I.a.setTimeout(o,4))}function o(){clearTimeout(l);c=l=R;var e=i.value;s!==e&&(s=e,I.m.eb(t(),r,"textInput",e))}var s=i.value,l,c,u=9==I.a.W?a:o,d=!1;f&&e("keypress",o);11>f&&e("propertychange",function(e){d||"value"!==e.propertyName||u()});8==f&&(e("keyup",o),e("keydown",o));_&&(_(i,u),e("dragend",a));(!f||9<=f)&&e("input",u);5>p&&"textarea"===I.a.R(i)?(e("keydown",a),e("paste",a),e("cut",a)):11>h?e("keydown",a):4>m?(e("DOMAutoComplete",o),e("dragdrop",o),e("drop",o)):g&&"number"===i.type&&e("keydown",a);e("change",o);e("blur",o);I.o(n,null,{l:i})}};I.m.wa.textInput=!0;I.c.textinput={preprocess:function(e,t,i){i("textInput",e)}}}(),I.c.uniqueName={init:function(e,t){if(t()){var i="ko_unique_"+ ++I.c.uniqueName.rd;I.a.Yc(e,i)}}},I.c.uniqueName.rd=0,I.c.using={init:function(e,t,i,r,n){var a;i.has("as")&&(a={as:i.get("as"),noChildContext:i.get("noChildContext")});t=n.createChildContext(t,a);I.Oa(t,e);return{controlsDescendantBindings:!0}}},I.h.ea.using=!0,I.c.value={init:function(i,r,n){var a=I.a.R(i),e="input"==a;if(!e||"checkbox"!=i.type&&"radio"!=i.type){var t=[],o=n.get("valueUpdate"),s=!1,l=null;o&&("string"==typeof o?t=[o]:t=I.a.wc(o),I.a.Pa(t,"change"));var c=function(){l=null;s=!1;var e=r(),t=I.w.M(i);I.m.eb(e,n,"value",t)};!I.a.W||!e||"text"!=i.type||"off"==i.autocomplete||i.form&&"off"==i.form.autocomplete||-1!=I.a.A(t,"propertychange")||(I.a.B(i,"propertychange",function(){s=!0}),I.a.B(i,"focus",function(){s=!1}),I.a.B(i,"blur",function(){s&&c()}));I.a.D(t,function(e){var t=c;I.a.Ud(e,"after")&&(t=function(){l=I.w.M(i);I.a.setTimeout(c,0)},e=e.substring(5));I.a.B(i,e,t)});var u;u=e&&"file"==i.type?function(){var e=I.a.f(r());null===e||e===R||""===e?i.value="":I.u.G(c)}:function(){var e=I.a.f(r()),t=I.w.M(i);if(null!==l&&e===l)I.a.setTimeout(u,0);else if(e!==t||t===R)"select"===a?(t=n.get("valueAllowUnset"),I.w.cb(i,e,t),t||e===I.w.M(i)||I.u.G(c)):I.w.cb(i,e)};if("select"===a){var d;I.i.subscribe(i,I.i.H,function(){d?n.get("valueAllowUnset")?u():c():(I.a.B(i,"change",c),d=I.o(u,null,{l:i}))},null,{notifyImmediately:!0})}else I.a.B(i,"change",c),I.o(u,null,{l:i})}else I.ib(i,{checkedValue:r})},update:function(){}},I.m.wa.value=!0,I.c.visible={update:function(e,t){var i=I.a.f(t()),r="none"!=e.style.display;i&&!r?e.style.display="":!i&&r&&(e.style.display="none")}},I.c.hidden={update:function(e,t){I.c.visible.update(e,function(){return!I.a.f(t())})}},function(a){I.c[a]={init:function(e,t,i,r,n){return I.c.event.init.call(this,e,function(){var e={};e[a]=t();return e},i,r,n)}}}("click"),I.ca=function(){},I.ca.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource")},I.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock")},I.ca.prototype.makeTemplateSource=function(e,t){if("string"==typeof e){t=t||T;var i=t.getElementById(e);if(!i)throw Error("Cannot find template with ID "+e);return new I.C.F(i)}if(1==e.nodeType||8==e.nodeType)return new I.C.ia(e);throw Error("Unknown template type: "+e)},I.ca.prototype.renderTemplate=function(e,t,i,r){e=this.makeTemplateSource(e,r);return this.renderTemplateSource(e,t,i,r)},I.ca.prototype.isTemplateRewritten=function(e,t){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(e,t).data("isRewritten")},I.ca.prototype.rewriteTemplate=function(e,t,i){e=this.makeTemplateSource(e,i);t=t(e.text());e.text(t);e.data("isRewritten",!0)},I.b("templateEngine",I.ca),I.kc=function(){function o(e,t,i,r){e=I.m.ac(e);for(var n=I.m.Ra,a=0;a<e.length;a++){var o=e[a].key;if(Object.prototype.hasOwnProperty.call(n,o)){var s=n[o];if("function"===typeof s){if(o=s(e[a].value))throw Error(o)}else if(!s)throw Error("This template engine does not support the '"+o+"' binding within its templates")}}i="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+I.m.vb(e,{valueAccessors:!0})+" } })()},'"+i.toLowerCase()+"')";return r.createJavaScriptEvaluatorBlock(i)+t}var t=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,i=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{xd:function(e,t,i){t.isTemplateRewritten(e,i)||t.rewriteTemplate(e,function(e){return I.kc.Ld(e,t)},i)},Ld:function(e,a){return e.replace(t,function(e,t,i,r,n){return o(n,t,i,a)}).replace(i,function(e,t){return o(t,"\x3c!-- ko --\x3e","#comment",a)})},md:function(r,n){return I.aa.Xb(function(e,t){var i=e.nextSibling;i&&i.nodeName.toLowerCase()===n&&I.ib(i,r,t)})}}}(),I.b("__tr_ambtns",I.kc.md),function(){I.C={};I.C.F=function(e){if(this.F=e){var t=I.a.R(e);this.ab="script"===t?1:"textarea"===t?2:"template"==t&&e.content&&11===e.content.nodeType?3:4}};I.C.F.prototype.text=function(){var e=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.F[e];var t=arguments[0];"innerHTML"===e?I.a.fc(this.F,t):this.F[e]=t};var t=I.a.g.Z()+"_";I.C.F.prototype.data=function(e){if(1===arguments.length)return I.a.g.get(this.F,t+e);I.a.g.set(this.F,t+e,arguments[1])};var n=I.a.g.Z();I.C.F.prototype.nodes=function(){var e=this.F;if(0==arguments.length){var t=I.a.g.get(e,n)||{},i=t.lb||(3===this.ab?e.content:4===this.ab?e:R);if(!i||t.jd){var r=this.text();r&&r!==t.bb&&(i=I.a.Md(r,e.ownerDocument),I.a.g.set(e,n,{lb:i,bb:r,jd:!0}))}return i}t=arguments[0];this.ab!==R&&this.text("");I.a.g.set(e,n,{lb:t})};I.C.ia=function(e){this.F=e};I.C.ia.prototype=new I.C.F;I.C.ia.prototype.constructor=I.C.ia;I.C.ia.prototype.text=function(){if(0==arguments.length){var e=I.a.g.get(this.F,n)||{};e.bb===R&&e.lb&&(e.bb=e.lb.innerHTML);return e.bb}I.a.g.set(this.F,n,{bb:arguments[0]})};I.b("templateSources",I.C);I.b("templateSources.domElement",I.C.F);I.b("templateSources.anonymousTemplate",I.C.ia)}(),function(){function r(e,t,i){var r;for(t=I.h.nextSibling(t);e&&(r=e)!==t;)e=I.h.nextSibling(r),i(r,e)}function h(e,t){if(e.length){var n=e[0],a=e[e.length-1],i=n.parentNode,o=I.ga.instance,s=o.preprocessNode;if(s){r(n,a,function(e,t){var i=e.previousSibling,r=s.call(o,e);r&&(e===n&&(n=r[0]||t),e===a&&(a=r[r.length-1]||i))});e.length=0;if(!n)return;n===a?e.push(n):(e.push(n,a),I.a.Ua(e,i))}r(n,a,function(e){1!==e.nodeType&&8!==e.nodeType||I.vc(t,e)});r(n,a,function(e){1!==e.nodeType&&8!==e.nodeType||I.aa.cd(e,[t])});I.a.Ua(e,i)}}function l(e){return e.nodeType?e:0<e.length?e[0]:null}function p(e,t,i,r,n){n=n||{};var a=(e&&l(e)||i||{}).ownerDocument,o=n.templateEngine||c;I.kc.xd(i,o,a);i=o.renderTemplate(i,r,n,a);if("number"!=typeof i.length||0<i.length&&"number"!=typeof i[0].nodeType)throw Error("Template engine must return an array of DOM nodes");a=!1;switch(t){case"replaceChildren":I.h.va(e,i);a=!0;break;case"replaceNode":I.a.Xc(e,i);a=!0;break;case"ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+t)}a&&(h(i,r),n.afterRender&&I.u.G(n.afterRender,null,[i,r[n.as||"$data"]]),"replaceChildren"==t&&I.i.ma(e,I.i.H));return i}function m(e,t,i){return I.O(e)?e():"function"===typeof e?e(t,i):e}var c;I.gc=function(e){if(e!=R&&!(e instanceof I.ca))throw Error("templateEngine must inherit from ko.templateEngine");c=e};I.dc=function(i,r,n,a,o){n=n||{};if((n.templateEngine||c)==R)throw Error("Set a template engine before calling renderTemplate");o=o||"replaceChildren";if(a){var s=l(a);return I.$(function(){var e=r&&r instanceof I.fa?r:new I.fa(r,null,null,null,{exportDependencies:!0}),t=m(i,e.$data,e),e=p(a,o,t,e,n);"replaceNode"==o&&(a=e,s=l(a))},null,{Sa:function(){return!s||!I.a.Sb(s)},l:s&&"replaceNode"==o?s.parentNode:s})}return I.aa.Xb(function(e){I.dc(i,r,n,e,"replaceNode")})};I.Qd=function(r,t,n,a,o){function i(e,t){I.u.G(I.a.ec,null,[a,e,l,n,s,t]);I.i.ma(a,I.i.H)}function s(e,t){h(t,c);n.afterRender&&n.afterRender(t,e);c=null}function l(e,t){c=o.createChildContext(e,{as:u,noChildContext:n.noChildContext,extend:function(e){e.$index=t;u&&(e[u+"Index"]=t)}});var i=m(r,e,c);return p(a,"ignoreTargetNode",i,c,n)}var c,u=n.as,d=!1===n.includeDestroyed||I.options.foreachHidesDestroyed&&!n.includeDestroyed;if(d||n.beforeRemove||!I.Pc(t))return I.$(function(){var e=I.a.f(t)||[];"undefined"==typeof e.length&&(e=[e]);d&&(e=I.a.jb(e,function(e){return e===R||null===e||!I.a.f(e._destroy)}));i(e)},null,{l:a});i(t.v());var e=t.subscribe(function(e){i(t(),e)},null,"arrayChange");e.l(a);return e};var o=I.a.g.Z(),n=I.a.g.Z();I.c.template={init:function(e,t){var i=I.a.f(t());if("string"==typeof i||"name"in i)I.h.Ea(e);else if("nodes"in i){i=i.nodes||[];if(I.O(i))throw Error('The "nodes" option must be a plain, non-observable array.');var r=i[0]&&i[0].parentNode;r&&I.a.g.get(r,n)||(r=I.a.Yb(i),I.a.g.set(r,n,!0));new I.C.ia(e).nodes(r)}else if(i=I.h.childNodes(e),0<i.length)r=I.a.Yb(i),new I.C.ia(e).nodes(r);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:function(e,t,i,r,n){var a=t();t=I.a.f(a);i=!0;r=null;"string"==typeof t?t={}:(a="name"in t?t.name:e,"if"in t&&(i=I.a.f(t["if"])),i&&"ifnot"in t&&(i=!I.a.f(t.ifnot)),i&&!a&&(i=!1));"foreach"in t?r=I.Qd(a,i&&t.foreach||[],t,e,n):i?(i=n,"data"in t&&(i=n.createChildContext(t.data,{as:t.as,noChildContext:t.noChildContext,exportDependencies:!0})),r=I.dc(a,i,t,e)):I.h.Ea(e);n=r;(t=I.a.g.get(e,o))&&"function"==typeof t.s&&t.s();I.a.g.set(e,o,!n||n.ja&&!n.ja()?R:n)}};I.m.Ra.template=function(e){e=I.m.ac(e);return 1==e.length&&e[0].unknown||I.m.Id(e,"name")?null:"This template engine does not support anonymous templates nested within its templates"};I.h.ea.template=!0}(),I.b("setTemplateEngine",I.gc),I.b("renderTemplate",I.dc),I.a.Kc=function(e,t,i){if(e.length&&t.length){var r,n,a,o,s;for(r=n=0;(!i||r<i)&&(o=e[n]);++n){for(a=0;s=t[a];++a)if(o.value===s.value){o.moved=s.index;s.moved=o.index;t.splice(a,1);r=a=0;break}r+=a}}},I.a.Pb=function(){function r(e,t,i,r,n){var a=Math.min,o=Math.max,s=[],l,c=e.length,u,d=t.length,h=d-c||1,p=c+d+1,m,f,g;for(l=0;l<=c;l++)for(f=m,s.push(m=[]),g=a(d,l+h),u=o(0,l-1);u<=g;u++)m[u]=u?l?e[l-1]===t[u-1]?f[u-1]:a(f[u]||p,m[u-1]||p)+1:u+1:l+1;a=[];o=[];h=[];l=c;for(u=d;l||u;)d=s[l][u]-1,u&&d===s[l][u-1]?o.push(a[a.length]={status:i,value:t[--u],index:u}):l&&d===s[l-1][u]?h.push(a[a.length]={status:r,value:e[--l],index:l}):(--u,--l,n.sparse||a.push({status:"retained",value:t[u]}));I.a.Kc(h,o,!n.dontLimitMoves&&10*c);return a.reverse()}return function(e,t,i){i="boolean"===typeof i?{dontLimitMoves:i}:i||{};e=e||[];t=t||[];return e.length<t.length?r(e,t,"added","deleted",i):r(t,e,"deleted","added",i)}}(),I.b("utils.compareArrays",I.a.Pb),function(){function w(t,i,r,n,a){var o=[],e=I.$(function(){var e=i(r,a,I.a.Ua(o,t))||[];0<o.length&&(I.a.Xc(o,e),n&&I.u.G(n,null,[r,e,a]));o.length=0;I.a.Nb(o,e)},null,{l:t,Sa:function(){return!I.a.kd(o)}});return{Y:o,$:e.ja()?e:R}}var D=I.a.g.Z(),M=I.a.g.Z();I.a.ec=function(t,e,i,r,n,a){function o(e){v={Aa:e,pb:I.ta(p++)};d.push(v);u||y.push(v)}function s(e){v=c[e];p!==v.pb.v()&&_.push(v);v.pb(p++);I.a.Ua(v.Y,t);d.push(v)}function l(t,i){if(t)for(var r=0,e=i.length;r<e;r++)I.a.D(i[r].Y,function(e){t(e,r,i[r].Aa)})}e=e||[];"undefined"==typeof e.length&&(e=[e]);r=r||{};var c=I.a.g.get(t,D),u=!c,d=[],h=0,p=0,m=[],f=[],g=[],_=[],y=[],v,C=0;if(u)I.a.D(e,o);else{if(!a||c&&c._countWaitingForRemove){var S=I.a.Mb(c,function(e){return e.Aa});a=I.a.Pb(S,e,{dontLimitMoves:r.dontLimitMoves,sparse:!0})}for(var S=0,T,x,b;T=a[S];S++)switch(x=T.moved,b=T.index,T.status){case"deleted":for(;h<b;)s(h++);x===R&&(v=c[h],v.$&&(v.$.s(),v.$=R),I.a.Ua(v.Y,t).length&&(r.beforeRemove&&(d.push(v),C++,v.Aa===M?v=null:g.push(v)),v&&m.push.apply(m,v.Y)));h++;break;case"added":for(;p<b;)s(h++);x!==R?(f.push(d.length),s(x)):o(T.value)}for(;p<e.length;)s(h++);d._countWaitingForRemove=C}I.a.g.set(t,D,d);l(r.beforeMove,_);I.a.D(m,r.beforeRemove?I.oa:I.removeNode);var E,P,A;try{A=t.ownerDocument.activeElement}catch(e){}if(f.length)for(;(S=f.shift())!=R;){v=d[S];for(E=R;S;)if((P=d[--S].Y)&&P.length){E=P[P.length-1];break}for(e=0;h=v.Y[e];E=h,e++)I.h.Wb(t,h,E)}for(S=0;v=d[S];S++){v.Y||I.a.extend(v,w(t,i,v.Aa,n,v.pb));for(e=0;h=v.Y[e];E=h,e++)I.h.Wb(t,h,E);!v.Ed&&n&&(n(v.Aa,v.Y,v.pb),v.Ed=!0,E=v.Y[v.Y.length-1])}A&&t.ownerDocument.activeElement!=A&&A.focus();l(r.beforeRemove,g);for(S=0;S<g.length;++S)g[S].Aa=M;l(r.afterMove,_);l(r.afterAdd,y)}}(),I.b("utils.setDomNodeChildrenFromArrayMapping",I.a.ec),I.ba=function(){this.allowTemplateRewriting=!1},I.ba.prototype=new I.ca,I.ba.prototype.constructor=I.ba,I.ba.prototype.renderTemplateSource=function(e,t,i,r){if(t=(9>I.a.W?0:e.nodes)?e.nodes():null)return I.a.la(t.cloneNode(!0).childNodes);e=e.text();return I.a.ua(e,r)},I.ba.Ma=new I.ba,I.gc(I.ba.Ma),I.b("nativeTemplateEngine",I.ba),function(){I.$a=function(){var a=this.Hd=function(){if(!x||!x.tmpl)return 0;try{if(0<=x.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(e){}return 1}();this.renderTemplateSource=function(e,t,i,r){r=r||T;i=i||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var n=e.data("precompiled");n||(n=e.text()||"",n=x.template(null,"{{ko_with $item.koBindingContext}}"+n+"{{/ko_with}}"),e.data("precompiled",n));e=[t.$data];t=x.extend({koBindingContext:t},i.templateOptions);t=x.tmpl(n,e,t);t.appendTo(r.createElement("div"));x.fragments={};return t};this.createJavaScriptEvaluatorBlock=function(e){return"{{ko_code ((function() { return "+e+" })()) }}"};this.addTemplate=function(e,t){T.write("<script type='text/html' id='"+e+"'>"+t+"<\/script>")};0<a&&(x.tmpl.tag.ko_code={open:"__.push($1 || '');"},x.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};I.$a.prototype=new I.ca;I.$a.prototype.constructor=I.$a;var e=new I.$a;0<e.Hd&&I.gc(e);I.b("jqueryTmplTemplateEngine",I.$a)}()}(S.ko={})}();var knockout=ko;"undefined"!=typeof window?(ko=window.ko,void 0!==oldValue?window.ko=oldValue:delete window.ko):(ko=global.ko,void 0!==oldValue?global.ko=oldValue:delete global.ko);var OBSERVABLES_PROPERTY="__knockoutObservables",SUBSCRIBABLE_PROPERTY="__knockoutSubscribable";function track(n,e){if(!n)throw new Error("When calling ko.track, you must pass an object as the first parameter.");var a=this,o=getAllObservablesForObject(n,!0);return(e=e||Object.getOwnPropertyNames(n)).forEach(function(e){var t,i,r;e!==OBSERVABLES_PROPERTY&&e!==SUBSCRIBABLE_PROPERTY&&(e in o||(i=(t=n[e])instanceof Array,r=a.isObservable(t)?t:i?a.observableArray(t):a.observable(t),Object.defineProperty(n,e,{configurable:!0,enumerable:!0,get:r,set:a.isWriteableObservable(r)?r:void 0}),o[e]=r,i&¬ifyWhenPresentOrFutureArrayValuesMutate(a,r)))}),n}function getAllObservablesForObject(e,t){var i=e[OBSERVABLES_PROPERTY];return!i&&t&&(i={},Object.defineProperty(e,OBSERVABLES_PROPERTY,{value:i})),i}function defineComputedProperty(e,t,i){var r={owner:e,deferEvaluation:!0};if("function"==typeof i)r.read=i;else{if("value"in i)throw new Error('For ko.defineProperty, you must not specify a "value" for the property. You must provide a "get" function.');if("function"!=typeof i.get)throw new Error('For ko.defineProperty, the third parameter must be either an evaluator function, or an options object containing a function called "get".');r.read=i.get,r.write=i.set}return e[t]=this.computed(r),track.call(this,e,[t]),e}function notifyWhenPresentOrFutureArrayValuesMutate(t,i){var r=null;t.computed(function(){r&&(r.dispose(),r=null);var e=i();e instanceof Array&&(r=startWatchingArrayInstance(t,i,e))})}function startWatchingArrayInstance(e,t,i){return getSubscribableForArray(e,i).subscribe(t)}function getSubscribableForArray(e,t){var i,r=t[SUBSCRIBABLE_PROPERTY];return r||(r=new e.subscribable,Object.defineProperty(t,SUBSCRIBABLE_PROPERTY,{value:r}),wrapStandardArrayMutators(t,r,i={}),addKnockoutArrayMutators(e,t,r,i)),r}function wrapStandardArrayMutators(i,r,n){["pop","push","reverse","shift","sort","splice","unshift"].forEach(function(e){var t=i[e];i[e]=function(){var e=t.apply(this,arguments);return!0!==n.pause&&r.notifySubscribers(this),e}})}function addKnockoutArrayMutators(i,r,n,a){["remove","removeAll","destroy","destroyAll","replace"].forEach(function(t){Object.defineProperty(r,t,{enumerable:!1,value:function(){var e;a.pause=!0;try{e=i.observableArray.fn[t].apply(i.observableArray(r),arguments)}finally{a.pause=!1}return n.notifySubscribers(r),e}})})}function getObservable(e,t){if(!e)return null;var i=getAllObservablesForObject(e,!1);return i&&i[t]||null}function valueHasMutated(e,t){var i=getObservable(e,t);i&&i.valueHasMutated()}function attachToKo(e){e.track=track,e.getObservable=getObservable,e.valueHasMutated=valueHasMutated,e.defineProperty=defineComputedProperty}var knockout_es5={attachToKo:attachToKo},svgNS="http://www.w3.org/2000/svg",svgClassName="cesium-svgPath-svg",SvgPathBindingHandler={register:function(o){o.bindingHandlers.cesiumSvgPath={init:function(e,r){var n=document.createElementNS(svgNS,"svg:svg");n.setAttribute("class",svgClassName);var a=document.createElementNS(svgNS,"path");return n.appendChild(a),o.virtualElements.setDomNodeChildren(e,[n]),o.computed({read:function(){var e=o.unwrap(r());a.setAttribute("d",o.unwrap(e.path));var t=o.unwrap(e.width),i=o.unwrap(e.height);n.setAttribute("width",t),n.setAttribute("height",i),n.setAttribute("viewBox","0 0 "+t+" "+i),e.css&&n.setAttribute("class",svgClassName+" "+o.unwrap(e.css))},disposeWhenNodeIsRemoved:e}),{controlsDescendantBindings:!0}}},o.virtualElements.allowedBindings.cesiumSvgPath=!0}};function quickselect$1(e,t,i,r,n){quickselectStep$1(e,t,i||0,r||e.length-1,n||defaultCompare$1)}function quickselectStep$1(e,t,i,r,n){for(;i<r;){var a,o,s,l,c;600<r-i&&(a=r-i+1,o=t-i+1,s=Math.log(a),l=.5*Math.exp(2*s/3),c=.5*Math.sqrt(s*l*(a-l)/a)*(o-a/2<0?-1:1),quickselectStep$1(e,t,Math.max(i,Math.floor(t-o*l/a+c)),Math.min(r,Math.floor(t+(a-o)*l/a+c)),n));var u=e[t],d=i,h=r;for(swap$3(e,i,t),0<n(e[r],u)&&swap$3(e,i,r);d<h;){for(swap$3(e,d,h),d++,h--;n(e[d],u)<0;)d++;for(;0<n(e[h],u);)h--}0===n(e[i],u)?swap$3(e,i,h):swap$3(e,++h,r),h<=t&&(i=h+1),t<=h&&(r=h-1)}}function swap$3(e,t,i){var r=e[t];e[t]=e[i],e[i]=r}function defaultCompare$1(e,t){return e<t?-1:t<e?1:0}function ClockViewModel(t){defined(t)||(t=new Clock),this._clock=t,this._eventHelper=new EventHelper,this._eventHelper.add(t.onTick,this.synchronize,this),this.systemTime=knockout.observable(JulianDate.now()),this.systemTime.equalityComparer=JulianDate.equals,this.startTime=knockout.observable(t.startTime),this.startTime.equalityComparer=JulianDate.equals,this.startTime.subscribe(function(e){t.startTime=e,this.synchronize()},this),this.stopTime=knockout.observable(t.stopTime),this.stopTime.equalityComparer=JulianDate.equals,this.stopTime.subscribe(function(e){t.stopTime=e,this.synchronize()},this),this.currentTime=knockout.observable(t.currentTime),this.currentTime.equalityComparer=JulianDate.equals,this.currentTime.subscribe(function(e){t.currentTime=e,this.synchronize()},this),this.multiplier=knockout.observable(t.multiplier),this.multiplier.subscribe(function(e){t.multiplier=e,this.synchronize()},this),this.clockStep=knockout.observable(t.clockStep),this.clockStep.subscribe(function(e){t.clockStep=e,this.synchronize()},this),this.clockRange=knockout.observable(t.clockRange),this.clockRange.subscribe(function(e){t.clockRange=e,this.synchronize()},this),this.canAnimate=knockout.observable(t.canAnimate),this.canAnimate.subscribe(function(e){t.canAnimate=e,this.synchronize()},this),this.shouldAnimate=knockout.observable(t.shouldAnimate),this.shouldAnimate.subscribe(function(e){t.shouldAnimate=e,this.synchronize()},this),knockout.track(this,["systemTime","startTime","stopTime","currentTime","multiplier","clockStep","clockRange","canAnimate","shouldAnimate"])}function Command(){this.canExecute=void 0,this.beforeExecute=void 0,this.afterExecute=void 0,DeveloperError.throwInstantiationError()}knockout_es5.attachToKo(knockout),SvgPathBindingHandler.register(knockout),Object.defineProperties(ClockViewModel.prototype,{clock:{get:function(){return this._clock}}}),ClockViewModel.prototype.synchronize=function(){var e=this._clock;this.systemTime=JulianDate.now(),this.startTime=e.startTime,this.stopTime=e.stopTime,this.currentTime=e.currentTime,this.multiplier=e.multiplier,this.clockStep=e.clockStep,this.clockRange=e.clockRange,this.canAnimate=e.canAnimate,this.shouldAnimate=e.shouldAnimate},ClockViewModel.prototype.isDestroyed=function(){return!1},ClockViewModel.prototype.destroy=function(){this._eventHelper.removeAll(),destroyObject(this)};var InspectorShared={};function ToggleButtonViewModel(e,t){this._command=e,t=defaultValue(t,defaultValue.EMPTY_OBJECT),this.toggled=defaultValue(t.toggled,!1),this.tooltip=defaultValue(t.tooltip,""),knockout.track(this,["toggled","tooltip"])}function createCommand$2(i,e){e=defaultValue(e,!0);var r=new Event,n=new Event;function t(){var e,t={args:arguments,cancel:!1};return r.raiseEvent(t),t.cancel||(e=i.apply(null,arguments),n.raiseEvent(e)),e}return t.canExecute=e,knockout.track(t,["canExecute"]),Object.defineProperties(t,{beforeExecute:{value:r},afterExecute:{value:n}}),t}function subscribeAndEvaluate(e,t,i,r,n){return i.call(r,e[t]),knockout.getObservable(e,t).subscribe(i,r,n)}InspectorShared.createCheckbox=function(e,t,i){var r=document.createElement("div"),n=document.createElement("label"),a=document.createElement("input");a.type="checkbox";var o="checked: "+t;return defined(i)&&(o+=", enable: "+i),a.setAttribute("data-bind",o),n.appendChild(a),n.appendChild(document.createTextNode(e)),r.appendChild(n),r},InspectorShared.createSection=function(e,t,i,r){var n=document.createElement("div");n.className="cesium-cesiumInspector-section",n.setAttribute("data-bind",'css: { "cesium-cesiumInspector-section-collapsed": !'+i+" }"),e.appendChild(n);var a=document.createElement("h3");a.className="cesium-cesiumInspector-sectionHeader",a.appendChild(document.createTextNode(t)),a.setAttribute("data-bind","click: "+r),n.appendChild(a);var o=document.createElement("div");return o.className="cesium-cesiumInspector-sectionContent",n.appendChild(o),o},Object.defineProperties(ToggleButtonViewModel.prototype,{command:{get:function(){return this._command}}});var DepthViewPacked="uniform sampler2D u_depthTexture;\nvarying vec2 v_textureCoordinates;\nvoid main()\n{\nfloat z_window = czm_unpackDepth(texture2D(u_depthTexture, v_textureCoordinates));\nz_window = czm_reverseLogDepth(z_window);\nfloat n_range = czm_depthRange.near;\nfloat f_range = czm_depthRange.far;\nfloat z_ndc = (2.0 * z_window - n_range - f_range) / (f_range - n_range);\nfloat scale = pow(z_ndc * 0.5 + 0.5, 8.0);\ngl_FragColor = vec4(mix(vec3(0.0), vec3(1.0), scale), 1.0);\n}\n";function removePipelineExtras(e){return ForEach.shader(e,function(e){removeExtras(e)}),ForEach.buffer(e,function(e){removeExtras(e)}),ForEach.image(e,function(e){removeExtras(e),ForEach.compressedImage(e,function(e){removeExtras(e)})}),removeExtras(e),e}function removeExtras(e){defined(e.extras)&&(defined(e.extras._pipeline)&&delete e.extras._pipeline,0===Object.keys(e.extras).length&&delete e.extras)}var svgNS$1="http://www.w3.org/2000/svg",xlinkNS="http://www.w3.org/1999/xlink",widgetForDrag,gradientEnabledColor0=Color.fromCssColorString("rgba(247,250,255,0.384)"),gradientEnabledColor1=Color.fromCssColorString("rgba(143,191,255,0.216)"),gradientEnabledColor2=Color.fromCssColorString("rgba(153,197,255,0.098)"),gradientEnabledColor3=Color.fromCssColorString("rgba(255,255,255,0.086)"),gradientDisabledColor0=Color.fromCssColorString("rgba(255,255,255,0.267)"),gradientDisabledColor1=Color.fromCssColorString("rgba(255,255,255,0)"),gradientKnobColor=Color.fromCssColorString("rgba(66,67,68,0.3)"),gradientPointerColor=Color.fromCssColorString("rgba(0,0,0,0.5)");function getElementColor(e){return Color.fromCssColorString(window.getComputedStyle(e).getPropertyValue("color"))}var svgIconsById={animation_pathReset:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z"},animation_pathPause:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M13,5.5,7.5,5.5,7.5,25.5,13,25.5zM24.5,5.5,19,5.5,19,25.5,24.5,25.5z"},animation_pathPlay:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M6.684,25.682L24.316,15.5L6.684,5.318V25.682z"},animation_pathPlayReverse:{tagName:"path",transform:"translate(16,16) scale(-0.85,0.85) translate(-16,-16)",d:"M6.684,25.682L24.316,15.5L6.684,5.318V25.682z"},animation_pathLoop:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M24.249,15.499c-0.009,4.832-3.918,8.741-8.75,8.75c-2.515,0-4.768-1.064-6.365-2.763l2.068-1.442l-7.901-3.703l0.744,8.694l2.193-1.529c2.244,2.594,5.562,4.242,9.26,4.242c6.767,0,12.249-5.482,12.249-12.249H24.249zM15.499,6.75c2.516,0,4.769,1.065,6.367,2.764l-2.068,1.443l7.901,3.701l-0.746-8.693l-2.192,1.529c-2.245-2.594-5.562-4.245-9.262-4.245C8.734,3.25,3.25,8.734,3.249,15.499H6.75C6.758,10.668,10.668,6.758,15.499,6.75z"},animation_pathClock:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-15.5)",d:"M15.5,2.374C8.251,2.375,2.376,8.251,2.374,15.5C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374zM15.5,25.623C9.909,25.615,5.385,21.09,5.375,15.5C5.385,9.909,9.909,5.384,15.5,5.374c5.59,0.01,10.115,4.535,10.124,10.125C25.615,21.09,21.091,25.615,15.5,25.623zM8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5zM8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572zM9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696zM22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428zM12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455zM12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545zM22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572zM19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813zM23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5zM15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624zM15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377zM18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z"},animation_pathWingButton:{tagName:"path",d:"m 4.5,0.5 c -2.216,0 -4,1.784 -4,4 l 0,24 c 0,2.216 1.784,4 4,4 l 13.71875,0 C 22.478584,27.272785 27.273681,22.511272 32.5,18.25 l 0,-13.75 c 0,-2.216 -1.784,-4 -4,-4 l -24,0 z"},animation_pathPointer:{tagName:"path",d:"M-15,-65,-15,-55,15,-55,15,-65,0,-95z"},animation_pathSwooshFX:{tagName:"path",d:"m 85,0 c 0,16.617 -4.813944,35.356 -13.131081,48.4508 h 6.099803 c 8.317138,-13.0948 13.13322,-28.5955 13.13322,-45.2124 0,-46.94483 -38.402714,-85.00262 -85.7743869,-85.00262 -1.0218522,0 -2.0373001,0.0241 -3.0506131,0.0589 45.958443,1.59437 82.723058,35.77285 82.723058,81.70532 z"}};function svgFromObject(e){var t=document.createElementNS(svgNS$1,e.tagName);for(var i in e)if(e.hasOwnProperty(i)&&"tagName"!==i)if("children"===i)for(var r=e.children.length,n=0;n<r;++n)t.appendChild(svgFromObject(e.children[n]));else 0===i.indexOf("xlink:")?t.setAttributeNS(xlinkNS,i.substring(6),e[i]):"textContent"===i?t.textContent=e[i]:t.setAttribute(i,e[i]);return t}function svgText(e,t,i){var r=document.createElementNS(svgNS$1,"text");r.setAttribute("x",e),r.setAttribute("y",t),r.setAttribute("class","cesium-animation-svgText");var n=document.createElementNS(svgNS$1,"tspan");return n.textContent=i,r.appendChild(n),r}function setShuttleRingPointer(e,t,i){e.setAttribute("transform","translate(100,100) rotate("+i+")"),t.setAttribute("transform","rotate("+i+")")}var makeColorStringScratch=new Color;function makeColorString(e,t){var i=t.alpha,r=1-i;return makeColorStringScratch.red=e.red*r+t.red*i,makeColorStringScratch.green=e.green*r+t.green*i,makeColorStringScratch.blue=e.blue*r+t.blue*i,makeColorStringScratch.toCssColorString()}function rectButton(e,t,i){var r=svgIconsById[i];return svgFromObject({tagName:"g",class:"cesium-animation-rectButton",transform:"translate("+e+","+t+")",children:[{tagName:"rect",class:"cesium-animation-buttonGlow",width:32,height:32,rx:2,ry:2},{tagName:"rect",class:"cesium-animation-buttonMain",width:32,height:32,rx:4,ry:4},{class:"cesium-animation-buttonPath",id:i,tagName:r.tagName,transform:r.transform,d:r.d},{tagName:"title",textContent:""}]})}function wingButton(e,t,i){var r=svgIconsById[i],n=svgIconsById.animation_pathWingButton;return svgFromObject({tagName:"g",class:"cesium-animation-rectButton",transform:"translate("+e+","+t+")",children:[{class:"cesium-animation-buttonGlow",id:"animation_pathWingButton",tagName:n.tagName,d:n.d},{class:"cesium-animation-buttonMain",id:"animation_pathWingButton",tagName:n.tagName,d:n.d},{class:"cesium-animation-buttonPath",id:i,tagName:r.tagName,transform:r.transform,d:r.d},{tagName:"title",textContent:""}]})}function setShuttleRingFromMouseOrTouch(e,t){var i=e._viewModel,r=i.shuttleRingDragging;if(!r||widgetForDrag===e)if("mousedown"===t.type||r&&"mousemove"===t.type||"touchstart"===t.type&&1===t.touches.length||r&&"touchmove"===t.type&&1===t.touches.length){var n,a=e._centerX,o=e._centerY,s=e._svgNode.getBoundingClientRect(),l="touchstart"===t.type||"touchmove"===t.type?(n=t.touches[0].clientX,t.touches[0].clientY):(n=t.clientX,t.clientY);if(!r&&(n>s.right||n<s.left||l<s.top||l>s.bottom))return;var c=e._shuttleRingPointer.getBoundingClientRect(),u=n-a-s.left,d=l-o-s.top,h=180*Math.atan2(d,u)/Math.PI+90;180<h&&(h-=360);var p=i.shuttleRingAngle;r||n<c.right&&n>c.left&&l>c.top&&l<c.bottom?(widgetForDrag=e,i.shuttleRingDragging=!0,i.shuttleRingAngle=h):h<p?i.slower():p<h&&i.faster(),t.preventDefault()}else e===widgetForDrag&&(widgetForDrag=void 0),i.shuttleRingDragging=!1}function SvgButton(e,t){this._viewModel=t,this.svgElement=e,this._enabled=void 0,this._toggled=void 0;var i=this;this._clickFunction=function(){var e=i._viewModel.command;e.canExecute&&e()},e.addEventListener("click",this._clickFunction,!0),this._subscriptions=[subscribeAndEvaluate(t,"toggled",this.setToggled,this),subscribeAndEvaluate(t,"tooltip",this.setTooltip,this),subscribeAndEvaluate(t.command,"canExecute",this.setEnabled,this)]}function Animation(e,t){e=getElement(e),this._viewModel=t,this._container=e,this._centerX=0,this._centerY=0,this._defsElement=void 0,this._svgNode=void 0,this._topG=void 0,this._lastHeight=void 0,this._lastWidth=void 0;var i=e.ownerDocument,r=document.createElement("style");r.textContent=".cesium-animation-rectButton .cesium-animation-buttonGlow { filter: url(#animation_blurred); }.cesium-animation-rectButton .cesium-animation-buttonMain { fill: url(#animation_buttonNormal); }.cesium-animation-buttonToggled .cesium-animation-buttonMain { fill: url(#animation_buttonToggled); }.cesium-animation-rectButton:hover .cesium-animation-buttonMain { fill: url(#animation_buttonHovered); }.cesium-animation-buttonDisabled .cesium-animation-buttonMain { fill: url(#animation_buttonDisabled); }.cesium-animation-shuttleRingG .cesium-animation-shuttleRingSwoosh { fill: url(#animation_shuttleRingSwooshGradient); }.cesium-animation-shuttleRingG:hover .cesium-animation-shuttleRingSwoosh { fill: url(#animation_shuttleRingSwooshHovered); }.cesium-animation-shuttleRingPointer { fill: url(#animation_shuttleRingPointerGradient); }.cesium-animation-shuttleRingPausePointer { fill: url(#animation_shuttleRingPointerPaused); }.cesium-animation-knobOuter { fill: url(#animation_knobOuter); }.cesium-animation-knobInner { fill: url(#animation_knobInner); }",i.head.insertBefore(r,i.head.childNodes[0]);var n=document.createElement("div");n.className="cesium-animation-theme",n.innerHTML='<div class="cesium-animation-themeNormal"></div><div class="cesium-animation-themeHover"></div><div class="cesium-animation-themeSelect"></div><div class="cesium-animation-themeDisabled"></div><div class="cesium-animation-themeKnob"></div><div class="cesium-animation-themePointer"></div><div class="cesium-animation-themeSwoosh"></div><div class="cesium-animation-themeSwooshHover"></div>',this._theme=n,this._themeNormal=n.childNodes[0],this._themeHover=n.childNodes[1],this._themeSelect=n.childNodes[2],this._themeDisabled=n.childNodes[3],this._themeKnob=n.childNodes[4],this._themePointer=n.childNodes[5],this._themeSwoosh=n.childNodes[6],this._themeSwooshHover=n.childNodes[7];var a=document.createElementNS(svgNS$1,"svg:svg");(this._svgNode=a).setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink",xlinkNS);var o=document.createElementNS(svgNS$1,"g");this._topG=o,this._realtimeSVG=new SvgButton(wingButton(3,4,"animation_pathClock"),t.playRealtimeViewModel),this._playReverseSVG=new SvgButton(rectButton(44,99,"animation_pathPlayReverse"),t.playReverseViewModel),this._playForwardSVG=new SvgButton(rectButton(124,99,"animation_pathPlay"),t.playForwardViewModel),this._pauseSVG=new SvgButton(rectButton(84,99,"animation_pathPause"),t.pauseViewModel);var s=document.createElementNS(svgNS$1,"g");s.appendChild(this._realtimeSVG.svgElement),s.appendChild(this._playReverseSVG.svgElement),s.appendChild(this._playForwardSVG.svgElement),s.appendChild(this._pauseSVG.svgElement);var l=svgFromObject({tagName:"circle",class:"cesium-animation-shuttleRingBack",cx:100,cy:100,r:99});this._shuttleRingBackPanel=l;var c=svgIconsById.animation_pathSwooshFX,u=svgIconsById.animation_pathPointer,d=svgFromObject({tagName:"g",class:"cesium-animation-shuttleRingSwoosh",children:[{tagName:c.tagName,transform:"translate(100,97) scale(-1,1)",id:"animation_pathSwooshFX",d:c.d},{tagName:c.tagName,transform:"translate(100,97)",id:"animation_pathSwooshFX",d:c.d},{tagName:"line",x1:100,y1:8,x2:100,y2:22}]});this._shuttleRingSwooshG=d,this._shuttleRingPointer=svgFromObject({class:"cesium-animation-shuttleRingPointer",id:"animation_pathPointer",tagName:u.tagName,d:u.d});var h=svgFromObject({tagName:"g",transform:"translate(100,100)"});this._knobOuter=svgFromObject({tagName:"circle",class:"cesium-animation-knobOuter",cx:0,cy:0,r:71});var p=svgFromObject({tagName:"circle",class:"cesium-animation-knobInner",cx:0,cy:0,r:61});this._knobDate=svgText(0,-24,""),this._knobTime=svgText(0,-7,""),this._knobStatus=svgText(0,-41,"");var m=svgFromObject({tagName:"circle",class:"cesium-animation-blank",cx:0,cy:0,r:61}),f=document.createElementNS(svgNS$1,"g");f.setAttribute("class","cesium-animation-shuttleRingG"),e.appendChild(n),o.appendChild(f),o.appendChild(h),o.appendChild(s),f.appendChild(l),f.appendChild(d),f.appendChild(this._shuttleRingPointer),h.appendChild(this._knobOuter),h.appendChild(p),h.appendChild(this._knobDate),h.appendChild(this._knobTime),h.appendChild(this._knobStatus),h.appendChild(m),a.appendChild(o),e.appendChild(a);var g=this;function _(e){setShuttleRingFromMouseOrTouch(g,e)}this._mouseCallback=_,l.addEventListener("mousedown",_,!0),l.addEventListener("touchstart",_,!0),d.addEventListener("mousedown",_,!0),d.addEventListener("touchstart",_,!0),i.addEventListener("mousemove",_,!0),i.addEventListener("touchmove",_,!0),i.addEventListener("mouseup",_,!0),i.addEventListener("touchend",_,!0),i.addEventListener("touchcancel",_,!0),this._shuttleRingPointer.addEventListener("mousedown",_,!0),this._shuttleRingPointer.addEventListener("touchstart",_,!0),this._knobOuter.addEventListener("mousedown",_,!0),this._knobOuter.addEventListener("touchstart",_,!0);var y,v=this._knobTime.childNodes[0],C=this._knobDate.childNodes[0],S=this._knobStatus.childNodes[0];this._subscriptions=[subscribeAndEvaluate(t.pauseViewModel,"toggled",function(e){y!==e&&((y=e)?g._shuttleRingPointer.setAttribute("class","cesium-animation-shuttleRingPausePointer"):g._shuttleRingPointer.setAttribute("class","cesium-animation-shuttleRingPointer"))}),subscribeAndEvaluate(t,"shuttleRingAngle",function(e){setShuttleRingPointer(g._shuttleRingPointer,g._knobOuter,e)}),subscribeAndEvaluate(t,"dateLabel",function(e){C.textContent!==e&&(C.textContent=e)}),subscribeAndEvaluate(t,"timeLabel",function(e){v.textContent!==e&&(v.textContent=e)}),subscribeAndEvaluate(t,"multiplierLabel",function(e){S.textContent!==e&&(S.textContent=e)})],this.applyThemeChanges(),this.resize()}SvgButton.prototype.destroy=function(){this.svgElement.removeEventListener("click",this._clickFunction,!0);for(var e=this._subscriptions,t=0,i=e.length;t<i;t++)e[t].dispose();destroyObject(this)},SvgButton.prototype.isDestroyed=function(){return!1},SvgButton.prototype.setEnabled=function(e){if(this._enabled!==e){if(!(this._enabled=e))return void this.svgElement.setAttribute("class","cesium-animation-buttonDisabled");if(this._toggled)return void this.svgElement.setAttribute("class","cesium-animation-rectButton cesium-animation-buttonToggled");this.svgElement.setAttribute("class","cesium-animation-rectButton")}},SvgButton.prototype.setToggled=function(e){this._toggled!==e&&(this._toggled=e,this._enabled&&(e?this.svgElement.setAttribute("class","cesium-animation-rectButton cesium-animation-buttonToggled"):this.svgElement.setAttribute("class","cesium-animation-rectButton")))},SvgButton.prototype.setTooltip=function(e){this.svgElement.getElementsByTagName("title")[0].textContent=e},Object.defineProperties(Animation.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),Animation.prototype.isDestroyed=function(){return!1},Animation.prototype.destroy=function(){defined(this._observer)&&(this._observer.disconnect(),this._observer=void 0);var e=this._container.ownerDocument,t=this._mouseCallback;this._shuttleRingBackPanel.removeEventListener("mousedown",t,!0),this._shuttleRingBackPanel.removeEventListener("touchstart",t,!0),this._shuttleRingSwooshG.removeEventListener("mousedown",t,!0),this._shuttleRingSwooshG.removeEventListener("touchstart",t,!0),e.removeEventListener("mousemove",t,!0),e.removeEventListener("touchmove",t,!0),e.removeEventListener("mouseup",t,!0),e.removeEventListener("touchend",t,!0),e.removeEventListener("touchcancel",t,!0),this._shuttleRingPointer.removeEventListener("mousedown",t,!0),this._shuttleRingPointer.removeEventListener("touchstart",t,!0),this._knobOuter.removeEventListener("mousedown",t,!0),this._knobOuter.removeEventListener("touchstart",t,!0),this._container.removeChild(this._svgNode),this._container.removeChild(this._theme),this._realtimeSVG.destroy(),this._playReverseSVG.destroy(),this._playForwardSVG.destroy(),this._pauseSVG.destroy();for(var i=this._subscriptions,r=0,n=i.length;r<n;r++)i[r].dispose();return destroyObject(this)},Animation.prototype.resize=function(){var e,t,i,r,n,a=this._container.clientWidth,o=this._container.clientHeight;a===this._lastWidth&&o===this._lastHeight||(i=o,0===(t=a)&&0===o?(t=200,i=132):0===a?t=(i=o)/132*200:0===o&&(i=(t=a)/200*132),r=t/200,n=i/132,(e=this._svgNode).style.cssText="width: "+t+"px; height: "+i+"px; position: absolute; bottom: 0; left: 0; overflow: hidden;",e.setAttribute("width",t),e.setAttribute("height",i),e.setAttribute("viewBox","0 0 "+t+" "+i),this._topG.setAttribute("transform","scale("+r+","+n+")"),this._centerX=Math.max(1,100*r),this._centerY=Math.max(1,100*n),this._lastHeight=a,this._lastWidth=o)},Animation.prototype.applyThemeChanges=function(){var e=this._container.ownerDocument;if(!e.body.contains(this._container)){if(defined(this._observer))return;var t=this;return t._observer=new MutationObserver(function(){e.body.contains(t._container)&&(t._observer.disconnect(),t._observer=void 0,t.applyThemeChanges())}),void t._observer.observe(e,{childList:!0,subtree:!0})}var i=getElementColor(this._themeNormal),r=getElementColor(this._themeHover),n=getElementColor(this._themeSelect),a=getElementColor(this._themeDisabled),o=getElementColor(this._themeKnob),s=getElementColor(this._themePointer),l=getElementColor(this._themeSwoosh),c=getElementColor(this._themeSwooshHover),u=svgFromObject({tagName:"defs",children:[{id:"animation_buttonNormal",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":makeColorString(i,gradientEnabledColor0)},{tagName:"stop",offset:"12%","stop-color":makeColorString(i,gradientEnabledColor1)},{tagName:"stop",offset:"46%","stop-color":makeColorString(i,gradientEnabledColor2)},{tagName:"stop",offset:"81%","stop-color":makeColorString(i,gradientEnabledColor3)}]},{id:"animation_buttonHovered",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":makeColorString(r,gradientEnabledColor0)},{tagName:"stop",offset:"12%","stop-color":makeColorString(r,gradientEnabledColor1)},{tagName:"stop",offset:"46%","stop-color":makeColorString(r,gradientEnabledColor2)},{tagName:"stop",offset:"81%","stop-color":makeColorString(r,gradientEnabledColor3)}]},{id:"animation_buttonToggled",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":makeColorString(n,gradientEnabledColor0)},{tagName:"stop",offset:"12%","stop-color":makeColorString(n,gradientEnabledColor1)},{tagName:"stop",offset:"46%","stop-color":makeColorString(n,gradientEnabledColor2)},{tagName:"stop",offset:"81%","stop-color":makeColorString(n,gradientEnabledColor3)}]},{id:"animation_buttonDisabled",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":makeColorString(a,gradientDisabledColor0)},{tagName:"stop",offset:"75%","stop-color":makeColorString(a,gradientDisabledColor1)}]},{id:"animation_blurred",tagName:"filter",width:"200%",height:"200%",x:"-50%",y:"-50%",children:[{tagName:"feGaussianBlur",stdDeviation:4,in:"SourceGraphic"}]},{id:"animation_shuttleRingSwooshGradient",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-opacity":.2,"stop-color":l.toCssColorString()},{tagName:"stop",offset:"85%","stop-opacity":.85,"stop-color":l.toCssColorString()},{tagName:"stop",offset:"95%","stop-opacity":.05,"stop-color":l.toCssColorString()}]},{id:"animation_shuttleRingSwooshHovered",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-opacity":.2,"stop-color":c.toCssColorString()},{tagName:"stop",offset:"85%","stop-opacity":.85,"stop-color":c.toCssColorString()},{tagName:"stop",offset:"95%","stop-opacity":.05,"stop-color":c.toCssColorString()}]},{id:"animation_shuttleRingPointerGradient",tagName:"linearGradient",x1:"0%",y1:"50%",x2:"100%",y2:"50%",children:[{tagName:"stop",offset:"0%","stop-color":s.toCssColorString()},{tagName:"stop",offset:"40%","stop-color":s.toCssColorString()},{tagName:"stop",offset:"60%","stop-color":makeColorString(s,gradientPointerColor)},{tagName:"stop",offset:"100%","stop-color":makeColorString(s,gradientPointerColor)}]},{id:"animation_shuttleRingPointerPaused",tagName:"linearGradient",x1:"0%",y1:"50%",x2:"100%",y2:"50%",children:[{tagName:"stop",offset:"0%","stop-color":"#CCC"},{tagName:"stop",offset:"40%","stop-color":"#CCC"},{tagName:"stop",offset:"60%","stop-color":"#555"},{tagName:"stop",offset:"100%","stop-color":"#555"}]},{id:"animation_knobOuter",tagName:"linearGradient",x1:"20%",y1:"0%",x2:"90%",y2:"100%",children:[{tagName:"stop",offset:"5%","stop-color":makeColorString(o,gradientEnabledColor0)},{tagName:"stop",offset:"60%","stop-color":makeColorString(o,gradientKnobColor)},{tagName:"stop",offset:"85%","stop-color":makeColorString(o,gradientEnabledColor1)}]},{id:"animation_knobInner",tagName:"linearGradient",x1:"20%",y1:"0%",x2:"90%",y2:"100%",children:[{tagName:"stop",offset:"5%","stop-color":makeColorString(o,gradientKnobColor)},{tagName:"stop",offset:"60%","stop-color":makeColorString(o,gradientEnabledColor0)},{tagName:"stop",offset:"85%","stop-color":makeColorString(o,gradientEnabledColor3)}]}]});defined(this._defsElement)?this._svgNode.replaceChild(u,this._defsElement):this._svgNode.appendChild(u),this._defsElement=u};var monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],realtimeShuttleRingAngle=15,maxShuttleRingAngle=105;function numberComparator(e,t){return e-t}function getTypicalMultiplierIndex(e,t){var i=binarySearch(t,e,numberComparator);return i<0?~i:i}function angleToMultiplier(e,t){if(Math.abs(e)<=realtimeShuttleRingAngle)return e/realtimeShuttleRingAngle;var i,r=realtimeShuttleRingAngle,n=maxShuttleRingAngle;return 0<e?(i=Math.log(t[t.length-1])/(n-r),Math.exp(0+i*(e-r))):(i=Math.log(-t[0])/(n-r),-Math.exp(0+i*(Math.abs(e)-r)))}function multiplierToAngle(e,t,i){if(i.clockStep===ClockStep$1.SYSTEM_CLOCK)return realtimeShuttleRingAngle;if(Math.abs(e)<=1)return e*realtimeShuttleRingAngle;var r=t[t.length-1];r<e?e=r:e<-r&&(e=-r);var n,a=realtimeShuttleRingAngle,o=maxShuttleRingAngle;return 0<e?(n=Math.log(r)/(o-a),Math.log(e)/n+a):(n=Math.log(-t[0])/(o-a),-(Math.log(Math.abs(e))/n+a))}function AnimationViewModel(e){var s=this;this._clockViewModel=e,this._allShuttleRingTicks=[],this._dateFormatter=AnimationViewModel.defaultDateFormatter,this._timeFormatter=AnimationViewModel.defaultTimeFormatter,this.shuttleRingDragging=!1,this.snapToTicks=!1,knockout.track(this,["_allShuttleRingTicks","_dateFormatter","_timeFormatter","shuttleRingDragging","snapToTicks"]),this._sortedFilteredPositiveTicks=[],this.setShuttleRingTicks(AnimationViewModel.defaultTicks),this.timeLabel=void 0,knockout.defineProperty(this,"timeLabel",function(){return s._timeFormatter(s._clockViewModel.currentTime,s)}),this.dateLabel=void 0,knockout.defineProperty(this,"dateLabel",function(){return s._dateFormatter(s._clockViewModel.currentTime,s)}),this.multiplierLabel=void 0,knockout.defineProperty(this,"multiplierLabel",function(){var e=s._clockViewModel;if(e.clockStep===ClockStep$1.SYSTEM_CLOCK)return"Today";var t=e.multiplier;return t%1==0?t.toFixed(0)+"x":t.toFixed(3).replace(/0{0,3}$/,"")+"x"}),this.shuttleRingAngle=void 0,knockout.defineProperty(this,"shuttleRingAngle",{get:function(){return multiplierToAngle(e.multiplier,s._allShuttleRingTicks,e)},set:function(e){e=Math.max(Math.min(e,maxShuttleRingAngle),-maxShuttleRingAngle);var t,i,r,n,a=s._allShuttleRingTicks,o=s._clockViewModel;o.clockStep=ClockStep$1.SYSTEM_CLOCK_MULTIPLIER,Math.abs(e)!==maxShuttleRingAngle?(n=angleToMultiplier(e,a),s.snapToTicks?n=a[getTypicalMultiplierIndex(n,a)]:0!==n&&(100<(t=Math.abs(n))?(i=t.toFixed(0).length-2,r=Math.pow(10,i),n=Math.round(n/r)*r|0):realtimeShuttleRingAngle<t?n=Math.round(n):1<t?n=+n.toFixed(1):0<t&&(n=+n.toFixed(2))),o.multiplier=n):o.multiplier=0<e?a[a.length-1]:a[0]}}),this._canAnimate=void 0,knockout.defineProperty(this,"_canAnimate",function(){var e=s._clockViewModel,t=e.clockRange;if(s.shuttleRingDragging||t===ClockRange$1.UNBOUNDED)return!0;var i,r=e.multiplier,n=e.currentTime,a=e.startTime,o=!1;return(o=t===ClockRange$1.LOOP_STOP?JulianDate.greaterThan(n,a)||n.equals(a)&&0<r:(i=e.stopTime,JulianDate.greaterThan(n,a)&&JulianDate.lessThan(n,i)||n.equals(a)&&0<r||n.equals(i)&&r<0))||(e.shouldAnimate=!1),o}),this._isSystemTimeAvailable=void 0,knockout.defineProperty(this,"_isSystemTimeAvailable",function(){var e=s._clockViewModel;if(e.clockRange===ClockRange$1.UNBOUNDED)return!0;var t=e.systemTime;return JulianDate.greaterThanOrEquals(t,e.startTime)&&JulianDate.lessThanOrEquals(t,e.stopTime)}),this._isAnimating=void 0,knockout.defineProperty(this,"_isAnimating",function(){return s._clockViewModel.shouldAnimate&&(s._canAnimate||s.shuttleRingDragging)});var t=createCommand$2(function(){var e=s._clockViewModel;e.shouldAnimate?e.shouldAnimate=!1:s._canAnimate&&(e.shouldAnimate=!0)});this._pauseViewModel=new ToggleButtonViewModel(t,{toggled:knockout.computed(function(){return!s._isAnimating}),tooltip:"Pause"});var i=createCommand$2(function(){var e=s._clockViewModel,t=e.multiplier;0<t&&(e.multiplier=-t),e.shouldAnimate=!0});this._playReverseViewModel=new ToggleButtonViewModel(i,{toggled:knockout.computed(function(){return s._isAnimating&&e.multiplier<0}),tooltip:"Play Reverse"});var r=createCommand$2(function(){var e=s._clockViewModel,t=e.multiplier;t<0&&(e.multiplier=-t),e.shouldAnimate=!0});this._playForwardViewModel=new ToggleButtonViewModel(r,{toggled:knockout.computed(function(){return s._isAnimating&&0<e.multiplier&&e.clockStep!==ClockStep$1.SYSTEM_CLOCK}),tooltip:"Play Forward"});var n=createCommand$2(function(){s._clockViewModel.clockStep=ClockStep$1.SYSTEM_CLOCK},knockout.getObservable(this,"_isSystemTimeAvailable"));this._playRealtimeViewModel=new ToggleButtonViewModel(n,{toggled:knockout.computed(function(){return e.clockStep===ClockStep$1.SYSTEM_CLOCK}),tooltip:knockout.computed(function(){return s._isSystemTimeAvailable?"Today (real-time)":"Current time not in range"})}),this._slower=createCommand$2(function(){var e=s._clockViewModel,t=s._allShuttleRingTicks,i=getTypicalMultiplierIndex(e.multiplier,t)-1;0<=i&&(e.multiplier=t[i])}),this._faster=createCommand$2(function(){var e=s._clockViewModel,t=s._allShuttleRingTicks,i=getTypicalMultiplierIndex(e.multiplier,t)+1;i<t.length&&(e.multiplier=t[i])})}function BaseLayerPickerViewModel(e){var t=(e=defaultValue(e,defaultValue.EMPTY_OBJECT)).globe,i=defaultValue(e.imageryProviderViewModels,[]),r=defaultValue(e.terrainProviderViewModels,[]);this._globe=t,this.imageryProviderViewModels=i.slice(0),this.terrainProviderViewModels=r.slice(0),this.dropDownVisible=!1,knockout.track(this,["imageryProviderViewModels","terrainProviderViewModels","dropDownVisible"]);var l=knockout.getObservable(this,"imageryProviderViewModels"),n=knockout.pureComputed(function(){for(var e=l(),t={},i=0;i<e.length;i++){var r=e[i],n=r.category;defined(t[n])?t[n].push(r):t[n]=[r]}var a=Object.keys(t),o=[];for(i=0;i<a.length;i++){var s=a[i];o.push({name:s,providers:t[s]})}return o});this._imageryProviders=n;var c=knockout.getObservable(this,"terrainProviderViewModels"),a=knockout.pureComputed(function(){for(var e=c(),t={},i=0;i<e.length;i++){var r=e[i],n=r.category;defined(t[n])?t[n].push(r):t[n]=[r]}var a=Object.keys(t),o=[];for(i=0;i<a.length;i++){var s=a[i];o.push({name:s,providers:t[s]})}return o});this._terrainProviders=a,this.buttonTooltip=void 0,knockout.defineProperty(this,"buttonTooltip",function(){var e=this.selectedImagery,t=this.selectedTerrain,i=defined(e)?e.name:void 0,r=defined(t)?t.name:void 0;return defined(i)&&defined(r)?i+"\n"+r:defined(i)?i:r}),this.buttonImageUrl=void 0,knockout.defineProperty(this,"buttonImageUrl",function(){var e=this.selectedImagery;if(defined(e))return e.iconUrl}),this.selectedImagery=void 0;var d=knockout.observable();this._currentImageryProviders=[],knockout.defineProperty(this,"selectedImagery",{get:function(){return d()},set:function(e){if(d()!==e){var t=this._currentImageryProviders,i=t.length,r=this._globe.imageryLayers,n=!1;for(u=0;u<i;u++)for(var a=r.length,o=0;o<a;o++){var s=r.get(o);if(s.imageryProvider===t[u]){r.remove(s),n=!0;break}}if(defined(e)){var l,c=e.creationCommand();if(Array.isArray(c)){for(var u=c.length-1;0<=u;u--)r.addImageryProvider(c[u],0);this._currentImageryProviders=c.slice(0)}else{this._currentImageryProviders=[c],n||defined(l=r.get(0))&&r.remove(l),r.addImageryProvider(c,0)}}d(e),this.dropDownVisible=!1}else this.dropDownVisible=!1}}),this.selectedTerrain=void 0;var o=knockout.observable();knockout.defineProperty(this,"selectedTerrain",{get:function(){return o()},set:function(e){var t;o()!==e&&(defined(e)&&(t=e.creationCommand()),this._globe.depthTestAgainstTerrain=!(t instanceof EllipsoidTerrainProvider),this._globe.terrainProvider=t,o(e)),this.dropDownVisible=!1}});var s=this;this._toggleDropDown=createCommand$2(function(){s.dropDownVisible=!s.dropDownVisible}),this.selectedImagery=defaultValue(e.selectedImageryProviderViewModel,i[0]),this.selectedTerrain=defaultValue(e.selectedTerrainProviderViewModel,r[0])}function BaseLayerPicker(e,t){e=getElement(e);var i=new BaseLayerPickerViewModel(t),r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button",r.setAttribute("data-bind","attr: { title: buttonTooltip },click: toggleDropDown"),e.appendChild(r);var n=document.createElement("img");n.setAttribute("draggable","false"),n.className="cesium-baseLayerPicker-selected",n.setAttribute("data-bind","attr: { src: buttonImageUrl }, visible: !!buttonImageUrl"),r.appendChild(n);var a=document.createElement("div");a.className="cesium-baseLayerPicker-dropDown",a.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-dropDown-visible" : dropDownVisible }'),e.appendChild(a);var o=document.createElement("div");o.className="cesium-baseLayerPicker-sectionTitle",o.setAttribute("data-bind","visible: imageryProviderViewModels.length > 0"),o.innerHTML="Imagery",a.appendChild(o);var s=document.createElement("div");s.className="cesium-baseLayerPicker-section",s.setAttribute("data-bind","foreach: _imageryProviders"),a.appendChild(s);var l=document.createElement("div");l.className="cesium-baseLayerPicker-category",s.appendChild(l);var c=document.createElement("div");c.className="cesium-baseLayerPicker-categoryTitle",c.setAttribute("data-bind","text: name"),l.appendChild(c);var u=document.createElement("div");u.className="cesium-baseLayerPicker-choices",u.setAttribute("data-bind","foreach: providers"),l.appendChild(u);var d=document.createElement("div");d.className="cesium-baseLayerPicker-item",d.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-selectedItem" : $data === $parents[1].selectedImagery },attr: { title: tooltip },visible: creationCommand.canExecute,click: function($data) { $parents[1].selectedImagery = $data; }'),u.appendChild(d);var h=document.createElement("img");h.className="cesium-baseLayerPicker-itemIcon",h.setAttribute("data-bind","attr: { src: iconUrl }"),h.setAttribute("draggable","false"),d.appendChild(h);var p=document.createElement("div");p.className="cesium-baseLayerPicker-itemLabel",p.setAttribute("data-bind","text: name"),d.appendChild(p);var m=document.createElement("div");m.className="cesium-baseLayerPicker-sectionTitle",m.setAttribute("data-bind","visible: terrainProviderViewModels.length > 0"),m.innerHTML="Terrain",a.appendChild(m);var f=document.createElement("div");f.className="cesium-baseLayerPicker-section",f.setAttribute("data-bind","foreach: _terrainProviders"),a.appendChild(f);var g=document.createElement("div");g.className="cesium-baseLayerPicker-category",f.appendChild(g);var _=document.createElement("div");_.className="cesium-baseLayerPicker-categoryTitle",_.setAttribute("data-bind","text: name"),g.appendChild(_);var y=document.createElement("div");y.className="cesium-baseLayerPicker-choices",y.setAttribute("data-bind","foreach: providers"),g.appendChild(y);var v=document.createElement("div");v.className="cesium-baseLayerPicker-item",v.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-selectedItem" : $data === $parents[1].selectedTerrain },attr: { title: tooltip },visible: creationCommand.canExecute,click: function($data) { $parents[1].selectedTerrain = $data; }'),y.appendChild(v);var C=document.createElement("img");C.className="cesium-baseLayerPicker-itemIcon",C.setAttribute("data-bind","attr: { src: iconUrl }"),C.setAttribute("draggable","false"),v.appendChild(C);var S=document.createElement("div");S.className="cesium-baseLayerPicker-itemLabel",S.setAttribute("data-bind","text: name"),v.appendChild(S),knockout.applyBindings(i,r),knockout.applyBindings(i,a),this._viewModel=i,this._container=e,this._element=r,this._dropPanel=a,this._closeDropDown=function(e){r.contains(e.target)||a.contains(e.target)||(i.dropDownVisible=!1)},FeatureDetection.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}function ProviderViewModel(e){var t=e.creationFunction;defined(t.canExecute)||(t=createCommand$2(t)),this._creationCommand=t,this.name=e.name,this.tooltip=e.tooltip,this.iconUrl=e.iconUrl,this._category=defaultValue(e.category,""),knockout.track(this,["name","tooltip","iconUrl"])}function createDefaultImageryProviderViewModels(){var e=[];return e.push(new ProviderViewModel({name:"Bing Maps Aerial",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/bingAerial.png"),tooltip:"Bing Maps aerial imagery, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return createWorldImagery({style:IonWorldImageryStyle$1.AERIAL})}})),e.push(new ProviderViewModel({name:"Bing Maps Aerial with Labels",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/bingAerialLabels.png"),tooltip:"Bing Maps aerial imagery with labels, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return createWorldImagery({style:IonWorldImageryStyle$1.AERIAL_WITH_LABELS})}})),e.push(new ProviderViewModel({name:"Bing Maps Roads",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/bingRoads.png"),tooltip:"Bing Maps standard road maps, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return createWorldImagery({style:IonWorldImageryStyle$1.ROAD})}})),e.push(new ProviderViewModel({name:"ESRI World Imagery",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/esriWorldImagery.png"),tooltip:"World Imagery provides one meter or better satellite and aerial imagery in many parts of the world and lower resolution satellite imagery worldwide. The map includes NASA Blue Marble: Next Generation 500m resolution imagery at small scales (above 1:1,000,000), i-cubed 15m eSAT imagery at medium-to-large scales (down to 1:70,000) for the world, and USGS 15m Landsat imagery for Antarctica. The map features 0.3m resolution imagery in the continental United States and 0.6m resolution imagery in parts of Western Europe from DigitalGlobe. In other parts of the world, 1 meter resolution imagery is available from GeoEye IKONOS, i-cubed Nationwide Prime, Getmapping, AeroGRID, IGN Spain, and IGP Portugal. Additionally, imagery at different resolutions has been contributed by the GIS User Community.\nhttp://www.esri.com",category:"Other",creationFunction:function(){return new ArcGisMapServerImageryProvider({url:"https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer",enablePickFeatures:!1})}})),e.push(new ProviderViewModel({name:"ESRI World Street Map",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/esriWorldStreetMap.png"),tooltip:"This worldwide street map presents highway-level data for the world. Street-level data includes the United States; much of Canada; Japan; most countries in Europe; Australia and New Zealand; India; parts of South America including Argentina, Brazil, Chile, Colombia, and Venezuela; Ghana; and parts of southern Africa including Botswana, Lesotho, Namibia, South Africa, and Swaziland.\nhttp://www.esri.com",category:"Other",creationFunction:function(){return new ArcGisMapServerImageryProvider({url:"https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",enablePickFeatures:!1})}})),e.push(new ProviderViewModel({name:"ESRI National Geographic",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/esriNationalGeographic.png"),tooltip:"This web map contains the National Geographic World Map service. This map service is designed to be used as a general reference map for informational and educational purposes as well as a basemap by GIS professionals and other users for creating web maps and web mapping applications.\nhttp://www.esri.com",category:"Other",creationFunction:function(){return new ArcGisMapServerImageryProvider({url:"https://services.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/",enablePickFeatures:!1})}})),e.push(new ProviderViewModel({name:"Open­Street­Map",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/openStreetMap.png"),tooltip:"OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world.\nhttp://www.openstreetmap.org",category:"Other",creationFunction:function(){return new OpenStreetMapImageryProvider({url:"https://a.tile.openstreetmap.org/"})}})),e.push(new ProviderViewModel({name:"Stamen Watercolor",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/stamenWatercolor.png"),tooltip:"Reminiscent of hand drawn maps, Stamen watercolor maps apply raster effect area washes and organic edges over a paper texture to add warm pop to any map.\nhttp://maps.stamen.com",category:"Other",creationFunction:function(){return new OpenStreetMapImageryProvider({url:"https://stamen-tiles.a.ssl.fastly.net/watercolor/",credit:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA."})}})),e.push(new ProviderViewModel({name:"Stamen Toner",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/stamenToner.png"),tooltip:"A high contrast black and white map.\nhttp://maps.stamen.com",category:"Other",creationFunction:function(){return new OpenStreetMapImageryProvider({url:"https://stamen-tiles.a.ssl.fastly.net/toner/",credit:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA."})}})),e.push(new ProviderViewModel({name:"Sentinel-2",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/sentinel-2.png"),tooltip:"Sentinel-2 cloudless by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2016 and 2017).",category:"Cesium ion",creationFunction:function(){return new IonImageryProvider({assetId:3954})}})),e.push(new ProviderViewModel({name:"Blue Marble",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/blueMarble.png"),tooltip:"Blue Marble Next Generation July, 2004 imagery from NASA.",category:"Cesium ion",creationFunction:function(){return new IonImageryProvider({assetId:3845})}})),e.push(new ProviderViewModel({name:"Earth at night",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/earthAtNight.png"),tooltip:"The Earth at night, also known as The Black Marble, is a 500 meter resolution global composite imagery layer released by NASA.",category:"Cesium ion",creationFunction:function(){return new IonImageryProvider({assetId:3812})}})),e.push(new ProviderViewModel({name:"Natural Earth II",iconUrl:buildModuleUrl("Widgets/Images/ImageryProviders/naturalEarthII.png"),tooltip:"Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/",category:"Cesium ion",creationFunction:function(){return new TileMapServiceImageryProvider({url:buildModuleUrl("Assets/Textures/NaturalEarthII")})}})),e}function createDefaultTerrainProviderViewModels(){var e=[];return e.push(new ProviderViewModel({name:"WGS84 Ellipsoid",iconUrl:buildModuleUrl("Widgets/Images/TerrainProviders/Ellipsoid.png"),tooltip:"WGS84 standard ellipsoid, also known as EPSG:4326",category:"Cesium ion",creationFunction:function(){return new EllipsoidTerrainProvider}})),e.push(new ProviderViewModel({name:"Cesium World Terrain",iconUrl:buildModuleUrl("Widgets/Images/TerrainProviders/CesiumWorldTerrain.png"),tooltip:"High-resolution global terrain tileset curated from several datasources and hosted by Cesium ion",category:"Cesium ion",creationFunction:function(){return createWorldTerrain({requestWaterMask:!0,requestVertexNormals:!0})}})),e}function getPickTileset(i){return function(e){var t=i._scene.pick(e.position);defined(t)&&t.primitive instanceof Cesium3DTileset&&(i.tileset=t.primitive),i.pickActive=!1}}function selectTilesetOnHover(i,e){e?i._eventHandler.setInputAction(function(e){var t=i._scene.pick(e.endPosition);defined(t)&&t.primitive instanceof Cesium3DTileset&&(i.tileset=t.primitive)},ScreenSpaceEventType$1.MOUSE_MOVE):(i._eventHandler.removeInputAction(ScreenSpaceEventType$1.MOUSE_MOVE),i.picking=i.picking)}AnimationViewModel.defaultDateFormatter=function(e,t){var i=JulianDate.toGregorianDate(e);return monthNames[i.month-1]+" "+i.day+" "+i.year},AnimationViewModel.defaultTicks=[.001,.002,.005,.01,.02,.05,.1,.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600,7200,14400,21600,43200,86400,172800,345600,604800],AnimationViewModel.defaultTimeFormatter=function(e,t){var i=JulianDate.toGregorianDate(e),r=Math.round(i.millisecond);return Math.abs(t._clockViewModel.multiplier)<1?sprintf("%02d:%02d:%02d.%03d",i.hour,i.minute,i.second,r):sprintf("%02d:%02d:%02d UTC",i.hour,i.minute,i.second)},AnimationViewModel.prototype.getShuttleRingTicks=function(){return this._sortedFilteredPositiveTicks.slice(0)},AnimationViewModel.prototype.setShuttleRingTicks=function(e){var t,i={},r=this._sortedFilteredPositiveTicks;for(o=r.length=0,n=e.length;o<n;++o)t=e[o],i.hasOwnProperty(t)||(i[t]=!0,r.push(t));r.sort(numberComparator);for(var n,a=[],o=(n=r.length)-1;0<=o;--o)0!==(t=r[o])&&a.push(-t);Array.prototype.push.apply(a,r),this._allShuttleRingTicks=a},Object.defineProperties(AnimationViewModel.prototype,{slower:{get:function(){return this._slower}},faster:{get:function(){return this._faster}},clockViewModel:{get:function(){return this._clockViewModel}},pauseViewModel:{get:function(){return this._pauseViewModel}},playReverseViewModel:{get:function(){return this._playReverseViewModel}},playForwardViewModel:{get:function(){return this._playForwardViewModel}},playRealtimeViewModel:{get:function(){return this._playRealtimeViewModel}},dateFormatter:{get:function(){return this._dateFormatter},set:function(e){this._dateFormatter=e}},timeFormatter:{get:function(){return this._timeFormatter},set:function(e){this._timeFormatter=e}}}),AnimationViewModel._maxShuttleRingAngle=maxShuttleRingAngle,AnimationViewModel._realtimeShuttleRingAngle=realtimeShuttleRingAngle,Object.defineProperties(BaseLayerPickerViewModel.prototype,{toggleDropDown:{get:function(){return this._toggleDropDown}},globe:{get:function(){return this._globe}}}),Object.defineProperties(BaseLayerPicker.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),BaseLayerPicker.prototype.isDestroyed=function(){return!1},BaseLayerPicker.prototype.destroy=function(){return FeatureDetection.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),knockout.cleanNode(this._element),knockout.cleanNode(this._dropPanel),this._container.removeChild(this._element),this._container.removeChild(this._dropPanel),destroyObject(this)},Object.defineProperties(ProviderViewModel.prototype,{creationCommand:{get:function(){return this._creationCommand}},category:{get:function(){return this._category}}});var stringOptions$1={maximumFractionDigits:3};function formatMemoryString$1(e){var t=e/1048576;return t<1?t.toLocaleString(void 0,stringOptions$1):Math.round(t).toLocaleString()}function getStatistics(e,t){if(!defined(e))return"";var i=t?e._statisticsPerPass[Cesium3DTilePass$1.PICK]:e._statisticsPerPass[Cesium3DTilePass$1.RENDER],r='<ul class="cesium-cesiumInspector-statistics">';return r+="<li><strong>Visited: </strong>"+i.visited.toLocaleString()+"</li><li><strong>Selected: </strong>"+i.selected.toLocaleString()+"</li><li><strong>Commands: </strong>"+i.numberOfCommands.toLocaleString()+"</li>",r+="</ul>",t||(r+='<ul class="cesium-cesiumInspector-statistics">',r+="<li><strong>Requests: </strong>"+i.numberOfPendingRequests.toLocaleString()+"</li><li><strong>Attempted: </strong>"+i.numberOfAttemptedRequests.toLocaleString()+"</li><li><strong>Processing: </strong>"+i.numberOfTilesProcessing.toLocaleString()+"</li><li><strong>Content Ready: </strong>"+i.numberOfTilesWithContentReady.toLocaleString()+"</li><li><strong>Total: </strong>"+i.numberOfTilesTotal.toLocaleString()+"</li>",r+="</ul>",r+='<ul class="cesium-cesiumInspector-statistics">',r+="<li><strong>Features Selected: </strong>"+i.numberOfFeaturesSelected.toLocaleString()+"</li><li><strong>Features Loaded: </strong>"+i.numberOfFeaturesLoaded.toLocaleString()+"</li><li><strong>Points Selected: </strong>"+i.numberOfPointsSelected.toLocaleString()+"</li><li><strong>Points Loaded: </strong>"+i.numberOfPointsLoaded.toLocaleString()+"</li><li><strong>Triangles Selected: </strong>"+i.numberOfTrianglesSelected.toLocaleString()+"</li>",r+="</ul>",r+='<ul class="cesium-cesiumInspector-statistics">',r+="<li><strong>Tiles styled: </strong>"+i.numberOfTilesStyled.toLocaleString()+"</li><li><strong>Features styled: </strong>"+i.numberOfFeaturesStyled.toLocaleString()+"</li>",r+="</ul>",r+='<ul class="cesium-cesiumInspector-statistics">',r+="<li><strong>Children Union Culled: </strong>"+i.numberOfTilesCulledWithChildrenUnion.toLocaleString()+"</li>",r+="</ul>",r+='<ul class="cesium-cesiumInspector-statistics">',r+="<li><strong>Geometry Memory (MB): </strong>"+formatMemoryString$1(i.geometryByteLength)+"</li><li><strong>Texture Memory (MB): </strong>"+formatMemoryString$1(i.texturesByteLength)+"</li><li><strong>Batch Table Memory (MB): </strong>"+formatMemoryString$1(i.batchTableByteLength)+"</li>",r+="</ul>"),r}var colorBlendModes=[{text:"Highlight",value:Cesium3DTileColorBlendMode$1.HIGHLIGHT},{text:"Replace",value:Cesium3DTileColorBlendMode$1.REPLACE},{text:"Mix",value:Cesium3DTileColorBlendMode$1.MIX}],highlightColor$1=new Color(1,1,0,.4),scratchColor$l=new Color,oldColor=new Color;function Cesium3DTilesInspectorViewModel(r,e){var n=this,t=r.canvas;this._eventHandler=new ScreenSpaceEventHandler(t),this._scene=r,this._performanceContainer=e,this._canvas=t,this._performanceDisplay=new PerformanceDisplay({container:e}),this._statisticsText="",this._pickStatisticsText="",this._editorError="",this.performance=!1,this.showStatistics=!0,this.showPickStatistics=!0,this.inspectorVisible=!0,this.tilesetVisible=!1,this.displayVisible=!1,this.updateVisible=!1,this.loggingVisible=!1,this.styleVisible=!1,this.tileDebugLabelsVisible=!1,this.optimizationVisible=!1,this.styleString="{}",this._tileset=void 0,this._feature=void 0,this._tile=void 0,knockout.track(this,["performance","inspectorVisible","_statisticsText","_pickStatisticsText","_editorError","showPickStatistics","showStatistics","tilesetVisible","displayVisible","updateVisible","loggingVisible","styleVisible","optimizationVisible","tileDebugLabelsVisible","styleString","_feature","_tile"]),this._properties=knockout.observable({}),this.properties=[],knockout.defineProperty(this,"properties",function(){var e=[],t=n._properties();for(var i in t)t.hasOwnProperty(i)&&e.push(i);return e});var i=knockout.observable();knockout.defineProperty(this,"dynamicScreenSpaceError",{get:function(){return i()},set:function(e){i(e),defined(n._tileset)&&(n._tileset.dynamicScreenSpaceError=e)}}),this.dynamicScreenSpaceError=!1;var a=knockout.observable();knockout.defineProperty(this,"colorBlendMode",{get:function(){return a()},set:function(e){a(e),defined(n._tileset)&&(n._tileset.colorBlendMode=e,n._scene.requestRender())}}),this.colorBlendMode=Cesium3DTileColorBlendMode$1.HIGHLIGHT;var o=knockout.observable(),s=knockout.observable();knockout.defineProperty(this,"picking",{get:function(){return s()},set:function(e){s(e),e?n._eventHandler.setInputAction(function(e){var t,i=r.pick(e.endPosition);i instanceof Cesium3DTileFeature?(n.feature=i,n.tile=i.content.tile):defined(i)&&defined(i.content)?(n.feature=void 0,n.tile=i.content.tile):(n.feature=void 0,n.tile=void 0),defined(n._tileset)&&(o&&defined(i)&&defined(i.content)?(r.pickPositionSupported&&defined(t=r.pickPosition(e.endPosition))&&(n._tileset.debugPickPosition=t),n._tileset.debugPickedTile=i.content.tile):n._tileset.debugPickedTile=void 0,n._scene.requestRender())},ScreenSpaceEventType$1.MOUSE_MOVE):(n.feature=void 0,n.tile=void 0,n._eventHandler.removeInputAction(ScreenSpaceEventType$1.MOUSE_MOVE))}}),this.picking=!0;var l=knockout.observable();knockout.defineProperty(this,"colorize",{get:function(){return l()},set:function(e){l(e),defined(n._tileset)&&(n._tileset.debugColorizeTiles=e,n._scene.requestRender())}}),this.colorize=!1;var c=knockout.observable();knockout.defineProperty(this,"wireframe",{get:function(){return c()},set:function(e){c(e),defined(n._tileset)&&(n._tileset.debugWireframe=e,n._scene.requestRender())}}),this.wireframe=!1;var u=knockout.observable();knockout.defineProperty(this,"showBoundingVolumes",{get:function(){return u()},set:function(e){u(e),defined(n._tileset)&&(n._tileset.debugShowBoundingVolume=e,n._scene.requestRender())}}),this.showBoundingVolumes=!1;var d=knockout.observable();knockout.defineProperty(this,"showContentBoundingVolumes",{get:function(){return d()},set:function(e){d(e),defined(n._tileset)&&(n._tileset.debugShowContentBoundingVolume=e,n._scene.requestRender())}}),this.showContentBoundingVolumes=!1;var h=knockout.observable();knockout.defineProperty(this,"showRequestVolumes",{get:function(){return h()},set:function(e){h(e),defined(n._tileset)&&(n._tileset.debugShowViewerRequestVolume=e,n._scene.requestRender())}}),this.showRequestVolumes=!1;var p=knockout.observable();knockout.defineProperty(this,"freezeFrame",{get:function(){return p()},set:function(e){p(e),defined(n._tileset)&&(n._tileset.debugFreezeFrame=e,n._scene.debugShowFrustumPlanes=e,n._scene.requestRender())}}),this.freezeFrame=!1,knockout.defineProperty(this,"showOnlyPickedTileDebugLabel",{get:function(){return o()},set:function(e){o(e),defined(n._tileset)&&(n._tileset.debugPickedTileLabelOnly=e,n._scene.requestRender())}}),this.showOnlyPickedTileDebugLabel=!1;var m=knockout.observable();knockout.defineProperty(this,"showGeometricError",{get:function(){return m()},set:function(e){m(e),defined(n._tileset)&&(n._tileset.debugShowGeometricError=e,n._scene.requestRender())}}),this.showGeometricError=!1;var f=knockout.observable();knockout.defineProperty(this,"showRenderingStatistics",{get:function(){return f()},set:function(e){f(e),defined(n._tileset)&&(n._tileset.debugShowRenderingStatistics=e,n._scene.requestRender())}}),this.showRenderingStatistics=!1;var g=knockout.observable();knockout.defineProperty(this,"showMemoryUsage",{get:function(){return g()},set:function(e){g(e),defined(n._tileset)&&(n._tileset.debugShowMemoryUsage=e,n._scene.requestRender())}}),this.showMemoryUsage=!1;var _=knockout.observable();knockout.defineProperty(this,"showUrl",{get:function(){return _()},set:function(e){_(e),defined(n._tileset)&&(n._tileset.debugShowUrl=e,n._scene.requestRender())}}),this.showUrl=!1;var y=knockout.observable();knockout.defineProperty(this,"maximumScreenSpaceError",{get:function(){return y()},set:function(e){e=Number(e),isNaN(e)||(y(e),defined(n._tileset)&&(n._tileset.maximumScreenSpaceError=e))}}),this.maximumScreenSpaceError=16;var v=knockout.observable();knockout.defineProperty(this,"dynamicScreenSpaceErrorDensity",{get:function(){return v()},set:function(e){e=Number(e),isNaN(e)||(v(e),defined(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorDensity=e))}}),this.dynamicScreenSpaceErrorDensity=.00278,this.dynamicScreenSpaceErrorDensitySliderValue=void 0,knockout.defineProperty(this,"dynamicScreenSpaceErrorDensitySliderValue",{get:function(){return Math.pow(v(),1/6)},set:function(e){v(Math.pow(e,6))}});var C=knockout.observable();knockout.defineProperty(this,"dynamicScreenSpaceErrorFactor",{get:function(){return C()},set:function(e){e=Number(e),isNaN(e)||(C(e),defined(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorFactor=e))}}),this.dynamicScreenSpaceErrorFactor=4;var S=getPickTileset(this),T=knockout.observable();knockout.defineProperty(this,"pickActive",{get:function(){return T()},set:function(e){T(e),e?n._eventHandler.setInputAction(S,ScreenSpaceEventType$1.LEFT_CLICK):n._eventHandler.removeInputAction(ScreenSpaceEventType$1.LEFT_CLICK)}});var x=knockout.observable();knockout.defineProperty(this,"pointCloudShading",{get:function(){return x()},set:function(e){x(e),defined(n._tileset)&&(n._tileset.pointCloudShading.attenuation=e)}}),this.pointCloudShading=!1;var b=knockout.observable();knockout.defineProperty(this,"geometricErrorScale",{get:function(){return b()},set:function(e){e=Number(e),isNaN(e)||(b(e),defined(n._tileset)&&(n._tileset.pointCloudShading.geometricErrorScale=e))}}),this.geometricErrorScale=1;var E=knockout.observable();knockout.defineProperty(this,"maximumAttenuation",{get:function(){return E()},set:function(e){e=Number(e),isNaN(e)||(E(e),defined(n._tileset)&&(n._tileset.pointCloudShading.maximumAttenuation=0===e?void 0:e))}}),this.maximumAttenuation=0;var P=knockout.observable();knockout.defineProperty(this,"baseResolution",{get:function(){return P()},set:function(e){e=Number(e),isNaN(e)||(P(e),defined(n._tileset)&&(n._tileset.pointCloudShading.baseResolution=0===e?void 0:e))}}),this.baseResolution=0;var A=knockout.observable();knockout.defineProperty(this,"eyeDomeLighting",{get:function(){return A()},set:function(e){A(e),defined(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLighting=e)}}),this.eyeDomeLighting=!1;var w=knockout.observable();knockout.defineProperty(this,"eyeDomeLightingStrength",{get:function(){return w()},set:function(e){e=Number(e),isNaN(e)||(w(e),defined(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLightingStrength=e))}}),this.eyeDomeLightingStrength=1;var D=knockout.observable();knockout.defineProperty(this,"eyeDomeLightingRadius",{get:function(){return D()},set:function(e){e=Number(e),isNaN(e)||(D(e),defined(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLightingRadius=e))}}),this.eyeDomeLightingRadius=1,this.pickActive=!1;var M=knockout.observable();knockout.defineProperty(this,"skipLevelOfDetail",{get:function(){return M()},set:function(e){M(e),defined(n._tileset)&&(n._tileset.skipLevelOfDetail=e)}}),this.skipLevelOfDetail=!0;var I=knockout.observable();knockout.defineProperty(this,"skipScreenSpaceErrorFactor",{get:function(){return I()},set:function(e){e=Number(e),isNaN(e)||(I(e),defined(n._tileset)&&(n._tileset.skipScreenSpaceErrorFactor=e))}}),this.skipScreenSpaceErrorFactor=16;var R=knockout.observable();knockout.defineProperty(this,"baseScreenSpaceError",{get:function(){return R()},set:function(e){e=Number(e),isNaN(e)||(R(e),defined(n._tileset)&&(n._tileset.baseScreenSpaceError=e))}}),this.baseScreenSpaceError=1024;var O=knockout.observable();knockout.defineProperty(this,"skipLevels",{get:function(){return O()},set:function(e){e=Number(e),isNaN(e)||(O(e),defined(n._tileset)&&(n._tileset.skipLevels=e))}}),this.skipLevels=1;var L=knockout.observable();knockout.defineProperty(this,"immediatelyLoadDesiredLevelOfDetail",{get:function(){return L()},set:function(e){L(e),defined(n._tileset)&&(n._tileset.immediatelyLoadDesiredLevelOfDetail=e)}}),this.immediatelyLoadDesiredLevelOfDetail=!1;var F=knockout.observable();knockout.defineProperty(this,"loadSiblings",{get:function(){return F()},set:function(e){F(e),defined(n._tileset)&&(n._tileset.loadSiblings=e)}}),this.loadSiblings=!1,this._style=void 0,this._shouldStyle=!1,this._definedProperties=["properties","dynamicScreenSpaceError","colorBlendMode","picking","colorize","wireframe","showBoundingVolumes","showContentBoundingVolumes","showRequestVolumes","freezeFrame","maximumScreenSpaceError","dynamicScreenSpaceErrorDensity","baseScreenSpaceError","skipScreenSpaceErrorFactor","skipLevelOfDetail","skipLevels","immediatelyLoadDesiredLevelOfDetail","loadSiblings","dynamicScreenSpaceErrorDensitySliderValue","dynamicScreenSpaceErrorFactor","pickActive","showOnlyPickedTileDebugLabel","showGeometricError","showRenderingStatistics","showMemoryUsage","showUrl","pointCloudShading","geometricErrorScale","maximumAttenuation","baseResolution","eyeDomeLighting","eyeDomeLightingStrength","eyeDomeLightingRadius"],this._removePostRenderEvent=r.postRender.addEventListener(function(){n._update()}),defined(this._tileset)||selectTilesetOnHover(this,!0)}function hasFeatures(e){if(0<e.featuresLength)return 1;var t=e.innerContents;if(defined(t)){for(var i=t.length,r=0;r<i;++r)if(!hasFeatures(t[r]))return;return 1}}function Cesium3DTilesInspector(e,t){e=getElement(e);var i=document.createElement("div"),r=document.createElement("div");r.setAttribute("data-bind","visible: performance");var n=new Cesium3DTilesInspectorViewModel(t,r);this._viewModel=n,this._container=e,this._element=i;var a=document.createElement("div");a.textContent="3D Tiles Inspector",a.className="cesium-cesiumInspector-button",a.setAttribute("data-bind","click: toggleInspector"),i.appendChild(a),i.className="cesium-cesiumInspector cesium-3DTilesInspector",i.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : inspectorVisible, "cesium-cesiumInspector-hidden" : !inspectorVisible}'),e.appendChild(i);var o=document.createElement("div");(this._panel=o).className="cesium-cesiumInspector-dropDown",i.appendChild(o);var s=InspectorShared.createSection,l=InspectorShared.createCheckbox,c=s(o,"Tileset","tilesetVisible","toggleTileset"),u=s(o,"Display","displayVisible","toggleDisplay"),d=s(o,"Update","updateVisible","toggleUpdate"),h=s(o,"Logging","loggingVisible","toggleLogging"),p=s(o,"Tile Debug Labels","tileDebugLabelsVisible","toggleTileDebugLabels"),m=s(o,"Style","styleVisible","toggleStyle"),f=s(o,"Optimization","optimizationVisible","toggleOptimization"),g=document.createElement("div");g.className="field-group";var _=document.createElement("label");_.className="field-label",_.appendChild(document.createTextNode("Properties: "));var y=document.createElement("div");y.setAttribute("data-bind","text: properties"),g.appendChild(_),g.appendChild(y),c.appendChild(g),c.appendChild(makeButton("togglePickTileset","Pick Tileset","pickActive")),c.appendChild(makeButton("trimTilesCache","Trim Tiles Cache")),c.appendChild(l("Enable Picking","picking")),u.appendChild(l("Colorize","colorize")),u.appendChild(l("Wireframe","wireframe")),u.appendChild(l("Bounding Volumes","showBoundingVolumes")),u.appendChild(l("Content Volumes","showContentBoundingVolumes")),u.appendChild(l("Request Volumes","showRequestVolumes")),u.appendChild(l("Point Cloud Shading","pointCloudShading"));var v=document.createElement("div");v.setAttribute("data-bind","visible: pointCloudShading"),v.appendChild(makeRangeInput("geometricErrorScale",0,2,.01,"Geometric Error Scale")),v.appendChild(makeRangeInput("maximumAttenuation",0,32,1,"Maximum Attenuation")),v.appendChild(makeRangeInput("baseResolution",0,1,.01,"Base Resolution")),v.appendChild(l("Eye Dome Lighting (EDL)","eyeDomeLighting")),u.appendChild(v);var C=document.createElement("div");C.setAttribute("data-bind","visible: eyeDomeLighting"),C.appendChild(makeRangeInput("eyeDomeLightingStrength",0,2,.1,"EDL Strength")),C.appendChild(makeRangeInput("eyeDomeLightingRadius",0,4,.1,"EDL Radius")),v.appendChild(C),d.appendChild(l("Freeze Frame","freezeFrame")),d.appendChild(l("Dynamic Screen Space Error","dynamicScreenSpaceError"));var S=document.createElement("div");S.appendChild(makeRangeInput("maximumScreenSpaceError",0,128,1,"Maximum Screen Space Error")),d.appendChild(S);var T=document.createElement("div");T.setAttribute("data-bind","visible: dynamicScreenSpaceError"),T.appendChild(makeRangeInput("dynamicScreenSpaceErrorDensitySliderValue",0,1,.005,"Screen Space Error Density","dynamicScreenSpaceErrorDensity")),T.appendChild(makeRangeInput("dynamicScreenSpaceErrorFactor",1,10,.1,"Screen Space Error Factor")),d.appendChild(T),h.appendChild(l("Performance","performance")),h.appendChild(r),h.appendChild(l("Statistics","showStatistics"));var x=document.createElement("div");x.className="cesium-3dTilesInspector-statistics",x.setAttribute("data-bind","html: statisticsText, visible: showStatistics"),h.appendChild(x),h.appendChild(l("Pick Statistics","showPickStatistics"));var b=document.createElement("div");b.className="cesium-3dTilesInspector-statistics",b.setAttribute("data-bind","html: pickStatisticsText, visible: showPickStatistics"),h.appendChild(b);var E=document.createElement("div");m.appendChild(E),E.appendChild(document.createTextNode("Color Blend Mode: "));var P=document.createElement("select");P.setAttribute("data-bind",'options: colorBlendModes, optionsText: "text", optionsValue: "value", value: colorBlendMode'),E.appendChild(P);var A=document.createElement("textarea");A.setAttribute("data-bind","textInput: styleString, event: { keydown: styleEditorKeyPress }"),E.className="cesium-cesiumInspector-styleEditor",E.appendChild(A);var w=makeButton("compileStyle","Compile (Ctrl+Enter)");E.appendChild(w);var D=document.createElement("div");D.className="cesium-cesiumInspector-error",D.setAttribute("data-bind","text: editorError"),E.appendChild(D),p.appendChild(l("Show Picked Only","showOnlyPickedTileDebugLabel")),p.appendChild(l("Geometric Error","showGeometricError")),p.appendChild(l("Rendering Statistics","showRenderingStatistics")),p.appendChild(l("Memory Usage (MB)","showMemoryUsage")),p.appendChild(l("Url","showUrl")),f.appendChild(l("Skip Tile LODs","skipLevelOfDetail"));var M=document.createElement("div");M.appendChild(makeRangeInput("skipScreenSpaceErrorFactor",1,50,1,"Skip SSE Factor")),f.appendChild(M);var I=document.createElement("div");I.appendChild(makeRangeInput("baseScreenSpaceError",0,4096,1,"SSE before skipping LOD")),f.appendChild(I);var R=document.createElement("div");R.appendChild(makeRangeInput("skipLevels",0,10,1,"Min. levels to skip")),f.appendChild(R),f.appendChild(l("Load only tiles that meet the max SSE.","immediatelyLoadDesiredLevelOfDetail")),f.appendChild(l("Load siblings of visible tiles","loadSiblings")),knockout.applyBindings(n,i)}function makeRangeInput(e,t,i,r,n,a){a=defaultValue(a,e);var o=document.createElement("input");o.setAttribute("data-bind","value: "+a),o.type="number";var s=document.createElement("input");s.type="range",s.min=t,s.max=i,s.step=r,s.setAttribute("data-bind",'valueUpdate: "input", value: '+e);var l=document.createElement("div");l.appendChild(s);var c=document.createElement("div");return c.className="cesium-cesiumInspector-slider",c.appendChild(document.createTextNode(n)),c.appendChild(o),c.appendChild(l),c}function makeButton(e,t,i){var r=document.createElement("button");r.type="button",r.textContent=t,r.className="cesium-cesiumInspector-pickButton";var n="click: "+e;return defined(i)&&(n+=', css: {"cesium-cesiumInspector-pickButtonHighlight" : '+i+"}"),r.setAttribute("data-bind",n),r}function frustumStatisticsToString(e){var t;if(defined(e)){t="Command Statistics";var i=e.commandsInFrustums;for(var r in i)if(i.hasOwnProperty(r)){var n,a=parseInt(r,10);if(7===a)n="1, 2 and 3";else{for(var o=[],s=2;0<=s;s--){var l=Math.pow(2,s);l<=a&&(o.push(s+1),a-=l)}n=o.reverse().join(" and ")}t+="<br>    "+i[r]+" in frustum "+n}t+="<br>Total: "+e.totalCommands}return t}function boundDepthFrustum(e,t,i){var r=Math.min(i,t);return r=Math.max(r,e)}Object.defineProperties(Cesium3DTilesInspectorViewModel.prototype,{scene:{get:function(){return this._scene}},performanceContainer:{get:function(){return this._performanceContainer}},statisticsText:{get:function(){return this._statisticsText}},pickStatisticsText:{get:function(){return this._pickStatisticsText}},colorBlendModes:{get:function(){return colorBlendModes}},editorError:{get:function(){return this._editorError}},tileset:{get:function(){return this._tileset},set:function(e){if(this._tileset=e,this._style=void 0,this.styleString="{}",this.feature=void 0,this.tile=void 0,defined(e)){var t=this;e.readyPromise.then(function(e){t.isDestroyed()||t._properties(e.properties)});for(var i=["colorize","wireframe","showBoundingVolumes","showContentBoundingVolumes","showRequestVolumes","freezeFrame","showOnlyPickedTileDebugLabel","showGeometricError","showRenderingStatistics","showMemoryUsage","showUrl"],r=i.length,n=0;n<r;++n){var a=i[n];this[a]=this[a]}this.maximumScreenSpaceError=e.maximumScreenSpaceError,this.dynamicScreenSpaceError=e.dynamicScreenSpaceError,this.dynamicScreenSpaceErrorDensity=e.dynamicScreenSpaceErrorDensity,this.dynamicScreenSpaceErrorFactor=e.dynamicScreenSpaceErrorFactor,this.colorBlendMode=e.colorBlendMode,this.skipLevelOfDetail=e.skipLevelOfDetail,this.skipScreenSpaceErrorFactor=e.skipScreenSpaceErrorFactor,this.baseScreenSpaceError=e.baseScreenSpaceError,this.skipLevels=e.skipLevels,this.immediatelyLoadDesiredLevelOfDetail=e.immediatelyLoadDesiredLevelOfDetail,this.loadSiblings=e.loadSiblings;var o=e.pointCloudShading;this.pointCloudShading=o.attenuation,this.geometricErrorScale=o.geometricErrorScale,this.maximumAttenuation=o.maximumAttenuation?o.maximumAttenuation:0,this.baseResolution=o.baseResolution?o.baseResolution:0,this.eyeDomeLighting=o.eyeDomeLighting,this.eyeDomeLightingStrength=o.eyeDomeLightingStrength,this.eyeDomeLightingRadius=o.eyeDomeLightingRadius,this._scene.requestRender()}else this._properties({});this._statisticsText=getStatistics(e,!1),this._pickStatisticsText=getStatistics(e,!0),selectTilesetOnHover(this,!1)}},feature:{get:function(){return this._feature},set:function(e){var t;this._feature!==e&&(defined(t=this._feature)&&!t.content.isDestroyed()&&(!this.colorize&&defined(this._style)?t.color=defined(this._style.color)?this._style.color.evaluateColor(t,scratchColor$l):Color.WHITE:t.color=oldColor,this._scene.requestRender()),defined(e)&&(Color.clone(e.color,oldColor),e.color=highlightColor$1,this._scene.requestRender()),this._feature=e)}},tile:{get:function(){return this._tile},set:function(e){var t;this._tile!==e&&(!defined(t=this._tile)||t.isDestroyed()||hasFeatures(t.content)||(t.color=oldColor,this._scene.requestRender()),defined(e)&&!hasFeatures(e.content)&&(Color.clone(e.color,oldColor),e.color=highlightColor$1,this._scene.requestRender()),this._tile=e)}}}),Cesium3DTilesInspectorViewModel.prototype.togglePickTileset=function(){this.pickActive=!this.pickActive},Cesium3DTilesInspectorViewModel.prototype.toggleInspector=function(){this.inspectorVisible=!this.inspectorVisible},Cesium3DTilesInspectorViewModel.prototype.toggleTileset=function(){this.tilesetVisible=!this.tilesetVisible},Cesium3DTilesInspectorViewModel.prototype.toggleDisplay=function(){this.displayVisible=!this.displayVisible},Cesium3DTilesInspectorViewModel.prototype.toggleUpdate=function(){this.updateVisible=!this.updateVisible},Cesium3DTilesInspectorViewModel.prototype.toggleLogging=function(){this.loggingVisible=!this.loggingVisible},Cesium3DTilesInspectorViewModel.prototype.toggleStyle=function(){this.styleVisible=!this.styleVisible},Cesium3DTilesInspectorViewModel.prototype.toggleTileDebugLabels=function(){this.tileDebugLabelsVisible=!this.tileDebugLabelsVisible},Cesium3DTilesInspectorViewModel.prototype.toggleOptimization=function(){this.optimizationVisible=!this.optimizationVisible},Cesium3DTilesInspectorViewModel.prototype.trimTilesCache=function(){defined(this._tileset)&&this._tileset.trimLoadedTiles()},Cesium3DTilesInspectorViewModel.prototype.compileStyle=function(){var e=this._tileset;if(defined(e)&&this.styleString!==JSON.stringify(e.style)){this._editorError="";try{0===this.styleString.length&&(this.styleString="{}"),this._style=new Cesium3DTileStyle(JSON.parse(this.styleString)),this._shouldStyle=!0,this._scene.requestRender()}catch(e){this._editorError=e.toString()}this.feature=this._feature,this.tile=this._tile}},Cesium3DTilesInspectorViewModel.prototype.styleEditorKeyPress=function(e,t){if(9===t.keyCode){t.preventDefault();var i,r=t.target,n=r.selectionStart,a=r.selectionEnd,o=a,s=r.value.slice(n,a).split("\n"),l=s.length;if(t.shiftKey)for(i=0;i<l;++i)" "===s[i][0]&&(" "===s[i][1]?(s[i]=s[i].substr(2),o-=2):(s[i]=s[i].substr(1),--o));else for(i=0;i<l;++i)s[i]=" "+s[i],o+=2;var c=s.join("\n");r.value=r.value.slice(0,n)+c+r.value.slice(a),r.selectionStart=n!==a?n:o,r.selectionEnd=o}else!t.ctrlKey||10!==t.keyCode&&13!==t.keyCode||this.compileStyle();return!0},Cesium3DTilesInspectorViewModel.prototype._update=function(){var e=this._tileset;if(this.performance&&this._performanceDisplay.update(),defined(e)){if(e.isDestroyed())return this.tile=void 0,this.feature=void 0,void(this.tileset=void 0);var t=e.style;this._style!==e.style&&(this._shouldStyle?(e.style=this._style,this._shouldStyle=!1):(this._style=t,this.styleString=JSON.stringify(t.style,null," ")))}this.showStatistics&&(this._statisticsText=getStatistics(e,!1),this._pickStatisticsText=getStatistics(e,!0))},Cesium3DTilesInspectorViewModel.prototype.isDestroyed=function(){return!1},Cesium3DTilesInspectorViewModel.prototype.destroy=function(){this._eventHandler.destroy(),this._removePostRenderEvent();var t=this;return this._definedProperties.forEach(function(e){knockout.getObservable(t,e).dispose()}),destroyObject(this)},Cesium3DTilesInspectorViewModel.getStatistics=getStatistics,Object.defineProperties(Cesium3DTilesInspector.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),Cesium3DTilesInspector.prototype.isDestroyed=function(){return!1},Cesium3DTilesInspector.prototype.destroy=function(){return knockout.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),destroyObject(this)};var scratchPickRay$1=new Ray,scratchPickCartesian$1=new Cartesian3;function CesiumInspectorViewModel(e,t){var d=this,i=e.canvas,r=new ScreenSpaceEventHandler(i);this._eventHandler=r,this._scene=e,this._canvas=i,this._primitive=void 0,this._tile=void 0,this._modelMatrixPrimitive=void 0,this._performanceDisplay=void 0,this._performanceContainer=t;var n,h=this._scene.globe;function a(e){var t=d._scene.pick({x:e.position.x,y:e.position.y});defined(t)&&(d.primitive=defined(t.collection)?t.collection:t.primitive),d._scene.requestRender(),d.pickPrimitiveActive=!1}function o(e){var t,i=h.ellipsoid,r=d._scene.camera.getPickRay(e.position,scratchPickRay$1),n=h.pick(r,d._scene,scratchPickCartesian$1);if(defined(n))for(var a=i.cartesianToCartographic(n),o=h._surface.tileProvider._tilesToRenderByTextureCount,s=0;!t&&s<o.length;++s){var l=o[s];if(defined(l))for(var c=0;!t&&c<l.length;++c){var u=l[c];Rectangle.contains(u.rectangle,a)&&(t=u)}}d.tile=t,d.pickTileActive=!1}h.depthTestAgainstTerrain=!0,this.frustums=!1,this.frustumPlanes=!1,this.performance=!1,this.shaderCacheText="",this.primitiveBoundingSphere=!1,this.primitiveReferenceFrame=!1,this.filterPrimitive=!1,this.tileBoundingSphere=!1,this.filterTile=!1,this.wireframe=!1,this.globeDepth=!1,this.pickDepth=!1,this.depthFrustum=1,this._numberOfFrustums=1,this.suspendUpdates=!1,this.tileCoordinates=!1,this.frustumStatisticText=!1,this.tileText="",this.hasPickedPrimitive=!1,this.hasPickedTile=!1,this.pickPrimitiveActive=!1,this.pickTileActive=!1,this.dropDownVisible=!0,this.generalVisible=!0,this.primitivesVisible=!1,this.terrainVisible=!1,this.depthFrustumText="",knockout.track(this,["frustums","frustumPlanes","performance","shaderCacheText","primitiveBoundingSphere","primitiveReferenceFrame","filterPrimitive","tileBoundingSphere","filterTile","wireframe","globeDepth","pickDepth","depthFrustum","suspendUpdates","tileCoordinates","frustumStatisticText","tileText","hasPickedPrimitive","hasPickedTile","pickPrimitiveActive","pickTileActive","dropDownVisible","generalVisible","primitivesVisible","terrainVisible","depthFrustumText"]),this._toggleDropDown=createCommand$2(function(){d.dropDownVisible=!d.dropDownVisible}),this._toggleGeneral=createCommand$2(function(){d.generalVisible=!d.generalVisible}),this._togglePrimitives=createCommand$2(function(){d.primitivesVisible=!d.primitivesVisible}),this._toggleTerrain=createCommand$2(function(){d.terrainVisible=!d.terrainVisible}),this._frustumsSubscription=knockout.getObservable(this,"frustums").subscribe(function(e){d._scene.debugShowFrustums=e,d._scene.requestRender()}),this._frustumPlanesSubscription=knockout.getObservable(this,"frustumPlanes").subscribe(function(e){d._scene.debugShowFrustumPlanes=e,d._scene.requestRender()}),this._performanceSubscription=knockout.getObservable(this,"performance").subscribe(function(e){e?d._performanceDisplay=new PerformanceDisplay({container:d._performanceContainer}):d._performanceContainer.innerHTML=""}),this._showPrimitiveBoundingSphere=createCommand$2(function(){return d._primitive.debugShowBoundingVolume=d.primitiveBoundingSphere,d._scene.requestRender(),!0}),this._primitiveBoundingSphereSubscription=knockout.getObservable(this,"primitiveBoundingSphere").subscribe(function(){d._showPrimitiveBoundingSphere()}),this._showPrimitiveReferenceFrame=createCommand$2(function(){var e;return d.primitiveReferenceFrame?(e=d._primitive.modelMatrix,d._modelMatrixPrimitive=new DebugModelMatrixPrimitive({modelMatrix:e}),d._scene.primitives.add(d._modelMatrixPrimitive)):defined(d._modelMatrixPrimitive)&&(d._scene.primitives.remove(d._modelMatrixPrimitive),d._modelMatrixPrimitive=void 0),d._scene.requestRender(),!0}),this._primitiveReferenceFrameSubscription=knockout.getObservable(this,"primitiveReferenceFrame").subscribe(function(){d._showPrimitiveReferenceFrame()}),this._doFilterPrimitive=createCommand$2(function(){return d.filterPrimitive?d._scene.debugCommandFilter=function(e){return!(!defined(d._modelMatrixPrimitive)||e.owner!==d._modelMatrixPrimitive._primitive)||!!defined(d._primitive)&&(e.owner===d._primitive||e.owner===d._primitive._billboardCollection||e.owner.primitive===d._primitive)}:d._scene.debugCommandFilter=void 0,!0}),this._filterPrimitiveSubscription=knockout.getObservable(this,"filterPrimitive").subscribe(function(){d._doFilterPrimitive(),d._scene.requestRender()}),this._wireframeSubscription=knockout.getObservable(this,"wireframe").subscribe(function(e){h._surface.tileProvider._debug.wireframe=e,d._scene.requestRender()}),this._globeDepthSubscription=knockout.getObservable(this,"globeDepth").subscribe(function(e){d._scene.debugShowGlobeDepth=e,d._scene.requestRender()}),this._pickDepthSubscription=knockout.getObservable(this,"pickDepth").subscribe(function(e){d._scene.debugShowPickDepth=e,d._scene.requestRender()}),this._depthFrustumSubscription=knockout.getObservable(this,"depthFrustum").subscribe(function(e){d._scene.debugShowDepthFrustum=e,d._scene.requestRender()}),this._incrementDepthFrustum=createCommand$2(function(){var e=d.depthFrustum+1;return d.depthFrustum=boundDepthFrustum(1,d._numberOfFrustums,e),d._scene.requestRender(),!0}),this._decrementDepthFrustum=createCommand$2(function(){var e=d.depthFrustum-1;return d.depthFrustum=boundDepthFrustum(1,d._numberOfFrustums,e),d._scene.requestRender(),!0}),this._suspendUpdatesSubscription=knockout.getObservable(this,"suspendUpdates").subscribe(function(e){(h._surface._debug.suspendLodUpdate=e)||(d.filterTile=!1)}),this._showTileCoordinates=createCommand$2(function(){return d.tileCoordinates&&!defined(n)?n=e.imageryLayers.addImageryProvider(new TileCoordinatesImageryProvider({tilingScheme:e.terrainProvider.tilingScheme})):!d.tileCoordinates&&defined(n)&&(e.imageryLayers.remove(n),n=void 0),!0}),this._tileCoordinatesSubscription=knockout.getObservable(this,"tileCoordinates").subscribe(function(){d._showTileCoordinates(),d._scene.requestRender()}),this._tileBoundingSphereSubscription=knockout.getObservable(this,"tileBoundingSphere").subscribe(function(){d._showTileBoundingSphere(),d._scene.requestRender()}),this._showTileBoundingSphere=createCommand$2(function(){return d.tileBoundingSphere?h._surface.tileProvider._debug.boundingSphereTile=d._tile:h._surface.tileProvider._debug.boundingSphereTile=void 0,d._scene.requestRender(),!0}),this._doFilterTile=createCommand$2(function(){return d.filterTile?(d.suspendUpdates=!0,h._surface._tilesToRender=[],defined(d._tile)&&d._tile.renderable&&h._surface._tilesToRender.push(d._tile)):d.suspendUpdates=!1,!0}),this._filterTileSubscription=knockout.getObservable(this,"filterTile").subscribe(function(){d.doFilterTile(),d._scene.requestRender()}),this._pickPrimitive=createCommand$2(function(){d.pickPrimitiveActive=!d.pickPrimitiveActive}),this._pickPrimitiveActiveSubscription=knockout.getObservable(this,"pickPrimitiveActive").subscribe(function(e){e?r.setInputAction(a,ScreenSpaceEventType$1.LEFT_CLICK):r.removeInputAction(ScreenSpaceEventType$1.LEFT_CLICK)}),this._pickTile=createCommand$2(function(){d.pickTileActive=!d.pickTileActive}),this._pickTileActiveSubscription=knockout.getObservable(this,"pickTileActive").subscribe(function(e){e?r.setInputAction(o,ScreenSpaceEventType$1.LEFT_CLICK):r.removeInputAction(ScreenSpaceEventType$1.LEFT_CLICK)}),this._removePostRenderEvent=e.postRender.addEventListener(function(){d._update()})}function CesiumInspector(e,t){e=getElement(e);var i=document.createElement("div"),r=new CesiumInspectorViewModel(t,i);this._viewModel=r,this._container=e;var n=document.createElement("div");this._element=n;var a=document.createElement("div");a.textContent="Cesium Inspector",a.className="cesium-cesiumInspector-button",a.setAttribute("data-bind","click: toggleDropDown"),n.appendChild(a),n.className="cesium-cesiumInspector",n.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : dropDownVisible, "cesium-cesiumInspector-hidden" : !dropDownVisible }'),e.appendChild(this._element);var o=document.createElement("div");(this._panel=o).className="cesium-cesiumInspector-dropDown",n.appendChild(o);var s=InspectorShared.createSection,l=InspectorShared.createCheckbox,c=s(o,"General","generalVisible","toggleGeneral"),u=l("Show Frustums","frustums"),d=document.createElement("div");d.className="cesium-cesiumInspector-frustumStatistics",d.setAttribute("data-bind","visible: frustums, html: frustumStatisticText"),u.appendChild(d),c.appendChild(u),c.appendChild(l("Show Frustum Planes","frustumPlanes")),c.appendChild(l("Performance Display","performance")),i.className="cesium-cesiumInspector-performanceDisplay",c.appendChild(i);var h=document.createElement("div");h.className="cesium-cesiumInspector-shaderCache",h.setAttribute("data-bind","html: shaderCacheText"),c.appendChild(h);var p=document.createElement("div");c.appendChild(p);var m=document.createElement("span");m.setAttribute("data-bind",'html: "     Frustum:"'),p.appendChild(m);var f=document.createElement("span");f.setAttribute("data-bind","text: depthFrustumText"),p.appendChild(f);var g=document.createElement("input");g.type="button",g.value="-",g.className="cesium-cesiumInspector-pickButton",g.setAttribute("data-bind","click: decrementDepthFrustum"),p.appendChild(g);var _=document.createElement("input");_.type="button",_.value="+",_.className="cesium-cesiumInspector-pickButton",_.setAttribute("data-bind","click: incrementDepthFrustum"),p.appendChild(_);var y=s(o,"Primitives","primitivesVisible","togglePrimitives"),v=document.createElement("div");v.className="cesium-cesiumInspector-pickSection",y.appendChild(v);var C=document.createElement("input");C.type="button",C.value="Pick a primitive",C.className="cesium-cesiumInspector-pickButton",C.setAttribute("data-bind",'css: {"cesium-cesiumInspector-pickButtonHighlight" : pickPrimitiveActive}, click: pickPrimitive');var S=document.createElement("div");S.className="cesium-cesiumInspector-center",S.appendChild(C),v.appendChild(S),v.appendChild(l("Show bounding sphere","primitiveBoundingSphere","hasPickedPrimitive")),v.appendChild(l("Show reference frame","primitiveReferenceFrame","hasPickedPrimitive")),this._primitiveOnly=l("Show only selected","filterPrimitive","hasPickedPrimitive"),v.appendChild(this._primitiveOnly);var T=s(o,"Terrain","terrainVisible","toggleTerrain"),x=document.createElement("div");x.className="cesium-cesiumInspector-pickSection",T.appendChild(x);var b=document.createElement("input");b.type="button",b.value="Pick a tile",b.className="cesium-cesiumInspector-pickButton",b.setAttribute("data-bind",'css: {"cesium-cesiumInspector-pickButtonHighlight" : pickTileActive}, click: pickTile'),(S=document.createElement("div")).appendChild(b),S.className="cesium-cesiumInspector-center",x.appendChild(S);var E=document.createElement("div");x.appendChild(E);var P=document.createElement("input");P.type="button",P.value="Parent",P.className="cesium-cesiumInspector-pickButton",P.setAttribute("data-bind","click: selectParent");var A=document.createElement("input");A.type="button",A.value="NW",A.className="cesium-cesiumInspector-pickButton",A.setAttribute("data-bind","click: selectNW");var w=document.createElement("input");w.type="button",w.value="NE",w.className="cesium-cesiumInspector-pickButton",w.setAttribute("data-bind","click: selectNE");var D=document.createElement("input");D.type="button",D.value="SW",D.className="cesium-cesiumInspector-pickButton",D.setAttribute("data-bind","click: selectSW");var M=document.createElement("input");M.type="button",M.value="SE",M.className="cesium-cesiumInspector-pickButton",M.setAttribute("data-bind","click: selectSE");var I=document.createElement("div");I.className="cesium-cesiumInspector-tileText",E.className="cesium-cesiumInspector-frustumStatistics",E.appendChild(I),E.setAttribute("data-bind","visible: hasPickedTile"),I.setAttribute("data-bind","html: tileText");var R=document.createElement("div");R.className="cesium-cesiumInspector-relativeText",R.textContent="Select relative:",E.appendChild(R);var O=document.createElement("table"),L=document.createElement("tr"),F=document.createElement("tr"),N=document.createElement("td");N.appendChild(P);var B=document.createElement("td");B.appendChild(A);var V=document.createElement("td");V.appendChild(w),L.appendChild(N),L.appendChild(B),L.appendChild(V);var k=document.createElement("td"),z=document.createElement("td");z.appendChild(D);var $=document.createElement("td");$.appendChild(M),F.appendChild(k),F.appendChild(z),F.appendChild($),O.appendChild(L),O.appendChild(F),E.appendChild(O),x.appendChild(l("Show bounding volume","tileBoundingSphere","hasPickedTile")),x.appendChild(l("Show only selected","filterTile","hasPickedTile")),T.appendChild(l("Wireframe","wireframe")),T.appendChild(l("Suspend LOD update","suspendUpdates")),T.appendChild(l("Show tile coordinates","tileCoordinates")),knockout.applyBindings(r,this._element)}function getDefaultSkyBoxUrl(e){return buildModuleUrl("Assets/Textures/SkyBox/tycho2t3_80_"+e+".jpg")}function startRenderLoop(a){a._renderLoopRunning=!0;var o=0;requestAnimationFramePolyFill(function e(t){if(!a.isDestroyed())if(a._useDefaultRenderLoop)try{var i,r,n=a._targetFrameRate;defined(n)?(i=1e3/n)<(r=t-o)&&(a.resize(),a.render(),o=t-r%i):(a.resize(),a.render()),requestAnimationFramePolyFill(e)}catch(e){a._useDefaultRenderLoop=!1,a._renderLoopRunning=!1,a._showRenderLoopErrors&&a.showErrorPanel("An error occurred while rendering. Rendering has stopped.",void 0,e)}else a._renderLoopRunning=!1})}function configurePixelRatio(e){var t=e._useBrowserRecommendedResolution?1:window.devicePixelRatio;return t*=e._resolutionScale,defined(e._scene)&&(e._scene.pixelRatio=t),t}function configureCanvasSize(e){var t=e._canvas,i=t.clientWidth,r=t.clientHeight,n=configurePixelRatio(e);e._canvasClientWidth=i,e._canvasClientHeight=r,i*=n,r*=n,t.width=i,t.height=r,e._canRender=0!=i&&0!=r,e._lastDevicePixelRatio=window.devicePixelRatio}function configureCameraFrustum(e){var t,i=e._canvas,r=i.width,n=i.height;0!==r&&0!==n&&(defined((t=e._scene.camera.frustum).aspectRatio)?t.aspectRatio=r/n:(t.top=t.right*(n/r),t.bottom=-t.top))}function CesiumWidget(e,t){e=getElement(e),t=defaultValue(t,defaultValue.EMPTY_OBJECT);var i=document.createElement("div");i.className="cesium-widget",e.appendChild(i);var r=document.createElement("canvas"),n=FeatureDetection.supportsImageRenderingPixelated();function a(){r!==r.ownerDocument.activeElement&&r.ownerDocument.activeElement.blur()}(this._supportsImageRenderingPixelated=n)&&(r.style.imageRendering=FeatureDetection.imageRenderingValue()),r.oncontextmenu=function(){return!1},r.onselectstart=function(){return!1},r.addEventListener("mousedown",a),r.addEventListener("pointerdown",a),i.appendChild(r);var o=document.createElement("div");o.className="cesium-widget-credits";var s=defined(t.creditContainer)?getElement(t.creditContainer):i;s.appendChild(o);var l=defined(t.creditViewport)?getElement(t.creditViewport):i,c=defaultValue(t.showRenderLoopErrors,!0),u=defaultValue(t.useBrowserRecommendedResolution,!0);this._element=i,this._container=e,this._canvas=r,this._canvasClientWidth=0,this._canvasClientHeight=0,this._lastDevicePixelRatio=0,this._creditViewport=l,this._creditContainer=s,this._innerCreditContainer=o,this._canRender=!1,this._renderLoopRunning=!1,this._showRenderLoopErrors=c,this._resolutionScale=1,this._useBrowserRecommendedResolution=u,this._forceResize=!1,this._clock=defined(t.clock)?t.clock:new Clock,configureCanvasSize(this);try{var d=new Scene({canvas:r,contextOptions:t.contextOptions,creditContainer:o,creditViewport:l,mapProjection:t.mapProjection,orderIndependentTranslucency:t.orderIndependentTranslucency,scene3DOnly:defaultValue(t.scene3DOnly,!1),terrainExaggeration:t.terrainExaggeration,shadows:t.shadows,mapMode2D:t.mapMode2D,requestRenderMode:t.requestRenderMode,maximumRenderTimeChange:t.maximumRenderTimeChange});(this._scene=d).camera.constrainedAxis=Cartesian3.UNIT_Z,configurePixelRatio(this),configureCameraFrustum(this);var h=defaultValue(d.mapProjection.ellipsoid,Ellipsoid.WGS84),p=t.globe;defined(p)||(p=new Globe(h)),!1!==p&&(d.globe=p,d.globe.shadows=defaultValue(t.terrainShadows,ShadowMode$1.RECEIVE_ONLY));var m=t.skyBox;defined(m)||(m=new SkyBox({sources:{positiveX:getDefaultSkyBoxUrl("px"),negativeX:getDefaultSkyBoxUrl("mx"),positiveY:getDefaultSkyBoxUrl("py"),negativeY:getDefaultSkyBoxUrl("my"),positiveZ:getDefaultSkyBoxUrl("pz"),negativeZ:getDefaultSkyBoxUrl("mz")}})),!1!==m&&(d.skyBox=m,d.sun=new Sun,d.moon=new Moon);var f=t.skyAtmosphere;defined(f)||(f=new SkyAtmosphere(h)),!1!==f&&(d.skyAtmosphere=f);var g=!1!==t.globe&&t.imageryProvider;defined(g)||(g=createWorldImagery()),!1!==g&&d.imageryLayers.addImageryProvider(g),defined(t.terrainProvider)&&!1!==t.globe&&(d.terrainProvider=t.terrainProvider),this._screenSpaceEventHandler=new ScreenSpaceEventHandler(r),defined(t.sceneMode)&&(t.sceneMode===SceneMode$1.SCENE2D&&this._scene.morphTo2D(0),t.sceneMode===SceneMode$1.COLUMBUS_VIEW&&this._scene.morphToColumbusView(0)),this._useDefaultRenderLoop=void 0,this.useDefaultRenderLoop=defaultValue(t.useDefaultRenderLoop,!0),this._targetFrameRate=void 0,this.targetFrameRate=t.targetFrameRate;var _=this;this._onRenderError=function(e,t){_._useDefaultRenderLoop=!1,_._renderLoopRunning=!1,_._showRenderLoopErrors&&_.showErrorPanel("An error occurred while rendering. Rendering has stopped.",void 0,t)},d.renderError.addEventListener(this._onRenderError)}catch(e){throw c&&this.showErrorPanel("Error constructing CesiumWidget.",'Visit <a href="http://get.webgl.org">http://get.webgl.org</a> to verify that your web browser and hardware support WebGL. Consider trying a different web browser or updating your video drivers. Detailed error information is below:',e),e}}function FullscreenButtonViewModel(e,t){defined(t)||(t=document.body),t=getElement(t);var i=this,r=knockout.observable(Fullscreen.fullscreen),n=knockout.observable(Fullscreen.enabled),a=t.ownerDocument;this.isFullscreen=void 0,knockout.defineProperty(this,"isFullscreen",{get:function(){return r()}}),this.isFullscreenEnabled=void 0,knockout.defineProperty(this,"isFullscreenEnabled",{get:function(){return n()},set:function(e){n(e&&Fullscreen.enabled)}}),this.tooltip=void 0,knockout.defineProperty(this,"tooltip",function(){return this.isFullscreenEnabled?r()?"Exit full screen":"Full screen":"Full screen unavailable"}),this._command=createCommand$2(function(){Fullscreen.fullscreen?Fullscreen.exitFullscreen():Fullscreen.requestFullscreen(i._fullscreenElement)},knockout.getObservable(this,"isFullscreenEnabled")),this._fullscreenElement=defaultValue(getElement(e),a.body),this._callback=function(){r(Fullscreen.fullscreen)},a.addEventListener(Fullscreen.changeEventName,this._callback)}Object.defineProperties(CesiumInspectorViewModel.prototype,{scene:{get:function(){return this._scene}},performanceContainer:{get:function(){return this._performanceContainer}},toggleDropDown:{get:function(){return this._toggleDropDown}},showPrimitiveBoundingSphere:{get:function(){return this._showPrimitiveBoundingSphere}},showPrimitiveReferenceFrame:{get:function(){return this._showPrimitiveReferenceFrame}},doFilterPrimitive:{get:function(){return this._doFilterPrimitive}},incrementDepthFrustum:{get:function(){return this._incrementDepthFrustum}},decrementDepthFrustum:{get:function(){return this._decrementDepthFrustum}},showTileCoordinates:{get:function(){return this._showTileCoordinates}},showTileBoundingSphere:{get:function(){return this._showTileBoundingSphere}},doFilterTile:{get:function(){return this._doFilterTile}},toggleGeneral:{get:function(){return this._toggleGeneral}},togglePrimitives:{get:function(){return this._togglePrimitives}},toggleTerrain:{get:function(){return this._toggleTerrain}},pickPrimitive:{get:function(){return this._pickPrimitive}},pickTile:{get:function(){return this._pickTile}},selectParent:{get:function(){var e=this;return createCommand$2(function(){e.tile=e.tile.parent})}},selectNW:{get:function(){var e=this;return createCommand$2(function(){e.tile=e.tile.northwestChild})}},selectNE:{get:function(){var e=this;return createCommand$2(function(){e.tile=e.tile.northeastChild})}},selectSW:{get:function(){var e=this;return createCommand$2(function(){e.tile=e.tile.southwestChild})}},selectSE:{get:function(){var e=this;return createCommand$2(function(){e.tile=e.tile.southeastChild})}},primitive:{get:function(){return this._primitive},set:function(e){var t=this._primitive;e!==t&&(this.hasPickedPrimitive=!0,defined(t)&&(t.debugShowBoundingVolume=!1),this._scene.debugCommandFilter=void 0,defined(this._modelMatrixPrimitive)&&(this._scene.primitives.remove(this._modelMatrixPrimitive),this._modelMatrixPrimitive=void 0),(this._primitive=e).show=!1,setTimeout(function(){e.show=!0},50),this.showPrimitiveBoundingSphere(),this.showPrimitiveReferenceFrame(),this.doFilterPrimitive())}},tile:{get:function(){return this._tile},set:function(e){var t;defined(e)?(this.hasPickedTile=!0,e!==this._tile&&(this.tileText="L: "+e.level+" X: "+e.x+" Y: "+e.y,this.tileText+="<br>SW corner: "+e.rectangle.west+", "+e.rectangle.south,this.tileText+="<br>NE corner: "+e.rectangle.east+", "+e.rectangle.north,defined(t=e.data)&&defined(t.tileBoundingRegion)?this.tileText+="<br>Min: "+t.tileBoundingRegion.minimumHeight+" Max: "+t.tileBoundingRegion.maximumHeight:this.tileText+="<br>(Tile is not loaded)"),this._tile=e,this.showTileBoundingSphere(),this.doFilterTile()):(this.hasPickedTile=!1,this._tile=void 0)}}}),CesiumInspectorViewModel.prototype._update=function(){this.frustums&&(this.frustumStatisticText=frustumStatisticsToString(this._scene.debugFrustumStatistics));var e=this._scene.numberOfFrustums;this._numberOfFrustums=e,this.depthFrustum=boundDepthFrustum(1,e,this.depthFrustum),this.depthFrustumText=this.depthFrustum+" of "+e,this.performance&&this._performanceDisplay.update(),this.primitiveReferenceFrame&&(this._modelMatrixPrimitive.modelMatrix=this._primitive.modelMatrix),this.shaderCacheText="Cached shaders: "+this._scene.context.shaderCache.numberOfShaders},CesiumInspectorViewModel.prototype.isDestroyed=function(){return!1},CesiumInspectorViewModel.prototype.destroy=function(){return this._eventHandler.destroy(),this._removePostRenderEvent(),this._frustumsSubscription.dispose(),this._frustumPlanesSubscription.dispose(),this._performanceSubscription.dispose(),this._primitiveBoundingSphereSubscription.dispose(),this._primitiveReferenceFrameSubscription.dispose(),this._filterPrimitiveSubscription.dispose(),this._wireframeSubscription.dispose(),this._globeDepthSubscription.dispose(),this._pickDepthSubscription.dispose(),this._depthFrustumSubscription.dispose(),this._suspendUpdatesSubscription.dispose(),this._tileCoordinatesSubscription.dispose(),this._tileBoundingSphereSubscription.dispose(),this._filterTileSubscription.dispose(),this._pickPrimitiveActiveSubscription.dispose(),this._pickTileActiveSubscription.dispose(),destroyObject(this)},Object.defineProperties(CesiumInspector.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),CesiumInspector.prototype.isDestroyed=function(){return!1},CesiumInspector.prototype.destroy=function(){return knockout.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),destroyObject(this)},Object.defineProperties(CesiumWidget.prototype,{container:{get:function(){return this._container}},canvas:{get:function(){return this._canvas}},creditContainer:{get:function(){return this._creditContainer}},creditViewport:{get:function(){return this._creditViewport}},scene:{get:function(){return this._scene}},imageryLayers:{get:function(){return this._scene.imageryLayers}},terrainProvider:{get:function(){return this._scene.terrainProvider},set:function(e){this._scene.terrainProvider=e}},camera:{get:function(){return this._scene.camera}},clock:{get:function(){return this._clock}},screenSpaceEventHandler:{get:function(){return this._screenSpaceEventHandler}},targetFrameRate:{get:function(){return this._targetFrameRate},set:function(e){this._targetFrameRate=e}},useDefaultRenderLoop:{get:function(){return this._useDefaultRenderLoop},set:function(e){this._useDefaultRenderLoop!==e&&(this._useDefaultRenderLoop=e)&&!this._renderLoopRunning&&startRenderLoop(this)}},resolutionScale:{get:function(){return this._resolutionScale},set:function(e){this._resolutionScale!==e&&(this._resolutionScale=e,this._forceResize=!0)}},useBrowserRecommendedResolution:{get:function(){return this._useBrowserRecommendedResolution},set:function(e){this._useBrowserRecommendedResolution!==e&&(this._useBrowserRecommendedResolution=e,this._forceResize=!0)}}}),CesiumWidget.prototype.showErrorPanel=function(e,t,i){var r=this._element,n=document.createElement("div");n.className="cesium-widget-errorPanel";var a=document.createElement("div");a.className="cesium-widget-errorPanel-content",n.appendChild(a);var o=document.createElement("div");o.className="cesium-widget-errorPanel-header",o.appendChild(document.createTextNode(e)),a.appendChild(o);var s=document.createElement("div");function l(){s.style.maxHeight=Math.max(Math.round(.9*r.clientHeight-100),30)+"px"}s.className="cesium-widget-errorPanel-scroll",a.appendChild(s),l(),defined(window.addEventListener)&&window.addEventListener("resize",l,!1);var c,u,d,h,p=defined(t),m=defined(i);(p||m)&&((c=document.createElement("div")).className="cesium-widget-errorPanel-message",s.appendChild(c),m&&(u=formatError(i),p||("string"==typeof i&&(i=new Error(i)),t=formatError({name:i.name,message:i.message}),u=i.stack),"undefined"!=typeof console&&console.error(e+"\n"+t+"\n"+u),(d=document.createElement("div")).className="cesium-widget-errorPanel-message-details collapsed",(h=document.createElement("span")).className="cesium-widget-errorPanel-more-details",h.appendChild(document.createTextNode("See more...")),d.appendChild(h),d.onclick=function(e){d.removeChild(h),d.appendChild(document.createTextNode(u)),d.className="cesium-widget-errorPanel-message-details",a.className="cesium-widget-errorPanel-content expanded",d.onclick=void 0},s.appendChild(d)),c.innerHTML="<p>"+t+"</p>");var f=document.createElement("div");f.className="cesium-widget-errorPanel-buttonPanel",a.appendChild(f);var g=document.createElement("button");g.setAttribute("type","button"),g.className="cesium-button",g.appendChild(document.createTextNode("OK")),g.onclick=function(){defined(l)&&defined(window.removeEventListener)&&window.removeEventListener("resize",l,!1),r.removeChild(n)},f.appendChild(g),r.appendChild(n)},CesiumWidget.prototype.isDestroyed=function(){return!1},CesiumWidget.prototype.destroy=function(){defined(this._scene)&&(this._scene.renderError.removeEventListener(this._onRenderError),this._scene=this._scene.destroy()),this._container.removeChild(this._element),this._creditContainer.removeChild(this._innerCreditContainer),destroyObject(this)},CesiumWidget.prototype.resize=function(){var e=this._canvas;!this._forceResize&&this._canvasClientWidth===e.clientWidth&&this._canvasClientHeight===e.clientHeight&&this._lastDevicePixelRatio===window.devicePixelRatio||(this._forceResize=!1,configureCanvasSize(this),configureCameraFrustum(this),this._scene.requestRender())},CesiumWidget.prototype.render=function(){var e;this._canRender?(this._scene.initializeFrame(),e=this._clock.tick(),this._scene.render(e)):this._clock.tick()},Object.defineProperties(FullscreenButtonViewModel.prototype,{fullscreenElement:{get:function(){return this._fullscreenElement},set:function(e){this._fullscreenElement=e}},command:{get:function(){return this._command}}}),FullscreenButtonViewModel.prototype.isDestroyed=function(){return!1},FullscreenButtonViewModel.prototype.destroy=function(){document.removeEventListener(Fullscreen.changeEventName,this._callback),destroyObject(this)};var enterFullScreenPath="M 83.96875 17.5625 L 83.96875 17.59375 L 76.65625 24.875 L 97.09375 24.96875 L 76.09375 45.96875 L 81.9375 51.8125 L 102.78125 30.9375 L 102.875 51.15625 L 110.15625 43.875 L 110.1875 17.59375 L 83.96875 17.5625 z M 44.125 17.59375 L 17.90625 17.625 L 17.9375 43.90625 L 25.21875 51.1875 L 25.3125 30.96875 L 46.15625 51.8125 L 52 45.96875 L 31 25 L 51.4375 24.90625 L 44.125 17.59375 z M 46.0625 76.03125 L 25.1875 96.875 L 25.09375 76.65625 L 17.8125 83.9375 L 17.8125 110.21875 L 44 110.25 L 51.3125 102.9375 L 30.90625 102.84375 L 51.875 81.875 L 46.0625 76.03125 z M 82 76.15625 L 76.15625 82 L 97.15625 103 L 76.71875 103.0625 L 84.03125 110.375 L 110.25 110.34375 L 110.21875 84.0625 L 102.9375 76.8125 L 102.84375 97 L 82 76.15625 z",exitFullScreenPath="M 104.34375 17.5625 L 83.5 38.4375 L 83.40625 18.21875 L 76.125 25.5 L 76.09375 51.78125 L 102.3125 51.8125 L 102.3125 51.78125 L 109.625 44.5 L 89.1875 44.40625 L 110.1875 23.40625 L 104.34375 17.5625 z M 23.75 17.59375 L 17.90625 23.4375 L 38.90625 44.4375 L 18.5 44.53125 L 25.78125 51.8125 L 52 51.78125 L 51.96875 25.53125 L 44.6875 18.25 L 44.625 38.46875 L 23.75 17.59375 z M 25.6875 76.03125 L 18.375 83.3125 L 38.78125 83.40625 L 17.8125 104.40625 L 23.625 110.25 L 44.5 89.375 L 44.59375 109.59375 L 51.875 102.3125 L 51.875 76.0625 L 25.6875 76.03125 z M 102.375 76.15625 L 76.15625 76.1875 L 76.1875 102.4375 L 83.46875 109.71875 L 83.5625 89.53125 L 104.40625 110.375 L 110.25 104.53125 L 89.25 83.53125 L 109.6875 83.46875 L 102.375 76.15625 z";function FullscreenButton(e,t){var i=new FullscreenButtonViewModel(t,e=getElement(e));i._exitFullScreenPath=exitFullScreenPath,i._enterFullScreenPath=enterFullScreenPath;var r=document.createElement("button");r.type="button",r.className="cesium-button cesium-fullscreenButton",r.setAttribute("data-bind","attr: { title: tooltip },click: command,enable: isFullscreenEnabled,cesiumSvgPath: { path: isFullscreen ? _exitFullScreenPath : _enterFullScreenPath, width: 128, height: 128 }"),e.appendChild(r),knockout.applyBindings(i,r),this._container=e,this._viewModel=i,this._element=r}Object.defineProperties(FullscreenButton.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),FullscreenButton.prototype.isDestroyed=function(){return!1},FullscreenButton.prototype.destroy=function(){return this._viewModel.destroy(),knockout.cleanNode(this._element),this._container.removeChild(this._element),destroyObject(this)};var DEFAULT_HEIGHT=1e3;function GeocoderViewModel(e){defined(e.geocoderServices)?this._geocoderServices=e.geocoderServices:this._geocoderServices=[new CartographicGeocoderService,new IonGeocoderService({scene:e.scene})],this._viewContainer=e.container,this._scene=e.scene,this._flightDuration=e.flightDuration,this._searchText="",this._isSearchInProgress=!1,this._geocodePromise=void 0,this._complete=new Event,this._suggestions=[],this._selectedSuggestion=void 0,this._showSuggestions=!0,this._handleArrowDown=handleArrowDown,this._handleArrowUp=handleArrowUp;var a=this;this._suggestionsVisible=knockout.pureComputed(function(){var e=0<knockout.getObservable(a,"_suggestions")().length,t=knockout.getObservable(a,"_showSuggestions")();return e&&t}),this._searchCommand=createCommand$2(function(e){return e=defaultValue(e,GeocodeType$1.SEARCH),a._focusTextbox=!1,defined(a._selectedSuggestion)?(a.activateSuggestion(a._selectedSuggestion),!1):(a.hideSuggestions(),void(a.isSearchInProgress?cancelGeocode(a):geocode(a,a._geocoderServices,e)))}),this.deselectSuggestion=function(){a._selectedSuggestion=void 0},this.handleKeyDown=function(e,t){var i="ArrowDown"===t.key||"Down"===t.key||40===t.keyCode,r="ArrowUp"===t.key||"Up"===t.key||38===t.keyCode;return(i||r)&&t.preventDefault(),!0},this.handleKeyUp=function(e,t){var i="ArrowDown"===t.key||"Down"===t.key||40===t.keyCode,r="ArrowUp"===t.key||"Up"===t.key||38===t.keyCode,n="Enter"===t.key||13===t.keyCode;return r?handleArrowUp(a):i?handleArrowDown(a):n&&a._searchCommand(),!0},this.activateSuggestion=function(e){a.hideSuggestions(),a._searchText=e.displayName;var t=e.destination;clearSuggestions(a),a.destinationFound(a,t)},this.hideSuggestions=function(){a._showSuggestions=!1,a._selectedSuggestion=void 0},this.showSuggestions=function(){a._showSuggestions=!0},this.handleMouseover=function(e,t){e!==a._selectedSuggestion&&(a._selectedSuggestion=e)},this.keepExpanded=!1,this.autoComplete=defaultValue(e.autocomplete,!0),this.destinationFound=defaultValue(e.destinationFound,GeocoderViewModel.flyToDestination),this._focusTextbox=!1,knockout.track(this,["_searchText","_isSearchInProgress","keepExpanded","_suggestions","_selectedSuggestion","_showSuggestions","_focusTextbox"]);var t=knockout.getObservable(this,"_searchText");t.extend({rateLimit:{timeout:500}}),this._suggestionSubscription=t.subscribe(function(){GeocoderViewModel._updateSearchSuggestions(a)}),this.isSearchInProgress=void 0,knockout.defineProperty(this,"isSearchInProgress",{get:function(){return this._isSearchInProgress}}),this.searchText=void 0,knockout.defineProperty(this,"searchText",{get:function(){return this.isSearchInProgress?"Searching...":this._searchText},set:function(e){this._searchText=e}}),this.flightDuration=void 0,knockout.defineProperty(this,"flightDuration",{get:function(){return this._flightDuration},set:function(e){this._flightDuration=e}})}function handleArrowUp(e){var t,i;0!==e._suggestions.length&&(-1!==(i=e._suggestions.indexOf(e._selectedSuggestion))&&0!==i?(t=i-1,e._selectedSuggestion=e._suggestions[t],GeocoderViewModel._adjustSuggestionsScroll(e,t)):e._selectedSuggestion=void 0)}function handleArrowDown(e){var t,i;0!==e._suggestions.length&&(t=e._suggestions.length,i=(e._suggestions.indexOf(e._selectedSuggestion)+1)%t,e._selectedSuggestion=e._suggestions[i],GeocoderViewModel._adjustSuggestionsScroll(e,i))}function computeFlyToLocationForCartographic(t,e){var i=defined(e)?e.availability:void 0;return defined(i)?sampleTerrainMostDetailed(e,[t]).then(function(e){return(t=e[0]).height+=DEFAULT_HEIGHT,t}):(t.height+=DEFAULT_HEIGHT,when.resolve(t))}function flyToDestination(e,t){var i,r=e._scene,n=r.mapProjection.ellipsoid,a=r.camera,o=r.terrainProvider,s=t;t instanceof Rectangle?CesiumMath.equalsEpsilon(t.south,t.north,CesiumMath.EPSILON7)&&CesiumMath.equalsEpsilon(t.east,t.west,CesiumMath.EPSILON7)?t=Rectangle.center(t):i=computeFlyToLocationForRectangle(t,r):t=n.cartesianToCartographic(t),defined(i)||(i=computeFlyToLocationForCartographic(t,o)),i.then(function(e){s=n.cartographicToCartesian(e)}).always(function(){a.flyTo({destination:s,complete:function(){e._complete.raiseEvent()},duration:e._flightDuration,endTransform:Matrix4.IDENTITY})})}function chainPromise(e,t,i,r){return e.then(function(e){return defined(e)&&"fulfilled"===e.state&&0<e.value.length?e:t.geocode(i,r).then(function(e){return{state:"fulfilled",value:e}}).otherwise(function(e){return{state:"rejected",reason:e}})})}function geocode(i,e,t){var r=i._searchText;if(hasOnlyWhitespace(r))i.showSuggestions();else{i._isSearchInProgress=!0;for(var n=when.resolve(),a=0;a<e.length;a++)n=chainPromise(n,e[a],r,t);(i._geocodePromise=n).then(function(e){if(!n.cancel){i._isSearchInProgress=!1;var t=e.value;if("fulfilled"===e.state&&defined(t)&&0<t.length)return i._searchText=t[0].displayName,void i.destinationFound(i,t[0].destination);i._searchText=r+" (not found)"}})}}function adjustSuggestionsScroll(e,t){var i,r=getElement(e._viewContainer),n=r.getElementsByClassName("search-results")[0],a=r.getElementsByTagName("li")[t];0!==t?(i=a.offsetTop)+a.clientHeight>n.clientHeight?n.scrollTop=i+a.clientHeight:i<n.scrollTop&&(n.scrollTop=i):n.scrollTop=0}function cancelGeocode(e){e._isSearchInProgress=!1,defined(e._geocodePromise)&&(e._geocodePromise.cancel=!0,e._geocodePromise=void 0)}function hasOnlyWhitespace(e){return/^\s*$/.test(e)}function clearSuggestions(e){knockout.getObservable(e,"_suggestions").removeAll()}function updateSearchSuggestions(r){var i,t;r.autoComplete&&(i=r._searchText,clearSuggestions(r),hasOnlyWhitespace(i)||(t=when.resolve([]),r._geocoderServices.forEach(function(e){t=t.then(function(t){return 5<=t.length?t:e.geocode(i,GeocodeType$1.AUTOCOMPLETE).then(function(e){return t=t.concat(e)})})}),t.then(function(e){for(var t=r._suggestions,i=0;i<e.length;i++)t.push(e[i])})))}Object.defineProperties(GeocoderViewModel.prototype,{complete:{get:function(){return this._complete}},scene:{get:function(){return this._scene}},search:{get:function(){return this._searchCommand}},selectedSuggestion:{get:function(){return this._selectedSuggestion}},suggestions:{get:function(){return this._suggestions}}}),GeocoderViewModel.prototype.destroy=function(){this._suggestionSubscription.dispose()},GeocoderViewModel.flyToDestination=flyToDestination,GeocoderViewModel._updateSearchSuggestions=updateSearchSuggestions,GeocoderViewModel._adjustSuggestionsScroll=adjustSuggestionsScroll;var startSearchPath="M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z",stopSearchPath="M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z";function Geocoder(e){var i=getElement(e.container),r=new GeocoderViewModel(e);r._startSearchPath=startSearchPath,r._stopSearchPath=stopSearchPath;var t=document.createElement("form");t.setAttribute("data-bind","submit: search");var n=document.createElement("input");n.type="search",n.className="cesium-geocoder-input",n.setAttribute("placeholder","Enter an address or landmark..."),n.setAttribute("data-bind",'textInput: searchText,disable: isSearchInProgress,event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 },hasFocus: _focusTextbox'),this._onTextBoxFocus=function(){setTimeout(function(){n.select()},0)},n.addEventListener("focus",this._onTextBoxFocus,!1),t.appendChild(n),this._textBox=n;var a=document.createElement("span");a.className="cesium-geocoder-searchButton",a.setAttribute("data-bind","click: search,cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, width: 32, height: 32 }"),t.appendChild(a),i.appendChild(t);var o=document.createElement("div");o.className="search-results",o.setAttribute("data-bind","visible: _suggestionsVisible");var s=document.createElement("ul");s.setAttribute("data-bind","foreach: _suggestions");var l=document.createElement("li");s.appendChild(l),l.setAttribute("data-bind","text: $data.displayName, click: $parent.activateSuggestion, event: { mouseover: $parent.handleMouseover}, css: { active: $data === $parent._selectedSuggestion }"),o.appendChild(s),i.appendChild(o),knockout.applyBindings(r,t),knockout.applyBindings(r,o),this._container=i,this._searchSuggestionsContainer=o,this._viewModel=r,this._form=t,this._onInputBegin=function(e){var t=e.target;"function"==typeof e.composedPath&&(t=e.composedPath()[0]),i.contains(t)||(r._focusTextbox=!1,r.hideSuggestions())},this._onInputEnd=function(e){r._focusTextbox=!0,r.showSuggestions()},FeatureDetection.supportsPointerEvents()?(document.addEventListener("pointerdown",this._onInputBegin,!0),i.addEventListener("pointerup",this._onInputEnd,!0),i.addEventListener("pointercancel",this._onInputEnd,!0)):(document.addEventListener("mousedown",this._onInputBegin,!0),i.addEventListener("mouseup",this._onInputEnd,!0),document.addEventListener("touchstart",this._onInputBegin,!0),i.addEventListener("touchend",this._onInputEnd,!0),i.addEventListener("touchcancel",this._onInputEnd,!0))}function HomeButtonViewModel(e,t){this._scene=e,this._duration=t;var i=this;this._command=createCommand$2(function(){i._scene.camera.flyHome(i._duration)}),this.tooltip="View Home",knockout.track(this,["tooltip"])}function HomeButton(e,t,i){e=getElement(e);var r=new HomeButtonViewModel(t,i);r._svgPath="M14,4l-10,8.75h20l-4.25-3.7188v-4.6562h-2.812v2.1875l-2.938-2.5625zm-7.0938,9.906v10.094h14.094v-10.094h-14.094zm2.1876,2.313h3.3122v4.25h-3.3122v-4.25zm5.8442,1.281h3.406v6.438h-3.406v-6.438z";var n=document.createElement("button");n.type="button",n.className="cesium-button cesium-toolbar-button cesium-home-button",n.setAttribute("data-bind","attr: { title: tooltip },click: command,cesiumSvgPath: { path: _svgPath, width: 28, height: 28 }"),e.appendChild(n),knockout.applyBindings(r,n),this._container=e,this._viewModel=r,this._element=n}Object.defineProperties(Geocoder.prototype,{container:{get:function(){return this._container}},searchSuggestionsContainer:{get:function(){return this._searchSuggestionsContainer}},viewModel:{get:function(){return this._viewModel}}}),Geocoder.prototype.isDestroyed=function(){return!1},Geocoder.prototype.destroy=function(){var e=this._container;return FeatureDetection.supportsPointerEvents()?(document.removeEventListener("pointerdown",this._onInputBegin,!0),e.removeEventListener("pointerup",this._onInputEnd,!0)):(document.removeEventListener("mousedown",this._onInputBegin,!0),e.removeEventListener("mouseup",this._onInputEnd,!0),document.removeEventListener("touchstart",this._onInputBegin,!0),e.removeEventListener("touchend",this._onInputEnd,!0)),this._viewModel.destroy(),knockout.cleanNode(this._form),knockout.cleanNode(this._searchSuggestionsContainer),e.removeChild(this._form),e.removeChild(this._searchSuggestionsContainer),this._textBox.removeEventListener("focus",this._onTextBoxFocus,!1),destroyObject(this)},Object.defineProperties(HomeButtonViewModel.prototype,{scene:{get:function(){return this._scene}},command:{get:function(){return this._command}},duration:{get:function(){return this._duration},set:function(e){this._duration=e}}}),Object.defineProperties(HomeButton.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),HomeButton.prototype.isDestroyed=function(){return!1},HomeButton.prototype.destroy=function(){return knockout.cleanNode(this._element),this._container.removeChild(this._element),destroyObject(this)};var cameraEnabledPath="M 13.84375 7.03125 C 11.412798 7.03125 9.46875 8.975298 9.46875 11.40625 L 9.46875 11.59375 L 2.53125 7.21875 L 2.53125 24.0625 L 9.46875 19.6875 C 9.4853444 22.104033 11.423165 24.0625 13.84375 24.0625 L 25.875 24.0625 C 28.305952 24.0625 30.28125 22.087202 30.28125 19.65625 L 30.28125 11.40625 C 30.28125 8.975298 28.305952 7.03125 25.875 7.03125 L 13.84375 7.03125 z",cameraDisabledPath="M 27.34375 1.65625 L 5.28125 27.9375 L 8.09375 30.3125 L 30.15625 4.03125 L 27.34375 1.65625 z M 13.84375 7.03125 C 11.412798 7.03125 9.46875 8.975298 9.46875 11.40625 L 9.46875 11.59375 L 2.53125 7.21875 L 2.53125 24.0625 L 9.46875 19.6875 C 9.4724893 20.232036 9.5676108 20.7379 9.75 21.21875 L 21.65625 7.03125 L 13.84375 7.03125 z M 28.21875 7.71875 L 14.53125 24.0625 L 25.875 24.0625 C 28.305952 24.0625 30.28125 22.087202 30.28125 19.65625 L 30.28125 11.40625 C 30.28125 9.8371439 29.456025 8.4902779 28.21875 7.71875 z";function InfoBoxViewModel(){this._cameraClicked=new Event,this._closeClicked=new Event,this.maxHeight=500,this.enableCamera=!1,this.isCameraTracking=!1,this.showInfo=!1,this.titleText="",this.description="",knockout.track(this,["showInfo","titleText","description","maxHeight","enableCamera","isCameraTracking"]),this._loadingIndicatorHtml='<div class="cesium-infoBox-loadingContainer"><span class="cesium-infoBox-loading"></span></div>',this.cameraIconPath=void 0,knockout.defineProperty(this,"cameraIconPath",{get:function(){return!this.enableCamera||this.isCameraTracking?cameraDisabledPath:cameraEnabledPath}}),knockout.defineProperty(this,"_bodyless",{get:function(){return!defined(this.description)||0===this.description.length}})}function InfoBox(e){e=getElement(e);var l=document.createElement("div");l.className="cesium-infoBox",l.setAttribute("data-bind",'css: { "cesium-infoBox-visible" : showInfo, "cesium-infoBox-bodyless" : _bodyless }'),e.appendChild(l);var t=document.createElement("div");t.className="cesium-infoBox-title",t.setAttribute("data-bind","text: titleText"),l.appendChild(t);var i=document.createElement("button");i.type="button",i.className="cesium-button cesium-infoBox-camera",i.setAttribute("data-bind",'attr: { title: "Focus camera on object" },click: function () { cameraClicked.raiseEvent(this); },enable: enableCamera,cesiumSvgPath: { path: cameraIconPath, width: 32, height: 32 }'),l.appendChild(i);var r=document.createElement("button");r.type="button",r.className="cesium-infoBox-close",r.setAttribute("data-bind","click: function () { closeClicked.raiseEvent(this); }"),r.innerHTML="×",l.appendChild(r);var c=document.createElement("iframe");c.className="cesium-infoBox-iframe",c.setAttribute("sandbox","allow-same-origin allow-popups allow-forms"),c.setAttribute("data-bind","style : { maxHeight : maxHeightOffset(40) }"),c.setAttribute("allowfullscreen",!0),l.appendChild(c);var n=new InfoBoxViewModel;knockout.applyBindings(n,l),this._container=e,this._element=l,this._frame=c,this._viewModel=n,this._descriptionSubscription=void 0;var a=this;c.addEventListener("load",function(){var e=c.contentDocument,t=e.createElement("link");t.href=buildModuleUrl("Widgets/InfoBox/InfoBoxDescription.css"),t.rel="stylesheet",t.type="text/css";var s=e.createElement("div");s.className="cesium-infoBox-description",e.head.appendChild(t),e.body.appendChild(s),a._descriptionSubscription=subscribeAndEvaluate(n,"description",function(e){c.style.height="5px",s.innerHTML=e;var t,i,r,n=null,a=s.firstElementChild;null===a||1!==s.childNodes.length||null!==(t=window.getComputedStyle(a))&&(i=t["background-color"],defined(r=Color.fromCssColorString(i))&&0!==r.alpha&&(n=t["background-color"])),l.style["background-color"]=n;var o=s.getBoundingClientRect().height;c.style.height=o+"px"})}),c.setAttribute("src","about:blank")}function NavigationHelpButtonViewModel(){this.showInstructions=!1;var e=this;this._command=createCommand$2(function(){e.showInstructions=!e.showInstructions}),this._showClick=createCommand$2(function(){e._touch=!1}),this._showTouch=createCommand$2(function(){e._touch=!0}),this._touch=!1,this.tooltip="Navigation Instructions",knockout.track(this,["tooltip","showInstructions","_touch"])}function NavigationHelpButton(e){var t=getElement(e.container),i=new NavigationHelpButtonViewModel,r=defaultValue(e.instructionsInitiallyVisible,!1);i.showInstructions=r,i._svgPath="M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.328,24.371h-2.707v-2.596h2.707V24.371zM17.328,19.003v0.858h-2.707v-1.057c0-3.19,3.63-3.696,3.63-5.963c0-1.034-0.924-1.826-2.134-1.826c-1.254,0-2.354,0.924-2.354,0.924l-1.541-1.915c0,0,1.519-1.584,4.137-1.584c2.487,0,4.796,1.54,4.796,4.136C21.156,16.208,17.328,16.627,17.328,19.003z";var n=document.createElement("span");n.className="cesium-navigationHelpButton-wrapper",t.appendChild(n);var a=document.createElement("button");a.type="button",a.className="cesium-button cesium-toolbar-button cesium-navigation-help-button",a.setAttribute("data-bind","attr: { title: tooltip },click: command,cesiumSvgPath: { path: _svgPath, width: 32, height: 32 }"),n.appendChild(a);var o=document.createElement("div");o.className="cesium-navigation-help",o.setAttribute("data-bind",'css: { "cesium-navigation-help-visible" : showInstructions}'),n.appendChild(o);var s=document.createElement("button");s.type="button",s.className="cesium-navigation-button cesium-navigation-button-left",s.setAttribute("data-bind",'click: showClick, css: {"cesium-navigation-button-selected": !_touch, "cesium-navigation-button-unselected": _touch}');var l=document.createElement("img");l.src=buildModuleUrl("Widgets/Images/NavigationHelp/Mouse.svg"),l.className="cesium-navigation-button-icon",l.style.width="25px",l.style.height="25px",s.appendChild(l),s.appendChild(document.createTextNode("Mouse"));var c=document.createElement("button");c.type="button",c.className="cesium-navigation-button cesium-navigation-button-right",c.setAttribute("data-bind",'click: showTouch, css: {"cesium-navigation-button-selected": _touch, "cesium-navigation-button-unselected": !_touch}');var u=document.createElement("img");u.src=buildModuleUrl("Widgets/Images/NavigationHelp/Touch.svg"),u.className="cesium-navigation-button-icon",u.style.width="25px",u.style.height="25px",c.appendChild(u),c.appendChild(document.createTextNode("Touch")),o.appendChild(s),o.appendChild(c);var d=document.createElement("div");d.className="cesium-click-navigation-help cesium-navigation-help-instructions",d.setAttribute("data-bind",'css: { "cesium-click-navigation-help-visible" : !_touch}'),d.innerHTML=' <table> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/MouseLeft.svg")+'" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-pan">Pan view</div> <div class="cesium-navigation-help-details">Left click + drag</div> </td> </tr> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/MouseRight.svg")+'" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-zoom">Zoom view</div> <div class="cesium-navigation-help-details">Right click + drag, or</div> <div class="cesium-navigation-help-details">Mouse wheel scroll</div> </td> </tr> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/MouseMiddle.svg")+'" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-rotate">Rotate view</div> <div class="cesium-navigation-help-details">Middle click + drag, or</div> <div class="cesium-navigation-help-details">CTRL + Left/Right click + drag</div> </td> </tr> </table>',o.appendChild(d);var h=document.createElement("div");h.className="cesium-touch-navigation-help cesium-navigation-help-instructions",h.setAttribute("data-bind",'css: { "cesium-touch-navigation-help-visible" : _touch}'),h.innerHTML=' <table> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/TouchDrag.svg")+'" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-pan">Pan view</div> <div class="cesium-navigation-help-details">One finger drag</div> </td> </tr> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/TouchZoom.svg")+'" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-zoom">Zoom view</div> <div class="cesium-navigation-help-details">Two finger pinch</div> </td> </tr> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/TouchTilt.svg")+'" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-rotate">Tilt view</div> <div class="cesium-navigation-help-details">Two finger drag, same direction</div> </td> </tr> <tr> <td><img src="'+buildModuleUrl("Widgets/Images/NavigationHelp/TouchRotate.svg")+'" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-tilt">Rotate view</div> <div class="cesium-navigation-help-details">Two finger drag, opposite direction</div> </td> </tr> </table>',o.appendChild(h),knockout.applyBindings(i,n),this._container=t,this._viewModel=i,this._wrapper=n,this._closeInstructions=function(e){n.contains(e.target)||(i.showInstructions=!1)},FeatureDetection.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeInstructions,!0):(document.addEventListener("mousedown",this._closeInstructions,!0),document.addEventListener("touchstart",this._closeInstructions,!0))}function PerformanceWatchdogViewModel(e){this._scene=e.scene,this.lowFrameRateMessage=defaultValue(e.lowFrameRateMessage,"This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers."),this.lowFrameRateMessageDismissed=!1,this.showingLowFrameRateMessage=!1,knockout.track(this,["lowFrameRateMessage","lowFrameRateMessageDismissed","showingLowFrameRateMessage"]);var t=this;this._dismissMessage=createCommand$2(function(){t.showingLowFrameRateMessage=!1,t.lowFrameRateMessageDismissed=!0});var i=FrameRateMonitor.fromScene(e.scene);this._unsubscribeLowFrameRate=i.lowFrameRate.addEventListener(function(){t.lowFrameRateMessageDismissed||(t.showingLowFrameRateMessage=!0)}),this._unsubscribeNominalFrameRate=i.nominalFrameRate.addEventListener(function(){t.showingLowFrameRateMessage=!1})}function PerformanceWatchdog(e){var t=getElement(e.container),i=new PerformanceWatchdogViewModel(e),r=document.createElement("div");r.className="cesium-performance-watchdog-message-area",r.setAttribute("data-bind","visible: showingLowFrameRateMessage");var n=document.createElement("button");n.setAttribute("type","button"),n.className="cesium-performance-watchdog-message-dismiss",n.innerHTML="×",n.setAttribute("data-bind","click: dismissMessage"),r.appendChild(n);var a=document.createElement("div");a.className="cesium-performance-watchdog-message",a.setAttribute("data-bind","html: lowFrameRateMessage"),r.appendChild(a),t.appendChild(r),knockout.applyBindings(i,r),this._container=t,this._viewModel=i,this._element=r}function ProjectionPickerViewModel(e){this._scene=e,this._orthographic=e.camera.frustum instanceof OrthographicFrustum,this._flightInProgress=!1,this.dropDownVisible=!1,this.tooltipPerspective="Perspective Projection",this.tooltipOrthographic="Orthographic Projection",this.selectedTooltip=void 0,this.sceneMode=e.mode,knockout.track(this,["_orthographic","_flightInProgress","sceneMode","dropDownVisible","tooltipPerspective","tooltipOrthographic"]);var n=this;knockout.defineProperty(this,"selectedTooltip",function(){return n._orthographic?n.tooltipOrthographic:n.tooltipPerspective}),this._toggleDropDown=createCommand$2(function(){n.sceneMode===SceneMode$1.SCENE2D||n._flightInProgress||(n.dropDownVisible=!n.dropDownVisible)}),this._eventHelper=new EventHelper,this._eventHelper.add(e.morphComplete,function(e,t,i,r){n.sceneMode=i,n._orthographic=i===SceneMode$1.SCENE2D||n._scene.camera.frustum instanceof OrthographicFrustum}),this._eventHelper.add(e.preRender,function(){n._flightInProgress=defined(e.camera._currentFlight)}),this._switchToPerspective=createCommand$2(function(){n.sceneMode!==SceneMode$1.SCENE2D&&(n._scene.camera.switchToPerspectiveFrustum(),n._orthographic=!1,n.dropDownVisible=!1)}),this._switchToOrthographic=createCommand$2(function(){n.sceneMode!==SceneMode$1.SCENE2D&&(n._scene.camera.switchToOrthographicFrustum(),n._orthographic=!0,n.dropDownVisible=!1)}),this._sceneMode=SceneMode$1}InfoBoxViewModel.prototype.maxHeightOffset=function(e){return this.maxHeight-e+"px"},Object.defineProperties(InfoBoxViewModel.prototype,{cameraClicked:{get:function(){return this._cameraClicked}},closeClicked:{get:function(){return this._closeClicked}}}),Object.defineProperties(InfoBox.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}},frame:{get:function(){return this._frame}}}),InfoBox.prototype.isDestroyed=function(){return!1},InfoBox.prototype.destroy=function(){var e=this._container;return knockout.cleanNode(this._element),e.removeChild(this._element),defined(this._descriptionSubscription)&&this._descriptionSubscription.dispose(),destroyObject(this)},Object.defineProperties(NavigationHelpButtonViewModel.prototype,{command:{get:function(){return this._command}},showClick:{get:function(){return this._showClick}},showTouch:{get:function(){return this._showTouch}}}),Object.defineProperties(NavigationHelpButton.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),NavigationHelpButton.prototype.isDestroyed=function(){return!1},NavigationHelpButton.prototype.destroy=function(){return FeatureDetection.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeInstructions,!0):(document.removeEventListener("mousedown",this._closeInstructions,!0),document.removeEventListener("touchstart",this._closeInstructions,!0)),knockout.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),destroyObject(this)},Object.defineProperties(PerformanceWatchdogViewModel.prototype,{scene:{get:function(){return this._scene}},dismissMessage:{get:function(){return this._dismissMessage}}}),PerformanceWatchdogViewModel.prototype.destroy=function(){return this._unsubscribeLowFrameRate(),this._unsubscribeNominalFrameRate(),destroyObject(this)},Object.defineProperties(PerformanceWatchdog.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),PerformanceWatchdog.prototype.isDestroyed=function(){return!1},PerformanceWatchdog.prototype.destroy=function(){return this._viewModel.destroy(),knockout.cleanNode(this._element),this._container.removeChild(this._element),destroyObject(this)},Object.defineProperties(ProjectionPickerViewModel.prototype,{scene:{get:function(){return this._scene}},toggleDropDown:{get:function(){return this._toggleDropDown}},switchToPerspective:{get:function(){return this._switchToPerspective}},switchToOrthographic:{get:function(){return this._switchToOrthographic}},isOrthographicProjection:{get:function(){return this._orthographic}}}),ProjectionPickerViewModel.prototype.isDestroyed=function(){return!1},ProjectionPickerViewModel.prototype.destroy=function(){this._eventHelper.removeAll(),destroyObject(this)};var perspectivePath="M 28.15625,10.4375 9.125,13.21875 13.75,43.25 41.75,55.09375 50.8125,37 54.5,11.9375 z m 0.125,3 19.976451,0.394265 L 43.03125,16.875 22.6875,14.28125 z M 50.971746,15.705477 47.90625,36.03125 42.53125,46 44.84375,19.3125 z M 12.625,16.03125 l 29.15625,3.6875 -2.65625,31 L 16.4375,41.125 z",orthographicPath="m 31.560594,6.5254438 -20.75,12.4687502 0.1875,24.5625 22.28125,11.8125 19.5,-12 0.65625,-0.375 0,-0.75 0.0312,-23.21875 z m 0.0625,3.125 16.65625,9.5000002 -16.125,10.28125 -17.34375,-9.71875 z m 18.96875,11.1875002 0.15625,20.65625 -17.46875,10.59375 0.15625,-20.28125 z m -37.0625,1.25 17.21875,9.625 -0.15625,19.21875 -16.9375,-9 z";function ProjectionPicker(e,t){e=getElement(e);var i=new ProjectionPickerViewModel(t);i._perspectivePath=perspectivePath,i._orthographicPath=orthographicPath;var r=document.createElement("span");r.className="cesium-projectionPicker-wrapper cesium-toolbar-button",e.appendChild(r);var n=document.createElement("button");n.type="button",n.className="cesium-button cesium-toolbar-button",n.setAttribute("data-bind",'css: { "cesium-projectionPicker-buttonPerspective": !_orthographic, "cesium-projectionPicker-buttonOrthographic": _orthographic, "cesium-button-disabled" : sceneMode === _sceneMode.SCENE2D || _flightInProgress, "cesium-projectionPicker-selected": dropDownVisible },attr: { title: selectedTooltip },click: toggleDropDown'),n.innerHTML='\x3c!-- ko cesiumSvgPath: { path: _perspectivePath, width: 64, height: 64, css: "cesium-projectionPicker-iconPerspective" } --\x3e\x3c!-- /ko --\x3e\x3c!-- ko cesiumSvgPath: { path: _orthographicPath, width: 64, height: 64, css: "cesium-projectionPicker-iconOrthographic" } --\x3e\x3c!-- /ko --\x3e',r.appendChild(n);var a=document.createElement("button");a.type="button",a.className="cesium-button cesium-toolbar-button cesium-projectionPicker-dropDown-icon",a.setAttribute("data-bind",'css: { "cesium-projectionPicker-visible" : (dropDownVisible && _orthographic), "cesium-projectionPicker-none" : !_orthographic, "cesium-projectionPicker-hidden" : !dropDownVisible },attr: { title: tooltipPerspective },click: switchToPerspective,cesiumSvgPath: { path: _perspectivePath, width: 64, height: 64 }'),r.appendChild(a);var o=document.createElement("button");o.type="button",o.className="cesium-button cesium-toolbar-button cesium-projectionPicker-dropDown-icon",o.setAttribute("data-bind",'css: { "cesium-projectionPicker-visible" : (dropDownVisible && !_orthographic), "cesium-projectionPicker-none" : _orthographic, "cesium-projectionPicker-hidden" : !dropDownVisible},attr: { title: tooltipOrthographic },click: switchToOrthographic,cesiumSvgPath: { path: _orthographicPath, width: 64, height: 64 }'),r.appendChild(o),knockout.applyBindings(i,r),this._viewModel=i,this._container=e,this._wrapper=r,this._closeDropDown=function(e){r.contains(e.target)||(i.dropDownVisible=!1)},FeatureDetection.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}function SceneModePickerViewModel(e,t){this._scene=e;var n=this;this._eventHelper=new EventHelper,this._eventHelper.add(e.morphStart,function(e,t,i,r){n.sceneMode=i,n.dropDownVisible=!1}),this._duration=defaultValue(t,2),this.sceneMode=e.mode,this.dropDownVisible=!1,this.tooltip2D="2D",this.tooltip3D="3D",this.tooltipColumbusView="Columbus View",knockout.track(this,["sceneMode","dropDownVisible","tooltip2D","tooltip3D","tooltipColumbusView"]),this.selectedTooltip=void 0,knockout.defineProperty(this,"selectedTooltip",function(){var e=n.sceneMode;return e===SceneMode$1.SCENE2D?n.tooltip2D:e===SceneMode$1.SCENE3D?n.tooltip3D:n.tooltipColumbusView}),this._toggleDropDown=createCommand$2(function(){n.dropDownVisible=!n.dropDownVisible}),this._morphTo2D=createCommand$2(function(){e.morphTo2D(n._duration)}),this._morphTo3D=createCommand$2(function(){e.morphTo3D(n._duration)}),this._morphToColumbusView=createCommand$2(function(){e.morphToColumbusView(n._duration)}),this._sceneMode=SceneMode$1}Object.defineProperties(ProjectionPicker.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),ProjectionPicker.prototype.isDestroyed=function(){return!1},ProjectionPicker.prototype.destroy=function(){return this._viewModel.destroy(),FeatureDetection.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),knockout.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),destroyObject(this)},Object.defineProperties(SceneModePickerViewModel.prototype,{scene:{get:function(){return this._scene}},duration:{get:function(){return this._duration},set:function(e){this._duration=e}},toggleDropDown:{get:function(){return this._toggleDropDown}},morphTo2D:{get:function(){return this._morphTo2D}},morphTo3D:{get:function(){return this._morphTo3D}},morphToColumbusView:{get:function(){return this._morphToColumbusView}}}),SceneModePickerViewModel.prototype.isDestroyed=function(){return!1},SceneModePickerViewModel.prototype.destroy=function(){this._eventHelper.removeAll(),destroyObject(this)};var globePath="m 32.401392,4.9330437 c -7.087603,0 -14.096095,2.884602 -19.10793,7.8946843 -5.0118352,5.010083 -7.9296167,11.987468 -7.9296167,19.072999 0,7.085531 2.9177815,14.097848 7.9296167,19.107931 4.837653,4.835961 11.541408,7.631372 18.374354,7.82482 0.05712,0.01231 0.454119,0.139729 0.454119,0.139729 l 0.03493,-0.104797 c 0.08246,7.84e-4 0.162033,0.03493 0.244525,0.03493 0.08304,0 0.161515,-0.03414 0.244526,-0.03493 l 0.03493,0.104797 c 0,0 0.309474,-0.129487 0.349323,-0.139729 6.867765,-0.168094 13.582903,-2.965206 18.444218,-7.82482 2.558195,-2.5573 4.551081,-5.638134 5.903547,-8.977584 1.297191,-3.202966 2.02607,-6.661489 2.02607,-10.130347 0,-6.237309 -2.366261,-12.31219 -6.322734,-17.116794 -0.0034,-0.02316 0.0049,-0.04488 0,-0.06986 -0.01733,-0.08745 -0.104529,-0.278855 -0.104797,-0.279458 -5.31e-4,-0.0012 -0.522988,-0.628147 -0.523984,-0.62878 -3.47e-4,-2.2e-4 -0.133444,-0.03532 -0.244525,-0.06987 C 51.944299,13.447603 51.751076,13.104317 51.474391,12.827728 46.462556,7.8176457 39.488996,4.9330437 32.401392,4.9330437 z m -2.130866,3.5281554 0.104797,9.6762289 c -4.111695,-0.08361 -7.109829,-0.423664 -9.257041,-0.943171 1.198093,-2.269271 2.524531,-4.124404 3.91241,-5.414496 2.167498,-2.0147811 3.950145,-2.8540169 5.239834,-3.3185619 z m 2.794579,0 c 1.280302,0.4754953 3.022186,1.3285948 5.065173,3.2486979 1.424667,1.338973 2.788862,3.303645 3.982275,5.728886 -2.29082,0.403367 -5.381258,0.621049 -8.942651,0.698645 L 33.065105,8.4611991 z m 5.728886,0.2445256 c 4.004072,1.1230822 7.793098,3.1481363 10.724195,6.0782083 0.03468,0.03466 0.07033,0.06991 0.104797,0.104797 -0.45375,0.313891 -0.923054,0.663002 -1.956205,1.082899 -0.647388,0.263114 -1.906242,0.477396 -2.829511,0.733577 -1.382296,-2.988132 -3.027146,-5.368585 -4.785716,-7.0213781 -0.422866,-0.397432 -0.835818,-0.6453247 -1.25756,-0.9781032 z m -15.33525,0.7685092 c -0.106753,0.09503 -0.207753,0.145402 -0.31439,0.244526 -1.684973,1.5662541 -3.298068,3.8232211 -4.680919,6.5672591 -0.343797,-0.14942 -1.035052,-0.273198 -1.292493,-0.419186 -0.956528,-0.542427 -1.362964,-1.022024 -1.537018,-1.292493 -0.0241,-0.03745 -0.01868,-0.0401 -0.03493,-0.06986 2.250095,-2.163342 4.948824,-3.869984 7.859752,-5.0302421 z m -9.641296,7.0912431 c 0.464973,0.571618 0.937729,1.169056 1.956205,1.746612 0.349907,0.198425 1.107143,0.335404 1.537018,0.523983 -1.20166,3.172984 -1.998037,7.051901 -2.165798,11.772162 C 14.256557,30.361384 12.934823,30.161483 12.280427,29.90959 10.644437,29.279855 9.6888882,28.674891 9.1714586,28.267775 8.6540289,27.860658 8.6474751,27.778724 8.6474751,27.778724 l -0.069864,0.03493 C 9.3100294,23.691285 11.163248,19.798527 13.817445,16.565477 z m 37.552149,0.523984 c 2.548924,3.289983 4.265057,7.202594 4.890513,11.318043 -0.650428,0.410896 -1.756876,1.001936 -3.563088,1.606882 -1.171552,0.392383 -3.163859,0.759153 -4.960377,1.117832 -0.04367,-4.752703 -0.784809,-8.591423 -1.88634,-11.807094 0.917574,-0.263678 2.170552,-0.486495 2.864443,-0.76851 1.274693,-0.518066 2.003942,-1.001558 2.654849,-1.467153 z m -31.439008,2.619917 c 2.487341,0.672766 5.775813,1.137775 10.479669,1.222628 l 0.104797,10.689263 0,0.03493 0,0.733577 c -5.435005,-0.09059 -9.512219,-0.519044 -12.610536,-1.117831 0.106127,-4.776683 0.879334,-8.55791 2.02607,-11.562569 z m 23.264866,0.31439 c 1.073459,3.067541 1.833795,6.821314 1.816476,11.702298 -3.054474,0.423245 -7.062018,0.648559 -11.702298,0.698644 l 0,-0.838373 -0.104796,-10.654331 c 4.082416,-0.0864 7.404468,-0.403886 9.990618,-0.908238 z M 8.2632205,30.922625 c 0.7558676,0.510548 1.5529563,1.013339 3.0041715,1.57195 0.937518,0.360875 2.612202,0.647642 3.91241,0.978102 0.112814,3.85566 0.703989,7.107756 1.606883,9.920754 -1.147172,-0.324262 -2.644553,-0.640648 -3.423359,-0.978102 -1.516688,-0.657177 -2.386627,-1.287332 -2.864443,-1.71168 -0.477816,-0.424347 -0.489051,-0.489051 -0.489051,-0.489051 L 9.8002387,40.319395 C 8.791691,37.621767 8.1584238,34.769583 8.1584238,31.900727 c 0,-0.330153 0.090589,-0.648169 0.1047967,-0.978102 z m 48.2763445,0.419186 c 0.0047,0.188973 0.06986,0.36991 0.06986,0.558916 0,2.938869 -0.620228,5.873558 -1.676747,8.628261 -0.07435,0.07583 -0.06552,0.07411 -0.454119,0.349323 -0.606965,0.429857 -1.631665,1.042044 -3.318562,1.676747 -1.208528,0.454713 -3.204964,0.850894 -5.135038,1.25756 0.84593,-2.765726 1.41808,-6.005357 1.606883,-9.815957 2.232369,-0.413371 4.483758,-0.840201 5.938479,-1.327425 1.410632,-0.472457 2.153108,-0.89469 2.96924,-1.327425 z m -38.530252,2.864443 c 3.208141,0.56697 7.372279,0.898588 12.575603,0.978103 l 0.174662,9.885821 c -4.392517,-0.06139 -8.106722,-0.320566 -10.863925,-0.803441 -1.051954,-2.664695 -1.692909,-6.043794 -1.88634,-10.060483 z m 26.793022,0.31439 c -0.246298,3.923551 -0.877762,7.263679 -1.816476,9.885822 -2.561957,0.361954 -5.766249,0.560708 -9.431703,0.62878 l -0.174661,-9.815957 c 4.491734,-0.04969 8.334769,-0.293032 11.42284,-0.698645 z M 12.035901,44.860585 c 0.09977,0.04523 0.105535,0.09465 0.209594,0.139729 1.337656,0.579602 3.441099,1.058072 5.589157,1.537018 1.545042,3.399208 3.548524,5.969402 5.589157,7.789888 -3.034411,-1.215537 -5.871615,-3.007978 -8.174142,-5.309699 -1.245911,-1.245475 -2.271794,-2.662961 -3.213766,-4.156936 z m 40.69605,0 c -0.941972,1.493975 -1.967855,2.911461 -3.213765,4.156936 -2.74253,2.741571 -6.244106,4.696717 -9.955686,5.868615 0.261347,-0.241079 0.507495,-0.394491 0.768509,-0.663713 1.674841,-1.727516 3.320792,-4.181056 4.645987,-7.265904 2.962447,-0.503021 5.408965,-1.122293 7.161107,-1.781544 0.284034,-0.106865 0.337297,-0.207323 0.593848,-0.31439 z m -31.404076,2.305527 c 2.645807,0.376448 5.701178,0.649995 9.466635,0.698645 l 0.139729,7.789888 c -1.38739,-0.480844 -3.316218,-1.29837 -5.659022,-3.388427 -1.388822,-1.238993 -2.743668,-3.0113 -3.947342,-5.100106 z m 20.365491,0.104797 c -1.04872,2.041937 -2.174337,3.779068 -3.353494,4.995309 -1.853177,1.911459 -3.425515,2.82679 -4.611055,3.353494 l -0.139729,-7.789887 c 3.13091,-0.05714 5.728238,-0.278725 8.104278,-0.558916 z",flatMapPath="m 2.9825053,17.550598 0,1.368113 0,26.267766 0,1.368113 1.36811,0 54.9981397,0 1.36811,0 0,-1.368113 0,-26.267766 0,-1.368113 -1.36811,0 -54.9981397,0 -1.36811,0 z m 2.73623,2.736226 10.3292497,0 0,10.466063 -10.3292497,0 0,-10.466063 z m 13.0654697,0 11.69737,0 0,10.466063 -11.69737,0 0,-10.466063 z m 14.43359,0 11.69737,0 0,10.466063 -11.69737,0 0,-10.466063 z m 14.43359,0 10.32926,0 0,10.466063 -10.32926,0 0,-10.466063 z m -41.9326497,13.202288 10.3292497,0 0,10.329252 -10.3292497,0 0,-10.329252 z m 13.0654697,0 11.69737,0 0,10.329252 -11.69737,0 0,-10.329252 z m 14.43359,0 11.69737,0 0,10.329252 -11.69737,0 0,-10.329252 z m 14.43359,0 10.32926,0 0,10.329252 -10.32926,0 0,-10.329252 z",columbusViewPath="m 14.723969,17.675598 -0.340489,0.817175 -11.1680536,26.183638 -0.817175,1.872692 2.076986,0 54.7506996,0 2.07698,0 -0.81717,-1.872692 -11.16805,-26.183638 -0.34049,-0.817175 -0.91933,0 -32.414586,0 -0.919322,0 z m 1.838643,2.723916 6.196908,0 -2.928209,10.418977 -7.729111,0 4.460412,-10.418977 z m 9.02297,0 4.903049,0 0,10.418977 -7.831258,0 2.928209,-10.418977 z m 7.626964,0 5.584031,0 2.62176,10.418977 -8.205791,0 0,-10.418977 z m 8.410081,0 5.51593,0 4.46042,10.418977 -7.38863,0 -2.58772,-10.418977 z m -30.678091,13.142892 8.103649,0 -2.89416,10.282782 -9.6018026,0 4.3923136,-10.282782 z m 10.929711,0 8.614384,0 0,10.282782 -11.508544,0 2.89416,-10.282782 z m 11.338299,0 8.852721,0 2.58772,10.282782 -11.440441,0 0,-10.282782 z m 11.678781,0 7.86531,0 4.39231,10.282782 -9.6699,0 -2.58772,-10.282782 z";function SceneModePicker(e,t,i){e=getElement(e);var r=new SceneModePickerViewModel(t,i);r._globePath=globePath,r._flatMapPath=flatMapPath,r._columbusViewPath=columbusViewPath;var n=document.createElement("span");n.className="cesium-sceneModePicker-wrapper cesium-toolbar-button",e.appendChild(n);var a=document.createElement("button");a.type="button",a.className="cesium-button cesium-toolbar-button",a.setAttribute("data-bind",'css: { "cesium-sceneModePicker-button2D": sceneMode === _sceneMode.SCENE2D, "cesium-sceneModePicker-button3D": sceneMode === _sceneMode.SCENE3D, "cesium-sceneModePicker-buttonColumbusView": sceneMode === _sceneMode.COLUMBUS_VIEW, "cesium-sceneModePicker-selected": dropDownVisible },attr: { title: selectedTooltip },click: toggleDropDown'),a.innerHTML='\x3c!-- ko cesiumSvgPath: { path: _globePath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-icon3D" } --\x3e\x3c!-- /ko --\x3e\x3c!-- ko cesiumSvgPath: { path: _flatMapPath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-icon2D" } --\x3e\x3c!-- /ko --\x3e\x3c!-- ko cesiumSvgPath: { path: _columbusViewPath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-iconColumbusView" } --\x3e\x3c!-- /ko --\x3e',n.appendChild(a);var o=document.createElement("button");o.type="button",o.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",o.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.SCENE3D)) || (!dropDownVisible && (sceneMode === _sceneMode.SCENE3D)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.SCENE3D, "cesium-sceneModePicker-hidden" : !dropDownVisible },attr: { title: tooltip3D },click: morphTo3D,cesiumSvgPath: { path: _globePath, width: 64, height: 64 }'),n.appendChild(o);var s=document.createElement("button");s.type="button",s.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",s.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.SCENE2D)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.SCENE2D, "cesium-sceneModePicker-hidden" : !dropDownVisible },attr: { title: tooltip2D },click: morphTo2D,cesiumSvgPath: { path: _flatMapPath, width: 64, height: 64 }'),n.appendChild(s);var l=document.createElement("button");l.type="button",l.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",l.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.COLUMBUS_VIEW)) || (!dropDownVisible && (sceneMode === _sceneMode.COLUMBUS_VIEW)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.COLUMBUS_VIEW, "cesium-sceneModePicker-hidden" : !dropDownVisible},attr: { title: tooltipColumbusView },click: morphToColumbusView,cesiumSvgPath: { path: _columbusViewPath, width: 64, height: 64 }'),n.appendChild(l),knockout.applyBindings(r,n),this._viewModel=r,this._container=e,this._wrapper=n,this._closeDropDown=function(e){n.contains(e.target)||(r.dropDownVisible=!1)},FeatureDetection.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(SceneModePicker.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),SceneModePicker.prototype.isDestroyed=function(){return!1},SceneModePicker.prototype.destroy=function(){return this._viewModel.destroy(),FeatureDetection.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),knockout.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),destroyObject(this)};var screenSpacePos=new Cartesian2,offScreen="-1000px";function SelectionIndicatorViewModel(i,e,t){this._scene=i,this._screenPositionX=offScreen,this._screenPositionY=offScreen,this._tweens=i.tweens,this._container=defaultValue(t,document.body),this._selectionIndicatorElement=e,this._scale=1,this.position=void 0,this.showSelection=!1,knockout.track(this,["position","_screenPositionX","_screenPositionY","_scale","showSelection"]),this.isVisible=void 0,knockout.defineProperty(this,"isVisible",{get:function(){return this.showSelection&&defined(this.position)}}),knockout.defineProperty(this,"_transform",{get:function(){return"scale("+this._scale+")"}}),this.computeScreenSpacePosition=function(e,t){return SceneTransforms.wgs84ToWindowCoordinates(i,e,t)}}function SelectionIndicator(e,t){e=getElement(e),this._container=e;var i=document.createElement("div");i.className="cesium-selection-wrapper",i.setAttribute("data-bind",'style: { "top" : _screenPositionY, "left" : _screenPositionX },css: { "cesium-selection-wrapper-visible" : isVisible }'),e.appendChild(i),this._element=i;var r="http://www.w3.org/2000/svg",n=document.createElementNS(r,"svg:svg");n.setAttribute("width",160),n.setAttribute("height",160),n.setAttribute("viewBox","0 0 160 160");var a=document.createElementNS(r,"g");a.setAttribute("transform","translate(80,80)"),n.appendChild(a);var o=document.createElementNS(r,"path");o.setAttribute("data-bind","attr: { transform: _transform }"),o.setAttribute("d","M -34 -34 L -34 -11.25 L -30 -15.25 L -30 -30 L -15.25 -30 L -11.25 -34 L -34 -34 z M 11.25 -34 L 15.25 -30 L 30 -30 L 30 -15.25 L 34 -11.25 L 34 -34 L 11.25 -34 z M -34 11.25 L -34 34 L -11.25 34 L -15.25 30 L -30 30 L -30 15.25 L -34 11.25 z M 34 11.25 L 30 15.25 L 30 30 L 15.25 30 L 11.25 34 L 34 34 L 34 11.25 z"),a.appendChild(o),i.appendChild(n);var s=new SelectionIndicatorViewModel(t,this._element,this._container);this._viewModel=s,knockout.applyBindings(this._viewModel,this._element)}function TimelineHighlightRange(e,t,i){this._color=e,this._height=t,this._base=defaultValue(i,0)}function TimelineTrack(e,t,i,r){this.interval=e,this.height=t,this.color=i||new Color(.5,.5,.5,1),this.backgroundColor=r||new Color(0,0,0,0)}SelectionIndicatorViewModel.prototype.update=function(){var e,t,i,r,n,a;this.showSelection&&defined(this.position)&&(defined(e=this.computeScreenSpacePosition(this.position,screenSpacePos))?(i=(t=this._container).parentNode.clientWidth,r=t.parentNode.clientHeight,a=.5*(n=this._selectionIndicatorElement.clientWidth),e.x=Math.min(Math.max(e.x,-n),i+n)-a,e.y=Math.min(Math.max(e.y,-n),r+n)-a,this._screenPositionX=Math.floor(e.x+.25)+"px",this._screenPositionY=Math.floor(e.y+.25)+"px"):(this._screenPositionX=offScreen,this._screenPositionY=offScreen))},SelectionIndicatorViewModel.prototype.animateAppear=function(){this._tweens.addProperty({object:this,property:"_scale",startValue:2,stopValue:1,duration:.8,easingFunction:EasingFunction$1.EXPONENTIAL_OUT})},SelectionIndicatorViewModel.prototype.animateDepart=function(){this._tweens.addProperty({object:this,property:"_scale",startValue:this._scale,stopValue:1.5,duration:.8,easingFunction:EasingFunction$1.EXPONENTIAL_OUT})},Object.defineProperties(SelectionIndicatorViewModel.prototype,{container:{get:function(){return this._container}},selectionIndicatorElement:{get:function(){return this._selectionIndicatorElement}},scene:{get:function(){return this._scene}}}),Object.defineProperties(SelectionIndicator.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),SelectionIndicator.prototype.isDestroyed=function(){return!1},SelectionIndicator.prototype.destroy=function(){var e=this._container;return knockout.cleanNode(this._element),e.removeChild(this._element),destroyObject(this)},TimelineHighlightRange.prototype.getHeight=function(){return this._height},TimelineHighlightRange.prototype.getBase=function(){return this._base},TimelineHighlightRange.prototype.getStartTime=function(){return this._start},TimelineHighlightRange.prototype.getStopTime=function(){return this._stop},TimelineHighlightRange.prototype.setRange=function(e,t){this._start=e,this._stop=t},TimelineHighlightRange.prototype.render=function(e){var t,i,r,n,a="";return this._start&&this._stop&&this._color&&(t=JulianDate.secondsDifference(this._start,e.epochJulian),i=Math.round(e.timeBarWidth*e.getAlpha(t)),r=JulianDate.secondsDifference(this._stop,e.epochJulian),n=Math.round(e.timeBarWidth*e.getAlpha(r))-i,i<0&&(n+=i,i=0),i+n>e.timeBarWidth&&(n=e.timeBarWidth-i),0<n&&(a='<span class="cesium-timeline-highlight" style="left: '+i.toString()+"px; width: "+n.toString()+"px; bottom: "+this._base.toString()+"px; height: "+this._height+"px; background-color: "+this._color+';"></span>')),a},TimelineTrack.prototype.render=function(e,t){var i=this.interval.start,r=this.interval.stop,n=t.startJulian,a=JulianDate.addSeconds(t.startJulian,t.duration,new JulianDate);if(JulianDate.lessThan(i,n)&&JulianDate.greaterThan(r,a))e.fillStyle=this.color.toCssColorString(),e.fillRect(0,t.y,t.timeBarWidth,this.height);else if(JulianDate.lessThanOrEquals(i,a)&&JulianDate.greaterThanOrEquals(r,n)){for(var o,s,l=0;l<t.timeBarWidth;++l){var c=JulianDate.addSeconds(t.startJulian,l/t.timeBarWidth*t.duration,new JulianDate);!defined(o)&&JulianDate.greaterThanOrEquals(c,i)?o=l:!defined(s)&&JulianDate.greaterThanOrEquals(c,r)&&(s=l)}e.fillStyle=this.backgroundColor.toCssColorString(),e.fillRect(0,t.y,t.timeBarWidth,this.height),defined(o)&&(defined(s)||(s=t.timeBarWidth),e.fillStyle=this.color.toCssColorString(),e.fillRect(o,t.y,Math.max(s-o,1),this.height))}};var timelineWheelDelta=1e12,timelineMouseMode={none:0,scrub:1,slide:2,zoom:3,touchOnly:4},timelineTouchMode={none:0,scrub:1,slideZoom:2,singleTap:3,ignore:4},timelineTicScales=[.001,.002,.005,.01,.02,.05,.1,.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600,7200,14400,21600,43200,86400,172800,345600,604800,1296e3,2592e3,5184e3,7776e3,15552e3,31536e3,63072e3,126144e3,15768e4,31536e4,63072e4,126144e4,15768e5,31536e5,63072e5,126144e5,15768e6,31536e6],timelineMonthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Timeline(e,t){var i=(e=getElement(e)).ownerDocument;this.container=e;var r=i.createElement("div");r.className="cesium-timeline-main",e.appendChild(r),this._topDiv=r,this._endJulian=void 0,this._epochJulian=void 0,this._lastXPos=void 0,this._scrubElement=void 0,this._startJulian=void 0,this._timeBarSecondsSpan=void 0,this._clock=t,this._scrubJulian=t.currentTime,this._mainTicSpan=-1,this._mouseMode=timelineMouseMode.none,this._touchMode=timelineTouchMode.none,this._touchState={centerX:0,spanX:0},this._mouseX=0,this._timelineDrag=0,this._timelineDragLocation=void 0,this._lastHeight=void 0,this._lastWidth=void 0,this._topDiv.innerHTML='<div class="cesium-timeline-bar"></div><div class="cesium-timeline-trackContainer"><canvas class="cesium-timeline-tracks" width="10" height="1"></canvas></div><div class="cesium-timeline-needle"></div><span class="cesium-timeline-ruler"></span>',this._timeBarEle=this._topDiv.childNodes[0],this._trackContainer=this._topDiv.childNodes[1],this._trackListEle=this._topDiv.childNodes[1].childNodes[0],this._needleEle=this._topDiv.childNodes[2],this._rulerEle=this._topDiv.childNodes[3],this._context=this._trackListEle.getContext("2d"),this._trackList=[],this._highlightRanges=[],this.zoomTo(t.startTime,t.stopTime),this._onMouseDown=createMouseDownCallback(this),this._onMouseUp=createMouseUpCallback(this),this._onMouseMove=createMouseMoveCallback(this),this._onMouseWheel=createMouseWheelCallback(this),this._onTouchStart=createTouchStartCallback(this),this._onTouchMove=createTouchMoveCallback(this),this._onTouchEnd=createTouchEndCallback(this);var n=this._timeBarEle;i.addEventListener("mouseup",this._onMouseUp,!1),i.addEventListener("mousemove",this._onMouseMove,!1),n.addEventListener("mousedown",this._onMouseDown,!1),n.addEventListener("DOMMouseScroll",this._onMouseWheel,!1),n.addEventListener("mousewheel",this._onMouseWheel,!1),n.addEventListener("touchstart",this._onTouchStart,!1),n.addEventListener("touchmove",this._onTouchMove,!1),n.addEventListener("touchend",this._onTouchEnd,!1),n.addEventListener("touchcancel",this._onTouchEnd,!1),this._topDiv.oncontextmenu=function(){return!1},t.onTick.addEventListener(this.updateFromClock,this),this.updateFromClock()}function twoDigits(e){return e<10?"0"+e.toString():e.toString()}function createMouseDownCallback(t){return function(e){t._mouseMode!==timelineMouseMode.touchOnly&&(0===e.button?(t._mouseMode=timelineMouseMode.scrub,t._scrubElement&&(t._scrubElement.style.backgroundPosition="-16px 0"),t._onMouseMove(e)):(t._mouseX=e.clientX,2===e.button?t._mouseMode=timelineMouseMode.zoom:t._mouseMode=timelineMouseMode.slide)),e.preventDefault()}}function createMouseUpCallback(t){return function(e){t._mouseMode=timelineMouseMode.none,t._scrubElement&&(t._scrubElement.style.backgroundPosition="0 0"),t._timelineDrag=0,t._timelineDragLocation=void 0}}function createMouseMoveCallback(n){return function(e){var t,i,r;n._mouseMode===timelineMouseMode.scrub?(e.preventDefault(),(t=e.clientX-n._topDiv.getBoundingClientRect().left)<0?(n._timelineDragLocation=0,n._timelineDrag=-.01*n._timeBarSecondsSpan):t>n._topDiv.clientWidth?(n._timelineDragLocation=n._topDiv.clientWidth,n._timelineDrag=.01*n._timeBarSecondsSpan):(n._timelineDragLocation=void 0,n._setTimeBarTime(t,t*n._timeBarSecondsSpan/n._topDiv.clientWidth))):n._mouseMode===timelineMouseMode.slide?(r=n._mouseX-e.clientX,n._mouseX=e.clientX,0!==r&&(i=r*n._timeBarSecondsSpan/n._topDiv.clientWidth,n.zoomTo(JulianDate.addSeconds(n._startJulian,i,new JulianDate),JulianDate.addSeconds(n._endJulian,i,new JulianDate)))):n._mouseMode===timelineMouseMode.zoom&&(r=n._mouseX-e.clientX,n._mouseX=e.clientX,0!==r&&n.zoomFrom(Math.pow(1.01,r)))}}function createMouseWheelCallback(i){return function(e){var t=e.wheelDeltaY||e.wheelDelta||-e.detail;t/=timelineWheelDelta=Math.max(Math.min(Math.abs(t),timelineWheelDelta),1),i.zoomFrom(Math.pow(1.05,-t))}}function createTouchStartCallback(a){return function(e){var t,i,r=e.touches.length,n=a._topDiv.getBoundingClientRect().left;e.preventDefault(),a._mouseMode=timelineMouseMode.touchOnly,1===r?(t=JulianDate.secondsDifference(a._scrubJulian,a._startJulian),i=Math.round(t*a._topDiv.clientWidth/a._timeBarSecondsSpan+n),Math.abs(e.touches[0].clientX-i)<50?(a._touchMode=timelineTouchMode.scrub,a._scrubElement&&(a._scrubElement.style.backgroundPosition=1===r?"-16px 0":"0 0")):(a._touchMode=timelineTouchMode.singleTap,a._touchState.centerX=e.touches[0].clientX-n)):2===r?(a._touchMode=timelineTouchMode.slideZoom,a._touchState.centerX=.5*(e.touches[0].clientX+e.touches[1].clientX)-n,a._touchState.spanX=Math.abs(e.touches[0].clientX-e.touches[1].clientX)):a._touchMode=timelineTouchMode.ignore}}function createTouchEndCallback(r){return function(e){var t=e.touches.length,i=r._topDiv.getBoundingClientRect().left;r._touchMode===timelineTouchMode.singleTap?(r._touchMode=timelineTouchMode.scrub,r._onTouchMove(e)):r._touchMode===timelineTouchMode.scrub&&r._onTouchMove(e),r._mouseMode=timelineMouseMode.touchOnly,1!==t?r._touchMode=0<t?timelineTouchMode.ignore:timelineTouchMode.none:r._touchMode===timelineTouchMode.slideZoom&&(r._touchState.centerX=e.touches[0].clientX-i),r._scrubElement&&(r._scrubElement.style.backgroundPosition="0 0")}}function createTouchMoveCallback(c){return function(e){var t,i,r,n,a,o,s=1,l=c._topDiv.getBoundingClientRect().left;c._touchMode===timelineTouchMode.singleTap&&(c._touchMode=timelineTouchMode.slideZoom),c._mouseMode=timelineMouseMode.touchOnly,c._touchMode===timelineTouchMode.scrub?(e.preventDefault(),1===e.changedTouches.length&&0<=(i=e.changedTouches[0].clientX-l)&&i<=c._topDiv.clientWidth&&c._setTimeBarTime(i,i*c._timeBarSecondsSpan/c._topDiv.clientWidth)):c._touchMode===timelineTouchMode.slideZoom&&(2===(r=e.touches.length)?(n=.5*(e.touches[0].clientX+e.touches[1].clientX)-l,a=Math.abs(e.touches[0].clientX-e.touches[1].clientX)):1===r&&(n=e.touches[0].clientX-l,a=0),defined(n)&&(o=0<a&&0<c._touchState.spanX?(s=c._touchState.spanX/a,JulianDate.addSeconds(c._startJulian,(c._touchState.centerX*c._timeBarSecondsSpan-n*c._timeBarSecondsSpan*s)/c._topDiv.clientWidth,new JulianDate)):(t=c._touchState.centerX-n,JulianDate.addSeconds(c._startJulian,t*c._timeBarSecondsSpan/c._topDiv.clientWidth,new JulianDate)),c.zoomTo(o,JulianDate.addSeconds(o,c._timeBarSecondsSpan*s,new JulianDate)),c._touchState.centerX=n,c._touchState.spanX=a))}}function lockScreen(e){var t=!1,i=window.screen;return defined(i)&&(defined(i.lockOrientation)?t=i.lockOrientation(e):defined(i.mozLockOrientation)?t=i.mozLockOrientation(e):defined(i.msLockOrientation)?t=i.msLockOrientation(e):defined(i.orientation&&i.orientation.lock)&&(t=i.orientation.lock(e))),t}function unlockScreen(){var e=window.screen;defined(e)&&(defined(e.unlockOrientation)?e.unlockOrientation():defined(e.mozUnlockOrientation)?e.mozUnlockOrientation():defined(e.msUnlockOrientation)?e.msUnlockOrientation():defined(e.orientation&&e.orientation.unlock)&&e.orientation.unlock())}function toggleVR(e,t,i,r){r()||(i()?(t.useWebVR=!1,e._locked&&(unlockScreen(),e._locked=!1),e._noSleep.disable(),Fullscreen.exitFullscreen(),i(!1)):(Fullscreen.fullscreen||Fullscreen.requestFullscreen(e._vrElement),e._noSleep.enable(),e._locked||(e._locked=lockScreen("landscape")),i(t.useWebVR=!0)))}function VRButtonViewModel(e,t){var i=this,r=knockout.observable(Fullscreen.enabled),n=knockout.observable(!1);this.isVRMode=void 0,knockout.defineProperty(this,"isVRMode",{get:function(){return n()}}),this.isVREnabled=void 0,knockout.defineProperty(this,"isVREnabled",{get:function(){return r()},set:function(e){r(e&&Fullscreen.enabled)}}),this.tooltip=void 0,knockout.defineProperty(this,"tooltip",function(){return r()?n()?"Exit VR mode":"Enter VR mode":"VR mode is unavailable"});var a=knockout.observable(!1);this._isOrthographic=void 0,knockout.defineProperty(this,"_isOrthographic",{get:function(){return a()}}),this._eventHelper=new EventHelper,this._eventHelper.add(e.preRender,function(){a(e.camera.frustum instanceof OrthographicFrustum)}),this._locked=!1,this._noSleep=new NoSleep,this._command=createCommand$2(function(){toggleVR(i,e,n,a)},knockout.getObservable(this,"isVREnabled")),this._vrElement=defaultValue(getElement(t),document.body),this._callback=function(){!Fullscreen.fullscreen&&n()&&(e.useWebVR=!1,i._locked&&(unlockScreen(),i._locked=!1),i._noSleep.disable(),n(!1))},document.addEventListener(Fullscreen.changeEventName,this._callback)}Timeline.prototype.addEventListener=function(e,t,i){this._topDiv.addEventListener(e,t,i)},Timeline.prototype.removeEventListener=function(e,t,i){this._topDiv.removeEventListener(e,t,i)},Timeline.prototype.isDestroyed=function(){return!1},Timeline.prototype.destroy=function(){this._clock.onTick.removeEventListener(this.updateFromClock,this);var e=this.container.ownerDocument;e.removeEventListener("mouseup",this._onMouseUp,!1),e.removeEventListener("mousemove",this._onMouseMove,!1);var t=this._timeBarEle;t.removeEventListener("mousedown",this._onMouseDown,!1),t.removeEventListener("DOMMouseScroll",this._onMouseWheel,!1),t.removeEventListener("mousewheel",this._onMouseWheel,!1),t.removeEventListener("touchstart",this._onTouchStart,!1),t.removeEventListener("touchmove",this._onTouchMove,!1),t.removeEventListener("touchend",this._onTouchEnd,!1),t.removeEventListener("touchcancel",this._onTouchEnd,!1),this.container.removeChild(this._topDiv),destroyObject(this)},Timeline.prototype.addHighlightRange=function(e,t,i){var r=new TimelineHighlightRange(e,t,i);return this._highlightRanges.push(r),this.resize(),r},Timeline.prototype.addTrack=function(e,t,i,r){var n=new TimelineTrack(e,t,i,r);return this._trackList.push(n),this._lastHeight=void 0,this.resize(),n},Timeline.prototype.zoomTo=function(e,t){var i,r,n,a,o;this._startJulian=e,this._endJulian=t,this._timeBarSecondsSpan=JulianDate.secondsDifference(t,e),this._clock&&this._clock.clockRange!==ClockRange$1.UNBOUNDED&&(i=this._clock.startTime,r=this._clock.stopTime,n=JulianDate.secondsDifference(r,i),a=JulianDate.secondsDifference(i,this._startJulian),o=JulianDate.secondsDifference(r,this._endJulian),this._timeBarSecondsSpan>=n?(this._timeBarSecondsSpan=n,this._startJulian=this._clock.startTime,this._endJulian=this._clock.stopTime):0<a?(this._endJulian=JulianDate.addSeconds(this._endJulian,a,new JulianDate),this._startJulian=i,this._timeBarSecondsSpan=JulianDate.secondsDifference(this._endJulian,this._startJulian)):o<0&&(this._startJulian=JulianDate.addSeconds(this._startJulian,o,new JulianDate),this._endJulian=r,this._timeBarSecondsSpan=JulianDate.secondsDifference(this._endJulian,this._startJulian))),this._makeTics();var s=document.createEvent("Event");s.initEvent("setzoom",!0,!0),s.startJulian=this._startJulian,s.endJulian=this._endJulian,s.epochJulian=this._epochJulian,s.totalSpan=this._timeBarSecondsSpan,s.mainTicSpan=this._mainTicSpan,this._topDiv.dispatchEvent(s)},Timeline.prototype.zoomFrom=function(e){var t=JulianDate.secondsDifference(this._scrubJulian,this._startJulian);1<e||t<0||t>this._timeBarSecondsSpan?t=.5*this._timeBarSecondsSpan:t+=t-.5*this._timeBarSecondsSpan;var i=this._timeBarSecondsSpan-t;this.zoomTo(JulianDate.addSeconds(this._startJulian,t-t*e,new JulianDate),JulianDate.addSeconds(this._endJulian,i*e-i,new JulianDate))},Timeline.prototype.makeLabel=function(e){var t=JulianDate.toGregorianDate(e),i=t.millisecond,r=" UTC";if(0<i&&this._timeBarSecondsSpan<3600){for(r=Math.floor(i).toString();r.length<3;)r="0"+r;r="."+r}return timelineMonthNames[t.month-1]+" "+t.day+" "+t.year+" "+twoDigits(t.hour)+":"+twoDigits(t.minute)+":"+twoDigits(t.second)+r},Timeline.prototype.smallestTicInPixels=7,Timeline.prototype._makeTics=function(){var e,t=this._timeBarEle,i=JulianDate.secondsDifference(this._scrubJulian,this._startJulian),r=Math.round(i*this._topDiv.clientWidth/this._timeBarSecondsSpan),n=r-8,a=this;this._needleEle.style.left=r.toString()+"px";var o="",s=31536e6,l=0,c=this._timeBarSecondsSpan;c<.01?(c=.01,this._timeBarSecondsSpan=.01,this._endJulian=JulianDate.addSeconds(this._startJulian,.01,new JulianDate)):s<c&&(c=s,this._timeBarSecondsSpan=s,this._endJulian=JulianDate.addSeconds(this._startJulian,s,new JulianDate));var u=this._timeBarEle.clientWidth;u<10&&(u=10);var d=this._startJulian,h=Math.min(c/u*1e-5,.4),p=JulianDate.toGregorianDate(d),m=31536e4<c?JulianDate.fromDate(new Date(Date.UTC(100*Math.floor(p.year/100),0))):31536e3<c?JulianDate.fromDate(new Date(Date.UTC(10*Math.floor(p.year/10),0))):86400<c?JulianDate.fromDate(new Date(Date.UTC(p.year,0))):JulianDate.fromDate(new Date(Date.UTC(p.year,p.month,p.day))),f=JulianDate.secondsDifference(this._startJulian,JulianDate.addSeconds(m,h,new JulianDate)),g=f+c;function _(e){return Math.floor(f/e)*e}function y(e,t){return Math.ceil(e/t+.5)*t}function v(e){return(e-f)/c}function C(e,t){return e-t*Math.round(e/t)}this._epochJulian=m,this._rulerEle.innerHTML=this.makeLabel(JulianDate.addSeconds(this._endJulian,-.01,new JulianDate));var S=this._rulerEle.offsetWidth+20;S<30&&(S=180);var T=l;l-=1e-10;var x={startTime:f,startJulian:d,epochJulian:m,duration:c,timeBarWidth:u,getAlpha:v};this._highlightRanges.forEach(function(e){o+=e.render(x)});var b=0,E=0,P=0,A=S/u;1<A&&(A=1),A*=this._timeBarSecondsSpan;for(var w=-1,D=-1,M=timelineTicScales.length,I=0;I<M;++I){var R=timelineTicScales[I];if(++w,A<(b=R)&&l<R)break;D<0&&u*(R/this._timeBarSecondsSpan)>=this.smallestTicInPixels&&(D=w)}if(0<w){for(;0<w;)if(--w,Math.abs(C(b,timelineTicScales[w]))<1e-5){timelineTicScales[w]>=l&&(E=timelineTicScales[w]);break}if(0<=D)for(;D<w;){if(Math.abs(C(E,timelineTicScales[D]))<1e-5&&timelineTicScales[D]>=l){P=timelineTicScales[D];break}++D}}1e-10<(l=T)&&P<1e-5&&1e-10<Math.abs(l-b)&&(P=l)<=b+1e-10&&(E=0);var O,L=-999999;if(3<=u*(P/this._timeBarSecondsSpan))for(e=_(P);e<=g;e=y(e,P))o+='<span class="cesium-timeline-ticTiny" style="left: '+Math.round(u*v(e)).toString()+'px;"></span>';if(3<=u*(E/this._timeBarSecondsSpan))for(e=_(E);e<=g;e=y(e,E))o+='<span class="cesium-timeline-ticSub" style="left: '+Math.round(u*v(e)).toString()+'px;"></span>';if(2<=u*(b/this._timeBarSecondsSpan)){g+=this._mainTicSpan=b,e=_(b);for(var F=JulianDate.computeTaiMinusUtc(m);e<=g;){var N,B=JulianDate.addSeconds(d,e-f,new JulianDate);2.1<b&&(N=JulianDate.computeTaiMinusUtc(B),.1<Math.abs(N-F)&&(e+=N-F,B=JulianDate.addSeconds(d,e-f,new JulianDate)));var V=Math.round(u*v(e)),k=this.makeLabel(B);this._rulerEle.innerHTML=k,(O=this._rulerEle.offsetWidth)<10&&(O=S);var z=V-(O/2-1);L<z?(L=z+O+5,o+='<span class="cesium-timeline-ticMain" style="left: '+V.toString()+'px;"></span><span class="cesium-timeline-ticLabel" style="left: '+z.toString()+'px;">'+k+"</span>"):o+='<span class="cesium-timeline-ticSub" style="left: '+V.toString()+'px;"></span>',e=y(e,b)}}else this._mainTicSpan=-1;o+='<span class="cesium-timeline-icon16" style="left:'+n+'px;bottom:0;background-position: 0 0;"></span>',t.innerHTML=o,this._scrubElement=t.lastChild,this._context.clearRect(0,0,this._trackListEle.width,this._trackListEle.height),x.y=0,this._trackList.forEach(function(e){e.render(a._context,x),x.y+=e.height})},Timeline.prototype.updateFromClock=function(){this._scrubJulian=this._clock.currentTime;var e,t,i=this._scrubElement;defined(this._scrubElement)&&(e=JulianDate.secondsDifference(this._scrubJulian,this._startJulian),t=Math.round(e*this._topDiv.clientWidth/this._timeBarSecondsSpan),this._lastXPos!==t&&(this._lastXPos=t,i.style.left=t-8+"px",this._needleEle.style.left=t+"px")),defined(this._timelineDragLocation)&&(this._setTimeBarTime(this._timelineDragLocation,this._timelineDragLocation*this._timeBarSecondsSpan/this._topDiv.clientWidth),this.zoomTo(JulianDate.addSeconds(this._startJulian,this._timelineDrag,new JulianDate),JulianDate.addSeconds(this._endJulian,this._timelineDrag,new JulianDate)))},Timeline.prototype._setTimeBarTime=function(e,t){var i;e=Math.round(e),this._scrubJulian=JulianDate.addSeconds(this._startJulian,t,new JulianDate),this._scrubElement&&(i=e-8,this._scrubElement.style.left=i.toString()+"px",this._needleEle.style.left=e.toString()+"px");var r=document.createEvent("Event");r.initEvent("settime",!0,!0),r.clientX=e,r.timeSeconds=t,r.timeJulian=this._scrubJulian,r.clock=this._clock,this._topDiv.dispatchEvent(r)},Timeline.prototype.resize=function(){var t,e=this.container.clientWidth,i=this.container.clientHeight;e===this._lastWidth&&i===this._lastHeight||(this._trackContainer.style.height=i+"px",t=1,this._trackList.forEach(function(e){t+=e.height}),this._trackListEle.style.height=t.toString()+"px",this._trackListEle.width=this._trackListEle.clientWidth,this._trackListEle.height=t,this._makeTics(),this._lastXPos=void 0,this._lastWidth=e,this._lastHeight=i)},Object.defineProperties(VRButtonViewModel.prototype,{vrElement:{get:function(){return this._vrElement},set:function(e){this._vrElement=e}},command:{get:function(){return this._command}}}),VRButtonViewModel.prototype.isDestroyed=function(){return!1},VRButtonViewModel.prototype.destroy=function(){this._eventHelper.removeAll(),document.removeEventListener(Fullscreen.changeEventName,this._callback),destroyObject(this)};var enterVRPath="M 5.3125 6.375 C 4.008126 6.375 2.96875 7.4141499 2.96875 8.71875 L 2.96875 19.5 C 2.96875 20.8043 4.008126 21.875 5.3125 21.875 L 13.65625 21.875 C 13.71832 20.0547 14.845166 18.59375 16.21875 18.59375 C 17.592088 18.59375 18.71881 20.0552 18.78125 21.875 L 27.09375 21.875 C 28.398125 21.875 29.4375 20.8043 29.4375 19.5 L 29.4375 8.71875 C 29.4375 7.4141499 28.398125 6.375 27.09375 6.375 L 5.3125 6.375 z M 9.625 10.4375 C 11.55989 10.4375 13.125 12.03385 13.125 13.96875 C 13.125 15.90365 11.55989 17.46875 9.625 17.46875 C 7.69011 17.46875 6.125 15.90365 6.125 13.96875 C 6.125 12.03385 7.69011 10.4375 9.625 10.4375 z M 22.46875 10.4375 C 24.40364 10.4375 25.96875 12.03385 25.96875 13.96875 C 25.96875 15.90365 24.40364 17.46875 22.46875 17.46875 C 20.53386 17.46875 18.96875 15.90365 18.96875 13.96875 C 18.96875 12.03385 20.53386 10.4375 22.46875 10.4375 z",exitVRPath="M 25.770585,2.4552065 C 15.72282,13.962707 10.699956,19.704407 8.1768352,22.580207 c -1.261561,1.4379 -1.902282,2.1427 -2.21875,2.5 -0.141624,0.1599 -0.208984,0.2355 -0.25,0.2813 l 0.6875,0.75 c 10e-5,-10e-5 0.679191,0.727 0.6875,0.7187 0.01662,-0.016 0.02451,-0.024 0.03125,-0.031 0.01348,-0.014 0.04013,-0.038 0.0625,-0.062 0.04474,-0.05 0.120921,-0.1315 0.28125,-0.3126 0.320657,-0.3619 0.956139,-1.0921 2.2187499,-2.5312 2.5252219,-2.8781 7.5454589,-8.6169 17.5937499,-20.1250005 l -1.5,-1.3125 z m -20.5624998,3.9063 c -1.304375,0 -2.34375,1.0391 -2.34375,2.3437 l 0,10.8125005 c 0,1.3043 1.039375,2.375 2.34375,2.375 l 2.25,0 c 1.9518039,-2.2246 7.4710958,-8.5584 13.5624998,-15.5312005 l -15.8124998,0 z m 21.1249998,0 c -1.855467,2.1245 -2.114296,2.4005 -3.59375,4.0936995 1.767282,0.1815 3.15625,1.685301 3.15625,3.500001 0,1.9349 -1.56511,3.5 -3.5,3.5 -1.658043,0 -3.043426,-1.1411 -3.40625,-2.6875 -1.089617,1.2461 -2.647139,2.9988 -3.46875,3.9375 0.191501,-0.062 0.388502,-0.094 0.59375,-0.094 1.373338,0 2.50006,1.4614 2.5625,3.2812 l 8.3125,0 c 1.304375,0 2.34375,-1.0707 2.34375,-2.375 l 0,-10.8125005 c 0,-1.3046 -1.039375,-2.3437 -2.34375,-2.3437 l -0.65625,0 z M 9.5518351,10.423906 c 1.9348899,0 3.4999999,1.596401 3.4999999,3.531301 0,1.9349 -1.56511,3.5 -3.4999999,3.5 -1.9348899,0 -3.4999999,-1.5651 -3.4999999,-3.5 0,-1.9349 1.56511,-3.531301 3.4999999,-3.531301 z m 4.2187499,10.312601 c -0.206517,0.2356 -0.844218,0.9428 -1.03125,1.1562 l 0.8125,0 c 0.01392,-0.4081 0.107026,-0.7968 0.21875,-1.1562 z";function VRButton(e,t,i){e=getElement(e);var r=new VRButtonViewModel(t,i);r._exitVRPath=exitVRPath,r._enterVRPath=enterVRPath;var n=document.createElement("button");n.type="button",n.className="cesium-button cesium-vrButton",n.setAttribute("data-bind",'css: { "cesium-button-disabled" : _isOrthographic }, attr: { title: tooltip },click: command,enable: isVREnabled,cesiumSvgPath: { path: isVRMode ? _exitVRPath : _enterVRPath, width: 32, height: 32 }'),e.appendChild(n),knockout.applyBindings(r,n),this._container=e,this._viewModel=r,this._element=n}Object.defineProperties(VRButton.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}}),VRButton.prototype.isDestroyed=function(){return!1},VRButton.prototype.destroy=function(){return this._viewModel.destroy(),knockout.cleanNode(this._element),this._container.removeChild(this._element),destroyObject(this)};var boundingSphereScratch$2=new BoundingSphere;function onTimelineScrubfunction(e){var t=e.clock;t.currentTime=e.timeJulian,t.shouldAnimate=!1}function pickEntity(e,t){var i=e.scene.pick(t.position);if(defined(i)){var r=defaultValue(i.id,i.primitive.id);if(r instanceof Entity)return r}if(defined(e.scene.globe))return pickImageryLayerFeature(e,t.position)}function trackDataSourceClock(e,t,i){var r;!defined(i)||defined(r=i.clock)&&(r.getValue(t),defined(e)&&(e.updateFromClock(),e.zoomTo(r.startTime,r.stopTime)))}var cartesian3Scratch$3=new Cartesian3;function pickImageryLayerFeature(n,e){var t=n.scene,i=t.camera.getPickRay(e),r=t.imageryLayers.pickImageryLayerFeatures(i,t);if(defined(r)){var a=new Entity({id:"Loading...",description:"Loading feature information..."});return when(r,function(e){var t,i,r;n.selectedEntity===a&&(defined(e)&&0!==e.length?(i=new Entity({id:(t=e[0]).name,description:t.description}),defined(t.position)&&(r=n.scene.globe.ellipsoid.cartographicToCartesian(t.position,cartesian3Scratch$3),i.position=new ConstantPositionProperty(r)),n.selectedEntity=i):n.selectedEntity=createNoFeaturesEntity())},function(){n.selectedEntity===a&&(n.selectedEntity=createNoFeaturesEntity())}),a}}function createNoFeaturesEntity(){return new Entity({id:"None",description:"No features found."})}function enableVRUI(e,t){var i,r=e._geocoder,n=e._homeButton,a=e._sceneModePicker,o=e._projectionPicker,s=e._baseLayerPicker,l=e._animation,c=e._timeline,u=e._fullscreenButton,d=e._infoBox,h=e._selectionIndicator,p=t?"hidden":"visible";defined(r)&&(r.container.style.visibility=p),defined(n)&&(n.container.style.visibility=p),defined(a)&&(a.container.style.visibility=p),defined(o)&&(o.container.style.visibility=p),defined(s)&&(s.container.style.visibility=p),defined(l)&&(l.container.style.visibility=p),defined(c)&&(c.container.style.visibility=p),defined(u)&&u.viewModel.isFullscreenEnabled&&(u.container.style.visibility=p),defined(d)&&(d.container.style.visibility=p),defined(h)&&(h.container.style.visibility=p),e._container&&(i=t||!defined(u)?0:u.container.clientWidth,e._vrButton.container.style.right=i+"px",e.forceResize())}function Viewer(e,t){e=getElement(e);var i=!(defined((t=defaultValue(t,defaultValue.EMPTY_OBJECT)).globe)&&!1===t.globe||defined(t.baseLayerPicker)&&!1===t.baseLayerPicker),r=this,n=document.createElement("div");n.className="cesium-viewer",e.appendChild(n);var a=document.createElement("div");a.className="cesium-viewer-cesiumWidgetContainer",n.appendChild(a);var o=document.createElement("div");o.className="cesium-viewer-bottom",n.appendChild(o);var s,l,c=defaultValue(t.scene3DOnly,!1),u=!1;defined(t.clockViewModel)?s=(l=t.clockViewModel).clock:(l=new ClockViewModel(s=new Clock),u=!0),defined(t.shouldAnimate)&&(s.shouldAnimate=t.shouldAnimate);var d=new CesiumWidget(a,{imageryProvider:!i&&!defined(t.imageryProvider)&&void 0,clock:s,skyBox:t.skyBox,skyAtmosphere:t.skyAtmosphere,sceneMode:t.sceneMode,mapProjection:t.mapProjection,globe:t.globe,orderIndependentTranslucency:t.orderIndependentTranslucency,contextOptions:t.contextOptions,useDefaultRenderLoop:t.useDefaultRenderLoop,targetFrameRate:t.targetFrameRate,showRenderLoopErrors:t.showRenderLoopErrors,useBrowserRecommendedResolution:t.useBrowserRecommendedResolution,creditContainer:defined(t.creditContainer)?t.creditContainer:o,creditViewport:t.creditViewport,scene3DOnly:c,terrainExaggeration:t.terrainExaggeration,shadows:t.shadows,terrainShadows:t.terrainShadows,mapMode2D:t.mapMode2D,requestRenderMode:t.requestRenderMode,maximumRenderTimeChange:t.maximumRenderTimeChange}),h=t.dataSources,p=!1;defined(h)||(h=new DataSourceCollection,p=!0);var m,f,g,_,y,v=d.scene,C=new DataSourceDisplay({scene:v,dataSourceCollection:h}),S=new EventHelper;S.add(s.onTick,Viewer.prototype._onTick,this),S.add(v.morphStart,Viewer.prototype._clearTrackedObject,this),defined(t.selectionIndicator)&&!1===t.selectionIndicator||((f=document.createElement("div")).className="cesium-viewer-selectionIndicatorContainer",n.appendChild(f),m=new SelectionIndicator(f,v)),defined(t.infoBox)&&!1===t.infoBox||((_=document.createElement("div")).className="cesium-viewer-infoBoxContainer",n.appendChild(_),y=(g=new InfoBox(_)).viewModel,S.add(y.cameraClicked,Viewer.prototype._onInfoBoxCameraClicked,this),S.add(y.closeClicked,Viewer.prototype._onInfoBoxClockClicked,this));var T,x,b,E,P,A,w,D,M,I,R,O,L,F,N,B,V,k,z,$,U,G,H=document.createElement("div");if(H.className="cesium-viewer-toolbar",n.appendChild(H),defined(t.geocoder)&&!1===t.geocoder||((x=document.createElement("div")).className="cesium-viewer-geocoderContainer",H.appendChild(x),defined(t.geocoder)&&"boolean"!=typeof t.geocoder&&(b=Array.isArray(t.geocoder)?t.geocoder:[t.geocoder]),T=new Geocoder({container:x,geocoderServices:b,scene:v}),S.add(T.viewModel.search.beforeExecute,Viewer.prototype._clearObjects,this)),defined(t.homeButton)&&!1===t.homeButton||(E=new HomeButton(H,v),defined(T)&&S.add(E.viewModel.command.afterExecute,function(){var e=T.viewModel;e.searchText="",e.isSearchInProgress&&e.search()}),S.add(E.viewModel.command.beforeExecute,Viewer.prototype._clearTrackedObject,this)),c||defined(t.sceneModePicker)&&!1===t.sceneModePicker||(P=new SceneModePicker(H,v)),t.projectionPicker&&(A=new ProjectionPicker(H,v)),i&&(w=defaultValue(t.imageryProviderViewModels,createDefaultImageryProviderViewModels()),D=defaultValue(t.terrainProviderViewModels,createDefaultTerrainProviderViewModels()),M=new BaseLayerPicker(H,{globe:v.globe,imageryProviderViewModels:w,selectedImageryProviderViewModel:t.selectedImageryProviderViewModel,terrainProviderViewModels:D,selectedTerrainProviderViewModel:t.selectedTerrainProviderViewModel}),I=H.getElementsByClassName("cesium-baseLayerPicker-dropDown")[0]),defined(t.imageryProvider)&&!1!==t.imageryProvider&&(i&&(M.viewModel.selectedImagery=void 0),v.imageryLayers.removeAll(),v.imageryLayers.addImageryProvider(t.imageryProvider)),defined(t.terrainProvider)&&(i&&(M.viewModel.selectedTerrain=void 0),v.terrainProvider=t.terrainProvider),!defined(t.navigationHelpButton)||!1!==t.navigationHelpButton){var W,q=!0;try{defined(window.localStorage)&&(defined(W=window.localStorage.getItem("cesium-hasSeenNavHelp"))&&Boolean(W)?q=!1:window.localStorage.setItem("cesium-hasSeenNavHelp","true"))}catch(e){}R=new NavigationHelpButton({container:H,instructionsInitiallyVisible:defaultValue(t.navigationInstructionsInitiallyVisible,q)})}defined(t.animation)&&!1===t.animation||((L=document.createElement("div")).className="cesium-viewer-animationContainer",n.appendChild(L),O=new Animation(L,new AnimationViewModel(l))),defined(t.timeline)&&!1===t.timeline||((N=document.createElement("div")).className="cesium-viewer-timelineContainer",n.appendChild(N),(F=new Timeline(N,s)).addEventListener("settime",onTimelineScrubfunction,!1),F.zoomTo(s.startTime,s.stopTime)),defined(t.fullscreenButton)&&!1===t.fullscreenButton||((k=document.createElement("div")).className="cesium-viewer-fullscreenContainer",n.appendChild(k),V=subscribeAndEvaluate((B=new FullscreenButton(k,t.fullscreenElement)).viewModel,"isFullscreenEnabled",function(e){k.style.display=e?"block":"none",defined(F)&&(F.container.style.right=k.clientWidth+"px",F.resize())})),t.vrButton&&((G=document.createElement("div")).className="cesium-viewer-vrContainer",n.appendChild(G),$=subscribeAndEvaluate((z=new VRButton(G,v,t.fullScreenElement)).viewModel,"isVREnabled",function(e){G.style.display=e?"block":"none",defined(B)&&(G.style.right=k.clientWidth+"px"),defined(F)&&(F.container.style.right=G.clientWidth+"px",F.resize())}),U=subscribeAndEvaluate(z.viewModel,"isVRMode",function(e){enableVRUI(r,e)})),this._baseLayerPickerDropDown=I,this._fullscreenSubscription=V,this._vrSubscription=$,this._vrModeSubscription=U,this._dataSourceChangedListeners={},this._automaticallyTrackDataSourceClocks=defaultValue(t.automaticallyTrackDataSourceClocks,!0),this._container=e,this._bottomContainer=o,this._element=n,this._cesiumWidget=d,this._selectionIndicator=m,this._infoBox=g,this._dataSourceCollection=h,this._destroyDataSourceCollection=p,this._dataSourceDisplay=C,this._clockViewModel=l,this._destroyClockViewModel=u,this._toolbar=H,this._homeButton=E,this._sceneModePicker=P,this._projectionPicker=A,this._baseLayerPicker=M,this._navigationHelpButton=R,this._animation=O,this._timeline=F,this._fullscreenButton=B,this._vrButton=z,this._geocoder=T,this._eventHelper=S,this._lastWidth=0,this._lastHeight=0,this._allowDataSourcesToSuspendAnimation=!0,this._entityView=void 0,this._enableInfoOrSelection=defined(g)||defined(m),this._clockTrackedDataSource=void 0,this._trackedEntity=void 0,this._needTrackedEntityUpdate=!1,this._selectedEntity=void 0,this._clockTrackedDataSource=void 0,this._zoomIsFlight=!1,this._zoomTarget=void 0,this._zoomPromise=void 0,this._zoomOptions=void 0,this._selectedEntityChanged=new Event,this._trackedEntityChanged=new Event,knockout.track(this,["_trackedEntity","_selectedEntity","_clockTrackedDataSource"]),S.add(h.dataSourceAdded,Viewer.prototype._onDataSourceAdded,this),S.add(h.dataSourceRemoved,Viewer.prototype._onDataSourceRemoved,this),S.add(v.postUpdate,Viewer.prototype.resize,this),S.add(v.postRender,Viewer.prototype._postRender,this);for(var j=h.length,Y=0;Y<j;Y++)this._dataSourceAdded(h,h.get(Y));this._dataSourceAdded(void 0,C.defaultDataSource),S.add(h.dataSourceAdded,Viewer.prototype._dataSourceAdded,this),S.add(h.dataSourceRemoved,Viewer.prototype._dataSourceRemoved,this),d.screenSpaceEventHandler.setInputAction(function(e){r.selectedEntity=pickEntity(r,e)},ScreenSpaceEventType$1.LEFT_CLICK),d.screenSpaceEventHandler.setInputAction(function(e){var t=pickEntity(r,e);defined(t)?Property.getValueOrUndefined(t.position,r.clock.currentTime)?r.trackedEntity=t:r.zoomTo(t):defined(r.trackedEntity)&&(r.trackedEntity=void 0)},ScreenSpaceEventType$1.LEFT_DOUBLE_CLICK)}function zoomToOrFly(i,e,t,r){cancelZoom(i);var n=when.defer();return i._zoomPromise=n,i._zoomIsFlight=r,i._zoomOptions=t,when(e,function(e){var t;i._zoomPromise===n&&(e instanceof ImageryLayer?e.getViewableRectangle().then(function(e){return computeFlyToLocationForRectangle(e,i.scene)}).then(function(e){i._zoomPromise===n&&(i._zoomTarget=e)}):e instanceof Cesium3DTileset||e instanceof TimeDynamicPointCloud?i._zoomTarget=e:e.isLoading&&defined(e.loadingEvent)?t=e.loadingEvent.addEventListener(function(){t(),i._zoomPromise===n&&(i._zoomTarget=e.entities.values.slice(0))}):Array.isArray(e)?i._zoomTarget=e.slice(0):(defined((e=defaultValue(e.values,e)).entities)&&(e=e.entities.values),Array.isArray(e)?i._zoomTarget=e.slice(0):i._zoomTarget=[e]))}),i.scene.requestRender(),n.promise}function clearZoom(e){e._zoomPromise=void 0,e._zoomTarget=void 0,e._zoomOptions=void 0}function cancelZoom(e){var t=e._zoomPromise;defined(t)&&(clearZoom(e),t.resolve(!1))}function updateZoomTarget(t){var i=t._zoomTarget;if(defined(i)&&t.scene.mode!==SceneMode$1.MORPHING){var r,e,n=t.scene,a=n.camera,o=t._zoomPromise,s=defaultValue(t._zoomOptions,{});if(i instanceof Cesium3DTileset)return i.readyPromise.then(function(){var e=i.boundingSphere;defined(s.offset)||(s.offset=new HeadingPitchRange(0,-.5,e.radius)),r={offset:s.offset,duration:s.duration,maximumHeight:s.maximumHeight,complete:function(){o.resolve(!0)},cancel:function(){o.resolve(!1)}},t._zoomIsFlight?a.flyToBoundingSphere(i.boundingSphere,r):(a.viewBoundingSphere(e,s.offset),a.lookAtTransform(Matrix4.IDENTITY),o.resolve(!0)),clearZoom(t)});if(i instanceof TimeDynamicPointCloud)return i.readyPromise.then(function(){var e=i.boundingSphere;defined(s.offset)||(s.offset=new HeadingPitchRange(0,-.5,e.radius)),r={offset:s.offset,duration:s.duration,maximumHeight:s.maximumHeight,complete:function(){o.resolve(!0)},cancel:function(){o.resolve(!1)}},t._zoomIsFlight?a.flyToBoundingSphere(e,r):(a.viewBoundingSphere(e,s.offset),a.lookAtTransform(Matrix4.IDENTITY),o.resolve(!0)),clearZoom(t)});if(i instanceof Cartographic)return r={destination:n.mapProjection.ellipsoid.cartographicToCartesian(i),duration:s.duration,maximumHeight:s.maximumHeight,complete:function(){o.resolve(!0)},cancel:function(){o.resolve(!1)}},t._zoomIsFlight?a.flyTo(r):(a.setView(r),o.resolve(!0)),void clearZoom(t);for(var l=i,c=[],u=0,d=l.length;u<d;u++){var h=t._dataSourceDisplay.getBoundingSphere(l[u],!1,boundingSphereScratch$2);if(h===BoundingSphereState$1.PENDING)return;h!==BoundingSphereState$1.FAILED&&c.push(BoundingSphere.clone(boundingSphereScratch$2))}0!==c.length?(t.trackedEntity=void 0,e=BoundingSphere.fromBoundingSpheres(c),t._zoomIsFlight?(clearZoom(t),a.flyToBoundingSphere(e,{duration:s.duration,maximumHeight:s.maximumHeight,complete:function(){o.resolve(!0)},cancel:function(){o.resolve(!1)},offset:s.offset})):(a.viewBoundingSphere(e,s.offset),a.lookAtTransform(Matrix4.IDENTITY),clearZoom(t),o.resolve(!0))):cancelZoom(t)}}function updateTrackedEntity(e){var t,i,r,n,a,o;e._needTrackedEntityUpdate&&(t=e._trackedEntity,i=e.clock.currentTime,defined(Property.getValueOrUndefined(t.position,i))&&(r=e.scene,(n=e._dataSourceDisplay.getBoundingSphere(t,!1,boundingSphereScratch$2))!==BoundingSphereState$1.PENDING&&((a=r.mode)!==SceneMode$1.COLUMBUS_VIEW&&a!==SceneMode$1.SCENE2D||(r.screenSpaceCameraController.enableTranslate=!1),a!==SceneMode$1.COLUMBUS_VIEW&&a!==SceneMode$1.SCENE3D||(r.screenSpaceCameraController.enableTilt=!1),o=n!==BoundingSphereState$1.FAILED?boundingSphereScratch$2:void 0,e._entityView=new EntityView(t,r,r.mapProjection.ellipsoid),e._entityView.update(i,o),e._needTrackedEntityUpdate=!1)))}function viewerCesium3DTilesInspectorMixin(e){var t=document.createElement("div");t.className="cesium-viewer-cesium3DTilesInspectorContainer",e.container.appendChild(t);var i=new Cesium3DTilesInspector(t,e.scene);Object.defineProperties(e,{cesium3DTilesInspector:{get:function(){return i}}})}function viewerCesiumInspectorMixin(e){var t=document.createElement("div");t.className="cesium-viewer-cesiumInspectorContainer",e.container.appendChild(t);var i=new CesiumInspector(t,e.scene);Object.defineProperties(e,{cesiumInspector:{get:function(){return i}}})}function viewerDragDropMixin(o,e){e=defaultValue(e,defaultValue.EMPTY_OBJECT);var t=!0,i=defaultValue(e.flyToOnDrop,!0),r=new Event,s=defaultValue(e.clearOnDrop,!0),n=defaultValue(e.dropTarget,o.container),l=defaultValue(e.clampToGround,!0),c=e.proxy;function a(e){stop(e),s&&(o.entities.removeAll(),o.dataSources.removeAll());for(var t=e.dataTransfer.files,i=t.length,r=0;r<i;r++){var n=t[r],a=new FileReader;a.onload=createOnLoadCallback(o,n,c,l),a.onerror=createDropErrorCallback(o,n),a.readAsText(n)}}n=getElement(n),Object.defineProperties(o,{dropTarget:{get:function(){return n},set:function(e){unsubscribe(n,a),subscribe(n=e,a)}},dropEnabled:{get:function(){return t},set:function(e){e!==t&&((e?subscribe:unsubscribe)(n,a),t=e)}},dropError:{get:function(){return r}},clearOnDrop:{get:function(){return s},set:function(e){s=e}},flyToOnDrop:{get:function(){return i},set:function(e){i=e}},proxy:{get:function(){return c},set:function(e){c=e}},clampToGround:{get:function(){return l},set:function(e){l=e}}}),subscribe(n,a),o.destroy=wrapFunction(o,o.destroy,function(){o.dropEnabled=!1}),o._handleDrop=a}function stop(e){e.stopPropagation(),e.preventDefault()}function unsubscribe(e,t){var i=e;defined(i)&&(i.removeEventListener("drop",t,!1),i.removeEventListener("dragenter",stop,!1),i.removeEventListener("dragover",stop,!1),i.removeEventListener("dragexit",stop,!1))}function subscribe(e,t){e.addEventListener("drop",t,!1),e.addEventListener("dragenter",stop,!1),e.addEventListener("dragover",stop,!1),e.addEventListener("dragexit",stop,!1)}function createOnLoadCallback(r,n,a,o){var s=r.scene;return function(e){var t,i=n.name;try{if(/\.czml$/i.test(i))t=CzmlDataSource.load(JSON.parse(e.target.result),{sourceUri:i});else if(/\.geojson$/i.test(i)||/\.json$/i.test(i)||/\.topojson$/i.test(i))t=GeoJsonDataSource.load(JSON.parse(e.target.result),{sourceUri:i,clampToGround:o});else{if(!/\.(kml|kmz)$/i.test(i))return void r.dropError.raiseEvent(r,i,"Unrecognized file: "+i);t=KmlDataSource.load(n,{sourceUri:i,proxy:a,camera:s.camera,canvas:s.canvas,clampToGround:o})}defined(t)&&r.dataSources.add(t).then(function(e){r.flyToOnDrop&&r.flyTo(e)}).otherwise(function(e){r.dropError.raiseEvent(r,i,e)})}catch(e){r.dropError.raiseEvent(r,i,e)}}}function createDropErrorCallback(t,i){return function(e){t.dropError.raiseEvent(t,i.name,e.target.error)}}function viewerPerformanceWatchdogMixin(e,t){t=defaultValue(t,defaultValue.EMPTY_OBJECT);var i=new PerformanceWatchdog({scene:e.scene,container:e.bottomContainer,lowFrameRateMessage:t.lowFrameRateMessage});Object.defineProperties(e,{performanceWatchdog:{get:function(){return i}}})}function callAndWrap(e,t,i){try{return e(t,i)}catch(e){return when.reject(e)}}function createTaskProcessorWorker(n){var a;return function(e){var t=e.data,i=[],r={id:t.id,result:void 0,error:void 0};return when(callAndWrap(n,t.parameters,i)).then(function(e){r.result=e}).otherwise(function(e){e instanceof Error?r.error={name:e.name,message:e.message,stack:e.stack}:r.error=e}).always(function(){defined(a)||(a=defaultValue(self.webkitPostMessage,self.postMessage)),t.canTransferArrayBuffer||(i.length=0);try{a(r,i)}catch(e){r.result=void 0,r.error="postMessage failed with error: "+formatError(e)+"\n with responseMessage: "+JSON.stringify(r),a(r)}})}}Object.defineProperties(Viewer.prototype,{container:{get:function(){return this._container}},bottomContainer:{get:function(){return this._bottomContainer}},cesiumWidget:{get:function(){return this._cesiumWidget}},selectionIndicator:{get:function(){return this._selectionIndicator}},infoBox:{get:function(){return this._infoBox}},geocoder:{get:function(){return this._geocoder}},homeButton:{get:function(){return this._homeButton}},sceneModePicker:{get:function(){return this._sceneModePicker}},projectionPicker:{get:function(){return this._projectionPicker}},baseLayerPicker:{get:function(){return this._baseLayerPicker}},navigationHelpButton:{get:function(){return this._navigationHelpButton}},animation:{get:function(){return this._animation}},timeline:{get:function(){return this._timeline}},fullscreenButton:{get:function(){return this._fullscreenButton}},vrButton:{get:function(){return this._vrButton}},dataSourceDisplay:{get:function(){return this._dataSourceDisplay}},entities:{get:function(){return this._dataSourceDisplay.defaultDataSource.entities}},dataSources:{get:function(){return this._dataSourceCollection}},canvas:{get:function(){return this._cesiumWidget.canvas}},scene:{get:function(){return this._cesiumWidget.scene}},shadows:{get:function(){return this.scene.shadowMap.enabled},set:function(e){this.scene.shadowMap.enabled=e}},terrainShadows:{get:function(){return this.scene.globe.shadows},set:function(e){this.scene.globe.shadows=e}},shadowMap:{get:function(){return this.scene.shadowMap}},imageryLayers:{get:function(){return this.scene.imageryLayers}},terrainProvider:{get:function(){return this.scene.terrainProvider},set:function(e){this.scene.terrainProvider=e}},camera:{get:function(){return this.scene.camera}},postProcessStages:{get:function(){return this.scene.postProcessStages}},clock:{get:function(){return this._clockViewModel.clock}},clockViewModel:{get:function(){return this._clockViewModel}},screenSpaceEventHandler:{get:function(){return this._cesiumWidget.screenSpaceEventHandler}},targetFrameRate:{get:function(){return this._cesiumWidget.targetFrameRate},set:function(e){this._cesiumWidget.targetFrameRate=e}},useDefaultRenderLoop:{get:function(){return this._cesiumWidget.useDefaultRenderLoop},set:function(e){this._cesiumWidget.useDefaultRenderLoop=e}},resolutionScale:{get:function(){return this._cesiumWidget.resolutionScale},set:function(e){this._cesiumWidget.resolutionScale=e}},useBrowserRecommendedResolution:{get:function(){return this._cesiumWidget.useBrowserRecommendedResolution},set:function(e){this._cesiumWidget.useBrowserRecommendedResolution=e}},allowDataSourcesToSuspendAnimation:{get:function(){return this._allowDataSourcesToSuspendAnimation},set:function(e){this._allowDataSourcesToSuspendAnimation=e}},trackedEntity:{get:function(){return this._trackedEntity},set:function(e){var t,i;this._trackedEntity!==e&&(this._trackedEntity=e,cancelZoom(this),i=(t=this.scene).mode,defined(e)&&defined(e.position)?this._needTrackedEntityUpdate=!0:(this._needTrackedEntityUpdate=!1,i!==SceneMode$1.COLUMBUS_VIEW&&i!==SceneMode$1.SCENE2D||(t.screenSpaceCameraController.enableTranslate=!0),i!==SceneMode$1.COLUMBUS_VIEW&&i!==SceneMode$1.SCENE3D||(t.screenSpaceCameraController.enableTilt=!0),this._entityView=void 0,this.camera.lookAtTransform(Matrix4.IDENTITY)),this._trackedEntityChanged.raiseEvent(e),this.scene.requestRender())}},selectedEntity:{get:function(){return this._selectedEntity},set:function(e){var t;this._selectedEntity!==e&&(this._selectedEntity=e,t=defined(this._selectionIndicator)?this._selectionIndicator.viewModel:void 0,defined(e)?defined(t)&&t.animateAppear():defined(t)&&t.animateDepart(),this._selectedEntityChanged.raiseEvent(e))}},selectedEntityChanged:{get:function(){return this._selectedEntityChanged}},trackedEntityChanged:{get:function(){return this._trackedEntityChanged}},clockTrackedDataSource:{get:function(){return this._clockTrackedDataSource},set:function(e){this._clockTrackedDataSource!==e&&(this._clockTrackedDataSource=e,trackDataSourceClock(this._timeline,this.clock,e))}}}),Viewer.prototype.extend=function(e,t){e(this,t)},Viewer.prototype.resize=function(){var e,t,i,r,n,a,o,s,l,c,u,d,h,p=this._cesiumWidget,m=this._container,f=m.clientWidth,g=m.clientHeight,_=defined(this._animation),y=defined(this._timeline);p.resize(),f===this._lastWidth&&g===this._lastHeight||(e=g-125,defined(t=this._baseLayerPickerDropDown)&&(t.style.maxHeight=e+"px"),defined(this._geocoder)&&(this._geocoder.searchSuggestionsContainer.style.maxHeight=e+"px"),defined(this._infoBox)&&(this._infoBox.viewModel.maxHeight=e),i=this._timeline,d=n=r=0,_&&"hidden"!==window.getComputedStyle(this._animation.container).visibility&&(a=this._lastWidth,o=this._animation.container,900<f?(r=169,a<=900&&(o.style.width="169px",o.style.height="112px",this._animation.resize())):600<=f?(r=136,(a<600||900<a)&&(o.style.width="136px",o.style.height="90px",this._animation.resize())):(r=106,(600<a||0===a)&&(o.style.width="106px",o.style.height="70px",this._animation.resize())),n=r+5),y&&"hidden"!==window.getComputedStyle(this._timeline.container).visibility&&(s=this._fullscreenButton,l=this._vrButton,u=(c=i.container).style,d=c.clientHeight+3,u.left=r+"px",h=0,defined(s)&&(h+=s.container.clientWidth),defined(l)&&(h+=l.container.clientWidth),u.right=h+"px",i.resize()),this._bottomContainer.style.left=n+"px",this._bottomContainer.style.bottom=d+"px",this._lastWidth=f,this._lastHeight=g)},Viewer.prototype.forceResize=function(){this._lastWidth=0,this.resize()},Viewer.prototype.render=function(){this._cesiumWidget.render()},Viewer.prototype.isDestroyed=function(){return!1},Viewer.prototype.destroy=function(){this.screenSpaceEventHandler.removeInputAction(ScreenSpaceEventType$1.LEFT_CLICK),this.screenSpaceEventHandler.removeInputAction(ScreenSpaceEventType$1.LEFT_DOUBLE_CLICK);for(var e=this.dataSources,t=e.length,i=0;i<t;i++)this._dataSourceRemoved(e,e.get(i));return this._dataSourceRemoved(void 0,this._dataSourceDisplay.defaultDataSource),this._container.removeChild(this._element),this._element.removeChild(this._toolbar),this._eventHelper.removeAll(),defined(this._geocoder)&&(this._geocoder=this._geocoder.destroy()),defined(this._homeButton)&&(this._homeButton=this._homeButton.destroy()),defined(this._sceneModePicker)&&(this._sceneModePicker=this._sceneModePicker.destroy()),defined(this._projectionPicker)&&(this._projectionPicker=this._projectionPicker.destroy()),defined(this._baseLayerPicker)&&(this._baseLayerPicker=this._baseLayerPicker.destroy()),defined(this._animation)&&(this._element.removeChild(this._animation.container),this._animation=this._animation.destroy()),defined(this._timeline)&&(this._timeline.removeEventListener("settime",onTimelineScrubfunction,!1),this._element.removeChild(this._timeline.container),this._timeline=this._timeline.destroy()),defined(this._fullscreenButton)&&(this._fullscreenSubscription.dispose(),this._element.removeChild(this._fullscreenButton.container),this._fullscreenButton=this._fullscreenButton.destroy()),defined(this._vrButton)&&(this._vrSubscription.dispose(),this._vrModeSubscription.dispose(),this._element.removeChild(this._vrButton.container),this._vrButton=this._vrButton.destroy()),defined(this._infoBox)&&(this._element.removeChild(this._infoBox.container),this._infoBox=this._infoBox.destroy()),defined(this._selectionIndicator)&&(this._element.removeChild(this._selectionIndicator.container),this._selectionIndicator=this._selectionIndicator.destroy()),this._destroyClockViewModel&&(this._clockViewModel=this._clockViewModel.destroy()),this._dataSourceDisplay=this._dataSourceDisplay.destroy(),this._cesiumWidget=this._cesiumWidget.destroy(),this._destroyDataSourceCollection&&(this._dataSourceCollection=this._dataSourceCollection.destroy()),destroyObject(this)},Viewer.prototype._dataSourceAdded=function(e,t){t.entities.collectionChanged.addEventListener(Viewer.prototype._onEntityCollectionChanged,this)},Viewer.prototype._dataSourceRemoved=function(e,t){var i=t.entities;i.collectionChanged.removeEventListener(Viewer.prototype._onEntityCollectionChanged,this),defined(this.trackedEntity)&&i.getById(this.trackedEntity.id)===this.trackedEntity&&(this.trackedEntity=void 0),defined(this.selectedEntity)&&i.getById(this.selectedEntity.id)===this.selectedEntity&&(this.selectedEntity=void 0)},Viewer.prototype._onTick=function(e){var t=e.currentTime,i=this._dataSourceDisplay.update(t);this._allowDataSourcesToSuspendAnimation&&(this._clockViewModel.canAnimate=i);var r,n,a=this._entityView;defined(a)&&(r=this._trackedEntity,this._dataSourceDisplay.getBoundingSphere(r,!1,boundingSphereScratch$2)===BoundingSphereState$1.DONE&&a.update(t,boundingSphereScratch$2));var o=!1,s=this.selectedEntity,l=defined(s)&&this._enableInfoOrSelection;l&&s.isShowing&&s.isAvailable(t)&&(this._dataSourceDisplay.getBoundingSphere(s,!0,boundingSphereScratch$2)!==BoundingSphereState$1.FAILED?n=boundingSphereScratch$2.center:defined(s.position)&&(n=s.position.getValue(t,n)),o=defined(n));var c=defined(this._selectionIndicator)?this._selectionIndicator.viewModel:void 0;defined(c)&&(c.position=Cartesian3.clone(n,c.position),c.showSelection=l&&o,c.update());var u=defined(this._infoBox)?this._infoBox.viewModel:void 0;defined(u)&&(u.showInfo=l,u.enableCamera=o,u.isCameraTracking=this.trackedEntity===this.selectedEntity,l?(u.titleText=defaultValue(s.name,s.id),u.description=Property.getValueOrDefault(s.description,t,"")):(u.titleText="",u.description=""))},Viewer.prototype._onEntityCollectionChanged=function(e,t,i){for(var r=i.length,n=0;n<r;n++){var a=i[n];this.trackedEntity===a&&(this.trackedEntity=void 0),this.selectedEntity===a&&(this.selectedEntity=void 0)}},Viewer.prototype._onInfoBoxCameraClicked=function(e){e.isCameraTracking&&this.trackedEntity===this.selectedEntity?this.trackedEntity=void 0:defined(this.selectedEntity.position)?this.trackedEntity=this.selectedEntity:this.zoomTo(this.selectedEntity)},Viewer.prototype._clearTrackedObject=function(){this.trackedEntity=void 0},Viewer.prototype._onInfoBoxClockClicked=function(e){this.selectedEntity=void 0},Viewer.prototype._clearObjects=function(){this.trackedEntity=void 0,this.selectedEntity=void 0},Viewer.prototype._onDataSourceChanged=function(e){this.clockTrackedDataSource===e&&trackDataSourceClock(this.timeline,this.clock,e)},Viewer.prototype._onDataSourceAdded=function(e,t){this._automaticallyTrackDataSourceClocks&&(this.clockTrackedDataSource=t);var i=t.entities.id,r=this._eventHelper.add(t.changedEvent,Viewer.prototype._onDataSourceChanged,this);this._dataSourceChangedListeners[i]=r},Viewer.prototype._onDataSourceRemoved=function(e,t){var i,r=this.clockTrackedDataSource===t,n=t.entities.id;this._dataSourceChangedListeners[n](),this._dataSourceChangedListeners[n]=void 0,r&&(i=e.length,this._automaticallyTrackDataSourceClocks&&0<i?this.clockTrackedDataSource=e.get(i-1):this.clockTrackedDataSource=void 0)},Viewer.prototype.zoomTo=function(e,t){return zoomToOrFly(this,e,{offset:t},!1)},Viewer.prototype.flyTo=function(e,t){return zoomToOrFly(this,e,t,!0)},Viewer.prototype._postRender=function(){updateZoomTarget(this),updateTrackedEntity(this)};var VERSION="1.72";exports.Animation=Animation,exports.AnimationViewModel=AnimationViewModel,exports.Appearance=Appearance,exports.ApproximateTerrainHeights=ApproximateTerrainHeights,exports.ArcGISTiledElevationTerrainProvider=ArcGISTiledElevationTerrainProvider,exports.ArcGisMapServerImageryProvider=ArcGisMapServerImageryProvider,exports.ArcType=ArcType$1,exports.AssociativeArray=AssociativeArray,exports.AttributeCompression=AttributeCompression,exports.AttributeType=AttributeType$1,exports.AutoExposure=AutoExposure,exports.Autolinker=Autolinker,exports.AutomaticUniforms=AutomaticUniforms,exports.Axis=Axis$1,exports.AxisAlignedBoundingBox=AxisAlignedBoundingBox,exports.BaseLayerPicker=BaseLayerPicker,exports.BaseLayerPickerViewModel=BaseLayerPickerViewModel,exports.BatchTable=BatchTable,exports.Batched3DModel3DTileContent=Batched3DModel3DTileContent,exports.Billboard=Billboard,exports.BillboardCollection=BillboardCollection,exports.BillboardGraphics=BillboardGraphics,exports.BillboardVisualizer=BillboardVisualizer,exports.BingMapsApi=BingMapsApi,exports.BingMapsGeocoderService=BingMapsGeocoderService,exports.BingMapsImageryProvider=BingMapsImageryProvider,exports.BingMapsStyle=BingMapsStyle$1,exports.BlendEquation=BlendEquation$1,exports.BlendFunction=BlendFunction$1,exports.BlendOption=BlendOption$1,exports.BlendingState=BlendingState$1,exports.BoundingRectangle=BoundingRectangle,exports.BoundingSphere=BoundingSphere,exports.BoundingSphereState=BoundingSphereState$1,exports.BoxEmitter=BoxEmitter,exports.BoxGeometry=BoxGeometry,exports.BoxGeometryUpdater=BoxGeometryUpdater,exports.BoxGraphics=BoxGraphics,exports.BoxOutlineGeometry=BoxOutlineGeometry,exports.BrdfLutGenerator=BrdfLutGenerator,exports.Buffer=Buffer$1,exports.BufferUsage=BufferUsage$1,exports.CallbackProperty=CallbackProperty,exports.Camera=Camera,exports.CameraEventAggregator=CameraEventAggregator,exports.CameraEventType=CameraEventType$1,exports.CameraFlightPath=CameraFlightPath,exports.Cartesian2=Cartesian2,exports.Cartesian3=Cartesian3,exports.Cartesian4=Cartesian4,exports.Cartographic=Cartographic,exports.CartographicGeocoderService=CartographicGeocoderService,exports.CatmullRomSpline=CatmullRomSpline,exports.Cesium3DTile=Cesium3DTile,exports.Cesium3DTileBatchTable=Cesium3DTileBatchTable,exports.Cesium3DTileColorBlendMode=Cesium3DTileColorBlendMode$1,exports.Cesium3DTileContent=Cesium3DTileContent,exports.Cesium3DTileContentFactory=Cesium3DTileContentFactory,exports.Cesium3DTileContentState=Cesium3DTileContentState$1,exports.Cesium3DTileFeature=Cesium3DTileFeature,exports.Cesium3DTileFeatureTable=Cesium3DTileFeatureTable,exports.Cesium3DTileOptimizationHint=Cesium3DTileOptimizationHint$1,exports.Cesium3DTileOptimizations=Cesium3DTileOptimizations,exports.Cesium3DTilePass=Cesium3DTilePass$1,exports.Cesium3DTilePassState=Cesium3DTilePassState,exports.Cesium3DTilePointFeature=Cesium3DTilePointFeature,exports.Cesium3DTileRefine=Cesium3DTileRefine$1,exports.Cesium3DTileStyle=Cesium3DTileStyle,exports.Cesium3DTileStyleEngine=Cesium3DTileStyleEngine,exports.Cesium3DTilesInspector=Cesium3DTilesInspector,exports.Cesium3DTilesInspectorViewModel=Cesium3DTilesInspectorViewModel,exports.Cesium3DTileset=Cesium3DTileset,exports.Cesium3DTilesetCache=Cesium3DTilesetCache,exports.Cesium3DTilesetGraphics=Cesium3DTilesetGraphics,exports.Cesium3DTilesetHeatmap=Cesium3DTilesetHeatmap,exports.Cesium3DTilesetMostDetailedTraversal=Cesium3DTilesetMostDetailedTraversal,exports.Cesium3DTilesetStatistics=Cesium3DTilesetStatistics,exports.Cesium3DTilesetTraversal=Cesium3DTilesetTraversal,exports.Cesium3DTilesetVisualizer=Cesium3DTilesetVisualizer,exports.CesiumInspector=CesiumInspector,exports.CesiumInspectorViewModel=CesiumInspectorViewModel,exports.CesiumTerrainProvider=CesiumTerrainProvider,exports.CesiumWidget=CesiumWidget,exports.Check=Check,exports.CheckerboardMaterialProperty=CheckerboardMaterialProperty,exports.CircleEmitter=CircleEmitter,exports.CircleGeometry=CircleGeometry,exports.CircleOutlineGeometry=CircleOutlineGeometry,exports.ClassificationModel=ClassificationModel,exports.ClassificationPrimitive=ClassificationPrimitive,exports.ClassificationType=ClassificationType$1,exports.ClearCommand=ClearCommand,exports.ClippingPlane=ClippingPlane,exports.ClippingPlaneCollection=ClippingPlaneCollection,exports.Clock=Clock,exports.ClockRange=ClockRange$1,exports.ClockStep=ClockStep$1,exports.ClockViewModel=ClockViewModel,exports.Color=Color,exports.ColorBlendMode=ColorBlendMode$1,exports.ColorGeometryInstanceAttribute=ColorGeometryInstanceAttribute,exports.ColorMaterialProperty=ColorMaterialProperty,exports.Command=Command,exports.ComponentDatatype=ComponentDatatype$1,exports.Composite3DTileContent=Composite3DTileContent,exports.CompositeEntityCollection=CompositeEntityCollection,exports.CompositeMaterialProperty=CompositeMaterialProperty,exports.CompositePositionProperty=CompositePositionProperty,exports.CompositeProperty=CompositeProperty,exports.CompressedTextureBuffer=CompressedTextureBuffer,exports.ComputeCommand=ComputeCommand,exports.ComputeEngine=ComputeEngine,exports.ConditionsExpression=ConditionsExpression,exports.ConeEmitter=ConeEmitter,exports.ConstantPositionProperty=ConstantPositionProperty,exports.ConstantProperty=ConstantProperty,exports.Context=Context,exports.ContextLimits=ContextLimits,exports.CoplanarPolygonGeometry=CoplanarPolygonGeometry,exports.CoplanarPolygonGeometryLibrary=CoplanarPolygonGeometryLibrary,exports.CoplanarPolygonOutlineGeometry=CoplanarPolygonOutlineGeometry,exports.CornerType=CornerType$1,exports.CorridorGeometry=CorridorGeometry,exports.CorridorGeometryLibrary=CorridorGeometryLibrary,exports.CorridorGeometryUpdater=CorridorGeometryUpdater,exports.CorridorGraphics=CorridorGraphics,exports.CorridorOutlineGeometry=CorridorOutlineGeometry,exports.Credit=Credit,exports.CreditDisplay=CreditDisplay,exports.CubeMap=CubeMap,exports.CubeMapFace=CubeMapFace,exports.CubicRealPolynomial=CubicRealPolynomial,exports.CullFace=CullFace$1,exports.CullingVolume=CullingVolume,exports.CustomDataSource=CustomDataSource,exports.CylinderGeometry=CylinderGeometry,exports.CylinderGeometryLibrary=CylinderGeometryLibrary,exports.CylinderGeometryUpdater=CylinderGeometryUpdater,exports.CylinderGraphics=CylinderGraphics,exports.CylinderOutlineGeometry=CylinderOutlineGeometry,exports.CzmlDataSource=CzmlDataSource,exports.DataSource=DataSource,exports.DataSourceClock=DataSourceClock,exports.DataSourceCollection=DataSourceCollection,exports.DataSourceDisplay=DataSourceDisplay,exports.DebugAppearance=DebugAppearance,exports.DebugCameraPrimitive=DebugCameraPrimitive,exports.DebugInspector=DebugInspector,exports.DebugModelMatrixPrimitive=DebugModelMatrixPrimitive,exports.DefaultProxy=DefaultProxy,exports.DepthFunction=DepthFunction$1,exports.DepthPlane=DepthPlane,exports.DerivedCommand=DerivedCommand,exports.DeveloperError=DeveloperError,exports.DeviceOrientationCameraController=DeviceOrientationCameraController,exports.DirectionalLight=DirectionalLight,exports.DiscardEmptyTileImagePolicy=DiscardEmptyTileImagePolicy,exports.DiscardMissingTileImagePolicy=DiscardMissingTileImagePolicy,exports.DistanceDisplayCondition=DistanceDisplayCondition,exports.DistanceDisplayConditionGeometryInstanceAttribute=DistanceDisplayConditionGeometryInstanceAttribute,exports.DoublyLinkedList=DoublyLinkedList,exports.DracoLoader=DracoLoader,exports.DrawCommand=DrawCommand,exports.DynamicGeometryBatch=DynamicGeometryBatch,exports.DynamicGeometryUpdater=DynamicGeometryUpdater,exports.EarthOrientationParameters=EarthOrientationParameters,exports.EarthOrientationParametersSample=EarthOrientationParametersSample,exports.EasingFunction=EasingFunction$1,exports.EllipseGeometry=EllipseGeometry,exports.EllipseGeometryLibrary=EllipseGeometryLibrary,exports.EllipseGeometryUpdater=EllipseGeometryUpdater,exports.EllipseGraphics=EllipseGraphics,exports.EllipseOutlineGeometry=EllipseOutlineGeometry,exports.Ellipsoid=Ellipsoid,exports.EllipsoidGeodesic=EllipsoidGeodesic,exports.EllipsoidGeometry=EllipsoidGeometry,exports.EllipsoidGeometryUpdater=EllipsoidGeometryUpdater,exports.EllipsoidGraphics=EllipsoidGraphics,exports.EllipsoidOutlineGeometry=EllipsoidOutlineGeometry,exports.EllipsoidPrimitive=EllipsoidPrimitive,exports.EllipsoidRhumbLine=EllipsoidRhumbLine,exports.EllipsoidSurfaceAppearance=EllipsoidSurfaceAppearance,exports.EllipsoidTangentPlane=EllipsoidTangentPlane,exports.EllipsoidTerrainProvider=EllipsoidTerrainProvider,exports.EllipsoidalOccluder=EllipsoidalOccluder,exports.Empty3DTileContent=Empty3DTileContent,exports.EncodedCartesian3=EncodedCartesian3,exports.Entity=Entity,exports.EntityCluster=EntityCluster,exports.EntityCollection=EntityCollection,exports.EntityView=EntityView,exports.Event=Event,exports.EventHelper=EventHelper,exports.Expression=Expression,exports.ExpressionNodeType=ExpressionNodeType$1,exports.ExtrapolationType=ExtrapolationType$1,exports.FXAA3_11=FXAA3_11,exports.FeatureDetection=FeatureDetection,exports.Fog=Fog,exports.ForEach=ForEach,exports.FrameRateMonitor=FrameRateMonitor,exports.FrameState=FrameState,exports.Framebuffer=Framebuffer,exports.FrustumCommands=FrustumCommands,exports.FrustumGeometry=FrustumGeometry,exports.FrustumOutlineGeometry=FrustumOutlineGeometry,exports.Fullscreen=Fullscreen,exports.FullscreenButton=FullscreenButton,exports.FullscreenButtonViewModel=FullscreenButtonViewModel,exports.GeoJsonDataSource=GeoJsonDataSource,exports.GeocodeType=GeocodeType$1,exports.Geocoder=Geocoder,exports.GeocoderService=GeocoderService,exports.GeocoderViewModel=GeocoderViewModel,exports.GeographicProjection=GeographicProjection,exports.GeographicTilingScheme=GeographicTilingScheme,exports.Geometry=Geometry,exports.Geometry3DTileContent=Geometry3DTileContent,exports.GeometryAttribute=GeometryAttribute,exports.GeometryAttributes=GeometryAttributes,exports.GeometryFactory=GeometryFactory,exports.GeometryInstance=GeometryInstance,exports.GeometryInstanceAttribute=GeometryInstanceAttribute,exports.GeometryOffsetAttribute=GeometryOffsetAttribute$1,exports.GeometryPipeline=GeometryPipeline,exports.GeometryType=GeometryType$1,exports.GeometryUpdater=GeometryUpdater,exports.GeometryVisualizer=GeometryVisualizer,exports.GetFeatureInfoFormat=GetFeatureInfoFormat,exports.Globe=Globe,exports.GlobeDepth=GlobeDepth,exports.GlobeSurfaceShaderSet=GlobeSurfaceShaderSet,exports.GlobeSurfaceTile=GlobeSurfaceTile,exports.GlobeSurfaceTileProvider=GlobeSurfaceTileProvider,exports.GlobeTranslucency=GlobeTranslucency,exports.GlobeTranslucencyFramebuffer=GlobeTranslucencyFramebuffer,exports.GlobeTranslucencyState=GlobeTranslucencyState,exports.GoogleEarthEnterpriseImageryProvider=GoogleEarthEnterpriseImageryProvider,exports.GoogleEarthEnterpriseMapsProvider=GoogleEarthEnterpriseMapsProvider,exports.GoogleEarthEnterpriseMetadata=GoogleEarthEnterpriseMetadata,exports.GoogleEarthEnterpriseTerrainData=GoogleEarthEnterpriseTerrainData,exports.GoogleEarthEnterpriseTerrainProvider=GoogleEarthEnterpriseTerrainProvider,exports.GoogleEarthEnterpriseTileInformation=GoogleEarthEnterpriseTileInformation,exports.GregorianDate=GregorianDate,exports.GridImageryProvider=GridImageryProvider,exports.GridMaterialProperty=GridMaterialProperty,exports.GroundGeometryUpdater=GroundGeometryUpdater,exports.GroundPolylineGeometry=GroundPolylineGeometry,exports.GroundPolylinePrimitive=GroundPolylinePrimitive,exports.GroundPrimitive=GroundPrimitive,exports.HeadingPitchRange=HeadingPitchRange,exports.HeadingPitchRoll=HeadingPitchRoll,exports.Heap=Heap,exports.HeightReference=HeightReference$1,exports.HeightmapEncoding=HeightmapEncoding$1,exports.HeightmapTerrainData=HeightmapTerrainData,exports.HeightmapTessellator=HeightmapTessellator,exports.HermitePolynomialApproximation=HermitePolynomialApproximation,exports.HermiteSpline=HermiteSpline,exports.HomeButton=HomeButton,exports.HomeButtonViewModel=HomeButtonViewModel,exports.HorizontalOrigin=HorizontalOrigin$1,exports.Iau2000Orientation=Iau2000Orientation,exports.Iau2006XysData=Iau2006XysData,exports.Iau2006XysSample=Iau2006XysSample,exports.IauOrientationAxes=IauOrientationAxes,exports.IauOrientationParameters=IauOrientationParameters,exports.ImageMaterialProperty=ImageMaterialProperty,exports.Imagery=Imagery,exports.ImageryLayer=ImageryLayer,exports.ImageryLayerCollection=ImageryLayerCollection,exports.ImageryLayerFeatureInfo=ImageryLayerFeatureInfo,exports.ImageryProvider=ImageryProvider,exports.ImagerySplitDirection=ImagerySplitDirection$1,exports.ImageryState=ImageryState$1,exports.IndexDatatype=IndexDatatype$1,exports.InfoBox=InfoBox,exports.InfoBoxViewModel=InfoBoxViewModel,exports.InspectorShared=InspectorShared,exports.Instanced3DModel3DTileContent=Instanced3DModel3DTileContent,exports.InterpolationAlgorithm=InterpolationAlgorithm,exports.Intersect=Intersect$1,exports.IntersectionTests=IntersectionTests,exports.Intersections2D=Intersections2D,exports.Interval=Interval,exports.InvertClassification=InvertClassification,exports.Ion=Ion,exports.IonGeocoderService=IonGeocoderService,exports.IonImageryProvider=IonImageryProvider,exports.IonResource=IonResource,exports.IonWorldImageryStyle=IonWorldImageryStyle$1,exports.Iso8601=Iso8601,exports.JobScheduler=JobScheduler,exports.JobType=JobType$1,exports.JulianDate=JulianDate,exports.KeyboardEventModifier=KeyboardEventModifier$1,exports.KmlCamera=KmlCamera,exports.KmlDataSource=KmlDataSource,exports.KmlLookAt=KmlLookAt,exports.KmlTour=KmlTour,exports.KmlTourFlyTo=KmlTourFlyTo,exports.KmlTourWait=KmlTourWait,exports.Label=Label,exports.LabelCollection=LabelCollection,exports.LabelGraphics=LabelGraphics,exports.LabelStyle=LabelStyle$1,exports.LabelVisualizer=LabelVisualizer,exports.LagrangePolynomialApproximation=LagrangePolynomialApproximation,exports.LeapSecond=LeapSecond,exports.LercDecode=LercDecode,exports.Light=Light,exports.LinearApproximation=LinearApproximation,exports.LinearSpline=LinearSpline,exports.ManagedArray=ManagedArray,exports.MapMode2D=MapMode2D$1,exports.MapProjection=MapProjection,exports.MapboxApi=MapboxApi,exports.MapboxImageryProvider=MapboxImageryProvider,exports.MapboxStyleImageryProvider=MapboxStyleImageryProvider,exports.Material=Material,exports.MaterialAppearance=MaterialAppearance,exports.MaterialProperty=MaterialProperty,exports.Math=CesiumMath,exports.Matrix2=Matrix2,exports.Matrix3=Matrix3,exports.Matrix4=Matrix4,exports.MipmapHint=MipmapHint$1,exports.Model=Model,exports.ModelAnimation=ModelAnimation,exports.ModelAnimationCache=ModelAnimationCache,exports.ModelAnimationCollection=ModelAnimationCollection,exports.ModelAnimationLoop=ModelAnimationLoop$1,exports.ModelAnimationState=ModelAnimationState,exports.ModelGraphics=ModelGraphics,exports.ModelInstance=ModelInstance,exports.ModelInstanceCollection=ModelInstanceCollection,exports.ModelLoadResources=ModelLoadResources,exports.ModelMaterial=ModelMaterial,exports.ModelMesh=ModelMesh,exports.ModelNode=ModelNode,exports.ModelOutlineLoader=ModelOutlineLoader,exports.ModelUtility=ModelUtility,exports.ModelVisualizer=ModelVisualizer,exports.Moon=Moon,exports.NavigationHelpButton=NavigationHelpButton,exports.NavigationHelpButtonViewModel=NavigationHelpButtonViewModel,exports.NearFarScalar=NearFarScalar,exports.NeverTileDiscardPolicy=NeverTileDiscardPolicy,exports.NoSleep=NoSleep,exports.NodeTransformationProperty=NodeTransformationProperty,exports.OIT=OIT,exports.Occluder=Occluder,exports.OctahedralProjectedCubeMap=OctahedralProjectedCubeMap,exports.OffsetGeometryInstanceAttribute=OffsetGeometryInstanceAttribute,exports.OpenCageGeocoderService=OpenCageGeocoderService,exports.OpenStreetMapImageryProvider=OpenStreetMapImageryProvider,exports.OrderedGroundPrimitiveCollection=OrderedGroundPrimitiveCollection,exports.OrientedBoundingBox=OrientedBoundingBox,exports.OrthographicFrustum=OrthographicFrustum,exports.OrthographicOffCenterFrustum=OrthographicOffCenterFrustum,exports.Packable=Packable,exports.PackableForInterpolation=PackableForInterpolation,exports.Particle=Particle,exports.ParticleBurst=ParticleBurst,exports.ParticleEmitter=ParticleEmitter,exports.ParticleSystem=ParticleSystem,exports.Pass=Pass$1,exports.PassState=PassState,exports.PathGraphics=PathGraphics,exports.PathVisualizer=PathVisualizer,exports.PeliasGeocoderService=PeliasGeocoderService,exports.PerInstanceColorAppearance=PerInstanceColorAppearance,exports.PerformanceDisplay=PerformanceDisplay,exports.PerformanceWatchdog=PerformanceWatchdog,exports.PerformanceWatchdogViewModel=PerformanceWatchdogViewModel,exports.PerspectiveFrustum=PerspectiveFrustum,exports.PerspectiveOffCenterFrustum=PerspectiveOffCenterFrustum,exports.PickDepth=PickDepth,exports.PickDepthFramebuffer=PickDepthFramebuffer,exports.PickFramebuffer=PickFramebuffer,exports.Picking=Picking,exports.PinBuilder=PinBuilder,exports.PixelDatatype=PixelDatatype$1,exports.PixelFormat=PixelFormat$1,exports.Plane=Plane,exports.PlaneGeometry=PlaneGeometry,exports.PlaneGeometryUpdater=PlaneGeometryUpdater,exports.PlaneGraphics=PlaneGraphics,exports.PlaneOutlineGeometry=PlaneOutlineGeometry,exports.PointCloud=PointCloud,exports.PointCloud3DTileContent=PointCloud3DTileContent,exports.PointCloudEyeDomeLighting=PointCloudEyeDomeLighting,exports.PointCloudShading=PointCloudShading,exports.PointGraphics=PointGraphics,exports.PointPrimitive=PointPrimitive,exports.PointPrimitiveCollection=PointPrimitiveCollection,exports.PointVisualizer=PointVisualizer,exports.PolygonGeometry=PolygonGeometry,exports.PolygonGeometryLibrary=PolygonGeometryLibrary,exports.PolygonGeometryUpdater=PolygonGeometryUpdater,exports.PolygonGraphics=PolygonGraphics,exports.PolygonHierarchy=PolygonHierarchy,exports.PolygonOutlineGeometry=PolygonOutlineGeometry,exports.PolygonPipeline=PolygonPipeline,exports.Polyline=Polyline,exports.PolylineArrowMaterialProperty=PolylineArrowMaterialProperty,exports.PolylineCollection=PolylineCollection,exports.PolylineColorAppearance=PolylineColorAppearance,exports.PolylineDashMaterialProperty=PolylineDashMaterialProperty,exports.PolylineGeometry=PolylineGeometry,exports.PolylineGeometryUpdater=PolylineGeometryUpdater,exports.PolylineGlowMaterialProperty=PolylineGlowMaterialProperty,exports.PolylineGraphics=PolylineGraphics,exports.PolylineMaterialAppearance=PolylineMaterialAppearance,exports.PolylineOutlineMaterialProperty=PolylineOutlineMaterialProperty,exports.PolylinePipeline=PolylinePipeline,exports.PolylineVisualizer=PolylineVisualizer,exports.PolylineVolumeGeometry=PolylineVolumeGeometry,exports.PolylineVolumeGeometryLibrary=PolylineVolumeGeometryLibrary,exports.PolylineVolumeGeometryUpdater=PolylineVolumeGeometryUpdater,exports.PolylineVolumeGraphics=PolylineVolumeGraphics,exports.PolylineVolumeOutlineGeometry=PolylineVolumeOutlineGeometry,exports.PositionProperty=PositionProperty,exports.PositionPropertyArray=PositionPropertyArray,exports.PostProcessStage=PostProcessStage,exports.PostProcessStageCollection=PostProcessStageCollection,exports.PostProcessStageComposite=PostProcessStageComposite,exports.PostProcessStageLibrary=PostProcessStageLibrary,exports.PostProcessStageSampleMode=PostProcessStageSampleMode,exports.PostProcessStageTextureCache=PostProcessStageTextureCache,exports.Primitive=Primitive,exports.PrimitiveCollection=PrimitiveCollection,exports.PrimitivePipeline=PrimitivePipeline,exports.PrimitiveState=PrimitiveState$1,exports.PrimitiveType=PrimitiveType$1,exports.ProjectionPicker=ProjectionPicker,exports.ProjectionPickerViewModel=ProjectionPickerViewModel,exports.Property=Property,exports.PropertyArray=PropertyArray,exports.PropertyBag=PropertyBag,exports.ProviderViewModel=ProviderViewModel,exports.Proxy=Proxy,exports.QuadraticRealPolynomial=QuadraticRealPolynomial,exports.QuadtreeOccluders=QuadtreeOccluders,exports.QuadtreePrimitive=QuadtreePrimitive,exports.QuadtreeTile=QuadtreeTile,exports.QuadtreeTileLoadState=QuadtreeTileLoadState$1,exports.QuadtreeTileProvider=QuadtreeTileProvider,exports.QuantizedMeshTerrainData=QuantizedMeshTerrainData,exports.QuarticRealPolynomial=QuarticRealPolynomial,exports.Quaternion=Quaternion,exports.QuaternionSpline=QuaternionSpline,exports.Queue=Queue,exports.Ray=Ray,exports.Rectangle=Rectangle,exports.RectangleCollisionChecker=RectangleCollisionChecker,exports.RectangleGeometry=RectangleGeometry,exports.RectangleGeometryLibrary=RectangleGeometryLibrary,exports.RectangleGeometryUpdater=RectangleGeometryUpdater,exports.RectangleGraphics=RectangleGraphics,exports.RectangleOutlineGeometry=RectangleOutlineGeometry,exports.ReferenceFrame=ReferenceFrame$1,exports.ReferenceProperty=ReferenceProperty,exports.RenderState=RenderState,exports.Renderbuffer=Renderbuffer,exports.RenderbufferFormat=RenderbufferFormat$1,exports.Request=Request,exports.RequestErrorEvent=RequestErrorEvent,exports.RequestScheduler=RequestScheduler,exports.RequestState=RequestState$1,exports.RequestType=RequestType$1,exports.Resource=Resource,exports.Rotation=Rotation,exports.RuntimeError=RuntimeError,exports.SDFSettings=SDFSettings$1,exports.SampledPositionProperty=SampledPositionProperty,exports.SampledProperty=SampledProperty,exports.Sampler=Sampler,exports.ScaledPositionProperty=ScaledPositionProperty,exports.Scene=Scene,exports.SceneFramebuffer=SceneFramebuffer,exports.SceneMode=SceneMode$1,exports.SceneModePicker=SceneModePicker,exports.SceneModePickerViewModel=SceneModePickerViewModel,exports.SceneTransforms=SceneTransforms,exports.SceneTransitioner=SceneTransitioner,exports.ScreenSpaceCameraController=ScreenSpaceCameraController,exports.ScreenSpaceEventHandler=ScreenSpaceEventHandler,exports.ScreenSpaceEventType=ScreenSpaceEventType$1,exports.SelectionIndicator=SelectionIndicator,exports.SelectionIndicatorViewModel=SelectionIndicatorViewModel,exports.ShaderCache=ShaderCache,exports.ShaderProgram=ShaderProgram,exports.ShaderSource=ShaderSource,exports.ShadowMap=ShadowMap,exports.ShadowMapShader=ShadowMapShader,exports.ShadowMode=ShadowMode$1,exports.ShadowVolumeAppearance=ShadowVolumeAppearance,exports.ShowGeometryInstanceAttribute=ShowGeometryInstanceAttribute,exports.Simon1994PlanetaryPositions=Simon1994PlanetaryPositions,exports.SimplePolylineGeometry=SimplePolylineGeometry,exports.SingleTileImageryProvider=SingleTileImageryProvider,exports.SkyAtmosphere=SkyAtmosphere,exports.SkyBox=SkyBox,exports.SphereEmitter=SphereEmitter,exports.SphereGeometry=SphereGeometry,exports.SphereOutlineGeometry=SphereOutlineGeometry,exports.Spherical=Spherical,exports.Spline=Spline,exports.StaticGeometryColorBatch=StaticGeometryColorBatch,exports.StaticGeometryPerMaterialBatch=StaticGeometryPerMaterialBatch,exports.StaticGroundGeometryColorBatch=StaticGroundGeometryColorBatch,exports.StaticGroundGeometryPerMaterialBatch=StaticGroundGeometryPerMaterialBatch,exports.StaticGroundPolylinePerMaterialBatch=StaticGroundPolylinePerMaterialBatch,exports.StaticOutlineGeometryBatch=StaticOutlineGeometryBatch,exports.StencilConstants=StencilConstants$1,exports.StencilFunction=StencilFunction$1,exports.StencilOperation=StencilOperation$1,exports.StripeMaterialProperty=StripeMaterialProperty,exports.StripeOrientation=StripeOrientation$1,exports.StyleExpression=StyleExpression,exports.Sun=Sun,exports.SunLight=SunLight,exports.SunPostProcess=SunPostProcess,exports.SvgPathBindingHandler=SvgPathBindingHandler,exports.TaskProcessor=TaskProcessor,exports.TerrainData=TerrainData,exports.TerrainEncoding=TerrainEncoding,exports.TerrainFillMesh=TerrainFillMesh,exports.TerrainMesh=TerrainMesh,exports.TerrainOffsetProperty=TerrainOffsetProperty,exports.TerrainProvider=TerrainProvider,exports.TerrainQuantization=TerrainQuantization$1,exports.TerrainState=TerrainState$2,exports.Texture=Texture,exports.TextureAtlas=TextureAtlas,exports.TextureCache=TextureCache,exports.TextureMagnificationFilter=TextureMagnificationFilter$1,exports.TextureMinificationFilter=TextureMinificationFilter$1,exports.TextureWrap=TextureWrap$1,exports.TileAvailability=TileAvailability,exports.TileBoundingRegion=TileBoundingRegion,exports.TileBoundingSphere=TileBoundingSphere,exports.TileBoundingVolume=TileBoundingVolume,exports.TileCoordinatesImageryProvider=TileCoordinatesImageryProvider,exports.TileDiscardPolicy=TileDiscardPolicy,exports.TileEdge=TileEdge,exports.TileImagery=TileImagery,exports.TileMapServiceImageryProvider=TileMapServiceImageryProvider,exports.TileOrientedBoundingBox=TileOrientedBoundingBox,exports.TileProviderError=TileProviderError,exports.TileReplacementQueue=TileReplacementQueue,exports.TileSelectionResult=TileSelectionResult,exports.TileState=TileState$1,exports.Tileset3DTileContent=Tileset3DTileContent,exports.TilingScheme=TilingScheme,exports.TimeConstants=TimeConstants$1,exports.TimeDynamicImagery=TimeDynamicImagery,exports.TimeDynamicPointCloud=TimeDynamicPointCloud,exports.TimeInterval=TimeInterval,exports.TimeIntervalCollection=TimeIntervalCollection,exports.TimeIntervalCollectionPositionProperty=TimeIntervalCollectionPositionProperty,exports.TimeIntervalCollectionProperty=TimeIntervalCollectionProperty,exports.TimeStandard=TimeStandard$1,exports.Timeline=Timeline,exports.TimelineHighlightRange=TimelineHighlightRange,exports.TimelineTrack=TimelineTrack,exports.Tipsify=Tipsify,exports.ToggleButtonViewModel=ToggleButtonViewModel,exports.Tonemapper=Tonemapper$1,exports.Transforms=Transforms,exports.TranslationRotationScale=TranslationRotationScale,exports.TridiagonalSystemSolver=TridiagonalSystemSolver,exports.TrustedServers=TrustedServers,exports.Tween=TWEEN,exports.TweenCollection=TweenCollection,exports.UniformState=UniformState,exports.Uri=URI,exports.UrlTemplateImageryProvider=UrlTemplateImageryProvider,exports.VERSION=VERSION,exports.VRButton=VRButton,exports.VRButtonViewModel=VRButtonViewModel,exports.VRTheWorldTerrainProvider=VRTheWorldTerrainProvider,exports.Vector3DTileBatch=Vector3DTileBatch,exports.Vector3DTileContent=Vector3DTileContent,exports.Vector3DTileGeometry=Vector3DTileGeometry,exports.Vector3DTilePoints=Vector3DTilePoints,exports.Vector3DTilePolygons=Vector3DTilePolygons,exports.Vector3DTilePolylines=Vector3DTilePolylines,exports.Vector3DTilePrimitive=Vector3DTilePrimitive,exports.VelocityOrientationProperty=VelocityOrientationProperty,exports.VelocityVectorProperty=VelocityVectorProperty,exports.VertexArray=VertexArray,exports.VertexArrayFacade=VertexArrayFacade,exports.VertexFormat=VertexFormat,exports.VerticalOrigin=VerticalOrigin$1,exports.VideoSynchronizer=VideoSynchronizer,exports.View=View,exports.Viewer=Viewer,exports.ViewportQuad=ViewportQuad,exports.Visibility=Visibility$1,exports.Visualizer=Visualizer,exports.WallGeometry=WallGeometry,exports.WallGeometryLibrary=WallGeometryLibrary,exports.WallGeometryUpdater=WallGeometryUpdater,exports.WallGraphics=WallGraphics,exports.WallOutlineGeometry=WallOutlineGeometry,exports.WebGLConstants=WebGLConstants$1,exports.WebMapServiceImageryProvider=WebMapServiceImageryProvider,exports.WebMapTileServiceImageryProvider=WebMapTileServiceImageryProvider,exports.WebMercatorProjection=WebMercatorProjection,exports.WebMercatorTilingScheme=WebMercatorTilingScheme,exports.WeightSpline=WeightSpline,exports.WindingOrder=WindingOrder$1,exports._shadersAcesTonemappingStage=AcesTonemapping,exports._shadersAdditiveBlend=AdditiveBlend,exports._shadersAdjustTranslucentFS=AdjustTranslucentFS,exports._shadersAllMaterialAppearanceFS=AllMaterialAppearanceFS,exports._shadersAllMaterialAppearanceVS=AllMaterialAppearanceVS,exports._shadersAmbientOcclusionGenerate=AmbientOcclusionGenerate,exports._shadersAmbientOcclusionModulate=AmbientOcclusionModulate,exports._shadersAspectRampMaterial=AspectRampMaterial,exports._shadersBasicMaterialAppearanceFS=BasicMaterialAppearanceFS,exports._shadersBasicMaterialAppearanceVS=BasicMaterialAppearanceVS,exports._shadersBillboardCollectionFS=BillboardCollectionFS,exports._shadersBillboardCollectionVS=BillboardCollectionVS,exports._shadersBlackAndWhite=BlackAndWhite,exports._shadersBloomComposite=BloomComposite,exports._shadersBrdfLutGeneratorFS=BrdfLutGeneratorFS,exports._shadersBrightPass=BrightPass,exports._shadersBrightness=Brightness,exports._shadersBumpMapMaterial=BumpMapMaterial,exports._shadersCheckerboardMaterial=CheckerboardMaterial,exports._shadersCompositeOITFS=CompositeOITFS,exports._shadersContrastBias=ContrastBias,exports._shadersCzmBuiltins=CzmBuiltins,exports._shadersDepthOfField=DepthOfField,exports._shadersDepthPlaneFS=DepthPlaneFS,exports._shadersDepthPlaneVS=DepthPlaneVS,exports._shadersDepthView=DepthView,exports._shadersDepthViewPacked=DepthViewPacked,exports._shadersDotMaterial=DotMaterial,exports._shadersEdgeDetection=EdgeDetection,exports._shadersElevationContourMaterial=ElevationContourMaterial,exports._shadersElevationRampMaterial=ElevationRampMaterial,exports._shadersEllipsoidFS=EllipsoidFS,exports._shadersEllipsoidSurfaceAppearanceFS=EllipsoidSurfaceAppearanceFS,exports._shadersEllipsoidSurfaceAppearanceVS=EllipsoidSurfaceAppearanceVS,exports._shadersEllipsoidVS=EllipsoidVS,exports._shadersFXAA=FXAA,exports._shadersFadeMaterial=FadeMaterial,exports._shadersFilmicTonemapping=FilmicTonemapping,exports._shadersGaussianBlur1D=GaussianBlur1D,exports._shadersGlobeFS=GlobeFS,exports._shadersGlobeVS=GlobeVS,exports._shadersGridMaterial=GridMaterial,exports._shadersGroundAtmosphere=GroundAtmosphere,exports._shadersHSBToRGB=czm_HSBToRGB,exports._shadersHSLToRGB=czm_HSLToRGB,exports._shadersLensFlare=LensFlare,exports._shadersModifiedReinhardTonemapping=ModifiedReinhardTonemapping,exports._shadersNightVision=NightVision,exports._shadersNormalMapMaterial=NormalMapMaterial,exports._shadersOctahedralProjectionAtlasFS=OctahedralProjectionAtlasFS,exports._shadersOctahedralProjectionFS=OctahedralProjectionFS,exports._shadersOctahedralProjectionVS=OctahedralProjectionVS,exports._shadersPassThrough=PassThrough,exports._shadersPassThroughDepth=PassThroughDepth,exports._shadersPerInstanceColorAppearanceFS=PerInstanceColorAppearanceFS,exports._shadersPerInstanceColorAppearanceVS=PerInstanceColorAppearanceVS,exports._shadersPerInstanceFlatColorAppearanceFS=PerInstanceFlatColorAppearanceFS,exports._shadersPerInstanceFlatColorAppearanceVS=PerInstanceFlatColorAppearanceVS,exports._shadersPointCloudEyeDomeLighting=PointCloudEyeDomeLightingShader,exports._shadersPointPrimitiveCollectionFS=PointPrimitiveCollectionFS,exports._shadersPointPrimitiveCollectionVS=PointPrimitiveCollectionVS,exports._shadersPolylineArrowMaterial=PolylineArrowMaterial,exports._shadersPolylineColorAppearanceVS=PolylineColorAppearanceVS,exports._shadersPolylineCommon=PolylineCommon,exports._shadersPolylineDashMaterial=PolylineDashMaterial,exports._shadersPolylineFS=PolylineFS,exports._shadersPolylineGlowMaterial=PolylineGlowMaterial,exports._shadersPolylineMaterialAppearanceVS=PolylineMaterialAppearanceVS,exports._shadersPolylineOutlineMaterial=PolylineOutlineMaterial,exports._shadersPolylineShadowVolumeFS=PolylineShadowVolumeFS,exports._shadersPolylineShadowVolumeMorphFS=PolylineShadowVolumeMorphFS,exports._shadersPolylineShadowVolumeMorphVS=PolylineShadowVolumeMorphVS,exports._shadersPolylineShadowVolumeVS=PolylineShadowVolumeVS,exports._shadersPolylineVS=PolylineVS,exports._shadersRGBToHSB=czm_RGBToHSB,exports._shadersRGBToHSL=czm_RGBToHSL,exports._shadersRGBToXYZ=czm_RGBToXYZ,exports._shadersReinhardTonemapping=ReinhardTonemapping,exports._shadersReprojectWebMercatorFS=ReprojectWebMercatorFS,exports._shadersReprojectWebMercatorVS=ReprojectWebMercatorVS,exports._shadersRimLightingMaterial=RimLightingMaterial,exports._shadersShadowVolumeAppearanceFS=ShadowVolumeAppearanceFS,exports._shadersShadowVolumeAppearanceVS=ShadowVolumeAppearanceVS,exports._shadersShadowVolumeFS=ShadowVolumeFS,exports._shadersSilhouette=Silhouette,exports._shadersSkyAtmosphereCommon=SkyAtmosphereCommon,exports._shadersSkyAtmosphereFS=SkyAtmosphereFS,exports._shadersSkyAtmosphereVS=SkyAtmosphereVS,exports._shadersSkyBoxFS=SkyBoxFS,exports._shadersSkyBoxVS=SkyBoxVS,exports._shadersSlopeRampMaterial=SlopeRampMaterial,exports._shadersStripeMaterial=StripeMaterial,exports._shadersSunFS=SunFS,exports._shadersSunTextureFS=SunTextureFS,exports._shadersSunVS=SunVS,exports._shadersTexturedMaterialAppearanceFS=TexturedMaterialAppearanceFS,exports._shadersTexturedMaterialAppearanceVS=TexturedMaterialAppearanceVS,exports._shadersVector3DTilePolylinesVS=Vector3DTilePolylinesVS,exports._shadersVectorTileVS=VectorTileVS,exports._shadersViewportQuadFS=ViewportQuadFS,exports._shadersViewportQuadVS=ViewportQuadVS,exports._shadersWater=WaterMaterial,exports._shadersXYZToRGB=czm_XYZToRGB,exports._shadersacesTonemapping=czm_acesTonemapping,exports._shadersalphaWeight=czm_alphaWeight,exports._shadersantialias=czm_antialias,exports._shadersapproximateSphericalCoordinates=czm_approximateSphericalCoordinates,exports._shadersbackFacing=czm_backFacing,exports._shadersbranchFreeTernary=czm_branchFreeTernary,exports._shaderscascadeColor=czm_cascadeColor,exports._shaderscascadeDistance=czm_cascadeDistance,exports._shaderscascadeMatrix=czm_cascadeMatrix,exports._shaderscascadeWeights=czm_cascadeWeights,exports._shaderscolumbusViewMorph=czm_columbusViewMorph,exports._shaderscomputePosition=czm_computePosition,exports._shaderscosineAndSine=czm_cosineAndSine,exports._shadersdecompressTextureCoordinates=czm_decompressTextureCoordinates,exports._shadersdegreesPerRadian=czm_degreesPerRadian,exports._shadersdepthClamp=czm_depthClamp,exports._shadersdepthRange=czm_depthRange,exports._shadersdepthRangeStruct=czm_depthRangeStruct,exports._shaderseastNorthUpToEyeCoordinates=czm_eastNorthUpToEyeCoordinates,exports._shadersellipsoidContainsPoint=czm_ellipsoidContainsPoint,exports._shadersellipsoidWgs84TextureCoordinates=czm_ellipsoidWgs84TextureCoordinates,exports._shadersepsilon1=czm_epsilon1,exports._shadersepsilon2=czm_epsilon2,exports._shadersepsilon3=czm_epsilon3,exports._shadersepsilon4=czm_epsilon4,exports._shadersepsilon5=czm_epsilon5,exports._shadersepsilon6=czm_epsilon6,exports._shadersepsilon7=czm_epsilon7,exports._shadersequalsEpsilon=czm_equalsEpsilon,exports._shaderseyeOffset=czm_eyeOffset,exports._shaderseyeToWindowCoordinates=czm_eyeToWindowCoordinates,exports._shadersfastApproximateAtan=czm_fastApproximateAtan,exports._shadersfog=czm_fog,exports._shadersgammaCorrect=czm_gammaCorrect,exports._shadersgeodeticSurfaceNormal=czm_geodeticSurfaceNormal,exports._shadersgetDefaultMaterial=czm_getDefaultMaterial,exports._shadersgetLambertDiffuse=czm_getLambertDiffuse,exports._shadersgetSpecular=czm_getSpecular,exports._shadersgetWaterNoise=czm_getWaterNoise,exports._shadershue=czm_hue,exports._shadersinfinity=czm_infinity,exports._shadersinverseGamma=czm_inverseGamma,exports._shadersisEmpty=czm_isEmpty,exports._shadersisFull=czm_isFull,exports._shaderslatitudeToWebMercatorFraction=czm_latitudeToWebMercatorFraction,exports._shaderslineDistance=czm_lineDistance,exports._shadersluminance=czm_luminance,exports._shadersmaterial=czm_material,exports._shadersmaterialInput=czm_materialInput,exports._shadersmetersPerPixel=czm_metersPerPixel,exports._shadersmodelToWindowCoordinates=czm_modelToWindowCoordinates,exports._shadersmultiplyWithColorBalance=czm_multiplyWithColorBalance,exports._shadersnearFarScalar=czm_nearFarScalar,exports._shadersoctDecode=czm_octDecode,exports._shadersoneOverPi=czm_oneOverPi,exports._shadersoneOverTwoPi=czm_oneOverTwoPi,exports._shaderspackDepth=czm_packDepth,exports._shaderspassCesium3DTile=czm_passCesium3DTile,exports._shaderspassCesium3DTileClassification=czm_passCesium3DTileClassification,exports._shaderspassCesium3DTileClassificationIgnoreShow=czm_passCesium3DTileClassificationIgnoreShow,exports._shaderspassClassification=czm_passClassification,exports._shaderspassCompute=czm_passCompute,exports._shaderspassEnvironment=czm_passEnvironment,exports._shaderspassGlobe=czm_passGlobe,exports._shaderspassOpaque=czm_passOpaque,exports._shaderspassOverlay=czm_passOverlay,exports._shaderspassTerrainClassification=czm_passTerrainClassification,exports._shaderspassTranslucent=czm_passTranslucent,exports._shadersphong=czm_phong,exports._shaderspi=czm_pi,exports._shaderspiOverFour=czm_piOverFour,exports._shaderspiOverSix=czm_piOverSix,exports._shaderspiOverThree=czm_piOverThree,exports._shaderspiOverTwo=czm_piOverTwo,exports._shadersplaneDistance=czm_planeDistance,exports._shaderspointAlongRay=czm_pointAlongRay,exports._shadersradiansPerDegree=czm_radiansPerDegree,exports._shadersray=czm_ray,exports._shadersrayEllipsoidIntersectionInterval=czm_rayEllipsoidIntersectionInterval,exports._shadersraySegment=czm_raySegment,exports._shadersreadDepth=czm_readDepth,exports._shadersreadNonPerspective=czm_readNonPerspective,exports._shadersreverseLogDepth=czm_reverseLogDepth;exports._shaderssampleOctahedralProjection=czm_sampleOctahedralProjection,exports._shaderssaturation=czm_saturation,exports._shaderssceneMode2D=czm_sceneMode2D,exports._shaderssceneMode3D=czm_sceneMode3D,exports._shaderssceneModeColumbusView=czm_sceneModeColumbusView,exports._shaderssceneModeMorphing=czm_sceneModeMorphing,exports._shadersshadowDepthCompare=czm_shadowDepthCompare,exports._shadersshadowParameters=czm_shadowParameters,exports._shadersshadowVisibility=czm_shadowVisibility,exports._shaderssignNotZero=czm_signNotZero,exports._shaderssolarRadius=czm_solarRadius,exports._shaderssphericalHarmonics=czm_sphericalHarmonics,exports._shaderstangentToEyeSpaceMatrix=czm_tangentToEyeSpaceMatrix,exports._shadersthreePiOver2=czm_threePiOver2,exports._shaderstransformPlane=czm_transformPlane,exports._shaderstranslateRelativeToEye=czm_translateRelativeToEye,exports._shaderstranslucentPhong=czm_translucentPhong,exports._shaderstranspose=czm_transpose,exports._shaderstwoPi=czm_twoPi,exports._shadersunpackDepth=czm_unpackDepth,exports._shadersunpackFloat=czm_unpackFloat,exports._shadersvertexLogDepth=czm_vertexLogDepth,exports._shaderswebMercatorMaxLatitude=czm_webMercatorMaxLatitude,exports._shaderswindowToEyeCoordinates=czm_windowToEyeCoordinates,exports._shaderswriteDepthClamp=czm_writeDepthClamp,exports._shaderswriteLogDepth=czm_writeLogDepth,exports._shaderswriteNonPerspective=czm_writeNonPerspective,exports.addBuffer=addBuffer,exports.addDefaults=addDefaults,exports.addExtensionsRequired=addExtensionsRequired,exports.addExtensionsUsed=addExtensionsUsed,exports.addPipelineExtras=addPipelineExtras,exports.addToArray=addToArray,exports.appendForwardSlash=appendForwardSlash,exports.arrayFill=arrayFill,exports.arrayRemoveDuplicates=arrayRemoveDuplicates,exports.arraySlice=arraySlice,exports.barycentricCoordinates=barycentricCoordinates,exports.binarySearch=binarySearch,exports.bitmap_sdf=calcSDF,exports.buildModuleUrl=buildModuleUrl,exports.cancelAnimationFrame=cancelAnimationFramePolyfill,exports.clone=clone,exports.combine=combine,exports.computeFlyToLocationForRectangle=computeFlyToLocationForRectangle,exports.createBillboardPointCallback=createBillboardPointCallback,exports.createCommand=createCommand$2,exports.createDefaultImageryProviderViewModels=createDefaultImageryProviderViewModels,exports.createDefaultTerrainProviderViewModels=createDefaultTerrainProviderViewModels,exports.createGuid=createGuid,exports.createMaterialPropertyDescriptor=createMaterialPropertyDescriptor,exports.createOsmBuildings=createOsmBuildings,exports.createPropertyDescriptor=createPropertyDescriptor,exports.createRawPropertyDescriptor=createRawPropertyDescriptor,exports.createTangentSpaceDebugPrimitive=createTangentSpaceDebugPrimitive,exports.createTaskProcessorWorker=createTaskProcessorWorker,exports.createUniform=createUniform$1,exports.createUniformArray=createUniformArray,exports.createWorldImagery=createWorldImagery,exports.createWorldTerrain=createWorldTerrain,exports.decodeGoogleEarthEnterpriseData=decodeGoogleEarthEnterpriseData,exports.defaultValue=defaultValue,exports.defined=defined,exports.deprecationWarning=deprecationWarning,exports.destroyObject=destroyObject,exports.earcut_2_2_1=earcut,exports.exportKml=exportKml,exports.findAccessorMinMax=findAccessorMinMax,exports.formatError=formatError,exports.freezeRenderState=freezeRenderState,exports.getAbsoluteUri=getAbsoluteUri,exports.getAccessorByteStride=getAccessorByteStride,exports.getBaseUri=getBaseUri,exports.getBinaryAccessor=getBinaryAccessor,exports.getClipAndStyleCode=getClipAndStyleCode,exports.getClippingFunction=getClippingFunction,exports.getComponentReader=getComponentReader,exports.getElement=getElement,exports.getExtensionFromUri=getExtensionFromUri,exports.getFilenameFromUri=getFilenameFromUri,exports.getImagePixels=getImagePixels,exports.getMagic=getMagic,exports.getStringFromTypedArray=getStringFromTypedArray,exports.getTimestamp=getTimestamp$1,exports.graphemesplitter=GraphemeSplitter,exports.hasExtension=hasExtension,exports.heightReferenceOnEntityPropertyChanged=heightReferenceOnEntityPropertyChanged,exports.isBitSet=isBitSet,exports.isBlobUri=isBlobUri,exports.isCrossOriginUrl=isCrossOriginUrl,exports.isDataUri=isDataUri,exports.isLeapYear=isLeapYear,exports.jsep=jsep,exports.kdbush=kdbush,exports.knockout=knockout,exports.knockout_3_5_1=knockout,exports.knockout_es5=knockout_es5,exports.loadAndExecuteScript=loadAndExecuteScript,exports.loadCRN=loadCRN,exports.loadCubeMap=loadCubeMap,exports.loadImageFromTypedArray=loadImageFromTypedArray,exports.loadKTX=loadKTX,exports.measureText=measureText,exports.mergeSort=mergeSort,exports.mersenne_twister=MersenneTwister,exports.modernizeShader=modernizeShader,exports.moveTechniqueRenderStates=moveTechniqueRenderStates,exports.moveTechniquesToExtension=moveTechniquesToExtension,exports.numberOfComponentsForType=numberOfComponentsForType,exports.objectToQuery=objectToQuery,exports.oneTimeWarning=oneTimeWarning,exports.parseGlb=parseGlb,exports.parseResponseHeaders=parseResponseHeaders,exports.pointInsideTriangle=pointInsideTriangle,exports.processModelMaterialsCommon=processModelMaterialsCommon,exports.processPbrMaterials=processPbrMaterials,exports.protobuf_minimal=protobuf,exports.purify=purify,exports.queryToObject=queryToObject,exports.quickselect=quickselect$1,exports.rbush=RBush,exports.readAccessorPacked=readAccessorPacked,exports.removeExtensionsRequired=removeExtensionsRequired,exports.removeExtensionsUsed=removeExtensionsUsed,exports.removePipelineExtras=removePipelineExtras,exports.removeUnusedElements=removeUnusedElements,exports.requestAnimationFrame=requestAnimationFramePolyFill,exports.sampleTerrain=sampleTerrain,exports.sampleTerrainMostDetailed=sampleTerrainMostDetailed,exports.scaleToGeodeticSurface=scaleToGeodeticSurface,exports.sprintf=sprintf,exports.subdivideArray=subdivideArray,exports.subscribeAndEvaluate=subscribeAndEvaluate,exports.topojson=topojson,exports.updateAccessorComponentTypes=updateAccessorComponentTypes,exports.updateVersion=updateVersion,exports.viewerCesium3DTilesInspectorMixin=viewerCesium3DTilesInspectorMixin,exports.viewerCesiumInspectorMixin=viewerCesiumInspectorMixin,exports.viewerDragDropMixin=viewerDragDropMixin,exports.viewerPerformanceWatchdogMixin=viewerPerformanceWatchdogMixin,exports.webGLConstantToGlslType=webGLConstantToGlslType,exports.when=when,exports.wrapFunction=wrapFunction,exports.writeTextToCanvas=writeTextToCanvas,exports.zip=zip,Object.defineProperty(exports,"__esModule",{value:!0})}); diff --git a/web/assets/Cesium/README.md b/web/assets/Cesium/README.md new file mode 100644 index 00000000..2365fe65 --- /dev/null +++ b/web/assets/Cesium/README.md @@ -0,0 +1,5 @@ +# Cesium-1.72 + +## License + +[Apache 2.0 license](https://github.com/CesiumGS/cesium/blob/master/LICENSE.md) \ No newline at end of file diff --git a/web/assets/Cesium/ThirdParty/Workers/deflate.js b/web/assets/Cesium/ThirdParty/Workers/deflate.js new file mode 100644 index 00000000..00c8aa59 --- /dev/null +++ b/web/assets/Cesium/ThirdParty/Workers/deflate.js @@ -0,0 +1 @@ +!function(n){var h=15,st=256,p=573,lt=256,ct=-2,ht=-5,e=[0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,16,17,18,18,19,19,20,20,20,20,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29];function pt(){var c=this;function u(t,e,n){for(var a,i,r=[],_=0,o=1;o<=h;o++)r[o]=_=_+n[o-1]<<1;for(a=0;a<=e;a++)0!==(i=t[2*a+1])&&(t[2*a]=function(t,e){for(var n=0;n|=1&t,t>>>=1,n<<=1,0<--e;);return n>>>1}(r[i]++,i))}c.build_tree=function(t){var e,n,a,i=c.dyn_tree,r=c.stat_desc.static_tree,_=c.stat_desc.elems,o=-1;for(t.heap_len=0,t.heap_max=p,e=0;e<_;e++)0!==i[2*e]?(t.heap[++t.heap_len]=o=e,t.depth[e]=0):i[2*e+1]=0;for(;t.heap_len<2;)i[2*(a=t.heap[++t.heap_len]=o<2?++o:0)]=1,t.depth[a]=0,t.opt_len--,r&&(t.static_len-=r[2*a+1]);for(c.max_code=o,e=Math.floor(t.heap_len/2);1<=e;e--)t.pqdownheap(i,e);for(a=_;e=t.heap[1],t.heap[1]=t.heap[t.heap_len--],t.pqdownheap(i,1),n=t.heap[1],t.heap[--t.heap_max]=e,t.heap[--t.heap_max]=n,i[2*a]=i[2*e]+i[2*n],t.depth[a]=Math.max(t.depth[e],t.depth[n])+1,i[2*e+1]=i[2*n+1]=a,t.heap[1]=a++,t.pqdownheap(i,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t){for(var e,n,a,i,r,_=c.dyn_tree,o=c.stat_desc.static_tree,u=c.stat_desc.extra_bits,f=c.stat_desc.extra_base,d=c.stat_desc.max_length,s=0,l=0;l<=h;l++)t.bl_count[l]=0;for(_[2*t.heap[t.heap_max]+1]=0,e=t.heap_max+1;e<p;e++)d<(l=_[2*_[2*(n=t.heap[e])+1]+1]+1)&&(l=d,s++),_[2*n+1]=l,n>c.max_code||(t.bl_count[l]++,i=0,f<=n&&(i=u[n-f]),r=_[2*n],t.opt_len+=r*(l+i),o&&(t.static_len+=r*(o[2*n+1]+i)));if(0!==s){do{for(l=d-1;0===t.bl_count[l];)l--;t.bl_count[l]--,t.bl_count[l+1]+=2,t.bl_count[d]--,s-=2}while(0<s);for(l=d;0!==l;l--)for(n=t.bl_count[l];0!==n;)(a=t.heap[--e])>c.max_code||(_[2*a+1]!=l&&(t.opt_len+=(l-_[2*a+1])*_[2*a],_[2*a+1]=l),n--)}}(t),u(i,c.max_code,t.bl_count)}}function xt(t,e,n,a,i){var r=this;r.static_tree=t,r.extra_bits=e,r.extra_base=n,r.elems=a,r.max_length=i}pt._length_code=[0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28],pt.base_length=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0],pt.base_dist=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576],pt.d_code=function(t){return t<256?e[t]:e[256+(t>>>7)]},pt.extra_lbits=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],pt.extra_dbits=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],pt.extra_blbits=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],pt.bl_order=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],xt.static_ltree=[12,8,140,8,76,8,204,8,44,8,172,8,108,8,236,8,28,8,156,8,92,8,220,8,60,8,188,8,124,8,252,8,2,8,130,8,66,8,194,8,34,8,162,8,98,8,226,8,18,8,146,8,82,8,210,8,50,8,178,8,114,8,242,8,10,8,138,8,74,8,202,8,42,8,170,8,106,8,234,8,26,8,154,8,90,8,218,8,58,8,186,8,122,8,250,8,6,8,134,8,70,8,198,8,38,8,166,8,102,8,230,8,22,8,150,8,86,8,214,8,54,8,182,8,118,8,246,8,14,8,142,8,78,8,206,8,46,8,174,8,110,8,238,8,30,8,158,8,94,8,222,8,62,8,190,8,126,8,254,8,1,8,129,8,65,8,193,8,33,8,161,8,97,8,225,8,17,8,145,8,81,8,209,8,49,8,177,8,113,8,241,8,9,8,137,8,73,8,201,8,41,8,169,8,105,8,233,8,25,8,153,8,89,8,217,8,57,8,185,8,121,8,249,8,5,8,133,8,69,8,197,8,37,8,165,8,101,8,229,8,21,8,149,8,85,8,213,8,53,8,181,8,117,8,245,8,13,8,141,8,77,8,205,8,45,8,173,8,109,8,237,8,29,8,157,8,93,8,221,8,61,8,189,8,125,8,253,8,19,9,275,9,147,9,403,9,83,9,339,9,211,9,467,9,51,9,307,9,179,9,435,9,115,9,371,9,243,9,499,9,11,9,267,9,139,9,395,9,75,9,331,9,203,9,459,9,43,9,299,9,171,9,427,9,107,9,363,9,235,9,491,9,27,9,283,9,155,9,411,9,91,9,347,9,219,9,475,9,59,9,315,9,187,9,443,9,123,9,379,9,251,9,507,9,7,9,263,9,135,9,391,9,71,9,327,9,199,9,455,9,39,9,295,9,167,9,423,9,103,9,359,9,231,9,487,9,23,9,279,9,151,9,407,9,87,9,343,9,215,9,471,9,55,9,311,9,183,9,439,9,119,9,375,9,247,9,503,9,15,9,271,9,143,9,399,9,79,9,335,9,207,9,463,9,47,9,303,9,175,9,431,9,111,9,367,9,239,9,495,9,31,9,287,9,159,9,415,9,95,9,351,9,223,9,479,9,63,9,319,9,191,9,447,9,127,9,383,9,255,9,511,9,0,7,64,7,32,7,96,7,16,7,80,7,48,7,112,7,8,7,72,7,40,7,104,7,24,7,88,7,56,7,120,7,4,7,68,7,36,7,100,7,20,7,84,7,52,7,116,7,3,8,131,8,67,8,195,8,35,8,163,8,99,8,227,8],xt.static_dtree=[0,5,16,5,8,5,24,5,4,5,20,5,12,5,28,5,2,5,18,5,10,5,26,5,6,5,22,5,14,5,30,5,1,5,17,5,9,5,25,5,5,5,21,5,13,5,29,5,3,5,19,5,11,5,27,5,7,5,23,5],xt.static_l_desc=new xt(xt.static_ltree,pt.extra_lbits,257,286,h),xt.static_d_desc=new xt(xt.static_dtree,pt.extra_dbits,0,30,h),xt.static_bl_desc=new xt(null,pt.extra_blbits,0,19,7);function t(t,e,n,a,i){var r=this;r.good_length=t,r.max_lazy=e,r.nice_length=n,r.max_chain=a,r.func=i}var a,vt=[new t(0,0,0,0,0),new t(4,4,8,4,1),new t(4,5,16,8,1),new t(4,6,32,32,1),new t(4,4,16,16,2),new t(8,16,32,32,2),new t(8,16,128,128,2),new t(8,32,128,256,2),new t(32,128,258,1024,2),new t(32,258,258,4096,2)],bt=["need dictionary","stream end","","","stream error","data error","","buffer error","",""],gt=113,wt=666,mt=258,yt=262;function Mt(t,e,n,a){var i=t[2*e],r=t[2*n];return i<r||i==r&&a[e]<=a[n]}function i(){var u,f,d,s,l,c,h,p,i,x,v,b,g,_,w,m,y,M,A,U,E,k,z,q,D,I,P,S,L,j,o,B,C,F,G,H,J,r,K,N,O,Q=this,R=new pt,T=new pt,V=new pt;function W(){for(var t=0;t<286;t++)o[2*t]=0;for(t=0;t<30;t++)B[2*t]=0;for(t=0;t<19;t++)C[2*t]=0;o[512]=1,Q.opt_len=Q.static_len=0,H=r=0}function X(t,e){var n,a,i=-1,r=t[1],_=0,o=7,u=4;for(0===r&&(o=138,u=3),t[2*(e+1)+1]=65535,n=0;n<=e;n++)a=r,r=t[2*(n+1)+1],++_<o&&a==r||(_<u?C[2*a]+=_:0!==a?(a!=i&&C[2*a]++,C[32]++):_<=10?C[34]++:C[36]++,i=a,u=(_=0)===r?(o=138,3):a==r?(o=6,3):(o=7,4))}function Y(t){Q.pending_buf[Q.pending++]=t}function Z(t){Y(255&t),Y(t>>>8&255)}function $(t,e){var n,a=e;16-a<O?(Z(N|=(n=t)<<O&65535),N=n>>>16-O,O+=a-16):(N|=t<<O&65535,O+=a)}function tt(t,e){var n=2*t;$(65535&e[n],65535&e[1+n])}function et(t,e){var n,a,i=-1,r=t[1],_=0,o=7,u=4;for(0===r&&(o=138,u=3),n=0;n<=e;n++)if(a=r,r=t[2*(n+1)+1],!(++_<o&&a==r)){if(_<u)for(;tt(a,C),0!=--_;);else 0!==a?(a!=i&&(tt(a,C),_--),tt(16,C),$(_-3,2)):_<=10?(tt(17,C),$(_-3,3)):(tt(18,C),$(_-11,7));i=a,u=(_=0)===r?(o=138,3):a==r?(o=6,3):(o=7,4)}}function nt(){16==O?(Z(N),O=N=0):8<=O&&(Y(255&N),N>>>=8,O-=8)}function at(t,e){var n,a,i;if(Q.pending_buf[J+2*H]=t>>>8&255,Q.pending_buf[J+2*H+1]=255&t,Q.pending_buf[F+H]=255&e,H++,0===t?o[2*e]++:(r++,t--,o[2*(pt._length_code[e]+st+1)]++,B[2*pt.d_code(t)]++),0==(8191&H)&&2<P){for(n=8*H,a=E-y,i=0;i<30;i++)n+=B[2*i]*(5+pt.extra_dbits[i]);if(n>>>=3,r<Math.floor(H/2)&&n<Math.floor(a/2))return!0}return H==G-1}function it(t,e){var n,a,i,r,_=0;if(0!==H)for(;n=Q.pending_buf[J+2*_]<<8&65280|255&Q.pending_buf[J+2*_+1],a=255&Q.pending_buf[F+_],_++,0==n?tt(a,t):(tt((i=pt._length_code[a])+st+1,t),0!==(r=pt.extra_lbits[i])&&$(a-=pt.base_length[i],r),tt(i=pt.d_code(--n),e),0!==(r=pt.extra_dbits[i])&&$(n-=pt.base_dist[i],r)),_<H;);tt(lt,t),K=t[513]}function rt(){8<O?Z(N):0<O&&Y(255&N),O=N=0}function _t(t,e,n){var a,i,r;$(0+(n?1:0),3),a=t,i=e,r=!0,rt(),K=8,r&&(Z(i),Z(~i)),Q.pending_buf.set(p.subarray(a,a+i),Q.pending),Q.pending+=i}function e(t,e,n){var a,i,r=0;0<P?(R.build_tree(Q),T.build_tree(Q),r=function(){var t;for(X(o,R.max_code),X(B,T.max_code),V.build_tree(Q),t=18;3<=t&&0===C[2*pt.bl_order[t]+1];t--);return Q.opt_len+=3*(t+1)+5+5+4,t}(),a=Q.opt_len+3+7>>>3,(i=Q.static_len+3+7>>>3)<=a&&(a=i)):a=i=e+5,e+4<=a&&-1!=t?_t(t,e,n):i==a?($(2+(n?1:0),3),it(xt.static_ltree,xt.static_dtree)):($(4+(n?1:0),3),function(t,e,n){var a;for($(t-257,5),$(e-1,5),$(n-4,4),a=0;a<n;a++)$(C[2*pt.bl_order[a]+1],3);et(o,t-1),et(B,e-1)}(R.max_code+1,T.max_code+1,r+1),it(o,B)),W(),n&&rt()}function ot(t){e(0<=y?y:-1,E-y,t),y=E,u.flush_pending()}function ut(){var t,e,n,a;do{if(0===(a=i-z-E)&&0===E&&0===z)a=l;else if(-1==a)a--;else if(l+l-yt<=E){for(p.set(p.subarray(l,l+l),0),k-=l,E-=l,y-=l,n=t=g;e=65535&v[--n],v[n]=l<=e?e-l:0,0!=--t;);for(n=t=l;e=65535&x[--n],x[n]=l<=e?e-l:0,0!=--t;);a+=l}if(0===u.avail_in)return;t=u.read_buf(p,E+z,a),3<=(z+=t)&&(b=((b=255&p[E])<<m^255&p[E+1])&w)}while(z<yt&&0!==u.avail_in)}function ft(t){var e,n,a=D,i=E,r=q,_=l-yt<E?E-(l-yt):0,o=j,u=h,f=E+mt,d=p[i+r-1],s=p[i+r];L<=q&&(a>>=2),z<o&&(o=z);do{if(p[(e=t)+r]==s&&p[e+r-1]==d&&p[e]==p[i]&&p[++e]==p[i+1]){i+=2,e++;do{}while(p[++i]==p[++e]&&p[++i]==p[++e]&&p[++i]==p[++e]&&p[++i]==p[++e]&&p[++i]==p[++e]&&p[++i]==p[++e]&&p[++i]==p[++e]&&p[++i]==p[++e]&&i<f);if(n=mt-(f-i),i=f-mt,r<n){if(k=t,o<=(r=n))break;d=p[i+r-1],s=p[i+r]}}}while((t=65535&x[t&u])>_&&0!=--a);return r<=z?r:z}function dt(t){return t.total_in=t.total_out=0,t.msg=null,Q.pending=0,Q.pending_out=0,f=gt,s=0,R.dyn_tree=o,R.stat_desc=xt.static_l_desc,T.dyn_tree=B,T.stat_desc=xt.static_d_desc,V.dyn_tree=C,V.stat_desc=xt.static_bl_desc,O=N=0,K=8,W(),function(){var t;for(i=2*l,t=v[g-1]=0;t<g-1;t++)v[t]=0;I=vt[P].max_lazy,L=vt[P].good_length,j=vt[P].nice_length,D=vt[P].max_chain,M=q=2,b=U=z=y=E=0}(),0}Q.depth=[],Q.bl_count=[],Q.heap=[],o=[],B=[],C=[],Q.pqdownheap=function(t,e){for(var n=Q.heap,a=n[e],i=e<<1;i<=Q.heap_len&&(i<Q.heap_len&&Mt(t,n[i+1],n[i],Q.depth)&&i++,!Mt(t,a,n[i],Q.depth));)n[e]=n[i],e=i,i<<=1;n[e]=a},Q.deflateInit=function(t,e,n,a,i,r){return a=a||8,i=i||8,r=r||0,t.msg=null,-1==e&&(e=6),i<1||9<i||8!=a||n<9||15<n||e<0||9<e||r<0||2<r?ct:(t.dstate=Q,h=(l=1<<(c=n))-1,w=(g=1<<(_=i+7))-1,m=Math.floor((_+3-1)/3),p=new Uint8Array(2*l),x=[],v=[],G=1<<i+6,Q.pending_buf=new Uint8Array(4*G),d=4*G,J=Math.floor(G/2),F=3*G,P=e,S=r,dt(t))},Q.deflateEnd=function(){return 42!=f&&f!=gt&&f!=wt?ct:(Q.pending_buf=null,p=x=v=null,Q.dstate=null,f==gt?-3:0)},Q.deflateParams=function(t,e,n){var a=0;return-1==e&&(e=6),e<0||9<e||n<0||2<n?ct:(vt[P].func!=vt[e].func&&0!==t.total_in&&(a=t.deflate(1)),P!=e&&(I=vt[P=e].max_lazy,L=vt[P].good_length,j=vt[P].nice_length,D=vt[P].max_chain),S=n,a)},Q.deflateSetDictionary=function(t,e,n){var a,i=n,r=0;if(!e||42!=f)return ct;if(i<3)return 0;for(l-yt<i&&(r=n-(i=l-yt)),p.set(e.subarray(r,r+i),0),y=E=i,b=((b=255&p[0])<<m^255&p[1])&w,a=0;a<=i-3;a++)b=(b<<m^255&p[a+2])&w,x[a&h]=v[b],v[b]=a;return 0},Q.deflate=function(t,e){var n,a,i,r,_,o;if(4<e||e<0)return ct;if(!t.next_out||!t.next_in&&0!==t.avail_in||f==wt&&4!=e)return t.msg=bt[4],ct;if(0===t.avail_out)return t.msg=bt[7],ht;if(u=t,r=s,s=e,42==f&&(a=8+(c-8<<4)<<8,3<(i=(P-1&255)>>1)&&(i=3),a|=i<<6,0!==E&&(a|=32),f=gt,Y((o=a+=31-a%31)>>8&255),Y(255&o)),0!==Q.pending){if(u.flush_pending(),0===u.avail_out)return s=-1,0}else if(0===u.avail_in&&e<=r&&4!=e)return u.msg=bt[7],ht;if(f==wt&&0!==u.avail_in)return t.msg=bt[7],ht;if(0!==u.avail_in||0!==z||0!=e&&f!=wt){switch(_=-1,vt[P].func){case 0:_=function(t){var e,n=65535;for(d-5<n&&(n=d-5);;){if(z<=1){if(ut(),0===z&&0==t)return 0;if(0===z)break}if(E+=z,e=y+n,((z=0)===E||e<=E)&&(z=E-e,E=e,ot(!1),0===u.avail_out))return 0;if(l-yt<=E-y&&(ot(!1),0===u.avail_out))return 0}return ot(4==t),0===u.avail_out?4==t?2:0:4==t?3:1}(e);break;case 1:_=function(t){for(var e,n=0;;){if(z<yt){if(ut(),z<yt&&0==t)return 0;if(0===z)break}if(3<=z&&(b=(b<<m^255&p[E+2])&w,n=65535&v[b],x[E&h]=v[b],v[b]=E),0!==n&&(E-n&65535)<=l-yt&&2!=S&&(M=ft(n)),3<=M)if(e=at(E-k,M-3),z-=M,M<=I&&3<=z){for(M--;b=(b<<m^255&p[++E+2])&w,n=65535&v[b],x[E&h]=v[b],v[b]=E,0!=--M;);E++}else E+=M,M=0,b=((b=255&p[E])<<m^255&p[E+1])&w;else e=at(0,255&p[E]),z--,E++;if(e&&(ot(!1),0===u.avail_out))return 0}return ot(4==t),0===u.avail_out?4==t?2:0:4==t?3:1}(e);break;case 2:_=function(t){for(var e,n,a=0;;){if(z<yt){if(ut(),z<yt&&0==t)return 0;if(0===z)break}if(3<=z&&(b=(b<<m^255&p[E+2])&w,a=65535&v[b],x[E&h]=v[b],v[b]=E),q=M,A=k,M=2,0!==a&&q<I&&(E-a&65535)<=l-yt&&(2!=S&&(M=ft(a)),M<=5&&(1==S||3==M&&4096<E-k)&&(M=2)),3<=q&&M<=q){for(n=E+z-3,e=at(E-1-A,q-3),z-=q-1,q-=2;++E<=n&&(b=(b<<m^255&p[E+2])&w,a=65535&v[b],x[E&h]=v[b],v[b]=E),0!=--q;);if(U=0,M=2,E++,e&&(ot(!1),0===u.avail_out))return 0}else if(0!==U){if((e=at(0,255&p[E-1]))&&ot(!1),E++,z--,0===u.avail_out)return 0}else U=1,E++,z--}return 0!==U&&(e=at(0,255&p[E-1]),U=0),ot(4==t),0===u.avail_out?4==t?2:0:4==t?3:1}(e)}if(2!=_&&3!=_||(f=wt),0==_||2==_)return 0===u.avail_out&&(s=-1),0;if(1==_){if(1==e)$(2,3),tt(lt,xt.static_ltree),nt(),1+K+10-O<9&&($(2,3),tt(lt,xt.static_ltree),nt()),K=7;else if(_t(0,0,!1),3==e)for(n=0;n<g;n++)v[n]=0;if(u.flush_pending(),0===u.avail_out)return s=-1,0}}return 4!=e?0:1}}function r(){var t=this;t.next_in_index=0,t.next_out_index=0,t.avail_in=0,t.total_in=0,t.avail_out=0,t.total_out=0}function _(t){var o=new r,u=new Uint8Array(512);void 0===t&&(t=-1),o.deflateInit(t),o.next_out=u,this.append=function(t,e){var n,a=[],i=0,r=0,_=0;if(t.length){o.next_in_index=0,o.next_in=t,o.avail_in=t.length;do{if(o.next_out_index=0,o.avail_out=512,0!=o.deflate(0))throw"deflating: "+o.msg;o.next_out_index&&(512==o.next_out_index?a.push(new Uint8Array(u)):a.push(new Uint8Array(u.subarray(0,o.next_out_index)))),_+=o.next_out_index,e&&0<o.next_in_index&&o.next_in_index!=i&&(e(o.next_in_index),i=o.next_in_index)}while(0<o.avail_in||0===o.avail_out);return n=new Uint8Array(_),a.forEach(function(t){n.set(t,r),r+=t.length}),n}},this.flush=function(){var t,e,n=[],a=0,i=0;do{if(o.next_out_index=0,o.avail_out=512,1!=(t=o.deflate(4))&&0!=t)throw"deflating: "+o.msg;0<512-o.avail_out&&n.push(new Uint8Array(u.subarray(0,o.next_out_index))),i+=o.next_out_index}while(0<o.avail_in||0===o.avail_out);return o.deflateEnd(),e=new Uint8Array(i),n.forEach(function(t){e.set(t,a),a+=t.length}),e}}r.prototype={deflateInit:function(t,e){return this.dstate=new i,e=e||h,this.dstate.deflateInit(this,t,e)},deflate:function(t){return this.dstate?this.dstate.deflate(this,t):ct},deflateEnd:function(){if(!this.dstate)return ct;var t=this.dstate.deflateEnd();return this.dstate=null,t},deflateParams:function(t,e){return this.dstate?this.dstate.deflateParams(this,t,e):ct},deflateSetDictionary:function(t,e){return this.dstate?this.dstate.deflateSetDictionary(this,t,e):ct},read_buf:function(t,e,n){var a=this,i=a.avail_in;return n<i&&(i=n),0===i?0:(a.avail_in-=i,t.set(a.next_in.subarray(a.next_in_index,a.next_in_index+i),e),a.next_in_index+=i,a.total_in+=i,i)},flush_pending:function(){var t=this,e=t.dstate.pending;e>t.avail_out&&(e=t.avail_out),0!==e&&(t.next_out.set(t.dstate.pending_buf.subarray(t.dstate.pending_out,t.dstate.pending_out+e),t.next_out_index),t.next_out_index+=e,t.dstate.pending_out+=e,t.total_out+=e,t.avail_out-=e,t.dstate.pending-=e,0===t.dstate.pending&&(t.dstate.pending_out=0))}},n.zip?n.zip.Deflater=_:(a=new _,n.addEventListener("message",function(t){var e=t.data;e.init&&(a=new _(e.level),n.postMessage({oninit:!0})),e.append&&n.postMessage({onappend:!0,data:a.append(e.data,function(t){n.postMessage({progress:!0,current:t})})}),e.flush&&n.postMessage({onflush:!0,data:a.flush()})},!1))}(this); \ No newline at end of file diff --git a/web/assets/Cesium/ThirdParty/Workers/draco_decoder.js b/web/assets/Cesium/ThirdParty/Workers/draco_decoder.js new file mode 100644 index 00000000..03dda144 --- /dev/null +++ b/web/assets/Cesium/ThirdParty/Workers/draco_decoder.js @@ -0,0 +1,33 @@ +var DracoDecoderModule = function(DracoDecoderModule) { + DracoDecoderModule = DracoDecoderModule || {}; + +var Module=typeof DracoDecoderModule!=="undefined"?DracoDecoderModule:{};var isRuntimeInitialized=false;var isModuleParsed=false;Module["onRuntimeInitialized"]=(function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}});Module["onModuleParsed"]=(function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}});function isVersionSupported(versionString){if(typeof versionString!=="string")return false;const version=versionString.split(".");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=3)return true;if(version[0]!=0||version[1]>10)return false;return true}Module["isVersionSupported"]=isVersionSupported;var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{throw new Error("not compiled for this environment")}Module["print"]=typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null;Module["printErr"]=typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||Module["print"];Module.print=Module["print"];Module.printErr=Module["printErr"];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);else if(returnType==="boolean")ret=Boolean(ret);if(stack!==0){stackRestore(stack)}return ret}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw"Runtime error: expected the system to be little-endian!";function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["fround"]){var froundBuffer=new Float32Array(1);Math["fround"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math["fround"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+17904;__ATINIT__.push();memoryInitializer="data:application/octet-stream;base64,8BIAADgTAAAYAAAAAAAAAMgSAABfEwAA8BIAAHwTAAAYAAAAAAAAAPASAAClEwAAQAAAAAAAAADIEgAAwRMAAPASAABVFAAAMAAAAAAAAADIEgAAdxQAAPASAACcFAAAMAAAAAAAAADwEgAAMSEAAFgAAAAAAAAA8BIAAMwUAACQAAAAAAAAAPASAAAlFQAAoAAAAAAAAADwEgAAeRUAALAAAAAAAAAA8BIAAK0VAADAAAAAAAAAAMgSAADYFQAA8BIAAPwVAADYAAAAAAAAAMgSAACaFgAA8BIAADgXAADwAAAAAAAAAPASAADQFwAAkAAAAAAAAADwEgAAWRgAAPAAAAAAAAAA8BIAAPMYAADwAAAAAAAAAPASAACFGQAA8AAAAAAAAADwEgAAKxoAAPAAAAAAAAAA8BIAAMYaAADwAAAAAAAAAPASAABcGwAAYAEAAAAAAADIEgAABxwAAPASAACyHAAAeAEAAAAAAADwEgAAVx0AAJAAAAAAAAAA8BIAAO0dAAB4AQAAAAAAAPASAACUHgAAeAEAAAAAAADwEgAAMx8AAHgBAAAAAAAA8BIAAOYfAAB4AQAAAAAAAPASAACOIAAAeAEAAAAAAADwEgAA8S0AAHAAAAAAAAAA8BIAAF0hAAD4AQAAAAAAAPASAADOIQAAoAAAAAAAAADwEgAAOiIAABgCAAAAAAAAyBIAAPAiAADwEgAApiMAADACAAAAAAAA8BIAAFYkAAD4AQAAAAAAAPASAAD3JAAAUAIAAAAAAADIEgAAuiUAAPASAAB9JgAAaAIAAAAAAADwEgAAOicAAPgBAAAAAAAA8BIAAOgnAACIAgAAAAAAAPASAABMKAAAoAAAAAAAAADwEgAAqygAAKgCAAAAAAAAyBIAAFQpAADwEgAA/SkAAMACAAAAAAAA8BIAAKAqAACIAgAAAAAAAPASAAA0KwAA4AIAAAAAAADIEgAA6isAAPASAACgLAAA+AIAAAAAAADwEgAAUC0AAIgCAAAAAAAA8BIAABwuAABwAAAAAAAAAPASAAC0LgAA2AMAAAAAAADwEgAAyi4AABgDAAAAAAAA8BIAALgxAACQAwAAAAAAAMgSAADrLgAA8BIAADMvAABgAwAAAAAAAMgSAAD9LwAAyBIAABcwAADwEgAAUjAAAGADAAAAAAAA8BIAAPswAABgAwAAAAAAAMgSAAAEMgAA8BIAADIyAACQAwAAAAAAAPASAACIMgAAkAMAAAAAAADwEgAA9TIAABgDAAAAAAAA8BIAANsyAABgAwAAAAAAAMgSAAAVMwAA8BIAAEg0AADYAwAAAAAAAPASAABqNAAA2AMAAAAAAADwEgAAkDQAABAEAAAAAAAAyBIAAJ40AADIEgAAsT4AAPASAAARPwAAMAQAAAAAAADwEgAAvj4AAEAEAAAAAAAAyBIAAN8+AADwEgAA7D4AACAEAAAAAAAA8BIAADM/AAAYBAAAAAAAAPASAABDPwAAWAQAAAAAAADwEgAAeD8AADAEAAAAAAAA8BIAAFQ/AAB4BAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAACAAAAAEAAAACAAAAAQAAAAEAAAABAAAAAAAAACAAAAADAAAABAAAAAIAAAACAAAAAgAAAAAAAAAwAAAABQAAAAYAAAABAAAAAwAAAAQAAAAFAAAAAwAAAAQAAAAGAAAAAQAAAAcAAAAFAAAAAAAAAEgAAAAHAAAACAAAAAEAAAADAAAABAAAAAUAAAADAAAABAAAAAYAAAAIAAAACQAAAAYAAAAAAAAAWAAAAAkAAAAKAAAAAgAAAAoAAAADAAAABAAAAAsAAAAMAAAABQAAAP////8AAAAAYAAAAAsAAAAMAAAAAQAAAA0AAAAOAAAABQAAAAMAAAAEAAAADwAAABAAAAARAAAABwAAAAEAAAAAAAAAcAAAAA0AAAAOAAAABgAAAAoAAAADAAAABAAAABIAAAAMAAAABwAAAAgAAAABAAAACAAAABMAAAAAAAAAkAAAAA8AAAAQAAAAAQAAAAkAAAABAAAACgAAABQAAAAVAAAACwAAAAwAAAAWAAAAAQAAAAAAAACAAAAADwAAABEAAAANAAAACQAAAA4AAAAKAAAAFAAAABUAAAALAAAADAAAABYAAAABAAAAAAAAAEABAAAPAAAAEgAAAA8AAAAJAAAAEAAAAAoAAAAUAAAAFQAAAAsAAAAMAAAAFgAAAAIAAAAAAAAAMAEAAA8AAAATAAAAEQAAAAkAAAASAAAACgAAABQAAAAVAAAACwAAAAwAAAAWAAAAAwAAAAAAAAAgAQAAFAAAABUAAAATAAAACQAAABQAAAAKAAAAFAAAABUAAAALAAAADAAAABcAAAAEAAAAAAAAABABAAAWAAAAFwAAABUAAAAJAAAAFgAAABcAAAAYAAAAGQAAAAsAAAAMAAAAGgAAAAUAAAAAAAAA8AAAAA8AAAAYAAAAAQAAAAkAAAABAAAACgAAABQAAAAVAAAACwAAAAwAAAAWAAAAAQAAAAAAAADgAAAAGQAAABoAAAAYAAAACQAAABkAAAAaAAAAGwAAABwAAAALAAAADAAAAB0AAAAGAAAAAAAAANgAAAAbAAAAHAAAAAEAAAAbAAAAAQAAAAAAAADIAAAAGwAAAB0AAAAeAAAAGwAAAAIAAAAAAAAAAAEAAB4AAAAfAAAAHAAAAAkAAAAdAAAAHgAAAB8AAAAgAAAACwAAAAwAAAAhAAAABwAAAAAAAADIAQAADwAAACAAAAAfAAAACQAAACAAAAAKAAAAFAAAABUAAAALAAAADAAAABYAAAAIAAAAAAAAALgBAAAPAAAAIQAAACEAAAAJAAAAIgAAAAoAAAAUAAAAFQAAAAsAAAAMAAAAFgAAAAkAAAAAAAAAqAEAACIAAAAjAAAAIwAAAAkAAAAkAAAACgAAABQAAAAVAAAACwAAAAwAAAAiAAAACgAAAAAAAACYAQAAJAAAACUAAAAlAAAACQAAACYAAAAnAAAAIwAAACQAAAALAAAADAAAACUAAAALAAAAAAAAAHgBAAAPAAAAJgAAAAEAAAAJAAAAAQAAAAoAAAAUAAAAFQAAAAsAAAAMAAAAFgAAAAEAAAAAAAAAaAEAACcAAAAoAAAAKAAAAAkAAAApAAAAKgAAACYAAAAnAAAACwAAAAwAAAAoAAAADAAAAAAAAABgAQAAKQAAACoAAAABAAAAKwAAAAEAAAAAAAAAUAEAACkAAAArAAAAKQAAACsAAAADAAAAAAAAAIgBAAAsAAAALQAAACwAAAAJAAAALQAAAC4AAAAqAAAAKwAAAAsAAAAMAAAALAAAAA0AAAAAAAAA2AEAAA0AAAAuAAAACQAAAAoAAAADAAAACgAAABIAAAAMAAAABwAAAAsAAAACAAAALwAAAC0AAAAAAAAAeAIAAC8AAAAwAAAAMAAAADEAAAAyAAAAMwAAAC4AAAAvAAAANAAAADUAAAAwAAAADgAAAAAAAADoAQAALwAAADEAAAA2AAAANwAAADgAAAA5AAAAMQAAADIAAAA6AAAAOwAAADMAAAAPAAAAAAAAAFgCAAAyAAAAMwAAADwAAAA3AAAAPQAAAD4AAAA0AAAANQAAADoAAAA7AAAANgAAABAAAAAAAAAAQAIAADQAAAA1AAAANwAAAD8AAAAEAAAAAAAAACACAAA2AAAANwAAAEAAAAA3AAAAQQAAAEIAAAA4AAAAOQAAADoAAAA7AAAAOgAAABEAAAAAAAAACAIAADgAAAA5AAAAOwAAAEMAAAAFAAAAAAAAAOgCAAA6AAAAOwAAAEQAAAAxAAAARQAAAEYAAAA8AAAAPQAAADQAAAA1AAAAPgAAABIAAAAAAAAA0AIAADwAAAA9AAAAPwAAAEcAAAAGAAAAAAAAALACAAA+AAAAPwAAAEgAAAAxAAAASQAAAEoAAABAAAAAQQAAADQAAAA1AAAAQgAAABMAAAAAAAAAmAIAAEAAAABBAAAAQwAAAEsAAAAHAAAAAAAAAAgDAABCAAAAQwAAAAwAAAAKAAAAAwAAAA0AAAASAAAADAAAAAcAAAAOAAAAAQAAAAgAAABEAAAATAAAAEUAAAAAAAAAGAMAAEQAAABFAAAATQAAAE4AAAABAAAATwAAAFAAAABRAAAAUgAAAFMAAABGAAAARwAAAAEAAAAAAAAAKAMAAEYAAABHAAAATQAAAFQAAABIAAAATwAAAFAAAABRAAAAVQAAAFYAAABJAAAASgAAAFcAAAAAAAAAOAMAAEgAAABJAAAASwAAAEwAAABNAAAATgAAAFgAAABZAAAAWgAAAFsAAAD/////AAAAAFADAABKAAAASwAAAE8AAABcAAAAAAAAAEgDAABMAAAATQAAAE4AAAD/////AAAAAHADAABPAAAAUAAAAFAAAABdAAAAAAAAAGgDAABRAAAAUgAAAFMAAAAAAAAAgAMAAFQAAABVAAAAUQAAAF4AAAAAAAAAmAMAAFYAAABXAAAAUgAAAFMAAABUAAAAVQAAAF8AAABgAAAAYQAAAGIAAAAAAAAAqAMAAFgAAABZAAAAVgAAAFcAAABYAAAAWQAAAGMAAABkAAAAZQAAAGYAAAAAAAAAAQAAAAMAAAAFAAAABwAAAAAAAAC4AwAARAAAAFoAAABNAAAATgAAAFoAAABPAAAAUAAAAFEAAABSAAAAUwAAAEYAAABHAAAAZwAAAAAAAADIAwAAWwAAAFwAAABbAAAAaAAAAAAAAADYAwAARAAAAF0AAABpAAAATgAAAAEAAABqAAAAUAAAAFEAAABSAAAAAAAAAOADAABEAAAAXgAAAGkAAABOAAAAXAAAAGsAAABQAAAAUQAAAFIAAAAAAAAA8AMAAEQAAABfAAAAaQAAAE4AAABdAAAAbAAAAFAAAABRAAAAUgAAAP//////////AAAAAAAEAABgAAAAYQAAAAgAAAADAAAA/////wAAAAAQBAAAYgAAAGMAAAAJAAAABAAAANQOAAAFAAAAAAAAAAAAAABtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAEAAAAOBBAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVA8AAAUAAAAAAAAAAAAAAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAQAAAA6EEAAAAEAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAr/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAUAAAAHAAAACwAAAA0AAAARAAAAEwAAABcAAAAdAAAAHwAAACUAAAApAAAAKwAAAC8AAAA1AAAAOwAAAD0AAABDAAAARwAAAEkAAABPAAAAUwAAAFkAAABhAAAAZQAAAGcAAABrAAAAbQAAAHEAAAB/AAAAgwAAAIkAAACLAAAAlQAAAJcAAACdAAAAowAAAKcAAACtAAAAswAAALUAAAC/AAAAwQAAAMUAAADHAAAA0wAAAAEAAAALAAAADQAAABEAAAATAAAAFwAAAB0AAAAfAAAAJQAAACkAAAArAAAALwAAADUAAAA7AAAAPQAAAEMAAABHAAAASQAAAE8AAABTAAAAWQAAAGEAAABlAAAAZwAAAGsAAABtAAAAcQAAAHkAAAB/AAAAgwAAAIkAAACLAAAAjwAAAJUAAACXAAAAnQAAAKMAAACnAAAAqQAAAK0AAACzAAAAtQAAALsAAAC/AAAAwQAAAMUAAADHAAAA0QAAAAAAAAAgBAAAZAAAAGUAAABmAAAAZwAAABMAAAABAAAAAQAAAAMAAAAAAAAASAQAAGQAAABoAAAAZgAAAGcAAAATAAAAAgAAAAIAAAAEAAAAAAAAAFgEAABpAAAAagAAAG4AAAAAAAAAaAQAAGkAAABrAAAAbgAAAE41ZHJhY28yOEF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1FAE41ZHJhY28xOEF0dHJpYnV0ZVRyYW5zZm9ybUUATjVkcmFjbzMwQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtRQBONWRyYWNvMTdBdHRyaWJ1dGVzRGVjb2RlckUATjVkcmFjbzI2QXR0cmlidXRlc0RlY29kZXJJbnRlcmZhY2VFAEtkVHJlZUF0dHJpYnV0ZXNEZWNvZGVyOiBjb21wcmVzc2lvbiBsZXZlbCAlaSBub3Qgc3VwcG9ydGVkLgoATWV0aG9kIG5vdCBzdXBwb3J0ZWQuIAoAVmVyc2lvbiBub3Qgc3VwcG9ydGVkLiAKAE41ZHJhY28yM0tkVHJlZUF0dHJpYnV0ZXNEZWNvZGVyRQBONWRyYWNvMjZTZXF1ZW50aWFsQXR0cmlidXRlRGVjb2RlckUATjVkcmFjbzM3U2VxdWVudGlhbEF0dHJpYnV0ZURlY29kZXJzQ29udHJvbGxlckUATjVkcmFjbzI4UHJlZGljdGlvblNjaGVtZURlbHRhRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVFRQBONWRyYWNvMzdQcmVkaWN0aW9uU2NoZW1lVHlwZWREZWNvZGVySW50ZXJmYWNlSWlpRUUATjVkcmFjbzMyUHJlZGljdGlvblNjaGVtZURlY29kZXJJbnRlcmZhY2VFAE41ZHJhY28yNVByZWRpY3Rpb25TY2hlbWVJbnRlcmZhY2VFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28zNk1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzU2TWVzaFByZWRpY3Rpb25TY2hlbWVDb25zdHJhaW5lZE11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NU1lc2hQcmVkaWN0aW9uU2NoZW1lTXVsdGlQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzZNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc0RlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NU1lc2hQcmVkaWN0aW9uU2NoZW1lTXVsdGlQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzNTZXF1ZW50aWFsSW50ZWdlckF0dHJpYnV0ZURlY29kZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNDlQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkRlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNDlQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkRlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzJTZXF1ZW50aWFsTm9ybWFsQXR0cmlidXRlRGVjb2RlckUATjVkcmFjbzM4U2VxdWVudGlhbFF1YW50aXphdGlvbkF0dHJpYnV0ZURlY29kZXJFAFVuc3VwcG9ydGVkIGVuY29kaW5nIG1ldGhvZC4ASW5wdXQgaXMgbm90IGEgbWVzaC4ASW5wdXQgaXMgbm90IGEgcG9pbnQgY2xvdWQuAHNraXBfYXR0cmlidXRlX3RyYW5zZm9ybQBONWRyYWNvMTFNZXNoRGVjb2RlckUATjVkcmFjbzIyTWVzaEVkZ2VCcmVha2VyRGVjb2RlckUATjVkcmFjbzI5Q29ybmVyVGFibGVUcmF2ZXJzYWxQcm9jZXNzb3JJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yMEVkZ2VCcmVha2VyVHJhdmVyc2VySU5TXzI5Q29ybmVyVGFibGVUcmF2ZXJzYWxQcm9jZXNzb3JJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTM19FRU5TXzE5RWRnZUJyZWFrZXJPYnNlcnZlckVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUATjVkcmFjbzI5Q29ybmVyVGFibGVUcmF2ZXJzYWxQcm9jZXNzb3JJTlNfMTFDb3JuZXJUYWJsZUVFRQBONWRyYWNvMjJNZXNoVHJhdmVyc2FsU2VxdWVuY2VySU5TXzI1UHJlZGljdGlvbkRlZ3JlZVRyYXZlcnNlcklOU18yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzExQ29ybmVyVGFibGVFRUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTM19FRUVFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yMEVkZ2VCcmVha2VyVHJhdmVyc2VySU5TXzI5Q29ybmVyVGFibGVUcmF2ZXJzYWxQcm9jZXNzb3JJTlNfMTFDb3JuZXJUYWJsZUVFRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMzX0VFTlNfMTlFZGdlQnJlYWtlck9ic2VydmVyRUVFRUUATjVkcmFjbzI2TWVzaEVkZ2VCcmVha2VyRGVjb2RlckltcGxJTlNfMzFNZXNoRWRnZUJyZWFrZXJUcmF2ZXJzYWxEZWNvZGVyRUVFAE41ZHJhY28zNU1lc2hFZGdlQnJlYWtlckRlY29kZXJJbXBsSW50ZXJmYWNlRQBONWRyYWNvMjZNZXNoRWRnZUJyZWFrZXJEZWNvZGVySW1wbElOU180MU1lc2hFZGdlQnJlYWtlclRyYXZlcnNhbFByZWRpY3RpdmVEZWNvZGVyRUVFAE41ZHJhY28yNk1lc2hFZGdlQnJlYWtlckRlY29kZXJJbXBsSU5TXzM4TWVzaEVkZ2VCcmVha2VyVHJhdmVyc2FsVmFsZW5jZURlY29kZXJFRUUATjVkcmFjbzE1TGluZWFyU2VxdWVuY2VyRQBONWRyYWNvMjFNZXNoU2VxdWVudGlhbERlY29kZXJFAE41ZHJhY28xN1BvaW50Q2xvdWREZWNvZGVyRQBGYWlsZWQgdG8gcGFyc2UgRHJhY28gaGVhZGVyLgBEUkFDTwBOb3QgYSBEcmFjbyBmaWxlLgBGYWlsZWQgdG8gZGVjb2RlIG1ldGFkYXRhLgBVc2luZyBpbmNvbXBhdGlibGUgZGVjb2RlciBmb3IgdGhlIGlucHV0IGdlb21ldHJ5LgBVbmtub3duIG1ham9yIHZlcnNpb24uAFVua25vd24gbWlub3IgdmVyc2lvbi4ARmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGRlY29kZXIuAEZhaWxlZCB0byBkZWNvZGUgZ2VvbWV0cnkgZGF0YS4ARmFpbGVkIHRvIGRlY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBONWRyYWNvMjNQb2ludENsb3VkS2RUcmVlRGVjb2RlckUATjVkcmFjbzI3UG9pbnRDbG91ZFNlcXVlbnRpYWxEZWNvZGVyRQBONWRyYWNvNE1lc2hFAE41ZHJhY28xMFBvaW50Q2xvdWRFAEZsb2F0UG9pbnRzVHJlZURlY29kZXI6IGNvbXByZXNzaW9uIGxldmVsICVpIG5vdCBzdXBwb3J0ZWQuCgBhbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNpemVfdCBuKSAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplABEACgAREREAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAEQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERERAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAABEACgoREREACgAAAgAJCwAAAAkACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAADQAAAAQNAAAAAAkOAAAAAAAOAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA8AAAAADwAAAAAJEAAAAAAAEAAAEAAAEgAAABISEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEhISAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAACgAAAAAKAAAAAAkLAAAAAAALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAALSsgICAwWDB4AChudWxsKQAtMFgrMFggMFgtMHgrMHggMHgAaW5mAElORgBuYW4ATkFOADAxMjM0NTY3ODlBQkNERUYuAFQhIhkNAQIDEUscDBAECx0SHidobm9wcWIgBQYPExQVGggWBygkFxgJCg4bHyUjg4J9JiorPD0+P0NHSk1YWVpbXF1eX2BhY2RlZmdpamtscnN0eXp7fABJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgAAJWQAU3Q5ZXhjZXB0aW9uAE4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAFN0OXR5cGVfaW5mbwBOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9FAFN0MTFsb2dpY19lcnJvcgBTdDEybGVuZ3RoX2Vycm9yAE4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQ==";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___cxa_allocate_exception(size){return _malloc(size)}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var key in EXCEPTIONS.infos){var ptr=+key;var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i<typeArray.length;i++){if(typeArray[i]&&Module["___cxa_can_catch"](typeArray[i],throwntype,thrown)){thrown=HEAP32[thrown>>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}var _llvm_ceil_f32=Math_ceil;var _llvm_floor_f64=Math_floor;function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity,"byteLength":byteLength};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_v":invoke_v,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"__ZSt18uncaught_exceptionv":__ZSt18uncaught_exceptionv,"___cxa_allocate_exception":___cxa_allocate_exception,"___cxa_find_matching_catch":___cxa_find_matching_catch,"___cxa_pure_virtual":___cxa_pure_virtual,"___cxa_throw":___cxa_throw,"___gxx_personality_v0":___gxx_personality_v0,"___resumeException":___resumeException,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_llvm_ceil_f32":_llvm_ceil_f32,"_llvm_floor_f64":_llvm_floor_f64,"_llvm_trap":_llvm_trap,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM +var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) { +"almost asm";var a=global.Int8Array;var b=new a(buffer);var c=global.Int16Array;var d=new c(buffer);var e=global.Int32Array;var f=new e(buffer);var g=global.Uint8Array;var h=new g(buffer);var i=global.Uint16Array;var j=new i(buffer);var k=global.Uint32Array;var l=new k(buffer);var m=global.Float32Array;var n=new m(buffer);var o=global.Float64Array;var p=new o(buffer);var q=global.byteLength;var r=env.DYNAMICTOP_PTR|0;var s=env.tempDoublePtr|0;var t=env.ABORT|0;var u=env.STACKTOP|0;var v=env.STACK_MAX|0;var w=0;var x=0;var y=0;var z=0;var A=global.NaN,B=global.Infinity;var C=0,D=0,E=0,F=0,G=0.0;var H=0;var I=global.Math.floor;var J=global.Math.abs;var K=global.Math.sqrt;var L=global.Math.pow;var M=global.Math.cos;var N=global.Math.sin;var O=global.Math.tan;var P=global.Math.acos;var Q=global.Math.asin;var R=global.Math.atan;var S=global.Math.atan2;var T=global.Math.exp;var U=global.Math.log;var V=global.Math.ceil;var W=global.Math.imul;var X=global.Math.min;var Y=global.Math.max;var Z=global.Math.clz32;var _=global.Math.fround;var $=env.abort;var aa=env.assert;var ba=env.enlargeMemory;var ca=env.getTotalMemory;var da=env.abortOnCannotGrowMemory;var ea=env.invoke_ii;var fa=env.invoke_iii;var ga=env.invoke_iiii;var ha=env.invoke_iiiiiii;var ia=env.invoke_v;var ja=env.invoke_vi;var ka=env.invoke_vii;var la=env.invoke_viii;var ma=env.invoke_viiii;var na=env.invoke_viiiii;var oa=env.invoke_viiiiii;var pa=env.__ZSt18uncaught_exceptionv;var qa=env.___cxa_allocate_exception;var ra=env.___cxa_find_matching_catch;var sa=env.___cxa_pure_virtual;var ta=env.___cxa_throw;var ua=env.___gxx_personality_v0;var va=env.___resumeException;var wa=env.___setErrNo;var xa=env.___syscall140;var ya=env.___syscall146;var za=env.___syscall54;var Aa=env.___syscall6;var Ba=env._abort;var Ca=env._emscripten_memcpy_big;var Da=env._llvm_ceil_f32;var Ea=env._llvm_floor_f64;var Fa=env._llvm_trap;var Ga=env.flush_NO_FILESYSTEM;var Ha=_(0);const Ia=_(0);function Ja(newBuffer){if(q(newBuffer)&16777215||q(newBuffer)<=16777215||q(newBuffer)>2147483648)return false;b=new a(newBuffer);d=new c(newBuffer);f=new e(newBuffer);h=new g(newBuffer);j=new i(newBuffer);l=new k(newBuffer);n=new m(newBuffer);p=new o(newBuffer);buffer=newBuffer;return true} +// EMSCRIPTEN_START_FUNCS +function wc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;if(c>>>0>=262144){if((p|0)!=1048576)f[w>>2]=x+1048576}else Eg(n,262144-c|0);c=a+28|0;x=a+32|0;a=f[c>>2]|0;w=(f[x>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[x>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;x=w;w=(f[p>>2]|0)+w|0;if(w>>>0>262144){g=0;r=38;break}if(x>>>0<w>>>0){p=f[n>>2]|0;a=x;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==262144|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0}function xc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;if(c>>>0>=65536){if((p|0)!=262144)f[w>>2]=x+262144}else Eg(n,65536-c|0);c=a+28|0;x=a+32|0;a=f[c>>2]|0;w=(f[x>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[x>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;x=w;w=(f[p>>2]|0)+w|0;if(w>>>0>65536){g=0;r=38;break}if(x>>>0<w>>>0){p=f[n>>2]|0;a=x;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==65536|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0}function yc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;if(c>>>0>=32768){if((p|0)!=131072)f[w>>2]=x+131072}else Eg(n,32768-c|0);c=a+28|0;x=a+32|0;a=f[c>>2]|0;w=(f[x>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[x>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;x=w;w=(f[p>>2]|0)+w|0;if(w>>>0>32768){g=0;r=38;break}if(x>>>0<w>>>0){p=f[n>>2]|0;a=x;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==32768|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0}function zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((b|0)<0)return;c=a+12|0;d=f[c>>2]|0;e=f[a+8>>2]|0;g=e;h=d;if(d-e>>2>>>0<=b>>>0)return;e=g+(b<<2)|0;d=f[(f[e>>2]|0)+56>>2]|0;i=f[(f[g+(b<<2)>>2]|0)+60>>2]|0;g=e+4|0;if((g|0)!=(h|0)){j=g;g=e;do{k=f[j>>2]|0;f[j>>2]=0;l=f[g>>2]|0;f[g>>2]=k;if(l|0){k=l+88|0;m=f[k>>2]|0;f[k>>2]=0;if(m|0){k=f[m+8>>2]|0;if(k|0){f[m+12>>2]=k;Ko(k)}Ko(m)}m=f[l+68>>2]|0;if(m|0){f[l+72>>2]=m;Ko(m)}m=l+64|0;k=f[m>>2]|0;f[m>>2]=0;if(k|0){m=f[k>>2]|0;if(m|0){f[k+4>>2]=m;Ko(m)}Ko(k)}Ko(l)}j=j+4|0;g=g+4|0}while((j|0)!=(h|0));j=f[c>>2]|0;if((j|0)==(g|0))n=g;else{o=g;p=j;q=19}}else{o=e;p=h;q=19}if((q|0)==19){q=p;do{q=q+-4|0;p=f[q>>2]|0;f[q>>2]=0;if(p|0){h=p+88|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0){h=f[e+8>>2]|0;if(h|0){f[e+12>>2]=h;Ko(h)}Ko(e)}e=f[p+68>>2]|0;if(e|0){f[p+72>>2]=e;Ko(e)}e=p+64|0;h=f[e>>2]|0;f[e>>2]=0;if(h|0){e=f[h>>2]|0;if(e|0){f[h+4>>2]=e;Ko(e)}Ko(h)}Ko(p)}}while((q|0)!=(o|0));n=o}f[c>>2]=n;n=f[a+4>>2]|0;if(n|0)hg(n,i);a:do if((d|0)<5){i=f[a+20+(d*12|0)>>2]|0;n=a+20+(d*12|0)+4|0;c=f[n>>2]|0;o=c;b:do if((i|0)==(c|0))r=i;else{q=i;while(1){if((f[q>>2]|0)==(b|0)){r=q;break b}q=q+4|0;if((q|0)==(c|0))break a}}while(0);if((r|0)!=(c|0)){i=r+4|0;q=o-i|0;if(q|0)Rj(r|0,i|0,q|0)|0;f[n>>2]=r+(q>>2<<2)}}while(0);r=f[a+24>>2]|0;d=f[a+20>>2]|0;q=d;if((r|0)!=(d|0)){i=r-d>>2;d=0;do{r=q+(d<<2)|0;p=f[r>>2]|0;if((p|0)>(b|0))f[r>>2]=p+-1;d=d+1|0}while(d>>>0<i>>>0)}i=f[a+36>>2]|0;d=f[a+32>>2]|0;q=d;if((i|0)!=(d|0)){p=i-d>>2;d=0;do{i=q+(d<<2)|0;r=f[i>>2]|0;if((r|0)>(b|0))f[i>>2]=r+-1;d=d+1|0}while(d>>>0<p>>>0)}p=f[a+48>>2]|0;d=f[a+44>>2]|0;q=d;if((p|0)!=(d|0)){r=p-d>>2;d=0;do{p=q+(d<<2)|0;i=f[p>>2]|0;if((i|0)>(b|0))f[p>>2]=i+-1;d=d+1|0}while(d>>>0<r>>>0)}r=f[a+60>>2]|0;d=f[a+56>>2]|0;q=d;if((r|0)!=(d|0)){i=r-d>>2;d=0;do{r=q+(d<<2)|0;p=f[r>>2]|0;if((p|0)>(b|0))f[r>>2]=p+-1;d=d+1|0}while(d>>>0<i>>>0)}i=f[a+72>>2]|0;d=f[a+68>>2]|0;a=d;if((i|0)==(d|0))return;q=i-d>>2;d=0;do{i=a+(d<<2)|0;p=f[i>>2]|0;if((p|0)>(b|0))f[i>>2]=p+-1;d=d+1|0}while(d>>>0<q>>>0);return}function Ac(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;h=a+4|0;i=f[c>>2]|0;c=i;do if((i|0)!=(h|0)){j=i+16|0;k=b[j+11>>0]|0;l=k<<24>>24<0;m=l?f[i+20>>2]|0:k&255;k=b[g+11>>0]|0;n=k<<24>>24<0;o=n?f[g+4>>2]|0:k&255;k=m>>>0<o>>>0;p=k?m:o;q=(p|0)==0;if(!q?(r=n?f[g>>2]|0:g,s=l?f[j>>2]|0:j,t=Fi(r,s,p)|0,(t|0)!=0):0)if((t|0)<0)break;else{u=s;v=r;w=23}else{if(o>>>0<m>>>0)break;if(q)w=24;else{u=l?f[j>>2]|0:j;v=n?f[g>>2]|0:g;w=23}}if((w|0)==23){j=Fi(u,v,p)|0;if(j){if((j|0)>=0)w=42}else w=24}if((w|0)==24?!k:0)w=42;if((w|0)==42){f[d>>2]=c;f[e>>2]=c;x=e;return x|0}k=f[i+4>>2]|0;if(!k){j=i+8|0;p=f[j>>2]|0;if((f[p>>2]|0)==(i|0))y=p;else{p=j;do{j=f[p>>2]|0;p=j+8|0;l=f[p>>2]|0}while((f[l>>2]|0)!=(j|0));y=l}}else{p=k;while(1){l=f[p>>2]|0;if(!l)break;else p=l}y=p}do if((y|0)!=(h|0)){k=y+16|0;l=b[k+11>>0]|0;j=l<<24>>24<0;q=j?f[y+20>>2]|0:l&255;l=q>>>0<o>>>0?q:o;if((l|0)!=0?(m=Fi(n?f[g>>2]|0:g,j?f[k>>2]|0:k,l)|0,(m|0)!=0):0){if((m|0)<0)break}else w=36;if((w|0)==36?o>>>0<q>>>0:0)break;x=Le(a,d,g)|0;return x|0}while(0);if(!(f[i+4>>2]|0)){f[d>>2]=c;x=i+4|0;return x|0}else{f[d>>2]=y;x=y;return x|0}}while(0);y=f[i>>2]|0;do if((f[a>>2]|0)==(i|0))z=c;else{if(!y){h=i;do{e=h;h=f[h+8>>2]|0}while((f[h>>2]|0)==(e|0));A=h}else{e=y;while(1){v=f[e+4>>2]|0;if(!v){A=e;break}else e=v}}e=A;h=A+16|0;v=b[g+11>>0]|0;u=v<<24>>24<0;o=u?f[g+4>>2]|0:v&255;v=b[h+11>>0]|0;n=v<<24>>24<0;p=n?f[A+20>>2]|0:v&255;v=o>>>0<p>>>0?o:p;if((v|0)!=0?(q=Fi(n?f[h>>2]|0:h,u?f[g>>2]|0:g,v)|0,(q|0)!=0):0){if((q|0)<0){z=e;break}}else w=15;if((w|0)==15?p>>>0<o>>>0:0){z=e;break}x=Le(a,d,g)|0;return x|0}while(0);if(!y){f[d>>2]=i;x=i;return x|0}else{f[d>>2]=z;x=z+4|0;return x|0}return 0}function Bc(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;i=u;u=u+32|0;j=i+12|0;k=i;f[c+40>>2]=e;e=c+32|0;f[e>>2]=g;f[c+4>>2]=h;fc(a,g,j);if(f[a>>2]|0){u=i;return}g=a+4|0;h=g+11|0;if((b[h>>0]|0)<0)Ko(f[g>>2]|0);l=b[j+7>>0]|0;if((Ka[f[(f[c>>2]|0)+8>>2]&127](c)|0)!=(l&255|0)){m=wk(64)|0;f[k>>2]=m;f[k+8>>2]=-2147483584;f[k+4>>2]=50;n=m;o=13186;p=n+50|0;do{b[n>>0]=b[o>>0]|0;n=n+1|0;o=o+1|0}while((n|0)<(p|0));b[m+50>>0]=0;f[a>>2]=-1;Yi(g,k);if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);u=i;return}m=b[j+5>>0]|0;b[c+36>>0]=m;q=b[j+6>>0]|0;b[c+37>>0]=q;if((m+-1&255)>1){r=wk(32)|0;f[k>>2]=r;f[k+8>>2]=-2147483616;f[k+4>>2]=22;n=r;o=13237;p=n+22|0;do{b[n>>0]=b[o>>0]|0;n=n+1|0;o=o+1|0}while((n|0)<(p|0));b[r+22>>0]=0;f[a>>2]=-5;Yi(g,k);if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);u=i;return}r=q&255;if(m<<24>>24==2&(l<<24>>24==0?3:2)>>>0<r>>>0){l=wk(32)|0;f[k>>2]=l;f[k+8>>2]=-2147483616;f[k+4>>2]=22;n=l;o=13260;p=n+22|0;do{b[n>>0]=b[o>>0]|0;n=n+1|0;o=o+1|0}while((n|0)<(p|0));b[l+22>>0]=0;f[a>>2]=-5;Yi(g,k);if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);u=i;return}l=((m&255)<<8|r)&65535;d[(f[e>>2]|0)+38>>1]=l;if((l&65535)>258?(d[j+10>>1]|0)<0:0){Od(a,c);if(f[a>>2]|0){u=i;return}if((b[h>>0]|0)<0)Ko(f[g>>2]|0)}if(!(Ka[f[(f[c>>2]|0)+12>>2]&127](c)|0)){h=wk(48)|0;f[k>>2]=h;f[k+8>>2]=-2147483600;f[k+4>>2]=33;n=h;o=13283;p=n+33|0;do{b[n>>0]=b[o>>0]|0;n=n+1|0;o=o+1|0}while((n|0)<(p|0));b[h+33>>0]=0;f[a>>2]=-1;Yi(g,k);if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);u=i;return}if(!(Ka[f[(f[c>>2]|0)+20>>2]&127](c)|0)){h=wk(32)|0;f[k>>2]=h;f[k+8>>2]=-2147483616;f[k+4>>2]=31;n=h;o=13317;p=n+31|0;do{b[n>>0]=b[o>>0]|0;n=n+1|0;o=o+1|0}while((n|0)<(p|0));b[h+31>>0]=0;f[a>>2]=-1;Yi(g,k);if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);u=i;return}if(Ka[f[(f[c>>2]|0)+24>>2]&127](c)|0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=i;return}c=wk(48)|0;f[k>>2]=c;f[k+8>>2]=-2147483600;f[k+4>>2]=34;n=c;o=13349;p=n+34|0;do{b[n>>0]=b[o>>0]|0;n=n+1|0;o=o+1|0}while((n|0)<(p|0));b[c+34>>0]=0;f[a>>2]=-1;Yi(g,k);if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);u=i;return}function Cc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=b+12|0;g=f[e>>2]|0;h=(f[c>>2]|0)-g|0;i=c+4|0;j=(f[i>>2]|0)-g|0;k=c;f[k>>2]=h;f[k+4>>2]=j;k=(h|0)>-1;l=(j|0)>-1;m=f[e>>2]|0;n=((l?j:0-j|0)+(k?h:0-h|0)|0)<=(m|0);if(n){o=h;p=j}else{if(k)if(!l)if((h|0)<1){q=-1;r=-1}else s=6;else{q=1;r=1}else if((j|0)<1){q=-1;r=-1}else s=6;if((s|0)==6){q=(h|0)>0?1:-1;r=(j|0)>0?1:-1}l=W(q,m)|0;k=W(r,m)|0;m=(h<<1)-l|0;f[c>>2]=m;h=(j<<1)-k|0;f[i>>2]=h;if((W(q,r)|0)>-1){r=0-h|0;f[c>>2]=r;t=r;u=0-m|0}else{f[c>>2]=h;t=h;u=m}m=(t+l|0)/2|0;f[c>>2]=m;l=(u+k|0)/2|0;f[i>>2]=l;o=m;p=l}if(!o)if(!p){v=1;w=o;x=p;y=0}else{z=(p|0)>0?3:1;s=14}else{l=(p|0)<1;m=(o|0)>0?(p>>31)+2|0:l?0:3;if((o|0)<0&l){v=1;w=o;x=p;y=m}else{z=m;s=14}}if((s|0)==14){switch(z|0){case 1:{A=p;B=0-o|0;break}case 2:{A=0-o|0;B=0-p|0;break}case 3:{A=0-p|0;B=o;break}default:{A=o;B=p}}p=c;f[p>>2]=A;f[p+4>>2]=B;v=0;w=A;x=B;y=z}z=(f[d>>2]|0)+w|0;f[a>>2]=z;w=(f[d+4>>2]|0)+x|0;x=a+4|0;f[x>>2]=w;d=f[e>>2]|0;if((d|0)>=(z|0))if((z|0)<(0-d|0))C=(f[b+4>>2]|0)+z|0;else C=z;else C=z-(f[b+4>>2]|0)|0;f[a>>2]=C;if((d|0)>=(w|0))if((w|0)<(0-d|0))D=(f[b+4>>2]|0)+w|0;else D=w;else D=w-(f[b+4>>2]|0)|0;f[x>>2]=D;if(v){E=D;F=C}else{switch((4-y|0)%4|0|0){case 1:{G=D;H=0-C|0;break}case 2:{G=0-C|0;H=0-D|0;break}case 3:{G=0-D|0;H=C;break}default:{G=C;H=D}}D=a;f[D>>2]=G;f[D+4>>2]=H;E=H;F=G}if(n){I=F;J=E;K=I+g|0;L=J+g|0;M=a;N=M;f[N>>2]=K;O=M+4|0;P=O;f[P>>2]=L;return}if((F|0)>-1)if((E|0)<=-1)if((F|0)<1){Q=-1;R=-1}else s=38;else{Q=1;R=1}else if((E|0)<1){Q=-1;R=-1}else s=38;if((s|0)==38){Q=(F|0)>0?1:-1;R=(E|0)>0?1:-1}s=W(Q,d)|0;n=W(R,d)|0;d=(F<<1)-s|0;f[a>>2]=d;F=(E<<1)-n|0;f[x>>2]=F;if((W(Q,R)|0)>-1){R=0-F|0;f[a>>2]=R;S=R;T=0-d|0}else{f[a>>2]=F;S=F;T=d}d=(S+s|0)/2|0;f[a>>2]=d;s=(T+n|0)/2|0;f[x>>2]=s;I=d;J=s;K=I+g|0;L=J+g|0;M=a;N=M;f[N>>2]=K;O=M+4|0;P=O;f[P>>2]=L;return}function Dc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;c=i;e=i;while(1){j=W(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;c=(W(j>>>24^j,1540483477)|0)^(W(c,1540483477)|0);e=e+-4|0;if(e>>>0<=3)break;else d=d+4|0}d=i+-4|0;e=d&-4;k=d-e|0;l=g+(e+4)|0;m=c}else{k=i;l=g;m=i}switch(k|0){case 3:{n=h[l+2>>0]<<16^m;o=7;break}case 2:{n=m;o=7;break}case 1:{p=m;o=8;break}default:q=m}if((o|0)==7){p=h[l+1>>0]<<8^n;o=8}if((o|0)==8)q=W(p^h[l>>0],1540483477)|0;l=W(q>>>13^q,1540483477)|0;q=l>>>15^l;l=f[a+4>>2]|0;if(!l){r=0;return r|0}p=l+-1|0;n=(p&l|0)==0;if(!n)if(q>>>0<l>>>0)s=q;else s=(q>>>0)%(l>>>0)|0;else s=q&p;m=f[(f[a>>2]|0)+(s<<2)>>2]|0;if(!m){r=0;return r|0}a=f[m>>2]|0;if(!a){r=0;return r|0}m=(i|0)==0;if(n){n=a;a:while(1){k=f[n+4>>2]|0;c=(q|0)==(k|0);if(!(c|(k&p|0)==(s|0))){r=0;o=45;break}do if(c?(k=n+8|0,e=b[k+11>>0]|0,d=e<<24>>24<0,j=e&255,((d?f[n+12>>2]|0:j)|0)==(i|0)):0){e=f[k>>2]|0;t=d?e:k;u=e&255;if(d){if(m){r=n;o=45;break a}if(!(Fi(t,g,i)|0)){r=n;o=45;break a}else break}if(m){r=n;o=45;break a}if((b[g>>0]|0)==u<<24>>24){u=k;k=j;j=g;do{k=k+-1|0;u=u+1|0;if(!k){r=n;o=45;break a}j=j+1|0}while((b[u>>0]|0)==(b[j>>0]|0))}}while(0);n=f[n>>2]|0;if(!n){r=0;o=45;break}}if((o|0)==45)return r|0}n=a;b:while(1){a=f[n+4>>2]|0;do if((q|0)==(a|0)){p=n+8|0;c=b[p+11>>0]|0;j=c<<24>>24<0;u=c&255;if(((j?f[n+12>>2]|0:u)|0)==(i|0)){c=f[p>>2]|0;k=j?c:p;t=c&255;if(j){if(m){r=n;o=45;break b}if(!(Fi(k,g,i)|0)){r=n;o=45;break b}else break}if(m){r=n;o=45;break b}if((b[g>>0]|0)==t<<24>>24){t=p;p=u;u=g;do{p=p+-1|0;t=t+1|0;if(!p){r=n;o=45;break b}u=u+1|0}while((b[t>>0]|0)==(b[u>>0]|0))}}}else{if(a>>>0<l>>>0)v=a;else v=(a>>>0)%(l>>>0)|0;if((v|0)!=(s|0)){r=0;o=45;break b}}while(0);n=f[n>>2]|0;if(!n){r=0;o=45;break}}if((o|0)==45)return r|0;return 0}function Ec(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;c=i;e=i;while(1){j=W(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;c=(W(j>>>24^j,1540483477)|0)^(W(c,1540483477)|0);e=e+-4|0;if(e>>>0<=3)break;else d=d+4|0}d=i+-4|0;e=d&-4;k=d-e|0;l=g+(e+4)|0;m=c}else{k=i;l=g;m=i}switch(k|0){case 3:{n=h[l+2>>0]<<16^m;o=7;break}case 2:{n=m;o=7;break}case 1:{p=m;o=8;break}default:q=m}if((o|0)==7){p=h[l+1>>0]<<8^n;o=8}if((o|0)==8)q=W(p^h[l>>0],1540483477)|0;l=W(q>>>13^q,1540483477)|0;q=l>>>15^l;l=f[a+4>>2]|0;if(!l){r=0;return r|0}p=l+-1|0;n=(p&l|0)==0;if(!n)if(q>>>0<l>>>0)s=q;else s=(q>>>0)%(l>>>0)|0;else s=q&p;m=f[(f[a>>2]|0)+(s<<2)>>2]|0;if(!m){r=0;return r|0}a=f[m>>2]|0;if(!a){r=0;return r|0}m=(i|0)==0;if(n){n=a;a:while(1){k=f[n+4>>2]|0;c=(k|0)==(q|0);if(!(c|(k&p|0)==(s|0))){r=0;o=45;break}do if(c?(k=n+8|0,e=b[k+11>>0]|0,d=e<<24>>24<0,j=e&255,((d?f[n+12>>2]|0:j)|0)==(i|0)):0){e=f[k>>2]|0;t=d?e:k;u=e&255;if(d){if(m){r=n;o=45;break a}if(!(Fi(t,g,i)|0)){r=n;o=45;break a}else break}if(m){r=n;o=45;break a}if((b[g>>0]|0)==u<<24>>24){u=k;k=j;j=g;do{k=k+-1|0;u=u+1|0;if(!k){r=n;o=45;break a}j=j+1|0}while((b[u>>0]|0)==(b[j>>0]|0))}}while(0);n=f[n>>2]|0;if(!n){r=0;o=45;break}}if((o|0)==45)return r|0}n=a;b:while(1){a=f[n+4>>2]|0;do if((a|0)==(q|0)){p=n+8|0;c=b[p+11>>0]|0;j=c<<24>>24<0;u=c&255;if(((j?f[n+12>>2]|0:u)|0)==(i|0)){c=f[p>>2]|0;k=j?c:p;t=c&255;if(j){if(m){r=n;o=45;break b}if(!(Fi(k,g,i)|0)){r=n;o=45;break b}else break}if(m){r=n;o=45;break b}if((b[g>>0]|0)==t<<24>>24){t=p;p=u;u=g;do{p=p+-1|0;t=t+1|0;if(!p){r=n;o=45;break b}u=u+1|0}while((b[t>>0]|0)==(b[u>>0]|0))}}}else{if(a>>>0<l>>>0)v=a;else v=(a>>>0)%(l>>>0)|0;if((v|0)!=(s|0)){r=0;o=45;break b}}while(0);n=f[n>>2]|0;if(!n){r=0;o=45;break}}if((o|0)==45)return r|0;return 0}function Fc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;c=u;u=u+48|0;d=c+32|0;e=c+28|0;g=c+16|0;h=c;i=a+16|0;j=f[i>>2]|0;if(j|0){k=f[b>>2]|0;l=i;m=j;do{j=(f[m+16>>2]|0)<(k|0);l=j?l:m;m=f[(j?m+4|0:m)>>2]|0}while((m|0)!=0);if((l|0)!=(i|0)?(k|0)>=(f[l+16>>2]|0):0){n=l;o=n+20|0;u=c;return o|0}}mn(g);f[h>>2]=f[b>>2];b=h+4|0;f[h+8>>2]=0;l=h+12|0;f[l>>2]=0;k=h+8|0;f[b>>2]=k;m=f[g>>2]|0;j=g+4|0;if((m|0)!=(j|0)){p=k;q=m;while(1){m=q+16|0;f[e>>2]=p;f[d>>2]=f[e>>2];Ff(b,d,m,m)|0;m=f[q+4>>2]|0;if(!m){r=q+8|0;s=f[r>>2]|0;if((f[s>>2]|0)==(q|0))t=s;else{s=r;do{r=f[s>>2]|0;s=r+8|0;v=f[s>>2]|0}while((f[v>>2]|0)!=(r|0));t=v}}else{s=m;while(1){v=f[s>>2]|0;if(!v)break;else s=v}t=s}if((t|0)==(j|0))break;else q=t}}t=a+12|0;q=f[i>>2]|0;do if(q){d=f[h>>2]|0;e=a+16|0;p=q;while(1){m=f[p+16>>2]|0;if((d|0)<(m|0)){v=f[p>>2]|0;if(!v){w=21;break}else{x=p;y=v}}else{if((m|0)>=(d|0)){w=25;break}z=p+4|0;m=f[z>>2]|0;if(!m){w=24;break}else{x=z;y=m}}e=x;p=y}if((w|0)==21){A=p;B=p;break}else if((w|0)==24){A=p;B=z;break}else if((w|0)==25){A=p;B=e;break}}else{A=i;B=i}while(0);i=f[B>>2]|0;if(!i){w=wk(32)|0;f[w+16>>2]=f[h>>2];z=w+20|0;f[z>>2]=f[b>>2];y=w+24|0;x=f[h+8>>2]|0;f[y>>2]=x;q=f[l>>2]|0;f[w+28>>2]=q;if(!q)f[z>>2]=y;else{f[x+8>>2]=y;f[b>>2]=k;f[k>>2]=0;f[l>>2]=0}f[w>>2]=0;f[w+4>>2]=0;f[w+8>>2]=A;f[B>>2]=w;A=f[f[t>>2]>>2]|0;if(!A)C=w;else{f[t>>2]=A;C=f[B>>2]|0}vd(f[a+16>>2]|0,C);C=a+20|0;f[C>>2]=(f[C>>2]|0)+1;D=w}else D=i;Bh(h+4|0,f[k>>2]|0);Bh(g,f[j>>2]|0);n=D;o=n+20|0;u=c;return o|0}function Gc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a;h=b;i=h;j=c;k=d;l=k;if(!i){m=(e|0)!=0;if(!l){if(m){f[e>>2]=(g>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (H=n,o)|0}else{if(!m){n=0;o=0;return (H=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=b&0;n=0;o=0;return (H=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(Z(l|0)|0)-(Z(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!e){n=0;o=0;return (H=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (H=n,o)|0}r=j-1|0;if(r&j|0){s=(Z(j|0)|0)+33-(Z(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(e|0){f[e>>2]=r&g;f[e+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (H=n,o)|0}else{r=Wn(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (H=n,o)|0}}else{if(m){if(e|0){f[e>>2]=(i>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (H=n,o)|0}if(!g){if(e|0){f[e>>2]=0;f[e+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (H=n,o)|0}r=l-1|0;if(!(r&l)){if(e|0){f[e>>2]=a|0;f[e+4>>2]=r&i|b&0}n=0;o=i>>>((Wn(l|0)|0)>>>0);return (H=n,o)|0}r=(Z(l|0)|0)-(Z(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!e){n=0;o=0;return (H=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (H=n,o)|0}while(0);if(!t){B=x;C=w;D=v;E=u;F=0;G=0}else{b=c|0|0;c=k|d&0;d=vl(b|0,c|0,-1,-1)|0;k=H;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;wl(d|0,k|0,g|0,a|0)|0;i=H;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=wl(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&c|0)|0;w=H;u=u-1|0}while((u|0)!=0);B=h;C=x;D=w;E=v;F=0;G=t}t=C;C=0;if(e|0){f[e>>2]=E;f[e+4>>2]=D}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|F;o=(t<<1|0>>>31)&-2|G;return (H=n,o)|0}function Hc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Ko(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=qa(8)|0;Dm(e,13552);f[e>>2]=4908;ta(e|0,1128,105)}e=wk(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Ko(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;e=j;j=d;d=g;while(1){g=f[j+4>>2]|0;if(!i)if(g>>>0<c>>>0)k=g;else k=(g>>>0)%(c>>>0)|0;else k=g&h;do if((k|0)==(e|0)){l=e;m=j}else{g=(f[a>>2]|0)+(k<<2)|0;if(!(f[g>>2]|0)){f[g>>2]=d;l=k;m=j;break}g=f[j>>2]|0;a:do if(!g)n=j;else{o=j+8|0;p=b[o+11>>0]|0;q=p<<24>>24<0;r=p&255;p=q?f[j+12>>2]|0:r;s=(p|0)==0;if(q){q=j;t=g;while(1){u=t+8|0;v=b[u+11>>0]|0;w=v<<24>>24<0;if((p|0)!=((w?f[t+12>>2]|0:v&255)|0)){n=q;break a}if(!s?Fi(f[o>>2]|0,w?f[u>>2]|0:u,p)|0:0){n=q;break a}u=f[t>>2]|0;if(!u){n=t;break a}else{w=t;t=u;q=w}}}if(s){q=j;t=g;while(1){w=b[t+8+11>>0]|0;if((w<<24>>24<0?f[t+12>>2]|0:w&255)|0){n=q;break a}w=f[t>>2]|0;if(!w){n=t;break a}else{u=t;t=w;q=u}}}q=j;t=g;while(1){s=t+8|0;u=b[s+11>>0]|0;w=u<<24>>24<0;if((p|0)!=((w?f[t+12>>2]|0:u&255)|0)){n=q;break a}u=w?f[s>>2]|0:s;if((b[u>>0]|0)!=(f[o>>2]&255)<<24>>24){n=q;break a}s=o;w=r;v=u;while(1){w=w+-1|0;s=s+1|0;if(!w)break;v=v+1|0;if((b[s>>0]|0)!=(b[v>>0]|0)){n=q;break a}}v=f[t>>2]|0;if(!v){n=t;break}else{s=t;t=v;q=s}}}while(0);f[d>>2]=f[n>>2];f[n>>2]=f[f[(f[a>>2]|0)+(k<<2)>>2]>>2];f[f[(f[a>>2]|0)+(k<<2)>>2]>>2]=j;l=e;m=d}while(0);j=f[m>>2]|0;if(!j)break;else{e=l;d=m}}return}function Ic(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;c=u;u=u+16|0;d=c;e=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;if((e|0)<=0){g=1;u=c;return g|0}h=a+36|0;i=a+48|0;j=d+8|0;k=d+4|0;l=d+11|0;m=0;while(1){n=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+40|0;if((f[n>>2]|0)!=0?(n=f[(f[h>>2]|0)+(m<<2)>>2]|0,o=f[n+8>>2]|0,p=Nf(n)|0,(p|0)!=0):0){n=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+40|0;q=f[n>>2]|0;n=f[o+56>>2]|0;o=wk(32)|0;f[d>>2]=o;f[j>>2]=-2147483616;f[k>>2]=24;r=o;s=11931;t=r+24|0;do{b[r>>0]=b[s>>0]|0;r=r+1|0;s=s+1|0}while((r|0)<(t|0));b[o+24>>0]=0;s=q+16|0;r=f[s>>2]|0;a:do if(r){t=s;v=r;do{w=(f[v+16>>2]|0)<(n|0);t=w?t:v;v=f[(w?v+4|0:v)>>2]|0}while((v|0)!=0);if(((t|0)!=(s|0)?(n|0)>=(f[t+16>>2]|0):0)?(v=t+20|0,w=f[t+24>>2]|0,(w|0)!=0):0){x=w;while(1){w=x+16|0;y=b[w+11>>0]|0;z=y<<24>>24<0;A=z?f[x+20>>2]|0:y&255;y=A>>>0<24;B=y?A:24;C=(B|0)==0;if(!C?(D=z?f[w>>2]|0:w,E=Fi(o,D,B)|0,(E|0)!=0):0)if((E|0)<0)F=16;else{G=D;F=19}else if(A>>>0<=24)if(C)F=20;else{G=z?f[w>>2]|0:w;F=19}else F=16;if((F|0)==16){F=0;H=x}else if((F|0)==19){F=0;w=Fi(G,o,B)|0;if(w)if((w|0)<0)F=22;else break;else F=20}if((F|0)==20){F=0;if(y)F=22;else break}if((F|0)==22){F=0;H=x+4|0}x=f[H>>2]|0;if(!x){F=25;break a}}I=ci(v,d,0)|0}else F=25}else F=25;while(0);if((F|0)==25){F=0;I=ci(q,d,0)|0}if((b[l>>0]|0)<0)Ko(f[d>>2]|0);if(I)ge(f[(f[(f[h>>2]|0)+(m<<2)>>2]|0)+8>>2]|0,p);else F=30}else F=30;if((F|0)==30?(F=0,o=f[(f[h>>2]|0)+(m<<2)>>2]|0,!(La[f[(f[o>>2]|0)+24>>2]&127](o,i)|0)):0){g=0;F=32;break}m=m+1|0;if((m|0)>=(e|0)){g=1;F=32;break}}if((F|0)==32){u=c;return g|0}return 0}function Jc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;g=u;u=u+64|0;i=g;j=i;k=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(k|0));a:do if(uc(i,d)|0?ad(i,d)|0:0){j=(a|0)==0;if(!j){if(!(f[i+12>>2]|0)){l=0;break}vf(d,0,0)|0;if(!j){j=i+44|0;k=i+48|0;m=i+40|0;n=i+16|0;o=i+28|0;p=(c|0)>0;q=d+36|0;r=d+32|0;s=d+24|0;t=d+28|0;v=0;w=0;x=f[k>>2]|0;while(1){b:do if(x>>>0<16384){y=f[j>>2]|0;z=x;while(1){if((y|0)<=0){A=z;break b}B=f[m>>2]|0;y=y+-1|0;f[j>>2]=y;C=z<<8|h[B+y>>0];f[k>>2]=C;if(C>>>0>=16384){A=C;break}else z=C}}else A=x;while(0);z=A&4095;y=f[(f[n>>2]|0)+(z<<2)>>2]|0;C=f[o>>2]|0;x=(W(f[C+(y<<3)>>2]|0,A>>>12)|0)+z-(f[C+(y<<3)+4>>2]|0)|0;f[k>>2]=x;c:do if(p){C=(b[q>>0]|0)==0;if((y|0)<=0){z=0;B=w;while(1){if(C){l=0;break a}D=B+1|0;f[e+(B<<2)>>2]=0;z=z+1|0;if((z|0)>=(c|0)){E=D;break c}else B=D}}B=0;z=w;while(1){if(C){l=0;break a}D=f[s>>2]|0;F=f[t>>2]|0;G=0;H=0;I=f[r>>2]|0;while(1){J=D+(I>>>3)|0;if(J>>>0<F>>>0){K=(h[J>>0]|0)>>>(I&7)&1;J=I+1|0;f[r>>2]=J;L=K;M=J}else{L=0;M=I}G=L<<H|G;H=H+1|0;if((H|0)==(y|0))break;else I=M}I=z+1|0;f[e+(z<<2)>>2]=G;B=B+1|0;if((B|0)>=(c|0)){E=I;break}else z=I}}else E=w;while(0);v=v+c|0;if(v>>>0>=a>>>0)break;else w=E}}}else vf(d,0,0)|0;Cj(d);l=1}else l=0;while(0);d=f[i+28>>2]|0;if(d|0){f[i+32>>2]=d;Ko(d)}d=f[i+16>>2]|0;if(d|0){f[i+20>>2]=d;Ko(d)}d=f[i>>2]|0;if(!d){u=g;return l|0}f[i+4>>2]=d;Ko(d);u=g;return l|0}function Kc(a,b){a=a|0;b=b|0;var c=0;if(!(rd(a,b)|0)){c=0;return c|0}if(!(rd(a+16|0,b)|0)){c=0;return c|0}if(!(rd(a+32|0,b)|0)){c=0;return c|0}if(!(rd(a+48|0,b)|0)){c=0;return c|0}if(!(rd(a+64|0,b)|0)){c=0;return c|0}if(!(rd(a+80|0,b)|0)){c=0;return c|0}if(!(rd(a+96|0,b)|0)){c=0;return c|0}if(!(rd(a+112|0,b)|0)){c=0;return c|0}if(!(rd(a+128|0,b)|0)){c=0;return c|0}if(!(rd(a+144|0,b)|0)){c=0;return c|0}if(!(rd(a+160|0,b)|0)){c=0;return c|0}if(!(rd(a+176|0,b)|0)){c=0;return c|0}if(!(rd(a+192|0,b)|0)){c=0;return c|0}if(!(rd(a+208|0,b)|0)){c=0;return c|0}if(!(rd(a+224|0,b)|0)){c=0;return c|0}if(!(rd(a+240|0,b)|0)){c=0;return c|0}if(!(rd(a+256|0,b)|0)){c=0;return c|0}if(!(rd(a+272|0,b)|0)){c=0;return c|0}if(!(rd(a+288|0,b)|0)){c=0;return c|0}if(!(rd(a+304|0,b)|0)){c=0;return c|0}if(!(rd(a+320|0,b)|0)){c=0;return c|0}if(!(rd(a+336|0,b)|0)){c=0;return c|0}if(!(rd(a+352|0,b)|0)){c=0;return c|0}if(!(rd(a+368|0,b)|0)){c=0;return c|0}if(!(rd(a+384|0,b)|0)){c=0;return c|0}if(!(rd(a+400|0,b)|0)){c=0;return c|0}if(!(rd(a+416|0,b)|0)){c=0;return c|0}if(!(rd(a+432|0,b)|0)){c=0;return c|0}if(!(rd(a+448|0,b)|0)){c=0;return c|0}if(!(rd(a+464|0,b)|0)){c=0;return c|0}if(!(rd(a+480|0,b)|0)){c=0;return c|0}if(!(rd(a+496|0,b)|0)){c=0;return c|0}c=rd(a+512|0,b)|0;return c|0}function Lc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;g=a+8|0;f[g>>2]=e;h=a+32|0;i=a+36|0;j=f[h>>2]|0;k=(f[i>>2]|0)-j>>2;if(k>>>0>=e>>>0){if(k>>>0>e>>>0)f[i>>2]=j+(e<<2)}else Eg(h,e-k|0);k=e>>>0>1073741823?-1:e<<2;h=Ho(k)|0;oh(h|0,0,k|0)|0;k=f[g>>2]|0;if((k|0)>0){j=a+16|0;i=a+32|0;l=a+12|0;m=0;do{n=f[h+(m<<2)>>2]|0;o=f[j>>2]|0;do if((n|0)<=(o|0)){p=f[l>>2]|0;q=f[i>>2]|0;r=q+(m<<2)|0;if((n|0)<(p|0)){f[r>>2]=p;s=q;break}else{f[r>>2]=n;s=q;break}}else{q=f[i>>2]|0;f[q+(m<<2)>>2]=o;s=q}while(0);m=m+1|0;t=f[g>>2]|0}while((m|0)<(t|0));if((t|0)>0){m=a+20|0;i=0;do{o=(f[b+(i<<2)>>2]|0)+(f[s+(i<<2)>>2]|0)|0;n=c+(i<<2)|0;f[n>>2]=o;if((o|0)<=(f[j>>2]|0)){if((o|0)<(f[l>>2]|0)){u=(f[m>>2]|0)+o|0;v=19}}else{u=o-(f[m>>2]|0)|0;v=19}if((v|0)==19){v=0;f[n>>2]=u}i=i+1|0;n=f[g>>2]|0}while((i|0)<(n|0));w=n}else w=t}else w=k;if((e|0)>=(d|0)){Io(h);return 1}k=0-e|0;t=a+16|0;i=a+32|0;u=a+12|0;m=a+20|0;a=e;l=w;while(1){w=c+(a<<2)|0;j=w+(k<<2)|0;s=b+(a<<2)|0;if((l|0)>0){n=0;do{o=f[j+(n<<2)>>2]|0;q=f[t>>2]|0;do if((o|0)<=(q|0)){r=f[u>>2]|0;p=f[i>>2]|0;x=p+(n<<2)|0;if((o|0)<(r|0)){f[x>>2]=r;y=p;break}else{f[x>>2]=o;y=p;break}}else{p=f[i>>2]|0;f[p+(n<<2)>>2]=q;y=p}while(0);n=n+1|0;z=f[g>>2]|0}while((n|0)<(z|0));if((z|0)>0){n=0;do{j=(f[s+(n<<2)>>2]|0)+(f[y+(n<<2)>>2]|0)|0;q=w+(n<<2)|0;f[q>>2]=j;if((j|0)<=(f[t>>2]|0)){if((j|0)<(f[u>>2]|0)){A=(f[m>>2]|0)+j|0;v=38}}else{A=j-(f[m>>2]|0)|0;v=38}if((v|0)==38){v=0;f[q>>2]=A}n=n+1|0;q=f[g>>2]|0}while((n|0)<(q|0));B=q}else B=z}else B=l;a=a+e|0;if((a|0)>=(d|0))break;else l=B}Io(h);return 1}function Mc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=u;u=u+32|0;e=d+24|0;g=d+20|0;h=d+8|0;i=d+4|0;j=d;f[e>>2]=0;zh(e,f[a>>2]|0)|0;a:do if(f[e>>2]|0){k=0;while(1){k=k+1|0;if(!(bd(a,c)|0)){l=0;break}if(k>>>0>=(f[e>>2]|0)>>>0)break a}u=d;return l|0}while(0);f[g>>2]=0;zh(g,f[a>>2]|0)|0;b:do if(!(f[g>>2]|0))m=1;else{e=h+11|0;k=0;while(1){f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;n=f[a>>2]|0;o=n+8|0;p=f[o+4>>2]|0;q=n+16|0;r=q;s=f[r>>2]|0;t=f[r+4>>2]|0;do if((p|0)>(t|0)|((p|0)==(t|0)?(f[o>>2]|0)>>>0>s>>>0:0)){r=b[(f[n>>2]|0)+s>>0]|0;v=vl(s|0,t|0,1,0)|0;w=q;f[w>>2]=v;f[w+4>>2]=H;w=r&255;Gh(h,w,0);if(r<<24>>24){v=f[a>>2]|0;x=gj(h,0)|0;y=v+8|0;z=f[y>>2]|0;A=f[y+4>>2]|0;y=v+16|0;B=y;C=f[B>>2]|0;D=r&255;r=vl(C|0,f[B+4>>2]|0,D|0,0)|0;B=H;if((A|0)<(B|0)|(A|0)==(B|0)&z>>>0<r>>>0){E=1;break}Bf(x|0,(f[v>>2]|0)+C|0,w|0)|0;w=y;C=vl(f[w>>2]|0,f[w+4>>2]|0,D|0,0)|0;D=y;f[D>>2]=C;f[D+4>>2]=H}D=wk(40)|0;f[D>>2]=0;f[D+4>>2]=0;f[D+8>>2]=0;f[D+12>>2]=0;f[D+16>>2]=1065353216;C=D+20|0;f[C>>2]=0;f[C+4>>2]=0;f[C+8>>2]=0;f[C+12>>2]=0;f[D+36>>2]=1065353216;f[i>>2]=D;if(Mc(a,D)|0){D=f[i>>2]|0;f[i>>2]=0;f[j>>2]=D;of(c,h,j)|0;Xg(j);F=0}else F=1;Xg(i);E=F}else E=1;while(0);if((b[e>>0]|0)<0)Ko(f[h>>2]|0);k=k+1|0;if(E|0){m=0;break b}if(k>>>0>=(f[g>>2]|0)>>>0){m=1;break}}}while(0);l=m;u=d;return l|0}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;d=u;u=u+16|0;e=d;g=a+68|0;f[g>>2]=(f[g>>2]|0)+1;g=(f[a+8+(b*12|0)+4>>2]|0)-(f[a+8+(b*12|0)>>2]|0)|0;h=g>>2;if((g|0)<=0){u=d;return}g=a+4|0;i=a+56|0;j=a+72|0;k=f[c>>2]|0;c=k+4|0;l=k+8|0;m=a+76|0;n=0;o=f[a+44+(b<<2)>>2]|0;while(1){b=(o|0)==-1;p=(o>>>0)/3|0;q=b?-1:p;r=(f[i>>2]|0)+(q>>>5<<2)|0;f[r>>2]=f[r>>2]|1<<(q&31);f[j>>2]=(f[j>>2]|0)+1;do if(n){if(b)s=-1;else{q=(o|0)/3|0;s=f[(f[(f[a>>2]|0)+96>>2]|0)+(q*12|0)+(o-(q*3|0)<<2)>>2]|0}f[m>>2]=s;f[e>>2]=s;q=f[c>>2]|0;if(q>>>0<(f[l>>2]|0)>>>0){f[q>>2]=s;f[c>>2]=q+4}else Ng(k,e);if(!(n&1)){q=o+1|0;if(b){t=-1;break}v=((q>>>0)%3|0|0)==0?o+-2|0:q;w=35;break}if(!b)if(!(o-(p*3|0)|0)){v=o+2|0;w=35;break}else{v=o+-1|0;w=35;break}else t=-1}else{if(b)x=-1;else x=f[(f[(f[a>>2]|0)+96>>2]|0)+(((o|0)/3|0)*12|0)+(((o|0)%3|0)<<2)>>2]|0;f[e>>2]=x;q=f[c>>2]|0;if(q>>>0<(f[l>>2]|0)>>>0){f[q>>2]=x;f[c>>2]=q+4}else Ng(k,e);q=o+1|0;if(!b?(r=((q>>>0)%3|0|0)==0?o+-2|0:q,(r|0)!=-1):0){q=(r|0)/3|0;y=f[(f[(f[a>>2]|0)+96>>2]|0)+(q*12|0)+(r-(q*3|0)<<2)>>2]|0}else y=-1;f[e>>2]=y;q=f[c>>2]|0;if(q>>>0<(f[l>>2]|0)>>>0){f[q>>2]=y;f[c>>2]=q+4}else Ng(k,e);if(!b?(q=(((o>>>0)%3|0|0)==0?2:-1)+o|0,(q|0)!=-1):0){r=(q|0)/3|0;z=f[(f[(f[a>>2]|0)+96>>2]|0)+(r*12|0)+(q-(r*3|0)<<2)>>2]|0}else z=-1;f[m>>2]=z;f[e>>2]=z;r=f[c>>2]|0;if(r>>>0<(f[l>>2]|0)>>>0){f[r>>2]=z;f[c>>2]=r+4}else Ng(k,e);v=o;w=35}while(0);if((w|0)==35){w=0;if((v|0)==-1)t=-1;else t=f[(f[(f[g>>2]|0)+12>>2]|0)+(v<<2)>>2]|0}n=n+1|0;if((n|0)>=(h|0))break;else o=t}u=d;return}function Oc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Ko(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}d=wk(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Ko(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;if(h){h=i;d=c;j=e;while(1){k=f[d+4>>2]&g;do if((k|0)==(h|0)){l=h;m=d}else{n=(f[a>>2]|0)+(k<<2)|0;if(!(f[n>>2]|0)){f[n>>2]=j;l=k;m=d;break}n=f[d>>2]|0;a:do if(!n)o=d;else{p=f[d+8>>2]|0;q=d;r=n;while(1){if((p|0)!=(f[r+8>>2]|0)){o=q;break a}s=f[r>>2]|0;if(!s){o=r;break}else{t=r;r=s;q=t}}}while(0);f[j>>2]=f[o>>2];f[o>>2]=f[f[(f[a>>2]|0)+(k<<2)>>2]>>2];f[f[(f[a>>2]|0)+(k<<2)>>2]>>2]=d;l=h;m=j}while(0);d=f[m>>2]|0;if(!d)break;else{h=l;j=m}}return}m=i;i=c;c=e;while(1){e=f[i+4>>2]|0;if(e>>>0<b>>>0)u=e;else u=(e>>>0)%(b>>>0)|0;do if((u|0)==(m|0)){v=m;w=i}else{e=(f[a>>2]|0)+(u<<2)|0;if(!(f[e>>2]|0)){f[e>>2]=c;v=u;w=i;break}e=f[i>>2]|0;b:do if(!e)x=i;else{j=f[i+8>>2]|0;l=i;h=e;while(1){if((j|0)!=(f[h+8>>2]|0)){x=l;break b}d=f[h>>2]|0;if(!d){x=h;break}else{o=h;h=d;l=o}}}while(0);f[c>>2]=f[x>>2];f[x>>2]=f[f[(f[a>>2]|0)+(u<<2)>>2]>>2];f[f[(f[a>>2]|0)+(u<<2)>>2]>>2]=i;v=m;w=c}while(0);i=f[w>>2]|0;if(!i)break;else{m=v;c=w}}return}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;d=u;u=u+16|0;e=d+8|0;g=d;h=d+4|0;if(!(Qe(a,b)|0)){i=0;u=d;return i|0}j=b+96|0;k=b+100|0;b=f[k>>2]|0;l=f[j>>2]|0;if((b|0)==(l|0)){i=1;u=d;return i|0}m=a+56|0;n=a+8|0;o=a+12|0;p=a+20|0;q=a+24|0;r=a+32|0;s=a+36|0;t=a+68|0;v=a+76|0;w=f[c>>2]|0;c=w+4|0;x=w+8|0;y=w;z=a+72|0;A=0;B=l;l=b;while(1){if(!(f[(f[m>>2]|0)+(A>>>5<<2)>>2]&1<<(A&31))){b=A*3|0;f[g>>2]=b;f[e>>2]=f[g>>2];_b(a,0,e);C=(f[o>>2]|0)-(f[n>>2]|0)|0;D=(C|0)!=0;E=D?C>>2:0;f[g>>2]=b+1;f[e>>2]=f[g>>2];_b(a,1,e);C=(f[q>>2]|0)-(f[p>>2]|0)>>2;F=C>>>0>E>>>0;f[g>>2]=b+2;f[e>>2]=f[g>>2];_b(a,2,e);b=(f[s>>2]|0)-(f[r>>2]|0)>>2>>>0>(F?C:E)>>>0?2:F?1:(D^1)<<31>>31;if((f[t>>2]|0)>0){D=f[v>>2]|0;f[e>>2]=D;F=f[c>>2]|0;if(F>>>0<(f[x>>2]|0)>>>0){f[F>>2]=D;f[c>>2]=F+4}else Ng(w,e);F=f[a+44+(b<<2)>>2]|0;if((F|0)==-1)G=-1;else{D=(F|0)/3|0;G=f[(f[(f[a>>2]|0)+96>>2]|0)+(D*12|0)+(F-(D*3|0)<<2)>>2]|0}f[e>>2]=G;D=f[c>>2]|0;if(D>>>0<(f[x>>2]|0)>>>0){f[D>>2]=G;f[c>>2]=D+4}else Ng(w,e);D=(f[z>>2]|0)+2|0;f[z>>2]=D;if(D&1|0){f[e>>2]=G;D=f[c>>2]|0;if(D>>>0<(f[x>>2]|0)>>>0){f[D>>2]=G;f[c>>2]=D+4}else Ng(w,e);f[z>>2]=(f[z>>2]|0)+1}}f[h>>2]=y;f[e>>2]=f[h>>2];Nc(a,b,e);H=f[j>>2]|0;I=f[k>>2]|0}else{H=B;I=l}A=A+1|0;if(A>>>0>=((I-H|0)/12|0)>>>0){i=1;break}else{B=H;l=I}}u=d;return i|0}function Qc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+176|0;g=e+136|0;h=e+64|0;i=e;j=e+32|0;k=f[(f[c+4>>2]|0)+44>>2]|0;l=wk(88)|0;f[l+4>>2]=0;f[l>>2]=3384;m=l+12|0;f[m>>2]=3364;n=l+64|0;f[n>>2]=0;f[l+68>>2]=0;f[l+72>>2]=0;o=l+16|0;p=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f[l+76>>2]=k;f[l+80>>2]=d;f[l+84>>2]=0;q=l;r=h+4|0;f[r>>2]=3364;s=h+56|0;f[s>>2]=0;t=h+60|0;f[t>>2]=0;f[h+64>>2]=0;o=h+8|0;p=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));o=f[c+8>>2]|0;f[i>>2]=3364;c=i+4|0;p=c+4|0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[c>>2]=o;c=((f[o+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Gf(i+8|0,c,g);Pa[f[(f[i>>2]|0)+8>>2]&127](i);le(j,i);le(g,j);f[h>>2]=f[g+4>>2];c=h+4|0;He(c,g)|0;f[g>>2]=3364;p=f[g+20>>2]|0;if(p|0)Ko(p);p=f[g+8>>2]|0;if(p|0)Ko(p);f[h+36>>2]=o;f[h+40>>2]=d;f[h+44>>2]=k;f[h+48>>2]=l;f[j>>2]=3364;k=f[j+20>>2]|0;if(k|0)Ko(k);k=f[j+8>>2]|0;if(k|0)Ko(k);f[l+8>>2]=f[h>>2];He(m,c)|0;c=l+44|0;l=h+36|0;f[c>>2]=f[l>>2];f[c+4>>2]=f[l+4>>2];f[c+8>>2]=f[l+8>>2];f[c+12>>2]=f[l+12>>2];b[c+16>>0]=b[l+16>>0]|0;df(n,f[s>>2]|0,f[t>>2]|0);f[a>>2]=q;f[i>>2]=3364;q=f[i+20>>2]|0;if(q|0)Ko(q);q=f[i+8>>2]|0;if(q|0)Ko(q);q=f[s>>2]|0;if(q|0){f[t>>2]=q;Ko(q)}f[r>>2]=3364;r=f[h+24>>2]|0;if(r|0)Ko(r);r=f[h+12>>2]|0;if(!r){u=e;return}Ko(r);u=e;return}function Rc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=u;u=u+16|0;h=d+4|0;i=d;f[a+72>>2]=e;f[a+64>>2]=g;g=Ho(e>>>0>1073741823?-1:e<<2)|0;j=a+68|0;k=f[j>>2]|0;f[j>>2]=g;if(k|0)Io(k);k=a+8|0;f[k>>2]=e;g=a+32|0;l=a+36|0;m=f[g>>2]|0;n=(f[l>>2]|0)-m>>2;if(n>>>0>=e>>>0){if(n>>>0>e>>>0)f[l>>2]=m+(e<<2)}else Eg(g,e-n|0);n=a+56|0;g=f[n>>2]|0;m=f[g+4>>2]|0;l=f[g>>2]|0;o=m-l|0;p=o>>2;if((o|0)<=0){u=d;return 1}o=a+16|0;q=a+32|0;r=a+12|0;s=a+20|0;if((m|0)==(l|0)){t=g;$n(t)}g=0;m=l;while(1){f[i>>2]=f[m+(g<<2)>>2];f[h>>2]=f[i>>2];ac(a,h,c,g);l=W(g,e)|0;v=f[j>>2]|0;w=b+(l<<2)|0;x=c+(l<<2)|0;if((f[k>>2]|0)>0){l=0;do{y=f[v+(l<<2)>>2]|0;z=f[o>>2]|0;do if((y|0)<=(z|0)){A=f[r>>2]|0;B=f[q>>2]|0;C=B+(l<<2)|0;if((y|0)<(A|0)){f[C>>2]=A;D=B;break}else{f[C>>2]=y;D=B;break}}else{B=f[q>>2]|0;f[B+(l<<2)>>2]=z;D=B}while(0);l=l+1|0;E=f[k>>2]|0}while((l|0)<(E|0));if((E|0)>0){l=0;do{v=(f[w+(l<<2)>>2]|0)+(f[D+(l<<2)>>2]|0)|0;z=x+(l<<2)|0;f[z>>2]=v;if((v|0)<=(f[o>>2]|0)){if((v|0)<(f[r>>2]|0)){F=(f[s>>2]|0)+v|0;G=26}}else{F=v-(f[s>>2]|0)|0;G=26}if((G|0)==26){G=0;f[z>>2]=F}l=l+1|0}while((l|0)<(f[k>>2]|0))}}g=g+1|0;if((g|0)>=(p|0)){G=10;break}l=f[n>>2]|0;m=f[l>>2]|0;if((f[l+4>>2]|0)-m>>2>>>0<=g>>>0){t=l;G=11;break}}if((G|0)==10){u=d;return 1}else if((G|0)==11)$n(t);return 0}function Sc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=u;u=u+16|0;h=d+4|0;i=d;f[a+72>>2]=e;f[a+64>>2]=g;g=Ho(e>>>0>1073741823?-1:e<<2)|0;j=a+68|0;k=f[j>>2]|0;f[j>>2]=g;if(k|0)Io(k);k=a+8|0;f[k>>2]=e;g=a+32|0;l=a+36|0;m=f[g>>2]|0;n=(f[l>>2]|0)-m>>2;if(n>>>0>=e>>>0){if(n>>>0>e>>>0)f[l>>2]=m+(e<<2)}else Eg(g,e-n|0);n=a+56|0;g=f[n>>2]|0;m=f[g+4>>2]|0;l=f[g>>2]|0;o=m-l|0;p=o>>2;if((o|0)<=0){u=d;return 1}o=a+16|0;q=a+32|0;r=a+12|0;s=a+20|0;if((m|0)==(l|0)){t=g;$n(t)}g=0;m=l;while(1){f[i>>2]=f[m+(g<<2)>>2];f[h>>2]=f[i>>2];bc(a,h,c,g);l=W(g,e)|0;v=f[j>>2]|0;w=b+(l<<2)|0;x=c+(l<<2)|0;if((f[k>>2]|0)>0){l=0;do{y=f[v+(l<<2)>>2]|0;z=f[o>>2]|0;do if((y|0)<=(z|0)){A=f[r>>2]|0;B=f[q>>2]|0;C=B+(l<<2)|0;if((y|0)<(A|0)){f[C>>2]=A;D=B;break}else{f[C>>2]=y;D=B;break}}else{B=f[q>>2]|0;f[B+(l<<2)>>2]=z;D=B}while(0);l=l+1|0;E=f[k>>2]|0}while((l|0)<(E|0));if((E|0)>0){l=0;do{v=(f[w+(l<<2)>>2]|0)+(f[D+(l<<2)>>2]|0)|0;z=x+(l<<2)|0;f[z>>2]=v;if((v|0)<=(f[o>>2]|0)){if((v|0)<(f[r>>2]|0)){F=(f[s>>2]|0)+v|0;G=26}}else{F=v-(f[s>>2]|0)|0;G=26}if((G|0)==26){G=0;f[z>>2]=F}l=l+1|0}while((l|0)<(f[k>>2]|0))}}g=g+1|0;if((g|0)>=(p|0)){G=10;break}l=f[n>>2]|0;m=f[l>>2]|0;if((f[l+4>>2]|0)-m>>2>>>0<=g>>>0){t=l;G=11;break}}if((G|0)==10){u=d;return 1}else if((G|0)==11)$n(t);return 0}function Tc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;c=a+148|0;d=f[b>>2]|0;b=(d|0)==-1;e=d+1|0;do if(!b){g=((e>>>0)%3|0|0)==0?d+-2|0:e;if(!((d>>>0)%3|0)){h=d+2|0;i=g;break}else{h=d+-1|0;i=g;break}}else{h=-1;i=-1}while(0);g=a+184|0;j=f[g>>2]|0;switch(j|0){case 1:case 0:{k=f[c>>2]|0;if((i|0)==-1)l=-1;else l=f[(f[k>>2]|0)+(i<<2)>>2]|0;m=f[a+156>>2]|0;n=m+(l<<2)|0;f[n>>2]=(f[n>>2]|0)+1;if((h|0)==-1)o=-1;else o=f[(f[k>>2]|0)+(h<<2)>>2]|0;p=m+(o<<2)|0;q=1;r=32;break}case 5:{o=f[c>>2]|0;if(b)s=-1;else s=f[(f[o>>2]|0)+(d<<2)>>2]|0;m=f[a+156>>2]|0;k=m+(s<<2)|0;f[k>>2]=(f[k>>2]|0)+1;if((i|0)==-1)t=-1;else t=f[(f[o>>2]|0)+(i<<2)>>2]|0;k=m+(t<<2)|0;f[k>>2]=(f[k>>2]|0)+1;if((h|0)==-1)u=-1;else u=f[(f[o>>2]|0)+(h<<2)>>2]|0;p=m+(u<<2)|0;q=2;r=32;break}case 3:{u=f[c>>2]|0;if(b)v=-1;else v=f[(f[u>>2]|0)+(d<<2)>>2]|0;m=f[a+156>>2]|0;o=m+(v<<2)|0;f[o>>2]=(f[o>>2]|0)+1;if((i|0)==-1)w=-1;else w=f[(f[u>>2]|0)+(i<<2)>>2]|0;o=m+(w<<2)|0;f[o>>2]=(f[o>>2]|0)+2;if((h|0)==-1)x=-1;else x=f[(f[u>>2]|0)+(h<<2)>>2]|0;p=m+(x<<2)|0;q=1;r=32;break}case 7:{x=f[c>>2]|0;if(b)y=-1;else y=f[(f[x>>2]|0)+(d<<2)>>2]|0;m=f[a+156>>2]|0;u=m+(y<<2)|0;f[u>>2]=(f[u>>2]|0)+2;if((i|0)==-1)z=-1;else z=f[(f[x>>2]|0)+(i<<2)>>2]|0;i=m+(z<<2)|0;f[i>>2]=(f[i>>2]|0)+2;if((h|0)==-1)A=-1;else A=f[(f[x>>2]|0)+(h<<2)>>2]|0;p=m+(A<<2)|0;q=2;r=32;break}default:B=j}if((r|0)==32){f[p>>2]=(f[p>>2]|0)+q;B=f[g>>2]|0}switch(B|0){case 5:case 0:break;default:{f[a+188>>2]=-1;return}}B=f[c>>2]|0;if(!b?(b=((e>>>0)%3|0|0)==0?d+-2|0:e,(b|0)!=-1):0)C=f[(f[B>>2]|0)+(b<<2)>>2]|0;else C=-1;f[a+188>>2]=(f[(f[a+156>>2]|0)+(C<<2)>>2]|0)<6?5:0;return}function Uc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;f[a>>2]=f[c>>2];d=c+4|0;f[a+4>>2]=f[d>>2];e=c+8|0;f[a+8>>2]=f[e>>2];g=c+12|0;f[a+12>>2]=f[g>>2];f[d>>2]=0;f[e>>2]=0;f[g>>2]=0;g=c+16|0;f[a+16>>2]=f[g>>2];e=c+20|0;f[a+20>>2]=f[e>>2];d=c+24|0;f[a+24>>2]=f[d>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;b[a+28>>0]=b[c+28>>0]|0;d=a+32|0;e=c+32|0;f[d>>2]=0;g=a+36|0;f[g>>2]=0;h=a+40|0;f[h>>2]=0;f[d>>2]=f[e>>2];d=c+36|0;f[g>>2]=f[d>>2];g=c+40|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;e=a+44|0;d=c+44|0;f[e>>2]=0;g=a+48|0;f[g>>2]=0;h=a+52|0;f[h>>2]=0;f[e>>2]=f[d>>2];e=c+48|0;f[g>>2]=f[e>>2];g=c+52|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+56|0;e=c+56|0;f[d>>2]=0;g=a+60|0;f[g>>2]=0;h=a+64|0;f[h>>2]=0;f[d>>2]=f[e>>2];d=c+60|0;f[g>>2]=f[d>>2];g=c+64|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+68>>2]=f[c+68>>2];f[a+72>>2]=f[c+72>>2];e=a+76|0;d=c+76|0;f[e>>2]=0;g=a+80|0;f[g>>2]=0;h=a+84|0;f[h>>2]=0;f[e>>2]=f[d>>2];e=c+80|0;f[g>>2]=f[e>>2];g=c+84|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+88|0;e=c+88|0;f[d>>2]=0;g=a+92|0;f[g>>2]=0;h=a+96|0;f[h>>2]=0;f[d>>2]=f[e>>2];d=c+92|0;f[g>>2]=f[d>>2];g=c+96|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;b[a+100>>0]=b[c+100>>0]|0;e=a+104|0;d=c+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;h=a+112|0;f[h>>2]=0;f[e>>2]=f[d>>2];e=c+108|0;f[g>>2]=f[e>>2];g=c+112|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+116|0;e=c+116|0;f[d>>2]=0;g=a+120|0;f[g>>2]=0;h=a+124|0;f[h>>2]=0;f[d>>2]=f[e>>2];d=c+120|0;f[g>>2]=f[d>>2];g=c+124|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+128>>2]=f[c+128>>2];e=a+132|0;d=c+132|0;f[e>>2]=0;g=a+136|0;f[g>>2]=0;h=a+140|0;f[h>>2]=0;f[e>>2]=f[d>>2];e=c+136|0;f[g>>2]=f[e>>2];g=c+140|0;f[h>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;return}function Vc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+4194304|0;f[z>>2]=a;o=a>>>0<1073741824;u=d;return o|0}function Wc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+2097152|0;f[z>>2]=a;o=a>>>0<536870912;u=d;return o|0}function Xc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+1048576|0;f[z>>2]=a;o=a>>>0<268435456;u=d;return o|0}function Yc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+262144|0;f[z>>2]=a;o=a>>>0<67108864;u=d;return o|0}function Zc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+131072|0;f[z>>2]=a;o=a>>>0<33554432;u=d;return o|0}function _c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;c=a+148|0;d=f[b>>2]|0;b=(d|0)==-1;e=d+1|0;do if(!b){g=((e>>>0)%3|0|0)==0?d+-2|0:e;if(!((d>>>0)%3|0)){h=d+2|0;i=g;break}else{h=d+-1|0;i=g;break}}else{h=-1;i=-1}while(0);switch(f[a+168>>2]|0){case 1:case 0:{e=f[c>>2]|0;if((i|0)==-1)j=-1;else j=f[(f[e>>2]|0)+(i<<2)>>2]|0;g=f[a+156>>2]|0;k=g+(j<<2)|0;f[k>>2]=(f[k>>2]|0)+1;if((h|0)==-1)l=-1;else l=f[(f[e>>2]|0)+(h<<2)>>2]|0;m=g+(l<<2)|0;n=1;o=32;break}case 5:{l=f[c>>2]|0;if(b)p=-1;else p=f[(f[l>>2]|0)+(d<<2)>>2]|0;g=f[a+156>>2]|0;e=g+(p<<2)|0;f[e>>2]=(f[e>>2]|0)+1;if((i|0)==-1)q=-1;else q=f[(f[l>>2]|0)+(i<<2)>>2]|0;e=g+(q<<2)|0;f[e>>2]=(f[e>>2]|0)+1;if((h|0)==-1)r=-1;else r=f[(f[l>>2]|0)+(h<<2)>>2]|0;m=g+(r<<2)|0;n=2;o=32;break}case 3:{r=f[c>>2]|0;if(b)s=-1;else s=f[(f[r>>2]|0)+(d<<2)>>2]|0;g=f[a+156>>2]|0;l=g+(s<<2)|0;f[l>>2]=(f[l>>2]|0)+1;if((i|0)==-1)t=-1;else t=f[(f[r>>2]|0)+(i<<2)>>2]|0;l=g+(t<<2)|0;f[l>>2]=(f[l>>2]|0)+2;if((h|0)==-1)u=-1;else u=f[(f[r>>2]|0)+(h<<2)>>2]|0;m=g+(u<<2)|0;n=1;o=32;break}case 7:{u=f[c>>2]|0;if(b)v=-1;else v=f[(f[u>>2]|0)+(d<<2)>>2]|0;d=f[a+156>>2]|0;b=d+(v<<2)|0;f[b>>2]=(f[b>>2]|0)+2;if((i|0)==-1)w=-1;else w=f[(f[u>>2]|0)+(i<<2)>>2]|0;b=d+(w<<2)|0;f[b>>2]=(f[b>>2]|0)+2;if((h|0)==-1)x=-1;else x=f[(f[u>>2]|0)+(h<<2)>>2]|0;m=d+(x<<2)|0;n=2;o=32;break}default:{}}if((o|0)==32)f[m>>2]=(f[m>>2]|0)+n;if((i|0)==-1)y=-1;else y=f[(f[f[c>>2]>>2]|0)+(i<<2)>>2]|0;i=f[(f[a+156>>2]|0)+(y<<2)>>2]|0;y=f[a+176>>2]|0;if((i|0)<(y|0)){z=y;A=z-y|0;B=a+172|0;f[B>>2]=A;return}c=f[a+180>>2]|0;z=(i|0)>(c|0)?c:i;A=z-y|0;B=a+172|0;f[B>>2]=A;return}function $c(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+32768|0;f[z>>2]=a;o=a>>>0<8388608;u=d;return o|0}function ad(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;do if((j[c+38>>1]|0)<512){g=c+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=c+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=d;return o|0}else{p=(f[c>>2]|0)+m|0;m=p;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=p+4|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=e;f[m>>2]=q;f[m+4>>2]=p;m=g;f[m>>2]=n;f[m+4>>2]=l;r=g;s=i;t=k;v=n;w=l;x=p;y=q;break}}else if(ah(e,c)|0){q=e;p=c+8|0;l=c+16|0;n=l;r=l;s=f[p>>2]|0;t=f[p+4>>2]|0;v=f[n>>2]|0;w=f[n+4>>2]|0;x=f[q+4>>2]|0;y=f[q>>2]|0;break}else{o=0;u=d;return o|0}while(0);e=wl(s|0,t|0,v|0,w|0)|0;t=H;if(x>>>0>t>>>0|(x|0)==(t|0)&y>>>0>e>>>0){o=0;u=d;return o|0}e=(f[c>>2]|0)+v|0;c=vl(v|0,w|0,y|0,x|0)|0;x=r;f[x>>2]=c;f[x+4>>2]=H;if((y|0)<1){o=0;u=d;return o|0}f[a+40>>2]=e;x=y+-1|0;c=e+x|0;a:do switch((h[c>>0]|0)>>>6&3){case 0:{f[a+44>>2]=x;r=b[c>>0]&63;w=a+48|0;f[w>>2]=r;z=w;A=r;break}case 1:{if((y|0)<2){o=0;u=d;return o|0}else{f[a+44>>2]=y+-2;r=e+y+-2|0;w=(h[r+1>>0]|0)<<8&16128|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break a}break}case 2:{if((y|0)<3){o=0;u=d;return o|0}else{f[a+44>>2]=y+-3;w=e+y+-3|0;r=(h[w+1>>0]|0)<<8|(h[w>>0]|0)|(h[w+2>>0]|0)<<16&4128768;w=a+48|0;f[w>>2]=r;z=w;A=r;break a}break}case 3:{f[a+44>>2]=y+-4;r=e+y+-4|0;w=(h[r+2>>0]|0)<<16|(h[r+3>>0]|0)<<24&1056964608|(h[r+1>>0]|0)<<8|(h[r>>0]|0);r=a+48|0;f[r>>2]=w;z=r;A=w;break}default:{}}while(0);a=A+16384|0;f[z>>2]=a;o=a>>>0<4194304;u=d;return o|0}function bd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=u;u=u+32|0;e=d+16|0;g=d+12|0;h=d;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;i=f[a>>2]|0;j=i+8|0;k=f[j+4>>2]|0;l=i+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;do if((k|0)>(o|0)|((k|0)==(o|0)?(f[j>>2]|0)>>>0>n>>>0:0)){m=b[(f[i>>2]|0)+n>>0]|0;p=vl(n|0,o|0,1,0)|0;q=l;f[q>>2]=p;f[q+4>>2]=H;q=m&255;Gh(e,q,0);if(m<<24>>24){p=f[a>>2]|0;r=gj(e,0)|0;s=p+8|0;t=f[s>>2]|0;v=f[s+4>>2]|0;s=p+16|0;w=s;x=f[w>>2]|0;y=m&255;m=vl(x|0,f[w+4>>2]|0,y|0,0)|0;w=H;if((v|0)<(w|0)|(v|0)==(w|0)&t>>>0<m>>>0){z=0;break}Bf(r|0,(f[p>>2]|0)+x|0,q|0)|0;q=s;x=vl(f[q>>2]|0,f[q+4>>2]|0,y|0,0)|0;y=s;f[y>>2]=x;f[y+4>>2]=H}f[g>>2]=0;y=(zh(g,f[a>>2]|0)|0)^1;x=f[g>>2]|0;if((x|0)==0|y)A=0;else{f[h>>2]=0;y=h+4|0;f[y>>2]=0;s=h+8|0;f[s>>2]=0;if((x|0)<0)$n(h);q=wk(x)|0;f[y>>2]=q;f[h>>2]=q;f[s>>2]=q+x;s=x;x=q;do{b[x>>0]=0;x=(f[y>>2]|0)+1|0;f[y>>2]=x;s=s+-1|0}while((s|0)!=0);s=f[a>>2]|0;x=f[g>>2]|0;q=s+8|0;p=f[q>>2]|0;r=f[q+4>>2]|0;q=s+16|0;m=q;t=f[m>>2]|0;w=vl(t|0,f[m+4>>2]|0,x|0,0)|0;m=H;if((r|0)<(m|0)|(r|0)==(m|0)&p>>>0<w>>>0)B=0;else{Bf(f[h>>2]|0,(f[s>>2]|0)+t|0,x|0)|0;t=q;s=vl(f[t>>2]|0,f[t+4>>2]|0,x|0,0)|0;x=q;f[x>>2]=s;f[x+4>>2]=H;$j(c,e,h);B=1}x=f[h>>2]|0;if(x|0){f[y>>2]=x;Ko(x)}A=B}z=A}else z=0;while(0);if((b[e+11>>0]|0)>=0){u=d;return z|0}Ko(f[e>>2]|0);u=d;return z|0}function cd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=u;u=u+16|0;h=d+4|0;i=d;j=a+60|0;f[a+64>>2]=g;g=a+8|0;f[g>>2]=e;k=a+32|0;l=a+36|0;m=f[k>>2]|0;n=(f[l>>2]|0)-m>>2;if(n>>>0>=e>>>0){if(n>>>0>e>>>0)f[l>>2]=m+(e<<2)}else Eg(k,e-n|0);n=a+56|0;k=f[n>>2]|0;m=f[k+4>>2]|0;l=f[k>>2]|0;o=m-l|0;p=o>>2;if((o|0)<=0){q=1;u=d;return q|0}o=a+16|0;r=a+32|0;s=a+12|0;t=a+20|0;if((m|0)==(l|0)){v=k;$n(v)}k=0;m=l;while(1){f[i>>2]=f[m+(k<<2)>>2];f[h>>2]=f[i>>2];if(!(Kb(j,h,c,k)|0)){q=0;w=28;break}l=W(k,e)|0;x=b+(l<<2)|0;y=c+(l<<2)|0;if((f[g>>2]|0)>0){l=0;do{z=f[a+68+(l<<2)>>2]|0;A=f[o>>2]|0;do if((z|0)<=(A|0)){B=f[s>>2]|0;C=f[r>>2]|0;D=C+(l<<2)|0;if((z|0)<(B|0)){f[D>>2]=B;E=C;break}else{f[D>>2]=z;E=C;break}}else{C=f[r>>2]|0;f[C+(l<<2)>>2]=A;E=C}while(0);l=l+1|0;F=f[g>>2]|0}while((l|0)<(F|0));if((F|0)>0){l=0;do{A=(f[x+(l<<2)>>2]|0)+(f[E+(l<<2)>>2]|0)|0;z=y+(l<<2)|0;f[z>>2]=A;if((A|0)<=(f[o>>2]|0)){if((A|0)<(f[s>>2]|0)){G=(f[t>>2]|0)+A|0;w=24}}else{G=A-(f[t>>2]|0)|0;w=24}if((w|0)==24){w=0;f[z>>2]=G}l=l+1|0}while((l|0)<(f[g>>2]|0))}}k=k+1|0;if((k|0)>=(p|0)){q=1;w=28;break}l=f[n>>2]|0;m=f[l>>2]|0;if((f[l+4>>2]|0)-m>>2>>>0<=k>>>0){v=l;w=8;break}}if((w|0)==8)$n(v);else if((w|0)==28){u=d;return q|0}return 0}function dd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=u;u=u+16|0;h=d+4|0;i=d;j=a+60|0;f[a+64>>2]=g;g=a+8|0;f[g>>2]=e;k=a+32|0;l=a+36|0;m=f[k>>2]|0;n=(f[l>>2]|0)-m>>2;if(n>>>0>=e>>>0){if(n>>>0>e>>>0)f[l>>2]=m+(e<<2)}else Eg(k,e-n|0);n=a+56|0;k=f[n>>2]|0;m=f[k+4>>2]|0;l=f[k>>2]|0;o=m-l|0;p=o>>2;if((o|0)<=0){q=1;u=d;return q|0}o=a+16|0;r=a+32|0;s=a+12|0;t=a+20|0;if((m|0)==(l|0)){v=k;$n(v)}k=0;m=l;while(1){f[i>>2]=f[m+(k<<2)>>2];f[h>>2]=f[i>>2];if(!(Jb(j,h,c,k)|0)){q=0;w=28;break}l=W(k,e)|0;x=b+(l<<2)|0;y=c+(l<<2)|0;if((f[g>>2]|0)>0){l=0;do{z=f[a+68+(l<<2)>>2]|0;A=f[o>>2]|0;do if((z|0)<=(A|0)){B=f[s>>2]|0;C=f[r>>2]|0;D=C+(l<<2)|0;if((z|0)<(B|0)){f[D>>2]=B;E=C;break}else{f[D>>2]=z;E=C;break}}else{C=f[r>>2]|0;f[C+(l<<2)>>2]=A;E=C}while(0);l=l+1|0;F=f[g>>2]|0}while((l|0)<(F|0));if((F|0)>0){l=0;do{A=(f[x+(l<<2)>>2]|0)+(f[E+(l<<2)>>2]|0)|0;z=y+(l<<2)|0;f[z>>2]=A;if((A|0)<=(f[o>>2]|0)){if((A|0)<(f[s>>2]|0)){G=(f[t>>2]|0)+A|0;w=24}}else{G=A-(f[t>>2]|0)|0;w=24}if((w|0)==24){w=0;f[z>>2]=G}l=l+1|0}while((l|0)<(f[g>>2]|0))}}k=k+1|0;if((k|0)>=(p|0)){q=1;w=28;break}l=f[n>>2]|0;m=f[l>>2]|0;if((f[l+4>>2]|0)-m>>2>>>0<=k>>>0){v=l;w=8;break}}if((w|0)==8)$n(v);else if((w|0)==28){u=d;return q|0}return 0}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=Ia,r=Ia,s=Ia,t=0,u=0,v=0,w=0,x=0;c=f[b>>2]|0;b=a+4|0;d=f[b>>2]|0;e=(d|0)==0;a:do if(!e){g=d+-1|0;h=(g&d|0)==0;if(!h)if(c>>>0<d>>>0)i=c;else i=(c>>>0)%(d>>>0)|0;else i=g&c;j=f[(f[a>>2]|0)+(i<<2)>>2]|0;if((j|0)!=0?(k=f[j>>2]|0,(k|0)!=0):0){if(h){h=k;while(1){j=f[h+4>>2]|0;if(!((j|0)==(c|0)|(j&g|0)==(i|0))){l=i;break a}if((f[h+8>>2]|0)==(c|0)){m=h;break}h=f[h>>2]|0;if(!h){l=i;break a}}o=m+12|0;return o|0}h=k;while(1){g=f[h+4>>2]|0;if((g|0)!=(c|0)){if(g>>>0<d>>>0)p=g;else p=(g>>>0)%(d>>>0)|0;if((p|0)!=(i|0)){l=i;break a}}if((f[h+8>>2]|0)==(c|0)){m=h;break}h=f[h>>2]|0;if(!h){l=i;break a}}o=m+12|0;return o|0}else l=i}else l=0;while(0);i=wk(16)|0;f[i+8>>2]=c;f[i+12>>2]=0;f[i+4>>2]=c;f[i>>2]=0;p=a+12|0;q=_(((f[p>>2]|0)+1|0)>>>0);r=_(d>>>0);s=_(n[a+16>>2]);do if(e|_(s*r)<q){h=d<<1|(d>>>0<3|(d+-1&d|0)!=0)&1;k=~~_(V(_(q/s)))>>>0;dg(a,h>>>0<k>>>0?k:h);h=f[b>>2]|0;k=h+-1|0;if(!(k&h)){t=h;u=k&c;break}if(c>>>0<h>>>0){t=h;u=c}else{t=h;u=(c>>>0)%(h>>>0)|0}}else{t=d;u=l}while(0);l=(f[a>>2]|0)+(u<<2)|0;u=f[l>>2]|0;if(!u){d=a+8|0;f[i>>2]=f[d>>2];f[d>>2]=i;f[l>>2]=d;d=f[i>>2]|0;if(d|0){l=f[d+4>>2]|0;d=t+-1|0;if(d&t)if(l>>>0<t>>>0)v=l;else v=(l>>>0)%(t>>>0)|0;else v=l&d;w=(f[a>>2]|0)+(v<<2)|0;x=33}}else{f[i>>2]=f[u>>2];w=u;x=33}if((x|0)==33)f[w>>2]=i;f[p>>2]=(f[p>>2]|0)+1;m=i;o=m+12|0;return o|0}function fd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0;e=c+8|0;g=f[e+4>>2]|0;h=c+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if(!((g|0)>(k|0)|((g|0)==(k|0)?(f[e>>2]|0)>>>0>j>>>0:0))){l=0;return l|0}e=b[(f[c>>2]|0)+j>>0]|0;g=vl(j|0,k|0,1,0)|0;k=h;f[k>>2]=g;f[k+4>>2]=H;do switch(e<<24>>24){case 1:{l=Ge(a,c,d)|0;return l|0}case 2:{l=Ge(a,c,d)|0;return l|0}case 3:{l=Ge(a,c,d)|0;return l|0}case 4:{l=Ge(a,c,d)|0;return l|0}case 5:{l=Ge(a,c,d)|0;return l|0}case 6:{l=Ge(a,c,d)|0;return l|0}case 7:{l=Ge(a,c,d)|0;return l|0}case 8:{l=Ge(a,c,d)|0;return l|0}case 9:{l=Fe(a,c,d)|0;return l|0}case 10:{l=Ee(a,c,d)|0;return l|0}case 11:{l=De(a,c,d)|0;return l|0}case 12:{l=Ce(a,c,d)|0;return l|0}case 13:{l=Be(a,c,d)|0;return l|0}case 14:{l=Ae(a,c,d)|0;return l|0}case 15:{l=Ae(a,c,d)|0;return l|0}case 16:{l=Ae(a,c,d)|0;return l|0}case 17:{l=Ae(a,c,d)|0;return l|0}case 18:{l=Ae(a,c,d)|0;return l|0}default:{l=0;return l|0}}while(0);return 0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;e=b+12|0;g=f[e>>2]|0;h=(f[c>>2]|0)-g|0;i=c+4|0;j=(f[i>>2]|0)-g|0;k=c;f[k>>2]=h;f[k+4>>2]=j;k=(h|0)>-1;l=(j|0)>-1;m=f[e>>2]|0;if(((l?j:0-j|0)+(k?h:0-h|0)|0)>(m|0)){if(k)if(!l)if((h|0)<1){n=-1;o=-1}else p=6;else{n=1;o=1}else if((j|0)<1){n=-1;o=-1}else p=6;if((p|0)==6){n=(h|0)>0?1:-1;o=(j|0)>0?1:-1}l=W(n,m)|0;k=W(o,m)|0;q=(h<<1)-l|0;f[c>>2]=q;r=(j<<1)-k|0;f[i>>2]=r;if((W(n,o)|0)>-1){o=0-r|0;f[c>>2]=o;s=o;t=0-q|0}else{f[c>>2]=r;s=r;t=q}q=(s+l|0)/2|0;f[c>>2]=q;c=(t+k|0)/2|0;f[i>>2]=c;u=0;v=q;w=c;x=f[e>>2]|0}else{u=1;v=h;w=j;x=m}m=(f[d>>2]|0)+v|0;f[a>>2]=m;v=(f[d+4>>2]|0)+w|0;w=a+4|0;f[w>>2]=v;if((x|0)>=(m|0))if((m|0)<(0-x|0))y=(f[b+4>>2]|0)+m|0;else y=m;else y=m-(f[b+4>>2]|0)|0;f[a>>2]=y;if((x|0)>=(v|0))if((v|0)<(0-x|0))z=(f[b+4>>2]|0)+v|0;else z=v;else z=v-(f[b+4>>2]|0)|0;f[w>>2]=z;if(u){A=y;B=z;C=A+g|0;D=B+g|0;E=a;F=E;f[F>>2]=C;G=E+4|0;H=G;f[H>>2]=D;return}if((y|0)>-1)if((z|0)<=-1)if((y|0)<1){I=-1;J=-1}else p=24;else{I=1;J=1}else if((z|0)<1){I=-1;J=-1}else p=24;if((p|0)==24){I=(y|0)>0?1:-1;J=(z|0)>0?1:-1}p=W(I,x)|0;u=W(J,x)|0;x=(y<<1)-p|0;f[a>>2]=x;y=(z<<1)-u|0;f[w>>2]=y;if((W(I,J)|0)>-1){J=0-y|0;f[a>>2]=J;K=J;L=0-x|0}else{f[a>>2]=y;K=y;L=x}x=(K+p|0)/2|0;f[a>>2]=x;p=(L+u|0)/2|0;f[w>>2]=p;A=x;B=p;C=A+g|0;D=B+g|0;E=a;F=E;f[F>>2]=C;G=E+4|0;H=G;f[H>>2]=D;return}function hd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=a+8|0;e=f[d>>2]|0;switch(f[e+28>>2]|0){case 2:{g=b[e+24>>0]|0;h=g<<24>>24;i=Ho((h|0)>-1?h:-1)|0;j=f[a+16>>2]|0;if(!(f[j+80>>2]|0))k=0;else k=(f[f[j>>2]>>2]|0)+(f[j+48>>2]|0)|0;a:do if(c|0){if(g<<24>>24<=0){Bf(f[f[e+64>>2]>>2]|0,i|0,h|0)|0;if((c|0)==1)break;j=0;l=1;while(1){j=j+h|0;Bf((f[f[(f[d>>2]|0)+64>>2]>>2]|0)+j|0,i|0,h|0)|0;l=l+1|0;if((l|0)==(c|0))break a}}l=0;j=0;while(1){m=0;n=j;while(1){b[i+m>>0]=f[k+(n<<2)>>2];m=m+1|0;if((m|0)==(h|0))break;else n=n+1|0}Bf((f[f[(f[d>>2]|0)+64>>2]>>2]|0)+j|0,i|0,h|0)|0;l=l+1|0;if((l|0)==(c|0))break;else j=j+h|0}}while(0);Io(i);o=1;return o|0}case 1:{i=b[e+24>>0]|0;h=i<<24>>24;k=Ho((h|0)>-1?h:-1)|0;g=f[a+16>>2]|0;if(!(f[g+80>>2]|0))p=0;else p=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;b:do if(c|0){if(i<<24>>24<=0){Bf(f[f[e+64>>2]>>2]|0,k|0,h|0)|0;if((c|0)==1)break;g=0;j=1;while(1){g=g+h|0;Bf((f[f[(f[d>>2]|0)+64>>2]>>2]|0)+g|0,k|0,h|0)|0;j=j+1|0;if((j|0)==(c|0))break b}}j=0;g=0;while(1){l=0;n=g;while(1){b[k+l>>0]=f[p+(n<<2)>>2];l=l+1|0;if((l|0)==(h|0))break;else n=n+1|0}Bf((f[f[(f[d>>2]|0)+64>>2]>>2]|0)+g|0,k|0,h|0)|0;j=j+1|0;if((j|0)==(c|0))break;else g=g+h|0}}while(0);Io(k);o=1;return o|0}case 4:{_f(a,c);o=1;return o|0}case 3:{_f(a,c);o=1;return o|0}case 6:{$f(a,c);o=1;return o|0}case 5:{$f(a,c);o=1;return o|0}default:{o=0;return o|0}}return 0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=f[b>>2]|0;g=f[b+4>>2]|0;h=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-g|0;c=e;if((h|0)<=0){i=d+4|0;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}if(!g){e=d+4|0;m=h;n=e;o=f[e>>2]|0;p=c}else{e=32-g|0;q=(h|0)<(e|0)?h:e;r=-1>>>(e-q|0)&-1<<g&f[c>>2];e=d+4|0;s=f[e>>2]|0;t=32-s|0;u=t>>>0<q>>>0?t:q;v=f[d>>2]|0;w=f[v>>2]&~(-1>>>(t-u|0)&-1<<s);f[v>>2]=w;s=f[e>>2]|0;f[v>>2]=w|(s>>>0>g>>>0?r<<s-g:r>>>(g-s|0));s=(f[e>>2]|0)+u|0;w=v+(s>>>5<<2)|0;f[d>>2]=w;v=s&31;f[e>>2]=v;s=q-u|0;if((s|0)>0){f[w>>2]=f[w>>2]&~(-1>>>(32-s|0))|r>>>(u+g|0);f[e>>2]=s;x=s}else x=v;v=c+4|0;f[b>>2]=v;m=h-q|0;n=e;o=x;p=v}v=32-o|0;x=-1<<o;if((m|0)>31){o=~x;e=f[d>>2]|0;q=~m;h=m+((q|0)>-64?q:-64)+32|0;q=(h>>>5)+1|0;c=m+-32-(h&-32)|0;h=m;s=p;g=f[e>>2]|0;u=e;while(1){r=f[s>>2]|0;w=g&o;f[u>>2]=w;f[u>>2]=r<<f[n>>2]|w;u=u+4|0;g=f[u>>2]&x|r>>>v;f[u>>2]=g;if((h|0)<=63)break;else{h=h+-32|0;s=s+4|0}}s=p+(q<<2)|0;f[b>>2]=s;f[d>>2]=e+(q<<2);y=c;z=s}else{y=m;z=p}if((y|0)<=0){i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}p=f[z>>2]&-1>>>(32-y|0);z=(v|0)<(y|0)?v:y;m=f[d>>2]|0;s=f[m>>2]&~(-1<<f[n>>2]&-1>>>(v-z|0));f[m>>2]=s;f[m>>2]=p<<f[n>>2]|s;s=(f[n>>2]|0)+z|0;v=m+(s>>>5<<2)|0;f[d>>2]=v;f[n>>2]=s&31;s=y-z|0;if((s|0)<=0){i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}f[v>>2]=f[v>>2]&~(-1>>>(32-s|0))|p>>>z;f[n>>2]=s;i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[b>>2]|0;g=b+4|0;h=f[g>>2]|0;i=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-h|0;c=e;if((i|0)<=0){j=d+4|0;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}if(!h){e=d+4|0;n=i;o=e;p=c;q=f[e>>2]|0}else{e=32-h|0;r=(i|0)<(e|0)?i:e;s=-1>>>(e-r|0)&-1<<h&f[c>>2];c=d+4|0;h=f[c>>2]|0;e=32-h|0;t=e>>>0<r>>>0?e:r;u=f[d>>2]|0;v=f[u>>2]&~(-1>>>(e-t|0)&-1<<h);f[u>>2]=v;h=f[c>>2]|0;e=f[g>>2]|0;f[u>>2]=(h>>>0>e>>>0?s<<h-e:s>>>(e-h|0))|v;v=(f[c>>2]|0)+t|0;h=u+(v>>>5<<2)|0;f[d>>2]=h;u=v&31;f[c>>2]=u;v=r-t|0;if((v|0)>0){e=f[h>>2]&~(-1>>>(32-v|0));f[h>>2]=e;f[h>>2]=s>>>((f[g>>2]|0)+t|0)|e;f[c>>2]=v;w=v}else w=u;u=(f[b>>2]|0)+4|0;f[b>>2]=u;n=i-r|0;o=c;p=u;q=w}w=32-q|0;u=-1<<q;if((n|0)>31){q=~u;c=~n;r=n+((c|0)>-64?c:-64)+32&-32;c=n;i=p;while(1){v=f[i>>2]|0;e=f[d>>2]|0;t=f[e>>2]&q;f[e>>2]=t;f[e>>2]=v<<f[o>>2]|t;t=e+4|0;f[d>>2]=t;f[t>>2]=f[t>>2]&u|v>>>w;i=(f[b>>2]|0)+4|0;f[b>>2]=i;if((c|0)<=63)break;else c=c+-32|0}x=n+-32-r|0;y=i}else{x=n;y=p}if((x|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}p=f[y>>2]&-1>>>(32-x|0);y=(w|0)<(x|0)?w:x;n=f[d>>2]|0;i=f[n>>2]&~(-1<<f[o>>2]&-1>>>(w-y|0));f[n>>2]=i;f[n>>2]=p<<f[o>>2]|i;i=(f[o>>2]|0)+y|0;w=n+(i>>>5<<2)|0;f[d>>2]=w;f[o>>2]=i&31;i=x-y|0;if((i|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}f[w>>2]=f[w>>2]&~(-1>>>(32-i|0))|p>>>y;f[o>>2]=i;j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}function kd(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;i=u;u=u+32|0;j=i+16|0;k=i+12|0;l=i;m=c+24|0;n=b[m>>0]|0;o=n<<24>>24;p=f[a+80>>2]|0;a=W(p,o)|0;q=f[c+28>>2]|0;if((q|0)==(e|0)|(q|0)==(g|0)?b[c+84>>0]|0:0){g=(f[f[c>>2]>>2]|0)+(f[c+48>>2]|0)|0;We(h,g,g+(a<<1)|0);r=1;u=i;return r|0}f[l>>2]=0;g=l+4|0;f[g>>2]=0;q=l+8|0;f[q>>2]=0;do if(n<<24>>24)if(n<<24>>24<0)$n(l);else{e=o<<1;s=wk(e)|0;f[l>>2]=s;t=s+(o<<1)|0;f[q>>2]=t;oh(s|0,0,e|0)|0;f[g>>2]=t;break}while(0);We(h,0,0+(a<<1)|0);a:do if(!p)v=1;else{a=c+84|0;q=c+68|0;if(n<<24>>24<=0){t=0;while(1){if(!(b[a>>0]|0))w=f[(f[q>>2]|0)+(t<<2)>>2]|0;else w=t;e=f[l>>2]|0;f[k>>2]=w;s=b[m>>0]|0;f[j>>2]=f[k>>2];if(!(Ab(c,j,s,e)|0)){v=0;break a}t=t+1|0;if(t>>>0>=p>>>0){v=1;break a}}}t=0;e=0;while(1){if(!(b[a>>0]|0))x=f[(f[q>>2]|0)+(e<<2)>>2]|0;else x=e;s=f[l>>2]|0;f[k>>2]=x;y=b[m>>0]|0;f[j>>2]=f[k>>2];if(!(Ab(c,j,y,s)|0)){v=0;break a}s=f[l>>2]|0;y=f[h>>2]|0;z=0;A=t;while(1){d[y+(A<<1)>>1]=d[s+(z<<1)>>1]|0;z=z+1|0;if((z|0)==(o|0))break;else A=A+1|0}e=e+1|0;if(e>>>0>=p>>>0){v=1;break}else t=t+o|0}}while(0);o=f[l>>2]|0;if(o|0){f[g>>2]=o;Ko(o)}r=v;u=i;return r|0}function ld(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;i=u;u=u+32|0;j=i+16|0;k=i+12|0;l=i;m=c+24|0;n=b[m>>0]|0;o=n<<24>>24;p=f[a+80>>2]|0;a=W(p,o)|0;q=f[c+28>>2]|0;if((q|0)==(e|0)|(q|0)==(g|0)?b[c+84>>0]|0:0){g=(f[f[c>>2]>>2]|0)+(f[c+48>>2]|0)|0;We(h,g,g+(a<<1)|0);r=1;u=i;return r|0}f[l>>2]=0;g=l+4|0;f[g>>2]=0;q=l+8|0;f[q>>2]=0;do if(n<<24>>24)if(n<<24>>24<0)$n(l);else{e=o<<1;s=wk(e)|0;f[l>>2]=s;t=s+(o<<1)|0;f[q>>2]=t;oh(s|0,0,e|0)|0;f[g>>2]=t;break}while(0);We(h,0,0+(a<<1)|0);a:do if(!p)v=1;else{a=c+84|0;q=c+68|0;if(n<<24>>24<=0){t=0;while(1){if(!(b[a>>0]|0))w=f[(f[q>>2]|0)+(t<<2)>>2]|0;else w=t;e=f[l>>2]|0;f[k>>2]=w;s=b[m>>0]|0;f[j>>2]=f[k>>2];if(!(Bb(c,j,s,e)|0)){v=0;break a}t=t+1|0;if(t>>>0>=p>>>0){v=1;break a}}}t=0;e=0;while(1){if(!(b[a>>0]|0))x=f[(f[q>>2]|0)+(e<<2)>>2]|0;else x=e;s=f[l>>2]|0;f[k>>2]=x;y=b[m>>0]|0;f[j>>2]=f[k>>2];if(!(Bb(c,j,y,s)|0)){v=0;break a}s=f[l>>2]|0;y=f[h>>2]|0;z=0;A=t;while(1){d[y+(A<<1)>>1]=d[s+(z<<1)>>1]|0;z=z+1|0;if((z|0)==(o|0))break;else A=A+1|0}e=e+1|0;if(e>>>0>=p>>>0){v=1;break}else t=t+o|0}}while(0);o=f[l>>2]|0;if(o|0){f[g>>2]=o;Ko(o)}r=v;u=i;return r|0}function md(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;h=u;u=u+32|0;i=h+16|0;j=h+12|0;k=h;l=c+24|0;m=b[l>>0]|0;n=m<<24>>24;o=f[a+80>>2]|0;a=W(o,n)|0;p=f[c+28>>2]|0;if((p|0)==(d|0)|(p|0)==(e|0)?b[c+84>>0]|0:0){e=(f[f[c>>2]>>2]|0)+(f[c+48>>2]|0)|0;Ye(g,e,e+(a<<2)|0);q=1;u=h;return q|0}f[k>>2]=0;e=k+4|0;f[e>>2]=0;p=k+8|0;f[p>>2]=0;do if(m<<24>>24)if(m<<24>>24<0)$n(k);else{d=n<<2;r=wk(d)|0;f[k>>2]=r;s=r+(n<<2)|0;f[p>>2]=s;oh(r|0,0,d|0)|0;f[e>>2]=s;break}while(0);Ye(g,0,0+(a<<2)|0);a:do if(!o)t=1;else{a=c+84|0;p=c+68|0;if(m<<24>>24<=0){s=0;while(1){if(!(b[a>>0]|0))v=f[(f[p>>2]|0)+(s<<2)>>2]|0;else v=s;d=f[k>>2]|0;f[j>>2]=v;r=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Cb(c,i,r,d)|0)){t=0;break a}s=s+1|0;if(s>>>0>=o>>>0){t=1;break a}}}s=0;d=0;while(1){if(!(b[a>>0]|0))w=f[(f[p>>2]|0)+(d<<2)>>2]|0;else w=d;r=f[k>>2]|0;f[j>>2]=w;x=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Cb(c,i,x,r)|0)){t=0;break a}r=f[k>>2]|0;x=f[g>>2]|0;y=0;z=s;while(1){f[x+(z<<2)>>2]=f[r+(y<<2)>>2];y=y+1|0;if((y|0)==(n|0))break;else z=z+1|0}d=d+1|0;if(d>>>0>=o>>>0){t=1;break}else s=s+n|0}}while(0);n=f[k>>2]|0;if(n|0){f[e>>2]=n;Ko(n)}q=t;u=h;return q|0}function nd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+32|0;d=c+16|0;e=c;f[d>>2]=0;do if((j[b+38>>1]|0)<514){g=b+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=b+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,4,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){o=0;u=c;return o|0}else{i=(f[b>>2]|0)+m|0;m=h[i>>0]|h[i+1>>0]<<8|h[i+2>>0]<<16|h[i+3>>0]<<24;f[d>>2]=m;i=g;f[i>>2]=n;f[i+4>>2]=l;p=m;break}}else if(zh(d,b)|0){p=f[d>>2]|0;break}else{o=0;u=c;return o|0}while(0);if(!p){o=0;u=c;return o|0}m=a+76|0;td(m,p,0);ym(e);if(rd(e,b)|0){if(f[d>>2]|0){p=1;l=0;do{p=p^((pi(e)|0)^1);i=(f[m>>2]|0)+(l>>>5<<2)|0;n=1<<(l&31);if(p)q=f[i>>2]|n;else q=f[i>>2]&~n;f[i>>2]=q;l=l+1|0}while(l>>>0<(f[d>>2]|0)>>>0)}d=b+8|0;l=f[d>>2]|0;q=f[d+4>>2]|0;d=b+16|0;p=d;m=f[p>>2]|0;e=f[p+4>>2]|0;p=vl(m|0,e|0,4,0)|0;i=H;if(((!((q|0)<(i|0)|(q|0)==(i|0)&l>>>0<p>>>0)?(n=f[b>>2]|0,b=n+m|0,g=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24,b=d,f[b>>2]=p,f[b+4>>2]=i,i=vl(m|0,e|0,8,0)|0,e=H,!((q|0)<(e|0)|(q|0)==(e|0)&l>>>0<i>>>0)):0)?(l=n+p|0,p=h[l>>0]|h[l+1>>0]<<8|h[l+2>>0]<<16|h[l+3>>0]<<24,l=d,f[l>>2]=i,f[l+4>>2]=e,(g|0)<=(p|0)):0)?(f[a+12>>2]=g,f[a+16>>2]=p,e=wl(p|0,((p|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0,g=H,g>>>0<0|(g|0)==0&e>>>0<2147483647):0){g=e+1|0;f[a+20>>2]=g;e=(g|0)/2|0;p=a+24|0;f[p>>2]=e;f[a+28>>2]=0-e;if(!(g&1)){f[p>>2]=e+-1;r=1}else r=1}else r=0}else r=0;o=r;u=c;return o|0}function od(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;h=u;u=u+32|0;i=h+16|0;j=h+12|0;k=h;l=c+24|0;m=b[l>>0]|0;n=m<<24>>24;o=f[a+80>>2]|0;a=W(o,n)|0;p=f[c+28>>2]|0;if((p|0)==(d|0)|(p|0)==(e|0)?b[c+84>>0]|0:0){e=(f[f[c>>2]>>2]|0)+(f[c+48>>2]|0)|0;Ye(g,e,e+(a<<2)|0);q=1;u=h;return q|0}f[k>>2]=0;e=k+4|0;f[e>>2]=0;p=k+8|0;f[p>>2]=0;do if(m<<24>>24)if(m<<24>>24<0)$n(k);else{d=n<<2;r=wk(d)|0;f[k>>2]=r;s=r+(n<<2)|0;f[p>>2]=s;oh(r|0,0,d|0)|0;f[e>>2]=s;break}while(0);Ye(g,0,0+(a<<2)|0);a:do if(!o)t=1;else{a=c+84|0;p=c+68|0;if(m<<24>>24<=0){s=0;while(1){if(!(b[a>>0]|0))v=f[(f[p>>2]|0)+(s<<2)>>2]|0;else v=s;d=f[k>>2]|0;f[j>>2]=v;r=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Db(c,i,r,d)|0)){t=0;break a}s=s+1|0;if(s>>>0>=o>>>0){t=1;break a}}}s=0;d=0;while(1){if(!(b[a>>0]|0))w=f[(f[p>>2]|0)+(d<<2)>>2]|0;else w=d;r=f[k>>2]|0;f[j>>2]=w;x=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Db(c,i,x,r)|0)){t=0;break a}r=f[k>>2]|0;x=f[g>>2]|0;y=0;z=s;while(1){f[x+(z<<2)>>2]=f[r+(y<<2)>>2];y=y+1|0;if((y|0)==(n|0))break;else z=z+1|0}d=d+1|0;if(d>>>0>=o>>>0){t=1;break}else s=s+n|0}}while(0);n=f[k>>2]|0;if(n|0){f[e>>2]=n;Ko(n)}q=t;u=h;return q|0}function pd(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;h=u;u=u+32|0;i=h+16|0;j=h+12|0;k=h;l=c+24|0;m=b[l>>0]|0;n=m<<24>>24;o=f[a+80>>2]|0;a=W(o,n)|0;p=f[c+28>>2]|0;if((p|0)==(d|0)|(p|0)==(e|0)?b[c+84>>0]|0:0){e=(f[f[c>>2]>>2]|0)+(f[c+48>>2]|0)|0;rf(g,e,e+a|0);q=1;u=h;return q|0}f[k>>2]=0;e=k+4|0;f[e>>2]=0;p=k+8|0;f[p>>2]=0;if(m<<24>>24){if(m<<24>>24<0)$n(k);d=wk(n)|0;f[e>>2]=d;f[k>>2]=d;f[p>>2]=d+n;p=n;r=d;do{b[r>>0]=0;r=(f[e>>2]|0)+1|0;f[e>>2]=r;p=p+-1|0}while((p|0)!=0)}rf(g,0,0+a|0);a:do if(!o)s=1;else{a=c+84|0;p=c+68|0;if(m<<24>>24<=0){r=0;while(1){if(!(b[a>>0]|0))t=f[(f[p>>2]|0)+(r<<2)>>2]|0;else t=r;d=f[k>>2]|0;f[j>>2]=t;v=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Eb(c,i,v,d)|0)){s=0;break a}r=r+1|0;if(r>>>0>=o>>>0){s=1;break a}}}r=0;d=0;while(1){if(!(b[a>>0]|0))w=f[(f[p>>2]|0)+(d<<2)>>2]|0;else w=d;v=f[k>>2]|0;f[j>>2]=w;x=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Eb(c,i,x,v)|0)){s=0;break a}v=0;x=r;while(1){b[(f[g>>2]|0)+x>>0]=b[(f[k>>2]|0)+v>>0]|0;v=v+1|0;if((v|0)==(n|0))break;else x=x+1|0}d=d+1|0;if(d>>>0>=o>>>0){s=1;break}else r=r+n|0}}while(0);n=f[k>>2]|0;if(n|0){f[e>>2]=n;Ko(n)}q=s;u=h;return q|0}function qd(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;h=u;u=u+32|0;i=h+16|0;j=h+12|0;k=h;l=c+24|0;m=b[l>>0]|0;n=m<<24>>24;o=f[a+80>>2]|0;a=W(o,n)|0;p=f[c+28>>2]|0;if((p|0)==(d|0)|(p|0)==(e|0)?b[c+84>>0]|0:0){e=(f[f[c>>2]>>2]|0)+(f[c+48>>2]|0)|0;rf(g,e,e+a|0);q=1;u=h;return q|0}f[k>>2]=0;e=k+4|0;f[e>>2]=0;p=k+8|0;f[p>>2]=0;if(m<<24>>24){if(m<<24>>24<0)$n(k);d=wk(n)|0;f[e>>2]=d;f[k>>2]=d;f[p>>2]=d+n;p=n;r=d;do{b[r>>0]=0;r=(f[e>>2]|0)+1|0;f[e>>2]=r;p=p+-1|0}while((p|0)!=0)}rf(g,0,0+a|0);a:do if(!o)s=1;else{a=c+84|0;p=c+68|0;if(m<<24>>24<=0){r=0;while(1){if(!(b[a>>0]|0))t=f[(f[p>>2]|0)+(r<<2)>>2]|0;else t=r;d=f[k>>2]|0;f[j>>2]=t;v=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Fb(c,i,v,d)|0)){s=0;break a}r=r+1|0;if(r>>>0>=o>>>0){s=1;break a}}}r=0;d=0;while(1){if(!(b[a>>0]|0))w=f[(f[p>>2]|0)+(d<<2)>>2]|0;else w=d;v=f[k>>2]|0;f[j>>2]=w;x=b[l>>0]|0;f[i>>2]=f[j>>2];if(!(Fb(c,i,x,v)|0)){s=0;break a}v=0;x=r;while(1){b[(f[g>>2]|0)+x>>0]=b[(f[k>>2]|0)+v>>0]|0;v=v+1|0;if((v|0)==(n|0))break;else x=x+1|0}d=d+1|0;if(d>>>0>=o>>>0){s=1;break}else r=r+n|0}}while(0);n=f[k>>2]|0;if(n|0){f[e>>2]=n;Ko(n)}q=s;u=h;return q|0}function rd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+16|0;e=d;g=c+8|0;i=g;k=f[i+4>>2]|0;l=c+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;if(!((k|0)>(o|0)|((k|0)==(o|0)?(f[i>>2]|0)>>>0>n>>>0:0))){p=0;u=d;return p|0}b[a+12>>0]=b[(f[c>>2]|0)+n>>0]|0;n=l;i=f[n>>2]|0;o=f[n+4>>2]|0;n=vl(i|0,o|0,1,0)|0;k=l;f[k>>2]=n;f[k+4>>2]=H;if((j[c+38>>1]|0)<514){k=g;m=f[k>>2]|0;q=f[k+4>>2]|0;k=vl(i|0,o|0,5,0)|0;o=H;if((q|0)<(o|0)|(q|0)==(o|0)&m>>>0<k>>>0)r=0;else{i=(f[c>>2]|0)+n|0;n=h[i>>0]|h[i+1>>0]<<8|h[i+2>>0]<<16|h[i+3>>0]<<24;f[e>>2]=n;i=l;f[i>>2]=k;f[i+4>>2]=o;s=m;t=q;v=k;w=o;x=n;y=7}}else if(zh(e,c)|0){n=g;g=l;s=f[n>>2]|0;t=f[n+4>>2]|0;v=f[g>>2]|0;w=f[g+4>>2]|0;x=f[e>>2]|0;y=7}else r=0;a:do if((y|0)==7){e=wl(s|0,t|0,v|0,w|0)|0;g=H;if(!((g|0)<0|(g|0)==0&e>>>0<x>>>0)?(e=(f[c>>2]|0)+v|0,(x|0)>=1):0){f[a>>2]=e;g=x+-1|0;n=e+g|0;switch((h[n>>0]|0)>>>6&3){case 0:{f[a+4>>2]=g;g=b[n>>0]&63;n=a+8|0;f[n>>2]=g;z=n;A=g;break}case 1:{if((x|0)<2){r=0;break a}f[a+4>>2]=x+-2;g=e+x+-2|0;n=(h[g+1>>0]|0)<<8&16128|(h[g>>0]|0);g=a+8|0;f[g>>2]=n;z=g;A=n;break}case 2:{if((x|0)<3){r=0;break a}f[a+4>>2]=x+-3;n=e+x+-3|0;e=(h[n+1>>0]|0)<<8|(h[n>>0]|0)|(h[n+2>>0]|0)<<16&4128768;n=a+8|0;f[n>>2]=e;z=n;A=e;break}default:{r=0;break a}}e=A+4096|0;f[z>>2]=e;if(e>>>0<1048576){e=vl(v|0,w|0,x|0,0)|0;n=l;f[n>>2]=e;f[n+4>>2]=H;r=1}else r=0}else r=0}while(0);p=r;u=d;return p|0}function sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+32|0;g=e+8|0;i=e;switch(d|0){case 2:{d=f[b+12>>2]|0;j=f[b+4>>2]|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;a:do if((c|0)==-2){f[i>>2]=0;k=0}else{l=f[(f[(f[j+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((Ka[f[(f[j>>2]|0)+8>>2]&127](j)|0)==1){Cd(i,j,c,d,g,((h[j+36>>0]|0)<<8|(h[j+37>>0]|0))&65535);m=f[i>>2]|0;if(!m){f[i>>2]=0;break}else{k=m;break a}}while(0);m=wk(24)|0;f[m+4>>2]=l;n=m+8|0;f[n>>2]=f[g>>2];f[n+4>>2]=f[g+4>>2];f[n+8>>2]=f[g+8>>2];f[n+12>>2]=f[g+12>>2];f[m>>2]=2604;n=m;f[i>>2]=n;k=n}while(0);f[a>>2]=k;u=e;return}case 3:{k=f[b+12>>2]|0;j=f[b+4>>2]|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;b:do if((c|0)==-2){f[i>>2]=0;o=0}else{b=f[(f[(f[j+4>>2]|0)+8>>2]|0)+(k<<2)>>2]|0;do if((Ka[f[(f[j>>2]|0)+8>>2]&127](j)|0)==1){Bd(i,j,c,k,g,((h[j+36>>0]|0)<<8|(h[j+37>>0]|0))&65535);d=f[i>>2]|0;if(!d){f[i>>2]=0;break}else{o=d;break b}}while(0);l=wk(24)|0;f[l+4>>2]=b;d=l+8|0;f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];f[d+12>>2]=f[g+12>>2];f[l>>2]=2660;d=l;f[i>>2]=d;o=d}while(0);f[a>>2]=o;u=e;return}default:{f[a>>2]=0;u=e;return}}}function td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=u;u=u+32|0;e=d+8|0;g=d;h=a+4|0;i=f[h>>2]|0;if(i>>>0>=b>>>0){f[h>>2]=b;u=d;return}j=a+8|0;k=f[j>>2]|0;l=k<<5;m=b-i|0;if(l>>>0<m>>>0|i>>>0>(l-m|0)>>>0){f[e>>2]=0;n=e+4|0;f[n>>2]=0;o=e+8|0;f[o>>2]=0;if((b|0)<0)$n(a);p=k<<6;k=b+31&-32;vg(e,l>>>0<1073741823?(p>>>0<k>>>0?k:p):2147483647);p=f[h>>2]|0;f[n>>2]=p+m;k=f[a>>2]|0;l=k;q=f[e>>2]|0;r=(l+(p>>>5<<2)-k<<3)+(p&31)|0;if((r|0)>0){p=r>>>5;Rj(q|0,k|0,p<<2|0)|0;k=r&31;r=q+(p<<2)|0;s=r;if(!k){t=0;v=s}else{w=-1>>>(32-k|0);f[r>>2]=f[r>>2]&~w|f[l+(p<<2)>>2]&w;t=k;v=s}}else{t=0;v=q}f[g>>2]=v;f[g+4>>2]=t;t=g;g=f[t>>2]|0;v=f[t+4>>2]|0;t=f[a>>2]|0;f[a>>2]=f[e>>2];f[e>>2]=t;e=f[h>>2]|0;f[h>>2]=f[n>>2];f[n>>2]=e;e=f[j>>2]|0;f[j>>2]=f[o>>2];f[o>>2]=e;if(t|0)Ko(t);x=g;y=v}else{v=(f[a>>2]|0)+(i>>>5<<2)|0;f[h>>2]=b;x=v;y=i&31}if(!m){u=d;return}i=(y|0)==0;v=x;if(c){if(i){z=m;A=x;B=v}else{c=32-y|0;b=c>>>0>m>>>0?m:c;f[v>>2]=f[v>>2]|-1>>>(c-b|0)&-1<<y;c=v+4|0;z=m-b|0;A=c;B=c}c=z>>>5;oh(A|0,-1,c<<2|0)|0;A=z&31;z=B+(c<<2)|0;if(!A){u=d;return}f[z>>2]=f[z>>2]|-1>>>(32-A|0);u=d;return}else{if(i){C=m;D=x;E=v}else{x=32-y|0;i=x>>>0>m>>>0?m:x;f[v>>2]=f[v>>2]&~(-1>>>(x-i|0)&-1<<y);y=v+4|0;C=m-i|0;D=y;E=y}y=C>>>5;oh(D|0,0,y<<2|0)|0;D=C&31;C=E+(y<<2)|0;if(!D){u=d;return}f[C>>2]=f[C>>2]&~(-1>>>(32-D|0));u=d;return}}function ud(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+32|0;d=f[c>>2]|0;e=d+8|0;g=f[e+4>>2]|0;h=d+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if(!((g|0)>(k|0)|((g|0)==(k|0)?(f[e>>2]|0)>>>0>j>>>0:0))){l=0;return l|0}e=b[(f[d>>2]|0)+j>>0]|0;d=vl(j|0,k|0,1,0)|0;k=h;f[k>>2]=d;f[k+4>>2]=H;k=e&255;d=e<<24>>24==0;a:do if(!d){e=0;while(1){if(!(La[f[(f[a>>2]|0)+16>>2]&127](a,e)|0)){l=0;break}e=e+1|0;if(e>>>0>=k>>>0)break a}return l|0}while(0);e=a+8|0;h=f[e>>2]|0;j=f[a+12>>2]|0;b:do if((h|0)!=(j|0)){g=a+4|0;i=h;while(1){m=f[i>>2]|0;i=i+4|0;if(!(Ma[f[(f[m>>2]|0)+8>>2]&31](m,a,f[g>>2]|0)|0)){l=0;break}if((i|0)==(j|0))break b}return l|0}while(0);if(!d){j=0;do{h=f[(f[e>>2]|0)+(j<<2)>>2]|0;j=j+1|0;if(!(La[f[(f[h>>2]|0)+12>>2]&127](h,f[c>>2]|0)|0)){l=0;n=27;break}}while(j>>>0<k>>>0);if((n|0)==27)return l|0;if(!d){d=a+20|0;n=a+24|0;j=0;do{c=f[(f[e>>2]|0)+(j<<2)>>2]|0;h=Ka[f[(f[c>>2]|0)+24>>2]&127](c)|0;if((h|0)>0){c=0;do{i=f[(f[e>>2]|0)+(j<<2)>>2]|0;g=La[f[(f[i>>2]|0)+20>>2]&127](i,c)|0;i=f[d>>2]|0;m=(f[n>>2]|0)-i>>2;o=i;do if(g>>>0>=m>>>0){i=g+1|0;if(i>>>0>m>>>0){Eg(d,i-m|0);p=f[d>>2]|0;break}if(i>>>0<m>>>0){f[n>>2]=o+(i<<2);p=o}else p=o}else p=o;while(0);f[p+(g<<2)>>2]=j;c=c+1|0}while((c|0)!=(h|0))}j=j+1|0}while((j|0)!=(k|0))}}if(!(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)){l=0;return l|0}l=Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0;return l|0}function vd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=(c|0)==(a|0);b[c+12>>0]=d&1;if(d)return;d=c;while(1){e=d+8|0;g=f[e>>2]|0;h=g+12|0;if(b[h>>0]|0){i=24;break}j=f[g+8>>2]|0;c=f[j>>2]|0;if((c|0)==(g|0)){k=f[j+4>>2]|0;if(!k){i=7;break}l=k+12|0;if(!(b[l>>0]|0))m=l;else{i=7;break}}else{if(!c){i=16;break}l=c+12|0;if(!(b[l>>0]|0))m=l;else{i=16;break}}b[h>>0]=1;b[j+12>>0]=(j|0)==(a|0)&1;b[m>>0]=1;if((j|0)==(a|0)){i=24;break}else d=j}if((i|0)==7){a=g+8|0;if((f[g>>2]|0)==(d|0)){n=h;o=j}else{m=g+4|0;l=f[m>>2]|0;c=f[l>>2]|0;f[m>>2]=c;if(!c)p=j;else{f[c+8>>2]=g;p=f[a>>2]|0}f[l+8>>2]=p;p=f[a>>2]|0;f[((f[p>>2]|0)==(g|0)?p:p+4|0)>>2]=l;f[l>>2]=g;f[a>>2]=l;n=l+12|0;o=f[l+8>>2]|0}b[n>>0]=1;b[o+12>>0]=0;n=f[o>>2]|0;l=n+4|0;a=f[l>>2]|0;f[o>>2]=a;if(a|0)f[a+8>>2]=o;a=o+8|0;f[n+8>>2]=f[a>>2];p=f[a>>2]|0;f[((f[p>>2]|0)==(o|0)?p:p+4|0)>>2]=n;f[l>>2]=o;f[a>>2]=n;return}else if((i|0)==16){n=g+8|0;if((f[g>>2]|0)==(d|0)){a=d+4|0;o=f[a>>2]|0;f[g>>2]=o;if(!o)q=j;else{f[o+8>>2]=g;q=f[n>>2]|0}f[e>>2]=q;q=f[n>>2]|0;f[((f[q>>2]|0)==(g|0)?q:q+4|0)>>2]=d;f[a>>2]=g;f[n>>2]=d;r=d+12|0;s=f[d+8>>2]|0}else{r=h;s=j}b[r>>0]=1;b[s+12>>0]=0;r=s+4|0;j=f[r>>2]|0;h=f[j>>2]|0;f[r>>2]=h;if(h|0)f[h+8>>2]=s;h=s+8|0;f[j+8>>2]=f[h>>2];r=f[h>>2]|0;f[((f[r>>2]|0)==(s|0)?r:r+4|0)>>2]=j;f[j>>2]=s;f[h>>2]=j;return}else if((i|0)==24)return}function wd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/24|0;h=g+1|0;i=e;j=d;if(h>>>0>178956970)$n(a);d=a+8|0;k=((f[d>>2]|0)-e|0)/24|0;l=k<<1;m=k>>>0<89478485?(l>>>0<h>>>0?h:l):178956970;do if(m)if(m>>>0>178956970){l=qa(8)|0;Dm(l,13552);f[l>>2]=4908;ta(l|0,1128,105)}else{n=wk(m*24|0)|0;break}else n=0;while(0);l=n+(g*24|0)|0;h=n+(m*24|0)|0;f[l>>2]=1228;f[n+(g*24|0)+4>>2]=f[b+4>>2];m=n+(g*24|0)+8|0;f[m>>2]=0;k=n+(g*24|0)+12|0;f[k>>2]=0;o=n+(g*24|0)+16|0;f[o>>2]=0;p=f[b+8>>2]|0;q=(f[b+12>>2]|0)-p|0;r=q>>2;if(q|0){if(r>>>0>1073741823)$n(m);s=wk(q)|0;f[k>>2]=s;f[m>>2]=s;f[o>>2]=s+(r<<2);if((q|0)>0){Bf(s|0,p|0,q|0)|0;f[k>>2]=s+(q>>>2<<2)}}f[n+(g*24|0)+20>>2]=f[b+20>>2];b=l+24|0;if((j|0)!=(i|0)){g=j;j=l;do{f[j+-24>>2]=1228;f[j+-20>>2]=f[g+-20>>2];n=j+-16|0;q=g+-16|0;f[n>>2]=0;s=j+-12|0;f[s>>2]=0;k=j+-8|0;f[k>>2]=0;f[n>>2]=f[q>>2];n=g+-12|0;f[s>>2]=f[n>>2];s=g+-8|0;f[k>>2]=f[s>>2];f[s>>2]=0;f[n>>2]=0;f[q>>2]=0;f[j+-4>>2]=f[g+-4>>2];g=g+-24|0;j=j+-24|0}while((g|0)!=(i|0));i=f[a>>2]|0;g=f[c>>2]|0;q=i;f[a>>2]=j;f[c>>2]=b;f[d>>2]=h;if((g|0)==(q|0))t=i;else{j=g;do{j=j+-24|0;Pa[f[f[j>>2]>>2]&127](j)}while((j|0)!=(q|0));t=i}}else{f[a>>2]=l;f[c>>2]=b;f[d>>2]=h;t=e}if(!t)return;Ko(t);return}function xd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=u;u=u+144|0;g=e+136|0;h=e+32|0;i=e;j=f[(f[c+4>>2]|0)+44>>2]|0;k=wk(124)|0;f[k+4>>2]=0;f[k>>2]=3340;f[k+12>>2]=3364;f[k+100>>2]=0;f[k+104>>2]=0;f[k+108>>2]=0;l=k+16|0;m=l+80|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[k+112>>2]=j;f[k+116>>2]=d;f[k+120>>2]=0;n=k;o=h+4|0;f[o>>2]=3364;p=h+92|0;f[p>>2]=0;q=h+96|0;f[q>>2]=0;f[h+100>>2]=0;l=h+8|0;m=l+80|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));l=f[c+8>>2]|0;f[i>>2]=3364;c=i+4|0;m=c+4|0;f[m>>2]=0;f[m+4>>2]=0;f[m+8>>2]=0;f[m+12>>2]=0;f[m+16>>2]=0;f[m+20>>2]=0;f[c>>2]=l;m=((f[l+4>>2]|0)-(f[l>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Gf(i+8|0,m,g);Pa[f[(f[i>>2]|0)+8>>2]&127](i);f[h>>2]=f[c>>2];He(h+4|0,i)|0;f[h+36>>2]=l;f[h+40>>2]=d;f[h+44>>2]=j;f[h+48>>2]=k;mf(k,h);f[a>>2]=n;f[i>>2]=3364;n=f[i+20>>2]|0;if(n|0)Ko(n);n=f[i+8>>2]|0;if(n|0)Ko(n);n=f[p>>2]|0;if(n|0){f[q>>2]=n;Ko(n)}n=f[h+76>>2]|0;if(n|0){f[h+80>>2]=n;Ko(n)}n=f[h+64>>2]|0;if(n|0){f[h+68>>2]=n;Ko(n)}n=f[h+52>>2]|0;if(n|0){f[h+56>>2]=n;Ko(n)}f[o>>2]=3364;o=f[h+24>>2]|0;if(o|0)Ko(o);o=f[h+12>>2]|0;if(!o){u=e;return}Ko(o);u=e;return}function yd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;e=u;u=u+32|0;g=e+12|0;i=e;j=c+24|0;k=b[j>>0]|0;l=k<<24>>24;f[g>>2]=0;m=g+4|0;f[m>>2]=0;n=g+8|0;f[n>>2]=0;if(!(k<<24>>24))o=0;else{if(k<<24>>24<0)$n(g);k=wk(l)|0;f[m>>2]=k;f[g>>2]=k;f[n>>2]=k+l;n=l;l=k;do{b[l>>0]=0;l=(f[m>>2]|0)+1|0;f[m>>2]=l;n=n+-1|0}while((n|0)!=0);o=b[j>>0]|0}n=o<<24>>24;f[i>>2]=0;l=i+4|0;f[l>>2]=0;k=i+8|0;f[k>>2]=0;if(o<<24>>24){if(o<<24>>24<0)$n(i);o=wk(n)|0;f[l>>2]=o;f[i>>2]=o;f[k>>2]=o+n;k=n;n=o;do{b[n>>0]=0;n=(f[l>>2]|0)+1|0;f[l>>2]=n;k=k+-1|0}while((k|0)!=0)}k=c+80|0;if(!(f[k>>2]|0))p=f[i>>2]|0;else{n=c+48|0;o=c+40|0;q=c+64|0;r=a+48|0;a=0;do{s=f[g>>2]|0;t=n;v=f[t>>2]|0;w=f[t+4>>2]|0;t=o;x=f[t>>2]|0;y=Bk(x|0,f[t+4>>2]|0,a|0,0)|0;t=vl(y|0,H|0,v|0,w|0)|0;Bf(s|0,(f[f[c>>2]>>2]|0)+t|0,x|0)|0;if((b[j>>0]|0)>0?(b[f[i>>2]>>0]=(f[(f[r>>2]|0)+(d<<2)>>2]|0)+(h[s>>0]|0),(b[j>>0]|0)>1):0){s=1;do{b[(f[i>>2]|0)+s>>0]=(f[(f[r>>2]|0)+(s+d<<2)>>2]|0)+(h[(f[g>>2]|0)+s>>0]|0);s=s+1|0}while((s|0)<(b[j>>0]|0))}s=f[i>>2]|0;x=f[o>>2]|0;Bf((f[f[q>>2]>>2]|0)+(W(a,x)|0)|0,s|0,x|0)|0;a=a+1|0}while(a>>>0<(f[k>>2]|0)>>>0);p=s}if(p|0){f[l>>2]=p;Ko(p)}p=f[g>>2]|0;if(!p){u=e;return 1}f[m>>2]=p;Ko(p);u=e;return 1}function zd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=u;u=u+16|0;d=c;e=b+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=b+16|0;k=g;l=f[k>>2]|0;m=vl(l|0,f[k+4>>2]|0,4,0)|0;k=H;if((j|0)<(k|0)|(j|0)==(k|0)&i>>>0<m>>>0){n=0;u=c;return n|0}i=(f[b>>2]|0)+l|0;l=h[i>>0]|h[i+1>>0]<<8|h[i+2>>0]<<16|h[i+3>>0]<<24;i=g;f[i>>2]=m;f[i+4>>2]=k;if((l|0)<0){n=0;u=c;return n|0}td(a+76|0,l,0);ym(d);if(rd(d,b)|0){if((l|0)>0){k=a+76|0;i=1;m=0;do{i=i^((pi(d)|0)^1);j=(f[k>>2]|0)+(m>>>5<<2)|0;o=1<<(m&31);if(i)p=f[j>>2]|o;else p=f[j>>2]&~o;f[j>>2]=p;m=m+1|0}while((m|0)<(l|0))}l=e;e=f[l>>2]|0;m=f[l+4>>2]|0;l=g;p=f[l>>2]|0;i=f[l+4>>2]|0;l=vl(p|0,i|0,4,0)|0;k=H;if(((!((m|0)<(k|0)|(m|0)==(k|0)&e>>>0<l>>>0)?(d=f[b>>2]|0,b=d+p|0,j=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24,b=g,f[b>>2]=l,f[b+4>>2]=k,k=vl(p|0,i|0,8,0)|0,i=H,!((m|0)<(i|0)|(m|0)==(i|0)&e>>>0<k>>>0)):0)?(e=d+l|0,l=h[e>>0]|h[e+1>>0]<<8|h[e+2>>0]<<16|h[e+3>>0]<<24,e=g,f[e>>2]=k,f[e+4>>2]=i,(j|0)<=(l|0)):0)?(f[a+12>>2]=j,f[a+16>>2]=l,i=wl(l|0,((l|0)<0)<<31>>31|0,j|0,((j|0)<0)<<31>>31|0)|0,j=H,j>>>0<0|(j|0)==0&i>>>0<2147483647):0){j=i+1|0;f[a+20>>2]=j;i=(j|0)/2|0;l=a+24|0;f[l>>2]=i;f[a+28>>2]=0-i;if(!(j&1)){f[l>>2]=i+-1;q=1}else q=1}else q=0}else q=0;n=q;u=c;return n|0}function Ad(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/144|0)>>>0>=c>>>0){i=c;j=h;do{f[j>>2]=-1;ti(j+4|0);b[j+100>>0]=1;k=j+104|0;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));j=(f[g>>2]|0)+144|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/144|0;h=j+c|0;if(h>>>0>29826161)$n(a);m=(e-i|0)/144|0;i=m<<1;e=m>>>0<14913080?(i>>>0<h>>>0?h:i):29826161;do if(e)if(e>>>0>29826161){i=qa(8)|0;Dm(i,13552);f[i>>2]=4908;ta(i|0,1128,105)}else{n=wk(e*144|0)|0;break}else n=0;while(0);i=n+(j*144|0)|0;j=i;h=n+(e*144|0)|0;e=c;c=j;n=i;while(1){f[n>>2]=-1;ti(n+4|0);b[n+100>>0]=1;k=n+104|0;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));o=c+144|0;m=e+-1|0;if(!m)break;else{e=m;c=o;n=o}}n=o;o=f[a>>2]|0;c=f[g>>2]|0;if((c|0)==(o|0)){p=j;q=o;r=o}else{j=c;c=i;do{c=c+-144|0;j=j+-144|0;Uc(c,j)}while((j|0)!=(o|0));p=c;q=f[a>>2]|0;r=f[g>>2]|0}f[a>>2]=p;f[g>>2]=n;f[d>>2]=h;h=q;if((r|0)!=(h|0)){d=r;do{r=f[d+-12>>2]|0;if(r|0){f[d+-8>>2]=r;Ko(r)}r=f[d+-28>>2]|0;if(r|0){f[d+-24>>2]=r;Ko(r)}r=f[d+-40>>2]|0;if(r|0){f[d+-36>>2]=r;Ko(r)}di(d+-140|0);d=d+-144|0}while((d|0)!=(h|0))}if(!q)return;Ko(q);return}function Bd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;g=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;if(!((c+-1|0)>>>0<6&(Ka[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1)){h=0;f[a>>2]=h;return}i=Ka[f[(f[b>>2]|0)+36>>2]&127](b)|0;j=La[f[(f[b>>2]|0)+44>>2]&127](b,d)|0;if((i|0)==0|(j|0)==0){h=0;f[a>>2]=h;return}k=La[f[(f[b>>2]|0)+40>>2]&127](b,d)|0;d=f[b+44>>2]|0;b=j+12|0;l=(c|0)==6;if(!k){if(l){c=wk(104)|0;f[c+4>>2]=g;m=c+8|0;f[m>>2]=f[e>>2];f[m+4>>2]=f[e+4>>2];f[m+8>>2]=f[e+8>>2];f[m+12>>2]=f[e+12>>2];f[c+24>>2]=d;f[c+28>>2]=i;f[c+32>>2]=b;f[c+36>>2]=j;f[c>>2]=2800;f[c+44>>2]=0;f[c+48>>2]=0;f[c+52>>2]=d;f[c+56>>2]=i;f[c+60>>2]=b;f[c+64>>2]=j;f[c+40>>2]=2856;f[c+68>>2]=1;i=c+72|0;f[i>>2]=-1;f[i+4>>2]=-1;f[i+8>>2]=-1;f[i+12>>2]=-1;ym(c+88|0);h=c;f[a>>2]=h;return}}else if(l){l=wk(104)|0;f[l+4>>2]=g;g=l+8|0;f[g>>2]=f[e>>2];f[g+4>>2]=f[e+4>>2];f[g+8>>2]=f[e+8>>2];f[g+12>>2]=f[e+12>>2];f[l+24>>2]=d;f[l+28>>2]=k;f[l+32>>2]=b;f[l+36>>2]=j;f[l>>2]=2716;f[l+44>>2]=0;f[l+48>>2]=0;f[l+52>>2]=d;f[l+56>>2]=k;f[l+60>>2]=b;f[l+64>>2]=j;f[l+40>>2]=2772;f[l+68>>2]=1;j=l+72|0;f[j>>2]=-1;f[j+4>>2]=-1;f[j+8>>2]=-1;f[j+12>>2]=-1;ym(l+88|0);h=l;f[a>>2]=h;return}f[a>>2]=0;h=0;f[a>>2]=h;return}function Cd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;g=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;if(!((c+-1|0)>>>0<6&(Ka[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1)){h=0;f[a>>2]=h;return}i=Ka[f[(f[b>>2]|0)+36>>2]&127](b)|0;j=La[f[(f[b>>2]|0)+44>>2]&127](b,d)|0;if((i|0)==0|(j|0)==0){h=0;f[a>>2]=h;return}k=La[f[(f[b>>2]|0)+40>>2]&127](b,d)|0;d=f[b+44>>2]|0;b=j+12|0;l=(c|0)==6;if(!k){if(l){c=wk(104)|0;f[c+4>>2]=g;m=c+8|0;f[m>>2]=f[e>>2];f[m+4>>2]=f[e+4>>2];f[m+8>>2]=f[e+8>>2];f[m+12>>2]=f[e+12>>2];f[c+24>>2]=d;f[c+28>>2]=i;f[c+32>>2]=b;f[c+36>>2]=j;f[c>>2]=2968;f[c+44>>2]=0;f[c+48>>2]=0;f[c+52>>2]=d;f[c+56>>2]=i;f[c+60>>2]=b;f[c+64>>2]=j;f[c+40>>2]=3024;f[c+68>>2]=1;i=c+72|0;f[i>>2]=-1;f[i+4>>2]=-1;f[i+8>>2]=-1;f[i+12>>2]=-1;ym(c+88|0);h=c;f[a>>2]=h;return}}else if(l){l=wk(104)|0;f[l+4>>2]=g;g=l+8|0;f[g>>2]=f[e>>2];f[g+4>>2]=f[e+4>>2];f[g+8>>2]=f[e+8>>2];f[g+12>>2]=f[e+12>>2];f[l+24>>2]=d;f[l+28>>2]=k;f[l+32>>2]=b;f[l+36>>2]=j;f[l>>2]=2884;f[l+44>>2]=0;f[l+48>>2]=0;f[l+52>>2]=d;f[l+56>>2]=k;f[l+60>>2]=b;f[l+64>>2]=j;f[l+40>>2]=2940;f[l+68>>2]=1;j=l+72|0;f[j>>2]=-1;f[j+4>>2]=-1;f[j+8>>2]=-1;f[j+12>>2]=-1;ym(l+88|0);h=l;f[a>>2]=h;return}f[a>>2]=0;h=0;f[a>>2]=h;return}function Dd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c;e=a+40|0;g=e;h=a;i=g+40|0;do{f[g>>2]=f[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));if(vf(e,1,d)|0){g=a;h=e;i=g+40|0;do{f[g>>2]=f[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));e=d;k=f[e>>2]|0;l=f[e+4>>2]|0;e=a+8|0;m=e;n=a+16|0;o=n;p=f[o>>2]|0;q=f[o+4>>2]|0;o=wl(f[m>>2]|0,f[m+4>>2]|0,p|0,q|0)|0;m=H;if(!(l>>>0>m>>>0|(l|0)==(m|0)&k>>>0>o>>>0)){o=vl(p|0,q|0,k|0,l|0)|0;l=n;f[l>>2]=o;f[l+4>>2]=H;do if((j[a+38>>1]|0)>=514){if(!(rd(a+80|0,a)|0)){r=0;u=c;return r|0}}else{l=a+96|0;g=l;h=a;i=g+40|0;do{f[g>>2]=f[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));if(vf(l,1,d)|0){g=a;h=l;i=g+40|0;do{f[g>>2]=f[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));l=d;o=f[l>>2]|0;k=f[l+4>>2]|0;l=e;q=n;p=f[q>>2]|0;m=f[q+4>>2]|0;q=wl(f[l>>2]|0,f[l+4>>2]|0,p|0,m|0)|0;l=H;if(!(k>>>0>l>>>0|(k|0)==(l|0)&o>>>0>q>>>0)){q=vl(p|0,m|0,o|0,k|0)|0;k=n;f[k>>2]=q;f[k+4>>2]=H;break}}r=0;u=c;return r|0}while(0);if(!(Jg(a)|0)){r=0;u=c;return r|0}g=b;h=a;i=g+40|0;do{f[g>>2]=f[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));r=1;u=c;return r|0}}r=0;u=c;return r|0}function Ed(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=u;u=u+16|0;g=e;h=f[a+40>>2]|0;i=f[a+44>>2]|0;if((h|0)==(i|0)){j=0;u=e;return j|0}a=g+11|0;k=g+4|0;l=d+11|0;m=d+4|0;n=0;o=h;a:while(1){f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=lh(f[o>>2]|0,c,g)|0;p=b[a>>0]|0;b:do if(h){q=p<<24>>24<0;r=p&255;s=q?f[k>>2]|0:r;t=b[l>>0]|0;v=t<<24>>24<0;if((s|0)==((v?f[m>>2]|0:t&255)|0)){t=f[g>>2]|0;w=q?t:g;x=v?f[d>>2]|0:d;v=(s|0)==0;y=t&255;c:do if(q){if(!v?Fi(w,x,s)|0:0){z=0;A=n;B=15;break b}}else if(!v){if((b[x>>0]|0)!=y<<24>>24){C=0;D=n;B=14;break b}t=g;E=r;F=x;while(1){E=E+-1|0;t=t+1|0;if(!E)break c;F=F+1|0;if((b[t>>0]|0)!=(b[F>>0]|0)){C=0;D=n;B=14;break b}}}while(0);C=1;D=f[o>>2]|0;B=14}else{C=0;D=n;B=14}}else{C=3;D=n;B=14}while(0);if((B|0)==14){B=0;if(p<<24>>24<0){z=C;A=D;B=15}else{G=C;H=D}}if((B|0)==15){B=0;Ko(f[g>>2]|0);G=z;H=A}switch(G&3){case 3:case 0:break;default:{j=H;B=18;break a}}o=o+4|0;if((o|0)==(i|0)){j=0;B=18;break}else n=H}if((B|0)==18){u=e;return j|0}return 0}function Fd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d;if(!(kc(a,c)|0)){g=0;u=d;return g|0}h=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;i=a+36|0;j=a+40|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0){if(h>>>0<m>>>0){k=n+(h<<2)|0;if((k|0)!=(l|0)){n=l;do{n=n+-4|0;l=f[n>>2]|0;f[n>>2]=0;if(l|0)Pa[f[(f[l>>2]|0)+4>>2]&127](l)}while((n|0)!=(k|0))}f[j>>2]=k}}else Se(i,h-m|0);m=c+8|0;if((h|0)<=0){g=1;u=d;return g|0}k=c+16|0;j=0;while(1){n=m;l=f[n+4>>2]|0;o=k;p=f[o>>2]|0;q=f[o+4>>2]|0;if(!((l|0)>(q|0)|((l|0)==(q|0)?(f[n>>2]|0)>>>0>p>>>0:0))){g=0;r=21;break}n=b[(f[c>>2]|0)+p>>0]|0;l=vl(p|0,q|0,1,0)|0;q=k;f[q>>2]=l;f[q+4>>2]=H;Ra[f[(f[a>>2]|0)+48>>2]&15](e,a,n);n=(f[i>>2]|0)+(j<<2)|0;q=f[e>>2]|0;f[e>>2]=0;l=f[n>>2]|0;f[n>>2]=q;if(l|0)Pa[f[(f[l>>2]|0)+4>>2]&127](l);l=f[e>>2]|0;f[e>>2]=0;if(l|0)Pa[f[(f[l>>2]|0)+4>>2]&127](l);l=f[(f[i>>2]|0)+(j<<2)>>2]|0;if(!l){g=0;r=21;break}q=f[(f[l>>2]|0)+8>>2]|0;n=Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0;p=La[f[(f[a>>2]|0)+20>>2]&127](a,j)|0;j=j+1|0;if(!(Ma[q&31](l,n,p)|0)){g=0;r=21;break}if((j|0)>=(h|0)){g=1;r=21;break}}if((r|0)==21){u=d;return g|0}return 0}function Gd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(Kc(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+544|0,c)|0)){r=0;return r|0}if(!(gf(a+564|0,c)|0)){r=0;return r|0}if(gf(a+584|0,c)|0)return kb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Hd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(Kc(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+544|0,c)|0)){r=0;return r|0}if(!(gf(a+564|0,c)|0)){r=0;return r|0}if(gf(a+584|0,c)|0)return mb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Id(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(Kc(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+544|0,c)|0)){r=0;return r|0}if(!(gf(a+564|0,c)|0)){r=0;return r|0}if(gf(a+584|0,c)|0)return lb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Jd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(gf(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+36|0,c)|0)){r=0;return r|0}if(!(gf(a+56|0,c)|0)){r=0;return r|0}if(gf(a+76|0,c)|0)return jb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Kd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(gf(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+36|0,c)|0)){r=0;return r|0}if(!(gf(a+56|0,c)|0)){r=0;return r|0}if(gf(a+76|0,c)|0)return ib(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Ld(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(rd(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+32|0,c)|0)){r=0;return r|0}if(!(gf(a+52|0,c)|0)){r=0;return r|0}if(gf(a+72|0,c)|0)return pb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Md(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(rd(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+32|0,c)|0)){r=0;return r|0}if(!(gf(a+52|0,c)|0)){r=0;return r|0}if(gf(a+72|0,c)|0)return nb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Nd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;f[a>>2]=e;break a;break}case 10:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a;break}case 11:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=e;f[d+4>>2]=0;break a;break}case 12:{d=(f[c>>2]|0)+(8-1)&~(8-1);e=d;g=f[e>>2]|0;h=f[e+4>>2]|0;f[c>>2]=d+8;d=a;f[d>>2]=g;f[d+4>>2]=h;break a;break}case 13:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&65535)<<16>>16;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 14:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&65535;f[h+4>>2]=0;break a;break}case 15:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&255)<<24>>24;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 16:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&255;f[h+4>>2]=0;break a;break}case 17:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}case 18:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}default:break a}while(0);while(0);return}function Od(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=u;u=u+16|0;e=d+12|0;g=d;h=wk(52)|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=1065353216;i=h+20|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[h+36>>2]=1065353216;f[h+40>>2]=0;f[h+44>>2]=0;f[h+48>>2]=0;jo(e);if(Af(e,f[c+32>>2]|0,h)|0){e=(f[c+4>>2]|0)+4|0;c=f[e>>2]|0;f[e>>2]=h;if(c|0){e=c+40|0;i=f[e>>2]|0;if(i|0){j=c+44|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k;do{m=m+-4|0;k=f[m>>2]|0;f[m>>2]=0;if(k|0){eh(k);Ko(k)}}while((m|0)!=(i|0));l=f[e>>2]|0}f[j>>2]=i;Ko(l)}eh(c);Ko(c)}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}else{f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;c=wk(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=26;l=c;i=13159;j=l+26|0;do{b[l>>0]=b[i>>0]|0;l=l+1|0;i=i+1|0}while((l|0)<(j|0));b[c+26>>0]=0;f[a>>2]=-1;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);g=h+40|0;a=f[g>>2]|0;if(a|0){c=h+44|0;i=f[c>>2]|0;if((i|0)==(a|0))n=a;else{l=i;do{l=l+-4|0;i=f[l>>2]|0;f[l>>2]=0;if(i|0){eh(i);Ko(i)}}while((l|0)!=(a|0));n=f[g>>2]|0}f[c>>2]=a;Ko(n)}eh(h);Ko(h);u=d;return}}function Pd(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3408;b=f[a+388>>2]|0;if(b|0){f[a+392>>2]=b;Ko(b)}b=a+368|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+-4|0;d=f[b>>2]|0;if(d|0){e=c+(d<<4)|0;do e=e+-16|0;while((e|0)!=(c|0))}Io(b)}Ch(a+216|0);b=f[a+196>>2]|0;if(b|0){f[a+200>>2]=b;Ko(b)}b=f[a+184>>2]|0;if(b|0){f[a+188>>2]=b;Ko(b)}b=f[a+172>>2]|0;if(b|0){f[a+176>>2]=b;Ko(b)}b=f[a+160>>2]|0;if(b|0){f[a+164>>2]=b;Ko(b)}b=f[a+144>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Ko(b)}while((c|0)!=0)}c=a+136|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Ko(b);b=f[a+120>>2]|0;if(b|0)Ko(b);b=f[a+108>>2]|0;if(b|0)Ko(b);b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0){f[a+76>>2]=b;Ko(b)}b=f[a+60>>2]|0;if(b|0)Ko(b);b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+36>>2]|0;if(b|0){f[a+40>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=a+8|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=f[a+76>>2]|0;if(b|0){f[a+80>>2]=b;Ko(b)}b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=f[a>>2]|0;if(b|0){f[a+4>>2]=b;Ko(b)}Ko(a);return}function Qd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=Ia,k=0,l=0,m=0,o=0,p=0,q=Ia,r=Ia,s=Ia,t=Ia,v=Ia,w=0,x=Ia,y=Ia,z=0,A=0;g=u;u=u+32|0;h=g+16|0;i=g;j=_(n[d+4>>2]);k=(1<<f[d>>2])+-1|0;dn(h);qk(h,j,k)|0;d=f[a>>2]|0;if((d|0)==(f[c>>2]|0)){u=g;return}a=h+4|0;l=i+4|0;m=i+8|0;o=e+16|0;p=e+28|0;e=d;do{d=(f[e>>2]|0)-k|0;if((d|0)>-1){j=_(d|0);q=_(n[a>>2]);r=_(q*j);j=_(n[h>>2]);s=_(r*j);t=q;v=j}else{w=wl(0,0,d|0,((d|0)<0)<<31>>31|0)|0;j=_(+(w>>>0)+4294967296.0*+(H|0));q=_(n[a>>2]);r=_(q*j);j=_(n[h>>2]);s=_(-_(r*j));t=q;v=j}w=(f[e+4>>2]|0)-k|0;if((w|0)>-1)x=_(_(t*_(w|0))*v);else{d=wl(0,0,w|0,((w|0)<0)<<31>>31|0)|0;x=_(-_(_(t*_(+(d>>>0)+4294967296.0*+(H|0)))*v))}d=(f[e+8>>2]|0)-k|0;if((d|0)>-1)y=_(_(t*_(d|0))*v);else{w=wl(0,0,d|0,((d|0)<0)<<31>>31|0)|0;y=_(-_(_(t*_(+(w>>>0)+4294967296.0*+(H|0)))*v))}n[i>>2]=s;n[l>>2]=x;n[m>>2]=y;w=f[o>>2]|0;d=f[w>>2]|0;z=f[p>>2]|0;if(!(b[d+84>>0]|0))A=f[(f[d+68>>2]|0)+(z<<2)>>2]|0;else A=z;z=f[d+40>>2]|0;Bf((f[f[d+64>>2]>>2]|0)+(W(A,z)|0)|0,i+(f[w+4>>2]<<2)|0,z|0)|0;f[p>>2]=(f[p>>2]|0)+1;e=e+12|0}while((e|0)!=(f[c>>2]|0));u=g;return}function Rd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;c=u;u=u+32|0;d=c;e=a+4|0;g=f[a>>2]|0;h=(f[e>>2]|0)-g>>2;i=h+1|0;if(i>>>0>1073741823)$n(a);j=a+8|0;k=(f[j>>2]|0)-g|0;g=k>>1;l=k>>2>>>0<536870911?(g>>>0<i>>>0?i:g):1073741823;g=d+12|0;f[g>>2]=0;f[d+16>>2]=a+8;do if(l)if(l>>>0>1073741823){i=qa(8)|0;Dm(i,13552);f[i>>2]=4908;ta(i|0,1128,105)}else{m=wk(l<<2)|0;break}else m=0;while(0);f[d>>2]=m;i=m+(h<<2)|0;h=d+8|0;k=d+4|0;f[k>>2]=i;n=m+(l<<2)|0;f[g>>2]=n;l=f[b>>2]|0;f[b>>2]=0;f[i>>2]=l;l=i+4|0;f[h>>2]=l;b=f[a>>2]|0;m=f[e>>2]|0;if((m|0)==(b|0)){o=i;p=g;q=h;r=b;s=l;t=m;v=n;w=o;f[a>>2]=w;f[k>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;Og(d);u=c;return}n=m;m=i;do{n=n+-4|0;i=f[n>>2]|0;f[n>>2]=0;f[m+-4>>2]=i;m=(f[k>>2]|0)+-4|0;f[k>>2]=m}while((n|0)!=(b|0));o=m;p=g;q=h;r=f[a>>2]|0;s=f[h>>2]|0;t=f[e>>2]|0;v=f[g>>2]|0;w=o;f[a>>2]=w;f[k>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;Og(d);u=c;return}function Sd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(Kc(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+544|0,c)|0)){r=0;return r|0}if(!(gf(a+564|0,c)|0)){r=0;return r|0}if(gf(a+584|0,c)|0)return db(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Td(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(Kc(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+544|0,c)|0)){r=0;return r|0}if(!(gf(a+564|0,c)|0)){r=0;return r|0}if(gf(a+584|0,c)|0)return fb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Ud(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(Kc(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+544|0,c)|0)){r=0;return r|0}if(!(gf(a+564|0,c)|0)){r=0;return r|0}if(gf(a+584|0,c)|0)return eb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Vd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;e=u;u=u+32|0;g=e+8|0;i=e+4|0;j=e;f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;l=c+8|0;m=f[l>>2]|0;n=f[l+4>>2]|0;l=c+16|0;o=l;p=f[o>>2]|0;q=f[o+4>>2]|0;o=vl(p|0,q|0,4,0)|0;r=H;a:do if((n|0)<(r|0)|(n|0)==(r|0)&m>>>0<o>>>0)s=0;else{t=f[c>>2]|0;v=t+p|0;w=h[v>>0]|h[v+1>>0]<<8|h[v+2>>0]<<16|h[v+3>>0]<<24;v=l;f[v>>2]=o;f[v+4>>2]=r;b:do switch(w|0){case 3:{if(!((n|0)>(r|0)|(n|0)==(r|0)&m>>>0>o>>>0)){s=0;break a}v=b[t+o>>0]|0;x=vl(p|0,q|0,5,0)|0;y=l;f[y>>2]=x;f[y+4>>2]=H;f[a+8>>2]=v<<24>>24;if(v<<24>>24==1)if($b(a,c,g)|0)break b;else{s=0;break a}else{Pi(5156,23,1,f[948]|0)|0;s=0;break a}break}case 2:{if(!($b(a,c,g)|0)){s=0;break a}break}default:{Pi(5180,24,1,f[948]|0)|0;s=0;break a}}while(0);f[i>>2]=f[g>>2];f[j>>2]=f[k>>2];Qd(i,j,a,d);s=1}while(0);d=f[g>>2]|0;if(!d){u=e;return s|0}f[k>>2]=d;Ko(d);u=e;return s|0}function Wd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(gf(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+36|0,c)|0)){r=0;return r|0}if(!(gf(a+56|0,c)|0)){r=0;return r|0}if(gf(a+76|0,c)|0)return cb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Xd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(gf(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+36|0,c)|0)){r=0;return r|0}if(!(gf(a+56|0,c)|0)){r=0;return r|0}if(gf(a+76|0,c)|0)return bb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Yd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(rd(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+32|0,c)|0)){r=0;return r|0}if(!(gf(a+52|0,c)|0)){r=0;return r|0}if(gf(a+72|0,c)|0)return hb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function Zd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=c+8|0;g=e;i=f[g>>2]|0;j=f[g+4>>2]|0;g=c+16|0;k=g;l=f[k>>2]|0;m=f[k+4>>2]|0;k=vl(l|0,m|0,4,0)|0;n=H;if((j|0)<(n|0)|(j|0)==(n|0)&i>>>0<k>>>0){o=f[a>>2]|0;p=l;q=m}else{m=(f[c>>2]|0)+l|0;l=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[a>>0]=l;b[a+1>>0]=l>>8;b[a+2>>0]=l>>16;b[a+3>>0]=l>>24;m=g;k=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=H;i=g;f[i>>2]=k;f[i+4>>2]=m;o=l;p=k;q=m}if(o>>>0>32){r=0;return r|0}o=a+4|0;m=e;e=f[m>>2]|0;k=f[m+4>>2]|0;m=vl(p|0,q|0,4,0)|0;q=H;if((k|0)<(q|0)|(k|0)==(q|0)&e>>>0<m>>>0)s=f[o>>2]|0;else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;b[o>>0]=p;b[o+1>>0]=p>>8;b[o+2>>0]=p>>16;b[o+3>>0]=p>>24;m=g;e=vl(f[m>>2]|0,f[m+4>>2]|0,4,0)|0;m=g;f[m>>2]=e;f[m+4>>2]=H;s=p}if(!s){r=1;return r|0}f[a+8>>2]=0;if(!(rd(a+16|0,c)|0)){r=0;return r|0}if(!(gf(a+32|0,c)|0)){r=0;return r|0}if(!(gf(a+52|0,c)|0)){r=0;return r|0}if(gf(a+72|0,c)|0)return gb(a,f[o>>2]|0,d)|0;else{r=0;return r|0}return 0}function _d(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3240;b=a+368|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+-4|0;d=f[b>>2]|0;if(d|0){e=c+(d<<4)|0;do e=e+-16|0;while((e|0)!=(c|0))}Io(b)}Ch(a+216|0);b=f[a+196>>2]|0;if(b|0){f[a+200>>2]=b;Ko(b)}b=f[a+184>>2]|0;if(b|0){f[a+188>>2]=b;Ko(b)}b=f[a+172>>2]|0;if(b|0){f[a+176>>2]=b;Ko(b)}b=f[a+160>>2]|0;if(b|0){f[a+164>>2]=b;Ko(b)}b=f[a+144>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Ko(b)}while((c|0)!=0)}c=a+136|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Ko(b);b=f[a+120>>2]|0;if(b|0)Ko(b);b=f[a+108>>2]|0;if(b|0)Ko(b);b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0){f[a+76>>2]=b;Ko(b)}b=f[a+60>>2]|0;if(b|0)Ko(b);b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+36>>2]|0;if(b|0){f[a+40>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=a+8|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=f[a+76>>2]|0;if(b|0){f[a+80>>2]=b;Ko(b)}b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=f[a>>2]|0;if(b|0){f[a+4>>2]=b;Ko(b)}Ko(a);return}function $d(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;Wh(f[a+4>>2]|0,(f[g+28>>2]|0)-(f[g+24>>2]|0)>>2);g=a+100|0;h=f[e>>2]|0;i=(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2;f[c>>2]=0;h=a+104|0;j=f[g>>2]|0;k=(f[h>>2]|0)-j>>2;if(i>>>0<=k>>>0){if(i>>>0<k>>>0)f[h>>2]=j+(i<<2)}else Of(g,i-k|0,c);k=a+120|0;a=f[k>>2]|0;if(!a){i=f[e>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){l=1;u=b;return l|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(xb(e,c)|0)){l=0;m=14;break}if(g>>>0>=i>>>0){l=1;m=14;break}}if((m|0)==14){u=b;return l|0}}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){l=1;u=b;return l|0}a=0;g=i;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(xb(e,c)|0)){l=0;m=14;break}i=f[k>>2]|0;g=f[i>>2]|0;if(a>>>0>=(f[i+4>>2]|0)-g>>2>>>0){l=1;m=14;break}}if((m|0)==14){u=b;return l|0}}return 0}function ae(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+32|0;e=d+12|0;g=d;h=Wi(c,0)|0;if(!h){f[a>>2]=0;u=d;return}i=f[c+100>>2]|0;j=f[c+96>>2]|0;c=i-j|0;k=(c|0)/12|0;f[e>>2]=0;l=e+4|0;f[l>>2]=0;m=e+8|0;f[m>>2]=0;n=j;do if(c)if(k>>>0>357913941)$n(e);else{o=wk(c)|0;f[e>>2]=o;f[m>>2]=o+(k*12|0);oh(o|0,0,c|0)|0;f[l>>2]=o+c;p=o;break}else p=0;while(0);f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;if((i|0)!=(j|0)){j=g+4|0;i=g+8|0;if(!(b[h+84>>0]|0)){c=f[h+68>>2]|0;h=0;do{m=f[c+(f[n+(h*12|0)>>2]<<2)>>2]|0;f[g>>2]=m;o=f[c+(f[n+(h*12|0)+4>>2]<<2)>>2]|0;f[j>>2]=o;q=f[c+(f[n+(h*12|0)+8>>2]<<2)>>2]|0;f[i>>2]=q;f[p+(h*12|0)>>2]=m;f[p+(h*12|0)+4>>2]=o;f[p+(h*12|0)+8>>2]=q;h=h+1|0}while(h>>>0<k>>>0)}else{h=0;do{c=n+(h*12|0)|0;f[g>>2]=f[c>>2];f[g+4>>2]=f[c+4>>2];f[g+8>>2]=f[c+8>>2];f[p+(h*12|0)>>2]=f[g>>2];f[p+(h*12|0)+4>>2]=f[j>>2];f[p+(h*12|0)+8>>2]=f[i>>2];h=h+1|0}while(h>>>0<k>>>0)}}og(a,e);a=f[e>>2]|0;if(a|0){f[l>>2]=a;Ko(a)}u=d;return}function be(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=f[a+8>>2]|0;e=a+76|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[i>>2]|0;l=(f[j>>2]|0)-k>>2;if(h>>>0<=l>>>0)if(h>>>0<l>>>0){f[j>>2]=k+(h<<2);m=g;n=h}else{m=g;n=h}else{Of(i,h-l|0,3328);l=f[e>>2]|0;m=l;n=f[l+80>>2]|0}l=f[m+96>>2]|0;e=(f[m+100>>2]|0)-l|0;m=(e|0)/12|0;h=l;if(!e){o=1;return o|0}e=a+80|0;a=c+68|0;c=0;while(1){l=c*3|0;if((l|0)==-1){o=0;p=11;break}i=f[d>>2]|0;g=f[i+(l<<2)>>2]|0;if((g|0)==-1){o=0;p=11;break}k=f[(f[e>>2]|0)+12>>2]|0;j=f[k+(g<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=11;break}g=f[a>>2]|0;f[g+(f[h+(c*12|0)>>2]<<2)>>2]=j;j=l+1|0;if((j|0)==-1){o=0;p=11;break}q=f[i+(j<<2)>>2]|0;if((q|0)==-1){o=0;p=11;break}j=f[k+(q<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=11;break}f[g+(f[h+(c*12|0)+4>>2]<<2)>>2]=j;j=l+2|0;if((j|0)==-1){o=0;p=11;break}l=f[i+(j<<2)>>2]|0;if((l|0)==-1){o=0;p=11;break}j=f[k+(l<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=11;break}f[g+(f[h+(c*12|0)+8>>2]<<2)>>2]=j;c=c+1|0;if(c>>>0>=m>>>0){o=1;p=11;break}}if((p|0)==11)return o|0;return 0}function ce(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+32|0;g=e+20|0;h=e+16|0;i=e;j=c+24|0;k=b[j>>0]|0;l=k<<24>>24;m=f[a+80>>2]|0;a=W(m,l)|0;f[i>>2]=f[294];f[i+4>>2]=f[295];f[i+8>>2]=f[296];f[i+12>>2]=f[297];n=d+4|0;o=f[d>>2]|0;p=(f[n>>2]|0)-o>>2;if(a>>>0<=p>>>0){if(a>>>0<p>>>0)f[n>>2]=o+(a<<2)}else Eg(d,a-p|0);if(!m){q=1;u=e;return q|0}p=c+84|0;a=c+68|0;if(k<<24>>24<=0){k=0;while(1){if(!(b[p>>0]|0))r=f[(f[a>>2]|0)+(k<<2)>>2]|0;else r=k;f[h>>2]=r;o=b[j>>0]|0;f[g>>2]=f[h>>2];if(!(ob(c,g,o,i)|0)){q=0;s=19;break}k=k+1|0;if(k>>>0>=m>>>0){q=1;s=19;break}}if((s|0)==19){u=e;return q|0}}k=0;r=0;while(1){if(!(b[p>>0]|0))t=f[(f[a>>2]|0)+(r<<2)>>2]|0;else t=r;f[h>>2]=t;o=b[j>>0]|0;f[g>>2]=f[h>>2];if(!(ob(c,g,o,i)|0)){q=0;s=19;break}o=f[d>>2]|0;n=0;v=k;while(1){f[o+(v<<2)>>2]=f[i+(n<<2)>>2];n=n+1|0;if((n|0)==(l|0))break;else v=v+1|0}r=r+1|0;if(r>>>0>=m>>>0){q=1;s=19;break}else k=k+l|0}if((s|0)==19){u=e;return q|0}return 0}function de(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;c=u;u=u+32|0;d=c;e=a+8|0;g=f[e>>2]|0;h=a+4|0;i=f[h>>2]|0;j=i;if(g-i>>2>>>0>=b>>>0){oh(i|0,0,b<<2|0)|0;f[h>>2]=j+(b<<2);u=c;return}k=f[a>>2]|0;l=i-k>>2;m=l+b|0;n=k;if(m>>>0>1073741823)$n(a);o=g-k|0;p=o>>1;q=o>>2>>>0<536870911?(p>>>0<m>>>0?m:p):1073741823;p=d+12|0;f[p>>2]=0;f[d+16>>2]=a+8;do if(q)if(q>>>0>1073741823){m=qa(8)|0;Dm(m,13552);f[m>>2]=4908;ta(m|0,1128,105)}else{r=wk(q<<2)|0;break}else r=0;while(0);f[d>>2]=r;m=r+(l<<2)|0;l=d+8|0;o=d+4|0;f[o>>2]=m;s=r+(q<<2)|0;f[p>>2]=s;oh(m|0,0,b<<2|0)|0;q=m+(b<<2)|0;f[l>>2]=q;if((j|0)==(n|0)){t=m;v=p;w=l;x=k;y=q;z=i;A=s;B=g}else{g=j;j=m;do{g=g+-4|0;m=f[g>>2]|0;f[g>>2]=0;f[j+-4>>2]=m;j=(f[o>>2]|0)+-4|0;f[o>>2]=j}while((g|0)!=(n|0));t=j;v=p;w=l;x=f[a>>2]|0;y=f[l>>2]|0;z=f[h>>2]|0;A=f[p>>2]|0;B=f[e>>2]|0}f[a>>2]=t;f[o>>2]=x;f[h>>2]=y;f[w>>2]=z;f[e>>2]=A;f[v>>2]=B;f[d>>2]=x;Og(d);u=c;return}function ee(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=f[a+8>>2]|0;e=a+112|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[i>>2]|0;l=(f[j>>2]|0)-k>>2;if(h>>>0<=l>>>0)if(h>>>0<l>>>0){f[j>>2]=k+(h<<2);m=g;n=h}else{m=g;n=h}else{Of(i,h-l|0,3328);l=f[e>>2]|0;m=l;n=f[l+80>>2]|0}l=f[m+96>>2]|0;e=(f[m+100>>2]|0)-l|0;m=(e|0)/12|0;h=l;if(!e){o=1;return o|0}e=a+116|0;a=c+68|0;c=0;while(1){l=c*3|0;if((l|0)==-1){o=0;p=11;break}i=f[d>>2]|0;g=f[i+(l<<2)>>2]|0;if((g|0)==-1){o=0;p=11;break}k=f[(f[e>>2]|0)+12>>2]|0;j=f[k+(g<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=11;break}g=f[a>>2]|0;f[g+(f[h+(c*12|0)>>2]<<2)>>2]=j;j=l+1|0;if((j|0)==-1){o=0;p=11;break}q=f[i+(j<<2)>>2]|0;if((q|0)==-1){o=0;p=11;break}j=f[k+(q<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=11;break}f[g+(f[h+(c*12|0)+4>>2]<<2)>>2]=j;j=l+2|0;if((j|0)==-1){o=0;p=11;break}l=f[i+(j<<2)>>2]|0;if((l|0)==-1){o=0;p=11;break}j=f[k+(l<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=11;break}f[g+(f[h+(c*12|0)+8>>2]<<2)>>2]=j;c=c+1|0;if(c>>>0>=m>>>0){o=1;p=11;break}}if((p|0)==11)return o|0;return 0}function fe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=c+8|0;e=f[d>>2]|0;g=f[d+4>>2]|0;d=c+16|0;i=d;k=f[i>>2]|0;l=f[i+4>>2]|0;i=vl(k|0,l|0,4,0)|0;m=H;if((g|0)<(m|0)|(g|0)==(m|0)&e>>>0<i>>>0){n=0;return n|0}o=f[c>>2]|0;p=o+k|0;q=h[p>>0]|h[p+1>>0]<<8|h[p+2>>0]<<16|h[p+3>>0]<<24;p=d;f[p>>2]=i;f[p+4>>2]=m;m=vl(k|0,l|0,8,0)|0;p=H;if((g|0)<(p|0)|(g|0)==(p|0)&e>>>0<m>>>0){n=0;return n|0}r=o+i|0;i=h[r>>0]|h[r+1>>0]<<8|h[r+2>>0]<<16|h[r+3>>0]<<24;r=d;f[r>>2]=m;f[r+4>>2]=p;if((q|0)>(i|0)){n=0;return n|0}f[a+12>>2]=q;f[a+16>>2]=i;r=wl(i|0,((i|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=H;if(!(q>>>0<0|(q|0)==0&r>>>0<2147483647)){n=0;return n|0}q=r+1|0;f[a+20>>2]=q;r=(q|0)/2|0;i=a+24|0;f[i>>2]=r;f[a+28>>2]=0-r;if(!(q&1))f[i>>2]=r+-1;if((j[c+38>>1]|0)<514){a:do if((g|0)>(p|0)|(g|0)==(p|0)&e>>>0>m>>>0){r=b[o+m>>0]|0;i=vl(k|0,l|0,9,0)|0;q=d;f[q>>2]=i;f[q+4>>2]=H;switch(r<<24>>24){case 0:{s=0;break a;break}case 1:{s=1;break a;break}default:{n=0;return n|0}}}else s=0;while(0);f[a+88>>2]=s}n=rd(a+108|0,c)|0;return n|0}function ge(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!(f[a+64>>2]|0)){d=wk(32)|0;Kk(d);e=a+64|0;g=f[e>>2]|0;f[e>>2]=d;if(!g)h=d;else{d=f[g>>2]|0;if(d|0){f[g+4>>2]=d;Ko(d)}Ko(g);h=f[e>>2]|0}oi(a,h,0,0,0,0);i=a}else i=a;if(!(jh(i,c)|0))return;b[a+84>>0]=b[c+84>>0]|0;f[a+80>>2]=f[c+80>>2];if((a|0)!=(c|0))df(a+68|0,f[c+68>>2]|0,f[c+72>>2]|0);i=f[c+88>>2]|0;if(!i){c=a+88|0;h=f[c>>2]|0;f[c>>2]=0;if(!h)return;c=f[h+8>>2]|0;if(c|0){f[h+12>>2]=c;Ko(c)}Ko(h);return}h=wk(40)|0;f[h>>2]=f[i>>2];c=h+8|0;e=i+8|0;f[c>>2]=0;g=h+12|0;f[g>>2]=0;d=h+16|0;f[d>>2]=0;j=i+12|0;k=(f[j>>2]|0)-(f[e>>2]|0)|0;if(k|0){if((k|0)<0)$n(c);l=wk(k)|0;f[g>>2]=l;f[c>>2]=l;f[d>>2]=l+k;k=f[e>>2]|0;e=(f[j>>2]|0)-k|0;if((e|0)>0){Bf(l|0,k|0,e|0)|0;f[g>>2]=l+e}}e=h+24|0;l=i+24|0;f[e>>2]=f[l>>2];f[e+4>>2]=f[l+4>>2];f[e+8>>2]=f[l+8>>2];f[e+12>>2]=f[l+12>>2];l=a+88|0;a=f[l>>2]|0;f[l>>2]=h;if(!a)return;h=f[a+8>>2]|0;if(h|0){f[a+12>>2]=h;Ko(h)}Ko(a);return}function he(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=Ia,x=Ia,y=Ia,z=0;d=u;u=u+16|0;e=d;g=f[a+24>>2]|0;h=a+8|0;i=b[(f[h>>2]|0)+24>>0]|0;j=i<<24>>24;k=j<<2;l=Ho(j>>>0>1073741823?-1:j<<2)|0;dn(e);if(!(qk(e,_(n[a+32>>2]),(1<<g)+-1|0)|0)){m=0;Io(l);u=d;return m|0}g=f[a+16>>2]|0;if(!(f[g+80>>2]|0))o=0;else o=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;if(!c){m=1;Io(l);u=d;return m|0}g=e+4|0;p=a+28|0;if(i<<24>>24<=0){i=0;a=0;while(1){Bf((f[f[(f[h>>2]|0)+64>>2]>>2]|0)+a|0,l|0,k|0)|0;i=i+1|0;if((i|0)==(c|0)){m=1;break}else a=a+k|0}Io(l);u=d;return m|0}a=0;i=0;q=0;while(1){r=f[p>>2]|0;s=0;t=i;while(1){v=f[o+(t<<2)>>2]|0;if((v|0)>-1){w=_(v|0);x=_(_(n[g>>2])*w);y=_(x*_(n[e>>2]))}else{z=wl(0,0,v|0,((v|0)<0)<<31>>31|0)|0;x=_(+(z>>>0)+4294967296.0*+(H|0));w=_(_(n[g>>2])*x);y=_(-_(w*_(n[e>>2])))}w=_(y+_(n[r+(s<<2)>>2]));n[l+(s<<2)>>2]=w;s=s+1|0;if((s|0)==(j|0))break;else t=t+1|0}Bf((f[f[(f[h>>2]|0)+64>>2]>>2]|0)+q|0,l|0,k|0)|0;a=a+1|0;if((a|0)==(c|0)){m=1;break}else{i=i+j|0;q=q+k|0}}Io(l);u=d;return m|0}function ie(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;e=u;u=u+16|0;g=e;i=d+8|0;j=f[i>>2]|0;k=f[i+4>>2]|0;i=d+16|0;l=i;m=f[l>>2]|0;n=f[l+4>>2]|0;if((k|0)>(n|0)|(k|0)==(n|0)&j>>>0>m>>>0){l=b[(f[d>>2]|0)+m>>0]|0;o=vl(m|0,n|0,1,0)|0;p=H;q=i;f[q>>2]=o;f[q+4>>2]=p;if(l<<24>>24!=-2){r=l;s=p;t=o;v=3}}else{r=0;s=n;t=m;v=3}if((v|0)==3){if((k|0)>(s|0)|(k|0)==(s|0)&j>>>0>t>>>0){j=b[(f[d>>2]|0)+t>>0]|0;k=vl(t|0,s|0,1,0)|0;s=i;f[s>>2]=k;f[s+4>>2]=H;w=j}else w=0;Sa[f[(f[a>>2]|0)+40>>2]&7](g,a,r<<24>>24,w<<24>>24);w=a+20|0;r=f[g>>2]|0;f[g>>2]=0;j=f[w>>2]|0;f[w>>2]=r;if(j){Pa[f[(f[j>>2]|0)+4>>2]&127](j);j=f[g>>2]|0;f[g>>2]=0;if(j|0)Pa[f[(f[j>>2]|0)+4>>2]&127](j)}else f[g>>2]=0}g=f[a+20>>2]|0;if(g|0?!(La[f[(f[a>>2]|0)+28>>2]&127](a,g)|0):0){x=0;u=e;return x|0}if(!(Ma[f[(f[a>>2]|0)+36>>2]&31](a,c,d)|0)){x=0;u=e;return x|0}d=(f[c+4>>2]|0)-(f[c>>2]|0)>>2;c=f[a+4>>2]|0;if((c|0?((h[c+36>>0]|0)<<8&65535)<512:0)?!(La[f[(f[a>>2]|0)+48>>2]&127](a,d)|0):0){x=0;u=e;return x|0}x=1;u=e;return x|0}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+32|0;d=c+24|0;e=c+16|0;g=c+8|0;h=c;f[a>>2]=3316;f[a+4>>2]=f[b+4>>2];i=a+8|0;j=b+8|0;f[i>>2]=0;k=a+12|0;f[k>>2]=0;l=a+16|0;f[l>>2]=0;m=b+12|0;n=f[m>>2]|0;do if(n|0)if((n|0)<0)$n(i);else{o=((n+-1|0)>>>5)+1|0;p=wk(o<<2)|0;f[i>>2]=p;f[k>>2]=0;f[l>>2]=o;o=f[j>>2]|0;f[g>>2]=o;f[g+4>>2]=0;p=f[m>>2]|0;f[h>>2]=o+(p>>>5<<2);f[h+4>>2]=p&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];xe(i,e,d);break}while(0);i=a+20|0;f[i>>2]=0;m=a+24|0;f[m>>2]=0;j=a+28|0;f[j>>2]=0;a=b+24|0;l=f[a>>2]|0;if(!l){u=c;return}if((l|0)<0)$n(i);k=((l+-1|0)>>>5)+1|0;l=wk(k<<2)|0;f[i>>2]=l;f[m>>2]=0;f[j>>2]=k;k=f[b+20>>2]|0;f[g>>2]=k;f[g+4>>2]=0;b=f[a>>2]|0;f[h>>2]=k+(b>>>5<<2);f[h+4>>2]=b&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];xe(i,e,d);u=c;return}function ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+32|0;d=c+12|0;e=c;g=b*3|0;f[d>>2]=0;h=d+4|0;f[h>>2]=0;i=d+8|0;f[i>>2]=0;do if(g)if(g>>>0>1073741823)$n(d);else{j=b*12|0;k=wk(j)|0;f[d>>2]=k;l=k+(g<<2)|0;f[i>>2]=l;oh(k|0,0,j|0)|0;f[h>>2]=l;m=k;break}else m=0;while(0);if(kh(g,1,f[a+32>>2]|0,m)|0)if(!b)n=1;else{m=a+44|0;a=e+4|0;g=e+8|0;i=0;k=0;l=0;while(1){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;j=f[d>>2]|0;o=f[j+(k<<2)>>2]|0;p=o>>>1;q=((o&1|0)==0?p:0-p|0)+l|0;f[e>>2]=q;p=f[j+(k+1<<2)>>2]|0;o=p>>>1;r=((p&1|0)==0?o:0-o|0)+q|0;f[a>>2]=r;q=f[j+(k+2<<2)>>2]|0;j=q>>>1;l=((q&1|0)==0?j:0-j|0)+r|0;f[g>>2]=l;r=f[m>>2]|0;j=r+100|0;q=f[j>>2]|0;if((q|0)==(f[r+104>>2]|0))yg(r+96|0,e);else{f[q>>2]=f[e>>2];f[q+4>>2]=f[e+4>>2];f[q+8>>2]=f[e+8>>2];f[j>>2]=(f[j>>2]|0)+12}i=i+1|0;if(i>>>0>=b>>>0){n=1;break}else k=k+3|0}}else n=0;k=f[d>>2]|0;if(!k){u=c;return n|0}f[h>>2]=k;Ko(k);u=c;return n|0}function le(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+32|0;d=c+24|0;e=c+16|0;g=c+8|0;h=c;f[a>>2]=3364;f[a+4>>2]=f[b+4>>2];i=a+8|0;j=b+8|0;f[i>>2]=0;k=a+12|0;f[k>>2]=0;l=a+16|0;f[l>>2]=0;m=b+12|0;n=f[m>>2]|0;do if(n|0)if((n|0)<0)$n(i);else{o=((n+-1|0)>>>5)+1|0;p=wk(o<<2)|0;f[i>>2]=p;f[k>>2]=0;f[l>>2]=o;o=f[j>>2]|0;f[g>>2]=o;f[g+4>>2]=0;p=f[m>>2]|0;f[h>>2]=o+(p>>>5<<2);f[h+4>>2]=p&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];xe(i,e,d);break}while(0);i=a+20|0;f[i>>2]=0;m=a+24|0;f[m>>2]=0;j=a+28|0;f[j>>2]=0;a=b+24|0;l=f[a>>2]|0;if(!l){u=c;return}if((l|0)<0)$n(i);k=((l+-1|0)>>>5)+1|0;l=wk(k<<2)|0;f[i>>2]=l;f[m>>2]=0;f[j>>2]=k;k=f[b+20>>2]|0;f[g>>2]=k;f[g+4>>2]=0;b=f[a>>2]|0;f[h>>2]=k+(b>>>5<<2);f[h+4>>2]=b&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];xe(i,e,d);u=c;return}function me(a){a=a|0;var b=0,c=0;f[a>>2]=3456;gh(a+232|0);Ch(a+216|0);b=f[a+196>>2]|0;if(b|0){f[a+200>>2]=b;Ko(b)}b=f[a+184>>2]|0;if(b|0){f[a+188>>2]=b;Ko(b)}b=f[a+172>>2]|0;if(b|0){f[a+176>>2]=b;Ko(b)}b=f[a+160>>2]|0;if(b|0){f[a+164>>2]=b;Ko(b)}b=f[a+144>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Ko(b)}while((c|0)!=0)}c=a+136|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Ko(b);b=f[a+120>>2]|0;if(b|0)Ko(b);b=f[a+108>>2]|0;if(b|0)Ko(b);b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0){f[a+76>>2]=b;Ko(b)}b=f[a+60>>2]|0;if(b|0)Ko(b);b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+36>>2]|0;if(b|0){f[a+40>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=a+8|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=f[a+76>>2]|0;if(b|0){f[a+80>>2]=b;Ko(b)}b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=f[a>>2]|0;if(b|0){f[a+4>>2]=b;Ko(b)}Ko(a);return}function ne(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=u;u=u+80|0;h=g;i=g+60|0;j=g+40|0;k=h;l=d;m=k+40|0;do{f[k>>2]=f[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));fc(a,h,i);if(f[a>>2]|0){u=g;return}h=a+4|0;n=h+11|0;if((b[n>>0]|0)<0)Ko(f[h>>2]|0);if(b[i+7>>0]|0){f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;o=wk(32)|0;f[j>>2]=o;f[j+8>>2]=-2147483616;f[j+4>>2]=27;k=o;l=11903;m=k+27|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[o+27>>0]=0;f[a>>2]=-1;Yi(h,j);if((b[j+11>>0]|0)<0)Ko(f[j>>2]|0);u=g;return}zf(j,b[i+8>>0]|0);i=f[j>>2]|0;if(!i){o=j+16|0;l=f[o>>2]|0;f[o>>2]=0;Bc(a,l,c,d,e);if(!(f[a>>2]|0)){if((b[n>>0]|0)<0)Ko(f[h>>2]|0);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}if(l|0)Pa[f[(f[l>>2]|0)+4>>2]&127](l)}else{f[a>>2]=i;Yi(h,j+4|0)}h=j+16|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0)Pa[f[(f[i>>2]|0)+4>>2]&127](i);i=j+4|0;if((b[i+11>>0]|0)<0)Ko(f[i>>2]|0);u=g;return}function oe(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,h=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;g=u;u=u+16|0;h=g;i=c+24|0;k=b[i>>0]|0;l=k<<24>>24;f[h>>2]=0;m=h+4|0;f[m>>2]=0;n=h+8|0;f[n>>2]=0;do if(k<<24>>24)if(k<<24>>24<0)$n(h);else{o=l<<1;p=wk(o)|0;f[h>>2]=p;q=p+(l<<1)|0;f[n>>2]=q;oh(p|0,0,o|0)|0;f[m>>2]=q;q=l<<1;o=wk(q)|0;oh(o|0,0,q|0)|0;r=o;s=o;t=p;v=p;break}else{r=0;s=0;t=0;v=0}while(0);l=c+80|0;if(f[l>>2]|0){n=c+48|0;h=c+40|0;k=c+64|0;p=a+48|0;a=0;o=v;while(1){q=n;w=f[q>>2]|0;x=f[q+4>>2]|0;q=h;y=f[q>>2]|0;z=Bk(y|0,f[q+4>>2]|0,a|0,0)|0;q=vl(z|0,H|0,w|0,x|0)|0;Bf(o|0,(f[f[c>>2]>>2]|0)+q|0,y|0)|0;y=b[i>>0]|0;if(y<<24>>24>0){q=f[p>>2]|0;x=y<<24>>24;y=0;do{d[s+(y<<1)>>1]=(f[q+(y+e<<2)>>2]|0)+(j[t+(y<<1)>>1]|0);y=y+1|0}while((y|0)<(x|0));A=v}else A=o;x=f[h>>2]|0;Bf((f[f[k>>2]>>2]|0)+(W(a,x)|0)|0,s|0,x|0)|0;a=a+1|0;if(a>>>0>=(f[l>>2]|0)>>>0)break;else o=A}}if(r|0)Ko(s);if(!t){u=g;return 1}f[m>>2]=t;Ko(v);u=g;return 1}function pe(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;e=u;u=u+16|0;g=e;h=c+24|0;i=b[h>>0]|0;j=i<<24>>24;f[g>>2]=0;k=g+4|0;f[k>>2]=0;l=g+8|0;f[l>>2]=0;do if(i<<24>>24)if(i<<24>>24<0)$n(g);else{m=j<<2;n=wk(m)|0;f[g>>2]=n;o=n+(j<<2)|0;f[l>>2]=o;oh(n|0,0,m|0)|0;f[k>>2]=o;o=j<<2;m=wk(o)|0;oh(m|0,0,o|0)|0;p=m;q=m;r=n;s=n;break}else{p=0;q=0;r=0;s=0}while(0);j=c+80|0;if(f[j>>2]|0){l=c+48|0;g=c+40|0;i=c+64|0;n=a+48|0;a=0;m=s;while(1){o=l;t=f[o>>2]|0;v=f[o+4>>2]|0;o=g;w=f[o>>2]|0;x=Bk(w|0,f[o+4>>2]|0,a|0,0)|0;o=vl(x|0,H|0,t|0,v|0)|0;Bf(m|0,(f[f[c>>2]>>2]|0)+o|0,w|0)|0;w=b[h>>0]|0;if(w<<24>>24>0){o=f[n>>2]|0;v=w<<24>>24;w=0;do{f[q+(w<<2)>>2]=(f[o+(w+d<<2)>>2]|0)+(f[r+(w<<2)>>2]|0);w=w+1|0}while((w|0)<(v|0));y=s}else y=m;v=f[g>>2]|0;Bf((f[f[i>>2]>>2]|0)+(W(a,v)|0)|0,q|0,v|0)|0;a=a+1|0;if(a>>>0>=(f[j>>2]|0)>>>0)break;else m=y}}if(p|0)Ko(q);if(!r){u=e;return 1}f[k>>2]=r;Ko(s);u=e;return 1}function qe(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=b[(f[a+8>>2]|0)+24>>0]|0;d=Ho(c>>>0>1073741823?-1:c<<2)|0;e=a+28|0;g=f[e>>2]|0;f[e>>2]=d;if(g|0)Io(g);g=a+4|0;d=f[(f[g>>2]|0)+32>>2]|0;i=c<<2;c=d+8|0;j=f[c>>2]|0;k=f[c+4>>2]|0;c=d+16|0;l=c;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,i|0,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&j>>>0<n>>>0){o=0;return o|0}Bf(f[e>>2]|0,(f[d>>2]|0)+m|0,i|0)|0;m=c;d=vl(f[m>>2]|0,f[m+4>>2]|0,i|0,0)|0;i=c;f[i>>2]=d;f[i+4>>2]=H;i=(f[g>>2]|0)+32|0;g=f[i>>2]|0;d=g+8|0;c=f[d>>2]|0;m=f[d+4>>2]|0;d=g+16|0;e=d;n=f[e>>2]|0;j=vl(n|0,f[e+4>>2]|0,4,0)|0;e=H;if((m|0)<(e|0)|(m|0)==(e|0)&c>>>0<j>>>0){o=0;return o|0}j=a+32|0;c=(f[g>>2]|0)+n|0;n=h[c>>0]|h[c+1>>0]<<8|h[c+2>>0]<<16|h[c+3>>0]<<24;b[j>>0]=n;b[j+1>>0]=n>>8;b[j+2>>0]=n>>16;b[j+3>>0]=n>>24;n=d;j=vl(f[n>>2]|0,f[n+4>>2]|0,4,0)|0;n=d;f[n>>2]=j;f[n+4>>2]=H;n=f[i>>2]|0;i=n+8|0;j=f[i+4>>2]|0;d=n+16|0;c=d;g=f[c>>2]|0;e=f[c+4>>2]|0;if(!((j|0)>(e|0)|((j|0)==(e|0)?(f[i>>2]|0)>>>0>g>>>0:0))){o=0;return o|0}i=b[(f[n>>2]|0)+g>>0]|0;n=vl(g|0,e|0,1,0)|0;e=d;f[e>>2]=n;f[e+4>>2]=H;if((i&255)>31){o=0;return o|0}f[a+24>>2]=i&255;o=1;return o|0}function re(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=b;Wf(a+16|0);ym(a+528|0);Wl(a+544|0);Wl(a+564|0);Wl(a+584|0);e=a+604|0;f[e>>2]=0;g=a+608|0;f[g>>2]=0;h=a+612|0;f[h>>2]=0;i=(b|0)==0;do if(!i)if(b>>>0>1073741823)$n(e);else{j=b<<2;k=wk(j)|0;f[e>>2]=k;l=k+(b<<2)|0;f[h>>2]=l;oh(k|0,0,j|0)|0;f[g>>2]=l;break}while(0);g=a+616|0;f[g>>2]=0;h=a+620|0;f[h>>2]=0;e=a+624|0;f[e>>2]=0;if(!i){l=b<<2;j=wk(l)|0;f[g>>2]=j;g=j+(b<<2)|0;f[e>>2]=g;oh(j|0,0,l|0)|0;f[h>>2]=g}g=b<<5|1;f[d>>2]=0;h=d+4|0;f[h>>2]=0;l=d+8|0;f[l>>2]=0;if(!i){j=b<<2;e=wk(j)|0;f[d>>2]=e;k=e+(b<<2)|0;f[l>>2]=k;oh(e|0,0,j|0)|0;f[h>>2]=k}fg(a+628|0,g,d);k=f[d>>2]|0;if(k|0){f[h>>2]=k;Ko(k)}f[d>>2]=0;k=d+4|0;f[k>>2]=0;h=d+8|0;f[h>>2]=0;if(!i){i=b<<2;j=wk(i)|0;f[d>>2]=j;e=j+(b<<2)|0;f[h>>2]=e;oh(j|0,0,i|0)|0;f[k>>2]=e}fg(a+640|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}f[k>>2]=g;Ko(g);u=c;return}function se(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=u;u=u+80|0;h=g;i=g+60|0;j=g+40|0;k=h;l=d;m=k+40|0;do{f[k>>2]=f[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));fc(a,h,i);if(f[a>>2]|0){u=g;return}h=a+4|0;n=h+11|0;if((b[n>>0]|0)<0)Ko(f[h>>2]|0);if((b[i+7>>0]|0)!=1){f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;o=wk(32)|0;f[j>>2]=o;f[j+8>>2]=-2147483616;f[j+4>>2]=20;k=o;l=11882;m=k+20|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[o+20>>0]=0;f[a>>2]=-1;Yi(h,j);if((b[j+11>>0]|0)<0)Ko(f[j>>2]|0);u=g;return}Zf(j,b[i+8>>0]|0);i=f[j>>2]|0;if(!i){o=j+16|0;l=f[o>>2]|0;f[o>>2]=0;Nj(a,l,c,d,e);if(!(f[a>>2]|0)){if((b[n>>0]|0)<0)Ko(f[h>>2]|0);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}if(l|0)Pa[f[(f[l>>2]|0)+4>>2]&127](l)}else{f[a>>2]=i;Yi(h,j+4|0)}h=j+16|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0)Pa[f[(f[i>>2]|0)+4>>2]&127](i);i=j+4|0;if((b[i+11>>0]|0)<0)Ko(f[i>>2]|0);u=g;return}function te(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=c+8|0;e=f[d>>2]|0;g=f[d+4>>2]|0;d=c+16|0;i=d;k=f[i>>2]|0;l=f[i+4>>2]|0;i=vl(k|0,l|0,4,0)|0;m=H;if((g|0)<(m|0)|(g|0)==(m|0)&e>>>0<i>>>0){n=0;return n|0}o=f[c>>2]|0;p=o+k|0;q=h[p>>0]|h[p+1>>0]<<8|h[p+2>>0]<<16|h[p+3>>0]<<24;p=d;f[p>>2]=i;f[p+4>>2]=m;p=(j[c+38>>1]|0)<514;do if(p){r=vl(k|0,l|0,8,0)|0;s=H;if((g|0)<(s|0)|(g|0)==(s|0)&e>>>0<r>>>0){n=0;return n|0}else{t=d;f[t>>2]=r;f[t+4>>2]=s;u=s;v=r;break}}else{u=m;v=i}while(0);if(!(q&1)){n=0;return n|0}i=(Z(q|0)|0)^31;if((i+-1|0)>>>0>28){n=0;return n|0}f[a+8>>2]=i+1;q=2<<i;f[a+12>>2]=q+-1;i=q+-2|0;f[a+16>>2]=i;f[a+20>>2]=(i|0)/2|0;if(p){a:do if((g|0)>(u|0)|(g|0)==(u|0)&e>>>0>v>>>0){p=b[o+v>>0]|0;i=vl(v|0,u|0,1,0)|0;q=d;f[q>>2]=i;f[q+4>>2]=H;switch(p<<24>>24){case 0:{w=0;break a;break}case 1:{w=1;break a;break}default:{n=0;return n|0}}}else w=0;while(0);f[a+68>>2]=w}n=rd(a+88|0,c)|0;return n|0}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;c=a+4|0;d=f[c>>2]|0;e=d;g=f[a>>2]|0;h=g;do if((d|0)==(g|0)){i=a+8|0;j=f[i>>2]|0;k=a+12|0;l=f[k>>2]|0;m=l;if(j>>>0<l>>>0){l=j;n=((m-l>>2)+1|0)/2|0;o=j+(n<<2)|0;p=l-e|0;l=o+(0-(p>>2)<<2)|0;if(!p){q=o;r=o}else{Rj(l|0,d|0,p|0)|0;q=l;r=(f[i>>2]|0)+(n<<2)|0}f[c>>2]=q;f[i>>2]=r;s=q;break}n=m-h|0;m=(n|0)==0?1:n>>1;n=(m+3|0)>>>2;do if(m)if(m>>>0>1073741823){l=qa(8)|0;Dm(l,13552);f[l>>2]=4908;ta(l|0,1128,105)}else{t=wk(m<<2)|0;break}else t=0;while(0);l=t;p=t+(n<<2)|0;o=p;u=t+(m<<2)|0;if((d|0)==(j|0)){v=o;w=d}else{x=((j+-4-e|0)>>>2)+n+1|0;y=p;z=d;while(1){f[y>>2]=f[z>>2];z=z+4|0;if((z|0)==(j|0))break;else y=y+4|0}v=t+(x<<2)|0;w=f[a>>2]|0}f[a>>2]=l;f[c>>2]=o;f[i>>2]=v;f[k>>2]=u;if(!w)s=p;else{Ko(w);s=f[c>>2]|0}}else s=d;while(0);f[s+-4>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+-4;return}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=b;Wl(a+16|0);Wl(a+36|0);Wl(a+56|0);Wl(a+76|0);e=a+96|0;f[e>>2]=0;g=a+100|0;f[g>>2]=0;h=a+104|0;f[h>>2]=0;i=(b|0)==0;do if(!i)if(b>>>0>1073741823)$n(e);else{j=b<<2;k=wk(j)|0;f[e>>2]=k;l=k+(b<<2)|0;f[h>>2]=l;oh(k|0,0,j|0)|0;f[g>>2]=l;break}while(0);g=a+108|0;f[g>>2]=0;h=a+112|0;f[h>>2]=0;e=a+116|0;f[e>>2]=0;if(!i){l=b<<2;j=wk(l)|0;f[g>>2]=j;g=j+(b<<2)|0;f[e>>2]=g;oh(j|0,0,l|0)|0;f[h>>2]=g}g=b<<5|1;f[d>>2]=0;h=d+4|0;f[h>>2]=0;l=d+8|0;f[l>>2]=0;if(!i){j=b<<2;e=wk(j)|0;f[d>>2]=e;k=e+(b<<2)|0;f[l>>2]=k;oh(e|0,0,j|0)|0;f[h>>2]=k}fg(a+120|0,g,d);k=f[d>>2]|0;if(k|0){f[h>>2]=k;Ko(k)}f[d>>2]=0;k=d+4|0;f[k>>2]=0;h=d+8|0;f[h>>2]=0;if(!i){i=b<<2;j=wk(i)|0;f[d>>2]=j;e=j+(b<<2)|0;f[h>>2]=e;oh(j|0,0,i|0)|0;f[k>>2]=e}fg(a+132|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}f[k>>2]=g;Ko(g);u=c;return}function we(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=b;ym(a+16|0);Wl(a+32|0);Wl(a+52|0);Wl(a+72|0);e=a+92|0;f[e>>2]=0;g=a+96|0;f[g>>2]=0;h=a+100|0;f[h>>2]=0;i=(b|0)==0;do if(!i)if(b>>>0>1073741823)$n(e);else{j=b<<2;k=wk(j)|0;f[e>>2]=k;l=k+(b<<2)|0;f[h>>2]=l;oh(k|0,0,j|0)|0;f[g>>2]=l;break}while(0);g=a+104|0;f[g>>2]=0;h=a+108|0;f[h>>2]=0;e=a+112|0;f[e>>2]=0;if(!i){l=b<<2;j=wk(l)|0;f[g>>2]=j;g=j+(b<<2)|0;f[e>>2]=g;oh(j|0,0,l|0)|0;f[h>>2]=g}g=b<<5|1;f[d>>2]=0;h=d+4|0;f[h>>2]=0;l=d+8|0;f[l>>2]=0;if(!i){j=b<<2;e=wk(j)|0;f[d>>2]=e;k=e+(b<<2)|0;f[l>>2]=k;oh(e|0,0,j|0)|0;f[h>>2]=k}fg(a+116|0,g,d);k=f[d>>2]|0;if(k|0){f[h>>2]=k;Ko(k)}f[d>>2]=0;k=d+4|0;f[k>>2]=0;h=d+8|0;f[h>>2]=0;if(!i){i=b<<2;j=wk(i)|0;f[d>>2]=j;e=j+(b<<2)|0;f[h>>2]=e;oh(j|0,0,i|0)|0;f[k>>2]=e}fg(a+128|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}f[k>>2]=g;Ko(g);u=c;return}function xe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;d=u;u=u+48|0;e=d+40|0;g=d+32|0;h=d+8|0;i=d;j=d+24|0;k=d+16|0;l=a+4|0;m=f[l>>2]|0;n=b;b=f[n>>2]|0;o=f[n+4>>2]|0;n=c;c=f[n>>2]|0;p=f[n+4>>2]|0;n=c-b<<3;f[l>>2]=m-o+p+n;l=(f[a>>2]|0)+(m>>>5<<2)|0;a=m&31;m=l;if((a|0)!=(o|0)){q=h;f[q>>2]=b;f[q+4>>2]=o;q=i;f[q>>2]=c;f[q+4>>2]=p;f[j>>2]=m;f[j+4>>2]=a;f[g>>2]=f[h>>2];f[g+4>>2]=f[h+4>>2];f[e>>2]=f[i>>2];f[e+4>>2]=f[i+4>>2];id(k,g,e,j);u=d;return}j=p-o+n|0;n=b;if((j|0)>0){if(!o){r=j;s=0;t=l;v=n}else{b=32-o|0;p=(j|0)<(b|0)?j:b;e=-1>>>(b-p|0)&-1<<o;f[l>>2]=f[l>>2]&~e|f[n>>2]&e;e=p+o|0;r=j-p|0;s=e&31;t=l+(e>>>5<<2)|0;v=n+4|0}n=(r|0)/32|0;Rj(t|0,v|0,n<<2|0)|0;e=r-(n<<5)|0;r=t+(n<<2)|0;t=r;if((e|0)>0){l=-1>>>(32-e|0);f[r>>2]=f[r>>2]&~l|f[v+(n<<2)>>2]&l;w=e;x=t}else{w=s;x=t}}else{w=o;x=m}f[k>>2]=x;f[k+4>>2]=w;u=d;return}function ye(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=f[a+8>>2]|0;e=a+76|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[i>>2]|0;l=(f[j>>2]|0)-k>>2;if(h>>>0<=l>>>0)if(h>>>0<l>>>0){f[j>>2]=k+(h<<2);m=g;n=h}else{m=g;n=h}else{Of(i,h-l|0,3328);l=f[e>>2]|0;m=l;n=f[l+80>>2]|0}l=f[m+96>>2]|0;e=(f[m+100>>2]|0)-l|0;m=(e|0)/12|0;h=l;if(!e){o=1;return o|0}e=a+80|0;a=c+68|0;c=f[d+28>>2]|0;d=0;while(1){l=d*3|0;i=f[c+(l<<2)>>2]|0;if((i|0)==-1){o=0;p=10;break}g=f[(f[e>>2]|0)+12>>2]|0;k=f[g+(i<<2)>>2]|0;if(k>>>0>=n>>>0){o=0;p=10;break}i=f[a>>2]|0;f[i+(f[h+(d*12|0)>>2]<<2)>>2]=k;k=f[c+(l+1<<2)>>2]|0;if((k|0)==-1){o=0;p=10;break}j=f[g+(k<<2)>>2]|0;if(j>>>0>=n>>>0){o=0;p=10;break}f[i+(f[h+(d*12|0)+4>>2]<<2)>>2]=j;j=f[c+(l+2<<2)>>2]|0;if((j|0)==-1){o=0;p=10;break}l=f[g+(j<<2)>>2]|0;if(l>>>0>=n>>>0){o=0;p=10;break}f[i+(f[h+(d*12|0)+8>>2]<<2)>>2]=l;d=d+1|0;if(d>>>0>=m>>>0){o=1;p=10;break}}if((p|0)==10)return o|0;return 0}function ze(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h+16|0;j=h;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Ka[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Ka[f[(f[b>>2]|0)+36>>2]&127](b)|0;m=La[f[(f[b>>2]|0)+44>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=La[f[(f[b>>2]|0)+40>>2]&127](b,d)|0;if(!n){f[j>>2]=f[b+44>>2];f[j+4>>2]=l;f[j+12>>2]=m;f[j+8>>2]=m+12;ic(a,i,c,k,e,j,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[j>>2]=f[b+44>>2];f[j+4>>2]=n;f[j+12>>2]=m;f[j+8>>2]=m+12;hc(a,i,c,k,e,j,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function Ae(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(sc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=Vc(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<4194304){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=4194304){r=t;break}else q=t}}else r=o;while(0);q=r&1048575;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>20)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function Be(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(vc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=Wc(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<2097152){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=2097152){r=t;break}else q=t}}else r=o;while(0);q=r&524287;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>19)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(wc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=Xc(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<1048576){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=1048576){r=t;break}else q=t}}else r=o;while(0);q=r&262143;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>18)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function De(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(xc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=Yc(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<262144){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=262144){r=t;break}else q=t}}else r=o;while(0);q=r&65535;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>16)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(yc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=Zc(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<131072){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=131072){r=t;break}else q=t}}else r=o;while(0);q=r&32767;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>15)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function Fe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(tc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=$c(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<32768){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=32768){r=t;break}else q=t}}else r=o;while(0);q=r&8191;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>13)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function Ge(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+64|0;e=d;g=e;i=g+52|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(i|0));do if(uc(e,b)|0){g=(a|0)==0;if(!g?(f[e+12>>2]|0)==0:0){j=0;break}i=ad(e,b)|0;if(g|i^1)j=i;else{i=e+44|0;g=e+48|0;k=e+40|0;l=e+16|0;m=e+28|0;n=0;o=f[g>>2]|0;while(1){a:do if(o>>>0<16384){p=f[i>>2]|0;q=o;while(1){if((p|0)<=0){r=q;break a}s=f[k>>2]|0;p=p+-1|0;f[i>>2]=p;t=q<<8|(h[s+p>>0]|0);f[g>>2]=t;if(t>>>0>=16384){r=t;break}else q=t}}else r=o;while(0);q=r&4095;p=f[(f[l>>2]|0)+(q<<2)>>2]|0;t=f[m>>2]|0;o=(W(f[t+(p<<3)>>2]|0,r>>>12)|0)+q-(f[t+(p<<3)+4>>2]|0)|0;f[g>>2]=o;f[c+(n<<2)>>2]=p;n=n+1|0;if((n|0)==(a|0)){j=1;break}}}}else j=0;while(0);a=f[e+28>>2]|0;if(a|0){f[e+32>>2]=a;Ko(a)}a=f[e+16>>2]|0;if(a|0){f[e+20>>2]=a;Ko(a)}a=f[e>>2]|0;if(!a){u=d;return j|0}f[e+4>>2]=a;Ko(a);u=d;return j|0}function He(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f[a+4>>2]=f[b+4>>2];c=a+8|0;d=b+8|0;if((a|0)==(b|0))return a|0;e=b+12|0;g=f[e>>2]|0;if(!g)h=0;else{i=a+16|0;do if(g>>>0>f[i>>2]<<5>>>0){j=f[c>>2]|0;if(!j)k=g;else{Ko(j);f[c>>2]=0;f[i>>2]=0;f[a+12>>2]=0;k=f[e>>2]|0}if((k|0)<0)$n(c);else{j=((k+-1|0)>>>5)+1|0;l=wk(j<<2)|0;f[c>>2]=l;f[a+12>>2]=0;f[i>>2]=j;m=f[e>>2]|0;n=l;break}}else{m=g;n=f[c>>2]|0}while(0);Rj(n|0,f[d>>2]|0,((m+-1|0)>>>5<<2)+4|0)|0;h=f[e>>2]|0}f[a+12>>2]=h;h=a+20|0;e=b+20|0;m=b+24|0;b=f[m>>2]|0;if(!b)o=0;else{d=a+28|0;do if(b>>>0>f[d>>2]<<5>>>0){n=f[h>>2]|0;if(!n)p=b;else{Ko(n);f[h>>2]=0;f[d>>2]=0;f[a+24>>2]=0;p=f[m>>2]|0}if((p|0)<0)$n(h);else{n=((p+-1|0)>>>5)+1|0;c=wk(n<<2)|0;f[h>>2]=c;f[a+24>>2]=0;f[d>>2]=n;q=f[m>>2]|0;r=c;break}}else{q=b;r=f[h>>2]|0}while(0);Rj(r|0,f[e>>2]|0,((q+-1|0)>>>5<<2)+4|0)|0;o=f[m>>2]|0}f[a+24>>2]=o;return a|0}function Ie(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(((d-g|0)/12|0)>>>0>=b>>>0){oh(g|0,0,b*12|0)|0;f[e>>2]=h+(b*12|0);return}i=f[a>>2]|0;j=(g-i|0)/12|0;g=j+b|0;k=i;if(g>>>0>357913941)$n(a);l=(d-i|0)/12|0;d=l<<1;m=l>>>0<178956970?(d>>>0<g>>>0?g:d):357913941;do if(m)if(m>>>0>357913941){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{n=wk(m*12|0)|0;break}else n=0;while(0);d=n+(j*12|0)|0;j=n+(m*12|0)|0;oh(d|0,0,b*12|0)|0;m=d+(b*12|0)|0;if((h|0)==(k|0)){o=d;p=k;q=h;r=i}else{i=h;h=d;do{d=h;h=h+-12|0;b=i;i=i+-12|0;f[h>>2]=0;n=d+-8|0;f[n>>2]=0;g=d+-4|0;f[g>>2]=0;f[h>>2]=f[i>>2];d=b+-8|0;f[n>>2]=f[d>>2];n=b+-4|0;f[g>>2]=f[n>>2];f[n>>2]=0;f[d>>2]=0;f[i>>2]=0}while((i|0)!=(k|0));k=f[a>>2]|0;o=h;p=k;q=f[e>>2]|0;r=k}f[a>>2]=o;f[e>>2]=m;f[c>>2]=j;if((q|0)!=(p|0)){j=q;do{q=j;j=j+-12|0;c=f[j>>2]|0;if(c|0){f[q+-8>>2]=c;Ko(c)}}while((j|0)!=(p|0))}if(!r)return;Ko(r);return}function Je(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f[c>>2]=1;d=a+4|0;e=c+8|0;g=c+12|0;c=f[e>>2]|0;i=(f[g>>2]|0)-c|0;if(i>>>0<4294967292){eg(e,i+4|0,0);j=f[e>>2]|0}else j=c;c=j+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[c>>0]=i;b[c+1>>0]=i>>8;b[c+2>>0]=i>>16;b[c+3>>0]=i>>24;i=a+8|0;c=a+12|0;d=f[i>>2]|0;if((f[c>>2]|0)!=(d|0)){j=0;k=d;do{d=k+(j<<2)|0;l=f[e>>2]|0;m=(f[g>>2]|0)-l|0;if(m>>>0<4294967292){eg(e,m+4|0,0);n=f[e>>2]|0}else n=l;l=n+m|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;j=j+1|0;k=f[i>>2]|0}while(j>>>0<(f[c>>2]|0)-k>>2>>>0)}k=a+20|0;a=f[e>>2]|0;c=(f[g>>2]|0)-a|0;if(c>>>0<4294967292){eg(e,c+4|0,0);o=f[e>>2]|0;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}else{o=a;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}}function Ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;c=a+8|0;d=f[c>>2]|0;e=a+12|0;g=f[e>>2]|0;h=g;do if((d|0)==(g|0)){i=a+4|0;j=f[i>>2]|0;k=j;l=f[a>>2]|0;m=l;if(j>>>0>l>>>0){n=((k-m>>2)+1|0)/-2|0;o=j+(n<<2)|0;p=d-k|0;if(!p)q=o;else{Rj(o|0,j|0,p|0)|0;q=(f[i>>2]|0)+(n<<2)|0}n=o+(p>>2<<2)|0;f[c>>2]=n;f[i>>2]=q;r=n;break}n=h-m|0;m=(n|0)==0?1:n>>1;n=m>>>2;do if(m)if(m>>>0>1073741823){p=qa(8)|0;Dm(p,13552);f[p>>2]=4908;ta(p|0,1128,105)}else{s=wk(m<<2)|0;break}else s=0;while(0);p=s;o=s+(n<<2)|0;t=o;u=s+(m<<2)|0;if((j|0)==(d|0)){v=t;w=l}else{x=n+((d+-4-k|0)>>>2)+1|0;y=o;o=j;while(1){f[y>>2]=f[o>>2];o=o+4|0;if((o|0)==(d|0))break;else y=y+4|0}v=s+(x<<2)|0;w=f[a>>2]|0}f[a>>2]=p;f[i>>2]=t;f[c>>2]=v;f[e>>2]=u;if(!w)r=v;else{Ko(w);r=f[c>>2]|0}}else r=d;while(0);f[r>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+4;return}function Le(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=a+4|0;g=f[e>>2]|0;if(!g){f[c>>2]=e;h=e;return h|0}e=b[d+11>>0]|0;i=e<<24>>24<0;j=i?f[d+4>>2]|0:e&255;e=i?f[d>>2]|0:d;d=a+4|0;a=g;while(1){g=a+16|0;i=b[g+11>>0]|0;k=i<<24>>24<0;l=k?f[a+20>>2]|0:i&255;i=l>>>0<j>>>0;m=i?l:j;n=(m|0)==0;if(!n?(o=k?f[g>>2]|0:g,p=Fi(e,o,m)|0,(p|0)!=0):0)if((p|0)<0)q=7;else{r=o;q=11}else if(j>>>0>=l>>>0)if(n)q=12;else{r=k?f[g>>2]|0:g;q=11}else q=7;if((q|0)==7){q=0;g=f[a>>2]|0;if(!g){q=8;break}else{s=a;t=g}}else if((q|0)==11){q=0;g=Fi(r,e,m)|0;if(g)if((g|0)<0)q=14;else{q=16;break}else q=12}if((q|0)==12){q=0;if(i)q=14;else{q=16;break}}if((q|0)==14){q=0;u=a+4|0;i=f[u>>2]|0;if(!i){q=15;break}else{s=u;t=i}}d=s;a=t}if((q|0)==8){f[c>>2]=a;h=a;return h|0}else if((q|0)==15){f[c>>2]=a;h=u;return h|0}else if((q|0)==16){f[c>>2]=a;h=d;return h|0}return 0}function Me(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;Wh(f[a+4>>2]|0,(f[g+56>>2]|0)-(f[g+52>>2]|0)>>2);g=a+84|0;a=f[g>>2]|0;if(!a){h=f[(f[e>>2]|0)+64>>2]|0;i=(f[h+4>>2]|0)-(f[h>>2]|0)>>2;h=(i>>>0)/3|0;if(i>>>0<=2){j=1;u=b;return j|0}i=0;while(1){f[d>>2]=i*3;f[c>>2]=f[d>>2];i=i+1|0;if(!(Hb(e,c)|0)){j=0;k=10;break}if(i>>>0>=h>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}else{h=f[a>>2]|0;if((f[a+4>>2]|0)==(h|0)){j=1;u=b;return j|0}a=0;i=h;while(1){f[d>>2]=f[i+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(Hb(e,c)|0)){j=0;k=10;break}h=f[g>>2]|0;i=f[h>>2]|0;if(a>>>0>=(f[h+4>>2]|0)-i>>2>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}return 0}function Ne(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=c+8|0;e=f[d>>2]|0;g=f[d+4>>2]|0;d=c+16|0;i=d;k=f[i>>2]|0;l=f[i+4>>2]|0;i=vl(k|0,l|0,4,0)|0;m=H;if((g|0)<(m|0)|(g|0)==(m|0)&e>>>0<i>>>0){n=0;return n|0}o=f[c>>2]|0;p=o+k|0;q=h[p>>0]|h[p+1>>0]<<8|h[p+2>>0]<<16|h[p+3>>0]<<24;p=d;f[p>>2]=i;f[p+4>>2]=m;m=vl(k|0,l|0,8,0)|0;p=H;if((g|0)<(p|0)|(g|0)==(p|0)&e>>>0<m>>>0){n=0;return n|0}i=d;f[i>>2]=m;f[i+4>>2]=p;if(!(q&1)){n=0;return n|0}i=(Z(q|0)|0)^31;if((i+-1|0)>>>0>28){n=0;return n|0}f[a+8>>2]=i+1;q=2<<i;f[a+12>>2]=q+-1;i=q+-2|0;f[a+16>>2]=i;f[a+20>>2]=(i|0)/2|0;if((j[c+38>>1]|0)<514){a:do if((g|0)>(p|0)|(g|0)==(p|0)&e>>>0>m>>>0){i=b[o+m>>0]|0;q=vl(k|0,l|0,9,0)|0;r=d;f[r>>2]=q;f[r+4>>2]=H;switch(i<<24>>24){case 0:{s=0;break a;break}case 1:{s=1;break a;break}default:{n=0;return n|0}}}else s=0;while(0);f[a+68>>2]=s}n=rd(a+88|0,c)|0;return n|0}function Oe(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;Wh(f[a+4>>2]|0,(f[g+28>>2]|0)-(f[g+24>>2]|0)>>2);g=a+84|0;a=f[g>>2]|0;if(!a){h=f[e>>2]|0;i=(f[h+4>>2]|0)-(f[h>>2]|0)>>2;h=(i>>>0)/3|0;if(i>>>0<=2){j=1;u=b;return j|0}i=0;while(1){f[d>>2]=i*3;f[c>>2]=f[d>>2];i=i+1|0;if(!(Ib(e,c)|0)){j=0;k=10;break}if(i>>>0>=h>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}else{h=f[a>>2]|0;if((f[a+4>>2]|0)==(h|0)){j=1;u=b;return j|0}a=0;i=h;while(1){f[d>>2]=f[i+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(Ib(e,c)|0)){j=0;k=10;break}h=f[g>>2]|0;i=f[h>>2]|0;if(a>>>0>=(f[h+4>>2]|0)-i>>2>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}return 0}function Pe(a,b,c,d){a=a|0;b=_(b);c=_(c);d=d|0;var e=Ia,f=Ia,g=Ia,h=Ia,i=Ia,j=Ia,k=0.0,l=Ia,m=Ia,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=Ia,u=Ia,v=0,w=0;e=_(b+c);f=_(b-c);if(!(f<=_(.5))|(!(f>=_(-.5))|(!(e>=_(.5))|!(e<=_(1.5))))){do if(!(e<=_(.5))){if(e>=_(1.5)){g=_(_(1.5)-c);h=_(_(1.5)-b);break}if(!(f<=_(-.5))){g=_(c+_(.5));h=_(b+_(-.5));break}else{g=_(c+_(-.5));h=_(b+_(.5));break}}else{g=_(_(.5)-c);h=_(_(.5)-b)}while(0);i=_(h+g);j=_(g-h);k=-1.0;l=g;m=h}else{i=e;j=f;k=1.0;l=b;m=c}c=_(+l*2.0+-1.0);l=_(+m*2.0+-1.0);o=+i*2.0;p=o+-1.0;q=3.0-o;o=+j*2.0;r=o+1.0;s=1.0-o;o=s<r?s:r;r=q<p?q:p;j=_(k*(o<r?o:r));i=_(_(l*l)+_(_(c*c)+_(j*j)));if(+i<1.0e-06){n[d>>2]=_(0.0);t=_(0.0);u=_(0.0);v=d+4|0;n[v>>2]=u;w=d+8|0;n[w>>2]=t;return}else{m=_(_(1.0)/_(K(_(i))));i=_(m*j);n[d>>2]=i;t=_(m*l);u=_(m*c);v=d+4|0;n[v>>2]=u;w=d+8|0;n[w>>2]=t;return}}function Qe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;f[a>>2]=c;f[a+68>>2]=0;f[a+72>>2]=0;ae(e,c);g=a+4|0;h=f[e>>2]|0;f[e>>2]=0;i=f[g>>2]|0;f[g>>2]=h;if(!i){f[e>>2]=0;j=h}else{h=f[i+76>>2]|0;if(h|0){f[i+80>>2]=h;Ko(h)}h=f[i+64>>2]|0;if(h|0){f[i+68>>2]=h;Ko(h)}h=f[i+48>>2]|0;if(h|0){f[i+52>>2]=h;Ko(h)}h=f[i+24>>2]|0;if(h|0){f[i+28>>2]=h;Ko(h)}h=f[i+12>>2]|0;if(h|0){f[i+16>>2]=h;Ko(h)}h=f[i>>2]|0;if(h|0){f[i+4>>2]=h;Ko(h)}Ko(i);i=f[e>>2]|0;f[e>>2]=0;if(i|0){h=f[i+76>>2]|0;if(h|0){f[i+80>>2]=h;Ko(h)}h=f[i+64>>2]|0;if(h|0){f[i+68>>2]=h;Ko(h)}h=f[i+48>>2]|0;if(h|0){f[i+52>>2]=h;Ko(h)}h=f[i+24>>2]|0;if(h|0){f[i+28>>2]=h;Ko(h)}h=f[i+12>>2]|0;if(h|0){f[i+16>>2]=h;Ko(h)}h=f[i>>2]|0;if(h|0){f[i+4>>2]=h;Ko(h)}Ko(i)}j=f[g>>2]|0}if(!j){k=0;u=d;return k|0}j=((f[c+100>>2]|0)-(f[c+96>>2]|0)|0)/12|0;b[e>>0]=0;Gf(a+56|0,j,e);k=1;u=d;return k|0}function Re(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=c&255;g=(d|0)!=0;a:do if(g&(a&3|0)!=0){h=c&255;i=a;j=d;while(1){if((b[i>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=i+1|0;o=j+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=n;j=o}else{q=n;r=o;s=p;m=5;break}}}else{q=a;r=d;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else m=16;b:do if((m|0)==6){r=c&255;if((b[k>>0]|0)==r<<24>>24)if(!l){m=16;break}else{t=k;break}q=W(e,16843009)|0;c:do if(l>>>0>3){s=k;g=l;while(1){d=f[s>>2]^q;if((d&-2139062144^-2139062144)&d+-16843009|0){u=g;v=s;break c}d=s+4|0;a=g+-4|0;if(a>>>0>3){s=d;g=a}else{w=d;x=a;m=11;break}}}else{w=k;x=l;m=11}while(0);if((m|0)==11)if(!x){m=16;break}else{u=x;v=w}q=v;g=u;while(1){if((b[q>>0]|0)==r<<24>>24){t=q;break b}g=g+-1|0;if(!g){m=16;break}else q=q+1|0}}while(0);if((m|0)==16)t=0;return t|0}function Se(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){oh(g|0,0,b<<2|0)|0;f[e>>2]=h+(b<<2);return}i=f[a>>2]|0;j=g-i>>2;g=j+b|0;k=i;if(g>>>0>1073741823)$n(a);l=d-i|0;d=l>>1;m=l>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(m)if(m>>>0>1073741823){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{n=wk(m<<2)|0;break}else n=0;while(0);d=n+(j<<2)|0;g=n+(m<<2)|0;oh(d|0,0,b<<2|0)|0;m=d+(b<<2)|0;if((h|0)==(k|0)){o=d;p=k;q=h;r=i}else{b=j+-1-((h+-4+(0-i)|0)>>>2)|0;i=h;h=d;do{h=h+-4|0;i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[h>>2]=d}while((i|0)!=(k|0));k=f[a>>2]|0;o=n+(b<<2)|0;p=k;q=f[e>>2]|0;r=k}f[a>>2]=o;f[e>>2]=m;f[c>>2]=g;if((q|0)!=(p|0)){g=q;do{g=g+-4|0;q=f[g>>2]|0;f[g>>2]=0;if(q|0)Pa[f[(f[q>>2]|0)+4>>2]&127](q)}while((g|0)!=(p|0))}if(!r)return;Ko(r);return}function Te(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0;if((b|0)==-2)g=0;else{i=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;do if((Ka[f[(f[d>>2]|0)+8>>2]&127](d)|0)==1){ze(a,d,b,c,e,((h[d+36>>0]|0)<<8|(h[d+37>>0]|0))&65535);if(!(f[a>>2]|0)){f[a>>2]=0;break}else return}while(0);d=wk(44)|0;f[d>>2]=1536;f[d+4>>2]=i;i=d+8|0;f[i>>2]=f[e>>2];f[i+4>>2]=f[e+4>>2];f[i+8>>2]=f[e+8>>2];f[i+12>>2]=f[e+12>>2];f[i+16>>2]=f[e+16>>2];f[i+20>>2]=f[e+20>>2];i=d+32|0;f[i>>2]=0;c=d+36|0;f[c>>2]=0;b=d+40|0;f[b>>2]=0;j=f[e+24>>2]|0;k=(f[e+28>>2]|0)-j|0;e=k>>2;if(k|0){if(e>>>0>1073741823)$n(i);l=wk(k)|0;f[c>>2]=l;f[i>>2]=l;f[b>>2]=l+(e<<2);if((k|0)>0){Bf(l|0,j|0,k|0)|0;f[c>>2]=l+(k>>>2<<2)}}f[d>>2]=1592;g=d}f[a>>2]=g;return}function Ue(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=f[a+32>>2]|0;d=c+8|0;e=f[d+4>>2]|0;g=c+16|0;h=g;i=f[h>>2]|0;j=f[h+4>>2]|0;if(!((e|0)>(j|0)|((e|0)==(j|0)?(f[d>>2]|0)>>>0>i>>>0:0))){k=0;return k|0}d=b[(f[c>>2]|0)+i>>0]|0;c=vl(i|0,j|0,1,0)|0;j=g;f[j>>2]=c;f[j+4>>2]=H;j=a+48|0;c=f[j>>2]|0;f[j>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);switch(d<<24>>24){case 0:{d=wk(384)|0;Kh(d);c=f[j>>2]|0;f[j>>2]=d;if(!c)l=d;else{Pa[f[(f[c>>2]|0)+4>>2]&127](c);m=11}break}case 1:{c=wk(424)|0;bh(c);d=f[j>>2]|0;f[j>>2]=c;if(!d)l=c;else{Pa[f[(f[d>>2]|0)+4>>2]&127](d);m=11}break}case 2:{d=wk(440)|0;Gg(d);c=f[j>>2]|0;f[j>>2]=d;if(!c)l=d;else{Pa[f[(f[c>>2]|0)+4>>2]&127](c);m=11}break}default:m=11}if((m|0)==11){m=f[j>>2]|0;if(!m){k=0;return k|0}else l=m}k=La[f[(f[l>>2]|0)+8>>2]&127](l,a)|0;return k|0}function Ve(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=u;u=u+32|0;g=e+12|0;h=e;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=Dh(c)|0;if(i>>>0>4294967279)$n(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=6}}else{m=i+16&-16;n=wk(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=6}if((l|0)==6){Bf(k|0,c|0,i|0)|0;j=k}b[j+i>>0]=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;i=Dh(d)|0;if(i>>>0>4294967279)$n(h);if(i>>>0<11){b[h+11>>0]=i;if(!i)o=h;else{p=h;l=12}}else{j=i+16&-16;k=wk(j)|0;f[h>>2]=k;f[h+8>>2]=j|-2147483648;f[h+4>>2]=i;p=k;l=12}if((l|0)==12){Bf(p|0,d|0,i|0)|0;o=p}b[o+i>>0]=0;i=f[a+4>>2]|0;if((i|0)!=0?(o=Ed(i,g,h)|0,(o|0)!=0):0)q=Di(a,f[o+40>>2]|0)|0;else q=-1;if((b[h+11>>0]|0)<0)Ko(f[h>>2]|0);if((b[g+11>>0]|0)>=0){u=e;return q|0}Ko(f[g>>2]|0);u=e;return q|0}function We(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=b;g=c-e|0;h=g>>1;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0<=j-k>>1>>>0){m=a+4|0;n=(f[m>>2]|0)-k>>1;o=h>>>0>n>>>0;p=b+(n<<1)|0;n=o?p:c;q=n;r=q-e|0;if(r|0)Rj(k|0,b|0,r|0)|0;if(!o){f[m>>2]=l+(r>>1<<1);return}if((n|0)==(c|0))return;n=f[m>>2]|0;r=c+-2-q|0;q=p;p=n;while(1){d[p>>1]=d[q>>1]|0;q=q+2|0;if((q|0)==(c|0))break;else p=p+2|0}f[m>>2]=n+((r>>>1)+1<<1);return}if(!k)s=j;else{j=a+4|0;f[j>>2]=k;Ko(k);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;s=0}if((g|0)<0)$n(a);g=s>>1>>>0<1073741823?(s>>>0<h>>>0?h:s):2147483647;if((g|0)<0)$n(a);s=wk(g<<1)|0;h=a+4|0;f[h>>2]=s;f[a>>2]=s;f[i>>2]=s+(g<<1);if((b|0)==(c|0))return;g=c+-2-e|0;e=b;b=s;while(1){d[b>>1]=d[e>>1]|0;e=e+2|0;if((e|0)==(c|0))break;else b=b+2|0}f[h>>2]=s+((g>>>1)+1<<1);return}function Xe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;d=u;u=u+32|0;e=d+24|0;g=d+16|0;h=d+8|0;i=d;j=a+4|0;k=f[j>>2]|0;l=f[b>>2]|0;m=f[b+4>>2]|0;b=f[c>>2]|0;n=f[c+4>>2]|0;c=n-m+(b-l<<3)|0;f[j>>2]=c+k;j=(f[a>>2]|0)+(k>>>5<<2)|0;a=k&31;k=j;if((m|0)!=(a|0)){f[e>>2]=l;f[e+4>>2]=m;f[g>>2]=b;f[g+4>>2]=n;f[h>>2]=k;f[h+4>>2]=a;jd(i,e,g,h);u=d;return}h=l;if((c|0)>0){if(!m){o=c;p=j;q=0;r=l;s=h}else{l=32-m|0;g=(c|0)<(l|0)?c:l;e=-1>>>(l-g|0)&-1<<m;f[j>>2]=f[j>>2]&~e|f[h>>2]&e;e=g+m|0;l=h+4|0;o=c-g|0;p=j+(e>>>5<<2)|0;q=e&31;r=l;s=l}l=(o|0)/32|0;Rj(p|0,r|0,l<<2|0)|0;r=o-(l<<5)|0;o=p+(l<<2)|0;p=o;if((r|0)>0){e=-1>>>(32-r|0);f[o>>2]=f[o>>2]&~e|f[s+(l<<2)>>2]&e;t=r;v=p}else{t=q;v=p}}else{t=m;v=k}f[i>>2]=v;f[i+4>>2]=t;u=d;return}function Ye(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;if(p|0)Rj(i|0,b|0,p|0)|0;if(!m){f[k>>2]=j+(p>>2<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=c+-4-o|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+((p>>>2)+1<<2);return}if(!i)q=h;else{h=a+4|0;f[h>>2]=i;Ko(i);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;q=0}if(e>>>0>1073741823)$n(a);h=q>>1;i=q>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(i>>>0>1073741823)$n(a);h=wk(i<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(i<<2);if((b|0)==(c|0))return;i=c+-4-d|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+((i>>>2)+1<<2);return}function Ze(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;f[a>>2]=1536;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];b=a+32|0;e=c+24|0;f[b>>2]=0;g=a+36|0;f[g>>2]=0;h=a+40|0;f[h>>2]=0;i=c+28|0;c=(f[i>>2]|0)-(f[e>>2]|0)|0;j=c>>2;if(c|0){if(j>>>0>1073741823)$n(b);k=wk(c)|0;f[g>>2]=k;f[b>>2]=k;f[h>>2]=k+(j<<2);j=f[e>>2]|0;e=(f[i>>2]|0)-j|0;if((e|0)>0){Bf(k|0,j|0,e|0)|0;f[g>>2]=k+(e>>>2<<2)}}f[a>>2]=2320;e=a+44|0;f[e>>2]=f[d>>2];f[e+4>>2]=f[d+4>>2];f[e+8>>2]=f[d+8>>2];f[e+12>>2]=f[d+12>>2];f[a>>2]=2376;e=a+60|0;f[e>>2]=2432;f[a+64>>2]=0;f[a+68>>2]=0;k=a+72|0;f[k>>2]=f[d>>2];f[k+4>>2]=f[d+4>>2];f[k+8>>2]=f[d+8>>2];f[k+12>>2]=f[d+12>>2];f[e>>2]=2460;f[a+88>>2]=1;e=a+92|0;f[e>>2]=-1;f[e+4>>2]=-1;f[e+8>>2]=-1;f[e+12>>2]=-1;ym(a+108|0);return}function _e(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;f[a>>2]=1536;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];b=a+32|0;e=c+24|0;f[b>>2]=0;g=a+36|0;f[g>>2]=0;h=a+40|0;f[h>>2]=0;i=c+28|0;c=(f[i>>2]|0)-(f[e>>2]|0)|0;j=c>>2;if(c|0){if(j>>>0>1073741823)$n(b);k=wk(c)|0;f[g>>2]=k;f[b>>2]=k;f[h>>2]=k+(j<<2);j=f[e>>2]|0;e=(f[i>>2]|0)-j|0;if((e|0)>0){Bf(k|0,j|0,e|0)|0;f[g>>2]=k+(e>>>2<<2)}}f[a>>2]=1872;e=a+44|0;f[e>>2]=f[d>>2];f[e+4>>2]=f[d+4>>2];f[e+8>>2]=f[d+8>>2];f[e+12>>2]=f[d+12>>2];f[a>>2]=1928;e=a+60|0;f[e>>2]=1984;f[a+64>>2]=0;f[a+68>>2]=0;k=a+72|0;f[k>>2]=f[d>>2];f[k+4>>2]=f[d+4>>2];f[k+8>>2]=f[d+8>>2];f[k+12>>2]=f[d+12>>2];f[e>>2]=2012;f[a+88>>2]=1;e=a+92|0;f[e>>2]=-1;f[e+4>>2]=-1;f[e+8>>2]=-1;f[e+12>>2]=-1;ym(a+108|0);return}function $e(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f[a>>2]=0;c=a+4|0;f[c>>2]=0;d=a+8|0;f[d>>2]=0;e=a+16|0;f[e>>2]=0;g=a+20|0;f[g>>2]=0;h=a+24|0;f[h>>2]=0;i=b+4|0;j=(f[i>>2]|0)-(f[b>>2]|0)|0;k=(j|0)/20|0;if(j|0){if(k>>>0>214748364)$n(e);l=wk(j)|0;f[g>>2]=l;f[e>>2]=l;f[h>>2]=l+(k*20|0);k=f[b>>2]|0;b=(f[i>>2]|0)-k|0;if((b|0)>0){Bf(l|0,k|0,b|0)|0;k=l+(((b>>>0)/20|0)*20|0)|0;f[g>>2]=k;f[a+28>>2]=0;if((k|0)==(l|0)){m=0;n=a+12|0;f[n>>2]=m;return}g=(k-l|0)/20|0;k=0;b=0;do{i=W(f[l+(k*20|0)+16>>2]|0,f[l+(k*20|0)+12>>2]|0)|0;b=b>>>0<i>>>0?i:b;k=k+1|0}while(k>>>0<g>>>0);if(!b){m=0;n=a+12|0;f[n>>2]=m;return}if((b|0)<0)$n(a);g=wk(b)|0;oh(g|0,0,b|0)|0;k=g+b|0;b=g;f[a>>2]=b;f[c>>2]=k;f[d>>2]=k;m=b;n=a+12|0;f[n>>2]=m;return}}f[a+28>>2]=0;m=0;n=a+12|0;f[n>>2]=m;return}function af(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=f[b>>2]|0;do if((c|0)!=-1){b=f[(f[(f[a+4>>2]|0)+12>>2]|0)+(c<<2)>>2]|0;d=c+1|0;e=((d>>>0)%3|0|0)==0?c+-2|0:d;if((e|0)==-1)g=-1;else{d=(e|0)/3|0;g=f[(f[(f[a>>2]|0)+96>>2]|0)+(d*12|0)+(e-(d*3|0)<<2)>>2]|0}if((b|0)!=-1){d=(((b>>>0)%3|0|0)==0?2:-1)+b|0;if((d|0)==-1){h=-1;i=b;j=0}else{e=(d|0)/3|0;h=f[(f[(f[a>>2]|0)+96>>2]|0)+(e*12|0)+(d-(e*3|0)<<2)>>2]|0;i=b;j=0}}else{h=-1;i=-1;j=1}if((g|0)!=(h|0)){k=-1;return k|0}b=(((c>>>0)%3|0|0)==0?2:-1)+c|0;if((b|0)==-1)if(j){l=-1;m=-1;n=i;break}else o=-1;else{e=(b|0)/3|0;d=f[(f[(f[a>>2]|0)+96>>2]|0)+(e*12|0)+(b-(e*3|0)<<2)>>2]|0;if(j){l=-1;m=d;n=i;break}else o=d}d=i+1|0;e=((d>>>0)%3|0|0)==0?i+-2|0:d;if((e|0)==-1){l=-1;m=o;n=i}else{d=(e|0)/3|0;l=f[(f[(f[a>>2]|0)+96>>2]|0)+(d*12|0)+(e-(d*3|0)<<2)>>2]|0;m=o;n=i}}else{l=-1;m=-1;n=-1}while(0);k=(m|0)==(l|0)?n:-1;return k|0}function bf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;d=c;e=wk(64)|0;g=wk(12)|0;h=f[(f[a+4>>2]|0)+80>>2]|0;f[g+4>>2]=0;f[g>>2]=3584;f[g+8>>2]=h;f[d>>2]=g;Zi(e,d);g=e;if((b|0)>=0){h=a+8|0;i=a+12|0;a=f[i>>2]|0;j=f[h>>2]|0;k=a-j>>2;do if((k|0)<=(b|0)){l=b+1|0;m=a;if(l>>>0>k>>>0){Se(h,l-k|0);break}if(l>>>0<k>>>0){n=j+(l<<2)|0;if((n|0)!=(m|0)){l=m;do{l=l+-4|0;m=f[l>>2]|0;f[l>>2]=0;if(m|0)Pa[f[(f[m>>2]|0)+4>>2]&127](m)}while((l|0)!=(n|0))}f[i>>2]=n}}while(0);i=(f[h>>2]|0)+(b<<2)|0;b=f[i>>2]|0;f[i>>2]=g;if(!b)o=1;else{Pa[f[(f[b>>2]|0)+4>>2]&127](b);o=1}}else{Pa[f[(f[e>>2]|0)+4>>2]&127](e);o=0}e=f[d>>2]|0;f[d>>2]=0;if(!e){u=c;return o|0}Pa[f[(f[e>>2]|0)+4>>2]&127](e);u=c;return o|0}function cf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+4|0;e=f[a>>2]|0;g=((f[d>>2]|0)-e|0)/12|0;h=g+1|0;if(h>>>0>357913941)$n(a);i=a+8|0;j=((f[i>>2]|0)-e|0)/12|0;e=j<<1;k=j>>>0<178956970?(e>>>0<h>>>0?h:e):357913941;do if(k)if(k>>>0>357913941){e=qa(8)|0;Dm(e,13552);f[e>>2]=4908;ta(e|0,1128,105)}else{l=wk(k*12|0)|0;break}else l=0;while(0);e=l+(g*12|0)|0;g=l+(k*12|0)|0;Yi(e,c);c=e+12|0;k=f[a>>2]|0;l=f[d>>2]|0;if((l|0)==(k|0)){m=e;n=k;o=k}else{h=l;l=e;do{l=l+-12|0;h=h+-12|0;f[l>>2]=f[h>>2];f[l+4>>2]=f[h+4>>2];f[l+8>>2]=f[h+8>>2];f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0}while((h|0)!=(k|0));m=l;n=f[a>>2]|0;o=f[d>>2]|0}f[a>>2]=m;f[d>>2]=c;f[i>>2]=g;g=n;if((o|0)!=(g|0)){i=o;do{i=i+-12|0;if((b[i+11>>0]|0)<0)Ko(f[i>>2]|0)}while((i|0)!=(g|0))}if(!n)return;Ko(n);return}function df(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0>j-k>>2>>>0){if(!k)m=j;else{j=a+4|0;f[j>>2]=k;Ko(k);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;m=0}if(h>>>0>1073741823)$n(a);j=m>>1;n=m>>2>>>0<536870911?(j>>>0<h>>>0?h:j):1073741823;if(n>>>0>1073741823)$n(a);j=wk(n<<2)|0;m=a+4|0;f[m>>2]=j;f[a>>2]=j;f[i>>2]=j+(n<<2);if((g|0)<=0)return;Bf(j|0,b|0,g|0)|0;f[m>>2]=j+(g>>>2<<2);return}g=a+4|0;a=f[g>>2]|0;j=a-k>>2;k=h>>>0>j>>>0;h=k?b+(j<<2)|0:c;c=a;if((h|0)==(b|0))o=l;else{a=h+-4-e|0;e=b;b=l;while(1){f[b>>2]=f[e>>2];e=e+4|0;if((e|0)==(h|0))break;else b=b+4|0}o=l+((a>>>2)+1<<2)|0}if(!k){f[g>>2]=o;return}o=d-h|0;if((o|0)<=0)return;Bf(c|0,h|0,o|0)|0;f[g>>2]=(f[g>>2]|0)+(o>>>2<<2);return}function ef(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)$n(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{k=wk(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;i=b;l=f[c>>2]|0;if((l|0)==(b|0)){m=d;n=i;o=b}else{p=e+-1-((l+-4-i|0)>>>2)|0;i=l;l=d;do{l=l+-4|0;i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[l>>2]=d}while((i|0)!=(b|0));m=k+(p<<2)|0;n=f[a>>2]|0;o=f[c>>2]|0}f[a>>2]=m;f[c>>2]=j;f[h>>2]=g;g=n;if((o|0)!=(g|0)){h=o;do{h=h+-4|0;o=f[h>>2]|0;f[h>>2]=0;if(o|0){eh(o);Ko(o)}}while((h|0)!=(g|0))}if(!n)return;Ko(n);return}function ff(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do if(!(en(a,f[c+8>>2]|0,g)|0)){if(!(en(a,f[c>>2]|0,g)|0)){h=f[a+8>>2]|0;Ta[f[(f[h>>2]|0)+24>>2]&3](h,c,d,e,g);break}if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;i=c+44|0;if((f[i>>2]|0)==4)break;j=c+52|0;b[j>>0]=0;k=c+53|0;b[k>>0]=0;l=f[a+8>>2]|0;Ua[f[(f[l>>2]|0)+20>>2]&3](l,c,d,d,1,g);if(b[k>>0]|0)if(!(b[j>>0]|0)){m=1;n=11}else n=15;else{m=0;n=11}do if((n|0)==11){f[h>>2]=d;j=c+40|0;f[j>>2]=(f[j>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0){b[c+54>>0]=1;if(m){n=15;break}else{o=4;break}}if(m)n=15;else o=4}while(0);if((n|0)==15)o=3;f[i>>2]=o;break}if((e|0)==1)f[c+32>>2]=1}else nk(0,c,d,e);while(0);return}function gf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=f[a>>2]|0;f[a+4>>2]=c;d=a+16|0;f[d>>2]=0;e=a+12|0;f[e>>2]=c;c=b+8|0;g=c;i=f[g>>2]|0;j=f[g+4>>2]|0;g=b+16|0;k=g;l=f[k>>2]|0;m=vl(l|0,f[k+4>>2]|0,4,0)|0;k=H;if((j|0)<(k|0)|(j|0)==(k|0)&i>>>0<m>>>0){n=0;return n|0}o=(f[b>>2]|0)+l|0;l=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;o=g;f[o>>2]=m;f[o+4>>2]=k;if(!((l|0)!=0&(l&3|0)==0)){n=0;return n|0}o=wl(i|0,j|0,m|0,k|0)|0;p=H;if((p|0)<0|(p|0)==0&o>>>0<l>>>0){n=0;return n|0}o=l>>>2;if(!o){q=m;r=k;s=j;t=i}else{Eg(a,o);o=c;c=g;q=f[c>>2]|0;r=f[c+4>>2]|0;s=f[o+4>>2]|0;t=f[o>>2]|0}o=vl(q|0,r|0,l|0,0)|0;r=H;if((s|0)<(r|0)|(s|0)==(r|0)&t>>>0<o>>>0){n=0;return n|0}Bf(f[a>>2]|0,(f[b>>2]|0)+q|0,l|0)|0;q=g;b=vl(f[q>>2]|0,f[q+4>>2]|0,l|0,0)|0;l=g;f[l>>2]=b;f[l+4>>2]=H;f[e>>2]=f[a>>2];f[d>>2]=0;n=1;return n|0}function hf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;d=u;u=u+48|0;e=d+16|0;g=d;h=d+32|0;i=a+28|0;j=f[i>>2]|0;f[h>>2]=j;k=a+20|0;l=(f[k>>2]|0)-j|0;f[h+4>>2]=l;f[h+8>>2]=b;f[h+12>>2]=c;b=l+c|0;l=a+60|0;f[g>>2]=f[l>>2];f[g+4>>2]=h;f[g+8>>2]=2;j=Ol(ya(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=2;m=b;n=h;o=j;while(1){if((o|0)<0)break;m=m-o|0;p=f[n+4>>2]|0;q=o>>>0>p>>>0;r=q?n+8|0:n;s=g+(q<<31>>31)|0;t=o-(q?p:0)|0;f[r>>2]=(f[r>>2]|0)+t;p=r+4|0;f[p>>2]=(f[p>>2]|0)-t;f[e>>2]=f[l>>2];f[e+4>>2]=r;f[e+8>>2]=s;o=Ol(ya(146,e|0)|0)|0;if((m|0)==(o|0)){v=3;break a}else{g=s;n=r}}f[a+16>>2]=0;f[i>>2]=0;f[k>>2]=0;f[a>>2]=f[a>>2]|32;if((g|0)==2)w=0;else w=c-(f[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=f[a+44>>2]|0;f[a+16>>2]=v+(f[a+48>>2]|0);a=v;f[i>>2]=a;f[k>>2]=a;w=c}u=d;return w|0}function jf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=u;u=u+16|0;d=c;e=a+76|0;g=f[e>>2]|0;f[e>>2]=0;f[a+80>>2]=0;f[a+84>>2]=0;if(g|0)Ko(g);g=a+64|0;e=f[g>>2]|0;f[g>>2]=0;f[a+68>>2]=0;f[a+72>>2]=0;if(e|0)Ko(e);e=b+4|0;g=f[e>>2]|0;h=f[b>>2]|0;i=((g-h|0)/12|0)*3|0;j=a+4|0;k=f[a>>2]|0;l=(f[j>>2]|0)-k>>2;m=h;if(i>>>0<=l>>>0)if(i>>>0<l>>>0){f[j>>2]=k+(i<<2);n=g;o=h;p=m}else{n=g;o=h;p=m}else{Eg(a,i-l|0);l=f[b>>2]|0;n=f[e>>2]|0;o=l;p=l}if((n|0)!=(o|0)){o=f[a>>2]|0;l=(n-p|0)/12|0;n=0;do{e=n*3|0;f[o+(e<<2)>>2]=f[p+(n*12|0)>>2];f[o+(e+1<<2)>>2]=f[p+(n*12|0)+4>>2];f[o+(e+2<<2)>>2]=f[p+(n*12|0)+8>>2];n=n+1|0}while(n>>>0<l>>>0)}f[d>>2]=-1;if(!(Ub(a,d)|0)){q=0;u=c;return q|0}yb(a,f[d>>2]|0)|0;q=1;u=c;return q|0}function kf(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if(((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(f[(f[d>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)==0:0)?(j=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if(((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(f[(f[d>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)==0:0)?(k=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if((((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(f[(f[d>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0:0)?(h=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function lf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/12|0)>>>0>=b>>>0){i=b;j=h;do{f[j>>2]=f[c>>2];f[j+4>>2]=f[c+4>>2];f[j+8>>2]=f[c+8>>2];j=(f[g>>2]|0)+12|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/12|0;h=j+b|0;if(h>>>0>357913941)$n(a);k=(e-i|0)/12|0;i=k<<1;e=k>>>0<178956970?(i>>>0<h>>>0?h:i):357913941;do if(e)if(e>>>0>357913941){i=qa(8)|0;Dm(i,13552);f[i>>2]=4908;ta(i|0,1128,105)}else{l=wk(e*12|0)|0;break}else l=0;while(0);i=l+(j*12|0)|0;j=l+(e*12|0)|0;e=b;b=i;while(1){f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];e=e+-1|0;if(!e)break;else b=b+12|0}b=f[a>>2]|0;e=(f[g>>2]|0)-b|0;c=i+(((e|0)/-12|0)*12|0)|0;if((e|0)>0)Bf(c|0,b|0,e|0)|0;f[a>>2]=c;f[g>>2]=l+(h*12|0);f[d>>2]=j;if(!b)return;Ko(b);return}function mf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=a+8|0;f[c>>2]=f[b>>2];He(a+12|0,b+4|0)|0;d=a+44|0;e=b+36|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];if((c|0)==(b|0)){f[a+96>>2]=f[b+88>>2];return}else{df(a+60|0,f[b+52>>2]|0,f[b+56>>2]|0);df(a+72|0,f[b+64>>2]|0,f[b+68>>2]|0);df(a+84|0,f[b+76>>2]|0,f[b+80>>2]|0);f[a+96>>2]=f[b+88>>2];Df(a+100|0,f[b+92>>2]|0,f[b+96>>2]|0);return}}function nf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;if(e-g>>2>>>0<b>>>0){if(!g)i=e;else{e=a+4|0;f[e>>2]=g;Ko(g);f[d>>2]=0;f[e>>2]=0;f[a>>2]=0;i=0}if(b>>>0>1073741823)$n(a);e=i>>1;j=i>>2>>>0<536870911?(e>>>0<b>>>0?b:e):1073741823;if(j>>>0>1073741823)$n(a);e=wk(j<<2)|0;i=a+4|0;f[i>>2]=e;f[a>>2]=e;f[d>>2]=e+(j<<2);j=b;d=e;while(1){f[d>>2]=f[c>>2];j=j+-1|0;if(!j)break;else d=d+4|0}k=i;l=e+(b<<2)|0;f[k>>2]=l;return}else{e=a+4|0;a=f[e>>2]|0;i=a-g>>2;g=i>>>0<b>>>0;d=g?i:b;j=a;if(d|0){a=d;d=h;while(1){f[d>>2]=f[c>>2];a=a+-1|0;if(!a)break;else d=d+4|0}}if(!g){k=e;l=h+(b<<2)|0;f[k>>2]=l;return}h=b-i|0;i=h;b=j;while(1){f[b>>2]=f[c>>2];i=i+-1|0;if(!i)break;else b=b+4|0}k=e;l=j+(h<<2)|0;f[k>>2]=l;return}}function of(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=a+20|0;if(Ec(e,c)|0){g=0;return g|0}a=Wb(e,c)|0;c=f[d>>2]|0;f[d>>2]=0;d=f[a>>2]|0;f[a>>2]=c;if(!d){g=1;return g|0}c=f[d+28>>2]|0;if(c|0){a=c;do{c=a;a=f[a>>2]|0;Dg(c+8|0);Ko(c)}while((a|0)!=0)}a=d+20|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0)Ko(c);c=f[d+8>>2]|0;if(c|0){a=c;do{c=a;a=f[a>>2]|0;e=c+8|0;h=f[c+20>>2]|0;if(h|0){f[c+24>>2]=h;Ko(h)}if((b[e+11>>0]|0)<0)Ko(f[e>>2]|0);Ko(c)}while((a|0)!=0)}a=f[d>>2]|0;f[d>>2]=0;if(a|0)Ko(a);Ko(d);g=1;return g|0}function pf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=f[c>>2]|0;c=f[a>>2]|0;e=c+(d>>>5<<2)|0;f[e>>2]=f[e>>2]|1<<(d&31);e=f[a+64>>2]|0;g=(d|0)==-1;h=d+1|0;if(!g?(i=((h>>>0)%3|0|0)==0?d+-2|0:h,(i|0)!=-1):0)j=f[(f[e>>2]|0)+(i<<2)>>2]|0;else j=-1;i=f[a+12>>2]|0;h=i+(j>>>5<<2)|0;f[h>>2]=f[h>>2]|1<<(j&31);if(g){g=i+536870908|0;k=g;l=f[g>>2]|0;m=-2147483648}else{g=(((d>>>0)%3|0|0)==0?2:-1)+d|0;if((g|0)==-1)n=-1;else n=f[(f[e>>2]|0)+(g<<2)>>2]|0;g=i+(n>>>5<<2)|0;f[g>>2]=1<<(n&31)|f[g>>2];g=f[(f[e+12>>2]|0)+(d<<2)>>2]|0;if((g|0)==-1)return;b[a+24>>0]=0;a=c+(g>>>5<<2)|0;f[a>>2]=f[a>>2]|1<<(g&31);a=g+1|0;c=((a>>>0)%3|0|0)==0?g+-2|0:a;if((c|0)==-1)o=-1;else o=f[(f[e>>2]|0)+(c<<2)>>2]|0;c=i+(o>>>5<<2)|0;f[c>>2]=1<<(o&31)|f[c>>2];c=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((c|0)==-1)p=-1;else p=f[(f[e>>2]|0)+(c<<2)>>2]|0;c=i+(p>>>5<<2)|0;k=c;l=1<<(p&31);m=f[c>>2]|0}f[k>>2]=l|m;return}function qf(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=a+172|0;d=f[c>>2]|0;do if((d|0)==-1){e=f[a+144>>2]|0;g=Ka[f[(f[e>>2]|0)+32>>2]&127](e)|0;if(((h[g+36>>0]<<8|h[g+37>>0])&65535)<514)if(b[a+76>>0]|0){g=a+72|0;e=f[g>>2]|0;i=f[a+64>>2]|0;j=f[a+68>>2]|0;k=i+(e>>>3)|0;if(k>>>0<j>>>0?(l=h[k>>0]|0,k=e+1|0,f[g>>2]=k,(1<<(e&7)&l|0)!=0):0){l=i+(k>>>3)|0;if(l>>>0<j>>>0){m=(h[l>>0]|0)>>>(k&7)&1;n=e+2|0;f[g>>2]=n;o=m;p=i+(n>>>3)|0;q=n}else{o=0;p=l;q=k}if(p>>>0<j>>>0){j=(h[p>>0]|0)>>>(q&7);f[g>>2]=q+1;r=j<<1&2}else r=0;s=(r|o)<<1|1}else s=0}else s=1;else s=7}else{j=(f[a+196>>2]|0)+(d<<2)|0;g=f[j>>2]|0;k=g+-1|0;f[j>>2]=k;if((g|0)<1){t=9;return t|0}else{s=f[3496+(f[(f[(f[a+184>>2]|0)+((f[c>>2]|0)*12|0)>>2]|0)+(k<<2)>>2]<<2)>>2]|0;break}}while(0);f[a+168>>2]=s;t=s;return t|0}function rf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0<=(i-j|0)>>>0){l=a+4|0;m=(f[l>>2]|0)-j|0;n=g>>>0>m>>>0;o=c+m|0;m=n?o:d;p=m-e|0;if(p|0)Rj(k|0,c|0,p|0)|0;if(!n){f[l>>2]=k+p;return}if((m|0)==(d|0))return;m=o;o=f[l>>2]|0;do{b[o>>0]=b[m>>0]|0;m=m+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((m|0)!=(d|0));return}if(!j)q=i;else{i=a+4|0;f[i>>2]=j;Ko(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;q=0}if((g|0)<0)$n(a);i=q<<1;k=q>>>0<1073741823?(i>>>0<g>>>0?g:i):2147483647;if((k|0)<0)$n(a);i=wk(k)|0;g=a+4|0;f[g>>2]=i;f[a>>2]=i;f[h>>2]=i+k;if((c|0)==(d|0))return;k=c;c=i;do{b[c>>0]=b[k>>0]|0;k=k+1|0;c=(f[g>>2]|0)+1|0;f[g>>2]=c}while((k|0)!=(d|0));return}function sf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+32|0;h=g+16|0;i=g+8|0;j=g;k=e>>>0>1073741823?-1:e<<2;l=Ho(k)|0;oh(l|0,0,k|0)|0;k=a+8|0;a=f[l+4>>2]|0;m=f[b>>2]|0;n=f[b+4>>2]|0;f[i>>2]=f[l>>2];f[i+4>>2]=a;f[j>>2]=m;f[j+4>>2]=n;Cc(h,k,i,j);f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];if((e|0)>=(d|0)){Io(l);u=g;return 1}n=0-e|0;m=i+4|0;a=j+4|0;o=h+4|0;p=e;do{q=c+(p<<2)|0;r=q+(n<<2)|0;s=b+(p<<2)|0;t=f[r+4>>2]|0;v=f[s>>2]|0;w=f[s+4>>2]|0;f[i>>2]=f[r>>2];f[m>>2]=t;f[j>>2]=v;f[a>>2]=w;Cc(h,k,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[o>>2];p=p+e|0}while((p|0)<(d|0));Io(l);u=g;return 1}function tf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;f[a>>2]=1536;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];b=a+32|0;e=c+24|0;f[b>>2]=0;g=a+36|0;f[g>>2]=0;h=a+40|0;f[h>>2]=0;i=c+28|0;c=(f[i>>2]|0)-(f[e>>2]|0)|0;j=c>>2;if(c|0){if(j>>>0>1073741823)$n(b);k=wk(c)|0;f[g>>2]=k;f[b>>2]=k;f[h>>2]=k+(j<<2);j=f[e>>2]|0;e=(f[i>>2]|0)-j|0;if((e|0)>0){Bf(k|0,j|0,e|0)|0;f[g>>2]=k+(e>>>2<<2)}}f[a>>2]=2320;e=a+44|0;f[e>>2]=f[d>>2];f[e+4>>2]=f[d+4>>2];f[e+8>>2]=f[d+8>>2];f[e+12>>2]=f[d+12>>2];f[a>>2]=2488;f[a+60>>2]=0;f[a+64>>2]=0;f[a+76>>2]=0;f[a+80>>2]=0;f[a+84>>2]=0;e=a+88|0;f[e>>2]=f[d>>2];f[e+4>>2]=f[d+4>>2];f[e+8>>2]=f[d+8>>2];f[e+12>>2]=f[d+12>>2];return}function uf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;f[a>>2]=1536;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];b=a+32|0;e=c+24|0;f[b>>2]=0;g=a+36|0;f[g>>2]=0;h=a+40|0;f[h>>2]=0;i=c+28|0;c=(f[i>>2]|0)-(f[e>>2]|0)|0;j=c>>2;if(c|0){if(j>>>0>1073741823)$n(b);k=wk(c)|0;f[g>>2]=k;f[b>>2]=k;f[h>>2]=k+(j<<2);j=f[e>>2]|0;e=(f[i>>2]|0)-j|0;if((e|0)>0){Bf(k|0,j|0,e|0)|0;f[g>>2]=k+(e>>>2<<2)}}f[a>>2]=1872;e=a+44|0;f[e>>2]=f[d>>2];f[e+4>>2]=f[d+4>>2];f[e+8>>2]=f[d+8>>2];f[e+12>>2]=f[d+12>>2];f[a>>2]=2040;f[a+60>>2]=0;f[a+64>>2]=0;f[a+76>>2]=0;f[a+80>>2]=0;f[a+84>>2]=0;e=a+88|0;f[e>>2]=f[d>>2];f[e+4>>2]=f[d+4>>2];f[e+8>>2]=f[d+8>>2];f[e+12>>2]=f[d+12>>2];return}function vf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,k=0,l=0,m=0,n=0;do if(c){if((j[a+38>>1]|0)>=514){if(ah(d,a)|0)break;else e=0;return e|0}g=a+8|0;i=f[g>>2]|0;k=f[g+4>>2]|0;g=a+16|0;l=g;m=f[l>>2]|0;n=vl(m|0,f[l+4>>2]|0,8,0)|0;l=H;if((k|0)<(l|0)|(k|0)==(l|0)&i>>>0<n>>>0){e=0;return e|0}else{n=(f[a>>2]|0)+m|0;m=n;i=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=n+4|0;n=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=d;l=m;b[l>>0]=i;b[l+1>>0]=i>>8;b[l+2>>0]=i>>16;b[l+3>>0]=i>>24;i=m+4|0;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;n=g;i=vl(f[n>>2]|0,f[n+4>>2]|0,8,0)|0;n=g;f[n>>2]=i;f[n+4>>2]=H;break}}while(0);b[a+36>>0]=1;d=a+16|0;c=f[d>>2]|0;n=(f[a>>2]|0)+c|0;i=a+8|0;g=wl(f[i>>2]|0,f[i+4>>2]|0,c|0,f[d+4>>2]|0)|0;f[a+32>>2]=0;f[a+24>>2]=n;f[a+28>>2]=n+g;e=1;return e|0}function wf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;g=u;u=u+32|0;h=g+16|0;i=g+8|0;j=g;k=e>>>0>1073741823?-1:e<<2;l=Ho(k)|0;oh(l|0,0,k|0)|0;k=a+8|0;a=f[l>>2]|0;m=f[l+4>>2]|0;n=f[b+4>>2]|0;f[h>>2]=f[b>>2];f[h+4>>2]=n;f[j>>2]=a;f[j+4>>2]=m;gd(i,k,j,h);f[c>>2]=f[i>>2];f[c+4>>2]=f[i+4>>2];if((e|0)>=(d|0)){Io(l);u=g;return 1}m=0-e|0;a=h+4|0;n=j+4|0;o=i+4|0;p=e;do{q=c+(p<<2)|0;r=q+(m<<2)|0;s=b+(p<<2)|0;t=f[r>>2]|0;v=f[r+4>>2]|0;r=f[s+4>>2]|0;f[h>>2]=f[s>>2];f[a>>2]=r;f[j>>2]=t;f[n>>2]=v;gd(i,k,j,h);f[q>>2]=f[i>>2];f[q+4>>2]=f[o>>2];p=p+e|0}while((p|0)<(d|0));Io(l);u=g;return 1}function xf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(c>>>0>4294967279)$n(a);d=a+11|0;e=b[d>>0]|0;g=e<<24>>24<0;if(g){h=f[a+4>>2]|0;i=(f[a+8>>2]&2147483647)+-1|0}else{h=e&255;i=10}j=h>>>0>c>>>0?h:c;c=j>>>0<11;k=c?10:(j+16&-16)+-1|0;do if((k|0)!=(i|0)){do if(c){j=f[a>>2]|0;if(g){l=0;m=j;n=a;o=13}else{um(a,j,(e&255)+1|0)|0;Ko(j);o=16}}else{j=k+1|0;p=wk(j)|0;if(g){l=1;m=f[a>>2]|0;n=p;o=13;break}else{um(p,a,(e&255)+1|0)|0;q=p;r=j;s=a+4|0;o=15;break}}while(0);if((o|0)==13){j=a+4|0;um(n,m,(f[j>>2]|0)+1|0)|0;Ko(m);if(l){q=n;r=k+1|0;s=j;o=15}else o=16}if((o|0)==15){f[a+8>>2]=r|-2147483648;f[s>>2]=h;f[a>>2]=q;break}else if((o|0)==16){b[d>>0]=h;break}}while(0);return}function yf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)<0){g=0;return g|0}a:do if(!c){e=a+4|0;h=f[e>>2]|0;i=f[a>>2]|0;j=h-i|0;k=i;if(j>>>0>=d>>>0){if(j>>>0<=d>>>0)break;f[e>>2]=k+d;break}l=d-j|0;m=a+8|0;n=f[m>>2]|0;if((n-h|0)>>>0>=l>>>0){o=l;p=h;while(1){b[p>>0]=0;p=(f[e>>2]|0)+1|0;f[e>>2]=p;o=o+-1|0;if(!o)break a}}if((d|0)<0)$n(a);o=n-i|0;p=o<<1;h=o>>>0<1073741823?(p>>>0<d>>>0?d:p):2147483647;if(!h)q=0;else q=wk(h)|0;oh(q+j|0,0,l|0)|0;if((j|0)>0)Bf(q|0,k|0,j|0)|0;f[a>>2]=q;f[e>>2]=q+d;f[m>>2]=q+h;if(i|0)Ko(k)}else rf(a,c,c+d|0);while(0);d=a+24|0;a=d;c=vl(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=d;f[a>>2]=c;f[a+4>>2]=H;g=1;return g|0}function zf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+32|0;e=d+16|0;g=d;switch(c<<24>>24){case 0:{c=wk(44)|0;h=c;i=h+44|0;do{f[h>>2]=0;h=h+4|0}while((h|0)<(i|0));Qj(c);f[c>>2]=3696;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=c;u=d;return}case 1:{c=wk(44)|0;h=c;i=h+44|0;do{f[h>>2]=0;h=h+4|0}while((h|0)<(i|0));Qj(c);f[c>>2]=3652;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=c;u=d;return}default:{c=wk(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=28;h=c;j=11853;i=h+28|0;do{b[h>>0]=b[j>>0]|0;h=h+1|0;j=j+1|0}while((h|0)<(i|0));b[c+28>>0]=0;f[e>>2]=-1;c=e+4|0;Yi(c,g);f[a>>2]=f[e>>2];Yi(a+4|0,c);f[a+16>>2]=0;if((b[c+11>>0]|0)<0)Ko(f[c>>2]|0);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=d;return}}}function Af(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=u;u=u+16|0;e=d+8|0;g=d+4|0;h=d;if(!c){i=0;u=d;return i|0}f[a>>2]=b;f[e>>2]=0;zh(e,b)|0;a:do if(!(f[e>>2]|0))j=8;else{b=0;while(1){zh(g,f[a>>2]|0)|0;k=wk(44)|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=1065353216;l=k+20|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[k+36>>2]=1065353216;f[k+40>>2]=f[g>>2];if(!(Mc(a,k)|0))break;f[h>>2]=k;bi(c,h)|0;l=f[h>>2]|0;f[h>>2]=0;if(l|0){eh(l);Ko(l)}b=b+1|0;if(b>>>0>=(f[e>>2]|0)>>>0){j=8;break a}}eh(k);Ko(k);m=0}while(0);if((j|0)==8)m=Mc(a,c)|0;i=m;u=d;return i|0}function Bf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;if((d|0)>=8192)return Ca(a|0,c|0,d|0)|0;e=a|0;g=a+d|0;if((a&3)==(c&3)){while(a&3){if(!d)return e|0;b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;d=d-1|0}h=g&-4|0;d=h-64|0;while((a|0)<=(d|0)){f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];f[a+12>>2]=f[c+12>>2];f[a+16>>2]=f[c+16>>2];f[a+20>>2]=f[c+20>>2];f[a+24>>2]=f[c+24>>2];f[a+28>>2]=f[c+28>>2];f[a+32>>2]=f[c+32>>2];f[a+36>>2]=f[c+36>>2];f[a+40>>2]=f[c+40>>2];f[a+44>>2]=f[c+44>>2];f[a+48>>2]=f[c+48>>2];f[a+52>>2]=f[c+52>>2];f[a+56>>2]=f[c+56>>2];f[a+60>>2]=f[c+60>>2];a=a+64|0;c=c+64|0}while((a|0)<(h|0)){f[a>>2]=f[c>>2];a=a+4|0;c=c+4|0}}else{h=g-4|0;while((a|0)<(h|0)){b[a>>0]=b[c>>0]|0;b[a+1>>0]=b[c+1>>0]|0;b[a+2>>0]=b[c+2>>0]|0;b[a+3>>0]=b[c+3>>0]|0;a=a+4|0;c=c+4|0}}while((a|0)<(g|0)){b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0}return e|0}function Cf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=a+132|0;c=f[b>>2]|0;if(c|0){d=a+136|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{e=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[e+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}g=a+120|0;c=f[g>>2]|0;if(c|0){d=a+124|0;b=f[d>>2]|0;if((b|0)==(c|0))j=c;else{h=b;do{b=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[b+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));j=f[g>>2]|0}f[d>>2]=c;Ko(j)}j=f[a+108>>2]|0;if(j|0){f[a+112>>2]=j;Ko(j)}j=f[a+96>>2]|0;if(!j){k=a+76|0;zk(k);l=a+56|0;zk(l);m=a+36|0;zk(m);n=a+16|0;zk(n);return}f[a+100>>2]=j;Ko(j);k=a+76|0;zk(k);l=a+56|0;zk(l);m=a+36|0;zk(m);n=a+16|0;zk(n);return}function Df(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0<=j-k>>2>>>0){m=a+4|0;n=(f[m>>2]|0)-k>>2;o=h>>>0>n>>>0;p=o?b+(n<<2)|0:c;c=p;n=c-e|0;if(n|0)Rj(k|0,b|0,n|0)|0;if(!o){f[m>>2]=l+(n>>2<<2);return}n=d-c|0;if((n|0)<=0)return;Bf(f[m>>2]|0,p|0,n|0)|0;f[m>>2]=(f[m>>2]|0)+(n>>>2<<2);return}if(!k)q=j;else{j=a+4|0;f[j>>2]=k;Ko(k);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;q=0}if(h>>>0>1073741823)$n(a);j=q>>1;k=q>>2>>>0<536870911?(j>>>0<h>>>0?h:j):1073741823;if(k>>>0>1073741823)$n(a);j=wk(k<<2)|0;h=a+4|0;f[h>>2]=j;f[a>>2]=j;f[i>>2]=j+(k<<2);if((g|0)<=0)return;Bf(j|0,b|0,g|0)|0;f[h>>2]=j+(g>>>2<<2);return}function Ef(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;f[e>>2]=b;g=a+8|0;if(((f[a+12>>2]|0)-(f[g>>2]|0)>>2|0)<=(b|0))xg(g,b+1|0);h=f[(f[c>>2]|0)+56>>2]|0;do if((h|0)<5){i=a+20+(h*12|0)+4|0;j=f[i>>2]|0;if((j|0)==(f[a+20+(h*12|0)+8>>2]|0)){Ng(a+20+(h*12|0)|0,e);break}else{f[j>>2]=b;f[i>>2]=j+4;break}}while(0);b=f[c>>2]|0;h=f[e>>2]|0;f[b+60>>2]=h;e=(f[g>>2]|0)+(h<<2)|0;f[c>>2]=0;c=f[e>>2]|0;f[e>>2]=b;if(!c){u=d;return}b=c+88|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0){b=f[e+8>>2]|0;if(b|0){f[e+12>>2]=b;Ko(b)}Ko(e)}e=f[c+68>>2]|0;if(e|0){f[c+72>>2]=e;Ko(e)}e=c+64|0;b=f[e>>2]|0;f[e>>2]=0;if(b|0){e=f[b>>2]|0;if(e|0){f[b+4>>2]=e;Ko(e)}Ko(b)}Ko(c);u=d;return}function Ff(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e+12|0;h=e+8|0;i=e;f[i>>2]=f[b>>2];f[g>>2]=f[i>>2];i=Ac(a,g,h,e+4|0,c)|0;c=f[i>>2]|0;if(c|0){j=c;u=e;return j|0}c=wk(40)|0;Yi(c+16|0,d);Yi(c+28|0,d+12|0);d=f[h>>2]|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=d;f[i>>2]=c;d=f[f[a>>2]>>2]|0;if(!d)k=c;else{f[a>>2]=d;k=f[i>>2]|0}vd(f[a+4>>2]|0,k);k=a+8|0;f[k>>2]=(f[k>>2]|0)+1;j=c;u=e;return j|0}function Gf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=0;if(!c){u=e;return}i=a+8|0;j=f[i>>2]|0;k=j<<5;if(k>>>0<c>>>0){f[g>>2]=0;l=g+4|0;f[l>>2]=0;m=g+8|0;f[m>>2]=0;if((c|0)<0)$n(a);n=j<<6;j=c+31&-32;vg(g,k>>>0<1073741823?(n>>>0<j>>>0?j:n):2147483647);n=f[a>>2]|0;f[a>>2]=f[g>>2];f[g>>2]=n;g=f[h>>2]|0;f[h>>2]=c;f[l>>2]=g;g=f[i>>2]|0;f[i>>2]=f[m>>2];f[m>>2]=g;if(n|0)Ko(n);o=a}else{f[h>>2]=c;o=a}a=f[o>>2]|0;o=a;h=a;a=c>>>5;n=a<<2;if(!(b[d>>0]|0)){oh(h|0,0,n|0)|0;d=c&31;g=o+(a<<2)|0;if(!d){u=e;return}f[g>>2]=f[g>>2]&~(-1>>>(32-d|0));u=e;return}else{oh(h|0,-1,n|0)|0;n=c&31;c=o+(a<<2)|0;if(!n){u=e;return}f[c>>2]=f[c>>2]|-1>>>(32-n|0);u=e;return}}function Hf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;c=b+8|0;d=f[c>>2]|0;e=f[c+4>>2]|0;c=b+16|0;g=c;i=f[g>>2]|0;j=f[g+4>>2]|0;g=vl(i|0,j|0,4,0)|0;k=H;if((e|0)<(k|0)|(e|0)==(k|0)&d>>>0<g>>>0){l=0;return l|0}m=f[b>>2]|0;b=m+i|0;n=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24;b=c;f[b>>2]=g;f[b+4>>2]=k;k=vl(i|0,j|0,8,0)|0;j=H;if((e|0)<(j|0)|(e|0)==(j|0)&d>>>0<k>>>0){l=0;return l|0}d=m+g|0;g=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=c;f[d>>2]=k;f[d+4>>2]=j;if((n|0)>(g|0)){l=0;return l|0}f[a+12>>2]=n;f[a+16>>2]=g;j=wl(g|0,((g|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=H;if(!(n>>>0<0|(n|0)==0&j>>>0<2147483647)){l=0;return l|0}n=j+1|0;f[a+20>>2]=n;j=(n|0)/2|0;g=a+24|0;f[g>>2]=j;f[a+28>>2]=0-j;if(n&1|0){l=1;return l|0}f[g>>2]=j+-1;l=1;return l|0}function If(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/12|0;h=g+1|0;i=e;j=d;if(h>>>0>357913941)$n(a);d=a+8|0;k=((f[d>>2]|0)-e|0)/12|0;l=k<<1;m=k>>>0<178956970?(l>>>0<h>>>0?h:l):357913941;do if(m)if(m>>>0>357913941){l=qa(8)|0;Dm(l,13552);f[l>>2]=4908;ta(l|0,1128,105)}else{n=wk(m*12|0)|0;break}else n=0;while(0);l=n+(g*12|0)|0;h=n+(m*12|0)|0;f[l>>2]=f[b>>2];f[n+(g*12|0)+4>>2]=f[b+4>>2];f[n+(g*12|0)+8>>2]=f[b+8>>2];b=l+12|0;if((j|0)==(i|0))o=l;else{g=j;j=l;while(1){l=j+-12|0;n=g;g=g+-12|0;f[l>>2]=f[g>>2];f[j+-8>>2]=f[n+-8>>2];f[j+-4>>2]=f[n+-4>>2];if((g|0)==(i|0)){o=l;break}else j=l}}f[a>>2]=o;f[c>>2]=b;f[d>>2]=h;if(!e)return;Ko(e);return}function Jf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+4|0;a=f[d>>2]|0;do if(a|0){e=b[c+11>>0]|0;g=e<<24>>24<0;h=g?f[c+4>>2]|0:e&255;e=g?f[c>>2]|0:c;g=d;i=a;do{j=i+16|0;k=b[j+11>>0]|0;l=k<<24>>24<0;m=l?f[i+20>>2]|0:k&255;k=h>>>0<m>>>0;n=k?h:m;if((n|0)!=0?(o=Fi(l?f[j>>2]|0:j,e,n)|0,(o|0)!=0):0)p=o;else p=m>>>0<h>>>0?-1:k&1;k=(p|0)<0;g=k?g:i;i=f[(k?i+4|0:i)>>2]|0}while((i|0)!=0);if((g|0)!=(d|0)){i=g+16|0;k=b[i+11>>0]|0;m=k<<24>>24<0;o=m?f[g+20>>2]|0:k&255;k=o>>>0<h>>>0?o:h;if(k|0?(n=Fi(e,m?f[i>>2]|0:i,k)|0,n|0):0){if((n|0)<0)break;else q=g;return q|0}if(h>>>0>=o>>>0){q=g;return q|0}}}while(0);q=d;return q|0}function Kf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[c+88>>2]|0;if(!d){e=0;return e|0}if((f[d>>2]|0)!=1){e=0;return e|0}g=d+8|0;d=f[g>>2]|0;f[a+4>>2]=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;i=a+8|0;j=c+24|0;c=b[j>>0]|0;k=c<<24>>24;l=a+12|0;m=f[i>>2]|0;n=(f[l>>2]|0)-m>>2;o=m;if(n>>>0>=k>>>0)if(n>>>0>k>>>0){f[l>>2]=o+(k<<2);p=c;q=d}else{p=c;q=d}else{Eg(i,k-n|0);p=b[j>>0]|0;q=f[g>>2]|0}g=q+4|0;j=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;if(p<<24>>24>0){g=f[i>>2]|0;i=p<<24>>24;p=j;n=4;k=0;while(1){f[g+(k<<2)>>2]=p;n=n+4|0;k=k+1|0;d=q+n|0;c=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;if((k|0)>=(i|0)){r=c;break}else p=c}}else r=j;f[a+20>>2]=r;e=1;return e|0}function Lf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+128|0;c=f[b>>2]|0;if(c|0){d=a+132|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{e=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[e+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}g=a+116|0;c=f[g>>2]|0;if(c|0){d=a+120|0;b=f[d>>2]|0;if((b|0)==(c|0))j=c;else{h=b;do{b=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[b+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));j=f[g>>2]|0}f[d>>2]=c;Ko(j)}j=f[a+104>>2]|0;if(j|0){f[a+108>>2]=j;Ko(j)}j=f[a+92>>2]|0;if(!j){k=a+72|0;zk(k);l=a+52|0;zk(l);m=a+32|0;zk(m);return}f[a+96>>2]=j;Ko(j);k=a+72|0;zk(k);l=a+52|0;zk(l);m=a+32|0;zk(m);return}function Mf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+224|0;g=e+120|0;h=e+80|0;i=e;j=e+136|0;k=h;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));f[g>>2]=f[d>>2];if((ub(0,c,g,i,h)|0)<0)m=-1;else{if((f[a+76>>2]|0)>-1)n=Po(a)|0;else n=0;d=f[a>>2]|0;k=d&32;if((b[a+74>>0]|0)<1)f[a>>2]=d&-33;d=a+48|0;if(!(f[d>>2]|0)){l=a+44|0;o=f[l>>2]|0;f[l>>2]=j;p=a+28|0;f[p>>2]=j;q=a+20|0;f[q>>2]=j;f[d>>2]=80;r=a+16|0;f[r>>2]=j+80;j=ub(a,c,g,i,h)|0;if(!o)s=j;else{Ma[f[a+36>>2]&31](a,0,0)|0;t=(f[q>>2]|0)==0?-1:j;f[l>>2]=o;f[d>>2]=0;f[r>>2]=0;f[p>>2]=0;f[q>>2]=0;s=t}}else s=ub(a,c,g,i,h)|0;h=f[a>>2]|0;f[a>>2]=h|k;if(n|0)Oo(a);m=(h&32|0)==0?s:-1}u=e;return m|0}function Nf(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+8|0;d=f[c>>2]|0;e=d+84|0;g=a+16|0;if(b[e>>0]|0){h=f[g>>2]|0;return h|0}a=f[g>>2]|0;if(!a){h=f[g>>2]|0;return h|0}i=a+84|0;if(!(b[i>>0]|0)){h=f[g>>2]|0;return h|0}j=d+68|0;k=d+72|0;d=(f[k>>2]|0)-(f[j>>2]|0)>>2;b[i>>0]=0;i=a+68|0;l=a+72|0;a=f[i>>2]|0;m=(f[l>>2]|0)-a>>2;if(d>>>0<=m>>>0)if(d>>>0<m>>>0){f[l>>2]=a+(d<<2);n=k;o=j;p=e}else{n=k;o=j;p=e}else{Of(i,d-m|0,1404);m=f[c>>2]|0;n=m+72|0;o=m+68|0;p=m+84|0}if(b[p>>0]|0){h=f[g>>2]|0;return h|0}p=f[o>>2]|0;o=p;m=(f[n>>2]|0)-p|0;p=m>>2;if(!m){h=f[g>>2]|0;return h|0}m=f[(f[g>>2]|0)+68>>2]|0;n=0;do{f[m+(n<<2)>>2]=f[o+(n<<2)>>2];n=n+1|0}while(n>>>0<p>>>0);h=f[g>>2]|0;return h|0}function Of(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;i=h;if(e-h>>2>>>0>=b>>>0){j=b;k=i;while(1){f[k>>2]=f[c>>2];j=j+-1|0;if(!j)break;else k=k+4|0}f[g>>2]=i+(b<<2);return}i=f[a>>2]|0;k=h-i|0;h=k>>2;j=h+b|0;if(j>>>0>1073741823)$n(a);l=e-i|0;e=l>>1;m=l>>2>>>0<536870911?(e>>>0<j>>>0?j:e):1073741823;do if(m)if(m>>>0>1073741823){e=qa(8)|0;Dm(e,13552);f[e>>2]=4908;ta(e|0,1128,105)}else{e=wk(m<<2)|0;n=e;o=e;break}else{n=0;o=0}while(0);e=n+(h<<2)|0;h=n+(m<<2)|0;m=b;j=e;while(1){f[j>>2]=f[c>>2];m=m+-1|0;if(!m)break;else j=j+4|0}if((k|0)>0)Bf(o|0,i|0,k|0)|0;f[a>>2]=n;f[g>>2]=e+(b<<2);f[d>>2]=h;if(!i)return;Ko(i);return}function Pf(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=u;u=u+64|0;i=h;j=f[a>>2]|0;k=a+(f[j+-8>>2]|0)|0;l=f[j+-4>>2]|0;f[i>>2]=e;f[i+4>>2]=a;f[i+8>>2]=c;f[i+12>>2]=g;g=i+16|0;c=i+20|0;a=i+24|0;j=i+28|0;m=i+32|0;n=i+40|0;o=g;p=o+36|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d[g+36>>1]=0;b[g+38>>0]=0;a:do if(en(l,e,0)|0){f[i+48>>2]=1;Ua[f[(f[l>>2]|0)+20>>2]&3](l,i,k,k,1,0);q=(f[a>>2]|0)==1?k:0}else{Ta[f[(f[l>>2]|0)+24>>2]&3](l,i,k,1,0);switch(f[i+36>>2]|0){case 0:{q=(f[n>>2]|0)==1&(f[j>>2]|0)==1&(f[m>>2]|0)==1?f[c>>2]|0:0;break a;break}case 1:break;default:{q=0;break a}}if((f[a>>2]|0)!=1?!((f[n>>2]|0)==0&(f[j>>2]|0)==1&(f[m>>2]|0)==1):0){q=0;break}q=f[g>>2]|0}while(0);u=h;return q|0}function Qf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=Ia;d=u;u=u+32|0;e=d+16|0;g=d;h=a+8|0;i=b[(f[h>>2]|0)+24>>0]<<2;j=f[a+16>>2]|0;if(!(f[j+80>>2]|0))k=0;else k=(f[f[j>>2]>>2]|0)+(f[j+48>>2]|0)|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;j=f[a+24>>2]|0;if((j+-2|0)>>>0>28){l=0;u=d;return l|0}f[g>>2]=j;a=1<<j;f[g+4>>2]=a+-1;j=a+-2|0;a=g+8|0;f[a>>2]=j;f[g+12>>2]=(j|0)/2|0;if(!c){l=1;u=d;return l|0}m=0;n=0;o=0;p=j;while(1){q=_(_(1.0)/_(p|0));Pe(g,_(q*_(f[k+(m<<2)>>2]|0)),_(q*_(f[k+((m|1)<<2)>>2]|0)),e);Bf((f[f[(f[h>>2]|0)+64>>2]>>2]|0)+o|0,e|0,i|0)|0;j=n+1|0;if((j|0)==(c|0)){l=1;break}m=m+2|0;n=j;o=o+i|0;p=f[a>>2]|0}u=d;return l|0}function Rf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=(f[a>>2]|0)+1794895138|0;g=fn(f[a+8>>2]|0,e)|0;h=fn(f[a+12>>2]|0,e)|0;i=fn(f[a+16>>2]|0,e)|0;a:do if((g>>>0<c>>>2>>>0?(j=c-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=fn(f[a+(q<<2)>>2]|0,e)|0;s=fn(f[a+(q+1<<2)>>2]|0,e)|0;if(!(s>>>0<c>>>0&r>>>0<(c-s|0)>>>0)){t=0;break a}if(b[a+(s+r)>>0]|0){t=0;break a}r=Ri(d,a+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}l=s?l:o;m=s?n:m-n|0}m=p+k|0;l=fn(f[a+(m<<2)>>2]|0,e)|0;j=fn(f[a+(m+1<<2)>>2]|0,e)|0;if(j>>>0<c>>>0&l>>>0<(c-j|0)>>>0)t=(b[a+(j+l)>>0]|0)==0?a+j|0:0;else t=0}else t=0;while(0);return t|0}function Sf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){i=b;j=h;while(1){f[j>>2]=1;i=i+-1|0;if(!i)break;else j=j+4|0}f[e>>2]=h+(b<<2);return}h=f[a>>2]|0;j=g-h|0;g=j>>2;i=g+b|0;if(i>>>0>1073741823)$n(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0<i>>>0?i:d):1073741823;do if(l)if(l>>>0>1073741823){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{d=wk(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;g=m+(l<<2)|0;l=b;i=d;while(1){f[i>>2]=1;l=l+-1|0;if(!l)break;else i=i+4|0}if((j|0)>0)Bf(n|0,h|0,j|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=g;if(!h)return;Ko(h);return}function Tf(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(j=f[(f[d+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(k=f[(f[d+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if(((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(h=f[(f[d+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function Uf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a+12|0;a:do if((f[e>>2]|0)!=(c|0)){g=f[a>>2]|0;h=a+4|0;i=f[h>>2]|0;if((i|0)!=(g|0)){j=i;do{j=j+-12|0;if((b[j+11>>0]|0)<0)Ko(f[j>>2]|0)}while((j|0)!=(g|0))}f[h>>2]=g;f[e>>2]=c;j=f[c+8>>2]|0;if(j|0){i=a+8|0;k=j;j=g;while(1){l=k+8|0;if((j|0)==(f[i>>2]|0))cf(a,l);else{Yi(j,l);f[h>>2]=(f[h>>2]|0)+12}l=f[k>>2]|0;if(!l)break a;k=l;j=f[h>>2]|0}}}while(0);if((d|0)<0){m=0;return m|0}c=f[a>>2]|0;if((((f[a+4>>2]|0)-c|0)/12|0)>>>0<=d>>>0){m=0;return m|0}a=c+(d*12|0)|0;if((b[a+11>>0]|0)<0){m=f[a>>2]|0;return m|0}else{m=a;return m|0}return 0}function Vf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=u;u=u+32|0;e=d+12|0;g=d;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;h=Dh(c)|0;if(h>>>0>4294967279)$n(e);if(h>>>0<11){b[e+11>>0]=h;if(!h)i=e;else{j=e;k=6}}else{l=h+16&-16;m=wk(l)|0;f[e>>2]=m;f[e+8>>2]=l|-2147483648;f[e+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,c|0,h|0)|0;i=j}b[i+h>>0]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=g+11|0;b[h>>0]=4;f[g>>2]=1701667182;b[g+4>>0]=0;i=f[a+4>>2]|0;if((i|0)!=0?(j=Ed(i,g,e)|0,(j|0)!=0):0)n=Di(a,f[j+40>>2]|0)|0;else n=-1;if((b[h>>0]|0)<0)Ko(f[g>>2]|0);if((b[e+11>>0]|0)>=0){u=d;return n|0}Ko(f[e>>2]|0);u=d;return n|0} +function sb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;g=u;u=u+64|0;d=g+16|0;h=g;i=a+8|0;f[i>>2]=e;j=a+32|0;k=a+36|0;l=f[j>>2]|0;m=(f[k>>2]|0)-l>>2;if(m>>>0>=e>>>0){if(m>>>0>e>>>0)f[k>>2]=l+(e<<2)}else Eg(j,e-m|0);m=d;j=m+48|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(j|0));f[h>>2]=0;if(!e){n=0;o=0}else{Of(d,e,h);n=f[d+12>>2]|0;o=f[d+16>>2]|0}f[h>>2]=0;m=d+16|0;j=o-n>>2;if(j>>>0>=e>>>0){if(j>>>0>e>>>0)f[m>>2]=n+(e<<2)}else Of(d+12|0,e-j|0,h);j=d+24|0;f[h>>2]=0;n=d+28|0;m=f[j>>2]|0;o=(f[n>>2]|0)-m>>2;if(o>>>0>=e>>>0){if(o>>>0>e>>>0)f[n>>2]=m+(e<<2)}else Of(j,e-o|0,h);o=d+36|0;f[h>>2]=0;j=d+40|0;m=f[o>>2]|0;n=(f[j>>2]|0)-m>>2;if(n>>>0>=e>>>0){if(n>>>0>e>>>0)f[j>>2]=m+(e<<2)}else Of(o,e-n|0,h);n=f[d>>2]|0;if((f[i>>2]|0)>0){o=a+16|0;m=a+32|0;j=a+12|0;l=0;do{k=f[n+(l<<2)>>2]|0;p=f[o>>2]|0;do if((k|0)<=(p|0)){q=f[j>>2]|0;r=f[m>>2]|0;s=r+(l<<2)|0;if((k|0)<(q|0)){f[s>>2]=q;t=r;break}else{f[s>>2]=k;t=r;break}}else{r=f[m>>2]|0;f[r+(l<<2)>>2]=p;t=r}while(0);l=l+1|0;v=f[i>>2]|0}while((l|0)<(v|0));if((v|0)>0){v=a+20|0;l=0;do{m=(f[b+(l<<2)>>2]|0)+(f[t+(l<<2)>>2]|0)|0;n=c+(l<<2)|0;f[n>>2]=m;if((m|0)<=(f[o>>2]|0)){if((m|0)<(f[j>>2]|0)){w=(f[v>>2]|0)+m|0;x=19}}else{w=m-(f[v>>2]|0)|0;x=19}if((x|0)==19){x=0;f[n>>2]=w}l=l+1|0}while((l|0)<(f[i>>2]|0))}}l=f[a+48>>2]|0;w=f[a+52>>2]|0;v=wk(16)|0;f[v>>2]=0;f[v+4>>2]=0;f[v+8>>2]=0;f[v+12>>2]=0;f[h>>2]=0;j=h+4|0;f[j>>2]=0;o=h+8|0;f[o>>2]=0;do if(e)if(e>>>0>1073741823)$n(h);else{t=e<<2;n=wk(t)|0;f[h>>2]=n;m=n+(e<<2)|0;f[o>>2]=m;oh(n|0,0,t|0)|0;f[j>>2]=m;y=n;break}else y=0;while(0);o=f[a+56>>2]|0;n=f[o>>2]|0;m=(f[o+4>>2]|0)-n|0;t=m>>2;a:do if((m|0)>4){p=n;k=(e|0)>0;r=l+12|0;s=a+16|0;q=a+32|0;z=a+12|0;A=a+20|0;B=e<<2;C=(e|0)==1;D=1;while(1){if(t>>>0<=D>>>0){x=30;break}E=f[p+(D<<2)>>2]|0;do if((E|0)!=-1){F=(((E>>>0)%3|0|0)==0?2:-1)+E|0;G=(F|0)==-1;H=f[r>>2]|0;I=H+(F<<2)|0;F=1;J=0;K=E;b:while(1){L=f[d+(J*12|0)>>2]|0;M=f[H+(K<<2)>>2]|0;if((M|0)!=-1){N=f[l>>2]|0;O=f[w>>2]|0;P=f[O+(f[N+(M<<2)>>2]<<2)>>2]|0;Q=M+1|0;R=((Q>>>0)%3|0|0)==0?M+-2|0:Q;if((R|0)==-1)S=-1;else S=f[N+(R<<2)>>2]|0;R=f[O+(S<<2)>>2]|0;Q=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((Q|0)==-1)T=-1;else T=f[N+(Q<<2)>>2]|0;Q=f[O+(T<<2)>>2]|0;if((P|0)<(D|0)&(R|0)<(D|0)&(Q|0)<(D|0)){O=W(P,e)|0;P=W(R,e)|0;R=W(Q,e)|0;if(k){Q=0;do{f[L+(Q<<2)>>2]=(f[c+(Q+R<<2)>>2]|0)+(f[c+(Q+P<<2)>>2]|0)-(f[c+(Q+O<<2)>>2]|0);Q=Q+1|0}while((Q|0)!=(e|0))}Q=J+1|0;if((Q|0)==4){U=4;break}else V=Q}else V=J}else V=J;do if(F){Q=K+1|0;O=((Q>>>0)%3|0|0)==0?K+-2|0:Q;if((O|0)!=-1?(Q=f[H+(O<<2)>>2]|0,O=Q+1|0,(Q|0)!=-1):0)X=((O>>>0)%3|0|0)==0?Q+-2|0:O;else X=-1}else{O=(((K>>>0)%3|0|0)==0?2:-1)+K|0;if((O|0)!=-1?(Q=f[H+(O<<2)>>2]|0,(Q|0)!=-1):0)if(!((Q>>>0)%3|0)){X=Q+2|0;break}else{X=Q+-1|0;break}else X=-1}while(0);if((X|0)==(E|0)){x=59;break}Q=(X|0)!=-1;O=Q|F^1;do if(!(O|G)){P=f[I>>2]|0;if((P|0)==-1){x=59;break b}if(!((P>>>0)%3|0)){Y=0;Z=P+2|0;break}else{Y=0;Z=P+-1|0;break}}else{Y=Q&F;Z=O?X:-1}while(0);if((Z|0)==-1){x=59;break}else{F=Y;J=V;K=Z}}if((x|0)==59){x=0;if((V|0)>0)U=V;else{x=60;break}}if(k){oh(f[h>>2]|0,0,B|0)|0;K=U+-1|0;J=v+(K<<2)|0;F=a+60+(K*12|0)+4|0;I=a+60+(K*12|0)|0;K=f[h>>2]|0;G=0;H=0;while(1){O=f[J>>2]|0;f[J>>2]=O+1;if((f[F>>2]|0)>>>0<=O>>>0){_=K;$=0;break a}if(!(f[(f[I>>2]|0)+(O>>>5<<2)>>2]&1<<(O&31))){O=f[d+(G*12|0)>>2]|0;Q=0;do{P=K+(Q<<2)|0;f[P>>2]=(f[P>>2]|0)+(f[O+(Q<<2)>>2]|0);Q=Q+1|0}while((Q|0)!=(e|0));aa=H+1|0}else aa=H;G=G+1|0;if((G|0)>=(U|0)){ba=aa;break}else H=aa}}else{H=U+-1|0;G=v+(H<<2)|0;K=a+60+(H*12|0)|0;I=f[h>>2]|0;F=f[a+60+(H*12|0)+4>>2]|0;H=0;J=0;Q=f[G>>2]|0;while(1){O=Q;Q=Q+1|0;f[G>>2]=Q;if(F>>>0<=O>>>0){_=I;$=0;break a}P=J+((f[(f[K>>2]|0)+(O>>>5<<2)>>2]&1<<(O&31)|0)==0&1)|0;H=H+1|0;if((H|0)>=(U|0)){ba=P;break}else J=P}}J=W(D,e)|0;if(ba){H=f[h>>2]|0;if(k?(f[H>>2]=(f[H>>2]|0)/(ba|0)|0,!C):0){K=1;do{I=H+(K<<2)|0;f[I>>2]=(f[I>>2]|0)/(ba|0)|0;K=K+1|0}while((K|0)!=(e|0))}K=b+(J<<2)|0;I=c+(J<<2)|0;if((f[i>>2]|0)>0){F=0;do{Q=f[H+(F<<2)>>2]|0;G=f[s>>2]|0;do if((Q|0)<=(G|0)){P=f[z>>2]|0;O=f[q>>2]|0;R=O+(F<<2)|0;if((Q|0)<(P|0)){f[R>>2]=P;ca=O;break}else{f[R>>2]=Q;ca=O;break}}else{O=f[q>>2]|0;f[O+(F<<2)>>2]=G;ca=O}while(0);F=F+1|0;da=f[i>>2]|0}while((F|0)<(da|0));if((da|0)>0){F=0;do{H=(f[K+(F<<2)>>2]|0)+(f[ca+(F<<2)>>2]|0)|0;G=I+(F<<2)|0;f[G>>2]=H;do if((H|0)>(f[s>>2]|0)){ea=H-(f[A>>2]|0)|0;x=106}else{if((H|0)>=(f[z>>2]|0))break;ea=(f[A>>2]|0)+H|0;x=106}while(0);if((x|0)==106){x=0;f[G>>2]=ea}F=F+1|0}while((F|0)<(f[i>>2]|0))}}}else{fa=J;x=73}}else x=60;while(0);if((x|0)==60){x=0;fa=W(D,e)|0;x=73}if((x|0)==73?(x=0,E=c+((W(D+-1|0,e)|0)<<2)|0,F=b+(fa<<2)|0,I=c+(fa<<2)|0,(f[i>>2]|0)>0):0){K=0;do{H=f[E+(K<<2)>>2]|0;Q=f[s>>2]|0;do if((H|0)<=(Q|0)){O=f[z>>2]|0;R=f[q>>2]|0;P=R+(K<<2)|0;if((H|0)<(O|0)){f[P>>2]=O;ga=R;break}else{f[P>>2]=H;ga=R;break}}else{R=f[q>>2]|0;f[R+(K<<2)>>2]=Q;ga=R}while(0);K=K+1|0;ha=f[i>>2]|0}while((K|0)<(ha|0));if((ha|0)>0){K=0;do{E=(f[F+(K<<2)>>2]|0)+(f[ga+(K<<2)>>2]|0)|0;Q=I+(K<<2)|0;f[Q>>2]=E;if((E|0)<=(f[s>>2]|0)){if((E|0)<(f[z>>2]|0)){ia=(f[A>>2]|0)+E|0;x=87}}else{ia=E-(f[A>>2]|0)|0;x=87}if((x|0)==87){x=0;f[Q>>2]=ia}K=K+1|0}while((K|0)<(f[i>>2]|0))}}D=D+1|0;if((D|0)>=(t|0)){x=110;break}}if((x|0)==30)$n(o);else if((x|0)==110){_=f[h>>2]|0;$=1;break}}else{_=y;$=1}while(0);if(_|0){f[j>>2]=_;Ko(_)}Ko(v);v=f[d+36>>2]|0;if(v|0){f[d+40>>2]=v;Ko(v)}v=f[d+24>>2]|0;if(v|0){f[d+28>>2]=v;Ko(v)}v=f[d+12>>2]|0;if(v|0){f[d+16>>2]=v;Ko(v)}v=f[d>>2]|0;if(!v){u=g;return $|0}f[d+4>>2]=v;Ko(v);u=g;return $|0}function tb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=Ia,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;d=u;u=u+720|0;e=d;g=d+688|0;i=d+656|0;k=d+4|0;if((j[c+38>>1]|0)>514){f[i>>2]=0;l=i+4|0;f[l>>2]=0;f[i+8>>2]=0;m=c+8|0;o=c+16|0;p=g+4|0;q=g+8|0;r=a+36|0;t=a+40|0;v=a+60|0;w=a+44|0;x=g+8|0;y=g+12|0;z=g+20|0;A=0;a:while(1){if((A|0)>=(Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0)){B=26;break}C=La[f[(f[a>>2]|0)+20>>2]&127](a,A)|0;D=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;E=f[(f[(f[D>>2]|0)+8>>2]|0)+(C<<2)>>2]|0;if((f[E+28>>2]|0)==9){C=b[E+24>>0]|0;E=f[i>>2]|0;D=(f[l>>2]|0)-E>>2;if(D>>>0>=C>>>0){if(D>>>0>C>>>0)f[l>>2]=E+(C<<2)}else Eg(i,C-D|0);D=C<<2;E=m;F=f[E>>2]|0;G=f[E+4>>2]|0;E=o;I=f[E>>2]|0;J=vl(I|0,f[E+4>>2]|0,D|0,0)|0;E=H;if((G|0)<(E|0)|(G|0)==(E|0)&F>>>0<J>>>0){K=0;break}Bf(f[i>>2]|0,(f[c>>2]|0)+I|0,D|0)|0;I=o;J=vl(f[I>>2]|0,f[I+4>>2]|0,D|0,0)|0;D=H;I=o;f[I>>2]=J;f[I+4>>2]=D;I=m;F=f[I>>2]|0;E=f[I+4>>2]|0;I=vl(J|0,D|0,4,0)|0;G=H;if((E|0)<(G|0)|(E|0)==(G|0)&F>>>0<I>>>0){K=0;break}L=f[c>>2]|0;M=L+J|0;b[s>>0]=b[M>>0];b[s+1>>0]=b[M+1>>0];b[s+2>>0]=b[M+2>>0];b[s+3>>0]=b[M+3>>0];N=_(n[s>>2]);M=o;f[M>>2]=I;f[M+4>>2]=G;if(!((E|0)>(G|0)|(E|0)==(G|0)&F>>>0>I>>>0)){K=0;break}F=b[L+I>>0]|0;I=vl(J|0,D|0,5,0)|0;D=o;f[D>>2]=I;f[D+4>>2]=H;if((F&255)>31){K=0;break}f[g>>2]=1228;f[p>>2]=-1;f[q>>2]=0;f[q+4>>2]=0;f[q+8>>2]=0;f[q+12>>2]=0;kj(g,F&255,f[i>>2]|0,C,N);do if(Si(g,f[(f[v>>2]|0)+((((f[t>>2]|0)-(f[r>>2]|0)|0)/24|0)<<2)>>2]|0)|0){C=f[t>>2]|0;if((C|0)==(f[w>>2]|0)){wd(r,g);O=0;break}f[C>>2]=1228;f[C+4>>2]=f[p>>2];P=C+8|0;f[P>>2]=0;F=C+12|0;f[F>>2]=0;D=C+16|0;f[D>>2]=0;I=(f[y>>2]|0)-(f[x>>2]|0)|0;J=I>>2;if(I|0){if(J>>>0>1073741823){B=17;break a}L=wk(I)|0;f[F>>2]=L;f[P>>2]=L;f[D>>2]=L+(J<<2);J=f[x>>2]|0;D=(f[y>>2]|0)-J|0;if((D|0)>0){Bf(L|0,J|0,D|0)|0;f[F>>2]=L+(D>>>2<<2)}}f[C+20>>2]=f[z>>2];f[t>>2]=(f[t>>2]|0)+24;O=0}else O=1;while(0);f[g>>2]=1228;C=f[q>>2]|0;if(C|0){f[y>>2]=C;Ko(C)}if(O|0){K=0;break}}A=A+1|0}if((B|0)==17)$n(P);if((B|0)==26){P=a+48|0;A=a+52|0;if((f[A>>2]|0)==(f[P>>2]|0))K=1;else{O=0;y=0;while(1){if(zh(g,c)|0){q=f[g>>2]|0;Q=q<<31>>31^q>>>1}else Q=y;q=f[P>>2]|0;f[q+(O<<2)>>2]=Q;O=O+1|0;if(O>>>0>=(f[A>>2]|0)-q>>2>>>0){K=1;break}else y=Q}}}Q=f[i>>2]|0;if(Q|0){f[l>>2]=Q;Ko(Q)}R=K;u=d;return R|0}K=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;f[g>>2]=0;Q=g+4|0;f[Q>>2]=0;l=g+8|0;f[l>>2]=0;y=(K|0)==0;if(y){S=0;T=f[(f[a>>2]|0)+20>>2]|0;U=a}else{if(K>>>0>214748364)$n(g);A=K*20|0;O=wk(A)|0;f[g>>2]=O;f[l>>2]=O+(K*20|0);oh(O|0,0,A|0)|0;f[Q>>2]=O+A;A=0;O=0;l=f[(f[a>>2]|0)+20>>2]|0;while(1){P=La[l&127](a,A)|0;q=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;t=f[(f[(f[q>>2]|0)+8>>2]|0)+(P<<2)>>2]|0;P=f[t+28>>2]|0;q=Bj(P)|0;z=b[t+24>>0]|0;x=f[g>>2]|0;f[x+(A*20|0)>>2]=t;f[x+(A*20|0)+4>>2]=O;f[x+(A*20|0)+8>>2]=P;f[x+(A*20|0)+12>>2]=(q|0)>0?q:0;f[x+(A*20|0)+16>>2]=z;x=O+z|0;A=A+1|0;z=f[(f[a>>2]|0)+20>>2]|0;if(A>>>0>=K>>>0){S=x;T=z;U=a;break}else{O=x;l=z}}}l=La[T&127](a,0)|0;T=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;O=f[(f[(f[T>>2]|0)+8>>2]|0)+(l<<2)>>2]|0;b[O+84>>0]=1;f[O+72>>2]=f[O+68>>2];l=c+8|0;T=f[l>>2]|0;A=f[l+4>>2]|0;l=c+16|0;z=l;x=f[z>>2]|0;q=f[z+4>>2]|0;b:do if((A|0)>(q|0)|(A|0)==(q|0)&T>>>0>x>>>0){z=f[c>>2]|0;P=b[z+x>>0]|0;t=vl(x|0,q|0,1,0)|0;p=H;r=l;f[r>>2]=t;f[r+4>>2]=p;switch(P<<24>>24){case 0:{if(!((A|0)>(p|0)|(A|0)==(p|0)&T>>>0>t>>>0)){V=0;break b}P=vl(x|0,q|0,2,0)|0;r=l;f[r>>2]=P;f[r+4>>2]=H;r=vl(x|0,q|0,6,0)|0;w=H;if((A|0)<(w|0)|(A|0)==(w|0)&T>>>0<r>>>0){V=0;break b}v=z+P|0;P=h[v>>0]|h[v+1>>0]<<8|h[v+2>>0]<<16|h[v+3>>0]<<24;v=l;f[v>>2]=r;f[v+4>>2]=w;Fh(O,P)|0;fm(i);$e(k,g);P=Vd(i,c,k)|0;w=f[k+16>>2]|0;if(w|0){f[k+20>>2]=w;Ko(w)}w=f[k>>2]|0;if(w|0){f[k+4>>2]=w;Ko(w)}if(!P){V=0;break b}break}case 1:{if(!((A|0)>(p|0)|(A|0)==(p|0)&T>>>0>t>>>0)){V=0;break b}p=b[z+t>>0]|0;t=vl(x|0,q|0,2,0)|0;P=l;f[P>>2]=t;f[P+4>>2]=H;if((p&255)>6){f[e>>2]=p&255;kl(5094,e)|0;V=0;break b}P=vl(x|0,q|0,6,0)|0;w=H;if((A|0)<(w|0)|(A|0)==(w|0)&T>>>0<P>>>0){V=0;break b}v=z+t|0;t=h[v>>0]|h[v+1>>0]<<8|h[v+2>>0]<<16|h[v+3>>0]<<24;v=l;f[v>>2]=P;f[v+4>>2]=w;if(!y){w=0;do{v=La[f[(f[U>>2]|0)+20>>2]&127](a,w)|0;P=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;z=f[(f[(f[P>>2]|0)+8>>2]|0)+(v<<2)>>2]|0;Fh(z,t)|0;b[z+84>>0]=1;f[z+72>>2]=f[z+68>>2];w=w+1|0}while(w>>>0<K>>>0)}$e(i,g);switch(p<<24>>24){case 0:{ve(k,S);w=Xd(k,c,i)|0;Cf(k);if(w)B=65;else W=1;break}case 1:{ve(k,S);w=Wd(k,c,i)|0;Cf(k);if(w)B=65;else W=1;break}case 2:{we(k,S);w=Zd(k,c,i)|0;Lf(k);if(w)B=65;else W=1;break}case 3:{we(k,S);w=Yd(k,c,i)|0;Lf(k);if(w)B=65;else W=1;break}case 4:{re(k,S);w=Ud(k,c,i)|0;jg(k);if(w)B=65;else W=1;break}case 5:{re(k,S);w=Td(k,c,i)|0;jg(k);if(w)B=65;else W=1;break}case 6:{re(k,S);w=Sd(k,c,i)|0;jg(k);if(w)B=65;else W=1;break}default:W=1}if((B|0)==65)W=0;w=f[i+16>>2]|0;if(w|0){f[i+20>>2]=w;Ko(w)}w=f[i>>2]|0;if(w|0){f[i+4>>2]=w;Ko(w)}if(W|0){V=0;break b}break}default:{V=0;break b}}V=1}else V=0;while(0);W=f[g>>2]|0;if(W|0){f[Q>>2]=W;Ko(W)}R=V;u=d;return R|0}function ub(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;i=u;u=u+64|0;j=i+16|0;k=i;l=i+24|0;m=i+8|0;n=i+20|0;f[j>>2]=c;c=(a|0)!=0;o=l+40|0;q=o;r=l+39|0;l=m+4|0;s=0;t=0;v=0;a:while(1){w=s;x=t;while(1){do if((x|0)>-1)if((w|0)>(2147483647-x|0)){y=Ro()|0;f[y>>2]=75;z=-1;break}else{z=w+x|0;break}else z=x;while(0);A=f[j>>2]|0;y=b[A>>0]|0;if(!(y<<24>>24)){B=94;break a}C=y;y=A;b:while(1){switch(C<<24>>24){case 37:{B=10;break b;break}case 0:{D=y;break b;break}default:{}}E=y+1|0;f[j>>2]=E;C=b[E>>0]|0;y=E}c:do if((B|0)==10){B=0;C=y;E=y;while(1){if((b[E+1>>0]|0)!=37){D=C;break c}F=C+1|0;E=E+2|0;f[j>>2]=E;if((b[E>>0]|0)!=37){D=F;break}else C=F}}while(0);w=D-A|0;if(c)Pm(a,A,w);if(!w)break;else x=z}x=(to(b[(f[j>>2]|0)+1>>0]|0)|0)==0;w=f[j>>2]|0;if(!x?(b[w+2>>0]|0)==36:0){G=(b[w+1>>0]|0)+-48|0;I=1;J=3}else{G=-1;I=v;J=1}x=w+J|0;f[j>>2]=x;w=b[x>>0]|0;y=(w<<24>>24)+-32|0;if(y>>>0>31|(1<<y&75913|0)==0){K=0;L=w;M=x}else{w=0;C=y;y=x;while(1){x=1<<C|w;E=y+1|0;f[j>>2]=E;F=b[E>>0]|0;C=(F<<24>>24)+-32|0;if(C>>>0>31|(1<<C&75913|0)==0){K=x;L=F;M=E;break}else{w=x;y=E}}}if(L<<24>>24==42){if((to(b[M+1>>0]|0)|0)!=0?(y=f[j>>2]|0,(b[y+2>>0]|0)==36):0){w=y+1|0;f[h+((b[w>>0]|0)+-48<<2)>>2]=10;N=f[g+((b[w>>0]|0)+-48<<3)>>2]|0;O=1;P=y+3|0}else{if(I|0){Q=-1;break}if(c){y=(f[e>>2]|0)+(4-1)&~(4-1);w=f[y>>2]|0;f[e>>2]=y+4;R=w}else R=0;N=R;O=0;P=(f[j>>2]|0)+1|0}f[j>>2]=P;w=(N|0)<0;S=w?0-N|0:N;T=w?K|8192:K;U=O;V=P}else{w=sj(j)|0;if((w|0)<0){Q=-1;break}S=w;T=K;U=I;V=f[j>>2]|0}do if((b[V>>0]|0)==46){w=V+1|0;if((b[w>>0]|0)!=42){f[j>>2]=w;w=sj(j)|0;W=w;X=f[j>>2]|0;break}if(to(b[V+2>>0]|0)|0?(w=f[j>>2]|0,(b[w+3>>0]|0)==36):0){y=w+2|0;f[h+((b[y>>0]|0)+-48<<2)>>2]=10;C=f[g+((b[y>>0]|0)+-48<<3)>>2]|0;y=w+4|0;f[j>>2]=y;W=C;X=y;break}if(U|0){Q=-1;break a}if(c){y=(f[e>>2]|0)+(4-1)&~(4-1);C=f[y>>2]|0;f[e>>2]=y+4;Y=C}else Y=0;C=(f[j>>2]|0)+2|0;f[j>>2]=C;W=Y;X=C}else{W=-1;X=V}while(0);C=0;y=X;while(1){if(((b[y>>0]|0)+-65|0)>>>0>57){Q=-1;break a}w=y;y=y+1|0;f[j>>2]=y;Z=b[(b[w>>0]|0)+-65+(13620+(C*58|0))>>0]|0;_=Z&255;if((_+-1|0)>>>0>=8)break;else C=_}if(!(Z<<24>>24)){Q=-1;break}w=(G|0)>-1;do if(Z<<24>>24==19)if(w){Q=-1;break a}else B=54;else{if(w){f[h+(G<<2)>>2]=_;E=g+(G<<3)|0;x=f[E+4>>2]|0;F=k;f[F>>2]=f[E>>2];f[F+4>>2]=x;B=54;break}if(!c){Q=0;break a}Nd(k,_,e);$=f[j>>2]|0;B=55}while(0);if((B|0)==54){B=0;if(c){$=y;B=55}else aa=0}d:do if((B|0)==55){B=0;w=b[$+-1>>0]|0;x=(C|0)!=0&(w&15|0)==3?w&-33:w;w=T&-65537;F=(T&8192|0)==0?T:w;e:do switch(x|0){case 110:{switch((C&255)<<24>>24){case 0:{f[f[k>>2]>>2]=z;aa=0;break d;break}case 1:{f[f[k>>2]>>2]=z;aa=0;break d;break}case 2:{E=f[k>>2]|0;f[E>>2]=z;f[E+4>>2]=((z|0)<0)<<31>>31;aa=0;break d;break}case 3:{d[f[k>>2]>>1]=z;aa=0;break d;break}case 4:{b[f[k>>2]>>0]=z;aa=0;break d;break}case 6:{f[f[k>>2]>>2]=z;aa=0;break d;break}case 7:{E=f[k>>2]|0;f[E>>2]=z;f[E+4>>2]=((z|0)<0)<<31>>31;aa=0;break d;break}default:{aa=0;break d}}break}case 112:{ba=120;ca=W>>>0>8?W:8;da=F|8;B=67;break}case 88:case 120:{ba=x;ca=W;da=F;B=67;break}case 111:{E=k;ea=f[E>>2]|0;fa=f[E+4>>2]|0;E=wj(ea,fa,o)|0;ga=q-E|0;ha=E;ia=0;ja=14084;ka=(F&8|0)==0|(W|0)>(ga|0)?W:ga+1|0;la=F;ma=ea;na=fa;B=73;break}case 105:case 100:{fa=k;ea=f[fa>>2]|0;ga=f[fa+4>>2]|0;if((ga|0)<0){fa=wl(0,0,ea|0,ga|0)|0;E=H;oa=k;f[oa>>2]=fa;f[oa+4>>2]=E;pa=1;qa=14084;ra=fa;sa=E;B=72;break e}else{pa=(F&2049|0)!=0&1;qa=(F&2048|0)==0?((F&1|0)==0?14084:14086):14085;ra=ea;sa=ga;B=72;break e}break}case 117:{ga=k;pa=0;qa=14084;ra=f[ga>>2]|0;sa=f[ga+4>>2]|0;B=72;break}case 99:{b[r>>0]=f[k>>2];ta=r;ua=0;va=14084;wa=1;xa=w;ya=q;break}case 109:{ga=Ro()|0;za=Um(f[ga>>2]|0)|0;B=77;break}case 115:{ga=f[k>>2]|0;za=(ga|0)==0?14094:ga;B=77;break}case 67:{f[m>>2]=f[k>>2];f[l>>2]=0;f[k>>2]=m;Aa=-1;B=81;break}case 83:{if(!W){vi(a,32,S,0,F);Ba=0;B=91}else{Aa=W;B=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{aa=rb(a,+p[k>>3],S,W,F,x)|0;break d;break}default:{ta=A;ua=0;va=14084;wa=W;xa=F;ya=q}}while(0);f:do if((B|0)==67){B=0;x=k;ga=f[x>>2]|0;ea=f[x+4>>2]|0;x=aj(ga,ea,o,ba&32)|0;E=(da&8|0)==0|(ga|0)==0&(ea|0)==0;ha=x;ia=E?0:2;ja=E?14084:14084+(ba>>>4)|0;ka=ca;la=da;ma=ga;na=ea;B=73}else if((B|0)==72){B=0;ha=xh(ra,sa,o)|0;ia=pa;ja=qa;ka=W;la=F;ma=ra;na=sa;B=73}else if((B|0)==77){B=0;ea=Re(za,0,W)|0;ga=(ea|0)==0;ta=za;ua=0;va=14084;wa=ga?W:ea-za|0;xa=w;ya=ga?za+W|0:ea}else if((B|0)==81){B=0;ea=f[k>>2]|0;ga=0;while(1){E=f[ea>>2]|0;if(!E){Ca=ga;break}x=Fm(n,E)|0;Da=(x|0)<0;if(Da|x>>>0>(Aa-ga|0)>>>0){B=85;break}E=x+ga|0;if(Aa>>>0>E>>>0){ea=ea+4|0;ga=E}else{Ca=E;break}}if((B|0)==85){B=0;if(Da){Q=-1;break a}else Ca=ga}vi(a,32,S,Ca,F);if(!Ca){Ba=0;B=91}else{ea=f[k>>2]|0;E=0;while(1){x=f[ea>>2]|0;if(!x){Ba=Ca;B=91;break f}fa=Fm(n,x)|0;E=fa+E|0;if((E|0)>(Ca|0)){Ba=Ca;B=91;break f}Pm(a,n,fa);if(E>>>0>=Ca>>>0){Ba=Ca;B=91;break}else ea=ea+4|0}}}while(0);if((B|0)==73){B=0;w=(ma|0)!=0|(na|0)!=0;ea=(ka|0)!=0|w;E=q-ha+((w^1)&1)|0;ta=ea?ha:o;ua=ia;va=ja;wa=ea?((ka|0)>(E|0)?ka:E):0;xa=(ka|0)>-1?la&-65537:la;ya=q}else if((B|0)==91){B=0;vi(a,32,S,Ba,F^8192);aa=(S|0)>(Ba|0)?S:Ba;break}E=ya-ta|0;ea=(wa|0)<(E|0)?E:wa;w=ea+ua|0;ga=(S|0)<(w|0)?w:S;vi(a,32,ga,w,xa);Pm(a,va,ua);vi(a,48,ga,w,xa^65536);vi(a,48,ea,E,0);Pm(a,ta,E);vi(a,32,ga,w,xa^8192);aa=ga}while(0);s=aa;t=z;v=U}g:do if((B|0)==94)if(!a)if(!v)Q=0;else{U=1;while(1){t=f[h+(U<<2)>>2]|0;if(!t)break;Nd(g+(U<<3)|0,t,e);t=U+1|0;if(t>>>0<10)U=t;else{Q=1;break g}}t=U;while(1){if(f[h+(t<<2)>>2]|0){Q=-1;break g}t=t+1|0;if(t>>>0>=10){Q=1;break}}}else Q=z;while(0);u=i;return Q|0}function vb(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;c=u;u=u+32|0;d=c+20|0;e=c+16|0;g=c+4|0;i=c;j=a+36|0;k=a+37|0;l=a+32|0;m=f[l>>2]|0;do if((((h[j>>0]|0)<<8|(h[k>>0]|0))&65535)<514){n=m+8|0;o=f[n>>2]|0;p=f[n+4>>2]|0;n=m+16|0;q=n;r=f[q>>2]|0;s=f[q+4>>2]|0;q=vl(r|0,s|0,4,0)|0;t=H;if((p|0)<(t|0)|(p|0)==(t|0)&o>>>0<q>>>0){v=0;u=c;return v|0}w=(f[m>>2]|0)+r|0;x=h[w>>0]|h[w+1>>0]<<8|h[w+2>>0]<<16|h[w+3>>0]<<24;f[d>>2]=x;w=n;f[w>>2]=q;f[w+4>>2]=t;t=vl(r|0,s|0,8,0)|0;s=H;if((p|0)<(s|0)|(p|0)==(s|0)&o>>>0<t>>>0){v=0;u=c;return v|0}else{o=(f[m>>2]|0)+q|0;f[e>>2]=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;o=n;f[o>>2]=t;f[o+4>>2]=s;y=x;break}}else{if(!(zh(d,m)|0)){v=0;u=c;return v|0}if(zh(e,f[l>>2]|0)|0){y=f[d>>2]|0;break}else{v=0;u=c;return v|0}}while(0);if(y>>>0>1431655765){v=0;u=c;return v|0}m=f[e>>2]|0;x=Bk(y|0,0,3,0)|0;s=H;if(s>>>0<0|(s|0)==0&x>>>0<m>>>0){v=0;u=c;return v|0}x=f[l>>2]|0;s=x+8|0;o=f[s+4>>2]|0;t=x+16|0;n=t;q=f[n>>2]|0;p=f[n+4>>2]|0;if(!((o|0)>(p|0)|((o|0)==(p|0)?(f[s>>2]|0)>>>0>q>>>0:0))){v=0;u=c;return v|0}s=b[(f[x>>2]|0)+q>>0]|0;o=vl(q|0,p|0,1,0)|0;n=H;r=t;f[r>>2]=o;f[r+4>>2]=n;a:do if(!(s<<24>>24)){if(!(ke(a,y)|0)){v=0;u=c;return v|0}}else{if(m>>>0<256){if(!y)break;r=a+44|0;t=g+4|0;w=g+8|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;z=x+8|0;A=f[z>>2]|0;B=f[z+4>>2]|0;b:do if((B|0)>(n|0)|(B|0)==(n|0)&A>>>0>o>>>0){z=0;C=x;D=o;E=n;F=B;G=A;I=y;while(1){J=C+16|0;K=f[C>>2]|0;L=b[K+D>>0]|0;M=vl(D|0,E|0,1,0)|0;N=H;O=J;f[O>>2]=M;f[O+4>>2]=N;f[g>>2]=L&255;if(!((F|0)>(N|0)|(F|0)==(N|0)&G>>>0>M>>>0))break b;N=b[K+M>>0]|0;M=vl(D|0,E|0,2,0)|0;L=H;O=J;f[O>>2]=M;f[O+4>>2]=L;f[t>>2]=N&255;if(!((F|0)>(L|0)|(F|0)==(L|0)&G>>>0>M>>>0))break b;L=b[K+M>>0]|0;M=vl(D|0,E|0,3,0)|0;K=J;f[K>>2]=M;f[K+4>>2]=H;f[w>>2]=L&255;L=f[r>>2]|0;K=L+100|0;M=f[K>>2]|0;if((M|0)==(f[L+104>>2]|0)){yg(L+96|0,g);P=f[d>>2]|0}else{f[M>>2]=f[g>>2];f[M+4>>2]=f[g+4>>2];f[M+8>>2]=f[g+8>>2];f[K>>2]=(f[K>>2]|0)+12;P=I}z=z+1|0;if(z>>>0>=P>>>0)break a;C=f[l>>2]|0;K=C+16|0;D=f[K>>2]|0;E=f[K+4>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;K=C+8|0;G=f[K>>2]|0;F=f[K+4>>2]|0;if(!((F|0)>(E|0)|(F|0)==(E|0)&G>>>0>D>>>0))break;else I=P}}while(0);v=0;u=c;return v|0}if(m>>>0<65536){if(!y)break;r=a+44|0;w=g+4|0;t=g+8|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;A=x+8|0;B=f[A>>2]|0;I=f[A+4>>2]|0;A=vl(q|0,p|0,3,0)|0;D=H;c:do if(!((I|0)<(D|0)|(I|0)==(D|0)&B>>>0<A>>>0)){G=0;E=x;F=o;C=A;z=D;K=n;M=I;L=B;J=y;while(1){N=E+16|0;O=f[E>>2]|0;Q=O+F|0;R=h[Q>>0]|h[Q+1>>0]<<8;Q=N;f[Q>>2]=C;f[Q+4>>2]=z;f[g>>2]=R&65535;R=vl(F|0,K|0,4,0)|0;Q=H;if((M|0)<(Q|0)|(M|0)==(Q|0)&L>>>0<R>>>0)break c;S=O+C|0;T=h[S>>0]|h[S+1>>0]<<8;S=N;f[S>>2]=R;f[S+4>>2]=Q;f[w>>2]=T&65535;T=vl(F|0,K|0,6,0)|0;Q=H;if((M|0)<(Q|0)|(M|0)==(Q|0)&L>>>0<T>>>0)break c;S=O+R|0;R=h[S>>0]|h[S+1>>0]<<8;S=N;f[S>>2]=T;f[S+4>>2]=Q;f[t>>2]=R&65535;R=f[r>>2]|0;Q=R+100|0;S=f[Q>>2]|0;if((S|0)==(f[R+104>>2]|0)){yg(R+96|0,g);U=f[d>>2]|0}else{f[S>>2]=f[g>>2];f[S+4>>2]=f[g+4>>2];f[S+8>>2]=f[g+8>>2];f[Q>>2]=(f[Q>>2]|0)+12;U=J}G=G+1|0;if(G>>>0>=U>>>0)break a;E=f[l>>2]|0;Q=E+16|0;F=f[Q>>2]|0;K=f[Q+4>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;Q=E+8|0;L=f[Q>>2]|0;M=f[Q+4>>2]|0;C=vl(F|0,K|0,2,0)|0;z=H;if((M|0)<(z|0)|(M|0)==(z|0)&L>>>0<C>>>0)break;else J=U}}while(0);v=0;u=c;return v|0}r=a+44|0;if((f[(f[r>>2]|0)+80>>2]|0)>>>0<2097152?(((h[j>>0]|0)<<8|(h[k>>0]|0))&65535)>513:0){if(!y)break;t=g+4|0;w=g+8|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;d:do if(zh(i,x)|0){B=0;do{f[g>>2]=f[i>>2];if(!(zh(i,f[l>>2]|0)|0))break d;f[t>>2]=f[i>>2];if(!(zh(i,f[l>>2]|0)|0))break d;f[w>>2]=f[i>>2];I=f[r>>2]|0;D=I+100|0;A=f[D>>2]|0;if((A|0)==(f[I+104>>2]|0))yg(I+96|0,g);else{f[A>>2]=f[g>>2];f[A+4>>2]=f[g+4>>2];f[A+8>>2]=f[g+8>>2];f[D>>2]=(f[D>>2]|0)+12}B=B+1|0;if(B>>>0>=(f[d>>2]|0)>>>0)break a;D=f[l>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0}while(zh(i,D)|0)}while(0);v=0;u=c;return v|0}if(y|0){w=g+4|0;t=g+8|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;B=x+8|0;D=f[B>>2]|0;A=f[B+4>>2]|0;B=vl(q|0,p|0,5,0)|0;I=H;e:do if(!((A|0)<(I|0)|(A|0)==(I|0)&D>>>0<B>>>0)){J=0;C=x;L=o;z=B;M=I;K=n;F=A;E=D;G=y;while(1){Q=C+16|0;S=f[C>>2]|0;R=S+L|0;T=h[R>>0]|h[R+1>>0]<<8|h[R+2>>0]<<16|h[R+3>>0]<<24;R=Q;f[R>>2]=z;f[R+4>>2]=M;f[g>>2]=T;T=vl(L|0,K|0,8,0)|0;R=H;if((F|0)<(R|0)|(F|0)==(R|0)&E>>>0<T>>>0)break e;N=S+z|0;O=h[N>>0]|h[N+1>>0]<<8|h[N+2>>0]<<16|h[N+3>>0]<<24;N=Q;f[N>>2]=T;f[N+4>>2]=R;f[w>>2]=O;O=vl(L|0,K|0,12,0)|0;R=H;if((F|0)<(R|0)|(F|0)==(R|0)&E>>>0<O>>>0)break e;N=S+T|0;T=h[N>>0]|h[N+1>>0]<<8|h[N+2>>0]<<16|h[N+3>>0]<<24;N=Q;f[N>>2]=O;f[N+4>>2]=R;f[t>>2]=T;T=f[r>>2]|0;R=T+100|0;N=f[R>>2]|0;if((N|0)==(f[T+104>>2]|0)){yg(T+96|0,g);V=f[d>>2]|0}else{f[N>>2]=f[g>>2];f[N+4>>2]=f[g+4>>2];f[N+8>>2]=f[g+8>>2];f[R>>2]=(f[R>>2]|0)+12;V=G}J=J+1|0;if(J>>>0>=V>>>0)break a;C=f[l>>2]|0;R=C+16|0;L=f[R>>2]|0;K=f[R+4>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;R=C+8|0;E=f[R>>2]|0;F=f[R+4>>2]|0;z=vl(L|0,K|0,4,0)|0;M=H;if((F|0)<(M|0)|(F|0)==(M|0)&E>>>0<z>>>0)break;else G=V}}while(0);v=0;u=c;return v|0}}while(0);f[(f[a+4>>2]|0)+80>>2]=f[e>>2];v=1;u=c;return v|0}function wb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Ia,D=0,E=0.0,F=0,G=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=vl(q|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){m=b[o>>0]|0;q=g+(r<<3)|0;f[q>>2]=m;f[q+4>>2]=((m|0)<0)<<31>>31;r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=vl(q|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=g+(t<<3)|0;f[k>>2]=h[m>>0];f[k+4>>2]=0;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=vl(k|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){o=d[l>>1]|0;k=g+(q<<3)|0;f[k>>2]=o;f[k+4>>2]=((o|0)<0)<<31>>31;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=vl(o|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=j[r>>1];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(r<<3)|0,0,(e<<24>>24)-r<<3|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=Bk(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=vl(m|0,H|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){l=f[t>>2]|0;m=g+(o<<3)|0;f[m>>2]=l;f[m+4>>2]=((l|0)<0)<<31>>31;o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(t<<3)|0,0,(e<<24>>24)-t<<3|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=vl(l|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){r=g+(m<<3)|0;f[r>>2]=f[q>>2];f[r+4>>2]=0;m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<3)|0,0,(e<<24>>24)-q<<3|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=vl(r|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){t=k;r=f[t+4>>2]|0;z=g+(l<<3)|0;f[z>>2]=f[t>>2];f[z+4>>2]=r;l=l+1|0;r=b[q>>0]|0;if((l|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){A=r;break}else k=k+8|0}}else A=m;k=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<3)|0,0,(e<<24>>24)-k<<3|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;r=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;z=vl(r|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+z|0;z=0;while(1){q=o;r=f[q+4>>2]|0;t=g+(z<<3)|0;f[t>>2]=f[q>>2];f[t+4>>2]=r;z=z+1|0;r=b[k>>0]|0;if((z|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){B=r;break}else o=o+8|0}}else B=l;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 9:{o=a+24|0;z=b[o>>0]|0;if((z<<24>>24>e<<24>>24?e:z)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;r=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=vl(r|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){C=_(n[m>>2]);k=+J(+C)>=1.0?(+C>0.0?~~+X(+I(+C/4294967296.0),4294967295.0)>>>0:~~+V((+C-+(~~+C>>>0))/4294967296.0)>>>0):0;r=g+(t<<3)|0;f[r>>2]=~~+C>>>0;f[r+4>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){D=k;break}else m=m+4|0}}else D=z;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;r=vl(k|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+r|0;r=0;while(1){E=+p[l>>3];o=+J(E)>=1.0?(E>0.0?~~+X(+I(E/4294967296.0),4294967295.0)>>>0:~~+V((E-+(~~E>>>0))/4294967296.0)>>>0):0;k=g+(r<<3)|0;f[k>>2]=~~E>>>0;f[k+4>>2]=o;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){F=o;break}else l=l+8|0}}else F=t;l=F<<24>>24;if(F<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 11:{l=a+24|0;r=b[l>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){m=f[f[a>>2]>>2]|0;z=a+40|0;o=Bk(f[z>>2]|0,f[z+4>>2]|0,f[c>>2]|0,0)|0;z=a+48|0;k=vl(o|0,H|0,f[z>>2]|0,f[z+4>>2]|0)|0;z=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=h[z>>0];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){G=m;break}else z=z+1|0}}else G=r;z=G<<24>>24;if(G<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(z<<3)|0,0,(e<<24>>24)-z<<3|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function xb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;c=u;u=u+16|0;d=c+8|0;e=c;if((f[a+96>>2]|0)==(f[a+92>>2]|0)){u=c;return 1}g=a+56|0;h=f[g>>2]|0;if((h|0)==(f[a+60>>2]|0)){Ng(a+52|0,b);i=b}else{f[h>>2]=f[b>>2];f[g>>2]=h+4;i=b}b=a+88|0;f[b>>2]=0;h=f[a>>2]|0;g=f[i>>2]|0;j=g+1|0;if((g|0)!=-1){k=((j>>>0)%3|0|0)==0?g+-2|0:j;if((k|0)==-1)l=-1;else l=f[(f[h>>2]|0)+(k<<2)>>2]|0;k=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((k|0)==-1){m=l;n=-1}else{m=l;n=f[(f[h>>2]|0)+(k<<2)>>2]|0}}else{m=-1;n=-1}k=a+24|0;h=f[k>>2]|0;l=h+(m>>>5<<2)|0;g=1<<(m&31);j=f[l>>2]|0;if(!(j&g)){f[l>>2]=j|g;g=f[i>>2]|0;j=g+1|0;if((g|0)==-1)o=-1;else o=((j>>>0)%3|0|0)==0?g+-2|0:j;f[e>>2]=o;j=(o>>>0)/3|0;g=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(j*12|0)+(o-(j*3|0)<<2)>>2]|0;j=f[a+48>>2]|0;f[d>>2]=g;o=f[j+4>>2]|0;j=o+4|0;l=f[j>>2]|0;if((l|0)==(f[o+8>>2]|0))Ng(o,d);else{f[l>>2]=g;f[j>>2]=l+4}l=a+40|0;j=f[l>>2]|0;g=j+4|0;o=f[g>>2]|0;if((o|0)==(f[j+8>>2]|0)){Ng(j,e);p=f[l>>2]|0}else{f[o>>2]=f[e>>2];f[g>>2]=o+4;p=j}j=p+24|0;f[(f[p+12>>2]|0)+(m<<2)>>2]=f[j>>2];f[j>>2]=(f[j>>2]|0)+1;q=f[k>>2]|0}else q=h;h=q+(n>>>5<<2)|0;q=1<<(n&31);j=f[h>>2]|0;if(!(j&q)){f[h>>2]=j|q;q=f[i>>2]|0;do if((q|0)!=-1)if(!((q>>>0)%3|0)){r=q+2|0;break}else{r=q+-1|0;break}else r=-1;while(0);f[e>>2]=r;q=(r>>>0)/3|0;j=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(q*12|0)+(r-(q*3|0)<<2)>>2]|0;q=f[a+48>>2]|0;f[d>>2]=j;r=f[q+4>>2]|0;q=r+4|0;h=f[q>>2]|0;if((h|0)==(f[r+8>>2]|0))Ng(r,d);else{f[h>>2]=j;f[q>>2]=h+4}h=a+40|0;q=f[h>>2]|0;j=q+4|0;r=f[j>>2]|0;if((r|0)==(f[q+8>>2]|0)){Ng(q,e);s=f[h>>2]|0}else{f[r>>2]=f[e>>2];f[j>>2]=r+4;s=q}q=s+24|0;f[(f[s+12>>2]|0)+(n<<2)>>2]=f[q>>2];f[q>>2]=(f[q>>2]|0)+1}q=f[i>>2]|0;if((q|0)==-1)t=-1;else t=f[(f[f[a>>2]>>2]|0)+(q<<2)>>2]|0;q=(f[k>>2]|0)+(t>>>5<<2)|0;n=1<<(t&31);s=f[q>>2]|0;if(!(n&s)){f[q>>2]=s|n;n=f[i>>2]|0;f[e>>2]=n;s=(n>>>0)/3|0;q=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(s*12|0)+(n-(s*3|0)<<2)>>2]|0;s=f[a+48>>2]|0;f[d>>2]=q;n=f[s+4>>2]|0;s=n+4|0;r=f[s>>2]|0;if((r|0)==(f[n+8>>2]|0))Ng(n,d);else{f[r>>2]=q;f[s>>2]=r+4}r=a+40|0;s=f[r>>2]|0;q=s+4|0;n=f[q>>2]|0;if((n|0)==(f[s+8>>2]|0)){Ng(s,e);v=f[r>>2]|0}else{f[n>>2]=f[e>>2];f[q>>2]=n+4;v=s}s=v+24|0;f[(f[v+12>>2]|0)+(t<<2)>>2]=f[s>>2];f[s>>2]=(f[s>>2]|0)+1}s=f[b>>2]|0;a:do if((s|0)<3){t=a+12|0;v=a+44|0;n=a+48|0;q=a+40|0;r=a+92|0;j=s;while(1){h=a+52+(j*12|0)+4|0;m=f[h>>2]|0;if((f[a+52+(j*12|0)>>2]|0)==(m|0))if((j|0)<2)w=j+1|0;else break a;else{p=m+-4|0;m=f[p>>2]|0;f[h>>2]=p;f[b>>2]=j;f[i>>2]=m;if((m|0)==-1)break;p=(m>>>0)/3|0;h=f[t>>2]|0;do if(!(f[h+(p>>>5<<2)>>2]&1<<(p&31))){o=m;g=h;b:while(1){l=(o>>>0)/3|0;x=g+(l>>>5<<2)|0;f[x>>2]=1<<(l&31)|f[x>>2];x=f[i>>2]|0;if((x|0)==-1)y=-1;else y=f[(f[f[a>>2]>>2]|0)+(x<<2)>>2]|0;l=(f[k>>2]|0)+(y>>>5<<2)|0;z=1<<(y&31);A=f[l>>2]|0;if(!(z&A)){f[l>>2]=A|z;z=f[i>>2]|0;f[e>>2]=z;A=(z>>>0)/3|0;l=f[(f[(f[v>>2]|0)+96>>2]|0)+(A*12|0)+(z-(A*3|0)<<2)>>2]|0;A=f[n>>2]|0;f[d>>2]=l;z=f[A+4>>2]|0;A=z+4|0;B=f[A>>2]|0;if((B|0)==(f[z+8>>2]|0))Ng(z,d);else{f[B>>2]=l;f[A>>2]=B+4}B=f[q>>2]|0;A=B+4|0;l=f[A>>2]|0;if((l|0)==(f[B+8>>2]|0)){Ng(B,e);C=f[q>>2]|0}else{f[l>>2]=f[e>>2];f[A>>2]=l+4;C=B}B=C+24|0;f[(f[C+12>>2]|0)+(y<<2)>>2]=f[B>>2];f[B>>2]=(f[B>>2]|0)+1;D=f[i>>2]|0}else D=x;x=f[a>>2]|0;if((D|0)==-1){E=94;break}B=D+1|0;l=((B>>>0)%3|0|0)==0?D+-2|0:B;if((l|0)==-1)F=-1;else F=f[(f[x+12>>2]|0)+(l<<2)>>2]|0;l=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((l|0)==-1)G=-1;else G=f[(f[x+12>>2]|0)+(l<<2)>>2]|0;l=(F|0)==-1;B=l?-1:(F>>>0)/3|0;A=(G|0)==-1;z=A?-1:(G>>>0)/3|0;if(l)H=1;else H=(f[(f[t>>2]|0)+(B>>>5<<2)>>2]&1<<(B&31)|0)!=0;do if(A)if(H){E=94;break b}else E=82;else{if(f[(f[t>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)if(H){E=94;break b}else{E=82;break}B=f[(f[x>>2]|0)+(G<<2)>>2]|0;if(!(1<<(B&31)&f[(f[k>>2]|0)+(B>>>5<<2)>>2])){I=(f[r>>2]|0)+(B<<2)|0;B=f[I>>2]|0;f[I>>2]=B+1;J=(B|0)>0?1:2}else J=0;if(H?(J|0)<=(f[b>>2]|0):0){K=G;break}f[d>>2]=G;B=a+52+(J*12|0)+4|0;I=f[B>>2]|0;if((I|0)==(f[a+52+(J*12|0)+8>>2]|0))Ng(a+52+(J*12|0)|0,d);else{f[I>>2]=G;f[B>>2]=I+4}if((f[b>>2]|0)>(J|0))f[b>>2]=J;if(H){E=94;break b}else E=82}while(0);if((E|0)==82){E=0;if(l)L=-1;else L=f[(f[f[a>>2]>>2]|0)+(F<<2)>>2]|0;if(!(1<<(L&31)&f[(f[k>>2]|0)+(L>>>5<<2)>>2])){x=(f[r>>2]|0)+(L<<2)|0;z=f[x>>2]|0;f[x>>2]=z+1;M=(z|0)>0?1:2}else M=0;if((M|0)>(f[b>>2]|0))break;else K=F}f[i>>2]=K;o=K;g=f[t>>2]|0}if((E|0)==94){E=0;N=f[b>>2]|0;break}f[d>>2]=F;g=a+52+(M*12|0)+4|0;o=f[g>>2]|0;if((o|0)==(f[a+52+(M*12|0)+8>>2]|0))Ng(a+52+(M*12|0)|0,d);else{f[o>>2]=F;f[g>>2]=o+4}o=f[b>>2]|0;if((o|0)>(M|0)){f[b>>2]=M;O=M}else O=o;N=O}else N=j;while(0);if((N|0)<3)w=N;else break a}j=w}u=c;return 1}while(0);f[i>>2]=-1;u=c;return 1}function yb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0;c=u;u=u+32|0;d=c+16|0;e=c+4|0;g=c;f[a+36>>2]=b;h=a+24|0;i=a+28|0;j=f[h>>2]|0;k=(f[i>>2]|0)-j>>2;l=j;if(k>>>0>=b>>>0){if(k>>>0>b>>>0)f[i>>2]=l+(b<<2)}else Of(h,b-k|0,3732);f[d>>2]=0;k=d+4|0;f[k>>2]=0;l=d+8|0;f[l>>2]=0;if(b){if((b|0)<0)$n(d);j=((b+-1|0)>>>5)+1|0;m=wk(j<<2)|0;f[d>>2]=m;f[l>>2]=j;f[k>>2]=b;j=b>>>5;oh(m|0,0,j<<2|0)|0;n=b&31;o=m+(j<<2)|0;j=m;if(!n){p=b;q=j;r=m}else{f[o>>2]=f[o>>2]&~(-1>>>(32-n|0));p=b;q=j;r=m}}else{p=0;q=0;r=0}m=a+4|0;j=f[a>>2]|0;n=(f[m>>2]|0)-j|0;o=n>>2;f[e>>2]=0;s=e+4|0;f[s>>2]=0;t=e+8|0;f[t>>2]=0;do if(n){if((n|0)<0)$n(e);v=((o+-1|0)>>>5)+1|0;w=wk(v<<2)|0;f[e>>2]=w;f[t>>2]=v;f[s>>2]=o;v=o>>>5;oh(w|0,0,v<<2|0)|0;x=o&31;y=w+(v<<2)|0;if(x|0)f[y>>2]=f[y>>2]&~(-1>>>(32-x|0));if(o>>>0>2){x=a+32|0;y=a+12|0;v=a+52|0;w=a+56|0;z=a+48|0;A=b;B=j;C=0;D=q;E=r;a:while(1){F=B;G=C*3|0;H=f[F+(G<<2)>>2]|0;I=G+1|0;if((I|0)!=-1){J=f[F+(I<<2)>>2]|0;I=G+2|0;if((I|0)==-1){K=-1;L=J}else{M=J;N=I;O=22}}else{M=-1;N=0;O=22}if((O|0)==22){O=0;K=f[F+(N<<2)>>2]|0;L=M}if((H|0)!=(L|0)?!((H|0)==(K|0)|(L|0)==(K|0)):0){H=0;F=A;I=D;J=E;while(1){P=H+G|0;if(!(f[(f[e>>2]|0)+(P>>>5<<2)>>2]&1<<(P&31))){Q=f[(f[a>>2]|0)+(P<<2)>>2]|0;f[g>>2]=Q;R=Q>>>5;S=1<<(Q&31);b:do if(!(f[J+(R<<2)>>2]&S)){Q=f[d>>2]|0;T=Q+(R<<2)|0;f[T>>2]=f[T>>2]|S;T=Q;U=f[h>>2]|0;V=P;while(1){W=(f[e>>2]|0)+(V>>>5<<2)|0;f[W>>2]=f[W>>2]|1<<(V&31);f[U+(f[g>>2]<<2)>>2]=V;W=V+1|0;X=((W>>>0)%3|0|0)==0?V+-2|0:W;do if((X|0)==-1)Y=-1;else{W=f[(f[y>>2]|0)+(X<<2)>>2]|0;Z=W+1|0;if((W|0)==-1){Y=-1;break}Y=((Z>>>0)%3|0|0)==0?W+-2|0:Z}while(0);if((Y|0)==(P|0)){_=0;$=F;aa=T;ba=Q;O=50;break b}if((Y|0)==-1){ca=0;da=F;ea=T;fa=Q;O=51;break}else V=Y}}else{V=f[i>>2]|0;if((V|0)==(f[x>>2]|0))Ng(h,3732);else{f[V>>2]=-1;f[i>>2]=V+4}V=f[v>>2]|0;if((V|0)==(f[w>>2]|0))Ng(z,g);else{f[V>>2]=f[g>>2];f[v>>2]=V+4}V=f[k>>2]|0;Q=f[l>>2]|0;if((V|0)==(Q<<5|0)){if((V+1|0)<0){O=36;break a}T=Q<<6;Q=V+32&-32;vg(d,V>>>0<1073741823?(T>>>0<Q>>>0?Q:T):2147483647);ga=f[k>>2]|0}else ga=V;f[k>>2]=ga+1;V=(f[d>>2]|0)+(ga>>>5<<2)|0;f[V>>2]=f[V>>2]&~(1<<(ga&31));V=F+1|0;f[g>>2]=F;T=f[d>>2]|0;Q=T+(F>>>5<<2)|0;f[Q>>2]=f[Q>>2]|1<<(F&31);Q=T;U=f[h>>2]|0;X=f[a>>2]|0;Z=P;while(1){W=(f[e>>2]|0)+(Z>>>5<<2)|0;f[W>>2]=f[W>>2]|1<<(Z&31);W=f[g>>2]|0;f[U+(W<<2)>>2]=Z;f[X+(Z<<2)>>2]=W;W=Z+1|0;ha=((W>>>0)%3|0|0)==0?Z+-2|0:W;do if((ha|0)==-1)ia=-1;else{W=f[(f[y>>2]|0)+(ha<<2)>>2]|0;ja=W+1|0;if((W|0)==-1){ia=-1;break}ia=((ja>>>0)%3|0|0)==0?W+-2|0:ja}while(0);if((ia|0)==(P|0)){_=1;$=V;aa=Q;ba=T;O=50;break b}if((ia|0)==-1){ca=1;da=V;ea=Q;fa=T;O=51;break}else Z=ia}}while(0);if((O|0)==50){O=0;if((P|0)==-1){ca=_;da=$;ea=aa;fa=ba;O=51}else{ka=$;la=aa;ma=ba}}c:do if((O|0)==51){O=0;S=(((P>>>0)%3|0|0)==0?2:-1)+P|0;if(((S|0)!=-1?(R=f[(f[y>>2]|0)+(S<<2)>>2]|0,(R|0)!=-1):0)?(S=R+(((R>>>0)%3|0|0)==0?2:-1)|0,(S|0)!=-1):0)if(ca){R=f[a>>2]|0;Z=S;while(1){T=(f[e>>2]|0)+(Z>>>5<<2)|0;f[T>>2]=f[T>>2]|1<<(Z&31);f[R+(Z<<2)>>2]=f[g>>2];T=(((Z>>>0)%3|0|0)==0?2:-1)+Z|0;if((T|0)==-1){ka=da;la=ea;ma=fa;break c}Q=f[(f[y>>2]|0)+(T<<2)>>2]|0;if((Q|0)==-1){ka=da;la=ea;ma=fa;break c}Z=Q+(((Q>>>0)%3|0|0)==0?2:-1)|0;if((Z|0)==-1){ka=da;la=ea;ma=fa;break}}}else{Z=S;while(1){R=(f[e>>2]|0)+(Z>>>5<<2)|0;f[R>>2]=f[R>>2]|1<<(Z&31);R=(((Z>>>0)%3|0|0)==0?2:-1)+Z|0;if((R|0)==-1){ka=da;la=ea;ma=fa;break c}Q=f[(f[y>>2]|0)+(R<<2)>>2]|0;if((Q|0)==-1){ka=da;la=ea;ma=fa;break c}Z=Q+(((Q>>>0)%3|0|0)==0?2:-1)|0;if((Z|0)==-1){ka=da;la=ea;ma=fa;break}}}else{ka=da;la=ea;ma=fa}}while(0);na=ka;oa=la;pa=ma}else{na=F;oa=I;pa=J}H=H+1|0;if(H>>>0>=3){qa=na;ra=oa;sa=pa;break}else{F=na;I=oa;J=pa}}}else{qa=A;ra=D;sa=E}C=C+1|0;B=f[a>>2]|0;if(C>>>0>=(((f[m>>2]|0)-B>>2>>>0)/3|0)>>>0){O=17;break}else{A=qa;D=ra;E=sa}}if((O|0)==17){ta=ra;ua=f[k>>2]|0;break}else if((O|0)==36)$n(d)}else{ta=q;ua=p}}else{ta=q;ua=p}while(0);p=a+44|0;f[p>>2]=0;a=ta;q=ua>>>5;O=a+(q<<2)|0;k=ua&31;if(q|k|0){q=ta;ta=0;ua=a;a=0;while(1){if(!(f[ua>>2]&1<<ta)){ra=a+1|0;f[p>>2]=ra;va=ra}else va=a;ra=(ta|0)==31;q=ra?ua+4|0:q;ta=ra?0:ta+1|0;ua=q;if(!((O|0)!=(ua|0)|(ta|0)!=(k|0)))break;else a=va}}va=f[e>>2]|0;if(va|0)Ko(va);va=f[d>>2]|0;if(!va){u=c;return 1}Ko(va);u=c;return 1}function zb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=Ia,L=Ia,M=Ia,N=0,O=0,P=0,Q=0,R=0,S=0;e=u;u=u+48|0;g=e+40|0;i=e+16|0;j=e;k=Ec(a,c)|0;if(k|0){l=f[a+4>>2]|0;m=f[k+4>>2]|0;o=l+-1|0;p=(o&l|0)==0;if(!p)if(m>>>0<l>>>0)q=m;else q=(m>>>0)%(l>>>0)|0;else q=o&m;m=(f[a>>2]|0)+(q<<2)|0;r=f[m>>2]|0;while(1){s=f[r>>2]|0;if((s|0)==(k|0))break;else r=s}if((r|0)!=(a+8|0)){s=f[r+4>>2]|0;if(!p)if(s>>>0<l>>>0)t=s;else t=(s>>>0)%(l>>>0)|0;else t=s&o;if((t|0)==(q|0))v=k;else w=15}else w=15;do if((w|0)==15){t=f[k>>2]|0;if(t|0){s=f[t+4>>2]|0;if(!p)if(s>>>0<l>>>0)x=s;else x=(s>>>0)%(l>>>0)|0;else x=s&o;if((x|0)==(q|0)){v=k;break}}f[m>>2]=0;v=k}while(0);m=f[v>>2]|0;x=m;if(m){s=f[m+4>>2]|0;if(!p)if(s>>>0<l>>>0)y=s;else y=(s>>>0)%(l>>>0)|0;else y=s&o;if((y|0)!=(q|0)){f[(f[a>>2]|0)+(y<<2)>>2]=r;z=f[k>>2]|0}else z=x}else z=x;f[r>>2]=z;f[v>>2]=0;v=a+12|0;f[v>>2]=(f[v>>2]|0)+-1;v=k+8|0;z=f[k+20>>2]|0;if(z|0){f[k+24>>2]=z;Ko(z)}if((b[v+11>>0]|0)<0)Ko(f[v>>2]|0);Ko(k)}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;v=(f[d+4>>2]|0)-(f[d>>2]|0)|0;Kg(j,v);Bf(f[j>>2]|0,f[d>>2]|0,v|0)|0;Yi(i,c);c=i+12|0;f[c>>2]=0;v=i+16|0;f[v>>2]=0;f[i+20>>2]=0;Kg(c,(f[k>>2]|0)-(f[j>>2]|0)|0);d=f[j>>2]|0;Bf(f[c>>2]|0,d|0,(f[k>>2]|0)-d|0)|0;d=i+11|0;z=b[d>>0]|0;r=z<<24>>24<0;x=r?f[i>>2]|0:i;y=r?f[i+4>>2]|0:z&255;if(y>>>0>3){z=x;r=y;q=y;while(1){o=W(h[z>>0]|h[z+1>>0]<<8|h[z+2>>0]<<16|h[z+3>>0]<<24,1540483477)|0;r=(W(o>>>24^o,1540483477)|0)^(W(r,1540483477)|0);q=q+-4|0;if(q>>>0<=3)break;else z=z+4|0}z=y+-4|0;q=z&-4;A=z-q|0;B=x+(q+4)|0;C=r}else{A=y;B=x;C=y}switch(A|0){case 3:{D=h[B+2>>0]<<16^C;w=40;break}case 2:{D=C;w=40;break}case 1:{E=C;w=41;break}default:F=C}if((w|0)==40){E=h[B+1>>0]<<8^D;w=41}if((w|0)==41)F=W(E^h[B>>0],1540483477)|0;B=W(F>>>13^F,1540483477)|0;F=B>>>15^B;B=a+4|0;E=f[B>>2]|0;D=(E|0)==0;a:do if(!D){C=E+-1|0;A=(C&E|0)==0;if(!A)if(F>>>0<E>>>0)G=F;else G=(F>>>0)%(E>>>0)|0;else G=F&C;r=f[(f[a>>2]|0)+(G<<2)>>2]|0;if((r|0)!=0?(q=f[r>>2]|0,(q|0)!=0):0){r=(y|0)==0;if(A){if(r){A=q;while(1){z=f[A+4>>2]|0;if(!((z|0)==(F|0)|(z&C|0)==(G|0))){H=G;w=86;break a}z=b[A+8+11>>0]|0;if(!((z<<24>>24<0?f[A+12>>2]|0:z&255)|0))break a;A=f[A>>2]|0;if(!A){H=G;w=86;break a}}}A=q;while(1){z=f[A+4>>2]|0;if(!((z|0)==(F|0)|(z&C|0)==(G|0))){H=G;w=86;break a}z=A+8|0;o=b[z+11>>0]|0;s=o<<24>>24<0;l=o&255;do if(((s?f[A+12>>2]|0:l)|0)==(y|0)){o=f[z>>2]|0;if(s)if(!(Fi(o,x,y)|0))break a;else break;if((b[x>>0]|0)==(o&255)<<24>>24){o=z;p=l;m=x;do{p=p+-1|0;o=o+1|0;if(!p)break a;m=m+1|0}while((b[o>>0]|0)==(b[m>>0]|0))}}while(0);A=f[A>>2]|0;if(!A){H=G;w=86;break a}}}if(r){A=q;while(1){C=f[A+4>>2]|0;if((C|0)!=(F|0)){if(C>>>0<E>>>0)I=C;else I=(C>>>0)%(E>>>0)|0;if((I|0)!=(G|0)){H=G;w=86;break a}}C=b[A+8+11>>0]|0;if(!((C<<24>>24<0?f[A+12>>2]|0:C&255)|0))break a;A=f[A>>2]|0;if(!A){H=G;w=86;break a}}}A=q;while(1){r=f[A+4>>2]|0;if((r|0)!=(F|0)){if(r>>>0<E>>>0)J=r;else J=(r>>>0)%(E>>>0)|0;if((J|0)!=(G|0)){H=G;w=86;break a}}r=A+8|0;C=b[r+11>>0]|0;l=C<<24>>24<0;z=C&255;do if(((l?f[A+12>>2]|0:z)|0)==(y|0)){C=f[r>>2]|0;if(l)if(!(Fi(C,x,y)|0))break a;else break;if((b[x>>0]|0)==(C&255)<<24>>24){C=r;s=z;m=x;do{s=s+-1|0;C=C+1|0;if(!s)break a;m=m+1|0}while((b[C>>0]|0)==(b[m>>0]|0))}}while(0);A=f[A>>2]|0;if(!A){H=G;w=86;break}}}else{H=G;w=86}}else{H=0;w=86}while(0);if((w|0)==86){G=wk(32)|0;f[g>>2]=G;x=G+8|0;f[x>>2]=f[i>>2];f[x+4>>2]=f[i+4>>2];f[x+8>>2]=f[i+8>>2];f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;x=G+20|0;f[x>>2]=0;f[G+24>>2]=0;f[G+28>>2]=0;Kg(x,(f[v>>2]|0)-(f[c>>2]|0)|0);y=f[c>>2]|0;Bf(f[x>>2]|0,y|0,(f[v>>2]|0)-y|0)|0;f[G+4>>2]=F;f[G>>2]=0;y=a+12|0;K=_(((f[y>>2]|0)+1|0)>>>0);L=_(E>>>0);M=_(n[a+16>>2]);do if(D|_(M*L)<K){x=E<<1|(E>>>0<3|(E+-1&E|0)!=0)&1;c=~~_(V(_(K/M)))>>>0;Xf(a,x>>>0<c>>>0?c:x);x=f[B>>2]|0;c=x+-1|0;if(!(c&x)){N=x;O=c&F;break}if(F>>>0<x>>>0){N=x;O=F}else{N=x;O=(F>>>0)%(x>>>0)|0}}else{N=E;O=H}while(0);H=(f[a>>2]|0)+(O<<2)|0;O=f[H>>2]|0;if(!O){E=a+8|0;f[G>>2]=f[E>>2];f[E>>2]=G;f[H>>2]=E;E=f[G>>2]|0;if(!E)P=g;else{H=f[E+4>>2]|0;E=N+-1|0;if(E&N)if(H>>>0<N>>>0)Q=H;else Q=(H>>>0)%(N>>>0)|0;else Q=H&E;R=g;S=(f[a>>2]|0)+(Q<<2)|0;w=99}}else{f[G>>2]=f[O>>2];R=g;S=O;w=99}if((w|0)==99){f[S>>2]=G;P=R}f[y>>2]=(f[y>>2]|0)+1;f[P>>2]=0}P=f[i+12>>2]|0;if(P|0){f[v>>2]=P;Ko(P)}if((b[d>>0]|0)<0)Ko(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}f[k>>2]=i;Ko(i);u=e;return}function Ab(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{j=a+24|0;k=b[j>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;m=a+40|0;o=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;q=vl(o|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=l+q|0;q=0;while(1){d[g+(q<<1)>>1]=b[m>>0]|0;q=q+1|0;l=b[j>>0]|0;if((q|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){r=l;break}else m=m+1|0}}else r=k;m=r<<24>>24;if(r<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<1)|0,0,(e<<24>>24)-m<<1|0)|0;i=1;return i|0}case 2:{m=a+24|0;q=b[m>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){j=f[f[a>>2]>>2]|0;l=a+40|0;o=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;s=vl(o|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=j+s|0;s=0;while(1){d[g+(s<<1)>>1]=h[l>>0]|0;s=s+1|0;j=b[m>>0]|0;if((s|0)>=((j<<24>>24>e<<24>>24?e:j)<<24>>24|0)){t=j;break}else l=l+1|0}}else t=q;l=t<<24>>24;if(t<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<1)|0,0,(e<<24>>24)-l<<1|0)|0;i=1;return i|0}case 3:{l=a+24|0;s=b[l>>0]|0;if((s<<24>>24>e<<24>>24?e:s)<<24>>24>0){m=f[f[a>>2]>>2]|0;k=a+40|0;j=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;o=vl(j|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=m+o|0;o=0;while(1){d[g+(o<<1)>>1]=d[k>>1]|0;o=o+1|0;m=b[l>>0]|0;if((o|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){u=m;break}else k=k+2|0}}else u=s;k=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<1)|0,0,(e<<24>>24)-k<<1|0)|0;i=1;return i|0}case 4:{k=a+24|0;o=b[k>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){l=f[f[a>>2]>>2]|0;q=a+40|0;m=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;j=vl(m|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=l+j|0;j=0;while(1){d[g+(j<<1)>>1]=d[q>>1]|0;j=j+1|0;l=b[k>>0]|0;if((j|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){v=l;break}else q=q+2|0}}else v=o;q=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<1)|0,0,(e<<24>>24)-q<<1|0)|0;i=1;return i|0}case 5:{q=a+24|0;j=b[q>>0]|0;if((j<<24>>24>e<<24>>24?e:j)<<24>>24>0){k=f[f[a>>2]>>2]|0;s=a+40|0;l=Bk(f[s>>2]|0,f[s+4>>2]|0,f[c>>2]|0,0)|0;s=a+48|0;m=vl(l|0,H|0,f[s>>2]|0,f[s+4>>2]|0)|0;s=k+m|0;m=0;while(1){d[g+(m<<1)>>1]=f[s>>2];m=m+1|0;k=b[q>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){w=k;break}else s=s+4|0}}else w=j;s=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(s<<1)|0,0,(e<<24>>24)-s<<1|0)|0;i=1;return i|0}case 6:{s=a+24|0;m=b[s>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;k=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;l=vl(k|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+l|0;l=0;while(1){d[g+(l<<1)>>1]=f[o>>2];l=l+1|0;q=b[s>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){x=q;break}else o=o+4|0}}else x=m;o=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<1)|0,0,(e<<24>>24)-o<<1|0)|0;i=1;return i|0}case 7:{o=a+24|0;l=b[o>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){s=f[f[a>>2]>>2]|0;j=a+40|0;q=Bk(f[j>>2]|0,f[j+4>>2]|0,f[c>>2]|0,0)|0;j=a+48|0;k=vl(q|0,H|0,f[j>>2]|0,f[j+4>>2]|0)|0;j=s+k|0;k=0;while(1){d[g+(k<<1)>>1]=f[j>>2];k=k+1|0;s=b[o>>0]|0;if((k|0)>=((s<<24>>24>e<<24>>24?e:s)<<24>>24|0)){y=s;break}else j=j+8|0}}else y=l;j=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(j<<1)|0,0,(e<<24>>24)-j<<1|0)|0;i=1;return i|0}case 8:{j=a+24|0;k=b[j>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){o=f[f[a>>2]>>2]|0;m=a+40|0;s=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;q=vl(s|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=o+q|0;q=0;while(1){d[g+(q<<1)>>1]=f[m>>2];q=q+1|0;o=b[j>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){z=o;break}else m=m+8|0}}else z=k;m=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<1)|0,0,(e<<24>>24)-m<<1|0)|0;i=1;return i|0}case 9:{m=a+24|0;q=b[m>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){j=f[f[a>>2]>>2]|0;l=a+40|0;o=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;s=vl(o|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=j+s|0;s=0;while(1){j=~~_(n[l>>2])&65535;d[g+(s<<1)>>1]=j;s=s+1|0;j=b[m>>0]|0;if((s|0)>=((j<<24>>24>e<<24>>24?e:j)<<24>>24|0)){A=j;break}else l=l+4|0}}else A=q;l=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<1)|0,0,(e<<24>>24)-l<<1|0)|0;i=1;return i|0}case 10:{l=a+24|0;s=b[l>>0]|0;if((s<<24>>24>e<<24>>24?e:s)<<24>>24>0){m=f[f[a>>2]>>2]|0;k=a+40|0;j=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;o=vl(j|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=m+o|0;o=0;while(1){d[g+(o<<1)>>1]=~~+p[k>>3];o=o+1|0;m=b[l>>0]|0;if((o|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){B=m;break}else k=k+8|0}}else B=s;k=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<1)|0,0,(e<<24>>24)-k<<1|0)|0;i=1;return i|0}case 11:{k=a+24|0;o=b[k>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){l=f[f[a>>2]>>2]|0;q=a+40|0;m=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;j=vl(m|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=l+j|0;j=0;while(1){d[g+(j<<1)>>1]=h[q>>0]|0;j=j+1|0;l=b[k>>0]|0;if((j|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){C=l;break}else q=q+1|0}}else C=o;q=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<1)|0,0,(e<<24>>24)-q<<1|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Bb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{j=a+24|0;k=b[j>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;m=a+40|0;o=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;q=vl(o|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=l+q|0;q=0;while(1){d[g+(q<<1)>>1]=b[m>>0]|0;q=q+1|0;l=b[j>>0]|0;if((q|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){r=l;break}else m=m+1|0}}else r=k;m=r<<24>>24;if(r<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<1)|0,0,(e<<24>>24)-m<<1|0)|0;i=1;return i|0}case 2:{m=a+24|0;q=b[m>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){j=f[f[a>>2]>>2]|0;l=a+40|0;o=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;s=vl(o|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=j+s|0;s=0;while(1){d[g+(s<<1)>>1]=h[l>>0]|0;s=s+1|0;j=b[m>>0]|0;if((s|0)>=((j<<24>>24>e<<24>>24?e:j)<<24>>24|0)){t=j;break}else l=l+1|0}}else t=q;l=t<<24>>24;if(t<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<1)|0,0,(e<<24>>24)-l<<1|0)|0;i=1;return i|0}case 3:{l=a+24|0;s=b[l>>0]|0;if((s<<24>>24>e<<24>>24?e:s)<<24>>24>0){m=f[f[a>>2]>>2]|0;k=a+40|0;j=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;o=vl(j|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=m+o|0;o=0;while(1){d[g+(o<<1)>>1]=d[k>>1]|0;o=o+1|0;m=b[l>>0]|0;if((o|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){u=m;break}else k=k+2|0}}else u=s;k=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<1)|0,0,(e<<24>>24)-k<<1|0)|0;i=1;return i|0}case 4:{k=a+24|0;o=b[k>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){l=f[f[a>>2]>>2]|0;q=a+40|0;m=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;j=vl(m|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=l+j|0;j=0;while(1){d[g+(j<<1)>>1]=d[q>>1]|0;j=j+1|0;l=b[k>>0]|0;if((j|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){v=l;break}else q=q+2|0}}else v=o;q=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<1)|0,0,(e<<24>>24)-q<<1|0)|0;i=1;return i|0}case 5:{q=a+24|0;j=b[q>>0]|0;if((j<<24>>24>e<<24>>24?e:j)<<24>>24>0){k=f[f[a>>2]>>2]|0;s=a+40|0;l=Bk(f[s>>2]|0,f[s+4>>2]|0,f[c>>2]|0,0)|0;s=a+48|0;m=vl(l|0,H|0,f[s>>2]|0,f[s+4>>2]|0)|0;s=k+m|0;m=0;while(1){d[g+(m<<1)>>1]=f[s>>2];m=m+1|0;k=b[q>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){w=k;break}else s=s+4|0}}else w=j;s=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(s<<1)|0,0,(e<<24>>24)-s<<1|0)|0;i=1;return i|0}case 6:{s=a+24|0;m=b[s>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;k=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;l=vl(k|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+l|0;l=0;while(1){d[g+(l<<1)>>1]=f[o>>2];l=l+1|0;q=b[s>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){x=q;break}else o=o+4|0}}else x=m;o=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<1)|0,0,(e<<24>>24)-o<<1|0)|0;i=1;return i|0}case 7:{o=a+24|0;l=b[o>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){s=f[f[a>>2]>>2]|0;j=a+40|0;q=Bk(f[j>>2]|0,f[j+4>>2]|0,f[c>>2]|0,0)|0;j=a+48|0;k=vl(q|0,H|0,f[j>>2]|0,f[j+4>>2]|0)|0;j=s+k|0;k=0;while(1){d[g+(k<<1)>>1]=f[j>>2];k=k+1|0;s=b[o>>0]|0;if((k|0)>=((s<<24>>24>e<<24>>24?e:s)<<24>>24|0)){y=s;break}else j=j+8|0}}else y=l;j=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(j<<1)|0,0,(e<<24>>24)-j<<1|0)|0;i=1;return i|0}case 8:{j=a+24|0;k=b[j>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){o=f[f[a>>2]>>2]|0;m=a+40|0;s=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;q=vl(s|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=o+q|0;q=0;while(1){d[g+(q<<1)>>1]=f[m>>2];q=q+1|0;o=b[j>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){z=o;break}else m=m+8|0}}else z=k;m=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<1)|0,0,(e<<24>>24)-m<<1|0)|0;i=1;return i|0}case 9:{m=a+24|0;q=b[m>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){j=f[f[a>>2]>>2]|0;l=a+40|0;o=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;s=vl(o|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=j+s|0;s=0;while(1){j=~~_(n[l>>2]);d[g+(s<<1)>>1]=j;s=s+1|0;j=b[m>>0]|0;if((s|0)>=((j<<24>>24>e<<24>>24?e:j)<<24>>24|0)){A=j;break}else l=l+4|0}}else A=q;l=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<1)|0,0,(e<<24>>24)-l<<1|0)|0;i=1;return i|0}case 10:{l=a+24|0;s=b[l>>0]|0;if((s<<24>>24>e<<24>>24?e:s)<<24>>24>0){m=f[f[a>>2]>>2]|0;k=a+40|0;j=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;o=vl(j|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=m+o|0;o=0;while(1){d[g+(o<<1)>>1]=~~+p[k>>3];o=o+1|0;m=b[l>>0]|0;if((o|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){B=m;break}else k=k+8|0}}else B=s;k=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<1)|0,0,(e<<24>>24)-k<<1|0)|0;i=1;return i|0}case 11:{k=a+24|0;o=b[k>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){l=f[f[a>>2]>>2]|0;q=a+40|0;m=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;j=vl(m|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=l+j|0;j=0;while(1){d[g+(j<<1)>>1]=h[q>>0]|0;j=j+1|0;l=b[k>>0]|0;if((j|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){C=l;break}else q=q+1|0}}else C=o;q=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<1)|0,0,(e<<24>>24)-q<<1|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Cb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=vl(q|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=vl(q|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=vl(k|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=vl(o|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=Bk(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=vl(m|0,H|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=vl(l|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=vl(r|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=vl(t|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=vl(q|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~_(n[m>>2])>>>0;f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=vl(k|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3]>>>0;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=vl(o|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Db(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=vl(q|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=vl(q|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=vl(k|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=vl(o|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=Bk(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=vl(m|0,H|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=Bk(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=vl(l|0,H|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=vl(r|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=vl(t|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=vl(q|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~_(n[m>>2]);f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=vl(k|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=vl(o|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Eb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if(!g){h=0;return h|0}do switch(f[a+28>>2]|0){case 1:{i=a+24|0;j=b[i>>0]|0;if((j<<24>>24>e<<24>>24?e:j)<<24>>24>0){k=f[f[a>>2]>>2]|0;l=a+40|0;m=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;o=vl(m|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=k+o|0;o=0;while(1){b[g+o>>0]=b[l>>0]|0;o=o+1|0;k=b[i>>0]|0;if((o|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){q=k;break}else l=l+1|0}}else q=j;l=q<<24>>24;if(q<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+l|0,0,(e<<24>>24)-l|0)|0;h=1;return h|0}case 2:{l=a+24|0;o=b[l>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){i=f[f[a>>2]>>2]|0;k=a+40|0;m=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=vl(m|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=i+r|0;r=0;while(1){b[g+r>>0]=b[k>>0]|0;r=r+1|0;i=b[l>>0]|0;if((r|0)>=((i<<24>>24>e<<24>>24?e:i)<<24>>24|0)){s=i;break}else k=k+1|0}}else s=o;k=s<<24>>24;if(s<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+k|0,0,(e<<24>>24)-k|0)|0;h=1;return h|0}case 3:{k=a+24|0;r=b[k>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){l=f[f[a>>2]>>2]|0;j=a+40|0;i=Bk(f[j>>2]|0,f[j+4>>2]|0,f[c>>2]|0,0)|0;j=a+48|0;m=vl(i|0,H|0,f[j>>2]|0,f[j+4>>2]|0)|0;j=l+m|0;m=0;while(1){b[g+m>>0]=d[j>>1];m=m+1|0;l=b[k>>0]|0;if((m|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){t=l;break}else j=j+2|0}}else t=r;j=t<<24>>24;if(t<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+j|0,0,(e<<24>>24)-j|0)|0;h=1;return h|0}case 4:{j=a+24|0;m=b[j>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;l=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;i=vl(l|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+i|0;i=0;while(1){b[g+i>>0]=d[o>>1];i=i+1|0;k=b[j>>0]|0;if((i|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else o=o+2|0}}else u=m;o=u<<24>>24;if(u<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+o|0,0,(e<<24>>24)-o|0)|0;h=1;return h|0}case 5:{o=a+24|0;i=b[o>>0]|0;if((i<<24>>24>e<<24>>24?e:i)<<24>>24>0){j=f[f[a>>2]>>2]|0;r=a+40|0;k=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;l=vl(k|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=j+l|0;l=0;while(1){b[g+l>>0]=f[r>>2];l=l+1|0;j=b[o>>0]|0;if((l|0)>=((j<<24>>24>e<<24>>24?e:j)<<24>>24|0)){v=j;break}else r=r+4|0}}else v=i;r=v<<24>>24;if(v<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+r|0,0,(e<<24>>24)-r|0)|0;h=1;return h|0}case 6:{r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){o=f[f[a>>2]>>2]|0;m=a+40|0;j=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;k=vl(j|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=o+k|0;k=0;while(1){b[g+k>>0]=f[m>>2];k=k+1|0;o=b[r>>0]|0;if((k|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){w=o;break}else m=m+4|0}}else w=l;m=w<<24>>24;if(w<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+m|0,0,(e<<24>>24)-m|0)|0;h=1;return h|0}case 7:{m=a+24|0;k=b[m>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){r=f[f[a>>2]>>2]|0;i=a+40|0;o=Bk(f[i>>2]|0,f[i+4>>2]|0,f[c>>2]|0,0)|0;i=a+48|0;j=vl(o|0,H|0,f[i>>2]|0,f[i+4>>2]|0)|0;i=r+j|0;j=0;while(1){b[g+j>>0]=f[i>>2];j=j+1|0;r=b[m>>0]|0;if((j|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){x=r;break}else i=i+8|0}}else x=k;i=x<<24>>24;if(x<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+i|0,0,(e<<24>>24)-i|0)|0;h=1;return h|0}case 8:{i=a+24|0;j=b[i>>0]|0;if((j<<24>>24>e<<24>>24?e:j)<<24>>24>0){m=f[f[a>>2]>>2]|0;l=a+40|0;r=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;o=vl(r|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=m+o|0;o=0;while(1){b[g+o>>0]=f[l>>2];o=o+1|0;m=b[i>>0]|0;if((o|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){y=m;break}else l=l+8|0}}else y=j;l=y<<24>>24;if(y<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+l|0,0,(e<<24>>24)-l|0)|0;h=1;return h|0}case 9:{l=a+24|0;o=b[l>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){i=f[f[a>>2]>>2]|0;k=a+40|0;m=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=vl(m|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=i+r|0;r=0;while(1){i=~~_(n[k>>2])&255;b[g+r>>0]=i;r=r+1|0;i=b[l>>0]|0;if((r|0)>=((i<<24>>24>e<<24>>24?e:i)<<24>>24|0)){z=i;break}else k=k+4|0}}else z=o;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+k|0,0,(e<<24>>24)-k|0)|0;h=1;return h|0}case 10:{k=a+24|0;r=b[k>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){l=f[f[a>>2]>>2]|0;j=a+40|0;i=Bk(f[j>>2]|0,f[j+4>>2]|0,f[c>>2]|0,0)|0;j=a+48|0;m=vl(i|0,H|0,f[j>>2]|0,f[j+4>>2]|0)|0;j=l+m|0;m=0;while(1){b[g+m>>0]=~~+p[j>>3];m=m+1|0;l=b[k>>0]|0;if((m|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){A=l;break}else j=j+8|0}}else A=r;j=A<<24>>24;if(A<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+j|0,0,(e<<24>>24)-j|0)|0;h=1;return h|0}case 11:{j=a+24|0;m=b[j>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;l=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;i=vl(l|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+i|0;i=0;while(1){b[g+i>>0]=b[o>>0]|0;i=i+1|0;k=b[j>>0]|0;if((i|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else o=o+1|0}}else B=m;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+o|0,0,(e<<24>>24)-o|0)|0;h=1;return h|0}default:{h=0;return h|0}}while(0);return 0}function Fb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if(!g){h=0;return h|0}do switch(f[a+28>>2]|0){case 1:{i=a+24|0;j=b[i>>0]|0;if((j<<24>>24>e<<24>>24?e:j)<<24>>24>0){k=f[f[a>>2]>>2]|0;l=a+40|0;m=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;o=vl(m|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=k+o|0;o=0;while(1){b[g+o>>0]=b[l>>0]|0;o=o+1|0;k=b[i>>0]|0;if((o|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){q=k;break}else l=l+1|0}}else q=j;l=q<<24>>24;if(q<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+l|0,0,(e<<24>>24)-l|0)|0;h=1;return h|0}case 2:{l=a+24|0;o=b[l>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){i=f[f[a>>2]>>2]|0;k=a+40|0;m=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=vl(m|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=i+r|0;r=0;while(1){b[g+r>>0]=b[k>>0]|0;r=r+1|0;i=b[l>>0]|0;if((r|0)>=((i<<24>>24>e<<24>>24?e:i)<<24>>24|0)){s=i;break}else k=k+1|0}}else s=o;k=s<<24>>24;if(s<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+k|0,0,(e<<24>>24)-k|0)|0;h=1;return h|0}case 3:{k=a+24|0;r=b[k>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){l=f[f[a>>2]>>2]|0;j=a+40|0;i=Bk(f[j>>2]|0,f[j+4>>2]|0,f[c>>2]|0,0)|0;j=a+48|0;m=vl(i|0,H|0,f[j>>2]|0,f[j+4>>2]|0)|0;j=l+m|0;m=0;while(1){b[g+m>>0]=d[j>>1];m=m+1|0;l=b[k>>0]|0;if((m|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){t=l;break}else j=j+2|0}}else t=r;j=t<<24>>24;if(t<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+j|0,0,(e<<24>>24)-j|0)|0;h=1;return h|0}case 4:{j=a+24|0;m=b[j>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;l=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;i=vl(l|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+i|0;i=0;while(1){b[g+i>>0]=d[o>>1];i=i+1|0;k=b[j>>0]|0;if((i|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else o=o+2|0}}else u=m;o=u<<24>>24;if(u<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+o|0,0,(e<<24>>24)-o|0)|0;h=1;return h|0}case 5:{o=a+24|0;i=b[o>>0]|0;if((i<<24>>24>e<<24>>24?e:i)<<24>>24>0){j=f[f[a>>2]>>2]|0;r=a+40|0;k=Bk(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;l=vl(k|0,H|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=j+l|0;l=0;while(1){b[g+l>>0]=f[r>>2];l=l+1|0;j=b[o>>0]|0;if((l|0)>=((j<<24>>24>e<<24>>24?e:j)<<24>>24|0)){v=j;break}else r=r+4|0}}else v=i;r=v<<24>>24;if(v<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+r|0,0,(e<<24>>24)-r|0)|0;h=1;return h|0}case 6:{r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){o=f[f[a>>2]>>2]|0;m=a+40|0;j=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;k=vl(j|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=o+k|0;k=0;while(1){b[g+k>>0]=f[m>>2];k=k+1|0;o=b[r>>0]|0;if((k|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){w=o;break}else m=m+4|0}}else w=l;m=w<<24>>24;if(w<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+m|0,0,(e<<24>>24)-m|0)|0;h=1;return h|0}case 7:{m=a+24|0;k=b[m>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){r=f[f[a>>2]>>2]|0;i=a+40|0;o=Bk(f[i>>2]|0,f[i+4>>2]|0,f[c>>2]|0,0)|0;i=a+48|0;j=vl(o|0,H|0,f[i>>2]|0,f[i+4>>2]|0)|0;i=r+j|0;j=0;while(1){b[g+j>>0]=f[i>>2];j=j+1|0;r=b[m>>0]|0;if((j|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){x=r;break}else i=i+8|0}}else x=k;i=x<<24>>24;if(x<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+i|0,0,(e<<24>>24)-i|0)|0;h=1;return h|0}case 8:{i=a+24|0;j=b[i>>0]|0;if((j<<24>>24>e<<24>>24?e:j)<<24>>24>0){m=f[f[a>>2]>>2]|0;l=a+40|0;r=Bk(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;o=vl(r|0,H|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=m+o|0;o=0;while(1){b[g+o>>0]=f[l>>2];o=o+1|0;m=b[i>>0]|0;if((o|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){y=m;break}else l=l+8|0}}else y=j;l=y<<24>>24;if(y<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+l|0,0,(e<<24>>24)-l|0)|0;h=1;return h|0}case 9:{l=a+24|0;o=b[l>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){i=f[f[a>>2]>>2]|0;k=a+40|0;m=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=vl(m|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=i+r|0;r=0;while(1){i=~~_(n[k>>2]);b[g+r>>0]=i;r=r+1|0;i=b[l>>0]|0;if((r|0)>=((i<<24>>24>e<<24>>24?e:i)<<24>>24|0)){z=i;break}else k=k+4|0}}else z=o;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+k|0,0,(e<<24>>24)-k|0)|0;h=1;return h|0}case 10:{k=a+24|0;r=b[k>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){l=f[f[a>>2]>>2]|0;j=a+40|0;i=Bk(f[j>>2]|0,f[j+4>>2]|0,f[c>>2]|0,0)|0;j=a+48|0;m=vl(i|0,H|0,f[j>>2]|0,f[j+4>>2]|0)|0;j=l+m|0;m=0;while(1){b[g+m>>0]=~~+p[j>>3];m=m+1|0;l=b[k>>0]|0;if((m|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){A=l;break}else j=j+8|0}}else A=r;j=A<<24>>24;if(A<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+j|0,0,(e<<24>>24)-j|0)|0;h=1;return h|0}case 11:{j=a+24|0;m=b[j>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;l=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;i=vl(l|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+i|0;i=0;while(1){b[g+i>>0]=b[o>>0]|0;i=i+1|0;k=b[j>>0]|0;if((i|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else o=o+1|0}}else B=m;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){h=1;return h|0}oh(g+o|0,0,(e<<24>>24)-o|0)|0;h=1;return h|0}default:{h=0;return h|0}}while(0);return 0}function Gb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;c=u;u=u+48|0;d=c+24|0;e=c+12|0;g=c;h=a+4|0;i=f[(f[h>>2]|0)+44>>2]|0;j=a+8|0;k=f[j>>2]|0;l=((f[k+4>>2]|0)-(f[k>>2]|0)>>2>>>0)/3|0;k=i+96|0;m=i+100|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;i=f[k>>2]|0;n=((f[m>>2]|0)-i|0)/12|0;if(l>>>0<=n>>>0){if(l>>>0<n>>>0)f[m>>2]=i+(l*12|0)}else lf(k,l-n|0,d);n=a+216|0;l=a+220|0;if((f[n>>2]|0)==(f[l>>2]|0)){k=f[h>>2]|0;i=f[k+44>>2]|0;m=f[i+100>>2]|0;o=f[i+96>>2]|0;if((m|0)!=(o|0)){i=d+4|0;p=d+8|0;q=o;r=(m-o|0)/12|0;o=0;do{f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;m=o*3|0;if((m|0)!=-1){s=f[(f[f[j>>2]>>2]|0)+(m<<2)>>2]|0;f[d>>2]=s;t=m+1|0;if((t|0)==-1){f[i>>2]=-1;v=0;w=s;x=77}else{y=t;z=s;x=76}}else{f[d>>2]=-1;y=0;z=-1;x=76}if((x|0)==76){x=0;f[i>>2]=f[(f[f[j>>2]>>2]|0)+(y<<2)>>2];s=m+2|0;if((s|0)==-1){A=-1;B=z}else{v=s;w=z;x=77}}if((x|0)==77){x=0;A=f[(f[f[j>>2]>>2]|0)+(v<<2)>>2]|0;B=w}f[p>>2]=A;f[q+(o*12|0)>>2]=B;f[q+(o*12|0)+4>>2]=f[i>>2];f[q+(o*12|0)+8>>2]=f[p>>2];o=o+1|0}while(o>>>0<r>>>0)}f[(f[k+4>>2]|0)+80>>2]=b;C=1;u=c;return C|0}f[d>>2]=0;b=d+4|0;f[b>>2]=0;k=d+8|0;f[k>>2]=0;r=f[j>>2]|0;o=(f[r+4>>2]|0)-(f[r>>2]|0)|0;p=o>>2;f[e>>2]=0;q=e+4|0;f[q>>2]=0;i=e+8|0;f[i>>2]=0;do if(o|0)if(p>>>0>1073741823)$n(e);else{B=wk(o)|0;f[e>>2]=B;A=B+(p<<2)|0;f[i>>2]=A;oh(B|0,0,o|0)|0;f[q>>2]=A;break}while(0);a:do if(((f[r+28>>2]|0)-(f[r+24>>2]|0)|0)>0){o=a+120|0;i=0;p=r;while(1){A=f[(f[p+24>>2]|0)+(i<<2)>>2]|0;b:do if((A|0)!=-1){c:do if((f[(f[o>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)==0?(B=f[l>>2]|0,w=f[n>>2]|0,v=w,(B|0)!=(w|0)):0){z=(((A>>>0)%3|0|0)==0?2:-1)+A|0;y=p+12|0;s=(B-w|0)/144|0;if((z|0)==-1){w=0;while(1){B=f[(f[f[v+(w*144|0)+68>>2]>>2]|0)+(A<<2)>>2]|0;if(1<<(B&31)&f[(f[v+(w*144|0)+16>>2]|0)+(B>>>5<<2)>>2]|0){D=0;break a}w=w+1|0;if(w>>>0>=s>>>0){E=A;break c}}}w=0;while(1){B=f[(f[f[v+(w*144|0)+68>>2]>>2]|0)+(A<<2)>>2]|0;if(1<<(B&31)&f[(f[v+(w*144|0)+16>>2]|0)+(B>>>5<<2)>>2]|0){B=f[v+(w*144|0)+32>>2]|0;m=f[B+(A<<2)>>2]|0;t=f[y>>2]|0;F=f[t+(z<<2)>>2]|0;do if((F|0)!=-1)if(!((F>>>0)%3|0)){G=F+2|0;break}else{G=F+-1|0;break}else G=-1;while(0);if((G|0)!=(A|0)){F=G;while(1){if((F|0)==-1){D=0;break a}if((f[B+(F<<2)>>2]|0)!=(m|0)){E=F;break c}H=(((F>>>0)%3|0|0)==0?2:-1)+F|0;do if((H|0)!=-1){I=f[t+(H<<2)>>2]|0;if((I|0)==-1){J=-1;break}if(!((I>>>0)%3|0)){J=I+2|0;break}else{J=I+-1|0;break}}else J=-1;while(0);if((J|0)==(A|0))break;else F=J}}}w=w+1|0;if(w>>>0>=s>>>0){E=A;break}}}else E=A;while(0);s=f[b>>2]|0;f[(f[e>>2]|0)+(E<<2)>>2]=s-(f[d>>2]|0)>>2;f[g>>2]=E;w=s;if((f[k>>2]|0)>>>0>w>>>0){f[w>>2]=E;f[b>>2]=w+4;K=p}else{Ng(d,g);K=f[j>>2]|0}if((((E|0)!=-1?(w=(((E>>>0)%3|0|0)==0?2:-1)+E|0,(w|0)!=-1):0)?(s=f[(f[K+12>>2]|0)+(w<<2)>>2]|0,(s|0)!=-1):0)?(w=s+(((s>>>0)%3|0|0)==0?2:-1)|0,(w|0)!=-1&(w|0)!=(E|0)):0){s=E;z=w;w=K;while(1){y=f[l>>2]|0;v=f[n>>2]|0;F=v;d:do if((y|0)==(v|0))x=59;else{t=(y-v|0)/144|0;m=0;while(1){B=f[F+(m*144|0)+32>>2]|0;m=m+1|0;if((f[B+(z<<2)>>2]|0)!=(f[B+(s<<2)>>2]|0))break;if(m>>>0>=t>>>0){x=59;break d}}t=f[b>>2]|0;f[(f[e>>2]|0)+(z<<2)>>2]=t-(f[d>>2]|0)>>2;f[g>>2]=z;m=t;if((f[k>>2]|0)>>>0>m>>>0){f[m>>2]=z;f[b>>2]=m+4;L=w}else{Ng(d,g);L=f[j>>2]|0}M=L}while(0);if((x|0)==59){x=0;F=f[e>>2]|0;f[F+(z<<2)>>2]=f[F+(s<<2)>>2];M=w}if((z|0)==-1){N=M;break b}F=(((z>>>0)%3|0|0)==0?2:-1)+z|0;if((F|0)==-1){N=M;break b}v=f[(f[M+12>>2]|0)+(F<<2)>>2]|0;if((v|0)==-1){N=M;break b}F=v+(((v>>>0)%3|0|0)==0?2:-1)|0;if((F|0)!=-1&(F|0)!=(E|0)){v=z;z=F;w=M;s=v}else{N=M;break}}}else N=K}else N=p;while(0);i=i+1|0;if((i|0)>=((f[N+28>>2]|0)-(f[N+24>>2]|0)>>2|0)){x=65;break}else p=N}}else x=65;while(0);if((x|0)==65){x=f[h>>2]|0;h=f[x+44>>2]|0;N=f[h+100>>2]|0;K=f[h+96>>2]|0;if((N|0)!=(K|0)?(h=f[e>>2]|0,M=g+4|0,E=g+8|0,L=(N-K|0)/12|0,f[g>>2]=f[h>>2],f[g+4>>2]=f[h+4>>2],f[g+8>>2]=f[h+8>>2],N=K,f[N>>2]=f[g>>2],f[N+4>>2]=f[M>>2],f[N+8>>2]=f[E>>2],L>>>0>1):0){K=1;do{j=h+(K*3<<2)|0;f[g>>2]=f[j>>2];f[g+4>>2]=f[j+4>>2];f[g+8>>2]=f[j+8>>2];f[N+(K*12|0)>>2]=f[g>>2];f[N+(K*12|0)+4>>2]=f[M>>2];f[N+(K*12|0)+8>>2]=f[E>>2];K=K+1|0}while(K>>>0<L>>>0)}f[(f[x+4>>2]|0)+80>>2]=(f[b>>2]|0)-(f[d>>2]|0)>>2;D=1}x=f[e>>2]|0;if(x|0){f[q>>2]=x;Ko(x)}x=f[d>>2]|0;if(x|0){f[b>>2]=x;Ko(x)}C=D;u=c;return C|0}function Hb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){h=1;u=c;return h|0}i=(g>>>0)/3|0;j=a+12|0;if(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0){h=1;u=c;return h|0}i=a+56|0;k=f[i>>2]|0;l=a+60|0;f[l>>2]=k;m=k;k=a+64|0;if((f[k>>2]|0)==(m|0))Ng(i,b);else{f[m>>2]=g;f[l>>2]=m+4}m=f[a>>2]|0;g=f[b>>2]|0;n=g+1|0;do if((g|0)!=-1){o=f[m+28>>2]|0;p=f[o+((((n>>>0)%3|0|0)==0?g+-2|0:n)<<2)>>2]|0;if(!((g>>>0)%3|0)){q=p;r=g+2|0;s=o;break}else{q=p;r=g+-1|0;s=o;break}}else{o=f[m+28>>2]|0;q=f[o+-4>>2]|0;r=-1;s=o}while(0);m=f[s+(r<<2)>>2]|0;if((q|0)==-1|(m|0)==-1){h=0;u=c;return h|0}r=a+24|0;s=f[r>>2]|0;g=s+(q>>>5<<2)|0;n=1<<(q&31);o=f[g>>2]|0;if(!(o&n)){f[g>>2]=o|n;n=f[b>>2]|0;o=n+1|0;if((n|0)==-1)t=-1;else t=((o>>>0)%3|0|0)==0?n+-2|0:o;f[e>>2]=t;o=(t>>>0)/3|0;n=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(o*12|0)+(t-(o*3|0)<<2)>>2]|0;o=f[a+48>>2]|0;f[d>>2]=n;t=f[o+4>>2]|0;o=t+4|0;g=f[o>>2]|0;if((g|0)==(f[t+8>>2]|0))Ng(t,d);else{f[g>>2]=n;f[o>>2]=g+4}g=a+40|0;o=f[g>>2]|0;n=o+4|0;t=f[n>>2]|0;if((t|0)==(f[o+8>>2]|0)){Ng(o,e);v=f[g>>2]|0}else{f[t>>2]=f[e>>2];f[n>>2]=t+4;v=o}o=v+24|0;f[(f[v+12>>2]|0)+(q<<2)>>2]=f[o>>2];f[o>>2]=(f[o>>2]|0)+1;w=f[r>>2]|0}else w=s;s=w+(m>>>5<<2)|0;w=1<<(m&31);o=f[s>>2]|0;if(!(o&w)){f[s>>2]=o|w;w=f[b>>2]|0;do if((w|0)!=-1)if(!((w>>>0)%3|0)){x=w+2|0;break}else{x=w+-1|0;break}else x=-1;while(0);f[e>>2]=x;w=(x>>>0)/3|0;o=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(w*12|0)+(x-(w*3|0)<<2)>>2]|0;w=f[a+48>>2]|0;f[d>>2]=o;x=f[w+4>>2]|0;w=x+4|0;s=f[w>>2]|0;if((s|0)==(f[x+8>>2]|0))Ng(x,d);else{f[s>>2]=o;f[w>>2]=s+4}s=a+40|0;w=f[s>>2]|0;o=w+4|0;x=f[o>>2]|0;if((x|0)==(f[w+8>>2]|0)){Ng(w,e);y=f[s>>2]|0}else{f[x>>2]=f[e>>2];f[o>>2]=x+4;y=w}w=y+24|0;f[(f[y+12>>2]|0)+(m<<2)>>2]=f[w>>2];f[w>>2]=(f[w>>2]|0)+1}w=f[l>>2]|0;if((f[i>>2]|0)==(w|0)){h=1;u=c;return h|0}m=a+44|0;y=a+48|0;x=a+40|0;o=w;a:while(1){w=o+-4|0;s=f[w>>2]|0;f[b>>2]=s;q=(s>>>0)/3|0;if((s|0)!=-1?(s=(f[j>>2]|0)+(q>>>5<<2)|0,v=1<<(q&31),q=f[s>>2]|0,(q&v|0)==0):0){f[s>>2]=q|v;v=f[a>>2]|0;q=f[b>>2]|0;s=f[(f[v+28>>2]|0)+(q<<2)>>2]|0;if((s|0)==-1){h=0;z=78;break}t=s;s=v;v=q;b:while(1){q=(f[r>>2]|0)+(t>>>5<<2)|0;n=1<<(t&31);g=f[q>>2]|0;if(!(g&n)){p=f[(f[s+40>>2]|0)+(t<<2)>>2]|0;if((p|0)==-1)A=1;else{B=f[(f[f[s+64>>2]>>2]|0)+(p<<2)>>2]|0;A=(1<<(B&31)&f[(f[s+12>>2]|0)+(B>>>5<<2)>>2]|0)!=0}f[q>>2]=g|n;n=f[b>>2]|0;f[e>>2]=n;g=(n>>>0)/3|0;q=f[(f[(f[m>>2]|0)+96>>2]|0)+(g*12|0)+(n-(g*3|0)<<2)>>2]|0;g=f[y>>2]|0;f[d>>2]=q;n=f[g+4>>2]|0;g=n+4|0;B=f[g>>2]|0;if((B|0)==(f[n+8>>2]|0))Ng(n,d);else{f[B>>2]=q;f[g>>2]=B+4}B=f[x>>2]|0;g=B+4|0;q=f[g>>2]|0;if((q|0)==(f[B+8>>2]|0)){Ng(B,e);C=f[x>>2]|0}else{f[q>>2]=f[e>>2];f[g>>2]=q+4;C=B}B=C+24|0;f[(f[C+12>>2]|0)+(t<<2)>>2]=f[B>>2];f[B>>2]=(f[B>>2]|0)+1;B=f[a>>2]|0;q=f[b>>2]|0;if(A){D=q;E=B;z=55}else{g=q+1|0;do if((q|0)==-1)F=-1;else{n=((g>>>0)%3|0|0)==0?q+-2|0:g;if((n|0)==-1){F=-1;break}if(f[(f[B>>2]|0)+(n>>>5<<2)>>2]&1<<(n&31)|0){F=-1;break}F=f[(f[(f[B+64>>2]|0)+12>>2]|0)+(n<<2)>>2]|0}while(0);f[b>>2]=F;G=(F>>>0)/3|0}}else{D=v;E=s;z=55}if((z|0)==55){z=0;B=D+1|0;if((D|0)==-1){z=59;break}g=((B>>>0)%3|0|0)==0?D+-2|0:B;if((g|0)!=-1?(f[(f[E>>2]|0)+(g>>>5<<2)>>2]&1<<(g&31)|0)==0:0)H=f[(f[(f[E+64>>2]|0)+12>>2]|0)+(g<<2)>>2]|0;else H=-1;f[d>>2]=H;g=(((D>>>0)%3|0|0)==0?2:-1)+D|0;do if((g|0)==-1)I=-1;else{if(f[(f[E>>2]|0)+(g>>>5<<2)>>2]&1<<(g&31)|0){I=-1;break}I=f[(f[(f[E+64>>2]|0)+12>>2]|0)+(g<<2)>>2]|0}while(0);g=(H|0)==-1;B=(H>>>0)/3|0;q=g?-1:B;n=(I|0)==-1;p=(I>>>0)/3|0;J=n?-1:p;do if(!g){K=f[j>>2]|0;if(f[K+(q>>>5<<2)>>2]&1<<(q&31)|0){z=65;break}if(n){L=B;M=H;break}if(!(f[K+(J>>>5<<2)>>2]&1<<(J&31))){z=70;break b}else{L=B;M=H}}else z=65;while(0);if((z|0)==65){z=0;if(n){z=67;break}if(!(f[(f[j>>2]|0)+(J>>>5<<2)>>2]&1<<(J&31))){L=p;M=I}else{z=67;break}}f[b>>2]=M;G=L}B=(f[j>>2]|0)+(G>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(G&31);s=f[a>>2]|0;v=f[b>>2]|0;t=f[(f[s+28>>2]|0)+(v<<2)>>2]|0;if((t|0)==-1){h=0;z=78;break a}}do if((z|0)==59){z=0;f[d>>2]=-1;z=67}else if((z|0)==70){z=0;t=f[l>>2]|0;f[t+-4>>2]=I;if((t|0)==(f[k>>2]|0)){Ng(i,d);break}else{f[t>>2]=f[d>>2];f[l>>2]=t+4;break}}while(0);if((z|0)==67){z=0;f[l>>2]=(f[l>>2]|0)+-4}}else f[l>>2]=w;o=f[l>>2]|0;if((f[i>>2]|0)==(o|0)){h=1;z=78;break}}if((z|0)==78){u=c;return h|0}return 0}function Ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){h=1;u=c;return h|0}i=(g>>>0)/3|0;j=a+12|0;if(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0){h=1;u=c;return h|0}i=a+56|0;k=f[i>>2]|0;l=a+60|0;f[l>>2]=k;m=k;k=a+64|0;if((f[k>>2]|0)==(m|0))Ng(i,b);else{f[m>>2]=g;f[l>>2]=m+4}m=f[a>>2]|0;g=f[b>>2]|0;n=g+1|0;if((g|0)==-1){h=0;u=c;return h|0}o=((n>>>0)%3|0|0)==0?g+-2|0:n;if((o|0)==-1)p=-1;else p=f[(f[m>>2]|0)+(o<<2)>>2]|0;o=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((o|0)==-1){h=0;u=c;return h|0}g=f[(f[m>>2]|0)+(o<<2)>>2]|0;if((p|0)==-1|(g|0)==-1){h=0;u=c;return h|0}o=a+24|0;m=f[o>>2]|0;n=m+(p>>>5<<2)|0;q=1<<(p&31);r=f[n>>2]|0;if(!(r&q)){f[n>>2]=r|q;q=f[b>>2]|0;r=q+1|0;if((q|0)==-1)s=-1;else s=((r>>>0)%3|0|0)==0?q+-2|0:r;f[e>>2]=s;r=(s>>>0)/3|0;q=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(r*12|0)+(s-(r*3|0)<<2)>>2]|0;r=f[a+48>>2]|0;f[d>>2]=q;s=f[r+4>>2]|0;r=s+4|0;n=f[r>>2]|0;if((n|0)==(f[s+8>>2]|0))Ng(s,d);else{f[n>>2]=q;f[r>>2]=n+4}n=a+40|0;r=f[n>>2]|0;q=r+4|0;s=f[q>>2]|0;if((s|0)==(f[r+8>>2]|0)){Ng(r,e);t=f[n>>2]|0}else{f[s>>2]=f[e>>2];f[q>>2]=s+4;t=r}r=t+24|0;f[(f[t+12>>2]|0)+(p<<2)>>2]=f[r>>2];f[r>>2]=(f[r>>2]|0)+1;v=f[o>>2]|0}else v=m;m=v+(g>>>5<<2)|0;v=1<<(g&31);r=f[m>>2]|0;if(!(r&v)){f[m>>2]=r|v;v=f[b>>2]|0;do if((v|0)!=-1)if(!((v>>>0)%3|0)){w=v+2|0;break}else{w=v+-1|0;break}else w=-1;while(0);f[e>>2]=w;v=(w>>>0)/3|0;r=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(v*12|0)+(w-(v*3|0)<<2)>>2]|0;v=f[a+48>>2]|0;f[d>>2]=r;w=f[v+4>>2]|0;v=w+4|0;m=f[v>>2]|0;if((m|0)==(f[w+8>>2]|0))Ng(w,d);else{f[m>>2]=r;f[v>>2]=m+4}m=a+40|0;v=f[m>>2]|0;r=v+4|0;w=f[r>>2]|0;if((w|0)==(f[v+8>>2]|0)){Ng(v,e);x=f[m>>2]|0}else{f[w>>2]=f[e>>2];f[r>>2]=w+4;x=v}v=x+24|0;f[(f[x+12>>2]|0)+(g<<2)>>2]=f[v>>2];f[v>>2]=(f[v>>2]|0)+1}v=f[l>>2]|0;if((f[i>>2]|0)==(v|0)){h=1;u=c;return h|0}g=a+44|0;x=a+48|0;w=a+40|0;r=v;a:while(1){v=r+-4|0;m=f[v>>2]|0;f[b>>2]=m;p=(m>>>0)/3|0;if((m|0)!=-1?(m=(f[j>>2]|0)+(p>>>5<<2)|0,t=1<<(p&31),p=f[m>>2]|0,(p&t|0)==0):0){f[m>>2]=p|t;t=f[b>>2]|0;if((t|0)==-1){h=0;y=79;break}p=t;b:while(1){t=f[a>>2]|0;m=f[(f[t>>2]|0)+(p<<2)>>2]|0;if((m|0)==-1){h=0;y=79;break a}s=(f[o>>2]|0)+(m>>>5<<2)|0;q=1<<(m&31);n=f[s>>2]|0;do if(!(n&q)){z=f[(f[t+24>>2]|0)+(m<<2)>>2]|0;A=z+1|0;do if((z|0)!=-1){B=((A>>>0)%3|0|0)==0?z+-2|0:A;if((B|0)==-1){y=46;break}C=f[(f[t+12>>2]|0)+(B<<2)>>2]|0;B=C+1|0;if((C|0)==-1){y=46;break}if(((((B>>>0)%3|0|0)==0?C+-2|0:B)|0)!=-1)D=0;else y=46}else y=46;while(0);if((y|0)==46){y=0;D=1}f[s>>2]=n|q;A=f[b>>2]|0;f[e>>2]=A;z=(A>>>0)/3|0;B=f[(f[(f[g>>2]|0)+96>>2]|0)+(z*12|0)+(A-(z*3|0)<<2)>>2]|0;z=f[x>>2]|0;f[d>>2]=B;A=f[z+4>>2]|0;z=A+4|0;C=f[z>>2]|0;if((C|0)==(f[A+8>>2]|0))Ng(A,d);else{f[C>>2]=B;f[z>>2]=C+4}C=f[w>>2]|0;z=C+4|0;B=f[z>>2]|0;if((B|0)==(f[C+8>>2]|0)){Ng(C,e);E=f[w>>2]|0}else{f[B>>2]=f[e>>2];f[z>>2]=B+4;E=C}C=E+24|0;f[(f[E+12>>2]|0)+(m<<2)>>2]=f[C>>2];f[C>>2]=(f[C>>2]|0)+1;C=f[a>>2]|0;B=f[b>>2]|0;if(D)if((B|0)==-1){y=61;break b}else{F=B;G=C;y=59;break}do if((B|0)==-1)H=-1;else{z=B+1|0;A=((z>>>0)%3|0|0)==0?B+-2|0:z;if((A|0)==-1){H=-1;break}H=f[(f[C+12>>2]|0)+(A<<2)>>2]|0}while(0);f[b>>2]=H;I=(H>>>0)/3|0}else{F=p;G=t;y=59}while(0);if((y|0)==59){y=0;t=F+1|0;m=((t>>>0)%3|0|0)==0?F+-2|0:t;if((m|0)==-1)J=-1;else J=f[(f[G+12>>2]|0)+(m<<2)>>2]|0;f[d>>2]=J;m=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((m|0)==-1)K=-1;else K=f[(f[G+12>>2]|0)+(m<<2)>>2]|0;m=(J|0)==-1;t=(J>>>0)/3|0;q=m?-1:t;n=(K|0)==-1;s=(K>>>0)/3|0;C=n?-1:s;do if(!m){B=f[j>>2]|0;if(f[B+(q>>>5<<2)>>2]&1<<(q&31)|0){y=66;break}if(n){L=t;M=J;break}if(!(f[B+(C>>>5<<2)>>2]&1<<(C&31))){y=71;break b}else{L=t;M=J}}else y=66;while(0);if((y|0)==66){y=0;if(n){y=68;break}if(!(f[(f[j>>2]|0)+(C>>>5<<2)>>2]&1<<(C&31))){L=s;M=K}else{y=68;break}}f[b>>2]=M;I=L}t=(f[j>>2]|0)+(I>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(I&31);p=f[b>>2]|0;if((p|0)==-1){h=0;y=79;break a}}do if((y|0)==61){y=0;f[d>>2]=-1;y=68}else if((y|0)==71){y=0;p=f[l>>2]|0;f[p+-4>>2]=K;if((p|0)==(f[k>>2]|0)){Ng(i,d);break}else{f[p>>2]=f[d>>2];f[l>>2]=p+4;break}}while(0);if((y|0)==68){y=0;f[l>>2]=(f[l>>2]|0)+-4}}else f[l>>2]=v;r=f[l>>2]|0;if((f[i>>2]|0)==(r|0)){h=1;y=79;break}}if((y|0)==79){u=c;return h|0}return 0}function Jb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=f[c>>2]|0;c=m+1|0;if((m|0)!=-1){n=((c>>>0)%3|0|0)==0?m+-2|0:c;c=(((m>>>0)%3|0|0)==0?2:-1)+m|0;m=f[a+32>>2]|0;if((n|0)==-1)o=-1;else o=f[(f[m>>2]|0)+(n<<2)>>2]|0;if((c|0)==-1){p=o;q=-1}else{p=o;q=f[(f[m>>2]|0)+(c<<2)>>2]|0}}else{p=-1;q=-1}c=f[a+36>>2]|0;m=f[c>>2]|0;o=(f[c+4>>2]|0)-m>>2;if(o>>>0<=p>>>0)$n(c);n=m;m=f[n+(p<<2)>>2]|0;if(o>>>0<=q>>>0)$n(c);c=f[n+(q<<2)>>2]|0;q=(m|0)<(e|0);do if(q&(c|0)<(e|0)){n=m<<1;o=f[d+(n<<2)>>2]|0;p=((o|0)<0)<<31>>31;r=f[d+((n|1)<<2)>>2]|0;n=((r|0)<0)<<31>>31;s=c<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(o|0)|(v|0)!=(r|0))){f[a+8>>2]=o;f[a+12>>2]=r;w=1;u=g;return w|0}s=a+4|0;x=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;y=f[a>>2]|0;if(!(b[y+84>>0]|0))z=f[(f[y+68>>2]|0)+(x<<2)>>2]|0;else z=x;f[i>>2]=z;x=b[y+24>>0]|0;f[h>>2]=f[i>>2];wb(y,h,x,j)|0;x=f[(f[s>>2]|0)+(m<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;y=f[a>>2]|0;if(!(b[y+84>>0]|0))A=f[(f[y+68>>2]|0)+(x<<2)>>2]|0;else A=x;f[i>>2]=A;x=b[y+24>>0]|0;f[h>>2]=f[i>>2];wb(y,h,x,k)|0;x=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))B=f[(f[s+68>>2]|0)+(x<<2)>>2]|0;else B=x;f[i>>2]=B;x=b[s+24>>0]|0;f[h>>2]=f[i>>2];wb(s,h,x,l)|0;x=l;s=k;y=f[s>>2]|0;C=f[s+4>>2]|0;s=wl(f[x>>2]|0,f[x+4>>2]|0,y|0,C|0)|0;x=H;D=l+8|0;E=k+8|0;F=f[E>>2]|0;G=f[E+4>>2]|0;E=wl(f[D>>2]|0,f[D+4>>2]|0,F|0,G|0)|0;D=H;I=l+16|0;J=k+16|0;K=f[J>>2]|0;L=f[J+4>>2]|0;J=wl(f[I>>2]|0,f[I+4>>2]|0,K|0,L|0)|0;I=H;M=Bk(s|0,x|0,s|0,x|0)|0;N=H;O=Bk(E|0,D|0,E|0,D|0)|0;P=vl(O|0,H|0,M|0,N|0)|0;N=H;M=Bk(J|0,I|0,J|0,I|0)|0;O=vl(P|0,N|0,M|0,H|0)|0;M=H;if((O|0)==0&(M|0)==0)break;N=j;P=wl(f[N>>2]|0,f[N+4>>2]|0,y|0,C|0)|0;C=H;y=j+8|0;N=wl(f[y>>2]|0,f[y+4>>2]|0,F|0,G|0)|0;G=H;F=j+16|0;y=wl(f[F>>2]|0,f[F+4>>2]|0,K|0,L|0)|0;L=H;K=Bk(P|0,C|0,s|0,x|0)|0;F=H;Q=Bk(N|0,G|0,E|0,D|0)|0;R=vl(Q|0,H|0,K|0,F|0)|0;F=H;K=Bk(y|0,L|0,J|0,I|0)|0;Q=vl(R|0,F|0,K|0,H|0)|0;K=H;F=wl(t|0,((t|0)<0)<<31>>31|0,o|0,p|0)|0;t=H;R=wl(v|0,((v|0)<0)<<31>>31|0,r|0,n|0)|0;v=H;S=Bk(O|0,M|0,o|0,p|0)|0;p=H;o=Bk(O|0,M|0,r|0,n|0)|0;n=H;r=Bk(Q|0,K|0,F|0,t|0)|0;T=H;U=Bk(Q|0,K|0,R|0,v|0)|0;V=H;W=vl(r|0,T|0,S|0,p|0)|0;p=H;S=vl(U|0,V|0,o|0,n|0)|0;n=H;o=Bk(Q|0,K|0,s|0,x|0)|0;x=H;s=Bk(Q|0,K|0,E|0,D|0)|0;D=H;E=Bk(Q|0,K|0,J|0,I|0)|0;I=H;J=ni(o|0,x|0,O|0,M|0)|0;x=H;o=ni(s|0,D|0,O|0,M|0)|0;D=H;s=ni(E|0,I|0,O|0,M|0)|0;I=H;E=wl(P|0,C|0,J|0,x|0)|0;x=H;J=wl(N|0,G|0,o|0,D|0)|0;D=H;o=wl(y|0,L|0,s|0,I|0)|0;I=H;s=Bk(E|0,x|0,E|0,x|0)|0;x=H;E=Bk(J|0,D|0,J|0,D|0)|0;D=vl(E|0,H|0,s|0,x|0)|0;x=H;s=Bk(o|0,I|0,o|0,I|0)|0;I=vl(D|0,x|0,s|0,H|0)|0;s=H;x=wl(0,0,F|0,t|0)|0;t=H;F=Bk(I|0,s|0,O|0,M|0)|0;s=H;switch(F|0){case 0:{if(!s){X=F;Y=s}else Z=23;break}case 1:{if(!s){_=F;$=s;Z=25}else Z=23;break}default:Z=23}if((Z|0)==23){I=1;D=0;o=F;E=s;while(1){J=rl(I|0,D|0,1)|0;L=H;y=o;o=xl(o|0,E|0,2)|0;if(!(E>>>0>0|(E|0)==0&y>>>0>7)){_=J;$=L;Z=25;break}else{I=J;D=L;E=H}}}if((Z|0)==25){E=_;D=$;while(1){I=ln(F|0,s|0,E|0,D|0)|0;o=vl(I|0,H|0,E|0,D|0)|0;I=xl(o|0,H|0,1)|0;o=H;L=Bk(I|0,o|0,I|0,o|0)|0;J=H;if(J>>>0>s>>>0|(J|0)==(s|0)&L>>>0>F>>>0){E=I;D=o}else{X=I;Y=o;break}}}D=Bk(X|0,Y|0,R|0,v|0)|0;E=H;F=Bk(X|0,Y|0,x|0,t|0)|0;s=H;o=a+20|0;I=f[o>>2]|0;if(!I)aa=0;else{L=I+-1|0;I=(f[(f[a+16>>2]|0)+(L>>>5<<2)>>2]&1<<(L&31)|0)==0;f[o>>2]=L;L=wl(0,0,F|0,s|0)|0;o=vl(S|0,n|0,(I?L:F)|0,(I?H:s)|0)|0;s=H;F=wl(0,0,D|0,E|0)|0;L=vl(W|0,p|0,(I?F:D)|0,(I?H:E)|0)|0;E=ni(L|0,H|0,O|0,M|0)|0;L=ni(o|0,s|0,O|0,M|0)|0;f[a+8>>2]=E;f[a+12>>2]=L;aa=1}w=aa;u=g;return w|0}while(0);do if(q)ba=m<<1;else{if((e|0)>0){ba=(e<<1)+-2|0;break}aa=a+8|0;f[aa>>2]=0;f[aa+4>>2]=0;w=1;u=g;return w|0}while(0);f[a+8>>2]=f[d+(ba<<2)>>2];f[a+12>>2]=f[d+(ba+1<<2)>>2];w=1;u=g;return w|0}function Kb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;do if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;if(!((n>>>0)%3|0)){p=n+2|0;q=o;break}else{p=n+-1|0;q=o;break}}else{p=-1;q=-1}while(0);n=f[(f[m>>2]|0)+28>>2]|0;m=f[n+(q<<2)>>2]|0;q=f[n+(p<<2)>>2]|0;p=f[a+36>>2]|0;n=f[p>>2]|0;c=(f[p+4>>2]|0)-n>>2;if(c>>>0<=m>>>0)$n(p);o=n;n=f[o+(m<<2)>>2]|0;if(c>>>0<=q>>>0)$n(p);p=f[o+(q<<2)>>2]|0;q=(n|0)<(e|0);do if(q&(p|0)<(e|0)){o=n<<1;c=f[d+(o<<2)>>2]|0;m=((c|0)<0)<<31>>31;r=f[d+((o|1)<<2)>>2]|0;o=((r|0)<0)<<31>>31;s=p<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(c|0)|(v|0)!=(r|0))){f[a+8>>2]=c;f[a+12>>2]=r;w=1;u=g;return w|0}s=a+4|0;x=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;y=f[a>>2]|0;if(!(b[y+84>>0]|0))z=f[(f[y+68>>2]|0)+(x<<2)>>2]|0;else z=x;f[i>>2]=z;x=b[y+24>>0]|0;f[h>>2]=f[i>>2];wb(y,h,x,j)|0;x=f[(f[s>>2]|0)+(n<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;y=f[a>>2]|0;if(!(b[y+84>>0]|0))A=f[(f[y+68>>2]|0)+(x<<2)>>2]|0;else A=x;f[i>>2]=A;x=b[y+24>>0]|0;f[h>>2]=f[i>>2];wb(y,h,x,k)|0;x=f[(f[s>>2]|0)+(p<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))B=f[(f[s+68>>2]|0)+(x<<2)>>2]|0;else B=x;f[i>>2]=B;x=b[s+24>>0]|0;f[h>>2]=f[i>>2];wb(s,h,x,l)|0;x=l;s=k;y=f[s>>2]|0;C=f[s+4>>2]|0;s=wl(f[x>>2]|0,f[x+4>>2]|0,y|0,C|0)|0;x=H;D=l+8|0;E=k+8|0;F=f[E>>2]|0;G=f[E+4>>2]|0;E=wl(f[D>>2]|0,f[D+4>>2]|0,F|0,G|0)|0;D=H;I=l+16|0;J=k+16|0;K=f[J>>2]|0;L=f[J+4>>2]|0;J=wl(f[I>>2]|0,f[I+4>>2]|0,K|0,L|0)|0;I=H;M=Bk(s|0,x|0,s|0,x|0)|0;N=H;O=Bk(E|0,D|0,E|0,D|0)|0;P=vl(O|0,H|0,M|0,N|0)|0;N=H;M=Bk(J|0,I|0,J|0,I|0)|0;O=vl(P|0,N|0,M|0,H|0)|0;M=H;if((O|0)==0&(M|0)==0)break;N=j;P=wl(f[N>>2]|0,f[N+4>>2]|0,y|0,C|0)|0;C=H;y=j+8|0;N=wl(f[y>>2]|0,f[y+4>>2]|0,F|0,G|0)|0;G=H;F=j+16|0;y=wl(f[F>>2]|0,f[F+4>>2]|0,K|0,L|0)|0;L=H;K=Bk(P|0,C|0,s|0,x|0)|0;F=H;Q=Bk(N|0,G|0,E|0,D|0)|0;R=vl(Q|0,H|0,K|0,F|0)|0;F=H;K=Bk(y|0,L|0,J|0,I|0)|0;Q=vl(R|0,F|0,K|0,H|0)|0;K=H;F=wl(t|0,((t|0)<0)<<31>>31|0,c|0,m|0)|0;t=H;R=wl(v|0,((v|0)<0)<<31>>31|0,r|0,o|0)|0;v=H;S=Bk(O|0,M|0,c|0,m|0)|0;m=H;c=Bk(O|0,M|0,r|0,o|0)|0;o=H;r=Bk(Q|0,K|0,F|0,t|0)|0;T=H;U=Bk(Q|0,K|0,R|0,v|0)|0;V=H;W=vl(r|0,T|0,S|0,m|0)|0;m=H;S=vl(U|0,V|0,c|0,o|0)|0;o=H;c=Bk(Q|0,K|0,s|0,x|0)|0;x=H;s=Bk(Q|0,K|0,E|0,D|0)|0;D=H;E=Bk(Q|0,K|0,J|0,I|0)|0;I=H;J=ni(c|0,x|0,O|0,M|0)|0;x=H;c=ni(s|0,D|0,O|0,M|0)|0;D=H;s=ni(E|0,I|0,O|0,M|0)|0;I=H;E=wl(P|0,C|0,J|0,x|0)|0;x=H;J=wl(N|0,G|0,c|0,D|0)|0;D=H;c=wl(y|0,L|0,s|0,I|0)|0;I=H;s=Bk(E|0,x|0,E|0,x|0)|0;x=H;E=Bk(J|0,D|0,J|0,D|0)|0;D=vl(E|0,H|0,s|0,x|0)|0;x=H;s=Bk(c|0,I|0,c|0,I|0)|0;I=vl(D|0,x|0,s|0,H|0)|0;s=H;x=wl(0,0,F|0,t|0)|0;t=H;F=Bk(I|0,s|0,O|0,M|0)|0;s=H;switch(F|0){case 0:{if(!s){X=F;Y=s}else Z=22;break}case 1:{if(!s){_=F;$=s;Z=24}else Z=22;break}default:Z=22}if((Z|0)==22){I=1;D=0;c=F;E=s;while(1){J=rl(I|0,D|0,1)|0;L=H;y=c;c=xl(c|0,E|0,2)|0;if(!(E>>>0>0|(E|0)==0&y>>>0>7)){_=J;$=L;Z=24;break}else{I=J;D=L;E=H}}}if((Z|0)==24){E=_;D=$;while(1){I=ln(F|0,s|0,E|0,D|0)|0;c=vl(I|0,H|0,E|0,D|0)|0;I=xl(c|0,H|0,1)|0;c=H;L=Bk(I|0,c|0,I|0,c|0)|0;J=H;if(J>>>0>s>>>0|(J|0)==(s|0)&L>>>0>F>>>0){E=I;D=c}else{X=I;Y=c;break}}}D=Bk(X|0,Y|0,R|0,v|0)|0;E=H;F=Bk(X|0,Y|0,x|0,t|0)|0;s=H;c=a+20|0;I=f[c>>2]|0;if(!I)aa=0;else{L=I+-1|0;I=(f[(f[a+16>>2]|0)+(L>>>5<<2)>>2]&1<<(L&31)|0)==0;f[c>>2]=L;L=wl(0,0,F|0,s|0)|0;c=vl(S|0,o|0,(I?L:F)|0,(I?H:s)|0)|0;s=H;F=wl(0,0,D|0,E|0)|0;L=vl(W|0,m|0,(I?F:D)|0,(I?H:E)|0)|0;E=ni(L|0,H|0,O|0,M|0)|0;L=ni(c|0,s|0,O|0,M|0)|0;f[a+8>>2]=E;f[a+12>>2]=L;aa=1}w=aa;u=g;return w|0}while(0);do if(q)ba=n<<1;else{if((e|0)>0){ba=(e<<1)+-2|0;break}aa=a+8|0;f[aa>>2]=0;f[aa+4>>2]=0;w=1;u=g;return w|0}while(0);f[a+8>>2]=f[d+(ba<<2)>>2];f[a+12>>2]=f[d+(ba+1<<2)>>2];w=1;u=g;return w|0}function Lb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ba=Ia,ca=Ia,da=Ia;c=u;u=u+32|0;d=c+12|0;e=c;g=a+60|0;if((f[g>>2]|0)==(f[a+64>>2]|0)?(f[a+48>>2]|0)==(f[a+52>>2]|0):0){h=1;u=c;return h|0}if((Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0)<=0){h=1;u=c;return h|0}i=d+4|0;j=d+8|0;k=a+36|0;l=d+8|0;m=d+4|0;o=e+4|0;p=e+8|0;q=d+11|0;r=d+4|0;s=0;t=0;v=0;a:while(1){w=La[f[(f[a>>2]|0)+20>>2]&127](a,v)|0;x=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;y=f[(f[(f[x>>2]|0)+8>>2]|0)+(w<<2)>>2]|0;w=y+28|0;b:do switch(f[w>>2]|0){case 1:case 3:case 5:{x=y+24|0;z=b[x>>0]|0;A=z<<24>>24;f[d>>2]=0;f[i>>2]=0;f[j>>2]=0;if(!(z<<24>>24))B=0;else{if(z<<24>>24<0){C=8;break a}z=A<<2;D=wk(z)|0;f[d>>2]=D;E=D+(A<<2)|0;f[j>>2]=E;oh(D|0,0,z|0)|0;f[i>>2]=E;B=b[x>>0]|0}E=B<<24>>24;f[e>>2]=0;f[o>>2]=0;f[p>>2]=0;if(B<<24>>24){if(B<<24>>24<0){C=12;break a}z=E<<2;D=wk(z)|0;f[e>>2]=D;A=D+(E<<2)|0;f[p>>2]=A;oh(D|0,0,z|0)|0;f[o>>2]=A}switch(f[w>>2]|0){case 5:{if(pe(a,y,t)|0)C=18;else{F=1;G=t}break}case 3:{if(oe(a,y,t)|0)C=18;else{F=1;G=t}break}case 1:{if(yd(a,y,t)|0)C=18;else{F=1;G=t}break}default:C=18}if((C|0)==18){C=0;F=0;G=t+(b[x>>0]|0)|0}x=f[e>>2]|0;if(x|0){f[o>>2]=x;Ko(x)}x=f[d>>2]|0;if(x|0){f[i>>2]=x;Ko(x)}if(!F){I=s;J=G}else{h=0;C=64;break a}break}case 9:{x=f[(f[g>>2]|0)+(s<<2)>>2]|0;A=f[k>>2]|0;z=s+1|0;D=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+40|0;E=f[D>>2]|0;D=f[y+56>>2]|0;K=wk(32)|0;f[d>>2]=K;f[l>>2]=-2147483616;f[m>>2]=24;L=K;M=11931;N=L+24|0;do{b[L>>0]=b[M>>0]|0;L=L+1|0;M=M+1|0}while((L|0)<(N|0));b[K+24>>0]=0;M=E+16|0;L=f[M>>2]|0;c:do if(L){N=M;O=L;do{P=(f[O+16>>2]|0)<(D|0);N=P?N:O;O=f[(P?O+4|0:O)>>2]|0}while((O|0)!=0);if(((N|0)!=(M|0)?(D|0)>=(f[N+16>>2]|0):0)?(O=N+20|0,P=f[N+24>>2]|0,(P|0)!=0):0){Q=P;while(1){P=Q+16|0;R=b[P+11>>0]|0;S=R<<24>>24<0;T=S?f[Q+20>>2]|0:R&255;R=T>>>0<24;U=R?T:24;V=(U|0)==0;if(!V?(W=S?f[P>>2]|0:P,X=Fi(K,W,U)|0,(X|0)!=0):0)if((X|0)<0)C=35;else{Y=W;C=38}else if(T>>>0<=24)if(V)C=39;else{Y=S?f[P>>2]|0:P;C=38}else C=35;if((C|0)==35){C=0;Z=Q}else if((C|0)==38){C=0;P=Fi(Y,K,U)|0;if(P)if((P|0)<0)C=41;else break;else C=39}if((C|0)==39){C=0;if(R)C=41;else break}if((C|0)==41){C=0;Z=Q+4|0}Q=f[Z>>2]|0;if(!Q){C=44;break c}}$=ci(O,d,0)|0}else C=44}else C=44;while(0);if((C|0)==44){C=0;$=ci(E,d,0)|0}if((b[q>>0]|0)<0)Ko(f[d>>2]|0);if($){ge(y,x);I=z;J=t;break b}K=f[A+(s*24|0)+4>>2]|0;D=b[y+24>>0]|0;M=D<<24>>24;L=M<<2;aa=Ho(M>>>0>1073741823?-1:M<<2)|0;dn(d);if(!(qk(d,_(n[A+(s*24|0)+20>>2]),(1<<K)+-1|0)|0)){C=63;break a}K=(f[f[x>>2]>>2]|0)+(f[x+48>>2]|0)|0;Q=x+80|0;d:do if(f[Q>>2]|0){N=y+64|0;R=A+(s*24|0)+8|0;if(D<<24>>24<=0){P=0;U=0;while(1){Bf((f[f[N>>2]>>2]|0)+U|0,aa|0,L|0)|0;P=P+1|0;if(P>>>0>=(f[Q>>2]|0)>>>0)break d;else U=U+L|0}}U=0;P=0;O=0;while(1){S=f[R>>2]|0;V=0;T=O;while(1){W=f[K+(T<<2)>>2]|0;if((W|0)>-1){ba=_(W|0);ca=_(_(n[r>>2])*ba);da=_(ca*_(n[d>>2]))}else{X=wl(0,0,W|0,((W|0)<0)<<31>>31|0)|0;ca=_(+(X>>>0)+4294967296.0*+(H|0));ba=_(_(n[r>>2])*ca);da=_(-_(ba*_(n[d>>2])))}ba=_(da+_(n[S+(V<<2)>>2]));n[aa+(V<<2)>>2]=ba;V=V+1|0;if((V|0)==(M|0))break;else T=T+1|0}Bf((f[f[N>>2]>>2]|0)+P|0,aa|0,L|0)|0;U=U+1|0;if(U>>>0>=(f[Q>>2]|0)>>>0)break;else{P=P+L|0;O=O+M|0}}}while(0);Io(aa);I=z;J=t;break}default:{I=s;J=t}}while(0);v=v+1|0;if((v|0)>=(Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0)){h=1;C=64;break}else{s=I;t=J}}if((C|0)==8)$n(d);else if((C|0)==12)$n(e);else if((C|0)==63){Io(aa);h=0;u=c;return h|0}else if((C|0)==64){u=c;return h|0}return 0}function Mb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=(o|0)==-1;if(p)q=-1;else q=f[(f[n>>2]|0)+(o<<2)>>2]|0;n=a+20|0;r=f[n>>2]|0;s=f[r>>2]|0;if((f[r+4>>2]|0)-s>>2>>>0<=q>>>0)$n(r);r=a+8|0;t=f[(f[r>>2]|0)+(f[s+(q<<2)>>2]<<2)>>2]|0;q=a+4|0;s=f[q>>2]|0;if(!(b[s+84>>0]|0))v=f[(f[s+68>>2]|0)+(t<<2)>>2]|0;else v=t;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=v;v=b[s+24>>0]|0;f[g>>2]=f[h>>2];wb(s,g,v,j)|0;v=a+28|0;a=(f[v>>2]|0)==0;do if(!p){s=o+1|0;t=((s>>>0)%3|0|0)==0?o+-2|0:s;s=k+8|0;w=j+8|0;x=k+16|0;y=j+16|0;z=l+8|0;A=l+16|0;B=o+(((o>>>0)%3|0|0)==0?2:-1)|0;C=0;D=0;E=0;F=0;G=0;I=0;J=a;K=o;while(1){do if(!J){L=K+1|0;M=((L>>>0)%3|0|0)==0?K+-2|0:L;if(!((K>>>0)%3|0)){N=K+2|0;O=M;break}else{N=K+-1|0;O=M;break}}else{N=B;O=t}while(0);if((O|0)==-1)P=-1;else P=f[(f[f[m>>2]>>2]|0)+(O<<2)>>2]|0;Q=f[n>>2]|0;M=f[Q>>2]|0;if((f[Q+4>>2]|0)-M>>2>>>0<=P>>>0){R=16;break}L=f[(f[r>>2]|0)+(f[M+(P<<2)>>2]<<2)>>2]|0;M=f[q>>2]|0;if(!(b[M+84>>0]|0))S=f[(f[M+68>>2]|0)+(L<<2)>>2]|0;else S=L;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=S;L=b[M+24>>0]|0;f[g>>2]=f[h>>2];wb(M,g,L,k)|0;if((N|0)==-1)T=-1;else T=f[(f[f[m>>2]>>2]|0)+(N<<2)>>2]|0;U=f[n>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=T>>>0){R=22;break}M=f[(f[r>>2]|0)+(f[L+(T<<2)>>2]<<2)>>2]|0;L=f[q>>2]|0;if(!(b[L+84>>0]|0))V=f[(f[L+68>>2]|0)+(M<<2)>>2]|0;else V=M;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=V;M=b[L+24>>0]|0;f[g>>2]=f[h>>2];wb(L,g,M,l)|0;M=k;L=j;W=f[L>>2]|0;X=f[L+4>>2]|0;L=wl(f[M>>2]|0,f[M+4>>2]|0,W|0,X|0)|0;M=H;Y=s;Z=w;_=f[Z>>2]|0;$=f[Z+4>>2]|0;Z=wl(f[Y>>2]|0,f[Y+4>>2]|0,_|0,$|0)|0;Y=H;aa=x;ba=y;ca=f[ba>>2]|0;da=f[ba+4>>2]|0;ba=wl(f[aa>>2]|0,f[aa+4>>2]|0,ca|0,da|0)|0;aa=H;ea=l;fa=wl(f[ea>>2]|0,f[ea+4>>2]|0,W|0,X|0)|0;X=H;W=z;ea=wl(f[W>>2]|0,f[W+4>>2]|0,_|0,$|0)|0;$=H;_=A;W=wl(f[_>>2]|0,f[_+4>>2]|0,ca|0,da|0)|0;da=H;ca=Bk(W|0,da|0,Z|0,Y|0)|0;_=H;ga=Bk(ea|0,$|0,ba|0,aa|0)|0;ha=H;ia=Bk(fa|0,X|0,ba|0,aa|0)|0;aa=H;ba=Bk(W|0,da|0,L|0,M|0)|0;da=H;W=Bk(ea|0,$|0,L|0,M|0)|0;M=H;L=Bk(fa|0,X|0,Z|0,Y|0)|0;Y=H;Z=wl(C|0,D|0,ga|0,ha|0)|0;C=vl(Z|0,H|0,ca|0,_|0)|0;D=H;_=vl(ia|0,aa|0,E|0,F|0)|0;E=wl(_|0,H|0,ba|0,da|0)|0;F=H;da=wl(G|0,I|0,L|0,Y|0)|0;G=vl(da|0,H|0,W|0,M|0)|0;I=H;Tf(i);K=f[c>>2]|0;J=(f[v>>2]|0)==0;if((K|0)==-1){R=26;break}}if((R|0)==16)$n(Q);else if((R|0)==22)$n(U);else if((R|0)==26){K=wl(0,0,C|0,D|0)|0;if((D|0)>-1|(D|0)==-1&C>>>0>4294967295){ja=J;ka=C;la=D;ma=E;na=F;oa=G;pa=I;R=27;break}else{qa=J;ra=F;sa=E;ta=I;ua=G;va=K;wa=H;xa=C;ya=D;break}}}else{ja=a;ka=0;la=0;ma=0;na=0;oa=0;pa=0;R=27}while(0);if((R|0)==27){qa=ja;ra=na;sa=ma;ta=pa;ua=oa;va=ka;wa=la;xa=ka;ya=la}la=(ra|0)>-1|(ra|0)==-1&sa>>>0>4294967295;ka=wl(0,0,sa|0,ra|0)|0;oa=la?ra:H;pa=(ta|0)>-1|(ta|0)==-1&ua>>>0>4294967295;ma=wl(0,0,ua|0,ta|0)|0;na=vl((la?sa:ka)|0,oa|0,(pa?ua:ma)|0,(pa?ta:H)|0)|0;pa=vl(na|0,H|0,va|0,wa|0)|0;wa=H;if(qa){if((pa|0)<=536870912){za=xa;Aa=sa;Ba=ua;f[d>>2]=za;Ca=d+4|0;f[Ca>>2]=Aa;Da=d+8|0;f[Da>>2]=Ba;u=e;return}qa=xl(pa|0,wa|0,29)|0;va=qa&7;qa=ni(xa|0,ya|0,va|0,0)|0;na=ni(sa|0,ra|0,va|0,0)|0;ma=ni(ua|0,ta|0,va|0,0)|0;za=qa;Aa=na;Ba=ma;f[d>>2]=za;Ca=d+4|0;f[Ca>>2]=Aa;Da=d+8|0;f[Da>>2]=Ba;u=e;return}else{if(!((wa|0)>0|(wa|0)==0&pa>>>0>536870912)){za=xa;Aa=sa;Ba=ua;f[d>>2]=za;Ca=d+4|0;f[Ca>>2]=Aa;Da=d+8|0;f[Da>>2]=Ba;u=e;return}ma=xl(pa|0,wa|0,29)|0;wa=H;pa=ni(xa|0,ya|0,ma|0,wa|0)|0;ya=ni(sa|0,ra|0,ma|0,wa|0)|0;ra=ni(ua|0,ta|0,ma|0,wa|0)|0;za=pa;Aa=ya;Ba=ra;f[d>>2]=za;Ca=d+4|0;f[Ca>>2]=Aa;Da=d+8|0;f[Da>>2]=Ba;u=e;return}}function Nb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;d=u;u=u+32|0;e=d+20|0;g=d+8|0;i=d+4|0;j=d;k=a+4|0;do if((h[(f[k>>2]|0)+36>>0]<<8&65535)<512){l=c+8|0;m=f[l>>2]|0;n=f[l+4>>2]|0;l=c+16|0;o=l;p=f[o>>2]|0;q=vl(p|0,f[o+4>>2]|0,4,0)|0;o=H;if((n|0)<(o|0)|(n|0)==(o|0)&m>>>0<q>>>0){r=-1;u=d;return r|0}else{m=(f[c>>2]|0)+p|0;p=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;f[e>>2]=p;m=l;f[m>>2]=q;f[m+4>>2]=o;s=p;break}}else if(zh(e,c)|0){s=f[e>>2]|0;break}else{r=-1;u=d;return r|0}while(0);a:do if(s|0){p=f[a+8>>2]|0;if(s>>>0>(((f[p+4>>2]|0)-(f[p>>2]|0)>>2>>>0)/3|0)>>>0){r=-1;u=d;return r|0}p=f[k>>2]|0;if(((h[p+36>>0]<<8|h[p+37>>0])&65535)<258){p=c+8|0;o=c+16|0;m=g+4|0;q=g+8|0;l=a+40|0;n=a+44|0;t=a+36|0;v=0;w=s;while(1){x=p;y=f[x>>2]|0;z=f[x+4>>2]|0;x=o;A=f[x>>2]|0;B=f[x+4>>2]|0;x=vl(A|0,B|0,4,0)|0;C=H;if((z|0)<(C|0)|(z|0)==(C|0)&y>>>0<x>>>0)break;D=f[c>>2]|0;E=D+A|0;f[g>>2]=h[E>>0]|h[E+1>>0]<<8|h[E+2>>0]<<16|h[E+3>>0]<<24;E=o;f[E>>2]=x;f[E+4>>2]=C;C=vl(A|0,B|0,8,0)|0;E=H;if((z|0)<(E|0)|(z|0)==(E|0)&y>>>0<C>>>0)break;F=D+x|0;f[m>>2]=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;F=o;f[F>>2]=C;f[F+4>>2]=E;if(!((z|0)>(E|0)|(z|0)==(E|0)&y>>>0>C>>>0))break;y=b[D+C>>0]|0;C=vl(A|0,B|0,9,0)|0;B=o;f[B>>2]=C;f[B+4>>2]=H;b[q>>0]=b[q>>0]&-2|y&1;y=f[l>>2]|0;if((y|0)==(f[n>>2]|0)){yg(t,g);G=f[e>>2]|0}else{f[y>>2]=f[g>>2];f[y+4>>2]=f[g+4>>2];f[y+8>>2]=f[g+8>>2];f[l>>2]=(f[l>>2]|0)+12;G=w}v=v+1|0;if(v>>>0>=G>>>0)break a;else w=G}r=-1;u=d;return r|0}w=g+4|0;v=a+40|0;l=a+44|0;t=a+36|0;n=0;q=0;do{zh(i,c)|0;f[w>>2]=(f[i>>2]|0)+q;zh(i,c)|0;o=f[i>>2]|0;q=f[w>>2]|0;if(q>>>0<o>>>0){I=36;break}f[g>>2]=q-o;o=f[v>>2]|0;if((o|0)==(f[l>>2]|0))yg(t,g);else{f[o>>2]=f[g>>2];f[o+4>>2]=f[g+4>>2];f[o+8>>2]=f[g+8>>2];f[v>>2]=(f[v>>2]|0)+12}n=n+1|0}while(n>>>0<(f[e>>2]|0)>>>0);if((I|0)==36){r=-1;u=d;return r|0}vf(c,0,0)|0;n=f[e>>2]|0;if(n|0){v=c+36|0;t=a+36|0;l=c+32|0;q=c+24|0;w=c+28|0;o=0;m=0;while(1){p=f[k>>2]|0;y=(b[v>>0]|0)==0;if(((h[p+36>>0]<<8|h[p+37>>0])&65535)<514)if(!y){p=f[l>>2]|0;B=f[q>>2]|0;C=f[w>>2]|0;A=B+(p>>>3)|0;if(A>>>0<C>>>0){D=(h[A>>0]|0)>>>(p&7)&1;E=p+1|0;f[l>>2]=E;J=D;K=B+(E>>>3)|0;L=E}else{J=0;K=A;L=p}if(K>>>0<C>>>0){f[l>>2]=L+1;M=J}else M=J}else M=m;else if(!y){y=f[l>>2]|0;C=(f[q>>2]|0)+(y>>>3)|0;if(C>>>0<(f[w>>2]|0)>>>0){p=(h[C>>0]|0)>>>(y&7)&1;f[l>>2]=y+1;M=p}else M=0}else M=m;p=(f[t>>2]|0)+(o*12|0)+8|0;b[p>>0]=b[p>>0]&-2|M&1;o=o+1|0;if(o>>>0>=n>>>0)break;else m=M}}Cj(c)}while(0);f[g>>2]=0;M=f[k>>2]|0;J=(h[M+36>>0]<<8|h[M+37>>0])&65535;if((J&65535)<512){M=c+8|0;L=f[M>>2]|0;K=f[M+4>>2]|0;M=c+16|0;e=M;G=f[e>>2]|0;s=vl(G|0,f[e+4>>2]|0,4,0)|0;e=H;if((K|0)<(e|0)|(K|0)==(e|0)&L>>>0<s>>>0)N=-1;else{L=(f[c>>2]|0)+G|0;G=h[L>>0]|h[L+1>>0]<<8|h[L+2>>0]<<16|h[L+3>>0]<<24;f[g>>2]=G;L=M;f[L>>2]=s;f[L+4>>2]=e;O=G;I=43}}else if(J<<16>>16==512)if(zh(g,c)|0){O=f[g>>2]|0;I=43}else N=-1;else I=57;b:do if((I|0)==43)if(!O)I=57;else{J=f[k>>2]|0;if(((h[J+36>>0]<<8|h[J+37>>0])&65535)>=258){J=a+52|0;G=a+56|0;e=a+48|0;L=0;s=0;while(1){f[i>>2]=0;zh(j,c)|0;s=(f[j>>2]|0)+s|0;f[i>>2]=s;M=f[J>>2]|0;if((M|0)==(f[G>>2]|0))Ng(e,i);else{f[M>>2]=s;f[J>>2]=M+4}L=L+1|0;if(L>>>0>=(f[g>>2]|0)>>>0){I=57;break b}}}L=c+8|0;J=c+16|0;s=a+52|0;e=a+56|0;G=a+48|0;M=0;while(1){f[i>>2]=0;K=L;m=f[K>>2]|0;n=f[K+4>>2]|0;K=J;o=f[K>>2]|0;t=vl(o|0,f[K+4>>2]|0,4,0)|0;K=H;if((n|0)<(K|0)|(n|0)==(K|0)&m>>>0<t>>>0)break;m=(f[c>>2]|0)+o|0;o=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;f[i>>2]=o;m=J;f[m>>2]=t;f[m+4>>2]=K;K=f[s>>2]|0;if((K|0)==(f[e>>2]|0))Ng(G,i);else{f[K>>2]=o;f[s>>2]=K+4}M=M+1|0;if(M>>>0>=(f[g>>2]|0)>>>0){I=57;break b}}N=-1}while(0);if((I|0)==57)N=f[c+16>>2]|0;r=N;u=d;return r|0}function Ob(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=f[(f[n+28>>2]|0)+(o<<2)>>2]|0;n=a+20|0;q=f[n>>2]|0;r=f[q>>2]|0;if((f[q+4>>2]|0)-r>>2>>>0<=p>>>0)$n(q);q=a+8|0;s=f[(f[q>>2]|0)+(f[r+(p<<2)>>2]<<2)>>2]|0;p=a+4|0;r=f[p>>2]|0;if(!(b[r+84>>0]|0))t=f[(f[r+68>>2]|0)+(s<<2)>>2]|0;else t=s;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=t;t=b[r+24>>0]|0;f[g>>2]=f[h>>2];wb(r,g,t,j)|0;t=a+28|0;a=(f[t>>2]|0)==0;do if((o|0)!=-1){r=o+1|0;s=((r>>>0)%3|0|0)==0?o+-2|0:r;r=k+8|0;v=j+8|0;w=k+16|0;x=j+16|0;y=l+8|0;z=l+16|0;A=o+(((o>>>0)%3|0|0)==0?2:-1)|0;B=0;C=0;D=0;E=0;F=0;G=0;I=a;J=o;while(1){do if(!I){K=J+1|0;L=((K>>>0)%3|0|0)==0?J+-2|0:K;if(!((J>>>0)%3|0)){M=J+2|0;N=L;break}else{M=J+-1|0;N=L;break}}else{M=A;N=s}while(0);L=f[(f[(f[m>>2]|0)+28>>2]|0)+(N<<2)>>2]|0;O=f[n>>2]|0;K=f[O>>2]|0;if((f[O+4>>2]|0)-K>>2>>>0<=L>>>0){P=12;break}Q=f[(f[q>>2]|0)+(f[K+(L<<2)>>2]<<2)>>2]|0;L=f[p>>2]|0;if(!(b[L+84>>0]|0))R=f[(f[L+68>>2]|0)+(Q<<2)>>2]|0;else R=Q;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=R;Q=b[L+24>>0]|0;f[g>>2]=f[h>>2];wb(L,g,Q,k)|0;Q=f[(f[(f[m>>2]|0)+28>>2]|0)+(M<<2)>>2]|0;S=f[n>>2]|0;L=f[S>>2]|0;if((f[S+4>>2]|0)-L>>2>>>0<=Q>>>0){P=16;break}K=f[(f[q>>2]|0)+(f[L+(Q<<2)>>2]<<2)>>2]|0;Q=f[p>>2]|0;if(!(b[Q+84>>0]|0))T=f[(f[Q+68>>2]|0)+(K<<2)>>2]|0;else T=K;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=T;K=b[Q+24>>0]|0;f[g>>2]=f[h>>2];wb(Q,g,K,l)|0;K=k;Q=j;L=f[Q>>2]|0;U=f[Q+4>>2]|0;Q=wl(f[K>>2]|0,f[K+4>>2]|0,L|0,U|0)|0;K=H;V=r;W=v;X=f[W>>2]|0;Y=f[W+4>>2]|0;W=wl(f[V>>2]|0,f[V+4>>2]|0,X|0,Y|0)|0;V=H;Z=w;_=x;$=f[_>>2]|0;aa=f[_+4>>2]|0;_=wl(f[Z>>2]|0,f[Z+4>>2]|0,$|0,aa|0)|0;Z=H;ba=l;ca=wl(f[ba>>2]|0,f[ba+4>>2]|0,L|0,U|0)|0;U=H;L=y;ba=wl(f[L>>2]|0,f[L+4>>2]|0,X|0,Y|0)|0;Y=H;X=z;L=wl(f[X>>2]|0,f[X+4>>2]|0,$|0,aa|0)|0;aa=H;$=Bk(L|0,aa|0,W|0,V|0)|0;X=H;da=Bk(ba|0,Y|0,_|0,Z|0)|0;ea=H;fa=Bk(ca|0,U|0,_|0,Z|0)|0;Z=H;_=Bk(L|0,aa|0,Q|0,K|0)|0;aa=H;L=Bk(ba|0,Y|0,Q|0,K|0)|0;K=H;Q=Bk(ca|0,U|0,W|0,V|0)|0;V=H;W=wl(B|0,C|0,da|0,ea|0)|0;B=vl(W|0,H|0,$|0,X|0)|0;C=H;X=vl(fa|0,Z|0,D|0,E|0)|0;D=wl(X|0,H|0,_|0,aa|0)|0;E=H;aa=wl(F|0,G|0,Q|0,V|0)|0;F=vl(aa|0,H|0,L|0,K|0)|0;G=H;kf(i);J=f[c>>2]|0;I=(f[t>>2]|0)==0;if((J|0)==-1){P=20;break}}if((P|0)==12)$n(O);else if((P|0)==16)$n(S);else if((P|0)==20){J=wl(0,0,B|0,C|0)|0;if((C|0)>-1|(C|0)==-1&B>>>0>4294967295){ga=I;ha=B;ia=C;ja=D;ka=E;la=F;ma=G;P=21;break}else{na=I;oa=E;pa=D;qa=G;ra=F;sa=J;ta=H;ua=B;va=C;break}}}else{ga=a;ha=0;ia=0;ja=0;ka=0;la=0;ma=0;P=21}while(0);if((P|0)==21){na=ga;oa=ka;pa=ja;qa=ma;ra=la;sa=ha;ta=ia;ua=ha;va=ia}ia=(oa|0)>-1|(oa|0)==-1&pa>>>0>4294967295;ha=wl(0,0,pa|0,oa|0)|0;la=ia?oa:H;ma=(qa|0)>-1|(qa|0)==-1&ra>>>0>4294967295;ja=wl(0,0,ra|0,qa|0)|0;ka=vl((ia?pa:ha)|0,la|0,(ma?ra:ja)|0,(ma?qa:H)|0)|0;ma=vl(ka|0,H|0,sa|0,ta|0)|0;ta=H;if(na){if((ma|0)<=536870912){wa=ua;xa=pa;ya=ra;f[d>>2]=wa;za=d+4|0;f[za>>2]=xa;Aa=d+8|0;f[Aa>>2]=ya;u=e;return}na=xl(ma|0,ta|0,29)|0;sa=na&7;na=ni(ua|0,va|0,sa|0,0)|0;ka=ni(pa|0,oa|0,sa|0,0)|0;ja=ni(ra|0,qa|0,sa|0,0)|0;wa=na;xa=ka;ya=ja;f[d>>2]=wa;za=d+4|0;f[za>>2]=xa;Aa=d+8|0;f[Aa>>2]=ya;u=e;return}else{if(!((ta|0)>0|(ta|0)==0&ma>>>0>536870912)){wa=ua;xa=pa;ya=ra;f[d>>2]=wa;za=d+4|0;f[za>>2]=xa;Aa=d+8|0;f[Aa>>2]=ya;u=e;return}ja=xl(ma|0,ta|0,29)|0;ta=H;ma=ni(ua|0,va|0,ja|0,ta|0)|0;va=ni(pa|0,oa|0,ja|0,ta|0)|0;oa=ni(ra|0,qa|0,ja|0,ta|0)|0;wa=ma;xa=va;ya=oa;f[d>>2]=wa;za=d+4|0;f[za>>2]=xa;Aa=d+8|0;f[Aa>>2]=ya;u=e;return}}function Pb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;g=a+8|0;f[g>>2]=e;d=a+32|0;h=a+36|0;i=f[d>>2]|0;j=(f[h>>2]|0)-i>>2;if(j>>>0>=e>>>0){if(j>>>0>e>>>0)f[h>>2]=i+(e<<2)}else Eg(d,e-j|0);j=e>>>0>1073741823?-1:e<<2;d=Ho(j)|0;oh(d|0,0,j|0)|0;i=Ho(j)|0;oh(i|0,0,j|0)|0;j=f[g>>2]|0;if((j|0)>0){h=a+16|0;k=a+32|0;l=a+12|0;m=0;do{n=f[d+(m<<2)>>2]|0;o=f[h>>2]|0;do if((n|0)<=(o|0)){p=f[l>>2]|0;q=f[k>>2]|0;r=q+(m<<2)|0;if((n|0)<(p|0)){f[r>>2]=p;s=q;break}else{f[r>>2]=n;s=q;break}}else{q=f[k>>2]|0;f[q+(m<<2)>>2]=o;s=q}while(0);m=m+1|0;t=f[g>>2]|0}while((m|0)<(t|0));if((t|0)>0){m=a+20|0;k=0;do{o=(f[b+(k<<2)>>2]|0)+(f[s+(k<<2)>>2]|0)|0;n=c+(k<<2)|0;f[n>>2]=o;if((o|0)<=(f[h>>2]|0)){if((o|0)<(f[l>>2]|0)){u=(f[m>>2]|0)+o|0;v=19}}else{u=o-(f[m>>2]|0)|0;v=19}if((v|0)==19){v=0;f[n>>2]=u}k=k+1|0;n=f[g>>2]|0}while((k|0)<(n|0));w=n}else w=t}else w=j;j=f[a+48>>2]|0;t=f[a+56>>2]|0;k=f[t>>2]|0;u=(f[t+4>>2]|0)-k|0;m=u>>2;if((u|0)<=4){Io(i);Io(d);return 1}u=f[a+52>>2]|0;l=k;k=(e|0)>0;h=j+12|0;s=a+16|0;n=a+32|0;o=a+12|0;q=a+20|0;a=e<<2;r=1;p=w;while(1){if(m>>>0<=r>>>0){v=25;break}w=f[l+(r<<2)>>2]|0;if(k)oh(d|0,0,a|0)|0;if((w|0)!=-1){x=f[h>>2]|0;y=0;z=w;while(1){A=f[x+(z<<2)>>2]|0;if((A|0)!=-1){B=f[j>>2]|0;C=f[u>>2]|0;D=f[C+(f[B+(A<<2)>>2]<<2)>>2]|0;E=A+1|0;F=((E>>>0)%3|0|0)==0?A+-2|0:E;if((F|0)==-1)G=-1;else G=f[B+(F<<2)>>2]|0;F=f[C+(G<<2)>>2]|0;E=(((A>>>0)%3|0|0)==0?2:-1)+A|0;if((E|0)==-1)H=-1;else H=f[B+(E<<2)>>2]|0;E=f[C+(H<<2)>>2]|0;if((D|0)<(r|0)&(F|0)<(r|0)&(E|0)<(r|0)){C=W(D,e)|0;D=W(F,e)|0;F=W(E,e)|0;if(k){E=0;do{f[i+(E<<2)>>2]=(f[c+(E+F<<2)>>2]|0)+(f[c+(E+D<<2)>>2]|0)-(f[c+(E+C<<2)>>2]|0);E=E+1|0}while((E|0)!=(e|0));if(k){E=0;do{C=d+(E<<2)|0;f[C>>2]=(f[C>>2]|0)+(f[i+(E<<2)>>2]|0);E=E+1|0}while((E|0)!=(e|0))}}I=y+1|0}else I=y}else I=y;E=(((z>>>0)%3|0|0)==0?2:-1)+z|0;do if((E|0)!=-1?(C=f[x+(E<<2)>>2]|0,(C|0)!=-1):0)if(!((C>>>0)%3|0)){J=C+2|0;break}else{J=C+-1|0;break}else J=-1;while(0);z=(J|0)==(w|0)?-1:J;if((z|0)==-1)break;else y=I}y=W(r,e)|0;if(I){if(k){z=0;do{w=d+(z<<2)|0;f[w>>2]=(f[w>>2]|0)/(I|0)|0;z=z+1|0}while((z|0)!=(e|0))}z=b+(y<<2)|0;w=c+(y<<2)|0;if((p|0)>0){x=0;do{E=f[d+(x<<2)>>2]|0;C=f[s>>2]|0;do if((E|0)<=(C|0)){D=f[o>>2]|0;F=f[n>>2]|0;B=F+(x<<2)|0;if((E|0)<(D|0)){f[B>>2]=D;K=F;break}else{f[B>>2]=E;K=F;break}}else{F=f[n>>2]|0;f[F+(x<<2)>>2]=C;K=F}while(0);x=x+1|0;L=f[g>>2]|0}while((x|0)<(L|0));if((L|0)>0){x=0;do{C=(f[z+(x<<2)>>2]|0)+(f[K+(x<<2)>>2]|0)|0;E=w+(x<<2)|0;f[E>>2]=C;if((C|0)<=(f[s>>2]|0)){if((C|0)<(f[o>>2]|0)){M=(f[q>>2]|0)+C|0;v=83}}else{M=C-(f[q>>2]|0)|0;v=83}if((v|0)==83){v=0;f[E>>2]=M}x=x+1|0;E=f[g>>2]|0}while((x|0)<(E|0));N=E}else N=L}else N=p}else{O=y;v=51}}else{O=W(r,e)|0;v=51}if((v|0)==51){v=0;x=c+((W(r+-1|0,e)|0)<<2)|0;w=b+(O<<2)|0;z=c+(O<<2)|0;if((p|0)>0){E=0;do{C=f[x+(E<<2)>>2]|0;F=f[s>>2]|0;do if((C|0)<=(F|0)){B=f[o>>2]|0;D=f[n>>2]|0;A=D+(E<<2)|0;if((C|0)<(B|0)){f[A>>2]=B;P=D;break}else{f[A>>2]=C;P=D;break}}else{D=f[n>>2]|0;f[D+(E<<2)>>2]=F;P=D}while(0);E=E+1|0;Q=f[g>>2]|0}while((E|0)<(Q|0));if((Q|0)>0){E=0;do{x=(f[w+(E<<2)>>2]|0)+(f[P+(E<<2)>>2]|0)|0;y=z+(E<<2)|0;f[y>>2]=x;if((x|0)<=(f[s>>2]|0)){if((x|0)<(f[o>>2]|0)){R=(f[q>>2]|0)+x|0;v=65}}else{R=x-(f[q>>2]|0)|0;v=65}if((v|0)==65){v=0;f[y>>2]=R}E=E+1|0;y=f[g>>2]|0}while((E|0)<(y|0));N=y}else N=Q}else N=p}r=r+1|0;if((r|0)>=(m|0)){v=23;break}else p=N}if((v|0)==23){Io(i);Io(d);return 1}else if((v|0)==25)$n(t);return 0}function Qb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;g=a+8|0;f[g>>2]=e;d=a+32|0;h=a+36|0;i=f[d>>2]|0;j=(f[h>>2]|0)-i>>2;if(j>>>0>=e>>>0){if(j>>>0>e>>>0)f[h>>2]=i+(e<<2)}else Eg(d,e-j|0);j=e>>>0>1073741823?-1:e<<2;d=Ho(j)|0;oh(d|0,0,j|0)|0;i=Ho(j)|0;oh(i|0,0,j|0)|0;j=f[g>>2]|0;if((j|0)>0){h=a+16|0;k=a+32|0;l=a+12|0;m=0;do{n=f[d+(m<<2)>>2]|0;o=f[h>>2]|0;do if((n|0)<=(o|0)){p=f[l>>2]|0;q=f[k>>2]|0;r=q+(m<<2)|0;if((n|0)<(p|0)){f[r>>2]=p;s=q;break}else{f[r>>2]=n;s=q;break}}else{q=f[k>>2]|0;f[q+(m<<2)>>2]=o;s=q}while(0);m=m+1|0;t=f[g>>2]|0}while((m|0)<(t|0));if((t|0)>0){m=a+20|0;k=0;do{o=(f[b+(k<<2)>>2]|0)+(f[s+(k<<2)>>2]|0)|0;n=c+(k<<2)|0;f[n>>2]=o;if((o|0)<=(f[h>>2]|0)){if((o|0)<(f[l>>2]|0)){u=(f[m>>2]|0)+o|0;v=19}}else{u=o-(f[m>>2]|0)|0;v=19}if((v|0)==19){v=0;f[n>>2]=u}k=k+1|0;n=f[g>>2]|0}while((k|0)<(n|0));w=n}else w=t}else w=j;j=f[a+48>>2]|0;t=f[a+56>>2]|0;k=f[t>>2]|0;u=(f[t+4>>2]|0)-k|0;m=u>>2;if((u|0)<=4){Io(i);Io(d);return 1}u=f[a+52>>2]|0;l=k;k=(e|0)>0;h=j+64|0;s=j+28|0;n=a+16|0;o=a+32|0;q=a+12|0;r=a+20|0;a=e<<2;p=1;x=w;while(1){if(m>>>0<=p>>>0){v=25;break}w=f[l+(p<<2)>>2]|0;if(k)oh(d|0,0,a|0)|0;if((w|0)!=-1){y=f[j>>2]|0;z=0;A=w;while(1){if(((f[y+(A>>>5<<2)>>2]&1<<(A&31)|0)==0?(B=f[(f[(f[h>>2]|0)+12>>2]|0)+(A<<2)>>2]|0,(B|0)!=-1):0)?(C=f[s>>2]|0,D=f[u>>2]|0,E=f[D+(f[C+(B<<2)>>2]<<2)>>2]|0,F=B+1|0,G=f[D+(f[C+((((F>>>0)%3|0|0)==0?B+-2|0:F)<<2)>>2]<<2)>>2]|0,F=f[D+(f[C+((((B>>>0)%3|0|0)==0?2:-1)+B<<2)>>2]<<2)>>2]|0,(E|0)<(p|0)&(G|0)<(p|0)&(F|0)<(p|0)):0){B=W(E,e)|0;E=W(G,e)|0;G=W(F,e)|0;if(k){F=0;do{f[i+(F<<2)>>2]=(f[c+(F+G<<2)>>2]|0)+(f[c+(F+E<<2)>>2]|0)-(f[c+(F+B<<2)>>2]|0);F=F+1|0}while((F|0)!=(e|0));if(k){F=0;do{B=d+(F<<2)|0;f[B>>2]=(f[B>>2]|0)+(f[i+(F<<2)>>2]|0);F=F+1|0}while((F|0)!=(e|0))}}H=z+1|0}else H=z;F=(((A>>>0)%3|0|0)==0?2:-1)+A|0;do if(((F|0)!=-1?(f[y+(F>>>5<<2)>>2]&1<<(F&31)|0)==0:0)?(B=f[(f[(f[h>>2]|0)+12>>2]|0)+(F<<2)>>2]|0,(B|0)!=-1):0)if(!((B>>>0)%3|0)){I=B+2|0;break}else{I=B+-1|0;break}else I=-1;while(0);A=(I|0)==(w|0)?-1:I;if((A|0)==-1)break;else z=H}z=W(p,e)|0;if(H){if(k){A=0;do{w=d+(A<<2)|0;f[w>>2]=(f[w>>2]|0)/(H|0)|0;A=A+1|0}while((A|0)!=(e|0))}A=b+(z<<2)|0;w=c+(z<<2)|0;if((x|0)>0){y=0;do{F=f[d+(y<<2)>>2]|0;B=f[n>>2]|0;do if((F|0)<=(B|0)){E=f[q>>2]|0;G=f[o>>2]|0;C=G+(y<<2)|0;if((F|0)<(E|0)){f[C>>2]=E;J=G;break}else{f[C>>2]=F;J=G;break}}else{G=f[o>>2]|0;f[G+(y<<2)>>2]=B;J=G}while(0);y=y+1|0;K=f[g>>2]|0}while((y|0)<(K|0));if((K|0)>0){y=0;do{B=(f[A+(y<<2)>>2]|0)+(f[J+(y<<2)>>2]|0)|0;F=w+(y<<2)|0;f[F>>2]=B;if((B|0)<=(f[n>>2]|0)){if((B|0)<(f[q>>2]|0)){L=(f[r>>2]|0)+B|0;v=81}}else{L=B-(f[r>>2]|0)|0;v=81}if((v|0)==81){v=0;f[F>>2]=L}y=y+1|0;F=f[g>>2]|0}while((y|0)<(F|0));M=F}else M=K}else M=x}else{N=z;v=49}}else{N=W(p,e)|0;v=49}if((v|0)==49){v=0;y=c+((W(p+-1|0,e)|0)<<2)|0;w=b+(N<<2)|0;A=c+(N<<2)|0;if((x|0)>0){F=0;do{B=f[y+(F<<2)>>2]|0;G=f[n>>2]|0;do if((B|0)<=(G|0)){C=f[q>>2]|0;E=f[o>>2]|0;D=E+(F<<2)|0;if((B|0)<(C|0)){f[D>>2]=C;O=E;break}else{f[D>>2]=B;O=E;break}}else{E=f[o>>2]|0;f[E+(F<<2)>>2]=G;O=E}while(0);F=F+1|0;P=f[g>>2]|0}while((F|0)<(P|0));if((P|0)>0){F=0;do{y=(f[w+(F<<2)>>2]|0)+(f[O+(F<<2)>>2]|0)|0;z=A+(F<<2)|0;f[z>>2]=y;if((y|0)<=(f[n>>2]|0)){if((y|0)<(f[q>>2]|0)){Q=(f[r>>2]|0)+y|0;v=63}}else{Q=y-(f[r>>2]|0)|0;v=63}if((v|0)==63){v=0;f[z>>2]=Q}F=F+1|0;z=f[g>>2]|0}while((F|0)<(z|0));M=z}else M=P}else M=x}p=p+1|0;if((p|0)>=(m|0)){v=23;break}else x=M}if((v|0)==23){Io(i);Io(d);return 1}else if((v|0)==25)$n(t);return 0}function Rb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;if(!a)return;b=a+-8|0;c=f[4076]|0;d=f[a+-4>>2]|0;a=d&-8;e=b+a|0;do if(!(d&1)){g=f[b>>2]|0;if(!(d&3))return;h=b+(0-g)|0;i=g+a|0;if(h>>>0<c>>>0)return;if((f[4077]|0)==(h|0)){j=e+4|0;k=f[j>>2]|0;if((k&3|0)!=3){l=h;m=i;n=h;break}f[4074]=i;f[j>>2]=k&-2;f[h+4>>2]=i|1;f[h+i>>2]=i;return}k=g>>>3;if(g>>>0<256){g=f[h+8>>2]|0;j=f[h+12>>2]|0;if((j|0)==(g|0)){f[4072]=f[4072]&~(1<<k);l=h;m=i;n=h;break}else{f[g+12>>2]=j;f[j+8>>2]=g;l=h;m=i;n=h;break}}g=f[h+24>>2]|0;j=f[h+12>>2]|0;do if((j|0)==(h|0)){k=h+16|0;o=k+4|0;p=f[o>>2]|0;if(!p){q=f[k>>2]|0;if(!q){r=0;break}else{s=q;t=k}}else{s=p;t=o}o=s;p=t;while(1){k=o+20|0;q=f[k>>2]|0;if(!q){u=o+16|0;v=f[u>>2]|0;if(!v)break;else{w=v;x=u}}else{w=q;x=k}o=w;p=x}f[p>>2]=0;r=o}else{k=f[h+8>>2]|0;f[k+12>>2]=j;f[j+8>>2]=k;r=j}while(0);if(g){j=f[h+28>>2]|0;k=16592+(j<<2)|0;if((f[k>>2]|0)==(h|0)){f[k>>2]=r;if(!r){f[4073]=f[4073]&~(1<<j);l=h;m=i;n=h;break}}else{j=g+16|0;f[((f[j>>2]|0)==(h|0)?j:g+20|0)>>2]=r;if(!r){l=h;m=i;n=h;break}}f[r+24>>2]=g;j=h+16|0;k=f[j>>2]|0;if(k|0){f[r+16>>2]=k;f[k+24>>2]=r}k=f[j+4>>2]|0;if(k){f[r+20>>2]=k;f[k+24>>2]=r;l=h;m=i;n=h}else{l=h;m=i;n=h}}else{l=h;m=i;n=h}}else{l=b;m=a;n=b}while(0);if(n>>>0>=e>>>0)return;b=e+4|0;a=f[b>>2]|0;if(!(a&1))return;if(!(a&2)){if((f[4078]|0)==(e|0)){r=(f[4075]|0)+m|0;f[4075]=r;f[4078]=l;f[l+4>>2]=r|1;if((l|0)!=(f[4077]|0))return;f[4077]=0;f[4074]=0;return}if((f[4077]|0)==(e|0)){r=(f[4074]|0)+m|0;f[4074]=r;f[4077]=n;f[l+4>>2]=r|1;f[n+r>>2]=r;return}r=(a&-8)+m|0;x=a>>>3;do if(a>>>0<256){w=f[e+8>>2]|0;t=f[e+12>>2]|0;if((t|0)==(w|0)){f[4072]=f[4072]&~(1<<x);break}else{f[w+12>>2]=t;f[t+8>>2]=w;break}}else{w=f[e+24>>2]|0;t=f[e+12>>2]|0;do if((t|0)==(e|0)){s=e+16|0;c=s+4|0;d=f[c>>2]|0;if(!d){k=f[s>>2]|0;if(!k){y=0;break}else{z=k;A=s}}else{z=d;A=c}c=z;d=A;while(1){s=c+20|0;k=f[s>>2]|0;if(!k){j=c+16|0;q=f[j>>2]|0;if(!q)break;else{B=q;C=j}}else{B=k;C=s}c=B;d=C}f[d>>2]=0;y=c}else{o=f[e+8>>2]|0;f[o+12>>2]=t;f[t+8>>2]=o;y=t}while(0);if(w|0){t=f[e+28>>2]|0;h=16592+(t<<2)|0;if((f[h>>2]|0)==(e|0)){f[h>>2]=y;if(!y){f[4073]=f[4073]&~(1<<t);break}}else{t=w+16|0;f[((f[t>>2]|0)==(e|0)?t:w+20|0)>>2]=y;if(!y)break}f[y+24>>2]=w;t=e+16|0;h=f[t>>2]|0;if(h|0){f[y+16>>2]=h;f[h+24>>2]=y}h=f[t+4>>2]|0;if(h|0){f[y+20>>2]=h;f[h+24>>2]=y}}}while(0);f[l+4>>2]=r|1;f[n+r>>2]=r;if((l|0)==(f[4077]|0)){f[4074]=r;return}else D=r}else{f[b>>2]=a&-2;f[l+4>>2]=m|1;f[n+m>>2]=m;D=m}m=D>>>3;if(D>>>0<256){n=16328+(m<<1<<2)|0;a=f[4072]|0;b=1<<m;if(!(a&b)){f[4072]=a|b;E=n;F=n+8|0}else{b=n+8|0;E=f[b>>2]|0;F=b}f[F>>2]=l;f[E+12>>2]=l;f[l+8>>2]=E;f[l+12>>2]=n;return}n=D>>>8;if(n)if(D>>>0>16777215)G=31;else{E=(n+1048320|0)>>>16&8;F=n<<E;n=(F+520192|0)>>>16&4;b=F<<n;F=(b+245760|0)>>>16&2;a=14-(n|E|F)+(b<<F>>>15)|0;G=D>>>(a+7|0)&1|a<<1}else G=0;a=16592+(G<<2)|0;f[l+28>>2]=G;f[l+20>>2]=0;f[l+16>>2]=0;F=f[4073]|0;b=1<<G;a:do if(!(F&b)){f[4073]=F|b;f[a>>2]=l;f[l+24>>2]=a;f[l+12>>2]=l;f[l+8>>2]=l}else{E=f[a>>2]|0;b:do if((f[E+4>>2]&-8|0)==(D|0))H=E;else{n=D<<((G|0)==31?0:25-(G>>>1)|0);m=E;while(1){I=m+16+(n>>>31<<2)|0;r=f[I>>2]|0;if(!r)break;if((f[r+4>>2]&-8|0)==(D|0)){H=r;break b}else{n=n<<1;m=r}}f[I>>2]=l;f[l+24>>2]=m;f[l+12>>2]=l;f[l+8>>2]=l;break a}while(0);E=H+8|0;w=f[E>>2]|0;f[w+12>>2]=l;f[E>>2]=l;f[l+8>>2]=w;f[l+12>>2]=H;f[l+24>>2]=0}while(0);l=(f[4080]|0)+-1|0;f[4080]=l;if(l|0)return;l=16744;while(1){H=f[l>>2]|0;if(!H)break;else l=H+8|0}f[4080]=-1;return}function Sb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=u;u=u+176|0;e=d+136|0;g=d+32|0;i=d;j=d+104|0;k=d+100|0;l=a+4|0;m=f[l>>2]|0;n=f[m+32>>2]|0;o=n+8|0;p=f[o>>2]|0;q=f[o+4>>2]|0;o=n+16|0;r=o;s=f[r>>2]|0;t=f[r+4>>2]|0;if(!((q|0)>(t|0)|(q|0)==(t|0)&p>>>0>s>>>0)){v=0;u=d;return v|0}r=f[n>>2]|0;n=b[r+s>>0]|0;w=vl(s|0,t|0,1,0)|0;x=H;y=o;f[y>>2]=w;f[y+4>>2]=x;if(!((q|0)>(x|0)|(q|0)==(x|0)&p>>>0>w>>>0)){v=0;u=d;return v|0}x=b[r+w>>0]|0;w=vl(s|0,t|0,2,0)|0;y=H;z=o;f[z>>2]=w;f[z+4>>2]=y;if(n<<24>>24>-1){z=n<<24>>24;A=f[a+216>>2]|0;if((((f[a+220>>2]|0)-A|0)/144|0)>>>0<=z>>>0){v=0;u=d;return v|0}B=A+(z*144|0)|0;if((f[B>>2]|0)>-1){v=0;u=d;return v|0}else C=B}else{B=a+212|0;if((f[B>>2]|0)>-1){v=0;u=d;return v|0}else C=B}f[C>>2]=c;do if((((h[m+36>>0]|0)<<8|(h[m+37>>0]|0))&65535)>257)if((q|0)>(y|0)|(q|0)==(y|0)&p>>>0>w>>>0){C=b[r+w>>0]|0;B=vl(s|0,t|0,3,0)|0;z=o;f[z>>2]=B;f[z+4>>2]=H;D=C&255;break}else{v=0;u=d;return v|0}else D=0;while(0);o=f[m+44>>2]|0;if(!(x<<24>>24)){if(n<<24>>24<0)E=a+184|0;else{x=n<<24>>24;m=f[a+216>>2]|0;b[m+(x*144|0)+100>>0]=0;E=m+(x*144|0)+104|0}switch((D&255)<<24>>24){case 0:{Qc(e,a,E);F=f[e>>2]|0;break}case 1:{xd(e,a,E);F=f[e>>2]|0;break}default:{v=0;u=d;return v|0}}if(!F){v=0;u=d;return v|0}else G=F}else{if(n<<24>>24<0|(D|0)!=0){v=0;u=d;return v|0}D=wk(88)|0;F=n<<24>>24;n=f[a+216>>2]|0;a=n+(F*144|0)+104|0;f[D+4>>2]=0;f[D>>2]=3292;E=D+12|0;f[E>>2]=3316;x=D+64|0;f[x>>2]=0;f[D+68>>2]=0;f[D+72>>2]=0;m=D+16|0;t=m+44|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(t|0));f[D+76>>2]=o;f[D+80>>2]=a;f[D+84>>2]=0;s=g+4|0;f[s>>2]=3316;w=g+56|0;f[w>>2]=0;r=g+60|0;f[r>>2]=0;f[g+64>>2]=0;m=g+8|0;t=m+44|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(t|0));m=n+(F*144|0)+4|0;f[i>>2]=3316;t=i+4|0;p=t+4|0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[t>>2]=m;t=f[n+(F*144|0)+68>>2]|0;F=((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;Gf(i+8|0,F,e);Pa[f[(f[i>>2]|0)+8>>2]&127](i);je(j,i);je(e,j);f[g>>2]=f[e+4>>2];F=g+4|0;He(F,e)|0;f[e>>2]=3316;t=f[e+20>>2]|0;if(t|0)Ko(t);t=f[e+8>>2]|0;if(t|0)Ko(t);f[g+36>>2]=m;f[g+40>>2]=a;f[g+44>>2]=o;f[g+48>>2]=D;f[j>>2]=3316;o=f[j+20>>2]|0;if(o|0)Ko(o);o=f[j+8>>2]|0;if(o|0)Ko(o);f[D+8>>2]=f[g>>2];He(E,F)|0;F=D+44|0;E=g+36|0;f[F>>2]=f[E>>2];f[F+4>>2]=f[E+4>>2];f[F+8>>2]=f[E+8>>2];f[F+12>>2]=f[E+12>>2];b[F+16>>0]=b[E+16>>0]|0;df(x,f[w>>2]|0,f[r>>2]|0);f[i>>2]=3316;x=f[i+20>>2]|0;if(x|0)Ko(x);x=f[i+8>>2]|0;if(x|0)Ko(x);x=f[w>>2]|0;if(x|0){f[r>>2]=x;Ko(x)}f[s>>2]=3316;s=f[g+24>>2]|0;if(s|0)Ko(s);s=f[g+12>>2]|0;if(s|0)Ko(s);G=D}D=wk(64)|0;f[k>>2]=G;Zi(D,k);G=D;s=f[k>>2]|0;f[k>>2]=0;if(s|0)Pa[f[(f[s>>2]|0)+4>>2]&127](s);s=f[l>>2]|0;if((c|0)<0){Pa[f[(f[D>>2]|0)+4>>2]&127](D);v=0;u=d;return v|0}D=s+8|0;l=s+12|0;s=f[l>>2]|0;k=f[D>>2]|0;g=s-k>>2;do if((g|0)<=(c|0)){x=c+1|0;r=s;if(x>>>0>g>>>0){Se(D,x-g|0);break}if(x>>>0<g>>>0){w=k+(x<<2)|0;if((w|0)!=(r|0)){x=r;do{x=x+-4|0;r=f[x>>2]|0;f[x>>2]=0;if(r|0)Pa[f[(f[r>>2]|0)+4>>2]&127](r)}while((x|0)!=(w|0))}f[l>>2]=w}}while(0);l=(f[D>>2]|0)+(c<<2)|0;c=f[l>>2]|0;f[l>>2]=G;if(!c){v=1;u=d;return v|0}Pa[f[(f[c>>2]|0)+4>>2]&127](c);v=1;u=d;return v|0}function Tb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=u;u=u+736|0;e=d+716|0;g=d;h=d+64|0;if((j[c+38>>1]|0)<515){i=1;u=d;return i|0}k=c+8|0;l=f[k+4>>2]|0;m=c+16|0;n=m;o=f[n>>2]|0;p=f[n+4>>2]|0;if(!((l|0)>(p|0)|((l|0)==(p|0)?(f[k>>2]|0)>>>0>o>>>0:0))){i=0;u=d;return i|0}k=b[(f[c>>2]|0)+o>>0]|0;l=vl(o|0,p|0,1,0)|0;p=m;f[p>>2]=l;f[p+4>>2]=H;p=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;l=f[(f[p>>2]|0)+80>>2]|0;p=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;f[e>>2]=0;m=e+4|0;f[m>>2]=0;o=e+8|0;f[o>>2]=0;do if(p|0)if(p>>>0>214748364)$n(e);else{n=p*20|0;q=wk(n)|0;f[e>>2]=q;f[o>>2]=q+(p*20|0);oh(q|0,0,n|0)|0;f[m>>2]=q+n;break}while(0);p=a+52|0;o=a+56|0;n=a+48|0;q=a+64|0;r=a+68|0;s=a+60|0;t=0;v=0;a:while(1){if((v|0)>=(Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0)){w=35;break}x=La[f[(f[a>>2]|0)+20>>2]&127](a,v)|0;y=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;z=f[(f[(f[y>>2]|0)+8>>2]|0)+(x<<2)>>2]|0;Fh(z,l)|0;b[z+84>>0]=1;f[z+72>>2]=f[z+68>>2];switch(f[z+28>>2]|0){case 2:case 4:case 6:{A=z;break}case 1:case 3:case 5:{x=z+24|0;y=b[x>>0]|0;if(y<<24>>24>0){B=0;C=y;while(1){f[g>>2]=0;y=f[p>>2]|0;if(y>>>0<(f[o>>2]|0)>>>0){f[y>>2]=0;f[p>>2]=y+4;D=C}else{Ng(n,g);D=b[x>>0]|0}B=B+1|0;if((B|0)>=(D<<24>>24|0))break;else C=D}}A=z;break}case 9:{C=b[z+24>>0]|0;oj(g);B=f[z+56>>2]|0;x=W(Bj(6)|0,C<<24>>24)|0;Ih(g,B,0,C,6,0,x,((x|0)<0)<<31>>31,0,0);x=wk(96)|0;$i(x,g);f[h>>2]=x;b[x+84>>0]=1;f[x+72>>2]=f[x+68>>2];Fh(x,l)|0;x=f[q>>2]|0;if(x>>>0<(f[r>>2]|0)>>>0){C=f[h>>2]|0;f[h>>2]=0;f[x>>2]=C;C=x+4|0;f[q>>2]=C;E=C}else{Rd(s,h);E=f[q>>2]|0}C=f[E+-4>>2]|0;x=f[h>>2]|0;f[h>>2]=0;if(x|0){B=x+88|0;y=f[B>>2]|0;f[B>>2]=0;if(y|0){B=f[y+8>>2]|0;if(B|0){f[y+12>>2]=B;Ko(B)}Ko(y)}y=f[x+68>>2]|0;if(y|0){f[x+72>>2]=y;Ko(y)}y=x+64|0;B=f[y>>2]|0;f[y>>2]=0;if(B|0){y=f[B>>2]|0;if(y|0){f[B+4>>2]=y;Ko(y)}Ko(B)}Ko(x)}A=C;break}default:{F=0;break a}}C=A;x=f[C+28>>2]|0;B=Bj(x)|0;y=b[C+24>>0]|0;C=f[e>>2]|0;f[C+(v*20|0)>>2]=A;f[C+(v*20|0)+4>>2]=t;f[C+(v*20|0)+8>>2]=x;f[C+(v*20|0)+12>>2]=(B|0)>0?B:0;f[C+(v*20|0)+16>>2]=y;t=t+y|0;v=v+1|0}if((w|0)==35){$e(g,e);switch(k<<24>>24){case 0:{ve(h,t);k=Xd(h,c,g)|0;Cf(h);if(k)w=43;else G=0;break}case 1:{ve(h,t);k=Wd(h,c,g)|0;Cf(h);if(k)w=43;else G=0;break}case 2:{we(h,t);k=Zd(h,c,g)|0;Lf(h);if(k)w=43;else G=0;break}case 3:{we(h,t);k=Yd(h,c,g)|0;Lf(h);if(k)w=43;else G=0;break}case 4:{re(h,t);k=Ud(h,c,g)|0;jg(h);if(k)w=43;else G=0;break}case 5:{re(h,t);k=Td(h,c,g)|0;jg(h);if(k)w=43;else G=0;break}case 6:{re(h,t);t=Sd(h,c,g)|0;jg(h);if(t)w=43;else G=0;break}default:G=0}if((w|0)==43)G=1;w=f[g+16>>2]|0;if(w|0){f[g+20>>2]=w;Ko(w)}w=f[g>>2]|0;if(w|0){f[g+4>>2]=w;Ko(w)}F=G}G=f[e>>2]|0;if(G|0){f[m>>2]=G;Ko(G)}i=F;u=d;return i|0}function Ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0;c=u;u=u+48|0;d=c+24|0;e=c+12|0;g=c;if(!b){h=0;u=c;return h|0}i=a+12|0;j=a+4|0;k=(f[j>>2]|0)-(f[a>>2]|0)>>2;l=a+16|0;m=f[i>>2]|0;n=(f[l>>2]|0)-m>>2;if(k>>>0<=n>>>0)if(k>>>0<n>>>0){f[l>>2]=m+(k<<2);o=k}else o=k;else{Of(i,k-n|0,3732);o=(f[j>>2]|0)-(f[a>>2]|0)>>2}f[d>>2]=0;n=d+4|0;f[n>>2]=0;f[d+8>>2]=0;Wh(d,o);o=f[j>>2]|0;k=f[a>>2]|0;m=k;if((o|0)==(k|0)){p=0;q=0;r=m;s=m;t=m;v=m;w=m;x=o;y=k}else{l=f[d>>2]|0;z=l;A=z;B=0;C=m;D=m;E=m;F=m;G=m;H=o;o=z;z=m;m=l;l=k;while(1){k=f[z+(B<<2)>>2]|0;I=(f[n>>2]|0)-m>>2;if(k>>>0<I>>>0){J=l;K=A;L=C;M=D;N=E;O=F;P=G;Q=o;R=l;S=H}else{T=k+1|0;f[e>>2]=0;if(T>>>0<=I>>>0)if(T>>>0<I>>>0){f[n>>2]=m+(T<<2);U=A;V=H;W=l}else{U=A;V=H;W=l}else{Of(d,T-I|0,e);U=f[d>>2]|0;V=f[j>>2]|0;W=f[a>>2]|0}I=W;J=I;K=U;L=I;M=I;N=I;O=I;P=I;Q=U;R=W;S=V}I=Q+(k<<2)|0;f[I>>2]=(f[I>>2]|0)+1;B=B+1|0;I=S-R|0;k=I>>2;if(B>>>0>=k>>>0){p=k;q=I;r=L;s=M;t=N;v=O;w=P;x=S;y=R;break}else{A=K;C=L;D=M;E=N;F=O;G=P;H=S;o=Q;z=J;m=Q;l=R}}}f[e>>2]=0;R=e+4|0;f[R>>2]=0;l=e+8|0;f[l>>2]=0;do if(q)if(p>>>0>536870911)$n(e);else{Q=wk(q<<1)|0;f[e>>2]=Q;f[l>>2]=Q+(p<<3);m=p<<3;oh(Q|0,-1,m|0)|0;f[R>>2]=Q+m;X=Q;Y=Q;break}else{X=0;Y=0}while(0);p=f[d>>2]|0;l=(f[n>>2]|0)-p|0;q=l>>2;f[g>>2]=0;Q=g+4|0;f[Q>>2]=0;m=g+8|0;f[m>>2]=0;J=p;if(!l){Z=0;_=0}else{if(q>>>0>1073741823)$n(g);p=wk(l)|0;f[g>>2]=p;g=p+(q<<2)|0;f[m>>2]=g;oh(p|0,0,l|0)|0;f[Q>>2]=g;g=0;l=0;while(1){f[p+(l<<2)>>2]=g;m=l+1|0;if(m>>>0<q>>>0){g=(f[J+(l<<2)>>2]|0)+g|0;l=m}else{Z=p;_=p;break}}}if((x|0)!=(y|0)){p=a+40|0;a=x-y>>2;x=y;y=X;l=0;g=v;v=t;t=s;s=r;r=w;while(1){w=f[r+(l<<2)>>2]|0;m=l+1|0;z=((m>>>0)%3|0|0)==0?l+-2|0:m;if((z|0)==-1)$=-1;else $=f[g+(z<<2)>>2]|0;z=((l>>>0)%3|0|0)==0;o=(z?2:-1)+l|0;if((o|0)==-1)aa=-1;else aa=f[v+(o<<2)>>2]|0;if(z?(z=f[t+(l<<2)>>2]|0,($|0)==(aa|0)|((z|0)==($|0)|(z|0)==(aa|0))):0){f[p>>2]=(f[p>>2]|0)+1;ba=y;ca=l+3|0}else da=41;a:do if((da|0)==41){da=0;z=f[J+(aa<<2)>>2]|0;b:do if((z|0)>0){o=0;S=f[Z+(aa<<2)>>2]|0;while(1){ea=y+(S<<3)|0;H=f[ea>>2]|0;if((H|0)==-1)break b;if((H|0)==($|0)){fa=f[y+(S<<3)+4>>2]|0;if((fa|0)==-1)ga=-1;else ga=f[s+(fa<<2)>>2]|0;if((w|0)!=(ga|0))break}H=o+1|0;if((H|0)<(z|0)){o=H;S=S+1|0}else break b}H=o+1|0;c:do if((H|0)<(z|0)){P=H;G=S;while(1){O=G;G=G+1|0;F=y+(G<<3)|0;N=f[F>>2]|0;E=y+(O<<3)|0;f[E>>2]=N;f[y+(O<<3)+4>>2]=f[y+(G<<3)+4>>2];if((N|0)==-1){ha=E;break c}P=P+1|0;if((P|0)>=(z|0)){ha=F;break}}}else ha=ea;while(0);f[ha>>2]=-1;if((fa|0)!=-1){S=f[i>>2]|0;f[S+(l<<2)>>2]=fa;f[S+(fa<<2)>>2]=l;ba=y;ca=m;break a}}while(0);z=f[J+($<<2)>>2]|0;if((z|0)>0){S=0;H=f[Z+($<<2)>>2]|0;while(1){ia=X+(H<<3)|0;if((f[ia>>2]|0)==-1)break;S=S+1|0;if((S|0)>=(z|0)){ba=X;ca=m;break a}else H=H+1|0}f[ia>>2]=aa;f[X+(H<<3)+4>>2]=l;ba=X;ca=m}else{ba=y;ca=m}}while(0);if(ca>>>0<a>>>0){y=ba;l=ca;g=x;v=x;t=x;s=x;r=x}else break}}f[b>>2]=q;if(!Z){ja=X;ka=Y}else{f[Q>>2]=Z;Ko(_);_=f[e>>2]|0;ja=_;ka=_}if(ja|0){f[R>>2]=ja;Ko(ka)}ka=f[d>>2]|0;if(ka|0){f[n>>2]=ka;Ko(ka)}h=1;u=c;return h|0}function Vb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=u;u=u+16|0;e=d;g=a+144|0;i=f[g>>2]|0;k=Ka[f[(f[i>>2]|0)+32>>2]&127](i)|0;do if((((h[k+36>>0]|0)<<8|(h[k+37>>0]|0))&65535)<514){i=a+40|0;l=i;m=a;n=l+40|0;do{f[l>>2]=f[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(n|0));if(vf(i,1,e)|0){l=a;m=i;n=l+40|0;do{f[l>>2]=f[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(n|0));i=e;o=f[i>>2]|0;p=f[i+4>>2]|0;i=a+8|0;q=a+16|0;r=q;s=f[r>>2]|0;t=f[r+4>>2]|0;r=wl(f[i>>2]|0,f[i+4>>2]|0,s|0,t|0)|0;i=H;if(!(p>>>0>i>>>0|(p|0)==(i|0)&o>>>0>r>>>0)){r=vl(s|0,t|0,o|0,p|0)|0;p=q;f[p>>2]=r;f[p+4>>2]=H;break}}v=0;u=d;return v|0}while(0);do if((j[a+38>>1]|0)>=514){if(!(rd(a+80|0,a)|0)){v=0;u=d;return v|0}}else{k=a+96|0;l=k;m=a;n=l+40|0;do{f[l>>2]=f[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(n|0));if(vf(k,1,e)|0){l=a;m=k;n=l+40|0;do{f[l>>2]=f[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(n|0));k=e;p=f[k>>2]|0;r=f[k+4>>2]|0;k=a+8|0;q=a+16|0;o=q;t=f[o>>2]|0;s=f[o+4>>2]|0;o=wl(f[k>>2]|0,f[k+4>>2]|0,t|0,s|0)|0;k=H;if(!(r>>>0>k>>>0|(r|0)==(k|0)&p>>>0>o>>>0)){o=vl(t|0,s|0,p|0,r|0)|0;r=q;f[r>>2]=o;f[r+4>>2]=H;break}}v=0;u=d;return v|0}while(0);if(!(Jg(a)|0)){v=0;u=d;return v|0}l=c;m=a;n=l+40|0;do{f[l>>2]=f[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(n|0));m=f[g>>2]|0;l=Ka[f[(f[m>>2]|0)+32>>2]&127](m)|0;do if((((h[l+36>>0]|0)<<8|(h[l+37>>0]|0))&65535)<514){m=f[g>>2]|0;n=(Ka[f[(f[m>>2]|0)+32>>2]&127](m)|0)+36|0;if(((h[n>>0]|0)<<8&65535)<512){n=c+8|0;m=f[n>>2]|0;r=f[n+4>>2]|0;n=c+16|0;o=n;q=f[o>>2]|0;p=vl(q|0,f[o+4>>2]|0,4,0)|0;o=H;if(!((r|0)<(o|0)|(r|0)==(o|0)&m>>>0<p>>>0)){m=(f[c>>2]|0)+q|0;q=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;f[e>>2]=q;m=n;f[m>>2]=p;f[m+4>>2]=o;w=q;x=19}}else if(zh(e,c)|0){w=f[e>>2]|0;x=19}if((((x|0)==19?(q=f[a+152>>2]|0,w>>>0<q>>>0):0)?(o=c+8|0,m=f[o+4>>2]|0,p=c+16|0,n=p,r=f[n>>2]|0,s=f[n+4>>2]|0,(m|0)>(s|0)|((m|0)==(s|0)?(f[o>>2]|0)>>>0>r>>>0:0)):0)?(o=b[(f[c>>2]|0)+r>>0]|0,m=vl(r|0,s|0,1,0)|0,s=p,f[s>>2]=m,f[s+4>>2]=H,o<<24>>24==0):0){f[a+176>>2]=2;f[a+180>>2]=7;y=q;break}v=0;u=d;return v|0}else{f[a+176>>2]=2;f[a+180>>2]=7;y=f[a+152>>2]|0}while(0);if((y|0)<0){v=0;u=d;return v|0}w=a+156|0;f[e>>2]=0;x=a+160|0;g=f[w>>2]|0;l=(f[x>>2]|0)-g>>2;if(y>>>0<=l>>>0)if(y>>>0<l>>>0){f[x>>2]=g+(y<<2);z=2;A=7}else{z=2;A=7}else{Of(w,y-l|0,e);z=f[a+176>>2]|0;A=f[a+180>>2]|0}l=A-z+1|0;z=a+184|0;A=a+188|0;y=f[A>>2]|0;w=f[z>>2]|0;g=(y-w|0)/12|0;x=w;w=y;if(l>>>0<=g>>>0)if(l>>>0<g>>>0){q=x+(l*12|0)|0;if((q|0)!=(w|0)){x=w;do{w=x;x=x+-12|0;o=f[x>>2]|0;if(o|0){f[w+-8>>2]=o;Ko(o)}}while((x|0)!=(q|0))}f[A>>2]=q;B=q}else B=y;else{Ie(z,l-g|0);B=f[A>>2]|0}g=a+196|0;l=f[z>>2]|0;y=(B-l|0)/12|0;q=a+200|0;a=f[g>>2]|0;x=(f[q>>2]|0)-a>>2;if(y>>>0<=x>>>0)if(y>>>0<x>>>0){f[q>>2]=a+(y<<2);C=B;D=l}else{C=B;D=l}else{Eg(g,y-x|0);C=f[A>>2]|0;D=f[z>>2]|0}if((C|0)==(D|0)){v=1;u=d;return v|0}D=0;do{zh(e,c)|0;C=f[e>>2]|0;if(C|0){x=f[z>>2]|0;y=x+(D*12|0)|0;l=x+(D*12|0)+4|0;B=f[y>>2]|0;a=(f[l>>2]|0)-B>>2;if(C>>>0<=a>>>0)if(C>>>0<a>>>0){f[l>>2]=B+(C<<2);E=x;F=C}else{E=x;F=C}else{Eg(y,C-a|0);E=f[z>>2]|0;F=f[e>>2]|0}kh(F,1,c,f[E+(D*12|0)>>2]|0)|0;f[(f[g>>2]|0)+(D<<2)>>2]=f[e>>2]}D=D+1|0}while(D>>>0<(((f[A>>2]|0)-(f[z>>2]|0)|0)/12|0)>>>0);v=1;u=d;return v|0}function Wb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=Ia,E=Ia,F=Ia,G=0,H=0,I=0,J=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;e=i;j=i;while(1){k=W(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;e=(W(k>>>24^k,1540483477)|0)^(W(e,1540483477)|0);j=j+-4|0;if(j>>>0<=3)break;else d=d+4|0}d=i+-4|0;j=d&-4;l=d-j|0;m=g+(j+4)|0;o=e}else{l=i;m=g;o=i}switch(l|0){case 3:{p=h[m+2>>0]<<16^o;q=7;break}case 2:{p=o;q=7;break}case 1:{r=o;q=8;break}default:s=o}if((q|0)==7){r=h[m+1>>0]<<8^p;q=8}if((q|0)==8)s=W(r^h[m>>0],1540483477)|0;m=W(s>>>13^s,1540483477)|0;s=m>>>15^m;m=a+4|0;r=f[m>>2]|0;p=(r|0)==0;a:do if(!p){o=r+-1|0;l=(o&r|0)==0;if(!l)if(s>>>0<r>>>0)t=s;else t=(s>>>0)%(r>>>0)|0;else t=s&o;e=f[(f[a>>2]|0)+(t<<2)>>2]|0;if((e|0)!=0?(j=f[e>>2]|0,(j|0)!=0):0){e=(i|0)==0;if(l){if(e){l=j;while(1){d=f[l+4>>2]|0;if(!((d|0)==(s|0)|(d&o|0)==(t|0))){u=t;break a}d=b[l+8+11>>0]|0;if(!((d<<24>>24<0?f[l+12>>2]|0:d&255)|0)){v=l;break}l=f[l>>2]|0;if(!l){u=t;break a}}w=v+20|0;return w|0}l=j;b:while(1){d=f[l+4>>2]|0;if(!((d|0)==(s|0)|(d&o|0)==(t|0))){u=t;break a}d=l+8|0;k=b[d+11>>0]|0;x=k<<24>>24<0;y=k&255;do if(((x?f[l+12>>2]|0:y)|0)==(i|0)){k=f[d>>2]|0;if(x)if(!(Fi(k,g,i)|0)){v=l;q=68;break b}else break;if((b[g>>0]|0)==(k&255)<<24>>24){k=d;z=y;A=g;do{z=z+-1|0;k=k+1|0;if(!z){v=l;q=68;break b}A=A+1|0}while((b[k>>0]|0)==(b[A>>0]|0))}}while(0);l=f[l>>2]|0;if(!l){u=t;break a}}if((q|0)==68){w=v+20|0;return w|0}}if(e){l=j;while(1){o=f[l+4>>2]|0;if((o|0)!=(s|0)){if(o>>>0<r>>>0)B=o;else B=(o>>>0)%(r>>>0)|0;if((B|0)!=(t|0)){u=t;break a}}o=b[l+8+11>>0]|0;if(!((o<<24>>24<0?f[l+12>>2]|0:o&255)|0)){v=l;break}l=f[l>>2]|0;if(!l){u=t;break a}}w=v+20|0;return w|0}l=j;c:while(1){e=f[l+4>>2]|0;if((e|0)!=(s|0)){if(e>>>0<r>>>0)C=e;else C=(e>>>0)%(r>>>0)|0;if((C|0)!=(t|0)){u=t;break a}}e=l+8|0;o=b[e+11>>0]|0;y=o<<24>>24<0;d=o&255;do if(((y?f[l+12>>2]|0:d)|0)==(i|0)){o=f[e>>2]|0;if(y)if(!(Fi(o,g,i)|0)){v=l;q=68;break c}else break;if((b[g>>0]|0)==(o&255)<<24>>24){o=e;x=d;A=g;do{x=x+-1|0;o=o+1|0;if(!x){v=l;q=68;break c}A=A+1|0}while((b[o>>0]|0)==(b[A>>0]|0))}}while(0);l=f[l>>2]|0;if(!l){u=t;break a}}if((q|0)==68){w=v+20|0;return w|0}}else u=t}else u=0;while(0);t=wk(24)|0;Yi(t+8|0,c);f[t+20>>2]=0;f[t+4>>2]=s;f[t>>2]=0;c=a+12|0;D=_(((f[c>>2]|0)+1|0)>>>0);E=_(r>>>0);F=_(n[a+16>>2]);do if(p|_(F*E)<D){g=r<<1|(r>>>0<3|(r+-1&r|0)!=0)&1;i=~~_(V(_(D/F)))>>>0;Xf(a,g>>>0<i>>>0?i:g);g=f[m>>2]|0;i=g+-1|0;if(!(i&g)){G=g;H=i&s;break}if(s>>>0<g>>>0){G=g;H=s}else{G=g;H=(s>>>0)%(g>>>0)|0}}else{G=r;H=u}while(0);u=(f[a>>2]|0)+(H<<2)|0;H=f[u>>2]|0;if(!H){r=a+8|0;f[t>>2]=f[r>>2];f[r>>2]=t;f[u>>2]=r;r=f[t>>2]|0;if(r|0){u=f[r+4>>2]|0;r=G+-1|0;if(r&G)if(u>>>0<G>>>0)I=u;else I=(u>>>0)%(G>>>0)|0;else I=u&r;J=(f[a>>2]|0)+(I<<2)|0;q=66}}else{f[t>>2]=f[H>>2];J=H;q=66}if((q|0)==66)f[J>>2]=t;f[c>>2]=(f[c>>2]|0)+1;v=t;w=v+20|0;return w|0}function Xb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;g=a+8|0;f[g>>2]=e;d=a+32|0;h=a+36|0;i=f[d>>2]|0;j=(f[h>>2]|0)-i>>2;if(j>>>0>=e>>>0){if(j>>>0>e>>>0)f[h>>2]=i+(e<<2)}else Eg(d,e-j|0);j=f[a+48>>2]|0;d=f[a+52>>2]|0;i=e>>>0>1073741823?-1:e<<2;h=Ho(i)|0;oh(h|0,0,i|0)|0;i=f[g>>2]|0;if((i|0)>0){k=a+16|0;l=a+32|0;m=a+12|0;n=0;do{o=f[h+(n<<2)>>2]|0;p=f[k>>2]|0;do if((o|0)<=(p|0)){q=f[m>>2]|0;r=f[l>>2]|0;s=r+(n<<2)|0;if((o|0)<(q|0)){f[s>>2]=q;t=r;break}else{f[s>>2]=o;t=r;break}}else{r=f[l>>2]|0;f[r+(n<<2)>>2]=p;t=r}while(0);n=n+1|0;u=f[g>>2]|0}while((n|0)<(u|0));if((u|0)>0){n=a+20|0;l=0;do{p=(f[b+(l<<2)>>2]|0)+(f[t+(l<<2)>>2]|0)|0;o=c+(l<<2)|0;f[o>>2]=p;if((p|0)<=(f[k>>2]|0)){if((p|0)<(f[m>>2]|0)){v=(f[n>>2]|0)+p|0;w=19}}else{v=p-(f[n>>2]|0)|0;w=19}if((w|0)==19){w=0;f[o>>2]=v}l=l+1|0;o=f[g>>2]|0}while((l|0)<(o|0));x=o}else x=u}else x=i;i=f[a+56>>2]|0;u=f[i>>2]|0;l=(f[i+4>>2]|0)-u|0;v=l>>2;if((l|0)<=4){Io(h);return 1}l=u;u=j+12|0;n=a+16|0;m=a+32|0;k=a+12|0;t=(e|0)>0;o=a+20|0;a=1;p=x;while(1){if(v>>>0<=a>>>0){w=25;break}x=f[l+(a<<2)>>2]|0;r=W(a,e)|0;if((x|0)!=-1?(s=f[(f[u>>2]|0)+(x<<2)>>2]|0,(s|0)!=-1):0){x=f[j>>2]|0;q=f[d>>2]|0;y=f[q+(f[x+(s<<2)>>2]<<2)>>2]|0;z=s+1|0;A=((z>>>0)%3|0|0)==0?s+-2|0:z;if((A|0)==-1)B=-1;else B=f[x+(A<<2)>>2]|0;A=f[q+(B<<2)>>2]|0;z=(((s>>>0)%3|0|0)==0?2:-1)+s|0;if((z|0)==-1)C=-1;else C=f[x+(z<<2)>>2]|0;z=f[q+(C<<2)>>2]|0;if((y|0)<(a|0)&(A|0)<(a|0)&(z|0)<(a|0)){q=W(y,e)|0;y=W(A,e)|0;A=W(z,e)|0;if(t){z=0;do{f[h+(z<<2)>>2]=(f[c+(z+A<<2)>>2]|0)+(f[c+(z+y<<2)>>2]|0)-(f[c+(z+q<<2)>>2]|0);z=z+1|0}while((z|0)!=(e|0))}z=b+(r<<2)|0;q=c+(r<<2)|0;if((p|0)>0){y=0;do{A=f[h+(y<<2)>>2]|0;x=f[n>>2]|0;do if((A|0)<=(x|0)){s=f[k>>2]|0;D=f[m>>2]|0;E=D+(y<<2)|0;if((A|0)<(s|0)){f[E>>2]=s;F=D;break}else{f[E>>2]=A;F=D;break}}else{D=f[m>>2]|0;f[D+(y<<2)>>2]=x;F=D}while(0);y=y+1|0;G=f[g>>2]|0}while((y|0)<(G|0));if((G|0)>0){y=0;do{x=(f[z+(y<<2)>>2]|0)+(f[F+(y<<2)>>2]|0)|0;A=q+(y<<2)|0;f[A>>2]=x;if((x|0)<=(f[n>>2]|0)){if((x|0)<(f[k>>2]|0)){H=(f[o>>2]|0)+x|0;w=66}}else{H=x-(f[o>>2]|0)|0;w=66}if((w|0)==66){w=0;f[A>>2]=H}y=y+1|0;A=f[g>>2]|0}while((y|0)<(A|0));I=A}else I=G}else I=p}else w=36}else w=36;if((w|0)==36){w=0;y=c+((W(a+-1|0,e)|0)<<2)|0;q=b+(r<<2)|0;z=c+(r<<2)|0;if((p|0)>0){A=0;do{x=f[y+(A<<2)>>2]|0;D=f[n>>2]|0;do if((x|0)<=(D|0)){E=f[k>>2]|0;s=f[m>>2]|0;J=s+(A<<2)|0;if((x|0)<(E|0)){f[J>>2]=E;K=s;break}else{f[J>>2]=x;K=s;break}}else{s=f[m>>2]|0;f[s+(A<<2)>>2]=D;K=s}while(0);A=A+1|0;L=f[g>>2]|0}while((A|0)<(L|0));if((L|0)>0){A=0;do{y=(f[q+(A<<2)>>2]|0)+(f[K+(A<<2)>>2]|0)|0;r=z+(A<<2)|0;f[r>>2]=y;if((y|0)<=(f[n>>2]|0)){if((y|0)<(f[k>>2]|0)){M=(f[o>>2]|0)+y|0;w=50}}else{M=y-(f[o>>2]|0)|0;w=50}if((w|0)==50){w=0;f[r>>2]=M}A=A+1|0;r=f[g>>2]|0}while((A|0)<(r|0));I=r}else I=L}else I=p}a=a+1|0;if((a|0)>=(v|0)){w=23;break}else p=I}if((w|0)==23){Io(h);return 1}else if((w|0)==25)$n(i);return 0}function Yb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;g=a+8|0;f[g>>2]=e;d=a+32|0;h=a+36|0;i=f[d>>2]|0;j=(f[h>>2]|0)-i>>2;if(j>>>0>=e>>>0){if(j>>>0>e>>>0)f[h>>2]=i+(e<<2)}else Eg(d,e-j|0);j=f[a+48>>2]|0;d=f[a+52>>2]|0;i=e>>>0>1073741823?-1:e<<2;h=Ho(i)|0;oh(h|0,0,i|0)|0;i=f[g>>2]|0;if((i|0)>0){k=a+16|0;l=a+32|0;m=a+12|0;n=0;do{o=f[h+(n<<2)>>2]|0;p=f[k>>2]|0;do if((o|0)<=(p|0)){q=f[m>>2]|0;r=f[l>>2]|0;s=r+(n<<2)|0;if((o|0)<(q|0)){f[s>>2]=q;t=r;break}else{f[s>>2]=o;t=r;break}}else{r=f[l>>2]|0;f[r+(n<<2)>>2]=p;t=r}while(0);n=n+1|0;u=f[g>>2]|0}while((n|0)<(u|0));if((u|0)>0){n=a+20|0;l=0;do{p=(f[b+(l<<2)>>2]|0)+(f[t+(l<<2)>>2]|0)|0;o=c+(l<<2)|0;f[o>>2]=p;if((p|0)<=(f[k>>2]|0)){if((p|0)<(f[m>>2]|0)){v=(f[n>>2]|0)+p|0;w=19}}else{v=p-(f[n>>2]|0)|0;w=19}if((w|0)==19){w=0;f[o>>2]=v}l=l+1|0;o=f[g>>2]|0}while((l|0)<(o|0));x=o}else x=u}else x=i;i=f[a+56>>2]|0;u=f[i>>2]|0;l=(f[i+4>>2]|0)-u|0;v=l>>2;if((l|0)<=4){Io(h);return 1}l=u;u=a+16|0;n=a+32|0;m=a+12|0;k=j+64|0;t=j+28|0;o=(e|0)>0;p=a+20|0;a=1;r=x;while(1){if(v>>>0<=a>>>0){w=25;break}x=f[l+(a<<2)>>2]|0;s=W(a,e)|0;if((((x|0)!=-1?(f[(f[j>>2]|0)+(x>>>5<<2)>>2]&1<<(x&31)|0)==0:0)?(q=f[(f[(f[k>>2]|0)+12>>2]|0)+(x<<2)>>2]|0,(q|0)!=-1):0)?(x=f[t>>2]|0,y=f[d>>2]|0,z=f[y+(f[x+(q<<2)>>2]<<2)>>2]|0,A=q+1|0,B=f[y+(f[x+((((A>>>0)%3|0|0)==0?q+-2|0:A)<<2)>>2]<<2)>>2]|0,A=f[y+(f[x+((((q>>>0)%3|0|0)==0?2:-1)+q<<2)>>2]<<2)>>2]|0,(z|0)<(a|0)&(B|0)<(a|0)&(A|0)<(a|0)):0){q=W(z,e)|0;z=W(B,e)|0;B=W(A,e)|0;if(o){A=0;do{f[h+(A<<2)>>2]=(f[c+(A+B<<2)>>2]|0)+(f[c+(A+z<<2)>>2]|0)-(f[c+(A+q<<2)>>2]|0);A=A+1|0}while((A|0)!=(e|0))}A=b+(s<<2)|0;q=c+(s<<2)|0;if((r|0)>0){z=0;do{B=f[h+(z<<2)>>2]|0;x=f[u>>2]|0;do if((B|0)<=(x|0)){y=f[m>>2]|0;C=f[n>>2]|0;D=C+(z<<2)|0;if((B|0)<(y|0)){f[D>>2]=y;E=C;break}else{f[D>>2]=B;E=C;break}}else{C=f[n>>2]|0;f[C+(z<<2)>>2]=x;E=C}while(0);z=z+1|0;F=f[g>>2]|0}while((z|0)<(F|0));if((F|0)>0){z=0;do{x=(f[A+(z<<2)>>2]|0)+(f[E+(z<<2)>>2]|0)|0;B=q+(z<<2)|0;f[B>>2]=x;if((x|0)<=(f[u>>2]|0)){if((x|0)<(f[m>>2]|0)){G=(f[p>>2]|0)+x|0;w=63}}else{G=x-(f[p>>2]|0)|0;w=63}if((w|0)==63){w=0;f[B>>2]=G}z=z+1|0;B=f[g>>2]|0}while((z|0)<(B|0));H=B}else H=F}else H=r}else{z=c+((W(a+-1|0,e)|0)<<2)|0;q=b+(s<<2)|0;A=c+(s<<2)|0;if((r|0)>0){B=0;do{x=f[z+(B<<2)>>2]|0;C=f[u>>2]|0;do if((x|0)<=(C|0)){D=f[m>>2]|0;y=f[n>>2]|0;I=y+(B<<2)|0;if((x|0)<(D|0)){f[I>>2]=D;J=y;break}else{f[I>>2]=x;J=y;break}}else{y=f[n>>2]|0;f[y+(B<<2)>>2]=C;J=y}while(0);B=B+1|0;K=f[g>>2]|0}while((B|0)<(K|0));if((K|0)>0){B=0;do{z=(f[q+(B<<2)>>2]|0)+(f[J+(B<<2)>>2]|0)|0;s=A+(B<<2)|0;f[s>>2]=z;if((z|0)<=(f[u>>2]|0)){if((z|0)<(f[m>>2]|0)){L=(f[p>>2]|0)+z|0;w=47}}else{L=z-(f[p>>2]|0)|0;w=47}if((w|0)==47){w=0;f[s>>2]=L}B=B+1|0;s=f[g>>2]|0}while((B|0)<(s|0));H=s}else H=K}else H=r}a=a+1|0;if((a|0)>=(v|0)){w=23;break}else r=H}if((w|0)==23){Io(h);return 1}else if((w|0)==25)$n(i);return 0}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;c=u;u=u+16|0;d=c;e=f[b>>2]|0;b=a+8|0;g=e+1|0;if((e|0)!=-1){h=((g>>>0)%3|0|0)==0?e+-2|0:g;g=e+(((e>>>0)%3|0|0)==0?2:-1)|0;i=a+216|0;j=a+220|0;k=a+368|0;if((f[(f[(f[b>>2]|0)+12>>2]|0)+(e<<2)>>2]|0)!=-1){l=f[j>>2]|0;m=f[i>>2]|0;n=m;if((l|0)==(m|0)){o=g;p=d;q=d;r=n;s=n;t=h;v=l;w=l;x=k;y=i;z=j;A=i}else{l=0;do{if(pi((f[k>>2]|0)+(l<<4)|0)|0){n=f[i>>2]|0;f[d>>2]=e;m=n+(l*144|0)+136|0;B=f[m>>2]|0;if(B>>>0<(f[n+(l*144|0)+140>>2]|0)>>>0){f[B>>2]=e;f[m>>2]=B+4}else Ng(n+(l*144|0)+132|0,d)}l=l+1|0;C=f[j>>2]|0;D=f[i>>2]|0}while(l>>>0<((C-D|0)/144|0)>>>0);l=D;o=g;p=d;q=d;r=l;s=l;t=h;v=C;w=D;x=k;y=i;z=j;A=i}}else{E=d;F=k;G=d;H=i;I=g;J=h;K=j;L=i;M=4}}else{i=a+216|0;E=d;F=a+368|0;G=d;H=i;I=-1;J=-1;K=a+220|0;L=i;M=4}if((M|0)==4){M=f[K>>2]|0;i=f[L>>2]|0;a=i;if((M|0)==(i|0)){o=I;p=E;q=G;r=a;s=a;t=J;v=M;w=M;x=F;y=H;z=K;A=L}else{j=0;h=a;g=a;k=M;M=a;a=i;while(1){f[d>>2]=e;i=M+(j*144|0)+136|0;D=f[i>>2]|0;if(D>>>0<(f[M+(j*144|0)+140>>2]|0)>>>0){f[D>>2]=e;f[i>>2]=D+4;N=a;O=h;P=g;Q=a;R=k}else{Ng(M+(j*144|0)+132|0,d);D=f[L>>2]|0;i=D;N=i;O=i;P=i;Q=D;R=f[K>>2]|0}j=j+1|0;if(j>>>0>=((R-Q|0)/144|0)>>>0){o=I;p=E;q=G;r=O;s=P;t=J;v=R;w=Q;x=F;y=H;z=K;A=L;break}else{h=O;g=P;k=R;M=N;a=Q}}}}if((t|0)!=-1?(f[(f[(f[b>>2]|0)+12>>2]|0)+(t<<2)>>2]|0)!=-1:0)if((v|0)==(w|0)){S=w;T=w;U=r}else{Q=0;do{if(pi((f[x>>2]|0)+(Q<<4)|0)|0){a=f[y>>2]|0;f[d>>2]=t;N=a+(Q*144|0)+136|0;M=f[N>>2]|0;if(M>>>0<(f[a+(Q*144|0)+140>>2]|0)>>>0){f[M>>2]=t;f[N>>2]=M+4}else Ng(a+(Q*144|0)+132|0,d)}Q=Q+1|0;V=f[z>>2]|0;W=f[A>>2]|0}while(Q>>>0<((V-W|0)/144|0)>>>0);S=V;T=W;U=W}else if((v|0)==(w|0)){S=w;T=w;U=r}else{W=0;V=w;w=r;r=v;v=s;while(1){f[d>>2]=t;s=v+(W*144|0)+136|0;Q=f[s>>2]|0;if(Q>>>0<(f[v+(W*144|0)+140>>2]|0)>>>0){f[Q>>2]=t;f[s>>2]=Q+4;X=V;Y=V;Z=r;_=w}else{Ng(v+(W*144|0)+132|0,d);Q=f[A>>2]|0;s=Q;X=s;Y=Q;Z=f[z>>2]|0;_=s}W=W+1|0;if(W>>>0>=((Z-Y|0)/144|0)>>>0){S=Z;T=Y;U=_;break}else{V=Y;w=_;r=Z;v=X}}}if((o|0)!=-1?(f[(f[(f[b>>2]|0)+12>>2]|0)+(o<<2)>>2]|0)!=-1:0){if((S|0)==(T|0)){u=c;return 1}b=0;do{if(pi((f[x>>2]|0)+(b<<4)|0)|0){X=f[y>>2]|0;f[d>>2]=o;v=X+(b*144|0)+136|0;Z=f[v>>2]|0;if(Z>>>0<(f[X+(b*144|0)+140>>2]|0)>>>0){f[Z>>2]=o;f[v>>2]=Z+4}else Ng(X+(b*144|0)+132|0,d)}b=b+1|0}while(b>>>0<(((f[z>>2]|0)-(f[A>>2]|0)|0)/144|0)>>>0);u=c;return 1}if((S|0)==(T|0)){u=c;return 1}b=0;y=U;U=T;T=S;while(1){f[d>>2]=o;S=y+(b*144|0)+136|0;x=f[S>>2]|0;if(x>>>0<(f[y+(b*144|0)+140>>2]|0)>>>0){f[x>>2]=o;f[S>>2]=x+4;$=U;aa=T}else{Ng(y+(b*144|0)+132|0,d);$=f[A>>2]|0;aa=f[z>>2]|0}b=b+1|0;if(b>>>0>=((aa-$|0)/144|0)>>>0)break;else{y=$;U=$;T=aa}}u=c;return 1}function _b(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;d=u;u=u+16|0;e=d+12|0;g=d;h=d+8|0;i=d+4|0;j=a+8+(b*12|0)|0;k=a+8+(b*12|0)+4|0;f[k>>2]=f[j>>2];l=f[c>>2]|0;m=a+4|0;f[g>>2]=(l|0)==-1?-1:(l>>>0)/3|0;n=a+56|0;o=a+8+(b*12|0)+8|0;p=0;q=l;r=l;while(1){l=(p|0)==1;if(l){s=(q|0)==-1;do if(!s)if(!((q>>>0)%3|0)){t=q+2|0;break}else{t=q+-1|0;break}else t=-1;while(0);f[h>>2]=t;f[e>>2]=f[h>>2];if((af(a,e)|0)==-1){v=q;break}w=q+1|0;if(s){x=10;break}y=((w>>>0)%3|0|0)==0?q+-2|0:w;f[c>>2]=y;w=y+1|0;if((y|0)==-1){z=q;x=14;break}A=((w>>>0)%3|0|0)==0?y+-2|0:w;if((A|0)==-1){z=q;x=14;break}w=f[(f[(f[m>>2]|0)+12>>2]|0)+(A<<2)>>2]|0;A=w+1|0;if((w|0)==-1){z=q;x=14;break}y=((A>>>0)%3|0|0)==0?w+-2|0:A;f[c>>2]=y;if((y|0)==-1){v=q;break}A=(y>>>0)/3|0;f[g>>2]=A;B=y;C=A}else{B=r;C=f[g>>2]|0}A=(f[n>>2]|0)+(C>>>5<<2)|0;y=1<<(C&31);w=f[A>>2]|0;if(!(y&w)){a:do if(l){D=0;E=q;F=y;G=w;H=A;I=B;while(1){f[H>>2]=G|F;J=f[k>>2]|0;if((J|0)==(f[o>>2]|0))Ng(j,g);else{f[J>>2]=f[g>>2];f[k>>2]=J+4}J=D+1|0;if(!D){K=E;L=I}else{M=(I|0)==-1;do if(!(J&1))if(!M)if(!((I>>>0)%3|0)){N=I+2|0;O=I;break}else{N=I+-1|0;O=I;break}else{N=-1;O=I}else{P=I+1|0;if(M){N=-1;O=E}else{N=((P>>>0)%3|0|0)==0?I+-2|0:P;O=E}}while(0);f[c>>2]=N;K=O;L=N}f[i>>2]=L;f[e>>2]=f[i>>2];M=af(a,e)|0;f[c>>2]=M;if((M|0)==-1){Q=J;R=K;S=-1;break a}P=(M>>>0)/3|0;f[g>>2]=P;H=(f[n>>2]|0)+(P>>>5<<2)|0;F=1<<(P&31);G=f[H>>2]|0;if(F&G|0){Q=J;R=K;S=M;break}else{D=J;E=K;I=M}}}else{I=0;E=B;D=y;G=w;F=A;while(1){f[F>>2]=G|D;H=f[k>>2]|0;if((H|0)==(f[o>>2]|0))Ng(j,g);else{f[H>>2]=f[g>>2];f[k>>2]=H+4}H=I+1|0;if(!I)T=E;else{M=(E|0)==-1;do if(!(H&1))if(!M)if(!((E>>>0)%3|0)){U=E+2|0;break}else{U=E+-1|0;break}else U=-1;else{P=E+1|0;if(M)U=-1;else U=((P>>>0)%3|0|0)==0?E+-2|0:P}while(0);f[c>>2]=U;T=U}f[i>>2]=T;f[e>>2]=f[i>>2];M=af(a,e)|0;f[c>>2]=M;if((M|0)==-1){Q=H;R=q;S=-1;break a}J=(M>>>0)/3|0;f[g>>2]=J;F=(f[n>>2]|0)+(J>>>5<<2)|0;D=1<<(J&31);G=f[F>>2]|0;if(D&G|0){Q=H;R=q;S=M;break}else{I=H;E=M}}}while(0);if((Q&1|0)==0|l^1){V=R;W=S}else{A=(f[k>>2]|0)+-4|0;w=f[A>>2]|0;y=(f[n>>2]|0)+(w>>>5<<2)|0;f[y>>2]=f[y>>2]&~(1<<(w&31));f[k>>2]=A;V=R;W=S}}else{V=q;W=B}p=p+1|0;if(p>>>0>=2){v=V;break}else{q=V;r=W}}if((x|0)==10){f[c>>2]=-1;z=-1;x=14}if((x|0)==14){f[c>>2]=-1;v=z}f[a+44+(b<<2)>>2]=v;v=f[k>>2]|0;k=f[j>>2]|0;j=k;if((v|0)==(k|0)){u=d;return}b=f[n>>2]|0;n=v-k>>2;k=0;do{v=f[j+(k<<2)>>2]|0;a=b+(v>>>5<<2)|0;f[a>>2]=f[a>>2]&~(1<<(v&31));k=k+1|0}while(k>>>0<n>>>0);u=d;return}function $b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;e=u;u=u+672|0;g=e;i=e+656|0;j=e+4|0;k=c+8|0;l=k;m=f[l>>2]|0;n=f[l+4>>2]|0;l=c+16|0;o=l;p=f[o>>2]|0;q=vl(p|0,f[o+4>>2]|0,4,0)|0;o=H;if((n|0)<(o|0)|(n|0)==(o|0)&m>>>0<q>>>0){r=0;u=e;return r|0}q=(f[c>>2]|0)+p|0;p=h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24;b[a>>0]=p;b[a+1>>0]=p>>8;b[a+2>>0]=p>>16;b[a+3>>0]=p>>24;q=l;m=f[q>>2]|0;o=f[q+4>>2]|0;q=vl(m|0,o|0,4,0)|0;n=l;f[n>>2]=q;f[n+4>>2]=H;if(p>>>0>31){r=0;u=e;return r|0}p=k;n=f[p>>2]|0;s=f[p+4>>2]|0;p=vl(m|0,o|0,8,0)|0;o=H;if((s|0)<(o|0)|(s|0)==(o|0)&n>>>0<p>>>0){r=0;u=e;return r|0}p=a+4|0;n=(f[c>>2]|0)+q|0;q=h[n>>0]|h[n+1>>0]<<8|h[n+2>>0]<<16|h[n+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;q=l;p=f[q>>2]|0;n=f[q+4>>2]|0;q=vl(p|0,n|0,4,0)|0;o=l;f[o>>2]=q;f[o+4>>2]=H;o=a+12|0;s=k;m=f[s>>2]|0;t=f[s+4>>2]|0;s=vl(p|0,n|0,8,0)|0;n=H;if((t|0)<(n|0)|(t|0)==(n|0)&m>>>0<s>>>0){r=0;u=e;return r|0}s=(f[c>>2]|0)+q|0;q=h[s>>0]|h[s+1>>0]<<8|h[s+2>>0]<<16|h[s+3>>0]<<24;b[o>>0]=q;b[o+1>>0]=q>>8;b[o+2>>0]=q>>16;b[o+3>>0]=q>>24;s=l;m=f[s>>2]|0;n=f[s+4>>2]|0;s=vl(m|0,n|0,4,0)|0;t=l;f[t>>2]=s;f[t+4>>2]=H;t=a+16|0;a=k;k=f[a>>2]|0;p=f[a+4>>2]|0;a=vl(m|0,n|0,8,0)|0;n=H;if((p|0)<(n|0)|(p|0)==(n|0)&k>>>0<a>>>0){r=0;u=e;return r|0}a=(f[c>>2]|0)+s|0;s=h[a>>0]|h[a+1>>0]<<8|h[a+2>>0]<<16|h[a+3>>0]<<24;b[t>>0]=s;b[t+1>>0]=s>>8;b[t+2>>0]=s>>16;b[t+3>>0]=s>>24;a=l;k=vl(f[a>>2]|0,f[a+4>>2]|0,4,0)|0;a=l;f[a>>2]=k;f[a+4>>2]=H;if(s>>>0>6){f[g>>2]=s;kl(13491,g)|0;r=0;u=e;return r|0}f[i>>2]=d;a:do if(!q)v=17;else{Tg(d,q);switch(f[t>>2]|0){case 0:{ve(j,3);Kd(j,c,i)|0;Cf(j);v=17;break a;break}case 1:{ve(j,3);Jd(j,c,i)|0;Cf(j);v=17;break a;break}case 2:{we(j,3);Md(j,c,i)|0;Lf(j);v=17;break a;break}case 3:{we(j,3);Ld(j,c,i)|0;Lf(j);v=17;break a;break}case 4:{re(j,3);Id(j,c,i)|0;jg(j);v=17;break a;break}case 5:{re(j,3);Hd(j,c,i)|0;jg(j);v=17;break a;break}case 6:{re(j,3);Gd(j,c,i)|0;jg(j);v=17;break a;break}default:{w=0;break a}}}while(0);if((v|0)==17)w=(((f[d+4>>2]|0)-(f[d>>2]|0)|0)/12|0|0)==(f[o>>2]|0);r=w;u=e;return r|0}function ac(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,t=0,v=0,w=0,x=Ia,y=Ia,z=Ia,A=Ia,B=0,C=0,D=0,E=Ia,F=Ia,G=Ia,H=Ia,J=Ia,L=Ia,M=Ia,N=Ia,O=Ia,P=Ia,Q=Ia,R=0,S=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+48|0;o=f[c>>2]|0;c=o+1|0;do if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;if(!((o>>>0)%3|0)){q=o+2|0;r=p;break}else{q=o+-1|0;r=p;break}}else{q=-1;r=-1}while(0);o=f[(f[m>>2]|0)+28>>2]|0;m=f[o+(r<<2)>>2]|0;r=f[o+(q<<2)>>2]|0;q=f[a+52>>2]|0;o=f[q>>2]|0;c=(f[q+4>>2]|0)-o>>2;if(c>>>0<=m>>>0)$n(q);p=o;o=f[p+(m<<2)>>2]|0;if(c>>>0<=r>>>0)$n(q);q=f[p+(r<<2)>>2]|0;r=(o|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r){p=a+72|0;c=f[p>>2]|0;t=W(c,o)|0;v=p;w=c}else{if((e|0)>0){c=a+72|0;p=f[c>>2]|0;t=W(p,e+-1|0)|0;v=c;w=p;break}p=a+72|0;if((f[p>>2]|0)<=0){u=g;return}c=f[a+68>>2]|0;m=0;do{f[c+(m<<2)>>2]=0;m=m+1|0}while((m|0)<(f[p>>2]|0));u=g;return}while(0);if((w|0)<=0){u=g;return}w=f[a+68>>2]|0;r=0;do{f[w+(r<<2)>>2]=f[d+(r+t<<2)>>2];r=r+1|0}while((r|0)<(f[v>>2]|0));u=g;return}v=f[a+72>>2]|0;r=W(v,o)|0;x=_(f[d+(r<<2)>>2]|0);y=_(f[d+(r+1<<2)>>2]|0);r=W(v,q)|0;z=_(f[d+(r<<2)>>2]|0);A=_(f[d+(r+1<<2)>>2]|0);if(!(z!=x|A!=y)){r=f[a+68>>2]|0;f[r>>2]=~~z;f[r+4>>2]=~~A;u=g;return}r=a+64|0;d=f[(f[r>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;e=a+60|0;v=f[e>>2]|0;if(!(b[v+84>>0]|0))B=f[(f[v+68>>2]|0)+(d<<2)>>2]|0;else B=d;f[i>>2]=B;B=b[v+24>>0]|0;f[h>>2]=f[i>>2];ob(v,h,B,j)|0;B=f[(f[r>>2]|0)+(o<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;o=f[e>>2]|0;if(!(b[o+84>>0]|0))C=f[(f[o+68>>2]|0)+(B<<2)>>2]|0;else C=B;f[i>>2]=C;C=b[o+24>>0]|0;f[h>>2]=f[i>>2];ob(o,h,C,k)|0;C=f[(f[r>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[e>>2]|0;if(!(b[q+84>>0]|0))D=f[(f[q+68>>2]|0)+(C<<2)>>2]|0;else D=C;f[i>>2]=D;D=b[q+24>>0]|0;f[h>>2]=f[i>>2];ob(q,h,D,l)|0;E=_(n[l>>2]);F=_(n[k>>2]);G=_(E-F);E=_(n[l+4>>2]);H=_(n[k+4>>2]);J=_(E-H);E=_(n[l+8>>2]);L=_(n[k+8>>2]);M=_(E-L);E=_(_(n[j>>2])-F);F=_(_(n[j+4>>2])-H);H=_(_(n[j+8>>2])-L);L=_(_(_(_(G*G)+_(0.0))+_(J*J))+_(M*M));if(L>_(0.0)?1:(f[a+88>>2]|0)<258){N=_(_(_(_(_(G*E)+_(0.0))+_(J*F))+_(M*H))/L);O=_(E-_(G*N));G=_(F-_(J*N));J=_(H-_(M*N));P=N;Q=_(K(_(_(_(J*J)+_(_(G*G)+_(_(O*O)+_(0.0))))/L)))}else{P=_(0.0);Q=_(0.0)}L=_(z-x);z=_(A-y);A=_(_(L*P)+x);x=_(L*Q);L=_(_(z*P)+y);y=_(z*Q);j=a+80|0;k=(f[j>>2]|0)+-1|0;l=(1<<(k&31)&f[(f[a+76>>2]|0)+(k>>>5<<2)>>2]|0)==0;f[j>>2]=k;Q=_(-y);z=_(A+(l?y:Q));Q=_(-x);y=_(L+(l?Q:x));if(((n[s>>2]=z,f[s>>2]|0)&2147483647)>>>0>2139095040){l=f[a+68>>2]|0;f[l>>2]=-2147483648;R=l}else{l=~~+I(+(+z+.5));k=f[a+68>>2]|0;f[k>>2]=l;R=k}if(((n[s>>2]=y,f[s>>2]|0)&2147483647)>>>0>2139095040)S=-2147483648;else S=~~+I(+(+y+.5));f[R+4>>2]=S;u=g;return}function bc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,t=0,v=0,w=0,x=Ia,y=Ia,z=Ia,A=Ia,B=0,C=0,D=0,E=Ia,F=Ia,G=Ia,H=Ia,J=Ia,L=Ia,M=Ia,N=Ia,O=Ia,P=Ia,Q=Ia,R=0,S=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=f[c>>2]|0;c=m+1|0;if((m|0)!=-1){o=((c>>>0)%3|0|0)==0?m+-2|0:c;c=(((m>>>0)%3|0|0)==0?2:-1)+m|0;m=f[a+48>>2]|0;if((o|0)==-1)p=-1;else p=f[(f[m>>2]|0)+(o<<2)>>2]|0;if((c|0)==-1){q=-1;r=p}else{q=f[(f[m>>2]|0)+(c<<2)>>2]|0;r=p}}else{q=-1;r=-1}p=f[a+52>>2]|0;c=f[p>>2]|0;m=(f[p+4>>2]|0)-c>>2;if(m>>>0<=r>>>0)$n(p);o=c;c=f[o+(r<<2)>>2]|0;if(m>>>0<=q>>>0)$n(p);p=f[o+(q<<2)>>2]|0;q=(c|0)<(e|0);if(!(q&(p|0)<(e|0))){do if(q){o=a+72|0;m=f[o>>2]|0;t=W(m,c)|0;v=o;w=m}else{if((e|0)>0){m=a+72|0;o=f[m>>2]|0;t=W(o,e+-1|0)|0;v=m;w=o;break}o=a+72|0;if((f[o>>2]|0)<=0){u=g;return}m=f[a+68>>2]|0;r=0;do{f[m+(r<<2)>>2]=0;r=r+1|0}while((r|0)<(f[o>>2]|0));u=g;return}while(0);if((w|0)<=0){u=g;return}w=f[a+68>>2]|0;q=0;do{f[w+(q<<2)>>2]=f[d+(q+t<<2)>>2];q=q+1|0}while((q|0)<(f[v>>2]|0));u=g;return}v=f[a+72>>2]|0;q=W(v,c)|0;x=_(f[d+(q<<2)>>2]|0);y=_(f[d+(q+1<<2)>>2]|0);q=W(v,p)|0;z=_(f[d+(q<<2)>>2]|0);A=_(f[d+(q+1<<2)>>2]|0);if(!(z!=x|A!=y)){q=f[a+68>>2]|0;f[q>>2]=~~z;f[q+4>>2]=~~A;u=g;return}q=a+64|0;d=f[(f[q>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;e=a+60|0;v=f[e>>2]|0;if(!(b[v+84>>0]|0))B=f[(f[v+68>>2]|0)+(d<<2)>>2]|0;else B=d;f[i>>2]=B;B=b[v+24>>0]|0;f[h>>2]=f[i>>2];ob(v,h,B,j)|0;B=f[(f[q>>2]|0)+(c<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;c=f[e>>2]|0;if(!(b[c+84>>0]|0))C=f[(f[c+68>>2]|0)+(B<<2)>>2]|0;else C=B;f[i>>2]=C;C=b[c+24>>0]|0;f[h>>2]=f[i>>2];ob(c,h,C,k)|0;C=f[(f[q>>2]|0)+(p<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;p=f[e>>2]|0;if(!(b[p+84>>0]|0))D=f[(f[p+68>>2]|0)+(C<<2)>>2]|0;else D=C;f[i>>2]=D;D=b[p+24>>0]|0;f[h>>2]=f[i>>2];ob(p,h,D,l)|0;E=_(n[l>>2]);F=_(n[k>>2]);G=_(E-F);E=_(n[l+4>>2]);H=_(n[k+4>>2]);J=_(E-H);E=_(n[l+8>>2]);L=_(n[k+8>>2]);M=_(E-L);E=_(_(n[j>>2])-F);F=_(_(n[j+4>>2])-H);H=_(_(n[j+8>>2])-L);L=_(_(_(_(G*G)+_(0.0))+_(J*J))+_(M*M));if(L>_(0.0)?1:(f[a+88>>2]|0)<258){N=_(_(_(_(_(G*E)+_(0.0))+_(J*F))+_(M*H))/L);O=_(E-_(G*N));G=_(F-_(J*N));J=_(H-_(M*N));P=N;Q=_(K(_(_(_(J*J)+_(_(G*G)+_(_(O*O)+_(0.0))))/L)))}else{P=_(0.0);Q=_(0.0)}L=_(z-x);z=_(A-y);A=_(_(L*P)+x);x=_(L*Q);L=_(_(z*P)+y);y=_(z*Q);j=a+80|0;k=(f[j>>2]|0)+-1|0;l=(1<<(k&31)&f[(f[a+76>>2]|0)+(k>>>5<<2)>>2]|0)==0;f[j>>2]=k;Q=_(-y);z=_(A+(l?y:Q));Q=_(-x);y=_(L+(l?Q:x));if(((n[s>>2]=z,f[s>>2]|0)&2147483647)>>>0>2139095040){l=f[a+68>>2]|0;f[l>>2]=-2147483648;R=l}else{l=~~+I(+(+z+.5));k=f[a+68>>2]|0;f[k>>2]=l;R=k}if(((n[s>>2]=y,f[s>>2]|0)&2147483647)>>>0>2139095040)S=-2147483648;else S=~~+I(+(+y+.5));f[R+4>>2]=S;u=g;return}function cc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;b=u;u=u+32|0;c=b+4|0;d=b;e=a+16|0;g=f[e>>2]|0;if(g>>>0>340){f[e>>2]=g+-341;g=a+4|0;e=f[g>>2]|0;h=f[e>>2]|0;i=e+4|0;f[g>>2]=i;e=a+8|0;j=f[e>>2]|0;k=a+12|0;l=f[k>>2]|0;m=l;do if((j|0)==(l|0)){n=i;o=f[a>>2]|0;p=o;if(i>>>0>o>>>0){q=((n-p>>2)+1|0)/-2|0;r=i+(q<<2)|0;s=j-n|0;if(!s)t=r;else{Rj(r|0,i|0,s|0)|0;t=(f[g>>2]|0)+(q<<2)|0}q=r+(s>>2<<2)|0;f[e>>2]=q;f[g>>2]=t;v=q;break}q=m-p|0;p=(q|0)==0?1:q>>1;q=p>>>2;do if(p)if(p>>>0>1073741823){s=qa(8)|0;Dm(s,13552);f[s>>2]=4908;ta(s|0,1128,105)}else{w=wk(p<<2)|0;break}else w=0;while(0);s=w;r=w+(q<<2)|0;x=r;y=w+(p<<2)|0;if((i|0)==(j|0)){z=x;A=o}else{B=((j+-4-n|0)>>>2)+1|0;C=r;r=i;while(1){f[C>>2]=f[r>>2];r=r+4|0;if((r|0)==(j|0))break;else C=C+4|0}z=w+(B+q<<2)|0;A=f[a>>2]|0}f[a>>2]=s;f[g>>2]=x;f[e>>2]=z;f[k>>2]=y;if(!A)v=z;else{Ko(A);v=f[e>>2]|0}}else v=j;while(0);f[v>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}e=a+8|0;h=f[e>>2]|0;v=a+4|0;j=h-(f[v>>2]|0)>>2;A=a+12|0;z=f[A>>2]|0;k=z-(f[a>>2]|0)|0;if(j>>>0>=k>>2>>>0){g=(k|0)==0?1:k>>1;k=c+12|0;f[k>>2]=0;f[c+16>>2]=a+12;do if(g)if(g>>>0>1073741823){w=qa(8)|0;Dm(w,13552);f[w>>2]=4908;ta(w|0,1128,105)}else{D=wk(g<<2)|0;break}else D=0;while(0);f[c>>2]=D;w=D+(j<<2)|0;j=c+8|0;f[j>>2]=w;i=c+4|0;f[i>>2]=w;f[k>>2]=D+(g<<2);g=wk(4092)|0;f[d>>2]=g;Ke(c,d);d=f[e>>2]|0;g=f[v>>2]|0;if((d|0)==(g|0)){E=g;F=d}else{g=d;do{g=g+-4|0;ue(c,g);G=f[v>>2]|0}while((g|0)!=(G|0));E=G;F=f[e>>2]|0}G=E;g=f[a>>2]|0;f[a>>2]=f[c>>2];f[c>>2]=g;f[v>>2]=f[i>>2];f[i>>2]=G;f[e>>2]=f[j>>2];f[j>>2]=F;i=f[A>>2]|0;f[A>>2]=f[k>>2];f[k>>2]=i;i=F;if((E|0)!=(i|0))f[j>>2]=i+(~((i+-4-G|0)>>>2)<<2);if(g|0)Ko(g);u=b;return}if((z|0)!=(h|0)){h=wk(4092)|0;f[c>>2]=h;Ke(a,c);u=b;return}h=wk(4092)|0;f[c>>2]=h;ue(a,c);c=f[v>>2]|0;h=f[c>>2]|0;z=c+4|0;f[v>>2]=z;c=f[e>>2]|0;g=f[A>>2]|0;G=g;do if((c|0)==(g|0)){i=z;j=f[a>>2]|0;E=j;if(z>>>0>j>>>0){F=((i-E>>2)+1|0)/-2|0;k=z+(F<<2)|0;d=c-i|0;if(!d)H=k;else{Rj(k|0,z|0,d|0)|0;H=(f[v>>2]|0)+(F<<2)|0}F=k+(d>>2<<2)|0;f[e>>2]=F;f[v>>2]=H;I=F;break}F=G-E|0;E=(F|0)==0?1:F>>1;F=E>>>2;do if(E)if(E>>>0>1073741823){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{J=wk(E<<2)|0;break}else J=0;while(0);y=J;x=J+(F<<2)|0;s=x;q=J+(E<<2)|0;if((z|0)==(c|0)){K=s;L=j}else{B=((c+-4-i|0)>>>2)+1|0;d=x;x=z;while(1){f[d>>2]=f[x>>2];x=x+4|0;if((x|0)==(c|0))break;else d=d+4|0}K=J+(B+F<<2)|0;L=f[a>>2]|0}f[a>>2]=y;f[v>>2]=s;f[e>>2]=K;f[A>>2]=q;if(!L)I=K;else{Ko(L);I=f[e>>2]|0}}else I=c;while(0);f[I>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}function dc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=u;u=u+32|0;d=e+28|0;h=e+16|0;i=e+8|0;j=e;k=a+60|0;f[a+68>>2]=g;g=a+56|0;l=f[g>>2]|0;m=(f[l+4>>2]|0)-(f[l>>2]|0)|0;n=m>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;if((m|0)<=0){u=e;return 1}m=h+4|0;o=h+8|0;p=a+104|0;q=a+108|0;r=i+4|0;s=a+100|0;t=a+8|0;v=a+16|0;w=a+32|0;x=a+12|0;y=a+20|0;a=f[l>>2]|0;if((f[l+4>>2]|0)==(a|0)){z=l;$n(z)}l=0;A=a;while(1){f[j>>2]=f[A+(l<<2)>>2];f[d>>2]=f[j>>2];Ob(k,d,h);a=f[h>>2]|0;B=(a|0)>-1?a:0-a|0;C=f[m>>2]|0;D=(C|0)>-1?C:0-C|0;E=vl(D|0,((D|0)<0)<<31>>31|0,B|0,((B|0)<0)<<31>>31|0)|0;B=f[o>>2]|0;D=(B|0)>-1;F=D?B:0-B|0;B=vl(E|0,H|0,F|0,((F|0)<0)<<31>>31|0)|0;F=H;do if(!((B|0)==0&(F|0)==0)){E=f[p>>2]|0;G=((E|0)<0)<<31>>31;I=Bk(E|0,G|0,a|0,((a|0)<0)<<31>>31|0)|0;J=ni(I|0,H|0,B|0,F|0)|0;f[h>>2]=J;I=Bk(E|0,G|0,C|0,((C|0)<0)<<31>>31|0)|0;G=ni(I|0,H|0,B|0,F|0)|0;f[m>>2]=G;I=E-((J|0)>-1?J:0-J|0)-((G|0)>-1?G:0-G|0)|0;if(D){f[o>>2]=I;break}else{f[o>>2]=0-I;break}}else f[h>>2]=f[p>>2];while(0);D=pi(q)|0;F=f[h>>2]|0;if(D){D=0-F|0;B=0-(f[m>>2]|0)|0;C=0-(f[o>>2]|0)|0;f[h>>2]=D;f[m>>2]=B;f[o>>2]=C;K=D;L=B}else{K=F;L=f[m>>2]|0}do if((K|0)<=-1){if((L|0)<0){F=f[o>>2]|0;M=(F|0)>-1?F:0-F|0;N=F}else{F=f[o>>2]|0;M=(f[s>>2]|0)-((F|0)>-1?F:0-F|0)|0;N=F}if((N|0)<0){O=(L|0)>-1?L:0-L|0;P=M;break}else{O=(f[s>>2]|0)-((L|0)>-1?L:0-L|0)|0;P=M;break}}else{F=f[p>>2]|0;O=(f[o>>2]|0)+F|0;P=F+L|0}while(0);F=(P|0)==0;B=(O|0)==0;D=f[s>>2]|0;do if(O|P){C=(D|0)==(O|0);if(!(F&C)){a=(D|0)==(P|0);if(!(B&a)){if(F?(I=f[p>>2]|0,(I|0)<(O|0)):0){Q=0;R=(I<<1)-O|0;break}if(a?(a=f[p>>2]|0,(a|0)>(O|0)):0){Q=P;R=(a<<1)-O|0;break}if(C?(C=f[p>>2]|0,(C|0)>(P|0)):0){Q=(C<<1)-P|0;R=O;break}if(B){C=f[p>>2]|0;Q=(C|0)<(P|0)?(C<<1)-P|0:P;R=0}else{Q=P;R=O}}else{Q=P;R=P}}else{Q=O;R=O}}else{Q=D;R=D}while(0);f[i>>2]=Q;f[r>>2]=R;D=l<<1;B=b+(D<<2)|0;F=c+(D<<2)|0;if((f[t>>2]|0)>0){D=0;C=Q;while(1){a=f[v>>2]|0;do if((C|0)<=(a|0)){I=f[x>>2]|0;G=f[w>>2]|0;J=G+(D<<2)|0;if((C|0)<(I|0)){f[J>>2]=I;S=G;break}else{f[J>>2]=C;S=G;break}}else{G=f[w>>2]|0;f[G+(D<<2)>>2]=a;S=G}while(0);a=D+1|0;T=f[t>>2]|0;if((a|0)>=(T|0))break;D=a;C=f[i+(a<<2)>>2]|0}if((T|0)>0){C=0;do{D=(f[B+(C<<2)>>2]|0)+(f[S+(C<<2)>>2]|0)|0;a=F+(C<<2)|0;f[a>>2]=D;if((D|0)<=(f[v>>2]|0)){if((D|0)<(f[x>>2]|0)){U=(f[y>>2]|0)+D|0;V=51}}else{U=D-(f[y>>2]|0)|0;V=51}if((V|0)==51){V=0;f[a>>2]=U}C=C+1|0}while((C|0)<(f[t>>2]|0))}}l=l+1|0;if((l|0)>=(n|0)){V=4;break}C=f[g>>2]|0;A=f[C>>2]|0;if((f[C+4>>2]|0)-A>>2>>>0<=l>>>0){z=C;V=5;break}}if((V|0)==4){u=e;return 1}else if((V|0)==5)$n(z);return 0}function ec(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=u;u=u+32|0;d=e+28|0;h=e+16|0;i=e+8|0;j=e;k=a+60|0;f[a+68>>2]=g;g=a+56|0;l=f[g>>2]|0;m=(f[l+4>>2]|0)-(f[l>>2]|0)|0;n=m>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;if((m|0)<=0){u=e;return 1}m=h+4|0;o=h+8|0;p=a+104|0;q=a+108|0;r=i+4|0;s=a+100|0;t=a+8|0;v=a+16|0;w=a+32|0;x=a+12|0;y=a+20|0;a=f[l>>2]|0;if((f[l+4>>2]|0)==(a|0)){z=l;$n(z)}l=0;A=a;while(1){f[j>>2]=f[A+(l<<2)>>2];f[d>>2]=f[j>>2];Mb(k,d,h);a=f[h>>2]|0;B=(a|0)>-1?a:0-a|0;C=f[m>>2]|0;D=(C|0)>-1?C:0-C|0;E=vl(D|0,((D|0)<0)<<31>>31|0,B|0,((B|0)<0)<<31>>31|0)|0;B=f[o>>2]|0;D=(B|0)>-1;F=D?B:0-B|0;B=vl(E|0,H|0,F|0,((F|0)<0)<<31>>31|0)|0;F=H;do if(!((B|0)==0&(F|0)==0)){E=f[p>>2]|0;G=((E|0)<0)<<31>>31;I=Bk(E|0,G|0,a|0,((a|0)<0)<<31>>31|0)|0;J=ni(I|0,H|0,B|0,F|0)|0;f[h>>2]=J;I=Bk(E|0,G|0,C|0,((C|0)<0)<<31>>31|0)|0;G=ni(I|0,H|0,B|0,F|0)|0;f[m>>2]=G;I=E-((J|0)>-1?J:0-J|0)-((G|0)>-1?G:0-G|0)|0;if(D){f[o>>2]=I;break}else{f[o>>2]=0-I;break}}else f[h>>2]=f[p>>2];while(0);D=pi(q)|0;F=f[h>>2]|0;if(D){D=0-F|0;B=0-(f[m>>2]|0)|0;C=0-(f[o>>2]|0)|0;f[h>>2]=D;f[m>>2]=B;f[o>>2]=C;K=D;L=B}else{K=F;L=f[m>>2]|0}do if((K|0)<=-1){if((L|0)<0){F=f[o>>2]|0;M=(F|0)>-1?F:0-F|0;N=F}else{F=f[o>>2]|0;M=(f[s>>2]|0)-((F|0)>-1?F:0-F|0)|0;N=F}if((N|0)<0){O=(L|0)>-1?L:0-L|0;P=M;break}else{O=(f[s>>2]|0)-((L|0)>-1?L:0-L|0)|0;P=M;break}}else{F=f[p>>2]|0;O=(f[o>>2]|0)+F|0;P=F+L|0}while(0);F=(P|0)==0;B=(O|0)==0;D=f[s>>2]|0;do if(O|P){C=(D|0)==(O|0);if(!(F&C)){a=(D|0)==(P|0);if(!(B&a)){if(F?(I=f[p>>2]|0,(I|0)<(O|0)):0){Q=0;R=(I<<1)-O|0;break}if(a?(a=f[p>>2]|0,(a|0)>(O|0)):0){Q=P;R=(a<<1)-O|0;break}if(C?(C=f[p>>2]|0,(C|0)>(P|0)):0){Q=(C<<1)-P|0;R=O;break}if(B){C=f[p>>2]|0;Q=(C|0)<(P|0)?(C<<1)-P|0:P;R=0}else{Q=P;R=O}}else{Q=P;R=P}}else{Q=O;R=O}}else{Q=D;R=D}while(0);f[i>>2]=Q;f[r>>2]=R;D=l<<1;B=b+(D<<2)|0;F=c+(D<<2)|0;if((f[t>>2]|0)>0){D=0;C=Q;while(1){a=f[v>>2]|0;do if((C|0)<=(a|0)){I=f[x>>2]|0;G=f[w>>2]|0;J=G+(D<<2)|0;if((C|0)<(I|0)){f[J>>2]=I;S=G;break}else{f[J>>2]=C;S=G;break}}else{G=f[w>>2]|0;f[G+(D<<2)>>2]=a;S=G}while(0);a=D+1|0;T=f[t>>2]|0;if((a|0)>=(T|0))break;D=a;C=f[i+(a<<2)>>2]|0}if((T|0)>0){C=0;do{D=(f[B+(C<<2)>>2]|0)+(f[S+(C<<2)>>2]|0)|0;a=F+(C<<2)|0;f[a>>2]=D;if((D|0)<=(f[v>>2]|0)){if((D|0)<(f[x>>2]|0)){U=(f[y>>2]|0)+D|0;V=51}}else{U=D-(f[y>>2]|0)|0;V=51}if((V|0)==51){V=0;f[a>>2]=U}C=C+1|0}while((C|0)<(f[t>>2]|0))}}l=l+1|0;if((l|0)>=(n|0)){V=4;break}C=f[g>>2]|0;A=f[C>>2]|0;if((f[C+4>>2]|0)-A>>2>>>0<=l>>>0){z=C;V=5;break}}if((V|0)==4){u=e;return 1}else if((V|0)==5)$n(z);return 0}function fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=u;u=u+16|0;g=e;i=c+8|0;j=i;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,5,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){o=wk(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=29;p=o;q=13105;r=p+29|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+29>>0]=0;f[a>>2]=-2;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}o=(f[c>>2]|0)+n|0;b[d>>0]=b[o>>0]|0;b[d+1>>0]=b[o+1>>0]|0;b[d+2>>0]=b[o+2>>0]|0;b[d+3>>0]=b[o+3>>0]|0;b[d+4>>0]=b[o+4>>0]|0;o=j;n=vl(f[o>>2]|0,f[o+4>>2]|0,5,0)|0;o=H;k=j;f[k>>2]=n;f[k+4>>2]=o;if(Fi(d,13135,5)|0){k=wk(32)|0;f[g>>2]=k;f[g+8>>2]=-2147483616;f[g+4>>2]=17;p=k;q=13141;r=p+17|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[k+17>>0]=0;f[a>>2]=-1;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}k=i;m=f[k+4>>2]|0;if(!((m|0)>(o|0)|((m|0)==(o|0)?(f[k>>2]|0)>>>0>n>>>0:0))){k=wk(32)|0;f[g>>2]=k;f[g+8>>2]=-2147483616;f[g+4>>2]=29;p=k;q=13105;r=p+29|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[k+29>>0]=0;f[a>>2]=-2;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}b[d+5>>0]=b[(f[c>>2]|0)+n>>0]|0;n=j;k=vl(f[n>>2]|0,f[n+4>>2]|0,1,0)|0;n=H;o=j;f[o>>2]=k;f[o+4>>2]=n;o=i;m=f[o+4>>2]|0;if(!((m|0)>(n|0)|((m|0)==(n|0)?(f[o>>2]|0)>>>0>k>>>0:0))){o=wk(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=29;p=o;q=13105;r=p+29|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+29>>0]=0;f[a>>2]=-2;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}b[d+6>>0]=b[(f[c>>2]|0)+k>>0]|0;k=j;o=vl(f[k>>2]|0,f[k+4>>2]|0,1,0)|0;k=H;n=j;f[n>>2]=o;f[n+4>>2]=k;n=i;m=f[n+4>>2]|0;if(!((m|0)>(k|0)|((m|0)==(k|0)?(f[n>>2]|0)>>>0>o>>>0:0))){n=wk(32)|0;f[g>>2]=n;f[g+8>>2]=-2147483616;f[g+4>>2]=29;p=n;q=13105;r=p+29|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[n+29>>0]=0;f[a>>2]=-2;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}b[d+7>>0]=b[(f[c>>2]|0)+o>>0]|0;o=j;n=vl(f[o>>2]|0,f[o+4>>2]|0,1,0)|0;o=H;k=j;f[k>>2]=n;f[k+4>>2]=o;k=i;m=f[k+4>>2]|0;if(!((m|0)>(o|0)|((m|0)==(o|0)?(f[k>>2]|0)>>>0>n>>>0:0))){k=wk(32)|0;f[g>>2]=k;f[g+8>>2]=-2147483616;f[g+4>>2]=29;p=k;q=13105;r=p+29|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[k+29>>0]=0;f[a>>2]=-2;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}b[d+8>>0]=b[(f[c>>2]|0)+n>>0]|0;n=j;k=f[n>>2]|0;o=f[n+4>>2]|0;n=vl(k|0,o|0,1,0)|0;m=j;f[m>>2]=n;f[m+4>>2]=H;m=i;i=f[m>>2]|0;l=f[m+4>>2]|0;m=vl(k|0,o|0,3,0)|0;o=H;if(!((l|0)<(o|0)|(l|0)==(o|0)&i>>>0<m>>>0)){m=d+10|0;d=(f[c>>2]|0)+n|0;n=h[d>>0]|h[d+1>>0]<<8;b[m>>0]=n;b[m+1>>0]=n>>8;n=j;m=vl(f[n>>2]|0,f[n+4>>2]|0,2,0)|0;n=j;f[n>>2]=m;f[n+4>>2]=H;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}n=wk(32)|0;f[g>>2]=n;f[g+8>>2]=-2147483616;f[g+4>>2]=29;p=n;q=13105;r=p+29|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[n+29>>0]=0;f[a>>2]=-2;Yi(a+4|0,g);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=e;return}function gc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;c=u;u=u+16|0;d=c;e=f[b>>2]|0;b=a+8|0;g=e+1|0;if((e|0)!=-1){h=((g>>>0)%3|0|0)==0?e+-2|0:g;g=(e>>>0)/3|0;i=e+((e-(g*3|0)|0)==0?2:-1)|0;j=a+216|0;k=a+220|0;l=a+368|0;m=f[(f[(f[b>>2]|0)+12>>2]|0)+(e<<2)>>2]|0;if((m|0)!=-1)if(((m>>>0)/3|0)>>>0>=g>>>0?(f[k>>2]|0)!=(f[j>>2]|0):0){m=0;do{if(pi((f[l>>2]|0)+(m<<4)|0)|0){n=f[j>>2]|0;f[d>>2]=e;o=n+(m*144|0)+136|0;p=f[o>>2]|0;if(p>>>0<(f[n+(m*144|0)+140>>2]|0)>>>0){f[p>>2]=e;f[o>>2]=p+4}else Ng(n+(m*144|0)+132|0,d)}m=m+1|0}while(m>>>0<(((f[k>>2]|0)-(f[j>>2]|0)|0)/144|0)>>>0);q=g;r=i;s=d;t=d;v=h;w=k;x=j;y=l;z=j}else{q=g;r=i;s=d;t=d;v=h;w=k;x=j;y=l;z=j}else{A=g;B=d;C=l;D=d;E=j;F=i;G=h;H=k;I=j;J=4}}else{j=a+216|0;A=-1;B=d;C=a+368|0;D=d;E=j;F=-1;G=-1;H=a+220|0;I=j;J=4}if((J|0)==4){j=f[H>>2]|0;a=f[I>>2]|0;if((j|0)==(a|0)){q=A;r=F;s=B;t=D;v=G;w=H;x=I;y=C;z=E}else{k=0;h=j;j=a;while(1){a=j;f[d>>2]=e;i=a+(k*144|0)+136|0;l=f[i>>2]|0;if(l>>>0<(f[a+(k*144|0)+140>>2]|0)>>>0){f[l>>2]=e;f[i>>2]=l+4;K=j;L=h}else{Ng(a+(k*144|0)+132|0,d);K=f[I>>2]|0;L=f[H>>2]|0}k=k+1|0;if(k>>>0>=((L-K|0)/144|0)>>>0){q=A;r=F;s=B;t=D;v=G;w=H;x=I;y=C;z=E;break}else{h=L;j=K}}}}if((v|0)!=-1?(K=f[(f[(f[b>>2]|0)+12>>2]|0)+(v<<2)>>2]|0,(K|0)!=-1):0){if(((K>>>0)/3|0)>>>0>=q>>>0?(f[w>>2]|0)!=(f[x>>2]|0):0){K=0;do{if(pi((f[y>>2]|0)+(K<<4)|0)|0){j=f[z>>2]|0;f[d>>2]=v;L=j+(K*144|0)+136|0;h=f[L>>2]|0;if(h>>>0<(f[j+(K*144|0)+140>>2]|0)>>>0){f[h>>2]=v;f[L>>2]=h+4}else Ng(j+(K*144|0)+132|0,d)}K=K+1|0}while(K>>>0<(((f[w>>2]|0)-(f[x>>2]|0)|0)/144|0)>>>0)}}else J=30;if((J|0)==30?(J=f[w>>2]|0,K=f[x>>2]|0,(J|0)!=(K|0)):0){j=0;h=K;K=J;while(1){J=h;f[d>>2]=v;L=J+(j*144|0)+136|0;E=f[L>>2]|0;if(E>>>0<(f[J+(j*144|0)+140>>2]|0)>>>0){f[E>>2]=v;f[L>>2]=E+4;M=h;N=K}else{Ng(J+(j*144|0)+132|0,d);M=f[x>>2]|0;N=f[w>>2]|0}j=j+1|0;if(j>>>0>=((N-M|0)/144|0)>>>0)break;else{h=M;K=N}}}if((r|0)!=-1?(N=f[(f[(f[b>>2]|0)+12>>2]|0)+(r<<2)>>2]|0,(N|0)!=-1):0){if(((N>>>0)/3|0)>>>0<q>>>0){u=c;return 1}if((f[w>>2]|0)==(f[x>>2]|0)){u=c;return 1}q=0;do{if(pi((f[y>>2]|0)+(q<<4)|0)|0){N=f[z>>2]|0;f[d>>2]=r;b=N+(q*144|0)+136|0;K=f[b>>2]|0;if(K>>>0<(f[N+(q*144|0)+140>>2]|0)>>>0){f[K>>2]=r;f[b>>2]=K+4}else Ng(N+(q*144|0)+132|0,d)}q=q+1|0}while(q>>>0<(((f[w>>2]|0)-(f[x>>2]|0)|0)/144|0)>>>0);u=c;return 1}q=f[w>>2]|0;z=f[x>>2]|0;if((q|0)==(z|0)){u=c;return 1}y=0;N=z;z=q;while(1){q=N;f[d>>2]=r;K=q+(y*144|0)+136|0;b=f[K>>2]|0;if(b>>>0<(f[q+(y*144|0)+140>>2]|0)>>>0){f[b>>2]=r;f[K>>2]=b+4;O=N;P=z}else{Ng(q+(y*144|0)+132|0,d);O=f[x>>2]|0;P=f[w>>2]|0}y=y+1|0;if(y>>>0>=((P-O|0)/144|0)>>>0)break;else{N=O;z=P}}u=c;return 1}function hc(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;switch(c|0){case 1:{c=wk(60)|0;f[c>>2]=1536;f[c+4>>2]=d;b=c+8|0;f[b>>2]=f[e>>2];f[b+4>>2]=f[e+4>>2];f[b+8>>2]=f[e+8>>2];f[b+12>>2]=f[e+12>>2];f[b+16>>2]=f[e+16>>2];f[b+20>>2]=f[e+20>>2];b=c+32|0;f[b>>2]=0;i=c+36|0;f[i>>2]=0;j=c+40|0;f[j>>2]=0;k=f[e+24>>2]|0;l=(f[e+28>>2]|0)-k|0;m=l>>2;if(l|0){if(m>>>0>1073741823)$n(b);n=wk(l)|0;f[i>>2]=n;f[b>>2]=n;f[j>>2]=n+(m<<2);if((l|0)>0){Bf(n|0,k|0,l|0)|0;f[i>>2]=n+(l>>>2<<2)}}l=c+44|0;f[l>>2]=f[g>>2];f[l+4>>2]=f[g+4>>2];f[l+8>>2]=f[g+8>>2];f[l+12>>2]=f[g+12>>2];f[c>>2]=2096;o=c;f[a>>2]=o;return}case 2:{c=wk(60)|0;f[c>>2]=1536;f[c+4>>2]=d;l=c+8|0;f[l>>2]=f[e>>2];f[l+4>>2]=f[e+4>>2];f[l+8>>2]=f[e+8>>2];f[l+12>>2]=f[e+12>>2];f[l+16>>2]=f[e+16>>2];f[l+20>>2]=f[e+20>>2];l=c+32|0;f[l>>2]=0;n=c+36|0;f[n>>2]=0;i=c+40|0;f[i>>2]=0;k=f[e+24>>2]|0;m=(f[e+28>>2]|0)-k|0;j=m>>2;if(m|0){if(j>>>0>1073741823)$n(l);b=wk(m)|0;f[n>>2]=b;f[l>>2]=b;f[i>>2]=b+(j<<2);if((m|0)>0){Bf(b|0,k|0,m|0)|0;f[n>>2]=b+(m>>>2<<2)}}m=c+44|0;f[m>>2]=f[g>>2];f[m+4>>2]=f[g+4>>2];f[m+8>>2]=f[g+8>>2];f[m+12>>2]=f[g+12>>2];f[c>>2]=2152;o=c;f[a>>2]=o;return}case 4:{c=wk(112)|0;f[c>>2]=1536;f[c+4>>2]=d;m=c+8|0;f[m>>2]=f[e>>2];f[m+4>>2]=f[e+4>>2];f[m+8>>2]=f[e+8>>2];f[m+12>>2]=f[e+12>>2];f[m+16>>2]=f[e+16>>2];f[m+20>>2]=f[e+20>>2];m=c+32|0;f[m>>2]=0;b=c+36|0;f[b>>2]=0;n=c+40|0;f[n>>2]=0;k=f[e+24>>2]|0;j=(f[e+28>>2]|0)-k|0;i=j>>2;if(j|0){if(i>>>0>1073741823)$n(m);l=wk(j)|0;f[b>>2]=l;f[m>>2]=l;f[n>>2]=l+(i<<2);if((j|0)>0){Bf(l|0,k|0,j|0)|0;f[b>>2]=l+(j>>>2<<2)}}j=c+44|0;f[j>>2]=f[g>>2];f[j+4>>2]=f[g+4>>2];f[j+8>>2]=f[g+8>>2];f[j+12>>2]=f[g+12>>2];f[c>>2]=2208;j=c+60|0;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));o=c;f[a>>2]=o;return}case 3:{c=wk(92)|0;j=h&65535;f[c>>2]=1536;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];h=c+32|0;f[h>>2]=0;l=c+36|0;f[l>>2]=0;b=c+40|0;f[b>>2]=0;k=f[e+24>>2]|0;i=(f[e+28>>2]|0)-k|0;n=i>>2;if(i|0){if(n>>>0>1073741823)$n(h);m=wk(i)|0;f[l>>2]=m;f[h>>2]=m;f[b>>2]=m+(n<<2);if((i|0)>0){Bf(m|0,k|0,i|0)|0;f[l>>2]=m+(i>>>2<<2)}}i=c+44|0;f[i>>2]=f[g>>2];f[i+4>>2]=f[g+4>>2];f[i+8>>2]=f[g+8>>2];f[i+12>>2]=f[g+12>>2];f[c>>2]=2264;i=c+60|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;f[i+24>>2]=0;f[c+88>>2]=j;o=c;f[a>>2]=o;return}case 5:{c=wk(104)|0;tf(c,d,e,g);o=c;f[a>>2]=o;return}case 6:{c=wk(124)|0;Ze(c,d,e,g);o=c;f[a>>2]=o;return}default:{o=0;f[a>>2]=o;return}}}function ic(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;switch(c|0){case 1:{c=wk(60)|0;f[c>>2]=1536;f[c+4>>2]=d;b=c+8|0;f[b>>2]=f[e>>2];f[b+4>>2]=f[e+4>>2];f[b+8>>2]=f[e+8>>2];f[b+12>>2]=f[e+12>>2];f[b+16>>2]=f[e+16>>2];f[b+20>>2]=f[e+20>>2];b=c+32|0;f[b>>2]=0;i=c+36|0;f[i>>2]=0;j=c+40|0;f[j>>2]=0;k=f[e+24>>2]|0;l=(f[e+28>>2]|0)-k|0;m=l>>2;if(l|0){if(m>>>0>1073741823)$n(b);n=wk(l)|0;f[i>>2]=n;f[b>>2]=n;f[j>>2]=n+(m<<2);if((l|0)>0){Bf(n|0,k|0,l|0)|0;f[i>>2]=n+(l>>>2<<2)}}l=c+44|0;f[l>>2]=f[g>>2];f[l+4>>2]=f[g+4>>2];f[l+8>>2]=f[g+8>>2];f[l+12>>2]=f[g+12>>2];f[c>>2]=1648;o=c;f[a>>2]=o;return}case 2:{c=wk(60)|0;f[c>>2]=1536;f[c+4>>2]=d;l=c+8|0;f[l>>2]=f[e>>2];f[l+4>>2]=f[e+4>>2];f[l+8>>2]=f[e+8>>2];f[l+12>>2]=f[e+12>>2];f[l+16>>2]=f[e+16>>2];f[l+20>>2]=f[e+20>>2];l=c+32|0;f[l>>2]=0;n=c+36|0;f[n>>2]=0;i=c+40|0;f[i>>2]=0;k=f[e+24>>2]|0;m=(f[e+28>>2]|0)-k|0;j=m>>2;if(m|0){if(j>>>0>1073741823)$n(l);b=wk(m)|0;f[n>>2]=b;f[l>>2]=b;f[i>>2]=b+(j<<2);if((m|0)>0){Bf(b|0,k|0,m|0)|0;f[n>>2]=b+(m>>>2<<2)}}m=c+44|0;f[m>>2]=f[g>>2];f[m+4>>2]=f[g+4>>2];f[m+8>>2]=f[g+8>>2];f[m+12>>2]=f[g+12>>2];f[c>>2]=1704;o=c;f[a>>2]=o;return}case 4:{c=wk(112)|0;f[c>>2]=1536;f[c+4>>2]=d;m=c+8|0;f[m>>2]=f[e>>2];f[m+4>>2]=f[e+4>>2];f[m+8>>2]=f[e+8>>2];f[m+12>>2]=f[e+12>>2];f[m+16>>2]=f[e+16>>2];f[m+20>>2]=f[e+20>>2];m=c+32|0;f[m>>2]=0;b=c+36|0;f[b>>2]=0;n=c+40|0;f[n>>2]=0;k=f[e+24>>2]|0;j=(f[e+28>>2]|0)-k|0;i=j>>2;if(j|0){if(i>>>0>1073741823)$n(m);l=wk(j)|0;f[b>>2]=l;f[m>>2]=l;f[n>>2]=l+(i<<2);if((j|0)>0){Bf(l|0,k|0,j|0)|0;f[b>>2]=l+(j>>>2<<2)}}j=c+44|0;f[j>>2]=f[g>>2];f[j+4>>2]=f[g+4>>2];f[j+8>>2]=f[g+8>>2];f[j+12>>2]=f[g+12>>2];f[c>>2]=1760;j=c+60|0;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));o=c;f[a>>2]=o;return}case 3:{c=wk(92)|0;j=h&65535;f[c>>2]=1536;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];h=c+32|0;f[h>>2]=0;l=c+36|0;f[l>>2]=0;b=c+40|0;f[b>>2]=0;k=f[e+24>>2]|0;i=(f[e+28>>2]|0)-k|0;n=i>>2;if(i|0){if(n>>>0>1073741823)$n(h);m=wk(i)|0;f[l>>2]=m;f[h>>2]=m;f[b>>2]=m+(n<<2);if((i|0)>0){Bf(m|0,k|0,i|0)|0;f[l>>2]=m+(i>>>2<<2)}}i=c+44|0;f[i>>2]=f[g>>2];f[i+4>>2]=f[g+4>>2];f[i+8>>2]=f[g+8>>2];f[i+12>>2]=f[g+12>>2];f[c>>2]=1816;i=c+60|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;f[i+24>>2]=0;f[c+88>>2]=j;o=c;f[a>>2]=o;return}case 5:{c=wk(104)|0;uf(c,d,e,g);o=c;f[a>>2]=o;return}case 6:{c=wk(124)|0;_e(c,d,e,g);o=c;f[a>>2]=o;return}default:{o=0;f[a>>2]=o;return}}}function jc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;e=u;u=u+16|0;g=e+8|0;h=e+4|0;i=e;j=a+64|0;k=f[j>>2]|0;if((f[k+28>>2]|0)==(f[k+24>>2]|0)){u=e;return}l=c+96|0;c=a+52|0;m=d+84|0;n=d+68|0;d=a+56|0;o=a+60|0;p=a+12|0;q=a+28|0;r=a+40|0;s=a+44|0;t=a+48|0;v=0;w=0;x=k;while(1){k=f[(f[x+24>>2]|0)+(w<<2)>>2]|0;if((k|0)==-1){y=v;z=x}else{A=v+1|0;B=(k|0)/3|0;C=f[(f[l>>2]|0)+(B*12|0)+(k-(B*3|0)<<2)>>2]|0;if(!(b[m>>0]|0))D=f[(f[n>>2]|0)+(C<<2)>>2]|0;else D=C;f[g>>2]=D;C=f[d>>2]|0;if(C>>>0<(f[o>>2]|0)>>>0){f[C>>2]=D;f[d>>2]=C+4}else Ng(c,g);f[g>>2]=k;f[h>>2]=0;a:do if(!(f[(f[p>>2]|0)+(w>>>5<<2)>>2]&1<<(w&31)))E=k;else{C=k+1|0;B=((C>>>0)%3|0|0)==0?k+-2|0:C;if(((B|0)!=-1?(f[(f[a>>2]|0)+(B>>>5<<2)>>2]&1<<(B&31)|0)==0:0)?(C=f[(f[(f[j>>2]|0)+12>>2]|0)+(B<<2)>>2]|0,B=C+1|0,(C|0)!=-1):0){F=((B>>>0)%3|0|0)==0?C+-2|0:B;f[h>>2]=F;if((F|0)==-1){E=k;break}B=F;while(1){f[g>>2]=B;F=B+1|0;C=((F>>>0)%3|0|0)==0?B+-2|0:F;if((C|0)==-1)break;if(f[(f[a>>2]|0)+(C>>>5<<2)>>2]&1<<(C&31)|0)break;F=f[(f[(f[j>>2]|0)+12>>2]|0)+(C<<2)>>2]|0;C=F+1|0;if((F|0)==-1)break;G=((C>>>0)%3|0|0)==0?F+-2|0:C;f[h>>2]=G;if((G|0)==-1){E=B;break a}else B=G}f[h>>2]=-1;E=B;break}f[h>>2]=-1;E=k}while(0);f[(f[q>>2]|0)+(E<<2)>>2]=v;k=f[s>>2]|0;if((k|0)==(f[t>>2]|0))Ng(r,g);else{f[k>>2]=f[g>>2];f[s>>2]=k+4}k=f[j>>2]|0;G=f[g>>2]|0;b:do if(((G|0)!=-1?(C=(((G>>>0)%3|0|0)==0?2:-1)+G|0,(C|0)!=-1):0)?(F=f[(f[k+12>>2]|0)+(C<<2)>>2]|0,(F|0)!=-1):0){C=F+(((F>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=C;if((C|0)!=-1&(C|0)!=(G|0)){F=A;H=v;I=C;while(1){C=I+1|0;J=((C>>>0)%3|0|0)==0?I+-2|0:C;do if(f[(f[a>>2]|0)+(J>>>5<<2)>>2]&1<<(J&31)){C=F+1|0;K=(I|0)/3|0;L=f[(f[l>>2]|0)+(K*12|0)+(I-(K*3|0)<<2)>>2]|0;if(!(b[m>>0]|0))M=f[(f[n>>2]|0)+(L<<2)>>2]|0;else M=L;f[i>>2]=M;L=f[d>>2]|0;if(L>>>0<(f[o>>2]|0)>>>0){f[L>>2]=M;f[d>>2]=L+4}else Ng(c,i);L=f[s>>2]|0;if((L|0)==(f[t>>2]|0)){Ng(r,h);N=C;O=F;break}else{f[L>>2]=f[h>>2];f[s>>2]=L+4;N=C;O=F;break}}else{N=F;O=H}while(0);f[(f[q>>2]|0)+(f[h>>2]<<2)>>2]=O;P=f[j>>2]|0;J=f[h>>2]|0;if((J|0)==-1)break;C=(((J>>>0)%3|0|0)==0?2:-1)+J|0;if((C|0)==-1)break;J=f[(f[P+12>>2]|0)+(C<<2)>>2]|0;if((J|0)==-1)break;I=J+(((J>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=I;if(!((I|0)!=-1?(I|0)!=(f[g>>2]|0):0)){Q=N;R=P;break b}else{F=N;H=O}}f[h>>2]=-1;Q=N;R=P}else{Q=A;R=k}}else S=30;while(0);if((S|0)==30){S=0;f[h>>2]=-1;Q=A;R=k}y=Q;z=R}w=w+1|0;if(w>>>0>=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2>>>0)break;else{v=y;x=z}}u=e;return}function kc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0;d=u;u=u+80|0;e=d+76|0;g=d;i=d+72|0;j=d+64|0;k=d+68|0;l=a+28|0;do if(((h[(f[l>>2]|0)+36>>0]|0)<<8&65535)<512){m=c+8|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=c+16|0;p=m;q=f[p>>2]|0;r=vl(q|0,f[p+4>>2]|0,4,0)|0;p=H;if((o|0)<(p|0)|(o|0)==(p|0)&n>>>0<r>>>0){s=0;u=d;return s|0}else{n=(f[c>>2]|0)+q|0;q=h[n>>0]|h[n+1>>0]<<8|h[n+2>>0]<<16|h[n+3>>0]<<24;f[e>>2]=q;n=m;f[n>>2]=r;f[n+4>>2]=p;t=q;break}}else if(zh(e,c)|0){t=f[e>>2]|0;break}else{s=0;u=d;return s|0}while(0);if(!t){s=0;u=d;return s|0}q=a+4|0;p=a+8|0;n=f[q>>2]|0;r=(f[p>>2]|0)-n>>2;if(t>>>0>r>>>0){Eg(q,t-r|0);if(!(f[e>>2]|0)){s=1;u=d;return s|0}}else if(t>>>0<r>>>0)f[p>>2]=n+(t<<2);t=f[a+32>>2]|0;n=c+8|0;p=c+16|0;r=g+60|0;m=t+8|0;o=a+16|0;v=a+20|0;a=0;while(1){w=n;x=f[w>>2]|0;y=f[w+4>>2]|0;w=p;z=f[w>>2]|0;A=f[w+4>>2]|0;if(!((y|0)>(A|0)|(y|0)==(A|0)&x>>>0>z>>>0)){s=0;B=41;break}w=f[c>>2]|0;C=b[w+z>>0]|0;D=vl(z|0,A|0,1,0)|0;E=H;F=p;f[F>>2]=D;f[F+4>>2]=E;if(!((y|0)>(E|0)|(y|0)==(E|0)&x>>>0>D>>>0)){s=0;B=41;break}E=b[w+D>>0]|0;D=vl(z|0,A|0,2,0)|0;F=H;G=p;f[G>>2]=D;f[G+4>>2]=F;if(!((y|0)>(F|0)|(y|0)==(F|0)&x>>>0>D>>>0)){s=0;B=41;break}F=b[w+D>>0]|0;D=vl(z|0,A|0,3,0)|0;G=H;I=p;f[I>>2]=D;f[I+4>>2]=G;if(!((y|0)>(G|0)|(y|0)==(G|0)&x>>>0>D>>>0)){s=0;B=41;break}x=b[w+D>>0]|0;D=vl(z|0,A|0,4,0)|0;A=p;f[A>>2]=D;f[A+4>>2]=H;A=E&255;if((E+-1&255)>10){s=0;B=41;break}oj(g);E=W(Bj(A)|0,F&255)|0;Ih(g,C&255,0,F,A,x<<24>>24!=0,E,((E|0)<0)<<31>>31,0,0);E=f[l>>2]|0;if((((h[E+36>>0]|0)<<8|(h[E+37>>0]|0))&65535)<259){E=n;x=f[E>>2]|0;A=f[E+4>>2]|0;E=p;F=f[E>>2]|0;C=vl(F|0,f[E+4>>2]|0,2,0)|0;E=H;if((A|0)<(E|0)|(A|0)==(E|0)&x>>>0<C>>>0){B=39;break}x=(f[c>>2]|0)+F|0;F=h[x>>0]|h[x+1>>0]<<8;x=p;f[x>>2]=C;f[x+4>>2]=E;E=F&65535;f[i>>2]=E;J=E}else{zh(i,c)|0;J=f[i>>2]|0}f[r>>2]=J;E=wk(96)|0;$i(E,g);f[j>>2]=E;E=ig(t,j)|0;F=f[j>>2]|0;f[j>>2]=0;if(F|0){x=F+88|0;C=f[x>>2]|0;f[x>>2]=0;if(C|0){x=f[C+8>>2]|0;if(x|0){f[C+12>>2]=x;Ko(x)}Ko(C)}C=f[F+68>>2]|0;if(C|0){f[F+72>>2]=C;Ko(C)}C=F+64|0;x=f[C>>2]|0;f[C>>2]=0;if(x|0){C=f[x>>2]|0;if(C|0){f[x+4>>2]=C;Ko(C)}Ko(x)}Ko(F)}f[(f[(f[m>>2]|0)+(E<<2)>>2]|0)+60>>2]=f[i>>2];f[(f[q>>2]|0)+(a<<2)>>2]=E;F=f[o>>2]|0;x=(f[v>>2]|0)-F>>2;C=F;if((E|0)<(x|0))K=C;else{F=E+1|0;f[k>>2]=-1;if(F>>>0<=x>>>0)if(F>>>0<x>>>0){f[v>>2]=C+(F<<2);L=C}else L=C;else{Of(o,F-x|0,k);L=f[o>>2]|0}K=L}f[K+(E<<2)>>2]=a;a=a+1|0;if(a>>>0>=(f[e>>2]|0)>>>0){s=1;B=41;break}}if((B|0)==39){s=0;u=d;return s|0}else if((B|0)==41){u=d;return s|0}return 0}function lc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+48|0;d=e+32|0;h=e+24|0;i=e+16|0;j=e;k=e+12|0;l=a+8|0;m=f[l>>2]|0;if((m+-2|0)>>>0<=28){f[a+72>>2]=m;n=1<<m;f[a+76>>2]=n+-1;m=n+-2|0;f[a+80>>2]=m;f[a+84>>2]=(m|0)/2|0}m=a+40|0;f[a+48>>2]=g;g=a+36|0;n=f[g>>2]|0;o=(f[n+4>>2]|0)-(f[n>>2]|0)|0;p=o>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;if((o|0)<=0){u=e;return 1}o=j+4|0;q=j+8|0;r=a+84|0;s=a+88|0;t=a+80|0;a=h+4|0;v=i+4|0;w=d+4|0;x=f[n>>2]|0;if((f[n+4>>2]|0)==(x|0)){y=n;$n(y)}n=0;z=x;while(1){f[k>>2]=f[z+(n<<2)>>2];f[d>>2]=f[k>>2];Ob(m,d,j);x=f[j>>2]|0;A=(x|0)>-1?x:0-x|0;B=f[o>>2]|0;C=(B|0)>-1?B:0-B|0;D=vl(C|0,((C|0)<0)<<31>>31|0,A|0,((A|0)<0)<<31>>31|0)|0;A=f[q>>2]|0;C=(A|0)>-1;E=C?A:0-A|0;A=vl(D|0,H|0,E|0,((E|0)<0)<<31>>31|0)|0;E=H;do if(!((A|0)==0&(E|0)==0)){D=f[r>>2]|0;F=((D|0)<0)<<31>>31;G=Bk(D|0,F|0,x|0,((x|0)<0)<<31>>31|0)|0;I=ni(G|0,H|0,A|0,E|0)|0;f[j>>2]=I;G=Bk(D|0,F|0,B|0,((B|0)<0)<<31>>31|0)|0;F=ni(G|0,H|0,A|0,E|0)|0;f[o>>2]=F;G=D-((I|0)>-1?I:0-I|0)-((F|0)>-1?F:0-F|0)|0;if(C){f[q>>2]=G;break}else{f[q>>2]=0-G;break}}else f[j>>2]=f[r>>2];while(0);C=pi(s)|0;E=f[j>>2]|0;if(C){C=0-E|0;A=0-(f[o>>2]|0)|0;B=0-(f[q>>2]|0)|0;f[j>>2]=C;f[o>>2]=A;f[q>>2]=B;J=C;K=A}else{J=E;K=f[o>>2]|0}do if((J|0)<=-1){if((K|0)<0){E=f[q>>2]|0;L=(E|0)>-1?E:0-E|0;M=E}else{E=f[q>>2]|0;L=(f[t>>2]|0)-((E|0)>-1?E:0-E|0)|0;M=E}if((M|0)<0){N=(K|0)>-1?K:0-K|0;O=L;break}else{N=(f[t>>2]|0)-((K|0)>-1?K:0-K|0)|0;O=L;break}}else{E=f[r>>2]|0;N=(f[q>>2]|0)+E|0;O=E+K|0}while(0);E=(O|0)==0;A=(N|0)==0;C=f[t>>2]|0;do if(N|O){B=(C|0)==(N|0);if(!(E&B)){x=(C|0)==(O|0);if(!(A&x)){if(E?(G=f[r>>2]|0,(G|0)<(N|0)):0){P=0;Q=(G<<1)-N|0;break}if(x?(x=f[r>>2]|0,(x|0)>(N|0)):0){P=O;Q=(x<<1)-N|0;break}if(B?(B=f[r>>2]|0,(B|0)>(O|0)):0){P=(B<<1)-O|0;Q=N;break}if(A){B=f[r>>2]|0;P=(B|0)<(O|0)?(B<<1)-O|0:O;Q=0}else{P=O;Q=N}}else{P=O;Q=O}}else{P=N;Q=N}}else{P=C;Q=C}while(0);C=n<<1;A=b+(C<<2)|0;E=c+(C<<2)|0;C=f[A>>2]|0;B=f[A+4>>2]|0;f[h>>2]=P;f[a>>2]=Q;f[i>>2]=C;f[v>>2]=B;Cc(d,l,h,i);f[E>>2]=f[d>>2];f[E+4>>2]=f[w>>2];n=n+1|0;if((n|0)>=(p|0)){R=6;break}E=f[g>>2]|0;z=f[E>>2]|0;if((f[E+4>>2]|0)-z>>2>>>0<=n>>>0){y=E;R=7;break}}if((R|0)==6){u=e;return 1}else if((R|0)==7)$n(y);return 0}function mc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+48|0;d=e+32|0;h=e+24|0;i=e+16|0;j=e;k=e+12|0;l=a+8|0;m=f[l>>2]|0;if((m+-2|0)>>>0<=28){f[a+72>>2]=m;n=1<<m;f[a+76>>2]=n+-1;m=n+-2|0;f[a+80>>2]=m;f[a+84>>2]=(m|0)/2|0}m=a+40|0;f[a+48>>2]=g;g=a+36|0;n=f[g>>2]|0;o=(f[n+4>>2]|0)-(f[n>>2]|0)|0;p=o>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;if((o|0)<=0){u=e;return 1}o=j+4|0;q=j+8|0;r=a+84|0;s=a+88|0;t=a+80|0;a=h+4|0;v=i+4|0;w=d+4|0;x=f[n>>2]|0;if((f[n+4>>2]|0)==(x|0)){y=n;$n(y)}n=0;z=x;while(1){f[k>>2]=f[z+(n<<2)>>2];f[d>>2]=f[k>>2];Mb(m,d,j);x=f[j>>2]|0;A=(x|0)>-1?x:0-x|0;B=f[o>>2]|0;C=(B|0)>-1?B:0-B|0;D=vl(C|0,((C|0)<0)<<31>>31|0,A|0,((A|0)<0)<<31>>31|0)|0;A=f[q>>2]|0;C=(A|0)>-1;E=C?A:0-A|0;A=vl(D|0,H|0,E|0,((E|0)<0)<<31>>31|0)|0;E=H;do if(!((A|0)==0&(E|0)==0)){D=f[r>>2]|0;F=((D|0)<0)<<31>>31;G=Bk(D|0,F|0,x|0,((x|0)<0)<<31>>31|0)|0;I=ni(G|0,H|0,A|0,E|0)|0;f[j>>2]=I;G=Bk(D|0,F|0,B|0,((B|0)<0)<<31>>31|0)|0;F=ni(G|0,H|0,A|0,E|0)|0;f[o>>2]=F;G=D-((I|0)>-1?I:0-I|0)-((F|0)>-1?F:0-F|0)|0;if(C){f[q>>2]=G;break}else{f[q>>2]=0-G;break}}else f[j>>2]=f[r>>2];while(0);C=pi(s)|0;E=f[j>>2]|0;if(C){C=0-E|0;A=0-(f[o>>2]|0)|0;B=0-(f[q>>2]|0)|0;f[j>>2]=C;f[o>>2]=A;f[q>>2]=B;J=C;K=A}else{J=E;K=f[o>>2]|0}do if((J|0)<=-1){if((K|0)<0){E=f[q>>2]|0;L=(E|0)>-1?E:0-E|0;M=E}else{E=f[q>>2]|0;L=(f[t>>2]|0)-((E|0)>-1?E:0-E|0)|0;M=E}if((M|0)<0){N=(K|0)>-1?K:0-K|0;O=L;break}else{N=(f[t>>2]|0)-((K|0)>-1?K:0-K|0)|0;O=L;break}}else{E=f[r>>2]|0;N=(f[q>>2]|0)+E|0;O=E+K|0}while(0);E=(O|0)==0;A=(N|0)==0;C=f[t>>2]|0;do if(N|O){B=(C|0)==(N|0);if(!(E&B)){x=(C|0)==(O|0);if(!(A&x)){if(E?(G=f[r>>2]|0,(G|0)<(N|0)):0){P=0;Q=(G<<1)-N|0;break}if(x?(x=f[r>>2]|0,(x|0)>(N|0)):0){P=O;Q=(x<<1)-N|0;break}if(B?(B=f[r>>2]|0,(B|0)>(O|0)):0){P=(B<<1)-O|0;Q=N;break}if(A){B=f[r>>2]|0;P=(B|0)<(O|0)?(B<<1)-O|0:O;Q=0}else{P=O;Q=N}}else{P=O;Q=O}}else{P=N;Q=N}}else{P=C;Q=C}while(0);C=n<<1;A=b+(C<<2)|0;E=c+(C<<2)|0;C=f[A>>2]|0;B=f[A+4>>2]|0;f[h>>2]=P;f[a>>2]=Q;f[i>>2]=C;f[v>>2]=B;Cc(d,l,h,i);f[E>>2]=f[d>>2];f[E+4>>2]=f[w>>2];n=n+1|0;if((n|0)>=(p|0)){R=6;break}E=f[g>>2]|0;z=f[E>>2]|0;if((f[E+4>>2]|0)-z>>2>>>0<=n>>>0){y=E;R=7;break}}if((R|0)==6){u=e;return 1}else if((R|0)==7)$n(y);return 0}function nc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+48|0;d=e+32|0;h=e+24|0;i=e+16|0;j=e;k=e+12|0;l=a+8|0;m=f[l>>2]|0;if((m+-2|0)>>>0<=28){f[a+72>>2]=m;n=1<<m;f[a+76>>2]=n+-1;m=n+-2|0;f[a+80>>2]=m;f[a+84>>2]=(m|0)/2|0}m=a+40|0;f[a+48>>2]=g;g=a+36|0;n=f[g>>2]|0;o=(f[n+4>>2]|0)-(f[n>>2]|0)|0;p=o>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;if((o|0)<=0){u=e;return 1}o=j+4|0;q=j+8|0;r=a+84|0;s=a+88|0;t=a+80|0;a=d+4|0;v=i+4|0;w=h+4|0;x=f[n>>2]|0;if((f[n+4>>2]|0)==(x|0)){y=n;$n(y)}n=0;z=x;while(1){f[k>>2]=f[z+(n<<2)>>2];f[d>>2]=f[k>>2];Ob(m,d,j);x=f[j>>2]|0;A=(x|0)>-1?x:0-x|0;B=f[o>>2]|0;C=(B|0)>-1?B:0-B|0;D=vl(C|0,((C|0)<0)<<31>>31|0,A|0,((A|0)<0)<<31>>31|0)|0;A=f[q>>2]|0;C=(A|0)>-1;E=C?A:0-A|0;A=vl(D|0,H|0,E|0,((E|0)<0)<<31>>31|0)|0;E=H;do if(!((A|0)==0&(E|0)==0)){D=f[r>>2]|0;F=((D|0)<0)<<31>>31;G=Bk(D|0,F|0,x|0,((x|0)<0)<<31>>31|0)|0;I=ni(G|0,H|0,A|0,E|0)|0;f[j>>2]=I;G=Bk(D|0,F|0,B|0,((B|0)<0)<<31>>31|0)|0;F=ni(G|0,H|0,A|0,E|0)|0;f[o>>2]=F;G=D-((I|0)>-1?I:0-I|0)-((F|0)>-1?F:0-F|0)|0;if(C){f[q>>2]=G;break}else{f[q>>2]=0-G;break}}else f[j>>2]=f[r>>2];while(0);C=pi(s)|0;E=f[j>>2]|0;if(C){C=0-E|0;A=0-(f[o>>2]|0)|0;B=0-(f[q>>2]|0)|0;f[j>>2]=C;f[o>>2]=A;f[q>>2]=B;J=C;K=A}else{J=E;K=f[o>>2]|0}do if((J|0)<=-1){if((K|0)<0){E=f[q>>2]|0;L=(E|0)>-1?E:0-E|0;M=E}else{E=f[q>>2]|0;L=(f[t>>2]|0)-((E|0)>-1?E:0-E|0)|0;M=E}if((M|0)<0){N=(K|0)>-1?K:0-K|0;O=L;break}else{N=(f[t>>2]|0)-((K|0)>-1?K:0-K|0)|0;O=L;break}}else{E=f[r>>2]|0;N=(f[q>>2]|0)+E|0;O=E+K|0}while(0);E=(O|0)==0;A=(N|0)==0;C=f[t>>2]|0;do if(N|O){B=(C|0)==(N|0);if(!(E&B)){x=(C|0)==(O|0);if(!(A&x)){if(E?(G=f[r>>2]|0,(G|0)<(N|0)):0){P=0;Q=(G<<1)-N|0;break}if(x?(x=f[r>>2]|0,(x|0)>(N|0)):0){P=O;Q=(x<<1)-N|0;break}if(B?(B=f[r>>2]|0,(B|0)>(O|0)):0){P=(B<<1)-O|0;Q=N;break}if(A){B=f[r>>2]|0;P=(B|0)<(O|0)?(B<<1)-O|0:O;Q=0}else{P=O;Q=N}}else{P=O;Q=O}}else{P=N;Q=N}}else{P=C;Q=C}while(0);C=n<<1;A=b+(C<<2)|0;E=c+(C<<2)|0;C=f[A+4>>2]|0;f[d>>2]=f[A>>2];f[a>>2]=C;f[i>>2]=P;f[v>>2]=Q;gd(h,l,i,d);f[E>>2]=f[h>>2];f[E+4>>2]=f[w>>2];n=n+1|0;if((n|0)>=(p|0)){R=6;break}E=f[g>>2]|0;z=f[E>>2]|0;if((f[E+4>>2]|0)-z>>2>>>0<=n>>>0){y=E;R=7;break}}if((R|0)==6){u=e;return 1}else if((R|0)==7)$n(y);return 0}function oc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+48|0;d=e+32|0;h=e+24|0;i=e+16|0;j=e;k=e+12|0;l=a+8|0;m=f[l>>2]|0;if((m+-2|0)>>>0<=28){f[a+72>>2]=m;n=1<<m;f[a+76>>2]=n+-1;m=n+-2|0;f[a+80>>2]=m;f[a+84>>2]=(m|0)/2|0}m=a+40|0;f[a+48>>2]=g;g=a+36|0;n=f[g>>2]|0;o=(f[n+4>>2]|0)-(f[n>>2]|0)|0;p=o>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;if((o|0)<=0){u=e;return 1}o=j+4|0;q=j+8|0;r=a+84|0;s=a+88|0;t=a+80|0;a=d+4|0;v=i+4|0;w=h+4|0;x=f[n>>2]|0;if((f[n+4>>2]|0)==(x|0)){y=n;$n(y)}n=0;z=x;while(1){f[k>>2]=f[z+(n<<2)>>2];f[d>>2]=f[k>>2];Mb(m,d,j);x=f[j>>2]|0;A=(x|0)>-1?x:0-x|0;B=f[o>>2]|0;C=(B|0)>-1?B:0-B|0;D=vl(C|0,((C|0)<0)<<31>>31|0,A|0,((A|0)<0)<<31>>31|0)|0;A=f[q>>2]|0;C=(A|0)>-1;E=C?A:0-A|0;A=vl(D|0,H|0,E|0,((E|0)<0)<<31>>31|0)|0;E=H;do if(!((A|0)==0&(E|0)==0)){D=f[r>>2]|0;F=((D|0)<0)<<31>>31;G=Bk(D|0,F|0,x|0,((x|0)<0)<<31>>31|0)|0;I=ni(G|0,H|0,A|0,E|0)|0;f[j>>2]=I;G=Bk(D|0,F|0,B|0,((B|0)<0)<<31>>31|0)|0;F=ni(G|0,H|0,A|0,E|0)|0;f[o>>2]=F;G=D-((I|0)>-1?I:0-I|0)-((F|0)>-1?F:0-F|0)|0;if(C){f[q>>2]=G;break}else{f[q>>2]=0-G;break}}else f[j>>2]=f[r>>2];while(0);C=pi(s)|0;E=f[j>>2]|0;if(C){C=0-E|0;A=0-(f[o>>2]|0)|0;B=0-(f[q>>2]|0)|0;f[j>>2]=C;f[o>>2]=A;f[q>>2]=B;J=C;K=A}else{J=E;K=f[o>>2]|0}do if((J|0)<=-1){if((K|0)<0){E=f[q>>2]|0;L=(E|0)>-1?E:0-E|0;M=E}else{E=f[q>>2]|0;L=(f[t>>2]|0)-((E|0)>-1?E:0-E|0)|0;M=E}if((M|0)<0){N=(K|0)>-1?K:0-K|0;O=L;break}else{N=(f[t>>2]|0)-((K|0)>-1?K:0-K|0)|0;O=L;break}}else{E=f[r>>2]|0;N=(f[q>>2]|0)+E|0;O=E+K|0}while(0);E=(O|0)==0;A=(N|0)==0;C=f[t>>2]|0;do if(N|O){B=(C|0)==(N|0);if(!(E&B)){x=(C|0)==(O|0);if(!(A&x)){if(E?(G=f[r>>2]|0,(G|0)<(N|0)):0){P=0;Q=(G<<1)-N|0;break}if(x?(x=f[r>>2]|0,(x|0)>(N|0)):0){P=O;Q=(x<<1)-N|0;break}if(B?(B=f[r>>2]|0,(B|0)>(O|0)):0){P=(B<<1)-O|0;Q=N;break}if(A){B=f[r>>2]|0;P=(B|0)<(O|0)?(B<<1)-O|0:O;Q=0}else{P=O;Q=N}}else{P=O;Q=O}}else{P=N;Q=N}}else{P=C;Q=C}while(0);C=n<<1;A=b+(C<<2)|0;E=c+(C<<2)|0;C=f[A+4>>2]|0;f[d>>2]=f[A>>2];f[a>>2]=C;f[i>>2]=P;f[v>>2]=Q;gd(h,l,i,d);f[E>>2]=f[h>>2];f[E+4>>2]=f[w>>2];n=n+1|0;if((n|0)>=(p|0)){R=6;break}E=f[g>>2]|0;z=f[E>>2]|0;if((f[E+4>>2]|0)-z>>2>>>0<=n>>>0){y=E;R=7;break}}if((R|0)==6){u=e;return 1}else if((R|0)==7)$n(y);return 0}function pc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;d=u;u=u+32|0;e=d+16|0;g=d;if((j[c+38>>1]|0)<514){i=c+8|0;k=f[i+4>>2]|0;l=c+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;if(!((k|0)>(o|0)|((k|0)==(o|0)?(f[i>>2]|0)>>>0>n>>>0:0))){p=0;u=d;return p|0}i=b[(f[c>>2]|0)+n>>0]|0;k=vl(n|0,o|0,1,0)|0;o=l;f[o>>2]=k;f[o+4>>2]=H;if(i<<24>>24){p=0;u=d;return p|0}}zh(e,c)|0;i=f[e>>2]|0;if(i){o=a+60|0;td(o,i,0);ym(g);if(rd(g,c)|0){if(f[e>>2]|0){i=0;do{k=pi(g)|0;l=(f[o>>2]|0)+(i>>>5<<2)|0;n=1<<(i&31);if(k)q=f[l>>2]|n;else q=f[l>>2]&~n;f[l>>2]=q;i=i+1|0}while(i>>>0<(f[e>>2]|0)>>>0)}r=13}}else r=13;do if((r|0)==13){zh(e,c)|0;i=f[e>>2]|0;if(i|0){q=a+72|0;td(q,i,0);ym(g);if(!(rd(g,c)|0))break;if(f[e>>2]|0){i=0;do{o=pi(g)|0;l=(f[q>>2]|0)+(i>>>5<<2)|0;n=1<<(i&31);if(o)s=f[l>>2]|n;else s=f[l>>2]&~n;f[l>>2]=s;i=i+1|0}while(i>>>0<(f[e>>2]|0)>>>0)}}zh(e,c)|0;i=f[e>>2]|0;if(i|0){q=a+84|0;td(q,i,0);ym(g);if(!(rd(g,c)|0))break;if(f[e>>2]|0){i=0;do{l=pi(g)|0;n=(f[q>>2]|0)+(i>>>5<<2)|0;o=1<<(i&31);if(l)t=f[n>>2]|o;else t=f[n>>2]&~o;f[n>>2]=t;i=i+1|0}while(i>>>0<(f[e>>2]|0)>>>0)}}zh(e,c)|0;i=f[e>>2]|0;if(i|0){q=a+96|0;td(q,i,0);ym(g);if(!(rd(g,c)|0))break;if(f[e>>2]|0){i=0;do{n=pi(g)|0;o=(f[q>>2]|0)+(i>>>5<<2)|0;l=1<<(i&31);if(n)v=f[o>>2]|l;else v=f[o>>2]&~l;f[o>>2]=v;i=i+1|0}while(i>>>0<(f[e>>2]|0)>>>0)}}i=c+8|0;q=f[i>>2]|0;o=f[i+4>>2]|0;i=c+16|0;l=i;n=f[l>>2]|0;k=f[l+4>>2]|0;l=vl(n|0,k|0,4,0)|0;m=H;if((o|0)<(m|0)|(o|0)==(m|0)&q>>>0<l>>>0){p=0;u=d;return p|0}w=f[c>>2]|0;x=w+n|0;y=h[x>>0]|h[x+1>>0]<<8|h[x+2>>0]<<16|h[x+3>>0]<<24;x=i;f[x>>2]=l;f[x+4>>2]=m;m=vl(n|0,k|0,8,0)|0;k=H;if((o|0)<(k|0)|(o|0)==(k|0)&q>>>0<m>>>0){p=0;u=d;return p|0}q=w+l|0;l=h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24;q=i;f[q>>2]=m;f[q+4>>2]=k;if((y|0)>(l|0)){p=0;u=d;return p|0}f[a+12>>2]=y;f[a+16>>2]=l;k=wl(l|0,((l|0)<0)<<31>>31|0,y|0,((y|0)<0)<<31>>31|0)|0;y=H;if(!(y>>>0<0|(y|0)==0&k>>>0<2147483647)){p=0;u=d;return p|0}y=k+1|0;f[a+20>>2]=y;k=(y|0)/2|0;l=a+24|0;f[l>>2]=k;f[a+28>>2]=0-k;if(y&1|0){p=1;u=d;return p|0}f[l>>2]=k+-1;p=1;u=d;return p|0}while(0);p=0;u=d;return p|0}function qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;c=u;u=u+16|0;b=c+8|0;d=c+4|0;e=c;g=a+64|0;h=f[g>>2]|0;if((f[h+28>>2]|0)==(f[h+24>>2]|0)){u=c;return}i=a+52|0;j=a+56|0;k=a+60|0;l=a+12|0;m=a+28|0;n=a+40|0;o=a+44|0;p=a+48|0;q=0;r=0;s=h;while(1){h=f[(f[s+24>>2]|0)+(r<<2)>>2]|0;if((h|0)==-1){t=q;v=s}else{w=q+1|0;f[b>>2]=q;x=f[j>>2]|0;if((x|0)==(f[k>>2]|0))Ng(i,b);else{f[x>>2]=q;f[j>>2]=x+4}f[d>>2]=h;f[e>>2]=0;a:do if(!(f[(f[l>>2]|0)+(r>>>5<<2)>>2]&1<<(r&31)))y=h;else{x=h+1|0;z=((x>>>0)%3|0|0)==0?h+-2|0:x;if(((z|0)!=-1?(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(x=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,z=x+1|0,(x|0)!=-1):0){A=((z>>>0)%3|0|0)==0?x+-2|0:z;f[e>>2]=A;if((A|0)==-1){y=h;break}z=A;while(1){f[d>>2]=z;A=z+1|0;x=((A>>>0)%3|0|0)==0?z+-2|0:A;if((x|0)==-1)break;if(f[(f[a>>2]|0)+(x>>>5<<2)>>2]&1<<(x&31)|0)break;A=f[(f[(f[g>>2]|0)+12>>2]|0)+(x<<2)>>2]|0;x=A+1|0;if((A|0)==-1)break;B=((x>>>0)%3|0|0)==0?A+-2|0:x;f[e>>2]=B;if((B|0)==-1){y=z;break a}else z=B}f[e>>2]=-1;y=z;break}f[e>>2]=-1;y=h}while(0);f[(f[m>>2]|0)+(y<<2)>>2]=f[b>>2];h=f[o>>2]|0;if((h|0)==(f[p>>2]|0))Ng(n,d);else{f[h>>2]=f[d>>2];f[o>>2]=h+4}h=f[g>>2]|0;B=f[d>>2]|0;b:do if(((B|0)!=-1?(x=(((B>>>0)%3|0|0)==0?2:-1)+B|0,(x|0)!=-1):0)?(A=f[(f[h+12>>2]|0)+(x<<2)>>2]|0,(A|0)!=-1):0){x=A+(((A>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=x;if((x|0)!=-1&(x|0)!=(B|0)){A=w;C=x;while(1){x=C+1|0;D=((x>>>0)%3|0|0)==0?C+-2|0:x;do if(f[(f[a>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)){x=A+1|0;f[b>>2]=A;E=f[j>>2]|0;if((E|0)==(f[k>>2]|0))Ng(i,b);else{f[E>>2]=A;f[j>>2]=E+4}E=f[o>>2]|0;if((E|0)==(f[p>>2]|0)){Ng(n,e);F=x;break}else{f[E>>2]=f[e>>2];f[o>>2]=E+4;F=x;break}}else F=A;while(0);f[(f[m>>2]|0)+(f[e>>2]<<2)>>2]=f[b>>2];G=f[g>>2]|0;D=f[e>>2]|0;if((D|0)==-1)break;x=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((x|0)==-1)break;D=f[(f[G+12>>2]|0)+(x<<2)>>2]|0;if((D|0)==-1)break;C=D+(((D>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=C;if(!((C|0)!=-1?(C|0)!=(f[d>>2]|0):0)){H=F;I=G;break b}else A=F}f[e>>2]=-1;H=F;I=G}else{H=w;I=h}}else J=28;while(0);if((J|0)==28){J=0;f[e>>2]=-1;H=w;I=h}t=H;v=I}r=r+1|0;if(r>>>0>=(f[v+28>>2]|0)-(f[v+24>>2]|0)>>2>>>0)break;else{q=t;s=v}}u=c;return}function rc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0;e=Ka[f[(f[a>>2]|0)+44>>2]&127](a)|0;if((e|0)<1){g=0;return g|0}h=(f[c+4>>2]|0)-(f[c>>2]|0)>>2;i=W(h,e)|0;Yf(a,h,e);h=a+16|0;j=f[h>>2]|0;if(!(f[j+80>>2]|0)){g=0;return g|0}k=(f[f[j>>2]>>2]|0)+(f[j+48>>2]|0)|0;if(!k){g=0;return g|0}j=d+8|0;l=j;m=f[l>>2]|0;n=f[l+4>>2]|0;l=d+16|0;o=l;p=f[o>>2]|0;q=f[o+4>>2]|0;if(!((n|0)>(q|0)|(n|0)==(q|0)&m>>>0>p>>>0)){g=0;return g|0}o=f[d>>2]|0;r=b[o+p>>0]|0;s=vl(p|0,q|0,1,0)|0;t=H;u=l;f[u>>2]=s;f[u+4>>2]=t;a:do if(!(r<<24>>24)){if(!((n|0)>(t|0)|(n|0)==(t|0)&m>>>0>s>>>0)){g=0;return g|0}u=b[o+s>>0]|0;v=vl(p|0,q|0,2,0)|0;w=l;f[w>>2]=v;f[w+4>>2]=H;w=u&255;v=(Bj(5)|0)==(w|0);x=f[(f[h>>2]|0)+64>>2]|0;y=(f[x+4>>2]|0)-(f[x>>2]|0)|0;if(v){v=i<<2;if(y>>>0<v>>>0){g=0;return g|0}x=j;z=f[x>>2]|0;A=f[x+4>>2]|0;x=l;B=f[x>>2]|0;C=vl(B|0,f[x+4>>2]|0,v|0,0)|0;x=H;if((A|0)<(x|0)|(A|0)==(x|0)&z>>>0<C>>>0){g=0;return g|0}else{Bf(k|0,(f[d>>2]|0)+B|0,v|0)|0;B=l;C=vl(f[B>>2]|0,f[B+4>>2]|0,v|0,0)|0;v=l;f[v>>2]=C;f[v+4>>2]=H;D=20;break}}v=W(i,w)|0;if(y>>>0<v>>>0){g=0;return g|0}y=j;C=f[y>>2]|0;B=f[y+4>>2]|0;y=l;z=f[y>>2]|0;x=f[y+4>>2]|0;y=wl(C|0,B|0,z|0,x|0)|0;A=H;if((A|0)<0|(A|0)==0&y>>>0<v>>>0){g=0;return g|0}if(!i)D=21;else{v=u&255;u=0;y=z;z=x;x=B;B=C;while(1){C=vl(y|0,z|0,v|0,0)|0;A=H;if((x|0)<(A|0)|(x|0)==(A|0)&B>>>0<C>>>0){E=y;F=z}else{Bf(k+(u<<2)|0,(f[d>>2]|0)+y|0,w|0)|0;C=l;A=vl(f[C>>2]|0,f[C+4>>2]|0,v|0,0)|0;C=H;G=l;f[G>>2]=A;f[G+4>>2]=C;E=A;F=C}C=u+1|0;if((C|0)==(i|0)){D=20;break a}A=j;u=C;y=E;z=F;x=f[A+4>>2]|0;B=f[A>>2]|0}}}else if(kh(i,e,d,k)|0)D=20;else{g=0;return g|0}while(0);do if((D|0)==20)if(!i)D=21;else{F=a+20|0;E=f[F>>2]|0;if(E|0?Ka[f[(f[E>>2]|0)+32>>2]&127](E)|0:0){I=F;J=1;break}Yj(k,i,k);I=F;J=1}while(0);if((D|0)==21){I=a+20|0;J=0}a=f[I>>2]|0;if(a|0){if(!(La[f[(f[a>>2]|0)+40>>2]&127](a,d)|0)){g=0;return g|0}if(J?(J=f[I>>2]|0,!(Na[f[(f[J>>2]|0)+44>>2]&31](J,k,k,i,e,f[c>>2]|0)|0)):0){g=0;return g|0}}g=1;return g|0}function sc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;if(c>>>0>=1048576){if((p|0)!=4194304)f[w>>2]=x+4194304}else Eg(n,1048576-c|0);c=a+28|0;x=a+32|0;a=f[c>>2]|0;w=(f[x>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[x>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;x=w;w=(f[p>>2]|0)+w|0;if(w>>>0>1048576){g=0;r=38;break}if(x>>>0<w>>>0){p=f[n>>2]|0;a=x;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==1048576|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0}function tc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;o=x;if(c>>>0>=8192){if((p|0)!=32768)f[w>>2]=o+32768}else Eg(n,8192-c|0);c=a+28|0;o=a+32|0;a=f[c>>2]|0;w=(f[o>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[o>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;o=w;w=(f[p>>2]|0)+w|0;if(w>>>0>8192){g=0;r=38;break}if(o>>>0<w>>>0){p=f[n>>2]|0;a=o;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==8192|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0}function uc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;o=x;if(c>>>0>=4096){if((p|0)!=16384)f[w>>2]=o+16384}else Eg(n,4096-c|0);c=a+28|0;o=a+32|0;a=f[c>>2]|0;w=(f[o>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[o>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;o=w;w=(f[p>>2]|0)+w|0;if(w>>>0>4096){g=0;r=38;break}if(o>>>0<w>>>0){p=f[n>>2]|0;a=o;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==4096|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0}function vc(a,c){a=a|0;c=c|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=d[c+38>>1]|0;if(!(e<<16>>16)){g=0;return g|0}i=a+12|0;do if((e&65535)<512){j=c+8|0;k=f[j>>2]|0;l=f[j+4>>2]|0;j=c+16|0;m=j;n=f[m>>2]|0;o=vl(n|0,f[m+4>>2]|0,4,0)|0;m=H;if((l|0)<(m|0)|(l|0)==(m|0)&k>>>0<o>>>0){g=0;return g|0}else{o=(f[c>>2]|0)+n|0;n=h[o>>0]|h[o+1>>0]<<8|h[o+2>>0]<<16|h[o+3>>0]<<24;b[i>>0]=n;b[i+1>>0]=n>>8;b[i+2>>0]=n>>16;b[i+3>>0]=n>>24;o=j;k=vl(f[o>>2]|0,f[o+4>>2]|0,4,0)|0;o=j;f[o>>2]=k;f[o+4>>2]=H;p=n;break}}else if(zh(i,c)|0){p=f[i>>2]|0;break}else{g=0;return g|0}while(0);e=a+4|0;n=f[a>>2]|0;o=(f[e>>2]|0)-n>>2;if(p>>>0<=o>>>0)if(p>>>0<o>>>0){f[e>>2]=n+(p<<2);q=p}else q=p;else{Eg(a,p-o|0);q=f[i>>2]|0}if(!q){g=1;return g|0}o=c+8|0;p=c+16|0;n=0;e=q;a:while(1){q=o;k=f[q>>2]|0;j=f[q+4>>2]|0;q=p;m=f[q>>2]|0;l=f[q+4>>2]|0;if(!((j|0)>(l|0)|(j|0)==(l|0)&k>>>0>m>>>0)){g=0;r=38;break}q=f[c>>2]|0;s=b[q+m>>0]|0;t=vl(m|0,l|0,1,0)|0;l=H;m=p;f[m>>2]=t;f[m+4>>2]=l;m=s&255;u=m&3;v=m>>>2;switch(s&3){case 3:{s=v+n|0;if(s>>>0>=e>>>0){g=0;r=38;break a}oh((f[a>>2]|0)+(n<<2)|0,0,(m&252)+4|0)|0;w=s;break}case 0:{x=v;r=20;break}default:{s=v;v=0;m=l;l=t;while(1){if(!((j|0)>(m|0)|(j|0)==(m|0)&k>>>0>l>>>0)){g=0;r=38;break a}t=b[q+l>>0]|0;l=vl(l|0,m|0,1,0)|0;m=H;y=p;f[y>>2]=l;f[y+4>>2]=m;y=(t&255)<<(v<<3|6)|s;v=v+1|0;if(v>>>0>=u>>>0){x=y;r=20;break}else s=y}}}if((r|0)==20){r=0;f[(f[a>>2]|0)+(n<<2)>>2]=x;w=n}n=w+1|0;e=f[i>>2]|0;if(n>>>0>=e>>>0){r=22;break}}if((r|0)==22){n=a+16|0;i=f[a>>2]|0;w=a+20|0;x=f[n>>2]|0;p=(f[w>>2]|0)-x|0;c=p>>2;if(c>>>0>=524288){if((p|0)!=2097152)f[w>>2]=x+2097152}else Eg(n,524288-c|0);c=a+28|0;x=a+32|0;a=f[c>>2]|0;w=(f[x>>2]|0)-a>>3;p=a;if(e>>>0<=w>>>0){if(e>>>0<w>>>0)f[x>>2]=p+(e<<3);if(!e){g=0;return g|0}else z=p}else{cg(c,e-w|0);z=f[c>>2]|0}c=0;w=0;while(1){p=i+(c<<2)|0;f[z+(c<<3)>>2]=f[p>>2];f[z+(c<<3)+4>>2]=w;x=w;w=(f[p>>2]|0)+w|0;if(w>>>0>524288){g=0;r=38;break}if(x>>>0<w>>>0){p=f[n>>2]|0;a=x;do{f[p+(a<<2)>>2]=c;a=a+1|0}while((a|0)!=(w|0))}c=c+1|0;if(c>>>0>=e>>>0){r=37;break}}if((r|0)==37)return (w|0)==524288|0;else if((r|0)==38)return g|0}else if((r|0)==38)return g|0;return 0} +function Va(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;b=u;u=u+16|0;c=b;do if(a>>>0<245){d=a>>>0<11?16:a+11&-8;e=d>>>3;g=f[4072]|0;h=g>>>e;if(h&3|0){i=(h&1^1)+e|0;j=16328+(i<<1<<2)|0;k=j+8|0;l=f[k>>2]|0;m=l+8|0;n=f[m>>2]|0;if((n|0)==(j|0))f[4072]=g&~(1<<i);else{f[n+12>>2]=j;f[k>>2]=n}n=i<<3;f[l+4>>2]=n|3;i=l+n+4|0;f[i>>2]=f[i>>2]|1;o=m;u=b;return o|0}m=f[4074]|0;if(d>>>0>m>>>0){if(h|0){i=2<<e;n=h<<e&(i|0-i);i=(n&0-n)+-1|0;n=i>>>12&16;e=i>>>n;i=e>>>5&8;h=e>>>i;e=h>>>2&4;l=h>>>e;h=l>>>1&2;k=l>>>h;l=k>>>1&1;j=(i|n|e|h|l)+(k>>>l)|0;l=16328+(j<<1<<2)|0;k=l+8|0;h=f[k>>2]|0;e=h+8|0;n=f[e>>2]|0;if((n|0)==(l|0)){i=g&~(1<<j);f[4072]=i;p=i}else{f[n+12>>2]=l;f[k>>2]=n;p=g}n=j<<3;j=n-d|0;f[h+4>>2]=d|3;k=h+d|0;f[k+4>>2]=j|1;f[h+n>>2]=j;if(m|0){n=f[4077]|0;h=m>>>3;l=16328+(h<<1<<2)|0;i=1<<h;if(!(p&i)){f[4072]=p|i;q=l;r=l+8|0}else{i=l+8|0;q=f[i>>2]|0;r=i}f[r>>2]=n;f[q+12>>2]=n;f[n+8>>2]=q;f[n+12>>2]=l}f[4074]=j;f[4077]=k;o=e;u=b;return o|0}e=f[4073]|0;if(e){k=(e&0-e)+-1|0;j=k>>>12&16;l=k>>>j;k=l>>>5&8;n=l>>>k;l=n>>>2&4;i=n>>>l;n=i>>>1&2;h=i>>>n;i=h>>>1&1;s=f[16592+((k|j|l|n|i)+(h>>>i)<<2)>>2]|0;i=s;h=s;n=(f[s+4>>2]&-8)-d|0;while(1){s=f[i+16>>2]|0;if(!s){l=f[i+20>>2]|0;if(!l)break;else t=l}else t=s;s=(f[t+4>>2]&-8)-d|0;l=s>>>0<n>>>0;i=t;h=l?t:h;n=l?s:n}i=h+d|0;if(i>>>0>h>>>0){s=f[h+24>>2]|0;l=f[h+12>>2]|0;do if((l|0)==(h|0)){j=h+20|0;k=f[j>>2]|0;if(!k){v=h+16|0;w=f[v>>2]|0;if(!w){x=0;break}else{y=w;z=v}}else{y=k;z=j}j=y;k=z;while(1){v=j+20|0;w=f[v>>2]|0;if(!w){A=j+16|0;B=f[A>>2]|0;if(!B)break;else{C=B;D=A}}else{C=w;D=v}j=C;k=D}f[k>>2]=0;x=j}else{v=f[h+8>>2]|0;f[v+12>>2]=l;f[l+8>>2]=v;x=l}while(0);do if(s|0){l=f[h+28>>2]|0;v=16592+(l<<2)|0;if((h|0)==(f[v>>2]|0)){f[v>>2]=x;if(!x){f[4073]=e&~(1<<l);break}}else{l=s+16|0;f[((f[l>>2]|0)==(h|0)?l:s+20|0)>>2]=x;if(!x)break}f[x+24>>2]=s;l=f[h+16>>2]|0;if(l|0){f[x+16>>2]=l;f[l+24>>2]=x}l=f[h+20>>2]|0;if(l|0){f[x+20>>2]=l;f[l+24>>2]=x}}while(0);if(n>>>0<16){s=n+d|0;f[h+4>>2]=s|3;e=h+s+4|0;f[e>>2]=f[e>>2]|1}else{f[h+4>>2]=d|3;f[i+4>>2]=n|1;f[i+n>>2]=n;if(m|0){e=f[4077]|0;s=m>>>3;l=16328+(s<<1<<2)|0;v=1<<s;if(!(v&g)){f[4072]=v|g;E=l;F=l+8|0}else{v=l+8|0;E=f[v>>2]|0;F=v}f[F>>2]=e;f[E+12>>2]=e;f[e+8>>2]=E;f[e+12>>2]=l}f[4074]=n;f[4077]=i}o=h+8|0;u=b;return o|0}else G=d}else G=d}else G=d}else if(a>>>0<=4294967231){l=a+11|0;e=l&-8;v=f[4073]|0;if(v){s=0-e|0;w=l>>>8;if(w)if(e>>>0>16777215)H=31;else{l=(w+1048320|0)>>>16&8;A=w<<l;w=(A+520192|0)>>>16&4;B=A<<w;A=(B+245760|0)>>>16&2;I=14-(w|l|A)+(B<<A>>>15)|0;H=e>>>(I+7|0)&1|I<<1}else H=0;I=f[16592+(H<<2)>>2]|0;a:do if(!I){J=0;K=0;L=s;M=61}else{A=0;B=s;l=I;w=e<<((H|0)==31?0:25-(H>>>1)|0);N=0;while(1){O=(f[l+4>>2]&-8)-e|0;if(O>>>0<B>>>0)if(!O){P=l;Q=0;R=l;M=65;break a}else{S=l;T=O}else{S=A;T=B}O=f[l+20>>2]|0;l=f[l+16+(w>>>31<<2)>>2]|0;U=(O|0)==0|(O|0)==(l|0)?N:O;if(!l){J=U;K=S;L=T;M=61;break}else{A=S;B=T;w=w<<1;N=U}}}while(0);if((M|0)==61){if((J|0)==0&(K|0)==0){I=2<<H;s=(I|0-I)&v;if(!s){G=e;break}I=(s&0-s)+-1|0;s=I>>>12&16;d=I>>>s;I=d>>>5&8;h=d>>>I;d=h>>>2&4;i=h>>>d;h=i>>>1&2;n=i>>>h;i=n>>>1&1;V=0;W=f[16592+((I|s|d|h|i)+(n>>>i)<<2)>>2]|0}else{V=K;W=J}if(!W){X=V;Y=L}else{P=V;Q=L;R=W;M=65}}if((M|0)==65){i=P;n=Q;h=R;while(1){d=(f[h+4>>2]&-8)-e|0;s=d>>>0<n>>>0;I=s?d:n;d=s?h:i;s=f[h+16>>2]|0;if(!s)Z=f[h+20>>2]|0;else Z=s;if(!Z){X=d;Y=I;break}else{i=d;n=I;h=Z}}}if(((X|0)!=0?Y>>>0<((f[4074]|0)-e|0)>>>0:0)?(h=X+e|0,h>>>0>X>>>0):0){n=f[X+24>>2]|0;i=f[X+12>>2]|0;do if((i|0)==(X|0)){I=X+20|0;d=f[I>>2]|0;if(!d){s=X+16|0;g=f[s>>2]|0;if(!g){_=0;break}else{$=g;aa=s}}else{$=d;aa=I}I=$;d=aa;while(1){s=I+20|0;g=f[s>>2]|0;if(!g){m=I+16|0;N=f[m>>2]|0;if(!N)break;else{ba=N;ca=m}}else{ba=g;ca=s}I=ba;d=ca}f[d>>2]=0;_=I}else{s=f[X+8>>2]|0;f[s+12>>2]=i;f[i+8>>2]=s;_=i}while(0);do if(n){i=f[X+28>>2]|0;s=16592+(i<<2)|0;if((X|0)==(f[s>>2]|0)){f[s>>2]=_;if(!_){s=v&~(1<<i);f[4073]=s;da=s;break}}else{s=n+16|0;f[((f[s>>2]|0)==(X|0)?s:n+20|0)>>2]=_;if(!_){da=v;break}}f[_+24>>2]=n;s=f[X+16>>2]|0;if(s|0){f[_+16>>2]=s;f[s+24>>2]=_}s=f[X+20>>2]|0;if(s){f[_+20>>2]=s;f[s+24>>2]=_;da=v}else da=v}else da=v;while(0);b:do if(Y>>>0<16){v=Y+e|0;f[X+4>>2]=v|3;n=X+v+4|0;f[n>>2]=f[n>>2]|1}else{f[X+4>>2]=e|3;f[h+4>>2]=Y|1;f[h+Y>>2]=Y;n=Y>>>3;if(Y>>>0<256){v=16328+(n<<1<<2)|0;s=f[4072]|0;i=1<<n;if(!(s&i)){f[4072]=s|i;ea=v;fa=v+8|0}else{i=v+8|0;ea=f[i>>2]|0;fa=i}f[fa>>2]=h;f[ea+12>>2]=h;f[h+8>>2]=ea;f[h+12>>2]=v;break}v=Y>>>8;if(v)if(Y>>>0>16777215)ga=31;else{i=(v+1048320|0)>>>16&8;s=v<<i;v=(s+520192|0)>>>16&4;n=s<<v;s=(n+245760|0)>>>16&2;g=14-(v|i|s)+(n<<s>>>15)|0;ga=Y>>>(g+7|0)&1|g<<1}else ga=0;g=16592+(ga<<2)|0;f[h+28>>2]=ga;s=h+16|0;f[s+4>>2]=0;f[s>>2]=0;s=1<<ga;if(!(da&s)){f[4073]=da|s;f[g>>2]=h;f[h+24>>2]=g;f[h+12>>2]=h;f[h+8>>2]=h;break}s=f[g>>2]|0;c:do if((f[s+4>>2]&-8|0)==(Y|0))ha=s;else{g=Y<<((ga|0)==31?0:25-(ga>>>1)|0);n=s;while(1){ia=n+16+(g>>>31<<2)|0;i=f[ia>>2]|0;if(!i)break;if((f[i+4>>2]&-8|0)==(Y|0)){ha=i;break c}else{g=g<<1;n=i}}f[ia>>2]=h;f[h+24>>2]=n;f[h+12>>2]=h;f[h+8>>2]=h;break b}while(0);s=ha+8|0;I=f[s>>2]|0;f[I+12>>2]=h;f[s>>2]=h;f[h+8>>2]=I;f[h+12>>2]=ha;f[h+24>>2]=0}while(0);o=X+8|0;u=b;return o|0}else G=e}else G=e}else G=-1;while(0);X=f[4074]|0;if(X>>>0>=G>>>0){ha=X-G|0;ia=f[4077]|0;if(ha>>>0>15){Y=ia+G|0;f[4077]=Y;f[4074]=ha;f[Y+4>>2]=ha|1;f[ia+X>>2]=ha;f[ia+4>>2]=G|3}else{f[4074]=0;f[4077]=0;f[ia+4>>2]=X|3;ha=ia+X+4|0;f[ha>>2]=f[ha>>2]|1}o=ia+8|0;u=b;return o|0}ia=f[4075]|0;if(ia>>>0>G>>>0){ha=ia-G|0;f[4075]=ha;X=f[4078]|0;Y=X+G|0;f[4078]=Y;f[Y+4>>2]=ha|1;f[X+4>>2]=G|3;o=X+8|0;u=b;return o|0}if(!(f[4190]|0)){f[4192]=4096;f[4191]=4096;f[4193]=-1;f[4194]=-1;f[4195]=0;f[4183]=0;f[4190]=c&-16^1431655768;ja=4096}else ja=f[4192]|0;c=G+48|0;X=G+47|0;ha=ja+X|0;Y=0-ja|0;ja=ha&Y;if(ja>>>0<=G>>>0){o=0;u=b;return o|0}ga=f[4182]|0;if(ga|0?(da=f[4180]|0,ea=da+ja|0,ea>>>0<=da>>>0|ea>>>0>ga>>>0):0){o=0;u=b;return o|0}d:do if(!(f[4183]&4)){ga=f[4078]|0;e:do if(ga){ea=16736;while(1){da=f[ea>>2]|0;if(da>>>0<=ga>>>0?(da+(f[ea+4>>2]|0)|0)>>>0>ga>>>0:0)break;da=f[ea+8>>2]|0;if(!da){M=128;break e}else ea=da}da=ha-ia&Y;if(da>>>0<2147483647){fa=vj(da|0)|0;if((fa|0)==((f[ea>>2]|0)+(f[ea+4>>2]|0)|0))if((fa|0)==(-1|0))ka=da;else{la=da;ma=fa;M=145;break d}else{na=fa;oa=da;M=136}}else ka=0}else M=128;while(0);do if((M|0)==128){ga=vj(0)|0;if((ga|0)!=(-1|0)?(e=ga,da=f[4191]|0,fa=da+-1|0,_=((fa&e|0)==0?0:(fa+e&0-da)-e|0)+ja|0,e=f[4180]|0,da=_+e|0,_>>>0>G>>>0&_>>>0<2147483647):0){fa=f[4182]|0;if(fa|0?da>>>0<=e>>>0|da>>>0>fa>>>0:0){ka=0;break}fa=vj(_|0)|0;if((fa|0)==(ga|0)){la=_;ma=ga;M=145;break d}else{na=fa;oa=_;M=136}}else ka=0}while(0);do if((M|0)==136){_=0-oa|0;if(!(c>>>0>oa>>>0&(oa>>>0<2147483647&(na|0)!=(-1|0))))if((na|0)==(-1|0)){ka=0;break}else{la=oa;ma=na;M=145;break d}fa=f[4192]|0;ga=X-oa+fa&0-fa;if(ga>>>0>=2147483647){la=oa;ma=na;M=145;break d}if((vj(ga|0)|0)==(-1|0)){vj(_|0)|0;ka=0;break}else{la=ga+oa|0;ma=na;M=145;break d}}while(0);f[4183]=f[4183]|4;pa=ka;M=143}else{pa=0;M=143}while(0);if(((M|0)==143?ja>>>0<2147483647:0)?(ka=vj(ja|0)|0,ja=vj(0)|0,na=ja-ka|0,oa=na>>>0>(G+40|0)>>>0,!((ka|0)==(-1|0)|oa^1|ka>>>0<ja>>>0&((ka|0)!=(-1|0)&(ja|0)!=(-1|0))^1)):0){la=oa?na:pa;ma=ka;M=145}if((M|0)==145){ka=(f[4180]|0)+la|0;f[4180]=ka;if(ka>>>0>(f[4181]|0)>>>0)f[4181]=ka;ka=f[4078]|0;f:do if(ka){pa=16736;while(1){qa=f[pa>>2]|0;ra=f[pa+4>>2]|0;if((ma|0)==(qa+ra|0)){M=154;break}na=f[pa+8>>2]|0;if(!na)break;else pa=na}if(((M|0)==154?(na=pa+4|0,(f[pa+12>>2]&8|0)==0):0)?ma>>>0>ka>>>0&qa>>>0<=ka>>>0:0){f[na>>2]=ra+la;na=(f[4075]|0)+la|0;oa=ka+8|0;ja=(oa&7|0)==0?0:0-oa&7;oa=ka+ja|0;X=na-ja|0;f[4078]=oa;f[4075]=X;f[oa+4>>2]=X|1;f[ka+na+4>>2]=40;f[4079]=f[4194];break}if(ma>>>0<(f[4076]|0)>>>0)f[4076]=ma;na=ma+la|0;X=16736;while(1){if((f[X>>2]|0)==(na|0)){M=162;break}oa=f[X+8>>2]|0;if(!oa)break;else X=oa}if((M|0)==162?(f[X+12>>2]&8|0)==0:0){f[X>>2]=ma;pa=X+4|0;f[pa>>2]=(f[pa>>2]|0)+la;pa=ma+8|0;oa=ma+((pa&7|0)==0?0:0-pa&7)|0;pa=na+8|0;ja=na+((pa&7|0)==0?0:0-pa&7)|0;pa=oa+G|0;c=ja-oa-G|0;f[oa+4>>2]=G|3;g:do if((ka|0)==(ja|0)){Y=(f[4075]|0)+c|0;f[4075]=Y;f[4078]=pa;f[pa+4>>2]=Y|1}else{if((f[4077]|0)==(ja|0)){Y=(f[4074]|0)+c|0;f[4074]=Y;f[4077]=pa;f[pa+4>>2]=Y|1;f[pa+Y>>2]=Y;break}Y=f[ja+4>>2]|0;if((Y&3|0)==1){ia=Y&-8;ha=Y>>>3;h:do if(Y>>>0<256){ga=f[ja+8>>2]|0;_=f[ja+12>>2]|0;if((_|0)==(ga|0)){f[4072]=f[4072]&~(1<<ha);break}else{f[ga+12>>2]=_;f[_+8>>2]=ga;break}}else{ga=f[ja+24>>2]|0;_=f[ja+12>>2]|0;do if((_|0)==(ja|0)){fa=ja+16|0;da=fa+4|0;e=f[da>>2]|0;if(!e){ca=f[fa>>2]|0;if(!ca){sa=0;break}else{ta=ca;ua=fa}}else{ta=e;ua=da}da=ta;e=ua;while(1){fa=da+20|0;ca=f[fa>>2]|0;if(!ca){ba=da+16|0;aa=f[ba>>2]|0;if(!aa)break;else{va=aa;wa=ba}}else{va=ca;wa=fa}da=va;e=wa}f[e>>2]=0;sa=da}else{fa=f[ja+8>>2]|0;f[fa+12>>2]=_;f[_+8>>2]=fa;sa=_}while(0);if(!ga)break;_=f[ja+28>>2]|0;n=16592+(_<<2)|0;do if((f[n>>2]|0)!=(ja|0)){fa=ga+16|0;f[((f[fa>>2]|0)==(ja|0)?fa:ga+20|0)>>2]=sa;if(!sa)break h}else{f[n>>2]=sa;if(sa|0)break;f[4073]=f[4073]&~(1<<_);break h}while(0);f[sa+24>>2]=ga;_=ja+16|0;n=f[_>>2]|0;if(n|0){f[sa+16>>2]=n;f[n+24>>2]=sa}n=f[_+4>>2]|0;if(!n)break;f[sa+20>>2]=n;f[n+24>>2]=sa}while(0);xa=ja+ia|0;ya=ia+c|0}else{xa=ja;ya=c}ha=xa+4|0;f[ha>>2]=f[ha>>2]&-2;f[pa+4>>2]=ya|1;f[pa+ya>>2]=ya;ha=ya>>>3;if(ya>>>0<256){Y=16328+(ha<<1<<2)|0;ea=f[4072]|0;n=1<<ha;if(!(ea&n)){f[4072]=ea|n;za=Y;Aa=Y+8|0}else{n=Y+8|0;za=f[n>>2]|0;Aa=n}f[Aa>>2]=pa;f[za+12>>2]=pa;f[pa+8>>2]=za;f[pa+12>>2]=Y;break}Y=ya>>>8;do if(!Y)Ba=0;else{if(ya>>>0>16777215){Ba=31;break}n=(Y+1048320|0)>>>16&8;ea=Y<<n;ha=(ea+520192|0)>>>16&4;_=ea<<ha;ea=(_+245760|0)>>>16&2;fa=14-(ha|n|ea)+(_<<ea>>>15)|0;Ba=ya>>>(fa+7|0)&1|fa<<1}while(0);Y=16592+(Ba<<2)|0;f[pa+28>>2]=Ba;ia=pa+16|0;f[ia+4>>2]=0;f[ia>>2]=0;ia=f[4073]|0;fa=1<<Ba;if(!(ia&fa)){f[4073]=ia|fa;f[Y>>2]=pa;f[pa+24>>2]=Y;f[pa+12>>2]=pa;f[pa+8>>2]=pa;break}fa=f[Y>>2]|0;i:do if((f[fa+4>>2]&-8|0)==(ya|0))Ca=fa;else{Y=ya<<((Ba|0)==31?0:25-(Ba>>>1)|0);ia=fa;while(1){Da=ia+16+(Y>>>31<<2)|0;ea=f[Da>>2]|0;if(!ea)break;if((f[ea+4>>2]&-8|0)==(ya|0)){Ca=ea;break i}else{Y=Y<<1;ia=ea}}f[Da>>2]=pa;f[pa+24>>2]=ia;f[pa+12>>2]=pa;f[pa+8>>2]=pa;break g}while(0);fa=Ca+8|0;Y=f[fa>>2]|0;f[Y+12>>2]=pa;f[fa>>2]=pa;f[pa+8>>2]=Y;f[pa+12>>2]=Ca;f[pa+24>>2]=0}while(0);o=oa+8|0;u=b;return o|0}pa=16736;while(1){c=f[pa>>2]|0;if(c>>>0<=ka>>>0?(Ea=c+(f[pa+4>>2]|0)|0,Ea>>>0>ka>>>0):0)break;pa=f[pa+8>>2]|0}pa=Ea+-47|0;oa=pa+8|0;c=pa+((oa&7|0)==0?0:0-oa&7)|0;oa=ka+16|0;pa=c>>>0<oa>>>0?ka:c;c=pa+8|0;ja=la+-40|0;na=ma+8|0;X=(na&7|0)==0?0:0-na&7;na=ma+X|0;Y=ja-X|0;f[4078]=na;f[4075]=Y;f[na+4>>2]=Y|1;f[ma+ja+4>>2]=40;f[4079]=f[4194];ja=pa+4|0;f[ja>>2]=27;f[c>>2]=f[4184];f[c+4>>2]=f[4185];f[c+8>>2]=f[4186];f[c+12>>2]=f[4187];f[4184]=ma;f[4185]=la;f[4187]=0;f[4186]=c;c=pa+24|0;do{Y=c;c=c+4|0;f[c>>2]=7}while((Y+8|0)>>>0<Ea>>>0);if((pa|0)!=(ka|0)){c=pa-ka|0;f[ja>>2]=f[ja>>2]&-2;f[ka+4>>2]=c|1;f[pa>>2]=c;Y=c>>>3;if(c>>>0<256){na=16328+(Y<<1<<2)|0;X=f[4072]|0;fa=1<<Y;if(!(X&fa)){f[4072]=X|fa;Fa=na;Ga=na+8|0}else{fa=na+8|0;Fa=f[fa>>2]|0;Ga=fa}f[Ga>>2]=ka;f[Fa+12>>2]=ka;f[ka+8>>2]=Fa;f[ka+12>>2]=na;break}na=c>>>8;if(na)if(c>>>0>16777215)Ha=31;else{fa=(na+1048320|0)>>>16&8;X=na<<fa;na=(X+520192|0)>>>16&4;Y=X<<na;X=(Y+245760|0)>>>16&2;ga=14-(na|fa|X)+(Y<<X>>>15)|0;Ha=c>>>(ga+7|0)&1|ga<<1}else Ha=0;ga=16592+(Ha<<2)|0;f[ka+28>>2]=Ha;f[ka+20>>2]=0;f[oa>>2]=0;X=f[4073]|0;Y=1<<Ha;if(!(X&Y)){f[4073]=X|Y;f[ga>>2]=ka;f[ka+24>>2]=ga;f[ka+12>>2]=ka;f[ka+8>>2]=ka;break}Y=f[ga>>2]|0;j:do if((f[Y+4>>2]&-8|0)==(c|0))Ia=Y;else{ga=c<<((Ha|0)==31?0:25-(Ha>>>1)|0);X=Y;while(1){Ja=X+16+(ga>>>31<<2)|0;fa=f[Ja>>2]|0;if(!fa)break;if((f[fa+4>>2]&-8|0)==(c|0)){Ia=fa;break j}else{ga=ga<<1;X=fa}}f[Ja>>2]=ka;f[ka+24>>2]=X;f[ka+12>>2]=ka;f[ka+8>>2]=ka;break f}while(0);c=Ia+8|0;Y=f[c>>2]|0;f[Y+12>>2]=ka;f[c>>2]=ka;f[ka+8>>2]=Y;f[ka+12>>2]=Ia;f[ka+24>>2]=0}}else{Y=f[4076]|0;if((Y|0)==0|ma>>>0<Y>>>0)f[4076]=ma;f[4184]=ma;f[4185]=la;f[4187]=0;f[4081]=f[4190];f[4080]=-1;f[4085]=16328;f[4084]=16328;f[4087]=16336;f[4086]=16336;f[4089]=16344;f[4088]=16344;f[4091]=16352;f[4090]=16352;f[4093]=16360;f[4092]=16360;f[4095]=16368;f[4094]=16368;f[4097]=16376;f[4096]=16376;f[4099]=16384;f[4098]=16384;f[4101]=16392;f[4100]=16392;f[4103]=16400;f[4102]=16400;f[4105]=16408;f[4104]=16408;f[4107]=16416;f[4106]=16416;f[4109]=16424;f[4108]=16424;f[4111]=16432;f[4110]=16432;f[4113]=16440;f[4112]=16440;f[4115]=16448;f[4114]=16448;f[4117]=16456;f[4116]=16456;f[4119]=16464;f[4118]=16464;f[4121]=16472;f[4120]=16472;f[4123]=16480;f[4122]=16480;f[4125]=16488;f[4124]=16488;f[4127]=16496;f[4126]=16496;f[4129]=16504;f[4128]=16504;f[4131]=16512;f[4130]=16512;f[4133]=16520;f[4132]=16520;f[4135]=16528;f[4134]=16528;f[4137]=16536;f[4136]=16536;f[4139]=16544;f[4138]=16544;f[4141]=16552;f[4140]=16552;f[4143]=16560;f[4142]=16560;f[4145]=16568;f[4144]=16568;f[4147]=16576;f[4146]=16576;Y=la+-40|0;c=ma+8|0;oa=(c&7|0)==0?0:0-c&7;c=ma+oa|0;pa=Y-oa|0;f[4078]=c;f[4075]=pa;f[c+4>>2]=pa|1;f[ma+Y+4>>2]=40;f[4079]=f[4194]}while(0);ma=f[4075]|0;if(ma>>>0>G>>>0){la=ma-G|0;f[4075]=la;ma=f[4078]|0;ka=ma+G|0;f[4078]=ka;f[ka+4>>2]=la|1;f[ma+4>>2]=G|3;o=ma+8|0;u=b;return o|0}}ma=Ro()|0;f[ma>>2]=12;o=0;u=b;return o|0}function Wa(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0;d=u;u=u+80|0;e=d+56|0;g=d+36|0;i=d+16|0;k=d+4|0;l=d+48|0;m=d;f[g>>2]=0;n=g+4|0;f[n>>2]=0;o=g+8|0;f[o>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=1065353216;f[k>>2]=0;p=k+4|0;f[p>>2]=0;q=k+8|0;f[q>>2]=0;r=(f[a+216>>2]|0)==(f[a+220>>2]|0);s=a+120|0;t=f[a+124>>2]|0;a:do if((c|0)>0){v=a+232|0;w=a+420|0;x=a+308|0;y=a+400|0;z=a+416|0;A=a+304|0;B=a+296|0;C=a+300|0;D=a+8|0;E=a+36|0;F=a+40|0;G=i+4|0;H=c+-1|0;I=a+388|0;J=0;b:while(1){K=J+1|0;if((f[w>>2]|0)!=-1?pi(y)|0:0){L=f[w>>2]|0;f[z>>2]=L;if(!L)M=17;else{N=L;M=32}}else M=6;c:do if((M|0)==6){M=0;do if(!(b[x>>0]|0))O=1;else{L=f[A>>2]|0;P=f[B>>2]|0;Q=f[C>>2]|0;R=P+(L>>>3)|0;if(R>>>0<Q>>>0?(S=h[R>>0]|0,R=L+1|0,f[A>>2]=R,1<<(L&7)&S|0):0){S=P+(R>>>3)|0;if(S>>>0<Q>>>0){T=(h[S>>0]|0)>>>(R&7)&1;U=L+2|0;f[A>>2]=U;V=T;W=P+(U>>>3)|0;X=U}else{V=0;W=S;X=R}if(W>>>0<Q>>>0){Q=(h[W>>0]|0)>>>(X&7);f[A>>2]=X+1;Y=Q<<1&2}else Y=0;O=(Y|V)<<1|1;break}f[z>>2]=0;M=17;break c}while(0);f[z>>2]=O;N=O;M=32}while(0);d:do if((M|0)==17){M=0;Q=f[n>>2]|0;if((f[g>>2]|0)==(Q|0)){Z=-1;M=196;break a}R=Q+-4|0;Q=f[R>>2]|0;S=f[D>>2]|0;U=(Q|0)==-1;P=Q+1|0;if(!U?(T=((P>>>0)%3|0|0)==0?Q+-2|0:P,(T|0)!=-1):0)_=f[(f[S>>2]|0)+(T<<2)>>2]|0;else _=-1;T=f[S+24>>2]|0;P=f[T+(_<<2)>>2]|0;L=P+1|0;if((P|0)==-1)$=-1;else $=((L>>>0)%3|0|0)==0?P+-2|0:L;L=J*3|0;P=L+1|0;aa=f[S+12>>2]|0;f[aa+(Q<<2)>>2]=P;f[aa+(P<<2)>>2]=Q;ba=L+2|0;f[aa+($<<2)>>2]=ba;f[aa+(ba<<2)>>2]=$;aa=f[S>>2]|0;f[aa+(L<<2)>>2]=_;S=$+1|0;if(($|0)!=-1?(ca=((S>>>0)%3|0|0)==0?$+-2|0:S,(ca|0)!=-1):0)da=f[aa+(ca<<2)>>2]|0;else da=-1;f[aa+(P<<2)>>2]=da;if(!U?(U=(((Q>>>0)%3|0|0)==0?2:-1)+Q|0,(U|0)!=-1):0){Q=f[aa+(U<<2)>>2]|0;f[aa+(ba<<2)>>2]=Q;if((Q|0)!=-1)f[T+(Q<<2)>>2]=ba}else f[aa+(ba<<2)>>2]=-1;ba=(f[s>>2]|0)+(_>>>5<<2)|0;f[ba>>2]=f[ba>>2]&~(1<<(_&31));f[R>>2]=L;f[l>>2]=f[R>>2];f[e>>2]=f[l>>2];Tc(v,e)}else if((M|0)==32){M=0;R=(N|0)==5;switch(N|0){case 3:case 5:{L=f[n>>2]|0;if((f[g>>2]|0)==(L|0)){Z=-1;M=196;break a}ba=f[L+-4>>2]|0;L=J*3|0;aa=R?L:L+2|0;Q=L+(R&1)|0;T=(R?2:1)+L|0;R=f[D>>2]|0;U=f[R+12>>2]|0;f[U+(T<<2)>>2]=ba;f[U+(ba<<2)>>2]=T;U=R+24|0;P=R+28|0;ca=f[P>>2]|0;if((ca|0)==(f[R+32>>2]|0)){Ng(U,3280);ea=f[P>>2]|0}else{f[ca>>2]=-1;R=ca+4|0;f[P>>2]=R;ea=R}R=ea-(f[U>>2]|0)|0;U=(R>>2)+-1|0;P=f[D>>2]|0;ca=f[P+24>>2]|0;S=ca;if(((f[P+28>>2]|0)-ca>>2|0)>(t|0)){Z=-1;M=196;break a}ca=f[P>>2]|0;f[ca+(T<<2)>>2]=U;if(R|0)f[S+(U<<2)>>2]=T;if((ba|0)!=-1){T=(((ba>>>0)%3|0|0)==0?2:-1)+ba|0;if((T|0)!=-1){U=f[ca+(T<<2)>>2]|0;f[ca+(aa<<2)>>2]=U;if((U|0)!=-1)f[S+(U<<2)>>2]=aa}else f[ca+(aa<<2)>>2]=-1;U=ba+1|0;S=((U>>>0)%3|0|0)==0?ba+-2|0:U;if((S|0)==-1)fa=-1;else fa=f[ca+(S<<2)>>2]|0}else{f[ca+(aa<<2)>>2]=-1;fa=-1}f[ca+(Q<<2)>>2]=fa;Q=(f[n>>2]|0)+-4|0;f[Q>>2]=L;f[l>>2]=f[Q>>2];f[e>>2]=f[l>>2];Tc(v,e);break}case 1:{Q=f[g>>2]|0;L=f[n>>2]|0;if((Q|0)==(L|0)){Z=-1;M=196;break a}ca=L+-4|0;aa=f[ca>>2]|0;f[n>>2]=ca;S=f[G>>2]|0;e:do if(S){U=S+-1|0;ba=(U&S|0)==0;if(!ba)if(J>>>0<S>>>0)ga=J;else ga=(J>>>0)%(S>>>0)|0;else ga=U&J;T=f[(f[i>>2]|0)+(ga<<2)>>2]|0;if((T|0)!=0?(R=f[T>>2]|0,(R|0)!=0):0){f:do if(ba){T=R;while(1){P=f[T+4>>2]|0;ha=(P|0)==(J|0);if(!(ha|(P&U|0)==(ga|0))){ia=Q;ja=ca;break e}if(ha?(f[T+8>>2]|0)==(J|0):0){ka=T;break f}T=f[T>>2]|0;if(!T){ia=Q;ja=ca;break e}}}else{T=R;while(1){ha=f[T+4>>2]|0;if((ha|0)==(J|0)){if((f[T+8>>2]|0)==(J|0)){ka=T;break f}}else{if(ha>>>0<S>>>0)la=ha;else la=(ha>>>0)%(S>>>0)|0;if((la|0)!=(ga|0)){ia=Q;ja=ca;break e}}T=f[T>>2]|0;if(!T){ia=Q;ja=ca;break e}}}while(0);R=ka+12|0;if((ca|0)==(f[o>>2]|0)){Ng(g,R);ia=f[g>>2]|0;ja=f[n>>2]|0;break}else{f[ca>>2]=f[R>>2];f[n>>2]=L;ia=Q;ja=L;break}}else{ia=Q;ja=ca}}else{ia=Q;ja=ca}while(0);if((ia|0)==(ja|0)){Z=-1;M=196;break a}ca=ja+-4|0;Q=f[ca>>2]|0;L=f[D>>2]|0;S=(Q|0)==-1;if(!S?(f[(f[L+12>>2]|0)+(Q<<2)>>2]|0)!=-1:0){Z=-1;M=196;break a}R=(aa|0)==-1;U=f[L+12>>2]|0;if(!R){ba=U+(aa<<2)|0;if((f[ba>>2]|0)==-1)ma=ba;else{Z=-1;M=196;break a}}else ma=U+-4|0;ba=J*3|0;T=ba+2|0;f[U+(Q<<2)>>2]=T;f[U+(T<<2)>>2]=Q;ha=ba+1|0;f[ma>>2]=ha;f[U+(ha<<2)>>2]=aa;if(!S){S=(((Q>>>0)%3|0|0)==0?2:-1)+Q|0;P=f[L>>2]|0;if((S|0)==-1)na=-1;else na=f[P+(S<<2)>>2]|0;f[P+(ba<<2)>>2]=na;S=Q+1|0;oa=((S>>>0)%3|0|0)==0?Q+-2|0:S;if((oa|0)==-1){pa=-1;qa=na;ra=P;sa=L}else{pa=f[P+(oa<<2)>>2]|0;qa=na;ra=P;sa=L}}else{P=f[L>>2]|0;f[P+(ba<<2)>>2]=-1;pa=-1;qa=-1;ra=P;sa=L}f[ra+(ha<<2)>>2]=pa;if(!R){R=(((aa>>>0)%3|0|0)==0?2:-1)+aa|0;if((R|0)!=-1){ha=f[ra+(R<<2)>>2]|0;f[ra+(T<<2)>>2]=ha;if((ha|0)!=-1)f[(f[L+24>>2]|0)+(ha<<2)>>2]=T}else f[ra+(T<<2)>>2]=-1;ha=aa+1|0;R=((ha>>>0)%3|0|0)==0?aa+-2|0:ha;if((R|0)==-1){ta=-1;ua=-1}else{ta=f[ra+(R<<2)>>2]|0;ua=R}}else{f[ra+(T<<2)>>2]=-1;ta=-1;ua=-1}f[e>>2]=ta;T=f[I>>2]|0;R=T+(qa<<2)|0;f[R>>2]=(f[R>>2]|0)+(f[T+(ta<<2)>>2]|0);T=f[L+24>>2]|0;if((qa|0)!=-1)f[T+(qa<<2)>>2]=f[T+(f[e>>2]<<2)>>2];g:do if((ua|0)!=-1){L=f[sa>>2]|0;R=ua;do{f[L+(R<<2)>>2]=qa;ha=R+1|0;P=((ha>>>0)%3|0|0)==0?R+-2|0:ha;if((P|0)==-1)break g;ha=f[U+(P<<2)>>2]|0;P=ha+1|0;if((ha|0)==-1)break g;R=((P>>>0)%3|0|0)==0?ha+-2|0:P}while((R|0)!=-1)}while(0);f[T+(f[e>>2]<<2)>>2]=-1;do if(r){U=f[p>>2]|0;if((U|0)==(f[q>>2]|0)){Ng(k,e);va=(f[n>>2]|0)+-4|0;break}else{f[U>>2]=f[e>>2];f[p>>2]=U+4;va=ca;break}}else va=ca;while(0);f[va>>2]=ba;f[l>>2]=f[va>>2];f[e>>2]=f[l>>2];Tc(v,e);break d;break}case 7:{f[e>>2]=J*3;ca=f[D>>2]|0;T=ca+24|0;U=ca+28|0;aa=f[U>>2]|0;if((aa|0)==(f[ca+32>>2]|0)){Ng(T,3280);wa=f[U>>2]|0}else{f[aa>>2]=-1;ca=aa+4|0;f[U>>2]=ca;wa=ca}ca=wa-(f[T>>2]|0)|0;T=ca>>2;U=T+-1|0;aa=f[D>>2]|0;R=f[e>>2]|0;L=f[aa>>2]|0;f[L+(R<<2)>>2]=U;P=aa+24|0;ha=aa+28|0;oa=f[ha>>2]|0;if((oa|0)==(f[aa+32>>2]|0)){Ng(P,3280);xa=f[ha>>2]|0;ya=f[aa>>2]|0}else{f[oa>>2]=-1;aa=oa+4|0;f[ha>>2]=aa;xa=aa;ya=L}f[ya+(R+1<<2)>>2]=(xa-(f[P>>2]|0)>>2)+-1;P=f[D>>2]|0;R=(f[e>>2]|0)+2|0;L=P+24|0;aa=P+28|0;ha=f[aa>>2]|0;if((ha|0)==(f[P+32>>2]|0)){Ng(L,3280);za=f[aa>>2]|0}else{f[ha>>2]=-1;oa=ha+4|0;f[aa>>2]=oa;za=oa}f[(f[P>>2]|0)+(R<<2)>>2]=(za-(f[L>>2]|0)>>2)+-1;L=f[D>>2]|0;R=f[L+24>>2]|0;P=R;if(((f[L+28>>2]|0)-R>>2|0)>(t|0))break b;R=f[e>>2]|0;if(ca){f[P+(U<<2)>>2]=R;if((ca|0)!=-4){f[P+(T<<2)>>2]=(f[e>>2]|0)+1;ca=T+1|0;if((ca|0)!=-1){Aa=ca;M=119}}else{Aa=0;M=119}}else{f[P+(T<<2)>>2]=R+1;Aa=1;M=119}if((M|0)==119){M=0;f[P+(Aa<<2)>>2]=(f[e>>2]|0)+2}P=f[n>>2]|0;if((P|0)==(f[o>>2]|0)){Ng(g,e);Ba=f[n>>2]|0}else{f[P>>2]=f[e>>2];R=P+4|0;f[n>>2]=R;Ba=R}f[l>>2]=f[Ba+-4>>2];f[e>>2]=f[l>>2];Tc(v,e);break}default:{Z=-1;M=196;break a}}R=c-J+-1|0;P=f[F>>2]|0;if((P|0)!=(f[E>>2]|0)){T=P;do{P=T;ca=P+-12|0;U=f[P+-8>>2]|0;if(U>>>0>R>>>0){Z=-1;M=196;break a}if((U|0)!=(R|0))break d;U=b[P+-4>>0]|0;P=f[ca>>2]|0;f[F>>2]=ca;if((P|0)<0){Z=-1;M=196;break a}ca=f[(f[n>>2]|0)+-4>>2]|0;L=(ca|0)==-1;do if(!(U&1))if(!L)if(!((ca>>>0)%3|0)){Ca=ca+2|0;break}else{Ca=ca+-1|0;break}else Ca=-1;else{oa=ca+1|0;if(L)Ca=-1;else Ca=((oa>>>0)%3|0|0)==0?ca+-2|0:oa}while(0);f[e>>2]=H-P;ca=ed(i,e)|0;f[ca>>2]=Ca;T=f[F>>2]|0}while((T|0)!=(f[E>>2]|0))}}while(0);if((K|0)<(c|0))J=K;else{Da=K;Ea=D;M=139;break a}}Z=-1;M=196}else{Da=0;Ea=a+8|0;M=139}while(0);h:do if((M|0)==139){c=f[Ea>>2]|0;if(((f[c+28>>2]|0)-(f[c+24>>2]|0)>>2|0)<=(t|0)){Ca=f[n>>2]|0;do if((Ca|0)!=(f[g>>2]|0)){l=a+270|0;Ba=a+364|0;o=a+60|0;Aa=a+64|0;za=a+68|0;xa=a+312|0;ya=a+360|0;wa=a+352|0;va=a+356|0;q=a+76|0;r=a+80|0;qa=a+72|0;ua=Da;sa=Ca;i:while(1){ta=sa+-4|0;f[e>>2]=f[ta>>2];f[n>>2]=ta;if((j[l>>1]|0)<514)if(b[Ba>>0]|0){ta=f[ya>>2]|0;ra=(f[wa>>2]|0)+(ta>>>3)|0;if(ra>>>0<(f[va>>2]|0)>>>0){pa=(h[ra>>0]|0)>>>(ta&7)&1;f[ya>>2]=ta+1;Fa=pa;M=147}else M=168}else M=148;else{Fa=(pi(xa)|0)&1;M=147}if((M|0)==147){M=0;if(!Fa)M=168;else M=148}do if((M|0)==148){M=0;pa=f[Ea>>2]|0;ta=f[pa>>2]|0;ra=ta;if((ua|0)>=(((f[pa+4>>2]|0)-ta>>2>>>0)/3|0|0)){M=175;break i}ta=f[e>>2]|0;na=ta+1|0;if((ta|0)!=-1?(ma=((na>>>0)%3|0|0)==0?ta+-2|0:na,(ma|0)!=-1):0)Ga=f[ra+(ma<<2)>>2]|0;else Ga=-1;ma=f[pa+24>>2]|0;na=f[ma+(Ga<<2)>>2]|0;ja=na+1|0;if((na|0)!=-1?(ia=((ja>>>0)%3|0|0)==0?na+-2|0:ja,ja=ia+1|0,(ia|0)!=-1):0){na=((ja>>>0)%3|0|0)==0?ia+-2|0:ja;if((na|0)==-1){Ha=-1;Ia=ia}else{Ha=f[ra+(na<<2)>>2]|0;Ia=ia}}else{Ha=-1;Ia=-1}ia=f[ma+(Ha<<2)>>2]|0;ma=ia+1|0;if((ia|0)!=-1?(na=((ma>>>0)%3|0|0)==0?ia+-2|0:ma,ma=na+1|0,(na|0)!=-1):0){ia=((ma>>>0)%3|0|0)==0?na+-2|0:ma;if((ia|0)==-1){Ja=-1;Ka=na}else{Ja=f[ra+(ia<<2)>>2]|0;Ka=na}}else{Ja=-1;Ka=-1}na=ua*3|0;f[m>>2]=na;ia=f[pa+12>>2]|0;f[ia+(na<<2)>>2]=ta;f[ia+(ta<<2)>>2]=na;na=(f[m>>2]|0)+1|0;f[ia+(na<<2)>>2]=Ia;f[ia+(Ia<<2)>>2]=na;na=(f[m>>2]|0)+2|0;f[ia+(na<<2)>>2]=Ka;f[ia+(Ka<<2)>>2]=na;na=f[m>>2]|0;f[ra+(na<<2)>>2]=Ha;f[ra+(na+1<<2)>>2]=Ja;f[ra+(na+2<<2)>>2]=Ga;ia=(na|0)==-1?-1:Ha;na=f[s>>2]|0;ta=na+(ia>>>5<<2)|0;f[ta>>2]=f[ta>>2]&~(1<<(ia&31));ia=(f[m>>2]|0)+1|0;if((ia|0)==-1)La=-1;else La=f[ra+(ia<<2)>>2]|0;ia=na+(La>>>5<<2)|0;f[ia>>2]=f[ia>>2]&~(1<<(La&31));ia=(f[m>>2]|0)+2|0;if((ia|0)==-1)Ma=-1;else Ma=f[ra+(ia<<2)>>2]|0;ia=na+(Ma>>>5<<2)|0;f[ia>>2]=f[ia>>2]&~(1<<(Ma&31));ia=ua+1|0;na=f[Aa>>2]|0;ra=f[za>>2]|0;if((na|0)==(ra<<5|0)){if((na+1|0)<0){M=162;break i}ta=ra<<6;ra=na+32&-32;vg(o,na>>>0<1073741823?(ta>>>0<ra>>>0?ra:ta):2147483647);Na=f[Aa>>2]|0}else Na=na;f[Aa>>2]=Na+1;na=(f[o>>2]|0)+(Na>>>5<<2)|0;f[na>>2]=f[na>>2]|1<<(Na&31);na=f[q>>2]|0;if((na|0)==(f[r>>2]|0))Ng(qa,m);else{f[na>>2]=f[m>>2];f[q>>2]=na+4}Oa=ia}else if((M|0)==168){M=0;ia=f[Aa>>2]|0;na=f[za>>2]|0;if((ia|0)==(na<<5|0)){if((ia+1|0)<0){M=170;break i}ta=na<<6;na=ia+32&-32;vg(o,ia>>>0<1073741823?(ta>>>0<na>>>0?na:ta):2147483647);Pa=f[Aa>>2]|0}else Pa=ia;f[Aa>>2]=Pa+1;ia=(f[o>>2]|0)+(Pa>>>5<<2)|0;f[ia>>2]=f[ia>>2]&~(1<<(Pa&31));ia=f[q>>2]|0;if((ia|0)==(f[r>>2]|0)){Ng(qa,e);Oa=ua;break}else{f[ia>>2]=f[e>>2];f[q>>2]=ia+4;Oa=ua;break}}while(0);sa=f[n>>2]|0;if((sa|0)==(f[g>>2]|0)){M=177;break}else ua=Oa}if((M|0)==162)$n(o);else if((M|0)==170)$n(o);else if((M|0)==175){Z=-1;M=196;break h}else if((M|0)==177){Qa=Oa;Ra=f[Ea>>2]|0;break}}else{Qa=Da;Ra=c}while(0);if((Qa|0)==(((f[Ra+4>>2]|0)-(f[Ra>>2]|0)>>2>>>0)/3|0|0)){c=(f[Ra+28>>2]|0)-(f[Ra+24>>2]|0)>>2;Ca=f[k>>2]|0;ua=f[p>>2]|0;if((Ca|0)==(ua|0)){Sa=c;Ta=Ca}else{sa=e+4|0;q=e+8|0;qa=e+12|0;r=c;c=Ca;Ca=Ra;while(1){Aa=f[c>>2]|0;za=r+-1|0;xa=f[Ca+24>>2]|0;ya=xa+(za<<2)|0;if((f[ya>>2]|0)==-1){va=r;while(1){wa=va+-1|0;Ba=va+-2|0;l=xa+(Ba<<2)|0;if((f[l>>2]|0)==-1)va=wa;else{Ua=wa;Va=l;Wa=Ba;break}}}else{Ua=r;Va=ya;Wa=za}if(Wa>>>0<Aa>>>0){Xa=Ua;Ya=Ca}else{f[e>>2]=Ca;va=f[Va>>2]|0;f[sa>>2]=va;f[q>>2]=va;b[qa>>0]=1;if((va|0)==-1){Za=xa;_a=Ca}else{o=Ca;Ba=va;do{f[(f[o>>2]|0)+(Ba<<2)>>2]=Aa;Tf(e);Ba=f[q>>2]|0;o=f[Ea>>2]|0}while((Ba|0)!=-1);Za=f[o+24>>2]|0;_a=o}Ba=Za+(Wa<<2)|0;if((Aa|0)!=-1)f[Za+(Aa<<2)>>2]=f[Ba>>2];f[Ba>>2]=-1;Ba=f[s>>2]|0;xa=Ba+(Wa>>>5<<2)|0;za=1<<(Wa&31);ya=Ba+(Aa>>>5<<2)|0;Ba=1<<(Aa&31);if(!(f[xa>>2]&za))$a=f[ya>>2]&~Ba;else $a=f[ya>>2]|Ba;f[ya>>2]=$a;f[xa>>2]=f[xa>>2]&~za;Xa=Ua+-1|0;Ya=_a}c=c+4|0;if((c|0)==(ua|0)){Z=Xa;M=196;break}else{r=Xa;Ca=Ya}}}}else{Z=-1;M=196}}else{Z=-1;M=196}}while(0);if((M|0)==196){Sa=Z;Ta=f[k>>2]|0}if(Ta|0){f[p>>2]=Ta;Ko(Ta)}Ta=f[i+8>>2]|0;if(Ta|0){p=Ta;do{Ta=p;p=f[p>>2]|0;Ko(Ta)}while((p|0)!=0)}p=f[i>>2]|0;f[i>>2]=0;if(p|0)Ko(p);p=f[g>>2]|0;if(!p){u=d;return Sa|0}f[n>>2]=p;Ko(p);u=d;return Sa|0}function Xa(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0;d=u;u=u+80|0;e=d+56|0;g=d+36|0;i=d+16|0;k=d+4|0;l=d+48|0;m=d;f[g>>2]=0;n=g+4|0;f[n>>2]=0;o=g+8|0;f[o>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=1065353216;f[k>>2]=0;p=k+4|0;f[p>>2]=0;q=k+8|0;f[q>>2]=0;r=(f[a+216>>2]|0)==(f[a+220>>2]|0);s=a+120|0;t=f[a+124>>2]|0;a:do if((c|0)>0){v=a+232|0;w=a+8|0;x=a+36|0;y=a+40|0;z=i+4|0;A=c+-1|0;B=a+388|0;C=0;b:while(1){D=C+1|0;E=qf(v)|0;c:do if(E){F=(E|0)==5;switch(E|0){case 3:case 5:{G=f[n>>2]|0;if((f[g>>2]|0)==(G|0)){H=-1;I=184;break a}J=f[G+-4>>2]|0;G=C*3|0;K=F?G:G+2|0;L=G+(F&1)|0;M=(F?2:1)+G|0;F=f[w>>2]|0;N=f[F+12>>2]|0;f[N+(M<<2)>>2]=J;f[N+(J<<2)>>2]=M;N=F+24|0;O=F+28|0;P=f[O>>2]|0;if((P|0)==(f[F+32>>2]|0)){Ng(N,3280);Q=f[O>>2]|0}else{f[P>>2]=-1;F=P+4|0;f[O>>2]=F;Q=F}F=Q-(f[N>>2]|0)|0;N=(F>>2)+-1|0;O=f[w>>2]|0;P=f[O+24>>2]|0;R=P;if(((f[O+28>>2]|0)-P>>2|0)>(t|0)){H=-1;I=184;break a}P=f[O>>2]|0;f[P+(M<<2)>>2]=N;if(F|0)f[R+(N<<2)>>2]=M;if((J|0)!=-1){M=(((J>>>0)%3|0|0)==0?2:-1)+J|0;if((M|0)!=-1){N=f[P+(M<<2)>>2]|0;f[P+(K<<2)>>2]=N;if((N|0)!=-1)f[R+(N<<2)>>2]=K}else f[P+(K<<2)>>2]=-1;N=J+1|0;R=((N>>>0)%3|0|0)==0?J+-2|0:N;if((R|0)==-1)S=-1;else S=f[P+(R<<2)>>2]|0}else{f[P+(K<<2)>>2]=-1;S=-1}f[P+(L<<2)>>2]=S;L=(f[n>>2]|0)+-4|0;f[L>>2]=G;f[l>>2]=f[L>>2];f[e>>2]=f[l>>2];_c(v,e);break}case 1:{L=f[g>>2]|0;G=f[n>>2]|0;if((L|0)==(G|0)){H=-1;I=184;break a}P=G+-4|0;K=f[P>>2]|0;f[n>>2]=P;R=f[z>>2]|0;d:do if(R){N=R+-1|0;J=(N&R|0)==0;if(!J)if(C>>>0<R>>>0)T=C;else T=(C>>>0)%(R>>>0)|0;else T=N&C;M=f[(f[i>>2]|0)+(T<<2)>>2]|0;if((M|0)!=0?(F=f[M>>2]|0,(F|0)!=0):0){e:do if(J){M=F;while(1){O=f[M+4>>2]|0;U=(O|0)==(C|0);if(!(U|(O&N|0)==(T|0))){V=L;W=P;break d}if(U?(f[M+8>>2]|0)==(C|0):0){X=M;break e}M=f[M>>2]|0;if(!M){V=L;W=P;break d}}}else{M=F;while(1){U=f[M+4>>2]|0;if((U|0)==(C|0)){if((f[M+8>>2]|0)==(C|0)){X=M;break e}}else{if(U>>>0<R>>>0)Y=U;else Y=(U>>>0)%(R>>>0)|0;if((Y|0)!=(T|0)){V=L;W=P;break d}}M=f[M>>2]|0;if(!M){V=L;W=P;break d}}}while(0);F=X+12|0;if((P|0)==(f[o>>2]|0)){Ng(g,F);V=f[g>>2]|0;W=f[n>>2]|0;break}else{f[P>>2]=f[F>>2];f[n>>2]=G;V=L;W=G;break}}else{V=L;W=P}}else{V=L;W=P}while(0);if((V|0)==(W|0)){H=-1;I=184;break a}P=W+-4|0;L=f[P>>2]|0;G=f[w>>2]|0;R=(L|0)==-1;if(!R?(f[(f[G+12>>2]|0)+(L<<2)>>2]|0)!=-1:0){H=-1;I=184;break a}F=(K|0)==-1;N=f[G+12>>2]|0;if(!F){J=N+(K<<2)|0;if((f[J>>2]|0)==-1)Z=J;else{H=-1;I=184;break a}}else Z=N+-4|0;J=C*3|0;M=J+2|0;f[N+(L<<2)>>2]=M;f[N+(M<<2)>>2]=L;U=J+1|0;f[Z>>2]=U;f[N+(U<<2)>>2]=K;if(!R){R=(((L>>>0)%3|0|0)==0?2:-1)+L|0;O=f[G>>2]|0;if((R|0)==-1)_=-1;else _=f[O+(R<<2)>>2]|0;f[O+(J<<2)>>2]=_;R=L+1|0;$=((R>>>0)%3|0|0)==0?L+-2|0:R;if(($|0)==-1){aa=-1;ba=_;ca=O;da=G}else{aa=f[O+($<<2)>>2]|0;ba=_;ca=O;da=G}}else{O=f[G>>2]|0;f[O+(J<<2)>>2]=-1;aa=-1;ba=-1;ca=O;da=G}f[ca+(U<<2)>>2]=aa;if(!F){F=(((K>>>0)%3|0|0)==0?2:-1)+K|0;if((F|0)!=-1){U=f[ca+(F<<2)>>2]|0;f[ca+(M<<2)>>2]=U;if((U|0)!=-1)f[(f[G+24>>2]|0)+(U<<2)>>2]=M}else f[ca+(M<<2)>>2]=-1;U=K+1|0;F=((U>>>0)%3|0|0)==0?K+-2|0:U;if((F|0)==-1){ea=-1;fa=-1}else{ea=f[ca+(F<<2)>>2]|0;fa=F}}else{f[ca+(M<<2)>>2]=-1;ea=-1;fa=-1}f[e>>2]=ea;M=f[B>>2]|0;F=M+(ba<<2)|0;f[F>>2]=(f[F>>2]|0)+(f[M+(ea<<2)>>2]|0);M=f[G+24>>2]|0;if((ba|0)!=-1)f[M+(ba<<2)>>2]=f[M+(f[e>>2]<<2)>>2];f:do if((fa|0)!=-1){G=f[da>>2]|0;F=fa;do{f[G+(F<<2)>>2]=ba;U=F+1|0;O=((U>>>0)%3|0|0)==0?F+-2|0:U;if((O|0)==-1)break f;U=f[N+(O<<2)>>2]|0;O=U+1|0;if((U|0)==-1)break f;F=((O>>>0)%3|0|0)==0?U+-2|0:O}while((F|0)!=-1)}while(0);f[M+(f[e>>2]<<2)>>2]=-1;do if(r){N=f[p>>2]|0;if((N|0)==(f[q>>2]|0)){Ng(k,e);ga=(f[n>>2]|0)+-4|0;break}else{f[N>>2]=f[e>>2];f[p>>2]=N+4;ga=P;break}}else ga=P;while(0);f[ga>>2]=J;f[l>>2]=f[ga>>2];f[e>>2]=f[l>>2];_c(v,e);break c;break}case 7:{f[e>>2]=C*3;P=f[w>>2]|0;M=P+24|0;N=P+28|0;K=f[N>>2]|0;if((K|0)==(f[P+32>>2]|0)){Ng(M,3280);ha=f[N>>2]|0}else{f[K>>2]=-1;P=K+4|0;f[N>>2]=P;ha=P}P=ha-(f[M>>2]|0)|0;M=P>>2;N=M+-1|0;K=f[w>>2]|0;F=f[e>>2]|0;G=f[K>>2]|0;f[G+(F<<2)>>2]=N;O=K+24|0;U=K+28|0;$=f[U>>2]|0;if(($|0)==(f[K+32>>2]|0)){Ng(O,3280);ia=f[U>>2]|0;ja=f[K>>2]|0}else{f[$>>2]=-1;K=$+4|0;f[U>>2]=K;ia=K;ja=G}f[ja+(F+1<<2)>>2]=(ia-(f[O>>2]|0)>>2)+-1;O=f[w>>2]|0;F=(f[e>>2]|0)+2|0;G=O+24|0;K=O+28|0;U=f[K>>2]|0;if((U|0)==(f[O+32>>2]|0)){Ng(G,3280);ka=f[K>>2]|0}else{f[U>>2]=-1;$=U+4|0;f[K>>2]=$;ka=$}f[(f[O>>2]|0)+(F<<2)>>2]=(ka-(f[G>>2]|0)>>2)+-1;G=f[w>>2]|0;F=f[G+24>>2]|0;O=F;if(((f[G+28>>2]|0)-F>>2|0)>(t|0))break b;F=f[e>>2]|0;if(P){f[O+(N<<2)>>2]=F;if((P|0)!=-4){f[O+(M<<2)>>2]=(f[e>>2]|0)+1;P=M+1|0;if((P|0)!=-1){la=P;I=107}}else{la=0;I=107}}else{f[O+(M<<2)>>2]=F+1;la=1;I=107}if((I|0)==107){I=0;f[O+(la<<2)>>2]=(f[e>>2]|0)+2}O=f[n>>2]|0;if((O|0)==(f[o>>2]|0)){Ng(g,e);ma=f[n>>2]|0}else{f[O>>2]=f[e>>2];F=O+4|0;f[n>>2]=F;ma=F}f[l>>2]=f[ma+-4>>2];f[e>>2]=f[l>>2];_c(v,e);break}default:{H=-1;I=184;break a}}F=c-C+-1|0;O=f[y>>2]|0;if((O|0)!=(f[x>>2]|0)){M=O;do{O=M;P=O+-12|0;N=f[O+-8>>2]|0;if(N>>>0>F>>>0){H=-1;I=184;break a}if((N|0)!=(F|0))break c;N=b[O+-4>>0]|0;O=f[P>>2]|0;f[y>>2]=P;if((O|0)<0){H=-1;I=184;break a}P=f[(f[n>>2]|0)+-4>>2]|0;G=(P|0)==-1;do if(!(N&1))if(!G)if(!((P>>>0)%3|0)){na=P+2|0;break}else{na=P+-1|0;break}else na=-1;else{$=P+1|0;if(G)na=-1;else na=(($>>>0)%3|0|0)==0?P+-2|0:$}while(0);f[e>>2]=A-O;P=ed(i,e)|0;f[P>>2]=na;M=f[y>>2]|0}while((M|0)!=(f[x>>2]|0))}}else{M=f[n>>2]|0;if((f[g>>2]|0)==(M|0)){H=-1;I=184;break a}F=M+-4|0;M=f[F>>2]|0;J=f[w>>2]|0;P=(M|0)==-1;G=M+1|0;if(!P?(N=((G>>>0)%3|0|0)==0?M+-2|0:G,(N|0)!=-1):0)oa=f[(f[J>>2]|0)+(N<<2)>>2]|0;else oa=-1;N=f[J+24>>2]|0;G=f[N+(oa<<2)>>2]|0;$=G+1|0;if((G|0)==-1)pa=-1;else pa=(($>>>0)%3|0|0)==0?G+-2|0:$;$=C*3|0;G=$+1|0;K=f[J+12>>2]|0;f[K+(M<<2)>>2]=G;f[K+(G<<2)>>2]=M;U=$+2|0;f[K+(pa<<2)>>2]=U;f[K+(U<<2)>>2]=pa;K=f[J>>2]|0;f[K+($<<2)>>2]=oa;J=pa+1|0;if((pa|0)!=-1?(R=((J>>>0)%3|0|0)==0?pa+-2|0:J,(R|0)!=-1):0)qa=f[K+(R<<2)>>2]|0;else qa=-1;f[K+(G<<2)>>2]=qa;if(!P?(P=(((M>>>0)%3|0|0)==0?2:-1)+M|0,(P|0)!=-1):0){M=f[K+(P<<2)>>2]|0;f[K+(U<<2)>>2]=M;if((M|0)!=-1)f[N+(M<<2)>>2]=U}else f[K+(U<<2)>>2]=-1;U=(f[s>>2]|0)+(oa>>>5<<2)|0;f[U>>2]=f[U>>2]&~(1<<(oa&31));f[F>>2]=$;f[l>>2]=f[F>>2];f[e>>2]=f[l>>2];_c(v,e)}while(0);if((D|0)<(c|0))C=D;else{ra=D;sa=w;I=127;break a}}H=-1;I=184}else{ra=0;sa=a+8|0;I=127}while(0);g:do if((I|0)==127){c=f[sa>>2]|0;if(((f[c+28>>2]|0)-(f[c+24>>2]|0)>>2|0)<=(t|0)){l=f[n>>2]|0;do if((l|0)!=(f[g>>2]|0)){oa=a+270|0;qa=a+364|0;pa=a+60|0;na=a+64|0;ma=a+68|0;o=a+312|0;la=a+360|0;ka=a+352|0;ia=a+356|0;ja=a+76|0;ha=a+80|0;ga=a+72|0;q=ra;r=l;h:while(1){ba=r+-4|0;f[e>>2]=f[ba>>2];f[n>>2]=ba;if((j[oa>>1]|0)<514)if(b[qa>>0]|0){ba=f[la>>2]|0;fa=(f[ka>>2]|0)+(ba>>>3)|0;if(fa>>>0<(f[ia>>2]|0)>>>0){da=(h[fa>>0]|0)>>>(ba&7)&1;f[la>>2]=ba+1;ta=da;I=135}else I=156}else I=136;else{ta=(pi(o)|0)&1;I=135}if((I|0)==135){I=0;if(!ta)I=156;else I=136}do if((I|0)==136){I=0;da=f[sa>>2]|0;ba=f[da>>2]|0;fa=ba;if((q|0)>=(((f[da+4>>2]|0)-ba>>2>>>0)/3|0|0)){I=163;break h}ba=f[e>>2]|0;ea=ba+1|0;if((ba|0)!=-1?(ca=((ea>>>0)%3|0|0)==0?ba+-2|0:ea,(ca|0)!=-1):0)ua=f[fa+(ca<<2)>>2]|0;else ua=-1;ca=f[da+24>>2]|0;ea=f[ca+(ua<<2)>>2]|0;aa=ea+1|0;if((ea|0)!=-1?(_=((aa>>>0)%3|0|0)==0?ea+-2|0:aa,aa=_+1|0,(_|0)!=-1):0){ea=((aa>>>0)%3|0|0)==0?_+-2|0:aa;if((ea|0)==-1){va=-1;wa=_}else{va=f[fa+(ea<<2)>>2]|0;wa=_}}else{va=-1;wa=-1}_=f[ca+(va<<2)>>2]|0;ca=_+1|0;if((_|0)!=-1?(ea=((ca>>>0)%3|0|0)==0?_+-2|0:ca,ca=ea+1|0,(ea|0)!=-1):0){_=((ca>>>0)%3|0|0)==0?ea+-2|0:ca;if((_|0)==-1){xa=-1;ya=ea}else{xa=f[fa+(_<<2)>>2]|0;ya=ea}}else{xa=-1;ya=-1}ea=q*3|0;f[m>>2]=ea;_=f[da+12>>2]|0;f[_+(ea<<2)>>2]=ba;f[_+(ba<<2)>>2]=ea;ea=(f[m>>2]|0)+1|0;f[_+(ea<<2)>>2]=wa;f[_+(wa<<2)>>2]=ea;ea=(f[m>>2]|0)+2|0;f[_+(ea<<2)>>2]=ya;f[_+(ya<<2)>>2]=ea;ea=f[m>>2]|0;f[fa+(ea<<2)>>2]=va;f[fa+(ea+1<<2)>>2]=xa;f[fa+(ea+2<<2)>>2]=ua;_=(ea|0)==-1?-1:va;ea=f[s>>2]|0;ba=ea+(_>>>5<<2)|0;f[ba>>2]=f[ba>>2]&~(1<<(_&31));_=(f[m>>2]|0)+1|0;if((_|0)==-1)za=-1;else za=f[fa+(_<<2)>>2]|0;_=ea+(za>>>5<<2)|0;f[_>>2]=f[_>>2]&~(1<<(za&31));_=(f[m>>2]|0)+2|0;if((_|0)==-1)Aa=-1;else Aa=f[fa+(_<<2)>>2]|0;_=ea+(Aa>>>5<<2)|0;f[_>>2]=f[_>>2]&~(1<<(Aa&31));_=q+1|0;ea=f[na>>2]|0;fa=f[ma>>2]|0;if((ea|0)==(fa<<5|0)){if((ea+1|0)<0){I=150;break h}ba=fa<<6;fa=ea+32&-32;vg(pa,ea>>>0<1073741823?(ba>>>0<fa>>>0?fa:ba):2147483647);Ba=f[na>>2]|0}else Ba=ea;f[na>>2]=Ba+1;ea=(f[pa>>2]|0)+(Ba>>>5<<2)|0;f[ea>>2]=f[ea>>2]|1<<(Ba&31);ea=f[ja>>2]|0;if((ea|0)==(f[ha>>2]|0))Ng(ga,m);else{f[ea>>2]=f[m>>2];f[ja>>2]=ea+4}Ca=_}else if((I|0)==156){I=0;_=f[na>>2]|0;ea=f[ma>>2]|0;if((_|0)==(ea<<5|0)){if((_+1|0)<0){I=158;break h}ba=ea<<6;ea=_+32&-32;vg(pa,_>>>0<1073741823?(ba>>>0<ea>>>0?ea:ba):2147483647);Da=f[na>>2]|0}else Da=_;f[na>>2]=Da+1;_=(f[pa>>2]|0)+(Da>>>5<<2)|0;f[_>>2]=f[_>>2]&~(1<<(Da&31));_=f[ja>>2]|0;if((_|0)==(f[ha>>2]|0)){Ng(ga,e);Ca=q;break}else{f[_>>2]=f[e>>2];f[ja>>2]=_+4;Ca=q;break}}while(0);r=f[n>>2]|0;if((r|0)==(f[g>>2]|0)){I=165;break}else q=Ca}if((I|0)==150)$n(pa);else if((I|0)==158)$n(pa);else if((I|0)==163){H=-1;I=184;break g}else if((I|0)==165){Ea=Ca;Fa=f[sa>>2]|0;break}}else{Ea=ra;Fa=c}while(0);if((Ea|0)==(((f[Fa+4>>2]|0)-(f[Fa>>2]|0)>>2>>>0)/3|0|0)){c=(f[Fa+28>>2]|0)-(f[Fa+24>>2]|0)>>2;l=f[k>>2]|0;q=f[p>>2]|0;if((l|0)==(q|0)){Ga=c;Ha=l}else{r=e+4|0;ja=e+8|0;ga=e+12|0;ha=c;c=l;l=Fa;while(1){na=f[c>>2]|0;ma=ha+-1|0;o=f[l+24>>2]|0;la=o+(ma<<2)|0;if((f[la>>2]|0)==-1){ia=ha;while(1){ka=ia+-1|0;qa=ia+-2|0;oa=o+(qa<<2)|0;if((f[oa>>2]|0)==-1)ia=ka;else{Ia=ka;Ja=oa;Ka=qa;break}}}else{Ia=ha;Ja=la;Ka=ma}if(Ka>>>0<na>>>0){La=Ia;Ma=l}else{f[e>>2]=l;ia=f[Ja>>2]|0;f[r>>2]=ia;f[ja>>2]=ia;b[ga>>0]=1;if((ia|0)==-1){Na=o;Oa=l}else{pa=l;qa=ia;do{f[(f[pa>>2]|0)+(qa<<2)>>2]=na;Tf(e);qa=f[ja>>2]|0;pa=f[sa>>2]|0}while((qa|0)!=-1);Na=f[pa+24>>2]|0;Oa=pa}qa=Na+(Ka<<2)|0;if((na|0)!=-1)f[Na+(na<<2)>>2]=f[qa>>2];f[qa>>2]=-1;qa=f[s>>2]|0;o=qa+(Ka>>>5<<2)|0;ma=1<<(Ka&31);la=qa+(na>>>5<<2)|0;qa=1<<(na&31);if(!(f[o>>2]&ma))Pa=f[la>>2]&~qa;else Pa=f[la>>2]|qa;f[la>>2]=Pa;f[o>>2]=f[o>>2]&~ma;La=Ia+-1|0;Ma=Oa}c=c+4|0;if((c|0)==(q|0)){H=La;I=184;break}else{ha=La;l=Ma}}}}else{H=-1;I=184}}else{H=-1;I=184}}while(0);if((I|0)==184){Ga=H;Ha=f[k>>2]|0}if(Ha|0){f[p>>2]=Ha;Ko(Ha)}Ha=f[i+8>>2]|0;if(Ha|0){p=Ha;do{Ha=p;p=f[p>>2]|0;Ko(Ha)}while((p|0)!=0)}p=f[i>>2]|0;f[i>>2]=0;if(p|0)Ko(p);p=f[g>>2]|0;if(!p){u=d;return Ga|0}f[n>>2]=p;Ko(p);u=d;return Ga|0}function Ya(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0;d=u;u=u+80|0;e=d+56|0;g=d+36|0;i=d+24|0;k=d+8|0;l=d;f[e>>2]=0;m=e+4|0;f[m>>2]=0;n=e+8|0;f[n>>2]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=1065353216;f[i>>2]=0;o=i+4|0;f[o>>2]=0;p=i+8|0;f[p>>2]=0;q=(f[a+216>>2]|0)==(f[a+220>>2]|0);r=a+120|0;s=f[a+124>>2]|0;a:do if((c|0)>0){t=a+308|0;v=a+304|0;w=a+296|0;x=a+300|0;y=g+4|0;z=a+8|0;A=a+36|0;B=a+40|0;C=c+-1|0;D=0;b:while(1){E=D+1|0;c:do if(!(b[t>>0]|0))F=43;else{G=f[v>>2]|0;H=f[w>>2]|0;I=f[x>>2]|0;J=H+(G>>>3)|0;if(J>>>0<I>>>0?(K=h[J>>0]|0,J=G+1|0,f[v>>2]=J,1<<(G&7)&K|0):0){K=H+(J>>>3)|0;if(K>>>0<I>>>0){L=(h[K>>0]|0)>>>(J&7)&1;M=G+2|0;f[v>>2]=M;N=L;O=H+(M>>>3)|0;P=M}else{N=0;O=K;P=J}if(O>>>0<I>>>0){I=(h[O>>0]|0)>>>(P&7);f[v>>2]=P+1;Q=I<<1&2}else Q=0;I=(Q|N)<<1|1;J=(I|0)==5;switch(I&7){case 1:{F=43;break c;break}case 3:case 5:{I=f[m>>2]|0;if((f[e>>2]|0)==(I|0)){R=-1;F=191;break a}K=f[I+-4>>2]|0;I=D*3|0;M=J?I:I+2|0;H=I+(J&1)|0;L=(J?2:1)+I|0;J=f[z>>2]|0;G=f[J+12>>2]|0;f[G+(L<<2)>>2]=K;f[G+(K<<2)>>2]=L;G=J+24|0;S=J+28|0;T=f[S>>2]|0;if((T|0)==(f[J+32>>2]|0)){Ng(G,3280);U=f[S>>2]|0}else{f[T>>2]=-1;J=T+4|0;f[S>>2]=J;U=J}J=U-(f[G>>2]|0)|0;G=(J>>2)+-1|0;S=f[z>>2]|0;T=f[S+24>>2]|0;V=T;if(((f[S+28>>2]|0)-T>>2|0)>(s|0)){R=-1;F=191;break a}T=f[S>>2]|0;f[T+(L<<2)>>2]=G;if(J|0)f[V+(G<<2)>>2]=L;if((K|0)!=-1){L=(((K>>>0)%3|0|0)==0?2:-1)+K|0;if((L|0)!=-1){G=f[T+(L<<2)>>2]|0;f[T+(M<<2)>>2]=G;if((G|0)!=-1)f[V+(G<<2)>>2]=M}else f[T+(M<<2)>>2]=-1;G=K+1|0;V=((G>>>0)%3|0|0)==0?K+-2|0:G;if((V|0)==-1)W=-1;else W=f[T+(V<<2)>>2]|0}else{f[T+(M<<2)>>2]=-1;W=-1}f[T+(H<<2)>>2]=W;f[(f[m>>2]|0)+-4>>2]=I;break}case 7:{f[k>>2]=D*3;I=f[z>>2]|0;H=I+24|0;T=I+28|0;M=f[T>>2]|0;if((M|0)==(f[I+32>>2]|0)){Ng(H,3280);X=f[T>>2]|0}else{f[M>>2]=-1;I=M+4|0;f[T>>2]=I;X=I}I=X-(f[H>>2]|0)|0;H=I>>2;T=H+-1|0;M=f[z>>2]|0;V=f[k>>2]|0;G=f[M>>2]|0;f[G+(V<<2)>>2]=T;K=M+24|0;L=M+28|0;J=f[L>>2]|0;if((J|0)==(f[M+32>>2]|0)){Ng(K,3280);Y=f[L>>2]|0;Z=f[M>>2]|0}else{f[J>>2]=-1;M=J+4|0;f[L>>2]=M;Y=M;Z=G}f[Z+(V+1<<2)>>2]=(Y-(f[K>>2]|0)>>2)+-1;K=f[z>>2]|0;V=(f[k>>2]|0)+2|0;G=K+24|0;M=K+28|0;L=f[M>>2]|0;if((L|0)==(f[K+32>>2]|0)){Ng(G,3280);_=f[M>>2]|0}else{f[L>>2]=-1;J=L+4|0;f[M>>2]=J;_=J}f[(f[K>>2]|0)+(V<<2)>>2]=(_-(f[G>>2]|0)>>2)+-1;G=f[z>>2]|0;V=f[G+24>>2]|0;K=V;if(((f[G+28>>2]|0)-V>>2|0)>(s|0)){F=117;break b}V=f[k>>2]|0;if(I){f[K+(T<<2)>>2]=V;if((I|0)!=-4){f[K+(H<<2)>>2]=(f[k>>2]|0)+1;I=H+1|0;if((I|0)!=-1){$=I;F=112}}else{$=0;F=112}}else{f[K+(H<<2)>>2]=V+1;$=1;F=112}if((F|0)==112){F=0;f[K+($<<2)>>2]=(f[k>>2]|0)+2}K=f[m>>2]|0;if((K|0)==(f[n>>2]|0))Ng(e,k);else{f[K>>2]=f[k>>2];f[m>>2]=K+4}break}default:{F=190;break b}}K=c-D+-1|0;V=f[B>>2]|0;if((V|0)==(f[A>>2]|0))break;H=V;while(1){V=H;I=V+-12|0;T=f[V+-8>>2]|0;if(T>>>0>K>>>0){R=-1;F=191;break a}if((T|0)!=(K|0))break c;T=b[V+-4>>0]|0;V=f[I>>2]|0;f[B>>2]=I;if((V|0)<0){R=-1;F=191;break a}I=f[(f[m>>2]|0)+-4>>2]|0;G=(I|0)==-1;do if(!(T&1))if(!G)if(!((I>>>0)%3|0)){aa=I+2|0;break}else{aa=I+-1|0;break}else aa=-1;else{J=I+1|0;if(G)aa=-1;else aa=((J>>>0)%3|0|0)==0?I+-2|0:J}while(0);f[k>>2]=C-V;I=ed(g,k)|0;f[I>>2]=aa;H=f[B>>2]|0;if((H|0)==(f[A>>2]|0))break c}}H=f[m>>2]|0;if((f[e>>2]|0)==(H|0)){R=-1;F=191;break a}K=H+-4|0;H=f[K>>2]|0;I=f[z>>2]|0;G=(H|0)==-1;T=H+1|0;if(!G?(J=((T>>>0)%3|0|0)==0?H+-2|0:T,(J|0)!=-1):0)ba=f[(f[I>>2]|0)+(J<<2)>>2]|0;else ba=-1;J=f[I+24>>2]|0;T=f[J+(ba<<2)>>2]|0;M=T+1|0;if((T|0)==-1)ca=-1;else ca=((M>>>0)%3|0|0)==0?T+-2|0:M;M=D*3|0;T=M+1|0;L=f[I+12>>2]|0;f[L+(H<<2)>>2]=T;f[L+(T<<2)>>2]=H;S=M+2|0;f[L+(ca<<2)>>2]=S;f[L+(S<<2)>>2]=ca;L=f[I>>2]|0;f[L+(M<<2)>>2]=ba;I=ca+1|0;if((ca|0)!=-1?(da=((I>>>0)%3|0|0)==0?ca+-2|0:I,(da|0)!=-1):0)ea=f[L+(da<<2)>>2]|0;else ea=-1;f[L+(T<<2)>>2]=ea;if(!G?(G=(((H>>>0)%3|0|0)==0?2:-1)+H|0,(G|0)!=-1):0){H=f[L+(G<<2)>>2]|0;f[L+(S<<2)>>2]=H;if((H|0)!=-1)f[J+(H<<2)>>2]=S}else f[L+(S<<2)>>2]=-1;S=(f[r>>2]|0)+(ba>>>5<<2)|0;f[S>>2]=f[S>>2]&~(1<<(ba&31));f[K>>2]=M}while(0);if((F|0)==43){F=0;M=f[e>>2]|0;K=f[m>>2]|0;if((M|0)==(K|0)){R=-1;F=191;break a}S=K+-4|0;L=f[S>>2]|0;f[m>>2]=S;H=f[y>>2]|0;d:do if(H){J=H+-1|0;G=(J&H|0)==0;if(!G)if(D>>>0<H>>>0)fa=D;else fa=(D>>>0)%(H>>>0)|0;else fa=J&D;T=f[(f[g>>2]|0)+(fa<<2)>>2]|0;if((T|0)!=0?(da=f[T>>2]|0,(da|0)!=0):0){e:do if(G){T=da;while(1){I=f[T+4>>2]|0;ga=(I|0)==(D|0);if(!(ga|(I&J|0)==(fa|0))){ha=M;ia=S;break d}if(ga?(f[T+8>>2]|0)==(D|0):0){ja=T;break e}T=f[T>>2]|0;if(!T){ha=M;ia=S;break d}}}else{T=da;while(1){V=f[T+4>>2]|0;if((V|0)==(D|0)){if((f[T+8>>2]|0)==(D|0)){ja=T;break e}}else{if(V>>>0<H>>>0)ka=V;else ka=(V>>>0)%(H>>>0)|0;if((ka|0)!=(fa|0)){ha=M;ia=S;break d}}T=f[T>>2]|0;if(!T){ha=M;ia=S;break d}}}while(0);da=ja+12|0;if((S|0)==(f[n>>2]|0)){Ng(e,da);ha=f[e>>2]|0;ia=f[m>>2]|0;break}else{f[S>>2]=f[da>>2];f[m>>2]=K;ha=M;ia=K;break}}else{ha=M;ia=S}}else{ha=M;ia=S}while(0);if((ha|0)==(ia|0)){R=-1;F=191;break a}S=ia+-4|0;M=f[S>>2]|0;K=f[z>>2]|0;H=(M|0)==-1;if(!H?(f[(f[K+12>>2]|0)+(M<<2)>>2]|0)!=-1:0){R=-1;F=191;break a}da=(L|0)==-1;J=f[K+12>>2]|0;if(!da){G=J+(L<<2)|0;if((f[G>>2]|0)==-1)la=G;else{R=-1;F=191;break a}}else la=J+-4|0;G=D*3|0;T=G+2|0;f[J+(M<<2)>>2]=T;f[J+(T<<2)>>2]=M;V=G+1|0;f[la>>2]=V;f[J+(V<<2)>>2]=L;if(!H){H=(((M>>>0)%3|0|0)==0?2:-1)+M|0;ga=f[K>>2]|0;if((H|0)==-1)ma=-1;else ma=f[ga+(H<<2)>>2]|0;f[ga+(G<<2)>>2]=ma;H=M+1|0;I=((H>>>0)%3|0|0)==0?M+-2|0:H;if((I|0)==-1){na=-1;oa=ma;pa=ga;qa=K}else{na=f[ga+(I<<2)>>2]|0;oa=ma;pa=ga;qa=K}}else{ga=f[K>>2]|0;f[ga+(G<<2)>>2]=-1;na=-1;oa=-1;pa=ga;qa=K}f[pa+(V<<2)>>2]=na;if(!da){da=(((L>>>0)%3|0|0)==0?2:-1)+L|0;if((da|0)!=-1){V=f[pa+(da<<2)>>2]|0;f[pa+(T<<2)>>2]=V;if((V|0)!=-1)f[(f[K+24>>2]|0)+(V<<2)>>2]=T}else f[pa+(T<<2)>>2]=-1;V=L+1|0;da=((V>>>0)%3|0|0)==0?L+-2|0:V;if((da|0)==-1){ra=-1;sa=-1}else{ra=f[pa+(da<<2)>>2]|0;sa=da}}else{f[pa+(T<<2)>>2]=-1;ra=-1;sa=-1}f[k>>2]=ra;T=f[K+24>>2]|0;if((oa|0)!=-1)f[T+(oa<<2)>>2]=f[T+(ra<<2)>>2];f:do if((sa|0)!=-1){K=f[qa>>2]|0;da=sa;do{f[K+(da<<2)>>2]=oa;V=da+1|0;ga=((V>>>0)%3|0|0)==0?da+-2|0:V;if((ga|0)==-1)break f;V=f[J+(ga<<2)>>2]|0;ga=V+1|0;if((V|0)==-1)break f;da=((ga>>>0)%3|0|0)==0?V+-2|0:ga}while((da|0)!=-1)}while(0);f[T+(f[k>>2]<<2)>>2]=-1;do if(q){J=f[o>>2]|0;if((J|0)==(f[p>>2]|0)){Ng(i,k);ta=(f[m>>2]|0)+-4|0;break}else{f[J>>2]=f[k>>2];f[o>>2]=J+4;ta=S;break}}else ta=S;while(0);f[ta>>2]=G}if((E|0)<(c|0))D=E;else{ua=E;va=z;F=133;break a}}if((F|0)==117){R=-1;F=191;break}}else{ua=0;va=a+8|0;F=133}while(0);g:do if((F|0)==133){c=f[va>>2]|0;if(((f[c+28>>2]|0)-(f[c+24>>2]|0)>>2|0)<=(s|0)){ta=f[m>>2]|0;do if((ta|0)!=(f[e>>2]|0)){p=a+270|0;q=a+364|0;oa=a+60|0;sa=a+64|0;qa=a+68|0;ra=a+312|0;pa=a+360|0;na=a+352|0;ma=a+356|0;la=a+76|0;ia=a+80|0;ha=a+72|0;n=ua;ja=ta;h:while(1){fa=ja+-4|0;f[k>>2]=f[fa>>2];f[m>>2]=fa;if((j[p>>1]|0)<514)if(b[q>>0]|0){fa=f[pa>>2]|0;ka=(f[na>>2]|0)+(fa>>>3)|0;if(ka>>>0<(f[ma>>2]|0)>>>0){ba=(h[ka>>0]|0)>>>(fa&7)&1;f[pa>>2]=fa+1;wa=ba;F=141}else F=162}else F=142;else{wa=(pi(ra)|0)&1;F=141}if((F|0)==141){F=0;if(!wa)F=162;else F=142}do if((F|0)==142){F=0;ba=f[va>>2]|0;fa=f[ba>>2]|0;ka=fa;if((n|0)>=(((f[ba+4>>2]|0)-fa>>2>>>0)/3|0|0)){F=169;break h}fa=f[k>>2]|0;ea=fa+1|0;if((fa|0)!=-1?(ca=((ea>>>0)%3|0|0)==0?fa+-2|0:ea,(ca|0)!=-1):0)xa=f[ka+(ca<<2)>>2]|0;else xa=-1;ca=f[ba+24>>2]|0;ea=f[ca+(xa<<2)>>2]|0;aa=ea+1|0;if((ea|0)!=-1?($=((aa>>>0)%3|0|0)==0?ea+-2|0:aa,aa=$+1|0,($|0)!=-1):0){ea=((aa>>>0)%3|0|0)==0?$+-2|0:aa;if((ea|0)==-1){ya=-1;za=$}else{ya=f[ka+(ea<<2)>>2]|0;za=$}}else{ya=-1;za=-1}$=f[ca+(ya<<2)>>2]|0;ca=$+1|0;if(($|0)!=-1?(ea=((ca>>>0)%3|0|0)==0?$+-2|0:ca,ca=ea+1|0,(ea|0)!=-1):0){$=((ca>>>0)%3|0|0)==0?ea+-2|0:ca;if(($|0)==-1){Aa=-1;Ba=ea}else{Aa=f[ka+($<<2)>>2]|0;Ba=ea}}else{Aa=-1;Ba=-1}ea=n*3|0;f[l>>2]=ea;$=f[ba+12>>2]|0;f[$+(ea<<2)>>2]=fa;f[$+(fa<<2)>>2]=ea;ea=(f[l>>2]|0)+1|0;f[$+(ea<<2)>>2]=za;f[$+(za<<2)>>2]=ea;ea=(f[l>>2]|0)+2|0;f[$+(ea<<2)>>2]=Ba;f[$+(Ba<<2)>>2]=ea;ea=f[l>>2]|0;f[ka+(ea<<2)>>2]=ya;f[ka+(ea+1<<2)>>2]=Aa;f[ka+(ea+2<<2)>>2]=xa;$=(ea|0)==-1?-1:ya;ea=f[r>>2]|0;fa=ea+($>>>5<<2)|0;f[fa>>2]=f[fa>>2]&~(1<<($&31));$=(f[l>>2]|0)+1|0;if(($|0)==-1)Ca=-1;else Ca=f[ka+($<<2)>>2]|0;$=ea+(Ca>>>5<<2)|0;f[$>>2]=f[$>>2]&~(1<<(Ca&31));$=(f[l>>2]|0)+2|0;if(($|0)==-1)Da=-1;else Da=f[ka+($<<2)>>2]|0;$=ea+(Da>>>5<<2)|0;f[$>>2]=f[$>>2]&~(1<<(Da&31));$=n+1|0;ea=f[sa>>2]|0;ka=f[qa>>2]|0;if((ea|0)==(ka<<5|0)){if((ea+1|0)<0){F=156;break h}fa=ka<<6;ka=ea+32&-32;vg(oa,ea>>>0<1073741823?(fa>>>0<ka>>>0?ka:fa):2147483647);Ea=f[sa>>2]|0}else Ea=ea;f[sa>>2]=Ea+1;ea=(f[oa>>2]|0)+(Ea>>>5<<2)|0;f[ea>>2]=f[ea>>2]|1<<(Ea&31);ea=f[la>>2]|0;if((ea|0)==(f[ia>>2]|0))Ng(ha,l);else{f[ea>>2]=f[l>>2];f[la>>2]=ea+4}Fa=$}else if((F|0)==162){F=0;$=f[sa>>2]|0;ea=f[qa>>2]|0;if(($|0)==(ea<<5|0)){if(($+1|0)<0){F=164;break h}fa=ea<<6;ea=$+32&-32;vg(oa,$>>>0<1073741823?(fa>>>0<ea>>>0?ea:fa):2147483647);Ga=f[sa>>2]|0}else Ga=$;f[sa>>2]=Ga+1;$=(f[oa>>2]|0)+(Ga>>>5<<2)|0;f[$>>2]=f[$>>2]&~(1<<(Ga&31));$=f[la>>2]|0;if(($|0)==(f[ia>>2]|0)){Ng(ha,k);Fa=n;break}else{f[$>>2]=f[k>>2];f[la>>2]=$+4;Fa=n;break}}while(0);ja=f[m>>2]|0;if((ja|0)==(f[e>>2]|0)){F=171;break}else n=Fa}if((F|0)==156)$n(oa);else if((F|0)==164)$n(oa);else if((F|0)==169){R=-1;F=191;break g}else if((F|0)==171){Ha=Fa;Ia=f[va>>2]|0;break}}else{Ha=ua;Ia=c}while(0);if((Ha|0)==(((f[Ia+4>>2]|0)-(f[Ia>>2]|0)>>2>>>0)/3|0|0)){c=(f[Ia+28>>2]|0)-(f[Ia+24>>2]|0)>>2;ta=f[i>>2]|0;n=f[o>>2]|0;if((ta|0)==(n|0)){Ja=c;Ka=ta}else{ja=k+4|0;la=k+8|0;ha=k+12|0;ia=c;c=ta;ta=Ia;while(1){sa=f[c>>2]|0;qa=ia+-1|0;ra=f[ta+24>>2]|0;pa=ra+(qa<<2)|0;if((f[pa>>2]|0)==-1){ma=ia;while(1){na=ma+-1|0;q=ma+-2|0;p=ra+(q<<2)|0;if((f[p>>2]|0)==-1)ma=na;else{La=na;Ma=p;Na=q;break}}}else{La=ia;Ma=pa;Na=qa}if(Na>>>0<sa>>>0){Oa=La;Pa=ta}else{f[k>>2]=ta;ma=f[Ma>>2]|0;f[ja>>2]=ma;f[la>>2]=ma;b[ha>>0]=1;if((ma|0)==-1){Qa=ra;Ra=ta}else{oa=ta;q=ma;do{f[(f[oa>>2]|0)+(q<<2)>>2]=sa;Tf(k);q=f[la>>2]|0;oa=f[va>>2]|0}while((q|0)!=-1);Qa=f[oa+24>>2]|0;Ra=oa}q=Qa+(Na<<2)|0;if((sa|0)!=-1)f[Qa+(sa<<2)>>2]=f[q>>2];f[q>>2]=-1;q=f[r>>2]|0;ra=q+(Na>>>5<<2)|0;qa=1<<(Na&31);pa=q+(sa>>>5<<2)|0;q=1<<(sa&31);if(!(f[ra>>2]&qa))Sa=f[pa>>2]&~q;else Sa=f[pa>>2]|q;f[pa>>2]=Sa;f[ra>>2]=f[ra>>2]&~qa;Oa=La+-1|0;Pa=Ra}c=c+4|0;if((c|0)==(n|0)){R=Oa;F=191;break}else{ia=Oa;ta=Pa}}}}else{R=-1;F=191}}else{R=-1;F=191}}while(0);if((F|0)==191){Ja=R;Ka=f[i>>2]|0}if(Ka|0){f[o>>2]=Ka;Ko(Ka)}Ka=f[g+8>>2]|0;if(Ka|0){o=Ka;do{Ka=o;o=f[o>>2]|0;Ko(Ka)}while((o|0)!=0)}o=f[g>>2]|0;f[g>>2]=0;if(o|0)Ko(o);o=f[e>>2]|0;if(!o){u=d;return Ja|0}f[m>>2]=o;Ko(o);u=d;return Ja|0}function Za(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=u;u=u+16|0;c=b;d=b+8|0;e=b+4|0;f[d>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;h=g*210|0;f[e>>2]=a-h;i=0;j=g;g=h;h=(mj(4608,4800,e,c)|0)-4608>>2;a:while(1){k=(f[4608+(h<<2)>>2]|0)+g|0;l=5;while(1){if(l>>>0>=47){m=6;break}n=f[4416+(l<<2)>>2]|0;o=(k>>>0)/(n>>>0)|0;if(o>>>0<n>>>0){m=107;break a}if((k|0)==(W(o,n)|0)){p=i;break}else l=l+1|0}b:do if((m|0)==6){m=0;l=211;n=i;c:while(1){o=(k>>>0)/(l>>>0)|0;do if(o>>>0>=l>>>0)if((k|0)!=(W(o,l)|0)){q=l+10|0;r=(k>>>0)/(q>>>0)|0;if(r>>>0>=q>>>0)if((k|0)!=(W(r,q)|0)){r=l+12|0;s=(k>>>0)/(r>>>0)|0;if(s>>>0>=r>>>0)if((k|0)!=(W(s,r)|0)){s=l+16|0;t=(k>>>0)/(s>>>0)|0;if(t>>>0>=s>>>0)if((k|0)!=(W(t,s)|0)){t=l+18|0;v=(k>>>0)/(t>>>0)|0;if(v>>>0>=t>>>0)if((k|0)!=(W(v,t)|0)){v=l+22|0;w=(k>>>0)/(v>>>0)|0;if(w>>>0>=v>>>0)if((k|0)!=(W(w,v)|0)){w=l+28|0;x=(k>>>0)/(w>>>0)|0;if(x>>>0>=w>>>0)if((k|0)==(W(x,w)|0)){y=w;z=9;A=n}else{x=l+30|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+36|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+40|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+42|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+46|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+52|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+58|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+60|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+66|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+70|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+72|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+78|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+82|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+88|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+96|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+100|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+102|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+106|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+108|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+112|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+120|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+126|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+130|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+136|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+138|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+142|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+148|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+150|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+156|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+162|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+166|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+168|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+172|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+178|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+180|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+186|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+190|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+192|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+196|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+198|0;B=(k>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=k;break}if((k|0)==(W(B,x)|0)){y=x;z=9;A=n;break}x=l+208|0;B=(k>>>0)/(x>>>0)|0;C=B>>>0<x>>>0;D=(k|0)==(W(B,x)|0);y=C|D?x:l+210|0;z=C?1:D?9:0;A=C?k:n}else{y=w;z=1;A=k}}else{y=v;z=9;A=n}else{y=v;z=1;A=k}}else{y=t;z=9;A=n}else{y=t;z=1;A=k}}else{y=s;z=9;A=n}else{y=s;z=1;A=k}}else{y=r;z=9;A=n}else{y=r;z=1;A=k}}else{y=q;z=9;A=n}else{y=q;z=1;A=k}}else{y=l;z=9;A=n}else{y=l;z=1;A=k}while(0);switch(z&15){case 9:{p=A;break b;break}case 0:{l=y;n=A;break}default:break c}}if(!z)p=A;else{m=108;break a}}while(0);n=h+1|0;l=(n|0)==48;o=j+(l&1)|0;i=p;j=o;g=o*210|0;h=l?0:n}if((m|0)==107){f[d>>2]=k;E=k;break}else if((m|0)==108){f[d>>2]=k;E=A;break}}else{h=mj(4416,4608,d,c)|0;E=f[h>>2]|0}while(0);u=b;return E|0}function _a(a){a=a|0;var c=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;c=u;u=u+80|0;e=c+68|0;g=c+64|0;i=c+56|0;k=c+48|0;l=c+40|0;m=c;n=c+60|0;o=c+52|0;p=c+44|0;q=a+132|0;f[q>>2]=0;r=a+148|0;if(f[r>>2]|0){s=a+144|0;t=f[s>>2]|0;if(t|0){v=t;do{t=v;v=f[v>>2]|0;Ko(t)}while((v|0)!=0)}f[s>>2]=0;s=f[a+140>>2]|0;if(s|0){v=a+136|0;t=0;do{f[(f[v>>2]|0)+(t<<2)>>2]=0;t=t+1|0}while((t|0)!=(s|0))}f[r>>2]=0}r=a+4|0;s=f[r>>2]|0;t=h[s+36>>0]<<8;v=(t|h[s+37>>0])&65535;do if((v&65535)<514){w=f[s+32>>2]|0;if((v&65535)<512){x=w+8|0;y=f[x>>2]|0;z=f[x+4>>2]|0;x=w+16|0;A=x;B=f[A>>2]|0;C=vl(B|0,f[A+4>>2]|0,4,0)|0;A=H;if(!((z|0)<(A|0)|(z|0)==(A|0)&y>>>0<C>>>0)){y=(f[w>>2]|0)+B|0;B=h[y>>0]|h[y+1>>0]<<8|h[y+2>>0]<<16|h[y+3>>0]<<24;f[e>>2]=B;y=x;f[y>>2]=C;f[y+4>>2]=A;D=s;E=t;F=B;G=15}}else if(zh(e,w)|0){w=f[r>>2]|0;D=w;E=h[w+36>>0]<<8;F=f[e>>2]|0;G=15}if((G|0)==15){f[q>>2]=F;I=E;J=D;break}K=0;u=c;return K|0}else{I=t;J=s}while(0);s=f[J+32>>2]|0;if((I&65535)<512){I=s+8|0;J=f[I>>2]|0;t=f[I+4>>2]|0;I=s+16|0;D=I;E=f[D>>2]|0;F=vl(E|0,f[D+4>>2]|0,4,0)|0;D=H;if((t|0)<(D|0)|(t|0)==(D|0)&J>>>0<F>>>0)L=0;else{J=(f[s>>2]|0)+E|0;E=h[J>>0]|h[J+1>>0]<<8|h[J+2>>0]<<16|h[J+3>>0]<<24;f[g>>2]=E;J=I;f[J>>2]=F;f[J+4>>2]=D;D=a+156|0;f[D>>2]=E;M=s;N=i;O=D;G=22}}else if(zh(g,s)|0){s=f[r>>2]|0;D=f[s+32>>2]|0;E=h[s+36>>0]<<8&65535;s=a+156|0;f[s>>2]=f[g>>2];if((E&65535)>=512)if(zh(i,D)|0){P=f[i>>2]|0;Q=s;R=i;G=26}else{S=0;T=i;G=125}else{M=D;N=i;O=s;G=22}}else L=0;if((G|0)==22){s=M+8|0;D=f[s>>2]|0;E=f[s+4>>2]|0;s=M+16|0;g=s;J=f[g>>2]|0;F=vl(J|0,f[g+4>>2]|0,4,0)|0;g=H;if((E|0)<(g|0)|(E|0)==(g|0)&D>>>0<F>>>0){S=0;T=N;G=125}else{D=(f[M>>2]|0)+J|0;J=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;f[i>>2]=J;D=s;f[D>>2]=F;f[D+4>>2]=g;P=J;Q=O;R=N;G=26}}if((G|0)==26)if((P>>>0<=1431655765?(f[Q>>2]|0)>>>0<=(P*3|0)>>>0:0)?(N=f[r>>2]|0,O=f[N+32>>2]|0,J=O+8|0,g=f[J>>2]|0,D=f[J+4>>2]|0,J=O+16|0,F=J,s=f[F>>2]|0,M=f[F+4>>2]|0,(D|0)>(M|0)|(D|0)==(M|0)&g>>>0>s>>>0):0){F=f[O>>2]|0;E=b[F+s>>0]|0;I=vl(s|0,M|0,1,0)|0;t=J;f[t>>2]=I;f[t+4>>2]=H;if((h[N+36>>0]<<8&65535)<512){N=vl(s|0,M|0,5,0)|0;M=H;if((D|0)<(M|0)|(D|0)==(M|0)&g>>>0<N>>>0)U=0;else{g=F+I|0;I=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;f[k>>2]=I;g=J;f[g>>2]=N;f[g+4>>2]=M;V=P;W=I;G=34}}else if(zh(k,O)|0){V=f[i>>2]|0;W=f[k>>2]|0;G=34}else U=0;if((G|0)==34)if(V>>>0>=W>>>0?V>>>0<=(((W>>>0)/3|0)+W|0)>>>0:0){V=f[r>>2]|0;O=f[V+32>>2]|0;if((h[V+36>>0]<<8&65535)<512){V=O+8|0;I=f[V>>2]|0;P=f[V+4>>2]|0;V=O+16|0;M=V;g=f[M>>2]|0;N=vl(g|0,f[M+4>>2]|0,4,0)|0;M=H;if((P|0)<(M|0)|(P|0)==(M|0)&I>>>0<N>>>0)X=0;else{I=(f[O>>2]|0)+g|0;g=h[I>>0]|h[I+1>>0]<<8|h[I+2>>0]<<16|h[I+3>>0]<<24;f[l>>2]=g;I=V;f[I>>2]=N;f[I+4>>2]=M;Y=g;Z=W;G=41}}else if(zh(l,O)|0){Y=f[l>>2]|0;Z=f[k>>2]|0;G=41}else X=0;a:do if((G|0)==41)if(Y>>>0<=Z>>>0){f[a+28>>2]=f[a+24>>2];O=wk(88)|0;Ej(O);W=a+8|0;g=f[W>>2]|0;f[W>>2]=O;if(g|0){O=f[g+76>>2]|0;if(O|0){f[g+80>>2]=O;Ko(O)}O=f[g+64>>2]|0;if(O|0){f[g+68>>2]=O;Ko(O)}O=f[g+48>>2]|0;if(O|0){f[g+52>>2]=O;Ko(O)}O=f[g+24>>2]|0;if(O|0){f[g+28>>2]=O;Ko(O)}O=f[g+12>>2]|0;if(O|0){f[g+16>>2]=O;Ko(O)}O=f[g>>2]|0;if(O|0){f[g+4>>2]=O;Ko(O)}Ko(g);if(!(f[W>>2]|0)){X=0;break}}g=a+160|0;f[a+164>>2]=f[g>>2];Wh(g,f[i>>2]|0);g=a+172|0;f[a+176>>2]=f[g>>2];Wh(g,f[i>>2]|0);f[a+40>>2]=f[a+36>>2];f[a+52>>2]=f[a+48>>2];f[a+64>>2]=0;f[a+76>>2]=f[a+72>>2];f[a+84>>2]=-1;f[a+92>>2]=-1;f[a+88>>2]=-1;g=a+216|0;O=f[g>>2]|0;M=a+220|0;I=f[M>>2]|0;if((I|0)!=(O|0)){N=I;do{I=f[N+-12>>2]|0;if(I|0){f[N+-8>>2]=I;Ko(I)}I=f[N+-28>>2]|0;if(I|0){f[N+-24>>2]=I;Ko(I)}I=f[N+-40>>2]|0;if(I|0){f[N+-36>>2]=I;Ko(I)}di(N+-140|0);N=N+-144|0}while((N|0)!=(O|0))}f[M>>2]=O;N=E&255;Zg(g,N);if(Hh(f[W>>2]|0,f[i>>2]|0,(f[l>>2]|0)+(f[Q>>2]|0)|0)|0){I=(f[l>>2]|0)+(f[Q>>2]|0)|0;b[e>>0]=1;Gf(a+120|0,I,e);I=f[r>>2]|0;V=(h[I+36>>0]<<8|h[I+37>>0])&65535;b:do if((V&65535)>=514)if((Nb(a,f[I+32>>2]|0)|0)==-1){X=0;break a}else _=-1;else{P=f[I+32>>2]|0;do if((V&65535)<512){J=P+8|0;F=f[J>>2]|0;D=f[J+4>>2]|0;J=P+16|0;s=J;t=f[s>>2]|0;q=vl(t|0,f[s+4>>2]|0,4,0)|0;s=H;if((D|0)<(s|0)|(D|0)==(s|0)&F>>>0<q>>>0)break;F=(f[P>>2]|0)+t|0;t=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[e>>2]=t;F=J;f[F>>2]=q;f[F+4>>2]=s;$=t;G=72}else{if(!(zh(e,P)|0))break;$=f[e>>2]|0;G=72}while(0);do if((G|0)==72){if(!$)break;P=f[(f[r>>2]|0)+32>>2]|0;t=P+8|0;s=P+16|0;P=wl(f[t>>2]|0,f[t+4>>2]|0,f[s>>2]|0,f[s+4>>2]|0)|0;s=H;if((s|0)<0|(s|0)==0&P>>>0<$>>>0)break;Zj(m);P=f[(f[r>>2]|0)+32>>2]|0;s=P+16|0;t=f[s>>2]|0;F=f[e>>2]|0;q=(f[P>>2]|0)+t+F|0;J=P+8|0;D=wl(f[J>>2]|0,f[J+4>>2]|0,t|0,f[s+4>>2]|0)|0;pk(m,q,D-F|0,d[P+38>>1]|0);P=Nb(a,m)|0;if((P|0)==-1)break;_=P;break b}while(0);X=0;break a}while(0);V=a+232|0;f[a+376>>2]=a;I=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;O=f[I>>2]|0;I=(f[O>>2]|0)+(f[O+16>>2]|0)|0;O=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;P=f[O>>2]|0;O=P+8|0;F=P+16|0;P=wl(f[O>>2]|0,f[O+4>>2]|0,f[F>>2]|0,f[F+4>>2]|0)|0;F=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;pk(V,I,P,d[(f[F>>2]|0)+38>>1]|0);F=Ka[f[(f[a>>2]|0)+36>>2]&127](a)|0;f[a+380>>2]=F;F=a+384|0;f[F>>2]=(f[l>>2]|0)+(f[Q>>2]|0);f[a+372>>2]=N;Zj(m);c:do if(Dd(V,m)|0){P=m+8|0;I=P;O=f[I>>2]|0;D=f[I+4>>2]|0;I=m+16|0;q=I;s=f[q>>2]|0;t=vl(s|0,f[q+4>>2]|0,4,0)|0;q=H;if((D|0)<(q|0)|(D|0)==(q|0)&O>>>0<t>>>0){aa=0;break}O=(f[m>>2]|0)+s|0;s=h[O>>0]|h[O+1>>0]<<8|h[O+2>>0]<<16|h[O+3>>0]<<24;O=I;f[O>>2]=t;f[O+4>>2]=q;if((s|0)<0){aa=0;break}q=f[F>>2]|0;if((s|0)>=(q|0)){aa=0;break}s=a+388|0;f[e>>2]=0;O=a+392|0;t=f[s>>2]|0;D=(f[O>>2]|0)-t>>2;do if(q>>>0>D>>>0)Of(s,q-D|0,e);else{if(q>>>0>=D>>>0)break;f[O>>2]=t+(q<<2)}while(0);if(!(rd(a+400|0,m)|0)){aa=0;break}q=Wa(a,f[k>>2]|0)|0;if((q|0)==-1){aa=0;break}t=f[(f[r>>2]|0)+32>>2]|0;O=I;D=f[O>>2]|0;s=(f[m>>2]|0)+D|0;J=P;v=wl(f[J>>2]|0,f[J+4>>2]|0,D|0,f[O+4>>2]|0)|0;pk(t,s,v,d[t+38>>1]|0);t=f[r>>2]|0;v=(h[t+36>>0]<<8|h[t+37>>0])&65535;if((v&65535)<514){s=(f[t+32>>2]|0)+16|0;t=s;O=vl(f[t>>2]|0,f[t+4>>2]|0,_|0,((_|0)<0)<<31>>31|0)|0;t=s;f[t>>2]=O;f[t+4>>2]=H}do if((f[M>>2]|0)!=(f[g>>2]|0)){t=f[W>>2]|0;O=(f[t+4>>2]|0)!=(f[t>>2]|0);if((v&65535)<513){if(!O)break;t=0;do{f[n>>2]=t;f[e>>2]=f[n>>2];t=t+3|0;if(!(Zb(a,e)|0)){aa=0;break c}s=f[W>>2]|0}while(t>>>0<(f[s+4>>2]|0)-(f[s>>2]|0)>>2>>>0)}else{if(!O)break;t=0;do{f[o>>2]=t;f[e>>2]=f[o>>2];t=t+3|0;if(!(gc(a,e)|0)){aa=0;break c}s=f[W>>2]|0}while(t>>>0<(f[s+4>>2]|0)-(f[s>>2]|0)>>2>>>0)}}while(0);if(b[a+308>>0]|0)Cj(a+272|0);if((j[a+270>>1]|0)<514)Cj(a+328|0);v=f[g>>2]|0;if((f[M>>2]|0)!=(v|0)){P=0;I=v;do{gg(I+(P*144|0)+4|0,f[W>>2]|0)|0;v=f[g>>2]|0;t=f[v+(P*144|0)+132>>2]|0;O=f[v+(P*144|0)+136>>2]|0;if((t|0)==(O|0))ba=v;else{s=t;t=v;while(1){f[p>>2]=f[s>>2];f[e>>2]=f[p>>2];pf(t+(P*144|0)+4|0,e);s=s+4|0;v=f[g>>2]|0;if((s|0)==(O|0)){ba=v;break}else t=v}}jj(ba+(P*144|0)+4|0,0,0);P=P+1|0;I=f[g>>2]|0}while(P>>>0<(((f[M>>2]|0)-I|0)/144|0)>>>0)}I=f[W>>2]|0;P=(f[I+28>>2]|0)-(f[I+24>>2]|0)>>2;I=a+196|0;t=a+200|0;O=f[I>>2]|0;s=(f[t>>2]|0)-O>>2;do if(P>>>0>s>>>0)Eg(I,P-s|0);else{if(P>>>0>=s>>>0)break;f[t>>2]=O+(P<<2)}while(0);Wh(a+184|0,P);O=f[g>>2]|0;if((f[M>>2]|0)!=(O|0)){t=0;s=O;do{O=s;I=(f[O+(t*144|0)+60>>2]|0)-(f[O+(t*144|0)+56>>2]|0)>>2;v=f[W>>2]|0;D=(f[v+28>>2]|0)-(f[v+24>>2]|0)>>2;v=(I|0)<(D|0)?D:I;I=O+(t*144|0)+116|0;D=O+(t*144|0)+120|0;J=f[I>>2]|0;w=(f[D>>2]|0)-J>>2;do if(v>>>0>w>>>0)Eg(I,v-w|0);else{if(v>>>0>=w>>>0)break;f[D>>2]=J+(v<<2)}while(0);Wh(O+(t*144|0)+104|0,v);t=t+1|0;s=f[g>>2]|0}while(t>>>0<(((f[M>>2]|0)-s|0)/144|0)>>>0)}aa=Gb(a,q)|0}else aa=0;while(0);X=aa}else X=0}else X=0;while(0);U=X}else U=0;S=U;T=R;G=125}else{S=0;T=R;G=125}if((G|0)==125)L=S;K=L;u=c;return K|0}function $a(a){a=a|0;var c=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;c=u;u=u+80|0;e=c+68|0;g=c+64|0;i=c+60|0;k=c+52|0;l=c+44|0;m=c;n=c+56|0;o=c+48|0;p=c+40|0;q=a+132|0;f[q>>2]=0;r=a+148|0;if(f[r>>2]|0){s=a+144|0;t=f[s>>2]|0;if(t|0){v=t;do{t=v;v=f[v>>2]|0;Ko(t)}while((v|0)!=0)}f[s>>2]=0;s=f[a+140>>2]|0;if(s|0){v=a+136|0;t=0;do{f[(f[v>>2]|0)+(t<<2)>>2]=0;t=t+1|0}while((t|0)!=(s|0))}f[r>>2]=0}r=a+4|0;s=f[r>>2]|0;t=h[s+36>>0]<<8;v=(t|h[s+37>>0])&65535;do if((v&65535)<514){w=f[s+32>>2]|0;if((v&65535)<512){x=w+8|0;y=f[x>>2]|0;z=f[x+4>>2]|0;x=w+16|0;A=x;B=f[A>>2]|0;C=vl(B|0,f[A+4>>2]|0,4,0)|0;A=H;if(!((z|0)<(A|0)|(z|0)==(A|0)&y>>>0<C>>>0)){y=(f[w>>2]|0)+B|0;B=h[y>>0]|h[y+1>>0]<<8|h[y+2>>0]<<16|h[y+3>>0]<<24;f[e>>2]=B;y=x;f[y>>2]=C;f[y+4>>2]=A;D=s;E=t;F=B;G=15}}else if(zh(e,w)|0){w=f[r>>2]|0;D=w;E=h[w+36>>0]<<8;F=f[e>>2]|0;G=15}if((G|0)==15){f[q>>2]=F;I=E;J=D;break}K=0;u=c;return K|0}else{I=t;J=s}while(0);s=f[J+32>>2]|0;if((I&65535)<512){I=s+8|0;J=f[I>>2]|0;t=f[I+4>>2]|0;I=s+16|0;D=I;E=f[D>>2]|0;F=vl(E|0,f[D+4>>2]|0,4,0)|0;D=H;if((t|0)<(D|0)|(t|0)==(D|0)&J>>>0<F>>>0)L=0;else{J=(f[s>>2]|0)+E|0;E=h[J>>0]|h[J+1>>0]<<8|h[J+2>>0]<<16|h[J+3>>0]<<24;f[g>>2]=E;J=I;f[J>>2]=F;f[J+4>>2]=D;D=a+156|0;f[D>>2]=E;M=s;N=i;O=D;G=22}}else if(zh(g,s)|0){s=f[r>>2]|0;D=f[s+32>>2]|0;E=h[s+36>>0]<<8&65535;s=a+156|0;f[s>>2]=f[g>>2];if((E&65535)>=512)if(zh(i,D)|0){P=f[i>>2]|0;Q=s;R=i;G=26}else{S=0;T=i;G=117}else{M=D;N=i;O=s;G=22}}else L=0;if((G|0)==22){s=M+8|0;D=f[s>>2]|0;E=f[s+4>>2]|0;s=M+16|0;g=s;J=f[g>>2]|0;F=vl(J|0,f[g+4>>2]|0,4,0)|0;g=H;if((E|0)<(g|0)|(E|0)==(g|0)&D>>>0<F>>>0){S=0;T=N;G=117}else{D=(f[M>>2]|0)+J|0;J=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;f[i>>2]=J;D=s;f[D>>2]=F;f[D+4>>2]=g;P=J;Q=O;R=N;G=26}}if((G|0)==26)if((P>>>0<=1431655765?(f[Q>>2]|0)>>>0<=(P*3|0)>>>0:0)?(N=f[r>>2]|0,O=f[N+32>>2]|0,J=O+8|0,g=f[J>>2]|0,D=f[J+4>>2]|0,J=O+16|0,F=J,s=f[F>>2]|0,M=f[F+4>>2]|0,(D|0)>(M|0)|(D|0)==(M|0)&g>>>0>s>>>0):0){F=f[O>>2]|0;E=b[F+s>>0]|0;I=vl(s|0,M|0,1,0)|0;t=J;f[t>>2]=I;f[t+4>>2]=H;if((h[N+36>>0]<<8&65535)<512){N=vl(s|0,M|0,5,0)|0;M=H;if((D|0)<(M|0)|(D|0)==(M|0)&g>>>0<N>>>0)U=0;else{g=F+I|0;I=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;f[k>>2]=I;g=J;f[g>>2]=N;f[g+4>>2]=M;V=P;W=I;G=34}}else if(zh(k,O)|0){V=f[i>>2]|0;W=f[k>>2]|0;G=34}else U=0;if((G|0)==34)if(V>>>0>=W>>>0?V>>>0<=(((W>>>0)/3|0)+W|0)>>>0:0){V=f[r>>2]|0;O=f[V+32>>2]|0;if((h[V+36>>0]<<8&65535)<512){V=O+8|0;I=f[V>>2]|0;P=f[V+4>>2]|0;V=O+16|0;M=V;g=f[M>>2]|0;N=vl(g|0,f[M+4>>2]|0,4,0)|0;M=H;if((P|0)<(M|0)|(P|0)==(M|0)&I>>>0<N>>>0)X=0;else{I=(f[O>>2]|0)+g|0;g=h[I>>0]|h[I+1>>0]<<8|h[I+2>>0]<<16|h[I+3>>0]<<24;f[l>>2]=g;I=V;f[I>>2]=N;f[I+4>>2]=M;Y=g;Z=W;G=41}}else if(zh(l,O)|0){Y=f[l>>2]|0;Z=f[k>>2]|0;G=41}else X=0;a:do if((G|0)==41)if(Y>>>0<=Z>>>0){f[a+28>>2]=f[a+24>>2];O=wk(88)|0;Ej(O);W=a+8|0;g=f[W>>2]|0;f[W>>2]=O;if(g|0){O=f[g+76>>2]|0;if(O|0){f[g+80>>2]=O;Ko(O)}O=f[g+64>>2]|0;if(O|0){f[g+68>>2]=O;Ko(O)}O=f[g+48>>2]|0;if(O|0){f[g+52>>2]=O;Ko(O)}O=f[g+24>>2]|0;if(O|0){f[g+28>>2]=O;Ko(O)}O=f[g+12>>2]|0;if(O|0){f[g+16>>2]=O;Ko(O)}O=f[g>>2]|0;if(O|0){f[g+4>>2]=O;Ko(O)}Ko(g);if(!(f[W>>2]|0)){X=0;break}}g=a+160|0;f[a+164>>2]=f[g>>2];Wh(g,f[i>>2]|0);g=a+172|0;f[a+176>>2]=f[g>>2];Wh(g,f[i>>2]|0);f[a+40>>2]=f[a+36>>2];f[a+52>>2]=f[a+48>>2];f[a+64>>2]=0;f[a+76>>2]=f[a+72>>2];f[a+84>>2]=-1;f[a+92>>2]=-1;f[a+88>>2]=-1;g=a+216|0;O=f[g>>2]|0;M=a+220|0;I=f[M>>2]|0;if((I|0)!=(O|0)){N=I;do{I=f[N+-12>>2]|0;if(I|0){f[N+-8>>2]=I;Ko(I)}I=f[N+-28>>2]|0;if(I|0){f[N+-24>>2]=I;Ko(I)}I=f[N+-40>>2]|0;if(I|0){f[N+-36>>2]=I;Ko(I)}di(N+-140|0);N=N+-144|0}while((N|0)!=(O|0))}f[M>>2]=O;N=E&255;Zg(g,N);if(Hh(f[W>>2]|0,f[i>>2]|0,(f[l>>2]|0)+(f[Q>>2]|0)|0)|0){I=(f[l>>2]|0)+(f[Q>>2]|0)|0;b[e>>0]=1;Gf(a+120|0,I,e);I=f[r>>2]|0;V=(h[I+36>>0]<<8|h[I+37>>0])&65535;b:do if((V&65535)>=514)if((Nb(a,f[I+32>>2]|0)|0)==-1){X=0;break a}else _=-1;else{P=f[I+32>>2]|0;do if((V&65535)<512){J=P+8|0;F=f[J>>2]|0;D=f[J+4>>2]|0;J=P+16|0;s=J;t=f[s>>2]|0;q=vl(t|0,f[s+4>>2]|0,4,0)|0;s=H;if((D|0)<(s|0)|(D|0)==(s|0)&F>>>0<q>>>0)break;F=(f[P>>2]|0)+t|0;t=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[e>>2]=t;F=J;f[F>>2]=q;f[F+4>>2]=s;$=t;G=72}else{if(!(zh(e,P)|0))break;$=f[e>>2]|0;G=72}while(0);do if((G|0)==72){if(!$)break;P=f[(f[r>>2]|0)+32>>2]|0;t=P+8|0;s=P+16|0;P=wl(f[t>>2]|0,f[t+4>>2]|0,f[s>>2]|0,f[s+4>>2]|0)|0;s=H;if((s|0)<0|(s|0)==0&P>>>0<$>>>0)break;Zj(m);P=f[(f[r>>2]|0)+32>>2]|0;s=P+16|0;t=f[s>>2]|0;F=f[e>>2]|0;q=(f[P>>2]|0)+t+F|0;J=P+8|0;D=wl(f[J>>2]|0,f[J+4>>2]|0,t|0,f[s+4>>2]|0)|0;pk(m,q,D-F|0,d[P+38>>1]|0);P=Nb(a,m)|0;if((P|0)==-1)break;_=P;break b}while(0);X=0;break a}while(0);V=a+232|0;f[a+376>>2]=a;I=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;O=f[I>>2]|0;I=(f[O>>2]|0)+(f[O+16>>2]|0)|0;O=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;P=f[O>>2]|0;O=P+8|0;F=P+16|0;P=wl(f[O>>2]|0,f[O+4>>2]|0,f[F>>2]|0,f[F+4>>2]|0)|0;F=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;pk(V,I,P,d[(f[F>>2]|0)+38>>1]|0);F=Ka[f[(f[a>>2]|0)+36>>2]&127](a)|0;f[a+380>>2]=F;f[a+384>>2]=(f[l>>2]|0)+(f[Q>>2]|0);f[a+372>>2]=N;Zj(m);c:do if(Vb(V,m)|0){F=Xa(a,f[k>>2]|0)|0;if((F|0)==-1){aa=0;break}P=f[(f[r>>2]|0)+32>>2]|0;I=m+16|0;O=f[I>>2]|0;D=(f[m>>2]|0)+O|0;q=m+8|0;s=wl(f[q>>2]|0,f[q+4>>2]|0,O|0,f[I+4>>2]|0)|0;pk(P,D,s,d[P+38>>1]|0);P=f[r>>2]|0;s=(h[P+36>>0]<<8|h[P+37>>0])&65535;if((s&65535)<514){D=(f[P+32>>2]|0)+16|0;P=D;I=vl(f[P>>2]|0,f[P+4>>2]|0,_|0,((_|0)<0)<<31>>31|0)|0;P=D;f[P>>2]=I;f[P+4>>2]=H}do if((f[M>>2]|0)!=(f[g>>2]|0)){P=f[W>>2]|0;I=(f[P+4>>2]|0)!=(f[P>>2]|0);if((s&65535)<513){if(!I)break;P=0;do{f[n>>2]=P;f[e>>2]=f[n>>2];P=P+3|0;if(!(Zb(a,e)|0)){aa=0;break c}D=f[W>>2]|0}while(P>>>0<(f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)}else{if(!I)break;P=0;do{f[o>>2]=P;f[e>>2]=f[o>>2];P=P+3|0;if(!(gc(a,e)|0)){aa=0;break c}D=f[W>>2]|0}while(P>>>0<(f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)}}while(0);if(b[a+308>>0]|0)Cj(a+272|0);if((j[a+270>>1]|0)<514)Cj(a+328|0);s=f[g>>2]|0;if((f[M>>2]|0)!=(s|0)){P=0;I=s;do{gg(I+(P*144|0)+4|0,f[W>>2]|0)|0;s=f[g>>2]|0;D=f[s+(P*144|0)+132>>2]|0;O=f[s+(P*144|0)+136>>2]|0;if((D|0)==(O|0))ba=s;else{q=D;D=s;while(1){f[p>>2]=f[q>>2];f[e>>2]=f[p>>2];pf(D+(P*144|0)+4|0,e);q=q+4|0;s=f[g>>2]|0;if((q|0)==(O|0)){ba=s;break}else D=s}}jj(ba+(P*144|0)+4|0,0,0);P=P+1|0;I=f[g>>2]|0}while(P>>>0<(((f[M>>2]|0)-I|0)/144|0)>>>0)}I=f[W>>2]|0;P=(f[I+28>>2]|0)-(f[I+24>>2]|0)>>2;I=a+196|0;D=a+200|0;O=f[I>>2]|0;q=(f[D>>2]|0)-O>>2;do if(P>>>0>q>>>0)Eg(I,P-q|0);else{if(P>>>0>=q>>>0)break;f[D>>2]=O+(P<<2)}while(0);Wh(a+184|0,P);O=f[g>>2]|0;if((f[M>>2]|0)!=(O|0)){D=0;q=O;do{O=q;I=(f[O+(D*144|0)+60>>2]|0)-(f[O+(D*144|0)+56>>2]|0)>>2;s=f[W>>2]|0;t=(f[s+28>>2]|0)-(f[s+24>>2]|0)>>2;s=(I|0)<(t|0)?t:I;I=O+(D*144|0)+116|0;t=O+(D*144|0)+120|0;J=f[I>>2]|0;v=(f[t>>2]|0)-J>>2;do if(s>>>0>v>>>0)Eg(I,s-v|0);else{if(s>>>0>=v>>>0)break;f[t>>2]=J+(s<<2)}while(0);Wh(O+(D*144|0)+104|0,s);D=D+1|0;q=f[g>>2]|0}while(D>>>0<(((f[M>>2]|0)-q|0)/144|0)>>>0)}aa=Gb(a,F)|0}else aa=0;while(0);X=aa}else X=0}else X=0;while(0);U=X}else U=0;S=U;T=R;G=117}else{S=0;T=R;G=117}if((G|0)==117)L=S;K=L;u=c;return K|0}function ab(a){a=a|0;var c=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;c=u;u=u+80|0;e=c+68|0;g=c+64|0;i=c+60|0;k=c+52|0;l=c+44|0;m=c;n=c+56|0;o=c+48|0;p=c+40|0;q=a+132|0;f[q>>2]=0;r=a+148|0;if(f[r>>2]|0){s=a+144|0;t=f[s>>2]|0;if(t|0){v=t;do{t=v;v=f[v>>2]|0;Ko(t)}while((v|0)!=0)}f[s>>2]=0;s=f[a+140>>2]|0;if(s|0){v=a+136|0;t=0;do{f[(f[v>>2]|0)+(t<<2)>>2]=0;t=t+1|0}while((t|0)!=(s|0))}f[r>>2]=0}r=a+4|0;s=f[r>>2]|0;t=h[s+36>>0]<<8;v=(t|h[s+37>>0])&65535;do if((v&65535)<514){w=f[s+32>>2]|0;if((v&65535)<512){x=w+8|0;y=f[x>>2]|0;z=f[x+4>>2]|0;x=w+16|0;A=x;B=f[A>>2]|0;C=vl(B|0,f[A+4>>2]|0,4,0)|0;A=H;if(!((z|0)<(A|0)|(z|0)==(A|0)&y>>>0<C>>>0)){y=(f[w>>2]|0)+B|0;B=h[y>>0]|h[y+1>>0]<<8|h[y+2>>0]<<16|h[y+3>>0]<<24;f[e>>2]=B;y=x;f[y>>2]=C;f[y+4>>2]=A;D=s;E=t;F=B;G=15}}else if(zh(e,w)|0){w=f[r>>2]|0;D=w;E=h[w+36>>0]<<8;F=f[e>>2]|0;G=15}if((G|0)==15){f[q>>2]=F;I=E;J=D;break}K=0;u=c;return K|0}else{I=t;J=s}while(0);s=f[J+32>>2]|0;if((I&65535)<512){I=s+8|0;J=f[I>>2]|0;t=f[I+4>>2]|0;I=s+16|0;D=I;E=f[D>>2]|0;F=vl(E|0,f[D+4>>2]|0,4,0)|0;D=H;if((t|0)<(D|0)|(t|0)==(D|0)&J>>>0<F>>>0)L=0;else{J=(f[s>>2]|0)+E|0;E=h[J>>0]|h[J+1>>0]<<8|h[J+2>>0]<<16|h[J+3>>0]<<24;f[g>>2]=E;J=I;f[J>>2]=F;f[J+4>>2]=D;D=a+156|0;f[D>>2]=E;M=s;N=i;O=D;G=22}}else if(zh(g,s)|0){s=f[r>>2]|0;D=f[s+32>>2]|0;E=h[s+36>>0]<<8&65535;s=a+156|0;f[s>>2]=f[g>>2];if((E&65535)>=512)if(zh(i,D)|0){P=f[i>>2]|0;Q=s;R=i;G=26}else{S=0;T=i;G=117}else{M=D;N=i;O=s;G=22}}else L=0;if((G|0)==22){s=M+8|0;D=f[s>>2]|0;E=f[s+4>>2]|0;s=M+16|0;g=s;J=f[g>>2]|0;F=vl(J|0,f[g+4>>2]|0,4,0)|0;g=H;if((E|0)<(g|0)|(E|0)==(g|0)&D>>>0<F>>>0){S=0;T=N;G=117}else{D=(f[M>>2]|0)+J|0;J=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;f[i>>2]=J;D=s;f[D>>2]=F;f[D+4>>2]=g;P=J;Q=O;R=N;G=26}}if((G|0)==26)if((P>>>0<=1431655765?(f[Q>>2]|0)>>>0<=(P*3|0)>>>0:0)?(N=f[r>>2]|0,O=f[N+32>>2]|0,J=O+8|0,g=f[J>>2]|0,D=f[J+4>>2]|0,J=O+16|0,F=J,s=f[F>>2]|0,M=f[F+4>>2]|0,(D|0)>(M|0)|(D|0)==(M|0)&g>>>0>s>>>0):0){F=f[O>>2]|0;E=b[F+s>>0]|0;I=vl(s|0,M|0,1,0)|0;t=J;f[t>>2]=I;f[t+4>>2]=H;if((h[N+36>>0]<<8&65535)<512){N=vl(s|0,M|0,5,0)|0;M=H;if((D|0)<(M|0)|(D|0)==(M|0)&g>>>0<N>>>0)U=0;else{g=F+I|0;I=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;f[k>>2]=I;g=J;f[g>>2]=N;f[g+4>>2]=M;V=P;W=I;G=34}}else if(zh(k,O)|0){V=f[i>>2]|0;W=f[k>>2]|0;G=34}else U=0;if((G|0)==34)if(V>>>0>=W>>>0?V>>>0<=(((W>>>0)/3|0)+W|0)>>>0:0){V=f[r>>2]|0;O=f[V+32>>2]|0;if((h[V+36>>0]<<8&65535)<512){V=O+8|0;I=f[V>>2]|0;P=f[V+4>>2]|0;V=O+16|0;M=V;g=f[M>>2]|0;N=vl(g|0,f[M+4>>2]|0,4,0)|0;M=H;if((P|0)<(M|0)|(P|0)==(M|0)&I>>>0<N>>>0)X=0;else{I=(f[O>>2]|0)+g|0;g=h[I>>0]|h[I+1>>0]<<8|h[I+2>>0]<<16|h[I+3>>0]<<24;f[l>>2]=g;I=V;f[I>>2]=N;f[I+4>>2]=M;Y=g;Z=W;G=41}}else if(zh(l,O)|0){Y=f[l>>2]|0;Z=f[k>>2]|0;G=41}else X=0;a:do if((G|0)==41)if(Y>>>0<=Z>>>0){f[a+28>>2]=f[a+24>>2];O=wk(88)|0;Ej(O);W=a+8|0;g=f[W>>2]|0;f[W>>2]=O;if(g|0){O=f[g+76>>2]|0;if(O|0){f[g+80>>2]=O;Ko(O)}O=f[g+64>>2]|0;if(O|0){f[g+68>>2]=O;Ko(O)}O=f[g+48>>2]|0;if(O|0){f[g+52>>2]=O;Ko(O)}O=f[g+24>>2]|0;if(O|0){f[g+28>>2]=O;Ko(O)}O=f[g+12>>2]|0;if(O|0){f[g+16>>2]=O;Ko(O)}O=f[g>>2]|0;if(O|0){f[g+4>>2]=O;Ko(O)}Ko(g);if(!(f[W>>2]|0)){X=0;break}}g=a+160|0;f[a+164>>2]=f[g>>2];Wh(g,f[i>>2]|0);g=a+172|0;f[a+176>>2]=f[g>>2];Wh(g,f[i>>2]|0);f[a+40>>2]=f[a+36>>2];f[a+52>>2]=f[a+48>>2];f[a+64>>2]=0;f[a+76>>2]=f[a+72>>2];f[a+84>>2]=-1;f[a+92>>2]=-1;f[a+88>>2]=-1;g=a+216|0;O=f[g>>2]|0;M=a+220|0;I=f[M>>2]|0;if((I|0)!=(O|0)){N=I;do{I=f[N+-12>>2]|0;if(I|0){f[N+-8>>2]=I;Ko(I)}I=f[N+-28>>2]|0;if(I|0){f[N+-24>>2]=I;Ko(I)}I=f[N+-40>>2]|0;if(I|0){f[N+-36>>2]=I;Ko(I)}di(N+-140|0);N=N+-144|0}while((N|0)!=(O|0))}f[M>>2]=O;N=E&255;Zg(g,N);if(Hh(f[W>>2]|0,f[i>>2]|0,(f[l>>2]|0)+(f[Q>>2]|0)|0)|0){I=(f[l>>2]|0)+(f[Q>>2]|0)|0;b[e>>0]=1;Gf(a+120|0,I,e);I=f[r>>2]|0;V=(h[I+36>>0]<<8|h[I+37>>0])&65535;b:do if((V&65535)>=514)if((Nb(a,f[I+32>>2]|0)|0)==-1){X=0;break a}else _=-1;else{P=f[I+32>>2]|0;do if((V&65535)<512){J=P+8|0;F=f[J>>2]|0;D=f[J+4>>2]|0;J=P+16|0;s=J;t=f[s>>2]|0;q=vl(t|0,f[s+4>>2]|0,4,0)|0;s=H;if((D|0)<(s|0)|(D|0)==(s|0)&F>>>0<q>>>0)break;F=(f[P>>2]|0)+t|0;t=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[e>>2]=t;F=J;f[F>>2]=q;f[F+4>>2]=s;$=t;G=72}else{if(!(zh(e,P)|0))break;$=f[e>>2]|0;G=72}while(0);do if((G|0)==72){if(!$)break;P=f[(f[r>>2]|0)+32>>2]|0;t=P+8|0;s=P+16|0;P=wl(f[t>>2]|0,f[t+4>>2]|0,f[s>>2]|0,f[s+4>>2]|0)|0;s=H;if((s|0)<0|(s|0)==0&P>>>0<$>>>0)break;Zj(m);P=f[(f[r>>2]|0)+32>>2]|0;s=P+16|0;t=f[s>>2]|0;F=f[e>>2]|0;q=(f[P>>2]|0)+t+F|0;J=P+8|0;D=wl(f[J>>2]|0,f[J+4>>2]|0,t|0,f[s+4>>2]|0)|0;pk(m,q,D-F|0,d[P+38>>1]|0);P=Nb(a,m)|0;if((P|0)==-1)break;_=P;break b}while(0);X=0;break a}while(0);V=a+232|0;f[a+376>>2]=a;I=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;O=f[I>>2]|0;I=(f[O>>2]|0)+(f[O+16>>2]|0)|0;O=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;P=f[O>>2]|0;O=P+8|0;F=P+16|0;P=wl(f[O>>2]|0,f[O+4>>2]|0,f[F>>2]|0,f[F+4>>2]|0)|0;F=(Ka[f[(f[a>>2]|0)+32>>2]&127](a)|0)+32|0;pk(V,I,P,d[(f[F>>2]|0)+38>>1]|0);f[a+372>>2]=N;Zj(m);c:do if(Dd(V,m)|0){F=Ya(a,f[k>>2]|0)|0;if((F|0)==-1){aa=0;break}P=f[(f[r>>2]|0)+32>>2]|0;I=m+16|0;O=f[I>>2]|0;D=(f[m>>2]|0)+O|0;q=m+8|0;s=wl(f[q>>2]|0,f[q+4>>2]|0,O|0,f[I+4>>2]|0)|0;pk(P,D,s,d[P+38>>1]|0);P=f[r>>2]|0;s=(h[P+36>>0]<<8|h[P+37>>0])&65535;if((s&65535)<514){D=(f[P+32>>2]|0)+16|0;P=D;I=vl(f[P>>2]|0,f[P+4>>2]|0,_|0,((_|0)<0)<<31>>31|0)|0;P=D;f[P>>2]=I;f[P+4>>2]=H}do if((f[M>>2]|0)!=(f[g>>2]|0)){P=f[W>>2]|0;I=(f[P+4>>2]|0)!=(f[P>>2]|0);if((s&65535)<513){if(!I)break;P=0;do{f[n>>2]=P;f[e>>2]=f[n>>2];P=P+3|0;if(!(Zb(a,e)|0)){aa=0;break c}D=f[W>>2]|0}while(P>>>0<(f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)}else{if(!I)break;P=0;do{f[o>>2]=P;f[e>>2]=f[o>>2];P=P+3|0;if(!(gc(a,e)|0)){aa=0;break c}D=f[W>>2]|0}while(P>>>0<(f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)}}while(0);if(b[a+308>>0]|0)Cj(a+272|0);if((j[a+270>>1]|0)<514)Cj(a+328|0);s=f[g>>2]|0;if((f[M>>2]|0)!=(s|0)){P=0;I=s;do{gg(I+(P*144|0)+4|0,f[W>>2]|0)|0;s=f[g>>2]|0;D=f[s+(P*144|0)+132>>2]|0;O=f[s+(P*144|0)+136>>2]|0;if((D|0)==(O|0))ba=s;else{q=D;D=s;while(1){f[p>>2]=f[q>>2];f[e>>2]=f[p>>2];pf(D+(P*144|0)+4|0,e);q=q+4|0;s=f[g>>2]|0;if((q|0)==(O|0)){ba=s;break}else D=s}}jj(ba+(P*144|0)+4|0,0,0);P=P+1|0;I=f[g>>2]|0}while(P>>>0<(((f[M>>2]|0)-I|0)/144|0)>>>0)}I=f[W>>2]|0;P=(f[I+28>>2]|0)-(f[I+24>>2]|0)>>2;I=a+196|0;D=a+200|0;O=f[I>>2]|0;q=(f[D>>2]|0)-O>>2;do if(P>>>0>q>>>0)Eg(I,P-q|0);else{if(P>>>0>=q>>>0)break;f[D>>2]=O+(P<<2)}while(0);Wh(a+184|0,P);O=f[g>>2]|0;if((f[M>>2]|0)!=(O|0)){D=0;q=O;do{O=q;I=(f[O+(D*144|0)+60>>2]|0)-(f[O+(D*144|0)+56>>2]|0)>>2;s=f[W>>2]|0;t=(f[s+28>>2]|0)-(f[s+24>>2]|0)>>2;s=(I|0)<(t|0)?t:I;I=O+(D*144|0)+116|0;t=O+(D*144|0)+120|0;J=f[I>>2]|0;v=(f[t>>2]|0)-J>>2;do if(s>>>0>v>>>0)Eg(I,s-v|0);else{if(s>>>0>=v>>>0)break;f[t>>2]=J+(s<<2)}while(0);Wh(O+(D*144|0)+104|0,s);D=D+1|0;q=f[g>>2]|0}while(D>>>0<(((f[M>>2]|0)-q|0)/144|0)>>>0)}aa=Gb(a,F)|0}else aa=0;while(0);X=aa}else X=0}else X=0;while(0);U=X}else U=0;S=U;T=R;G=117}else{S=0;T=R;G=117}if((G|0)==117)L=S;K=L;u=c;return K|0}function bb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;e=u;u=u+32|0;g=e;h=a+12|0;i=f[h>>2]|0;f[g>>2]=0;j=g+4|0;f[j>>2]=0;k=g+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(g);else{l=i<<2;m=wk(l)|0;f[g>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+120|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[g>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[g>>2]=0;k=g+4|0;f[k>>2]=0;q=g+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(g);else{t=v<<2;r=wk(t)|0;f[g>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+132|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[g>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=c;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=d+16|0;r=d+20|0;A=d+28|0;w=a+8|0;s=d+12|0;x=a+108|0;t=a+4|0;n=a+96|0;j=a+52|0;i=a+48|0;l=a+40|0;o=a+32|0;p=a+28|0;E=a+20|0;F=a+92|0;G=a+80|0;H=a+88|0;I=C;while(1){J=f[B>>2]|0;K=I+-1|0;L=J+K|0;M=f[y>>2]|0;N=(L>>>0)/341|0;O=f[M+(N<<2)>>2]|0;P=L-(N*341|0)|0;N=f[O+(P*12|0)>>2]|0;L=f[O+(P*12|0)+4>>2]|0;Q=f[O+(P*12|0)+8>>2]|0;f[z>>2]=K;K=f[q>>2]|0;P=K-M|0;if((1-I-J+((P|0)==0?0:((P>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[K+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}K=f[m>>2]|0;P=K+(Q*12|0)|0;J=(f[v>>2]|0)+(Q*12|0)|0;if(N>>>0>c>>>0){D=0;break a}M=Pk(a,N,J,L)|0;if(M>>>0>=(f[h>>2]|0)>>>0){D=0;break a}L=(f[a>>2]|0)-(f[(f[J>>2]|0)+(M<<2)>>2]|0)|0;b:do if(!L)if(!N)R=19;else{O=0;while(1){S=f[k>>2]|0;c:do if((f[r>>2]|0)!=(S|0)){T=0;U=S;do{V=U;X=f[V+(T*20|0)>>2]|0;Y=V+(T*20|0)+12|0;_=V+(T*20|0)+16|0;$=(f[P>>2]|0)+(f[V+(T*20|0)+4>>2]<<2)|0;V=f[Y>>2]|0;if((V|0)==4)aa=$;else{if(f[_>>2]|0){ba=f[s>>2]|0;ca=0;da=V;while(1){Bf(ba|0,$+(ca<<2)|0,da|0)|0;ca=ca+1|0;V=f[Y>>2]|0;if(ca>>>0>=(f[_>>2]|0)>>>0)break;else{ba=ba+V|0;da=V}}}aa=f[s>>2]|0}da=f[A>>2]|0;if(!(b[X+84>>0]|0))ea=f[(f[X+68>>2]|0)+(da<<2)>>2]|0;else ea=da;if(ea>>>0>=(f[X+80>>2]|0)>>>0)break c;da=f[X+40>>2]|0;Bf((f[f[X+64>>2]>>2]|0)+(W(ea,da)|0)|0,aa|0,da|0)|0;T=T+1|0;U=f[k>>2]|0}while(T>>>0<(((f[r>>2]|0)-U|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;O=O+1|0;if((O|0)==(N|0)){R=19;break}}}else{if(N>>>0>=3){if((f[w>>2]|0)>>>0>(f[t>>2]|0)>>>0){D=0;break a}O=Q+1|0;S=f[m>>2]|0;U=S+(O*12|0)|0;if((U|0)==(P|0))fa=S;else{Df(U,f[P>>2]|0,f[K+(Q*12|0)+4>>2]|0);fa=f[m>>2]|0}U=(f[fa+(O*12|0)>>2]|0)+(M<<2)|0;f[U>>2]=(f[U>>2]|0)+(1<<L+-1);U=(Z(N|0)|0)^31;S=f[o>>2]|0;T=32-S|0;do if((U|0)>(T|0)){da=f[p>>2]|0;ba=da+4|0;if((ba|0)==(f[E>>2]|0))ga=0;else{_=f[da>>2]<<S;da=U-T|0;f[o>>2]=da;f[p>>2]=ba;ca=32-da|0;ga=(f[ba>>2]|0)>>>ca|_>>>(ca-T|0)}}else{ca=f[p>>2]|0;if((ca|0)==(f[E>>2]|0))ga=0;else{_=f[ca>>2]<<S>>>(32-U|0);ba=S+U|0;f[o>>2]=ba;if((ba|0)!=32){ga=_;break}f[p>>2]=ca+4;f[o>>2]=0;ga=_}}while(0);U=(N>>>1)-ga|0;S=N-U|0;d:do if((U|0)==(S|0)){ha=U;ia=U}else{T=f[F>>2]|0;_=f[H>>2]|0;do if((_|0)!=(f[G>>2]|0)){ca=(f[_>>2]&1<<31-T|0)!=0;ba=T+1|0;f[F>>2]=ba;if((ba|0)==32){f[H>>2]=_+4;f[F>>2]=0;if(ca){ha=U;ia=S;break d}else break}else if(ca){ha=U;ia=S;break d}else break}while(0);ha=S;ia=U}while(0);U=f[v>>2]|0;S=f[U+(Q*12|0)>>2]|0;_=S+(M<<2)|0;f[_>>2]=(f[_>>2]|0)+1;Df(U+(O*12|0)|0,S,f[U+(Q*12|0)+4>>2]|0);if(ha|0){U=f[q>>2]|0;S=f[y>>2]|0;_=U-S|0;T=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((_|0)==0?0:((_>>2)*341|0)+-1|0)|0)==(T|0)){cc(g);ja=(f[B>>2]|0)+(f[z>>2]|0)|0;ka=f[q>>2]|0;la=f[y>>2]|0}else{ja=T;ka=U;la=S}if((ka|0)==(la|0))ma=0;else{S=(ja>>>0)/341|0;ma=(f[la+(S<<2)>>2]|0)+((ja-(S*341|0)|0)*12|0)|0}f[ma>>2]=ha;f[ma+4>>2]=M;f[ma+8>>2]=Q;f[z>>2]=(f[z>>2]|0)+1}if(!ia){R=19;break}S=f[q>>2]|0;U=f[y>>2]|0;T=S-U|0;_=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((T|0)==0?0:((T>>2)*341|0)+-1|0)|0)==(_|0)){cc(g);na=(f[B>>2]|0)+(f[z>>2]|0)|0;oa=f[q>>2]|0;pa=f[y>>2]|0}else{na=_;oa=S;pa=U}if((oa|0)==(pa|0))qa=0;else{U=(na>>>0)/341|0;qa=(f[pa+(U<<2)>>2]|0)+((na-(U*341|0)|0)*12|0)|0}f[qa>>2]=ia;f[qa+4>>2]=M;f[qa+8>>2]=O;U=(f[z>>2]|0)+1|0;f[z>>2]=U;ra=U;break}U=f[x>>2]|0;f[U>>2]=M;S=f[h>>2]|0;if(S>>>0>1){_=1;T=S;ca=M;while(1){ca=(ca|0)==(T+-1|0)?0:ca+1|0;f[U+(_<<2)>>2]=ca;_=_+1|0;ba=f[h>>2]|0;if(_>>>0>=ba>>>0){sa=ba;break}else T=ba}}else sa=S;if(!N)R=19;else{T=0;_=sa;while(1){if(_|0){ca=f[x>>2]|0;U=f[n>>2]|0;O=f[J>>2]|0;ba=0;do{da=ca+(ba<<2)|0;f[U+(f[da>>2]<<2)>>2]=0;Y=f[da>>2]|0;$=(f[a>>2]|0)-(f[O+(Y<<2)>>2]|0)|0;do if($|0){V=U+(Y<<2)|0;ta=f[j>>2]|0;ua=32-ta|0;if(($|0)>(ua|0)){va=f[i>>2]|0;wa=va+4|0;if((wa|0)==(f[l>>2]|0)){f[V>>2]=0;break}else{xa=f[va>>2]<<ta;va=$-ua|0;f[j>>2]=va;f[i>>2]=wa;ya=32-va|0;f[V>>2]=(f[wa>>2]|0)>>>ya|xa>>>(ya-ua|0);break}}ua=f[i>>2]|0;if((ua|0)==(f[l>>2]|0)){f[V>>2]=0;break}f[V>>2]=f[ua>>2]<<ta>>>(32-$|0);ta=(f[j>>2]|0)+$|0;f[j>>2]=ta;if((ta|0)!=32)break;f[i>>2]=ua+4;f[j>>2]=0}while(0);$=f[da>>2]|0;Y=U+($<<2)|0;f[Y>>2]=f[Y>>2]|f[(f[P>>2]|0)+($<<2)>>2];ba=ba+1|0}while(ba>>>0<(f[h>>2]|0)>>>0)}ba=f[k>>2]|0;e:do if((f[r>>2]|0)!=(ba|0)){U=0;O=ba;do{ca=O;$=f[ca+(U*20|0)>>2]|0;Y=ca+(U*20|0)+12|0;ua=ca+(U*20|0)+16|0;ta=(f[n>>2]|0)+(f[ca+(U*20|0)+4>>2]<<2)|0;ca=f[Y>>2]|0;if((ca|0)==4)za=ta;else{if(f[ua>>2]|0){V=f[s>>2]|0;ya=0;xa=ca;while(1){Bf(V|0,ta+(ya<<2)|0,xa|0)|0;ya=ya+1|0;ca=f[Y>>2]|0;if(ya>>>0>=(f[ua>>2]|0)>>>0)break;else{V=V+ca|0;xa=ca}}}za=f[s>>2]|0}xa=f[A>>2]|0;if(!(b[$+84>>0]|0))Aa=f[(f[$+68>>2]|0)+(xa<<2)>>2]|0;else Aa=xa;if(Aa>>>0>=(f[$+80>>2]|0)>>>0)break e;xa=f[$+40>>2]|0;Bf((f[f[$+64>>2]>>2]|0)+(W(Aa,xa)|0)|0,za|0,xa|0)|0;U=U+1|0;O=f[k>>2]|0}while(U>>>0<(((f[r>>2]|0)-O|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;ba=T+1|0;if((ba|0)==(N|0)){R=19;break b}T=ba;_=f[h>>2]|0}}}while(0);if((R|0)==19){R=0;ra=f[z>>2]|0}if(!ra){D=1;break}else I=ra}}while(0);ra=f[y>>2]|0;h=f[B>>2]|0;za=(h>>>0)/341|0;Aa=ra+(za<<2)|0;a=f[q>>2]|0;sa=a;qa=ra;if((a|0)!=(ra|0)?(ia=(f[Aa>>2]|0)+((h-(za*341|0)|0)*12|0)|0,za=(f[z>>2]|0)+h|0,h=(za>>>0)/341|0,na=(f[ra+(h<<2)>>2]|0)+((za-(h*341|0)|0)*12|0)|0,(na|0)!=(ia|0)):0){h=Aa;Aa=ia;while(1){ia=Aa+12|0;if((ia-(f[h>>2]|0)|0)==4092){za=h+4|0;Ba=za;Ca=f[za>>2]|0}else{Ba=h;Ca=ia}Aa=Ca;if((na|0)==(Aa|0))break;else h=Ba}}f[z>>2]=0;z=sa-qa>>2;if(z>>>0>2){qa=ra;do{Ko(f[qa>>2]|0);qa=(f[y>>2]|0)+4|0;f[y>>2]=qa;Da=f[q>>2]|0;Ea=Da-qa>>2}while(Ea>>>0>2);Fa=Ea;Ga=qa;Ha=Da}else{Fa=z;Ga=ra;Ha=a}switch(Fa|0){case 1:{Ia=170;R=110;break}case 2:{Ia=341;R=110;break}default:{}}if((R|0)==110)f[B>>2]=Ia;if((Ga|0)!=(Ha|0)){Ia=Ga;do{Ko(f[Ia>>2]|0);Ia=Ia+4|0}while((Ia|0)!=(Ha|0));Ha=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Ha|0))f[q>>2]=y+(~((y+-4-Ha|0)>>>2)<<2)}Ha=f[g>>2]|0;if(!Ha){u=e;return D|0}Ko(Ha);u=e;return D|0}function cb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;e=u;u=u+32|0;g=e;h=a+12|0;i=f[h>>2]|0;f[g>>2]=0;j=g+4|0;f[j>>2]=0;k=g+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(g);else{l=i<<2;m=wk(l)|0;f[g>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+120|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[g>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[g>>2]=0;k=g+4|0;f[k>>2]=0;q=g+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(g);else{t=v<<2;r=wk(t)|0;f[g>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+132|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[g>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=c;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=d+16|0;r=d+20|0;A=d+28|0;w=a+8|0;s=d+12|0;x=a+108|0;t=a+4|0;n=a+96|0;j=a+52|0;i=a+48|0;l=a+40|0;o=a+32|0;p=a+28|0;E=a+20|0;F=a+92|0;G=a+80|0;H=a+88|0;I=C;while(1){J=f[B>>2]|0;K=I+-1|0;L=J+K|0;M=f[y>>2]|0;N=(L>>>0)/341|0;O=f[M+(N<<2)>>2]|0;P=L-(N*341|0)|0;N=f[O+(P*12|0)>>2]|0;L=f[O+(P*12|0)+4>>2]|0;Q=f[O+(P*12|0)+8>>2]|0;f[z>>2]=K;K=f[q>>2]|0;P=K-M|0;if((1-I-J+((P|0)==0?0:((P>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[K+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}K=f[m>>2]|0;P=K+(Q*12|0)|0;if(N>>>0>c>>>0){D=0;break a}J=f[h>>2]|0;M=(J+-1|0)==(L|0)?0:L+1|0;if(M>>>0>=J>>>0){D=0;break a}J=(f[v>>2]|0)+(Q*12|0)|0;L=(f[a>>2]|0)-(f[(f[J>>2]|0)+(M<<2)>>2]|0)|0;b:do if(!L)if(!N)R=19;else{O=0;while(1){S=f[k>>2]|0;c:do if((f[r>>2]|0)!=(S|0)){T=0;U=S;do{V=U;X=f[V+(T*20|0)>>2]|0;Y=V+(T*20|0)+12|0;_=V+(T*20|0)+16|0;$=(f[P>>2]|0)+(f[V+(T*20|0)+4>>2]<<2)|0;V=f[Y>>2]|0;if((V|0)==4)aa=$;else{if(f[_>>2]|0){ba=f[s>>2]|0;ca=0;da=V;while(1){Bf(ba|0,$+(ca<<2)|0,da|0)|0;ca=ca+1|0;V=f[Y>>2]|0;if(ca>>>0>=(f[_>>2]|0)>>>0)break;else{ba=ba+V|0;da=V}}}aa=f[s>>2]|0}da=f[A>>2]|0;if(!(b[X+84>>0]|0))ea=f[(f[X+68>>2]|0)+(da<<2)>>2]|0;else ea=da;if(ea>>>0>=(f[X+80>>2]|0)>>>0)break c;da=f[X+40>>2]|0;Bf((f[f[X+64>>2]>>2]|0)+(W(ea,da)|0)|0,aa|0,da|0)|0;T=T+1|0;U=f[k>>2]|0}while(T>>>0<(((f[r>>2]|0)-U|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;O=O+1|0;if((O|0)==(N|0)){R=19;break}}}else{if(N>>>0>=3){if((f[w>>2]|0)>>>0>(f[t>>2]|0)>>>0){D=0;break a}O=Q+1|0;Df(K+(O*12|0)|0,f[P>>2]|0,f[K+(Q*12|0)+4>>2]|0);S=(f[(f[m>>2]|0)+(O*12|0)>>2]|0)+(M<<2)|0;f[S>>2]=(f[S>>2]|0)+(1<<L+-1);S=(Z(N|0)|0)^31;U=f[o>>2]|0;T=32-U|0;if((S|0)>(T|0)){da=f[p>>2]|0;ba=da+4|0;if((ba|0)==(f[E>>2]|0))fa=0;else{_=f[da>>2]<<U;da=S-T|0;f[o>>2]=da;f[p>>2]=ba;ca=32-da|0;fa=(f[ba>>2]|0)>>>ca|_>>>(ca-T|0)}}else{T=f[p>>2]|0;if((T|0)!=(f[E>>2]|0)){ca=f[T>>2]<<U>>>(32-S|0);_=U+S|0;f[o>>2]=_;if((_|0)==32){f[p>>2]=T+4;f[o>>2]=0;fa=ca}else fa=ca}else fa=0}ca=(N>>>1)-fa|0;T=N-ca|0;d:do if((ca|0)==(T|0)){ga=ca;ha=ca}else{_=f[F>>2]|0;S=f[H>>2]|0;do if((S|0)!=(f[G>>2]|0)){U=(f[S>>2]&1<<31-_|0)!=0;ba=_+1|0;f[F>>2]=ba;if((ba|0)==32){f[H>>2]=S+4;f[F>>2]=0;if(U){ga=ca;ha=T;break d}else break}else if(U){ga=ca;ha=T;break d}else break}while(0);ga=T;ha=ca}while(0);ca=f[v>>2]|0;T=f[ca+(Q*12|0)>>2]|0;S=T+(M<<2)|0;f[S>>2]=(f[S>>2]|0)+1;Df(ca+(O*12|0)|0,T,f[ca+(Q*12|0)+4>>2]|0);if(ga|0){ca=f[q>>2]|0;T=f[y>>2]|0;S=ca-T|0;_=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((S|0)==0?0:((S>>2)*341|0)+-1|0)|0)==(_|0)){cc(g);ia=(f[B>>2]|0)+(f[z>>2]|0)|0;ja=f[q>>2]|0;ka=f[y>>2]|0}else{ia=_;ja=ca;ka=T}if((ja|0)==(ka|0))la=0;else{T=(ia>>>0)/341|0;la=(f[ka+(T<<2)>>2]|0)+((ia-(T*341|0)|0)*12|0)|0}f[la>>2]=ga;f[la+4>>2]=M;f[la+8>>2]=Q;f[z>>2]=(f[z>>2]|0)+1}if(!ha){R=19;break}T=f[q>>2]|0;ca=f[y>>2]|0;_=T-ca|0;S=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((_|0)==0?0:((_>>2)*341|0)+-1|0)|0)==(S|0)){cc(g);ma=(f[B>>2]|0)+(f[z>>2]|0)|0;na=f[q>>2]|0;oa=f[y>>2]|0}else{ma=S;na=T;oa=ca}if((na|0)==(oa|0))pa=0;else{ca=(ma>>>0)/341|0;pa=(f[oa+(ca<<2)>>2]|0)+((ma-(ca*341|0)|0)*12|0)|0}f[pa>>2]=ha;f[pa+4>>2]=M;f[pa+8>>2]=O;ca=(f[z>>2]|0)+1|0;f[z>>2]=ca;qa=ca;break}ca=f[x>>2]|0;f[ca>>2]=M;T=f[h>>2]|0;if(T>>>0>1){S=1;_=T;U=M;while(1){U=(U|0)==(_+-1|0)?0:U+1|0;f[ca+(S<<2)>>2]=U;S=S+1|0;ba=f[h>>2]|0;if(S>>>0>=ba>>>0){ra=ba;break}else _=ba}}else ra=T;if(!N)R=19;else{_=0;S=ra;while(1){if(S|0){U=f[x>>2]|0;ca=f[n>>2]|0;O=f[J>>2]|0;ba=0;do{da=U+(ba<<2)|0;f[ca+(f[da>>2]<<2)>>2]=0;Y=f[da>>2]|0;$=(f[a>>2]|0)-(f[O+(Y<<2)>>2]|0)|0;do if($|0){V=ca+(Y<<2)|0;sa=f[j>>2]|0;ta=32-sa|0;if(($|0)>(ta|0)){ua=f[i>>2]|0;va=ua+4|0;if((va|0)==(f[l>>2]|0)){f[V>>2]=0;break}else{wa=f[ua>>2]<<sa;ua=$-ta|0;f[j>>2]=ua;f[i>>2]=va;xa=32-ua|0;f[V>>2]=(f[va>>2]|0)>>>xa|wa>>>(xa-ta|0);break}}ta=f[i>>2]|0;if((ta|0)==(f[l>>2]|0)){f[V>>2]=0;break}f[V>>2]=f[ta>>2]<<sa>>>(32-$|0);sa=(f[j>>2]|0)+$|0;f[j>>2]=sa;if((sa|0)!=32)break;f[i>>2]=ta+4;f[j>>2]=0}while(0);$=f[da>>2]|0;Y=ca+($<<2)|0;f[Y>>2]=f[Y>>2]|f[(f[P>>2]|0)+($<<2)>>2];ba=ba+1|0}while(ba>>>0<(f[h>>2]|0)>>>0)}ba=f[k>>2]|0;e:do if((f[r>>2]|0)!=(ba|0)){ca=0;O=ba;do{U=O;$=f[U+(ca*20|0)>>2]|0;Y=U+(ca*20|0)+12|0;ta=U+(ca*20|0)+16|0;sa=(f[n>>2]|0)+(f[U+(ca*20|0)+4>>2]<<2)|0;U=f[Y>>2]|0;if((U|0)==4)ya=sa;else{if(f[ta>>2]|0){V=f[s>>2]|0;xa=0;wa=U;while(1){Bf(V|0,sa+(xa<<2)|0,wa|0)|0;xa=xa+1|0;U=f[Y>>2]|0;if(xa>>>0>=(f[ta>>2]|0)>>>0)break;else{V=V+U|0;wa=U}}}ya=f[s>>2]|0}wa=f[A>>2]|0;if(!(b[$+84>>0]|0))za=f[(f[$+68>>2]|0)+(wa<<2)>>2]|0;else za=wa;if(za>>>0>=(f[$+80>>2]|0)>>>0)break e;wa=f[$+40>>2]|0;Bf((f[f[$+64>>2]>>2]|0)+(W(za,wa)|0)|0,ya|0,wa|0)|0;ca=ca+1|0;O=f[k>>2]|0}while(ca>>>0<(((f[r>>2]|0)-O|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;ba=_+1|0;if((ba|0)==(N|0)){R=19;break b}_=ba;S=f[h>>2]|0}}}while(0);if((R|0)==19){R=0;qa=f[z>>2]|0}if(!qa){D=1;break}else I=qa}}while(0);qa=f[y>>2]|0;h=f[B>>2]|0;ya=(h>>>0)/341|0;za=qa+(ya<<2)|0;a=f[q>>2]|0;ra=a;pa=qa;if((a|0)!=(qa|0)?(ha=(f[za>>2]|0)+((h-(ya*341|0)|0)*12|0)|0,ya=(f[z>>2]|0)+h|0,h=(ya>>>0)/341|0,ma=(f[qa+(h<<2)>>2]|0)+((ya-(h*341|0)|0)*12|0)|0,(ma|0)!=(ha|0)):0){h=za;za=ha;while(1){ha=za+12|0;if((ha-(f[h>>2]|0)|0)==4092){ya=h+4|0;Aa=ya;Ba=f[ya>>2]|0}else{Aa=h;Ba=ha}za=Ba;if((ma|0)==(za|0))break;else h=Aa}}f[z>>2]=0;z=ra-pa>>2;if(z>>>0>2){pa=qa;do{Ko(f[pa>>2]|0);pa=(f[y>>2]|0)+4|0;f[y>>2]=pa;Ca=f[q>>2]|0;Da=Ca-pa>>2}while(Da>>>0>2);Ea=Da;Fa=pa;Ga=Ca}else{Ea=z;Fa=qa;Ga=a}switch(Ea|0){case 1:{Ha=170;R=108;break}case 2:{Ha=341;R=108;break}default:{}}if((R|0)==108)f[B>>2]=Ha;if((Fa|0)!=(Ga|0)){Ha=Fa;do{Ko(f[Ha>>2]|0);Ha=Ha+4|0}while((Ha|0)!=(Ga|0));Ga=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Ga|0))f[q>>2]=y+(~((y+-4-Ga|0)>>>2)<<2)}Ga=f[g>>2]|0;if(!Ga){u=e;return D|0}Ko(Ga);u=e;return D|0}function db(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;e=u;u=u+32|0;g=e;h=a+12|0;i=f[h>>2]|0;f[g>>2]=0;j=g+4|0;f[j>>2]=0;k=g+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(g);else{l=i<<2;m=wk(l)|0;f[g>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+628|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[g>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[g>>2]=0;k=g+4|0;f[k>>2]=0;q=g+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(g);else{t=v<<2;r=wk(t)|0;f[g>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+640|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[g>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=c;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=d+16|0;r=d+20|0;A=d+28|0;w=a+8|0;s=d+12|0;x=a+616|0;t=a+4|0;n=a+604|0;j=a+560|0;i=a+556|0;l=a+548|0;o=a+600|0;p=a+588|0;E=a+596|0;F=C;while(1){G=f[B>>2]|0;H=F+-1|0;I=G+H|0;J=f[y>>2]|0;K=(I>>>0)/341|0;L=f[J+(K<<2)>>2]|0;M=I-(K*341|0)|0;K=f[L+(M*12|0)>>2]|0;I=f[L+(M*12|0)+4>>2]|0;N=f[L+(M*12|0)+8>>2]|0;f[z>>2]=H;H=f[q>>2]|0;M=H-J|0;if((1-F-G+((M|0)==0?0:((M>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[H+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}H=f[m>>2]|0;M=H+(N*12|0)|0;G=(f[v>>2]|0)+(N*12|0)|0;if(K>>>0>c>>>0){D=0;break a}J=tg(a,K,G,I)|0;if(J>>>0>=(f[h>>2]|0)>>>0){D=0;break a}I=(f[a>>2]|0)-(f[(f[G>>2]|0)+(J<<2)>>2]|0)|0;b:do if(!I)if(!K)O=19;else{L=0;while(1){P=f[k>>2]|0;c:do if((f[r>>2]|0)!=(P|0)){Q=0;R=P;do{S=R;T=f[S+(Q*20|0)>>2]|0;U=S+(Q*20|0)+12|0;V=S+(Q*20|0)+16|0;X=(f[M>>2]|0)+(f[S+(Q*20|0)+4>>2]<<2)|0;S=f[U>>2]|0;if((S|0)==4)Y=X;else{if(f[V>>2]|0){_=f[s>>2]|0;$=0;aa=S;while(1){Bf(_|0,X+($<<2)|0,aa|0)|0;$=$+1|0;S=f[U>>2]|0;if($>>>0>=(f[V>>2]|0)>>>0)break;else{_=_+S|0;aa=S}}}Y=f[s>>2]|0}aa=f[A>>2]|0;if(!(b[T+84>>0]|0))ba=f[(f[T+68>>2]|0)+(aa<<2)>>2]|0;else ba=aa;if(ba>>>0>=(f[T+80>>2]|0)>>>0)break c;aa=f[T+40>>2]|0;Bf((f[f[T+64>>2]>>2]|0)+(W(ba,aa)|0)|0,Y|0,aa|0)|0;Q=Q+1|0;R=f[k>>2]|0}while(Q>>>0<(((f[r>>2]|0)-R|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;L=L+1|0;if((L|0)==(K|0)){O=19;break}}}else{if(K>>>0>=3){if((f[w>>2]|0)>>>0>(f[t>>2]|0)>>>0){D=0;break a}L=N+1|0;P=f[m>>2]|0;R=P+(L*12|0)|0;if((R|0)==(M|0))ca=P;else{Df(R,f[M>>2]|0,f[H+(N*12|0)+4>>2]|0);ca=f[m>>2]|0}R=(f[ca+(L*12|0)>>2]|0)+(J<<2)|0;f[R>>2]=(f[R>>2]|0)+(1<<I+-1);R=(Z(K|0)|0)^31;if(!R)da=0;else{P=0;Q=0;while(1){aa=Q<<1|(pi(a+16+(P<<4)|0)|0)&1;P=P+1|0;if((P|0)==(R|0)){da=aa;break}else Q=aa}}Q=(K>>>1)-da|0;R=K-Q|0;d:do if((Q|0)==(R|0)){ea=Q;fa=Q}else{P=f[o>>2]|0;aa=f[E>>2]|0;do if((aa|0)!=(f[p>>2]|0)){_=(f[aa>>2]&1<<31-P|0)!=0;V=P+1|0;f[o>>2]=V;if((V|0)==32){f[E>>2]=aa+4;f[o>>2]=0;if(_){ea=Q;fa=R;break d}else break}else if(_){ea=Q;fa=R;break d}else break}while(0);ea=R;fa=Q}while(0);Q=f[v>>2]|0;R=f[Q+(N*12|0)>>2]|0;aa=R+(J<<2)|0;f[aa>>2]=(f[aa>>2]|0)+1;Df(Q+(L*12|0)|0,R,f[Q+(N*12|0)+4>>2]|0);if(ea|0){Q=f[q>>2]|0;R=f[y>>2]|0;aa=Q-R|0;P=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((aa|0)==0?0:((aa>>2)*341|0)+-1|0)|0)==(P|0)){cc(g);ga=(f[B>>2]|0)+(f[z>>2]|0)|0;ha=f[q>>2]|0;ia=f[y>>2]|0}else{ga=P;ha=Q;ia=R}if((ha|0)==(ia|0))ja=0;else{R=(ga>>>0)/341|0;ja=(f[ia+(R<<2)>>2]|0)+((ga-(R*341|0)|0)*12|0)|0}f[ja>>2]=ea;f[ja+4>>2]=J;f[ja+8>>2]=N;f[z>>2]=(f[z>>2]|0)+1}if(!fa){O=19;break}R=f[q>>2]|0;Q=f[y>>2]|0;P=R-Q|0;aa=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((P|0)==0?0:((P>>2)*341|0)+-1|0)|0)==(aa|0)){cc(g);ka=(f[B>>2]|0)+(f[z>>2]|0)|0;la=f[q>>2]|0;ma=f[y>>2]|0}else{ka=aa;la=R;ma=Q}if((la|0)==(ma|0))na=0;else{Q=(ka>>>0)/341|0;na=(f[ma+(Q<<2)>>2]|0)+((ka-(Q*341|0)|0)*12|0)|0}f[na>>2]=fa;f[na+4>>2]=J;f[na+8>>2]=L;Q=(f[z>>2]|0)+1|0;f[z>>2]=Q;oa=Q;break}Q=f[x>>2]|0;f[Q>>2]=J;R=f[h>>2]|0;if(R>>>0>1){aa=1;P=R;_=J;while(1){_=(_|0)==(P+-1|0)?0:_+1|0;f[Q+(aa<<2)>>2]=_;aa=aa+1|0;V=f[h>>2]|0;if(aa>>>0>=V>>>0){pa=V;break}else P=V}}else pa=R;if(!K)O=19;else{P=0;aa=pa;while(1){if(aa|0){_=f[x>>2]|0;Q=f[n>>2]|0;L=f[G>>2]|0;V=0;do{$=_+(V<<2)|0;f[Q+(f[$>>2]<<2)>>2]=0;U=f[$>>2]|0;X=(f[a>>2]|0)-(f[L+(U<<2)>>2]|0)|0;do if(X|0){S=Q+(U<<2)|0;qa=f[j>>2]|0;ra=32-qa|0;if((X|0)>(ra|0)){sa=f[i>>2]|0;ta=sa+4|0;if((ta|0)==(f[l>>2]|0)){f[S>>2]=0;break}else{ua=f[sa>>2]<<qa;sa=X-ra|0;f[j>>2]=sa;f[i>>2]=ta;va=32-sa|0;f[S>>2]=(f[ta>>2]|0)>>>va|ua>>>(va-ra|0);break}}ra=f[i>>2]|0;if((ra|0)==(f[l>>2]|0)){f[S>>2]=0;break}f[S>>2]=f[ra>>2]<<qa>>>(32-X|0);qa=(f[j>>2]|0)+X|0;f[j>>2]=qa;if((qa|0)!=32)break;f[i>>2]=ra+4;f[j>>2]=0}while(0);X=f[$>>2]|0;U=Q+(X<<2)|0;f[U>>2]=f[U>>2]|f[(f[M>>2]|0)+(X<<2)>>2];V=V+1|0}while(V>>>0<(f[h>>2]|0)>>>0)}V=f[k>>2]|0;e:do if((f[r>>2]|0)!=(V|0)){Q=0;L=V;do{_=L;X=f[_+(Q*20|0)>>2]|0;U=_+(Q*20|0)+12|0;ra=_+(Q*20|0)+16|0;qa=(f[n>>2]|0)+(f[_+(Q*20|0)+4>>2]<<2)|0;_=f[U>>2]|0;if((_|0)==4)wa=qa;else{if(f[ra>>2]|0){S=f[s>>2]|0;va=0;ua=_;while(1){Bf(S|0,qa+(va<<2)|0,ua|0)|0;va=va+1|0;_=f[U>>2]|0;if(va>>>0>=(f[ra>>2]|0)>>>0)break;else{S=S+_|0;ua=_}}}wa=f[s>>2]|0}ua=f[A>>2]|0;if(!(b[X+84>>0]|0))xa=f[(f[X+68>>2]|0)+(ua<<2)>>2]|0;else xa=ua;if(xa>>>0>=(f[X+80>>2]|0)>>>0)break e;ua=f[X+40>>2]|0;Bf((f[f[X+64>>2]>>2]|0)+(W(xa,ua)|0)|0,wa|0,ua|0)|0;Q=Q+1|0;L=f[k>>2]|0}while(Q>>>0<(((f[r>>2]|0)-L|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;V=P+1|0;if((V|0)==(K|0)){O=19;break b}P=V;aa=f[h>>2]|0}}}while(0);if((O|0)==19){O=0;oa=f[z>>2]|0}if(!oa){D=1;break}else F=oa}}while(0);oa=f[y>>2]|0;h=f[B>>2]|0;wa=(h>>>0)/341|0;xa=oa+(wa<<2)|0;a=f[q>>2]|0;pa=a;na=oa;if((a|0)!=(oa|0)?(fa=(f[xa>>2]|0)+((h-(wa*341|0)|0)*12|0)|0,wa=(f[z>>2]|0)+h|0,h=(wa>>>0)/341|0,ka=(f[oa+(h<<2)>>2]|0)+((wa-(h*341|0)|0)*12|0)|0,(ka|0)!=(fa|0)):0){h=xa;xa=fa;while(1){fa=xa+12|0;if((fa-(f[h>>2]|0)|0)==4092){wa=h+4|0;ya=wa;za=f[wa>>2]|0}else{ya=h;za=fa}xa=za;if((ka|0)==(xa|0))break;else h=ya}}f[z>>2]=0;z=pa-na>>2;if(z>>>0>2){na=oa;do{Ko(f[na>>2]|0);na=(f[y>>2]|0)+4|0;f[y>>2]=na;Aa=f[q>>2]|0;Ba=Aa-na>>2}while(Ba>>>0>2);Ca=Ba;Da=na;Ea=Aa}else{Ca=z;Da=oa;Ea=a}switch(Ca|0){case 1:{Fa=170;O=107;break}case 2:{Fa=341;O=107;break}default:{}}if((O|0)==107)f[B>>2]=Fa;if((Da|0)!=(Ea|0)){Fa=Da;do{Ko(f[Fa>>2]|0);Fa=Fa+4|0}while((Fa|0)!=(Ea|0));Ea=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Ea|0))f[q>>2]=y+(~((y+-4-Ea|0)>>>2)<<2)}Ea=f[g>>2]|0;if(!Ea){u=e;return D|0}Ko(Ea);u=e;return D|0}function eb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;e=u;u=u+32|0;g=e;h=a+12|0;i=f[h>>2]|0;f[g>>2]=0;j=g+4|0;f[j>>2]=0;k=g+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(g);else{l=i<<2;m=wk(l)|0;f[g>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+628|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[g>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[g>>2]=0;k=g+4|0;f[k>>2]=0;q=g+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(g);else{t=v<<2;r=wk(t)|0;f[g>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+640|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[g>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=c;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=d+16|0;r=d+20|0;A=d+28|0;w=a+8|0;s=d+12|0;x=a+616|0;t=a+4|0;n=a+604|0;j=a+560|0;i=a+556|0;l=a+548|0;o=a+600|0;p=a+588|0;E=a+596|0;F=C;while(1){G=f[B>>2]|0;H=F+-1|0;I=G+H|0;J=f[y>>2]|0;K=(I>>>0)/341|0;L=f[J+(K<<2)>>2]|0;M=I-(K*341|0)|0;K=f[L+(M*12|0)>>2]|0;I=f[L+(M*12|0)+4>>2]|0;N=f[L+(M*12|0)+8>>2]|0;f[z>>2]=H;H=f[q>>2]|0;M=H-J|0;if((1-F-G+((M|0)==0?0:((M>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[H+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}H=f[m>>2]|0;M=H+(N*12|0)|0;G=(f[v>>2]|0)+(N*12|0)|0;if(K>>>0>c>>>0){D=0;break a}J=Pk(a,K,G,I)|0;if(J>>>0>=(f[h>>2]|0)>>>0){D=0;break a}I=(f[a>>2]|0)-(f[(f[G>>2]|0)+(J<<2)>>2]|0)|0;b:do if(!I)if(!K)O=19;else{L=0;while(1){P=f[k>>2]|0;c:do if((f[r>>2]|0)!=(P|0)){Q=0;R=P;do{S=R;T=f[S+(Q*20|0)>>2]|0;U=S+(Q*20|0)+12|0;V=S+(Q*20|0)+16|0;X=(f[M>>2]|0)+(f[S+(Q*20|0)+4>>2]<<2)|0;S=f[U>>2]|0;if((S|0)==4)Y=X;else{if(f[V>>2]|0){_=f[s>>2]|0;$=0;aa=S;while(1){Bf(_|0,X+($<<2)|0,aa|0)|0;$=$+1|0;S=f[U>>2]|0;if($>>>0>=(f[V>>2]|0)>>>0)break;else{_=_+S|0;aa=S}}}Y=f[s>>2]|0}aa=f[A>>2]|0;if(!(b[T+84>>0]|0))ba=f[(f[T+68>>2]|0)+(aa<<2)>>2]|0;else ba=aa;if(ba>>>0>=(f[T+80>>2]|0)>>>0)break c;aa=f[T+40>>2]|0;Bf((f[f[T+64>>2]>>2]|0)+(W(ba,aa)|0)|0,Y|0,aa|0)|0;Q=Q+1|0;R=f[k>>2]|0}while(Q>>>0<(((f[r>>2]|0)-R|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;L=L+1|0;if((L|0)==(K|0)){O=19;break}}}else{if(K>>>0>=3){if((f[w>>2]|0)>>>0>(f[t>>2]|0)>>>0){D=0;break a}L=N+1|0;P=f[m>>2]|0;R=P+(L*12|0)|0;if((R|0)==(M|0))ca=P;else{Df(R,f[M>>2]|0,f[H+(N*12|0)+4>>2]|0);ca=f[m>>2]|0}R=(f[ca+(L*12|0)>>2]|0)+(J<<2)|0;f[R>>2]=(f[R>>2]|0)+(1<<I+-1);R=(Z(K|0)|0)^31;if(!R)da=0;else{P=0;Q=0;while(1){aa=Q<<1|(pi(a+16+(P<<4)|0)|0)&1;P=P+1|0;if((P|0)==(R|0)){da=aa;break}else Q=aa}}Q=(K>>>1)-da|0;R=K-Q|0;d:do if((Q|0)==(R|0)){ea=Q;fa=Q}else{P=f[o>>2]|0;aa=f[E>>2]|0;do if((aa|0)!=(f[p>>2]|0)){_=(f[aa>>2]&1<<31-P|0)!=0;V=P+1|0;f[o>>2]=V;if((V|0)==32){f[E>>2]=aa+4;f[o>>2]=0;if(_){ea=Q;fa=R;break d}else break}else if(_){ea=Q;fa=R;break d}else break}while(0);ea=R;fa=Q}while(0);Q=f[v>>2]|0;R=f[Q+(N*12|0)>>2]|0;aa=R+(J<<2)|0;f[aa>>2]=(f[aa>>2]|0)+1;Df(Q+(L*12|0)|0,R,f[Q+(N*12|0)+4>>2]|0);if(ea|0){Q=f[q>>2]|0;R=f[y>>2]|0;aa=Q-R|0;P=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((aa|0)==0?0:((aa>>2)*341|0)+-1|0)|0)==(P|0)){cc(g);ga=(f[B>>2]|0)+(f[z>>2]|0)|0;ha=f[q>>2]|0;ia=f[y>>2]|0}else{ga=P;ha=Q;ia=R}if((ha|0)==(ia|0))ja=0;else{R=(ga>>>0)/341|0;ja=(f[ia+(R<<2)>>2]|0)+((ga-(R*341|0)|0)*12|0)|0}f[ja>>2]=ea;f[ja+4>>2]=J;f[ja+8>>2]=N;f[z>>2]=(f[z>>2]|0)+1}if(!fa){O=19;break}R=f[q>>2]|0;Q=f[y>>2]|0;P=R-Q|0;aa=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((P|0)==0?0:((P>>2)*341|0)+-1|0)|0)==(aa|0)){cc(g);ka=(f[B>>2]|0)+(f[z>>2]|0)|0;la=f[q>>2]|0;ma=f[y>>2]|0}else{ka=aa;la=R;ma=Q}if((la|0)==(ma|0))na=0;else{Q=(ka>>>0)/341|0;na=(f[ma+(Q<<2)>>2]|0)+((ka-(Q*341|0)|0)*12|0)|0}f[na>>2]=fa;f[na+4>>2]=J;f[na+8>>2]=L;Q=(f[z>>2]|0)+1|0;f[z>>2]=Q;oa=Q;break}Q=f[x>>2]|0;f[Q>>2]=J;R=f[h>>2]|0;if(R>>>0>1){aa=1;P=R;_=J;while(1){_=(_|0)==(P+-1|0)?0:_+1|0;f[Q+(aa<<2)>>2]=_;aa=aa+1|0;V=f[h>>2]|0;if(aa>>>0>=V>>>0){pa=V;break}else P=V}}else pa=R;if(!K)O=19;else{P=0;aa=pa;while(1){if(aa|0){_=f[x>>2]|0;Q=f[n>>2]|0;L=f[G>>2]|0;V=0;do{$=_+(V<<2)|0;f[Q+(f[$>>2]<<2)>>2]=0;U=f[$>>2]|0;X=(f[a>>2]|0)-(f[L+(U<<2)>>2]|0)|0;do if(X|0){S=Q+(U<<2)|0;qa=f[j>>2]|0;ra=32-qa|0;if((X|0)>(ra|0)){sa=f[i>>2]|0;ta=sa+4|0;if((ta|0)==(f[l>>2]|0)){f[S>>2]=0;break}else{ua=f[sa>>2]<<qa;sa=X-ra|0;f[j>>2]=sa;f[i>>2]=ta;va=32-sa|0;f[S>>2]=(f[ta>>2]|0)>>>va|ua>>>(va-ra|0);break}}ra=f[i>>2]|0;if((ra|0)==(f[l>>2]|0)){f[S>>2]=0;break}f[S>>2]=f[ra>>2]<<qa>>>(32-X|0);qa=(f[j>>2]|0)+X|0;f[j>>2]=qa;if((qa|0)!=32)break;f[i>>2]=ra+4;f[j>>2]=0}while(0);X=f[$>>2]|0;U=Q+(X<<2)|0;f[U>>2]=f[U>>2]|f[(f[M>>2]|0)+(X<<2)>>2];V=V+1|0}while(V>>>0<(f[h>>2]|0)>>>0)}V=f[k>>2]|0;e:do if((f[r>>2]|0)!=(V|0)){Q=0;L=V;do{_=L;X=f[_+(Q*20|0)>>2]|0;U=_+(Q*20|0)+12|0;ra=_+(Q*20|0)+16|0;qa=(f[n>>2]|0)+(f[_+(Q*20|0)+4>>2]<<2)|0;_=f[U>>2]|0;if((_|0)==4)wa=qa;else{if(f[ra>>2]|0){S=f[s>>2]|0;va=0;ua=_;while(1){Bf(S|0,qa+(va<<2)|0,ua|0)|0;va=va+1|0;_=f[U>>2]|0;if(va>>>0>=(f[ra>>2]|0)>>>0)break;else{S=S+_|0;ua=_}}}wa=f[s>>2]|0}ua=f[A>>2]|0;if(!(b[X+84>>0]|0))xa=f[(f[X+68>>2]|0)+(ua<<2)>>2]|0;else xa=ua;if(xa>>>0>=(f[X+80>>2]|0)>>>0)break e;ua=f[X+40>>2]|0;Bf((f[f[X+64>>2]>>2]|0)+(W(xa,ua)|0)|0,wa|0,ua|0)|0;Q=Q+1|0;L=f[k>>2]|0}while(Q>>>0<(((f[r>>2]|0)-L|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;V=P+1|0;if((V|0)==(K|0)){O=19;break b}P=V;aa=f[h>>2]|0}}}while(0);if((O|0)==19){O=0;oa=f[z>>2]|0}if(!oa){D=1;break}else F=oa}}while(0);oa=f[y>>2]|0;h=f[B>>2]|0;wa=(h>>>0)/341|0;xa=oa+(wa<<2)|0;a=f[q>>2]|0;pa=a;na=oa;if((a|0)!=(oa|0)?(fa=(f[xa>>2]|0)+((h-(wa*341|0)|0)*12|0)|0,wa=(f[z>>2]|0)+h|0,h=(wa>>>0)/341|0,ka=(f[oa+(h<<2)>>2]|0)+((wa-(h*341|0)|0)*12|0)|0,(ka|0)!=(fa|0)):0){h=xa;xa=fa;while(1){fa=xa+12|0;if((fa-(f[h>>2]|0)|0)==4092){wa=h+4|0;ya=wa;za=f[wa>>2]|0}else{ya=h;za=fa}xa=za;if((ka|0)==(xa|0))break;else h=ya}}f[z>>2]=0;z=pa-na>>2;if(z>>>0>2){na=oa;do{Ko(f[na>>2]|0);na=(f[y>>2]|0)+4|0;f[y>>2]=na;Aa=f[q>>2]|0;Ba=Aa-na>>2}while(Ba>>>0>2);Ca=Ba;Da=na;Ea=Aa}else{Ca=z;Da=oa;Ea=a}switch(Ca|0){case 1:{Fa=170;O=107;break}case 2:{Fa=341;O=107;break}default:{}}if((O|0)==107)f[B>>2]=Fa;if((Da|0)!=(Ea|0)){Fa=Da;do{Ko(f[Fa>>2]|0);Fa=Fa+4|0}while((Fa|0)!=(Ea|0));Ea=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Ea|0))f[q>>2]=y+(~((y+-4-Ea|0)>>>2)<<2)}Ea=f[g>>2]|0;if(!Ea){u=e;return D|0}Ko(Ea);u=e;return D|0}function fb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;e=u;u=u+32|0;g=e;h=a+12|0;i=f[h>>2]|0;f[g>>2]=0;j=g+4|0;f[j>>2]=0;k=g+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(g);else{l=i<<2;m=wk(l)|0;f[g>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+628|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[g>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[g>>2]=0;k=g+4|0;f[k>>2]=0;q=g+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(g);else{t=v<<2;r=wk(t)|0;f[g>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+640|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[g>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=c;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=d+16|0;r=d+20|0;A=d+28|0;w=a+8|0;s=d+12|0;x=a+616|0;t=a+4|0;n=a+604|0;j=a+560|0;i=a+556|0;l=a+548|0;o=a+600|0;p=a+588|0;E=a+596|0;F=C;while(1){G=f[B>>2]|0;H=F+-1|0;I=G+H|0;J=f[y>>2]|0;K=(I>>>0)/341|0;L=f[J+(K<<2)>>2]|0;M=I-(K*341|0)|0;K=f[L+(M*12|0)>>2]|0;I=f[L+(M*12|0)+4>>2]|0;N=f[L+(M*12|0)+8>>2]|0;f[z>>2]=H;H=f[q>>2]|0;M=H-J|0;if((1-F-G+((M|0)==0?0:((M>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[H+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}H=f[m>>2]|0;M=H+(N*12|0)|0;if(K>>>0>c>>>0){D=0;break a}G=f[h>>2]|0;J=(G+-1|0)==(I|0)?0:I+1|0;if(J>>>0>=G>>>0){D=0;break a}G=(f[v>>2]|0)+(N*12|0)|0;I=(f[a>>2]|0)-(f[(f[G>>2]|0)+(J<<2)>>2]|0)|0;b:do if(!I)if(!K)O=19;else{L=0;while(1){P=f[k>>2]|0;c:do if((f[r>>2]|0)!=(P|0)){Q=0;R=P;do{S=R;T=f[S+(Q*20|0)>>2]|0;U=S+(Q*20|0)+12|0;V=S+(Q*20|0)+16|0;X=(f[M>>2]|0)+(f[S+(Q*20|0)+4>>2]<<2)|0;S=f[U>>2]|0;if((S|0)==4)Y=X;else{if(f[V>>2]|0){_=f[s>>2]|0;$=0;aa=S;while(1){Bf(_|0,X+($<<2)|0,aa|0)|0;$=$+1|0;S=f[U>>2]|0;if($>>>0>=(f[V>>2]|0)>>>0)break;else{_=_+S|0;aa=S}}}Y=f[s>>2]|0}aa=f[A>>2]|0;if(!(b[T+84>>0]|0))ba=f[(f[T+68>>2]|0)+(aa<<2)>>2]|0;else ba=aa;if(ba>>>0>=(f[T+80>>2]|0)>>>0)break c;aa=f[T+40>>2]|0;Bf((f[f[T+64>>2]>>2]|0)+(W(ba,aa)|0)|0,Y|0,aa|0)|0;Q=Q+1|0;R=f[k>>2]|0}while(Q>>>0<(((f[r>>2]|0)-R|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;L=L+1|0;if((L|0)==(K|0)){O=19;break}}}else{if(K>>>0>=3){if((f[w>>2]|0)>>>0>(f[t>>2]|0)>>>0){D=0;break a}L=N+1|0;Df(H+(L*12|0)|0,f[M>>2]|0,f[H+(N*12|0)+4>>2]|0);P=(f[(f[m>>2]|0)+(L*12|0)>>2]|0)+(J<<2)|0;f[P>>2]=(f[P>>2]|0)+(1<<I+-1);P=(Z(K|0)|0)^31;if(!P)ca=0;else{R=0;Q=0;while(1){aa=Q<<1|(pi(a+16+(R<<4)|0)|0)&1;R=R+1|0;if((R|0)==(P|0)){ca=aa;break}else Q=aa}}Q=(K>>>1)-ca|0;P=K-Q|0;d:do if((Q|0)==(P|0)){da=Q;ea=Q}else{R=f[o>>2]|0;aa=f[E>>2]|0;do if((aa|0)!=(f[p>>2]|0)){_=(f[aa>>2]&1<<31-R|0)!=0;V=R+1|0;f[o>>2]=V;if((V|0)==32){f[E>>2]=aa+4;f[o>>2]=0;if(_){da=Q;ea=P;break d}else break}else if(_){da=Q;ea=P;break d}else break}while(0);da=P;ea=Q}while(0);Q=f[v>>2]|0;P=f[Q+(N*12|0)>>2]|0;aa=P+(J<<2)|0;f[aa>>2]=(f[aa>>2]|0)+1;Df(Q+(L*12|0)|0,P,f[Q+(N*12|0)+4>>2]|0);if(da|0){Q=f[q>>2]|0;P=f[y>>2]|0;aa=Q-P|0;R=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((aa|0)==0?0:((aa>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);fa=(f[B>>2]|0)+(f[z>>2]|0)|0;ga=f[q>>2]|0;ha=f[y>>2]|0}else{fa=R;ga=Q;ha=P}if((ga|0)==(ha|0))ia=0;else{P=(fa>>>0)/341|0;ia=(f[ha+(P<<2)>>2]|0)+((fa-(P*341|0)|0)*12|0)|0}f[ia>>2]=da;f[ia+4>>2]=J;f[ia+8>>2]=N;f[z>>2]=(f[z>>2]|0)+1}if(!ea){O=19;break}P=f[q>>2]|0;Q=f[y>>2]|0;R=P-Q|0;aa=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(aa|0)){cc(g);ja=(f[B>>2]|0)+(f[z>>2]|0)|0;ka=f[q>>2]|0;la=f[y>>2]|0}else{ja=aa;ka=P;la=Q}if((ka|0)==(la|0))ma=0;else{Q=(ja>>>0)/341|0;ma=(f[la+(Q<<2)>>2]|0)+((ja-(Q*341|0)|0)*12|0)|0}f[ma>>2]=ea;f[ma+4>>2]=J;f[ma+8>>2]=L;Q=(f[z>>2]|0)+1|0;f[z>>2]=Q;na=Q;break}Q=f[x>>2]|0;f[Q>>2]=J;P=f[h>>2]|0;if(P>>>0>1){aa=1;R=P;_=J;while(1){_=(_|0)==(R+-1|0)?0:_+1|0;f[Q+(aa<<2)>>2]=_;aa=aa+1|0;V=f[h>>2]|0;if(aa>>>0>=V>>>0){oa=V;break}else R=V}}else oa=P;if(!K)O=19;else{R=0;aa=oa;while(1){if(aa|0){_=f[x>>2]|0;Q=f[n>>2]|0;L=f[G>>2]|0;V=0;do{$=_+(V<<2)|0;f[Q+(f[$>>2]<<2)>>2]=0;U=f[$>>2]|0;X=(f[a>>2]|0)-(f[L+(U<<2)>>2]|0)|0;do if(X|0){S=Q+(U<<2)|0;pa=f[j>>2]|0;qa=32-pa|0;if((X|0)>(qa|0)){ra=f[i>>2]|0;sa=ra+4|0;if((sa|0)==(f[l>>2]|0)){f[S>>2]=0;break}else{ta=f[ra>>2]<<pa;ra=X-qa|0;f[j>>2]=ra;f[i>>2]=sa;ua=32-ra|0;f[S>>2]=(f[sa>>2]|0)>>>ua|ta>>>(ua-qa|0);break}}qa=f[i>>2]|0;if((qa|0)==(f[l>>2]|0)){f[S>>2]=0;break}f[S>>2]=f[qa>>2]<<pa>>>(32-X|0);pa=(f[j>>2]|0)+X|0;f[j>>2]=pa;if((pa|0)!=32)break;f[i>>2]=qa+4;f[j>>2]=0}while(0);X=f[$>>2]|0;U=Q+(X<<2)|0;f[U>>2]=f[U>>2]|f[(f[M>>2]|0)+(X<<2)>>2];V=V+1|0}while(V>>>0<(f[h>>2]|0)>>>0)}V=f[k>>2]|0;e:do if((f[r>>2]|0)!=(V|0)){Q=0;L=V;do{_=L;X=f[_+(Q*20|0)>>2]|0;U=_+(Q*20|0)+12|0;qa=_+(Q*20|0)+16|0;pa=(f[n>>2]|0)+(f[_+(Q*20|0)+4>>2]<<2)|0;_=f[U>>2]|0;if((_|0)==4)va=pa;else{if(f[qa>>2]|0){S=f[s>>2]|0;ua=0;ta=_;while(1){Bf(S|0,pa+(ua<<2)|0,ta|0)|0;ua=ua+1|0;_=f[U>>2]|0;if(ua>>>0>=(f[qa>>2]|0)>>>0)break;else{S=S+_|0;ta=_}}}va=f[s>>2]|0}ta=f[A>>2]|0;if(!(b[X+84>>0]|0))wa=f[(f[X+68>>2]|0)+(ta<<2)>>2]|0;else wa=ta;if(wa>>>0>=(f[X+80>>2]|0)>>>0)break e;ta=f[X+40>>2]|0;Bf((f[f[X+64>>2]>>2]|0)+(W(wa,ta)|0)|0,va|0,ta|0)|0;Q=Q+1|0;L=f[k>>2]|0}while(Q>>>0<(((f[r>>2]|0)-L|0)/20|0)>>>0)}while(0);f[A>>2]=(f[A>>2]|0)+1;f[w>>2]=(f[w>>2]|0)+1;V=R+1|0;if((V|0)==(K|0)){O=19;break b}R=V;aa=f[h>>2]|0}}}while(0);if((O|0)==19){O=0;na=f[z>>2]|0}if(!na){D=1;break}else F=na}}while(0);na=f[y>>2]|0;h=f[B>>2]|0;va=(h>>>0)/341|0;wa=na+(va<<2)|0;a=f[q>>2]|0;oa=a;ma=na;if((a|0)!=(na|0)?(ea=(f[wa>>2]|0)+((h-(va*341|0)|0)*12|0)|0,va=(f[z>>2]|0)+h|0,h=(va>>>0)/341|0,ja=(f[na+(h<<2)>>2]|0)+((va-(h*341|0)|0)*12|0)|0,(ja|0)!=(ea|0)):0){h=wa;wa=ea;while(1){ea=wa+12|0;if((ea-(f[h>>2]|0)|0)==4092){va=h+4|0;xa=va;ya=f[va>>2]|0}else{xa=h;ya=ea}wa=ya;if((ja|0)==(wa|0))break;else h=xa}}f[z>>2]=0;z=oa-ma>>2;if(z>>>0>2){ma=na;do{Ko(f[ma>>2]|0);ma=(f[y>>2]|0)+4|0;f[y>>2]=ma;za=f[q>>2]|0;Aa=za-ma>>2}while(Aa>>>0>2);Ba=Aa;Ca=ma;Da=za}else{Ba=z;Ca=na;Da=a}switch(Ba|0){case 1:{Ea=170;O=105;break}case 2:{Ea=341;O=105;break}default:{}}if((O|0)==105)f[B>>2]=Ea;if((Ca|0)!=(Da|0)){Ea=Ca;do{Ko(f[Ea>>2]|0);Ea=Ea+4|0}while((Ea|0)!=(Da|0));Da=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Da|0))f[q>>2]=y+(~((y+-4-Da|0)>>>2)<<2)}Da=f[g>>2]|0;if(!Da){u=e;return D|0}Ko(Da);u=e;return D|0}function gb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;e=u;u=u+32|0;g=e+8|0;h=e;i=a+12|0;j=f[i>>2]|0;f[g>>2]=0;k=g+4|0;f[k>>2]=0;l=g+8|0;f[l>>2]=0;do if(j)if(j>>>0>1073741823)$n(g);else{m=j<<2;n=wk(m)|0;f[g>>2]=n;o=n+(j<<2)|0;f[l>>2]=o;oh(n|0,0,m|0)|0;f[k>>2]=o;p=o;q=n;break}else{p=0;q=0}while(0);n=a+116|0;o=f[n>>2]|0;m=f[o>>2]|0;if(!m){r=o+8|0;s=o+4|0;t=q;v=p;w=j}else{j=o+4|0;f[j>>2]=m;Ko(m);m=o+8|0;f[m>>2]=0;f[j>>2]=0;f[o>>2]=0;r=m;s=j;t=f[g>>2]|0;v=f[k>>2]|0;w=f[i>>2]|0}f[o>>2]=t;f[s>>2]=v;f[r>>2]=f[l>>2];f[g>>2]=0;l=g+4|0;f[l>>2]=0;r=g+8|0;f[r>>2]=0;do if(w)if(w>>>0>1073741823)$n(g);else{v=w<<2;s=wk(v)|0;f[g>>2]=s;t=s+(w<<2)|0;f[r>>2]=t;oh(s|0,0,v|0)|0;f[l>>2]=t;x=t;y=s;break}else{x=0;y=0}while(0);w=a+128|0;s=f[w>>2]|0;t=f[s>>2]|0;if(!t){z=s+8|0;A=s+4|0;B=y;C=x}else{x=s+4|0;f[x>>2]=t;Ko(t);t=s+8|0;f[t>>2]=0;f[x>>2]=0;f[s>>2]=0;z=t;A=x;B=f[g>>2]|0;C=f[l>>2]|0}f[s>>2]=B;f[A>>2]=C;f[z>>2]=f[r>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;r=g+8|0;z=g+4|0;C=g+16|0;A=g+20|0;cc(g);B=f[z>>2]|0;s=(f[C>>2]|0)+(f[A>>2]|0)|0;if((f[r>>2]|0)==(B|0))D=0;else{l=(s>>>0)/341|0;D=(f[B+(l<<2)>>2]|0)+((s-(l*341|0)|0)*12|0)|0}f[D>>2]=c;f[D+4>>2]=0;f[D+8>>2]=0;D=(f[A>>2]|0)+1|0;f[A>>2]=D;a:do if(!D)E=1;else{l=d+16|0;s=d+20|0;B=d+28|0;x=a+8|0;t=d+12|0;y=a+104|0;v=a+4|0;o=a+92|0;k=a+48|0;j=a+44|0;m=a+36|0;p=a+16|0;q=a+88|0;F=a+76|0;G=a+84|0;H=D;while(1){I=f[C>>2]|0;J=H+-1|0;K=I+J|0;L=f[z>>2]|0;M=(K>>>0)/341|0;N=f[L+(M<<2)>>2]|0;O=K-(M*341|0)|0;M=f[N+(O*12|0)>>2]|0;K=f[N+(O*12|0)+4>>2]|0;P=f[N+(O*12|0)+8>>2]|0;f[A>>2]=J;J=f[r>>2]|0;O=J-L|0;if((1-H-I+((O|0)==0?0:((O>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[J+-4>>2]|0);f[r>>2]=(f[r>>2]|0)+-4}J=f[n>>2]|0;O=J+(P*12|0)|0;I=(f[w>>2]|0)+(P*12|0)|0;if(M>>>0>c>>>0){E=0;break a}L=Pk(a,M,I,K)|0;if(L>>>0>=(f[i>>2]|0)>>>0){E=0;break a}K=(f[a>>2]|0)-(f[(f[I>>2]|0)+(L<<2)>>2]|0)|0;b:do if(!K){if(M|0){N=0;do{Q=f[l>>2]|0;c:do if((f[s>>2]|0)!=(Q|0)){R=0;S=Q;do{T=S;U=f[T+(R*20|0)>>2]|0;V=T+(R*20|0)+12|0;X=T+(R*20|0)+16|0;Y=(f[O>>2]|0)+(f[T+(R*20|0)+4>>2]<<2)|0;T=f[V>>2]|0;if((T|0)==4)_=Y;else{if(f[X>>2]|0){$=f[t>>2]|0;aa=0;ba=T;while(1){Bf($|0,Y+(aa<<2)|0,ba|0)|0;aa=aa+1|0;T=f[V>>2]|0;if(aa>>>0>=(f[X>>2]|0)>>>0)break;else{$=$+T|0;ba=T}}}_=f[t>>2]|0}ba=f[B>>2]|0;if(!(b[U+84>>0]|0))ca=f[(f[U+68>>2]|0)+(ba<<2)>>2]|0;else ca=ba;if(ca>>>0>=(f[U+80>>2]|0)>>>0)break c;ba=f[U+40>>2]|0;Bf((f[f[U+64>>2]>>2]|0)+(W(ca,ba)|0)|0,_|0,ba|0)|0;R=R+1|0;S=f[l>>2]|0}while(R>>>0<(((f[s>>2]|0)-S|0)/20|0)>>>0)}while(0);f[B>>2]=(f[B>>2]|0)+1;f[x>>2]=(f[x>>2]|0)+1;N=N+1|0}while((N|0)!=(M|0))}}else{if(M>>>0>=3){if((f[x>>2]|0)>>>0>(f[v>>2]|0)>>>0){E=0;break a}N=P+1|0;Q=f[n>>2]|0;S=Q+(N*12|0)|0;if((S|0)==(O|0))da=Q;else{Df(S,f[O>>2]|0,f[J+(P*12|0)+4>>2]|0);da=f[n>>2]|0}S=(f[da+(N*12|0)>>2]|0)+(L<<2)|0;f[S>>2]=(f[S>>2]|0)+(1<<K+-1);S=(Z(M|0)|0)^31;f[h>>2]=0;ph(p,S,h);S=(M>>>1)-(f[h>>2]|0)|0;Q=M-S|0;d:do if((S|0)==(Q|0)){ea=S;fa=S}else{R=f[q>>2]|0;ba=f[G>>2]|0;do if((ba|0)!=(f[F>>2]|0)){$=(f[ba>>2]&1<<31-R|0)!=0;X=R+1|0;f[q>>2]=X;if((X|0)==32){f[G>>2]=ba+4;f[q>>2]=0;if($){ea=S;fa=Q;break d}else break}else if($){ea=S;fa=Q;break d}else break}while(0);ea=Q;fa=S}while(0);S=f[w>>2]|0;Q=f[S+(P*12|0)>>2]|0;ba=Q+(L<<2)|0;f[ba>>2]=(f[ba>>2]|0)+1;Df(S+(N*12|0)|0,Q,f[S+(P*12|0)+4>>2]|0);if(ea|0){S=f[r>>2]|0;Q=f[z>>2]|0;ba=S-Q|0;R=(f[A>>2]|0)+(f[C>>2]|0)|0;if((((ba|0)==0?0:((ba>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);ga=(f[C>>2]|0)+(f[A>>2]|0)|0;ha=f[r>>2]|0;ia=f[z>>2]|0}else{ga=R;ha=S;ia=Q}if((ha|0)==(ia|0))ja=0;else{Q=(ga>>>0)/341|0;ja=(f[ia+(Q<<2)>>2]|0)+((ga-(Q*341|0)|0)*12|0)|0}f[ja>>2]=ea;f[ja+4>>2]=L;f[ja+8>>2]=P;f[A>>2]=(f[A>>2]|0)+1}if(fa|0){Q=f[r>>2]|0;S=f[z>>2]|0;R=Q-S|0;ba=(f[A>>2]|0)+(f[C>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(ba|0)){cc(g);ka=(f[C>>2]|0)+(f[A>>2]|0)|0;la=f[r>>2]|0;ma=f[z>>2]|0}else{ka=ba;la=Q;ma=S}if((la|0)==(ma|0))na=0;else{S=(ka>>>0)/341|0;na=(f[ma+(S<<2)>>2]|0)+((ka-(S*341|0)|0)*12|0)|0}f[na>>2]=fa;f[na+4>>2]=L;f[na+8>>2]=N;f[A>>2]=(f[A>>2]|0)+1}break}S=f[y>>2]|0;f[S>>2]=L;Q=f[i>>2]|0;if(Q>>>0>1){ba=1;R=Q;$=L;while(1){$=($|0)==(R+-1|0)?0:$+1|0;f[S+(ba<<2)>>2]=$;ba=ba+1|0;X=f[i>>2]|0;if(ba>>>0>=X>>>0){oa=X;break}else R=X}}else oa=Q;if(M|0){R=0;ba=oa;while(1){if(ba|0){$=f[y>>2]|0;S=f[o>>2]|0;N=f[I>>2]|0;X=0;do{aa=$+(X<<2)|0;f[S+(f[aa>>2]<<2)>>2]=0;V=f[aa>>2]|0;Y=(f[a>>2]|0)-(f[N+(V<<2)>>2]|0)|0;do if(Y|0){T=S+(V<<2)|0;pa=f[k>>2]|0;qa=32-pa|0;if((Y|0)>(qa|0)){ra=f[j>>2]|0;sa=ra+4|0;if((sa|0)==(f[m>>2]|0)){f[T>>2]=0;break}else{ta=f[ra>>2]<<pa;ra=Y-qa|0;f[k>>2]=ra;f[j>>2]=sa;ua=32-ra|0;f[T>>2]=(f[sa>>2]|0)>>>ua|ta>>>(ua-qa|0);break}}qa=f[j>>2]|0;if((qa|0)==(f[m>>2]|0)){f[T>>2]=0;break}f[T>>2]=f[qa>>2]<<pa>>>(32-Y|0);pa=(f[k>>2]|0)+Y|0;f[k>>2]=pa;if((pa|0)!=32)break;f[j>>2]=qa+4;f[k>>2]=0}while(0);Y=f[aa>>2]|0;V=S+(Y<<2)|0;f[V>>2]=f[V>>2]|f[(f[O>>2]|0)+(Y<<2)>>2];X=X+1|0}while(X>>>0<(f[i>>2]|0)>>>0)}X=f[l>>2]|0;e:do if((f[s>>2]|0)!=(X|0)){S=0;N=X;do{$=N;Y=f[$+(S*20|0)>>2]|0;V=$+(S*20|0)+12|0;qa=$+(S*20|0)+16|0;pa=(f[o>>2]|0)+(f[$+(S*20|0)+4>>2]<<2)|0;$=f[V>>2]|0;if(($|0)==4)va=pa;else{if(f[qa>>2]|0){T=f[t>>2]|0;ua=0;ta=$;while(1){Bf(T|0,pa+(ua<<2)|0,ta|0)|0;ua=ua+1|0;$=f[V>>2]|0;if(ua>>>0>=(f[qa>>2]|0)>>>0)break;else{T=T+$|0;ta=$}}}va=f[t>>2]|0}ta=f[B>>2]|0;if(!(b[Y+84>>0]|0))wa=f[(f[Y+68>>2]|0)+(ta<<2)>>2]|0;else wa=ta;if(wa>>>0>=(f[Y+80>>2]|0)>>>0)break e;ta=f[Y+40>>2]|0;Bf((f[f[Y+64>>2]>>2]|0)+(W(wa,ta)|0)|0,va|0,ta|0)|0;S=S+1|0;N=f[l>>2]|0}while(S>>>0<(((f[s>>2]|0)-N|0)/20|0)>>>0)}while(0);f[B>>2]=(f[B>>2]|0)+1;f[x>>2]=(f[x>>2]|0)+1;X=R+1|0;if((X|0)==(M|0))break b;R=X;ba=f[i>>2]|0}}}while(0);H=f[A>>2]|0;if(!H){E=1;break}}}while(0);i=f[z>>2]|0;va=f[C>>2]|0;wa=(va>>>0)/341|0;a=i+(wa<<2)|0;oa=f[r>>2]|0;na=oa;fa=i;if((oa|0)!=(i|0)?(ka=(f[a>>2]|0)+((va-(wa*341|0)|0)*12|0)|0,wa=(f[A>>2]|0)+va|0,va=(wa>>>0)/341|0,ma=(f[i+(va<<2)>>2]|0)+((wa-(va*341|0)|0)*12|0)|0,(ma|0)!=(ka|0)):0){va=a;a=ka;while(1){ka=a+12|0;if((ka-(f[va>>2]|0)|0)==4092){wa=va+4|0;xa=wa;ya=f[wa>>2]|0}else{xa=va;ya=ka}a=ya;if((ma|0)==(a|0))break;else va=xa}}f[A>>2]=0;A=na-fa>>2;if(A>>>0>2){fa=i;do{Ko(f[fa>>2]|0);fa=(f[z>>2]|0)+4|0;f[z>>2]=fa;za=f[r>>2]|0;Aa=za-fa>>2}while(Aa>>>0>2);Ba=Aa;Ca=fa;Da=za}else{Ba=A;Ca=i;Da=oa}switch(Ba|0){case 1:{Ea=170;Fa=104;break}case 2:{Ea=341;Fa=104;break}default:{}}if((Fa|0)==104)f[C>>2]=Ea;if((Ca|0)!=(Da|0)){Ea=Ca;do{Ko(f[Ea>>2]|0);Ea=Ea+4|0}while((Ea|0)!=(Da|0));Da=f[z>>2]|0;z=f[r>>2]|0;if((z|0)!=(Da|0))f[r>>2]=z+(~((z+-4-Da|0)>>>2)<<2)}Da=f[g>>2]|0;if(!Da){u=e;return E|0}Ko(Da);u=e;return E|0}function hb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;e=u;u=u+32|0;g=e+8|0;h=e;i=a+12|0;j=f[i>>2]|0;f[g>>2]=0;k=g+4|0;f[k>>2]=0;l=g+8|0;f[l>>2]=0;do if(j)if(j>>>0>1073741823)$n(g);else{m=j<<2;n=wk(m)|0;f[g>>2]=n;o=n+(j<<2)|0;f[l>>2]=o;oh(n|0,0,m|0)|0;f[k>>2]=o;p=o;q=n;break}else{p=0;q=0}while(0);n=a+116|0;o=f[n>>2]|0;m=f[o>>2]|0;if(!m){r=o+8|0;s=o+4|0;t=q;v=p;w=j}else{j=o+4|0;f[j>>2]=m;Ko(m);m=o+8|0;f[m>>2]=0;f[j>>2]=0;f[o>>2]=0;r=m;s=j;t=f[g>>2]|0;v=f[k>>2]|0;w=f[i>>2]|0}f[o>>2]=t;f[s>>2]=v;f[r>>2]=f[l>>2];f[g>>2]=0;l=g+4|0;f[l>>2]=0;r=g+8|0;f[r>>2]=0;do if(w)if(w>>>0>1073741823)$n(g);else{v=w<<2;s=wk(v)|0;f[g>>2]=s;t=s+(w<<2)|0;f[r>>2]=t;oh(s|0,0,v|0)|0;f[l>>2]=t;x=t;y=s;break}else{x=0;y=0}while(0);w=a+128|0;s=f[w>>2]|0;t=f[s>>2]|0;if(!t){z=s+8|0;A=s+4|0;B=y;C=x}else{x=s+4|0;f[x>>2]=t;Ko(t);t=s+8|0;f[t>>2]=0;f[x>>2]=0;f[s>>2]=0;z=t;A=x;B=f[g>>2]|0;C=f[l>>2]|0}f[s>>2]=B;f[A>>2]=C;f[z>>2]=f[r>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;r=g+8|0;z=g+4|0;C=g+16|0;A=g+20|0;cc(g);B=f[z>>2]|0;s=(f[C>>2]|0)+(f[A>>2]|0)|0;if((f[r>>2]|0)==(B|0))D=0;else{l=(s>>>0)/341|0;D=(f[B+(l<<2)>>2]|0)+((s-(l*341|0)|0)*12|0)|0}f[D>>2]=c;f[D+4>>2]=0;f[D+8>>2]=0;D=(f[A>>2]|0)+1|0;f[A>>2]=D;a:do if(!D)E=1;else{l=d+16|0;s=d+20|0;B=d+28|0;x=a+8|0;t=d+12|0;y=a+104|0;v=a+4|0;o=a+92|0;k=a+48|0;j=a+44|0;m=a+36|0;p=a+16|0;q=a+88|0;F=a+76|0;G=a+84|0;H=D;while(1){I=f[C>>2]|0;J=H+-1|0;K=I+J|0;L=f[z>>2]|0;M=(K>>>0)/341|0;N=f[L+(M<<2)>>2]|0;O=K-(M*341|0)|0;M=f[N+(O*12|0)>>2]|0;K=f[N+(O*12|0)+4>>2]|0;P=f[N+(O*12|0)+8>>2]|0;f[A>>2]=J;J=f[r>>2]|0;O=J-L|0;if((1-H-I+((O|0)==0?0:((O>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[J+-4>>2]|0);f[r>>2]=(f[r>>2]|0)+-4}J=f[n>>2]|0;O=J+(P*12|0)|0;if(M>>>0>c>>>0){E=0;break a}I=f[i>>2]|0;L=(I+-1|0)==(K|0)?0:K+1|0;if(L>>>0>=I>>>0){E=0;break a}I=(f[w>>2]|0)+(P*12|0)|0;K=(f[a>>2]|0)-(f[(f[I>>2]|0)+(L<<2)>>2]|0)|0;b:do if(!K){if(M|0){N=0;do{Q=f[l>>2]|0;c:do if((f[s>>2]|0)!=(Q|0)){R=0;S=Q;do{T=S;U=f[T+(R*20|0)>>2]|0;V=T+(R*20|0)+12|0;X=T+(R*20|0)+16|0;Y=(f[O>>2]|0)+(f[T+(R*20|0)+4>>2]<<2)|0;T=f[V>>2]|0;if((T|0)==4)_=Y;else{if(f[X>>2]|0){$=f[t>>2]|0;aa=0;ba=T;while(1){Bf($|0,Y+(aa<<2)|0,ba|0)|0;aa=aa+1|0;T=f[V>>2]|0;if(aa>>>0>=(f[X>>2]|0)>>>0)break;else{$=$+T|0;ba=T}}}_=f[t>>2]|0}ba=f[B>>2]|0;if(!(b[U+84>>0]|0))ca=f[(f[U+68>>2]|0)+(ba<<2)>>2]|0;else ca=ba;if(ca>>>0>=(f[U+80>>2]|0)>>>0)break c;ba=f[U+40>>2]|0;Bf((f[f[U+64>>2]>>2]|0)+(W(ca,ba)|0)|0,_|0,ba|0)|0;R=R+1|0;S=f[l>>2]|0}while(R>>>0<(((f[s>>2]|0)-S|0)/20|0)>>>0)}while(0);f[B>>2]=(f[B>>2]|0)+1;f[x>>2]=(f[x>>2]|0)+1;N=N+1|0}while((N|0)!=(M|0))}}else{if(M>>>0>=3){if((f[x>>2]|0)>>>0>(f[v>>2]|0)>>>0){E=0;break a}N=P+1|0;Df(J+(N*12|0)|0,f[O>>2]|0,f[J+(P*12|0)+4>>2]|0);Q=(f[(f[n>>2]|0)+(N*12|0)>>2]|0)+(L<<2)|0;f[Q>>2]=(f[Q>>2]|0)+(1<<K+-1);Q=(Z(M|0)|0)^31;f[h>>2]=0;ph(p,Q,h);Q=(M>>>1)-(f[h>>2]|0)|0;S=M-Q|0;d:do if((Q|0)==(S|0)){da=Q;ea=Q}else{R=f[q>>2]|0;ba=f[G>>2]|0;do if((ba|0)!=(f[F>>2]|0)){$=(f[ba>>2]&1<<31-R|0)!=0;X=R+1|0;f[q>>2]=X;if((X|0)==32){f[G>>2]=ba+4;f[q>>2]=0;if($){da=Q;ea=S;break d}else break}else if($){da=Q;ea=S;break d}else break}while(0);da=S;ea=Q}while(0);Q=f[w>>2]|0;S=f[Q+(P*12|0)>>2]|0;ba=S+(L<<2)|0;f[ba>>2]=(f[ba>>2]|0)+1;Df(Q+(N*12|0)|0,S,f[Q+(P*12|0)+4>>2]|0);if(da|0){Q=f[r>>2]|0;S=f[z>>2]|0;ba=Q-S|0;R=(f[A>>2]|0)+(f[C>>2]|0)|0;if((((ba|0)==0?0:((ba>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);fa=(f[C>>2]|0)+(f[A>>2]|0)|0;ga=f[r>>2]|0;ha=f[z>>2]|0}else{fa=R;ga=Q;ha=S}if((ga|0)==(ha|0))ia=0;else{S=(fa>>>0)/341|0;ia=(f[ha+(S<<2)>>2]|0)+((fa-(S*341|0)|0)*12|0)|0}f[ia>>2]=da;f[ia+4>>2]=L;f[ia+8>>2]=P;f[A>>2]=(f[A>>2]|0)+1}if(ea|0){S=f[r>>2]|0;Q=f[z>>2]|0;R=S-Q|0;ba=(f[A>>2]|0)+(f[C>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(ba|0)){cc(g);ja=(f[C>>2]|0)+(f[A>>2]|0)|0;ka=f[r>>2]|0;la=f[z>>2]|0}else{ja=ba;ka=S;la=Q}if((ka|0)==(la|0))ma=0;else{Q=(ja>>>0)/341|0;ma=(f[la+(Q<<2)>>2]|0)+((ja-(Q*341|0)|0)*12|0)|0}f[ma>>2]=ea;f[ma+4>>2]=L;f[ma+8>>2]=N;f[A>>2]=(f[A>>2]|0)+1}break}Q=f[y>>2]|0;f[Q>>2]=L;S=f[i>>2]|0;if(S>>>0>1){ba=1;R=S;$=L;while(1){$=($|0)==(R+-1|0)?0:$+1|0;f[Q+(ba<<2)>>2]=$;ba=ba+1|0;X=f[i>>2]|0;if(ba>>>0>=X>>>0){na=X;break}else R=X}}else na=S;if(M|0){R=0;ba=na;while(1){if(ba|0){$=f[y>>2]|0;Q=f[o>>2]|0;N=f[I>>2]|0;X=0;do{aa=$+(X<<2)|0;f[Q+(f[aa>>2]<<2)>>2]=0;V=f[aa>>2]|0;Y=(f[a>>2]|0)-(f[N+(V<<2)>>2]|0)|0;do if(Y|0){T=Q+(V<<2)|0;oa=f[k>>2]|0;pa=32-oa|0;if((Y|0)>(pa|0)){qa=f[j>>2]|0;ra=qa+4|0;if((ra|0)==(f[m>>2]|0)){f[T>>2]=0;break}else{sa=f[qa>>2]<<oa;qa=Y-pa|0;f[k>>2]=qa;f[j>>2]=ra;ta=32-qa|0;f[T>>2]=(f[ra>>2]|0)>>>ta|sa>>>(ta-pa|0);break}}pa=f[j>>2]|0;if((pa|0)==(f[m>>2]|0)){f[T>>2]=0;break}f[T>>2]=f[pa>>2]<<oa>>>(32-Y|0);oa=(f[k>>2]|0)+Y|0;f[k>>2]=oa;if((oa|0)!=32)break;f[j>>2]=pa+4;f[k>>2]=0}while(0);Y=f[aa>>2]|0;V=Q+(Y<<2)|0;f[V>>2]=f[V>>2]|f[(f[O>>2]|0)+(Y<<2)>>2];X=X+1|0}while(X>>>0<(f[i>>2]|0)>>>0)}X=f[l>>2]|0;e:do if((f[s>>2]|0)!=(X|0)){Q=0;N=X;do{$=N;Y=f[$+(Q*20|0)>>2]|0;V=$+(Q*20|0)+12|0;pa=$+(Q*20|0)+16|0;oa=(f[o>>2]|0)+(f[$+(Q*20|0)+4>>2]<<2)|0;$=f[V>>2]|0;if(($|0)==4)ua=oa;else{if(f[pa>>2]|0){T=f[t>>2]|0;ta=0;sa=$;while(1){Bf(T|0,oa+(ta<<2)|0,sa|0)|0;ta=ta+1|0;$=f[V>>2]|0;if(ta>>>0>=(f[pa>>2]|0)>>>0)break;else{T=T+$|0;sa=$}}}ua=f[t>>2]|0}sa=f[B>>2]|0;if(!(b[Y+84>>0]|0))va=f[(f[Y+68>>2]|0)+(sa<<2)>>2]|0;else va=sa;if(va>>>0>=(f[Y+80>>2]|0)>>>0)break e;sa=f[Y+40>>2]|0;Bf((f[f[Y+64>>2]>>2]|0)+(W(va,sa)|0)|0,ua|0,sa|0)|0;Q=Q+1|0;N=f[l>>2]|0}while(Q>>>0<(((f[s>>2]|0)-N|0)/20|0)>>>0)}while(0);f[B>>2]=(f[B>>2]|0)+1;f[x>>2]=(f[x>>2]|0)+1;X=R+1|0;if((X|0)==(M|0))break b;R=X;ba=f[i>>2]|0}}}while(0);H=f[A>>2]|0;if(!H){E=1;break}}}while(0);i=f[z>>2]|0;ua=f[C>>2]|0;va=(ua>>>0)/341|0;a=i+(va<<2)|0;na=f[r>>2]|0;ma=na;ea=i;if((na|0)!=(i|0)?(ja=(f[a>>2]|0)+((ua-(va*341|0)|0)*12|0)|0,va=(f[A>>2]|0)+ua|0,ua=(va>>>0)/341|0,la=(f[i+(ua<<2)>>2]|0)+((va-(ua*341|0)|0)*12|0)|0,(la|0)!=(ja|0)):0){ua=a;a=ja;while(1){ja=a+12|0;if((ja-(f[ua>>2]|0)|0)==4092){va=ua+4|0;wa=va;xa=f[va>>2]|0}else{wa=ua;xa=ja}a=xa;if((la|0)==(a|0))break;else ua=wa}}f[A>>2]=0;A=ma-ea>>2;if(A>>>0>2){ea=i;do{Ko(f[ea>>2]|0);ea=(f[z>>2]|0)+4|0;f[z>>2]=ea;ya=f[r>>2]|0;za=ya-ea>>2}while(za>>>0>2);Aa=za;Ba=ea;Ca=ya}else{Aa=A;Ba=i;Ca=na}switch(Aa|0){case 1:{Da=170;Ea=102;break}case 2:{Da=341;Ea=102;break}default:{}}if((Ea|0)==102)f[C>>2]=Da;if((Ba|0)!=(Ca|0)){Da=Ba;do{Ko(f[Da>>2]|0);Da=Da+4|0}while((Da|0)!=(Ca|0));Ca=f[z>>2]|0;z=f[r>>2]|0;if((z|0)!=(Ca|0))f[r>>2]=z+(~((z+-4-Ca|0)>>>2)<<2)}Ca=f[g>>2]|0;if(!Ca){u=e;return E|0}Ko(Ca);u=e;return E|0}function ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+120|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+132|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+108|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+96|0;j=a+52|0;i=a+48|0;l=a+40|0;o=a+32|0;p=a+28|0;E=a+20|0;F=a+92|0;G=a+80|0;H=a+88|0;I=C;while(1){J=f[B>>2]|0;K=I+-1|0;L=J+K|0;M=f[y>>2]|0;N=(L>>>0)/341|0;O=f[M+(N<<2)>>2]|0;P=L-(N*341|0)|0;N=f[O+(P*12|0)>>2]|0;L=f[O+(P*12|0)+4>>2]|0;Q=f[O+(P*12|0)+8>>2]|0;f[z>>2]=K;K=f[q>>2]|0;P=K-M|0;if((1-I-J+((P|0)==0?0:((P>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[K+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}K=f[m>>2]|0;P=K+(Q*12|0)|0;J=(f[v>>2]|0)+(Q*12|0)|0;if(N>>>0>b>>>0){D=0;break a}M=Pk(a,N,J,L)|0;if(M>>>0>=(f[h>>2]|0)>>>0){D=0;break a}L=(f[a>>2]|0)-(f[(f[J>>2]|0)+(M<<2)>>2]|0)|0;b:do if(!L)if(!N)R=19;else{O=0;do{S=f[P>>2]|0;T=f[S>>2]|0;f[e>>2]=T;f[k>>2]=f[S+4>>2];f[r>>2]=f[S+8>>2];S=f[c>>2]|0;U=S+4|0;V=f[U>>2]|0;if(V>>>0<(f[S+8>>2]|0)>>>0){f[V>>2]=T;f[V+4>>2]=f[k>>2];f[V+8>>2]=f[r>>2];f[U>>2]=V+12}else If(S,e);f[A>>2]=(f[A>>2]|0)+1;O=O+1|0}while(O>>>0<N>>>0);R=19}else{if(N>>>0<3){O=f[w>>2]|0;f[O>>2]=M;S=f[h>>2]|0;if(S>>>0>1){V=1;U=S;T=M;while(1){T=(T|0)==(U+-1|0)?0:T+1|0;f[O+(V<<2)>>2]=T;V=V+1|0;W=f[h>>2]|0;if(V>>>0>=W>>>0){X=W;break}else U=W}}else X=S;if(!N){R=19;break}U=0;V=X;while(1){if(!V)Y=f[n>>2]|0;else{T=f[w>>2]|0;O=f[n>>2]|0;W=f[J>>2]|0;_=0;do{$=T+(_<<2)|0;f[O+(f[$>>2]<<2)>>2]=0;aa=f[$>>2]|0;ba=(f[a>>2]|0)-(f[W+(aa<<2)>>2]|0)|0;do if(ba|0){ca=O+(aa<<2)|0;da=f[j>>2]|0;ea=32-da|0;if((ba|0)>(ea|0)){fa=f[i>>2]|0;ga=fa+4|0;if((ga|0)==(f[l>>2]|0)){f[ca>>2]=0;break}else{ha=f[fa>>2]<<da;fa=ba-ea|0;f[j>>2]=fa;f[i>>2]=ga;ia=32-fa|0;f[ca>>2]=(f[ga>>2]|0)>>>ia|ha>>>(ia-ea|0);break}}ea=f[i>>2]|0;if((ea|0)==(f[l>>2]|0)){f[ca>>2]=0;break}f[ca>>2]=f[ea>>2]<<da>>>(32-ba|0);da=(f[j>>2]|0)+ba|0;f[j>>2]=da;if((da|0)!=32)break;f[i>>2]=ea+4;f[j>>2]=0}while(0);ba=f[$>>2]|0;aa=O+(ba<<2)|0;f[aa>>2]=f[aa>>2]|f[(f[P>>2]|0)+(ba<<2)>>2];_=_+1|0}while(_>>>0<(f[h>>2]|0)>>>0);Y=O}O=f[Y>>2]|0;f[e>>2]=O;f[x>>2]=f[Y+4>>2];f[t>>2]=f[Y+8>>2];_=f[c>>2]|0;W=_+4|0;T=f[W>>2]|0;if(T>>>0<(f[_+8>>2]|0)>>>0){f[T>>2]=O;f[T+4>>2]=f[x>>2];f[T+8>>2]=f[t>>2];f[W>>2]=T+12}else If(_,e);f[A>>2]=(f[A>>2]|0)+1;_=U+1|0;if(_>>>0>=N>>>0){R=19;break b}U=_;V=f[h>>2]|0}}if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}V=Q+1|0;U=f[m>>2]|0;S=U+(V*12|0)|0;if((S|0)==(P|0))ja=U;else{Df(S,f[P>>2]|0,f[K+(Q*12|0)+4>>2]|0);ja=f[m>>2]|0}S=(f[ja+(V*12|0)>>2]|0)+(M<<2)|0;f[S>>2]=(f[S>>2]|0)+(1<<L+-1);S=(Z(N|0)|0)^31;U=f[o>>2]|0;_=32-U|0;if((S|0)>(_|0)){T=f[p>>2]|0;W=T+4|0;if((W|0)==(f[E>>2]|0))ka=0;else{O=f[T>>2]<<U;T=S-_|0;f[o>>2]=T;f[p>>2]=W;ba=32-T|0;ka=(f[W>>2]|0)>>>ba|O>>>(ba-_|0)}}else{_=f[p>>2]|0;if((_|0)!=(f[E>>2]|0)){ba=f[_>>2]<<U>>>(32-S|0);O=U+S|0;f[o>>2]=O;if((O|0)==32){f[p>>2]=_+4;f[o>>2]=0;ka=ba}else ka=ba}else ka=0}ba=(N>>>1)-ka|0;_=N-ba|0;c:do if((ba|0)==(_|0)){la=ba;ma=ba}else{O=f[F>>2]|0;S=f[H>>2]|0;do if((S|0)!=(f[G>>2]|0)){U=(f[S>>2]&1<<31-O|0)!=0;W=O+1|0;f[F>>2]=W;if((W|0)==32){f[H>>2]=S+4;f[F>>2]=0;if(U){la=ba;ma=_;break c}else break}else if(U){la=ba;ma=_;break c}else break}while(0);la=_;ma=ba}while(0);ba=f[v>>2]|0;_=f[ba+(Q*12|0)>>2]|0;S=_+(M<<2)|0;f[S>>2]=(f[S>>2]|0)+1;Df(ba+(V*12|0)|0,_,f[ba+(Q*12|0)+4>>2]|0);if(la|0){ba=f[q>>2]|0;_=f[y>>2]|0;S=ba-_|0;O=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((S|0)==0?0:((S>>2)*341|0)+-1|0)|0)==(O|0)){cc(g);na=(f[B>>2]|0)+(f[z>>2]|0)|0;oa=f[q>>2]|0;pa=f[y>>2]|0}else{na=O;oa=ba;pa=_}if((oa|0)==(pa|0))qa=0;else{_=(na>>>0)/341|0;qa=(f[pa+(_<<2)>>2]|0)+((na-(_*341|0)|0)*12|0)|0}f[qa>>2]=la;f[qa+4>>2]=M;f[qa+8>>2]=Q;f[z>>2]=(f[z>>2]|0)+1}if(!ma)R=19;else{_=f[q>>2]|0;ba=f[y>>2]|0;O=_-ba|0;S=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((O|0)==0?0:((O>>2)*341|0)+-1|0)|0)==(S|0)){cc(g);ra=(f[B>>2]|0)+(f[z>>2]|0)|0;sa=f[q>>2]|0;ta=f[y>>2]|0}else{ra=S;sa=_;ta=ba}if((sa|0)==(ta|0))ua=0;else{ba=(ra>>>0)/341|0;ua=(f[ta+(ba<<2)>>2]|0)+((ra-(ba*341|0)|0)*12|0)|0}f[ua>>2]=ma;f[ua+4>>2]=M;f[ua+8>>2]=V;ba=(f[z>>2]|0)+1|0;f[z>>2]=ba;va=ba}}while(0);if((R|0)==19){R=0;va=f[z>>2]|0}if(!va){D=1;break}else I=va}}while(0);va=f[y>>2]|0;ua=f[B>>2]|0;ma=(ua>>>0)/341|0;ra=va+(ma<<2)|0;ta=f[q>>2]|0;sa=ta;qa=va;if((ta|0)!=(va|0)?(la=(f[ra>>2]|0)+((ua-(ma*341|0)|0)*12|0)|0,ma=(f[z>>2]|0)+ua|0,ua=(ma>>>0)/341|0,na=(f[va+(ua<<2)>>2]|0)+((ma-(ua*341|0)|0)*12|0)|0,(na|0)!=(la|0)):0){ua=ra;ra=la;while(1){la=ra+12|0;if((la-(f[ua>>2]|0)|0)==4092){ma=ua+4|0;wa=ma;xa=f[ma>>2]|0}else{wa=ua;xa=la}ra=xa;if((na|0)==(ra|0))break;else ua=wa}}f[z>>2]=0;z=sa-qa>>2;if(z>>>0>2){qa=va;do{Ko(f[qa>>2]|0);qa=(f[y>>2]|0)+4|0;f[y>>2]=qa;ya=f[q>>2]|0;za=ya-qa>>2}while(za>>>0>2);Aa=za;Ba=qa;Ca=ya}else{Aa=z;Ba=va;Ca=ta}switch(Aa|0){case 1:{Da=170;R=95;break}case 2:{Da=341;R=95;break}default:{}}if((R|0)==95)f[B>>2]=Da;if((Ba|0)!=(Ca|0)){Da=Ba;do{Ko(f[Da>>2]|0);Da=Da+4|0}while((Da|0)!=(Ca|0));Ca=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Ca|0))f[q>>2]=y+(~((y+-4-Ca|0)>>>2)<<2)}Ca=f[g>>2]|0;if(!Ca){u=d;return D|0}Ko(Ca);u=d;return D|0}function jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+120|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+132|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+108|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+96|0;j=a+52|0;i=a+48|0;l=a+40|0;o=a+32|0;p=a+28|0;E=a+20|0;F=a+92|0;G=a+80|0;H=a+88|0;I=C;while(1){J=f[B>>2]|0;K=I+-1|0;L=J+K|0;M=f[y>>2]|0;N=(L>>>0)/341|0;O=f[M+(N<<2)>>2]|0;P=L-(N*341|0)|0;N=f[O+(P*12|0)>>2]|0;L=f[O+(P*12|0)+4>>2]|0;Q=f[O+(P*12|0)+8>>2]|0;f[z>>2]=K;K=f[q>>2]|0;P=K-M|0;if((1-I-J+((P|0)==0?0:((P>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[K+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}K=f[m>>2]|0;P=K+(Q*12|0)|0;if(N>>>0>b>>>0){D=0;break a}J=f[h>>2]|0;M=(J+-1|0)==(L|0)?0:L+1|0;if(M>>>0>=J>>>0){D=0;break a}J=(f[v>>2]|0)+(Q*12|0)|0;L=(f[a>>2]|0)-(f[(f[J>>2]|0)+(M<<2)>>2]|0)|0;b:do if(!L)if(!N)R=19;else{O=0;do{S=f[P>>2]|0;T=f[S>>2]|0;f[e>>2]=T;f[k>>2]=f[S+4>>2];f[r>>2]=f[S+8>>2];S=f[c>>2]|0;U=S+4|0;V=f[U>>2]|0;if(V>>>0<(f[S+8>>2]|0)>>>0){f[V>>2]=T;f[V+4>>2]=f[k>>2];f[V+8>>2]=f[r>>2];f[U>>2]=V+12}else If(S,e);f[A>>2]=(f[A>>2]|0)+1;O=O+1|0}while(O>>>0<N>>>0);R=19}else{if(N>>>0<3){O=f[w>>2]|0;f[O>>2]=M;S=f[h>>2]|0;if(S>>>0>1){V=1;U=S;T=M;while(1){T=(T|0)==(U+-1|0)?0:T+1|0;f[O+(V<<2)>>2]=T;V=V+1|0;W=f[h>>2]|0;if(V>>>0>=W>>>0){X=W;break}else U=W}}else X=S;if(!N){R=19;break}U=0;V=X;while(1){if(!V)Y=f[n>>2]|0;else{T=f[w>>2]|0;O=f[n>>2]|0;W=f[J>>2]|0;_=0;do{$=T+(_<<2)|0;f[O+(f[$>>2]<<2)>>2]=0;aa=f[$>>2]|0;ba=(f[a>>2]|0)-(f[W+(aa<<2)>>2]|0)|0;do if(ba|0){ca=O+(aa<<2)|0;da=f[j>>2]|0;ea=32-da|0;if((ba|0)>(ea|0)){fa=f[i>>2]|0;ga=fa+4|0;if((ga|0)==(f[l>>2]|0)){f[ca>>2]=0;break}else{ha=f[fa>>2]<<da;fa=ba-ea|0;f[j>>2]=fa;f[i>>2]=ga;ia=32-fa|0;f[ca>>2]=(f[ga>>2]|0)>>>ia|ha>>>(ia-ea|0);break}}ea=f[i>>2]|0;if((ea|0)==(f[l>>2]|0)){f[ca>>2]=0;break}f[ca>>2]=f[ea>>2]<<da>>>(32-ba|0);da=(f[j>>2]|0)+ba|0;f[j>>2]=da;if((da|0)!=32)break;f[i>>2]=ea+4;f[j>>2]=0}while(0);ba=f[$>>2]|0;aa=O+(ba<<2)|0;f[aa>>2]=f[aa>>2]|f[(f[P>>2]|0)+(ba<<2)>>2];_=_+1|0}while(_>>>0<(f[h>>2]|0)>>>0);Y=O}O=f[Y>>2]|0;f[e>>2]=O;f[x>>2]=f[Y+4>>2];f[t>>2]=f[Y+8>>2];_=f[c>>2]|0;W=_+4|0;T=f[W>>2]|0;if(T>>>0<(f[_+8>>2]|0)>>>0){f[T>>2]=O;f[T+4>>2]=f[x>>2];f[T+8>>2]=f[t>>2];f[W>>2]=T+12}else If(_,e);f[A>>2]=(f[A>>2]|0)+1;_=U+1|0;if(_>>>0>=N>>>0){R=19;break b}U=_;V=f[h>>2]|0}}if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}V=Q+1|0;Df(K+(V*12|0)|0,f[P>>2]|0,f[K+(Q*12|0)+4>>2]|0);U=(f[(f[m>>2]|0)+(V*12|0)>>2]|0)+(M<<2)|0;f[U>>2]=(f[U>>2]|0)+(1<<L+-1);U=(Z(N|0)|0)^31;S=f[o>>2]|0;_=32-S|0;if((U|0)>(_|0)){T=f[p>>2]|0;W=T+4|0;if((W|0)==(f[E>>2]|0))ja=0;else{O=f[T>>2]<<S;T=U-_|0;f[o>>2]=T;f[p>>2]=W;ba=32-T|0;ja=(f[W>>2]|0)>>>ba|O>>>(ba-_|0)}}else{_=f[p>>2]|0;if((_|0)!=(f[E>>2]|0)){ba=f[_>>2]<<S>>>(32-U|0);O=S+U|0;f[o>>2]=O;if((O|0)==32){f[p>>2]=_+4;f[o>>2]=0;ja=ba}else ja=ba}else ja=0}ba=(N>>>1)-ja|0;_=N-ba|0;c:do if((ba|0)==(_|0)){ka=ba;la=ba}else{O=f[F>>2]|0;U=f[H>>2]|0;do if((U|0)!=(f[G>>2]|0)){S=(f[U>>2]&1<<31-O|0)!=0;W=O+1|0;f[F>>2]=W;if((W|0)==32){f[H>>2]=U+4;f[F>>2]=0;if(S){ka=ba;la=_;break c}else break}else if(S){ka=ba;la=_;break c}else break}while(0);ka=_;la=ba}while(0);ba=f[v>>2]|0;_=f[ba+(Q*12|0)>>2]|0;U=_+(M<<2)|0;f[U>>2]=(f[U>>2]|0)+1;Df(ba+(V*12|0)|0,_,f[ba+(Q*12|0)+4>>2]|0);if(ka|0){ba=f[q>>2]|0;_=f[y>>2]|0;U=ba-_|0;O=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((U|0)==0?0:((U>>2)*341|0)+-1|0)|0)==(O|0)){cc(g);ma=(f[B>>2]|0)+(f[z>>2]|0)|0;na=f[q>>2]|0;oa=f[y>>2]|0}else{ma=O;na=ba;oa=_}if((na|0)==(oa|0))pa=0;else{_=(ma>>>0)/341|0;pa=(f[oa+(_<<2)>>2]|0)+((ma-(_*341|0)|0)*12|0)|0}f[pa>>2]=ka;f[pa+4>>2]=M;f[pa+8>>2]=Q;f[z>>2]=(f[z>>2]|0)+1}if(!la)R=19;else{_=f[q>>2]|0;ba=f[y>>2]|0;O=_-ba|0;U=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((O|0)==0?0:((O>>2)*341|0)+-1|0)|0)==(U|0)){cc(g);qa=(f[B>>2]|0)+(f[z>>2]|0)|0;ra=f[q>>2]|0;sa=f[y>>2]|0}else{qa=U;ra=_;sa=ba}if((ra|0)==(sa|0))ta=0;else{ba=(qa>>>0)/341|0;ta=(f[sa+(ba<<2)>>2]|0)+((qa-(ba*341|0)|0)*12|0)|0}f[ta>>2]=la;f[ta+4>>2]=M;f[ta+8>>2]=V;ba=(f[z>>2]|0)+1|0;f[z>>2]=ba;ua=ba}}while(0);if((R|0)==19){R=0;ua=f[z>>2]|0}if(!ua){D=1;break}else I=ua}}while(0);ua=f[y>>2]|0;ta=f[B>>2]|0;la=(ta>>>0)/341|0;qa=ua+(la<<2)|0;sa=f[q>>2]|0;ra=sa;pa=ua;if((sa|0)!=(ua|0)?(ka=(f[qa>>2]|0)+((ta-(la*341|0)|0)*12|0)|0,la=(f[z>>2]|0)+ta|0,ta=(la>>>0)/341|0,ma=(f[ua+(ta<<2)>>2]|0)+((la-(ta*341|0)|0)*12|0)|0,(ma|0)!=(ka|0)):0){ta=qa;qa=ka;while(1){ka=qa+12|0;if((ka-(f[ta>>2]|0)|0)==4092){la=ta+4|0;va=la;wa=f[la>>2]|0}else{va=ta;wa=ka}qa=wa;if((ma|0)==(qa|0))break;else ta=va}}f[z>>2]=0;z=ra-pa>>2;if(z>>>0>2){pa=ua;do{Ko(f[pa>>2]|0);pa=(f[y>>2]|0)+4|0;f[y>>2]=pa;xa=f[q>>2]|0;ya=xa-pa>>2}while(ya>>>0>2);za=ya;Aa=pa;Ba=xa}else{za=z;Aa=ua;Ba=sa}switch(za|0){case 1:{Ca=170;R=93;break}case 2:{Ca=341;R=93;break}default:{}}if((R|0)==93)f[B>>2]=Ca;if((Aa|0)!=(Ba|0)){Ca=Aa;do{Ko(f[Ca>>2]|0);Ca=Ca+4|0}while((Ca|0)!=(Ba|0));Ba=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(Ba|0))f[q>>2]=y+(~((y+-4-Ba|0)>>>2)<<2)}Ba=f[g>>2]|0;if(!Ba){u=d;return D|0}Ko(Ba);u=d;return D|0}function kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+628|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+640|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+616|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+604|0;j=a+560|0;i=a+556|0;l=a+548|0;o=a+600|0;p=a+588|0;E=a+596|0;F=C;while(1){G=f[B>>2]|0;H=F+-1|0;I=G+H|0;J=f[y>>2]|0;K=(I>>>0)/341|0;L=f[J+(K<<2)>>2]|0;M=I-(K*341|0)|0;K=f[L+(M*12|0)>>2]|0;I=f[L+(M*12|0)+4>>2]|0;N=f[L+(M*12|0)+8>>2]|0;f[z>>2]=H;H=f[q>>2]|0;M=H-J|0;if((1-F-G+((M|0)==0?0:((M>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[H+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}H=f[m>>2]|0;M=H+(N*12|0)|0;G=(f[v>>2]|0)+(N*12|0)|0;if(K>>>0>b>>>0){D=0;break a}J=tg(a,K,G,I)|0;if(J>>>0>=(f[h>>2]|0)>>>0){D=0;break a}I=(f[a>>2]|0)-(f[(f[G>>2]|0)+(J<<2)>>2]|0)|0;b:do if(!I)if(!K)O=19;else{L=0;do{P=f[M>>2]|0;Q=f[P>>2]|0;f[e>>2]=Q;f[k>>2]=f[P+4>>2];f[r>>2]=f[P+8>>2];P=f[c>>2]|0;R=P+4|0;S=f[R>>2]|0;if(S>>>0<(f[P+8>>2]|0)>>>0){f[S>>2]=Q;f[S+4>>2]=f[k>>2];f[S+8>>2]=f[r>>2];f[R>>2]=S+12}else If(P,e);f[A>>2]=(f[A>>2]|0)+1;L=L+1|0}while(L>>>0<K>>>0);O=19}else{if(K>>>0<3){L=f[w>>2]|0;f[L>>2]=J;P=f[h>>2]|0;if(P>>>0>1){S=1;R=P;Q=J;while(1){Q=(Q|0)==(R+-1|0)?0:Q+1|0;f[L+(S<<2)>>2]=Q;S=S+1|0;T=f[h>>2]|0;if(S>>>0>=T>>>0){U=T;break}else R=T}}else U=P;if(!K){O=19;break}R=0;S=U;while(1){if(!S)V=f[n>>2]|0;else{Q=f[w>>2]|0;L=f[n>>2]|0;T=f[G>>2]|0;W=0;do{X=Q+(W<<2)|0;f[L+(f[X>>2]<<2)>>2]=0;Y=f[X>>2]|0;_=(f[a>>2]|0)-(f[T+(Y<<2)>>2]|0)|0;do if(_|0){$=L+(Y<<2)|0;aa=f[j>>2]|0;ba=32-aa|0;if((_|0)>(ba|0)){ca=f[i>>2]|0;da=ca+4|0;if((da|0)==(f[l>>2]|0)){f[$>>2]=0;break}else{ea=f[ca>>2]<<aa;ca=_-ba|0;f[j>>2]=ca;f[i>>2]=da;fa=32-ca|0;f[$>>2]=(f[da>>2]|0)>>>fa|ea>>>(fa-ba|0);break}}ba=f[i>>2]|0;if((ba|0)==(f[l>>2]|0)){f[$>>2]=0;break}f[$>>2]=f[ba>>2]<<aa>>>(32-_|0);aa=(f[j>>2]|0)+_|0;f[j>>2]=aa;if((aa|0)!=32)break;f[i>>2]=ba+4;f[j>>2]=0}while(0);_=f[X>>2]|0;Y=L+(_<<2)|0;f[Y>>2]=f[Y>>2]|f[(f[M>>2]|0)+(_<<2)>>2];W=W+1|0}while(W>>>0<(f[h>>2]|0)>>>0);V=L}L=f[V>>2]|0;f[e>>2]=L;f[x>>2]=f[V+4>>2];f[t>>2]=f[V+8>>2];W=f[c>>2]|0;T=W+4|0;Q=f[T>>2]|0;if(Q>>>0<(f[W+8>>2]|0)>>>0){f[Q>>2]=L;f[Q+4>>2]=f[x>>2];f[Q+8>>2]=f[t>>2];f[T>>2]=Q+12}else If(W,e);f[A>>2]=(f[A>>2]|0)+1;W=R+1|0;if(W>>>0>=K>>>0){O=19;break b}R=W;S=f[h>>2]|0}}if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}S=N+1|0;R=f[m>>2]|0;P=R+(S*12|0)|0;if((P|0)==(M|0))ga=R;else{Df(P,f[M>>2]|0,f[H+(N*12|0)+4>>2]|0);ga=f[m>>2]|0}P=(f[ga+(S*12|0)>>2]|0)+(J<<2)|0;f[P>>2]=(f[P>>2]|0)+(1<<I+-1);P=(Z(K|0)|0)^31;if(!P)ha=0;else{R=0;W=0;while(1){Q=W<<1|(pi(a+16+(R<<4)|0)|0)&1;R=R+1|0;if((R|0)==(P|0)){ha=Q;break}else W=Q}}W=(K>>>1)-ha|0;P=K-W|0;c:do if((W|0)==(P|0)){ia=W;ja=W}else{R=f[o>>2]|0;Q=f[E>>2]|0;do if((Q|0)!=(f[p>>2]|0)){T=(f[Q>>2]&1<<31-R|0)!=0;L=R+1|0;f[o>>2]=L;if((L|0)==32){f[E>>2]=Q+4;f[o>>2]=0;if(T){ia=W;ja=P;break c}else break}else if(T){ia=W;ja=P;break c}else break}while(0);ia=P;ja=W}while(0);W=f[v>>2]|0;P=f[W+(N*12|0)>>2]|0;Q=P+(J<<2)|0;f[Q>>2]=(f[Q>>2]|0)+1;Df(W+(S*12|0)|0,P,f[W+(N*12|0)+4>>2]|0);if(ia|0){W=f[q>>2]|0;P=f[y>>2]|0;Q=W-P|0;R=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((Q|0)==0?0:((Q>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);ka=(f[B>>2]|0)+(f[z>>2]|0)|0;la=f[q>>2]|0;ma=f[y>>2]|0}else{ka=R;la=W;ma=P}if((la|0)==(ma|0))na=0;else{P=(ka>>>0)/341|0;na=(f[ma+(P<<2)>>2]|0)+((ka-(P*341|0)|0)*12|0)|0}f[na>>2]=ia;f[na+4>>2]=J;f[na+8>>2]=N;f[z>>2]=(f[z>>2]|0)+1}if(!ja)O=19;else{P=f[q>>2]|0;W=f[y>>2]|0;R=P-W|0;Q=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(Q|0)){cc(g);oa=(f[B>>2]|0)+(f[z>>2]|0)|0;pa=f[q>>2]|0;qa=f[y>>2]|0}else{oa=Q;pa=P;qa=W}if((pa|0)==(qa|0))ra=0;else{W=(oa>>>0)/341|0;ra=(f[qa+(W<<2)>>2]|0)+((oa-(W*341|0)|0)*12|0)|0}f[ra>>2]=ja;f[ra+4>>2]=J;f[ra+8>>2]=S;W=(f[z>>2]|0)+1|0;f[z>>2]=W;sa=W}}while(0);if((O|0)==19){O=0;sa=f[z>>2]|0}if(!sa){D=1;break}else F=sa}}while(0);sa=f[y>>2]|0;ra=f[B>>2]|0;ja=(ra>>>0)/341|0;oa=sa+(ja<<2)|0;qa=f[q>>2]|0;pa=qa;na=sa;if((qa|0)!=(sa|0)?(ia=(f[oa>>2]|0)+((ra-(ja*341|0)|0)*12|0)|0,ja=(f[z>>2]|0)+ra|0,ra=(ja>>>0)/341|0,ka=(f[sa+(ra<<2)>>2]|0)+((ja-(ra*341|0)|0)*12|0)|0,(ka|0)!=(ia|0)):0){ra=oa;oa=ia;while(1){ia=oa+12|0;if((ia-(f[ra>>2]|0)|0)==4092){ja=ra+4|0;ta=ja;ua=f[ja>>2]|0}else{ta=ra;ua=ia}oa=ua;if((ka|0)==(oa|0))break;else ra=ta}}f[z>>2]=0;z=pa-na>>2;if(z>>>0>2){na=sa;do{Ko(f[na>>2]|0);na=(f[y>>2]|0)+4|0;f[y>>2]=na;va=f[q>>2]|0;wa=va-na>>2}while(wa>>>0>2);xa=wa;ya=na;za=va}else{xa=z;ya=sa;za=qa}switch(xa|0){case 1:{Aa=170;O=92;break}case 2:{Aa=341;O=92;break}default:{}}if((O|0)==92)f[B>>2]=Aa;if((ya|0)!=(za|0)){Aa=ya;do{Ko(f[Aa>>2]|0);Aa=Aa+4|0}while((Aa|0)!=(za|0));za=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(za|0))f[q>>2]=y+(~((y+-4-za|0)>>>2)<<2)}za=f[g>>2]|0;if(!za){u=d;return D|0}Ko(za);u=d;return D|0}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+628|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+640|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+616|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+604|0;j=a+560|0;i=a+556|0;l=a+548|0;o=a+600|0;p=a+588|0;E=a+596|0;F=C;while(1){G=f[B>>2]|0;H=F+-1|0;I=G+H|0;J=f[y>>2]|0;K=(I>>>0)/341|0;L=f[J+(K<<2)>>2]|0;M=I-(K*341|0)|0;K=f[L+(M*12|0)>>2]|0;I=f[L+(M*12|0)+4>>2]|0;N=f[L+(M*12|0)+8>>2]|0;f[z>>2]=H;H=f[q>>2]|0;M=H-J|0;if((1-F-G+((M|0)==0?0:((M>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[H+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}H=f[m>>2]|0;M=H+(N*12|0)|0;G=(f[v>>2]|0)+(N*12|0)|0;if(K>>>0>b>>>0){D=0;break a}J=Pk(a,K,G,I)|0;if(J>>>0>=(f[h>>2]|0)>>>0){D=0;break a}I=(f[a>>2]|0)-(f[(f[G>>2]|0)+(J<<2)>>2]|0)|0;b:do if(!I)if(!K)O=19;else{L=0;do{P=f[M>>2]|0;Q=f[P>>2]|0;f[e>>2]=Q;f[k>>2]=f[P+4>>2];f[r>>2]=f[P+8>>2];P=f[c>>2]|0;R=P+4|0;S=f[R>>2]|0;if(S>>>0<(f[P+8>>2]|0)>>>0){f[S>>2]=Q;f[S+4>>2]=f[k>>2];f[S+8>>2]=f[r>>2];f[R>>2]=S+12}else If(P,e);f[A>>2]=(f[A>>2]|0)+1;L=L+1|0}while(L>>>0<K>>>0);O=19}else{if(K>>>0<3){L=f[w>>2]|0;f[L>>2]=J;P=f[h>>2]|0;if(P>>>0>1){S=1;R=P;Q=J;while(1){Q=(Q|0)==(R+-1|0)?0:Q+1|0;f[L+(S<<2)>>2]=Q;S=S+1|0;T=f[h>>2]|0;if(S>>>0>=T>>>0){U=T;break}else R=T}}else U=P;if(!K){O=19;break}R=0;S=U;while(1){if(!S)V=f[n>>2]|0;else{Q=f[w>>2]|0;L=f[n>>2]|0;T=f[G>>2]|0;W=0;do{X=Q+(W<<2)|0;f[L+(f[X>>2]<<2)>>2]=0;Y=f[X>>2]|0;_=(f[a>>2]|0)-(f[T+(Y<<2)>>2]|0)|0;do if(_|0){$=L+(Y<<2)|0;aa=f[j>>2]|0;ba=32-aa|0;if((_|0)>(ba|0)){ca=f[i>>2]|0;da=ca+4|0;if((da|0)==(f[l>>2]|0)){f[$>>2]=0;break}else{ea=f[ca>>2]<<aa;ca=_-ba|0;f[j>>2]=ca;f[i>>2]=da;fa=32-ca|0;f[$>>2]=(f[da>>2]|0)>>>fa|ea>>>(fa-ba|0);break}}ba=f[i>>2]|0;if((ba|0)==(f[l>>2]|0)){f[$>>2]=0;break}f[$>>2]=f[ba>>2]<<aa>>>(32-_|0);aa=(f[j>>2]|0)+_|0;f[j>>2]=aa;if((aa|0)!=32)break;f[i>>2]=ba+4;f[j>>2]=0}while(0);_=f[X>>2]|0;Y=L+(_<<2)|0;f[Y>>2]=f[Y>>2]|f[(f[M>>2]|0)+(_<<2)>>2];W=W+1|0}while(W>>>0<(f[h>>2]|0)>>>0);V=L}L=f[V>>2]|0;f[e>>2]=L;f[x>>2]=f[V+4>>2];f[t>>2]=f[V+8>>2];W=f[c>>2]|0;T=W+4|0;Q=f[T>>2]|0;if(Q>>>0<(f[W+8>>2]|0)>>>0){f[Q>>2]=L;f[Q+4>>2]=f[x>>2];f[Q+8>>2]=f[t>>2];f[T>>2]=Q+12}else If(W,e);f[A>>2]=(f[A>>2]|0)+1;W=R+1|0;if(W>>>0>=K>>>0){O=19;break b}R=W;S=f[h>>2]|0}}if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}S=N+1|0;R=f[m>>2]|0;P=R+(S*12|0)|0;if((P|0)==(M|0))ga=R;else{Df(P,f[M>>2]|0,f[H+(N*12|0)+4>>2]|0);ga=f[m>>2]|0}P=(f[ga+(S*12|0)>>2]|0)+(J<<2)|0;f[P>>2]=(f[P>>2]|0)+(1<<I+-1);P=(Z(K|0)|0)^31;if(!P)ha=0;else{R=0;W=0;while(1){Q=W<<1|(pi(a+16+(R<<4)|0)|0)&1;R=R+1|0;if((R|0)==(P|0)){ha=Q;break}else W=Q}}W=(K>>>1)-ha|0;P=K-W|0;c:do if((W|0)==(P|0)){ia=W;ja=W}else{R=f[o>>2]|0;Q=f[E>>2]|0;do if((Q|0)!=(f[p>>2]|0)){T=(f[Q>>2]&1<<31-R|0)!=0;L=R+1|0;f[o>>2]=L;if((L|0)==32){f[E>>2]=Q+4;f[o>>2]=0;if(T){ia=W;ja=P;break c}else break}else if(T){ia=W;ja=P;break c}else break}while(0);ia=P;ja=W}while(0);W=f[v>>2]|0;P=f[W+(N*12|0)>>2]|0;Q=P+(J<<2)|0;f[Q>>2]=(f[Q>>2]|0)+1;Df(W+(S*12|0)|0,P,f[W+(N*12|0)+4>>2]|0);if(ia|0){W=f[q>>2]|0;P=f[y>>2]|0;Q=W-P|0;R=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((Q|0)==0?0:((Q>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);ka=(f[B>>2]|0)+(f[z>>2]|0)|0;la=f[q>>2]|0;ma=f[y>>2]|0}else{ka=R;la=W;ma=P}if((la|0)==(ma|0))na=0;else{P=(ka>>>0)/341|0;na=(f[ma+(P<<2)>>2]|0)+((ka-(P*341|0)|0)*12|0)|0}f[na>>2]=ia;f[na+4>>2]=J;f[na+8>>2]=N;f[z>>2]=(f[z>>2]|0)+1}if(!ja)O=19;else{P=f[q>>2]|0;W=f[y>>2]|0;R=P-W|0;Q=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(Q|0)){cc(g);oa=(f[B>>2]|0)+(f[z>>2]|0)|0;pa=f[q>>2]|0;qa=f[y>>2]|0}else{oa=Q;pa=P;qa=W}if((pa|0)==(qa|0))ra=0;else{W=(oa>>>0)/341|0;ra=(f[qa+(W<<2)>>2]|0)+((oa-(W*341|0)|0)*12|0)|0}f[ra>>2]=ja;f[ra+4>>2]=J;f[ra+8>>2]=S;W=(f[z>>2]|0)+1|0;f[z>>2]=W;sa=W}}while(0);if((O|0)==19){O=0;sa=f[z>>2]|0}if(!sa){D=1;break}else F=sa}}while(0);sa=f[y>>2]|0;ra=f[B>>2]|0;ja=(ra>>>0)/341|0;oa=sa+(ja<<2)|0;qa=f[q>>2]|0;pa=qa;na=sa;if((qa|0)!=(sa|0)?(ia=(f[oa>>2]|0)+((ra-(ja*341|0)|0)*12|0)|0,ja=(f[z>>2]|0)+ra|0,ra=(ja>>>0)/341|0,ka=(f[sa+(ra<<2)>>2]|0)+((ja-(ra*341|0)|0)*12|0)|0,(ka|0)!=(ia|0)):0){ra=oa;oa=ia;while(1){ia=oa+12|0;if((ia-(f[ra>>2]|0)|0)==4092){ja=ra+4|0;ta=ja;ua=f[ja>>2]|0}else{ta=ra;ua=ia}oa=ua;if((ka|0)==(oa|0))break;else ra=ta}}f[z>>2]=0;z=pa-na>>2;if(z>>>0>2){na=sa;do{Ko(f[na>>2]|0);na=(f[y>>2]|0)+4|0;f[y>>2]=na;va=f[q>>2]|0;wa=va-na>>2}while(wa>>>0>2);xa=wa;ya=na;za=va}else{xa=z;ya=sa;za=qa}switch(xa|0){case 1:{Aa=170;O=92;break}case 2:{Aa=341;O=92;break}default:{}}if((O|0)==92)f[B>>2]=Aa;if((ya|0)!=(za|0)){Aa=ya;do{Ko(f[Aa>>2]|0);Aa=Aa+4|0}while((Aa|0)!=(za|0));za=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(za|0))f[q>>2]=y+(~((y+-4-za|0)>>>2)<<2)}za=f[g>>2]|0;if(!za){u=d;return D|0}Ko(za);u=d;return D|0}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+628|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+640|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+616|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+604|0;j=a+560|0;i=a+556|0;l=a+548|0;o=a+600|0;p=a+588|0;E=a+596|0;F=C;while(1){G=f[B>>2]|0;H=F+-1|0;I=G+H|0;J=f[y>>2]|0;K=(I>>>0)/341|0;L=f[J+(K<<2)>>2]|0;M=I-(K*341|0)|0;K=f[L+(M*12|0)>>2]|0;I=f[L+(M*12|0)+4>>2]|0;N=f[L+(M*12|0)+8>>2]|0;f[z>>2]=H;H=f[q>>2]|0;M=H-J|0;if((1-F-G+((M|0)==0?0:((M>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[H+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}H=f[m>>2]|0;M=H+(N*12|0)|0;if(K>>>0>b>>>0){D=0;break a}G=f[h>>2]|0;J=(G+-1|0)==(I|0)?0:I+1|0;if(J>>>0>=G>>>0){D=0;break a}G=(f[v>>2]|0)+(N*12|0)|0;I=(f[a>>2]|0)-(f[(f[G>>2]|0)+(J<<2)>>2]|0)|0;b:do if(!I)if(!K)O=19;else{L=0;do{P=f[M>>2]|0;Q=f[P>>2]|0;f[e>>2]=Q;f[k>>2]=f[P+4>>2];f[r>>2]=f[P+8>>2];P=f[c>>2]|0;R=P+4|0;S=f[R>>2]|0;if(S>>>0<(f[P+8>>2]|0)>>>0){f[S>>2]=Q;f[S+4>>2]=f[k>>2];f[S+8>>2]=f[r>>2];f[R>>2]=S+12}else If(P,e);f[A>>2]=(f[A>>2]|0)+1;L=L+1|0}while(L>>>0<K>>>0);O=19}else{if(K>>>0>=3){if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}L=N+1|0;Df(H+(L*12|0)|0,f[M>>2]|0,f[H+(N*12|0)+4>>2]|0);P=(f[(f[m>>2]|0)+(L*12|0)>>2]|0)+(J<<2)|0;f[P>>2]=(f[P>>2]|0)+(1<<I+-1);P=(Z(K|0)|0)^31;if(!P)T=0;else{S=0;R=0;while(1){Q=R<<1|(pi(a+16+(S<<4)|0)|0)&1;S=S+1|0;if((S|0)==(P|0)){T=Q;break}else R=Q}}R=(K>>>1)-T|0;P=K-R|0;c:do if((R|0)==(P|0)){U=R;V=R}else{S=f[o>>2]|0;Q=f[E>>2]|0;do if((Q|0)!=(f[p>>2]|0)){W=(f[Q>>2]&1<<31-S|0)!=0;X=S+1|0;f[o>>2]=X;if((X|0)==32){f[E>>2]=Q+4;f[o>>2]=0;if(W){U=R;V=P;break c}else break}else if(W){U=R;V=P;break c}else break}while(0);U=P;V=R}while(0);R=f[v>>2]|0;P=f[R+(N*12|0)>>2]|0;Q=P+(J<<2)|0;f[Q>>2]=(f[Q>>2]|0)+1;Df(R+(L*12|0)|0,P,f[R+(N*12|0)+4>>2]|0);if(U|0){R=f[q>>2]|0;P=f[y>>2]|0;Q=R-P|0;S=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((Q|0)==0?0:((Q>>2)*341|0)+-1|0)|0)==(S|0)){cc(g);Y=(f[B>>2]|0)+(f[z>>2]|0)|0;_=f[q>>2]|0;$=f[y>>2]|0}else{Y=S;_=R;$=P}if((_|0)==($|0))aa=0;else{P=(Y>>>0)/341|0;aa=(f[$+(P<<2)>>2]|0)+((Y-(P*341|0)|0)*12|0)|0}f[aa>>2]=U;f[aa+4>>2]=J;f[aa+8>>2]=N;f[z>>2]=(f[z>>2]|0)+1}if(!V){O=19;break}P=f[q>>2]|0;R=f[y>>2]|0;S=P-R|0;Q=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((S|0)==0?0:((S>>2)*341|0)+-1|0)|0)==(Q|0)){cc(g);ba=(f[B>>2]|0)+(f[z>>2]|0)|0;ca=f[q>>2]|0;da=f[y>>2]|0}else{ba=Q;ca=P;da=R}if((ca|0)==(da|0))ea=0;else{R=(ba>>>0)/341|0;ea=(f[da+(R<<2)>>2]|0)+((ba-(R*341|0)|0)*12|0)|0}f[ea>>2]=V;f[ea+4>>2]=J;f[ea+8>>2]=L;R=(f[z>>2]|0)+1|0;f[z>>2]=R;fa=R;break}R=f[w>>2]|0;f[R>>2]=J;P=f[h>>2]|0;if(P>>>0>1){Q=1;S=P;W=J;while(1){W=(W|0)==(S+-1|0)?0:W+1|0;f[R+(Q<<2)>>2]=W;Q=Q+1|0;X=f[h>>2]|0;if(Q>>>0>=X>>>0){ga=X;break}else S=X}}else ga=P;if(!K)O=19;else{S=0;Q=ga;while(1){if(!Q)ha=f[n>>2]|0;else{W=f[w>>2]|0;R=f[n>>2]|0;L=f[G>>2]|0;X=0;do{ia=W+(X<<2)|0;f[R+(f[ia>>2]<<2)>>2]=0;ja=f[ia>>2]|0;ka=(f[a>>2]|0)-(f[L+(ja<<2)>>2]|0)|0;do if(ka|0){la=R+(ja<<2)|0;ma=f[j>>2]|0;na=32-ma|0;if((ka|0)>(na|0)){oa=f[i>>2]|0;pa=oa+4|0;if((pa|0)==(f[l>>2]|0)){f[la>>2]=0;break}else{qa=f[oa>>2]<<ma;oa=ka-na|0;f[j>>2]=oa;f[i>>2]=pa;ra=32-oa|0;f[la>>2]=(f[pa>>2]|0)>>>ra|qa>>>(ra-na|0);break}}na=f[i>>2]|0;if((na|0)==(f[l>>2]|0)){f[la>>2]=0;break}f[la>>2]=f[na>>2]<<ma>>>(32-ka|0);ma=(f[j>>2]|0)+ka|0;f[j>>2]=ma;if((ma|0)!=32)break;f[i>>2]=na+4;f[j>>2]=0}while(0);ka=f[ia>>2]|0;ja=R+(ka<<2)|0;f[ja>>2]=f[ja>>2]|f[(f[M>>2]|0)+(ka<<2)>>2];X=X+1|0}while(X>>>0<(f[h>>2]|0)>>>0);ha=R}R=f[ha>>2]|0;f[e>>2]=R;f[x>>2]=f[ha+4>>2];f[t>>2]=f[ha+8>>2];X=f[c>>2]|0;L=X+4|0;W=f[L>>2]|0;if(W>>>0<(f[X+8>>2]|0)>>>0){f[W>>2]=R;f[W+4>>2]=f[x>>2];f[W+8>>2]=f[t>>2];f[L>>2]=W+12}else If(X,e);f[A>>2]=(f[A>>2]|0)+1;X=S+1|0;if(X>>>0>=K>>>0){O=19;break b}S=X;Q=f[h>>2]|0}}}while(0);if((O|0)==19){O=0;fa=f[z>>2]|0}if(!fa){D=1;break}else F=fa}}while(0);fa=f[y>>2]|0;h=f[B>>2]|0;e=(h>>>0)/341|0;c=fa+(e<<2)|0;ha=f[q>>2]|0;a=ha;ga=fa;if((ha|0)!=(fa|0)?(ea=(f[c>>2]|0)+((h-(e*341|0)|0)*12|0)|0,e=(f[z>>2]|0)+h|0,h=(e>>>0)/341|0,V=(f[fa+(h<<2)>>2]|0)+((e-(h*341|0)|0)*12|0)|0,(V|0)!=(ea|0)):0){h=c;c=ea;while(1){ea=c+12|0;if((ea-(f[h>>2]|0)|0)==4092){e=h+4|0;sa=e;ta=f[e>>2]|0}else{sa=h;ta=ea}c=ta;if((V|0)==(c|0))break;else h=sa}}f[z>>2]=0;z=a-ga>>2;if(z>>>0>2){ga=fa;do{Ko(f[ga>>2]|0);ga=(f[y>>2]|0)+4|0;f[y>>2]=ga;ua=f[q>>2]|0;va=ua-ga>>2}while(va>>>0>2);wa=va;xa=ga;ya=ua}else{wa=z;xa=fa;ya=ha}switch(wa|0){case 1:{za=170;O=90;break}case 2:{za=341;O=90;break}default:{}}if((O|0)==90)f[B>>2]=za;if((xa|0)!=(ya|0)){za=xa;do{Ko(f[za>>2]|0);za=za+4|0}while((za|0)!=(ya|0));ya=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(ya|0))f[q>>2]=y+(~((y+-4-ya|0)>>>2)<<2)}ya=f[g>>2]|0;if(!ya){u=d;return D|0}Ko(ya);u=d;return D|0}function nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+116|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+128|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+104|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+92|0;j=a+48|0;i=a+44|0;l=a+36|0;o=a+16|0;p=a+88|0;E=a+76|0;F=a+84|0;G=C;while(1){H=f[B>>2]|0;I=G+-1|0;J=H+I|0;K=f[y>>2]|0;L=(J>>>0)/341|0;M=f[K+(L<<2)>>2]|0;N=J-(L*341|0)|0;L=f[M+(N*12|0)>>2]|0;J=f[M+(N*12|0)+4>>2]|0;O=f[M+(N*12|0)+8>>2]|0;f[z>>2]=I;I=f[q>>2]|0;N=I-K|0;if((1-G-H+((N|0)==0?0:((N>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[I+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}I=f[m>>2]|0;N=I+(O*12|0)|0;H=(f[v>>2]|0)+(O*12|0)|0;if(L>>>0>b>>>0){D=0;break a}K=Pk(a,L,H,J)|0;if(K>>>0>=(f[h>>2]|0)>>>0){D=0;break a}J=(f[a>>2]|0)-(f[(f[H>>2]|0)+(K<<2)>>2]|0)|0;b:do if(!J){if(L|0){M=0;do{P=f[N>>2]|0;Q=f[P>>2]|0;f[e>>2]=Q;f[k>>2]=f[P+4>>2];f[r>>2]=f[P+8>>2];P=f[c>>2]|0;R=P+4|0;S=f[R>>2]|0;if(S>>>0<(f[P+8>>2]|0)>>>0){f[S>>2]=Q;f[S+4>>2]=f[k>>2];f[S+8>>2]=f[r>>2];f[R>>2]=S+12}else If(P,e);f[A>>2]=(f[A>>2]|0)+1;M=M+1|0}while(M>>>0<L>>>0)}}else{if(L>>>0>=3){if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}M=O+1|0;P=f[m>>2]|0;S=P+(M*12|0)|0;if((S|0)==(N|0))T=P;else{Df(S,f[N>>2]|0,f[I+(O*12|0)+4>>2]|0);T=f[m>>2]|0}S=(f[T+(M*12|0)>>2]|0)+(K<<2)|0;f[S>>2]=(f[S>>2]|0)+(1<<J+-1);S=(Z(L|0)|0)^31;f[e>>2]=0;ph(o,S,e);S=(L>>>1)-(f[e>>2]|0)|0;P=L-S|0;c:do if((S|0)==(P|0)){U=S;V=S}else{R=f[p>>2]|0;Q=f[F>>2]|0;do if((Q|0)!=(f[E>>2]|0)){W=(f[Q>>2]&1<<31-R|0)!=0;X=R+1|0;f[p>>2]=X;if((X|0)==32){f[F>>2]=Q+4;f[p>>2]=0;if(W){U=S;V=P;break c}else break}else if(W){U=S;V=P;break c}else break}while(0);U=P;V=S}while(0);S=f[v>>2]|0;P=f[S+(O*12|0)>>2]|0;Q=P+(K<<2)|0;f[Q>>2]=(f[Q>>2]|0)+1;Df(S+(M*12|0)|0,P,f[S+(O*12|0)+4>>2]|0);if(U|0){S=f[q>>2]|0;P=f[y>>2]|0;Q=S-P|0;R=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((Q|0)==0?0:((Q>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);Y=(f[B>>2]|0)+(f[z>>2]|0)|0;_=f[q>>2]|0;$=f[y>>2]|0}else{Y=R;_=S;$=P}if((_|0)==($|0))aa=0;else{P=(Y>>>0)/341|0;aa=(f[$+(P<<2)>>2]|0)+((Y-(P*341|0)|0)*12|0)|0}f[aa>>2]=U;f[aa+4>>2]=K;f[aa+8>>2]=O;f[z>>2]=(f[z>>2]|0)+1}if(V|0){P=f[q>>2]|0;S=f[y>>2]|0;R=P-S|0;Q=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(Q|0)){cc(g);ba=(f[B>>2]|0)+(f[z>>2]|0)|0;ca=f[q>>2]|0;da=f[y>>2]|0}else{ba=Q;ca=P;da=S}if((ca|0)==(da|0))ea=0;else{S=(ba>>>0)/341|0;ea=(f[da+(S<<2)>>2]|0)+((ba-(S*341|0)|0)*12|0)|0}f[ea>>2]=V;f[ea+4>>2]=K;f[ea+8>>2]=M;f[z>>2]=(f[z>>2]|0)+1}break}S=f[w>>2]|0;f[S>>2]=K;P=f[h>>2]|0;if(P>>>0>1){Q=1;R=P;W=K;while(1){W=(W|0)==(R+-1|0)?0:W+1|0;f[S+(Q<<2)>>2]=W;Q=Q+1|0;X=f[h>>2]|0;if(Q>>>0>=X>>>0){fa=X;break}else R=X}}else fa=P;if(L|0){R=0;Q=fa;while(1){if(!Q)ga=f[n>>2]|0;else{W=f[w>>2]|0;S=f[n>>2]|0;M=f[H>>2]|0;X=0;do{ha=W+(X<<2)|0;f[S+(f[ha>>2]<<2)>>2]=0;ia=f[ha>>2]|0;ja=(f[a>>2]|0)-(f[M+(ia<<2)>>2]|0)|0;do if(ja|0){ka=S+(ia<<2)|0;la=f[j>>2]|0;ma=32-la|0;if((ja|0)>(ma|0)){na=f[i>>2]|0;oa=na+4|0;if((oa|0)==(f[l>>2]|0)){f[ka>>2]=0;break}else{pa=f[na>>2]<<la;na=ja-ma|0;f[j>>2]=na;f[i>>2]=oa;qa=32-na|0;f[ka>>2]=(f[oa>>2]|0)>>>qa|pa>>>(qa-ma|0);break}}ma=f[i>>2]|0;if((ma|0)==(f[l>>2]|0)){f[ka>>2]=0;break}f[ka>>2]=f[ma>>2]<<la>>>(32-ja|0);la=(f[j>>2]|0)+ja|0;f[j>>2]=la;if((la|0)!=32)break;f[i>>2]=ma+4;f[j>>2]=0}while(0);ja=f[ha>>2]|0;ia=S+(ja<<2)|0;f[ia>>2]=f[ia>>2]|f[(f[N>>2]|0)+(ja<<2)>>2];X=X+1|0}while(X>>>0<(f[h>>2]|0)>>>0);ga=S}S=f[ga>>2]|0;f[e>>2]=S;f[x>>2]=f[ga+4>>2];f[t>>2]=f[ga+8>>2];X=f[c>>2]|0;M=X+4|0;W=f[M>>2]|0;if(W>>>0<(f[X+8>>2]|0)>>>0){f[W>>2]=S;f[W+4>>2]=f[x>>2];f[W+8>>2]=f[t>>2];f[M>>2]=W+12}else If(X,e);f[A>>2]=(f[A>>2]|0)+1;X=R+1|0;if(X>>>0>=L>>>0)break b;R=X;Q=f[h>>2]|0}}}while(0);G=f[z>>2]|0;if(!G){D=1;break}}}while(0);h=f[y>>2]|0;e=f[B>>2]|0;c=(e>>>0)/341|0;ga=h+(c<<2)|0;a=f[q>>2]|0;fa=a;ea=h;if((a|0)!=(h|0)?(V=(f[ga>>2]|0)+((e-(c*341|0)|0)*12|0)|0,c=(f[z>>2]|0)+e|0,e=(c>>>0)/341|0,ba=(f[h+(e<<2)>>2]|0)+((c-(e*341|0)|0)*12|0)|0,(ba|0)!=(V|0)):0){e=ga;ga=V;while(1){V=ga+12|0;if((V-(f[e>>2]|0)|0)==4092){c=e+4|0;ra=c;sa=f[c>>2]|0}else{ra=e;sa=V}ga=sa;if((ba|0)==(ga|0))break;else e=ra}}f[z>>2]=0;z=fa-ea>>2;if(z>>>0>2){ea=h;do{Ko(f[ea>>2]|0);ea=(f[y>>2]|0)+4|0;f[y>>2]=ea;ta=f[q>>2]|0;ua=ta-ea>>2}while(ua>>>0>2);va=ua;wa=ea;xa=ta}else{va=z;wa=h;xa=a}switch(va|0){case 1:{ya=170;za=89;break}case 2:{ya=341;za=89;break}default:{}}if((za|0)==89)f[B>>2]=ya;if((wa|0)!=(xa|0)){ya=wa;do{Ko(f[ya>>2]|0);ya=ya+4|0}while((ya|0)!=(xa|0));xa=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(xa|0))f[q>>2]=y+(~((y+-4-xa|0)>>>2)<<2)}xa=f[g>>2]|0;if(!xa){u=d;return D|0}Ko(xa);u=d;return D|0}function ob(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=Ia,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=vl(q|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;if(!(b[a+32>>0]|0)){r=o;m=0;while(1){s=_(b[r>>0]|0);n[g+(m<<2)>>2]=s;m=m+1|0;q=b[k>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){t=q;break}else r=r+1|0}}else{r=o;m=0;while(1){s=_(_(b[r>>0]|0)/_(127.0));n[g+(m<<2)>>2]=s;m=m+1|0;q=b[k>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){t=q;break}else r=r+1|0}}}else t=l;r=t<<24>>24;if(t<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 2:{r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;q=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;u=vl(q|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+u|0;if(!(b[a+32>>0]|0)){u=o;k=0;while(1){s=_(h[u>>0]|0);n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){v=q;break}else u=u+1|0}}else{u=o;k=0;while(1){s=_(_(h[u>>0]|0)/_(255.0));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){v=l;break}else u=u+1|0}}}else v=m;u=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 3:{u=a+48|0;k=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(vl(Bk(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,H|0,k|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;l=0;while(1){s=_(d[u>>1]|0);n[g+(l<<2)>>2]=s;l=l+1|0;q=b[r>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){w=q;break}else u=u+2|0}}else{u=o;l=0;while(1){s=_(_(d[u>>1]|0)/_(32767.0));n[g+(l<<2)>>2]=s;l=l+1|0;m=b[r>>0]|0;if((l|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else u=u+2|0}}else w=k;u=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 4:{u=a+48|0;l=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(vl(Bk(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,H|0,l|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;m=0;while(1){s=_(j[u>>1]|0);n[g+(m<<2)>>2]=s;m=m+1|0;q=b[r>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){x=q;break}else u=u+2|0}}else{u=o;m=0;while(1){s=_(_(j[u>>1]|0)/_(65535.0));n[g+(m<<2)>>2]=s;m=m+1|0;k=b[r>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){x=k;break}else u=u+2|0}}else x=l;u=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 5:{u=a+48|0;m=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(vl(Bk(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,H|0,m|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;k=0;while(1){s=_(f[u>>2]|0);n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){y=q;break}else u=u+4|0}}else{u=o;k=0;while(1){s=_(_(f[u>>2]|0)*_(4.65661287e-10));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){y=l;break}else u=u+4|0}}else y=m;u=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 6:{u=a+48|0;k=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(vl(Bk(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,H|0,k|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;l=0;while(1){s=_((f[u>>2]|0)>>>0);n[g+(l<<2)>>2]=s;l=l+1|0;q=b[r>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){z=q;break}else u=u+4|0}}else{u=o;l=0;while(1){s=_(_((f[u>>2]|0)>>>0)*_(2.32830644e-10));n[g+(l<<2)>>2]=s;l=l+1|0;m=b[r>>0]|0;if((l|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){z=m;break}else u=u+4|0}}else z=k;u=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 7:{u=a+48|0;l=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(vl(Bk(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,H|0,l|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;m=0;while(1){q=u;s=_(+((f[q>>2]|0)>>>0)+4294967296.0*+(f[q+4>>2]|0));n[g+(m<<2)>>2]=s;m=m+1|0;q=b[r>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else u=u+8|0}}else{u=o;m=0;while(1){k=u;s=_(_(+((f[k>>2]|0)>>>0)+4294967296.0*+(f[k+4>>2]|0))*_(1.08420217e-19));n[g+(m<<2)>>2]=s;m=m+1|0;k=b[r>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){A=k;break}else u=u+8|0}}else A=l;u=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 8:{u=a+48|0;m=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(vl(Bk(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,H|0,m|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;k=0;while(1){q=u;s=_(+((f[q>>2]|0)>>>0)+4294967296.0*+((f[q+4>>2]|0)>>>0));n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){B=q;break}else u=u+8|0}}else{u=o;k=0;while(1){l=u;s=_(_(+((f[l>>2]|0)>>>0)+4294967296.0*+((f[l+4>>2]|0)>>>0))*_(5.42101086e-20));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){B=l;break}else u=u+8|0}}else B=m;u=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 9:{u=a+24|0;k=b[u>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){r=f[f[a>>2]>>2]|0;o=a+40|0;l=Bk(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;q=vl(l|0,H|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=r+q|0;q=0;while(1){f[g+(q<<2)>>2]=f[o>>2];q=q+1|0;r=b[u>>0]|0;if((q|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){C=r;break}else o=o+4|0}}else C=k;o=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 10:{o=a+24|0;q=b[o>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){u=f[f[a>>2]>>2]|0;m=a+40|0;r=Bk(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;l=vl(r|0,H|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=u+l|0;l=0;while(1){s=_(+p[m>>3]);n[g+(l<<2)>>2]=s;l=l+1|0;u=b[o>>0]|0;if((l|0)>=((u<<24>>24>e<<24>>24?e:u)<<24>>24|0)){D=u;break}else m=m+8|0}}else D=q;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 11:{m=a+24|0;l=b[m>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){o=f[f[a>>2]>>2]|0;k=a+40|0;u=Bk(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=vl(u|0,H|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=o+r|0;r=0;while(1){s=_((b[k>>0]|0)!=0&1);n[g+(r<<2)>>2]=s;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){E=o;break}else k=k+1|0}}else E=l;k=E<<24>>24;if(E<<24>>24>=e<<24>>24){i=1;return i|0}oh(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function pb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;d=u;u=u+48|0;e=d+24|0;g=d;h=a+12|0;i=f[h>>2]|0;f[e>>2]=0;j=e+4|0;f[j>>2]=0;k=e+8|0;f[k>>2]=0;do if(i)if(i>>>0>1073741823)$n(e);else{l=i<<2;m=wk(l)|0;f[e>>2]=m;n=m+(i<<2)|0;f[k>>2]=n;oh(m|0,0,l|0)|0;f[j>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+116|0;n=f[m>>2]|0;l=f[n>>2]|0;if(!l){q=n+8|0;r=n+4|0;s=p;t=o;v=i}else{i=n+4|0;f[i>>2]=l;Ko(l);l=n+8|0;f[l>>2]=0;f[i>>2]=0;f[n>>2]=0;q=l;r=i;s=f[e>>2]|0;t=f[j>>2]|0;v=f[h>>2]|0}f[n>>2]=s;f[r>>2]=t;f[q>>2]=f[k>>2];f[e>>2]=0;k=e+4|0;f[k>>2]=0;q=e+8|0;f[q>>2]=0;do if(v)if(v>>>0>1073741823)$n(e);else{t=v<<2;r=wk(t)|0;f[e>>2]=r;s=r+(v<<2)|0;f[q>>2]=s;oh(r|0,0,t|0)|0;f[k>>2]=s;w=s;x=r;break}else{w=0;x=0}while(0);v=a+128|0;r=f[v>>2]|0;s=f[r>>2]|0;if(!s){y=r+8|0;z=r+4|0;A=x;B=w}else{w=r+4|0;f[w>>2]=s;Ko(s);s=r+8|0;f[s>>2]=0;f[w>>2]=0;f[r>>2]=0;y=s;z=w;A=f[e>>2]|0;B=f[k>>2]|0}f[r>>2]=A;f[z>>2]=B;f[y>>2]=f[q>>2];f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;q=g+8|0;y=g+4|0;B=g+16|0;z=g+20|0;cc(g);A=f[y>>2]|0;r=(f[B>>2]|0)+(f[z>>2]|0)|0;if((f[q>>2]|0)==(A|0))C=0;else{k=(r>>>0)/341|0;C=(f[A+(k<<2)>>2]|0)+((r-(k*341|0)|0)*12|0)|0}f[C>>2]=b;f[C+4>>2]=0;f[C+8>>2]=0;C=(f[z>>2]|0)+1|0;f[z>>2]=C;a:do if(!C)D=1;else{k=e+4|0;r=e+8|0;A=a+8|0;w=a+104|0;s=a+4|0;x=e+4|0;t=e+8|0;n=a+92|0;j=a+48|0;i=a+44|0;l=a+36|0;o=a+16|0;p=a+88|0;E=a+76|0;F=a+84|0;G=C;while(1){H=f[B>>2]|0;I=G+-1|0;J=H+I|0;K=f[y>>2]|0;L=(J>>>0)/341|0;M=f[K+(L<<2)>>2]|0;N=J-(L*341|0)|0;L=f[M+(N*12|0)>>2]|0;J=f[M+(N*12|0)+4>>2]|0;O=f[M+(N*12|0)+8>>2]|0;f[z>>2]=I;I=f[q>>2]|0;N=I-K|0;if((1-G-H+((N|0)==0?0:((N>>2)*341|0)+-1|0)|0)>>>0>681){Ko(f[I+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}I=f[m>>2]|0;N=I+(O*12|0)|0;if(L>>>0>b>>>0){D=0;break a}H=f[h>>2]|0;K=(H+-1|0)==(J|0)?0:J+1|0;if(K>>>0>=H>>>0){D=0;break a}H=(f[v>>2]|0)+(O*12|0)|0;J=(f[a>>2]|0)-(f[(f[H>>2]|0)+(K<<2)>>2]|0)|0;b:do if(!J){if(L|0){M=0;do{P=f[N>>2]|0;Q=f[P>>2]|0;f[e>>2]=Q;f[k>>2]=f[P+4>>2];f[r>>2]=f[P+8>>2];P=f[c>>2]|0;R=P+4|0;S=f[R>>2]|0;if(S>>>0<(f[P+8>>2]|0)>>>0){f[S>>2]=Q;f[S+4>>2]=f[k>>2];f[S+8>>2]=f[r>>2];f[R>>2]=S+12}else If(P,e);f[A>>2]=(f[A>>2]|0)+1;M=M+1|0}while(M>>>0<L>>>0)}}else{if(L>>>0>=3){if((f[A>>2]|0)>>>0>(f[s>>2]|0)>>>0){D=0;break a}M=O+1|0;Df(I+(M*12|0)|0,f[N>>2]|0,f[I+(O*12|0)+4>>2]|0);P=(f[(f[m>>2]|0)+(M*12|0)>>2]|0)+(K<<2)|0;f[P>>2]=(f[P>>2]|0)+(1<<J+-1);P=(Z(L|0)|0)^31;f[e>>2]=0;ph(o,P,e);P=(L>>>1)-(f[e>>2]|0)|0;S=L-P|0;c:do if((P|0)==(S|0)){T=P;U=P}else{R=f[p>>2]|0;Q=f[F>>2]|0;do if((Q|0)!=(f[E>>2]|0)){V=(f[Q>>2]&1<<31-R|0)!=0;W=R+1|0;f[p>>2]=W;if((W|0)==32){f[F>>2]=Q+4;f[p>>2]=0;if(V){T=P;U=S;break c}else break}else if(V){T=P;U=S;break c}else break}while(0);T=S;U=P}while(0);P=f[v>>2]|0;S=f[P+(O*12|0)>>2]|0;Q=S+(K<<2)|0;f[Q>>2]=(f[Q>>2]|0)+1;Df(P+(M*12|0)|0,S,f[P+(O*12|0)+4>>2]|0);if(T|0){P=f[q>>2]|0;S=f[y>>2]|0;Q=P-S|0;R=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((Q|0)==0?0:((Q>>2)*341|0)+-1|0)|0)==(R|0)){cc(g);X=(f[B>>2]|0)+(f[z>>2]|0)|0;Y=f[q>>2]|0;_=f[y>>2]|0}else{X=R;Y=P;_=S}if((Y|0)==(_|0))$=0;else{S=(X>>>0)/341|0;$=(f[_+(S<<2)>>2]|0)+((X-(S*341|0)|0)*12|0)|0}f[$>>2]=T;f[$+4>>2]=K;f[$+8>>2]=O;f[z>>2]=(f[z>>2]|0)+1}if(U|0){S=f[q>>2]|0;P=f[y>>2]|0;R=S-P|0;Q=(f[z>>2]|0)+(f[B>>2]|0)|0;if((((R|0)==0?0:((R>>2)*341|0)+-1|0)|0)==(Q|0)){cc(g);aa=(f[B>>2]|0)+(f[z>>2]|0)|0;ba=f[q>>2]|0;ca=f[y>>2]|0}else{aa=Q;ba=S;ca=P}if((ba|0)==(ca|0))da=0;else{P=(aa>>>0)/341|0;da=(f[ca+(P<<2)>>2]|0)+((aa-(P*341|0)|0)*12|0)|0}f[da>>2]=U;f[da+4>>2]=K;f[da+8>>2]=M;f[z>>2]=(f[z>>2]|0)+1}break}P=f[w>>2]|0;f[P>>2]=K;S=f[h>>2]|0;if(S>>>0>1){Q=1;R=S;V=K;while(1){V=(V|0)==(R+-1|0)?0:V+1|0;f[P+(Q<<2)>>2]=V;Q=Q+1|0;W=f[h>>2]|0;if(Q>>>0>=W>>>0){ea=W;break}else R=W}}else ea=S;if(L|0){R=0;Q=ea;while(1){if(!Q)fa=f[n>>2]|0;else{V=f[w>>2]|0;P=f[n>>2]|0;M=f[H>>2]|0;W=0;do{ga=V+(W<<2)|0;f[P+(f[ga>>2]<<2)>>2]=0;ha=f[ga>>2]|0;ia=(f[a>>2]|0)-(f[M+(ha<<2)>>2]|0)|0;do if(ia|0){ja=P+(ha<<2)|0;ka=f[j>>2]|0;la=32-ka|0;if((ia|0)>(la|0)){ma=f[i>>2]|0;na=ma+4|0;if((na|0)==(f[l>>2]|0)){f[ja>>2]=0;break}else{oa=f[ma>>2]<<ka;ma=ia-la|0;f[j>>2]=ma;f[i>>2]=na;pa=32-ma|0;f[ja>>2]=(f[na>>2]|0)>>>pa|oa>>>(pa-la|0);break}}la=f[i>>2]|0;if((la|0)==(f[l>>2]|0)){f[ja>>2]=0;break}f[ja>>2]=f[la>>2]<<ka>>>(32-ia|0);ka=(f[j>>2]|0)+ia|0;f[j>>2]=ka;if((ka|0)!=32)break;f[i>>2]=la+4;f[j>>2]=0}while(0);ia=f[ga>>2]|0;ha=P+(ia<<2)|0;f[ha>>2]=f[ha>>2]|f[(f[N>>2]|0)+(ia<<2)>>2];W=W+1|0}while(W>>>0<(f[h>>2]|0)>>>0);fa=P}P=f[fa>>2]|0;f[e>>2]=P;f[x>>2]=f[fa+4>>2];f[t>>2]=f[fa+8>>2];W=f[c>>2]|0;M=W+4|0;V=f[M>>2]|0;if(V>>>0<(f[W+8>>2]|0)>>>0){f[V>>2]=P;f[V+4>>2]=f[x>>2];f[V+8>>2]=f[t>>2];f[M>>2]=V+12}else If(W,e);f[A>>2]=(f[A>>2]|0)+1;W=R+1|0;if(W>>>0>=L>>>0)break b;R=W;Q=f[h>>2]|0}}}while(0);G=f[z>>2]|0;if(!G){D=1;break}}}while(0);h=f[y>>2]|0;e=f[B>>2]|0;c=(e>>>0)/341|0;fa=h+(c<<2)|0;a=f[q>>2]|0;ea=a;da=h;if((a|0)!=(h|0)?(U=(f[fa>>2]|0)+((e-(c*341|0)|0)*12|0)|0,c=(f[z>>2]|0)+e|0,e=(c>>>0)/341|0,aa=(f[h+(e<<2)>>2]|0)+((c-(e*341|0)|0)*12|0)|0,(aa|0)!=(U|0)):0){e=fa;fa=U;while(1){U=fa+12|0;if((U-(f[e>>2]|0)|0)==4092){c=e+4|0;qa=c;ra=f[c>>2]|0}else{qa=e;ra=U}fa=ra;if((aa|0)==(fa|0))break;else e=qa}}f[z>>2]=0;z=ea-da>>2;if(z>>>0>2){da=h;do{Ko(f[da>>2]|0);da=(f[y>>2]|0)+4|0;f[y>>2]=da;sa=f[q>>2]|0;ta=sa-da>>2}while(ta>>>0>2);ua=ta;va=da;wa=sa}else{ua=z;va=h;wa=a}switch(ua|0){case 1:{xa=170;ya=87;break}case 2:{xa=341;ya=87;break}default:{}}if((ya|0)==87)f[B>>2]=xa;if((va|0)!=(wa|0)){xa=va;do{Ko(f[xa>>2]|0);xa=xa+4|0}while((xa|0)!=(wa|0));wa=f[y>>2]|0;y=f[q>>2]|0;if((y|0)!=(wa|0))f[q>>2]=y+(~((y+-4-wa|0)>>>2)<<2)}wa=f[g>>2]|0;if(!wa){u=d;return D|0}Ko(wa);u=d;return D|0}function qb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;g=u;u=u+64|0;d=g+16|0;h=g;i=a+8|0;f[i>>2]=e;j=a+32|0;k=a+36|0;l=f[j>>2]|0;m=(f[k>>2]|0)-l>>2;if(m>>>0>=e>>>0){if(m>>>0>e>>>0)f[k>>2]=l+(e<<2)}else Eg(j,e-m|0);m=d;j=m+48|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(j|0));f[h>>2]=0;if(!e){n=0;o=0}else{Of(d,e,h);n=f[d+12>>2]|0;o=f[d+16>>2]|0}f[h>>2]=0;m=d+16|0;j=o-n>>2;if(j>>>0>=e>>>0){if(j>>>0>e>>>0)f[m>>2]=n+(e<<2)}else Of(d+12|0,e-j|0,h);j=d+24|0;f[h>>2]=0;n=d+28|0;m=f[j>>2]|0;o=(f[n>>2]|0)-m>>2;if(o>>>0>=e>>>0){if(o>>>0>e>>>0)f[n>>2]=m+(e<<2)}else Of(j,e-o|0,h);o=d+36|0;f[h>>2]=0;j=d+40|0;m=f[o>>2]|0;n=(f[j>>2]|0)-m>>2;if(n>>>0>=e>>>0){if(n>>>0>e>>>0)f[j>>2]=m+(e<<2)}else Of(o,e-n|0,h);n=f[d>>2]|0;if((f[i>>2]|0)>0){o=a+16|0;m=a+32|0;j=a+12|0;l=0;do{k=f[n+(l<<2)>>2]|0;p=f[o>>2]|0;do if((k|0)<=(p|0)){q=f[j>>2]|0;r=f[m>>2]|0;s=r+(l<<2)|0;if((k|0)<(q|0)){f[s>>2]=q;t=r;break}else{f[s>>2]=k;t=r;break}}else{r=f[m>>2]|0;f[r+(l<<2)>>2]=p;t=r}while(0);l=l+1|0;v=f[i>>2]|0}while((l|0)<(v|0));if((v|0)>0){v=a+20|0;l=0;do{m=(f[b+(l<<2)>>2]|0)+(f[t+(l<<2)>>2]|0)|0;n=c+(l<<2)|0;f[n>>2]=m;if((m|0)<=(f[o>>2]|0)){if((m|0)<(f[j>>2]|0)){w=(f[v>>2]|0)+m|0;x=19}}else{w=m-(f[v>>2]|0)|0;x=19}if((x|0)==19){x=0;f[n>>2]=w}l=l+1|0}while((l|0)<(f[i>>2]|0))}}l=f[a+48>>2]|0;w=f[a+52>>2]|0;v=wk(16)|0;f[v>>2]=0;f[v+4>>2]=0;f[v+8>>2]=0;f[v+12>>2]=0;f[h>>2]=0;j=h+4|0;f[j>>2]=0;o=h+8|0;f[o>>2]=0;do if(e)if(e>>>0>1073741823)$n(h);else{t=e<<2;n=wk(t)|0;f[h>>2]=n;m=n+(e<<2)|0;f[o>>2]=m;oh(n|0,0,t|0)|0;f[j>>2]=m;y=n;break}else y=0;while(0);o=f[a+56>>2]|0;n=f[o>>2]|0;m=(f[o+4>>2]|0)-n|0;t=m>>2;a:do if((m|0)>4){p=n;k=(e|0)>0;r=l+64|0;s=l+28|0;q=a+16|0;z=a+32|0;A=a+12|0;B=a+20|0;C=e<<2;D=(e|0)==1;E=1;while(1){if(t>>>0<=E>>>0){x=30;break}F=f[p+(E<<2)>>2]|0;do if((F|0)!=-1){G=(((F>>>0)%3|0|0)==0?2:-1)+F|0;H=(G|0)==-1;I=G>>>5;J=1<<(G&31);K=1;L=0;M=F;N=f[l>>2]|0;b:while(1){O=f[d+(L*12|0)>>2]|0;if(((f[N+(M>>>5<<2)>>2]&1<<(M&31)|0)==0?(P=f[(f[(f[r>>2]|0)+12>>2]|0)+(M<<2)>>2]|0,(P|0)!=-1):0)?(Q=f[s>>2]|0,R=f[w>>2]|0,S=f[R+(f[Q+(P<<2)>>2]<<2)>>2]|0,T=P+1|0,U=f[R+(f[Q+((((T>>>0)%3|0|0)==0?P+-2|0:T)<<2)>>2]<<2)>>2]|0,T=f[R+(f[Q+((((P>>>0)%3|0|0)==0?2:-1)+P<<2)>>2]<<2)>>2]|0,(S|0)<(E|0)&(U|0)<(E|0)&(T|0)<(E|0)):0){P=W(S,e)|0;S=W(U,e)|0;U=W(T,e)|0;if(k){T=0;do{f[O+(T<<2)>>2]=(f[c+(T+U<<2)>>2]|0)+(f[c+(T+S<<2)>>2]|0)-(f[c+(T+P<<2)>>2]|0);T=T+1|0}while((T|0)!=(e|0))}T=L+1|0;if((T|0)==4){V=4;break}else X=T}else X=L;do if(K){T=M+1|0;P=((T>>>0)%3|0|0)==0?M+-2|0:T;if((P|0)!=-1){T=f[l>>2]|0;if((f[T+(P>>>5<<2)>>2]&1<<(P&31)|0)==0?(S=f[(f[(f[r>>2]|0)+12>>2]|0)+(P<<2)>>2]|0,P=S+1|0,(S|0)!=-1):0){Y=((P>>>0)%3|0|0)==0?S+-2|0:P;Z=T}else{Y=-1;Z=T}}else{Y=-1;Z=N}}else{T=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if(((T|0)!=-1?(f[N+(T>>>5<<2)>>2]&1<<(T&31)|0)==0:0)?(P=f[(f[(f[r>>2]|0)+12>>2]|0)+(T<<2)>>2]|0,(P|0)!=-1):0)if(!((P>>>0)%3|0)){Y=P+2|0;Z=N;break}else{Y=P+-1|0;Z=N;break}else{Y=-1;Z=N}}while(0);if((Y|0)==(F|0)){x=59;break}P=(Y|0)!=-1;T=P|K^1;do if(!(T|H)){S=f[l>>2]|0;if(f[S+(I<<2)>>2]&J|0){x=59;break b}U=f[(f[(f[r>>2]|0)+12>>2]|0)+(G<<2)>>2]|0;if((U|0)==-1){x=59;break b}if(!((U>>>0)%3|0)){_=0;$=U+2|0;aa=S;break}else{_=0;$=U+-1|0;aa=S;break}}else{_=P&K;$=T?Y:-1;aa=Z}while(0);if(($|0)==-1){x=59;break}else{K=_;L=X;M=$;N=aa}}if((x|0)==59){x=0;if((X|0)>0)V=X;else{x=60;break}}if(k){oh(f[h>>2]|0,0,C|0)|0;N=V+-1|0;M=v+(N<<2)|0;L=a+60+(N*12|0)+4|0;K=a+60+(N*12|0)|0;N=f[h>>2]|0;G=0;J=0;while(1){I=f[M>>2]|0;f[M>>2]=I+1;if((f[L>>2]|0)>>>0<=I>>>0){ba=N;ca=0;break a}if(!(f[(f[K>>2]|0)+(I>>>5<<2)>>2]&1<<(I&31))){I=f[d+(G*12|0)>>2]|0;H=0;do{T=N+(H<<2)|0;f[T>>2]=(f[T>>2]|0)+(f[I+(H<<2)>>2]|0);H=H+1|0}while((H|0)!=(e|0));da=J+1|0}else da=J;G=G+1|0;if((G|0)>=(V|0)){ea=da;break}else J=da}}else{J=V+-1|0;G=v+(J<<2)|0;N=a+60+(J*12|0)|0;K=f[h>>2]|0;L=f[a+60+(J*12|0)+4>>2]|0;J=0;M=0;H=f[G>>2]|0;while(1){I=H;H=H+1|0;f[G>>2]=H;if(L>>>0<=I>>>0){ba=K;ca=0;break a}T=M+((f[(f[N>>2]|0)+(I>>>5<<2)>>2]&1<<(I&31)|0)==0&1)|0;J=J+1|0;if((J|0)>=(V|0)){ea=T;break}else M=T}}M=W(E,e)|0;if(ea){J=f[h>>2]|0;if(k?(f[J>>2]=(f[J>>2]|0)/(ea|0)|0,!D):0){N=1;do{K=J+(N<<2)|0;f[K>>2]=(f[K>>2]|0)/(ea|0)|0;N=N+1|0}while((N|0)!=(e|0))}N=b+(M<<2)|0;K=c+(M<<2)|0;if((f[i>>2]|0)>0){L=0;do{H=f[J+(L<<2)>>2]|0;G=f[q>>2]|0;do if((H|0)<=(G|0)){T=f[A>>2]|0;I=f[z>>2]|0;P=I+(L<<2)|0;if((H|0)<(T|0)){f[P>>2]=T;fa=I;break}else{f[P>>2]=H;fa=I;break}}else{I=f[z>>2]|0;f[I+(L<<2)>>2]=G;fa=I}while(0);L=L+1|0;ga=f[i>>2]|0}while((L|0)<(ga|0));if((ga|0)>0){L=0;do{J=(f[N+(L<<2)>>2]|0)+(f[fa+(L<<2)>>2]|0)|0;G=K+(L<<2)|0;f[G>>2]=J;do if((J|0)>(f[q>>2]|0)){ha=J-(f[B>>2]|0)|0;x=106}else{if((J|0)>=(f[A>>2]|0))break;ha=(f[B>>2]|0)+J|0;x=106}while(0);if((x|0)==106){x=0;f[G>>2]=ha}L=L+1|0}while((L|0)<(f[i>>2]|0))}}}else{ia=M;x=73}}else x=60;while(0);if((x|0)==60){x=0;ia=W(E,e)|0;x=73}if((x|0)==73?(x=0,F=c+((W(E+-1|0,e)|0)<<2)|0,L=b+(ia<<2)|0,K=c+(ia<<2)|0,(f[i>>2]|0)>0):0){N=0;do{J=f[F+(N<<2)>>2]|0;H=f[q>>2]|0;do if((J|0)<=(H|0)){I=f[A>>2]|0;P=f[z>>2]|0;T=P+(N<<2)|0;if((J|0)<(I|0)){f[T>>2]=I;ja=P;break}else{f[T>>2]=J;ja=P;break}}else{P=f[z>>2]|0;f[P+(N<<2)>>2]=H;ja=P}while(0);N=N+1|0;ka=f[i>>2]|0}while((N|0)<(ka|0));if((ka|0)>0){N=0;do{F=(f[L+(N<<2)>>2]|0)+(f[ja+(N<<2)>>2]|0)|0;H=K+(N<<2)|0;f[H>>2]=F;if((F|0)<=(f[q>>2]|0)){if((F|0)<(f[A>>2]|0)){la=(f[B>>2]|0)+F|0;x=87}}else{la=F-(f[B>>2]|0)|0;x=87}if((x|0)==87){x=0;f[H>>2]=la}N=N+1|0}while((N|0)<(f[i>>2]|0))}}E=E+1|0;if((E|0)>=(t|0)){x=110;break}}if((x|0)==30)$n(o);else if((x|0)==110){ba=f[h>>2]|0;ca=1;break}}else{ba=y;ca=1}while(0);if(ba|0){f[j>>2]=ba;Ko(ba)}Ko(v);v=f[d+36>>2]|0;if(v|0){f[d+40>>2]=v;Ko(v)}v=f[d+24>>2]|0;if(v|0){f[d+28>>2]=v;Ko(v)}v=f[d+12>>2]|0;if(v|0){f[d+16>>2]=v;Ko(v)}v=f[d>>2]|0;if(!v){u=g;return ca|0}f[d+4>>2]=v;Ko(v);u=g;return ca|0}function rb(a,c,d,e,g,i){a=a|0;c=+c;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,I=0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;j=u;u=u+560|0;k=j+8|0;l=j;m=j+524|0;n=m;o=j+512|0;f[l>>2]=0;p=o+12|0;q=em(c)|0;r=H;if((r|0)<0){s=-c;t=em(s)|0;v=s;w=1;x=14101;y=H;z=t}else{v=c;w=(g&2049|0)!=0&1;x=(g&2048|0)==0?((g&1|0)==0?14102:14107):14104;y=r;z=q}do if(0==0&(y&2146435072|0)==2146435072){q=(i&32|0)!=0;z=w+3|0;vi(a,32,d,z,g&-65537);Pm(a,x,w);Pm(a,v!=v|0.0!=0.0?(q?14128:14132):q?14120:14124,3);vi(a,32,d,z,g^8192);A=z}else{c=+oo(v,l)*2.0;z=c!=0.0;if(z)f[l>>2]=(f[l>>2]|0)+-1;q=i|32;if((q|0)==97){r=i&32;t=(r|0)==0?x:x+9|0;B=w|2;C=12-e|0;do if(!(e>>>0>11|(C|0)==0)){s=8.0;D=C;do{D=D+-1|0;s=s*16.0}while((D|0)!=0);if((b[t>>0]|0)==45){E=-(s+(-c-s));break}else{E=c+s-s;break}}else E=c;while(0);C=f[l>>2]|0;D=(C|0)<0?0-C|0:C;F=xh(D,((D|0)<0)<<31>>31,p)|0;if((F|0)==(p|0)){D=o+11|0;b[D>>0]=48;G=D}else G=F;b[G+-1>>0]=(C>>31&2)+43;C=G+-2|0;b[C>>0]=i+15;F=(e|0)<1;D=(g&8|0)==0;I=m;J=E;while(1){K=~~J;L=I+1|0;b[I>>0]=r|h[14136+K>>0];J=(J-+(K|0))*16.0;if((L-n|0)==1?!(D&(F&J==0.0)):0){b[L>>0]=46;M=I+2|0}else M=L;if(!(J!=0.0))break;else I=M}I=M;if((e|0)!=0?(-2-n+I|0)<(e|0):0){F=p;D=C;N=e+2+F-D|0;O=F;P=D}else{D=p;F=C;N=D-n-F+I|0;O=D;P=F}F=N+B|0;vi(a,32,d,F,g);Pm(a,t,B);vi(a,48,d,F,g^65536);D=I-n|0;Pm(a,m,D);I=O-P|0;vi(a,48,N-(D+I)|0,0,0);Pm(a,C,I);vi(a,32,d,F,g^8192);A=F;break}F=(e|0)<0?6:e;if(z){I=(f[l>>2]|0)+-28|0;f[l>>2]=I;Q=c*268435456.0;R=I}else{Q=c;R=f[l>>2]|0}I=(R|0)<0?k:k+288|0;D=I;J=Q;do{r=~~J>>>0;f[D>>2]=r;D=D+4|0;J=(J-+(r>>>0))*1.0e9}while(J!=0.0);if((R|0)>0){z=I;C=D;B=R;while(1){t=(B|0)<29?B:29;r=C+-4|0;if(r>>>0>=z>>>0){L=r;r=0;do{K=rl(f[L>>2]|0,0,t|0)|0;S=vl(K|0,H|0,r|0,0)|0;K=H;r=ln(S|0,K|0,1e9,0)|0;T=Bk(r|0,H|0,1e9,0)|0;U=wl(S|0,K|0,T|0,H|0)|0;f[L>>2]=U;L=L+-4|0}while(L>>>0>=z>>>0);if(r){L=z+-4|0;f[L>>2]=r;V=L}else V=z}else V=z;a:do if(C>>>0>V>>>0){L=C;while(1){U=L+-4|0;if(f[U>>2]|0){X=L;break a}if(U>>>0>V>>>0)L=U;else{X=U;break}}}else X=C;while(0);r=(f[l>>2]|0)-t|0;f[l>>2]=r;if((r|0)>0){z=V;C=X;B=r}else{Y=V;Z=X;_=r;break}}}else{Y=I;Z=D;_=R}if((_|0)<0){B=((F+25|0)/9|0)+1|0;C=(q|0)==102;z=Y;r=Z;L=_;while(1){U=0-L|0;T=(U|0)<9?U:9;if(z>>>0<r>>>0){U=(1<<T)+-1|0;K=1e9>>>T;S=0;$=z;do{aa=f[$>>2]|0;f[$>>2]=(aa>>>T)+S;S=W(aa&U,K)|0;$=$+4|0}while($>>>0<r>>>0);$=(f[z>>2]|0)==0?z+4|0:z;if(!S){ba=r;ca=$}else{f[r>>2]=S;ba=r+4|0;ca=$}}else{ba=r;ca=(f[z>>2]|0)==0?z+4|0:z}$=C?I:ca;K=(ba-$>>2|0)>(B|0)?$+(B<<2)|0:ba;L=(f[l>>2]|0)+T|0;f[l>>2]=L;if((L|0)>=0){da=ca;ea=K;break}else{z=ca;r=K}}}else{da=Y;ea=Z}r=I;if(da>>>0<ea>>>0){z=(r-da>>2)*9|0;L=f[da>>2]|0;if(L>>>0<10)fa=z;else{B=z;z=10;while(1){z=z*10|0;C=B+1|0;if(L>>>0<z>>>0){fa=C;break}else B=C}}}else fa=0;B=(q|0)==103;z=(F|0)!=0;L=F-((q|0)==102?0:fa)+((z&B)<<31>>31)|0;if((L|0)<(((ea-r>>2)*9|0)+-9|0)){C=L+9216|0;L=(C|0)/9|0;D=I+4+(L+-1024<<2)|0;K=C-(L*9|0)|0;if((K|0)<8){L=K;K=10;while(1){C=K*10|0;if((L|0)<7){L=L+1|0;K=C}else{ga=C;break}}}else ga=10;K=f[D>>2]|0;L=(K>>>0)/(ga>>>0)|0;q=K-(W(L,ga)|0)|0;C=(D+4|0)==(ea|0);if(!(C&(q|0)==0)){s=(L&1|0)==0?9007199254740992.0:9007199254740994.0;L=ga>>>1;J=q>>>0<L>>>0?.5:C&(q|0)==(L|0)?1.0:1.5;if(!w){ha=J;ia=s}else{L=(b[x>>0]|0)==45;ha=L?-J:J;ia=L?-s:s}L=K-q|0;f[D>>2]=L;if(ia+ha!=ia){q=L+ga|0;f[D>>2]=q;if(q>>>0>999999999){q=D;L=da;while(1){K=q+-4|0;f[q>>2]=0;if(K>>>0<L>>>0){C=L+-4|0;f[C>>2]=0;ja=C}else ja=L;C=(f[K>>2]|0)+1|0;f[K>>2]=C;if(C>>>0>999999999){q=K;L=ja}else{ka=K;la=ja;break}}}else{ka=D;la=da}L=(r-la>>2)*9|0;q=f[la>>2]|0;if(q>>>0<10){ma=ka;na=L;oa=la}else{K=L;L=10;while(1){L=L*10|0;C=K+1|0;if(q>>>0<L>>>0){ma=ka;na=C;oa=la;break}else K=C}}}else{ma=D;na=fa;oa=da}}else{ma=D;na=fa;oa=da}K=ma+4|0;pa=na;qa=ea>>>0>K>>>0?K:ea;ra=oa}else{pa=fa;qa=ea;ra=da}K=0-pa|0;b:do if(qa>>>0>ra>>>0){L=qa;while(1){q=L+-4|0;if(f[q>>2]|0){sa=L;ta=1;break b}if(q>>>0>ra>>>0)L=q;else{sa=q;ta=0;break}}}else{sa=qa;ta=0}while(0);do if(B){D=F+((z^1)&1)|0;if((D|0)>(pa|0)&(pa|0)>-5){ua=i+-1|0;va=D+-1-pa|0}else{ua=i+-2|0;va=D+-1|0}if(!(g&8)){if(ta?(D=f[sa+-4>>2]|0,(D|0)!=0):0)if(!((D>>>0)%10|0)){L=0;T=10;while(1){T=T*10|0;S=L+1|0;if((D>>>0)%(T>>>0)|0|0){wa=S;break}else L=S}}else wa=0;else wa=9;L=((sa-r>>2)*9|0)+-9|0;if((ua|32|0)==102){T=L-wa|0;D=(T|0)>0?T:0;xa=ua;ya=(va|0)<(D|0)?va:D;break}else{D=L+pa-wa|0;L=(D|0)>0?D:0;xa=ua;ya=(va|0)<(L|0)?va:L;break}}else{xa=ua;ya=va}}else{xa=i;ya=F}while(0);F=(ya|0)!=0;r=F?1:g>>>3&1;z=(xa|32|0)==102;if(z){za=0;Aa=(pa|0)>0?pa:0}else{B=(pa|0)<0?K:pa;L=xh(B,((B|0)<0)<<31>>31,p)|0;B=p;if((B-L|0)<2){D=L;while(1){T=D+-1|0;b[T>>0]=48;if((B-T|0)<2)D=T;else{Ba=T;break}}}else Ba=L;b[Ba+-1>>0]=(pa>>31&2)+43;D=Ba+-2|0;b[D>>0]=xa;za=D;Aa=B-D|0}D=w+1+ya+r+Aa|0;vi(a,32,d,D,g);Pm(a,x,w);vi(a,48,d,D,g^65536);if(z){K=ra>>>0>I>>>0?I:ra;T=m+9|0;S=T;q=m+8|0;C=K;do{$=xh(f[C>>2]|0,0,T)|0;if((C|0)==(K|0))if(($|0)==(T|0)){b[q>>0]=48;Ca=q}else Ca=$;else if($>>>0>m>>>0){oh(m|0,48,$-n|0)|0;U=$;while(1){t=U+-1|0;if(t>>>0>m>>>0)U=t;else{Ca=t;break}}}else Ca=$;Pm(a,Ca,S-Ca|0);C=C+4|0}while(C>>>0<=I>>>0);if(!((g&8|0)==0&(F^1)))Pm(a,14152,1);if(C>>>0<sa>>>0&(ya|0)>0){I=ya;S=C;while(1){q=xh(f[S>>2]|0,0,T)|0;if(q>>>0>m>>>0){oh(m|0,48,q-n|0)|0;K=q;while(1){z=K+-1|0;if(z>>>0>m>>>0)K=z;else{Da=z;break}}}else Da=q;Pm(a,Da,(I|0)<9?I:9);S=S+4|0;K=I+-9|0;if(!(S>>>0<sa>>>0&(I|0)>9)){Ea=K;break}else I=K}}else Ea=ya;vi(a,48,Ea+9|0,9,0)}else{I=ta?sa:ra+4|0;if(ra>>>0<I>>>0&(ya|0)>-1){S=m+9|0;T=(g&8|0)==0;C=S;F=0-n|0;K=m+8|0;$=ya;z=ra;while(1){r=xh(f[z>>2]|0,0,S)|0;if((r|0)==(S|0)){b[K>>0]=48;Fa=K}else Fa=r;do if((z|0)==(ra|0)){r=Fa+1|0;Pm(a,Fa,1);if(T&($|0)<1){Ga=r;break}Pm(a,14152,1);Ga=r}else{if(Fa>>>0<=m>>>0){Ga=Fa;break}oh(m|0,48,Fa+F|0)|0;r=Fa;while(1){B=r+-1|0;if(B>>>0>m>>>0)r=B;else{Ga=B;break}}}while(0);q=C-Ga|0;Pm(a,Ga,($|0)>(q|0)?q:$);r=$-q|0;z=z+4|0;if(!(z>>>0<I>>>0&(r|0)>-1)){Ha=r;break}else $=r}}else Ha=ya;vi(a,48,Ha+18|0,18,0);Pm(a,za,p-za|0)}vi(a,32,d,D,g^8192);A=D}while(0);u=j;return ((A|0)<(d|0)?d:A)|0} +function Wf(a){a=a|0;ym(a);ym(a+16|0);ym(a+32|0);ym(a+48|0);ym(a+64|0);ym(a+80|0);ym(a+96|0);ym(a+112|0);ym(a+128|0);ym(a+144|0);ym(a+160|0);ym(a+176|0);ym(a+192|0);ym(a+208|0);ym(a+224|0);ym(a+240|0);ym(a+256|0);ym(a+272|0);ym(a+288|0);ym(a+304|0);ym(a+320|0);ym(a+336|0);ym(a+352|0);ym(a+368|0);ym(a+384|0);ym(a+400|0);ym(a+416|0);ym(a+432|0);ym(a+448|0);ym(a+464|0);ym(a+480|0);ym(a+496|0);return}function Xf(a,b){a=a|0;b=b|0;var c=0,d=Ia,e=0,g=0,h=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=Za(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Hc(a,c);return}if(c>>>0>=b>>>0)return;d=_((f[a+12>>2]|0)>>>0);e=~~_(V(_(d/_(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0){g=1<<32-(Z(e+-1|0)|0);h=e>>>0<2?e:g}else h=Za(e)|0;e=c>>>0<h>>>0?h:c;if(e>>>0>=b>>>0)return;Hc(a,e);return}function Yf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+80|0;g=e;h=e+64|0;oj(g);i=f[(f[a+8>>2]|0)+56>>2]|0;j=W(Bj(5)|0,d)|0;Ih(g,i,0,d&255,5,0,j,((j|0)<0)<<31>>31,0,0);j=wk(96)|0;$i(j,g);b[j+84>>0]=1;f[j+72>>2]=f[j+68>>2];Fh(j,c)|0;f[h>>2]=j;Lh(a,h);a=f[h>>2]|0;f[h>>2]=0;if(!a){u=e;return}h=a+88|0;j=f[h>>2]|0;f[h>>2]=0;if(j|0){h=f[j+8>>2]|0;if(h|0){f[j+12>>2]=h;Ko(h)}Ko(j)}j=f[a+68>>2]|0;if(j|0){f[a+72>>2]=j;Ko(j)}j=a+64|0;h=f[j>>2]|0;f[j>>2]=0;if(h|0){j=f[h>>2]|0;if(j|0){f[h+4>>2]=j;Ko(j)}Ko(h)}Ko(a);u=e;return}function Zf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+32|0;e=d+16|0;g=d;switch(c<<24>>24){case 0:{c=wk(48)|0;wn(c);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=c;u=d;return}case 1:{c=wk(52)|0;Am(c);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=c;u=d;return}default:{c=wk(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=28;h=c;i=11853;j=h+28|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[c+28>>0]=0;f[e>>2]=-1;c=e+4|0;Yi(c,g);f[a>>2]=f[e>>2];Yi(a+4|0,c);f[a+16>>2]=0;if((b[c+11>>0]|0)<0)Ko(f[c>>2]|0);if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);u=d;return}}}function _f(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=a+8|0;g=f[e>>2]|0;h=b[g+24>>0]|0;i=h<<24>>24;j=i<<1;k=Ho(i>>>0>2147483647?-1:i<<1)|0;l=f[a+16>>2]|0;if(!(f[l+80>>2]|0))m=0;else m=(f[f[l>>2]>>2]|0)+(f[l+48>>2]|0)|0;if(!c){Io(k);return}if(h<<24>>24>0){h=0;l=0;a=0;while(1){n=0;o=a;while(1){d[k+(n<<1)>>1]=f[m+(o<<2)>>2];n=n+1|0;if((n|0)==(i|0))break;else o=o+1|0}Bf((f[f[(f[e>>2]|0)+64>>2]>>2]|0)+l|0,k|0,j|0)|0;h=h+1|0;if((h|0)==(c|0))break;else{l=l+j|0;a=a+i|0}}Io(k);return}else{Bf(f[f[g+64>>2]>>2]|0,k|0,j|0)|0;if((c|0)==1){Io(k);return}g=0;i=1;do{g=g+j|0;Bf((f[f[(f[e>>2]|0)+64>>2]>>2]|0)+g|0,k|0,j|0)|0;i=i+1|0}while((i|0)!=(c|0));Io(k);return}}function $f(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=a+8|0;e=f[d>>2]|0;g=b[e+24>>0]|0;h=g<<24>>24;i=h<<2;j=Ho(h>>>0>1073741823?-1:h<<2)|0;k=f[a+16>>2]|0;if(!(f[k+80>>2]|0))l=0;else l=(f[f[k>>2]>>2]|0)+(f[k+48>>2]|0)|0;if(!c){Io(j);return}if(g<<24>>24>0){g=0;k=0;a=0;while(1){m=0;n=a;while(1){f[j+(m<<2)>>2]=f[l+(n<<2)>>2];m=m+1|0;if((m|0)==(h|0))break;else n=n+1|0}Bf((f[f[(f[d>>2]|0)+64>>2]>>2]|0)+k|0,j|0,i|0)|0;g=g+1|0;if((g|0)==(c|0))break;else{k=k+i|0;a=a+h|0}}Io(j);return}else{Bf(f[f[e+64>>2]>>2]|0,j|0,i|0)|0;if((c|0)==1){Io(j);return}e=0;h=1;do{e=e+i|0;Bf((f[f[(f[d>>2]|0)+64>>2]>>2]|0)+e|0,j|0,i|0)|0;h=h+1|0}while((h|0)!=(c|0));Io(j);return}}function ag(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0;c=b+8|0;d=f[c>>2]|0;e=f[c+4>>2]|0;c=b+16|0;g=c;i=f[g>>2]|0;k=f[g+4>>2]|0;g=vl(i|0,k|0,4,0)|0;l=H;if((e|0)<(l|0)|(e|0)==(l|0)&d>>>0<g>>>0){m=0;return m|0}n=(f[b>>2]|0)+i|0;o=h[n>>0]|h[n+1>>0]<<8|h[n+2>>0]<<16|h[n+3>>0]<<24;n=c;f[n>>2]=g;f[n+4>>2]=l;do if((j[b+38>>1]|0)<514){l=vl(i|0,k|0,8,0)|0;n=H;if((e|0)<(n|0)|(e|0)==(n|0)&d>>>0<l>>>0){m=0;return m|0}else{g=c;f[g>>2]=l;f[g+4>>2]=n;break}}while(0);if(!(o&1)){m=0;return m|0}c=(Z(o|0)|0)^31;if((c+-1|0)>>>0>28){m=0;return m|0}f[a+8>>2]=c+1;o=2<<c;f[a+12>>2]=o+-1;c=o+-2|0;f[a+16>>2]=c;f[a+20>>2]=(c|0)/2|0;m=1;return m|0}function bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;d=u;u=u+16|0;e=d;g=f[c>>2]|0;f[c>>2]=0;f[e>>2]=g;Ef(a,b,e);g=f[e>>2]|0;f[e>>2]=0;if(g|0){e=g+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){f[c+12>>2]=e;Ko(e)}Ko(c)}c=f[g+68>>2]|0;if(c|0){f[g+72>>2]=c;Ko(c)}c=g+64|0;e=f[c>>2]|0;f[c>>2]=0;if(e|0){c=f[e>>2]|0;if(c|0){f[e+4>>2]=c;Ko(c)}Ko(e)}Ko(g)}g=a+84|0;e=a+88|0;a=f[g>>2]|0;c=(f[e>>2]|0)-a>>2;if((c|0)>(b|0)){u=d;return}h=b+1|0;if(h>>>0>c>>>0){Sf(g,h-c|0);u=d;return}if(h>>>0>=c>>>0){u=d;return}f[e>>2]=a+(h<<2);u=d;return}function cg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>3>>>0>=b>>>0){h=b;i=g;do{j=i;f[j>>2]=0;f[j+4>>2]=0;i=(f[e>>2]|0)+8|0;f[e>>2]=i;h=h+-1|0}while((h|0)!=0);return}h=f[a>>2]|0;i=g-h|0;g=i>>3;j=g+b|0;if(j>>>0>536870911)$n(a);k=d-h|0;d=k>>2;l=k>>3>>>0<268435455?(d>>>0<j>>>0?j:d):536870911;do if(l)if(l>>>0>536870911){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{d=wk(l<<3)|0;m=d;n=d;break}else{m=0;n=0}while(0);oh(m+(g<<3)|0,0,b<<3|0)|0;if((i|0)>0)Bf(n|0,h|0,i|0)|0;f[a>>2]=m;f[e>>2]=m+(j<<3);f[c>>2]=m+(l<<3);if(!h)return;Ko(h);return}function dg(a,b){a=a|0;b=b|0;var c=0,d=Ia,e=0,g=0,h=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=Za(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Oc(a,c);return}if(c>>>0>=b>>>0)return;d=_((f[a+12>>2]|0)>>>0);e=~~_(V(_(d/_(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0){g=1<<32-(Z(e+-1|0)|0);h=e>>>0<2?e:g}else h=Za(e)|0;e=c>>>0<h>>>0?h:c;if(e>>>0>=b>>>0)return;Oc(a,e);return}function eg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=a+4|0;e=f[d>>2]|0;g=f[a>>2]|0;h=e-g|0;i=g;a:do if(h>>>0<c>>>0){j=c-h|0;k=a+8|0;l=f[k>>2]|0;if((l-e|0)>>>0>=j>>>0){m=j;n=e;while(1){b[n>>0]=0;n=(f[d>>2]|0)+1|0;f[d>>2]=n;m=m+-1|0;if(!m)break a}}if((c|0)<0)$n(a);m=l-g|0;n=m<<1;o=m>>>0<1073741823?(n>>>0<c>>>0?c:n):2147483647;if(!o)p=0;else p=wk(o)|0;oh(p+h|0,0,j|0)|0;if((h|0)>0)Bf(p|0,i|0,h|0)|0;f[a>>2]=p;f[d>>2]=p+c;f[k>>2]=p+o;if(g|0)Ko(i)}else if(h>>>0>c>>>0)f[d>>2]=i+c;while(0);c=a+24|0;a=c;i=vl(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=c;f[a>>2]=i;f[a+4>>2]=H;return}function fg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;f[a>>2]=0;d=a+4|0;f[d>>2]=0;e=a+8|0;f[e>>2]=0;if(!b)return;if(b>>>0>357913941)$n(a);g=wk(b*12|0)|0;f[d>>2]=g;f[a>>2]=g;f[e>>2]=g+(b*12|0);e=c+4|0;a=b;b=g;while(1){f[b>>2]=0;g=b+4|0;f[g>>2]=0;h=b+8|0;f[h>>2]=0;i=(f[e>>2]|0)-(f[c>>2]|0)|0;j=i>>2;if(i|0){if(j>>>0>1073741823){k=7;break}l=wk(i)|0;f[g>>2]=l;f[b>>2]=l;f[h>>2]=l+(j<<2);j=f[c>>2]|0;h=(f[e>>2]|0)-j|0;if((h|0)>0){Bf(l|0,j|0,h|0)|0;f[g>>2]=l+(h>>>2<<2)}}h=(f[d>>2]|0)+12|0;f[d>>2]=h;a=a+-1|0;if(!a){k=11;break}else b=h}if((k|0)==7)$n(b);else if((k|0)==11)return}function gg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(!c){g=0;u=d;return g|0}h=a+84|0;i=f[h>>2]|0;f[h>>2]=0;f[a+88>>2]=0;f[a+92>>2]=0;if(i|0)Ko(i);i=a+72|0;h=f[i>>2]|0;f[i>>2]=0;f[a+76>>2]=0;f[a+80>>2]=0;if(h|0)Ko(h);h=c+4|0;i=(f[h>>2]|0)-(f[c>>2]|0)>>2;b[e>>0]=0;Gf(a,i,e);i=c+24|0;j=c+28|0;k=(f[j>>2]|0)-(f[i>>2]|0)>>2;b[e>>0]=0;Gf(a+12|0,k,e);nf(a+28|0,(f[h>>2]|0)-(f[c>>2]|0)>>2,3764);Wh(a+52|0,(f[j>>2]|0)-(f[i>>2]|0)>>2);Wh(a+40|0,(f[j>>2]|0)-(f[i>>2]|0)>>2);f[a+64>>2]=c;b[a+24>>0]=1;g=1;u=d;return g|0}function hg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=f[a+40>>2]|0;d=c;e=a+44|0;a=f[e>>2]|0;if((a|0)==(c|0))return;g=d;h=c;while(1){if((f[(f[h>>2]|0)+40>>2]|0)==(b|0))break;i=h+4|0;if((a|0)==(i|0)){j=16;break}else{g=i;h=i}}if((j|0)==16)return;h=c+(g-d>>2<<2)|0;d=h+4|0;if((d|0)!=(a|0)){g=d;d=h;do{c=f[g>>2]|0;f[g>>2]=0;b=f[d>>2]|0;f[d>>2]=c;if(b|0){eh(b);Ko(b)}g=g+4|0;d=d+4|0}while((g|0)!=(a|0));g=f[e>>2]|0;if((g|0)==(d|0))k=d;else{l=d;m=g;j=10}}else{l=h;m=a;j=10}if((j|0)==10){j=m;do{j=j+-4|0;m=f[j>>2]|0;f[j>>2]=0;if(m|0){eh(m);Ko(m)}}while((j|0)!=(l|0));k=l}f[e>>2]=k;return}function ig(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;d=c;e=f[(f[a>>2]|0)+8>>2]|0;g=a+8|0;h=a+12|0;i=(f[h>>2]|0)-(f[g>>2]|0)>>2;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;Ra[e&15](a,i,d);i=f[d>>2]|0;f[d>>2]=0;if(!i){k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}d=i+88|0;a=f[d>>2]|0;f[d>>2]=0;if(a|0){d=f[a+8>>2]|0;if(d|0){f[a+12>>2]=d;Ko(d)}Ko(a)}a=f[i+68>>2]|0;if(a|0){f[i+72>>2]=a;Ko(a)}a=i+64|0;d=f[a>>2]|0;f[a>>2]=0;if(d|0){a=f[d>>2]|0;if(a|0){f[d+4>>2]=a;Ko(a)}Ko(d)}Ko(i);k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}function jg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=a+640|0;c=f[b>>2]|0;if(c|0){d=a+644|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{e=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[e+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}g=a+628|0;c=f[g>>2]|0;if(c|0){d=a+632|0;b=f[d>>2]|0;if((b|0)==(c|0))j=c;else{h=b;do{b=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[b+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));j=f[g>>2]|0}f[d>>2]=c;Ko(j)}j=f[a+616>>2]|0;if(j|0){f[a+620>>2]=j;Ko(j)}j=f[a+604>>2]|0;if(j|0){f[a+608>>2]=j;Ko(j)}zk(a+584|0);zk(a+564|0);zk(a+544|0);Oo(a+16|0);return}function kg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=wk(72)|0;Gk(c);d=c;if((b|0)<0){Pa[f[(f[c>>2]|0)+4>>2]&127](c);e=0;return e|0}c=a+8|0;g=a+12|0;a=f[g>>2]|0;h=f[c>>2]|0;i=a-h>>2;do if((i|0)<=(b|0)){j=b+1|0;k=a;if(j>>>0>i>>>0){Se(c,j-i|0);break}if(j>>>0<i>>>0){l=h+(j<<2)|0;if((l|0)!=(k|0)){j=k;do{j=j+-4|0;k=f[j>>2]|0;f[j>>2]=0;if(k|0)Pa[f[(f[k>>2]|0)+4>>2]&127](k)}while((j|0)!=(l|0))}f[g>>2]=l}}while(0);g=(f[c>>2]|0)+(b<<2)|0;b=f[g>>2]|0;f[g>>2]=d;if(!b){e=1;return e|0}Pa[f[(f[b>>2]|0)+4>>2]&127](b);e=1;return e|0}function lg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+16|0;g=f[e>>2]|0;if(!g)if(!(bj(d)|0)){h=f[e>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=d+20|0;e=f[g>>2]|0;k=e;if((h-e|0)>>>0<c>>>0){j=Ma[f[d+36>>2]&31](d,a,c)|0;break}b:do if((b[d+75>>0]|0)<0|(c|0)==0){l=0;m=a;n=c;o=k}else{e=c;while(1){p=e+-1|0;if((b[a+p>>0]|0)==10)break;if(!p){l=0;m=a;n=c;o=k;break b}else e=p}p=Ma[f[d+36>>2]&31](d,a,e)|0;if(p>>>0<e>>>0){j=p;break a}l=e;m=a+e|0;n=c-e|0;o=f[g>>2]|0}while(0);Bf(o|0,m|0,n|0)|0;f[g>>2]=(f[g>>2]|0)+n;j=l+n|0}while(0);return j|0}function mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+60|0;d=f[c>>2]|0;if(!d){e=0;return e|0}f[d+4>>2]=a+48;if(!(Ka[f[(f[d>>2]|0)+12>>2]&127](d)|0)){e=0;return e|0}d=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;a:do if((d|0)>0){g=0;while(1){h=(Ka[f[(f[a>>2]|0)+28>>2]&127](a)|0)+4|0;i=f[h>>2]|0;h=La[f[(f[a>>2]|0)+20>>2]&127](a,g)|0;j=f[c>>2]|0;g=g+1|0;if(!(La[f[(f[j>>2]|0)+8>>2]&127](j,f[(f[i+8>>2]|0)+(h<<2)>>2]|0)|0)){e=0;break}if((g|0)>=(d|0))break a}return e|0}while(0);if(!(La[f[(f[a>>2]|0)+36>>2]&127](a,b)|0)){e=0;return e|0}if(!(La[f[(f[a>>2]|0)+40>>2]&127](a,b)|0)){e=0;return e|0}e=Ka[f[(f[a>>2]|0)+44>>2]&127](a)|0;return e|0}function ng(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+32|0;e=a+12|0;g=a;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=Dh(d)|0;if(h>>>0>4294967279)$n(g);if(h>>>0<11){b[g+11>>0]=h;if(!h)i=g;else{j=g;k=6}}else{l=h+16&-16;m=wk(l)|0;f[g>>2]=m;f[g+8>>2]=l|-2147483648;f[g+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,d|0,h|0)|0;i=j}b[i+h>>0]=0;lh(c,g,e)|0;c=e+11|0;h=b[c>>0]|0;i=h<<24>>24<0?f[e>>2]|0:e;if((b[g+11>>0]|0)<0){Ko(f[g>>2]|0);n=b[c>>0]|0}else n=h;if(n<<24>>24>=0){u=a;return i|0}Ko(f[e>>2]|0);u=a;return i|0}function og(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=wk(88)|0;d=c+60|0;e=c;g=e+60|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=c;d=c+64|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;d=jf(c,b)|0;b=d?0:c;f[a>>2]=d?c:0;if(d)return;a=f[b+76>>2]|0;if(a|0){f[b+80>>2]=a;Ko(a)}a=f[b+64>>2]|0;if(a|0){f[b+68>>2]=a;Ko(a)}a=f[b+48>>2]|0;if(a|0){f[b+52>>2]=a;Ko(a)}a=f[b+24>>2]|0;if(a|0){f[b+28>>2]=a;Ko(a)}a=f[b+12>>2]|0;if(a|0){f[b+16>>2]=a;Ko(a)}a=f[b>>2]|0;if(a|0){f[b+4>>2]=a;Ko(a)}Ko(d?0:c);return}function pg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0;c=a+4|0;if((Ka[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){d=1;return d|0}a=0;while(1){e=f[(f[c>>2]|0)+4>>2]|0;g=Kj(e,La[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;if((g|0)==-1){d=0;i=9;break}e=f[c>>2]|0;if(((h[e+36>>0]|0)<<8&65535)<512){if(!(La[f[(f[b>>2]|0)+28>>2]&127](b,f[(f[(f[e+4>>2]|0)+8>>2]|0)+(g<<2)>>2]|0)|0)){d=0;i=9;break}}else{j=Qi(e,g)|0;if(!j){d=0;i=9;break}if(!(La[f[(f[b>>2]|0)+28>>2]&127](b,j)|0)){d=0;i=9;break}}a=a+1|0;if((a|0)>=(Ka[f[(f[b>>2]|0)+20>>2]&127](b)|0)){d=1;i=9;break}}if((i|0)==9)return d|0;return 0}function qg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=(f[b+4>>2]|0)-(f[b>>2]|0)|0;b=d>>2;e=a+8|0;a=f[(f[e>>2]|0)+40>>2]|0;g=Ho((a|0)>-1?a:-1)|0;h=c+8|0;if((d|0)<=0){i=1;Io(g);return i|0}d=c+16|0;j=0;k=0;while(1){l=h;m=f[l>>2]|0;n=f[l+4>>2]|0;l=d;o=f[l>>2]|0;p=vl(o|0,f[l+4>>2]|0,a|0,0)|0;l=H;if((n|0)<(l|0)|(n|0)==(l|0)&m>>>0<p>>>0){i=0;q=5;break}Bf(g|0,(f[c>>2]|0)+o|0,a|0)|0;o=d;f[o>>2]=p;f[o+4>>2]=l;Bf((f[f[(f[e>>2]|0)+64>>2]>>2]|0)+j|0,g|0,a|0)|0;k=k+1|0;if((k|0)>=(b|0)){i=1;q=5;break}else j=j+a|0}if((q|0)==5){Io(g);return i|0}return 0}function rg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+216|0;e=a+220|0;g=f[d>>2]|0;if((f[e>>2]|0)==(g|0))return 0;h=a+4|0;a=0;i=g;a:while(1){g=f[i+(a*144|0)>>2]|0;if(((g|0)>=0?(j=f[h>>2]|0,k=f[j+8>>2]|0,(g|0)<((f[j+12>>2]|0)-k>>2|0)):0)?(j=f[k+(g<<2)>>2]|0,(Ka[f[(f[j>>2]|0)+24>>2]&127](j)|0)>0):0){g=0;do{if((La[f[(f[j>>2]|0)+20>>2]&127](j,g)|0)==(c|0)){l=9;break a}g=g+1|0}while((g|0)<(Ka[f[(f[j>>2]|0)+24>>2]&127](j)|0))}j=a+1|0;i=f[d>>2]|0;if(j>>>0>=(((f[e>>2]|0)-i|0)/144|0)>>>0){l=11;break}else a=j}if((l|0)==9){i=f[d>>2]|0;return ((b[i+(a*144|0)+100>>0]|0)==0?0:i+(a*144|0)+4|0)|0}else if((l|0)==11)return 0;return 0}function sg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0;c=b+8|0;d=f[c>>2]|0;e=f[c+4>>2]|0;c=b+16|0;g=c;i=f[g>>2]|0;j=f[g+4>>2]|0;g=vl(i|0,j|0,4,0)|0;k=H;if((e|0)<(k|0)|(e|0)==(k|0)&d>>>0<g>>>0){l=0;return l|0}m=(f[b>>2]|0)+i|0;b=h[m>>0]|h[m+1>>0]<<8|h[m+2>>0]<<16|h[m+3>>0]<<24;m=c;f[m>>2]=g;f[m+4>>2]=k;k=vl(i|0,j|0,8,0)|0;j=H;if((e|0)<(j|0)|(e|0)==(j|0)&d>>>0<k>>>0){l=0;return l|0}d=c;f[d>>2]=k;f[d+4>>2]=j;if(!(b&1)){l=0;return l|0}j=(Z(b|0)|0)^31;if((j+-1|0)>>>0>28){l=0;return l|0}f[a+8>>2]=j+1;b=2<<j;f[a+12>>2]=b+-1;j=b+-2|0;f[a+16>>2]=j;f[a+20>>2]=(j|0)/2|0;l=1;return l|0}function tg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;if(b>>>0<64){b=f[a+12>>2]|0;if(b>>>0<=1){e=0;return e|0}d=f[c>>2]|0;c=0;g=1;while(1){h=(f[d+(c<<2)>>2]|0)>>>0>(f[d+(g<<2)>>2]|0)>>>0?g:c;g=g+1|0;if(g>>>0>=b>>>0){e=h;break}else c=h}return e|0}c=a+580|0;b=f[c>>2]|0;g=32-b|0;d=a+576|0;if((g|0)<4){h=f[d>>2]|0;i=h+4|0;if((i|0)==(f[a+568>>2]|0)){e=0;return e|0}j=f[h>>2]<<b;h=4-g|0;f[c>>2]=h;f[d>>2]=i;k=32-h|0;e=(f[i>>2]|0)>>>k|j>>>(k-g|0);return e|0}g=f[d>>2]|0;if((g|0)==(f[a+568>>2]|0)){e=0;return e|0}a=f[g>>2]<<b>>>28;k=b+4|0;f[c>>2]=k;if((k|0)!=32){e=a;return e|0}f[d>>2]=g+4;f[c>>2]=0;e=a;return e|0}function ug(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+216|0;d=a+220|0;e=f[c>>2]|0;a:do if((f[d>>2]|0)!=(e|0)){g=a+4|0;h=0;i=e;b:while(1){j=f[i+(h*144|0)>>2]|0;if(((j|0)>=0?(k=f[g>>2]|0,l=f[k+8>>2]|0,(j|0)<((f[k+12>>2]|0)-l>>2|0)):0)?(k=f[l+(j<<2)>>2]|0,(Ka[f[(f[k>>2]|0)+24>>2]&127](k)|0)>0):0){j=0;do{if((La[f[(f[k>>2]|0)+20>>2]&127](k,j)|0)==(b|0))break b;j=j+1|0}while((j|0)<(Ka[f[(f[k>>2]|0)+24>>2]&127](k)|0))}k=h+1|0;i=f[c>>2]|0;if(k>>>0>=(((f[d>>2]|0)-i|0)/144|0)>>>0)break a;else h=k}m=(f[c>>2]|0)+(h*144|0)+104|0;return m|0}while(0);m=a+184|0;return m|0}function vg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+32|0;d=c+16|0;e=c+8|0;g=c;h=a+8|0;if(f[h>>2]<<5>>>0>=b>>>0){u=c;return}f[d>>2]=0;i=d+4|0;f[i>>2]=0;j=d+8|0;f[j>>2]=0;if((b|0)<0)$n(d);k=((b+-1|0)>>>5)+1|0;b=wk(k<<2)|0;f[d>>2]=b;f[i>>2]=0;f[j>>2]=k;k=f[a>>2]|0;f[e>>2]=k;f[e+4>>2]=0;b=a+4|0;l=f[b>>2]|0;f[g>>2]=k+(l>>>5<<2);f[g+4>>2]=l&31;Xe(d,e,g);g=f[a>>2]|0;f[a>>2]=f[d>>2];f[d>>2]=g;d=f[b>>2]|0;f[b>>2]=f[i>>2];f[i>>2]=d;d=f[h>>2]|0;f[h>>2]=f[j>>2];f[j>>2]=d;if(g|0)Ko(g);u=c;return}function wg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;e=c;do if(((h[(f[a+4>>2]|0)+36>>0]|0)<<8&65535)>511){g=d+8|0;i=f[g+4>>2]|0;j=d+16|0;k=j;l=f[k>>2]|0;m=f[k+4>>2]|0;if((i|0)>(m|0)|((i|0)==(m|0)?(f[g>>2]|0)>>>0>l>>>0:0)){g=b[(f[d>>2]|0)+l>>0]|0;i=vl(l|0,m|0,1,0)|0;m=j;f[m>>2]=i;f[m+4>>2]=H;m=g&255;f[a+24>>2]=m;n=m;break}else{o=0;u=c;return o|0}}else n=f[a+24>>2]|0;while(0);f[e>>2]=1200;f[e+4>>2]=-1;kn(e,n);o=Si(e,f[a+16>>2]|0)|0;u=c;return o|0}function xg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e>>2;h=d;if(g>>>0<b>>>0){de(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b<<2)|0;if((g|0)!=(h|0)){b=h;do{b=b+-4|0;h=f[b>>2]|0;f[b>>2]=0;if(h|0){e=h+88|0;a=f[e>>2]|0;f[e>>2]=0;if(a|0){e=f[a+8>>2]|0;if(e|0){f[a+12>>2]=e;Ko(e)}Ko(a)}a=f[h+68>>2]|0;if(a|0){f[h+72>>2]=a;Ko(a)}a=h+64|0;e=f[a>>2]|0;f[a>>2]=0;if(e|0){a=f[e>>2]|0;if(a|0){f[e+4>>2]=a;Ko(a)}Ko(e)}Ko(h)}}while((b|0)!=(g|0))}f[c>>2]=g;return}function yg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=(e|0)/12|0;h=g+1|0;if(h>>>0>357913941)$n(a);i=a+8|0;j=((f[i>>2]|0)-d|0)/12|0;k=j<<1;l=j>>>0<178956970?(k>>>0<h>>>0?h:k):357913941;do if(l)if(l>>>0>357913941){k=qa(8)|0;Dm(k,13552);f[k>>2]=4908;ta(k|0,1128,105)}else{m=wk(l*12|0)|0;break}else m=0;while(0);k=m+(g*12|0)|0;f[k>>2]=f[b>>2];f[k+4>>2]=f[b+4>>2];f[k+8>>2]=f[b+8>>2];b=k+(((e|0)/-12|0)*12|0)|0;if((e|0)>0)Bf(b|0,d|0,e|0)|0;f[a>>2]=b;f[c>>2]=k+12;f[i>>2]=m+(l*12|0);if(!d)return;Ko(d);return}function zg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c;e=Le(a,d,b)|0;g=f[e>>2]|0;if(g|0){h=g;i=h+28|0;u=c;return i|0}g=wk(40)|0;Yi(g+16|0,b);b=g+28|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;b=f[d>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=b;f[e>>2]=g;b=f[f[a>>2]>>2]|0;if(!b)j=g;else{f[a>>2]=b;j=f[e>>2]|0}vd(f[a+4>>2]|0,j);j=a+8|0;f[j>>2]=(f[j>>2]|0)+1;h=g;i=h+28|0;u=c;return i|0}function Ag(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3776;b=f[a+68>>2]|0;if(b|0){f[a+72>>2]=b;Ko(b)}b=f[a+56>>2]|0;if(b|0){f[a+60>>2]=b;Ko(b)}b=f[a+44>>2]|0;if(b|0){f[a+48>>2]=b;Ko(b)}b=f[a+32>>2]|0;if(b|0){f[a+36>>2]=b;Ko(b)}b=f[a+20>>2]|0;if(b|0){f[a+24>>2]=b;Ko(b)}Pg(a+8|0);b=a+4|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=a+40|0;c=f[b>>2]|0;if(c|0){d=a+44|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{h=h+-4|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0){eh(e);Ko(e)}}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}eh(a);Ko(a);return}function Bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+112|0;d=c+96|0;e=c+16|0;g=c+4|0;h=c;i=e+76|0;j=e;k=j+76|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(k|0));f[i>>2]=-1;f[g>>2]=0;i=g+4|0;f[i>>2]=0;f[g+8>>2]=0;f[h>>2]=g;f[d>>2]=f[h>>2];if(Pc(e,a,d)|0){d=f[g>>2]|0;Ye(b,d,d+((f[i>>2]|0)-d>>2<<2)|0);l=f[e+68>>2]|0}else l=0;d=f[g>>2]|0;if(!d){hh(e);u=c;return l|0}f[i>>2]=d;Ko(d);hh(e);u=c;return l|0}function Cg(a,c,d,e,g,h,i,j){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=u;u=u+16|0;l=k;if((-18-c|0)>>>0<d>>>0)$n(a);if((b[a+11>>0]|0)<0)m=f[a>>2]|0;else m=a;if(c>>>0<2147483623){n=d+c|0;d=c<<1;o=n>>>0<d>>>0?d:n;p=o>>>0<11?11:o+16&-16}else p=-17;o=wk(p)|0;if(g|0)um(o,m,g)|0;if(i|0)um(o+g|0,j,i)|0;j=e-h|0;e=j-g|0;if(e|0)um(o+g+i|0,m+g+h|0,e)|0;if((c|0)!=10)Ko(m);f[a>>2]=o;f[a+8>>2]=p|-2147483648;p=j+i|0;f[a+4>>2]=p;b[l>>0]=0;xn(o+p|0,l);u=k;return}function Dg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;c=a+12|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d+28>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;Dg(c+8|0);Ko(c)}while((e|0)!=0)}e=d+20|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0)Ko(c);c=f[d+8>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;g=c+8|0;h=f[c+20>>2]|0;if(h|0){f[c+24>>2]=h;Ko(h)}if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);Ko(c)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(e|0)Ko(e);Ko(d)}if((b[a+11>>0]|0)>=0)return;Ko(f[a>>2]|0);return}function Eg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>2>>>0>=b>>>0){oh(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}h=f[a>>2]|0;i=g-h|0;g=i>>2;j=g+b|0;if(j>>>0>1073741823)$n(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0<j>>>0?j:d):1073741823;do if(l)if(l>>>0>1073741823){d=qa(8)|0;Dm(d,13552);f[d>>2]=4908;ta(d|0,1128,105)}else{d=wk(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;oh(d|0,0,b<<2|0)|0;if((i|0)>0)Bf(n|0,h|0,i|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=m+(l<<2);if(!h)return;Ko(h);return}function Fg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0;a=u;u=u+16|0;e=a;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;g=Dh(d)|0;if(g>>>0>4294967279)$n(e);if(g>>>0<11){b[e+11>>0]=g;if(!g)h=e;else{i=e;j=6}}else{k=g+16&-16;l=wk(k)|0;f[e>>2]=l;f[e+8>>2]=k|-2147483648;f[e+4>>2]=g;i=l;j=6}if((j|0)==6){Bf(i|0,d|0,g|0)|0;h=i}b[h+g>>0]=0;g=(Dc(c,e)|0)!=0;if((b[e+11>>0]|0)>=0){u=a;return g|0}Ko(f[e>>2]|0);u=a;return g|0}function Gg(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3456;b=a+84|0;c=a+4|0;d=c+80|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=-1;f[a+88>>2]=-1;f[a+92>>2]=-1;b=a+152|0;c=a+96|0;d=c+56|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=1065353216;b=a+212|0;c=a+156|0;d=c+56|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=-1;f[a+216>>2]=0;f[a+220>>2]=0;f[a+224>>2]=0;ak(a+232|0);b=a+380|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[a+400>>2]=-1;f[a+404>>2]=-1;f[a+408>>2]=2;f[a+412>>2]=7;b=a+416|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function Hg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a=u;u=u+32|0;e=a+12|0;g=a;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=Dh(d)|0;if(h>>>0>4294967279)$n(g);if(h>>>0<11){b[g+11>>0]=h;if(!h)i=g;else{j=g;k=6}}else{l=h+16&-16;m=wk(l)|0;f[g>>2]=m;f[g+8>>2]=l|-2147483648;f[g+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,d|0,h|0)|0;i=j}b[i+h>>0]=0;h=lh(c,g,e)|0;if((b[g+11>>0]|0)<0)Ko(f[g>>2]|0);if((b[e+11>>0]|0)>=0){u=a;return h|0}Ko(f[e>>2]|0);u=a;return h|0}function Ig(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=j;j=i;while(1){if(j<<24>>24<0)l=f[c>>2]|0;else l=c;f[g>>2]=d;m=Qk(l,k+1|0,16046,g)|0;if((m|0)>-1)if(m>>>0>k>>>0)n=m;else break;else n=k<<1|1;Gh(c,n,0);k=n;j=b[h>>0]|0}Gh(c,m,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function Jg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=a+140|0;c=f[b>>2]|0;if((c|0)<=0){d=1;return d|0}e=c<<4;g=Ho(c>>>0>268435455|e>>>0>4294967291?-1:e+4|0)|0;f[g>>2]=c;e=g+4|0;g=e+(c<<4)|0;c=e;do{ym(c);c=c+16|0}while((c|0)!=(g|0));g=a+136|0;c=f[g>>2]|0;f[g>>2]=e;if(c|0){e=c+-4|0;h=f[e>>2]|0;if(h|0){i=c+(h<<4)|0;do i=i+-16|0;while((i|0)!=(c|0))}Io(e)}if((f[b>>2]|0)<=0){d=1;return d|0}e=0;while(1){if(!(rd((f[g>>2]|0)+(e<<4)|0,a)|0)){d=0;j=13;break}e=e+1|0;if((e|0)>=(f[b>>2]|0)){d=1;j=13;break}}if((j|0)==13)return d|0;return 0}function Kg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+4|0;e=f[d>>2]|0;g=f[a>>2]|0;h=e-g|0;i=g;if(h>>>0>=c>>>0){if(h>>>0<=c>>>0)return;f[d>>2]=i+c;return}j=c-h|0;k=a+8|0;l=f[k>>2]|0;if((l-e|0)>>>0>=j>>>0){m=j;n=e;do{b[n>>0]=0;n=(f[d>>2]|0)+1|0;f[d>>2]=n;m=m+-1|0}while((m|0)!=0);return}if((c|0)<0)$n(a);m=l-g|0;l=m<<1;n=m>>>0<1073741823?(l>>>0<c>>>0?c:l):2147483647;if(!n)o=0;else o=wk(n)|0;oh(o+h|0,0,j|0)|0;if((h|0)>0)Bf(o|0,i|0,h|0)|0;f[a>>2]=o;f[d>>2]=o+c;f[k>>2]=o+n;if(!g)return;Ko(i);return}function Lg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=Dc(a,c)|0;if(!e){g=0;return g|0}c=f[e+20>>2]|0;if(((f[e+24>>2]|0)-c|0)!=8){g=0;return g|0}e=c;c=e;a=h[c>>0]|h[c+1>>0]<<8|h[c+2>>0]<<16|h[c+3>>0]<<24;c=e+4|0;e=h[c>>0]|h[c+1>>0]<<8|h[c+2>>0]<<16|h[c+3>>0]<<24;c=d;d=c;b[d>>0]=a;b[d+1>>0]=a>>8;b[d+2>>0]=a>>16;b[d+3>>0]=a>>24;a=c+4|0;b[a>>0]=e;b[a+1>>0]=e>>8;b[a+2>>0]=e>>16;b[a+3>>0]=e>>24;g=1;return g|0}function Mg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;do if(a){if(c>>>0<128){b[a>>0]=c;e=1;break}d=(Eo()|0)+188|0;if(!(f[f[d>>2]>>2]|0))if((c&-128|0)==57216){b[a>>0]=c;e=1;break}else{d=Ro()|0;f[d>>2]=84;e=-1;break}if(c>>>0<2048){b[a>>0]=c>>>6|192;b[a+1>>0]=c&63|128;e=2;break}if(c>>>0<55296|(c&-8192|0)==57344){b[a>>0]=c>>>12|224;b[a+1>>0]=c>>>6&63|128;b[a+2>>0]=c&63|128;e=3;break}if((c+-65536|0)>>>0<1048576){b[a>>0]=c>>>18|240;b[a+1>>0]=c>>>12&63|128;b[a+2>>0]=c>>>6&63|128;b[a+3>>0]=c&63|128;e=4;break}else{d=Ro()|0;f[d>>2]=84;e=-1;break}}else e=1;while(0);return e|0}function Ng(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>2;h=g+1|0;if(h>>>0>1073741823)$n(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>1;l=j>>2>>>0<536870911?(k>>>0<h>>>0?h:k):1073741823;do if(l)if(l>>>0>1073741823){k=qa(8)|0;Dm(k,13552);f[k>>2]=4908;ta(k|0,1128,105)}else{k=wk(l<<2)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<2)|0;f[k>>2]=f[b>>2];if((e|0)>0)Bf(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+4;f[i>>2]=m+(l<<2);if(!d)return;Ko(d);return}function Og(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=f[a+4>>2]|0;c=a+8|0;d=f[c>>2]|0;if((d|0)!=(b|0)){e=d;do{d=e+-4|0;f[c>>2]=d;g=f[d>>2]|0;f[d>>2]=0;if(g|0){d=g+88|0;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=f[h+8>>2]|0;if(d|0){f[h+12>>2]=d;Ko(d)}Ko(h)}h=f[g+68>>2]|0;if(h|0){f[g+72>>2]=h;Ko(h)}h=g+64|0;d=f[h>>2]|0;f[h>>2]=0;if(d|0){h=f[d>>2]|0;if(h|0){f[d+4>>2]=h;Ko(h)}Ko(d)}Ko(g)}e=f[c>>2]|0}while((e|0)!=(b|0))}b=f[a>>2]|0;if(!b)return;Ko(b);return}function Pg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{g=g+-4|0;d=f[g>>2]|0;f[g>>2]=0;if(d|0){h=d+88|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0){h=f[i+8>>2]|0;if(h|0){f[i+12>>2]=h;Ko(h)}Ko(i)}i=f[d+68>>2]|0;if(i|0){f[d+72>>2]=i;Ko(i)}i=d+64|0;h=f[i>>2]|0;f[i>>2]=0;if(h|0){i=f[h>>2]|0;if(i|0){f[h+4>>2]=i;Ko(i)}Ko(h)}Ko(d)}}while((g|0)!=(b|0));e=f[a>>2]|0}f[c>>2]=b;Ko(e);return}function Qg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0.0;a=u;u=u+32|0;e=a;g=a+8|0;p[e>>3]=0.0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=Dh(d)|0;if(h>>>0>4294967279)$n(g);if(h>>>0<11){b[g+11>>0]=h;if(!h)i=g;else{j=g;k=6}}else{l=h+16&-16;m=wk(l)|0;f[g>>2]=m;f[g+8>>2]=l|-2147483648;f[g+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,d|0,h|0)|0;i=j}b[i+h>>0]=0;Lg(c,g,e)|0;n=+p[e>>3];if((b[g+11>>0]|0)>=0){u=a;return +n}Ko(f[g>>2]|0);u=a;return +n}function Rg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0;d=u;u=u+32|0;c=d;if((h[(f[a+4>>2]|0)+36>>0]<<8&65535)>511?!(Ka[f[(f[a>>2]|0)+52>>2]&127](a)|0):0){e=0;u=d;return e|0}f[c>>2]=1228;f[c+4>>2]=-1;g=c+8|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;kj(c,f[a+24>>2]|0,f[a+28>>2]|0,b[(f[a+8>>2]|0)+24>>0]|0,_(n[a+32>>2]));i=Si(c,f[a+16>>2]|0)|0;f[c>>2]=1228;a=f[g>>2]|0;if(a|0){f[c+12>>2]=a;Ko(a)}e=i;u=d;return e|0}function Sg(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=u;u=u+128|0;h=g+124|0;i=g;j=i;k=4048;l=j+124|0;do{f[j>>2]=f[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(l|0));if((c+-1|0)>>>0>2147483646)if(!c){m=h;n=1;o=4}else{h=Ro()|0;f[h>>2]=75;p=-1}else{m=a;n=c;o=4}if((o|0)==4){o=-2-m|0;c=n>>>0>o>>>0?o:n;f[i+48>>2]=c;n=i+20|0;f[n>>2]=m;f[i+44>>2]=m;o=m+c|0;m=i+16|0;f[m>>2]=o;f[i+28>>2]=o;o=Mf(i,d,e)|0;if(!c)p=o;else{c=f[n>>2]|0;b[c+(((c|0)==(f[m>>2]|0))<<31>>31)>>0]=0;p=o}}u=g;return p|0}function Tg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+8|0;d=f[a>>2]|0;e=d;if((((f[c>>2]|0)-d|0)/12|0)>>>0>=b>>>0)return;g=a+4|0;if(b>>>0>357913941){h=qa(8)|0;Dm(h,13552);f[h>>2]=4908;ta(h|0,1128,105)}h=f[g>>2]|0;i=wk(b*12|0)|0;j=i+(((h-d|0)/12|0)*12|0)|0;k=j;l=i+(b*12|0)|0;b=h;if((b|0)==(e|0))m=k;else{h=b;b=j;do{j=b;b=b+-12|0;i=h;h=h+-12|0;f[b>>2]=f[h>>2];f[j+-8>>2]=f[i+-8>>2];f[j+-4>>2]=f[i+-4>>2]}while((h|0)!=(e|0));m=b}f[a>>2]=m;f[g>>2]=k;f[c>>2]=l;if(!d)return;Ko(d);return}function Ug(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a=u;u=u+16|0;e=a+12|0;g=a;f[e>>2]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=Dh(d)|0;if(h>>>0>4294967279)$n(g);if(h>>>0<11){b[g+11>>0]=h;if(!h)i=g;else{j=g;k=6}}else{l=h+16&-16;m=wk(l)|0;f[g>>2]=m;f[g+8>>2]=l|-2147483648;f[g+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,d|0,h|0)|0;i=j}b[i+h>>0]=0;yh(c,g,e)|0;c=f[e>>2]|0;if((b[g+11>>0]|0)>=0){u=a;return c|0}Ko(f[g>>2]|0);u=a;return c|0}function Vg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1416;b=a+60|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);c=f[a+48>>2]|0;if(c|0){f[a+52>>2]=c;Ko(c)}c=a+36|0;b=f[c>>2]|0;if(b|0){d=a+40|0;e=f[d>>2]|0;if((e|0)==(b|0))g=b;else{h=e;do{h=h+-4|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0)Pa[f[(f[e>>2]|0)+4>>2]&127](e)}while((h|0)!=(b|0));g=f[c>>2]|0}f[d>>2]=b;Ko(g)}f[a>>2]=1256;g=f[a+16>>2]|0;if(g|0){f[a+20>>2]=g;Ko(g)}g=f[a+4>>2]|0;if(!g){Ko(a);return}f[a+8>>2]=g;Ko(g);Ko(a);return}function Wg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a=u;u=u+32|0;e=a;g=a+8|0;p[e>>3]=0.0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=Dh(d)|0;if(h>>>0>4294967279)$n(g);if(h>>>0<11){b[g+11>>0]=h;if(!h)i=g;else{j=g;k=6}}else{l=h+16&-16;m=wk(l)|0;f[g>>2]=m;f[g+8>>2]=l|-2147483648;f[g+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,d|0,h|0)|0;i=j}b[i+h>>0]=0;h=Lg(c,g,e)|0;if((b[g+11>>0]|0)>=0){u=a;return h|0}Ko(f[g>>2]|0);u=a;return h|0}function Xg(a){a=a|0;var c=0,d=0,e=0,g=0;c=f[a>>2]|0;f[a>>2]=0;if(!c)return;a=f[c+28>>2]|0;if(a|0){d=a;do{a=d;d=f[d>>2]|0;e=a+8|0;Xg(a+20|0);if((b[e+11>>0]|0)<0)Ko(f[e>>2]|0);Ko(a)}while((d|0)!=0)}d=c+20|0;a=f[d>>2]|0;f[d>>2]=0;if(a|0)Ko(a);a=f[c+8>>2]|0;if(a|0){d=a;do{a=d;d=f[d>>2]|0;e=a+8|0;g=f[a+20>>2]|0;if(g|0){f[a+24>>2]=g;Ko(g)}if((b[e+11>>0]|0)<0)Ko(f[e>>2]|0);Ko(a)}while((d|0)!=0)}d=f[c>>2]|0;f[c>>2]=0;if(d|0)Ko(d);Ko(c);return}function Yg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a=u;u=u+16|0;e=a+12|0;g=a;f[e>>2]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;h=Dh(d)|0;if(h>>>0>4294967279)$n(g);if(h>>>0<11){b[g+11>>0]=h;if(!h)i=g;else{j=g;k=6}}else{l=h+16&-16;m=wk(l)|0;f[g>>2]=m;f[g+8>>2]=l|-2147483648;f[g+4>>2]=h;j=m;k=6}if((k|0)==6){Bf(j|0,d|0,h|0)|0;i=j}b[i+h>>0]=0;h=yh(c,g,e)|0;if((b[g+11>>0]|0)>=0){u=a;return h|0}Ko(f[g>>2]|0);u=a;return h|0}function Zg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/144|0;h=d;if(g>>>0<b>>>0){Ad(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b*144|0)|0;if((g|0)!=(h|0)){b=h;do{h=f[b+-12>>2]|0;if(h|0){f[b+-8>>2]=h;Ko(h)}h=f[b+-28>>2]|0;if(h|0){f[b+-24>>2]=h;Ko(h)}h=f[b+-40>>2]|0;if(h|0){f[b+-36>>2]=h;Ko(h)}di(b+-140|0);b=b+-144|0}while((b|0)!=(g|0))}f[c>>2]=g;return}function _g(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;c=f[b>>2]|0;if((c|0)<0){d=0;return d|0}e=a+4|0;a=f[e>>2]|0;g=a+4|0;h=f[a>>2]|0;i=(f[g>>2]|0)-h>>2;if(c>>>0<=i>>>0)if(c>>>0<i>>>0){f[g>>2]=h+(c<<2);j=c}else j=c;else{Eg(a,c-i|0);j=f[b>>2]|0}if((j|0)<=0){d=1;return d|0}b=f[e>>2]|0;e=f[b>>2]|0;i=(f[b+4>>2]|0)-e>>2;c=e;e=0;while(1){if(i>>>0<=e>>>0){k=9;break}f[c+(e<<2)>>2]=e;e=e+1|0;if((e|0)>=(j|0)){d=1;k=11;break}}if((k|0)==9)$n(b);else if((k|0)==11)return d|0;return 0}function $g(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1416;b=a+60|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);c=f[a+48>>2]|0;if(c|0){f[a+52>>2]=c;Ko(c)}c=a+36|0;b=f[c>>2]|0;if(b|0){d=a+40|0;e=f[d>>2]|0;if((e|0)==(b|0))g=b;else{h=e;do{h=h+-4|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0)Pa[f[(f[e>>2]|0)+4>>2]&127](e)}while((h|0)!=(b|0));g=f[c>>2]|0}f[d>>2]=b;Ko(g)}f[a>>2]=1256;g=f[a+16>>2]|0;if(g|0){f[a+20>>2]=g;Ko(g)}g=f[a+4>>2]|0;if(!g)return;f[a+8>>2]=g;Ko(g);return}function ah(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=c+8|0;e=f[d+4>>2]|0;g=c+16|0;h=g;i=f[h>>2]|0;j=f[h+4>>2]|0;if(!((e|0)>(j|0)|((e|0)==(j|0)?(f[d>>2]|0)>>>0>i>>>0:0))){k=0;return k|0}d=b[(f[c>>2]|0)+i>>0]|0;e=vl(i|0,j|0,1,0)|0;j=g;f[j>>2]=e;f[j+4>>2]=H;do if(d<<24>>24<0)if(ah(a,c)|0){j=a;e=rl(f[j>>2]|0,f[j+4>>2]|0,7)|0;j=H;g=a;f[g>>2]=e;f[g+4>>2]=j;l=e|d&127;m=j;break}else{k=0;return k|0}else{l=d&255;m=0}while(0);d=a;f[d>>2]=l;f[d+4>>2]=m;k=1;return k|0}function bh(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3408;b=a+84|0;c=a+4|0;d=c+80|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=-1;f[a+88>>2]=-1;f[a+92>>2]=-1;b=a+152|0;c=a+96|0;d=c+56|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=1065353216;b=a+212|0;c=a+156|0;d=c+56|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=-1;f[a+216>>2]=0;f[a+220>>2]=0;f[a+224>>2]=0;ak(a+232|0);b=a+380|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;ym(a+400|0);f[a+416>>2]=-1;f[a+420>>2]=-1;return}function ch(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0;do if(((h[(f[a+4>>2]|0)+36>>0]|0)<<8&65535)<512){e=d+8|0;g=f[e+4>>2]|0;i=d+16|0;j=i;k=f[j>>2]|0;l=f[j+4>>2]|0;if((g|0)>(l|0)|((g|0)==(l|0)?(f[e>>2]|0)>>>0>k>>>0:0)){e=b[(f[d>>2]|0)+k>>0]|0;g=vl(k|0,l|0,1,0)|0;l=i;f[l>>2]=g;f[l+4>>2]=H;f[a+24>>2]=e&255;break}else{m=0;return m|0}}while(0);m=rc(a,c,d)|0;return m|0}function dh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;if(c|0){h=a+11|0;i=b[h>>0]|0;if(i<<24>>24<0){j=f[a+4>>2]|0;k=(f[a+8>>2]&2147483647)+-1|0}else{j=i&255;k=10}if((k-j|0)>>>0<c>>>0){th(a,k,j+c-k|0,j,j,0,0);l=b[h>>0]|0}else l=i;if(l<<24>>24<0)m=f[a>>2]|0;else m=a;ol(m+j|0,c,d)|0;d=j+c|0;if((b[h>>0]|0)<0)f[a+4>>2]=d;else b[h>>0]=d;b[g>>0]=0;xn(m+d|0,g)}u=e;return a|0}function eh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+28>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;g=c+20|0;h=f[g>>2]|0;f[g>>2]=0;if(h|0){eh(h);Ko(h)}if((b[e+11>>0]|0)<0)Ko(f[e>>2]|0);Ko(c)}while((d|0)!=0)}d=a+20|0;c=f[d>>2]|0;f[d>>2]=0;if(c|0)Ko(c);c=f[a+8>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;h=f[c+20>>2]|0;if(h|0){f[c+24>>2]=h;Ko(h)}if((b[e+11>>0]|0)<0)Ko(f[e>>2]|0);Ko(c)}while((d|0)!=0)}d=f[a>>2]|0;f[a>>2]=0;if(!d)return;Ko(d);return}function fh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=(f[a+8>>2]&2147483647)+-1|0;else k=10;do if(k>>>0>=d>>>0){if(j)l=f[a>>2]|0;else l=a;sm(l,c,d)|0;b[g>>0]=0;xn(l+d|0,g);if((b[h>>0]|0)<0){f[a+4>>2]=d;break}else{b[h>>0]=d;break}}else{if(j)m=f[a+4>>2]|0;else m=i&255;Cg(a,k,d-k|0,m,0,m,d,c)}while(0);u=e;return a|0}function gh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a+196>>2]|0;if(b|0){f[a+200>>2]=b;Ko(b)}b=a+184|0;c=f[b>>2]|0;if(c|0){d=a+188|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{e=h;h=h+-12|0;i=f[h>>2]|0;if(i|0){f[e+-8>>2]=i;Ko(i)}}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}g=f[a+156>>2]|0;if(g|0){f[a+160>>2]=g;Ko(g)}g=a+136|0;a=f[g>>2]|0;f[g>>2]=0;if(!a)return;g=a+-4|0;c=f[g>>2]|0;if(c|0){d=a+(c<<4)|0;do d=d+-16|0;while((d|0)!=(a|0))}Io(g);return}function hh(a){a=a|0;var b=0;b=f[a+56>>2]|0;if(b|0)Ko(b);b=f[a+32>>2]|0;if(b|0){f[a+36>>2]=b;Ko(b)}b=f[a+20>>2]|0;if(b|0){f[a+24>>2]=b;Ko(b)}b=f[a+8>>2]|0;if(b|0){f[a+12>>2]=b;Ko(b)}b=a+4|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=f[a+76>>2]|0;if(b|0){f[a+80>>2]=b;Ko(b)}b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=f[a+24>>2]|0;if(b|0){f[a+28>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0){f[a+16>>2]=b;Ko(b)}b=f[a>>2]|0;if(b|0){f[a+4>>2]=b;Ko(b)}Ko(a);return}function ih(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0;d=u;u=u+80|0;e=d;g=d+56|0;i=d+40|0;j=e;k=c;c=j+40|0;do{f[j>>2]=f[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(c|0));fc(i,e,g);e=f[i>>2]|0;if(!e){k=i+4|0;if((b[k+11>>0]|0)<0)Ko(f[k>>2]|0);k=h[g+7>>0]|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=k;u=d;return}else{f[a>>2]=e;e=i+4|0;Yi(a+4|0,e);if((b[e+11>>0]|0)<0)Ko(f[e>>2]|0);u=d;return}}function jh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;d=f[a>>2]|0;if(!d){e=0;return e|0}g=f[c>>2]|0;if(!g){e=0;return e|0}h=f[g>>2]|0;yf(d,h,(f[g+4>>2]|0)-h|0,0)|0;b[a+24>>0]=b[c+24>>0]|0;f[a+28>>2]=f[c+28>>2];b[a+32>>0]=b[c+32>>0]|0;h=c+40|0;g=f[h+4>>2]|0;d=a+40|0;f[d>>2]=f[h>>2];f[d+4>>2]=g;g=c+48|0;d=f[g+4>>2]|0;h=a+48|0;f[h>>2]=f[g>>2];f[h+4>>2]=d;f[a+56>>2]=f[c+56>>2];d=c+8|0;c=a+8|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];e=1;return e|0}function kh(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(!a){g=1;return g|0}h=d+8|0;i=f[h+4>>2]|0;j=d+16|0;k=j;l=f[k>>2]|0;m=f[k+4>>2]|0;if(!((i|0)>(m|0)|((i|0)==(m|0)?(f[h>>2]|0)>>>0>l>>>0:0))){g=0;return g|0}h=b[(f[d>>2]|0)+l>>0]|0;i=vl(l|0,m|0,1,0)|0;m=j;f[m>>2]=i;f[m+4>>2]=H;switch(h<<24>>24){case 0:{g=Jc(a,c,d,e)|0;return g|0}case 1:{g=fd(a,d,e)|0;return g|0}default:{g=0;return g|0}}return 0}function lh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=Dc(a,b)|0;if(!d){e=0;return e|0}b=d+20|0;a=f[b>>2]|0;g=d+24|0;d=f[g>>2]|0;if((a|0)==(d|0)){e=0;return e|0}Gh(c,d-a|0,0);a=gj(c,0)|0;c=f[b>>2]|0;Bf(a|0,c|0,(f[g>>2]|0)-c|0)|0;e=1;return e|0}function mh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1312;Pg(a+60|0);b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=a+36|0;c=f[b>>2]|0;if(c|0){d=a+40|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{h=h+-24|0;Pa[f[f[h>>2]>>2]&127](h)}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}f[a>>2]=1256;g=f[a+16>>2]|0;if(g|0){f[a+20>>2]=g;Ko(g)}g=f[a+4>>2]|0;if(!g){Ko(a);return}f[a+8>>2]=g;Ko(g);Ko(a);return}function nh(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0;b[c+53>>0]=1;do if((f[c+4>>2]|0)==(e|0)){b[c+52>>0]=1;a=c+16|0;h=f[a>>2]|0;if(!h){f[a>>2]=d;f[c+24>>2]=g;f[c+36>>2]=1;if(!((g|0)==1?(f[c+48>>2]|0)==1:0))break;b[c+54>>0]=1;break}if((h|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;b[c+54>>0]=1;break}h=c+24|0;a=f[h>>2]|0;if((a|0)==2){f[h>>2]=g;i=g}else i=a;if((i|0)==1?(f[c+48>>2]|0)==1:0)b[c+54>>0]=1}while(0);return}function oh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=a+d|0;c=c&255;if((d|0)>=67){while(a&3){b[a>>0]=c;a=a+1|0}g=e&-4|0;h=g-64|0;i=c|c<<8|c<<16|c<<24;while((a|0)<=(h|0)){f[a>>2]=i;f[a+4>>2]=i;f[a+8>>2]=i;f[a+12>>2]=i;f[a+16>>2]=i;f[a+20>>2]=i;f[a+24>>2]=i;f[a+28>>2]=i;f[a+32>>2]=i;f[a+36>>2]=i;f[a+40>>2]=i;f[a+44>>2]=i;f[a+48>>2]=i;f[a+52>>2]=i;f[a+56>>2]=i;f[a+60>>2]=i;a=a+64|0}while((a|0)<(g|0)){f[a>>2]=i;a=a+4|0}}while((a|0)<(e|0)){b[a>>0]=c;a=a+1|0}return e-d|0}function ph(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!c){e=0;f[d>>2]=e;return}g=a+8|0;i=a+4|0;j=0-(b[a+12>>0]|0)&255;k=c;c=0;l=f[g>>2]|0;while(1){m=c<<1;if(l>>>0<4096?(n=f[i>>2]|0,(n|0)>0):0){o=f[a>>2]|0;p=n+-1|0;f[i>>2]=p;n=l<<8|(h[o+p>>0]|0);f[g>>2]=n;q=n}else q=l;n=q&255;p=W(q>>>8,j)|0;o=n>>>0<j>>>0;l=o?p+n|0:q-j-p|0;f[g>>2]=l;p=m|o&1;k=k+-1|0;if(!k){e=p;break}else c=p}f[d>>2]=e;return}function qh(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;do if(!(en(a,f[c+8>>2]|0,g)|0)){if(en(a,f[c>>2]|0,g)|0){if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;f[c+44>>2]=4;break}if((e|0)==1)f[c+32>>2]=1}}else nk(0,c,d,e);while(0);return}function rh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1312;Pg(a+60|0);b=f[a+48>>2]|0;if(b|0){f[a+52>>2]=b;Ko(b)}b=a+36|0;c=f[b>>2]|0;if(c|0){d=a+40|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{h=h+-24|0;Pa[f[f[h>>2]>>2]&127](h)}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g)}f[a>>2]=1256;g=f[a+16>>2]|0;if(g|0){f[a+20>>2]=g;Ko(g)}g=f[a+4>>2]|0;if(!g)return;f[a+8>>2]=g;Ko(g);return}function sh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+48|0;g=e+4|0;h=e;if((d|0)!=1){f[a>>2]=0;u=e;return}d=f[b+12>>2]|0;i=f[b+4>>2]|0;b=g;j=b+36|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Te(h,c,d,i,g);i=f[g+24>>2]|0;if(i|0){f[g+28>>2]=i;Ko(i)}f[a>>2]=f[h>>2];u=e;return}function th(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;if((-17-c|0)>>>0<d>>>0)$n(a);if((b[a+11>>0]|0)<0)j=f[a>>2]|0;else j=a;if(c>>>0<2147483623){k=d+c|0;d=c<<1;l=k>>>0<d>>>0?d:k;m=l>>>0<11?11:l+16&-16}else m=-17;l=wk(m)|0;if(g|0)um(l,j,g)|0;k=e-h-g|0;if(k|0)um(l+g+i|0,j+g+h|0,k)|0;if((c|0)!=10)Ko(j);f[a>>2]=l;f[a+8>>2]=m|-2147483648;return}function uh(a,b){a=a|0;b=b|0;if(!b)return;else{uh(a,f[b>>2]|0);uh(a,f[b+4>>2]|0);Bh(b+20|0,f[b+24>>2]|0);Ko(b);return}}function vh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+32|0;g=e+20|0;h=e+16|0;i=e;j=b[a+24>>0]|0;f[i>>2]=f[294];f[i+4>>2]=f[295];f[i+8>>2]=f[296];f[i+12>>2]=f[297];f[h>>2]=c;f[g>>2]=f[h>>2];if(!(ob(a,g,j,i)|0)){k=0;u=e;return k|0}Ye(d,i,i+(j<<24>>24<<2)|0);k=1;u=e;return k|0}function wh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+64|0;e=d;if(!(en(a,b,0)|0))if((b|0)!=0?(g=Pf(b,1072,1056,0)|0,(g|0)!=0):0){b=e+4|0;h=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(h|0));f[e>>2]=g;f[e+8>>2]=a;f[e+12>>2]=-1;f[e+48>>2]=1;Sa[f[(f[g>>2]|0)+28>>2]&7](g,e,f[c>>2]|0,1);if((f[e+24>>2]|0)==1){f[c>>2]=f[e+16>>2];i=1}else i=0;j=i}else j=0;else j=1;u=d;return j|0}function xh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c>>>0>0|(c|0)==0&a>>>0>4294967295){e=d;f=a;g=c;do{c=f;f=ln(f|0,g|0,10,0)|0;h=g;g=H;i=Bk(f|0,g|0,10,0)|0;j=wl(c|0,h|0,i|0,H|0)|0;e=e+-1|0;b[e>>0]=j&255|48}while(h>>>0>9|(h|0)==9&c>>>0>4294967295);k=f;l=e}else{k=a;l=d}if(!k)m=l;else{d=k;k=l;while(1){l=d;d=(d>>>0)/10|0;a=k+-1|0;b[a>>0]=l-(d*10|0)|48;if(l>>>0<10){m=a;break}else k=a}}return m|0}function yh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=Dc(a,c)|0;if(!e){g=0;return g|0}c=f[e+20>>2]|0;if(((f[e+24>>2]|0)-c|0)!=4){g=0;return g|0}e=c;c=h[e>>0]|h[e+1>>0]<<8|h[e+2>>0]<<16|h[e+3>>0]<<24;b[d>>0]=c;b[d+1>>0]=c>>8;b[d+2>>0]=c>>16;b[d+3>>0]=c>>24;g=1;return g|0}function zh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=c+8|0;e=f[d+4>>2]|0;g=c+16|0;h=g;i=f[h>>2]|0;j=f[h+4>>2]|0;if(!((e|0)>(j|0)|((e|0)==(j|0)?(f[d>>2]|0)>>>0>i>>>0:0))){k=0;return k|0}d=b[(f[c>>2]|0)+i>>0]|0;e=vl(i|0,j|0,1,0)|0;j=g;f[j>>2]=e;f[j+4>>2]=H;j=d&255;do if(j&128)if(zh(a,c)|0){e=f[a>>2]<<7;f[a>>2]=e;l=e|d&127;break}else{k=0;return k|0}else l=j;while(0);f[a>>2]=l;k=1;return k|0}function Ah(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3180;b=a+48|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);f[a>>2]=3608;c=f[a+20>>2]|0;if(c|0){f[a+24>>2]=c;Ko(c)}c=a+8|0;b=f[c>>2]|0;if(!b){Ko(a);return}d=a+12|0;e=f[d>>2]|0;if((e|0)==(b|0))g=b;else{h=e;do{h=h+-4|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0)Pa[f[(f[e>>2]|0)+4>>2]&127](e)}while((h|0)!=(b|0));g=f[c>>2]|0}f[d>>2]=b;Ko(g);Ko(a);return}function Bh(a,c){a=a|0;c=c|0;var d=0;if(!c)return;Bh(a,f[c>>2]|0);Bh(a,f[c+4>>2]|0);a=c+16|0;d=c+28|0;if((b[d+11>>0]|0)<0)Ko(f[d>>2]|0);if((b[a+11>>0]|0)<0)Ko(f[a>>2]|0);Ko(c);return}function Ch(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{d=f[g+-12>>2]|0;if(d|0){f[g+-8>>2]=d;Ko(d)}d=f[g+-28>>2]|0;if(d|0){f[g+-24>>2]=d;Ko(d)}d=f[g+-40>>2]|0;if(d|0){f[g+-36>>2]=d;Ko(d)}di(g+-140|0);g=g+-144|0}while((g|0)!=(b|0));e=f[a>>2]|0}f[c>>2]=b;Ko(e);return}function Dh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a;a:do if(!(c&3)){d=a;e=5}else{g=a;h=c;while(1){if(!(b[g>>0]|0)){i=h;break a}j=g+1|0;h=j;if(!(h&3)){d=j;e=5;break}else g=j}}while(0);if((e|0)==5){e=d;while(1){k=f[e>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))e=e+4|0;else break}if(!((k&255)<<24>>24))l=e;else{k=e;while(1){e=k+1|0;if(!(b[e>>0]|0)){l=e;break}else k=e}}i=l}return i-c|0}function Eh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;f[a>>2]=3180;b=a+48|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);f[a>>2]=3608;c=f[a+20>>2]|0;if(c|0){f[a+24>>2]=c;Ko(c)}c=a+8|0;b=f[c>>2]|0;if(!b)return;d=a+12|0;a=f[d>>2]|0;if((a|0)==(b|0))e=b;else{g=a;do{g=g+-4|0;a=f[g>>2]|0;f[g>>2]=0;if(a|0)Pa[f[(f[a>>2]|0)+4>>2]&127](a)}while((g|0)!=(b|0));e=f[c>>2]|0}f[d>>2]=b;Ko(e);return}function Fh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=a+64|0;if((f[d>>2]|0)==0?(e=wk(32)|0,Kk(e),g=f[d>>2]|0,f[d>>2]=e,g|0):0){e=f[g>>2]|0;if(e|0){f[g+4>>2]=e;Ko(e)}Ko(g)}g=Bj(f[a+28>>2]|0)|0;e=W(g,b[a+24>>0]|0)|0;g=((e|0)<0)<<31>>31;h=f[d>>2]|0;i=Bk(e|0,g|0,c|0,0)|0;if(!(yf(h,0,i,H)|0)){j=0;return j|0}oi(a,f[d>>2]|0,e,g,0,0);f[a+80>>2]=c;j=1;return j|0}function Gh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=f[a+4>>2]|0;else k=i&255;do if(k>>>0>=c>>>0)if(j){i=(f[a>>2]|0)+c|0;b[g>>0]=0;xn(i,g);f[a+4>>2]=c;break}else{b[g>>0]=0;xn(a+c|0,g);b[h>>0]=c;break}else dh(a,c-k|0,d)|0;while(0);u=e;return}function Hh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(b>>>0>1431655765|(c|b|0)<0){d=0;return d|0}e=b*3|0;nf(a,e,3736);nf(a+12|0,e,3732);Wh(a+24|0,c);c=a+76|0;e=f[c>>2]|0;f[c>>2]=0;f[a+80>>2]=0;f[a+84>>2]=0;if(e|0)Ko(e);e=a+64|0;c=f[e>>2]|0;f[e>>2]=0;f[a+68>>2]=0;f[a+72>>2]=0;if(!c){d=1;return d|0}Ko(c);d=1;return d|0}function Ih(a,c,d,e,g,h,i,j,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;f[a>>2]=d;if(d|0){m=d+16|0;n=f[m+4>>2]|0;o=a+8|0;f[o>>2]=f[m>>2];f[o+4>>2]=n;n=d+24|0;d=f[n+4>>2]|0;o=a+16|0;f[o>>2]=f[n>>2];f[o+4>>2]=d}b[a+24>>0]=e;f[a+28>>2]=g;b[a+32>>0]=h&1;h=a+40|0;f[h>>2]=i;f[h+4>>2]=j;j=a+48|0;f[j>>2]=k;f[j+4>>2]=l;f[a+56>>2]=c;return}function Jh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=d+4|0;f[e>>2]=c;c=wk(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=24;h=c;i=11931;j=h+24|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[c+24>>0]=0;Ph(Fc(a,e)|0,g,1);if((b[g+11>>0]|0)>=0){u=d;return}Ko(f[g>>2]|0);u=d;return}function Kh(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3240;b=a+84|0;c=a+4|0;d=c+80|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=-1;f[a+88>>2]=-1;f[a+92>>2]=-1;b=a+152|0;c=a+96|0;d=c+56|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=1065353216;b=a+212|0;c=a+156|0;d=c+56|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=-1;f[a+216>>2]=0;f[a+220>>2]=0;f[a+224>>2]=0;ak(a+232|0);return}function Lh(a,b){a=a|0;b=b|0;var c=0;c=a+16|0;a=f[b>>2]|0;f[b>>2]=0;b=f[c>>2]|0;f[c>>2]=a;if(!b)return;a=b+88|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0){a=f[c+8>>2]|0;if(a|0){f[c+12>>2]=a;Ko(a)}Ko(c)}c=f[b+68>>2]|0;if(c|0){f[b+72>>2]=c;Ko(c)}c=b+64|0;a=f[c>>2]|0;f[c>>2]=0;if(a|0){c=f[a>>2]|0;if(c|0){f[a+4>>2]=c;Ko(c)}Ko(a)}Ko(b);return}function Mh(a){a=a|0;var b=0;f[a>>2]=3340;b=f[a+100>>2]|0;if(b|0){f[a+104>>2]=b;Ko(b)}b=f[a+84>>2]|0;if(b|0){f[a+88>>2]=b;Ko(b)}b=f[a+72>>2]|0;if(b|0){f[a+76>>2]=b;Ko(b)}b=f[a+60>>2]|0;if(b|0){f[a+64>>2]=b;Ko(b)}f[a+12>>2]=3364;b=f[a+32>>2]|0;if(b|0)Ko(b);b=f[a+20>>2]|0;if(!b){Ko(a);return}Ko(b);Ko(a);return}function Nh(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a;while(1){d=c+1|0;if(!(bo(b[c>>0]|0)|0))break;else c=d}a=b[c>>0]|0;switch(a|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:{g=0;h=c;i=a}}if((f|0)==5){g=e;h=d;i=b[d>>0]|0}if(!(to(i)|0))j=0;else{i=0;d=h;while(1){h=(i*10|0)+48-(b[d>>0]|0)|0;d=d+1|0;if(!(to(b[d>>0]|0)|0)){j=h;break}else i=h}}return ((g|0)==0?0-j|0:j)|0}function Oh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,i=0,j=0,k=0;b=f[a+32>>2]|0;c=b+8|0;d=f[c>>2]|0;e=f[c+4>>2]|0;c=b+16|0;g=c;i=f[g>>2]|0;j=vl(i|0,f[g+4>>2]|0,4,0)|0;g=H;if((e|0)<(g|0)|(e|0)==(g|0)&d>>>0<j>>>0){k=0;return k|0}d=(f[b>>2]|0)+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=c;f[d>>2]=j;f[d+4>>2]=g;if((i|0)<0){k=0;return k|0}f[(f[a+4>>2]|0)+80>>2]=i;k=1;return k|0}function Ph(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;Ti(g,d&1);d=zg(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}xf(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Qh(a){a=a|0;var b=0;f[a>>2]=3340;b=f[a+100>>2]|0;if(b|0){f[a+104>>2]=b;Ko(b)}b=f[a+84>>2]|0;if(b|0){f[a+88>>2]=b;Ko(b)}b=f[a+72>>2]|0;if(b|0){f[a+76>>2]=b;Ko(b)}b=f[a+60>>2]|0;if(b|0){f[a+64>>2]=b;Ko(b)}f[a+12>>2]=3364;b=f[a+32>>2]|0;if(b|0)Ko(b);b=f[a+20>>2]|0;if(!b)return;Ko(b);return}function Rh(a,b){a=+a;b=b|0;var c=0,d=0,e=0,g=0.0,h=0.0,i=0,j=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;e=xl(c|0,d|0,52)|0;switch(e&2047){case 0:{if(a!=0.0){g=+Rh(a*18446744073709551616.0,b);h=g;i=(f[b>>2]|0)+-64|0}else{h=a;i=0}f[b>>2]=i;j=h;break}case 2047:{j=a;break}default:{f[b>>2]=(e&2047)+-1022;f[s>>2]=c;f[s+4>>2]=d&-2146435073|1071644672;j=+p[s>>3]}}return +j}function Sh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,i=0,j=0,k=0;b=f[a+32>>2]|0;c=b+8|0;d=f[c>>2]|0;e=f[c+4>>2]|0;c=b+16|0;g=c;i=f[g>>2]|0;j=vl(i|0,f[g+4>>2]|0,4,0)|0;g=H;if((e|0)<(g|0)|(e|0)==(g|0)&d>>>0<j>>>0){k=0;return k|0}d=(f[b>>2]|0)+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=c;f[d>>2]=j;f[d+4>>2]=g;f[(f[a+4>>2]|0)+80>>2]=i;k=1;return k|0}function Th(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3608;b=f[a+20>>2]|0;if(b|0){f[a+24>>2]=b;Ko(b)}b=a+8|0;c=f[b>>2]|0;if(!c){Ko(a);return}d=a+12|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{h=h+-4|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0)Pa[f[(f[e>>2]|0)+4>>2]&127](e)}while((h|0)!=(c|0));g=f[b>>2]|0}f[d>>2]=c;Ko(g);Ko(a);return}function Uh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0;d=0;while(1){if((h[14154+d>>0]|0)==(a|0)){e=4;break}g=d+1|0;if((g|0)==87){i=87;e=5;break}else d=g}if((e|0)==4)if(!d)j=14242;else{i=d;e=5}if((e|0)==5){e=14242;d=i;while(1){i=e;do{a=i;i=i+1|0}while((b[a>>0]|0)!=0);d=d+-1|0;if(!d){j=i;break}else e=i}}return ho(j,f[c+20>>2]|0)|0}function Vh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+16|0;g=e;if(d>>>0>4294967279)$n(a);if(d>>>0<11){b[a+11>>0]=d;h=a}else{i=d+16&-16;j=wk(i)|0;f[a>>2]=j;f[a+8>>2]=i|-2147483648;f[a+4>>2]=d;h=j}um(h,c,d)|0;b[g>>0]=0;xn(h+d|0,g);u=e;return}function Wh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+8|0;d=f[a>>2]|0;if((f[c>>2]|0)-d>>2>>>0>=b>>>0)return;e=a+4|0;if(b>>>0>1073741823){g=qa(8)|0;Dm(g,13552);f[g>>2]=4908;ta(g|0,1128,105)}g=(f[e>>2]|0)-d|0;h=wk(b<<2)|0;if((g|0)>0)Bf(h|0,d|0,g|0)|0;f[a>>2]=h;f[e>>2]=h+(g>>2<<2);f[c>>2]=h+(b<<2);if(!d)return;Ko(d);return}function Xh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;if((c|0)<=0){d=1;return d|0}e=a+36|0;g=a+48|0;a=0;while(1){h=f[(f[e>>2]|0)+(a<<2)>>2]|0;a=a+1|0;if(!(Ma[f[(f[h>>2]|0)+20>>2]&31](h,g,b)|0)){d=0;i=5;break}if((a|0)>=(c|0)){d=1;i=5;break}}if((i|0)==5)return d|0;return 0}function Yh(a){a=a|0;var b=0,c=0;f[a>>2]=1368;b=a+16|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=a+88|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=f[c+8>>2]|0;if(b|0){f[c+12>>2]=b;Ko(b)}Ko(c)}c=f[a+68>>2]|0;if(c|0){f[a+72>>2]=c;Ko(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){f[b+4>>2]=c;Ko(c)}Ko(b)}Ko(a);return}function Zh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;switch(c<<24>>24){case 0:{c=wk(20)|0;Jl(c);d=c;break}case 1:{c=wk(24)|0;jm(c);d=c;break}case 2:{c=wk(36)|0;Lk(c);d=c;break}case 3:{c=wk(28)|0;am(c);d=c;break}default:d=0}f[a>>2]=d;return}function _h(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;f[a>>2]=3608;b=f[a+20>>2]|0;if(b|0){f[a+24>>2]=b;Ko(b)}b=a+8|0;c=f[b>>2]|0;if(!c)return;d=a+12|0;a=f[d>>2]|0;if((a|0)==(c|0))e=c;else{g=a;do{g=g+-4|0;a=f[g>>2]|0;f[g>>2]=0;if(a|0)Pa[f[(f[a>>2]|0)+4>>2]&127](a)}while((g|0)!=(c|0));e=f[b>>2]|0}f[d>>2]=c;Ko(e);return}function $h(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;a=f[b+4>>2]|0;if(!a){d=0;return d|0}e=f[(f[(f[b+8>>2]|0)+(c<<2)>>2]|0)+60>>2]|0;c=f[a+40>>2]|0;b=f[a+44>>2]|0;if((c|0)==(b|0)){d=0;return d|0}a=c;while(1){c=f[a>>2]|0;a=a+4|0;if((f[c+40>>2]|0)==(e|0)){d=c;g=6;break}if((a|0)==(b|0)){d=0;g=6;break}}if((g|0)==6)return d|0;return 0}function ai(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=Ka[f[(f[a>>2]|0)+24>>2]&127](a)|0;if((c|0)<=0){d=1;return d|0}e=a+36|0;g=a+48|0;a=0;while(1){h=f[(f[e>>2]|0)+(a<<2)>>2]|0;a=a+1|0;if(!(Ma[f[(f[h>>2]|0)+16>>2]&31](h,g,b)|0)){d=0;i=5;break}if((a|0)>=(c|0)){d=1;i=5;break}}if((i|0)==5)return d|0;return 0}function bi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=f[b>>2]|0;if(!c){d=0;return d|0}e=a+44|0;g=f[e>>2]|0;if(g>>>0<(f[a+48>>2]|0)>>>0){f[b>>2]=0;f[g>>2]=c;f[e>>2]=(f[e>>2]|0)+4;d=1;return d|0}else{ef(a+40|0,b);d=1;return d|0}return 0}function ci(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=Jf(a,c)|0;if((e|0)!=(a+4|0)){a=e+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;a=Nh(g)|0;if((a|0)!=-1){h=(a|0)!=0;return h|0}}h=d;return h|0}function di(a){a=a|0;var b=0;b=f[a+84>>2]|0;if(b|0){f[a+88>>2]=b;Ko(b)}b=f[a+72>>2]|0;if(b|0){f[a+76>>2]=b;Ko(b)}b=f[a+52>>2]|0;if(b|0){f[a+56>>2]=b;Ko(b)}b=f[a+40>>2]|0;if(b|0){f[a+44>>2]=b;Ko(b)}b=f[a+28>>2]|0;if(b|0){f[a+32>>2]=b;Ko(b)}b=f[a+12>>2]|0;if(b|0)Ko(b);b=f[a>>2]|0;if(!b)return;Ko(b);return}function ei(a){a=a|0;var b=0;if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+24>>2]|0)){b=0;return b|0}if(!(f[a+28>>2]|0)){b=0;return b|0}if(!(f[a+32>>2]|0)){b=0;return b|0}if(!(f[a+36>>2]|0)){b=0;return b|0}b=(f[a+72>>2]|0)!=-1;return b|0}function fi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0;f[c>>2]=2;d=a+4|0;a=c+8|0;e=f[a>>2]|0;g=(f[c+12>>2]|0)-e|0;if(g>>>0<4294967292){eg(a,g+4|0,0);i=f[a>>2]|0}else i=e;e=i+g|0;g=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[e>>0]=g;b[e+1>>0]=g>>8;b[e+2>>0]=g>>16;b[e+3>>0]=g>>24;return}function gi(a){a=a|0;var b=0;if(!(f[a+64>>2]|0)){b=0;return b|0}if(!(f[a+68>>2]|0)){b=0;return b|0}if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+52>>2]|0)){b=0;return b|0}if(!(f[a+56>>2]|0)){b=0;return b|0}b=(f[a+92>>2]|0)!=-1;return b|0}function hi(a){a=a|0;var c=0;if(!a)return;c=a+28|0;if((b[c+11>>0]|0)<0)Ko(f[c>>2]|0);uh(a+12|0,f[a+16>>2]|0);Bh(a,f[a+4>>2]|0);Ko(a);return}function ii(a){a=a|0;var b=0;f[a>>2]=2208;b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+84>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0)Ko(b);b=f[a+60>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function ji(a){a=a|0;var b=0;f[a>>2]=1760;b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+84>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0)Ko(b);b=f[a+60>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function ki(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0;a=c+16|0;g=f[a>>2]|0;do if(g){if((g|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;f[c+24>>2]=2;b[c+54>>0]=1;break}h=c+24|0;if((f[h>>2]|0)==2)f[h>>2]=e}else{f[a>>2]=d;f[c+24>>2]=e;f[c+36>>2]=1}while(0);return}function li(a){a=a|0;var b=0;f[a>>2]=2208;b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+84>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0)Ko(b);b=f[a+60>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function mi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(((h[(f[a+4>>2]|0)+36>>0]|0)<<8&65535)<512?!(Ka[f[(f[a>>2]|0)+52>>2]&127](a)|0):0){d=0;return d|0}d=rc(a,b,c)|0;return d|0}function ni(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=wl(e^a|0,f^b|0,e|0,f|0)|0;b=H;a=g^e;e=h^f;return wl((Gc(i,b,wl(g^c|0,h^d|0,g|0,h|0)|0,H,0)|0)^a|0,H^e|0,a|0,e|0)|0}function oi(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0;f[a>>2]=b;h=b+16|0;i=f[h+4>>2]|0;j=a+8|0;f[j>>2]=f[h>>2];f[j+4>>2]=i;i=b+24|0;b=f[i+4>>2]|0;j=a+16|0;f[j>>2]=f[i>>2];f[j+4>>2]=b;b=a+40|0;f[b>>2]=c;f[b+4>>2]=d;d=a+48|0;f[d>>2]=e;f[d+4>>2]=g;return}function pi(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0;c=b[a+12>>0]|0;d=a+8|0;e=f[d>>2]|0;if(e>>>0<4096?(g=a+4|0,i=f[g>>2]|0,(i|0)>0):0){j=f[a>>2]|0;a=i+-1|0;f[g>>2]=a;g=e<<8|(h[j+a>>0]|0);f[d>>2]=g;k=g}else k=e;e=k&255;g=0-c&255;c=W(k>>>8,g)|0;a=e>>>0<g>>>0;f[d>>2]=a?c+e|0:k-g-c|0;return a|0}function qi(a){a=a|0;var b=0;f[a>>2]=1760;b=f[a+96>>2]|0;if(b|0)Ko(b);b=f[a+84>>2]|0;if(b|0)Ko(b);b=f[a+72>>2]|0;if(b|0)Ko(b);b=f[a+60>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function ri(a){a=a|0;var b=0,c=0;if(!a)return;b=a+88|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=f[c+8>>2]|0;if(b|0){f[c+12>>2]=b;Ko(b)}Ko(c)}c=f[a+68>>2]|0;if(c|0){f[a+72>>2]=c;Ko(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){f[b+4>>2]=c;Ko(c)}Ko(b)}Ko(a);return}function si(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;ne(g,a,c,d);d=a+24|0;f[d>>2]=f[g>>2];c=g+4|0;Hj(a+28|0,c)|0;if((b[c+11>>0]|0)>=0){u=e;return d|0}Ko(f[c>>2]|0);u=e;return d|0}function ti(a){a=a|0;var c=0,d=0,e=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=1;c=a+68|0;d=a+28|0;e=d+40|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(e|0));f[c>>2]=a;c=a+72|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;return}function ui(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;se(g,a,c,d);d=a+24|0;f[d>>2]=f[g>>2];c=g+4|0;Hj(a+28|0,c)|0;if((b[c+11>>0]|0)>=0){u=e;return d|0}Ko(f[c>>2]|0);u=e;return d|0}function vi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=u;u=u+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;oh(g|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Pm(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Pm(a,g,h)}u=f;return}function wi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;b=f[a+8>>2]|0;c=f[a+12>>2]|0;if((b|0)==(c|0)){d=1;return d|0}e=a+32|0;a=b;while(1){b=f[a>>2]|0;a=a+4|0;if(!(La[f[(f[b>>2]|0)+16>>2]&127](b,f[e>>2]|0)|0)){d=0;g=5;break}if((a|0)==(c|0)){d=1;g=5;break}}if((g|0)==5)return d|0;return 0}function xi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=f[a+8>>2]|0;if((b[e+24>>0]|0)<1){g=0;return g|0}if(!(Fh(e,(f[c+4>>2]|0)-(f[c>>2]|0)>>2)|0)){g=0;return g|0}g=Ma[f[(f[a>>2]|0)+32>>2]&31](a,c,d)|0;return g|0}function yi(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;if(en(a,f[b+8>>2]|0,g)|0)nh(0,b,c,d,e);else{h=f[a+8>>2]|0;Ua[f[(f[h>>2]|0)+20>>2]&3](h,b,c,d,e,g)}return}function zi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;if(!a)return;c=f[a>>2]|0;if(c|0){d=a+4|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;do{h=h+-12|0;if((b[h+11>>0]|0)<0)Ko(f[h>>2]|0)}while((h|0)!=(c|0));g=f[a>>2]|0}f[d>>2]=c;Ko(g)}Ko(a);return}function Ai(a){a=a|0;var b=0;f[a>>2]=3292;b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}f[a+12>>2]=3316;b=f[a+32>>2]|0;if(b|0)Ko(b);b=f[a+20>>2]|0;if(!b){Ko(a);return}Ko(b);Ko(a);return}function Bi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+12>>2]|0;d=f[a+8>>2]|0;a=d;if((c|0)==(d|0)){e=0;return e|0}g=c-d>>2;d=0;while(1){c=f[a+(d<<2)>>2]|0;if((f[c+60>>2]|0)==(b|0)){e=c;h=5;break}d=d+1|0;if(d>>>0>=g>>>0){e=0;h=5;break}}if((h|0)==5)return e|0;return 0}function Ci(a){a=a|0;var b=0,c=0;f[a>>2]=2264;b=f[a+76>>2]|0;if(b|0)Ko(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Io(c);f[a>>2]=1536;c=f[a+32>>2]|0;if(!c){Ko(a);return}f[a+36>>2]=c;Ko(c);Ko(a);return}function Di(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+12>>2]|0;d=f[a+8>>2]|0;a=d;if((c|0)==(d|0)){e=-1;return e|0}g=c-d>>2;d=0;while(1){if((f[(f[a+(d<<2)>>2]|0)+60>>2]|0)==(b|0)){e=d;h=5;break}d=d+1|0;if(d>>>0>=g>>>0){e=-1;h=5;break}}if((h|0)==5)return e|0;return 0}function Ei(a){a=a|0;var b=0;f[a>>2]=3384;b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}f[a+12>>2]=3364;b=f[a+32>>2]|0;if(b|0)Ko(b);b=f[a+20>>2]|0;if(!b){Ko(a);return}Ko(b);Ko(a);return}function Fi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=a;g=d;h=c;while(1){i=b[f>>0]|0;j=b[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Gi(a){a=a|0;var b=0,c=0;f[a>>2]=3052;b=a+28|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Io(c);f[a>>2]=1476;c=a+20|0;b=f[c>>2]|0;f[c>>2]=0;if(!b){Yh(a);Ko(a);return}Pa[f[(f[b>>2]|0)+4>>2]&127](b);Yh(a);Ko(a);return}function Hi(a){a=a|0;var b=0,c=0;f[a>>2]=1816;b=f[a+76>>2]|0;if(b|0)Ko(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Io(c);f[a>>2]=1536;c=f[a+32>>2]|0;if(!c){Ko(a);return}f[a+36>>2]=c;Ko(c);Ko(a);return}function Ii(a){a=a|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;c=0;while(1){if((c|0)==3)break;f[a+(c<<2)>>2]=0;c=c+1|0}if((b[a+11>>0]|0)<0)d=(f[a+8>>2]&2147483647)+-1|0;else d=10;Gh(a,d,0);return}function Ji(a){a=a|0;var b=0;f[a>>2]=3292;b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}f[a+12>>2]=3316;b=f[a+32>>2]|0;if(b|0)Ko(b);b=f[a+20>>2]|0;if(!b)return;Ko(b);return}function Ki(a){a=a|0;var b=0,c=0;f[a>>2]=2264;b=f[a+76>>2]|0;if(b|0)Ko(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Io(c);f[a>>2]=1536;c=f[a+32>>2]|0;if(!c)return;f[a+36>>2]=c;Ko(c);return}function Li(a){a=a|0;var b=0;f[a>>2]=3384;b=f[a+64>>2]|0;if(b|0){f[a+68>>2]=b;Ko(b)}f[a+12>>2]=3364;b=f[a+32>>2]|0;if(b|0)Ko(b);b=f[a+20>>2]|0;if(!b)return;Ko(b);return}function Mi(a){a=a|0;var b=0,c=0;f[a>>2]=3052;b=a+28|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Io(c);f[a>>2]=1476;c=a+20|0;b=f[c>>2]|0;f[c>>2]=0;if(!b){Yh(a);return}Pa[f[(f[b>>2]|0)+4>>2]&127](b);Yh(a);return}function Ni(a){a=a|0;var b=0,c=0;f[a>>2]=1816;b=f[a+76>>2]|0;if(b|0)Ko(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Io(c);f[a>>2]=1536;c=f[a+32>>2]|0;if(!c)return;f[a+36>>2]=c;Ko(c);return}function Oi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(en(a,f[b+8>>2]|0,0)|0)ki(0,b,c,d);else{e=f[a+8>>2]|0;Sa[f[(f[e>>2]|0)+28>>2]&7](e,b,c,d)}return}function Pi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=W(c,b)|0;g=(b|0)==0?0:c;if((f[d+76>>2]|0)>-1){c=(Po(d)|0)==0;h=lg(a,e,d)|0;if(c)i=h;else{Oo(d);i=h}}else i=lg(a,e,d)|0;if((i|0)==(e|0))j=g;else j=(i>>>0)/(b>>>0)|0;return j|0}function Qi(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=La[f[(f[d>>2]|0)+32>>2]&127](d,b)|0;return c|0}function Ri(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[a>>0]|0;e=b[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=c;c=a;do{c=c+1|0;d=d+1|0;a=b[c>>0]|0;e=b[d>>0]|0}while(!(a<<24>>24==0?1:a<<24>>24!=e<<24>>24));f=e;g=a}return (g&255)-(f&255)|0}function Si(a,b){a=a|0;b=b|0;var c=0;c=wk(40)|0;f[c>>2]=-1;Kk(c+8|0);Qa[f[(f[a>>2]|0)+16>>2]&7](a,c);a=b+88|0;b=f[a>>2]|0;f[a>>2]=c;if(!b)return 1;c=f[b+8>>2]|0;if(c|0){f[b+12>>2]=c;Ko(c)}Ko(b);return 1}function Ti(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;Ii(d);Ig(a,d,b);om(d);u=c;return}function Ui(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[a+4>>2]|0;if(c|0?((h[c+36>>0]|0)<<8&65535)<512:0){d=1;return d|0}d=La[f[(f[a>>2]|0)+48>>2]&127](a,(f[b+4>>2]|0)-(f[b>>2]|0)>>2)|0;return d|0}function Vi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;d=u;u=u+32|0;e=d;g=d+20|0;f[e>>2]=f[a+60>>2];f[e+4>>2]=0;f[e+8>>2]=b;f[e+12>>2]=g;f[e+16>>2]=c;if((Ol(xa(140,e|0)|0)|0)<0){f[g>>2]=-1;h=-1}else h=f[g>>2]|0;u=d;return h|0}function Wi(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=0;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=0;return c|0}b=f[d>>2]|0;if((b|0)==-1){c=0;return c|0}c=f[(f[a+8>>2]|0)+(b<<2)>>2]|0;return c|0}function Xi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}d=Nf(f[(f[a+36>>2]|0)+(e<<2)>>2]|0)|0;return d|0}function Yi(a,c){a=a|0;c=c|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;if((b[c+11>>0]|0)<0)Vh(a,f[c>>2]|0,f[c+4>>2]|0);else{f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2]}return}function Zi(a,b){a=a|0;b=b|0;var c=0;ek(a);f[a>>2]=1416;c=a+36|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;c=f[b>>2]|0;f[b>>2]=0;f[a+60>>2]=c;return}function _i(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;zc(a,b);if((b|0)<=-1)return;c=a+88|0;d=f[c>>2]|0;e=f[a+84>>2]|0;if((d-e>>2|0)<=(b|0))return;a=e+(b<<2)|0;b=a+4|0;e=d-b|0;if(e|0)Rj(a|0,b|0,e|0)|0;f[c>>2]=a+(e>>2<<2);return}function $i(a,c){a=a|0;c=c|0;var d=0,e=0;d=a;e=c;c=d+64|0;do{f[d>>2]=f[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(c|0));e=a+64|0;f[a+88>>2]=0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;b[e+20>>0]=0;return}function aj(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((a|0)==0&(c|0)==0)f=d;else{g=d;d=c;c=a;while(1){a=g+-1|0;b[a>>0]=h[14136+(c&15)>>0]|0|e;c=xl(c|0,d|0,4)|0;d=H;if((c|0)==0&(d|0)==0){f=a;break}else g=a}}return f|0}function bj(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=f[a>>2]|0;if(!(d&8)){f[a+8>>2]=0;f[a+4>>2]=0;c=f[a+44>>2]|0;f[a+28>>2]=c;f[a+20>>2]=c;f[a+16>>2]=c+(f[a+48>>2]|0);e=0}else{f[a>>2]=d|32;e=-1}return e|0}function cj(a){a=a|0;if(!(f[a+60>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function dj(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[b+88>>2]|0;if(!c){d=0;return d|0}if((f[c>>2]|0)!=2){d=0;return d|0}b=f[c+8>>2]|0;f[a+4>>2]=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24;d=1;return d|0}function ej(a){a=a|0;var b=0;if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+52>>2]|0)){b=0;return b|0}b=(f[a+56>>2]|0)!=0;return b|0}function fj(a){a=a|0;var b=0;f[a>>2]=2488;b=f[a+76>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function gj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;d=b[a+11>>0]|0;e=d<<24>>24<0;if(e)g=f[a+4>>2]|0;else g=d&255;if(g>>>0<=c>>>0)$n(a);if(e)h=f[a>>2]|0;else h=a;return h+c|0}function hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+32|0;g=e;f[a+36>>2]=15;if((f[a>>2]&64|0)==0?(f[g>>2]=f[a+60>>2],f[g+4>>2]=21523,f[g+8>>2]=e+16,za(54,g|0)|0):0)b[a+75>>0]=-1;g=hf(a,c,d)|0;u=e;return g|0}function ij(a){a=a|0;var b=0;f[a>>2]=2040;b=f[a+76>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function jj(a,b,c){a=a|0;b=b|0;c=c|0;if((b|0)!=0&(c|0)!=0){jc(a,b,c);return}else{qc(a,0,0);return}}function kj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=_(e);f[a+4>>2]=b;Ye(a+8|0,c,c+(d<<2)|0);n[a+20>>2]=e;return}function lj(a,b){a=a|0;b=b|0;var c=0;if(!(La[f[(f[a>>2]|0)+36>>2]&127](a,b)|0)){c=0;return c|0}if(!(La[f[(f[a>>2]|0)+40>>2]&127](a,b)|0)){c=0;return c|0}c=Ka[f[(f[a>>2]|0)+44>>2]&127](a)|0;return c|0}function mj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;d=f[c>>2]|0;c=a;e=b-a>>2;while(1){if(!e)break;a=(e|0)/2|0;b=c+(a<<2)|0;g=(f[b>>2]|0)>>>0<d>>>0;c=g?b+4|0:c;e=g?e+-1-a|0:a}return c|0}function nj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if(!(Wk(a,c,d)|0)){e=0;return e|0}d=f[a+8>>2]|0;if((b[d+24>>0]|0)!=3){e=0;return e|0}e=(f[d+28>>2]|0)==9;return e|0}function oj(a){a=a|0;var c=0;f[a>>2]=0;c=a+8|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;b[a+24>>0]=1;f[a+28>>2]=9;c=a+40|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[a+56>>2]=-1;f[a+60>>2]=0;return}function pj(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+44>>2]=c;d=1;return d|0}function qj(a,c){a=a|0;c=c|0;var d=0,e=0;a=u;u=u+32|0;d=a;ih(d,c);c=f[d+16>>2]|0;e=d+4|0;if((b[e+11>>0]|0)>=0){u=a;return c|0}Ko(f[e>>2]|0);u=a;return c|0}function rj(a){a=a|0;var b=0;f[a>>2]=2488;b=f[a+76>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function sj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;if(!(to(b[f[a>>2]>>0]|0)|0))c=0;else{d=0;while(1){e=f[a>>2]|0;g=(d*10|0)+-48+(b[e>>0]|0)|0;h=e+1|0;f[a>>2]=h;if(!(to(b[h>>0]|0)|0)){c=g;break}else d=g}}return c|0}function tj(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+64>>2]=c;d=1;return d|0}function uj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(!(Wk(a,b,c)|0)){d=0;return d|0}d=(f[(f[(f[(f[b+4>>2]|0)+8>>2]|0)+(c<<2)>>2]|0)+28>>2]|0)==9;return d|0}function vj(a){a=a|0;var b=0,c=0;b=f[r>>2]|0;c=b+a|0;if((a|0)>0&(c|0)<(b|0)|(c|0)<0){da()|0;wa(12);return -1}f[r>>2]=c;if((c|0)>(ca()|0)?(ba()|0)==0:0){f[r>>2]=b;wa(12);return -1}return b|0}function wj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;if((a|0)==0&(c|0)==0)e=d;else{f=d;d=c;c=a;while(1){a=f+-1|0;b[a>>0]=c&7|48;c=xl(c|0,d|0,3)|0;d=H;if((c|0)==0&(d|0)==0){e=a;break}else f=a}}return e|0}function xj(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;if(en(a,f[b+8>>2]|0,g)|0)nh(0,b,c,d,e);return}function yj(a){a=a|0;var b=0;f[a>>2]=2040;b=f[a+76>>2]|0;if(b|0)Ko(b);f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function zj(a){a=a|0;var c=0,d=0,e=0,g=0;c=u;u=u+16|0;d=c;e=f[a+4>>2]|0;g=(f[e+56>>2]|0)-(f[e+52>>2]|0)>>2;b[d>>0]=0;Gf(a+20|0,g,d);u=c;return}function Aj(a,c){a=a|0;c=c|0;var d=0;if(((c|0)!=0?(f[c+56>>2]|0)==0:0)?(b[c+24>>0]|0)==3:0){f[a+60>>2]=c;d=1}else d=0;return d|0}function Bj(a){a=a|0;var b=0;switch(a|0){case 11:case 2:case 1:{b=1;break}case 4:case 3:{b=2;break}case 6:case 5:{b=4;break}case 8:case 7:{b=8;break}case 9:{b=4;break}case 10:{b=8;break}default:b=-1}return b|0}function Cj(a){a=a|0;var c=0,d=0,e=0;b[a+36>>0]=0;c=vl(f[a+32>>2]|0,0,7,0)|0;d=xl(c|0,H|0,3)|0;c=a+16|0;a=c;e=vl(d|0,H|0,f[a>>2]|0,f[a+4>>2]|0)|0;a=c;f[a>>2]=e;f[a+4>>2]=H;return}function Dj(a){a=a|0;var c=0,d=0,e=0,g=0;c=u;u=u+16|0;d=c;e=f[a+4>>2]|0;g=(f[e+28>>2]|0)-(f[e+24>>2]|0)>>2;b[d>>0]=0;Gf(a+20|0,g,d);u=c;return}function Ej(a){a=a|0;var b=0,c=0,d=0;b=a+60|0;c=a;d=c+60|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(d|0));f[b>>2]=a;b=a+64|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function Fj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=(f[a+96>>2]|0)+(b*12|0)|0;Ye(c,d,d+12|0);return 1}function Gj(a){a=a|0;var b=0;f[a>>2]=2376;f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function Hj(a,c){a=a|0;c=c|0;var d=0,e=0;if((a|0)!=(c|0)){d=b[c+11>>0]|0;e=d<<24>>24<0;fh(a,e?f[c>>2]|0:c,e?f[c+4>>2]|0:d&255)|0}return a|0}function Ij(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=W(d,c)|0;f=a>>>16;a=(e>>>16)+(W(d,f)|0)|0;d=b>>>16;b=W(d,c)|0;return (H=(a>>>16)+(W(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Jj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=Dh(b)|0;d=wk(c+13|0)|0;f[d>>2]=c;f[d+4>>2]=c;f[d+8>>2]=0;e=Fn(d)|0;Bf(e|0,b|0,c+1|0)|0;f[a>>2]=e;return}function Kj(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=-1;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=-1;return c|0}c=f[d>>2]|0;return c|0}function Lj(){var a=0,b=0;a=wk(40)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=1065353216;b=a+20|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[a+36>>2]=1065353216;return a|0}function Mj(a){a=a|0;var b=0;f[a>>2]=1928;f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function Nj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f[b+44>>2]=e;Bc(a,b,c,d,e);return}function Oj(a){a=a|0;var b=0;f[a>>2]=3748;b=f[a+96>>2]|0;if(b|0){f[a+100>>2]=b;Ko(b)}b=f[a+84>>2]|0;if(!b){Ag(a);Ko(a);return}f[a+88>>2]=b;Ko(b);Ag(a);Ko(a);return}function Pj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(en(a,f[b+8>>2]|0,0)|0)ki(0,b,c,d);return}function Qj(a){a=a|0;var b=0;f[a>>2]=3608;b=a+4|0;f[a+40>>2]=0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;f[b+24>>2]=0;f[b+28>>2]=0;d[b+32>>1]=0;return}function Rj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if((c|0)<(a|0)&(a|0)<(c+d|0)){e=a;c=c+d|0;a=a+d|0;while((d|0)>0){a=a-1|0;c=c-1|0;d=d-1|0;b[a>>0]=b[c>>0]|0}a=e}else Bf(a,c,d)|0;return a|0}function Sj(a){a=a|0;var b=0;f[a>>2]=2376;f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function Tj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=u;u=u+16|0;e=d;f[e>>2]=f[c>>2];g=Ma[f[(f[a>>2]|0)+16>>2]&31](a,b,e)|0;if(g)f[c>>2]=f[e>>2];u=d;return g&1|0}function Uj(a,b){a=a|0;b=b|0;var c=0;if(b>>>0>=2){c=0;return c|0}f[a+28>>2]=b;c=1;return c|0}function Vj(a){a=a|0;var b=0;f[a>>2]=1928;f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function Wj(a){a=a|0;var b=0;f[a>>2]=3748;b=f[a+96>>2]|0;if(b|0){f[a+100>>2]=b;Ko(b)}b=f[a+84>>2]|0;if(!b){Ag(a);return}f[a+88>>2]=b;Ko(b);Ag(a);return}function Xj(a){a=a|0;var b=0,c=0;if(no(a)|0?(b=Ln(f[a>>2]|0)|0,a=b+8|0,c=f[a>>2]|0,f[a>>2]=c+-1,(c+-1|0)<0):0)Ko(b);return}function Yj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)<=0)return;d=0;do{e=f[a+(d<<2)>>2]|0;f[c+(d<<2)>>2]=e<<31>>31^e>>>1;d=d+1|0}while((d|0)!=(b|0));return}function Zj(a){a=a|0;var c=0;f[a>>2]=0;c=a+8|0;d[a+38>>1]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;f[c+24>>2]=0;b[c+28>>0]=0;return}function _j(a){a=a|0;var b=0,c=0;f[a>>2]=1476;b=a+20|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);Yh(a);Ko(a);return}function $j(a,b,c){a=a|0;b=b|0;c=c|0;zb(a,b,c);return}function ak(a){a=a|0;Zj(a);Zj(a+40|0);ym(a+80|0);Zj(a+96|0);f[a+136>>2]=0;f[a+140>>2]=0;f[a+144>>2]=0;return}function bk(a){a=a|0;var b=0,c=0;f[a>>2]=1476;b=a+20|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Pa[f[(f[c>>2]|0)+4>>2]&127](c);Yh(a);return}function ck(a,b,c){a=a|0;b=b|0;c=c|0;return md(a,b,5,6,c)|0}function dk(a,b,c){a=a|0;b=b|0;c=c|0;return kd(a,b,3,4,c)|0}function ek(a){a=a|0;var b=0;f[a>>2]=1256;b=a+4|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;f[b+24>>2]=0;f[b+28>>2]=0;return}function fk(a,b,c){a=a|0;b=b|0;c=c|0;return pd(a,b,1,2,c)|0}function gk(a,b,c){a=a|0;b=b|0;c=c|0;return ld(a,b,3,4,c)|0}function hk(a,b,c){a=a|0;b=b|0;c=c|0;return od(a,b,5,6,c)|0}function ik(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=a+20|0;e=f[d>>2]|0;g=(f[a+16>>2]|0)-e|0;a=g>>>0>c>>>0?c:g;Bf(e|0,b|0,a|0)|0;f[d>>2]=(f[d>>2]|0)+a;return c|0}function jk(a,b,c){a=a|0;b=b|0;c=c|0;return qd(a,b,1,2,c)|0}function kk(a){a=a|0;var b=0;f[a>>2]=3316;b=f[a+20>>2]|0;if(b|0)Ko(b);b=f[a+8>>2]|0;if(!b){Ko(a);return}Ko(b);Ko(a);return}function lk(){var a=0,b=0;a=wk(24)|0;f[a>>2]=1228;f[a+4>>2]=-1;b=a+8|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return a|0}function mk(a){a=a|0;var c=0;oj(a);c=a+64|0;f[a+88>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;b[c+20>>0]=0;return}function nk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((f[b+4>>2]|0)==(c|0)?(c=b+28|0,(f[c>>2]|0)!=1):0)f[c>>2]=d;return}function ok(a){a=a|0;var b=0;f[a>>2]=3364;b=f[a+20>>2]|0;if(b|0)Ko(b);b=f[a+8>>2]|0;if(!b){Ko(a);return}Ko(b);Ko(a);return}function pk(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;f[a>>2]=b;b=a+8|0;f[b>>2]=c;f[b+4>>2]=0;d[a+38>>1]=e;e=a+16|0;f[e>>2]=0;f[e+4>>2]=0;return}function qk(a,b,c){a=a|0;b=_(b);c=c|0;var d=0,e=Ia;if((c|0)<1){d=0;return d|0}e=_(_(1.0)/_(c|0));n[a+4>>2]=e;n[a>>2]=b;d=1;return d|0}function rk(a){a=a|0;var b=0;f[a>>2]=1256;b=f[a+16>>2]|0;if(b|0){f[a+20>>2]=b;Ko(b)}b=f[a+4>>2]|0;if(!b)return;f[a+8>>2]=b;Ko(b);return}function sk(a){a=a|0;var b=0;f[a>>2]=1536;b=f[a+32>>2]|0;if(!b){Ko(a);return}f[a+36>>2]=b;Ko(b);Ko(a);return}function tk(a,b,c){a=a|0;b=b|0;c=c|0;f[a+4>>2]=b;f[a+8>>2]=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(c<<2)>>2];f[a+12>>2]=c;return 1}function uk(a){a=a|0;var b=0;mn(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;b=a+24|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function vk(a){a=a|0;var b=0;Bl(a);f[a>>2]=3748;b=a+84|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function wk(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){a=Va(b)|0;if(a|0){c=a;break}a=Nn()|0;if(!a){c=0;break}Oa[a&1]()}return c|0}function xk(a){a=a|0;var b=0;f[a>>2]=3316;b=f[a+20>>2]|0;if(b|0)Ko(b);b=f[a+8>>2]|0;if(!b)return;Ko(b);return}function yk(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;d=Mo(f[a+60>>2]|0)|0;f[c>>2]=d;d=Ol(Aa(6,c|0)|0)|0;u=b;return d|0}function zk(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;c=a+4|0;f[c>>2]=b;f[a+16>>2]=0;f[a+12>>2]=b;if(!b)return;f[c>>2]=b;Ko(b);return}function Ak(a){a=a|0;var b=0;f[a>>2]=3364;b=f[a+20>>2]|0;if(b|0)Ko(b);b=f[a+8>>2]|0;if(!b)return;Ko(b);return}function Bk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Ij(e,a)|0;f=H;return (H=(W(b,a)|0)+(W(d,e)|0)+f|f&0,c|0|0)|0}function Ck(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ck(b,c,d)|0}function Dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return dk(b,c,d)|0}function Ek(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ce(b,c,d)|0}function Fk(a){a=a|0;var b=0;f[a>>2]=1536;b=f[a+32>>2]|0;if(!b)return;f[a+36>>2]=b;Ko(b);return}function Gk(a){a=a|0;var b=0;ek(a);f[a>>2]=1312;b=a+36|0;a=b+36|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function Hk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return fk(b,c,d)|0}function Ik(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return gk(b,c,d)|0}function Jk(a){a=a|0;f[a>>2]=2716;Ko(a);return}function Kk(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function Lk(a){a=a|0;jm(a);f[a>>2]=3052;f[a+24>>2]=-1;f[a+28>>2]=0;n[a+32>>2]=_(0.0);return}function Mk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return jk(b,c,d)|0}function Nk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return hk(b,c,d)|0}function Ok(a,b,c){a=a|0;b=b|0;c=c|0;f[a>>2]=b;b=a+8|0;f[b>>2]=c;f[b+4>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;return}function Pk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return (((f[a+12>>2]|0)+-1|0)==(d|0)?0:d+1|0)|0}function Qk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;f[g>>2]=d;d=Sg(a,b,c,g)|0;u=e;return d|0}function Rk(a){a=a|0;var b=0;f[a>>2]=1228;b=f[a+8>>2]|0;if(!b){Ko(a);return}f[a+12>>2]=b;Ko(b);Ko(a);return}function Sk(a){a=a|0;f[a>>2]=2800;Ko(a);return}function Tk(a){a=a|0;f[a>>2]=2884;Ko(a);return}function Uk(a){a=a|0;f[a>>2]=2716;return}function Vk(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Wk(a,b,c){a=a|0;b=b|0;c=c|0;return tk(a,b,c)|0}function Xk(a){a=a|0;var b=0;if(!a)return;b=f[a+8>>2]|0;if(b|0){f[a+12>>2]=b;Ko(b)}Ko(a);return}function Yk(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Na[a&31](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Zk(a){a=a|0;f[a>>2]=2968;Ko(a);return}function _k(a){a=a|0;f[a>>2]=2800;return}function $k(a){a=a|0;f[a>>2]=2884;return}function al(a,b){a=a|0;b=b|0;var c=0;c=f[a+48>>2]|0;return La[f[(f[c>>2]|0)+16>>2]&127](c,b)|0}function bl(a,b,c){a=a|0;b=b|0;c=c|0;return Kj(b,c)|0}function cl(a,b){a=a|0;b=b|0;var c=0;c=f[a+48>>2]|0;return La[f[(f[c>>2]|0)+12>>2]&127](c,b)|0}function dl(a){a=a|0;Pd(a);Ko(a);return}function el(a,b){a=a|0;b=b|0;var c=0;c=f[a+48>>2]|0;return La[f[(f[c>>2]|0)+20>>2]&127](c,b)|0}function fl(a){a=a|0;var c=0,d=0;c=a+4|0;if((b[c+11>>0]|0)<0){d=f[c>>2]|0;return d|0}else{d=c;return d|0}return 0}function gl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ve(b,c,d)|0}function hl(a){a=a|0;me(a);Ko(a);return}function il(a,b){a=a|0;b=b|0;var c=0;if(!b)c=0;else c=Rf(f[b>>2]|0,f[b+4>>2]|0,a)|0;return ((c|0)==0?a:c)|0}function jl(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Ua[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function kl(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;f[d>>2]=b;b=Mf(f[980]|0,a,d)|0;u=c;return b|0}function ll(a){a=a|0;var b=0;if(!a)return;b=f[a>>2]|0;if(b|0){f[a+4>>2]=b;Ko(b)}Ko(a);return}function ml(a){a=a|0;if(!(f[a+44>>2]|0))return 0;else return Ka[f[(f[a>>2]|0)+48>>2]&127](a)|0;return 0}function nl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return vh(b,c,d)|0}function ol(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)oh(a|0,(io(c)|0)&255|0,b|0)|0;return a|0}function pl(a){a=a|0;return 4}function ql(a){a=a|0;f[a>>2]=2968;return}function rl(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}H=a<<c-32;return 0}function sl(a){a=a|0;var b=0;f[a>>2]=1228;b=f[a+8>>2]|0;if(!b)return;f[a+12>>2]=b;Ko(b);return}function tl(a){a=a|0;var c=0;if(!a)return;c=a+4|0;if((b[c+11>>0]|0)<0)Ko(f[c>>2]|0);Ko(a);return}function ul(){}function vl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (H=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function wl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (H=e,a-c>>>0|0)|0}function xl(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}H=0;return b>>>c-32|0}function yl(a,b,c){a=a|0;b=b|0;c=c|0;return si(a,b,c)|0}function zl(a){a=a|0;_d(a);Ko(a);return}function Al(a){a=a|0;return 5}function Bl(a){a=a|0;var b=0;f[a>>2]=3776;b=a+4|0;a=b+80|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function Cl(a){a=a|0;return 6}function Dl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Fj(b,c,d)|0}function El(a,b,c){a=a|0;b=b|0;c=c|0;f[a+28>>2]=b;f[a+32>>2]=c;return 1}function Fl(a,c){a=a|0;c=c|0;b[c+84>>0]=1;f[c+72>>2]=f[c+68>>2];return 1}function Gl(a,b,c){a=a|0;b=b|0;c=c|0;return bl(a,b,c)|0}function Hl(a){a=a|0;var b=0;b=f[a+48>>2]|0;return Ka[f[(f[b>>2]|0)+28>>2]&127](b)|0}function Il(a,b,c){a=a|0;b=b|0;c=c|0;return Bg(b,c)|0}function Jl(a){a=a|0;f[a>>2]=1368;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=-1;f[a+16>>2]=0;return}function Kl(a){a=a|0;var b=0;b=f[a+48>>2]|0;return Ka[f[(f[b>>2]|0)+24>>2]&127](b)|0}function Ll(a,b){a=a|0;b=b|0;Jh(a,b);return}function Ml(a){a=a|0;var b=0;b=f[a+48>>2]|0;return Ka[f[(f[b>>2]|0)+36>>2]&127](b)|0}function Nl(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Ta[a&3](b|0,c|0,d|0,e|0,f|0)}function Ol(a){a=a|0;var b=0,c=0;if(a>>>0>4294963200){b=Ro()|0;f[b>>2]=0-a;c=-1}else c=a;return c|0}function Pl(a,b,c){a=a|0;b=b|0;c=c|0;return ui(a,b,c)|0}function Ql(a,b,c){a=a|0;b=b|0;c=c|0;return Hg(a,b,c)|0}function Rl(a,b,c){a=a|0;b=b|0;c=c|0;return Wg(a,b,c)|0}function Sl(a,b,c){a=a|0;b=b|0;c=c|0;return ng(a,b,c)|0}function Tl(a,b,c){a=a|0;b=b|0;c=c|0;return +(+Qg(a,b,c))}function Ul(a,b){a=a|0;b=b|0;return La[f[(f[a>>2]|0)+12>>2]&127](a,b)|0}function Vl(a,b){a=a|0;b=b|0;return La[f[(f[a>>2]|0)+56>>2]&127](a,b)|0}function Wl(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;return}function Xl(a,b,c){a=a|0;b=b|0;c=c|0;return $h(a,b,c)|0}function Yl(a,b){a=a|0;b=b|0;f[a+4>>2]=b;return 1}function Zl(a,b,c){a=a|0;b=b|0;c=c|0;return qm(b,c)|0}function _l(a,b,c){a=a|0;b=b|0;c=c|0;return Yg(a,b,c)|0}function $l(a,b,c){a=a|0;b=b|0;c=c|0;return Ug(a,b,c)|0}function am(a){a=a|0;jm(a);f[a>>2]=2544;f[a+24>>2]=-1;return}function bm(a,b){a=a|0;b=b|0;f[a+8>>2]=b;f[a+12>>2]=-1;return 1}function cm(a,b,c){a=a|0;b=b|0;c=c|0;return Uf(a,b,c)|0}function dm(a,b,c){a=a|0;b=b|0;c=c|0;return Vf(b,c)|0}function em(a){a=+a;var b=0;p[s>>3]=a;b=f[s>>2]|0;H=f[s+4>>2]|0;return b|0}function fm(a){a=a|0;f[a+12>>2]=0;f[a+16>>2]=0;f[a>>2]=0;n[a+4>>2]=_(0.0);return}function gm(){var a=0;a=wk(40)|0;f[a>>2]=-1;Kk(a+8|0);return a|0}function hm(){var a=0;a=wk(8)|0;f[a>>2]=1200;f[a+4>>2]=-1;return a|0}function im(a,b,c){a=a|0;b=b|0;c=c|0;return Fg(a,b,c)|0}function jm(a){a=a|0;Jl(a);f[a>>2]=1476;f[a+20>>2]=0;return}function km(a,b){a=a|0;b=b|0;Ll(a,b);return}function lm(a){a=a|0;var b=0;if(!a)b=0;else b=(Pf(a,1072,1160,0)|0)!=0&1;return b|0}function mm(a,b){a=a|0;b=b|0;return _(n[(f[a+8>>2]|0)+(b<<2)>>2])}function nm(a,b){a=a|0;b=b|0;return qj(a,b)|0}function om(a){a=a|0;if((b[a+11>>0]|0)<0)Ko(f[a>>2]|0);return}function pm(a){a=a|0;if(!a)return;Pa[f[(f[a>>2]|0)+4>>2]&127](a);return}function qm(a,b){a=a|0;b=b|0;return Bi(a,b)|0}function rm(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Sa[a&7](b|0,c|0,d|0,e|0)}function sm(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)Rj(a|0,b|0,c|0)|0;return a|0}function tm(a,b,c){a=a|0;b=b|0;c=c|0;return Em(b,c)|0}function um(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)Bf(a|0,b|0,c|0)|0;return a|0}function vm(a,b){a=a|0;b=b|0;return -1}function wm(a){a=a|0;return 3}function xm(a,b){a=a|0;b=b|0;return sn(a,b)|0}function ym(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b[a+12>>0]=0;return}function zm(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;return}function Am(a){a=a|0;Km(a);f[a>>2]=3180;f[a+48>>2]=0;return}function Bm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ma[a&31](b|0,c|0,d|0)|0}function Cm(a,b,c){a=a|0;b=b|0;c=c|0;Ok(a,b,c);return}function Dm(a,b){a=a|0;b=b|0;f[a>>2]=4888;Jj(a+4|0,b);return}function Em(a,b){a=a|0;b=b|0;return f[(f[a+8>>2]|0)+(b<<2)>>2]|0}function Fm(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Mg(a,b,0)|0;return c|0}function Gm(a,b){a=a|0;b=b|0;return f[(f[a+4>>2]|0)+(b<<2)>>2]|0}function Hm(){var a=0;a=wk(64)|0;oj(a);return a|0}function Im(a,b){a=a|0;b=b|0;return _(Om(a,b))}function Jm(a){a=a|0;return f[a+8>>2]|0}function Km(a){a=a|0;Qj(a);f[a>>2]=3120;f[a+44>>2]=0;return}function Lm(a){a=a|0;if(!a)return;eh(a);Ko(a);return}function Mm(a,b){a=a|0;b=b|0;return An(a,b)|0}function Nm(a){a=a|0;return b[(f[a+8>>2]|0)+24>>0]|0}function Om(a,b){a=a|0;b=b|0;return _(n[(f[a>>2]|0)+(b<<2)>>2])}function Pm(a,b,c){a=a|0;b=b|0;c=c|0;if(!(f[a>>2]&32))lg(b,c,a)|0;return}function Qm(a){a=a|0;return (f[a+8>>2]|0)-(f[a+4>>2]|0)>>2|0}function Rm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ra[a&15](b|0,c|0,d|0)}function Sm(){var a=0;a=wk(96)|0;mk(a);return a|0}function Tm(a){a=a|0;var b=0;b=u;u=u+a|0;u=u+15&-16;return b|0}function Um(a){a=a|0;var b=0;b=(Eo()|0)+188|0;return Uh(a,f[b>>2]|0)|0}function Vm(a){a=a|0;return ((f[a+100>>2]|0)-(f[a+96>>2]|0)|0)/12|0|0}function Wm(){var a=0;a=wk(16)|0;zm(a);return a|0}function Xm(){var a=0;a=wk(40)|0;Zj(a);return a|0}function Ym(a,b){a=a|0;b=b|0;return 1}function Zm(a,b){a=a|0;b=b|0;return hn(a,b)|0}function _m(a,b){a=a|0;b=b|0;return jn(a,b)|0}function $m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;$(3);return 0}function an(a,b){a=a|0;b=b|0;return yn(a,b)|0}function bn(){var a=0;a=wk(12)|0;qn(a);return a|0}function cn(a){a=a|0;Yh(a);Ko(a);return}function dn(a){a=a|0;n[a>>2]=_(1.0);n[a+4>>2]=_(1.0);return}function en(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function fn(a,b){a=a|0;b=b|0;var c=0;c=vn(a|0)|0;return ((b|0)==0?a:c)|0}function gn(a){a=a|0;return (f[a+12>>2]|0)-(f[a+8>>2]|0)>>2|0}function hn(a,b){a=a|0;b=b|0;return f[(f[a>>2]|0)+(b<<2)>>2]|0}function jn(a,b){a=a|0;b=b|0;return d[(f[a>>2]|0)+(b<<1)>>1]|0}function kn(a,b){a=a|0;b=b|0;f[a+4>>2]=b;return}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Gc(a,b,c,d,0)|0}function mn(a){a=a|0;f[a+4>>2]=0;f[a+8>>2]=0;f[a>>2]=a+4;return}function nn(){var a=0;a=wk(84)|0;Bl(a);return a|0}function on(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)>>2|0}function pn(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)>>1|0}function qn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;return}function rn(a){a=a|0;f[a>>2]=4888;Xj(a+4|0);return}function sn(a,b){a=a|0;b=b|0;return f[b+12>>2]|0}function tn(a,b,c){a=a|0;b=b|0;c=c|0;return La[a&127](b|0,c|0)|0}function un(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;$(10)}function vn(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function wn(a){a=a|0;Km(a);f[a>>2]=3524;return}function xn(a,c){a=a|0;c=c|0;b[a>>0]=b[c>>0]|0;return}function yn(a,c){a=a|0;c=c|0;return b[(f[a>>2]|0)+c>>0]|0}function zn(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)|0}function An(a,b){a=a|0;b=b|0;return f[b+4>>2]|0}function Bn(a){a=a|0;return _(n[a+20>>2])}function Cn(a){a=a|0;return f[a+4>>2]|0}function Dn(a){a=a|0;if(!a)return;Ko(a);return}function En(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function Fn(a){a=a|0;return a+12|0}function Gn(a){a=a|0;return f[a+88>>2]|0}function Hn(a,b,c){a=a|0;b=b|0;c=c|0;Qa[a&7](b|0,c|0)}function In(){var a=0;a=wk(40)|0;uk(a);return a|0}function Jn(){var a=0;a=wk(108)|0;vk(a);return a|0}function Kn(a){a=a|0;return (b[a+32>>0]|0)!=0|0}function Ln(a){a=a|0;return a+-12|0}function Mn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;$(9)}function Nn(){var a=0;a=f[4213]|0;f[4213]=a+0;return a|0}function On(a){a=a|0;return lo(a+4|0)|0}function Pn(a){a=a|0;return f[a+56>>2]|0}function Qn(a){a=a|0;Ag(a);Ko(a);return}function Rn(a){a=a|0;Oo(a);Ko(a);return}function Sn(a){a=a|0;return b[a+24>>0]|0}function Tn(a,b){a=a|0;b=b|0;return 0}function Un(a){a=a|0;return f[a+40>>2]|0}function Vn(a){a=a|0;return f[a+48>>2]|0}function Wn(a){a=a|0;return (a?31-(Z(a^a-1)|0)|0:32)|0}function Xn(a,b){a=a|0;b=b|0;return Ka[a&127](b|0)|0}function Yn(a){a=a|0;return f[a+60>>2]|0}function Zn(a){a=a|0;return f[a+28>>2]|0}function _n(a){a=a|0;rn(a);Ko(a);return}function $n(a){a=a|0;Ba()}function ao(a,b){a=a|0;b=b|0;u=a;v=b}function bo(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function co(a){a=a|0;return (f[a>>2]|0)==0|0}function eo(a){a=a|0;return f[a+80>>2]|0}function fo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;$(8)}function go(a,b){a=a|0;b=b|0;Pa[a&127](b|0)}function ho(a,b){a=a|0;b=b|0;return il(a,b)|0}function io(a){a=a|0;return a&255|0}function jo(a){a=a|0;f[a>>2]=0;return}function ko(a,b,c){a=a|0;b=b|0;c=c|0;$(2);return 0}function lo(a){a=a|0;return f[a>>2]|0}function mo(a){a=a|0;return 2}function no(a){a=a|0;return 1}function oo(a,b){a=+a;b=b|0;return +(+Rh(a,b))}function po(){return 3}function qo(a,b,c){a=a|0;b=b|0;c=c|0;$(7)}function ro(){return -4}function so(){return 4}function to(a){a=a|0;return (a+-48|0)>>>0<10|0}function uo(){return -3}function vo(){return 1}function wo(){return 2}function xo(){return -5}function yo(a,b){a=a|0;b=b|0;$(1);return 0}function zo(a){a=a|0;Fa()}function Ao(a){a=a|0;Oa[a&1]()}function Bo(){return -2}function Co(){sa()}function Do(){return -1}function Eo(){return Uo()|0}function Fo(a,b){a=a|0;b=b|0;$(6)}function Go(){return 0}function Ho(a){a=a|0;return wk(a)|0}function Io(a){a=a|0;Ko(a);return}function Jo(a){a=a|0;u=a}function Ko(a){a=a|0;Rb(a);return}function Lo(a){a=a|0;H=a}function Mo(a){a=a|0;return a|0}function No(a){a=a|0;$(0);return 0}function Oo(a){a=a|0;return}function Po(a){a=a|0;return 0}function Qo(){return H|0}function Ro(){return 16848}function So(){return u|0}function To(a){a=a|0;$(5)}function Uo(){return 4172}function Vo(){$(4)} + +// EMSCRIPTEN_END_FUNCS +var Ka=[No,mo,no,Qm,Zn,no,Lb,Ic,Nm,Cn,Po,Po,no,Po,no,no,ej,mo,ej,pl,ej,wm,cj,no,Cl,gi,no,Zn,Al,cj,no,no,ej,mo,ej,pl,ej,wm,cj,no,Cl,gi,no,Zn,Al,cj,no,mo,Po,Cn,no,Po,no,mo,Po,Cn,no,Po,no,wm,Cl,ei,no,Zn,Cl,ei,no,Zn,Cl,ei,no,Zn,Cl,ei,no,Zn,qe,no,no,ml,ud,wi,no,Po,Ue,Hl,Ml,Kl,ab,no,Cn,Jm,Me,$d,Oe,_a,no,Cn,Jm,$a,no,Cn,Jm,vb,_g,Po,no,Oh,Sh,yk,On,No,No,No,No,No,No,No,No,No,No,No,No,No,No,No,No,No];var La=[yo,dj,Kf,kc,lj,Gm,Tn,Ym,Tb,tb,bm,Ym,pg,Fd,mg,Xi,ai,Xh,Ui,hd,vm,Tn,Hf,pc,Tn,Aj,nd,Tn,tj,fe,Uj,Tn,Aj,zd,pc,Tn,Aj,nd,Tn,tj,fe,Uj,Tn,Aj,zd,Qf,vm,Tn,ag,vm,Tn,sg,Tn,pj,Ne,Uj,Tn,pj,Ne,Uj,Tn,pj,te,Uj,Tn,pj,te,Uj,Vl,he,Tn,Tn,el,cl,al,Yl,rg,ug,Sb,ye,ee,be,Yl,rg,ug,Sb,Yl,rg,ug,Sb,bf,Fl,kg,bf,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo,yo];var Ma=[ko,El,tk,xi,Vk,qg,Wk,ie,rc,nj,wg,ch,uj,Rg,mi,hf,Vi,hj,ik,wh,ko,ko,ko,ko,ko,ko,ko,ko,ko,ko,ko,ko];var Na=[$m,Lc,Xb,Pb,sb,Sc,ec,dd,Yb,Qb,qb,Rc,dc,cd,wf,sf,lc,mc,nc,oc,$m,$m,$m,$m,$m,$m,$m,$m,$m,$m,$m,$m];var Oa=[Vo,Co];var Pa=[To,Oo,Io,sl,Rk,rk,zo,rh,mh,Yh,cn,$g,Vg,bk,_j,Fk,zo,sk,sk,sk,qi,ji,Ni,Hi,zo,Vj,Mj,Oo,zo,Io,yj,ij,sk,sk,li,ii,Ki,Ci,zo,Sj,Gj,Oo,zo,Io,rj,fj,_j,Oo,Io,Io,Uk,Jk,Oo,Io,_k,Sk,Oo,Io,$k,Tk,Oo,Io,ql,Zk,Oo,Io,Mi,Gi,_h,zo,Eh,Ah,_d,zl,Ji,Ai,xk,kk,zj,Qh,Mh,Ak,ok,Dj,Li,Ei,Pd,dl,me,hl,Th,Oo,Io,zo,Th,Th,Wj,Oj,Ag,Qn,Oo,Rn,Oo,Oo,Rn,rn,_n,_n,To,To,To,To,To,To,To,To,To,To,To,To,To,To,To,To,To,To,To,To];var Qa=[Fo,fi,Je,_i,zc,Fo,Fo,Fo];var Ra=[qo,Zh,Mb,Ob,Ob,Mb,Ob,Mb,bg,Ef,qo,qo,qo,qo,qo,qo];var Sa=[fo,sh,sd,Pj,Oi,fo,fo,fo];var Ta=[Mn,qh,ff,Mn];var Ua=[un,xj,yi,un];return{___cxa_can_catch:Tj,___cxa_is_pointer_type:lm,___divdi3:ni,___muldi3:Bk,___udivdi3:ln,_bitshift64Lshr:xl,_bitshift64Shl:rl,_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0:hm,_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1:Ul,_emscripten_bind_AttributeOctahedronTransform___destroy___0:pm,_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0:Cn,_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0:lk,_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1:Ul,_emscripten_bind_AttributeQuantizationTransform___destroy___0:pm,_emscripten_bind_AttributeQuantizationTransform_min_value_1:mm,_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0:Cn,_emscripten_bind_AttributeQuantizationTransform_range_0:Bn,_emscripten_bind_AttributeTransformData_AttributeTransformData_0:gm,_emscripten_bind_AttributeTransformData___destroy___0:Xk,_emscripten_bind_AttributeTransformData_transform_type_0:lo,_emscripten_bind_DecoderBuffer_DecoderBuffer_0:Xm,_emscripten_bind_DecoderBuffer_Init_2:Cm,_emscripten_bind_DecoderBuffer___destroy___0:Dn,_emscripten_bind_Decoder_DecodeBufferToMesh_2:Pl,_emscripten_bind_Decoder_DecodeBufferToPointCloud_2:yl,_emscripten_bind_Decoder_Decoder_0:In,_emscripten_bind_Decoder_GetAttributeByUniqueId_2:Zl,_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3:Ek,_emscripten_bind_Decoder_GetAttributeFloat_3:nl,_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3:gl,_emscripten_bind_Decoder_GetAttributeIdByName_2:dm,_emscripten_bind_Decoder_GetAttributeId_2:Gl,_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3:Ik,_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3:Nk,_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3:Mk,_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3:Nk,_emscripten_bind_Decoder_GetAttributeMetadata_2:Xl,_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3:Dk,_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3:Ck,_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3:Hk,_emscripten_bind_Decoder_GetAttribute_2:tm,_emscripten_bind_Decoder_GetEncodedGeometryType_1:nm,_emscripten_bind_Decoder_GetFaceFromMesh_3:Dl,_emscripten_bind_Decoder_GetMetadata_1:Mm,_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2:Il,_emscripten_bind_Decoder_SkipAttributeTransform_1:km,_emscripten_bind_Decoder___destroy___0:hi,_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0:bn,_emscripten_bind_DracoFloat32Array_GetValue_1:Im,_emscripten_bind_DracoFloat32Array___destroy___0:ll,_emscripten_bind_DracoFloat32Array_size_0:on,_emscripten_bind_DracoInt16Array_DracoInt16Array_0:bn,_emscripten_bind_DracoInt16Array_GetValue_1:_m,_emscripten_bind_DracoInt16Array___destroy___0:ll,_emscripten_bind_DracoInt16Array_size_0:pn,_emscripten_bind_DracoInt32Array_DracoInt32Array_0:bn,_emscripten_bind_DracoInt32Array_GetValue_1:Zm,_emscripten_bind_DracoInt32Array___destroy___0:ll,_emscripten_bind_DracoInt32Array_size_0:on,_emscripten_bind_DracoInt8Array_DracoInt8Array_0:bn,_emscripten_bind_DracoInt8Array_GetValue_1:an,_emscripten_bind_DracoInt8Array___destroy___0:ll,_emscripten_bind_DracoInt8Array_size_0:zn,_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0:bn,_emscripten_bind_DracoUInt16Array_GetValue_1:_m,_emscripten_bind_DracoUInt16Array___destroy___0:ll,_emscripten_bind_DracoUInt16Array_size_0:pn,_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0:bn,_emscripten_bind_DracoUInt32Array_GetValue_1:Zm,_emscripten_bind_DracoUInt32Array___destroy___0:ll,_emscripten_bind_DracoUInt32Array_size_0:on,_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0:bn,_emscripten_bind_DracoUInt8Array_GetValue_1:an,_emscripten_bind_DracoUInt8Array___destroy___0:ll,_emscripten_bind_DracoUInt8Array_size_0:zn,_emscripten_bind_GeometryAttribute_GeometryAttribute_0:Hm,_emscripten_bind_GeometryAttribute___destroy___0:Dn,_emscripten_bind_Mesh_Mesh_0:Jn,_emscripten_bind_Mesh___destroy___0:pm,_emscripten_bind_Mesh_num_attributes_0:gn,_emscripten_bind_Mesh_num_faces_0:Vm,_emscripten_bind_Mesh_num_points_0:eo,_emscripten_bind_MetadataQuerier_GetDoubleEntry_2:Tl,_emscripten_bind_MetadataQuerier_GetEntryName_2:cm,_emscripten_bind_MetadataQuerier_GetIntEntry_2:$l,_emscripten_bind_MetadataQuerier_GetStringEntry_2:Sl,_emscripten_bind_MetadataQuerier_HasDoubleEntry_2:Rl,_emscripten_bind_MetadataQuerier_HasEntry_2:im,_emscripten_bind_MetadataQuerier_HasIntEntry_2:_l,_emscripten_bind_MetadataQuerier_HasStringEntry_2:Ql,_emscripten_bind_MetadataQuerier_MetadataQuerier_0:Wm,_emscripten_bind_MetadataQuerier_NumEntries_1:xm,_emscripten_bind_MetadataQuerier___destroy___0:zi,_emscripten_bind_Metadata_Metadata_0:Lj,_emscripten_bind_Metadata___destroy___0:Lm,_emscripten_bind_PointAttribute_GetAttributeTransformData_0:Gn,_emscripten_bind_PointAttribute_PointAttribute_0:Sm,_emscripten_bind_PointAttribute___destroy___0:ri,_emscripten_bind_PointAttribute_attribute_type_0:Pn,_emscripten_bind_PointAttribute_byte_offset_0:Vn,_emscripten_bind_PointAttribute_byte_stride_0:Un,_emscripten_bind_PointAttribute_data_type_0:Zn,_emscripten_bind_PointAttribute_normalized_0:Kn,_emscripten_bind_PointAttribute_num_components_0:Sn,_emscripten_bind_PointAttribute_size_0:eo,_emscripten_bind_PointAttribute_unique_id_0:Yn,_emscripten_bind_PointCloud_PointCloud_0:nn,_emscripten_bind_PointCloud___destroy___0:pm,_emscripten_bind_PointCloud_num_attributes_0:gn,_emscripten_bind_PointCloud_num_points_0:eo,_emscripten_bind_Status___destroy___0:tl,_emscripten_bind_Status_code_0:lo,_emscripten_bind_Status_error_msg_0:fl,_emscripten_bind_Status_ok_0:co,_emscripten_bind_VoidPtr___destroy___0:Dn,_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM:Do,_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM:Go,_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM:wo,_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM:vo,_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE:Do,_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD:Go,_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH:vo,_emscripten_enum_draco_GeometryAttribute_Type_COLOR:wo,_emscripten_enum_draco_GeometryAttribute_Type_GENERIC:so,_emscripten_enum_draco_GeometryAttribute_Type_INVALID:Do,_emscripten_enum_draco_GeometryAttribute_Type_NORMAL:vo,_emscripten_enum_draco_GeometryAttribute_Type_POSITION:Go,_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD:po,_emscripten_enum_draco_StatusCode_ERROR:Do,_emscripten_enum_draco_StatusCode_INVALID_PARAMETER:uo,_emscripten_enum_draco_StatusCode_IO_ERROR:Bo,_emscripten_enum_draco_StatusCode_OK:Go,_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION:xo,_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION:ro,_emscripten_replace_memory:Ja,_free:Rb,_i64Add:vl,_i64Subtract:wl,_llvm_bswap_i32:vn,_malloc:Va,_memcpy:Bf,_memmove:Rj,_memset:oh,_sbrk:vj,dynCall_ii:Xn,dynCall_iii:tn,dynCall_iiii:Bm,dynCall_iiiiiii:Yk,dynCall_v:Ao,dynCall_vi:go,dynCall_vii:Hn,dynCall_viii:Rm,dynCall_viiii:rm,dynCall_viiiii:Nl,dynCall_viiiiii:jl,establishStackSpace:ao,getTempRet0:Qo,runPostSets:ul,setTempRet0:Lo,setThrew:En,stackAlloc:Tm,stackRestore:Jo,stackSave:So}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=Module["_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0"]=asm["_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0"];var _emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=Module["_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1"]=asm["_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1"];var _emscripten_bind_AttributeOctahedronTransform___destroy___0=Module["_emscripten_bind_AttributeOctahedronTransform___destroy___0"]=asm["_emscripten_bind_AttributeOctahedronTransform___destroy___0"];var _emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=Module["_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0"]=asm["_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0"];var _emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=Module["_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0"]=asm["_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0"];var _emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=Module["_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1"]=asm["_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1"];var _emscripten_bind_AttributeQuantizationTransform___destroy___0=Module["_emscripten_bind_AttributeQuantizationTransform___destroy___0"]=asm["_emscripten_bind_AttributeQuantizationTransform___destroy___0"];var _emscripten_bind_AttributeQuantizationTransform_min_value_1=Module["_emscripten_bind_AttributeQuantizationTransform_min_value_1"]=asm["_emscripten_bind_AttributeQuantizationTransform_min_value_1"];var _emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=Module["_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0"]=asm["_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0"];var _emscripten_bind_AttributeQuantizationTransform_range_0=Module["_emscripten_bind_AttributeQuantizationTransform_range_0"]=asm["_emscripten_bind_AttributeQuantizationTransform_range_0"];var _emscripten_bind_AttributeTransformData_AttributeTransformData_0=Module["_emscripten_bind_AttributeTransformData_AttributeTransformData_0"]=asm["_emscripten_bind_AttributeTransformData_AttributeTransformData_0"];var _emscripten_bind_AttributeTransformData___destroy___0=Module["_emscripten_bind_AttributeTransformData___destroy___0"]=asm["_emscripten_bind_AttributeTransformData___destroy___0"];var _emscripten_bind_AttributeTransformData_transform_type_0=Module["_emscripten_bind_AttributeTransformData_transform_type_0"]=asm["_emscripten_bind_AttributeTransformData_transform_type_0"];var _emscripten_bind_DecoderBuffer_DecoderBuffer_0=Module["_emscripten_bind_DecoderBuffer_DecoderBuffer_0"]=asm["_emscripten_bind_DecoderBuffer_DecoderBuffer_0"];var _emscripten_bind_DecoderBuffer_Init_2=Module["_emscripten_bind_DecoderBuffer_Init_2"]=asm["_emscripten_bind_DecoderBuffer_Init_2"];var _emscripten_bind_DecoderBuffer___destroy___0=Module["_emscripten_bind_DecoderBuffer___destroy___0"]=asm["_emscripten_bind_DecoderBuffer___destroy___0"];var _emscripten_bind_Decoder_DecodeBufferToMesh_2=Module["_emscripten_bind_Decoder_DecodeBufferToMesh_2"]=asm["_emscripten_bind_Decoder_DecodeBufferToMesh_2"];var _emscripten_bind_Decoder_DecodeBufferToPointCloud_2=Module["_emscripten_bind_Decoder_DecodeBufferToPointCloud_2"]=asm["_emscripten_bind_Decoder_DecodeBufferToPointCloud_2"];var _emscripten_bind_Decoder_Decoder_0=Module["_emscripten_bind_Decoder_Decoder_0"]=asm["_emscripten_bind_Decoder_Decoder_0"];var _emscripten_bind_Decoder_GetAttributeByUniqueId_2=Module["_emscripten_bind_Decoder_GetAttributeByUniqueId_2"]=asm["_emscripten_bind_Decoder_GetAttributeByUniqueId_2"];var _emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeFloat_3=Module["_emscripten_bind_Decoder_GetAttributeFloat_3"]=asm["_emscripten_bind_Decoder_GetAttributeFloat_3"];var _emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=Module["_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3"]=asm["_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3"];var _emscripten_bind_Decoder_GetAttributeIdByName_2=Module["_emscripten_bind_Decoder_GetAttributeIdByName_2"]=asm["_emscripten_bind_Decoder_GetAttributeIdByName_2"];var _emscripten_bind_Decoder_GetAttributeId_2=Module["_emscripten_bind_Decoder_GetAttributeId_2"]=asm["_emscripten_bind_Decoder_GetAttributeId_2"];var _emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeMetadata_2=Module["_emscripten_bind_Decoder_GetAttributeMetadata_2"]=asm["_emscripten_bind_Decoder_GetAttributeMetadata_2"];var _emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3"];var _emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=Module["_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3"]=asm["_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3"];var _emscripten_bind_Decoder_GetAttribute_2=Module["_emscripten_bind_Decoder_GetAttribute_2"]=asm["_emscripten_bind_Decoder_GetAttribute_2"];var _emscripten_bind_Decoder_GetEncodedGeometryType_1=Module["_emscripten_bind_Decoder_GetEncodedGeometryType_1"]=asm["_emscripten_bind_Decoder_GetEncodedGeometryType_1"];var _emscripten_bind_Decoder_GetFaceFromMesh_3=Module["_emscripten_bind_Decoder_GetFaceFromMesh_3"]=asm["_emscripten_bind_Decoder_GetFaceFromMesh_3"];var _emscripten_bind_Decoder_GetMetadata_1=Module["_emscripten_bind_Decoder_GetMetadata_1"]=asm["_emscripten_bind_Decoder_GetMetadata_1"];var _emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=Module["_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2"]=asm["_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2"];var _emscripten_bind_Decoder_SkipAttributeTransform_1=Module["_emscripten_bind_Decoder_SkipAttributeTransform_1"]=asm["_emscripten_bind_Decoder_SkipAttributeTransform_1"];var _emscripten_bind_Decoder___destroy___0=Module["_emscripten_bind_Decoder___destroy___0"]=asm["_emscripten_bind_Decoder___destroy___0"];var _emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=Module["_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0"]=asm["_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0"];var _emscripten_bind_DracoFloat32Array_GetValue_1=Module["_emscripten_bind_DracoFloat32Array_GetValue_1"]=asm["_emscripten_bind_DracoFloat32Array_GetValue_1"];var _emscripten_bind_DracoFloat32Array___destroy___0=Module["_emscripten_bind_DracoFloat32Array___destroy___0"]=asm["_emscripten_bind_DracoFloat32Array___destroy___0"];var _emscripten_bind_DracoFloat32Array_size_0=Module["_emscripten_bind_DracoFloat32Array_size_0"]=asm["_emscripten_bind_DracoFloat32Array_size_0"];var _emscripten_bind_DracoInt16Array_DracoInt16Array_0=Module["_emscripten_bind_DracoInt16Array_DracoInt16Array_0"]=asm["_emscripten_bind_DracoInt16Array_DracoInt16Array_0"];var _emscripten_bind_DracoInt16Array_GetValue_1=Module["_emscripten_bind_DracoInt16Array_GetValue_1"]=asm["_emscripten_bind_DracoInt16Array_GetValue_1"];var _emscripten_bind_DracoInt16Array___destroy___0=Module["_emscripten_bind_DracoInt16Array___destroy___0"]=asm["_emscripten_bind_DracoInt16Array___destroy___0"];var _emscripten_bind_DracoInt16Array_size_0=Module["_emscripten_bind_DracoInt16Array_size_0"]=asm["_emscripten_bind_DracoInt16Array_size_0"];var _emscripten_bind_DracoInt32Array_DracoInt32Array_0=Module["_emscripten_bind_DracoInt32Array_DracoInt32Array_0"]=asm["_emscripten_bind_DracoInt32Array_DracoInt32Array_0"];var _emscripten_bind_DracoInt32Array_GetValue_1=Module["_emscripten_bind_DracoInt32Array_GetValue_1"]=asm["_emscripten_bind_DracoInt32Array_GetValue_1"];var _emscripten_bind_DracoInt32Array___destroy___0=Module["_emscripten_bind_DracoInt32Array___destroy___0"]=asm["_emscripten_bind_DracoInt32Array___destroy___0"];var _emscripten_bind_DracoInt32Array_size_0=Module["_emscripten_bind_DracoInt32Array_size_0"]=asm["_emscripten_bind_DracoInt32Array_size_0"];var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module["_emscripten_bind_DracoInt8Array_DracoInt8Array_0"]=asm["_emscripten_bind_DracoInt8Array_DracoInt8Array_0"];var _emscripten_bind_DracoInt8Array_GetValue_1=Module["_emscripten_bind_DracoInt8Array_GetValue_1"]=asm["_emscripten_bind_DracoInt8Array_GetValue_1"];var _emscripten_bind_DracoInt8Array___destroy___0=Module["_emscripten_bind_DracoInt8Array___destroy___0"]=asm["_emscripten_bind_DracoInt8Array___destroy___0"];var _emscripten_bind_DracoInt8Array_size_0=Module["_emscripten_bind_DracoInt8Array_size_0"]=asm["_emscripten_bind_DracoInt8Array_size_0"];var _emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=Module["_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0"]=asm["_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0"];var _emscripten_bind_DracoUInt16Array_GetValue_1=Module["_emscripten_bind_DracoUInt16Array_GetValue_1"]=asm["_emscripten_bind_DracoUInt16Array_GetValue_1"];var _emscripten_bind_DracoUInt16Array___destroy___0=Module["_emscripten_bind_DracoUInt16Array___destroy___0"]=asm["_emscripten_bind_DracoUInt16Array___destroy___0"];var _emscripten_bind_DracoUInt16Array_size_0=Module["_emscripten_bind_DracoUInt16Array_size_0"]=asm["_emscripten_bind_DracoUInt16Array_size_0"];var _emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=Module["_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0"]=asm["_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0"];var _emscripten_bind_DracoUInt32Array_GetValue_1=Module["_emscripten_bind_DracoUInt32Array_GetValue_1"]=asm["_emscripten_bind_DracoUInt32Array_GetValue_1"];var _emscripten_bind_DracoUInt32Array___destroy___0=Module["_emscripten_bind_DracoUInt32Array___destroy___0"]=asm["_emscripten_bind_DracoUInt32Array___destroy___0"];var _emscripten_bind_DracoUInt32Array_size_0=Module["_emscripten_bind_DracoUInt32Array_size_0"]=asm["_emscripten_bind_DracoUInt32Array_size_0"];var _emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=Module["_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0"]=asm["_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0"];var _emscripten_bind_DracoUInt8Array_GetValue_1=Module["_emscripten_bind_DracoUInt8Array_GetValue_1"]=asm["_emscripten_bind_DracoUInt8Array_GetValue_1"];var _emscripten_bind_DracoUInt8Array___destroy___0=Module["_emscripten_bind_DracoUInt8Array___destroy___0"]=asm["_emscripten_bind_DracoUInt8Array___destroy___0"];var _emscripten_bind_DracoUInt8Array_size_0=Module["_emscripten_bind_DracoUInt8Array_size_0"]=asm["_emscripten_bind_DracoUInt8Array_size_0"];var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module["_emscripten_bind_GeometryAttribute_GeometryAttribute_0"]=asm["_emscripten_bind_GeometryAttribute_GeometryAttribute_0"];var _emscripten_bind_GeometryAttribute___destroy___0=Module["_emscripten_bind_GeometryAttribute___destroy___0"]=asm["_emscripten_bind_GeometryAttribute___destroy___0"];var _emscripten_bind_Mesh_Mesh_0=Module["_emscripten_bind_Mesh_Mesh_0"]=asm["_emscripten_bind_Mesh_Mesh_0"];var _emscripten_bind_Mesh___destroy___0=Module["_emscripten_bind_Mesh___destroy___0"]=asm["_emscripten_bind_Mesh___destroy___0"];var _emscripten_bind_Mesh_num_attributes_0=Module["_emscripten_bind_Mesh_num_attributes_0"]=asm["_emscripten_bind_Mesh_num_attributes_0"];var _emscripten_bind_Mesh_num_faces_0=Module["_emscripten_bind_Mesh_num_faces_0"]=asm["_emscripten_bind_Mesh_num_faces_0"];var _emscripten_bind_Mesh_num_points_0=Module["_emscripten_bind_Mesh_num_points_0"]=asm["_emscripten_bind_Mesh_num_points_0"];var _emscripten_bind_MetadataQuerier_GetDoubleEntry_2=Module["_emscripten_bind_MetadataQuerier_GetDoubleEntry_2"]=asm["_emscripten_bind_MetadataQuerier_GetDoubleEntry_2"];var _emscripten_bind_MetadataQuerier_GetEntryName_2=Module["_emscripten_bind_MetadataQuerier_GetEntryName_2"]=asm["_emscripten_bind_MetadataQuerier_GetEntryName_2"];var _emscripten_bind_MetadataQuerier_GetIntEntry_2=Module["_emscripten_bind_MetadataQuerier_GetIntEntry_2"]=asm["_emscripten_bind_MetadataQuerier_GetIntEntry_2"];var _emscripten_bind_MetadataQuerier_GetStringEntry_2=Module["_emscripten_bind_MetadataQuerier_GetStringEntry_2"]=asm["_emscripten_bind_MetadataQuerier_GetStringEntry_2"];var _emscripten_bind_MetadataQuerier_HasDoubleEntry_2=Module["_emscripten_bind_MetadataQuerier_HasDoubleEntry_2"]=asm["_emscripten_bind_MetadataQuerier_HasDoubleEntry_2"];var _emscripten_bind_MetadataQuerier_HasEntry_2=Module["_emscripten_bind_MetadataQuerier_HasEntry_2"]=asm["_emscripten_bind_MetadataQuerier_HasEntry_2"];var _emscripten_bind_MetadataQuerier_HasIntEntry_2=Module["_emscripten_bind_MetadataQuerier_HasIntEntry_2"]=asm["_emscripten_bind_MetadataQuerier_HasIntEntry_2"];var _emscripten_bind_MetadataQuerier_HasStringEntry_2=Module["_emscripten_bind_MetadataQuerier_HasStringEntry_2"]=asm["_emscripten_bind_MetadataQuerier_HasStringEntry_2"];var _emscripten_bind_MetadataQuerier_MetadataQuerier_0=Module["_emscripten_bind_MetadataQuerier_MetadataQuerier_0"]=asm["_emscripten_bind_MetadataQuerier_MetadataQuerier_0"];var _emscripten_bind_MetadataQuerier_NumEntries_1=Module["_emscripten_bind_MetadataQuerier_NumEntries_1"]=asm["_emscripten_bind_MetadataQuerier_NumEntries_1"];var _emscripten_bind_MetadataQuerier___destroy___0=Module["_emscripten_bind_MetadataQuerier___destroy___0"]=asm["_emscripten_bind_MetadataQuerier___destroy___0"];var _emscripten_bind_Metadata_Metadata_0=Module["_emscripten_bind_Metadata_Metadata_0"]=asm["_emscripten_bind_Metadata_Metadata_0"];var _emscripten_bind_Metadata___destroy___0=Module["_emscripten_bind_Metadata___destroy___0"]=asm["_emscripten_bind_Metadata___destroy___0"];var _emscripten_bind_PointAttribute_GetAttributeTransformData_0=Module["_emscripten_bind_PointAttribute_GetAttributeTransformData_0"]=asm["_emscripten_bind_PointAttribute_GetAttributeTransformData_0"];var _emscripten_bind_PointAttribute_PointAttribute_0=Module["_emscripten_bind_PointAttribute_PointAttribute_0"]=asm["_emscripten_bind_PointAttribute_PointAttribute_0"];var _emscripten_bind_PointAttribute___destroy___0=Module["_emscripten_bind_PointAttribute___destroy___0"]=asm["_emscripten_bind_PointAttribute___destroy___0"];var _emscripten_bind_PointAttribute_attribute_type_0=Module["_emscripten_bind_PointAttribute_attribute_type_0"]=asm["_emscripten_bind_PointAttribute_attribute_type_0"];var _emscripten_bind_PointAttribute_byte_offset_0=Module["_emscripten_bind_PointAttribute_byte_offset_0"]=asm["_emscripten_bind_PointAttribute_byte_offset_0"];var _emscripten_bind_PointAttribute_byte_stride_0=Module["_emscripten_bind_PointAttribute_byte_stride_0"]=asm["_emscripten_bind_PointAttribute_byte_stride_0"];var _emscripten_bind_PointAttribute_data_type_0=Module["_emscripten_bind_PointAttribute_data_type_0"]=asm["_emscripten_bind_PointAttribute_data_type_0"];var _emscripten_bind_PointAttribute_normalized_0=Module["_emscripten_bind_PointAttribute_normalized_0"]=asm["_emscripten_bind_PointAttribute_normalized_0"];var _emscripten_bind_PointAttribute_num_components_0=Module["_emscripten_bind_PointAttribute_num_components_0"]=asm["_emscripten_bind_PointAttribute_num_components_0"];var _emscripten_bind_PointAttribute_size_0=Module["_emscripten_bind_PointAttribute_size_0"]=asm["_emscripten_bind_PointAttribute_size_0"];var _emscripten_bind_PointAttribute_unique_id_0=Module["_emscripten_bind_PointAttribute_unique_id_0"]=asm["_emscripten_bind_PointAttribute_unique_id_0"];var _emscripten_bind_PointCloud_PointCloud_0=Module["_emscripten_bind_PointCloud_PointCloud_0"]=asm["_emscripten_bind_PointCloud_PointCloud_0"];var _emscripten_bind_PointCloud___destroy___0=Module["_emscripten_bind_PointCloud___destroy___0"]=asm["_emscripten_bind_PointCloud___destroy___0"];var _emscripten_bind_PointCloud_num_attributes_0=Module["_emscripten_bind_PointCloud_num_attributes_0"]=asm["_emscripten_bind_PointCloud_num_attributes_0"];var _emscripten_bind_PointCloud_num_points_0=Module["_emscripten_bind_PointCloud_num_points_0"]=asm["_emscripten_bind_PointCloud_num_points_0"];var _emscripten_bind_Status___destroy___0=Module["_emscripten_bind_Status___destroy___0"]=asm["_emscripten_bind_Status___destroy___0"];var _emscripten_bind_Status_code_0=Module["_emscripten_bind_Status_code_0"]=asm["_emscripten_bind_Status_code_0"];var _emscripten_bind_Status_error_msg_0=Module["_emscripten_bind_Status_error_msg_0"]=asm["_emscripten_bind_Status_error_msg_0"];var _emscripten_bind_Status_ok_0=Module["_emscripten_bind_Status_ok_0"]=asm["_emscripten_bind_Status_ok_0"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=Module["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM"]=asm["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM"];var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=Module["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM"]=asm["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM"];var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=Module["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM"]=asm["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM"];var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=Module["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM"]=asm["_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM"];var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module["_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE"]=asm["_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE"];var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module["_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD"]=asm["_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD"];var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module["_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH"]=asm["_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH"];var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module["_emscripten_enum_draco_GeometryAttribute_Type_COLOR"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_COLOR"];var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module["_emscripten_enum_draco_GeometryAttribute_Type_GENERIC"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_GENERIC"];var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module["_emscripten_enum_draco_GeometryAttribute_Type_INVALID"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_INVALID"];var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module["_emscripten_enum_draco_GeometryAttribute_Type_NORMAL"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_NORMAL"];var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module["_emscripten_enum_draco_GeometryAttribute_Type_POSITION"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_POSITION"];var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module["_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD"];var _emscripten_enum_draco_StatusCode_ERROR=Module["_emscripten_enum_draco_StatusCode_ERROR"]=asm["_emscripten_enum_draco_StatusCode_ERROR"];var _emscripten_enum_draco_StatusCode_INVALID_PARAMETER=Module["_emscripten_enum_draco_StatusCode_INVALID_PARAMETER"]=asm["_emscripten_enum_draco_StatusCode_INVALID_PARAMETER"];var _emscripten_enum_draco_StatusCode_IO_ERROR=Module["_emscripten_enum_draco_StatusCode_IO_ERROR"]=asm["_emscripten_enum_draco_StatusCode_IO_ERROR"];var _emscripten_enum_draco_StatusCode_OK=Module["_emscripten_enum_draco_StatusCode_OK"]=asm["_emscripten_enum_draco_StatusCode_OK"];var _emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=Module["_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION"]=asm["_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION"];var _emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=Module["_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION"]=asm["_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=exit;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i<ensureCache.temps.length;i++){Module["_free"](ensureCache.temps[i])}ensureCache.temps.length=0;Module["_free"](ensureCache.buffer);ensureCache.buffer=0;ensureCache.size+=ensureCache.needed;ensureCache.needed=0}if(!ensureCache.buffer){ensureCache.size+=128;ensureCache.buffer=Module["_malloc"](ensureCache.size);assert(ensureCache.buffer)}ensureCache.pos=0}),alloc:(function(array,view){assert(ensureCache.buffer);var bytes=view.BYTES_PER_ELEMENT;var len=array.length*bytes;len=len+7&-8;var ret;if(ensureCache.pos+len>=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i<array.length;i++){view[offsetShifted+i]=array[i]}})};function ensureString(value){if(typeof value==="string"){var intArray=intArrayFromString(value);var offset=ensureCache.alloc(intArray,HEAP8);ensureCache.copy(intArray,HEAP8,offset);return offset}return value}function ensureInt8(value){if(typeof value==="object"){var offset=ensureCache.alloc(value,HEAP8);ensureCache.copy(value,HEAP8,offset);return offset}return value}function Status(){throw"cannot construct a Status, no constructor in IDL"}Status.prototype=Object.create(WrapperObject.prototype);Status.prototype.constructor=Status;Status.prototype.__class__=Status;Status.__cache__={};Module["Status"]=Status;Status.prototype["code"]=Status.prototype.code=(function(){var self=this.ptr;return _emscripten_bind_Status_code_0(self)});Status.prototype["ok"]=Status.prototype.ok=(function(){var self=this.ptr;return!!_emscripten_bind_Status_ok_0(self)});Status.prototype["error_msg"]=Status.prototype.error_msg=(function(){var self=this.ptr;return Pointer_stringify(_emscripten_bind_Status_error_msg_0(self))});Status.prototype["__destroy__"]=Status.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Status___destroy___0(self)});function DracoUInt16Array(){this.ptr=_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0();getCache(DracoUInt16Array)[this.ptr]=this}DracoUInt16Array.prototype=Object.create(WrapperObject.prototype);DracoUInt16Array.prototype.constructor=DracoUInt16Array;DracoUInt16Array.prototype.__class__=DracoUInt16Array;DracoUInt16Array.__cache__={};Module["DracoUInt16Array"]=DracoUInt16Array;DracoUInt16Array.prototype["GetValue"]=DracoUInt16Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoUInt16Array_GetValue_1(self,arg0)});DracoUInt16Array.prototype["size"]=DracoUInt16Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoUInt16Array_size_0(self)});DracoUInt16Array.prototype["__destroy__"]=DracoUInt16Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoUInt16Array___destroy___0(self)});function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0();getCache(PointCloud)[this.ptr]=this}PointCloud.prototype=Object.create(WrapperObject.prototype);PointCloud.prototype.constructor=PointCloud;PointCloud.prototype.__class__=PointCloud;PointCloud.__cache__={};Module["PointCloud"]=PointCloud;PointCloud.prototype["num_attributes"]=PointCloud.prototype.num_attributes=(function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_attributes_0(self)});PointCloud.prototype["num_points"]=PointCloud.prototype.num_points=(function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_points_0(self)});PointCloud.prototype["__destroy__"]=PointCloud.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointCloud___destroy___0(self)});function DracoUInt8Array(){this.ptr=_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0();getCache(DracoUInt8Array)[this.ptr]=this}DracoUInt8Array.prototype=Object.create(WrapperObject.prototype);DracoUInt8Array.prototype.constructor=DracoUInt8Array;DracoUInt8Array.prototype.__class__=DracoUInt8Array;DracoUInt8Array.__cache__={};Module["DracoUInt8Array"]=DracoUInt8Array;DracoUInt8Array.prototype["GetValue"]=DracoUInt8Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoUInt8Array_GetValue_1(self,arg0)});DracoUInt8Array.prototype["size"]=DracoUInt8Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoUInt8Array_size_0(self)});DracoUInt8Array.prototype["__destroy__"]=DracoUInt8Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoUInt8Array___destroy___0(self)});function DracoUInt32Array(){this.ptr=_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0();getCache(DracoUInt32Array)[this.ptr]=this}DracoUInt32Array.prototype=Object.create(WrapperObject.prototype);DracoUInt32Array.prototype.constructor=DracoUInt32Array;DracoUInt32Array.prototype.__class__=DracoUInt32Array;DracoUInt32Array.__cache__={};Module["DracoUInt32Array"]=DracoUInt32Array;DracoUInt32Array.prototype["GetValue"]=DracoUInt32Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoUInt32Array_GetValue_1(self,arg0)});DracoUInt32Array.prototype["size"]=DracoUInt32Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoUInt32Array_size_0(self)});DracoUInt32Array.prototype["__destroy__"]=DracoUInt32Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoUInt32Array___destroy___0(self)});function AttributeOctahedronTransform(){this.ptr=_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0();getCache(AttributeOctahedronTransform)[this.ptr]=this}AttributeOctahedronTransform.prototype=Object.create(WrapperObject.prototype);AttributeOctahedronTransform.prototype.constructor=AttributeOctahedronTransform;AttributeOctahedronTransform.prototype.__class__=AttributeOctahedronTransform;AttributeOctahedronTransform.__cache__={};Module["AttributeOctahedronTransform"]=AttributeOctahedronTransform;AttributeOctahedronTransform.prototype["InitFromAttribute"]=AttributeOctahedronTransform.prototype.InitFromAttribute=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return!!_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1(self,arg0)});AttributeOctahedronTransform.prototype["quantization_bits"]=AttributeOctahedronTransform.prototype.quantization_bits=(function(){var self=this.ptr;return _emscripten_bind_AttributeOctahedronTransform_quantization_bits_0(self)});AttributeOctahedronTransform.prototype["__destroy__"]=AttributeOctahedronTransform.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_AttributeOctahedronTransform___destroy___0(self)});function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_PointAttribute_0();getCache(PointAttribute)[this.ptr]=this}PointAttribute.prototype=Object.create(WrapperObject.prototype);PointAttribute.prototype.constructor=PointAttribute;PointAttribute.prototype.__class__=PointAttribute;PointAttribute.__cache__={};Module["PointAttribute"]=PointAttribute;PointAttribute.prototype["size"]=PointAttribute.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_size_0(self)});PointAttribute.prototype["GetAttributeTransformData"]=PointAttribute.prototype.GetAttributeTransformData=(function(){var self=this.ptr;return wrapPointer(_emscripten_bind_PointAttribute_GetAttributeTransformData_0(self),AttributeTransformData)});PointAttribute.prototype["attribute_type"]=PointAttribute.prototype.attribute_type=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_attribute_type_0(self)});PointAttribute.prototype["data_type"]=PointAttribute.prototype.data_type=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_data_type_0(self)});PointAttribute.prototype["num_components"]=PointAttribute.prototype.num_components=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_num_components_0(self)});PointAttribute.prototype["normalized"]=PointAttribute.prototype.normalized=(function(){var self=this.ptr;return!!_emscripten_bind_PointAttribute_normalized_0(self)});PointAttribute.prototype["byte_stride"]=PointAttribute.prototype.byte_stride=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_stride_0(self)});PointAttribute.prototype["byte_offset"]=PointAttribute.prototype.byte_offset=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_offset_0(self)});PointAttribute.prototype["unique_id"]=PointAttribute.prototype.unique_id=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_unique_id_0(self)});PointAttribute.prototype["__destroy__"]=PointAttribute.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointAttribute___destroy___0(self)});function AttributeTransformData(){this.ptr=_emscripten_bind_AttributeTransformData_AttributeTransformData_0();getCache(AttributeTransformData)[this.ptr]=this}AttributeTransformData.prototype=Object.create(WrapperObject.prototype);AttributeTransformData.prototype.constructor=AttributeTransformData;AttributeTransformData.prototype.__class__=AttributeTransformData;AttributeTransformData.__cache__={};Module["AttributeTransformData"]=AttributeTransformData;AttributeTransformData.prototype["transform_type"]=AttributeTransformData.prototype.transform_type=(function(){var self=this.ptr;return _emscripten_bind_AttributeTransformData_transform_type_0(self)});AttributeTransformData.prototype["__destroy__"]=AttributeTransformData.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_AttributeTransformData___destroy___0(self)});function AttributeQuantizationTransform(){this.ptr=_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0();getCache(AttributeQuantizationTransform)[this.ptr]=this}AttributeQuantizationTransform.prototype=Object.create(WrapperObject.prototype);AttributeQuantizationTransform.prototype.constructor=AttributeQuantizationTransform;AttributeQuantizationTransform.prototype.__class__=AttributeQuantizationTransform;AttributeQuantizationTransform.__cache__={};Module["AttributeQuantizationTransform"]=AttributeQuantizationTransform;AttributeQuantizationTransform.prototype["InitFromAttribute"]=AttributeQuantizationTransform.prototype.InitFromAttribute=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return!!_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1(self,arg0)});AttributeQuantizationTransform.prototype["quantization_bits"]=AttributeQuantizationTransform.prototype.quantization_bits=(function(){var self=this.ptr;return _emscripten_bind_AttributeQuantizationTransform_quantization_bits_0(self)});AttributeQuantizationTransform.prototype["min_value"]=AttributeQuantizationTransform.prototype.min_value=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_AttributeQuantizationTransform_min_value_1(self,arg0)});AttributeQuantizationTransform.prototype["range"]=AttributeQuantizationTransform.prototype.range=(function(){var self=this.ptr;return _emscripten_bind_AttributeQuantizationTransform_range_0(self)});AttributeQuantizationTransform.prototype["__destroy__"]=AttributeQuantizationTransform.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_AttributeQuantizationTransform___destroy___0(self)});function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_DracoInt8Array_0();getCache(DracoInt8Array)[this.ptr]=this}DracoInt8Array.prototype=Object.create(WrapperObject.prototype);DracoInt8Array.prototype.constructor=DracoInt8Array;DracoInt8Array.prototype.__class__=DracoInt8Array;DracoInt8Array.__cache__={};Module["DracoInt8Array"]=DracoInt8Array;DracoInt8Array.prototype["GetValue"]=DracoInt8Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoInt8Array_GetValue_1(self,arg0)});DracoInt8Array.prototype["size"]=DracoInt8Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoInt8Array_size_0(self)});DracoInt8Array.prototype["__destroy__"]=DracoInt8Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoInt8Array___destroy___0(self)});function MetadataQuerier(){this.ptr=_emscripten_bind_MetadataQuerier_MetadataQuerier_0();getCache(MetadataQuerier)[this.ptr]=this}MetadataQuerier.prototype=Object.create(WrapperObject.prototype);MetadataQuerier.prototype.constructor=MetadataQuerier;MetadataQuerier.prototype.__class__=MetadataQuerier;MetadataQuerier.__cache__={};Module["MetadataQuerier"]=MetadataQuerier;MetadataQuerier.prototype["HasEntry"]=MetadataQuerier.prototype.HasEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return!!_emscripten_bind_MetadataQuerier_HasEntry_2(self,arg0,arg1)});MetadataQuerier.prototype["HasIntEntry"]=MetadataQuerier.prototype.HasIntEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return!!_emscripten_bind_MetadataQuerier_HasIntEntry_2(self,arg0,arg1)});MetadataQuerier.prototype["GetIntEntry"]=MetadataQuerier.prototype.GetIntEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return _emscripten_bind_MetadataQuerier_GetIntEntry_2(self,arg0,arg1)});MetadataQuerier.prototype["HasDoubleEntry"]=MetadataQuerier.prototype.HasDoubleEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return!!_emscripten_bind_MetadataQuerier_HasDoubleEntry_2(self,arg0,arg1)});MetadataQuerier.prototype["GetDoubleEntry"]=MetadataQuerier.prototype.GetDoubleEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return _emscripten_bind_MetadataQuerier_GetDoubleEntry_2(self,arg0,arg1)});MetadataQuerier.prototype["HasStringEntry"]=MetadataQuerier.prototype.HasStringEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return!!_emscripten_bind_MetadataQuerier_HasStringEntry_2(self,arg0,arg1)});MetadataQuerier.prototype["GetStringEntry"]=MetadataQuerier.prototype.GetStringEntry=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return Pointer_stringify(_emscripten_bind_MetadataQuerier_GetStringEntry_2(self,arg0,arg1))});MetadataQuerier.prototype["NumEntries"]=MetadataQuerier.prototype.NumEntries=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_MetadataQuerier_NumEntries_1(self,arg0)});MetadataQuerier.prototype["GetEntryName"]=MetadataQuerier.prototype.GetEntryName=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return Pointer_stringify(_emscripten_bind_MetadataQuerier_GetEntryName_2(self,arg0,arg1))});MetadataQuerier.prototype["__destroy__"]=MetadataQuerier.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_MetadataQuerier___destroy___0(self)});function DracoInt16Array(){this.ptr=_emscripten_bind_DracoInt16Array_DracoInt16Array_0();getCache(DracoInt16Array)[this.ptr]=this}DracoInt16Array.prototype=Object.create(WrapperObject.prototype);DracoInt16Array.prototype.constructor=DracoInt16Array;DracoInt16Array.prototype.__class__=DracoInt16Array;DracoInt16Array.__cache__={};Module["DracoInt16Array"]=DracoInt16Array;DracoInt16Array.prototype["GetValue"]=DracoInt16Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoInt16Array_GetValue_1(self,arg0)});DracoInt16Array.prototype["size"]=DracoInt16Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoInt16Array_size_0(self)});DracoInt16Array.prototype["__destroy__"]=DracoInt16Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoInt16Array___destroy___0(self)});function DracoFloat32Array(){this.ptr=_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0();getCache(DracoFloat32Array)[this.ptr]=this}DracoFloat32Array.prototype=Object.create(WrapperObject.prototype);DracoFloat32Array.prototype.constructor=DracoFloat32Array;DracoFloat32Array.prototype.__class__=DracoFloat32Array;DracoFloat32Array.__cache__={};Module["DracoFloat32Array"]=DracoFloat32Array;DracoFloat32Array.prototype["GetValue"]=DracoFloat32Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoFloat32Array_GetValue_1(self,arg0)});DracoFloat32Array.prototype["size"]=DracoFloat32Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoFloat32Array_size_0(self)});DracoFloat32Array.prototype["__destroy__"]=DracoFloat32Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoFloat32Array___destroy___0(self)});function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute_GeometryAttribute_0();getCache(GeometryAttribute)[this.ptr]=this}GeometryAttribute.prototype=Object.create(WrapperObject.prototype);GeometryAttribute.prototype.constructor=GeometryAttribute;GeometryAttribute.prototype.__class__=GeometryAttribute;GeometryAttribute.__cache__={};Module["GeometryAttribute"]=GeometryAttribute;GeometryAttribute.prototype["__destroy__"]=GeometryAttribute.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_GeometryAttribute___destroy___0(self)});function DecoderBuffer(){this.ptr=_emscripten_bind_DecoderBuffer_DecoderBuffer_0();getCache(DecoderBuffer)[this.ptr]=this}DecoderBuffer.prototype=Object.create(WrapperObject.prototype);DecoderBuffer.prototype.constructor=DecoderBuffer;DecoderBuffer.prototype.__class__=DecoderBuffer;DecoderBuffer.__cache__={};Module["DecoderBuffer"]=DecoderBuffer;DecoderBuffer.prototype["Init"]=DecoderBuffer.prototype.Init=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(typeof arg0=="object"){arg0=ensureInt8(arg0)}if(arg1&&typeof arg1==="object")arg1=arg1.ptr;_emscripten_bind_DecoderBuffer_Init_2(self,arg0,arg1)});DecoderBuffer.prototype["__destroy__"]=DecoderBuffer.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DecoderBuffer___destroy___0(self)});function Decoder(){this.ptr=_emscripten_bind_Decoder_Decoder_0();getCache(Decoder)[this.ptr]=this}Decoder.prototype=Object.create(WrapperObject.prototype);Decoder.prototype.constructor=Decoder;Decoder.prototype.__class__=Decoder;Decoder.__cache__={};Module["Decoder"]=Decoder;Decoder.prototype["GetEncodedGeometryType"]=Decoder.prototype.GetEncodedGeometryType=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_Decoder_GetEncodedGeometryType_1(self,arg0)});Decoder.prototype["DecodeBufferToPointCloud"]=Decoder.prototype.DecodeBufferToPointCloud=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeBufferToPointCloud_2(self,arg0,arg1),Status)});Decoder.prototype["DecodeBufferToMesh"]=Decoder.prototype.DecodeBufferToMesh=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeBufferToMesh_2(self,arg0,arg1),Status)});Decoder.prototype["GetAttributeId"]=Decoder.prototype.GetAttributeId=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return _emscripten_bind_Decoder_GetAttributeId_2(self,arg0,arg1)});Decoder.prototype["GetAttributeIdByName"]=Decoder.prototype.GetAttributeIdByName=(function(arg0,arg1){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);return _emscripten_bind_Decoder_GetAttributeIdByName_2(self,arg0,arg1)});Decoder.prototype["GetAttributeIdByMetadataEntry"]=Decoder.prototype.GetAttributeIdByMetadataEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2==="object")arg2=arg2.ptr;else arg2=ensureString(arg2);return _emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttribute"]=Decoder.prototype.GetAttribute=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttribute_2(self,arg0,arg1),PointAttribute)});Decoder.prototype["GetAttributeByUniqueId"]=Decoder.prototype.GetAttributeByUniqueId=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttributeByUniqueId_2(self,arg0,arg1),PointAttribute)});Decoder.prototype["GetMetadata"]=Decoder.prototype.GetMetadata=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return wrapPointer(_emscripten_bind_Decoder_GetMetadata_1(self,arg0),Metadata)});Decoder.prototype["GetAttributeMetadata"]=Decoder.prototype.GetAttributeMetadata=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttributeMetadata_2(self,arg0,arg1),Metadata)});Decoder.prototype["GetFaceFromMesh"]=Decoder.prototype.GetFaceFromMesh=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetFaceFromMesh_3(self,arg0,arg1,arg2)});Decoder.prototype["GetTriangleStripsFromMesh"]=Decoder.prototype.GetTriangleStripsFromMesh=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;return _emscripten_bind_Decoder_GetTriangleStripsFromMesh_2(self,arg0,arg1)});Decoder.prototype["GetAttributeFloat"]=Decoder.prototype.GetAttributeFloat=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeFloat_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeFloatForAllPoints"]=Decoder.prototype.GetAttributeFloatForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeIntForAllPoints"]=Decoder.prototype.GetAttributeIntForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeInt8ForAllPoints"]=Decoder.prototype.GetAttributeInt8ForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeUInt8ForAllPoints"]=Decoder.prototype.GetAttributeUInt8ForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeInt16ForAllPoints"]=Decoder.prototype.GetAttributeInt16ForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeUInt16ForAllPoints"]=Decoder.prototype.GetAttributeUInt16ForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeInt32ForAllPoints"]=Decoder.prototype.GetAttributeInt32ForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["GetAttributeUInt32ForAllPoints"]=Decoder.prototype.GetAttributeUInt32ForAllPoints=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;if(arg1&&typeof arg1==="object")arg1=arg1.ptr;if(arg2&&typeof arg2==="object")arg2=arg2.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3(self,arg0,arg1,arg2)});Decoder.prototype["SkipAttributeTransform"]=Decoder.prototype.SkipAttributeTransform=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;_emscripten_bind_Decoder_SkipAttributeTransform_1(self,arg0)});Decoder.prototype["__destroy__"]=Decoder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Decoder___destroy___0(self)});function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[this.ptr]=this}Mesh.prototype=Object.create(WrapperObject.prototype);Mesh.prototype.constructor=Mesh;Mesh.prototype.__class__=Mesh;Mesh.__cache__={};Module["Mesh"]=Mesh;Mesh.prototype["num_faces"]=Mesh.prototype.num_faces=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_faces_0(self)});Mesh.prototype["num_attributes"]=Mesh.prototype.num_attributes=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_attributes_0(self)});Mesh.prototype["num_points"]=Mesh.prototype.num_points=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_points_0(self)});Mesh.prototype["__destroy__"]=Mesh.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Mesh___destroy___0(self)});function VoidPtr(){throw"cannot construct a VoidPtr, no constructor in IDL"}VoidPtr.prototype=Object.create(WrapperObject.prototype);VoidPtr.prototype.constructor=VoidPtr;VoidPtr.prototype.__class__=VoidPtr;VoidPtr.__cache__={};Module["VoidPtr"]=VoidPtr;VoidPtr.prototype["__destroy__"]=VoidPtr.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_VoidPtr___destroy___0(self)});function DracoInt32Array(){this.ptr=_emscripten_bind_DracoInt32Array_DracoInt32Array_0();getCache(DracoInt32Array)[this.ptr]=this}DracoInt32Array.prototype=Object.create(WrapperObject.prototype);DracoInt32Array.prototype.constructor=DracoInt32Array;DracoInt32Array.prototype.__class__=DracoInt32Array;DracoInt32Array.__cache__={};Module["DracoInt32Array"]=DracoInt32Array;DracoInt32Array.prototype["GetValue"]=DracoInt32Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0==="object")arg0=arg0.ptr;return _emscripten_bind_DracoInt32Array_GetValue_1(self,arg0)});DracoInt32Array.prototype["size"]=DracoInt32Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoInt32Array_size_0(self)});DracoInt32Array.prototype["__destroy__"]=DracoInt32Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoInt32Array___destroy___0(self)});function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getCache(Metadata)[this.ptr]=this}Metadata.prototype=Object.create(WrapperObject.prototype);Metadata.prototype.constructor=Metadata;Metadata.prototype.__class__=Metadata;Metadata.__cache__={};Module["Metadata"]=Metadata;Metadata.prototype["__destroy__"]=Metadata.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Metadata___destroy___0(self)});((function(){function setupEnums(){Module["OK"]=_emscripten_enum_draco_StatusCode_OK();Module["ERROR"]=_emscripten_enum_draco_StatusCode_ERROR();Module["IO_ERROR"]=_emscripten_enum_draco_StatusCode_IO_ERROR();Module["INVALID_PARAMETER"]=_emscripten_enum_draco_StatusCode_INVALID_PARAMETER();Module["UNSUPPORTED_VERSION"]=_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION();Module["UNKNOWN_VERSION"]=_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION();Module["INVALID_GEOMETRY_TYPE"]=_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE();Module["POINT_CLOUD"]=_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD();Module["TRIANGULAR_MESH"]=_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH();Module["ATTRIBUTE_INVALID_TRANSFORM"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM();Module["ATTRIBUTE_NO_TRANSFORM"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM();Module["ATTRIBUTE_QUANTIZATION_TRANSFORM"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM();Module["ATTRIBUTE_OCTAHEDRON_TRANSFORM"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM();Module["INVALID"]=_emscripten_enum_draco_GeometryAttribute_Type_INVALID();Module["POSITION"]=_emscripten_enum_draco_GeometryAttribute_Type_POSITION();Module["NORMAL"]=_emscripten_enum_draco_GeometryAttribute_Type_NORMAL();Module["COLOR"]=_emscripten_enum_draco_GeometryAttribute_Type_COLOR();Module["TEX_COORD"]=_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD();Module["GENERIC"]=_emscripten_enum_draco_GeometryAttribute_Type_GENERIC()}if(Module["calledRun"])setupEnums();else addOnPreMain(setupEnums)}))();if(typeof Module["onModuleParsed"]==="function"){Module["onModuleParsed"]()} + + + + + + + return DracoDecoderModule; +}; +if (typeof exports === 'object' && typeof module === 'object') + module.exports = DracoDecoderModule; + else if (typeof define === 'function' && define['amd']) + define([], function() { return DracoDecoderModule; }); + else if (typeof exports === 'object') + exports["DracoDecoderModule"] = DracoDecoderModule; + \ No newline at end of file diff --git a/web/assets/Cesium/ThirdParty/Workers/draco_wasm_wrapper.js b/web/assets/Cesium/ThirdParty/Workers/draco_wasm_wrapper.js new file mode 100644 index 00000000..d31d270a --- /dev/null +++ b/web/assets/Cesium/ThirdParty/Workers/draco_wasm_wrapper.js @@ -0,0 +1,129 @@ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(d,f,n){d!=Array.prototype&&d!=Object.prototype&&(d[f]=n.value)};$jscomp.getGlobal=function(d){return"undefined"!=typeof window&&window===d?d:"undefined"!=typeof global&&null!=global?global:d};$jscomp.global=$jscomp.getGlobal(this); +$jscomp.polyfill=function(d,f,n,w){if(f){n=$jscomp.global;d=d.split(".");for(w=0;w<d.length-1;w++){var g=d[w];g in n||(n[g]={});n=n[g]}d=d[d.length-1];w=n[d];f=f(w);f!=w&&null!=f&&$jscomp.defineProperty(n,d,{configurable:!0,writable:!0,value:f})}};$jscomp.polyfill("Math.imul",function(d){return d?d:function(f,d){f=Number(f);d=Number(d);var n=f&65535,g=d&65535;return n*g+((f>>>16&65535)*g+n*(d>>>16&65535)<<16>>>0)|0}},"es6","es3"); +$jscomp.polyfill("Math.clz32",function(d){return d?d:function(f){f=Number(f)>>>0;if(0===f)return 32;var d=0;0===(f&4294901760)&&(f<<=16,d+=16);0===(f&4278190080)&&(f<<=8,d+=8);0===(f&4026531840)&&(f<<=4,d+=4);0===(f&3221225472)&&(f<<=2,d+=2);0===(f&2147483648)&&d++;return d}},"es6","es3");$jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var f=Math.floor(Math.abs(d));return 0>d?-f:f}},"es6","es3"); +$jscomp.SYMBOL_PREFIX="jscomp_symbol_";$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(d){return $jscomp.SYMBOL_PREFIX+(d||"")+$jscomp.symbolCounter_++}; +$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var d=$jscomp.global.Symbol.iterator;d||(d=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[d]&&$jscomp.defineProperty(Array.prototype,d,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(d){var f=0;return $jscomp.iteratorPrototype(function(){return f<d.length?{done:!1,value:d[f++]}:{done:!0}})}; +$jscomp.iteratorPrototype=function(d){$jscomp.initSymbolIterator();d={next:d};d[$jscomp.global.Symbol.iterator]=function(){return this};return d};$jscomp.makeIterator=function(d){$jscomp.initSymbolIterator();var f=d[Symbol.iterator];return f?f.call(d):$jscomp.arrayIterator(d)};$jscomp.FORCE_POLYFILL_PROMISE=!1; +$jscomp.polyfill("Promise",function(d){function f(){this.batch_=null}function n(d){return d instanceof g?d:new g(function(f,D){f(d)})}if(d&&!$jscomp.FORCE_POLYFILL_PROMISE)return d;f.prototype.asyncExecute=function(d){null==this.batch_&&(this.batch_=[],this.asyncExecuteBatch_());this.batch_.push(d);return this};f.prototype.asyncExecuteBatch_=function(){var d=this;this.asyncExecuteFunction(function(){d.executeBatch_()})};var w=$jscomp.global.setTimeout;f.prototype.asyncExecuteFunction=function(d){w(d, +0)};f.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var d=this.batch_;this.batch_=[];for(var f=0;f<d.length;++f){var g=d[f];delete d[f];try{g()}catch(la){this.asyncThrow_(la)}}}this.batch_=null};f.prototype.asyncThrow_=function(d){this.asyncExecuteFunction(function(){throw d;})};var g=function(d){this.state_=0;this.result_=void 0;this.onSettledCallbacks_=[];var f=this.createResolveAndReject_();try{d(f.resolve,f.reject)}catch(u){f.reject(u)}};g.prototype.createResolveAndReject_= +function(){function d(d){return function(D){g||(g=!0,d.call(f,D))}}var f=this,g=!1;return{resolve:d(this.resolveTo_),reject:d(this.reject_)}};g.prototype.resolveTo_=function(d){if(d===this)this.reject_(new TypeError("A Promise cannot resolve to itself"));else if(d instanceof g)this.settleSameAsPromise_(d);else{a:switch(typeof d){case "object":var f=null!=d;break a;case "function":f=!0;break a;default:f=!1}f?this.resolveToNonPromiseObj_(d):this.fulfill_(d)}};g.prototype.resolveToNonPromiseObj_=function(d){var f= +void 0;try{f=d.then}catch(u){this.reject_(u);return}"function"==typeof f?this.settleSameAsThenable_(f,d):this.fulfill_(d)};g.prototype.reject_=function(d){this.settle_(2,d)};g.prototype.fulfill_=function(d){this.settle_(1,d)};g.prototype.settle_=function(d,f){if(0!=this.state_)throw Error("Cannot settle("+d+", "+f|"): Promise already settled in state"+this.state_);this.state_=d;this.result_=f;this.executeOnSettledCallbacks_()};g.prototype.executeOnSettledCallbacks_=function(){if(null!=this.onSettledCallbacks_){for(var d= +this.onSettledCallbacks_,f=0;f<d.length;++f)d[f].call(),d[f]=null;this.onSettledCallbacks_=null}};var ma=new f;g.prototype.settleSameAsPromise_=function(d){var f=this.createResolveAndReject_();d.callWhenSettled_(f.resolve,f.reject)};g.prototype.settleSameAsThenable_=function(d,f){var g=this.createResolveAndReject_();try{d.call(f,g.resolve,g.reject)}catch(la){g.reject(la)}};g.prototype.then=function(d,f){function u(d,f){return"function"==typeof d?function(f){try{n(d(f))}catch(ea){D(ea)}}:f}var n,D, +w=new g(function(d,f){n=d;D=f});this.callWhenSettled_(u(d,n),u(f,D));return w};g.prototype.catch=function(d){return this.then(void 0,d)};g.prototype.callWhenSettled_=function(d,f){function g(){switch(n.state_){case 1:d(n.result_);break;case 2:f(n.result_);break;default:throw Error("Unexpected state: "+n.state_);}}var n=this;null==this.onSettledCallbacks_?ma.asyncExecute(g):this.onSettledCallbacks_.push(function(){ma.asyncExecute(g)})};g.resolve=n;g.reject=function(d){return new g(function(f,g){g(d)})}; +g.race=function(d){return new g(function(f,g){for(var u=$jscomp.makeIterator(d),w=u.next();!w.done;w=u.next())n(w.value).callWhenSettled_(f,g)})};g.all=function(d){var f=$jscomp.makeIterator(d),u=f.next();return u.done?n([]):new g(function(d,g){function w(f){return function(g){D[f]=g;Q--;0==Q&&d(D)}}var D=[],Q=0;do D.push(void 0),Q++,n(u.value).callWhenSettled_(w(D.length-1),g),u=f.next();while(!u.done)})};return g},"es6","es3"); +var DracoDecoderModule=function(d){function f(a,b){a||W("Assertion failed: "+b)}function n(e,b){if(0===b||!e)return"";for(var c=0,l,d=0;;){l=T[e+d>>0];c|=l;if(0==l&&!b)break;d++;if(b&&d==b)break}b||(b=d);l="";if(128>c){for(;0<b;)c=String.fromCharCode.apply(String,T.subarray(e,e+Math.min(b,1024))),l=l?l+c:c,e+=1024,b-=1024;return l}return a.UTF8ToString(e)}function w(a){return a.replace(/__Z[\w\d_]+/g,function(a){return a===a?a:a+" ["+a+"]"})}function g(){a:{var e=Error();if(!e.stack){try{throw Error(0); +}catch(b){e=b}if(!e.stack){e="(no stack trace available)";break a}}e=e.stack.toString()}a.extraStackTrace&&(e+="\n"+a.extraStackTrace());return w(e)}function ma(a,b){0<a%b&&(a+=b-a%b);return a}function D(){a.HEAP8=fa=new Int8Array(F);a.HEAP16=za=new Int16Array(F);a.HEAP32=x=new Int32Array(F);a.HEAPU8=T=new Uint8Array(F);a.HEAPU16=Oa=new Uint16Array(F);a.HEAPU32=Pa=new Uint32Array(F);a.HEAPF32=Qa=new Float32Array(F);a.HEAPF64=Ra=new Float64Array(F)}function Ma(){var e=a.usingWasm?Aa:Sa,b=2147483648- +e;if(x[ba>>2]>b)return!1;var c=y;for(y=Math.max(y,ib);y<x[ba>>2];)y=536870912>=y?ma(2*y,e):Math.min(ma((3*y+2147483648)/4,e),b);e=a.reallocBuffer(y);if(!e||e.byteLength!=y)return y=c,!1;a.buffer=F=e;D();return!0}function u(e){for(;0<e.length;){var b=e.shift();if("function"==typeof b)b();else{var c=b.func;"number"===typeof c?void 0===b.arg?a.dynCall_v(c):a.dynCall_vi(c,b.arg):c(void 0===b.arg?null:b.arg)}}}function la(e){ha++;a.monitorRunDependencies&&a.monitorRunDependencies(ha)}function Na(e){ha--; +a.monitorRunDependencies&&a.monitorRunDependencies(ha);0==ha&&(null!==Ba&&(clearInterval(Ba),Ba=null),sa&&(e=sa,sa=null,e()))}function na(){return!!na.uncaught_exception}function qa(){var e=A.last;if(!e)return(m.setTempRet0(0),0)|0;var b=A.infos[e],c=b.type;if(!c)return(m.setTempRet0(0),e)|0;var l=Array.prototype.slice.call(arguments);a.___cxa_is_pointer_type(c);qa.buffer||(qa.buffer=Ta(4));x[qa.buffer>>2]=e;e=qa.buffer;for(var d=0;d<l.length;d++)if(l[d]&&a.___cxa_can_catch(l[d],c,e))return e=x[e>> +2],b.adjusted=e,(m.setTempRet0(l[d]),e)|0;e=x[e>>2];return(m.setTempRet0(c),e)|0}function Q(e,b){v.varargs=b;try{var c=v.get(),l=v.get(),d=v.get();e=0;Q.buffer||(Q.buffers=[null,[],[]],Q.printChar=function(b,c){var e=Q.buffers[b];f(e);if(0===c||10===c){b=1===b?a.print:a.printErr;a:{for(var l=c=0;e[l];)++l;if(16<l-c&&e.subarray&&Ua)c=Ua.decode(e.subarray(c,l));else for(l="";;){var d=e[c++];if(!d){c=l;break a}if(d&128){var g=e[c++]&63;if(192==(d&224))l+=String.fromCharCode((d&31)<<6|g);else{var h=e[c++]& +63;if(224==(d&240))d=(d&15)<<12|g<<6|h;else{var E=e[c++]&63;if(240==(d&248))d=(d&7)<<18|g<<12|h<<6|E;else{var k=e[c++]&63;if(248==(d&252))d=(d&3)<<24|g<<18|h<<12|E<<6|k;else{var ta=e[c++]&63;d=(d&1)<<30|g<<24|h<<18|E<<12|k<<6|ta}}}65536>d?l+=String.fromCharCode(d):(d-=65536,l+=String.fromCharCode(55296|d>>10,56320|d&1023))}}else l+=String.fromCharCode(d)}}b(c);e.length=0}else e.push(c)});for(b=0;b<d;b++){for(var h=x[l+8*b>>2],g=x[l+(8*b+4)>>2],k=0;k<g;k++)Q.printChar(c,T[h+k]);e+=g}return e}catch(Ca){return"undefined"!== +typeof FS&&Ca instanceof FS.ErrnoError||W(Ca),-Ca.errno}}function ra(e,b){ra.seen||(ra.seen={});e in ra.seen||(a.dynCall_v(b),ra.seen[e]=1)}function ea(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}function Da(e){function b(){if(!a.calledRun&&(a.calledRun=!0,!ua)){Va||(Va=!0,u(Wa));u(Xa);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)Ya.unshift(a.postRun.shift()); +u(Ya)}}null===Za&&(Za=Date.now());if(!(0<ha)){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)$a.unshift(a.preRun.shift());u($a);0<ha||a.calledRun||(a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1);b()},1)):b())}}function W(e){if(a.onAbort)a.onAbort(e);void 0!==e?(a.print(e),a.printErr(e),e=JSON.stringify(e)):e="";ua=!0;var b="abort("+e+") at "+g()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information."; +ab&&ab.forEach(function(a){b=a(b,e)});throw b;}function p(){}function t(a){return(a||p).__cache__}function X(a,b){var c=t(b),e=c[a];if(e)return e;e=Object.create((b||p).prototype);e.ptr=a;return c[a]=e}function Y(a){if("string"===typeof a){for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++c)&1023);127>=e?++b:b=2047>=e?b+2:65535>=e?b+3:2097151>=e?b+4:67108863>=e?b+5:b+6}b=Array(b+1);c=0;e=b.length;if(0<e){e=c+e-1;for(var d=0;d<a.length;++d){var f= +a.charCodeAt(d);55296<=f&&57343>=f&&(f=65536+((f&1023)<<10)|a.charCodeAt(++d)&1023);if(127>=f){if(c>=e)break;b[c++]=f}else{if(2047>=f){if(c+1>=e)break;b[c++]=192|f>>6}else{if(65535>=f){if(c+2>=e)break;b[c++]=224|f>>12}else{if(2097151>=f){if(c+3>=e)break;b[c++]=240|f>>18}else{if(67108863>=f){if(c+4>=e)break;b[c++]=248|f>>24}else{if(c+5>=e)break;b[c++]=252|f>>30;b[c++]=128|f>>24&63}b[c++]=128|f>>18&63}b[c++]=128|f>>12&63}b[c++]=128|f>>6&63}b[c++]=128|f&63}}b[c]=0}a=k.alloc(b,fa);k.copy(b,fa,a)}return a} +function B(){throw"cannot construct a Status, no constructor in IDL";}function G(){this.ptr=lb();t(G)[this.ptr]=this}function H(){this.ptr=mb();t(H)[this.ptr]=this}function I(){this.ptr=nb();t(I)[this.ptr]=this}function J(){this.ptr=ob();t(J)[this.ptr]=this}function K(){this.ptr=pb();t(K)[this.ptr]=this}function q(){this.ptr=qb();t(q)[this.ptr]=this}function P(){this.ptr=rb();t(P)[this.ptr]=this}function z(){this.ptr=sb();t(z)[this.ptr]=this}function L(){this.ptr=tb();t(L)[this.ptr]=this}function r(){this.ptr= +ub();t(r)[this.ptr]=this}function M(){this.ptr=vb();t(M)[this.ptr]=this}function N(){this.ptr=wb();t(N)[this.ptr]=this}function Z(){this.ptr=xb();t(Z)[this.ptr]=this}function R(){this.ptr=yb();t(R)[this.ptr]=this}function h(){this.ptr=zb();t(h)[this.ptr]=this}function C(){this.ptr=Ab();t(C)[this.ptr]=this}function ca(){throw"cannot construct a VoidPtr, no constructor in IDL";}function O(){this.ptr=Bb();t(O)[this.ptr]=this}function S(){this.ptr=Cb();t(S)[this.ptr]=this}var a=d=d||{},bb=!1,cb=!1;a.onRuntimeInitialized= +function(){bb=!0;if(cb&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){cb=!0;if(bb&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(a){if("string"!==typeof a)return!1;a=a.split(".");return 2>a.length||3<a.length?!1:1==a[0]&&0<=a[1]&&3>=a[1]?!0:0!=a[0]||10<a[1]?!1:!0};a||(a=("undefined"!==typeof d?d:null)||{});var va={},da;for(da in a)a.hasOwnProperty(da)&&(va[da]=a[da]);var oa=!1,ka=!1,pa=!1,wa=!1;if(a.ENVIRONMENT)if("WEB"=== +a.ENVIRONMENT)oa=!0;else if("WORKER"===a.ENVIRONMENT)ka=!0;else if("NODE"===a.ENVIRONMENT)pa=!0;else if("SHELL"===a.ENVIRONMENT)wa=!0;else throw Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else oa="object"===typeof window,ka="function"===typeof importScripts,pa="object"===typeof process&&"function"===typeof require&&!oa&&!ka,wa=!oa&&!pa&&!ka;if(pa){a.print||(a.print=console.log);a.printErr||(a.printErr=console.warn);var Ea,Fa;a.read=function(a, +b){Ea||(Ea=require("fs"));Fa||(Fa=require("path"));a=Fa.normalize(a);a=Ea.readFileSync(a);return b?a:a.toString()};a.readBinary=function(e){e=a.read(e,!0);e.buffer||(e=new Uint8Array(e));f(e.buffer);return e};a.thisProgram||(a.thisProgram=1<process.argv.length?process.argv[1].replace(/\\/g,"/"):"unknown-program");a.arguments=process.argv.slice(2);process.on("uncaughtException",function(a){if(!(a instanceof ea))throw a;});a.inspect=function(){return"[Emscripten Module object]"}}else if(wa)a.print|| +(a.print=print),"undefined"!=typeof printErr&&(a.printErr=printErr),a.read="undefined"!=typeof read?function(a){return read(a)}:function(){throw"no read() available";},a.readBinary=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");f("object"===typeof a);return a},"undefined"!=typeof scriptArgs?a.arguments=scriptArgs:"undefined"!=typeof arguments&&(a.arguments=arguments),"function"===typeof quit&&(a.quit=function(a,b){quit(a)});else if(oa||ka)a.read= +function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},ka&&(a.readBinary=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),a.readAsync=function(a,b,c){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200==e.status||0==e.status&&e.response?b(e.response):c()};e.onerror=c;e.send(null)},"undefined"!=typeof arguments&&(a.arguments=arguments), +"undefined"!==typeof console?(a.print||(a.print=function(a){console.log(a)}),a.printErr||(a.printErr=function(a){console.warn(a)})):a.print||(a.print=function(a){}),"undefined"===typeof a.setWindowTitle&&(a.setWindowTitle=function(a){document.title=a});else throw Error("Unknown runtime environment. Where are we?");a.print||(a.print=function(){});a.printErr||(a.printErr=a.print);a.arguments||(a.arguments=[]);a.thisProgram||(a.thisProgram="./this.program");a.quit||(a.quit=function(a,b){throw b;});a.print= +a.print;a.printErr=a.printErr;a.preRun=[];a.postRun=[];for(da in va)va.hasOwnProperty(da)&&(a[da]=va[da]);va=void 0;var m={setTempRet0:function(a){return tempRet0=a},getTempRet0:function(){return tempRet0},stackSave:function(){return U},stackRestore:function(a){U=a},getNativeTypeSize:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?m.QUANTUM_SIZE:"i"===a[0]? +(a=parseInt(a.substr(1)),f(0===a%8),a/8):0}},getNativeFieldSize:function(a){return Math.max(m.getNativeTypeSize(a),m.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(a,b){"double"===b||"i64"===b?a&7&&(f(4===(a&7)),a+=4):f(0===(a&3));return a},getAlignSize:function(a,b,c){return c||"i64"!=a&&"double"!=a?a?Math.min(b||(a?m.getNativeFieldSize(a):0),m.QUANTUM_SIZE):Math.min(b,8):8},dynCall:function(e,b,c){return c&&c.length?a["dynCall_"+e].apply(null,[b].concat(c)):a["dynCall_"+e].call(null,b)},functionPointers:[], +addFunction:function(a){for(var b=0;b<m.functionPointers.length;b++)if(!m.functionPointers[b])return m.functionPointers[b]=a,2*(1+b);throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.";},removeFunction:function(a){m.functionPointers[(a-2)/2]=null},warnOnce:function(e){m.warnOnce.shown||(m.warnOnce.shown={});m.warnOnce.shown[e]||(m.warnOnce.shown[e]=1,a.printErr(e))},funcWrappers:{},getFuncWrapper:function(a,b){if(a){f(b);m.funcWrappers[b]||(m.funcWrappers[b]= +{});var c=m.funcWrappers[b];c[a]||(c[a]=1===b.length?function(){return m.dynCall(b,a)}:2===b.length?function(c){return m.dynCall(b,a,[c])}:function(){return m.dynCall(b,a,Array.prototype.slice.call(arguments))});return c[a]}},getCompilerSetting:function(a){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work";},stackAlloc:function(a){var b=U;U=U+a|0;U=U+15&-16;return b},staticAlloc:function(a){var b=aa;aa=aa+a|0;aa=aa+15& +-16;return b},dynamicAlloc:function(a){var b=x[ba>>2];a=(b+a+15|0)&-16;x[ba>>2]=a;return a>=y&&!Ma()?(x[ba>>2]=b,0):b},alignMemory:function(a,b){return Math.ceil(a/(b?b:16))*(b?b:16)},makeBigInt:function(a,b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0},ua=0,Ua="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;"undefined"!==typeof TextDecoder&&new TextDecoder("utf-16le");var Aa=65536,Sa=16777216,ib=16777216,fa,T,za, +Oa,x,Pa,Qa,Ra,aa,Ga,U,xa,Ha,ba;var Ia=aa=Ga=U=xa=Ha=ba=0;a.reallocBuffer||(a.reallocBuffer=function(a){try{if(ArrayBuffer.transfer)var b=ArrayBuffer.transfer(F,a);else{var c=fa;b=new ArrayBuffer(a);(new Int8Array(b)).set(c)}}catch(l){return!1}return Db(b)?b:!1});try{var Ja=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);Ja(new ArrayBuffer(4))}catch(e){Ja=function(a){return a.byteLength}}var Ka=a.TOTAL_STACK||5242880,y=a.TOTAL_MEMORY||16777216; +y<Ka&&a.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+y+"! (TOTAL_STACK="+Ka+")");if(a.buffer)var F=a.buffer;else"object"===typeof WebAssembly&&"function"===typeof WebAssembly.Memory?(a.wasmMemory=new WebAssembly.Memory({initial:y/Aa}),F=a.wasmMemory.buffer):F=new ArrayBuffer(y);D();x[0]=1668509029;za[1]=25459;if(115!==T[2]||99!==T[3])throw"Runtime error: expected the system to be little-endian!";a.HEAP=void 0;a.buffer=F;a.HEAP8=fa;a.HEAP16=za;a.HEAP32=x;a.HEAPU8=T;a.HEAPU16=Oa; +a.HEAPU32=Pa;a.HEAPF32=Qa;a.HEAPF64=Ra;var $a=[],Wa=[],Xa=[],db=[],Ya=[],Va=!1;f(Math.imul&&Math.fround&&Math.clz32&&Math.trunc,"this is a legacy browser, build with LEGACY_VM_SUPPORT");var ha=0,Ba=null,sa=null;a.preloadedImages={};a.preloadedAudios={};var V=null;(function(){function e(){try{if(a.wasmBinary)return new Uint8Array(a.wasmBinary);if(a.readBinary)return a.readBinary(d);throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"; +}catch(jb){W(jb)}}function b(){return a.wasmBinary||!oa&&!ka||"function"!==typeof fetch?new Promise(function(a,b){a(e())}):fetch(d,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+d+"'";return a.arrayBuffer()}).catch(function(){return e()})}function c(c,e,l){function f(b,c){h=b.exports;if(h.memory){b=h.memory;c=a.buffer;b.byteLength<c.byteLength&&a.printErr("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here"); +c=new Int8Array(c);var e=new Int8Array(b);V||c.set(e.subarray(a.STATIC_BASE,a.STATIC_BASE+a.STATIC_BUMP),a.STATIC_BASE);e.set(c);a.buffer=F=b;D()}a.asm=h;a.usingWasm=!0;Na("wasm-instantiate")}function E(a){f(a.instance,a.module)}function k(c){b().then(function(a){return WebAssembly.instantiate(a,g)}).then(c).catch(function(b){a.printErr("failed to asynchronously prepare wasm: "+b);W(b)})}if("object"!==typeof WebAssembly)return a.printErr("no native wasm support detected"),!1;if(!(a.wasmMemory instanceof +WebAssembly.Memory))return a.printErr("no native wasm Memory in use"),!1;e.memory=a.wasmMemory;g.global={NaN:NaN,Infinity:Infinity};g["global.Math"]=c.Math;g.env=e;la("wasm-instantiate");if(a.instantiateWasm)try{return a.instantiateWasm(g,f)}catch(kb){return a.printErr("Module.instantiateWasm callback failed with error: "+kb),!1}a.wasmBinary||"function"!==typeof WebAssembly.instantiateStreaming||0===d.indexOf("data:")||"function"!==typeof fetch?k(E):WebAssembly.instantiateStreaming(fetch(d,{credentials:"same-origin"}), +g).then(E).catch(function(b){a.printErr("wasm streaming compile failed: "+b);a.printErr("falling back to ArrayBuffer instantiation");k(E)});return{}}var d="draco_decoder.wasm",f="draco_decoder.temp.asm.js";"function"===typeof a.locateFile&&(a.locateFile("draco_decoder.wast"),d=a.locateFile(d),f=a.locateFile(f));var g={global:null,env:null,asm2wasm:{"f64-rem":function(a,b){return a%b},"debugger":function(){debugger}},parent:a},h=null;a.asmPreload=a.asm;var k=a.reallocBuffer;a.reallocBuffer=function(b){if("asmjs"=== +m)var c=k(b);else a:{b=ma(b,a.usingWasm?Aa:Sa);var e=a.buffer.byteLength;if(a.usingWasm)try{c=-1!==a.wasmMemory.grow((b-e)/65536)?a.buffer=a.wasmMemory.buffer:null;break a}catch(Jd){c=null;break a}c=void 0}return c};var m="";a.asm=function(b,e,d){if(!e.table){var l=a.wasmTableSize;void 0===l&&(l=1024);var f=a.wasmMaxTableSize;e.table="object"===typeof WebAssembly&&"function"===typeof WebAssembly.Table?void 0!==f?new WebAssembly.Table({initial:l,maximum:f,element:"anyfunc"}):new WebAssembly.Table({initial:l, +element:"anyfunc"}):Array(l);a.wasmTable=e.table}e.memoryBase||(e.memoryBase=a.STATIC_BASE);e.tableBase||(e.tableBase=0);(b=c(b,e,d))||W("no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods");return b}})();Ia=m.GLOBAL_BASE;aa=Ia+19104;Wa.push();V=null;a.STATIC_BASE=Ia;a.STATIC_BUMP=19104;var Eb=aa;aa+=16;var A={last:0,caught:[],infos:{},deAdjust:function(a){if(!a||A.infos[a])return a; +for(var b in A.infos)if(A.infos[b].adjusted===a)return b;return a},addRef:function(a){a&&A.infos[a].refcount++},decRef:function(e){if(e){var b=A.infos[e];f(0<b.refcount);b.refcount--;0!==b.refcount||b.rethrown||(b.destructor&&a.dynCall_vi(b.destructor,e),delete A.infos[e],___cxa_free_exception(e))}},clearRef:function(a){a&&(A.infos[a].refcount=0)}},v={varargs:0,get:function(a){v.varargs+=4;return x[v.varargs-4>>2]},getStr:function(){return n(v.get())},get64:function(){var a=v.get(),b=v.get();0<=a? +f(0===b):f(-1===b);return a},getZero:function(){f(0===v.get())}},ya={},La=1;db.push(function(){var e=a._fflush;e&&e(0);if(e=Q.printChar){var b=Q.buffers;b[1].length&&e(1,10);b[2].length&&e(2,10)}});ba=m.staticAlloc(4);Ga=U=m.alignMemory(aa);xa=Ga+Ka;Ha=m.alignMemory(xa);x[ba>>2]=Ha;a.wasmTableSize=492;a.wasmMaxTableSize=492;a.asmGlobalArg={Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array, +Float64Array:Float64Array,NaN:NaN,Infinity:Infinity,byteLength:Ja};a.asmLibraryArg={abort:W,assert:f,enlargeMemory:Ma,getTotalMemory:function(){return y},abortOnCannotGrowMemory:function(){W("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+y+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}, +invoke_ii:function(e,b){try{return a.dynCall_ii(e,b)}catch(c){if("number"!==typeof c&&"longjmp"!==c)throw c;a.setThrew(1,0)}},invoke_iii:function(e,b,c){try{return a.dynCall_iii(e,b,c)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;a.setThrew(1,0)}},invoke_iiii:function(e,b,c,d){try{return a.dynCall_iiii(e,b,c,d)}catch(E){if("number"!==typeof E&&"longjmp"!==E)throw E;a.setThrew(1,0)}},invoke_iiiiiii:function(e,b,c,d,f,g,h){try{return a.dynCall_iiiiiii(e,b,c,d,f,g,h)}catch(ja){if("number"!== +typeof ja&&"longjmp"!==ja)throw ja;a.setThrew(1,0)}},invoke_v:function(e){try{a.dynCall_v(e)}catch(b){if("number"!==typeof b&&"longjmp"!==b)throw b;a.setThrew(1,0)}},invoke_vi:function(e,b){try{a.dynCall_vi(e,b)}catch(c){if("number"!==typeof c&&"longjmp"!==c)throw c;a.setThrew(1,0)}},invoke_vii:function(e,b,c){try{a.dynCall_vii(e,b,c)}catch(l){if("number"!==typeof l&&"longjmp"!==l)throw l;a.setThrew(1,0)}},invoke_viii:function(e,b,c,d){try{a.dynCall_viii(e,b,c,d)}catch(E){if("number"!==typeof E&& +"longjmp"!==E)throw E;a.setThrew(1,0)}},invoke_viiii:function(e,b,c,d,f){try{a.dynCall_viiii(e,b,c,d,f)}catch(ta){if("number"!==typeof ta&&"longjmp"!==ta)throw ta;a.setThrew(1,0)}},invoke_viiiii:function(e,b,c,d,f,g){try{a.dynCall_viiiii(e,b,c,d,f,g)}catch(ia){if("number"!==typeof ia&&"longjmp"!==ia)throw ia;a.setThrew(1,0)}},invoke_viiiiii:function(e,b,c,d,f,g,h){try{a.dynCall_viiiiii(e,b,c,d,f,g,h)}catch(ja){if("number"!==typeof ja&&"longjmp"!==ja)throw ja;a.setThrew(1,0)}},__ZSt18uncaught_exceptionv:na, +___cxa_allocate_exception:function(a){return Ta(a)},___cxa_begin_catch:function(a){var b=A.infos[a];b&&!b.caught&&(b.caught=!0,na.uncaught_exception--);b&&(b.rethrown=!1);A.caught.push(a);A.addRef(A.deAdjust(a));return a},___cxa_find_matching_catch:qa,___cxa_pure_virtual:function(){ua=!0;throw"Pure virtual function called!";},___cxa_throw:function(a,b,c){A.infos[a]={ptr:a,adjusted:a,type:b,destructor:c,refcount:0,caught:!1,rethrown:!1};A.last=a;"uncaught_exception"in na?na.uncaught_exception++:na.uncaught_exception= +1;throw a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";},___gxx_personality_v0:function(){},___resumeException:function(a){A.last||(A.last=a);throw a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";},___setErrNo:function(e){a.___errno_location&&(x[a.___errno_location()>>2]=e);return e}, +___syscall140:function(a,b){v.varargs=b;try{var c=v.getStreamFromFD();v.get();var e=v.get(),d=v.get(),f=v.get();FS.llseek(c,e,f);x[d>>2]=c.position;c.getdents&&0===e&&0===f&&(c.getdents=null);return 0}catch(ia){return"undefined"!==typeof FS&&ia instanceof FS.ErrnoError||W(ia),-ia.errno}},___syscall146:Q,___syscall54:function(a,b){v.varargs=b;return 0},___syscall6:function(a,b){v.varargs=b;try{var c=v.getStreamFromFD();FS.close(c);return 0}catch(l){return"undefined"!==typeof FS&&l instanceof FS.ErrnoError|| +W(l),-l.errno}},_abort:function(){a.abort()},_emscripten_memcpy_big:function(a,b,c){T.set(T.subarray(b,b+c),a);return a},_pthread_getspecific:function(a){return ya[a]||0},_pthread_key_create:function(a,b){if(0==a)return 22;x[a>>2]=La;ya[La]=0;La++;return 0},_pthread_once:ra,_pthread_setspecific:function(a,b){if(!(a in ya))return 22;ya[a]=b;return 0},DYNAMICTOP_PTR:ba,tempDoublePtr:Eb,ABORT:ua,STACKTOP:U,STACK_MAX:xa};var eb=a.asm(a.asmGlobalArg,a.asmLibraryArg,F);a.asm=eb;a.___cxa_can_catch=function(){return a.asm.___cxa_can_catch.apply(null, +arguments)};a.___cxa_is_pointer_type=function(){return a.asm.___cxa_is_pointer_type.apply(null,arguments)};var pb=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return a.asm._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0.apply(null,arguments)},Fb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return a.asm._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1.apply(null,arguments)}, +Gb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return a.asm._emscripten_bind_AttributeOctahedronTransform___destroy___0.apply(null,arguments)},Hb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return a.asm._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0.apply(null,arguments)},sb=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return a.asm._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0.apply(null, +arguments)},Ib=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return a.asm._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1.apply(null,arguments)},Jb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return a.asm._emscripten_bind_AttributeQuantizationTransform___destroy___0.apply(null,arguments)},Kb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return a.asm._emscripten_bind_AttributeQuantizationTransform_min_value_1.apply(null, +arguments)},Lb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return a.asm._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0.apply(null,arguments)},Mb=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return a.asm._emscripten_bind_AttributeQuantizationTransform_range_0.apply(null,arguments)},rb=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return a.asm._emscripten_bind_AttributeTransformData_AttributeTransformData_0.apply(null, +arguments)},Nb=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return a.asm._emscripten_bind_AttributeTransformData___destroy___0.apply(null,arguments)},Ob=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return a.asm._emscripten_bind_AttributeTransformData_transform_type_0.apply(null,arguments)},yb=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return a.asm._emscripten_bind_DecoderBuffer_DecoderBuffer_0.apply(null,arguments)},Pb=a._emscripten_bind_DecoderBuffer_Init_2= +function(){return a.asm._emscripten_bind_DecoderBuffer_Init_2.apply(null,arguments)},Qb=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return a.asm._emscripten_bind_DecoderBuffer___destroy___0.apply(null,arguments)},Rb=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return a.asm._emscripten_bind_Decoder_DecodeBufferToMesh_2.apply(null,arguments)},Sb=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return a.asm._emscripten_bind_Decoder_DecodeBufferToPointCloud_2.apply(null, +arguments)},zb=a._emscripten_bind_Decoder_Decoder_0=function(){return a.asm._emscripten_bind_Decoder_Decoder_0.apply(null,arguments)},Tb=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return a.asm._emscripten_bind_Decoder_GetAttributeByUniqueId_2.apply(null,arguments)},Ub=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3.apply(null,arguments)},Vb=a._emscripten_bind_Decoder_GetAttributeFloat_3= +function(){return a.asm._emscripten_bind_Decoder_GetAttributeFloat_3.apply(null,arguments)},Wb=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3.apply(null,arguments)},Xb=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return a.asm._emscripten_bind_Decoder_GetAttributeIdByName_2.apply(null,arguments)},Yb=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return a.asm._emscripten_bind_Decoder_GetAttributeId_2.apply(null, +arguments)},Zb=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3.apply(null,arguments)},$b=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3.apply(null,arguments)},ac=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3.apply(null,arguments)}, +bc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3.apply(null,arguments)},cc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return a.asm._emscripten_bind_Decoder_GetAttributeMetadata_2.apply(null,arguments)},dc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3.apply(null,arguments)},ec=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3= +function(){return a.asm._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3.apply(null,arguments)},fc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return a.asm._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3.apply(null,arguments)},gc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return a.asm._emscripten_bind_Decoder_GetAttribute_2.apply(null,arguments)},hc=a._emscripten_bind_Decoder_GetEncodedGeometryType_1=function(){return a.asm._emscripten_bind_Decoder_GetEncodedGeometryType_1.apply(null, +arguments)},ic=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return a.asm._emscripten_bind_Decoder_GetFaceFromMesh_3.apply(null,arguments)},jc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return a.asm._emscripten_bind_Decoder_GetMetadata_1.apply(null,arguments)},kc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return a.asm._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2.apply(null,arguments)},lc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return a.asm._emscripten_bind_Decoder_SkipAttributeTransform_1.apply(null, +arguments)},mc=a._emscripten_bind_Decoder___destroy___0=function(){return a.asm._emscripten_bind_Decoder___destroy___0.apply(null,arguments)},wb=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return a.asm._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0.apply(null,arguments)},nc=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return a.asm._emscripten_bind_DracoFloat32Array_GetValue_1.apply(null,arguments)},oc=a._emscripten_bind_DracoFloat32Array___destroy___0= +function(){return a.asm._emscripten_bind_DracoFloat32Array___destroy___0.apply(null,arguments)},pc=a._emscripten_bind_DracoFloat32Array_size_0=function(){return a.asm._emscripten_bind_DracoFloat32Array_size_0.apply(null,arguments)},vb=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return a.asm._emscripten_bind_DracoInt16Array_DracoInt16Array_0.apply(null,arguments)},qc=a._emscripten_bind_DracoInt16Array_GetValue_1=function(){return a.asm._emscripten_bind_DracoInt16Array_GetValue_1.apply(null, +arguments)},rc=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return a.asm._emscripten_bind_DracoInt16Array___destroy___0.apply(null,arguments)},sc=a._emscripten_bind_DracoInt16Array_size_0=function(){return a.asm._emscripten_bind_DracoInt16Array_size_0.apply(null,arguments)},Bb=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return a.asm._emscripten_bind_DracoInt32Array_DracoInt32Array_0.apply(null,arguments)},tc=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return a.asm._emscripten_bind_DracoInt32Array_GetValue_1.apply(null, +arguments)},uc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return a.asm._emscripten_bind_DracoInt32Array___destroy___0.apply(null,arguments)},vc=a._emscripten_bind_DracoInt32Array_size_0=function(){return a.asm._emscripten_bind_DracoInt32Array_size_0.apply(null,arguments)},tb=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return a.asm._emscripten_bind_DracoInt8Array_DracoInt8Array_0.apply(null,arguments)},wc=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return a.asm._emscripten_bind_DracoInt8Array_GetValue_1.apply(null, +arguments)},xc=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return a.asm._emscripten_bind_DracoInt8Array___destroy___0.apply(null,arguments)},yc=a._emscripten_bind_DracoInt8Array_size_0=function(){return a.asm._emscripten_bind_DracoInt8Array_size_0.apply(null,arguments)},lb=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return a.asm._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0.apply(null,arguments)},zc=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return a.asm._emscripten_bind_DracoUInt16Array_GetValue_1.apply(null, +arguments)},Ac=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return a.asm._emscripten_bind_DracoUInt16Array___destroy___0.apply(null,arguments)},Bc=a._emscripten_bind_DracoUInt16Array_size_0=function(){return a.asm._emscripten_bind_DracoUInt16Array_size_0.apply(null,arguments)},ob=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return a.asm._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0.apply(null,arguments)},Cc=a._emscripten_bind_DracoUInt32Array_GetValue_1= +function(){return a.asm._emscripten_bind_DracoUInt32Array_GetValue_1.apply(null,arguments)},Dc=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return a.asm._emscripten_bind_DracoUInt32Array___destroy___0.apply(null,arguments)},Ec=a._emscripten_bind_DracoUInt32Array_size_0=function(){return a.asm._emscripten_bind_DracoUInt32Array_size_0.apply(null,arguments)},nb=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return a.asm._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0.apply(null, +arguments)},Fc=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return a.asm._emscripten_bind_DracoUInt8Array_GetValue_1.apply(null,arguments)},Gc=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return a.asm._emscripten_bind_DracoUInt8Array___destroy___0.apply(null,arguments)},Hc=a._emscripten_bind_DracoUInt8Array_size_0=function(){return a.asm._emscripten_bind_DracoUInt8Array_size_0.apply(null,arguments)},xb=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return a.asm._emscripten_bind_GeometryAttribute_GeometryAttribute_0.apply(null, +arguments)},Ic=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return a.asm._emscripten_bind_GeometryAttribute___destroy___0.apply(null,arguments)},Ab=a._emscripten_bind_Mesh_Mesh_0=function(){return a.asm._emscripten_bind_Mesh_Mesh_0.apply(null,arguments)},Jc=a._emscripten_bind_Mesh___destroy___0=function(){return a.asm._emscripten_bind_Mesh___destroy___0.apply(null,arguments)},Kc=a._emscripten_bind_Mesh_num_attributes_0=function(){return a.asm._emscripten_bind_Mesh_num_attributes_0.apply(null, +arguments)},Lc=a._emscripten_bind_Mesh_num_faces_0=function(){return a.asm._emscripten_bind_Mesh_num_faces_0.apply(null,arguments)},Mc=a._emscripten_bind_Mesh_num_points_0=function(){return a.asm._emscripten_bind_Mesh_num_points_0.apply(null,arguments)},Nc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return a.asm._emscripten_bind_MetadataQuerier_GetDoubleEntry_2.apply(null,arguments)},Oc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return a.asm._emscripten_bind_MetadataQuerier_GetEntryName_2.apply(null, +arguments)},Pc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return a.asm._emscripten_bind_MetadataQuerier_GetIntEntry_2.apply(null,arguments)},Qc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return a.asm._emscripten_bind_MetadataQuerier_GetStringEntry_2.apply(null,arguments)},Rc=a._emscripten_bind_MetadataQuerier_HasDoubleEntry_2=function(){return a.asm._emscripten_bind_MetadataQuerier_HasDoubleEntry_2.apply(null,arguments)},Sc=a._emscripten_bind_MetadataQuerier_HasEntry_2= +function(){return a.asm._emscripten_bind_MetadataQuerier_HasEntry_2.apply(null,arguments)},Tc=a._emscripten_bind_MetadataQuerier_HasIntEntry_2=function(){return a.asm._emscripten_bind_MetadataQuerier_HasIntEntry_2.apply(null,arguments)},Uc=a._emscripten_bind_MetadataQuerier_HasStringEntry_2=function(){return a.asm._emscripten_bind_MetadataQuerier_HasStringEntry_2.apply(null,arguments)},ub=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return a.asm._emscripten_bind_MetadataQuerier_MetadataQuerier_0.apply(null, +arguments)},Vc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return a.asm._emscripten_bind_MetadataQuerier_NumEntries_1.apply(null,arguments)},Wc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return a.asm._emscripten_bind_MetadataQuerier___destroy___0.apply(null,arguments)},Cb=a._emscripten_bind_Metadata_Metadata_0=function(){return a.asm._emscripten_bind_Metadata_Metadata_0.apply(null,arguments)},Xc=a._emscripten_bind_Metadata___destroy___0=function(){return a.asm._emscripten_bind_Metadata___destroy___0.apply(null, +arguments)},Yc=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return a.asm._emscripten_bind_PointAttribute_GetAttributeTransformData_0.apply(null,arguments)},qb=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return a.asm._emscripten_bind_PointAttribute_PointAttribute_0.apply(null,arguments)},Zc=a._emscripten_bind_PointAttribute___destroy___0=function(){return a.asm._emscripten_bind_PointAttribute___destroy___0.apply(null,arguments)},$c=a._emscripten_bind_PointAttribute_attribute_type_0= +function(){return a.asm._emscripten_bind_PointAttribute_attribute_type_0.apply(null,arguments)},ad=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return a.asm._emscripten_bind_PointAttribute_byte_offset_0.apply(null,arguments)},bd=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return a.asm._emscripten_bind_PointAttribute_byte_stride_0.apply(null,arguments)},cd=a._emscripten_bind_PointAttribute_data_type_0=function(){return a.asm._emscripten_bind_PointAttribute_data_type_0.apply(null, +arguments)},dd=a._emscripten_bind_PointAttribute_normalized_0=function(){return a.asm._emscripten_bind_PointAttribute_normalized_0.apply(null,arguments)},ed=a._emscripten_bind_PointAttribute_num_components_0=function(){return a.asm._emscripten_bind_PointAttribute_num_components_0.apply(null,arguments)},fd=a._emscripten_bind_PointAttribute_size_0=function(){return a.asm._emscripten_bind_PointAttribute_size_0.apply(null,arguments)},gd=a._emscripten_bind_PointAttribute_unique_id_0=function(){return a.asm._emscripten_bind_PointAttribute_unique_id_0.apply(null, +arguments)},mb=a._emscripten_bind_PointCloud_PointCloud_0=function(){return a.asm._emscripten_bind_PointCloud_PointCloud_0.apply(null,arguments)},hd=a._emscripten_bind_PointCloud___destroy___0=function(){return a.asm._emscripten_bind_PointCloud___destroy___0.apply(null,arguments)},id=a._emscripten_bind_PointCloud_num_attributes_0=function(){return a.asm._emscripten_bind_PointCloud_num_attributes_0.apply(null,arguments)},jd=a._emscripten_bind_PointCloud_num_points_0=function(){return a.asm._emscripten_bind_PointCloud_num_points_0.apply(null, +arguments)},kd=a._emscripten_bind_Status___destroy___0=function(){return a.asm._emscripten_bind_Status___destroy___0.apply(null,arguments)},ld=a._emscripten_bind_Status_code_0=function(){return a.asm._emscripten_bind_Status_code_0.apply(null,arguments)},md=a._emscripten_bind_Status_error_msg_0=function(){return a.asm._emscripten_bind_Status_error_msg_0.apply(null,arguments)},nd=a._emscripten_bind_Status_ok_0=function(){return a.asm._emscripten_bind_Status_ok_0.apply(null,arguments)},od=a._emscripten_bind_VoidPtr___destroy___0= +function(){return a.asm._emscripten_bind_VoidPtr___destroy___0.apply(null,arguments)},pd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return a.asm._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM.apply(null,arguments)},qd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return a.asm._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM.apply(null,arguments)},rd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM= +function(){return a.asm._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM.apply(null,arguments)},sd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return a.asm._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM.apply(null,arguments)},td=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return a.asm._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE.apply(null, +arguments)},ud=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return a.asm._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD.apply(null,arguments)},vd=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return a.asm._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH.apply(null,arguments)},wd=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return a.asm._emscripten_enum_draco_GeometryAttribute_Type_COLOR.apply(null,arguments)},xd= +a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return a.asm._emscripten_enum_draco_GeometryAttribute_Type_GENERIC.apply(null,arguments)},yd=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return a.asm._emscripten_enum_draco_GeometryAttribute_Type_INVALID.apply(null,arguments)},zd=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return a.asm._emscripten_enum_draco_GeometryAttribute_Type_NORMAL.apply(null,arguments)},Ad=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION= +function(){return a.asm._emscripten_enum_draco_GeometryAttribute_Type_POSITION.apply(null,arguments)},Bd=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return a.asm._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD.apply(null,arguments)},Cd=a._emscripten_enum_draco_StatusCode_ERROR=function(){return a.asm._emscripten_enum_draco_StatusCode_ERROR.apply(null,arguments)},Dd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return a.asm._emscripten_enum_draco_StatusCode_INVALID_PARAMETER.apply(null, +arguments)},Ed=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return a.asm._emscripten_enum_draco_StatusCode_IO_ERROR.apply(null,arguments)},Fd=a._emscripten_enum_draco_StatusCode_OK=function(){return a.asm._emscripten_enum_draco_StatusCode_OK.apply(null,arguments)},Gd=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return a.asm._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION.apply(null,arguments)},Hd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return a.asm._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION.apply(null, +arguments)};a._emscripten_get_global_libc=function(){return a.asm._emscripten_get_global_libc.apply(null,arguments)};var Db=a._emscripten_replace_memory=function(){return a.asm._emscripten_replace_memory.apply(null,arguments)};a._free=function(){return a.asm._free.apply(null,arguments)};a._llvm_bswap_i32=function(){return a.asm._llvm_bswap_i32.apply(null,arguments)};var Ta=a._malloc=function(){return a.asm._malloc.apply(null,arguments)};a._memcpy=function(){return a.asm._memcpy.apply(null,arguments)}; +a._memmove=function(){return a.asm._memmove.apply(null,arguments)};a._memset=function(){return a.asm._memset.apply(null,arguments)};a._sbrk=function(){return a.asm._sbrk.apply(null,arguments)};a.establishStackSpace=function(){return a.asm.establishStackSpace.apply(null,arguments)};a.getTempRet0=function(){return a.asm.getTempRet0.apply(null,arguments)};a.runPostSets=function(){return a.asm.runPostSets.apply(null,arguments)};a.setTempRet0=function(){return a.asm.setTempRet0.apply(null,arguments)}; +a.setThrew=function(){return a.asm.setThrew.apply(null,arguments)};a.stackAlloc=function(){return a.asm.stackAlloc.apply(null,arguments)};a.stackRestore=function(){return a.asm.stackRestore.apply(null,arguments)};a.stackSave=function(){return a.asm.stackSave.apply(null,arguments)};a.dynCall_ii=function(){return a.asm.dynCall_ii.apply(null,arguments)};a.dynCall_iii=function(){return a.asm.dynCall_iii.apply(null,arguments)};a.dynCall_iiii=function(){return a.asm.dynCall_iiii.apply(null,arguments)}; +a.dynCall_iiiiiii=function(){return a.asm.dynCall_iiiiiii.apply(null,arguments)};a.dynCall_v=function(){return a.asm.dynCall_v.apply(null,arguments)};a.dynCall_vi=function(){return a.asm.dynCall_vi.apply(null,arguments)};a.dynCall_vii=function(){return a.asm.dynCall_vii.apply(null,arguments)};a.dynCall_viii=function(){return a.asm.dynCall_viii.apply(null,arguments)};a.dynCall_viiii=function(){return a.asm.dynCall_viiii.apply(null,arguments)};a.dynCall_viiiii=function(){return a.asm.dynCall_viiiii.apply(null, +arguments)};a.dynCall_viiiiii=function(){return a.asm.dynCall_viiiiii.apply(null,arguments)};m.stackAlloc=a.stackAlloc;m.stackSave=a.stackSave;m.stackRestore=a.stackRestore;m.establishStackSpace=a.establishStackSpace;m.setTempRet0=a.setTempRet0;m.getTempRet0=a.getTempRet0;a.asm=eb;if(V)if("function"===typeof a.locateFile?V=a.locateFile(V):a.memoryInitializerPrefixURL&&(V=a.memoryInitializerPrefixURL+V),pa||wa){var Id=a.readBinary(V);T.set(Id,m.GLOBAL_BASE)}else{var gb=function(){a.readAsync(V,fb, +function(){throw"could not load memory initializer "+V;})};la("memory initializer");var fb=function(d){d.byteLength&&(d=new Uint8Array(d));T.set(d,m.GLOBAL_BASE);a.memoryInitializerRequest&&delete a.memoryInitializerRequest.response;Na("memory initializer")};if(a.memoryInitializerRequest){var hb=function(){var d=a.memoryInitializerRequest,b=d.response;200!==d.status&&0!==d.status?(console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+d.status+", retrying "+ +V),gb()):fb(b)};a.memoryInitializerRequest.response?setTimeout(hb,0):a.memoryInitializerRequest.addEventListener("load",hb)}else gb()}a.then=function(d){if(a.calledRun)d(a);else{var b=a.onRuntimeInitialized;a.onRuntimeInitialized=function(){b&&b();d(a)}}return a};ea.prototype=Error();ea.prototype.constructor=ea;var Za=null;sa=function b(){a.calledRun||Da();a.calledRun||(sa=b)};a.run=Da;a.exit=function(b,c){if(!c||!a.noExitRuntime){if(!a.noExitRuntime&&(ua=!0,U=void 0,u(db),a.onExit))a.onExit(b);pa&& +process.exit(b);a.quit(b,new ea(b))}};var ab=[];a.abort=W;if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0<a.preInit.length;)a.preInit.pop()();Da();p.prototype=Object.create(p.prototype);p.prototype.constructor=p;p.prototype.__class__=p;p.__cache__={};a.WrapperObject=p;a.getCache=t;a.wrapPointer=X;a.castObject=function(a,c){return X(a.ptr,c)};a.NULL=X(0);a.destroy=function(a){if(!a.__destroy__)throw"Error: Cannot destroy object. (Did you create it yourself?)";a.__destroy__(); +delete t(a.__class__)[a.ptr]};a.compare=function(a,c){return a.ptr===c.ptr};a.getPointer=function(a){return a.ptr};a.getClass=function(a){return a.__class__};var k={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(k.needed){for(var b=0;b<k.temps.length;b++)a._free(k.temps[b]);k.temps.length=0;a._free(k.buffer);k.buffer=0;k.size+=k.needed;k.needed=0}k.buffer||(k.size+=128,k.buffer=a._malloc(k.size),f(k.buffer));k.pos=0},alloc:function(b,c){f(k.buffer);b=b.length*c.BYTES_PER_ELEMENT;b= +b+7&-8;k.pos+b>=k.size?(f(0<b),k.needed+=b,c=a._malloc(b),k.temps.push(c)):(c=k.buffer+k.pos,k.pos+=b);return c},copy:function(a,c,d){switch(c.BYTES_PER_ELEMENT){case 2:d>>=1;break;case 4:d>>=2;break;case 8:d>>=3}for(var b=0;b<a.length;b++)c[d+b]=a[b]}};B.prototype=Object.create(p.prototype);B.prototype.constructor=B;B.prototype.__class__=B;B.__cache__={};a.Status=B;B.prototype.code=B.prototype.code=function(){return ld(this.ptr)};B.prototype.ok=B.prototype.ok=function(){return!!nd(this.ptr)};B.prototype.error_msg= +B.prototype.error_msg=function(){return n(md(this.ptr))};B.prototype.__destroy__=B.prototype.__destroy__=function(){kd(this.ptr)};G.prototype=Object.create(p.prototype);G.prototype.constructor=G;G.prototype.__class__=G;G.__cache__={};a.DracoUInt16Array=G;G.prototype.GetValue=G.prototype.GetValue=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return zc(b,a)};G.prototype.size=G.prototype.size=function(){return Bc(this.ptr)};G.prototype.__destroy__=G.prototype.__destroy__=function(){Ac(this.ptr)}; +H.prototype=Object.create(p.prototype);H.prototype.constructor=H;H.prototype.__class__=H;H.__cache__={};a.PointCloud=H;H.prototype.num_attributes=H.prototype.num_attributes=function(){return id(this.ptr)};H.prototype.num_points=H.prototype.num_points=function(){return jd(this.ptr)};H.prototype.__destroy__=H.prototype.__destroy__=function(){hd(this.ptr)};I.prototype=Object.create(p.prototype);I.prototype.constructor=I;I.prototype.__class__=I;I.__cache__={};a.DracoUInt8Array=I;I.prototype.GetValue= +I.prototype.GetValue=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return Fc(b,a)};I.prototype.size=I.prototype.size=function(){return Hc(this.ptr)};I.prototype.__destroy__=I.prototype.__destroy__=function(){Gc(this.ptr)};J.prototype=Object.create(p.prototype);J.prototype.constructor=J;J.prototype.__class__=J;J.__cache__={};a.DracoUInt32Array=J;J.prototype.GetValue=J.prototype.GetValue=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return Cc(b,a)};J.prototype.size=J.prototype.size= +function(){return Ec(this.ptr)};J.prototype.__destroy__=J.prototype.__destroy__=function(){Dc(this.ptr)};K.prototype=Object.create(p.prototype);K.prototype.constructor=K;K.prototype.__class__=K;K.__cache__={};a.AttributeOctahedronTransform=K;K.prototype.InitFromAttribute=K.prototype.InitFromAttribute=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return!!Fb(b,a)};K.prototype.quantization_bits=K.prototype.quantization_bits=function(){return Hb(this.ptr)};K.prototype.__destroy__=K.prototype.__destroy__= +function(){Gb(this.ptr)};q.prototype=Object.create(p.prototype);q.prototype.constructor=q;q.prototype.__class__=q;q.__cache__={};a.PointAttribute=q;q.prototype.size=q.prototype.size=function(){return fd(this.ptr)};q.prototype.GetAttributeTransformData=q.prototype.GetAttributeTransformData=function(){return X(Yc(this.ptr),P)};q.prototype.attribute_type=q.prototype.attribute_type=function(){return $c(this.ptr)};q.prototype.data_type=q.prototype.data_type=function(){return cd(this.ptr)};q.prototype.num_components= +q.prototype.num_components=function(){return ed(this.ptr)};q.prototype.normalized=q.prototype.normalized=function(){return!!dd(this.ptr)};q.prototype.byte_stride=q.prototype.byte_stride=function(){return bd(this.ptr)};q.prototype.byte_offset=q.prototype.byte_offset=function(){return ad(this.ptr)};q.prototype.unique_id=q.prototype.unique_id=function(){return gd(this.ptr)};q.prototype.__destroy__=q.prototype.__destroy__=function(){Zc(this.ptr)};P.prototype=Object.create(p.prototype);P.prototype.constructor= +P;P.prototype.__class__=P;P.__cache__={};a.AttributeTransformData=P;P.prototype.transform_type=P.prototype.transform_type=function(){return Ob(this.ptr)};P.prototype.__destroy__=P.prototype.__destroy__=function(){Nb(this.ptr)};z.prototype=Object.create(p.prototype);z.prototype.constructor=z;z.prototype.__class__=z;z.__cache__={};a.AttributeQuantizationTransform=z;z.prototype.InitFromAttribute=z.prototype.InitFromAttribute=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return!!Ib(b,a)}; +z.prototype.quantization_bits=z.prototype.quantization_bits=function(){return Lb(this.ptr)};z.prototype.min_value=z.prototype.min_value=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return Kb(b,a)};z.prototype.range=z.prototype.range=function(){return Mb(this.ptr)};z.prototype.__destroy__=z.prototype.__destroy__=function(){Jb(this.ptr)};L.prototype=Object.create(p.prototype);L.prototype.constructor=L;L.prototype.__class__=L;L.__cache__={};a.DracoInt8Array=L;L.prototype.GetValue=L.prototype.GetValue= +function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return wc(b,a)};L.prototype.size=L.prototype.size=function(){return yc(this.ptr)};L.prototype.__destroy__=L.prototype.__destroy__=function(){xc(this.ptr)};r.prototype=Object.create(p.prototype);r.prototype.constructor=r;r.prototype.__class__=r;r.__cache__={};a.MetadataQuerier=r;r.prototype.HasEntry=r.prototype.HasEntry=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return!!Sc(b, +a,c)};r.prototype.HasIntEntry=r.prototype.HasIntEntry=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return!!Tc(b,a,c)};r.prototype.GetIntEntry=r.prototype.GetIntEntry=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return Pc(b,a,c)};r.prototype.HasDoubleEntry=r.prototype.HasDoubleEntry=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"=== +typeof c?c.ptr:Y(c);return!!Rc(b,a,c)};r.prototype.GetDoubleEntry=r.prototype.GetDoubleEntry=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return Nc(b,a,c)};r.prototype.HasStringEntry=r.prototype.HasStringEntry=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return!!Uc(b,a,c)};r.prototype.GetStringEntry=r.prototype.GetStringEntry=function(a,c){var b=this.ptr;k.prepare(); +a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return n(Qc(b,a,c))};r.prototype.NumEntries=r.prototype.NumEntries=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return Vc(b,a)};r.prototype.GetEntryName=r.prototype.GetEntryName=function(a,c){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return n(Oc(b,a,c))};r.prototype.__destroy__=r.prototype.__destroy__=function(){Wc(this.ptr)};M.prototype=Object.create(p.prototype);M.prototype.constructor= +M;M.prototype.__class__=M;M.__cache__={};a.DracoInt16Array=M;M.prototype.GetValue=M.prototype.GetValue=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return qc(b,a)};M.prototype.size=M.prototype.size=function(){return sc(this.ptr)};M.prototype.__destroy__=M.prototype.__destroy__=function(){rc(this.ptr)};N.prototype=Object.create(p.prototype);N.prototype.constructor=N;N.prototype.__class__=N;N.__cache__={};a.DracoFloat32Array=N;N.prototype.GetValue=N.prototype.GetValue=function(a){var b= +this.ptr;a&&"object"===typeof a&&(a=a.ptr);return nc(b,a)};N.prototype.size=N.prototype.size=function(){return pc(this.ptr)};N.prototype.__destroy__=N.prototype.__destroy__=function(){oc(this.ptr)};Z.prototype=Object.create(p.prototype);Z.prototype.constructor=Z;Z.prototype.__class__=Z;Z.__cache__={};a.GeometryAttribute=Z;Z.prototype.__destroy__=Z.prototype.__destroy__=function(){Ic(this.ptr)};R.prototype=Object.create(p.prototype);R.prototype.constructor=R;R.prototype.__class__=R;R.__cache__={}; +a.DecoderBuffer=R;R.prototype.Init=R.prototype.Init=function(a,c){var b=this.ptr;k.prepare();if("object"==typeof a&&"object"===typeof a){var d=k.alloc(a,fa);k.copy(a,fa,d);a=d}c&&"object"===typeof c&&(c=c.ptr);Pb(b,a,c)};R.prototype.__destroy__=R.prototype.__destroy__=function(){Qb(this.ptr)};h.prototype=Object.create(p.prototype);h.prototype.constructor=h;h.prototype.__class__=h;h.__cache__={};a.Decoder=h;h.prototype.GetEncodedGeometryType=h.prototype.GetEncodedGeometryType=function(a){var b=this.ptr; +a&&"object"===typeof a&&(a=a.ptr);return hc(b,a)};h.prototype.DecodeBufferToPointCloud=h.prototype.DecodeBufferToPointCloud=function(a,c){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return X(Sb(b,a,c),B)};h.prototype.DecodeBufferToMesh=h.prototype.DecodeBufferToMesh=function(a,c){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return X(Rb(b,a,c),B)};h.prototype.GetAttributeId=h.prototype.GetAttributeId=function(a,c){var b=this.ptr; +a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return Yb(b,a,c)};h.prototype.GetAttributeIdByName=h.prototype.GetAttributeIdByName=function(a,c){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);return Xb(b,a,c)};h.prototype.GetAttributeIdByMetadataEntry=h.prototype.GetAttributeIdByMetadataEntry=function(a,c,d){var b=this.ptr;k.prepare();a&&"object"===typeof a&&(a=a.ptr);c=c&&"object"===typeof c?c.ptr:Y(c);d=d&&"object"===typeof d? +d.ptr:Y(d);return Wb(b,a,c,d)};h.prototype.GetAttribute=h.prototype.GetAttribute=function(a,c){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return X(gc(b,a,c),q)};h.prototype.GetAttributeByUniqueId=h.prototype.GetAttributeByUniqueId=function(a,c){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return X(Tb(b,a,c),q)};h.prototype.GetMetadata=h.prototype.GetMetadata=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return X(jc(b, +a),S)};h.prototype.GetAttributeMetadata=h.prototype.GetAttributeMetadata=function(a,c){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return X(cc(b,a,c),S)};h.prototype.GetFaceFromMesh=h.prototype.GetFaceFromMesh=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!ic(b,a,c,d)};h.prototype.GetTriangleStripsFromMesh=h.prototype.GetTriangleStripsFromMesh=function(a,c){var b=this.ptr; +a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);return kc(b,a,c)};h.prototype.GetAttributeFloat=h.prototype.GetAttributeFloat=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!Vb(b,a,c,d)};h.prototype.GetAttributeFloatForAllPoints=h.prototype.GetAttributeFloatForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&& +(d=d.ptr);return!!Ub(b,a,c,d)};h.prototype.GetAttributeIntForAllPoints=h.prototype.GetAttributeIntForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!bc(b,a,c,d)};h.prototype.GetAttributeInt8ForAllPoints=h.prototype.GetAttributeInt8ForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!ac(b,a,c,d)}; +h.prototype.GetAttributeUInt8ForAllPoints=h.prototype.GetAttributeUInt8ForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!fc(b,a,c,d)};h.prototype.GetAttributeInt16ForAllPoints=h.prototype.GetAttributeInt16ForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!Zb(b,a,c,d)};h.prototype.GetAttributeUInt16ForAllPoints= +h.prototype.GetAttributeUInt16ForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!dc(b,a,c,d)};h.prototype.GetAttributeInt32ForAllPoints=h.prototype.GetAttributeInt32ForAllPoints=function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!$b(b,a,c,d)};h.prototype.GetAttributeUInt32ForAllPoints=h.prototype.GetAttributeUInt32ForAllPoints= +function(a,c,d){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);c&&"object"===typeof c&&(c=c.ptr);d&&"object"===typeof d&&(d=d.ptr);return!!ec(b,a,c,d)};h.prototype.SkipAttributeTransform=h.prototype.SkipAttributeTransform=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);lc(b,a)};h.prototype.__destroy__=h.prototype.__destroy__=function(){mc(this.ptr)};C.prototype=Object.create(p.prototype);C.prototype.constructor=C;C.prototype.__class__=C;C.__cache__={};a.Mesh=C;C.prototype.num_faces= +C.prototype.num_faces=function(){return Lc(this.ptr)};C.prototype.num_attributes=C.prototype.num_attributes=function(){return Kc(this.ptr)};C.prototype.num_points=C.prototype.num_points=function(){return Mc(this.ptr)};C.prototype.__destroy__=C.prototype.__destroy__=function(){Jc(this.ptr)};ca.prototype=Object.create(p.prototype);ca.prototype.constructor=ca;ca.prototype.__class__=ca;ca.__cache__={};a.VoidPtr=ca;ca.prototype.__destroy__=ca.prototype.__destroy__=function(){od(this.ptr)};O.prototype= +Object.create(p.prototype);O.prototype.constructor=O;O.prototype.__class__=O;O.__cache__={};a.DracoInt32Array=O;O.prototype.GetValue=O.prototype.GetValue=function(a){var b=this.ptr;a&&"object"===typeof a&&(a=a.ptr);return tc(b,a)};O.prototype.size=O.prototype.size=function(){return vc(this.ptr)};O.prototype.__destroy__=O.prototype.__destroy__=function(){uc(this.ptr)};S.prototype=Object.create(p.prototype);S.prototype.constructor=S;S.prototype.__class__=S;S.__cache__={};a.Metadata=S;S.prototype.__destroy__= +S.prototype.__destroy__=function(){Xc(this.ptr)};(function(){function b(){a.OK=Fd();a.ERROR=Cd();a.IO_ERROR=Ed();a.INVALID_PARAMETER=Dd();a.UNSUPPORTED_VERSION=Hd();a.UNKNOWN_VERSION=Gd();a.INVALID_GEOMETRY_TYPE=td();a.POINT_CLOUD=ud();a.TRIANGULAR_MESH=vd();a.ATTRIBUTE_INVALID_TRANSFORM=pd();a.ATTRIBUTE_NO_TRANSFORM=qd();a.ATTRIBUTE_QUANTIZATION_TRANSFORM=sd();a.ATTRIBUTE_OCTAHEDRON_TRANSFORM=rd();a.INVALID=yd();a.POSITION=Ad();a.NORMAL=zd();a.COLOR=wd();a.TEX_COORD=Bd();a.GENERIC=xd()}a.calledRun? +b():Xa.unshift(b)})();if("function"===typeof a.onModuleParsed)a.onModuleParsed();return d};"object"===typeof module&&module.exports&&(module.exports=DracoDecoderModule); diff --git a/web/assets/Cesium/ThirdParty/Workers/inflate.js b/web/assets/Cesium/ThirdParty/Workers/inflate.js new file mode 100644 index 00000000..10f07556 --- /dev/null +++ b/web/assets/Cesium/ThirdParty/Workers/inflate.js @@ -0,0 +1 @@ +!function(e){var L=0,P=1,j=-2,q=-3,x=-4,B=-5,C=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],F=1440,a=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],r=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],w=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],v=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],h=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],D=15;function G(){var f,o,E,S,U,z;function b(i,t,e,n,a,r,_,l,d,s,f){for(var o,b,u,x,w,c,v,h,k,m,y,g,p,A=0,I=e;E[i[t+A]]++,A++,0!==--I;);if(E[0]==e)return _[0]=-1,l[0]=0,L;for(v=l[0],w=1;w<=D&&0===E[w];w++);for(v<(c=w)&&(v=w),I=D;0!==I&&0===E[I];I--);for((u=I)<v&&(v=I),l[0]=v,g=1<<w;w<I;w++,g<<=1)if((g-=E[w])<0)return q;if((g-=E[I])<0)return q;for(E[I]+=g,z[1]=w=0,A=1,y=2;0!=--I;)z[y]=w+=E[A],y++,A++;for(A=I=0;0!==(w=i[t+A])&&(f[z[w]++]=I),A++,++I<e;);for(e=z[u],z[0]=I=0,x=-1,m=-v,p=k=U[A=0]=0;c<=u;c++)for(o=E[c];0!=o--;){for(;m+v<c;){if(x++,p=v<(p=u-(m+=v))?v:p,(b=1<<(w=c-m))>o+1&&(b-=o+1,y=c,w<p))for(;++w<p&&!((b<<=1)<=E[++y]);)b-=E[y];if(p=1<<w,s[0]+p>F)return q;U[x]=k=s[0],s[0]+=p,0!==x?(z[x]=I,S[0]=w,w=I>>>m-(S[1]=v),S[2]=k-U[x-1]-w,d.set(S,3*(U[x-1]+w))):_[0]=k}for(S[1]=c-m,e<=A?S[0]=192:f[A]<n?(S[0]=f[A]<256?0:96,S[2]=f[A++]):(S[0]=r[f[A]-n]+16+64,S[2]=a[f[A++]-n]),b=1<<c-m,w=I>>>m;w<p;w+=b)d.set(S,3*(k+w));for(w=1<<c-1;0!=(I&w);w>>>=1)I^=w;for(I^=w,h=(1<<m)-1;(I&h)!=z[x];)x--,h=(1<<(m-=v))-1}return 0!==g&&1!=u?B:L}function u(i){var t;for(f||(f=[],o=[],E=new Int32Array(D+1),S=[],U=new Int32Array(D),z=new Int32Array(D+1)),o.length<i&&(o=[]),t=0;t<i;t++)o[t]=0;for(t=0;t<D+1;t++)E[t]=0;for(t=0;t<3;t++)S[t]=0;U.set(E.subarray(0,D),0),z.set(E.subarray(0,D+1),0)}this.inflate_trees_bits=function(i,t,e,n,a){var r;return u(19),(r=b(i,f[0]=0,19,19,null,null,e,t,n,f,o))==q?a.msg="oversubscribed dynamic bit lengths tree":r!=B&&0!==t[0]||(a.msg="incomplete dynamic bit lengths tree",r=q),r},this.inflate_trees_dynamic=function(i,t,e,n,a,r,_,l,d){var s;return u(288),(s=b(e,f[0]=0,i,257,w,c,r,n,l,f,o))!=L||0===n[0]?(s==q?d.msg="oversubscribed literal/length tree":s!=x&&(d.msg="incomplete literal/length tree",s=q),s):(u(288),(s=b(e,i,t,0,v,h,_,a,l,f,o))!=L||0===a[0]&&257<i?(s==q?d.msg="oversubscribed distance tree":s==B?(d.msg="incomplete distance tree",s=q):s!=x&&(d.msg="empty distance tree with lengths",s=q),s):L)}}G.inflate_trees_fixed=function(i,t,e,n){return i[0]=9,t[0]=5,e[0]=a,n[0]=r,L};var S=0,U=1,z=2,M=3,H=4,J=5,K=6,N=7,O=8,Q=9;function n(){var u,x,w,c,v=0,h=0,k=0,m=0,y=0,g=0,p=0,A=0,I=0,E=0;this.init=function(i,t,e,n,a,r){u=S,p=i,A=t,w=e,I=n,c=a,E=r,x=null},this.proc=function(i,t,e){for(var n,a,r,_,l=0,d=0,s=0,s=t.next_in_index,f=t.avail_in,l=i.bitb,d=i.bitk,o=i.write,b=o<i.read?i.read-o-1:i.end-o;;)switch(u){case S:if(258<=b&&10<=f&&(i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,e=function(i,t,e,n,a,r,_,l){var d,s,f,o,b,u,x,w,c=l.next_in_index,v=l.avail_in,h=_.bitb,k=_.bitk,m=_.write,y=m<_.read?_.read-m-1:_.end-m,g=C[i],p=C[t];do{for(;k<20;)v--,h|=(255&l.read_byte(c++))<<k,k+=8;if(0!==(o=(s=e)[w=3*((f=n)+(d=h&g))]))for(;;){if(h>>=s[w+1],k-=s[w+1],0!=(16&o)){for(o&=15,b=s[w+2]+(h&C[o]),h>>=o,k-=o;k<15;)v--,h|=(255&l.read_byte(c++))<<k,k+=8;for(o=(s=a)[w=3*((f=r)+(d=h&p))];;){if(h>>=s[w+1],k-=s[w+1],0!=(16&o)){for(o&=15;k<o;)v--,h|=(255&l.read_byte(c++))<<k,k+=8;if(u=s[w+2]+(h&C[o]),h>>=o,k-=o,y-=b,u<=m)0<m-(x=m-u)&&m-x<2?(_.window[m++]=_.window[x++],_.window[m++]=_.window[x++]):(_.window.set(_.window.subarray(x,x+2),m),m+=2,x+=2),b-=2;else{for(x=m-u;(x+=_.end)<0;);if((o=_.end-x)<b){if(b-=o,0<m-x&&m-x<o)for(;_.window[m++]=_.window[x++],0!=--o;);else _.window.set(_.window.subarray(x,x+o),m),m+=o,x+=o,o=0;x=0}}if(0<m-x&&m-x<b)for(;_.window[m++]=_.window[x++],0!=--b;);else _.window.set(_.window.subarray(x,x+b),m),m+=b,x+=b,b=0;break}if(0!=(64&o))return l.msg="invalid distance code",v+=b=k>>3<(b=l.avail_in-v)?k>>3:b,c-=b,k-=b<<3,_.bitb=h,_.bitk=k,l.avail_in=v,l.total_in+=c-l.next_in_index,l.next_in_index=c,_.write=m,q;d+=s[w+2],o=s[w=3*(f+(d+=h&C[o]))]}break}if(0!=(64&o))return 0!=(32&o)?(v+=b=k>>3<(b=l.avail_in-v)?k>>3:b,c-=b,k-=b<<3,_.bitb=h,_.bitk=k,l.avail_in=v,l.total_in+=c-l.next_in_index,l.next_in_index=c,_.write=m,P):(l.msg="invalid literal/length code",v+=b=k>>3<(b=l.avail_in-v)?k>>3:b,c-=b,k-=b<<3,_.bitb=h,_.bitk=k,l.avail_in=v,l.total_in+=c-l.next_in_index,l.next_in_index=c,_.write=m,q);if(d+=s[w+2],0===(o=s[w=3*(f+(d+=h&C[o]))])){h>>=s[w+1],k-=s[w+1],_.window[m++]=s[w+2],y--;break}}else h>>=s[w+1],k-=s[w+1],_.window[m++]=s[w+2],y--}while(258<=y&&10<=v);return v+=b=k>>3<(b=l.avail_in-v)?k>>3:b,c-=b,k-=b<<3,_.bitb=h,_.bitk=k,l.avail_in=v,l.total_in+=c-l.next_in_index,l.next_in_index=c,_.write=m,L}(p,A,w,I,c,E,i,t),s=t.next_in_index,f=t.avail_in,l=i.bitb,d=i.bitk,b=(o=i.write)<i.read?i.read-o-1:i.end-o,e!=L)){u=e==P?N:Q;break}k=p,x=w,h=I,u=U;case U:for(n=k;d<n;){if(0===f)return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);e=L,f--,l|=(255&t.read_byte(s++))<<d,d+=8}if(a=3*(h+(l&C[n])),l>>>=x[a+1],d-=x[a+1],0===(r=x[a])){m=x[a+2],u=K;break}if(0!=(16&r)){y=15&r,v=x[a+2],u=z;break}if(0==(64&r)){k=r,h=a/3+x[a+2];break}if(0==(32&r))return u=Q,t.msg="invalid literal/length code",e=q,i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);u=N;break;case z:for(n=y;d<n;){if(0===f)return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);e=L,f--,l|=(255&t.read_byte(s++))<<d,d+=8}v+=l&C[n],l>>=n,d-=n,k=A,x=c,h=E,u=M;case M:for(n=k;d<n;){if(0===f)return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);e=L,f--,l|=(255&t.read_byte(s++))<<d,d+=8}if(a=3*(h+(l&C[n])),l>>=x[a+1],d-=x[a+1],0!=(16&(r=x[a]))){y=15&r,g=x[a+2],u=H;break}if(0!=(64&r))return u=Q,t.msg="invalid distance code",e=q,i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);k=r,h=a/3+x[a+2];break;case H:for(n=y;d<n;){if(0===f)return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);e=L,f--,l|=(255&t.read_byte(s++))<<d,d+=8}g+=l&C[n],l>>=n,d-=n,u=J;case J:for(_=o-g;_<0;)_+=i.end;for(;0!==v;){if(0===b&&(o==i.end&&0!==i.read&&(b=(o=0)<i.read?i.read-o-1:i.end-o),0===b&&(i.write=o,e=i.inflate_flush(t,e),b=(o=i.write)<i.read?i.read-o-1:i.end-o,o==i.end&&0!==i.read&&(b=(o=0)<i.read?i.read-o-1:i.end-o),0===b)))return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);i.window[o++]=i.window[_++],b--,_==i.end&&(_=0),v--}u=S;break;case K:if(0===b&&(o==i.end&&0!==i.read&&(b=(o=0)<i.read?i.read-o-1:i.end-o),0===b&&(i.write=o,e=i.inflate_flush(t,e),b=(o=i.write)<i.read?i.read-o-1:i.end-o,o==i.end&&0!==i.read&&(b=(o=0)<i.read?i.read-o-1:i.end-o),0===b)))return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);e=L,i.window[o++]=m,b--,u=S;break;case N:if(7<d&&(d-=8,f++,s--),i.write=o,e=i.inflate_flush(t,e),b=(o=i.write)<i.read?i.read-o-1:i.end-o,i.read!=i.write)return i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);u=O;case O:return e=P,i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);case Q:return e=q,i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e);default:return e=j,i.bitb=l,i.bitk=d,t.avail_in=f,t.total_in+=s-t.next_in_index,t.next_in_index=s,i.write=o,i.inflate_flush(t,e)}},this.free=function(){}}var R=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],T=0,V=1,W=2,X=3,Y=4,Z=5,$=6,ii=7,ti=8,ei=9;function l(i,t){var m,y=this,g=T,p=0,A=0,I=0,E=[0],S=[0],U=new n,z=0,D=new Int32Array(3*F),M=new G;y.bitk=0,y.bitb=0,y.window=new Uint8Array(t),y.end=t,y.read=0,y.write=0,y.reset=function(i,t){t&&(t[0]=0),g==$&&U.free(i),g=T,y.bitk=0,y.bitb=0,y.read=y.write=0},y.reset(i,null),y.inflate_flush=function(i,t){var e=i.next_out_index,n=y.read,a=(n<=y.write?y.write:y.end)-n;return a>i.avail_out&&(a=i.avail_out),0!==a&&t==B&&(t=L),i.avail_out-=a,i.total_out+=a,i.next_out.set(y.window.subarray(n,n+a),e),e+=a,(n+=a)==y.end&&(n=0,y.write==y.end&&(y.write=0),(a=y.write-n)>i.avail_out&&(a=i.avail_out),0!==a&&t==B&&(t=L),i.avail_out-=a,i.total_out+=a,i.next_out.set(y.window.subarray(n,n+a),e),e+=a,n+=a),i.next_out_index=e,y.read=n,t},y.proc=function(i,t){for(var e,n=i.next_in_index,a=i.avail_in,r=y.bitb,_=y.bitk,l=y.write,d=l<y.read?y.read-l-1:y.end-l;;)switch(g){case T:for(;_<3;){if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);t=L,a--,r|=(255&i.read_byte(n++))<<_,_+=8}switch(z=1&(w=7&r),w>>>1){case 0:r>>>=3,r>>>=w=7&(_-=3),_-=w,g=V;break;case 1:var s=[],f=[],o=[[]],b=[[]];G.inflate_trees_fixed(s,f,o,b),U.init(s[0],f[0],o[0],0,b[0],0),r>>>=3,_-=3,g=$;break;case 2:r>>>=3,_-=3,g=X;break;case 3:return r>>>=3,_-=3,g=ei,i.msg="invalid block type",t=q,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t)}break;case V:for(;_<32;){if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);t=L,a--,r|=(255&i.read_byte(n++))<<_,_+=8}if((~r>>>16&65535)!=(65535&r))return g=ei,i.msg="invalid stored block lengths",t=q,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);p=65535&r,r=_=0,g=0!==p?W:0!==z?ii:T;break;case W:if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);if(0===d&&(l==y.end&&0!==y.read&&(d=(l=0)<y.read?y.read-l-1:y.end-l),0===d&&(y.write=l,t=y.inflate_flush(i,t),d=(l=y.write)<y.read?y.read-l-1:y.end-l,l==y.end&&0!==y.read&&(d=(l=0)<y.read?y.read-l-1:y.end-l),0===d)))return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);if(t=L,a<(w=p)&&(w=a),d<w&&(w=d),y.window.set(i.read_buf(n,w),l),n+=w,a-=w,l+=w,d-=w,0!=(p-=w))break;g=0!==z?ii:T;break;case X:for(;_<14;){if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);t=L,a--,r|=(255&i.read_byte(n++))<<_,_+=8}if(A=w=16383&r,29<(31&w)||29<(w>>5&31))return g=ei,i.msg="too many length or distance symbols",t=q,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);if(w=258+(31&w)+(w>>5&31),!m||m.length<w)m=[];else for(e=0;e<w;e++)m[e]=0;r>>>=14,_-=14,I=0,g=Y;case Y:for(;I<4+(A>>>10);){for(;_<3;){if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);t=L,a--,r|=(255&i.read_byte(n++))<<_,_+=8}m[R[I++]]=7&r,r>>>=3,_-=3}for(;I<19;)m[R[I++]]=0;if(E[0]=7,(w=M.inflate_trees_bits(m,E,S,D,i))!=L)return(t=w)==q&&(m=null,g=ei),y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);I=0,g=Z;case Z:for(;I<258+(31&(w=A))+(w>>5&31);){for(var u,x,w=E[0];_<w;){if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);t=L,a--,r|=(255&i.read_byte(n++))<<_,_+=8}if(w=D[3*(S[0]+(r&C[w]))+1],(x=D[3*(S[0]+(r&C[w]))+2])<16)r>>>=w,_-=w,m[I++]=x;else{for(e=18==x?7:x-14,u=18==x?11:3;_<w+e;){if(0===a)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);t=L,a--,r|=(255&i.read_byte(n++))<<_,_+=8}if(_-=w,u+=(r>>>=w)&C[e],r>>>=e,_-=e,258+(31&(w=A))+(w>>5&31)<(e=I)+u||16==x&&e<1)return m=null,g=ei,i.msg="invalid bit length repeat",t=q,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);for(x=16==x?m[e-1]:0;m[e++]=x,0!=--u;);I=e}}S[0]=-1;var c=[],v=[],h=[],k=[];if(c[0]=9,v[0]=6,w=A,(w=M.inflate_trees_dynamic(257+(31&w),1+(w>>5&31),m,c,v,h,k,D,i))!=L)return w==q&&(m=null,g=ei),t=w,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);U.init(c[0],v[0],D,h[0],D,k[0]),g=$;case $:if(y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,(t=U.proc(y,i,t))!=P)return y.inflate_flush(i,t);if(t=L,U.free(i),n=i.next_in_index,a=i.avail_in,r=y.bitb,_=y.bitk,d=(l=y.write)<y.read?y.read-l-1:y.end-l,0===z){g=T;break}g=ii;case ii:if(y.write=l,t=y.inflate_flush(i,t),d=(l=y.write)<y.read?y.read-l-1:y.end-l,y.read!=y.write)return y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);g=ti;case ti:return t=P,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);case ei:return t=q,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t);default:return t=j,y.bitb=r,y.bitk=_,i.avail_in=a,i.total_in+=n-i.next_in_index,i.next_in_index=n,y.write=l,y.inflate_flush(i,t)}},y.free=function(i){y.reset(i,null),y.window=null,D=null},y.set_dictionary=function(i,t,e){y.window.set(i.subarray(t,t+e),0),y.read=y.write=e},y.sync_point=function(){return g==V?1:0}}var _,d=[0,0,255,255];function t(){var e=this;function _(i){return i&&i.istate?(i.total_in=i.total_out=0,i.msg=null,i.istate.mode=7,i.istate.blocks.reset(i,null),L):j}e.mode=0,e.method=0,e.was=[0],e.need=0,e.marker=0,e.wbits=0,e.inflateEnd=function(i){return e.blocks&&e.blocks.free(i),e.blocks=null,L},e.inflateInit=function(i,t){return i.msg=null,e.blocks=null,t<8||15<t?(e.inflateEnd(i),j):(e.wbits=t,i.istate.blocks=new l(i,1<<t),_(i),L)},e.inflate=function(i,t){var e,n;if(!i||!i.istate||!i.next_in)return j;for(t=4==t?B:L,e=B;;)switch(i.istate.mode){case 0:if(0===i.avail_in)return e;if(e=t,i.avail_in--,i.total_in++,8!=(15&(i.istate.method=i.read_byte(i.next_in_index++)))){i.istate.mode=13,i.msg="unknown compression method",i.istate.marker=5;break}if(8+(i.istate.method>>4)>i.istate.wbits){i.istate.mode=13,i.msg="invalid window size",i.istate.marker=5;break}i.istate.mode=1;case 1:if(0===i.avail_in)return e;if(e=t,i.avail_in--,i.total_in++,n=255&i.read_byte(i.next_in_index++),((i.istate.method<<8)+n)%31!=0){i.istate.mode=13,i.msg="incorrect header check",i.istate.marker=5;break}if(0==(32&n)){i.istate.mode=7;break}i.istate.mode=2;case 2:if(0===i.avail_in)return e;e=t,i.avail_in--,i.total_in++,i.istate.need=(255&i.read_byte(i.next_in_index++))<<24&4278190080,i.istate.mode=3;case 3:if(0===i.avail_in)return e;e=t,i.avail_in--,i.total_in++,i.istate.need+=(255&i.read_byte(i.next_in_index++))<<16&16711680,i.istate.mode=4;case 4:if(0===i.avail_in)return e;e=t,i.avail_in--,i.total_in++,i.istate.need+=(255&i.read_byte(i.next_in_index++))<<8&65280,i.istate.mode=5;case 5:return 0===i.avail_in?e:(e=t,i.avail_in--,i.total_in++,i.istate.need+=255&i.read_byte(i.next_in_index++),i.istate.mode=6,2);case 6:return i.istate.mode=13,i.msg="need dictionary",i.istate.marker=0,j;case 7:if((e=i.istate.blocks.proc(i,e))==q){i.istate.mode=13,i.istate.marker=0;break}if(e==L&&(e=t),e!=P)return e;e=t,i.istate.blocks.reset(i,i.istate.was),i.istate.mode=12;case 12:return P;case 13:return q;default:return j}},e.inflateSetDictionary=function(i,t,e){var n=0,a=e;return i&&i.istate&&6==i.istate.mode?(a>=1<<i.istate.wbits&&(n=e-(a=(1<<i.istate.wbits)-1)),i.istate.blocks.set_dictionary(t,n,a),i.istate.mode=7,L):j},e.inflateSync=function(i){var t,e,n,a,r;if(!i||!i.istate)return j;if(13!=i.istate.mode&&(i.istate.mode=13,i.istate.marker=0),0===(t=i.avail_in))return B;for(e=i.next_in_index,n=i.istate.marker;0!==t&&n<4;)i.read_byte(e)==d[n]?n++:n=0!==i.read_byte(e)?0:4-n,e++,t--;return i.total_in+=e-i.next_in_index,i.next_in_index=e,i.avail_in=t,4!=(i.istate.marker=n)?q:(a=i.total_in,r=i.total_out,_(i),i.total_in=a,i.total_out=r,i.istate.mode=7,L)},e.inflateSyncPoint=function(i){return i&&i.istate&&i.istate.blocks?i.istate.blocks.sync_point():j}}function i(){}function s(){var d=new i,s=new Uint8Array(512),f=!1;d.inflateInit(),d.next_out=s,this.append=function(i,t){var e,n,a=[],r=0,_=0,l=0;if(0!==i.length){d.next_in_index=0,d.next_in=i,d.avail_in=i.length;do{if(d.next_out_index=0,d.avail_out=512,0!==d.avail_in||f||(d.next_in_index=0,f=!0),e=d.inflate(0),f&&e==B)return-1;if(e!=L&&e!=P)throw"inflating: "+d.msg;if((f||e==P)&&d.avail_in==i.length)return-1;d.next_out_index&&(512==d.next_out_index?a.push(new Uint8Array(s)):a.push(new Uint8Array(s.subarray(0,d.next_out_index)))),l+=d.next_out_index,t&&0<d.next_in_index&&d.next_in_index!=r&&(t(d.next_in_index),r=d.next_in_index)}while(0<d.avail_in||0===d.avail_out);return n=new Uint8Array(l),a.forEach(function(i){n.set(i,_),_+=i.length}),n}},this.flush=function(){d.inflateEnd()}}i.prototype={inflateInit:function(i){return this.istate=new t,i=i||15,this.istate.inflateInit(this,i)},inflate:function(i){return this.istate?this.istate.inflate(this,i):j},inflateEnd:function(){if(!this.istate)return j;var i=this.istate.inflateEnd(this);return this.istate=null,i},inflateSync:function(){return this.istate?this.istate.inflateSync(this):j},inflateSetDictionary:function(i,t){return this.istate?this.istate.inflateSetDictionary(this,i,t):j},read_byte:function(i){return this.next_in.subarray(i,i+1)[0]},read_buf:function(i,t){return this.next_in.subarray(i,i+t)}},e.zip?e.zip.Inflater=s:(_=new s,e.addEventListener("message",function(i){var t=i.data;t.append&&e.postMessage({onappend:!0,data:_.append(t.data,function(i){e.postMessage({progress:!0,current:i})})}),t.flush&&(_.flush(),e.postMessage({onflush:!0}))},!1))}(this); \ No newline at end of file diff --git a/web/assets/Cesium/ThirdParty/draco_decoder.wasm b/web/assets/Cesium/ThirdParty/draco_decoder.wasm new file mode 100644 index 0000000000000000000000000000000000000000..4b438284515d70d6b911330c97df5bf6125915e0 GIT binary patch literal 330634 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 d!yDWLRmvXyP<Up-51tj<(41 zJj-QQk-(P1z%~iGYB0hwc{-=GYzhk}VB~cA-zwO|(vy_tMk`w)ofjLSHq6@X+R~Fy zKNgUv3T=nzOxO4V&s0A9DN&W_ca`~C@6ZA-`nr_J$5dE0+TkPjI@JCT;*@JT*F_*P zGdq3d3fC?oBo<%!5ZI?5m*Xp!6v#^IC&ITjTO)uQ22lAl(8N})g+j3CoOVMYQz74L zeS)E{PZVjrrAQ98U)R!-9$Dv9ijt&&HxtVw1lm#*D^UBmtbV|!m6N~lv9usjZg~)* zk<pR@8){QdX|ASyI~FNR&|!6sD-*>PR(ww$QFFPLTp=4aVk@&Gy(XW%b2wKdU#_8H zFNvLe`Ru0^CdAq&AVP?M`uC$%_I1VV?Qi)(!A7X_QvOhnwt>TT@}^?=7f$_+)8~+m zs1{K+Z2@Bt5Q|h3?|ynP{p0mwcA<D6V2#}g((mP2n`Gupj9z(XPb||w?e?$t%c6k| zYScpdj8+9%odDR0Os=fjENkBWv7h<P;e8O;!|YsrZTiXLis!GTut^QQ^$b!^#CA;d zlYM1`U^6MwaFI4nOF>IbFtUb&bju>o5Fv(f5J)wkMnno$Tl`-y*gAgBFI<e3-FCx! zJDSb&izf_!TR-RPkP@vZA4OfSovaU7`a-SL)MH*i9N4VZ&YYBW5&>rOjP}Q^3D)br zyC35~YnzE<(1o;GA(NBP*AX{cS}uYVZLxrv_iFtvSi~mu$?^4IT)8npW@6$I-HPMc zb;QyJEk)>N1GyC7aw;w&3Q!m9rO`KIa7kjS<Kc?X?cD+=f-8J~xdo=V5EDe^oJz93 zM}%KZY9E1G+n|HnGzM+nfQo^^cJuOnn_KM%oQTX8%?soFmyv1g7#gdhsMH_>n-ws~ zh^DC!!CJBNPn0&K*`TzjwjS?dEF&I_nir}j4~d_v04IACJ2D(PRIS}Fow$q`u>j&# zKv6BPgd!8H=1B0M=D6Ii=uH-ao-W`oxk4Zne^8<Yfpo~Y1yTvvVrN)_XvH8EapS!h z7-+r&q>xqE)&itMK#H}ON$Y{M10-t-%0Ao+qzIDBAf@X7EdEZX&0)*OpahiZy;_-2 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 LJxJVTA;o_O^!4_c literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/ThirdParty/google-earth-dbroot-parser.js b/web/assets/Cesium/ThirdParty/google-earth-dbroot-parser.js new file mode 100644 index 00000000..7925f4f5 --- /dev/null +++ b/web/assets/Cesium/ThirdParty/google-earth-dbroot-parser.js @@ -0,0 +1 @@ +window.cesiumGoogleEarthDbRootParser=function(i){"use strict";var e,r,l=i.Reader,s=(i.Writer,i.util),p=[],c=i.roots.default||(i.roots.default={});function t(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function o(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function a(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function n(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function d(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function u(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function b(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function y(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function f(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function h(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function m(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function v(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function g(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function P(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function O(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}return c.keyhole=((r={}).dbroot=((e={}).StringEntryProto=(t.prototype.stringId=0,t.prototype.stringValue="",t.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.StringEntryProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.stringId=e.fixed32();break;case 2:o.stringValue=e.string();break;default:e.skipType(7&a)}}return o},t.verify=function(e){return"object"!=typeof e||null===e?"object expected":s.isInteger(e.stringId)?s.isString(e.stringValue)?null:"stringValue: string expected":"stringId: integer expected"},t.from=t.fromObject=function(e){if(e instanceof c.keyhole.dbroot.StringEntryProto)return e;var r=new c.keyhole.dbroot.StringEntryProto;return void 0!==e.stringId&&null!==e.stringId&&(r.stringId=e.stringId>>>0),void 0!==e.stringValue&&null!==e.stringValue&&(r.stringValue=String(e.stringValue)),r},t.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.stringId=0,t.stringValue=""),void 0!==e.stringId&&null!==e.stringId&&e.hasOwnProperty("stringId")&&(t.stringId=e.stringId),void 0!==e.stringValue&&null!==e.stringValue&&e.hasOwnProperty("stringValue")&&(t.stringValue=e.stringValue),t},t.prototype.toObject=function(e){return this.constructor.toObject(this,e)},t.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},t),e.StringIdOrValueProto=(o.prototype.stringId=0,o.prototype.value="",o.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.StringIdOrValueProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.stringId=e.fixed32();break;case 2:o.value=e.string();break;default:e.skipType(7&a)}}return o},o.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.stringId||s.isInteger(e.stringId)?void 0===e.value||s.isString(e.value)?null:"value: string expected":"stringId: integer expected"},o.from=o.fromObject=function(e){if(e instanceof c.keyhole.dbroot.StringIdOrValueProto)return e;var r=new c.keyhole.dbroot.StringIdOrValueProto;return void 0!==e.stringId&&null!==e.stringId&&(r.stringId=e.stringId>>>0),void 0!==e.value&&null!==e.value&&(r.value=String(e.value)),r},o.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.stringId=0,t.value=""),void 0!==e.stringId&&null!==e.stringId&&e.hasOwnProperty("stringId")&&(t.stringId=e.stringId),void 0!==e.value&&null!==e.value&&e.hasOwnProperty("value")&&(t.value=e.value),t},o.prototype.toObject=function(e){return this.constructor.toObject(this,e)},o.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},o),e.PlanetModelProto=(a.prototype.radius=6378.137,a.prototype.flattening=.00335281066474748,a.prototype.elevationBias=0,a.prototype.negativeAltitudeExponentBias=0,a.prototype.compressedNegativeAltitudeThreshold=0,a.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.PlanetModelProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.radius=e.double();break;case 2:o.flattening=e.double();break;case 4:o.elevationBias=e.double();break;case 5:o.negativeAltitudeExponentBias=e.int32();break;case 6:o.compressedNegativeAltitudeThreshold=e.double();break;default:e.skipType(7&a)}}return o},a.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.radius&&"number"!=typeof e.radius?"radius: number expected":void 0!==e.flattening&&"number"!=typeof e.flattening?"flattening: number expected":void 0!==e.elevationBias&&"number"!=typeof e.elevationBias?"elevationBias: number expected":void 0===e.negativeAltitudeExponentBias||s.isInteger(e.negativeAltitudeExponentBias)?void 0!==e.compressedNegativeAltitudeThreshold&&"number"!=typeof e.compressedNegativeAltitudeThreshold?"compressedNegativeAltitudeThreshold: number expected":null:"negativeAltitudeExponentBias: integer expected"},a.from=a.fromObject=function(e){if(e instanceof c.keyhole.dbroot.PlanetModelProto)return e;var r=new c.keyhole.dbroot.PlanetModelProto;return void 0!==e.radius&&null!==e.radius&&(r.radius=Number(e.radius)),void 0!==e.flattening&&null!==e.flattening&&(r.flattening=Number(e.flattening)),void 0!==e.elevationBias&&null!==e.elevationBias&&(r.elevationBias=Number(e.elevationBias)),void 0!==e.negativeAltitudeExponentBias&&null!==e.negativeAltitudeExponentBias&&(r.negativeAltitudeExponentBias=0|e.negativeAltitudeExponentBias),void 0!==e.compressedNegativeAltitudeThreshold&&null!==e.compressedNegativeAltitudeThreshold&&(r.compressedNegativeAltitudeThreshold=Number(e.compressedNegativeAltitudeThreshold)),r},a.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.radius=6378.137,t.flattening=.00335281066474748,t.elevationBias=0,t.negativeAltitudeExponentBias=0,t.compressedNegativeAltitudeThreshold=0),void 0!==e.radius&&null!==e.radius&&e.hasOwnProperty("radius")&&(t.radius=e.radius),void 0!==e.flattening&&null!==e.flattening&&e.hasOwnProperty("flattening")&&(t.flattening=e.flattening),void 0!==e.elevationBias&&null!==e.elevationBias&&e.hasOwnProperty("elevationBias")&&(t.elevationBias=e.elevationBias),void 0!==e.negativeAltitudeExponentBias&&null!==e.negativeAltitudeExponentBias&&e.hasOwnProperty("negativeAltitudeExponentBias")&&(t.negativeAltitudeExponentBias=e.negativeAltitudeExponentBias),void 0!==e.compressedNegativeAltitudeThreshold&&null!==e.compressedNegativeAltitudeThreshold&&e.hasOwnProperty("compressedNegativeAltitudeThreshold")&&(t.compressedNegativeAltitudeThreshold=e.compressedNegativeAltitudeThreshold),t},a.prototype.toObject=function(e){return this.constructor.toObject(this,e)},a.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},a),e.ProviderInfoProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.providerId=0,e.prototype.copyrightString=null,e.prototype.verticalPixelOffset=-1;var n={1:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ProviderInfoProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.providerId=e.int32();break;case 2:o.copyrightString=n[1].decode(e,e.uint32());break;case 3:o.verticalPixelOffset=e.int32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isInteger(e.providerId))return"providerId: integer expected";if(void 0!==e.copyrightString&&null!==e.copyrightString){var r=n[1].verify(e.copyrightString);if(r)return"copyrightString."+r}return void 0===e.verticalPixelOffset||s.isInteger(e.verticalPixelOffset)?null:"verticalPixelOffset: integer expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ProviderInfoProto)return e;var r=new c.keyhole.dbroot.ProviderInfoProto;if(void 0!==e.providerId&&null!==e.providerId&&(r.providerId=0|e.providerId),void 0!==e.copyrightString&&null!==e.copyrightString){if("object"!=typeof e.copyrightString)throw TypeError(".keyhole.dbroot.ProviderInfoProto.copyrightString: object expected");r.copyrightString=n[1].fromObject(e.copyrightString)}return void 0!==e.verticalPixelOffset&&null!==e.verticalPixelOffset&&(r.verticalPixelOffset=0|e.verticalPixelOffset),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.providerId=0,t.copyrightString=null,t.verticalPixelOffset=-1),void 0!==e.providerId&&null!==e.providerId&&e.hasOwnProperty("providerId")&&(t.providerId=e.providerId),void 0!==e.copyrightString&&null!==e.copyrightString&&e.hasOwnProperty("copyrightString")&&(t.copyrightString=n[1].toObject(e.copyrightString,r)),void 0!==e.verticalPixelOffset&&null!==e.verticalPixelOffset&&e.hasOwnProperty("verticalPixelOffset")&&(t.verticalPixelOffset=e.verticalPixelOffset),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.PopUpProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.isBalloonStyle=!1,e.prototype.text=null,e.prototype.backgroundColorAbgr=4294967295,e.prototype.textColorAbgr=4278190080;var n={1:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.PopUpProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.isBalloonStyle=e.bool();break;case 2:o.text=n[1].decode(e,e.uint32());break;case 3:o.backgroundColorAbgr=e.fixed32();break;case 4:o.textColorAbgr=e.fixed32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.isBalloonStyle&&"boolean"!=typeof e.isBalloonStyle)return"isBalloonStyle: boolean expected";if(void 0!==e.text&&null!==e.text){var r=n[1].verify(e.text);if(r)return"text."+r}return void 0===e.backgroundColorAbgr||s.isInteger(e.backgroundColorAbgr)?void 0===e.textColorAbgr||s.isInteger(e.textColorAbgr)?null:"textColorAbgr: integer expected":"backgroundColorAbgr: integer expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.PopUpProto)return e;var r=new c.keyhole.dbroot.PopUpProto;if(void 0!==e.isBalloonStyle&&null!==e.isBalloonStyle&&(r.isBalloonStyle=Boolean(e.isBalloonStyle)),void 0!==e.text&&null!==e.text){if("object"!=typeof e.text)throw TypeError(".keyhole.dbroot.PopUpProto.text: object expected");r.text=n[1].fromObject(e.text)}return void 0!==e.backgroundColorAbgr&&null!==e.backgroundColorAbgr&&(r.backgroundColorAbgr=e.backgroundColorAbgr>>>0),void 0!==e.textColorAbgr&&null!==e.textColorAbgr&&(r.textColorAbgr=e.textColorAbgr>>>0),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.isBalloonStyle=!1,t.text=null,t.backgroundColorAbgr=4294967295,t.textColorAbgr=4278190080),void 0!==e.isBalloonStyle&&null!==e.isBalloonStyle&&e.hasOwnProperty("isBalloonStyle")&&(t.isBalloonStyle=e.isBalloonStyle),void 0!==e.text&&null!==e.text&&e.hasOwnProperty("text")&&(t.text=n[1].toObject(e.text,r)),void 0!==e.backgroundColorAbgr&&null!==e.backgroundColorAbgr&&e.hasOwnProperty("backgroundColorAbgr")&&(t.backgroundColorAbgr=e.backgroundColorAbgr),void 0!==e.textColorAbgr&&null!==e.textColorAbgr&&e.hasOwnProperty("textColorAbgr")&&(t.textColorAbgr=e.textColorAbgr),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.StyleAttributeProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.styleId="",e.prototype.providerId=0,e.prototype.polyColorAbgr=4294967295,e.prototype.lineColorAbgr=4294967295,e.prototype.lineWidth=1,e.prototype.labelColorAbgr=4294967295,e.prototype.labelScale=1,e.prototype.placemarkIconColorAbgr=4294967295,e.prototype.placemarkIconScale=1,e.prototype.placemarkIconPath=null,e.prototype.placemarkIconX=0,e.prototype.placemarkIconY=0,e.prototype.placemarkIconWidth=32,e.prototype.placemarkIconHeight=32,e.prototype.popUp=null,e.prototype.drawFlag=s.emptyArray;var n={9:"keyhole.dbroot.StringIdOrValueProto",14:"keyhole.dbroot.PopUpProto",15:"keyhole.dbroot.DrawFlagProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.StyleAttributeProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.styleId=e.string();break;case 3:o.providerId=e.int32();break;case 4:o.polyColorAbgr=e.fixed32();break;case 5:o.lineColorAbgr=e.fixed32();break;case 6:o.lineWidth=e.float();break;case 7:o.labelColorAbgr=e.fixed32();break;case 8:o.labelScale=e.float();break;case 9:o.placemarkIconColorAbgr=e.fixed32();break;case 10:o.placemarkIconScale=e.float();break;case 11:o.placemarkIconPath=n[9].decode(e,e.uint32());break;case 12:o.placemarkIconX=e.int32();break;case 13:o.placemarkIconY=e.int32();break;case 14:o.placemarkIconWidth=e.int32();break;case 15:o.placemarkIconHeight=e.int32();break;case 16:o.popUp=n[14].decode(e,e.uint32());break;case 17:o.drawFlag&&o.drawFlag.length||(o.drawFlag=[]),o.drawFlag.push(n[15].decode(e,e.uint32()));break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isString(e.styleId))return"styleId: string expected";if(void 0!==e.providerId&&!s.isInteger(e.providerId))return"providerId: integer expected";if(void 0!==e.polyColorAbgr&&!s.isInteger(e.polyColorAbgr))return"polyColorAbgr: integer expected";if(void 0!==e.lineColorAbgr&&!s.isInteger(e.lineColorAbgr))return"lineColorAbgr: integer expected";if(void 0!==e.lineWidth&&"number"!=typeof e.lineWidth)return"lineWidth: number expected";if(void 0!==e.labelColorAbgr&&!s.isInteger(e.labelColorAbgr))return"labelColorAbgr: integer expected";if(void 0!==e.labelScale&&"number"!=typeof e.labelScale)return"labelScale: number expected";if(void 0!==e.placemarkIconColorAbgr&&!s.isInteger(e.placemarkIconColorAbgr))return"placemarkIconColorAbgr: integer expected";if(void 0!==e.placemarkIconScale&&"number"!=typeof e.placemarkIconScale)return"placemarkIconScale: number expected";if(void 0!==e.placemarkIconPath&&null!==e.placemarkIconPath&&(r=n[9].verify(e.placemarkIconPath)))return"placemarkIconPath."+r;if(void 0!==e.placemarkIconX&&!s.isInteger(e.placemarkIconX))return"placemarkIconX: integer expected";if(void 0!==e.placemarkIconY&&!s.isInteger(e.placemarkIconY))return"placemarkIconY: integer expected";if(void 0!==e.placemarkIconWidth&&!s.isInteger(e.placemarkIconWidth))return"placemarkIconWidth: integer expected";if(void 0!==e.placemarkIconHeight&&!s.isInteger(e.placemarkIconHeight))return"placemarkIconHeight: integer expected";if(void 0!==e.popUp&&null!==e.popUp&&(r=n[14].verify(e.popUp)))return"popUp."+r;if(void 0!==e.drawFlag){if(!Array.isArray(e.drawFlag))return"drawFlag: array expected";for(var r,t=0;t<e.drawFlag.length;++t)if(r=n[15].verify(e.drawFlag[t]))return"drawFlag."+r}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.StyleAttributeProto)return e;var r=new c.keyhole.dbroot.StyleAttributeProto;if(void 0!==e.styleId&&null!==e.styleId&&(r.styleId=String(e.styleId)),void 0!==e.providerId&&null!==e.providerId&&(r.providerId=0|e.providerId),void 0!==e.polyColorAbgr&&null!==e.polyColorAbgr&&(r.polyColorAbgr=e.polyColorAbgr>>>0),void 0!==e.lineColorAbgr&&null!==e.lineColorAbgr&&(r.lineColorAbgr=e.lineColorAbgr>>>0),void 0!==e.lineWidth&&null!==e.lineWidth&&(r.lineWidth=Number(e.lineWidth)),void 0!==e.labelColorAbgr&&null!==e.labelColorAbgr&&(r.labelColorAbgr=e.labelColorAbgr>>>0),void 0!==e.labelScale&&null!==e.labelScale&&(r.labelScale=Number(e.labelScale)),void 0!==e.placemarkIconColorAbgr&&null!==e.placemarkIconColorAbgr&&(r.placemarkIconColorAbgr=e.placemarkIconColorAbgr>>>0),void 0!==e.placemarkIconScale&&null!==e.placemarkIconScale&&(r.placemarkIconScale=Number(e.placemarkIconScale)),void 0!==e.placemarkIconPath&&null!==e.placemarkIconPath){if("object"!=typeof e.placemarkIconPath)throw TypeError(".keyhole.dbroot.StyleAttributeProto.placemarkIconPath: object expected");r.placemarkIconPath=n[9].fromObject(e.placemarkIconPath)}if(void 0!==e.placemarkIconX&&null!==e.placemarkIconX&&(r.placemarkIconX=0|e.placemarkIconX),void 0!==e.placemarkIconY&&null!==e.placemarkIconY&&(r.placemarkIconY=0|e.placemarkIconY),void 0!==e.placemarkIconWidth&&null!==e.placemarkIconWidth&&(r.placemarkIconWidth=0|e.placemarkIconWidth),void 0!==e.placemarkIconHeight&&null!==e.placemarkIconHeight&&(r.placemarkIconHeight=0|e.placemarkIconHeight),void 0!==e.popUp&&null!==e.popUp){if("object"!=typeof e.popUp)throw TypeError(".keyhole.dbroot.StyleAttributeProto.popUp: object expected");r.popUp=n[14].fromObject(e.popUp)}if(e.drawFlag){if(!Array.isArray(e.drawFlag))throw TypeError(".keyhole.dbroot.StyleAttributeProto.drawFlag: array expected");r.drawFlag=[];for(var t=0;t<e.drawFlag.length;++t){if("object"!=typeof e.drawFlag[t])throw TypeError(".keyhole.dbroot.StyleAttributeProto.drawFlag: object expected");r.drawFlag[t]=n[15].fromObject(e.drawFlag[t])}}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.drawFlag=[]),r.defaults&&(t.styleId="",t.providerId=0,t.polyColorAbgr=4294967295,t.lineColorAbgr=4294967295,t.lineWidth=1,t.labelColorAbgr=4294967295,t.labelScale=1,t.placemarkIconColorAbgr=4294967295,t.placemarkIconScale=1,t.placemarkIconPath=null,t.placemarkIconX=0,t.placemarkIconY=0,t.placemarkIconWidth=32,t.placemarkIconHeight=32,t.popUp=null),void 0!==e.styleId&&null!==e.styleId&&e.hasOwnProperty("styleId")&&(t.styleId=e.styleId),void 0!==e.providerId&&null!==e.providerId&&e.hasOwnProperty("providerId")&&(t.providerId=e.providerId),void 0!==e.polyColorAbgr&&null!==e.polyColorAbgr&&e.hasOwnProperty("polyColorAbgr")&&(t.polyColorAbgr=e.polyColorAbgr),void 0!==e.lineColorAbgr&&null!==e.lineColorAbgr&&e.hasOwnProperty("lineColorAbgr")&&(t.lineColorAbgr=e.lineColorAbgr),void 0!==e.lineWidth&&null!==e.lineWidth&&e.hasOwnProperty("lineWidth")&&(t.lineWidth=e.lineWidth),void 0!==e.labelColorAbgr&&null!==e.labelColorAbgr&&e.hasOwnProperty("labelColorAbgr")&&(t.labelColorAbgr=e.labelColorAbgr),void 0!==e.labelScale&&null!==e.labelScale&&e.hasOwnProperty("labelScale")&&(t.labelScale=e.labelScale),void 0!==e.placemarkIconColorAbgr&&null!==e.placemarkIconColorAbgr&&e.hasOwnProperty("placemarkIconColorAbgr")&&(t.placemarkIconColorAbgr=e.placemarkIconColorAbgr),void 0!==e.placemarkIconScale&&null!==e.placemarkIconScale&&e.hasOwnProperty("placemarkIconScale")&&(t.placemarkIconScale=e.placemarkIconScale),void 0!==e.placemarkIconPath&&null!==e.placemarkIconPath&&e.hasOwnProperty("placemarkIconPath")&&(t.placemarkIconPath=n[9].toObject(e.placemarkIconPath,r)),void 0!==e.placemarkIconX&&null!==e.placemarkIconX&&e.hasOwnProperty("placemarkIconX")&&(t.placemarkIconX=e.placemarkIconX),void 0!==e.placemarkIconY&&null!==e.placemarkIconY&&e.hasOwnProperty("placemarkIconY")&&(t.placemarkIconY=e.placemarkIconY),void 0!==e.placemarkIconWidth&&null!==e.placemarkIconWidth&&e.hasOwnProperty("placemarkIconWidth")&&(t.placemarkIconWidth=e.placemarkIconWidth),void 0!==e.placemarkIconHeight&&null!==e.placemarkIconHeight&&e.hasOwnProperty("placemarkIconHeight")&&(t.placemarkIconHeight=e.placemarkIconHeight),void 0!==e.popUp&&null!==e.popUp&&e.hasOwnProperty("popUp")&&(t.popUp=n[14].toObject(e.popUp,r)),void 0!==e.drawFlag&&null!==e.drawFlag&&e.hasOwnProperty("drawFlag")){t.drawFlag=[];for(var o=0;o<e.drawFlag.length;++o)t.drawFlag[o]=n[15].toObject(e.drawFlag[o],r)}return t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.StyleMapProto=(n.prototype.styleMapId=0,n.prototype.channelId=s.emptyArray,n.prototype.normalStyleAttribute=0,n.prototype.highlightStyleAttribute=0,n.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.StyleMapProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.styleMapId=e.int32();break;case 2:if(o.channelId&&o.channelId.length||(o.channelId=[]),2==(7&a))for(var n=e.uint32()+e.pos;e.pos<n;)o.channelId.push(e.int32());else o.channelId.push(e.int32());break;case 3:o.normalStyleAttribute=e.int32();break;case 4:o.highlightStyleAttribute=e.int32();break;default:e.skipType(7&a)}}return o},n.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isInteger(e.styleMapId))return"styleMapId: integer expected";if(void 0!==e.channelId){if(!Array.isArray(e.channelId))return"channelId: array expected";for(var r=0;r<e.channelId.length;++r)if(!s.isInteger(e.channelId[r]))return"channelId: integer[] expected"}return void 0===e.normalStyleAttribute||s.isInteger(e.normalStyleAttribute)?void 0===e.highlightStyleAttribute||s.isInteger(e.highlightStyleAttribute)?null:"highlightStyleAttribute: integer expected":"normalStyleAttribute: integer expected"},n.from=n.fromObject=function(e){if(e instanceof c.keyhole.dbroot.StyleMapProto)return e;var r=new c.keyhole.dbroot.StyleMapProto;if(void 0!==e.styleMapId&&null!==e.styleMapId&&(r.styleMapId=0|e.styleMapId),e.channelId){if(!Array.isArray(e.channelId))throw TypeError(".keyhole.dbroot.StyleMapProto.channelId: array expected");r.channelId=[];for(var t=0;t<e.channelId.length;++t)r.channelId[t]=0|e.channelId[t]}return void 0!==e.normalStyleAttribute&&null!==e.normalStyleAttribute&&(r.normalStyleAttribute=0|e.normalStyleAttribute),void 0!==e.highlightStyleAttribute&&null!==e.highlightStyleAttribute&&(r.highlightStyleAttribute=0|e.highlightStyleAttribute),r},n.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.channelId=[]),r.defaults&&(t.styleMapId=0,t.normalStyleAttribute=0,t.highlightStyleAttribute=0),void 0!==e.styleMapId&&null!==e.styleMapId&&e.hasOwnProperty("styleMapId")&&(t.styleMapId=e.styleMapId),void 0!==e.channelId&&null!==e.channelId&&e.hasOwnProperty("channelId")){t.channelId=[];for(var o=0;o<e.channelId.length;++o)t.channelId[o]=e.channelId[o]}return void 0!==e.normalStyleAttribute&&null!==e.normalStyleAttribute&&e.hasOwnProperty("normalStyleAttribute")&&(t.normalStyleAttribute=e.normalStyleAttribute),void 0!==e.highlightStyleAttribute&&null!==e.highlightStyleAttribute&&e.hasOwnProperty("highlightStyleAttribute")&&(t.highlightStyleAttribute=e.highlightStyleAttribute),t},n.prototype.toObject=function(e){return this.constructor.toObject(this,e)},n.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},n),e.ZoomRangeProto=(d.prototype.minZoom=0,d.prototype.maxZoom=0,d.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ZoomRangeProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.minZoom=e.int32();break;case 2:o.maxZoom=e.int32();break;default:e.skipType(7&a)}}return o},d.verify=function(e){return"object"!=typeof e||null===e?"object expected":s.isInteger(e.minZoom)?s.isInteger(e.maxZoom)?null:"maxZoom: integer expected":"minZoom: integer expected"},d.from=d.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ZoomRangeProto)return e;var r=new c.keyhole.dbroot.ZoomRangeProto;return void 0!==e.minZoom&&null!==e.minZoom&&(r.minZoom=0|e.minZoom),void 0!==e.maxZoom&&null!==e.maxZoom&&(r.maxZoom=0|e.maxZoom),r},d.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.minZoom=0,t.maxZoom=0),void 0!==e.minZoom&&null!==e.minZoom&&e.hasOwnProperty("minZoom")&&(t.minZoom=e.minZoom),void 0!==e.maxZoom&&null!==e.maxZoom&&e.hasOwnProperty("maxZoom")&&(t.maxZoom=e.maxZoom),t},d.prototype.toObject=function(e){return this.constructor.toObject(this,e)},d.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},d),e.DrawFlagProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.drawFlagType=1;var r,o={0:"keyhole.dbroot.DrawFlagProto.DrawFlagType"};return p.push(o),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.DrawFlagProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.drawFlagType=e.uint32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";switch(e.drawFlagType){default:return"drawFlagType: enum value expected";case 1:case 2:case 3:case 4:case 5:}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.DrawFlagProto)return e;var r=new c.keyhole.dbroot.DrawFlagProto;switch(e.drawFlagType){case"TYPE_FILL_ONLY":case 1:r.drawFlagType=1;break;case"TYPE_OUTLINE_ONLY":case 2:r.drawFlagType=2;break;case"TYPE_FILL_AND_OUTLINE":case 3:r.drawFlagType=3;break;case"TYPE_ANTIALIASING":case 4:r.drawFlagType=4;break;case"TYPE_CENTER_LABEL":case 5:r.drawFlagType=5}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.drawFlagType=r.enums===String?"TYPE_FILL_ONLY":1),void 0!==e.drawFlagType&&null!==e.drawFlagType&&e.hasOwnProperty("drawFlagType")&&(t.drawFlagType=r.enums===String?o[0][e.drawFlagType]:e.drawFlagType),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.DrawFlagType=((r=Object.create({})).TYPE_FILL_ONLY=1,r.TYPE_OUTLINE_ONLY=2,r.TYPE_FILL_AND_OUTLINE=3,r.TYPE_ANTIALIASING=4,r.TYPE_CENTER_LABEL=5,r),e}(),e.LayerProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.zoomRange=s.emptyArray,e.prototype.preserveTextLevel=30,e.prototype.lodBeginTransition=!1,e.prototype.lodEndTransition=!1;var n={0:"keyhole.dbroot.ZoomRangeProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.LayerProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.zoomRange&&o.zoomRange.length||(o.zoomRange=[]),o.zoomRange.push(n[0].decode(e,e.uint32()));break;case 2:o.preserveTextLevel=e.int32();break;case 4:o.lodBeginTransition=e.bool();break;case 5:o.lodEndTransition=e.bool();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.zoomRange){if(!Array.isArray(e.zoomRange))return"zoomRange: array expected";for(var r=0;r<e.zoomRange.length;++r){var t=n[0].verify(e.zoomRange[r]);if(t)return"zoomRange."+t}}return void 0===e.preserveTextLevel||s.isInteger(e.preserveTextLevel)?void 0!==e.lodBeginTransition&&"boolean"!=typeof e.lodBeginTransition?"lodBeginTransition: boolean expected":void 0!==e.lodEndTransition&&"boolean"!=typeof e.lodEndTransition?"lodEndTransition: boolean expected":null:"preserveTextLevel: integer expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.LayerProto)return e;var r=new c.keyhole.dbroot.LayerProto;if(e.zoomRange){if(!Array.isArray(e.zoomRange))throw TypeError(".keyhole.dbroot.LayerProto.zoomRange: array expected");r.zoomRange=[];for(var t=0;t<e.zoomRange.length;++t){if("object"!=typeof e.zoomRange[t])throw TypeError(".keyhole.dbroot.LayerProto.zoomRange: object expected");r.zoomRange[t]=n[0].fromObject(e.zoomRange[t])}}return void 0!==e.preserveTextLevel&&null!==e.preserveTextLevel&&(r.preserveTextLevel=0|e.preserveTextLevel),void 0!==e.lodBeginTransition&&null!==e.lodBeginTransition&&(r.lodBeginTransition=Boolean(e.lodBeginTransition)),void 0!==e.lodEndTransition&&null!==e.lodEndTransition&&(r.lodEndTransition=Boolean(e.lodEndTransition)),r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.zoomRange=[]),r.defaults&&(t.preserveTextLevel=30,t.lodBeginTransition=!1,t.lodEndTransition=!1),void 0!==e.zoomRange&&null!==e.zoomRange&&e.hasOwnProperty("zoomRange")){t.zoomRange=[];for(var o=0;o<e.zoomRange.length;++o)t.zoomRange[o]=n[0].toObject(e.zoomRange[o],r)}return void 0!==e.preserveTextLevel&&null!==e.preserveTextLevel&&e.hasOwnProperty("preserveTextLevel")&&(t.preserveTextLevel=e.preserveTextLevel),void 0!==e.lodBeginTransition&&null!==e.lodBeginTransition&&e.hasOwnProperty("lodBeginTransition")&&(t.lodBeginTransition=e.lodBeginTransition),void 0!==e.lodEndTransition&&null!==e.lodEndTransition&&e.hasOwnProperty("lodEndTransition")&&(t.lodEndTransition=e.lodEndTransition),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.FolderProto=(u.prototype.isExpandable=!0,u.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.FolderProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.isExpandable=e.bool();break;default:e.skipType(7&a)}}return o},u.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.isExpandable&&"boolean"!=typeof e.isExpandable?"isExpandable: boolean expected":null},u.from=u.fromObject=function(e){if(e instanceof c.keyhole.dbroot.FolderProto)return e;var r=new c.keyhole.dbroot.FolderProto;return void 0!==e.isExpandable&&null!==e.isExpandable&&(r.isExpandable=Boolean(e.isExpandable)),r},u.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.isExpandable=!0),void 0!==e.isExpandable&&null!==e.isExpandable&&e.hasOwnProperty("isExpandable")&&(t.isExpandable=e.isExpandable),t},u.prototype.toObject=function(e){return this.constructor.toObject(this,e)},u.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},u),e.RequirementProto=(b.prototype.requiredVram="",b.prototype.requiredClientVer="",b.prototype.probability="",b.prototype.requiredUserAgent="",b.prototype.requiredClientCapabilities="",b.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.RequirementProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 3:o.requiredVram=e.string();break;case 4:o.requiredClientVer=e.string();break;case 5:o.probability=e.string();break;case 6:o.requiredUserAgent=e.string();break;case 7:o.requiredClientCapabilities=e.string();break;default:e.skipType(7&a)}}return o},b.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.requiredVram||s.isString(e.requiredVram)?void 0===e.requiredClientVer||s.isString(e.requiredClientVer)?void 0===e.probability||s.isString(e.probability)?void 0===e.requiredUserAgent||s.isString(e.requiredUserAgent)?void 0===e.requiredClientCapabilities||s.isString(e.requiredClientCapabilities)?null:"requiredClientCapabilities: string expected":"requiredUserAgent: string expected":"probability: string expected":"requiredClientVer: string expected":"requiredVram: string expected"},b.from=b.fromObject=function(e){if(e instanceof c.keyhole.dbroot.RequirementProto)return e;var r=new c.keyhole.dbroot.RequirementProto;return void 0!==e.requiredVram&&null!==e.requiredVram&&(r.requiredVram=String(e.requiredVram)),void 0!==e.requiredClientVer&&null!==e.requiredClientVer&&(r.requiredClientVer=String(e.requiredClientVer)),void 0!==e.probability&&null!==e.probability&&(r.probability=String(e.probability)),void 0!==e.requiredUserAgent&&null!==e.requiredUserAgent&&(r.requiredUserAgent=String(e.requiredUserAgent)),void 0!==e.requiredClientCapabilities&&null!==e.requiredClientCapabilities&&(r.requiredClientCapabilities=String(e.requiredClientCapabilities)),r},b.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.requiredVram="",t.requiredClientVer="",t.probability="",t.requiredUserAgent="",t.requiredClientCapabilities=""),void 0!==e.requiredVram&&null!==e.requiredVram&&e.hasOwnProperty("requiredVram")&&(t.requiredVram=e.requiredVram),void 0!==e.requiredClientVer&&null!==e.requiredClientVer&&e.hasOwnProperty("requiredClientVer")&&(t.requiredClientVer=e.requiredClientVer),void 0!==e.probability&&null!==e.probability&&e.hasOwnProperty("probability")&&(t.probability=e.probability),void 0!==e.requiredUserAgent&&null!==e.requiredUserAgent&&e.hasOwnProperty("requiredUserAgent")&&(t.requiredUserAgent=e.requiredUserAgent),void 0!==e.requiredClientCapabilities&&null!==e.requiredClientCapabilities&&e.hasOwnProperty("requiredClientCapabilities")&&(t.requiredClientCapabilities=e.requiredClientCapabilities),t},b.prototype.toObject=function(e){return this.constructor.toObject(this,e)},b.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},b),e.LookAtProto=(y.prototype.longitude=0,y.prototype.latitude=0,y.prototype.range=0,y.prototype.tilt=0,y.prototype.heading=0,y.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.LookAtProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.longitude=e.float();break;case 2:o.latitude=e.float();break;case 3:o.range=e.float();break;case 4:o.tilt=e.float();break;case 5:o.heading=e.float();break;default:e.skipType(7&a)}}return o},y.verify=function(e){return"object"!=typeof e||null===e?"object expected":"number"!=typeof e.longitude?"longitude: number expected":"number"!=typeof e.latitude?"latitude: number expected":void 0!==e.range&&"number"!=typeof e.range?"range: number expected":void 0!==e.tilt&&"number"!=typeof e.tilt?"tilt: number expected":void 0!==e.heading&&"number"!=typeof e.heading?"heading: number expected":null},y.from=y.fromObject=function(e){if(e instanceof c.keyhole.dbroot.LookAtProto)return e;var r=new c.keyhole.dbroot.LookAtProto;return void 0!==e.longitude&&null!==e.longitude&&(r.longitude=Number(e.longitude)),void 0!==e.latitude&&null!==e.latitude&&(r.latitude=Number(e.latitude)),void 0!==e.range&&null!==e.range&&(r.range=Number(e.range)),void 0!==e.tilt&&null!==e.tilt&&(r.tilt=Number(e.tilt)),void 0!==e.heading&&null!==e.heading&&(r.heading=Number(e.heading)),r},y.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.longitude=0,t.latitude=0,t.range=0,t.tilt=0,t.heading=0),void 0!==e.longitude&&null!==e.longitude&&e.hasOwnProperty("longitude")&&(t.longitude=e.longitude),void 0!==e.latitude&&null!==e.latitude&&e.hasOwnProperty("latitude")&&(t.latitude=e.latitude),void 0!==e.range&&null!==e.range&&e.hasOwnProperty("range")&&(t.range=e.range),void 0!==e.tilt&&null!==e.tilt&&e.hasOwnProperty("tilt")&&(t.tilt=e.tilt),void 0!==e.heading&&null!==e.heading&&e.hasOwnProperty("heading")&&(t.heading=e.heading),t},y.prototype.toObject=function(e){return this.constructor.toObject(this,e)},y.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},y),e.NestedFeatureProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.featureType=1,e.prototype.kmlUrl=null,e.prototype.databaseUrl="",e.prototype.layer=null,e.prototype.folder=null,e.prototype.requirement=null,e.prototype.channelId=0,e.prototype.displayName=null,e.prototype.isVisible=!0,e.prototype.isEnabled=!0,e.prototype.isChecked=!1,e.prototype.layerMenuIconPath="icons/773_l.png",e.prototype.description=null,e.prototype.lookAt=null,e.prototype.assetUuid="",e.prototype.isSaveLocked=!0,e.prototype.children=s.emptyArray,e.prototype.clientConfigScriptName="",e.prototype.dioramaDataChannelBase=-1,e.prototype.replicaDataChannelBase=-1;var r,n={0:"keyhole.dbroot.NestedFeatureProto.FeatureType",1:"keyhole.dbroot.StringIdOrValueProto",3:"keyhole.dbroot.LayerProto",4:"keyhole.dbroot.FolderProto",5:"keyhole.dbroot.RequirementProto",7:"keyhole.dbroot.StringIdOrValueProto",12:"keyhole.dbroot.StringIdOrValueProto",13:"keyhole.dbroot.LookAtProto",16:"keyhole.dbroot.NestedFeatureProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.NestedFeatureProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.featureType=e.uint32();break;case 2:o.kmlUrl=n[1].decode(e,e.uint32());break;case 21:o.databaseUrl=e.string();break;case 3:o.layer=n[3].decode(e,e.uint32());break;case 4:o.folder=n[4].decode(e,e.uint32());break;case 5:o.requirement=n[5].decode(e,e.uint32());break;case 6:o.channelId=e.int32();break;case 7:o.displayName=n[7].decode(e,e.uint32());break;case 8:o.isVisible=e.bool();break;case 9:o.isEnabled=e.bool();break;case 10:o.isChecked=e.bool();break;case 11:o.layerMenuIconPath=e.string();break;case 12:o.description=n[12].decode(e,e.uint32());break;case 13:o.lookAt=n[13].decode(e,e.uint32());break;case 15:o.assetUuid=e.string();break;case 16:o.isSaveLocked=e.bool();break;case 17:o.children&&o.children.length||(o.children=[]),o.children.push(n[16].decode(e,e.uint32()));break;case 18:o.clientConfigScriptName=e.string();break;case 19:o.dioramaDataChannelBase=e.int32();break;case 20:o.replicaDataChannelBase=e.int32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.featureType)switch(e.featureType){default:return"featureType: enum value expected";case 1:case 2:case 3:case 4:}if(void 0!==e.kmlUrl&&null!==e.kmlUrl&&(r=n[1].verify(e.kmlUrl)))return"kmlUrl."+r;if(void 0!==e.databaseUrl&&!s.isString(e.databaseUrl))return"databaseUrl: string expected";if(void 0!==e.layer&&null!==e.layer&&(r=n[3].verify(e.layer)))return"layer."+r;if(void 0!==e.folder&&null!==e.folder&&(r=n[4].verify(e.folder)))return"folder."+r;if(void 0!==e.requirement&&null!==e.requirement&&(r=n[5].verify(e.requirement)))return"requirement."+r;if(!s.isInteger(e.channelId))return"channelId: integer expected";if(void 0!==e.displayName&&null!==e.displayName&&(r=n[7].verify(e.displayName)))return"displayName."+r;if(void 0!==e.isVisible&&"boolean"!=typeof e.isVisible)return"isVisible: boolean expected";if(void 0!==e.isEnabled&&"boolean"!=typeof e.isEnabled)return"isEnabled: boolean expected";if(void 0!==e.isChecked&&"boolean"!=typeof e.isChecked)return"isChecked: boolean expected";if(void 0!==e.layerMenuIconPath&&!s.isString(e.layerMenuIconPath))return"layerMenuIconPath: string expected";if(void 0!==e.description&&null!==e.description&&(r=n[12].verify(e.description)))return"description."+r;if(void 0!==e.lookAt&&null!==e.lookAt&&(r=n[13].verify(e.lookAt)))return"lookAt."+r;if(void 0!==e.assetUuid&&!s.isString(e.assetUuid))return"assetUuid: string expected";if(void 0!==e.isSaveLocked&&"boolean"!=typeof e.isSaveLocked)return"isSaveLocked: boolean expected";if(void 0!==e.children){if(!Array.isArray(e.children))return"children: array expected";for(var r,t=0;t<e.children.length;++t)if(r=n[16].verify(e.children[t]))return"children."+r}return void 0===e.clientConfigScriptName||s.isString(e.clientConfigScriptName)?void 0===e.dioramaDataChannelBase||s.isInteger(e.dioramaDataChannelBase)?void 0===e.replicaDataChannelBase||s.isInteger(e.replicaDataChannelBase)?null:"replicaDataChannelBase: integer expected":"dioramaDataChannelBase: integer expected":"clientConfigScriptName: string expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.NestedFeatureProto)return e;var r=new c.keyhole.dbroot.NestedFeatureProto;switch(e.featureType){case"TYPE_POINT_Z":case 1:r.featureType=1;break;case"TYPE_POLYGON_Z":case 2:r.featureType=2;break;case"TYPE_LINE_Z":case 3:r.featureType=3;break;case"TYPE_TERRAIN":case 4:r.featureType=4}if(void 0!==e.kmlUrl&&null!==e.kmlUrl){if("object"!=typeof e.kmlUrl)throw TypeError(".keyhole.dbroot.NestedFeatureProto.kmlUrl: object expected");r.kmlUrl=n[1].fromObject(e.kmlUrl)}if(void 0!==e.databaseUrl&&null!==e.databaseUrl&&(r.databaseUrl=String(e.databaseUrl)),void 0!==e.layer&&null!==e.layer){if("object"!=typeof e.layer)throw TypeError(".keyhole.dbroot.NestedFeatureProto.layer: object expected");r.layer=n[3].fromObject(e.layer)}if(void 0!==e.folder&&null!==e.folder){if("object"!=typeof e.folder)throw TypeError(".keyhole.dbroot.NestedFeatureProto.folder: object expected");r.folder=n[4].fromObject(e.folder)}if(void 0!==e.requirement&&null!==e.requirement){if("object"!=typeof e.requirement)throw TypeError(".keyhole.dbroot.NestedFeatureProto.requirement: object expected");r.requirement=n[5].fromObject(e.requirement)}if(void 0!==e.channelId&&null!==e.channelId&&(r.channelId=0|e.channelId),void 0!==e.displayName&&null!==e.displayName){if("object"!=typeof e.displayName)throw TypeError(".keyhole.dbroot.NestedFeatureProto.displayName: object expected");r.displayName=n[7].fromObject(e.displayName)}if(void 0!==e.isVisible&&null!==e.isVisible&&(r.isVisible=Boolean(e.isVisible)),void 0!==e.isEnabled&&null!==e.isEnabled&&(r.isEnabled=Boolean(e.isEnabled)),void 0!==e.isChecked&&null!==e.isChecked&&(r.isChecked=Boolean(e.isChecked)),void 0!==e.layerMenuIconPath&&null!==e.layerMenuIconPath&&(r.layerMenuIconPath=String(e.layerMenuIconPath)),void 0!==e.description&&null!==e.description){if("object"!=typeof e.description)throw TypeError(".keyhole.dbroot.NestedFeatureProto.description: object expected");r.description=n[12].fromObject(e.description)}if(void 0!==e.lookAt&&null!==e.lookAt){if("object"!=typeof e.lookAt)throw TypeError(".keyhole.dbroot.NestedFeatureProto.lookAt: object expected");r.lookAt=n[13].fromObject(e.lookAt)}if(void 0!==e.assetUuid&&null!==e.assetUuid&&(r.assetUuid=String(e.assetUuid)),void 0!==e.isSaveLocked&&null!==e.isSaveLocked&&(r.isSaveLocked=Boolean(e.isSaveLocked)),e.children){if(!Array.isArray(e.children))throw TypeError(".keyhole.dbroot.NestedFeatureProto.children: array expected");r.children=[];for(var t=0;t<e.children.length;++t){if("object"!=typeof e.children[t])throw TypeError(".keyhole.dbroot.NestedFeatureProto.children: object expected");r.children[t]=n[16].fromObject(e.children[t])}}return void 0!==e.clientConfigScriptName&&null!==e.clientConfigScriptName&&(r.clientConfigScriptName=String(e.clientConfigScriptName)),void 0!==e.dioramaDataChannelBase&&null!==e.dioramaDataChannelBase&&(r.dioramaDataChannelBase=0|e.dioramaDataChannelBase),void 0!==e.replicaDataChannelBase&&null!==e.replicaDataChannelBase&&(r.replicaDataChannelBase=0|e.replicaDataChannelBase),r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.children=[]),r.defaults&&(t.featureType=r.enums===String?"TYPE_POINT_Z":1,t.kmlUrl=null,t.databaseUrl="",t.layer=null,t.folder=null,t.requirement=null,t.channelId=0,t.displayName=null,t.isVisible=!0,t.isEnabled=!0,t.isChecked=!1,t.layerMenuIconPath="icons/773_l.png",t.description=null,t.lookAt=null,t.assetUuid="",t.isSaveLocked=!0,t.clientConfigScriptName="",t.dioramaDataChannelBase=-1,t.replicaDataChannelBase=-1),void 0!==e.featureType&&null!==e.featureType&&e.hasOwnProperty("featureType")&&(t.featureType=r.enums===String?n[0][e.featureType]:e.featureType),void 0!==e.kmlUrl&&null!==e.kmlUrl&&e.hasOwnProperty("kmlUrl")&&(t.kmlUrl=n[1].toObject(e.kmlUrl,r)),void 0!==e.databaseUrl&&null!==e.databaseUrl&&e.hasOwnProperty("databaseUrl")&&(t.databaseUrl=e.databaseUrl),void 0!==e.layer&&null!==e.layer&&e.hasOwnProperty("layer")&&(t.layer=n[3].toObject(e.layer,r)),void 0!==e.folder&&null!==e.folder&&e.hasOwnProperty("folder")&&(t.folder=n[4].toObject(e.folder,r)),void 0!==e.requirement&&null!==e.requirement&&e.hasOwnProperty("requirement")&&(t.requirement=n[5].toObject(e.requirement,r)),void 0!==e.channelId&&null!==e.channelId&&e.hasOwnProperty("channelId")&&(t.channelId=e.channelId),void 0!==e.displayName&&null!==e.displayName&&e.hasOwnProperty("displayName")&&(t.displayName=n[7].toObject(e.displayName,r)),void 0!==e.isVisible&&null!==e.isVisible&&e.hasOwnProperty("isVisible")&&(t.isVisible=e.isVisible),void 0!==e.isEnabled&&null!==e.isEnabled&&e.hasOwnProperty("isEnabled")&&(t.isEnabled=e.isEnabled),void 0!==e.isChecked&&null!==e.isChecked&&e.hasOwnProperty("isChecked")&&(t.isChecked=e.isChecked),void 0!==e.layerMenuIconPath&&null!==e.layerMenuIconPath&&e.hasOwnProperty("layerMenuIconPath")&&(t.layerMenuIconPath=e.layerMenuIconPath),void 0!==e.description&&null!==e.description&&e.hasOwnProperty("description")&&(t.description=n[12].toObject(e.description,r)),void 0!==e.lookAt&&null!==e.lookAt&&e.hasOwnProperty("lookAt")&&(t.lookAt=n[13].toObject(e.lookAt,r)),void 0!==e.assetUuid&&null!==e.assetUuid&&e.hasOwnProperty("assetUuid")&&(t.assetUuid=e.assetUuid),void 0!==e.isSaveLocked&&null!==e.isSaveLocked&&e.hasOwnProperty("isSaveLocked")&&(t.isSaveLocked=e.isSaveLocked),void 0!==e.children&&null!==e.children&&e.hasOwnProperty("children")){t.children=[];for(var o=0;o<e.children.length;++o)t.children[o]=n[16].toObject(e.children[o],r)}return void 0!==e.clientConfigScriptName&&null!==e.clientConfigScriptName&&e.hasOwnProperty("clientConfigScriptName")&&(t.clientConfigScriptName=e.clientConfigScriptName),void 0!==e.dioramaDataChannelBase&&null!==e.dioramaDataChannelBase&&e.hasOwnProperty("dioramaDataChannelBase")&&(t.dioramaDataChannelBase=e.dioramaDataChannelBase),void 0!==e.replicaDataChannelBase&&null!==e.replicaDataChannelBase&&e.hasOwnProperty("replicaDataChannelBase")&&(t.replicaDataChannelBase=e.replicaDataChannelBase),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.FeatureType=((r=Object.create({})).TYPE_POINT_Z=1,r.TYPE_POLYGON_Z=2,r.TYPE_LINE_Z=3,r.TYPE_TERRAIN=4,r),e}(),e.MfeDomainFeaturesProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.countryCode="",e.prototype.domainName="",e.prototype.supportedFeatures=s.emptyArray;var r,a={2:"keyhole.dbroot.MfeDomainFeaturesProto.SupportedFeature"};return p.push(a),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.MfeDomainFeaturesProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.countryCode=e.string();break;case 2:o.domainName=e.string();break;case 3:if(o.supportedFeatures&&o.supportedFeatures.length||(o.supportedFeatures=[]),2==(7&a))for(var n=e.uint32()+e.pos;e.pos<n;)o.supportedFeatures.push(e.uint32());else o.supportedFeatures.push(e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isString(e.countryCode))return"countryCode: string expected";if(!s.isString(e.domainName))return"domainName: string expected";if(void 0!==e.supportedFeatures){if(!Array.isArray(e.supportedFeatures))return"supportedFeatures: array expected";for(var r=0;r<e.supportedFeatures.length;++r)switch(e.supportedFeatures[r]){default:return"supportedFeatures: enum value[] expected";case 0:case 1:case 2:}}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.MfeDomainFeaturesProto)return e;var r=new c.keyhole.dbroot.MfeDomainFeaturesProto;if(void 0!==e.countryCode&&null!==e.countryCode&&(r.countryCode=String(e.countryCode)),void 0!==e.domainName&&null!==e.domainName&&(r.domainName=String(e.domainName)),e.supportedFeatures){if(!Array.isArray(e.supportedFeatures))throw TypeError(".keyhole.dbroot.MfeDomainFeaturesProto.supportedFeatures: array expected");r.supportedFeatures=[];for(var t=0;t<e.supportedFeatures.length;++t)switch(e.supportedFeatures[t]){default:case"GEOCODING":case 0:r.supportedFeatures[t]=0;break;case"LOCAL_SEARCH":case 1:r.supportedFeatures[t]=1;break;case"DRIVING_DIRECTIONS":case 2:r.supportedFeatures[t]=2}}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.supportedFeatures=[]),r.defaults&&(t.countryCode="",t.domainName=""),void 0!==e.countryCode&&null!==e.countryCode&&e.hasOwnProperty("countryCode")&&(t.countryCode=e.countryCode),void 0!==e.domainName&&null!==e.domainName&&e.hasOwnProperty("domainName")&&(t.domainName=e.domainName),void 0!==e.supportedFeatures&&null!==e.supportedFeatures&&e.hasOwnProperty("supportedFeatures")){t.supportedFeatures=[];for(var o=0;o<e.supportedFeatures.length;++o)t.supportedFeatures[o]=r.enums===String?a[2][e.supportedFeatures[o]]:e.supportedFeatures[o]}return t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.SupportedFeature=((r=Object.create({})).GEOCODING=0,r.LOCAL_SEARCH=1,r.DRIVING_DIRECTIONS=2,r),e}(),e.ClientOptionsProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.disableDiskCache=!1,e.prototype.disableEmbeddedBrowserVista=!1,e.prototype.drawAtmosphere=!0,e.prototype.drawStars=!0,e.prototype.shaderFilePrefix="",e.prototype.useProtobufQuadtreePackets=!1,e.prototype.useExtendedCopyrightIds=!0,e.prototype.precipitationsOptions=null,e.prototype.captureOptions=null,e.prototype.show_2dMapsIcon=!0,e.prototype.disableInternalBrowser=!1,e.prototype.internalBrowserBlacklist="",e.prototype.internalBrowserOriginWhitelist="*",e.prototype.polarTileMergingLevel=0,e.prototype.jsBridgeRequestWhitelist="http://*.google.com/*",e.prototype.mapsOptions=null;var n={7:"keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions",8:"keyhole.dbroot.ClientOptionsProto.CaptureOptions",15:"keyhole.dbroot.ClientOptionsProto.MapsOptions"};function r(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}function t(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ClientOptionsProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.disableDiskCache=e.bool();break;case 2:o.disableEmbeddedBrowserVista=e.bool();break;case 3:o.drawAtmosphere=e.bool();break;case 4:o.drawStars=e.bool();break;case 5:o.shaderFilePrefix=e.string();break;case 6:o.useProtobufQuadtreePackets=e.bool();break;case 7:o.useExtendedCopyrightIds=e.bool();break;case 8:o.precipitationsOptions=n[7].decode(e,e.uint32());break;case 9:o.captureOptions=n[8].decode(e,e.uint32());break;case 10:o.show_2dMapsIcon=e.bool();break;case 11:o.disableInternalBrowser=e.bool();break;case 12:o.internalBrowserBlacklist=e.string();break;case 13:o.internalBrowserOriginWhitelist=e.string();break;case 14:o.polarTileMergingLevel=e.int32();break;case 15:o.jsBridgeRequestWhitelist=e.string();break;case 16:o.mapsOptions=n[15].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.disableDiskCache&&"boolean"!=typeof e.disableDiskCache?"disableDiskCache: boolean expected":void 0!==e.disableEmbeddedBrowserVista&&"boolean"!=typeof e.disableEmbeddedBrowserVista?"disableEmbeddedBrowserVista: boolean expected":void 0!==e.drawAtmosphere&&"boolean"!=typeof e.drawAtmosphere?"drawAtmosphere: boolean expected":void 0!==e.drawStars&&"boolean"!=typeof e.drawStars?"drawStars: boolean expected":void 0===e.shaderFilePrefix||s.isString(e.shaderFilePrefix)?void 0!==e.useProtobufQuadtreePackets&&"boolean"!=typeof e.useProtobufQuadtreePackets?"useProtobufQuadtreePackets: boolean expected":void 0!==e.useExtendedCopyrightIds&&"boolean"!=typeof e.useExtendedCopyrightIds?"useExtendedCopyrightIds: boolean expected":void 0!==e.precipitationsOptions&&null!==e.precipitationsOptions&&(r=n[7].verify(e.precipitationsOptions))?"precipitationsOptions."+r:void 0!==e.captureOptions&&null!==e.captureOptions&&(r=n[8].verify(e.captureOptions))?"captureOptions."+r:void 0!==e.show_2dMapsIcon&&"boolean"!=typeof e.show_2dMapsIcon?"show_2dMapsIcon: boolean expected":void 0!==e.disableInternalBrowser&&"boolean"!=typeof e.disableInternalBrowser?"disableInternalBrowser: boolean expected":void 0===e.internalBrowserBlacklist||s.isString(e.internalBrowserBlacklist)?void 0===e.internalBrowserOriginWhitelist||s.isString(e.internalBrowserOriginWhitelist)?void 0===e.polarTileMergingLevel||s.isInteger(e.polarTileMergingLevel)?void 0===e.jsBridgeRequestWhitelist||s.isString(e.jsBridgeRequestWhitelist)?void 0!==e.mapsOptions&&null!==e.mapsOptions&&(r=n[15].verify(e.mapsOptions))?"mapsOptions."+r:null:"jsBridgeRequestWhitelist: string expected":"polarTileMergingLevel: integer expected":"internalBrowserOriginWhitelist: string expected":"internalBrowserBlacklist: string expected":"shaderFilePrefix: string expected";var r},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ClientOptionsProto)return e;var r=new c.keyhole.dbroot.ClientOptionsProto;if(void 0!==e.disableDiskCache&&null!==e.disableDiskCache&&(r.disableDiskCache=Boolean(e.disableDiskCache)),void 0!==e.disableEmbeddedBrowserVista&&null!==e.disableEmbeddedBrowserVista&&(r.disableEmbeddedBrowserVista=Boolean(e.disableEmbeddedBrowserVista)),void 0!==e.drawAtmosphere&&null!==e.drawAtmosphere&&(r.drawAtmosphere=Boolean(e.drawAtmosphere)),void 0!==e.drawStars&&null!==e.drawStars&&(r.drawStars=Boolean(e.drawStars)),void 0!==e.shaderFilePrefix&&null!==e.shaderFilePrefix&&(r.shaderFilePrefix=String(e.shaderFilePrefix)),void 0!==e.useProtobufQuadtreePackets&&null!==e.useProtobufQuadtreePackets&&(r.useProtobufQuadtreePackets=Boolean(e.useProtobufQuadtreePackets)),void 0!==e.useExtendedCopyrightIds&&null!==e.useExtendedCopyrightIds&&(r.useExtendedCopyrightIds=Boolean(e.useExtendedCopyrightIds)),void 0!==e.precipitationsOptions&&null!==e.precipitationsOptions){if("object"!=typeof e.precipitationsOptions)throw TypeError(".keyhole.dbroot.ClientOptionsProto.precipitationsOptions: object expected");r.precipitationsOptions=n[7].fromObject(e.precipitationsOptions)}if(void 0!==e.captureOptions&&null!==e.captureOptions){if("object"!=typeof e.captureOptions)throw TypeError(".keyhole.dbroot.ClientOptionsProto.captureOptions: object expected");r.captureOptions=n[8].fromObject(e.captureOptions)}if(void 0!==e.show_2dMapsIcon&&null!==e.show_2dMapsIcon&&(r.show_2dMapsIcon=Boolean(e.show_2dMapsIcon)),void 0!==e.disableInternalBrowser&&null!==e.disableInternalBrowser&&(r.disableInternalBrowser=Boolean(e.disableInternalBrowser)),void 0!==e.internalBrowserBlacklist&&null!==e.internalBrowserBlacklist&&(r.internalBrowserBlacklist=String(e.internalBrowserBlacklist)),void 0!==e.internalBrowserOriginWhitelist&&null!==e.internalBrowserOriginWhitelist&&(r.internalBrowserOriginWhitelist=String(e.internalBrowserOriginWhitelist)),void 0!==e.polarTileMergingLevel&&null!==e.polarTileMergingLevel&&(r.polarTileMergingLevel=0|e.polarTileMergingLevel),void 0!==e.jsBridgeRequestWhitelist&&null!==e.jsBridgeRequestWhitelist&&(r.jsBridgeRequestWhitelist=String(e.jsBridgeRequestWhitelist)),void 0!==e.mapsOptions&&null!==e.mapsOptions){if("object"!=typeof e.mapsOptions)throw TypeError(".keyhole.dbroot.ClientOptionsProto.mapsOptions: object expected");r.mapsOptions=n[15].fromObject(e.mapsOptions)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.disableDiskCache=!1,t.disableEmbeddedBrowserVista=!1,t.drawAtmosphere=!0,t.drawStars=!0,t.shaderFilePrefix="",t.useProtobufQuadtreePackets=!1,t.useExtendedCopyrightIds=!0,t.precipitationsOptions=null,t.captureOptions=null,t.show_2dMapsIcon=!0,t.disableInternalBrowser=!1,t.internalBrowserBlacklist="",t.internalBrowserOriginWhitelist="*",t.polarTileMergingLevel=0,t.jsBridgeRequestWhitelist="http://*.google.com/*",t.mapsOptions=null),void 0!==e.disableDiskCache&&null!==e.disableDiskCache&&e.hasOwnProperty("disableDiskCache")&&(t.disableDiskCache=e.disableDiskCache),void 0!==e.disableEmbeddedBrowserVista&&null!==e.disableEmbeddedBrowserVista&&e.hasOwnProperty("disableEmbeddedBrowserVista")&&(t.disableEmbeddedBrowserVista=e.disableEmbeddedBrowserVista),void 0!==e.drawAtmosphere&&null!==e.drawAtmosphere&&e.hasOwnProperty("drawAtmosphere")&&(t.drawAtmosphere=e.drawAtmosphere),void 0!==e.drawStars&&null!==e.drawStars&&e.hasOwnProperty("drawStars")&&(t.drawStars=e.drawStars),void 0!==e.shaderFilePrefix&&null!==e.shaderFilePrefix&&e.hasOwnProperty("shaderFilePrefix")&&(t.shaderFilePrefix=e.shaderFilePrefix),void 0!==e.useProtobufQuadtreePackets&&null!==e.useProtobufQuadtreePackets&&e.hasOwnProperty("useProtobufQuadtreePackets")&&(t.useProtobufQuadtreePackets=e.useProtobufQuadtreePackets),void 0!==e.useExtendedCopyrightIds&&null!==e.useExtendedCopyrightIds&&e.hasOwnProperty("useExtendedCopyrightIds")&&(t.useExtendedCopyrightIds=e.useExtendedCopyrightIds),void 0!==e.precipitationsOptions&&null!==e.precipitationsOptions&&e.hasOwnProperty("precipitationsOptions")&&(t.precipitationsOptions=n[7].toObject(e.precipitationsOptions,r)),void 0!==e.captureOptions&&null!==e.captureOptions&&e.hasOwnProperty("captureOptions")&&(t.captureOptions=n[8].toObject(e.captureOptions,r)),void 0!==e.show_2dMapsIcon&&null!==e.show_2dMapsIcon&&e.hasOwnProperty("show_2dMapsIcon")&&(t.show_2dMapsIcon=e.show_2dMapsIcon),void 0!==e.disableInternalBrowser&&null!==e.disableInternalBrowser&&e.hasOwnProperty("disableInternalBrowser")&&(t.disableInternalBrowser=e.disableInternalBrowser),void 0!==e.internalBrowserBlacklist&&null!==e.internalBrowserBlacklist&&e.hasOwnProperty("internalBrowserBlacklist")&&(t.internalBrowserBlacklist=e.internalBrowserBlacklist),void 0!==e.internalBrowserOriginWhitelist&&null!==e.internalBrowserOriginWhitelist&&e.hasOwnProperty("internalBrowserOriginWhitelist")&&(t.internalBrowserOriginWhitelist=e.internalBrowserOriginWhitelist),void 0!==e.polarTileMergingLevel&&null!==e.polarTileMergingLevel&&e.hasOwnProperty("polarTileMergingLevel")&&(t.polarTileMergingLevel=e.polarTileMergingLevel),void 0!==e.jsBridgeRequestWhitelist&&null!==e.jsBridgeRequestWhitelist&&e.hasOwnProperty("jsBridgeRequestWhitelist")&&(t.jsBridgeRequestWhitelist=e.jsBridgeRequestWhitelist),void 0!==e.mapsOptions&&null!==e.mapsOptions&&e.hasOwnProperty("mapsOptions")&&(t.mapsOptions=n[15].toObject(e.mapsOptions,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.PrecipitationsOptions=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.imageUrl="",e.prototype.imageExpireTime=900,e.prototype.maxColorDistance=20,e.prototype.imageLevel=5,e.prototype.weatherMapping=s.emptyArray,e.prototype.cloudsLayerUrl="",e.prototype.animationDecelerationDelay=20;var n={4:"keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.imageUrl=e.string();break;case 2:o.imageExpireTime=e.int32();break;case 3:o.maxColorDistance=e.int32();break;case 4:o.imageLevel=e.int32();break;case 5:o.weatherMapping&&o.weatherMapping.length||(o.weatherMapping=[]),o.weatherMapping.push(n[4].decode(e,e.uint32()));break;case 6:o.cloudsLayerUrl=e.string();break;case 7:o.animationDecelerationDelay=e.float();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.imageUrl&&!s.isString(e.imageUrl))return"imageUrl: string expected";if(void 0!==e.imageExpireTime&&!s.isInteger(e.imageExpireTime))return"imageExpireTime: integer expected";if(void 0!==e.maxColorDistance&&!s.isInteger(e.maxColorDistance))return"maxColorDistance: integer expected";if(void 0!==e.imageLevel&&!s.isInteger(e.imageLevel))return"imageLevel: integer expected";if(void 0!==e.weatherMapping){if(!Array.isArray(e.weatherMapping))return"weatherMapping: array expected";for(var r=0;r<e.weatherMapping.length;++r){var t=n[4].verify(e.weatherMapping[r]);if(t)return"weatherMapping."+t}}return void 0===e.cloudsLayerUrl||s.isString(e.cloudsLayerUrl)?void 0!==e.animationDecelerationDelay&&"number"!=typeof e.animationDecelerationDelay?"animationDecelerationDelay: number expected":null:"cloudsLayerUrl: string expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions)return e;var r=new c.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions;if(void 0!==e.imageUrl&&null!==e.imageUrl&&(r.imageUrl=String(e.imageUrl)),void 0!==e.imageExpireTime&&null!==e.imageExpireTime&&(r.imageExpireTime=0|e.imageExpireTime),void 0!==e.maxColorDistance&&null!==e.maxColorDistance&&(r.maxColorDistance=0|e.maxColorDistance),void 0!==e.imageLevel&&null!==e.imageLevel&&(r.imageLevel=0|e.imageLevel),e.weatherMapping){if(!Array.isArray(e.weatherMapping))throw TypeError(".keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.weatherMapping: array expected");r.weatherMapping=[];for(var t=0;t<e.weatherMapping.length;++t){if("object"!=typeof e.weatherMapping[t])throw TypeError(".keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.weatherMapping: object expected");r.weatherMapping[t]=n[4].fromObject(e.weatherMapping[t])}}return void 0!==e.cloudsLayerUrl&&null!==e.cloudsLayerUrl&&(r.cloudsLayerUrl=String(e.cloudsLayerUrl)),void 0!==e.animationDecelerationDelay&&null!==e.animationDecelerationDelay&&(r.animationDecelerationDelay=Number(e.animationDecelerationDelay)),r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.weatherMapping=[]),r.defaults&&(t.imageUrl="",t.imageExpireTime=900,t.maxColorDistance=20,t.imageLevel=5,t.cloudsLayerUrl="",t.animationDecelerationDelay=20),void 0!==e.imageUrl&&null!==e.imageUrl&&e.hasOwnProperty("imageUrl")&&(t.imageUrl=e.imageUrl),void 0!==e.imageExpireTime&&null!==e.imageExpireTime&&e.hasOwnProperty("imageExpireTime")&&(t.imageExpireTime=e.imageExpireTime),void 0!==e.maxColorDistance&&null!==e.maxColorDistance&&e.hasOwnProperty("maxColorDistance")&&(t.maxColorDistance=e.maxColorDistance),void 0!==e.imageLevel&&null!==e.imageLevel&&e.hasOwnProperty("imageLevel")&&(t.imageLevel=e.imageLevel),void 0!==e.weatherMapping&&null!==e.weatherMapping&&e.hasOwnProperty("weatherMapping")){t.weatherMapping=[];for(var o=0;o<e.weatherMapping.length;++o)t.weatherMapping[o]=n[4].toObject(e.weatherMapping[o],r)}return void 0!==e.cloudsLayerUrl&&null!==e.cloudsLayerUrl&&e.hasOwnProperty("cloudsLayerUrl")&&(t.cloudsLayerUrl=e.cloudsLayerUrl),void 0!==e.animationDecelerationDelay&&null!==e.animationDecelerationDelay&&e.hasOwnProperty("animationDecelerationDelay")&&(t.animationDecelerationDelay=e.animationDecelerationDelay),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.WeatherMapping=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.colorAbgr=0,e.prototype.weatherType=0,e.prototype.elongation=1,e.prototype.opacity=0,e.prototype.fogDensity=0,e.prototype.speed0=0,e.prototype.speed1=0,e.prototype.speed2=0,e.prototype.speed3=0;var r,o={1:"keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping.WeatherType"};return p.push(o),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.colorAbgr=e.uint32();break;case 2:o.weatherType=e.uint32();break;case 3:o.elongation=e.float();break;case 4:o.opacity=e.float();break;case 5:o.fogDensity=e.float();break;case 6:o.speed0=e.float();break;case 7:o.speed1=e.float();break;case 8:o.speed2=e.float();break;case 9:o.speed3=e.float();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isInteger(e.colorAbgr))return"colorAbgr: integer expected";switch(e.weatherType){default:return"weatherType: enum value expected";case 0:case 1:case 2:}return void 0!==e.elongation&&"number"!=typeof e.elongation?"elongation: number expected":void 0!==e.opacity&&"number"!=typeof e.opacity?"opacity: number expected":void 0!==e.fogDensity&&"number"!=typeof e.fogDensity?"fogDensity: number expected":void 0!==e.speed0&&"number"!=typeof e.speed0?"speed0: number expected":void 0!==e.speed1&&"number"!=typeof e.speed1?"speed1: number expected":void 0!==e.speed2&&"number"!=typeof e.speed2?"speed2: number expected":void 0!==e.speed3&&"number"!=typeof e.speed3?"speed3: number expected":null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping)return e;var r=new c.keyhole.dbroot.ClientOptionsProto.PrecipitationsOptions.WeatherMapping;switch(void 0!==e.colorAbgr&&null!==e.colorAbgr&&(r.colorAbgr=e.colorAbgr>>>0),e.weatherType){case"NO_PRECIPITATION":case 0:r.weatherType=0;break;case"RAIN":case 1:r.weatherType=1;break;case"SNOW":case 2:r.weatherType=2}return void 0!==e.elongation&&null!==e.elongation&&(r.elongation=Number(e.elongation)),void 0!==e.opacity&&null!==e.opacity&&(r.opacity=Number(e.opacity)),void 0!==e.fogDensity&&null!==e.fogDensity&&(r.fogDensity=Number(e.fogDensity)),void 0!==e.speed0&&null!==e.speed0&&(r.speed0=Number(e.speed0)),void 0!==e.speed1&&null!==e.speed1&&(r.speed1=Number(e.speed1)),void 0!==e.speed2&&null!==e.speed2&&(r.speed2=Number(e.speed2)),void 0!==e.speed3&&null!==e.speed3&&(r.speed3=Number(e.speed3)),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.colorAbgr=0,t.weatherType=r.enums===String?"NO_PRECIPITATION":0,t.elongation=1,t.opacity=0,t.fogDensity=0,t.speed0=0,t.speed1=0,t.speed2=0,t.speed3=0),void 0!==e.colorAbgr&&null!==e.colorAbgr&&e.hasOwnProperty("colorAbgr")&&(t.colorAbgr=e.colorAbgr),void 0!==e.weatherType&&null!==e.weatherType&&e.hasOwnProperty("weatherType")&&(t.weatherType=r.enums===String?o[1][e.weatherType]:e.weatherType),void 0!==e.elongation&&null!==e.elongation&&e.hasOwnProperty("elongation")&&(t.elongation=e.elongation),void 0!==e.opacity&&null!==e.opacity&&e.hasOwnProperty("opacity")&&(t.opacity=e.opacity),void 0!==e.fogDensity&&null!==e.fogDensity&&e.hasOwnProperty("fogDensity")&&(t.fogDensity=e.fogDensity),void 0!==e.speed0&&null!==e.speed0&&e.hasOwnProperty("speed0")&&(t.speed0=e.speed0),void 0!==e.speed1&&null!==e.speed1&&e.hasOwnProperty("speed1")&&(t.speed1=e.speed1),void 0!==e.speed2&&null!==e.speed2&&e.hasOwnProperty("speed2")&&(t.speed2=e.speed2),void 0!==e.speed3&&null!==e.speed3&&e.hasOwnProperty("speed3")&&(t.speed3=e.speed3),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.WeatherType=((r=Object.create({})).NO_PRECIPITATION=0,r.RAIN=1,r.SNOW=2,r),e}(),e}(),e.CaptureOptions=(r.prototype.allowSaveAsImage=!0,r.prototype.maxFreeCaptureRes=2400,r.prototype.maxPremiumCaptureRes=4800,r.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ClientOptionsProto.CaptureOptions;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.allowSaveAsImage=e.bool();break;case 2:o.maxFreeCaptureRes=e.int32();break;case 3:o.maxPremiumCaptureRes=e.int32();break;default:e.skipType(7&a)}}return o},r.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.allowSaveAsImage&&"boolean"!=typeof e.allowSaveAsImage?"allowSaveAsImage: boolean expected":void 0===e.maxFreeCaptureRes||s.isInteger(e.maxFreeCaptureRes)?void 0===e.maxPremiumCaptureRes||s.isInteger(e.maxPremiumCaptureRes)?null:"maxPremiumCaptureRes: integer expected":"maxFreeCaptureRes: integer expected"},r.from=r.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ClientOptionsProto.CaptureOptions)return e;var r=new c.keyhole.dbroot.ClientOptionsProto.CaptureOptions;return void 0!==e.allowSaveAsImage&&null!==e.allowSaveAsImage&&(r.allowSaveAsImage=Boolean(e.allowSaveAsImage)),void 0!==e.maxFreeCaptureRes&&null!==e.maxFreeCaptureRes&&(r.maxFreeCaptureRes=0|e.maxFreeCaptureRes),void 0!==e.maxPremiumCaptureRes&&null!==e.maxPremiumCaptureRes&&(r.maxPremiumCaptureRes=0|e.maxPremiumCaptureRes),r},r.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.allowSaveAsImage=!0,t.maxFreeCaptureRes=2400,t.maxPremiumCaptureRes=4800),void 0!==e.allowSaveAsImage&&null!==e.allowSaveAsImage&&e.hasOwnProperty("allowSaveAsImage")&&(t.allowSaveAsImage=e.allowSaveAsImage),void 0!==e.maxFreeCaptureRes&&null!==e.maxFreeCaptureRes&&e.hasOwnProperty("maxFreeCaptureRes")&&(t.maxFreeCaptureRes=e.maxFreeCaptureRes),void 0!==e.maxPremiumCaptureRes&&null!==e.maxPremiumCaptureRes&&e.hasOwnProperty("maxPremiumCaptureRes")&&(t.maxPremiumCaptureRes=e.maxPremiumCaptureRes),t},r.prototype.toObject=function(e){return this.constructor.toObject(this,e)},r.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},r),e.MapsOptions=(t.prototype.enableMaps=!1,t.prototype.docsAutoDownloadEnabled=!1,t.prototype.docsAutoDownloadInterval=0,t.prototype.docsAutoUploadEnabled=!1,t.prototype.docsAutoUploadDelay=0,t.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ClientOptionsProto.MapsOptions;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.enableMaps=e.bool();break;case 2:o.docsAutoDownloadEnabled=e.bool();break;case 3:o.docsAutoDownloadInterval=e.int32();break;case 4:o.docsAutoUploadEnabled=e.bool();break;case 5:o.docsAutoUploadDelay=e.int32();break;default:e.skipType(7&a)}}return o},t.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.enableMaps&&"boolean"!=typeof e.enableMaps?"enableMaps: boolean expected":void 0!==e.docsAutoDownloadEnabled&&"boolean"!=typeof e.docsAutoDownloadEnabled?"docsAutoDownloadEnabled: boolean expected":void 0===e.docsAutoDownloadInterval||s.isInteger(e.docsAutoDownloadInterval)?void 0!==e.docsAutoUploadEnabled&&"boolean"!=typeof e.docsAutoUploadEnabled?"docsAutoUploadEnabled: boolean expected":void 0===e.docsAutoUploadDelay||s.isInteger(e.docsAutoUploadDelay)?null:"docsAutoUploadDelay: integer expected":"docsAutoDownloadInterval: integer expected"},t.from=t.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ClientOptionsProto.MapsOptions)return e;var r=new c.keyhole.dbroot.ClientOptionsProto.MapsOptions;return void 0!==e.enableMaps&&null!==e.enableMaps&&(r.enableMaps=Boolean(e.enableMaps)),void 0!==e.docsAutoDownloadEnabled&&null!==e.docsAutoDownloadEnabled&&(r.docsAutoDownloadEnabled=Boolean(e.docsAutoDownloadEnabled)),void 0!==e.docsAutoDownloadInterval&&null!==e.docsAutoDownloadInterval&&(r.docsAutoDownloadInterval=0|e.docsAutoDownloadInterval),void 0!==e.docsAutoUploadEnabled&&null!==e.docsAutoUploadEnabled&&(r.docsAutoUploadEnabled=Boolean(e.docsAutoUploadEnabled)),void 0!==e.docsAutoUploadDelay&&null!==e.docsAutoUploadDelay&&(r.docsAutoUploadDelay=0|e.docsAutoUploadDelay),r},t.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.enableMaps=!1,t.docsAutoDownloadEnabled=!1,t.docsAutoDownloadInterval=0,t.docsAutoUploadEnabled=!1,t.docsAutoUploadDelay=0),void 0!==e.enableMaps&&null!==e.enableMaps&&e.hasOwnProperty("enableMaps")&&(t.enableMaps=e.enableMaps),void 0!==e.docsAutoDownloadEnabled&&null!==e.docsAutoDownloadEnabled&&e.hasOwnProperty("docsAutoDownloadEnabled")&&(t.docsAutoDownloadEnabled=e.docsAutoDownloadEnabled),void 0!==e.docsAutoDownloadInterval&&null!==e.docsAutoDownloadInterval&&e.hasOwnProperty("docsAutoDownloadInterval")&&(t.docsAutoDownloadInterval=e.docsAutoDownloadInterval),void 0!==e.docsAutoUploadEnabled&&null!==e.docsAutoUploadEnabled&&e.hasOwnProperty("docsAutoUploadEnabled")&&(t.docsAutoUploadEnabled=e.docsAutoUploadEnabled),void 0!==e.docsAutoUploadDelay&&null!==e.docsAutoUploadDelay&&e.hasOwnProperty("docsAutoUploadDelay")&&(t.docsAutoUploadDelay=e.docsAutoUploadDelay),t},t.prototype.toObject=function(e){return this.constructor.toObject(this,e)},t.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},t),e}(),e.FetchingOptionsProto=(f.prototype.maxRequestsPerQuery=1,f.prototype.forceMaxRequestsPerQuery=!1,f.prototype.sortBatches=!1,f.prototype.maxDrawable=2,f.prototype.maxImagery=2,f.prototype.maxTerrain=5,f.prototype.maxQuadtree=5,f.prototype.maxDioramaMetadata=1,f.prototype.maxDioramaData=0,f.prototype.maxConsumerFetchRatio=1,f.prototype.maxProEcFetchRatio=0,f.prototype.safeOverallQps=0,f.prototype.safeImageryQps=0,f.prototype.domainsForHttps="google.com gstatic.com",f.prototype.hostsForHttp="",f.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.FetchingOptionsProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.maxRequestsPerQuery=e.int32();break;case 12:o.forceMaxRequestsPerQuery=e.bool();break;case 13:o.sortBatches=e.bool();break;case 2:o.maxDrawable=e.int32();break;case 3:o.maxImagery=e.int32();break;case 4:o.maxTerrain=e.int32();break;case 5:o.maxQuadtree=e.int32();break;case 6:o.maxDioramaMetadata=e.int32();break;case 7:o.maxDioramaData=e.int32();break;case 8:o.maxConsumerFetchRatio=e.float();break;case 9:o.maxProEcFetchRatio=e.float();break;case 10:o.safeOverallQps=e.float();break;case 11:o.safeImageryQps=e.float();break;case 14:o.domainsForHttps=e.string();break;case 15:o.hostsForHttp=e.string();break;default:e.skipType(7&a)}}return o},f.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.maxRequestsPerQuery||s.isInteger(e.maxRequestsPerQuery)?void 0!==e.forceMaxRequestsPerQuery&&"boolean"!=typeof e.forceMaxRequestsPerQuery?"forceMaxRequestsPerQuery: boolean expected":void 0!==e.sortBatches&&"boolean"!=typeof e.sortBatches?"sortBatches: boolean expected":void 0===e.maxDrawable||s.isInteger(e.maxDrawable)?void 0===e.maxImagery||s.isInteger(e.maxImagery)?void 0===e.maxTerrain||s.isInteger(e.maxTerrain)?void 0===e.maxQuadtree||s.isInteger(e.maxQuadtree)?void 0===e.maxDioramaMetadata||s.isInteger(e.maxDioramaMetadata)?void 0===e.maxDioramaData||s.isInteger(e.maxDioramaData)?void 0!==e.maxConsumerFetchRatio&&"number"!=typeof e.maxConsumerFetchRatio?"maxConsumerFetchRatio: number expected":void 0!==e.maxProEcFetchRatio&&"number"!=typeof e.maxProEcFetchRatio?"maxProEcFetchRatio: number expected":void 0!==e.safeOverallQps&&"number"!=typeof e.safeOverallQps?"safeOverallQps: number expected":void 0!==e.safeImageryQps&&"number"!=typeof e.safeImageryQps?"safeImageryQps: number expected":void 0===e.domainsForHttps||s.isString(e.domainsForHttps)?void 0===e.hostsForHttp||s.isString(e.hostsForHttp)?null:"hostsForHttp: string expected":"domainsForHttps: string expected":"maxDioramaData: integer expected":"maxDioramaMetadata: integer expected":"maxQuadtree: integer expected":"maxTerrain: integer expected":"maxImagery: integer expected":"maxDrawable: integer expected":"maxRequestsPerQuery: integer expected"},f.from=f.fromObject=function(e){if(e instanceof c.keyhole.dbroot.FetchingOptionsProto)return e;var r=new c.keyhole.dbroot.FetchingOptionsProto;return void 0!==e.maxRequestsPerQuery&&null!==e.maxRequestsPerQuery&&(r.maxRequestsPerQuery=0|e.maxRequestsPerQuery),void 0!==e.forceMaxRequestsPerQuery&&null!==e.forceMaxRequestsPerQuery&&(r.forceMaxRequestsPerQuery=Boolean(e.forceMaxRequestsPerQuery)),void 0!==e.sortBatches&&null!==e.sortBatches&&(r.sortBatches=Boolean(e.sortBatches)),void 0!==e.maxDrawable&&null!==e.maxDrawable&&(r.maxDrawable=0|e.maxDrawable),void 0!==e.maxImagery&&null!==e.maxImagery&&(r.maxImagery=0|e.maxImagery),void 0!==e.maxTerrain&&null!==e.maxTerrain&&(r.maxTerrain=0|e.maxTerrain),void 0!==e.maxQuadtree&&null!==e.maxQuadtree&&(r.maxQuadtree=0|e.maxQuadtree),void 0!==e.maxDioramaMetadata&&null!==e.maxDioramaMetadata&&(r.maxDioramaMetadata=0|e.maxDioramaMetadata),void 0!==e.maxDioramaData&&null!==e.maxDioramaData&&(r.maxDioramaData=0|e.maxDioramaData),void 0!==e.maxConsumerFetchRatio&&null!==e.maxConsumerFetchRatio&&(r.maxConsumerFetchRatio=Number(e.maxConsumerFetchRatio)),void 0!==e.maxProEcFetchRatio&&null!==e.maxProEcFetchRatio&&(r.maxProEcFetchRatio=Number(e.maxProEcFetchRatio)),void 0!==e.safeOverallQps&&null!==e.safeOverallQps&&(r.safeOverallQps=Number(e.safeOverallQps)),void 0!==e.safeImageryQps&&null!==e.safeImageryQps&&(r.safeImageryQps=Number(e.safeImageryQps)),void 0!==e.domainsForHttps&&null!==e.domainsForHttps&&(r.domainsForHttps=String(e.domainsForHttps)),void 0!==e.hostsForHttp&&null!==e.hostsForHttp&&(r.hostsForHttp=String(e.hostsForHttp)),r},f.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.maxRequestsPerQuery=1,t.forceMaxRequestsPerQuery=!1,t.sortBatches=!1,t.maxDrawable=2,t.maxImagery=2,t.maxTerrain=5,t.maxQuadtree=5,t.maxDioramaMetadata=1,t.maxDioramaData=0,t.maxConsumerFetchRatio=1,t.maxProEcFetchRatio=0,t.safeOverallQps=0,t.safeImageryQps=0,t.domainsForHttps="google.com gstatic.com",t.hostsForHttp=""),void 0!==e.maxRequestsPerQuery&&null!==e.maxRequestsPerQuery&&e.hasOwnProperty("maxRequestsPerQuery")&&(t.maxRequestsPerQuery=e.maxRequestsPerQuery),void 0!==e.forceMaxRequestsPerQuery&&null!==e.forceMaxRequestsPerQuery&&e.hasOwnProperty("forceMaxRequestsPerQuery")&&(t.forceMaxRequestsPerQuery=e.forceMaxRequestsPerQuery),void 0!==e.sortBatches&&null!==e.sortBatches&&e.hasOwnProperty("sortBatches")&&(t.sortBatches=e.sortBatches),void 0!==e.maxDrawable&&null!==e.maxDrawable&&e.hasOwnProperty("maxDrawable")&&(t.maxDrawable=e.maxDrawable),void 0!==e.maxImagery&&null!==e.maxImagery&&e.hasOwnProperty("maxImagery")&&(t.maxImagery=e.maxImagery),void 0!==e.maxTerrain&&null!==e.maxTerrain&&e.hasOwnProperty("maxTerrain")&&(t.maxTerrain=e.maxTerrain),void 0!==e.maxQuadtree&&null!==e.maxQuadtree&&e.hasOwnProperty("maxQuadtree")&&(t.maxQuadtree=e.maxQuadtree),void 0!==e.maxDioramaMetadata&&null!==e.maxDioramaMetadata&&e.hasOwnProperty("maxDioramaMetadata")&&(t.maxDioramaMetadata=e.maxDioramaMetadata),void 0!==e.maxDioramaData&&null!==e.maxDioramaData&&e.hasOwnProperty("maxDioramaData")&&(t.maxDioramaData=e.maxDioramaData),void 0!==e.maxConsumerFetchRatio&&null!==e.maxConsumerFetchRatio&&e.hasOwnProperty("maxConsumerFetchRatio")&&(t.maxConsumerFetchRatio=e.maxConsumerFetchRatio),void 0!==e.maxProEcFetchRatio&&null!==e.maxProEcFetchRatio&&e.hasOwnProperty("maxProEcFetchRatio")&&(t.maxProEcFetchRatio=e.maxProEcFetchRatio),void 0!==e.safeOverallQps&&null!==e.safeOverallQps&&e.hasOwnProperty("safeOverallQps")&&(t.safeOverallQps=e.safeOverallQps),void 0!==e.safeImageryQps&&null!==e.safeImageryQps&&e.hasOwnProperty("safeImageryQps")&&(t.safeImageryQps=e.safeImageryQps),void 0!==e.domainsForHttps&&null!==e.domainsForHttps&&e.hasOwnProperty("domainsForHttps")&&(t.domainsForHttps=e.domainsForHttps),void 0!==e.hostsForHttp&&null!==e.hostsForHttp&&e.hasOwnProperty("hostsForHttp")&&(t.hostsForHttp=e.hostsForHttp),t},f.prototype.toObject=function(e){return this.constructor.toObject(this,e)},f.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},f),e.TimeMachineOptionsProto=(h.prototype.serverUrl="",h.prototype.isTimemachine=!1,h.prototype.dwellTimeMs=500,h.prototype.discoverabilityAltitudeMeters=15e3,h.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.TimeMachineOptionsProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.serverUrl=e.string();break;case 2:o.isTimemachine=e.bool();break;case 3:o.dwellTimeMs=e.int32();break;case 4:o.discoverabilityAltitudeMeters=e.int32();break;default:e.skipType(7&a)}}return o},h.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.serverUrl||s.isString(e.serverUrl)?void 0!==e.isTimemachine&&"boolean"!=typeof e.isTimemachine?"isTimemachine: boolean expected":void 0===e.dwellTimeMs||s.isInteger(e.dwellTimeMs)?void 0===e.discoverabilityAltitudeMeters||s.isInteger(e.discoverabilityAltitudeMeters)?null:"discoverabilityAltitudeMeters: integer expected":"dwellTimeMs: integer expected":"serverUrl: string expected"},h.from=h.fromObject=function(e){if(e instanceof c.keyhole.dbroot.TimeMachineOptionsProto)return e;var r=new c.keyhole.dbroot.TimeMachineOptionsProto;return void 0!==e.serverUrl&&null!==e.serverUrl&&(r.serverUrl=String(e.serverUrl)),void 0!==e.isTimemachine&&null!==e.isTimemachine&&(r.isTimemachine=Boolean(e.isTimemachine)),void 0!==e.dwellTimeMs&&null!==e.dwellTimeMs&&(r.dwellTimeMs=0|e.dwellTimeMs),void 0!==e.discoverabilityAltitudeMeters&&null!==e.discoverabilityAltitudeMeters&&(r.discoverabilityAltitudeMeters=0|e.discoverabilityAltitudeMeters),r},h.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.serverUrl="",t.isTimemachine=!1,t.dwellTimeMs=500,t.discoverabilityAltitudeMeters=15e3),void 0!==e.serverUrl&&null!==e.serverUrl&&e.hasOwnProperty("serverUrl")&&(t.serverUrl=e.serverUrl),void 0!==e.isTimemachine&&null!==e.isTimemachine&&e.hasOwnProperty("isTimemachine")&&(t.isTimemachine=e.isTimemachine),void 0!==e.dwellTimeMs&&null!==e.dwellTimeMs&&e.hasOwnProperty("dwellTimeMs")&&(t.dwellTimeMs=e.dwellTimeMs),void 0!==e.discoverabilityAltitudeMeters&&null!==e.discoverabilityAltitudeMeters&&e.hasOwnProperty("discoverabilityAltitudeMeters")&&(t.discoverabilityAltitudeMeters=e.discoverabilityAltitudeMeters),t},h.prototype.toObject=function(e){return this.constructor.toObject(this,e)},h.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},h),e.AutopiaOptionsProto=(m.prototype.metadataServerUrl="http://cbk0.google.com/cbk",m.prototype.depthmapServerUrl="http://cbk0.google.com/cbk",m.prototype.coverageOverlayUrl="",m.prototype.maxImageryQps=0,m.prototype.maxMetadataDepthmapQps=0,m.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.AutopiaOptionsProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.metadataServerUrl=e.string();break;case 2:o.depthmapServerUrl=e.string();break;case 3:o.coverageOverlayUrl=e.string();break;case 4:o.maxImageryQps=e.float();break;case 5:o.maxMetadataDepthmapQps=e.float();break;default:e.skipType(7&a)}}return o},m.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.metadataServerUrl||s.isString(e.metadataServerUrl)?void 0===e.depthmapServerUrl||s.isString(e.depthmapServerUrl)?void 0===e.coverageOverlayUrl||s.isString(e.coverageOverlayUrl)?void 0!==e.maxImageryQps&&"number"!=typeof e.maxImageryQps?"maxImageryQps: number expected":void 0!==e.maxMetadataDepthmapQps&&"number"!=typeof e.maxMetadataDepthmapQps?"maxMetadataDepthmapQps: number expected":null:"coverageOverlayUrl: string expected":"depthmapServerUrl: string expected":"metadataServerUrl: string expected"},m.from=m.fromObject=function(e){if(e instanceof c.keyhole.dbroot.AutopiaOptionsProto)return e;var r=new c.keyhole.dbroot.AutopiaOptionsProto;return void 0!==e.metadataServerUrl&&null!==e.metadataServerUrl&&(r.metadataServerUrl=String(e.metadataServerUrl)),void 0!==e.depthmapServerUrl&&null!==e.depthmapServerUrl&&(r.depthmapServerUrl=String(e.depthmapServerUrl)),void 0!==e.coverageOverlayUrl&&null!==e.coverageOverlayUrl&&(r.coverageOverlayUrl=String(e.coverageOverlayUrl)),void 0!==e.maxImageryQps&&null!==e.maxImageryQps&&(r.maxImageryQps=Number(e.maxImageryQps)),void 0!==e.maxMetadataDepthmapQps&&null!==e.maxMetadataDepthmapQps&&(r.maxMetadataDepthmapQps=Number(e.maxMetadataDepthmapQps)),r},m.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.metadataServerUrl="http://cbk0.google.com/cbk",t.depthmapServerUrl="http://cbk0.google.com/cbk",t.coverageOverlayUrl="",t.maxImageryQps=0,t.maxMetadataDepthmapQps=0),void 0!==e.metadataServerUrl&&null!==e.metadataServerUrl&&e.hasOwnProperty("metadataServerUrl")&&(t.metadataServerUrl=e.metadataServerUrl),void 0!==e.depthmapServerUrl&&null!==e.depthmapServerUrl&&e.hasOwnProperty("depthmapServerUrl")&&(t.depthmapServerUrl=e.depthmapServerUrl),void 0!==e.coverageOverlayUrl&&null!==e.coverageOverlayUrl&&e.hasOwnProperty("coverageOverlayUrl")&&(t.coverageOverlayUrl=e.coverageOverlayUrl),void 0!==e.maxImageryQps&&null!==e.maxImageryQps&&e.hasOwnProperty("maxImageryQps")&&(t.maxImageryQps=e.maxImageryQps),void 0!==e.maxMetadataDepthmapQps&&null!==e.maxMetadataDepthmapQps&&e.hasOwnProperty("maxMetadataDepthmapQps")&&(t.maxMetadataDepthmapQps=e.maxMetadataDepthmapQps),t},m.prototype.toObject=function(e){return this.constructor.toObject(this,e)},m.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},m),e.CSIOptionsProto=(v.prototype.samplingPercentage=0,v.prototype.experimentId="",v.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.CSIOptionsProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.samplingPercentage=e.int32();break;case 2:o.experimentId=e.string();break;default:e.skipType(7&a)}}return o},v.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.samplingPercentage||s.isInteger(e.samplingPercentage)?void 0===e.experimentId||s.isString(e.experimentId)?null:"experimentId: string expected":"samplingPercentage: integer expected"},v.from=v.fromObject=function(e){if(e instanceof c.keyhole.dbroot.CSIOptionsProto)return e;var r=new c.keyhole.dbroot.CSIOptionsProto;return void 0!==e.samplingPercentage&&null!==e.samplingPercentage&&(r.samplingPercentage=0|e.samplingPercentage),void 0!==e.experimentId&&null!==e.experimentId&&(r.experimentId=String(e.experimentId)),r},v.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.samplingPercentage=0,t.experimentId=""),void 0!==e.samplingPercentage&&null!==e.samplingPercentage&&e.hasOwnProperty("samplingPercentage")&&(t.samplingPercentage=e.samplingPercentage),void 0!==e.experimentId&&null!==e.experimentId&&e.hasOwnProperty("experimentId")&&(t.experimentId=e.experimentId),t},v.prototype.toObject=function(e){return this.constructor.toObject(this,e)},v.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},v),e.SearchTabProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.isVisible=!1,e.prototype.tabLabel=null,e.prototype.baseUrl="",e.prototype.viewportPrefix="",e.prototype.inputBox=s.emptyArray,e.prototype.requirement=null;var n={1:"keyhole.dbroot.StringIdOrValueProto",4:"keyhole.dbroot.SearchTabProto.InputBoxInfo",5:"keyhole.dbroot.RequirementProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.SearchTabProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.isVisible=e.bool();break;case 2:o.tabLabel=n[1].decode(e,e.uint32());break;case 3:o.baseUrl=e.string();break;case 4:o.viewportPrefix=e.string();break;case 5:o.inputBox&&o.inputBox.length||(o.inputBox=[]),o.inputBox.push(n[4].decode(e,e.uint32()));break;case 6:o.requirement=n[5].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if("boolean"!=typeof e.isVisible)return"isVisible: boolean expected";if(void 0!==e.tabLabel&&null!==e.tabLabel&&(r=n[1].verify(e.tabLabel)))return"tabLabel."+r;if(void 0!==e.baseUrl&&!s.isString(e.baseUrl))return"baseUrl: string expected";if(void 0!==e.viewportPrefix&&!s.isString(e.viewportPrefix))return"viewportPrefix: string expected";if(void 0!==e.inputBox){if(!Array.isArray(e.inputBox))return"inputBox: array expected";for(var r,t=0;t<e.inputBox.length;++t)if(r=n[4].verify(e.inputBox[t]))return"inputBox."+r}return void 0!==e.requirement&&null!==e.requirement&&(r=n[5].verify(e.requirement))?"requirement."+r:null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.SearchTabProto)return e;var r=new c.keyhole.dbroot.SearchTabProto;if(void 0!==e.isVisible&&null!==e.isVisible&&(r.isVisible=Boolean(e.isVisible)),void 0!==e.tabLabel&&null!==e.tabLabel){if("object"!=typeof e.tabLabel)throw TypeError(".keyhole.dbroot.SearchTabProto.tabLabel: object expected");r.tabLabel=n[1].fromObject(e.tabLabel)}if(void 0!==e.baseUrl&&null!==e.baseUrl&&(r.baseUrl=String(e.baseUrl)),void 0!==e.viewportPrefix&&null!==e.viewportPrefix&&(r.viewportPrefix=String(e.viewportPrefix)),e.inputBox){if(!Array.isArray(e.inputBox))throw TypeError(".keyhole.dbroot.SearchTabProto.inputBox: array expected");r.inputBox=[];for(var t=0;t<e.inputBox.length;++t){if("object"!=typeof e.inputBox[t])throw TypeError(".keyhole.dbroot.SearchTabProto.inputBox: object expected");r.inputBox[t]=n[4].fromObject(e.inputBox[t])}}if(void 0!==e.requirement&&null!==e.requirement){if("object"!=typeof e.requirement)throw TypeError(".keyhole.dbroot.SearchTabProto.requirement: object expected");r.requirement=n[5].fromObject(e.requirement)}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.inputBox=[]),r.defaults&&(t.isVisible=!1,t.tabLabel=null,t.baseUrl="",t.viewportPrefix="",t.requirement=null),void 0!==e.isVisible&&null!==e.isVisible&&e.hasOwnProperty("isVisible")&&(t.isVisible=e.isVisible),void 0!==e.tabLabel&&null!==e.tabLabel&&e.hasOwnProperty("tabLabel")&&(t.tabLabel=n[1].toObject(e.tabLabel,r)),void 0!==e.baseUrl&&null!==e.baseUrl&&e.hasOwnProperty("baseUrl")&&(t.baseUrl=e.baseUrl),void 0!==e.viewportPrefix&&null!==e.viewportPrefix&&e.hasOwnProperty("viewportPrefix")&&(t.viewportPrefix=e.viewportPrefix),void 0!==e.inputBox&&null!==e.inputBox&&e.hasOwnProperty("inputBox")){t.inputBox=[];for(var o=0;o<e.inputBox.length;++o)t.inputBox[o]=n[4].toObject(e.inputBox[o],r)}return void 0!==e.requirement&&null!==e.requirement&&e.hasOwnProperty("requirement")&&(t.requirement=n[5].toObject(e.requirement,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.InputBoxInfo=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.label=null,e.prototype.queryVerb="",e.prototype.queryPrepend="";var n={0:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.SearchTabProto.InputBoxInfo;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.label=n[0].decode(e,e.uint32());break;case 2:o.queryVerb=e.string();break;case 3:o.queryPrepend=e.string();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";var r=n[0].verify(e.label);return r?"label."+r:s.isString(e.queryVerb)?void 0===e.queryPrepend||s.isString(e.queryPrepend)?null:"queryPrepend: string expected":"queryVerb: string expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.SearchTabProto.InputBoxInfo)return e;var r=new c.keyhole.dbroot.SearchTabProto.InputBoxInfo;if(void 0!==e.label&&null!==e.label){if("object"!=typeof e.label)throw TypeError(".keyhole.dbroot.SearchTabProto.InputBoxInfo.label: object expected");r.label=n[0].fromObject(e.label)}return void 0!==e.queryVerb&&null!==e.queryVerb&&(r.queryVerb=String(e.queryVerb)),void 0!==e.queryPrepend&&null!==e.queryPrepend&&(r.queryPrepend=String(e.queryPrepend)),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.label=null,t.queryVerb="",t.queryPrepend=""),void 0!==e.label&&null!==e.label&&e.hasOwnProperty("label")&&(t.label=n[0].toObject(e.label,r)),void 0!==e.queryVerb&&null!==e.queryVerb&&e.hasOwnProperty("queryVerb")&&(t.queryVerb=e.queryVerb),void 0!==e.queryPrepend&&null!==e.queryPrepend&&e.hasOwnProperty("queryPrepend")&&(t.queryPrepend=e.queryPrepend),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e}(),e.CobrandProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.logoUrl="",e.prototype.xCoord=null,e.prototype.yCoord=null,e.prototype.tiePoint=6,e.prototype.screenSize=0;var r,n={1:"keyhole.dbroot.CobrandProto.Coord",2:"keyhole.dbroot.CobrandProto.Coord",3:"keyhole.dbroot.CobrandProto.TiePoint"};function t(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.CobrandProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.logoUrl=e.string();break;case 2:o.xCoord=n[1].decode(e,e.uint32());break;case 3:o.yCoord=n[2].decode(e,e.uint32());break;case 4:o.tiePoint=e.uint32();break;case 5:o.screenSize=e.double();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isString(e.logoUrl))return"logoUrl: string expected";var r;if(void 0!==e.xCoord&&null!==e.xCoord&&(r=n[1].verify(e.xCoord)))return"xCoord."+r;if(void 0!==e.yCoord&&null!==e.yCoord&&(r=n[2].verify(e.yCoord)))return"yCoord."+r;if(void 0!==e.tiePoint)switch(e.tiePoint){default:return"tiePoint: enum value expected";case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:}return void 0!==e.screenSize&&"number"!=typeof e.screenSize?"screenSize: number expected":null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.CobrandProto)return e;var r=new c.keyhole.dbroot.CobrandProto;if(void 0!==e.logoUrl&&null!==e.logoUrl&&(r.logoUrl=String(e.logoUrl)),void 0!==e.xCoord&&null!==e.xCoord){if("object"!=typeof e.xCoord)throw TypeError(".keyhole.dbroot.CobrandProto.xCoord: object expected");r.xCoord=n[1].fromObject(e.xCoord)}if(void 0!==e.yCoord&&null!==e.yCoord){if("object"!=typeof e.yCoord)throw TypeError(".keyhole.dbroot.CobrandProto.yCoord: object expected");r.yCoord=n[2].fromObject(e.yCoord)}switch(e.tiePoint){case"TOP_LEFT":case 0:r.tiePoint=0;break;case"TOP_CENTER":case 1:r.tiePoint=1;break;case"TOP_RIGHT":case 2:r.tiePoint=2;break;case"MID_LEFT":case 3:r.tiePoint=3;break;case"MID_CENTER":case 4:r.tiePoint=4;break;case"MID_RIGHT":case 5:r.tiePoint=5;break;case"BOTTOM_LEFT":case 6:r.tiePoint=6;break;case"BOTTOM_CENTER":case 7:r.tiePoint=7;break;case"BOTTOM_RIGHT":case 8:r.tiePoint=8}return void 0!==e.screenSize&&null!==e.screenSize&&(r.screenSize=Number(e.screenSize)),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.logoUrl="",t.xCoord=null,t.yCoord=null,t.tiePoint=r.enums===String?"BOTTOM_LEFT":6,t.screenSize=0),void 0!==e.logoUrl&&null!==e.logoUrl&&e.hasOwnProperty("logoUrl")&&(t.logoUrl=e.logoUrl),void 0!==e.xCoord&&null!==e.xCoord&&e.hasOwnProperty("xCoord")&&(t.xCoord=n[1].toObject(e.xCoord,r)),void 0!==e.yCoord&&null!==e.yCoord&&e.hasOwnProperty("yCoord")&&(t.yCoord=n[2].toObject(e.yCoord,r)),void 0!==e.tiePoint&&null!==e.tiePoint&&e.hasOwnProperty("tiePoint")&&(t.tiePoint=r.enums===String?n[3][e.tiePoint]:e.tiePoint),void 0!==e.screenSize&&null!==e.screenSize&&e.hasOwnProperty("screenSize")&&(t.screenSize=e.screenSize),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.Coord=(t.prototype.value=0,t.prototype.isRelative=!1,t.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.CobrandProto.Coord;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.value=e.double();break;case 2:o.isRelative=e.bool();break;default:e.skipType(7&a)}}return o},t.verify=function(e){return"object"!=typeof e||null===e?"object expected":"number"!=typeof e.value?"value: number expected":void 0!==e.isRelative&&"boolean"!=typeof e.isRelative?"isRelative: boolean expected":null},t.from=t.fromObject=function(e){if(e instanceof c.keyhole.dbroot.CobrandProto.Coord)return e;var r=new c.keyhole.dbroot.CobrandProto.Coord;return void 0!==e.value&&null!==e.value&&(r.value=Number(e.value)),void 0!==e.isRelative&&null!==e.isRelative&&(r.isRelative=Boolean(e.isRelative)),r},t.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.value=0,t.isRelative=!1),void 0!==e.value&&null!==e.value&&e.hasOwnProperty("value")&&(t.value=e.value),void 0!==e.isRelative&&null!==e.isRelative&&e.hasOwnProperty("isRelative")&&(t.isRelative=e.isRelative),t},t.prototype.toObject=function(e){return this.constructor.toObject(this,e)},t.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},t),e.TiePoint=((r=Object.create({})).TOP_LEFT=0,r.TOP_CENTER=1,r.TOP_RIGHT=2,r.MID_LEFT=3,r.MID_CENTER=4,r.MID_RIGHT=5,r.BOTTOM_LEFT=6,r.BOTTOM_CENTER=7,r.BOTTOM_RIGHT=8,r),e}(),e.DatabaseDescriptionProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.databaseName=null,e.prototype.databaseUrl="";var n={0:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.DatabaseDescriptionProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.databaseName=n[0].decode(e,e.uint32());break;case 2:o.databaseUrl=e.string();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.databaseName&&null!==e.databaseName){var r=n[0].verify(e.databaseName);if(r)return"databaseName."+r}return s.isString(e.databaseUrl)?null:"databaseUrl: string expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.DatabaseDescriptionProto)return e;var r=new c.keyhole.dbroot.DatabaseDescriptionProto;if(void 0!==e.databaseName&&null!==e.databaseName){if("object"!=typeof e.databaseName)throw TypeError(".keyhole.dbroot.DatabaseDescriptionProto.databaseName: object expected");r.databaseName=n[0].fromObject(e.databaseName)}return void 0!==e.databaseUrl&&null!==e.databaseUrl&&(r.databaseUrl=String(e.databaseUrl)),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.databaseName=null,t.databaseUrl=""),void 0!==e.databaseName&&null!==e.databaseName&&e.hasOwnProperty("databaseName")&&(t.databaseName=n[0].toObject(e.databaseName,r)),void 0!==e.databaseUrl&&null!==e.databaseUrl&&e.hasOwnProperty("databaseUrl")&&(t.databaseUrl=e.databaseUrl),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.ConfigScriptProto=(g.prototype.scriptName="",g.prototype.scriptData="",g.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.ConfigScriptProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.scriptName=e.string();break;case 2:o.scriptData=e.string();break;default:e.skipType(7&a)}}return o},g.verify=function(e){return"object"!=typeof e||null===e?"object expected":s.isString(e.scriptName)?s.isString(e.scriptData)?null:"scriptData: string expected":"scriptName: string expected"},g.from=g.fromObject=function(e){if(e instanceof c.keyhole.dbroot.ConfigScriptProto)return e;var r=new c.keyhole.dbroot.ConfigScriptProto;return void 0!==e.scriptName&&null!==e.scriptName&&(r.scriptName=String(e.scriptName)),void 0!==e.scriptData&&null!==e.scriptData&&(r.scriptData=String(e.scriptData)),r},g.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.scriptName="",t.scriptData=""),void 0!==e.scriptName&&null!==e.scriptName&&e.hasOwnProperty("scriptName")&&(t.scriptName=e.scriptName),void 0!==e.scriptData&&null!==e.scriptData&&e.hasOwnProperty("scriptData")&&(t.scriptData=e.scriptData),t},g.prototype.toObject=function(e){return this.constructor.toObject(this,e)},g.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},g),e.SwoopParamsProto=(P.prototype.startDistInMeters=0,P.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.SwoopParamsProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.startDistInMeters=e.double();break;default:e.skipType(7&a)}}return o},P.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.startDistInMeters&&"number"!=typeof e.startDistInMeters?"startDistInMeters: number expected":null},P.from=P.fromObject=function(e){if(e instanceof c.keyhole.dbroot.SwoopParamsProto)return e;var r=new c.keyhole.dbroot.SwoopParamsProto;return void 0!==e.startDistInMeters&&null!==e.startDistInMeters&&(r.startDistInMeters=Number(e.startDistInMeters)),r},P.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.startDistInMeters=0),void 0!==e.startDistInMeters&&null!==e.startDistInMeters&&e.hasOwnProperty("startDistInMeters")&&(t.startDistInMeters=e.startDistInMeters),t},P.prototype.toObject=function(e){return this.constructor.toObject(this,e)},P.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},P),e.PostingServerProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.name=null,e.prototype.baseUrl=null,e.prototype.postWizardPath=null,e.prototype.fileSubmitPath=null;var n={0:"keyhole.dbroot.StringIdOrValueProto",1:"keyhole.dbroot.StringIdOrValueProto",2:"keyhole.dbroot.StringIdOrValueProto",3:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.PostingServerProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.name=n[0].decode(e,e.uint32());break;case 2:o.baseUrl=n[1].decode(e,e.uint32());break;case 3:o.postWizardPath=n[2].decode(e,e.uint32());break;case 4:o.fileSubmitPath=n[3].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.name&&null!==e.name&&(r=n[0].verify(e.name))?"name."+r:void 0!==e.baseUrl&&null!==e.baseUrl&&(r=n[1].verify(e.baseUrl))?"baseUrl."+r:void 0!==e.postWizardPath&&null!==e.postWizardPath&&(r=n[2].verify(e.postWizardPath))?"postWizardPath."+r:void 0!==e.fileSubmitPath&&null!==e.fileSubmitPath&&(r=n[3].verify(e.fileSubmitPath))?"fileSubmitPath."+r:null;var r},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.PostingServerProto)return e;var r=new c.keyhole.dbroot.PostingServerProto;if(void 0!==e.name&&null!==e.name){if("object"!=typeof e.name)throw TypeError(".keyhole.dbroot.PostingServerProto.name: object expected");r.name=n[0].fromObject(e.name)}if(void 0!==e.baseUrl&&null!==e.baseUrl){if("object"!=typeof e.baseUrl)throw TypeError(".keyhole.dbroot.PostingServerProto.baseUrl: object expected");r.baseUrl=n[1].fromObject(e.baseUrl)}if(void 0!==e.postWizardPath&&null!==e.postWizardPath){if("object"!=typeof e.postWizardPath)throw TypeError(".keyhole.dbroot.PostingServerProto.postWizardPath: object expected");r.postWizardPath=n[2].fromObject(e.postWizardPath)}if(void 0!==e.fileSubmitPath&&null!==e.fileSubmitPath){if("object"!=typeof e.fileSubmitPath)throw TypeError(".keyhole.dbroot.PostingServerProto.fileSubmitPath: object expected");r.fileSubmitPath=n[3].fromObject(e.fileSubmitPath)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.name=null,t.baseUrl=null,t.postWizardPath=null,t.fileSubmitPath=null),void 0!==e.name&&null!==e.name&&e.hasOwnProperty("name")&&(t.name=n[0].toObject(e.name,r)),void 0!==e.baseUrl&&null!==e.baseUrl&&e.hasOwnProperty("baseUrl")&&(t.baseUrl=n[1].toObject(e.baseUrl,r)),void 0!==e.postWizardPath&&null!==e.postWizardPath&&e.hasOwnProperty("postWizardPath")&&(t.postWizardPath=n[2].toObject(e.postWizardPath,r)),void 0!==e.fileSubmitPath&&null!==e.fileSubmitPath&&e.hasOwnProperty("fileSubmitPath")&&(t.fileSubmitPath=n[3].toObject(e.fileSubmitPath,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.PlanetaryDatabaseProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url=null,e.prototype.name=null;var n={0:"keyhole.dbroot.StringIdOrValueProto",1:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.PlanetaryDatabaseProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.url=n[0].decode(e,e.uint32());break;case 2:o.name=n[1].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";var r=n[0].verify(e.url);return r?"url."+r:(r=n[1].verify(e.name))?"name."+r:null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.PlanetaryDatabaseProto)return e;var r=new c.keyhole.dbroot.PlanetaryDatabaseProto;if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.PlanetaryDatabaseProto.url: object expected");r.url=n[0].fromObject(e.url)}if(void 0!==e.name&&null!==e.name){if("object"!=typeof e.name)throw TypeError(".keyhole.dbroot.PlanetaryDatabaseProto.name: object expected");r.name=n[1].fromObject(e.name)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url=null,t.name=null),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[0].toObject(e.url,r)),void 0!==e.name&&null!==e.name&&e.hasOwnProperty("name")&&(t.name=n[1].toObject(e.name,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.LogServerProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url=null,e.prototype.enable=!1,e.prototype.throttlingFactor=1;var n={0:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.LogServerProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.url=n[0].decode(e,e.uint32());break;case 2:o.enable=e.bool();break;case 3:o.throttlingFactor=e.int32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.url&&null!==e.url){var r=n[0].verify(e.url);if(r)return"url."+r}return void 0!==e.enable&&"boolean"!=typeof e.enable?"enable: boolean expected":void 0===e.throttlingFactor||s.isInteger(e.throttlingFactor)?null:"throttlingFactor: integer expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.LogServerProto)return e;var r=new c.keyhole.dbroot.LogServerProto;if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.LogServerProto.url: object expected");r.url=n[0].fromObject(e.url)}return void 0!==e.enable&&null!==e.enable&&(r.enable=Boolean(e.enable)),void 0!==e.throttlingFactor&&null!==e.throttlingFactor&&(r.throttlingFactor=0|e.throttlingFactor),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url=null,t.enable=!1,t.throttlingFactor=1),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[0].toObject(e.url,r)),void 0!==e.enable&&null!==e.enable&&e.hasOwnProperty("enable")&&(t.enable=e.enable),void 0!==e.throttlingFactor&&null!==e.throttlingFactor&&e.hasOwnProperty("throttlingFactor")&&(t.throttlingFactor=e.throttlingFactor),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.EndSnippetProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.model=null,e.prototype.authServerUrl=null,e.prototype.disableAuthentication=!1,e.prototype.mfeDomains=s.emptyArray,e.prototype.mfeLangParam="hl=$5Bhl5D",e.prototype.adsUrlPatterns="",e.prototype.reverseGeocoderUrl=null,e.prototype.reverseGeocoderProtocolVersion=3,e.prototype.skyDatabaseIsAvailable=!0,e.prototype.skyDatabaseUrl=null,e.prototype.defaultWebPageIntlUrl=null,e.prototype.numStartUpTips=17,e.prototype.startUpTipsUrl=null,e.prototype.numProStartUpTips=0,e.prototype.proStartUpTipsUrl=null,e.prototype.startupTipsIntlUrl=null,e.prototype.userGuideIntlUrl=null,e.prototype.supportCenterIntlUrl=null,e.prototype.businessListingIntlUrl=null,e.prototype.supportAnswerIntlUrl=null,e.prototype.supportTopicIntlUrl=null,e.prototype.supportRequestIntlUrl=null,e.prototype.earthIntlUrl=null,e.prototype.addContentUrl=null,e.prototype.sketchupNotInstalledUrl=null,e.prototype.sketchupErrorUrl=null,e.prototype.freeLicenseUrl=null,e.prototype.proLicenseUrl=null,e.prototype.tutorialUrl=null,e.prototype.keyboardShortcutsUrl=null,e.prototype.releaseNotesUrl=null,e.prototype.hideUserData=!1,e.prototype.useGeLogo=!0,e.prototype.dioramaDescriptionUrlBase=null,e.prototype.dioramaDefaultColor=4291281607,e.prototype.dioramaBlacklistUrl=null,e.prototype.clientOptions=null,e.prototype.fetchingOptions=null,e.prototype.timeMachineOptions=null,e.prototype.csiOptions=null,e.prototype.searchTab=s.emptyArray,e.prototype.cobrandInfo=s.emptyArray,e.prototype.validDatabase=s.emptyArray,e.prototype.configScript=s.emptyArray,e.prototype.deauthServerUrl=null,e.prototype.swoopParameters=null,e.prototype.bbsServerInfo=null,e.prototype.dataErrorServerInfo=null,e.prototype.planetaryDatabase=s.emptyArray,e.prototype.logServer=null,e.prototype.autopiaOptions=null,e.prototype.searchConfig=null,e.prototype.searchInfo=null,e.prototype.elevationServiceBaseUrl="http://maps.google.com/maps/api/elevation/",e.prototype.elevationProfileQueryDelay=500,e.prototype.proUpgradeUrl=null,e.prototype.earthCommunityUrl=null,e.prototype.googleMapsUrl=null,e.prototype.sharingUrl=null,e.prototype.privacyPolicyUrl=null,e.prototype.doGplusUserCheck=!1,e.prototype.rocktreeDataProto=null,e.prototype.filmstripConfig=s.emptyArray,e.prototype.showSigninButton=!1,e.prototype.proMeasureUpsellUrl=null,e.prototype.proPrintUpsellUrl=null,e.prototype.starDataProto=null,e.prototype.feedbackUrl=null,e.prototype.oauth2LoginUrl=null;var n={0:"keyhole.dbroot.PlanetModelProto",1:"keyhole.dbroot.StringIdOrValueProto",3:"keyhole.dbroot.MfeDomainFeaturesProto",6:"keyhole.dbroot.StringIdOrValueProto",9:"keyhole.dbroot.StringIdOrValueProto",10:"keyhole.dbroot.StringIdOrValueProto",12:"keyhole.dbroot.StringIdOrValueProto",14:"keyhole.dbroot.StringIdOrValueProto",15:"keyhole.dbroot.StringIdOrValueProto",16:"keyhole.dbroot.StringIdOrValueProto",17:"keyhole.dbroot.StringIdOrValueProto",18:"keyhole.dbroot.StringIdOrValueProto",19:"keyhole.dbroot.StringIdOrValueProto",20:"keyhole.dbroot.StringIdOrValueProto",21:"keyhole.dbroot.StringIdOrValueProto",22:"keyhole.dbroot.StringIdOrValueProto",23:"keyhole.dbroot.StringIdOrValueProto",24:"keyhole.dbroot.StringIdOrValueProto",25:"keyhole.dbroot.StringIdOrValueProto",26:"keyhole.dbroot.StringIdOrValueProto",27:"keyhole.dbroot.StringIdOrValueProto",28:"keyhole.dbroot.StringIdOrValueProto",29:"keyhole.dbroot.StringIdOrValueProto",30:"keyhole.dbroot.StringIdOrValueProto",33:"keyhole.dbroot.StringIdOrValueProto",35:"keyhole.dbroot.StringIdOrValueProto",36:"keyhole.dbroot.ClientOptionsProto",37:"keyhole.dbroot.FetchingOptionsProto",38:"keyhole.dbroot.TimeMachineOptionsProto",39:"keyhole.dbroot.CSIOptionsProto",40:"keyhole.dbroot.SearchTabProto",41:"keyhole.dbroot.CobrandProto",42:"keyhole.dbroot.DatabaseDescriptionProto",43:"keyhole.dbroot.ConfigScriptProto",44:"keyhole.dbroot.StringIdOrValueProto",45:"keyhole.dbroot.SwoopParamsProto",46:"keyhole.dbroot.PostingServerProto",47:"keyhole.dbroot.PostingServerProto",48:"keyhole.dbroot.PlanetaryDatabaseProto",49:"keyhole.dbroot.LogServerProto",50:"keyhole.dbroot.AutopiaOptionsProto",51:"keyhole.dbroot.EndSnippetProto.SearchConfigProto",52:"keyhole.dbroot.EndSnippetProto.SearchInfoProto",55:"keyhole.dbroot.StringIdOrValueProto",56:"keyhole.dbroot.StringIdOrValueProto",57:"keyhole.dbroot.StringIdOrValueProto",58:"keyhole.dbroot.StringIdOrValueProto",59:"keyhole.dbroot.StringIdOrValueProto",61:"keyhole.dbroot.EndSnippetProto.RockTreeDataProto",62:"keyhole.dbroot.EndSnippetProto.FilmstripConfigProto",64:"keyhole.dbroot.StringIdOrValueProto",65:"keyhole.dbroot.StringIdOrValueProto",66:"keyhole.dbroot.EndSnippetProto.StarDataProto",67:"keyhole.dbroot.StringIdOrValueProto",68:"keyhole.dbroot.StringIdOrValueProto"};function r(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.model=n[0].decode(e,e.uint32());break;case 2:o.authServerUrl=n[1].decode(e,e.uint32());break;case 3:o.disableAuthentication=e.bool();break;case 4:o.mfeDomains&&o.mfeDomains.length||(o.mfeDomains=[]),o.mfeDomains.push(n[3].decode(e,e.uint32()));break;case 5:o.mfeLangParam=e.string();break;case 6:o.adsUrlPatterns=e.string();break;case 7:o.reverseGeocoderUrl=n[6].decode(e,e.uint32());break;case 8:o.reverseGeocoderProtocolVersion=e.int32();break;case 9:o.skyDatabaseIsAvailable=e.bool();break;case 10:o.skyDatabaseUrl=n[9].decode(e,e.uint32());break;case 11:o.defaultWebPageIntlUrl=n[10].decode(e,e.uint32());break;case 12:o.numStartUpTips=e.int32();break;case 13:o.startUpTipsUrl=n[12].decode(e,e.uint32());break;case 51:o.numProStartUpTips=e.int32();break;case 52:o.proStartUpTipsUrl=n[14].decode(e,e.uint32());break;case 64:o.startupTipsIntlUrl=n[15].decode(e,e.uint32());break;case 14:o.userGuideIntlUrl=n[16].decode(e,e.uint32());break;case 15:o.supportCenterIntlUrl=n[17].decode(e,e.uint32());break;case 16:o.businessListingIntlUrl=n[18].decode(e,e.uint32());break;case 17:o.supportAnswerIntlUrl=n[19].decode(e,e.uint32());break;case 18:o.supportTopicIntlUrl=n[20].decode(e,e.uint32());break;case 19:o.supportRequestIntlUrl=n[21].decode(e,e.uint32());break;case 20:o.earthIntlUrl=n[22].decode(e,e.uint32());break;case 21:o.addContentUrl=n[23].decode(e,e.uint32());break;case 22:o.sketchupNotInstalledUrl=n[24].decode(e,e.uint32());break;case 23:o.sketchupErrorUrl=n[25].decode(e,e.uint32());break;case 24:o.freeLicenseUrl=n[26].decode(e,e.uint32());break;case 25:o.proLicenseUrl=n[27].decode(e,e.uint32());break;case 48:o.tutorialUrl=n[28].decode(e,e.uint32());break;case 49:o.keyboardShortcutsUrl=n[29].decode(e,e.uint32());break;case 50:o.releaseNotesUrl=n[30].decode(e,e.uint32());break;case 26:o.hideUserData=e.bool();break;case 27:o.useGeLogo=e.bool();break;case 28:o.dioramaDescriptionUrlBase=n[33].decode(e,e.uint32());break;case 29:o.dioramaDefaultColor=e.uint32();break;case 53:o.dioramaBlacklistUrl=n[35].decode(e,e.uint32());break;case 30:o.clientOptions=n[36].decode(e,e.uint32());break;case 31:o.fetchingOptions=n[37].decode(e,e.uint32());break;case 32:o.timeMachineOptions=n[38].decode(e,e.uint32());break;case 33:o.csiOptions=n[39].decode(e,e.uint32());break;case 34:o.searchTab&&o.searchTab.length||(o.searchTab=[]),o.searchTab.push(n[40].decode(e,e.uint32()));break;case 35:o.cobrandInfo&&o.cobrandInfo.length||(o.cobrandInfo=[]),o.cobrandInfo.push(n[41].decode(e,e.uint32()));break;case 36:o.validDatabase&&o.validDatabase.length||(o.validDatabase=[]),o.validDatabase.push(n[42].decode(e,e.uint32()));break;case 37:o.configScript&&o.configScript.length||(o.configScript=[]),o.configScript.push(n[43].decode(e,e.uint32()));break;case 38:o.deauthServerUrl=n[44].decode(e,e.uint32());break;case 39:o.swoopParameters=n[45].decode(e,e.uint32());break;case 40:o.bbsServerInfo=n[46].decode(e,e.uint32());break;case 41:o.dataErrorServerInfo=n[47].decode(e,e.uint32());break;case 42:o.planetaryDatabase&&o.planetaryDatabase.length||(o.planetaryDatabase=[]),o.planetaryDatabase.push(n[48].decode(e,e.uint32()));break;case 43:o.logServer=n[49].decode(e,e.uint32());break;case 44:o.autopiaOptions=n[50].decode(e,e.uint32());break;case 54:o.searchConfig=n[51].decode(e,e.uint32());break;case 45:o.searchInfo=n[52].decode(e,e.uint32());break;case 46:o.elevationServiceBaseUrl=e.string();break;case 47:o.elevationProfileQueryDelay=e.int32();break;case 55:o.proUpgradeUrl=n[55].decode(e,e.uint32());break;case 56:o.earthCommunityUrl=n[56].decode(e,e.uint32());break;case 57:o.googleMapsUrl=n[57].decode(e,e.uint32());break;case 58:o.sharingUrl=n[58].decode(e,e.uint32());break;case 59:o.privacyPolicyUrl=n[59].decode(e,e.uint32());break;case 60:o.doGplusUserCheck=e.bool();break;case 61:o.rocktreeDataProto=n[61].decode(e,e.uint32());break;case 62:o.filmstripConfig&&o.filmstripConfig.length||(o.filmstripConfig=[]),o.filmstripConfig.push(n[62].decode(e,e.uint32()));break;case 63:o.showSigninButton=e.bool();break;case 65:o.proMeasureUpsellUrl=n[64].decode(e,e.uint32());break;case 66:o.proPrintUpsellUrl=n[65].decode(e,e.uint32());break;case 67:o.starDataProto=n[66].decode(e,e.uint32());break;case 68:o.feedbackUrl=n[67].decode(e,e.uint32());break;case 69:o.oauth2LoginUrl=n[68].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.model&&null!==e.model&&(t=n[0].verify(e.model)))return"model."+t;if(void 0!==e.authServerUrl&&null!==e.authServerUrl&&(t=n[1].verify(e.authServerUrl)))return"authServerUrl."+t;if(void 0!==e.disableAuthentication&&"boolean"!=typeof e.disableAuthentication)return"disableAuthentication: boolean expected";if(void 0!==e.mfeDomains){if(!Array.isArray(e.mfeDomains))return"mfeDomains: array expected";for(var r=0;r<e.mfeDomains.length;++r)if(t=n[3].verify(e.mfeDomains[r]))return"mfeDomains."+t}if(void 0!==e.mfeLangParam&&!s.isString(e.mfeLangParam))return"mfeLangParam: string expected";if(void 0!==e.adsUrlPatterns&&!s.isString(e.adsUrlPatterns))return"adsUrlPatterns: string expected";if(void 0!==e.reverseGeocoderUrl&&null!==e.reverseGeocoderUrl&&(t=n[6].verify(e.reverseGeocoderUrl)))return"reverseGeocoderUrl."+t;if(void 0!==e.reverseGeocoderProtocolVersion&&!s.isInteger(e.reverseGeocoderProtocolVersion))return"reverseGeocoderProtocolVersion: integer expected";if(void 0!==e.skyDatabaseIsAvailable&&"boolean"!=typeof e.skyDatabaseIsAvailable)return"skyDatabaseIsAvailable: boolean expected";if(void 0!==e.skyDatabaseUrl&&null!==e.skyDatabaseUrl&&(t=n[9].verify(e.skyDatabaseUrl)))return"skyDatabaseUrl."+t;if(void 0!==e.defaultWebPageIntlUrl&&null!==e.defaultWebPageIntlUrl&&(t=n[10].verify(e.defaultWebPageIntlUrl)))return"defaultWebPageIntlUrl."+t;if(void 0!==e.numStartUpTips&&!s.isInteger(e.numStartUpTips))return"numStartUpTips: integer expected";if(void 0!==e.startUpTipsUrl&&null!==e.startUpTipsUrl&&(t=n[12].verify(e.startUpTipsUrl)))return"startUpTipsUrl."+t;if(void 0!==e.numProStartUpTips&&!s.isInteger(e.numProStartUpTips))return"numProStartUpTips: integer expected";if(void 0!==e.proStartUpTipsUrl&&null!==e.proStartUpTipsUrl&&(t=n[14].verify(e.proStartUpTipsUrl)))return"proStartUpTipsUrl."+t;if(void 0!==e.startupTipsIntlUrl&&null!==e.startupTipsIntlUrl&&(t=n[15].verify(e.startupTipsIntlUrl)))return"startupTipsIntlUrl."+t;if(void 0!==e.userGuideIntlUrl&&null!==e.userGuideIntlUrl&&(t=n[16].verify(e.userGuideIntlUrl)))return"userGuideIntlUrl."+t;if(void 0!==e.supportCenterIntlUrl&&null!==e.supportCenterIntlUrl&&(t=n[17].verify(e.supportCenterIntlUrl)))return"supportCenterIntlUrl."+t;if(void 0!==e.businessListingIntlUrl&&null!==e.businessListingIntlUrl&&(t=n[18].verify(e.businessListingIntlUrl)))return"businessListingIntlUrl."+t;if(void 0!==e.supportAnswerIntlUrl&&null!==e.supportAnswerIntlUrl&&(t=n[19].verify(e.supportAnswerIntlUrl)))return"supportAnswerIntlUrl."+t;if(void 0!==e.supportTopicIntlUrl&&null!==e.supportTopicIntlUrl&&(t=n[20].verify(e.supportTopicIntlUrl)))return"supportTopicIntlUrl."+t;if(void 0!==e.supportRequestIntlUrl&&null!==e.supportRequestIntlUrl&&(t=n[21].verify(e.supportRequestIntlUrl)))return"supportRequestIntlUrl."+t;if(void 0!==e.earthIntlUrl&&null!==e.earthIntlUrl&&(t=n[22].verify(e.earthIntlUrl)))return"earthIntlUrl."+t;if(void 0!==e.addContentUrl&&null!==e.addContentUrl&&(t=n[23].verify(e.addContentUrl)))return"addContentUrl."+t;if(void 0!==e.sketchupNotInstalledUrl&&null!==e.sketchupNotInstalledUrl&&(t=n[24].verify(e.sketchupNotInstalledUrl)))return"sketchupNotInstalledUrl."+t;if(void 0!==e.sketchupErrorUrl&&null!==e.sketchupErrorUrl&&(t=n[25].verify(e.sketchupErrorUrl)))return"sketchupErrorUrl."+t;if(void 0!==e.freeLicenseUrl&&null!==e.freeLicenseUrl&&(t=n[26].verify(e.freeLicenseUrl)))return"freeLicenseUrl."+t;if(void 0!==e.proLicenseUrl&&null!==e.proLicenseUrl&&(t=n[27].verify(e.proLicenseUrl)))return"proLicenseUrl."+t;if(void 0!==e.tutorialUrl&&null!==e.tutorialUrl&&(t=n[28].verify(e.tutorialUrl)))return"tutorialUrl."+t;if(void 0!==e.keyboardShortcutsUrl&&null!==e.keyboardShortcutsUrl&&(t=n[29].verify(e.keyboardShortcutsUrl)))return"keyboardShortcutsUrl."+t;if(void 0!==e.releaseNotesUrl&&null!==e.releaseNotesUrl&&(t=n[30].verify(e.releaseNotesUrl)))return"releaseNotesUrl."+t;if(void 0!==e.hideUserData&&"boolean"!=typeof e.hideUserData)return"hideUserData: boolean expected";if(void 0!==e.useGeLogo&&"boolean"!=typeof e.useGeLogo)return"useGeLogo: boolean expected";if(void 0!==e.dioramaDescriptionUrlBase&&null!==e.dioramaDescriptionUrlBase&&(t=n[33].verify(e.dioramaDescriptionUrlBase)))return"dioramaDescriptionUrlBase."+t;if(void 0!==e.dioramaDefaultColor&&!s.isInteger(e.dioramaDefaultColor))return"dioramaDefaultColor: integer expected";if(void 0!==e.dioramaBlacklistUrl&&null!==e.dioramaBlacklistUrl&&(t=n[35].verify(e.dioramaBlacklistUrl)))return"dioramaBlacklistUrl."+t;if(void 0!==e.clientOptions&&null!==e.clientOptions&&(t=n[36].verify(e.clientOptions)))return"clientOptions."+t;if(void 0!==e.fetchingOptions&&null!==e.fetchingOptions&&(t=n[37].verify(e.fetchingOptions)))return"fetchingOptions."+t;if(void 0!==e.timeMachineOptions&&null!==e.timeMachineOptions&&(t=n[38].verify(e.timeMachineOptions)))return"timeMachineOptions."+t;if(void 0!==e.csiOptions&&null!==e.csiOptions&&(t=n[39].verify(e.csiOptions)))return"csiOptions."+t;if(void 0!==e.searchTab){if(!Array.isArray(e.searchTab))return"searchTab: array expected";for(r=0;r<e.searchTab.length;++r)if(t=n[40].verify(e.searchTab[r]))return"searchTab."+t}if(void 0!==e.cobrandInfo){if(!Array.isArray(e.cobrandInfo))return"cobrandInfo: array expected";for(r=0;r<e.cobrandInfo.length;++r)if(t=n[41].verify(e.cobrandInfo[r]))return"cobrandInfo."+t}if(void 0!==e.validDatabase){if(!Array.isArray(e.validDatabase))return"validDatabase: array expected";for(r=0;r<e.validDatabase.length;++r)if(t=n[42].verify(e.validDatabase[r]))return"validDatabase."+t}if(void 0!==e.configScript){if(!Array.isArray(e.configScript))return"configScript: array expected";for(r=0;r<e.configScript.length;++r)if(t=n[43].verify(e.configScript[r]))return"configScript."+t}if(void 0!==e.deauthServerUrl&&null!==e.deauthServerUrl&&(t=n[44].verify(e.deauthServerUrl)))return"deauthServerUrl."+t;if(void 0!==e.swoopParameters&&null!==e.swoopParameters&&(t=n[45].verify(e.swoopParameters)))return"swoopParameters."+t;if(void 0!==e.bbsServerInfo&&null!==e.bbsServerInfo&&(t=n[46].verify(e.bbsServerInfo)))return"bbsServerInfo."+t;if(void 0!==e.dataErrorServerInfo&&null!==e.dataErrorServerInfo&&(t=n[47].verify(e.dataErrorServerInfo)))return"dataErrorServerInfo."+t;if(void 0!==e.planetaryDatabase){if(!Array.isArray(e.planetaryDatabase))return"planetaryDatabase: array expected";for(r=0;r<e.planetaryDatabase.length;++r)if(t=n[48].verify(e.planetaryDatabase[r]))return"planetaryDatabase."+t}if(void 0!==e.logServer&&null!==e.logServer&&(t=n[49].verify(e.logServer)))return"logServer."+t;if(void 0!==e.autopiaOptions&&null!==e.autopiaOptions&&(t=n[50].verify(e.autopiaOptions)))return"autopiaOptions."+t;if(void 0!==e.searchConfig&&null!==e.searchConfig&&(t=n[51].verify(e.searchConfig)))return"searchConfig."+t;if(void 0!==e.searchInfo&&null!==e.searchInfo&&(t=n[52].verify(e.searchInfo)))return"searchInfo."+t;if(void 0!==e.elevationServiceBaseUrl&&!s.isString(e.elevationServiceBaseUrl))return"elevationServiceBaseUrl: string expected";if(void 0!==e.elevationProfileQueryDelay&&!s.isInteger(e.elevationProfileQueryDelay))return"elevationProfileQueryDelay: integer expected";if(void 0!==e.proUpgradeUrl&&null!==e.proUpgradeUrl&&(t=n[55].verify(e.proUpgradeUrl)))return"proUpgradeUrl."+t;if(void 0!==e.earthCommunityUrl&&null!==e.earthCommunityUrl&&(t=n[56].verify(e.earthCommunityUrl)))return"earthCommunityUrl."+t;if(void 0!==e.googleMapsUrl&&null!==e.googleMapsUrl&&(t=n[57].verify(e.googleMapsUrl)))return"googleMapsUrl."+t;if(void 0!==e.sharingUrl&&null!==e.sharingUrl&&(t=n[58].verify(e.sharingUrl)))return"sharingUrl."+t;if(void 0!==e.privacyPolicyUrl&&null!==e.privacyPolicyUrl&&(t=n[59].verify(e.privacyPolicyUrl)))return"privacyPolicyUrl."+t;if(void 0!==e.doGplusUserCheck&&"boolean"!=typeof e.doGplusUserCheck)return"doGplusUserCheck: boolean expected";if(void 0!==e.rocktreeDataProto&&null!==e.rocktreeDataProto&&(t=n[61].verify(e.rocktreeDataProto)))return"rocktreeDataProto."+t;if(void 0!==e.filmstripConfig){if(!Array.isArray(e.filmstripConfig))return"filmstripConfig: array expected";for(var t,r=0;r<e.filmstripConfig.length;++r)if(t=n[62].verify(e.filmstripConfig[r]))return"filmstripConfig."+t}return void 0!==e.showSigninButton&&"boolean"!=typeof e.showSigninButton?"showSigninButton: boolean expected":void 0!==e.proMeasureUpsellUrl&&null!==e.proMeasureUpsellUrl&&(t=n[64].verify(e.proMeasureUpsellUrl))?"proMeasureUpsellUrl."+t:void 0!==e.proPrintUpsellUrl&&null!==e.proPrintUpsellUrl&&(t=n[65].verify(e.proPrintUpsellUrl))?"proPrintUpsellUrl."+t:void 0!==e.starDataProto&&null!==e.starDataProto&&(t=n[66].verify(e.starDataProto))?"starDataProto."+t:void 0!==e.feedbackUrl&&null!==e.feedbackUrl&&(t=n[67].verify(e.feedbackUrl))?"feedbackUrl."+t:void 0!==e.oauth2LoginUrl&&null!==e.oauth2LoginUrl&&(t=n[68].verify(e.oauth2LoginUrl))?"oauth2LoginUrl."+t:null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto;if(void 0!==e.model&&null!==e.model){if("object"!=typeof e.model)throw TypeError(".keyhole.dbroot.EndSnippetProto.model: object expected");r.model=n[0].fromObject(e.model)}if(void 0!==e.authServerUrl&&null!==e.authServerUrl){if("object"!=typeof e.authServerUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.authServerUrl: object expected");r.authServerUrl=n[1].fromObject(e.authServerUrl)}if(void 0!==e.disableAuthentication&&null!==e.disableAuthentication&&(r.disableAuthentication=Boolean(e.disableAuthentication)),e.mfeDomains){if(!Array.isArray(e.mfeDomains))throw TypeError(".keyhole.dbroot.EndSnippetProto.mfeDomains: array expected");r.mfeDomains=[];for(var t=0;t<e.mfeDomains.length;++t){if("object"!=typeof e.mfeDomains[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.mfeDomains: object expected");r.mfeDomains[t]=n[3].fromObject(e.mfeDomains[t])}}if(void 0!==e.mfeLangParam&&null!==e.mfeLangParam&&(r.mfeLangParam=String(e.mfeLangParam)),void 0!==e.adsUrlPatterns&&null!==e.adsUrlPatterns&&(r.adsUrlPatterns=String(e.adsUrlPatterns)),void 0!==e.reverseGeocoderUrl&&null!==e.reverseGeocoderUrl){if("object"!=typeof e.reverseGeocoderUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.reverseGeocoderUrl: object expected");r.reverseGeocoderUrl=n[6].fromObject(e.reverseGeocoderUrl)}if(void 0!==e.reverseGeocoderProtocolVersion&&null!==e.reverseGeocoderProtocolVersion&&(r.reverseGeocoderProtocolVersion=0|e.reverseGeocoderProtocolVersion),void 0!==e.skyDatabaseIsAvailable&&null!==e.skyDatabaseIsAvailable&&(r.skyDatabaseIsAvailable=Boolean(e.skyDatabaseIsAvailable)),void 0!==e.skyDatabaseUrl&&null!==e.skyDatabaseUrl){if("object"!=typeof e.skyDatabaseUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.skyDatabaseUrl: object expected");r.skyDatabaseUrl=n[9].fromObject(e.skyDatabaseUrl)}if(void 0!==e.defaultWebPageIntlUrl&&null!==e.defaultWebPageIntlUrl){if("object"!=typeof e.defaultWebPageIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.defaultWebPageIntlUrl: object expected");r.defaultWebPageIntlUrl=n[10].fromObject(e.defaultWebPageIntlUrl)}if(void 0!==e.numStartUpTips&&null!==e.numStartUpTips&&(r.numStartUpTips=0|e.numStartUpTips),void 0!==e.startUpTipsUrl&&null!==e.startUpTipsUrl){if("object"!=typeof e.startUpTipsUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.startUpTipsUrl: object expected");r.startUpTipsUrl=n[12].fromObject(e.startUpTipsUrl)}if(void 0!==e.numProStartUpTips&&null!==e.numProStartUpTips&&(r.numProStartUpTips=0|e.numProStartUpTips),void 0!==e.proStartUpTipsUrl&&null!==e.proStartUpTipsUrl){if("object"!=typeof e.proStartUpTipsUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.proStartUpTipsUrl: object expected");r.proStartUpTipsUrl=n[14].fromObject(e.proStartUpTipsUrl)}if(void 0!==e.startupTipsIntlUrl&&null!==e.startupTipsIntlUrl){if("object"!=typeof e.startupTipsIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.startupTipsIntlUrl: object expected");r.startupTipsIntlUrl=n[15].fromObject(e.startupTipsIntlUrl)}if(void 0!==e.userGuideIntlUrl&&null!==e.userGuideIntlUrl){if("object"!=typeof e.userGuideIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.userGuideIntlUrl: object expected");r.userGuideIntlUrl=n[16].fromObject(e.userGuideIntlUrl)}if(void 0!==e.supportCenterIntlUrl&&null!==e.supportCenterIntlUrl){if("object"!=typeof e.supportCenterIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.supportCenterIntlUrl: object expected");r.supportCenterIntlUrl=n[17].fromObject(e.supportCenterIntlUrl)}if(void 0!==e.businessListingIntlUrl&&null!==e.businessListingIntlUrl){if("object"!=typeof e.businessListingIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.businessListingIntlUrl: object expected");r.businessListingIntlUrl=n[18].fromObject(e.businessListingIntlUrl)}if(void 0!==e.supportAnswerIntlUrl&&null!==e.supportAnswerIntlUrl){if("object"!=typeof e.supportAnswerIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.supportAnswerIntlUrl: object expected");r.supportAnswerIntlUrl=n[19].fromObject(e.supportAnswerIntlUrl)}if(void 0!==e.supportTopicIntlUrl&&null!==e.supportTopicIntlUrl){if("object"!=typeof e.supportTopicIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.supportTopicIntlUrl: object expected");r.supportTopicIntlUrl=n[20].fromObject(e.supportTopicIntlUrl)}if(void 0!==e.supportRequestIntlUrl&&null!==e.supportRequestIntlUrl){if("object"!=typeof e.supportRequestIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.supportRequestIntlUrl: object expected");r.supportRequestIntlUrl=n[21].fromObject(e.supportRequestIntlUrl)}if(void 0!==e.earthIntlUrl&&null!==e.earthIntlUrl){if("object"!=typeof e.earthIntlUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.earthIntlUrl: object expected");r.earthIntlUrl=n[22].fromObject(e.earthIntlUrl)}if(void 0!==e.addContentUrl&&null!==e.addContentUrl){if("object"!=typeof e.addContentUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.addContentUrl: object expected");r.addContentUrl=n[23].fromObject(e.addContentUrl)}if(void 0!==e.sketchupNotInstalledUrl&&null!==e.sketchupNotInstalledUrl){if("object"!=typeof e.sketchupNotInstalledUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.sketchupNotInstalledUrl: object expected");r.sketchupNotInstalledUrl=n[24].fromObject(e.sketchupNotInstalledUrl)}if(void 0!==e.sketchupErrorUrl&&null!==e.sketchupErrorUrl){if("object"!=typeof e.sketchupErrorUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.sketchupErrorUrl: object expected");r.sketchupErrorUrl=n[25].fromObject(e.sketchupErrorUrl)}if(void 0!==e.freeLicenseUrl&&null!==e.freeLicenseUrl){if("object"!=typeof e.freeLicenseUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.freeLicenseUrl: object expected");r.freeLicenseUrl=n[26].fromObject(e.freeLicenseUrl)}if(void 0!==e.proLicenseUrl&&null!==e.proLicenseUrl){if("object"!=typeof e.proLicenseUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.proLicenseUrl: object expected");r.proLicenseUrl=n[27].fromObject(e.proLicenseUrl)}if(void 0!==e.tutorialUrl&&null!==e.tutorialUrl){if("object"!=typeof e.tutorialUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.tutorialUrl: object expected");r.tutorialUrl=n[28].fromObject(e.tutorialUrl)}if(void 0!==e.keyboardShortcutsUrl&&null!==e.keyboardShortcutsUrl){if("object"!=typeof e.keyboardShortcutsUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.keyboardShortcutsUrl: object expected");r.keyboardShortcutsUrl=n[29].fromObject(e.keyboardShortcutsUrl)}if(void 0!==e.releaseNotesUrl&&null!==e.releaseNotesUrl){if("object"!=typeof e.releaseNotesUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.releaseNotesUrl: object expected");r.releaseNotesUrl=n[30].fromObject(e.releaseNotesUrl)}if(void 0!==e.hideUserData&&null!==e.hideUserData&&(r.hideUserData=Boolean(e.hideUserData)),void 0!==e.useGeLogo&&null!==e.useGeLogo&&(r.useGeLogo=Boolean(e.useGeLogo)),void 0!==e.dioramaDescriptionUrlBase&&null!==e.dioramaDescriptionUrlBase){if("object"!=typeof e.dioramaDescriptionUrlBase)throw TypeError(".keyhole.dbroot.EndSnippetProto.dioramaDescriptionUrlBase: object expected");r.dioramaDescriptionUrlBase=n[33].fromObject(e.dioramaDescriptionUrlBase)}if(void 0!==e.dioramaDefaultColor&&null!==e.dioramaDefaultColor&&(r.dioramaDefaultColor=e.dioramaDefaultColor>>>0),void 0!==e.dioramaBlacklistUrl&&null!==e.dioramaBlacklistUrl){if("object"!=typeof e.dioramaBlacklistUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.dioramaBlacklistUrl: object expected");r.dioramaBlacklistUrl=n[35].fromObject(e.dioramaBlacklistUrl)}if(void 0!==e.clientOptions&&null!==e.clientOptions){if("object"!=typeof e.clientOptions)throw TypeError(".keyhole.dbroot.EndSnippetProto.clientOptions: object expected");r.clientOptions=n[36].fromObject(e.clientOptions)}if(void 0!==e.fetchingOptions&&null!==e.fetchingOptions){if("object"!=typeof e.fetchingOptions)throw TypeError(".keyhole.dbroot.EndSnippetProto.fetchingOptions: object expected");r.fetchingOptions=n[37].fromObject(e.fetchingOptions)}if(void 0!==e.timeMachineOptions&&null!==e.timeMachineOptions){if("object"!=typeof e.timeMachineOptions)throw TypeError(".keyhole.dbroot.EndSnippetProto.timeMachineOptions: object expected");r.timeMachineOptions=n[38].fromObject(e.timeMachineOptions)}if(void 0!==e.csiOptions&&null!==e.csiOptions){if("object"!=typeof e.csiOptions)throw TypeError(".keyhole.dbroot.EndSnippetProto.csiOptions: object expected");r.csiOptions=n[39].fromObject(e.csiOptions)}if(e.searchTab){if(!Array.isArray(e.searchTab))throw TypeError(".keyhole.dbroot.EndSnippetProto.searchTab: array expected");for(r.searchTab=[],t=0;t<e.searchTab.length;++t){if("object"!=typeof e.searchTab[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.searchTab: object expected");r.searchTab[t]=n[40].fromObject(e.searchTab[t])}}if(e.cobrandInfo){if(!Array.isArray(e.cobrandInfo))throw TypeError(".keyhole.dbroot.EndSnippetProto.cobrandInfo: array expected");for(r.cobrandInfo=[],t=0;t<e.cobrandInfo.length;++t){if("object"!=typeof e.cobrandInfo[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.cobrandInfo: object expected");r.cobrandInfo[t]=n[41].fromObject(e.cobrandInfo[t])}}if(e.validDatabase){if(!Array.isArray(e.validDatabase))throw TypeError(".keyhole.dbroot.EndSnippetProto.validDatabase: array expected");for(r.validDatabase=[],t=0;t<e.validDatabase.length;++t){if("object"!=typeof e.validDatabase[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.validDatabase: object expected");r.validDatabase[t]=n[42].fromObject(e.validDatabase[t])}}if(e.configScript){if(!Array.isArray(e.configScript))throw TypeError(".keyhole.dbroot.EndSnippetProto.configScript: array expected");for(r.configScript=[],t=0;t<e.configScript.length;++t){if("object"!=typeof e.configScript[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.configScript: object expected");r.configScript[t]=n[43].fromObject(e.configScript[t])}}if(void 0!==e.deauthServerUrl&&null!==e.deauthServerUrl){if("object"!=typeof e.deauthServerUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.deauthServerUrl: object expected");r.deauthServerUrl=n[44].fromObject(e.deauthServerUrl)}if(void 0!==e.swoopParameters&&null!==e.swoopParameters){if("object"!=typeof e.swoopParameters)throw TypeError(".keyhole.dbroot.EndSnippetProto.swoopParameters: object expected");r.swoopParameters=n[45].fromObject(e.swoopParameters)}if(void 0!==e.bbsServerInfo&&null!==e.bbsServerInfo){if("object"!=typeof e.bbsServerInfo)throw TypeError(".keyhole.dbroot.EndSnippetProto.bbsServerInfo: object expected");r.bbsServerInfo=n[46].fromObject(e.bbsServerInfo)}if(void 0!==e.dataErrorServerInfo&&null!==e.dataErrorServerInfo){if("object"!=typeof e.dataErrorServerInfo)throw TypeError(".keyhole.dbroot.EndSnippetProto.dataErrorServerInfo: object expected");r.dataErrorServerInfo=n[47].fromObject(e.dataErrorServerInfo)}if(e.planetaryDatabase){if(!Array.isArray(e.planetaryDatabase))throw TypeError(".keyhole.dbroot.EndSnippetProto.planetaryDatabase: array expected");for(r.planetaryDatabase=[],t=0;t<e.planetaryDatabase.length;++t){if("object"!=typeof e.planetaryDatabase[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.planetaryDatabase: object expected");r.planetaryDatabase[t]=n[48].fromObject(e.planetaryDatabase[t])}}if(void 0!==e.logServer&&null!==e.logServer){if("object"!=typeof e.logServer)throw TypeError(".keyhole.dbroot.EndSnippetProto.logServer: object expected");r.logServer=n[49].fromObject(e.logServer)}if(void 0!==e.autopiaOptions&&null!==e.autopiaOptions){if("object"!=typeof e.autopiaOptions)throw TypeError(".keyhole.dbroot.EndSnippetProto.autopiaOptions: object expected");r.autopiaOptions=n[50].fromObject(e.autopiaOptions)}if(void 0!==e.searchConfig&&null!==e.searchConfig){if("object"!=typeof e.searchConfig)throw TypeError(".keyhole.dbroot.EndSnippetProto.searchConfig: object expected");r.searchConfig=n[51].fromObject(e.searchConfig)}if(void 0!==e.searchInfo&&null!==e.searchInfo){if("object"!=typeof e.searchInfo)throw TypeError(".keyhole.dbroot.EndSnippetProto.searchInfo: object expected");r.searchInfo=n[52].fromObject(e.searchInfo)}if(void 0!==e.elevationServiceBaseUrl&&null!==e.elevationServiceBaseUrl&&(r.elevationServiceBaseUrl=String(e.elevationServiceBaseUrl)),void 0!==e.elevationProfileQueryDelay&&null!==e.elevationProfileQueryDelay&&(r.elevationProfileQueryDelay=0|e.elevationProfileQueryDelay),void 0!==e.proUpgradeUrl&&null!==e.proUpgradeUrl){if("object"!=typeof e.proUpgradeUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.proUpgradeUrl: object expected");r.proUpgradeUrl=n[55].fromObject(e.proUpgradeUrl)}if(void 0!==e.earthCommunityUrl&&null!==e.earthCommunityUrl){if("object"!=typeof e.earthCommunityUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.earthCommunityUrl: object expected");r.earthCommunityUrl=n[56].fromObject(e.earthCommunityUrl)}if(void 0!==e.googleMapsUrl&&null!==e.googleMapsUrl){if("object"!=typeof e.googleMapsUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.googleMapsUrl: object expected");r.googleMapsUrl=n[57].fromObject(e.googleMapsUrl)}if(void 0!==e.sharingUrl&&null!==e.sharingUrl){if("object"!=typeof e.sharingUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.sharingUrl: object expected");r.sharingUrl=n[58].fromObject(e.sharingUrl)}if(void 0!==e.privacyPolicyUrl&&null!==e.privacyPolicyUrl){if("object"!=typeof e.privacyPolicyUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.privacyPolicyUrl: object expected");r.privacyPolicyUrl=n[59].fromObject(e.privacyPolicyUrl)}if(void 0!==e.doGplusUserCheck&&null!==e.doGplusUserCheck&&(r.doGplusUserCheck=Boolean(e.doGplusUserCheck)),void 0!==e.rocktreeDataProto&&null!==e.rocktreeDataProto){if("object"!=typeof e.rocktreeDataProto)throw TypeError(".keyhole.dbroot.EndSnippetProto.rocktreeDataProto: object expected");r.rocktreeDataProto=n[61].fromObject(e.rocktreeDataProto)}if(e.filmstripConfig){if(!Array.isArray(e.filmstripConfig))throw TypeError(".keyhole.dbroot.EndSnippetProto.filmstripConfig: array expected");for(r.filmstripConfig=[],t=0;t<e.filmstripConfig.length;++t){if("object"!=typeof e.filmstripConfig[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.filmstripConfig: object expected");r.filmstripConfig[t]=n[62].fromObject(e.filmstripConfig[t])}}if(void 0!==e.showSigninButton&&null!==e.showSigninButton&&(r.showSigninButton=Boolean(e.showSigninButton)),void 0!==e.proMeasureUpsellUrl&&null!==e.proMeasureUpsellUrl){if("object"!=typeof e.proMeasureUpsellUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.proMeasureUpsellUrl: object expected");r.proMeasureUpsellUrl=n[64].fromObject(e.proMeasureUpsellUrl)}if(void 0!==e.proPrintUpsellUrl&&null!==e.proPrintUpsellUrl){if("object"!=typeof e.proPrintUpsellUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.proPrintUpsellUrl: object expected");r.proPrintUpsellUrl=n[65].fromObject(e.proPrintUpsellUrl)}if(void 0!==e.starDataProto&&null!==e.starDataProto){if("object"!=typeof e.starDataProto)throw TypeError(".keyhole.dbroot.EndSnippetProto.starDataProto: object expected");r.starDataProto=n[66].fromObject(e.starDataProto)}if(void 0!==e.feedbackUrl&&null!==e.feedbackUrl){if("object"!=typeof e.feedbackUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.feedbackUrl: object expected");r.feedbackUrl=n[67].fromObject(e.feedbackUrl)}if(void 0!==e.oauth2LoginUrl&&null!==e.oauth2LoginUrl){if("object"!=typeof e.oauth2LoginUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.oauth2LoginUrl: object expected");r.oauth2LoginUrl=n[68].fromObject(e.oauth2LoginUrl)}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.mfeDomains=[],t.searchTab=[],t.cobrandInfo=[],t.validDatabase=[],t.configScript=[],t.planetaryDatabase=[],t.filmstripConfig=[]),r.defaults&&(t.model=null,t.authServerUrl=null,t.disableAuthentication=!1,t.mfeLangParam="hl=$5Bhl5D",t.adsUrlPatterns="",t.reverseGeocoderUrl=null,t.reverseGeocoderProtocolVersion=3,t.skyDatabaseIsAvailable=!0,t.skyDatabaseUrl=null,t.defaultWebPageIntlUrl=null,t.numStartUpTips=17,t.startUpTipsUrl=null,t.numProStartUpTips=0,t.proStartUpTipsUrl=null,t.startupTipsIntlUrl=null,t.userGuideIntlUrl=null,t.supportCenterIntlUrl=null,t.businessListingIntlUrl=null,t.supportAnswerIntlUrl=null,t.supportTopicIntlUrl=null,t.supportRequestIntlUrl=null,t.earthIntlUrl=null,t.addContentUrl=null,t.sketchupNotInstalledUrl=null,t.sketchupErrorUrl=null,t.freeLicenseUrl=null,t.proLicenseUrl=null,t.tutorialUrl=null,t.keyboardShortcutsUrl=null,t.releaseNotesUrl=null,t.hideUserData=!1,t.useGeLogo=!0,t.dioramaDescriptionUrlBase=null,t.dioramaDefaultColor=4291281607,t.dioramaBlacklistUrl=null,t.clientOptions=null,t.fetchingOptions=null,t.timeMachineOptions=null,t.csiOptions=null,t.deauthServerUrl=null,t.swoopParameters=null,t.bbsServerInfo=null,t.dataErrorServerInfo=null,t.logServer=null,t.autopiaOptions=null,t.searchConfig=null,t.searchInfo=null,t.elevationServiceBaseUrl="http://maps.google.com/maps/api/elevation/",t.elevationProfileQueryDelay=500,t.proUpgradeUrl=null,t.earthCommunityUrl=null,t.googleMapsUrl=null,t.sharingUrl=null,t.privacyPolicyUrl=null,t.doGplusUserCheck=!1,t.rocktreeDataProto=null,t.showSigninButton=!1,t.proMeasureUpsellUrl=null,t.proPrintUpsellUrl=null,t.starDataProto=null,t.feedbackUrl=null,t.oauth2LoginUrl=null),void 0!==e.model&&null!==e.model&&e.hasOwnProperty("model")&&(t.model=n[0].toObject(e.model,r)),void 0!==e.authServerUrl&&null!==e.authServerUrl&&e.hasOwnProperty("authServerUrl")&&(t.authServerUrl=n[1].toObject(e.authServerUrl,r)),void 0!==e.disableAuthentication&&null!==e.disableAuthentication&&e.hasOwnProperty("disableAuthentication")&&(t.disableAuthentication=e.disableAuthentication),void 0!==e.mfeDomains&&null!==e.mfeDomains&&e.hasOwnProperty("mfeDomains")){t.mfeDomains=[];for(var o=0;o<e.mfeDomains.length;++o)t.mfeDomains[o]=n[3].toObject(e.mfeDomains[o],r)}if(void 0!==e.mfeLangParam&&null!==e.mfeLangParam&&e.hasOwnProperty("mfeLangParam")&&(t.mfeLangParam=e.mfeLangParam),void 0!==e.adsUrlPatterns&&null!==e.adsUrlPatterns&&e.hasOwnProperty("adsUrlPatterns")&&(t.adsUrlPatterns=e.adsUrlPatterns),void 0!==e.reverseGeocoderUrl&&null!==e.reverseGeocoderUrl&&e.hasOwnProperty("reverseGeocoderUrl")&&(t.reverseGeocoderUrl=n[6].toObject(e.reverseGeocoderUrl,r)),void 0!==e.reverseGeocoderProtocolVersion&&null!==e.reverseGeocoderProtocolVersion&&e.hasOwnProperty("reverseGeocoderProtocolVersion")&&(t.reverseGeocoderProtocolVersion=e.reverseGeocoderProtocolVersion),void 0!==e.skyDatabaseIsAvailable&&null!==e.skyDatabaseIsAvailable&&e.hasOwnProperty("skyDatabaseIsAvailable")&&(t.skyDatabaseIsAvailable=e.skyDatabaseIsAvailable),void 0!==e.skyDatabaseUrl&&null!==e.skyDatabaseUrl&&e.hasOwnProperty("skyDatabaseUrl")&&(t.skyDatabaseUrl=n[9].toObject(e.skyDatabaseUrl,r)),void 0!==e.defaultWebPageIntlUrl&&null!==e.defaultWebPageIntlUrl&&e.hasOwnProperty("defaultWebPageIntlUrl")&&(t.defaultWebPageIntlUrl=n[10].toObject(e.defaultWebPageIntlUrl,r)),void 0!==e.numStartUpTips&&null!==e.numStartUpTips&&e.hasOwnProperty("numStartUpTips")&&(t.numStartUpTips=e.numStartUpTips),void 0!==e.startUpTipsUrl&&null!==e.startUpTipsUrl&&e.hasOwnProperty("startUpTipsUrl")&&(t.startUpTipsUrl=n[12].toObject(e.startUpTipsUrl,r)),void 0!==e.numProStartUpTips&&null!==e.numProStartUpTips&&e.hasOwnProperty("numProStartUpTips")&&(t.numProStartUpTips=e.numProStartUpTips),void 0!==e.proStartUpTipsUrl&&null!==e.proStartUpTipsUrl&&e.hasOwnProperty("proStartUpTipsUrl")&&(t.proStartUpTipsUrl=n[14].toObject(e.proStartUpTipsUrl,r)),void 0!==e.startupTipsIntlUrl&&null!==e.startupTipsIntlUrl&&e.hasOwnProperty("startupTipsIntlUrl")&&(t.startupTipsIntlUrl=n[15].toObject(e.startupTipsIntlUrl,r)),void 0!==e.userGuideIntlUrl&&null!==e.userGuideIntlUrl&&e.hasOwnProperty("userGuideIntlUrl")&&(t.userGuideIntlUrl=n[16].toObject(e.userGuideIntlUrl,r)),void 0!==e.supportCenterIntlUrl&&null!==e.supportCenterIntlUrl&&e.hasOwnProperty("supportCenterIntlUrl")&&(t.supportCenterIntlUrl=n[17].toObject(e.supportCenterIntlUrl,r)),void 0!==e.businessListingIntlUrl&&null!==e.businessListingIntlUrl&&e.hasOwnProperty("businessListingIntlUrl")&&(t.businessListingIntlUrl=n[18].toObject(e.businessListingIntlUrl,r)),void 0!==e.supportAnswerIntlUrl&&null!==e.supportAnswerIntlUrl&&e.hasOwnProperty("supportAnswerIntlUrl")&&(t.supportAnswerIntlUrl=n[19].toObject(e.supportAnswerIntlUrl,r)),void 0!==e.supportTopicIntlUrl&&null!==e.supportTopicIntlUrl&&e.hasOwnProperty("supportTopicIntlUrl")&&(t.supportTopicIntlUrl=n[20].toObject(e.supportTopicIntlUrl,r)),void 0!==e.supportRequestIntlUrl&&null!==e.supportRequestIntlUrl&&e.hasOwnProperty("supportRequestIntlUrl")&&(t.supportRequestIntlUrl=n[21].toObject(e.supportRequestIntlUrl,r)),void 0!==e.earthIntlUrl&&null!==e.earthIntlUrl&&e.hasOwnProperty("earthIntlUrl")&&(t.earthIntlUrl=n[22].toObject(e.earthIntlUrl,r)),void 0!==e.addContentUrl&&null!==e.addContentUrl&&e.hasOwnProperty("addContentUrl")&&(t.addContentUrl=n[23].toObject(e.addContentUrl,r)),void 0!==e.sketchupNotInstalledUrl&&null!==e.sketchupNotInstalledUrl&&e.hasOwnProperty("sketchupNotInstalledUrl")&&(t.sketchupNotInstalledUrl=n[24].toObject(e.sketchupNotInstalledUrl,r)),void 0!==e.sketchupErrorUrl&&null!==e.sketchupErrorUrl&&e.hasOwnProperty("sketchupErrorUrl")&&(t.sketchupErrorUrl=n[25].toObject(e.sketchupErrorUrl,r)),void 0!==e.freeLicenseUrl&&null!==e.freeLicenseUrl&&e.hasOwnProperty("freeLicenseUrl")&&(t.freeLicenseUrl=n[26].toObject(e.freeLicenseUrl,r)),void 0!==e.proLicenseUrl&&null!==e.proLicenseUrl&&e.hasOwnProperty("proLicenseUrl")&&(t.proLicenseUrl=n[27].toObject(e.proLicenseUrl,r)),void 0!==e.tutorialUrl&&null!==e.tutorialUrl&&e.hasOwnProperty("tutorialUrl")&&(t.tutorialUrl=n[28].toObject(e.tutorialUrl,r)),void 0!==e.keyboardShortcutsUrl&&null!==e.keyboardShortcutsUrl&&e.hasOwnProperty("keyboardShortcutsUrl")&&(t.keyboardShortcutsUrl=n[29].toObject(e.keyboardShortcutsUrl,r)),void 0!==e.releaseNotesUrl&&null!==e.releaseNotesUrl&&e.hasOwnProperty("releaseNotesUrl")&&(t.releaseNotesUrl=n[30].toObject(e.releaseNotesUrl,r)),void 0!==e.hideUserData&&null!==e.hideUserData&&e.hasOwnProperty("hideUserData")&&(t.hideUserData=e.hideUserData),void 0!==e.useGeLogo&&null!==e.useGeLogo&&e.hasOwnProperty("useGeLogo")&&(t.useGeLogo=e.useGeLogo),void 0!==e.dioramaDescriptionUrlBase&&null!==e.dioramaDescriptionUrlBase&&e.hasOwnProperty("dioramaDescriptionUrlBase")&&(t.dioramaDescriptionUrlBase=n[33].toObject(e.dioramaDescriptionUrlBase,r)),void 0!==e.dioramaDefaultColor&&null!==e.dioramaDefaultColor&&e.hasOwnProperty("dioramaDefaultColor")&&(t.dioramaDefaultColor=e.dioramaDefaultColor),void 0!==e.dioramaBlacklistUrl&&null!==e.dioramaBlacklistUrl&&e.hasOwnProperty("dioramaBlacklistUrl")&&(t.dioramaBlacklistUrl=n[35].toObject(e.dioramaBlacklistUrl,r)),void 0!==e.clientOptions&&null!==e.clientOptions&&e.hasOwnProperty("clientOptions")&&(t.clientOptions=n[36].toObject(e.clientOptions,r)),void 0!==e.fetchingOptions&&null!==e.fetchingOptions&&e.hasOwnProperty("fetchingOptions")&&(t.fetchingOptions=n[37].toObject(e.fetchingOptions,r)),void 0!==e.timeMachineOptions&&null!==e.timeMachineOptions&&e.hasOwnProperty("timeMachineOptions")&&(t.timeMachineOptions=n[38].toObject(e.timeMachineOptions,r)),void 0!==e.csiOptions&&null!==e.csiOptions&&e.hasOwnProperty("csiOptions")&&(t.csiOptions=n[39].toObject(e.csiOptions,r)),void 0!==e.searchTab&&null!==e.searchTab&&e.hasOwnProperty("searchTab"))for(t.searchTab=[],o=0;o<e.searchTab.length;++o)t.searchTab[o]=n[40].toObject(e.searchTab[o],r);if(void 0!==e.cobrandInfo&&null!==e.cobrandInfo&&e.hasOwnProperty("cobrandInfo"))for(t.cobrandInfo=[],o=0;o<e.cobrandInfo.length;++o)t.cobrandInfo[o]=n[41].toObject(e.cobrandInfo[o],r);if(void 0!==e.validDatabase&&null!==e.validDatabase&&e.hasOwnProperty("validDatabase"))for(t.validDatabase=[],o=0;o<e.validDatabase.length;++o)t.validDatabase[o]=n[42].toObject(e.validDatabase[o],r);if(void 0!==e.configScript&&null!==e.configScript&&e.hasOwnProperty("configScript"))for(t.configScript=[],o=0;o<e.configScript.length;++o)t.configScript[o]=n[43].toObject(e.configScript[o],r);if(void 0!==e.deauthServerUrl&&null!==e.deauthServerUrl&&e.hasOwnProperty("deauthServerUrl")&&(t.deauthServerUrl=n[44].toObject(e.deauthServerUrl,r)),void 0!==e.swoopParameters&&null!==e.swoopParameters&&e.hasOwnProperty("swoopParameters")&&(t.swoopParameters=n[45].toObject(e.swoopParameters,r)),void 0!==e.bbsServerInfo&&null!==e.bbsServerInfo&&e.hasOwnProperty("bbsServerInfo")&&(t.bbsServerInfo=n[46].toObject(e.bbsServerInfo,r)),void 0!==e.dataErrorServerInfo&&null!==e.dataErrorServerInfo&&e.hasOwnProperty("dataErrorServerInfo")&&(t.dataErrorServerInfo=n[47].toObject(e.dataErrorServerInfo,r)),void 0!==e.planetaryDatabase&&null!==e.planetaryDatabase&&e.hasOwnProperty("planetaryDatabase"))for(t.planetaryDatabase=[],o=0;o<e.planetaryDatabase.length;++o)t.planetaryDatabase[o]=n[48].toObject(e.planetaryDatabase[o],r);if(void 0!==e.logServer&&null!==e.logServer&&e.hasOwnProperty("logServer")&&(t.logServer=n[49].toObject(e.logServer,r)),void 0!==e.autopiaOptions&&null!==e.autopiaOptions&&e.hasOwnProperty("autopiaOptions")&&(t.autopiaOptions=n[50].toObject(e.autopiaOptions,r)),void 0!==e.searchConfig&&null!==e.searchConfig&&e.hasOwnProperty("searchConfig")&&(t.searchConfig=n[51].toObject(e.searchConfig,r)),void 0!==e.searchInfo&&null!==e.searchInfo&&e.hasOwnProperty("searchInfo")&&(t.searchInfo=n[52].toObject(e.searchInfo,r)),void 0!==e.elevationServiceBaseUrl&&null!==e.elevationServiceBaseUrl&&e.hasOwnProperty("elevationServiceBaseUrl")&&(t.elevationServiceBaseUrl=e.elevationServiceBaseUrl),void 0!==e.elevationProfileQueryDelay&&null!==e.elevationProfileQueryDelay&&e.hasOwnProperty("elevationProfileQueryDelay")&&(t.elevationProfileQueryDelay=e.elevationProfileQueryDelay),void 0!==e.proUpgradeUrl&&null!==e.proUpgradeUrl&&e.hasOwnProperty("proUpgradeUrl")&&(t.proUpgradeUrl=n[55].toObject(e.proUpgradeUrl,r)),void 0!==e.earthCommunityUrl&&null!==e.earthCommunityUrl&&e.hasOwnProperty("earthCommunityUrl")&&(t.earthCommunityUrl=n[56].toObject(e.earthCommunityUrl,r)),void 0!==e.googleMapsUrl&&null!==e.googleMapsUrl&&e.hasOwnProperty("googleMapsUrl")&&(t.googleMapsUrl=n[57].toObject(e.googleMapsUrl,r)),void 0!==e.sharingUrl&&null!==e.sharingUrl&&e.hasOwnProperty("sharingUrl")&&(t.sharingUrl=n[58].toObject(e.sharingUrl,r)),void 0!==e.privacyPolicyUrl&&null!==e.privacyPolicyUrl&&e.hasOwnProperty("privacyPolicyUrl")&&(t.privacyPolicyUrl=n[59].toObject(e.privacyPolicyUrl,r)),void 0!==e.doGplusUserCheck&&null!==e.doGplusUserCheck&&e.hasOwnProperty("doGplusUserCheck")&&(t.doGplusUserCheck=e.doGplusUserCheck),void 0!==e.rocktreeDataProto&&null!==e.rocktreeDataProto&&e.hasOwnProperty("rocktreeDataProto")&&(t.rocktreeDataProto=n[61].toObject(e.rocktreeDataProto,r)),void 0!==e.filmstripConfig&&null!==e.filmstripConfig&&e.hasOwnProperty("filmstripConfig"))for(t.filmstripConfig=[],o=0;o<e.filmstripConfig.length;++o)t.filmstripConfig[o]=n[62].toObject(e.filmstripConfig[o],r);return void 0!==e.showSigninButton&&null!==e.showSigninButton&&e.hasOwnProperty("showSigninButton")&&(t.showSigninButton=e.showSigninButton),void 0!==e.proMeasureUpsellUrl&&null!==e.proMeasureUpsellUrl&&e.hasOwnProperty("proMeasureUpsellUrl")&&(t.proMeasureUpsellUrl=n[64].toObject(e.proMeasureUpsellUrl,r)),void 0!==e.proPrintUpsellUrl&&null!==e.proPrintUpsellUrl&&e.hasOwnProperty("proPrintUpsellUrl")&&(t.proPrintUpsellUrl=n[65].toObject(e.proPrintUpsellUrl,r)),void 0!==e.starDataProto&&null!==e.starDataProto&&e.hasOwnProperty("starDataProto")&&(t.starDataProto=n[66].toObject(e.starDataProto,r)),void 0!==e.feedbackUrl&&null!==e.feedbackUrl&&e.hasOwnProperty("feedbackUrl")&&(t.feedbackUrl=n[67].toObject(e.feedbackUrl,r)),void 0!==e.oauth2LoginUrl&&null!==e.oauth2LoginUrl&&e.hasOwnProperty("oauth2LoginUrl")&&(t.oauth2LoginUrl=n[68].toObject(e.oauth2LoginUrl,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.SearchConfigProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.searchServer=s.emptyArray,e.prototype.oneboxService=s.emptyArray,e.prototype.kmlSearchUrl=null,e.prototype.kmlRenderUrl=null,e.prototype.searchHistoryUrl=null,e.prototype.errorPageUrl=null;var n={0:"keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer",1:"keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto",2:"keyhole.dbroot.StringIdOrValueProto",3:"keyhole.dbroot.StringIdOrValueProto",4:"keyhole.dbroot.StringIdOrValueProto",5:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.searchServer&&o.searchServer.length||(o.searchServer=[]),o.searchServer.push(n[0].decode(e,e.uint32()));break;case 2:o.oneboxService&&o.oneboxService.length||(o.oneboxService=[]),o.oneboxService.push(n[1].decode(e,e.uint32()));break;case 3:o.kmlSearchUrl=n[2].decode(e,e.uint32());break;case 4:o.kmlRenderUrl=n[3].decode(e,e.uint32());break;case 6:o.searchHistoryUrl=n[4].decode(e,e.uint32());break;case 5:o.errorPageUrl=n[5].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.searchServer){if(!Array.isArray(e.searchServer))return"searchServer: array expected";for(var r=0;r<e.searchServer.length;++r)if(t=n[0].verify(e.searchServer[r]))return"searchServer."+t}if(void 0!==e.oneboxService){if(!Array.isArray(e.oneboxService))return"oneboxService: array expected";for(r=0;r<e.oneboxService.length;++r)if(t=n[1].verify(e.oneboxService[r]))return"oneboxService."+t}var t;return void 0!==e.kmlSearchUrl&&null!==e.kmlSearchUrl&&(t=n[2].verify(e.kmlSearchUrl))?"kmlSearchUrl."+t:void 0!==e.kmlRenderUrl&&null!==e.kmlRenderUrl&&(t=n[3].verify(e.kmlRenderUrl))?"kmlRenderUrl."+t:void 0!==e.searchHistoryUrl&&null!==e.searchHistoryUrl&&(t=n[4].verify(e.searchHistoryUrl))?"searchHistoryUrl."+t:void 0!==e.errorPageUrl&&null!==e.errorPageUrl&&(t=n[5].verify(e.errorPageUrl))?"errorPageUrl."+t:null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.SearchConfigProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto;if(e.searchServer){if(!Array.isArray(e.searchServer))throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.searchServer: array expected");r.searchServer=[];for(var t=0;t<e.searchServer.length;++t){if("object"!=typeof e.searchServer[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.searchServer: object expected");r.searchServer[t]=n[0].fromObject(e.searchServer[t])}}if(e.oneboxService){if(!Array.isArray(e.oneboxService))throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.oneboxService: array expected");for(r.oneboxService=[],t=0;t<e.oneboxService.length;++t){if("object"!=typeof e.oneboxService[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.oneboxService: object expected");r.oneboxService[t]=n[1].fromObject(e.oneboxService[t])}}if(void 0!==e.kmlSearchUrl&&null!==e.kmlSearchUrl){if("object"!=typeof e.kmlSearchUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.kmlSearchUrl: object expected");r.kmlSearchUrl=n[2].fromObject(e.kmlSearchUrl)}if(void 0!==e.kmlRenderUrl&&null!==e.kmlRenderUrl){if("object"!=typeof e.kmlRenderUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.kmlRenderUrl: object expected");r.kmlRenderUrl=n[3].fromObject(e.kmlRenderUrl)}if(void 0!==e.searchHistoryUrl&&null!==e.searchHistoryUrl){if("object"!=typeof e.searchHistoryUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.searchHistoryUrl: object expected");r.searchHistoryUrl=n[4].fromObject(e.searchHistoryUrl)}if(void 0!==e.errorPageUrl&&null!==e.errorPageUrl){if("object"!=typeof e.errorPageUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.errorPageUrl: object expected");r.errorPageUrl=n[5].fromObject(e.errorPageUrl)}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.searchServer=[],t.oneboxService=[]),r.defaults&&(t.kmlSearchUrl=null,t.kmlRenderUrl=null,t.searchHistoryUrl=null,t.errorPageUrl=null),void 0!==e.searchServer&&null!==e.searchServer&&e.hasOwnProperty("searchServer")){t.searchServer=[];for(var o=0;o<e.searchServer.length;++o)t.searchServer[o]=n[0].toObject(e.searchServer[o],r)}if(void 0!==e.oneboxService&&null!==e.oneboxService&&e.hasOwnProperty("oneboxService"))for(t.oneboxService=[],o=0;o<e.oneboxService.length;++o)t.oneboxService[o]=n[1].toObject(e.oneboxService[o],r);return void 0!==e.kmlSearchUrl&&null!==e.kmlSearchUrl&&e.hasOwnProperty("kmlSearchUrl")&&(t.kmlSearchUrl=n[2].toObject(e.kmlSearchUrl,r)),void 0!==e.kmlRenderUrl&&null!==e.kmlRenderUrl&&e.hasOwnProperty("kmlRenderUrl")&&(t.kmlRenderUrl=n[3].toObject(e.kmlRenderUrl,r)),void 0!==e.searchHistoryUrl&&null!==e.searchHistoryUrl&&e.hasOwnProperty("searchHistoryUrl")&&(t.searchHistoryUrl=n[4].toObject(e.searchHistoryUrl,r)),void 0!==e.errorPageUrl&&null!==e.errorPageUrl&&e.hasOwnProperty("errorPageUrl")&&(t.errorPageUrl=n[5].toObject(e.errorPageUrl,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.SearchServer=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.name=null,e.prototype.url=null,e.prototype.type=0,e.prototype.htmlTransformUrl=null,e.prototype.kmlTransformUrl=null,e.prototype.supplementalUi=null,e.prototype.suggestion=s.emptyArray,e.prototype.searchlet=s.emptyArray,e.prototype.requirements=null,e.prototype.suggestServer=null;var r,n={0:"keyhole.dbroot.StringIdOrValueProto",1:"keyhole.dbroot.StringIdOrValueProto",2:"keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.ResultType",3:"keyhole.dbroot.StringIdOrValueProto",4:"keyhole.dbroot.StringIdOrValueProto",5:"keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi",6:"keyhole.dbroot.StringIdOrValueProto",7:"keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto",8:"keyhole.dbroot.RequirementProto",9:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.name=n[0].decode(e,e.uint32());break;case 2:o.url=n[1].decode(e,e.uint32());break;case 3:o.type=e.uint32();break;case 4:o.htmlTransformUrl=n[3].decode(e,e.uint32());break;case 5:o.kmlTransformUrl=n[4].decode(e,e.uint32());break;case 6:o.supplementalUi=n[5].decode(e,e.uint32());break;case 9:o.suggestion&&o.suggestion.length||(o.suggestion=[]),o.suggestion.push(n[6].decode(e,e.uint32()));break;case 7:o.searchlet&&o.searchlet.length||(o.searchlet=[]),o.searchlet.push(n[7].decode(e,e.uint32()));break;case 8:o.requirements=n[8].decode(e,e.uint32());break;case 10:o.suggestServer=n[9].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.name&&null!==e.name&&(t=n[0].verify(e.name)))return"name."+t;if(void 0!==e.url&&null!==e.url&&(t=n[1].verify(e.url)))return"url."+t;if(void 0!==e.type)switch(e.type){default:return"type: enum value expected";case 0:case 1:}if(void 0!==e.htmlTransformUrl&&null!==e.htmlTransformUrl&&(t=n[3].verify(e.htmlTransformUrl)))return"htmlTransformUrl."+t;if(void 0!==e.kmlTransformUrl&&null!==e.kmlTransformUrl&&(t=n[4].verify(e.kmlTransformUrl)))return"kmlTransformUrl."+t;if(void 0!==e.supplementalUi&&null!==e.supplementalUi&&(t=n[5].verify(e.supplementalUi)))return"supplementalUi."+t;if(void 0!==e.suggestion){if(!Array.isArray(e.suggestion))return"suggestion: array expected";for(var r=0;r<e.suggestion.length;++r)if(t=n[6].verify(e.suggestion[r]))return"suggestion."+t}if(void 0!==e.searchlet){if(!Array.isArray(e.searchlet))return"searchlet: array expected";for(var t,r=0;r<e.searchlet.length;++r)if(t=n[7].verify(e.searchlet[r]))return"searchlet."+t}return void 0!==e.requirements&&null!==e.requirements&&(t=n[8].verify(e.requirements))?"requirements."+t:void 0!==e.suggestServer&&null!==e.suggestServer&&(t=n[9].verify(e.suggestServer))?"suggestServer."+t:null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer)return e;var r=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer;if(void 0!==e.name&&null!==e.name){if("object"!=typeof e.name)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.name: object expected");r.name=n[0].fromObject(e.name)}if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.url: object expected");r.url=n[1].fromObject(e.url)}switch(e.type){case"RESULT_TYPE_KML":case 0:r.type=0;break;case"RESULT_TYPE_XML":case 1:r.type=1}if(void 0!==e.htmlTransformUrl&&null!==e.htmlTransformUrl){if("object"!=typeof e.htmlTransformUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.htmlTransformUrl: object expected");r.htmlTransformUrl=n[3].fromObject(e.htmlTransformUrl)}if(void 0!==e.kmlTransformUrl&&null!==e.kmlTransformUrl){if("object"!=typeof e.kmlTransformUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.kmlTransformUrl: object expected");r.kmlTransformUrl=n[4].fromObject(e.kmlTransformUrl)}if(void 0!==e.supplementalUi&&null!==e.supplementalUi){if("object"!=typeof e.supplementalUi)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.supplementalUi: object expected");r.supplementalUi=n[5].fromObject(e.supplementalUi)}if(e.suggestion){if(!Array.isArray(e.suggestion))throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.suggestion: array expected");r.suggestion=[];for(var t=0;t<e.suggestion.length;++t){if("object"!=typeof e.suggestion[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.suggestion: object expected");r.suggestion[t]=n[6].fromObject(e.suggestion[t])}}if(e.searchlet){if(!Array.isArray(e.searchlet))throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.searchlet: array expected");for(r.searchlet=[],t=0;t<e.searchlet.length;++t){if("object"!=typeof e.searchlet[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.searchlet: object expected");r.searchlet[t]=n[7].fromObject(e.searchlet[t])}}if(void 0!==e.requirements&&null!==e.requirements){if("object"!=typeof e.requirements)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.requirements: object expected");r.requirements=n[8].fromObject(e.requirements)}if(void 0!==e.suggestServer&&null!==e.suggestServer){if("object"!=typeof e.suggestServer)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.suggestServer: object expected");r.suggestServer=n[9].fromObject(e.suggestServer)}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.suggestion=[],t.searchlet=[]),r.defaults&&(t.name=null,t.url=null,t.type=r.enums===String?"RESULT_TYPE_KML":0,t.htmlTransformUrl=null,t.kmlTransformUrl=null,t.supplementalUi=null,t.requirements=null,t.suggestServer=null),void 0!==e.name&&null!==e.name&&e.hasOwnProperty("name")&&(t.name=n[0].toObject(e.name,r)),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[1].toObject(e.url,r)),void 0!==e.type&&null!==e.type&&e.hasOwnProperty("type")&&(t.type=r.enums===String?n[2][e.type]:e.type),void 0!==e.htmlTransformUrl&&null!==e.htmlTransformUrl&&e.hasOwnProperty("htmlTransformUrl")&&(t.htmlTransformUrl=n[3].toObject(e.htmlTransformUrl,r)),void 0!==e.kmlTransformUrl&&null!==e.kmlTransformUrl&&e.hasOwnProperty("kmlTransformUrl")&&(t.kmlTransformUrl=n[4].toObject(e.kmlTransformUrl,r)),void 0!==e.supplementalUi&&null!==e.supplementalUi&&e.hasOwnProperty("supplementalUi")&&(t.supplementalUi=n[5].toObject(e.supplementalUi,r)),void 0!==e.suggestion&&null!==e.suggestion&&e.hasOwnProperty("suggestion")){t.suggestion=[];for(var o=0;o<e.suggestion.length;++o)t.suggestion[o]=n[6].toObject(e.suggestion[o],r)}if(void 0!==e.searchlet&&null!==e.searchlet&&e.hasOwnProperty("searchlet"))for(t.searchlet=[],o=0;o<e.searchlet.length;++o)t.searchlet[o]=n[7].toObject(e.searchlet[o],r);return void 0!==e.requirements&&null!==e.requirements&&e.hasOwnProperty("requirements")&&(t.requirements=n[8].toObject(e.requirements,r)),void 0!==e.suggestServer&&null!==e.suggestServer&&e.hasOwnProperty("suggestServer")&&(t.suggestServer=n[9].toObject(e.suggestServer,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.ResultType=((r=Object.create({})).RESULT_TYPE_KML=0,r.RESULT_TYPE_XML=1,r),e.SupplementalUi=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url=null,e.prototype.label=null,e.prototype.height=160;var n={0:"keyhole.dbroot.StringIdOrValueProto",1:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.url=n[0].decode(e,e.uint32());break;case 2:o.label=n[1].decode(e,e.uint32());break;case 3:o.height=e.int32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.url&&null!==e.url&&(r=n[0].verify(e.url))?"url."+r:void 0!==e.label&&null!==e.label&&(r=n[1].verify(e.label))?"label."+r:void 0===e.height||s.isInteger(e.height)?null:"height: integer expected";var r},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi)return e;var r=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi;if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.url: object expected");r.url=n[0].fromObject(e.url)}if(void 0!==e.label&&null!==e.label){if("object"!=typeof e.label)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SupplementalUi.label: object expected");r.label=n[1].fromObject(e.label)}return void 0!==e.height&&null!==e.height&&(r.height=0|e.height),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url=null,t.label=null,t.height=160),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[0].toObject(e.url,r)),void 0!==e.label&&null!==e.label&&e.hasOwnProperty("label")&&(t.label=n[1].toObject(e.label,r)),void 0!==e.height&&null!==e.height&&e.hasOwnProperty("height")&&(t.height=e.height),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.SearchletProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url=null,e.prototype.name=null,e.prototype.requirements=null;var n={0:"keyhole.dbroot.StringIdOrValueProto",1:"keyhole.dbroot.StringIdOrValueProto",2:"keyhole.dbroot.RequirementProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.url=n[0].decode(e,e.uint32());break;case 2:o.name=n[1].decode(e,e.uint32());break;case 3:o.requirements=n[2].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.url&&null!==e.url&&(r=n[0].verify(e.url))?"url."+r:void 0!==e.name&&null!==e.name&&(r=n[1].verify(e.name))?"name."+r:void 0!==e.requirements&&null!==e.requirements&&(r=n[2].verify(e.requirements))?"requirements."+r:null;var r},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto;if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.url: object expected");r.url=n[0].fromObject(e.url)}if(void 0!==e.name&&null!==e.name){if("object"!=typeof e.name)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.name: object expected");r.name=n[1].fromObject(e.name)}if(void 0!==e.requirements&&null!==e.requirements){if("object"!=typeof e.requirements)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.SearchServer.SearchletProto.requirements: object expected");r.requirements=n[2].fromObject(e.requirements)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url=null,t.name=null,t.requirements=null),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[0].toObject(e.url,r)),void 0!==e.name&&null!==e.name&&e.hasOwnProperty("name")&&(t.name=n[1].toObject(e.name,r)),void 0!==e.requirements&&null!==e.requirements&&e.hasOwnProperty("requirements")&&(t.requirements=n[2].toObject(e.requirements,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e}(),e.OneboxServiceProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.serviceUrl=null,e.prototype.requirements=null;var n={0:"keyhole.dbroot.StringIdOrValueProto",1:"keyhole.dbroot.RequirementProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.serviceUrl=n[0].decode(e,e.uint32());break;case 2:o.requirements=n[1].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0!==e.serviceUrl&&null!==e.serviceUrl&&(r=n[0].verify(e.serviceUrl))?"serviceUrl."+r:void 0!==e.requirements&&null!==e.requirements&&(r=n[1].verify(e.requirements))?"requirements."+r:null;var r},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto;if(void 0!==e.serviceUrl&&null!==e.serviceUrl){if("object"!=typeof e.serviceUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.serviceUrl: object expected");r.serviceUrl=n[0].fromObject(e.serviceUrl)}if(void 0!==e.requirements&&null!==e.requirements){if("object"!=typeof e.requirements)throw TypeError(".keyhole.dbroot.EndSnippetProto.SearchConfigProto.OneboxServiceProto.requirements: object expected");r.requirements=n[1].fromObject(e.requirements)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.serviceUrl=null,t.requirements=null),void 0!==e.serviceUrl&&null!==e.serviceUrl&&e.hasOwnProperty("serviceUrl")&&(t.serviceUrl=n[0].toObject(e.serviceUrl,r)),void 0!==e.requirements&&null!==e.requirements&&e.hasOwnProperty("requirements")&&(t.requirements=n[1].toObject(e.requirements,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e}(),e.SearchInfoProto=(r.prototype.defaultUrl="http://maps.google.com/maps",r.prototype.geocodeParam="q",r.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.SearchInfoProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.defaultUrl=e.string();break;case 2:o.geocodeParam=e.string();break;default:e.skipType(7&a)}}return o},r.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.defaultUrl||s.isString(e.defaultUrl)?void 0===e.geocodeParam||s.isString(e.geocodeParam)?null:"geocodeParam: string expected":"defaultUrl: string expected"},r.from=r.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.SearchInfoProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.SearchInfoProto;return void 0!==e.defaultUrl&&null!==e.defaultUrl&&(r.defaultUrl=String(e.defaultUrl)),void 0!==e.geocodeParam&&null!==e.geocodeParam&&(r.geocodeParam=String(e.geocodeParam)),r},r.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.defaultUrl="http://maps.google.com/maps",t.geocodeParam="q"),void 0!==e.defaultUrl&&null!==e.defaultUrl&&e.hasOwnProperty("defaultUrl")&&(t.defaultUrl=e.defaultUrl),void 0!==e.geocodeParam&&null!==e.geocodeParam&&e.hasOwnProperty("geocodeParam")&&(t.geocodeParam=e.geocodeParam),t},r.prototype.toObject=function(e){return this.constructor.toObject(this,e)},r.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},r),e.RockTreeDataProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url=null;var n={0:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.RockTreeDataProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.url=n[0].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.url&&null!==e.url){var r=n[0].verify(e.url);if(r)return"url."+r}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.RockTreeDataProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.RockTreeDataProto;if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.EndSnippetProto.RockTreeDataProto.url: object expected");r.url=n[0].fromObject(e.url)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url=null),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[0].toObject(e.url,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.FilmstripConfigProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.requirements=null,e.prototype.alleycatUrlTemplate=null,e.prototype.fallbackAlleycatUrlTemplate=null,e.prototype.metadataUrlTemplate=null,e.prototype.thumbnailUrlTemplate=null,e.prototype.kmlUrlTemplate=null,e.prototype.featuredToursUrl=null,e.prototype.enableViewportFallback=!1,e.prototype.viewportFallbackDistance=0,e.prototype.imageryType=s.emptyArray;var n={0:"keyhole.dbroot.RequirementProto",1:"keyhole.dbroot.StringIdOrValueProto",2:"keyhole.dbroot.StringIdOrValueProto",3:"keyhole.dbroot.StringIdOrValueProto",4:"keyhole.dbroot.StringIdOrValueProto",5:"keyhole.dbroot.StringIdOrValueProto",6:"keyhole.dbroot.StringIdOrValueProto",9:"keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.requirements=n[0].decode(e,e.uint32());break;case 2:o.alleycatUrlTemplate=n[1].decode(e,e.uint32());break;case 9:o.fallbackAlleycatUrlTemplate=n[2].decode(e,e.uint32());break;case 3:o.metadataUrlTemplate=n[3].decode(e,e.uint32());break;case 4:o.thumbnailUrlTemplate=n[4].decode(e,e.uint32());break;case 5:o.kmlUrlTemplate=n[5].decode(e,e.uint32());break;case 6:o.featuredToursUrl=n[6].decode(e,e.uint32());break;case 7:o.enableViewportFallback=e.bool();break;case 8:o.viewportFallbackDistance=e.uint32();break;case 10:o.imageryType&&o.imageryType.length||(o.imageryType=[]),o.imageryType.push(n[9].decode(e,e.uint32()));break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.requirements&&null!==e.requirements&&(r=n[0].verify(e.requirements)))return"requirements."+r;if(void 0!==e.alleycatUrlTemplate&&null!==e.alleycatUrlTemplate&&(r=n[1].verify(e.alleycatUrlTemplate)))return"alleycatUrlTemplate."+r;if(void 0!==e.fallbackAlleycatUrlTemplate&&null!==e.fallbackAlleycatUrlTemplate&&(r=n[2].verify(e.fallbackAlleycatUrlTemplate)))return"fallbackAlleycatUrlTemplate."+r;if(void 0!==e.metadataUrlTemplate&&null!==e.metadataUrlTemplate&&(r=n[3].verify(e.metadataUrlTemplate)))return"metadataUrlTemplate."+r;if(void 0!==e.thumbnailUrlTemplate&&null!==e.thumbnailUrlTemplate&&(r=n[4].verify(e.thumbnailUrlTemplate)))return"thumbnailUrlTemplate."+r;if(void 0!==e.kmlUrlTemplate&&null!==e.kmlUrlTemplate&&(r=n[5].verify(e.kmlUrlTemplate)))return"kmlUrlTemplate."+r;if(void 0!==e.featuredToursUrl&&null!==e.featuredToursUrl&&(r=n[6].verify(e.featuredToursUrl)))return"featuredToursUrl."+r;if(void 0!==e.enableViewportFallback&&"boolean"!=typeof e.enableViewportFallback)return"enableViewportFallback: boolean expected";if(void 0!==e.viewportFallbackDistance&&!s.isInteger(e.viewportFallbackDistance))return"viewportFallbackDistance: integer expected";if(void 0!==e.imageryType){if(!Array.isArray(e.imageryType))return"imageryType: array expected";for(var r,t=0;t<e.imageryType.length;++t)if(r=n[9].verify(e.imageryType[t]))return"imageryType."+r}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto;if(void 0!==e.requirements&&null!==e.requirements){if("object"!=typeof e.requirements)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.requirements: object expected");r.requirements=n[0].fromObject(e.requirements)}if(void 0!==e.alleycatUrlTemplate&&null!==e.alleycatUrlTemplate){if("object"!=typeof e.alleycatUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.alleycatUrlTemplate: object expected");r.alleycatUrlTemplate=n[1].fromObject(e.alleycatUrlTemplate)}if(void 0!==e.fallbackAlleycatUrlTemplate&&null!==e.fallbackAlleycatUrlTemplate){if("object"!=typeof e.fallbackAlleycatUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.fallbackAlleycatUrlTemplate: object expected");r.fallbackAlleycatUrlTemplate=n[2].fromObject(e.fallbackAlleycatUrlTemplate)}if(void 0!==e.metadataUrlTemplate&&null!==e.metadataUrlTemplate){if("object"!=typeof e.metadataUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.metadataUrlTemplate: object expected");r.metadataUrlTemplate=n[3].fromObject(e.metadataUrlTemplate)}if(void 0!==e.thumbnailUrlTemplate&&null!==e.thumbnailUrlTemplate){if("object"!=typeof e.thumbnailUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.thumbnailUrlTemplate: object expected");r.thumbnailUrlTemplate=n[4].fromObject(e.thumbnailUrlTemplate)}if(void 0!==e.kmlUrlTemplate&&null!==e.kmlUrlTemplate){if("object"!=typeof e.kmlUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.kmlUrlTemplate: object expected");r.kmlUrlTemplate=n[5].fromObject(e.kmlUrlTemplate)}if(void 0!==e.featuredToursUrl&&null!==e.featuredToursUrl){if("object"!=typeof e.featuredToursUrl)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.featuredToursUrl: object expected");r.featuredToursUrl=n[6].fromObject(e.featuredToursUrl)}if(void 0!==e.enableViewportFallback&&null!==e.enableViewportFallback&&(r.enableViewportFallback=Boolean(e.enableViewportFallback)),void 0!==e.viewportFallbackDistance&&null!==e.viewportFallbackDistance&&(r.viewportFallbackDistance=e.viewportFallbackDistance>>>0),e.imageryType){if(!Array.isArray(e.imageryType))throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.imageryType: array expected");r.imageryType=[];for(var t=0;t<e.imageryType.length;++t){if("object"!=typeof e.imageryType[t])throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.imageryType: object expected");r.imageryType[t]=n[9].fromObject(e.imageryType[t])}}return r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.imageryType=[]),r.defaults&&(t.requirements=null,t.alleycatUrlTemplate=null,t.fallbackAlleycatUrlTemplate=null,t.metadataUrlTemplate=null,t.thumbnailUrlTemplate=null,t.kmlUrlTemplate=null,t.featuredToursUrl=null,t.enableViewportFallback=!1,t.viewportFallbackDistance=0),void 0!==e.requirements&&null!==e.requirements&&e.hasOwnProperty("requirements")&&(t.requirements=n[0].toObject(e.requirements,r)),void 0!==e.alleycatUrlTemplate&&null!==e.alleycatUrlTemplate&&e.hasOwnProperty("alleycatUrlTemplate")&&(t.alleycatUrlTemplate=n[1].toObject(e.alleycatUrlTemplate,r)),void 0!==e.fallbackAlleycatUrlTemplate&&null!==e.fallbackAlleycatUrlTemplate&&e.hasOwnProperty("fallbackAlleycatUrlTemplate")&&(t.fallbackAlleycatUrlTemplate=n[2].toObject(e.fallbackAlleycatUrlTemplate,r)),void 0!==e.metadataUrlTemplate&&null!==e.metadataUrlTemplate&&e.hasOwnProperty("metadataUrlTemplate")&&(t.metadataUrlTemplate=n[3].toObject(e.metadataUrlTemplate,r)),void 0!==e.thumbnailUrlTemplate&&null!==e.thumbnailUrlTemplate&&e.hasOwnProperty("thumbnailUrlTemplate")&&(t.thumbnailUrlTemplate=n[4].toObject(e.thumbnailUrlTemplate,r)),void 0!==e.kmlUrlTemplate&&null!==e.kmlUrlTemplate&&e.hasOwnProperty("kmlUrlTemplate")&&(t.kmlUrlTemplate=n[5].toObject(e.kmlUrlTemplate,r)),void 0!==e.featuredToursUrl&&null!==e.featuredToursUrl&&e.hasOwnProperty("featuredToursUrl")&&(t.featuredToursUrl=n[6].toObject(e.featuredToursUrl,r)),void 0!==e.enableViewportFallback&&null!==e.enableViewportFallback&&e.hasOwnProperty("enableViewportFallback")&&(t.enableViewportFallback=e.enableViewportFallback),void 0!==e.viewportFallbackDistance&&null!==e.viewportFallbackDistance&&e.hasOwnProperty("viewportFallbackDistance")&&(t.viewportFallbackDistance=e.viewportFallbackDistance),void 0!==e.imageryType&&null!==e.imageryType&&e.hasOwnProperty("imageryType")){t.imageryType=[];for(var o=0;o<e.imageryType.length;++o)t.imageryType[o]=n[9].toObject(e.imageryType[o],r)}return t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.AlleycatImageryTypeProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.imageryTypeId=0,e.prototype.imageryTypeLabel="",e.prototype.metadataUrlTemplate=null,e.prototype.thumbnailUrlTemplate=null,e.prototype.kmlUrlTemplate=null;var n={2:"keyhole.dbroot.StringIdOrValueProto",3:"keyhole.dbroot.StringIdOrValueProto",4:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.imageryTypeId=e.int32();break;case 2:o.imageryTypeLabel=e.string();break;case 3:o.metadataUrlTemplate=n[2].decode(e,e.uint32());break;case 4:o.thumbnailUrlTemplate=n[3].decode(e,e.uint32());break;case 5:o.kmlUrlTemplate=n[4].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){return"object"!=typeof e||null===e?"object expected":void 0===e.imageryTypeId||s.isInteger(e.imageryTypeId)?void 0===e.imageryTypeLabel||s.isString(e.imageryTypeLabel)?void 0!==e.metadataUrlTemplate&&null!==e.metadataUrlTemplate&&(r=n[2].verify(e.metadataUrlTemplate))?"metadataUrlTemplate."+r:void 0!==e.thumbnailUrlTemplate&&null!==e.thumbnailUrlTemplate&&(r=n[3].verify(e.thumbnailUrlTemplate))?"thumbnailUrlTemplate."+r:void 0!==e.kmlUrlTemplate&&null!==e.kmlUrlTemplate&&(r=n[4].verify(e.kmlUrlTemplate))?"kmlUrlTemplate."+r:null:"imageryTypeLabel: string expected":"imageryTypeId: integer expected";var r},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto;if(void 0!==e.imageryTypeId&&null!==e.imageryTypeId&&(r.imageryTypeId=0|e.imageryTypeId),void 0!==e.imageryTypeLabel&&null!==e.imageryTypeLabel&&(r.imageryTypeLabel=String(e.imageryTypeLabel)),void 0!==e.metadataUrlTemplate&&null!==e.metadataUrlTemplate){if("object"!=typeof e.metadataUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.metadataUrlTemplate: object expected");r.metadataUrlTemplate=n[2].fromObject(e.metadataUrlTemplate)}if(void 0!==e.thumbnailUrlTemplate&&null!==e.thumbnailUrlTemplate){if("object"!=typeof e.thumbnailUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.thumbnailUrlTemplate: object expected");r.thumbnailUrlTemplate=n[3].fromObject(e.thumbnailUrlTemplate)}if(void 0!==e.kmlUrlTemplate&&null!==e.kmlUrlTemplate){if("object"!=typeof e.kmlUrlTemplate)throw TypeError(".keyhole.dbroot.EndSnippetProto.FilmstripConfigProto.AlleycatImageryTypeProto.kmlUrlTemplate: object expected");r.kmlUrlTemplate=n[4].fromObject(e.kmlUrlTemplate)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.imageryTypeId=0,t.imageryTypeLabel="",t.metadataUrlTemplate=null,t.thumbnailUrlTemplate=null,t.kmlUrlTemplate=null),void 0!==e.imageryTypeId&&null!==e.imageryTypeId&&e.hasOwnProperty("imageryTypeId")&&(t.imageryTypeId=e.imageryTypeId),void 0!==e.imageryTypeLabel&&null!==e.imageryTypeLabel&&e.hasOwnProperty("imageryTypeLabel")&&(t.imageryTypeLabel=e.imageryTypeLabel),void 0!==e.metadataUrlTemplate&&null!==e.metadataUrlTemplate&&e.hasOwnProperty("metadataUrlTemplate")&&(t.metadataUrlTemplate=n[2].toObject(e.metadataUrlTemplate,r)),void 0!==e.thumbnailUrlTemplate&&null!==e.thumbnailUrlTemplate&&e.hasOwnProperty("thumbnailUrlTemplate")&&(t.thumbnailUrlTemplate=n[3].toObject(e.thumbnailUrlTemplate,r)),void 0!==e.kmlUrlTemplate&&null!==e.kmlUrlTemplate&&e.hasOwnProperty("kmlUrlTemplate")&&(t.kmlUrlTemplate=n[4].toObject(e.kmlUrlTemplate,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e}(),e.StarDataProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url=null;var n={0:"keyhole.dbroot.StringIdOrValueProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EndSnippetProto.StarDataProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.url=n[0].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.url&&null!==e.url){var r=n[0].verify(e.url);if(r)return"url."+r}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EndSnippetProto.StarDataProto)return e;var r=new c.keyhole.dbroot.EndSnippetProto.StarDataProto;if(void 0!==e.url&&null!==e.url){if("object"!=typeof e.url)throw TypeError(".keyhole.dbroot.EndSnippetProto.StarDataProto.url: object expected");r.url=n[0].fromObject(e.url)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url=null),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=n[0].toObject(e.url,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e}(),e.DbRootRefProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.url="",e.prototype.isCritical=!1,e.prototype.requirements=null;var n={2:"keyhole.dbroot.RequirementProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.DbRootRefProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 2:o.url=e.string();break;case 1:o.isCritical=e.bool();break;case 3:o.requirements=n[2].decode(e,e.uint32());break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(!s.isString(e.url))return"url: string expected";if(void 0!==e.isCritical&&"boolean"!=typeof e.isCritical)return"isCritical: boolean expected";if(void 0!==e.requirements&&null!==e.requirements){var r=n[2].verify(e.requirements);if(r)return"requirements."+r}return null},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.DbRootRefProto)return e;var r=new c.keyhole.dbroot.DbRootRefProto;if(void 0!==e.url&&null!==e.url&&(r.url=String(e.url)),void 0!==e.isCritical&&null!==e.isCritical&&(r.isCritical=Boolean(e.isCritical)),void 0!==e.requirements&&null!==e.requirements){if("object"!=typeof e.requirements)throw TypeError(".keyhole.dbroot.DbRootRefProto.requirements: object expected");r.requirements=n[2].fromObject(e.requirements)}return r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.url="",t.isCritical=!1,t.requirements=null),void 0!==e.url&&null!==e.url&&e.hasOwnProperty("url")&&(t.url=e.url),void 0!==e.isCritical&&null!==e.isCritical&&e.hasOwnProperty("isCritical")&&(t.isCritical=e.isCritical),void 0!==e.requirements&&null!==e.requirements&&e.hasOwnProperty("requirements")&&(t.requirements=n[2].toObject(e.requirements,r)),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.DatabaseVersionProto=(O.prototype.quadtreeVersion=0,O.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.DatabaseVersionProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.quadtreeVersion=e.uint32();break;default:e.skipType(7&a)}}return o},O.verify=function(e){return"object"!=typeof e||null===e?"object expected":s.isInteger(e.quadtreeVersion)?null:"quadtreeVersion: integer expected"},O.from=O.fromObject=function(e){if(e instanceof c.keyhole.dbroot.DatabaseVersionProto)return e;var r=new c.keyhole.dbroot.DatabaseVersionProto;return void 0!==e.quadtreeVersion&&null!==e.quadtreeVersion&&(r.quadtreeVersion=e.quadtreeVersion>>>0),r},O.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.quadtreeVersion=0),void 0!==e.quadtreeVersion&&null!==e.quadtreeVersion&&e.hasOwnProperty("quadtreeVersion")&&(t.quadtreeVersion=e.quadtreeVersion),t},O.prototype.toObject=function(e){return this.constructor.toObject(this,e)},O.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},O),e.DbRootProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.databaseName=null,e.prototype.imageryPresent=!0,e.prototype.protoImagery=!1,e.prototype.terrainPresent=!1,e.prototype.providerInfo=s.emptyArray,e.prototype.nestedFeature=s.emptyArray,e.prototype.styleAttribute=s.emptyArray,e.prototype.styleMap=s.emptyArray,e.prototype.endSnippet=null,e.prototype.translationEntry=s.emptyArray,e.prototype.language="en",e.prototype.version=5,e.prototype.dbrootReference=s.emptyArray,e.prototype.databaseVersion=null,e.prototype.refreshTimeout=0;var n={0:"keyhole.dbroot.StringIdOrValueProto",4:"keyhole.dbroot.ProviderInfoProto",5:"keyhole.dbroot.NestedFeatureProto",6:"keyhole.dbroot.StyleAttributeProto",7:"keyhole.dbroot.StyleMapProto",8:"keyhole.dbroot.EndSnippetProto",9:"keyhole.dbroot.StringEntryProto",12:"keyhole.dbroot.DbRootRefProto",13:"keyhole.dbroot.DatabaseVersionProto"};return p.push(n),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.DbRootProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 15:o.databaseName=n[0].decode(e,e.uint32());break;case 1:o.imageryPresent=e.bool();break;case 14:o.protoImagery=e.bool();break;case 2:o.terrainPresent=e.bool();break;case 3:o.providerInfo&&o.providerInfo.length||(o.providerInfo=[]),o.providerInfo.push(n[4].decode(e,e.uint32()));break;case 4:o.nestedFeature&&o.nestedFeature.length||(o.nestedFeature=[]),o.nestedFeature.push(n[5].decode(e,e.uint32()));break;case 5:o.styleAttribute&&o.styleAttribute.length||(o.styleAttribute=[]),o.styleAttribute.push(n[6].decode(e,e.uint32()));break;case 6:o.styleMap&&o.styleMap.length||(o.styleMap=[]),o.styleMap.push(n[7].decode(e,e.uint32()));break;case 7:o.endSnippet=n[8].decode(e,e.uint32());break;case 8:o.translationEntry&&o.translationEntry.length||(o.translationEntry=[]),o.translationEntry.push(n[9].decode(e,e.uint32()));break;case 9:o.language=e.string();break;case 10:o.version=e.int32();break;case 11:o.dbrootReference&&o.dbrootReference.length||(o.dbrootReference=[]),o.dbrootReference.push(n[12].decode(e,e.uint32()));break;case 13:o.databaseVersion=n[13].decode(e,e.uint32());break;case 16:o.refreshTimeout=e.int32();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.databaseName&&null!==e.databaseName&&(t=n[0].verify(e.databaseName)))return"databaseName."+t;if(void 0!==e.imageryPresent&&"boolean"!=typeof e.imageryPresent)return"imageryPresent: boolean expected";if(void 0!==e.protoImagery&&"boolean"!=typeof e.protoImagery)return"protoImagery: boolean expected";if(void 0!==e.terrainPresent&&"boolean"!=typeof e.terrainPresent)return"terrainPresent: boolean expected";if(void 0!==e.providerInfo){if(!Array.isArray(e.providerInfo))return"providerInfo: array expected";for(var r=0;r<e.providerInfo.length;++r)if(t=n[4].verify(e.providerInfo[r]))return"providerInfo."+t}if(void 0!==e.nestedFeature){if(!Array.isArray(e.nestedFeature))return"nestedFeature: array expected";for(r=0;r<e.nestedFeature.length;++r)if(t=n[5].verify(e.nestedFeature[r]))return"nestedFeature."+t}if(void 0!==e.styleAttribute){if(!Array.isArray(e.styleAttribute))return"styleAttribute: array expected";for(r=0;r<e.styleAttribute.length;++r)if(t=n[6].verify(e.styleAttribute[r]))return"styleAttribute."+t}if(void 0!==e.styleMap){if(!Array.isArray(e.styleMap))return"styleMap: array expected";for(r=0;r<e.styleMap.length;++r)if(t=n[7].verify(e.styleMap[r]))return"styleMap."+t}if(void 0!==e.endSnippet&&null!==e.endSnippet&&(t=n[8].verify(e.endSnippet)))return"endSnippet."+t;if(void 0!==e.translationEntry){if(!Array.isArray(e.translationEntry))return"translationEntry: array expected";for(r=0;r<e.translationEntry.length;++r)if(t=n[9].verify(e.translationEntry[r]))return"translationEntry."+t}if(void 0!==e.language&&!s.isString(e.language))return"language: string expected";if(void 0!==e.version&&!s.isInteger(e.version))return"version: integer expected";if(void 0!==e.dbrootReference){if(!Array.isArray(e.dbrootReference))return"dbrootReference: array expected";for(var t,r=0;r<e.dbrootReference.length;++r)if(t=n[12].verify(e.dbrootReference[r]))return"dbrootReference."+t}return void 0!==e.databaseVersion&&null!==e.databaseVersion&&(t=n[13].verify(e.databaseVersion))?"databaseVersion."+t:void 0===e.refreshTimeout||s.isInteger(e.refreshTimeout)?null:"refreshTimeout: integer expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.DbRootProto)return e;var r=new c.keyhole.dbroot.DbRootProto;if(void 0!==e.databaseName&&null!==e.databaseName){if("object"!=typeof e.databaseName)throw TypeError(".keyhole.dbroot.DbRootProto.databaseName: object expected");r.databaseName=n[0].fromObject(e.databaseName)}if(void 0!==e.imageryPresent&&null!==e.imageryPresent&&(r.imageryPresent=Boolean(e.imageryPresent)),void 0!==e.protoImagery&&null!==e.protoImagery&&(r.protoImagery=Boolean(e.protoImagery)),void 0!==e.terrainPresent&&null!==e.terrainPresent&&(r.terrainPresent=Boolean(e.terrainPresent)),e.providerInfo){if(!Array.isArray(e.providerInfo))throw TypeError(".keyhole.dbroot.DbRootProto.providerInfo: array expected");r.providerInfo=[];for(var t=0;t<e.providerInfo.length;++t){if("object"!=typeof e.providerInfo[t])throw TypeError(".keyhole.dbroot.DbRootProto.providerInfo: object expected");r.providerInfo[t]=n[4].fromObject(e.providerInfo[t])}}if(e.nestedFeature){if(!Array.isArray(e.nestedFeature))throw TypeError(".keyhole.dbroot.DbRootProto.nestedFeature: array expected");for(r.nestedFeature=[],t=0;t<e.nestedFeature.length;++t){if("object"!=typeof e.nestedFeature[t])throw TypeError(".keyhole.dbroot.DbRootProto.nestedFeature: object expected");r.nestedFeature[t]=n[5].fromObject(e.nestedFeature[t])}}if(e.styleAttribute){if(!Array.isArray(e.styleAttribute))throw TypeError(".keyhole.dbroot.DbRootProto.styleAttribute: array expected");for(r.styleAttribute=[],t=0;t<e.styleAttribute.length;++t){if("object"!=typeof e.styleAttribute[t])throw TypeError(".keyhole.dbroot.DbRootProto.styleAttribute: object expected");r.styleAttribute[t]=n[6].fromObject(e.styleAttribute[t])}}if(e.styleMap){if(!Array.isArray(e.styleMap))throw TypeError(".keyhole.dbroot.DbRootProto.styleMap: array expected");for(r.styleMap=[],t=0;t<e.styleMap.length;++t){if("object"!=typeof e.styleMap[t])throw TypeError(".keyhole.dbroot.DbRootProto.styleMap: object expected");r.styleMap[t]=n[7].fromObject(e.styleMap[t])}}if(void 0!==e.endSnippet&&null!==e.endSnippet){if("object"!=typeof e.endSnippet)throw TypeError(".keyhole.dbroot.DbRootProto.endSnippet: object expected");r.endSnippet=n[8].fromObject(e.endSnippet)}if(e.translationEntry){if(!Array.isArray(e.translationEntry))throw TypeError(".keyhole.dbroot.DbRootProto.translationEntry: array expected");for(r.translationEntry=[],t=0;t<e.translationEntry.length;++t){if("object"!=typeof e.translationEntry[t])throw TypeError(".keyhole.dbroot.DbRootProto.translationEntry: object expected");r.translationEntry[t]=n[9].fromObject(e.translationEntry[t])}}if(void 0!==e.language&&null!==e.language&&(r.language=String(e.language)),void 0!==e.version&&null!==e.version&&(r.version=0|e.version),e.dbrootReference){if(!Array.isArray(e.dbrootReference))throw TypeError(".keyhole.dbroot.DbRootProto.dbrootReference: array expected");for(r.dbrootReference=[],t=0;t<e.dbrootReference.length;++t){if("object"!=typeof e.dbrootReference[t])throw TypeError(".keyhole.dbroot.DbRootProto.dbrootReference: object expected");r.dbrootReference[t]=n[12].fromObject(e.dbrootReference[t])}}if(void 0!==e.databaseVersion&&null!==e.databaseVersion){if("object"!=typeof e.databaseVersion)throw TypeError(".keyhole.dbroot.DbRootProto.databaseVersion: object expected");r.databaseVersion=n[13].fromObject(e.databaseVersion)}return void 0!==e.refreshTimeout&&null!==e.refreshTimeout&&(r.refreshTimeout=0|e.refreshTimeout),r},e.toObject=function(e,r){var t={};if(((r=r||{}).arrays||r.defaults)&&(t.providerInfo=[],t.nestedFeature=[],t.styleAttribute=[],t.styleMap=[],t.translationEntry=[],t.dbrootReference=[]),r.defaults&&(t.databaseName=null,t.imageryPresent=!0,t.protoImagery=!1,t.terrainPresent=!1,t.endSnippet=null,t.language="en",t.version=5,t.databaseVersion=null,t.refreshTimeout=0),void 0!==e.databaseName&&null!==e.databaseName&&e.hasOwnProperty("databaseName")&&(t.databaseName=n[0].toObject(e.databaseName,r)),void 0!==e.imageryPresent&&null!==e.imageryPresent&&e.hasOwnProperty("imageryPresent")&&(t.imageryPresent=e.imageryPresent),void 0!==e.protoImagery&&null!==e.protoImagery&&e.hasOwnProperty("protoImagery")&&(t.protoImagery=e.protoImagery),void 0!==e.terrainPresent&&null!==e.terrainPresent&&e.hasOwnProperty("terrainPresent")&&(t.terrainPresent=e.terrainPresent),void 0!==e.providerInfo&&null!==e.providerInfo&&e.hasOwnProperty("providerInfo")){t.providerInfo=[];for(var o=0;o<e.providerInfo.length;++o)t.providerInfo[o]=n[4].toObject(e.providerInfo[o],r)}if(void 0!==e.nestedFeature&&null!==e.nestedFeature&&e.hasOwnProperty("nestedFeature"))for(t.nestedFeature=[],o=0;o<e.nestedFeature.length;++o)t.nestedFeature[o]=n[5].toObject(e.nestedFeature[o],r);if(void 0!==e.styleAttribute&&null!==e.styleAttribute&&e.hasOwnProperty("styleAttribute"))for(t.styleAttribute=[],o=0;o<e.styleAttribute.length;++o)t.styleAttribute[o]=n[6].toObject(e.styleAttribute[o],r);if(void 0!==e.styleMap&&null!==e.styleMap&&e.hasOwnProperty("styleMap"))for(t.styleMap=[],o=0;o<e.styleMap.length;++o)t.styleMap[o]=n[7].toObject(e.styleMap[o],r);if(void 0!==e.endSnippet&&null!==e.endSnippet&&e.hasOwnProperty("endSnippet")&&(t.endSnippet=n[8].toObject(e.endSnippet,r)),void 0!==e.translationEntry&&null!==e.translationEntry&&e.hasOwnProperty("translationEntry"))for(t.translationEntry=[],o=0;o<e.translationEntry.length;++o)t.translationEntry[o]=n[9].toObject(e.translationEntry[o],r);if(void 0!==e.language&&null!==e.language&&e.hasOwnProperty("language")&&(t.language=e.language),void 0!==e.version&&null!==e.version&&e.hasOwnProperty("version")&&(t.version=e.version),void 0!==e.dbrootReference&&null!==e.dbrootReference&&e.hasOwnProperty("dbrootReference"))for(t.dbrootReference=[],o=0;o<e.dbrootReference.length;++o)t.dbrootReference[o]=n[12].toObject(e.dbrootReference[o],r);return void 0!==e.databaseVersion&&null!==e.databaseVersion&&e.hasOwnProperty("databaseVersion")&&(t.databaseVersion=n[13].toObject(e.databaseVersion,r)),void 0!==e.refreshTimeout&&null!==e.refreshTimeout&&e.hasOwnProperty("refreshTimeout")&&(t.refreshTimeout=e.refreshTimeout),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e}(),e.EncryptedDbRootProto=function(){function e(e){if(e)for(var r=Object.keys(e),t=0;t<r.length;++t)this[r[t]]=e[r[t]]}e.prototype.encryptionType=0,e.prototype.encryptionData=s.newBuffer([]),e.prototype.dbrootData=s.newBuffer([]);var r,o={0:"keyhole.dbroot.EncryptedDbRootProto.EncryptionType"};return p.push(o),e.decode=function(e,r){e instanceof l||(e=l.create(e));for(var t=void 0===r?e.len:e.pos+r,o=new c.keyhole.dbroot.EncryptedDbRootProto;e.pos<t;){var a=e.uint32();switch(a>>>3){case 1:o.encryptionType=e.uint32();break;case 2:o.encryptionData=e.bytes();break;case 3:o.dbrootData=e.bytes();break;default:e.skipType(7&a)}}return o},e.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(void 0!==e.encryptionType)switch(e.encryptionType){default:return"encryptionType: enum value expected";case 0:}return void 0===e.encryptionData||e.encryptionData&&"number"==typeof e.encryptionData.length||s.isString(e.encryptionData)?void 0===e.dbrootData||e.dbrootData&&"number"==typeof e.dbrootData.length||s.isString(e.dbrootData)?null:"dbrootData: buffer expected":"encryptionData: buffer expected"},e.from=e.fromObject=function(e){if(e instanceof c.keyhole.dbroot.EncryptedDbRootProto)return e;var r=new c.keyhole.dbroot.EncryptedDbRootProto;switch(e.encryptionType){case"ENCRYPTION_XOR":case 0:r.encryptionType=0}return void 0!==e.encryptionData&&null!==e.encryptionData&&("string"==typeof e.encryptionData?s.base64.decode(e.encryptionData,r.encryptionData=s.newBuffer(s.base64.length(e.encryptionData)),0):e.encryptionData.length&&(r.encryptionData=e.encryptionData)),void 0!==e.dbrootData&&null!==e.dbrootData&&("string"==typeof e.dbrootData?s.base64.decode(e.dbrootData,r.dbrootData=s.newBuffer(s.base64.length(e.dbrootData)),0):e.dbrootData.length&&(r.dbrootData=e.dbrootData)),r},e.toObject=function(e,r){var t={};return(r=r||{}).defaults&&(t.encryptionType=r.enums===String?"ENCRYPTION_XOR":0,t.encryptionData=r.bytes===String?"":[],t.dbrootData=r.bytes===String?"":[]),void 0!==e.encryptionType&&null!==e.encryptionType&&e.hasOwnProperty("encryptionType")&&(t.encryptionType=r.enums===String?o[0][e.encryptionType]:e.encryptionType),void 0!==e.encryptionData&&null!==e.encryptionData&&e.hasOwnProperty("encryptionData")&&(t.encryptionData=r.bytes===String?s.base64.encode(e.encryptionData,0,e.encryptionData.length):r.bytes===Array?Array.prototype.slice.call(e.encryptionData):e.encryptionData),void 0!==e.dbrootData&&null!==e.dbrootData&&e.hasOwnProperty("dbrootData")&&(t.dbrootData=r.bytes===String?s.base64.encode(e.dbrootData,0,e.dbrootData.length):r.bytes===Array?Array.prototype.slice.call(e.dbrootData):e.dbrootData),t},e.prototype.toObject=function(e){return this.constructor.toObject(this,e)},e.prototype.toJSON=function(){return this.constructor.toObject(this,i.util.toJSONOptions)},e.EncryptionType=((r=Object.create({})).ENCRYPTION_XOR=0,r),e}(),e),r),s.lazyResolve(c,p),c.keyhole.dbroot}; \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Animation/Animation.css b/web/assets/Cesium/Widgets/Animation/Animation.css new file mode 100644 index 00000000..31dc2467 --- /dev/null +++ b/web/assets/Cesium/Widgets/Animation/Animation.css @@ -0,0 +1 @@ +.cesium-animation-theme{visibility:hidden;display:block;position:absolute;z-index:-100}.cesium-animation-themeNormal{color:#222}.cesium-animation-themeHover{color:#4488b0}.cesium-animation-themeSelect{color:#242}.cesium-animation-themeDisabled{color:#333}.cesium-animation-themeKnob{color:#222}.cesium-animation-themePointer{color:#2e2}.cesium-animation-themeSwoosh{color:#8ac}.cesium-animation-themeSwooshHover{color:#aef}.cesium-animation-svgText{fill:#edffff;font-family:Sans-Serif;font-size:15px;text-anchor:middle}.cesium-animation-blank{fill:#000;fill-opacity:.01;stroke:none}.cesium-animation-rectButton{cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-animation-rectButton .cesium-animation-buttonGlow{fill:#fff;stroke:none;display:none}.cesium-animation-rectButton:hover .cesium-animation-buttonGlow{display:block}.cesium-animation-rectButton .cesium-animation-buttonPath{fill:#edffff}.cesium-animation-rectButton .cesium-animation-buttonMain{stroke:#444;stroke-width:1.2}.cesium-animation-rectButton:hover .cesium-animation-buttonMain{stroke:#aef}.cesium-animation-rectButton:active .cesium-animation-buttonMain{fill:#abd6ff}.cesium-animation-buttonDisabled{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-animation-buttonDisabled .cesium-animation-buttonMain{stroke:#555}.cesium-animation-buttonDisabled .cesium-animation-buttonPath{fill:#818181}.cesium-animation-buttonDisabled .cesium-animation-buttonGlow{display:none}.cesium-animation-buttonToggled .cesium-animation-buttonGlow{display:block;fill:#2e2}.cesium-animation-buttonToggled .cesium-animation-buttonMain{stroke:#2e2}.cesium-animation-buttonToggled:hover .cesium-animation-buttonGlow{fill:#fff}.cesium-animation-buttonToggled:hover .cesium-animation-buttonMain{stroke:#2e2}.cesium-animation-shuttleRingG{cursor:pointer}.cesium-animation-shuttleRingPointer{cursor:pointer}.cesium-animation-shuttleRingPausePointer{cursor:pointer}.cesium-animation-shuttleRingBack{fill:#181818;fill-opacity:.8;stroke:#333;stroke-width:1.2}.cesium-animation-shuttleRingSwoosh line{stroke:#8ac;stroke-width:3;stroke-opacity:.2;stroke-linecap:round}.cesium-animation-knobOuter{cursor:pointer;stroke:#444;stroke-width:1.2}.cesium-animation-knobInner{cursor:pointer} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Animation/lighter.css b/web/assets/Cesium/Widgets/Animation/lighter.css new file mode 100644 index 00000000..ef35212b --- /dev/null +++ b/web/assets/Cesium/Widgets/Animation/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-animation-themeNormal{color:#e5f2fe}.cesium-lighter .cesium-animation-themeHover{color:#abd6ff}.cesium-lighter .cesium-animation-themeSelect{color:#e5f2fe}.cesium-lighter .cesium-animation-themeDisabled{color:#efefef}.cesium-lighter .cesium-animation-themeKnob{color:#e1e2e3}.cesium-lighter .cesium-animation-themePointer{color:#fa5}.cesium-lighter .cesium-animation-themeSwoosh{color:#ace}.cesium-lighter .cesium-animation-themeSwooshHover{color:#bdf}.cesium-lighter .cesium-animation-svgText{fill:#111}.cesium-lighter .cesium-animation-rectButton .cesium-animation-buttonPath{fill:#111}.cesium-lighter .cesium-animation-rectButton .cesium-animation-buttonMain{stroke:#759dc0}.cesium-lighter .cesium-animation-buttonToggled .cesium-animation-buttonGlow{fill:#ffaa2a}.cesium-lighter .cesium-animation-buttonToggled .cesium-animation-buttonMain{stroke:#ea0}.cesium-lighter .cesium-animation-rectButton:hover .cesium-animation-buttonMain{stroke:#759dc0}.cesium-lighter .cesium-animation-buttonToggled:hover .cesium-animation-buttonGlow{fill:#fff}.cesium-lighter .cesium-animation-buttonToggled:hover .cesium-animation-buttonMain{stroke:#ea0}.cesium-lighter .cesium-animation-rectButton:active .cesium-animation-buttonMain{fill:#abd6ff}.cesium-lighter .cesium-animation-buttonDisabled .cesium-animation-buttonMain{stroke:#d3d3d3}.cesium-lighter .cesium-animation-buttonDisabled .cesium-animation-buttonPath{fill:#818181}.cesium-lighter .cesium-animation-shuttleRingBack{fill:#fafafa;fill-opacity:1;stroke:#aeaeae;stroke-width:1.2}.cesium-lighter .cesium-animation-shuttleRingSwoosh line{stroke:#8ac}.cesium-lighter .cesium-animation-knobOuter{stroke:#a5a5a5} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css b/web/assets/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css new file mode 100644 index 00000000..24f5470b --- /dev/null +++ b/web/assets/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css @@ -0,0 +1 @@ +.cesium-baseLayerPicker-selected{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.cesium-baseLayerPicker-dropDown{display:block;position:absolute;box-sizing:content-box;top:auto;right:0;width:320px;max-height:500px;margin-top:5px;background-color:rgba(38,38,38,.75);border:1px solid #444;padding:6px;overflow:auto;border-radius:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;transform:translate(0,-20%);visibility:hidden;opacity:0;transition:visibility 0s .2s,opacity .2s ease-in,transform .2s ease-in}.cesium-baseLayerPicker-dropDown-visible{transform:translate(0,0);visibility:visible;opacity:1;transition:opacity .2s ease-out,transform .2s ease-out}.cesium-baseLayerPicker-sectionTitle{display:block;font-family:sans-serif;font-size:16pt;text-align:left;color:#edffff;margin-bottom:4px}.cesium-baseLayerPicker-choices{margin-bottom:5px}.cesium-baseLayerPicker-categoryTitle{color:#edffff;font-size:11pt}.cesium-baseLayerPicker-choices{display:block;border:1px solid #888;border-radius:5px;padding:5px 0}.cesium-baseLayerPicker-item{display:inline-block;vertical-align:top;margin:2px 5px;width:64px;text-align:center;cursor:pointer}.cesium-baseLayerPicker-itemLabel{display:block;font-family:sans-serif;font-size:8pt;text-align:center;vertical-align:middle;color:#edffff;cursor:pointer;word-wrap:break-word}.cesium-baseLayerPicker-item:focus .cesium-baseLayerPicker-itemLabel,.cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemLabel{text-decoration:underline}.cesium-baseLayerPicker-itemIcon{display:inline-block;position:relative;width:inherit;height:auto;background-size:100% 100%;border:solid 1px #444;border-radius:9px;color:#edffff;margin:0;padding:0;cursor:pointer;box-sizing:border-box}.cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemIcon{border-color:#fff;box-shadow:0 0 8px #fff,0 0 8px #fff}.cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemLabel{color:#bdecf8}.cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemIcon{border:double 4px #bdecf8} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/BaseLayerPicker/lighter.css b/web/assets/Cesium/Widgets/BaseLayerPicker/lighter.css new file mode 100644 index 00000000..c6324551 --- /dev/null +++ b/web/assets/Cesium/Widgets/BaseLayerPicker/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-baseLayerPicker-itemIcon{border-color:#759dc0}.cesium-lighter .cesium-baseLayerPicker-dropDown{background-color:rgba(240,240,240,.75)}.cesium-lighter .cesium-baseLayerPicker-sectionTitle{color:#000}.cesium-lighter .cesium-baseLayerPicker-itemLabel{color:#000}.cesium-lighter .cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemIcon{border-color:#000}.cesium-lighter .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemLabel{color:#003da8}.cesium-lighter .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemIcon{border:double 4px #003da8} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css b/web/assets/Cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css new file mode 100644 index 00000000..0e977201 --- /dev/null +++ b/web/assets/Cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css @@ -0,0 +1 @@ +ul.cesium-cesiumInspector-statistics{margin:0;padding-top:3px;padding-bottom:3px}ul.cesium-cesiumInspector-statistics+ul.cesium-cesiumInspector-statistics{border-top:1px solid #aaa}.cesium-cesiumInspector-slider{margin-top:5px}.cesium-cesiumInspector-slider input[type=number]{text-align:left;background-color:#222;outline:0;border:1px solid #444;color:#edffff;width:100px;border-radius:3px;padding:1px;margin-left:10px;cursor:auto}.cesium-cesiumInspector-slider input[type=number]::-webkit-inner-spin-button,.cesium-cesiumInspector-slider input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cesium-cesiumInspector-slider input[type=range]{margin-left:5px;vertical-align:middle}.cesium-cesiumInspector-hide .cesium-cesiumInspector-styleEditor{display:none}.cesium-cesiumInspector-styleEditor{padding:10px;border-radius:5px;background:rgba(48,51,54,.8);border:1px solid #444}.cesium-cesiumInspector-styleEditor textarea{width:100%;height:300px;background:0 0;color:#edffff;border:none;padding:0;white-space:pre;overflow-wrap:normal;overflow-x:auto}.cesium-3DTilesInspector{width:300px;pointer-events:all}.cesium-3DTilesInspector-statistics{font-size:11px}.cesium-3DTilesInspector div,.cesium-3DTilesInspector input[type=range]{width:100%;box-sizing:border-box}.cesium-cesiumInspector-error{color:#ff9e9e;overflow:auto}.cesium-3DTilesInspector .cesium-cesiumInspector-section{margin-top:3px}.cesium-3DTilesInspector .cesium-cesiumInspector-sectionHeader+.cesium-cesiumInspector-show{border-top:1px solid #fff}input.cesium-cesiumInspector-url{overflow:hidden;white-space:nowrap;overflow-x:scroll;background-color:transparent;color:#fff;outline:0;border:none;height:1em;width:100%}.cesium-cesiumInspector .field-group{display:table}.cesium-cesiumInspector .field-group>label{display:table-cell;font-weight:700}.cesium-cesiumInspector .field-group>.field{display:table-cell;width:100%} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/CesiumInspector/CesiumInspector.css b/web/assets/Cesium/Widgets/CesiumInspector/CesiumInspector.css new file mode 100644 index 00000000..437b1bd1 --- /dev/null +++ b/web/assets/Cesium/Widgets/CesiumInspector/CesiumInspector.css @@ -0,0 +1 @@ +.cesium-cesiumInspector{border-radius:5px;transition:width ease-in-out .25s;background:rgba(48,51,54,.8);border:1px solid #444;color:#edffff;display:inline-block;position:relative;padding:4px 12px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.cesium-cesiumInspector-button{text-align:center;font-size:11pt}.cesium-cesiumInspector-visible .cesium-cesiumInspector-button{border-bottom:1px solid #aaa;padding-bottom:3px}.cesium-cesiumInspector input:enabled,.cesium-cesiumInspector-button{cursor:pointer}.cesium-cesiumInspector-visible{width:185px;height:auto}.cesium-cesiumInspector-hidden{width:122px;height:17px}.cesium-cesiumInspector-sectionContent{max-height:500px}.cesium-cesiumInspector-section-collapsed .cesium-cesiumInspector-sectionContent{max-height:0;padding:0!important;overflow:hidden}.cesium-cesiumInspector-dropDown{margin:5px 0;font-family:sans-serif;font-size:10pt;width:185px}.cesium-cesiumInspector-frustumStatistics{padding-left:10px;padding:5px;background-color:rgba(80,80,80,.75)}.cesium-cesiumInspector-pickButton{background-color:rgba(0,0,0,.3);border:1px solid #444;color:#edffff;border-radius:5px;padding:3px 7px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;margin:0 auto}.cesium-cesiumInspector-pickButton:focus{outline:0}.cesium-cesiumInspector-pickButton:active,.cesium-cesiumInspector-pickButtonHighlight{color:#000;background:#adf;border-color:#fff;box-shadow:0 0 8px #fff}.cesium-cesiumInspector-center{text-align:center}.cesium-cesiumInspector-sectionHeader{font-weight:700;font-size:10pt;margin:0;cursor:pointer}.cesium-cesiumInspector-pickSection{border:1px solid #aaa;border-radius:5px;padding:3px;margin-bottom:5px}.cesium-cesiumInspector-sectionContent{margin-bottom:10px;transition:max-height .25s}.cesium-cesiumInspector-tileText{padding-bottom:10px;border-bottom:1px solid #aaa}.cesium-cesiumInspector-relativeText{padding-top:10px}.cesium-cesiumInspector-sectionHeader::before{margin-right:5px;content:"-";width:1ch;display:inline-block}.cesium-cesiumInspector-section-collapsed .cesium-cesiumInspector-sectionHeader::before{content:"+"} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/CesiumWidget/CesiumWidget.css b/web/assets/Cesium/Widgets/CesiumWidget/CesiumWidget.css new file mode 100644 index 00000000..37fb0f07 --- /dev/null +++ b/web/assets/Cesium/Widgets/CesiumWidget/CesiumWidget.css @@ -0,0 +1 @@ +.cesium-widget{position:relative}.cesium-widget,.cesium-widget canvas{width:100%;height:100%;touch-action:none}.cesium-widget-credits{display:block;position:absolute;bottom:0;left:0;color:#fff;font-size:10px;text-shadow:0 0 2px #000;padding-right:5px}.cesium-widget-credits a,.cesium-widget-credits a:visited{color:#fff}.cesium-widget-errorPanel{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;background:rgba(0,0,0,.7);z-index:99999}.cesium-widget-errorPanel:before{display:inline-block;vertical-align:middle;height:100%;content:""}.cesium-widget-errorPanel-content{width:75%;max-width:500px;display:inline-block;text-align:left;vertical-align:middle;border:1px solid #510c00;border-radius:7px;background-color:#f0d9d5;font-size:14px;color:#510c00}.cesium-widget-errorPanel-content.expanded{max-width:75%}.cesium-widget-errorPanel-header{font-size:18px;font-family:"Open Sans",Verdana,Geneva,sans-serif;background:#d69d93;border-bottom:2px solid #510c00;padding-bottom:10px;border-radius:3px 3px 0 0;padding:15px}.cesium-widget-errorPanel-scroll{overflow:auto;font-family:"Open Sans",Verdana,Geneva,sans-serif;white-space:pre-wrap;padding:0 15px;margin:10px 0 20px 0}.cesium-widget-errorPanel-buttonPanel{padding:0 15px;margin:10px 0 20px 0;text-align:right}.cesium-widget-errorPanel-buttonPanel button{border-color:#510c00;background:#d69d93;color:#202020;margin:0}.cesium-widget-errorPanel-buttonPanel button:focus{border-color:#510c00;background:#f0d9d5;color:#510c00}.cesium-widget-errorPanel-buttonPanel button:hover{border-color:#510c00;background:#f0d9d5;color:#510c00}.cesium-widget-errorPanel-buttonPanel button:active{border-color:#510c00;background:#b17b72;color:#510c00}.cesium-widget-errorPanel-more-details{text-decoration:underline;cursor:pointer}.cesium-widget-errorPanel-more-details:hover{color:#2b0700} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/CesiumWidget/lighter.css b/web/assets/Cesium/Widgets/CesiumWidget/lighter.css new file mode 100644 index 00000000..b3c56c8e --- /dev/null +++ b/web/assets/Cesium/Widgets/CesiumWidget/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-widget-errorPanel{background:rgba(255,255,255,.7)}.cesium-lighter .cesium-widget-errorPanel-content{border:1px solid #526f82;border-radius:7px;background-color:#fff;color:#000}.cesium-lighter .cesium-widget-errorPanel-header{color:#b87d00} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/FullscreenButton/FullscreenButton.css b/web/assets/Cesium/Widgets/FullscreenButton/FullscreenButton.css new file mode 100644 index 00000000..bf64cfa4 --- /dev/null +++ b/web/assets/Cesium/Widgets/FullscreenButton/FullscreenButton.css @@ -0,0 +1 @@ +.cesium-button.cesium-fullscreenButton{display:block;width:100%;height:100%;margin:0;border-radius:0} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Geocoder/Geocoder.css b/web/assets/Cesium/Widgets/Geocoder/Geocoder.css new file mode 100644 index 00000000..df2a912a --- /dev/null +++ b/web/assets/Cesium/Widgets/Geocoder/Geocoder.css @@ -0,0 +1 @@ +.cesium-viewer-geocoderContainer .cesium-geocoder-input{border:solid 1px #444;background-color:rgba(40,40,40,.7);color:#fff;display:inline-block;vertical-align:middle;width:0;height:32px;margin:0;padding:0 32px 0 0;border-radius:0;box-sizing:border-box;transition:width ease-in-out .25s,background-color .2s ease-in-out;-webkit-appearance:none}.cesium-viewer-geocoderContainer:hover .cesium-geocoder-input{border-color:#aef;box-shadow:0 0 8px #fff}.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus{border-color:#ea4;background-color:rgba(15,15,15,.9);box-shadow:none;outline:0}.cesium-viewer-geocoderContainer .cesium-geocoder-input-wide,.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus,.cesium-viewer-geocoderContainer:hover .cesium-geocoder-input{padding-left:4px;width:250px}.cesium-viewer-geocoderContainer .search-results{position:absolute;background-color:#000;color:#eee;overflow-y:auto;opacity:.8;width:100%}.cesium-viewer-geocoderContainer .search-results ul{list-style-type:none;margin:0;padding:0}.cesium-viewer-geocoderContainer .search-results ul li{font-size:14px;padding:3px 10px}.cesium-viewer-geocoderContainer .search-results ul li:hover{cursor:pointer}.cesium-viewer-geocoderContainer .search-results ul li.active{background:#48b}.cesium-geocoder-searchButton{background-color:#303336;display:inline-block;position:absolute;cursor:pointer;width:32px;top:1px;right:1px;height:30px;vertical-align:middle;fill:#edffff}.cesium-geocoder-searchButton:hover{background-color:#48b} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Geocoder/lighter.css b/web/assets/Cesium/Widgets/Geocoder/lighter.css new file mode 100644 index 00000000..c9ed136b --- /dev/null +++ b/web/assets/Cesium/Widgets/Geocoder/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-geocoder-input{border:solid 1px #759dc0;background-color:rgba(240,240,240,.9);color:#000}.cesium-lighter .cesium-viewer-geocoderContainer:hover .cesium-geocoder-input{border-color:#aef;box-shadow:0 0 8px #fff}.cesium-lighter .cesium-geocoder-searchButton{background-color:#e2f0ff;fill:#111}.cesium-lighter .cesium-geocoder-searchButton:hover{background-color:#a6d2ff} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/bingAerial.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/bingAerial.png new file mode 100644 index 0000000000000000000000000000000000000000..a78a154b11be8f5fba30dc547d5d3d5a6f14cfa0 GIT binary patch literal 9943 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 t0k--R*rwS!{)Fk9B8x8qUaoX!)KOVwj0Cv$cs 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 VS2|d4-sS)R002ovPDHLkV1k<_RD=Kk literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png new file mode 100644 index 0000000000000000000000000000000000000000..4cafd40f94f048f4a55f98ccf29a6c1e0dea261a GIT binary patch literal 10374 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/bingRoads.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/bingRoads.png new file mode 100644 index 0000000000000000000000000000000000000000..282d6ada85a58ca9c63ebfb646c32281bc151e89 GIT binary patch literal 8076 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 aCjVbng3ne9rkY#;0000<MNUMnLSTYXJ&n}> literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/blueMarble.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/blueMarble.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b5b7b1a19f3ceb9120d8e2f4012a80ec7a3cc3 GIT binary patch literal 7403 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/earthAtNight.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/earthAtNight.png new file mode 100644 index 0000000000000000000000000000000000000000..45e0fc7b833f80d2fc68f1d3c9f5b82a5d52e74d GIT binary patch literal 5836 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 WE1@9ze`f*!0000<MNUMnLSTYEa2QSi literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/esriNationalGeographic.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/esriNationalGeographic.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfdd0b28d3ebd7fd4df1e8fe632d6ce2c8c38be GIT binary patch literal 11555 zcmV+;E!@(HP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D03>upSad^gZEa<4 zbO206K|~-_Wn*Y=Z)|U8X=QUDNp52<AXYIhFfo46gAD)x02*{fSaefwW^{L9a%BKe zVQFr3E>1;MAa*k@H7+qQF!XYv001mvNkl<ZXhUsyXKZ8HnWYB1KL?AQ*<E`)!5+tM zce1;?y1Tk^E~!){l~l?(2P#mJqC`p}6)5JMbIv*EoHHd=&N+1`x5wk1g$J{*QGj=0 z3~+Gq9tnZpx#yhkepgj|Sql<%c@;iNCSkWW*H++QDjg+|P=OVTUt@Cd3_hMMBJdOh zy_3h1Ziuvareu>P-4bcB0C>tRi5_ckGo5}TPr?A8&`E@HE}22(2w5_<M5JaZbONE2 zE&;w}W5~EAJ_9CX!Km^!ym*l9=+vebG3@P&jnynRgo1@$tUb4a=!v8xQ?r93pe|RG z>kJE8I-7_LNadP)V`rSfhQZeQ`})o_H-9M+Z&gY4H9T1dm%oI=udS^?wouDxEPM;S zf<mnUl*l9;nSz(f1auZ&q37~sc#Ty;<)P^Utkx#fIRs)YMQLW)g9^1)z!Q);JhDi_ zBoI+V(hiGF6^b|lF-s_7QHa|-7EZw26wshv11@OB;2C2C&aB8iDhZ5`#EAZhMpuB4 z&l$Q}o3OZvP*{jSER2kFID9N$MAY2UK<6!|i~1Qzlhw)Cz2?~19IUSSHJ7teCDeV1 zp&cbsh6qGBg|b7YZm%Kc*EbhY$Tb0njo#crtZnkSJjl{4j)33_2?Pd~!XdK7G_I5; z)p1>6gC}Z|=~;3qjmyTc7$}8|iABTFs1*!ql}<rZDR>r>LL;FR0<w&~A)?Ot4O>CO zx=hJn3GsZ(B-PYRRlz4=jYcmt6lH)0dMQM3p`dYC6eB~eOUq3}>g+&&*9Lab6<{sG zniZO@bY2xtN|fqNE*DZIlOB{vj?$Qiw=iF#2p1^aK_UwTLv>*Y3)|TFE&LLeyg{a6 zDP$Z4kD;P>P$)Q)LE~^4LMctAV$0N0g-!+V;mMdJ5=qSBOK2z_zF))b)d@jL<{TF{ zDPw}%nrW|oIBXcR^ZWK)xQu$ora%kC^El-o-ZjjM&&nfft`IRB5i874XBeL>ijq00 z+e<Z?Hto*sSd8Qf;Q@Ffgm9di&In2c<zCseU$Ry?+?NdI^E~kp9Q89S^(cjN5yz-o z$DBbE8&Sk7C{hQC)Q2IB6Nq3cah^$BVpBI5lx+$D$z*J@IXf&Cjwhh<1SB>e$zh{d z1f+xp(eOu|`ca>0UQ8ddD^|qR{<s4kvCIec(-Hkr$%PBb*Jac-9uq?1jbmg3Wb>#Z z1odSx=>jcvos-z-B`Ts!S)MDaiX}z4B&n1{*|IcS7U#>tTuG2Gii&wzIj^eZ^;J4+ ztwMiRqCP2ApHb+}11n2(h{*hyD?Y{+9jEe76PRbwq#7K)k%a4{6Z%Dr6((VthMi&% zpiCl+f}1B{W~sPkGGRc(nqw0|8o`uRHELA$c&)QK>4cKiMM9iUI*=*HW>CMDw4;JL zgjq1BV{V$o7>yXoWKGcc!%`dAoPgT0(AX`eze08;3BCj^nHQGI%1Tj@&j<@8RcTjI z*^`$l;$lHi$P0nb_siNUuIw^HRKt~B(3mfqU6*y1vr6q@x#lyi@u)&~RH!)0;2)<j zs>$R=5~dxu(N5bMW@0;plwmezj!%FpII}#`D1CdHPa33dx0AP;l)Pb|Wg*~La+nsa zx<!|I*e)NBSP(%y%B9*iil9o)q>48h&~7A6grtGw5F=H*d5LmH;+z$SW(}EjM+qI+ zrG!h&c%GBV1DmZVX62cTtWcDfcVz&9LV=gh@c?D6?yIZlf*~TilfrEU`l(oXnI}Fa zk{{C<&+2t2m6}t0@o@(4EQ5W8M(NvG>s^{?UKl=yUOP$0G%O6(uY%gOf-yCJfQ14v zQA10h6Z7K-=RjZbXhZP;MZ%q4o;zn#j72P~8}k=XkY*`uj*T5u^2c4q`G9#cZh{od zTO}hds6eSiP`(-}bgi*$<JveZuuo20=Op)d>7p=|6~*HGd_hsJsCM@i#a&UR$WG<h z*&@HRE2~;X_n}BbG#-dApWur7sO-yh-X)Q|(PnNi=<6l&S|;}rh0%sZ_s@*Cv|Kz5 z0W~tnbpl3f*Tv)g^(T#r0he)5PM<^0c3{>!0hNXZJ{j&mBIdwp*olj$|B<}i25fM1 z^)DC4&Z&5dV#cUhG3C@x2kfIE<5<Qrzw6ve8Mh6h6|rDNqT0sFdU@7KeFW~#VPbpq z)IL9uVi;ZMaFQL%a1wcTyugg*8PPl|Sr%sZ<W=jKArf~^q(w-L2(EmFCLH0&#}t<N zNU%E)>aw_6rP?O8s1rx%nFiI@*Bo8~4@jhaHp{|9cgIv;Yb-pUOU*d7ThoK}HWMb6 zBnc$by}gH*7dtF!%=GXf_(CrgI}Zh4)=E}__DzR&&Z(O+Nc*DR<(M0ibj@Ymkd%En zpj)=e;07^*EFb1uX4C<wIl1Pq;1jnv;eC!ZLG(lko;co@#QQSDK%N#XaUvCIY)@IG zv|^1uvcXH@so_}GI7u+6a&HAoylA{Vmgx?ry3GC#g{7Ax8Afb$jttkFJaTXeencW2 z8SCkt8Sah8<|EM|tpr+s;eb*Fa|GA@N$kW-b#Kp!TtdRcx1T!tMMu*)1gt0I##=RW zKFfSA0MCbD5f3&QKqdT3VHYUn16M-pMfXlrgT!+Bc)BUMYf<i<Qw1UR+>U3L;x5zU zyR2xL7AjHvMXJBd2$XofqS%|4R;m09x)#LHfKZG{JY&S_8_QP~lgYIk#m+*qv6OH3 z`mQ+rBP33D)4=f!${KN_ac1<GfDP;Isp;*%==BQaQn*IBe7f#e6LXjKCaP9LSe~z^ zV4FfNutn3-aN&!dmg52{By1%a#PcR4I33%J1YthUTF}4lcSF-L<ego@UU)5`pR8CG z)FP-+jn*i4)P^m08e>dBq+yWnF2<k0=dTOm`^@Zpt~G-+#&AkI*Bc90;g}GrbjTEh z`4eP!2p-E0<SU)o>{u~1<*~N;9Nl(9SHQ6#=1g?A92xI#n(8~Sz1$!bEDaAF9~n6X zWMd9|%BWo-F~)~Sk55jWCE*8o^bxymAsayi?Ni9*AqEb}E|`fPUZ1O80DVcrH{ZI- z^LUZr2s#wribb}{S^RE%CuM^q^|M|JL@At7%a&yd2!Ykf(T<qnNVyjts%%@+>*n;D zwTKk^XI1`9rUI>Zn5z^zup>B}DuS<G!xr+(*=$=n)sRbqa@iS+sm*Ecb(s1?&c&c* zm9^bZUmudwXGGL7pKU{@oMtmSC87}#chG5qmGc52dxU~-GHa*(PN+=_HY%o#(rLK> zsgrKgQR6K1C<=Ooywyb~^oIR}(luH6x-3)X$I{e%j&ZHTE`%|D-F(C`ZjcVxG!VZN zB^6JJWz$wSS|D5HSh}g&E?Hnf6@hXs<0{WOPl}W&*j3@=$hG?e=|X)bF^~ujW)d9{ zUuVz`u{x_2x|8l;kHOI^QFZI|Gcp-iDxL|Mh-x0#sh`b6SHj-um>-hxBY{F4DrmsE zk_y7|aahzhZ&ZMkylI1Ym5A!6><n%!HqH&5{LN3RKz&DqoO!1epD2n#X^t~QwfPDD zC>3b!l`JzG#Ci<FG5d1diAnoNUh_Je(#<6G>y!wU1FH9IY8=~2Gn_3RR;j^37cO9; zR^bUXrQL~W^m544?svAN5-ko#gH}1>^z^vHQ<Zz1#7()(PnY@x5}%l5V$o0|F728| zG+@>Aq=EpGVS{YUAOVX>{SM`n+c<95_1X19I_bECF(qa!Yb0|@-V_1R1Q|d6`MZAw z1y>t1oAD^Wa#NezR|S$hqmv+2!v&%ly#|s9qQh3Ck~PEL8RuX|U7D3*3>R@CJO<eI z`Y>*5c6DJ`CD`(t(N@XSwGgggT(7D<e<m0p`Mon<=cLKd;t1BL?A3Dfkj6|=SOmsM zK$|FY+<8G@R~Em@a6}n|akC1pmrU3-<37WrMKSKsEXvp*HD_AG1E~Z9CgreQKds=6 zF))LS9gtQsVvvFe8y6{Cm$8U?4sDQ59Wa`afe0y*;%H4M9C-|~TsPSN@!Zts3jQEr zyT7yH^W~{lP}fNyZxQ=y*aF4Ft6`v)$&SnQM-E~k69qRXtX#bAUN0Nwt3E$;+8yNE zTyVDsp)*e#ykjCeSQnO9Qu~_d4Qc41BK}63`kk}%P2$G$U}0CKT;VXrM65Bpa!JJj z>4mc%!zKyU%_NMlh{F=jgh>UpD4{AoSjGaY`4Ek`+iRJ28>ZX_uwFJM6%4A>)42-6 z@7YSmX%g`Q7TqhCK-AJ1y$p0ck0+2uM@P=Ptb8&CJk;?yFn6#pT|0~Qdugg&y|D&v z>#0AaV9aM++Z7-3MsTz0v$OA8;#(@mSTI2f#Ch(dRO+yqqF?Lxp6K?zQslojRDN&G zKedDtF0aaJ#Bl}Fa@i7_JT9V48-=S9>MV;eE@aN~7_(gZ46w4vlT`GOfHJP+&PW;K zF4Krf(UT4?m6OPjdm$A^7RyAfWjYnvNrv$|n@y0}^C36(W{Def!OD>}sSa|g=ATDK zE)4XXW{|+w@|rbp<9vT@EIztd#`xWsrn>i7<dGNmbomfEYJpW<sQJw4cblSRL*~9P zP+{u)T(MIr3F+NwhTbbq+|b|ncS+(8-ok4Z56`A`8t98=4w%2w=$1`O@!by5jGES= zV>ihe(*pXGLb4#`PN<j@N;<r={>sI3eOleP!wOFLm(#wbxMR*|1jW2dx#UJHG!hSP zZNvIH8V{2(-Esd~*s<u=%-~52z;$s4HFo9l$4v4}J|>ki76+O?<<dL$i*(@Zn;Q5a z<wa%PsJ#g3MvPt+2-1^9m%`&U=5B9FoxeWO_`w%7zj)`+U;XueuNxdwrg!D}XYO17 zZckm)nV2TsG!QJcU^M1g^I6t_ipkrfaz50mTUQCM*i2(a(|Eu;?=p-DX`S`8?>4oa zuasFq4>IOmH%NwEn#q85A>@LDyil)cDdd8Z@%5c8A9OSx2M;x(5e;f_D;(a|*794O z3b{CQuKD6m-G=p>1;KFZyTe_d?ZBFu*dfAd`^}Wh%wJMdr(y<lmDw`oi_v|BK;Y(6 zOX($5p9ohTllY3?96ErYkv!LKZOR=p1kpN?qBD}*wq+i>e{%A-n_CyAXV1tKgeBM% z0<|&)8MbOV1l%iN@Nc#@&T^?udgbJm)?e25e1XIEY$KaA(gmG(4ro?JIoP0@^4OMa ziUpt-YvdpTW@v7*4>Z`hxz?wUPLOf^BfX!p$pd;Rcx(AI0eRje83KS<szWSXq;7Xw zq)T^lA{}Q!PU<UraaDR<d#*yOJWOh%d1d&qv-C$@<VN!tc$>6ijYeF>Ybdelv)Z<% zzMeJ27y;dLvHIuW=~IJ4hd%u6-w^4jPYxe!=xztEFWOY=a}#wJYd#<BzO*{mlM2W$ z)*bxC$Nw}3zC6%-VrJr!NrM5j;!wv#oN=caXvA$i;(&;@sT9+>Tm+r5$YLUCWQ>%( z=r`ew(v^UDGh{(HRWn*%U(UB~)hz&<0vs;^+hW4I;x~YzmdQK0?JA?DO`{(*`<aeZ zF0%h8d**+4OyO!eht*bFymCw9Eh1^U#-X{|=9UwuzL*$my?Fe~a>|X_n)&3nKh^3K zzy8gKT_ZiwQcxu(AN=g2!-tQaKYixh;m>Ru!IkFo7uznDi;fM%_~!?HqES&Lf-Nos z3Its(gXzQ|I%b@X+u*TD49<o?f)YvSSTuo0gxORSH5Z{5BB`4LMlsANSt24^#k@t8 zbVaX#nN-U<5!kDTh0Uu$<4RRBIPY*wxFXwok4l9*zo$vkry9mM8clrnYI5%}mhCuo zd14LEYU=6z`yc<)$jDgZ`TG5Qc5!y(qxXN7&u7oqUKp7ki~^G+cIlTN{&;MDm?y+A z$TRyzZCCfv`u1bltaTYW_{pa~w>i{Woj@rga~N<A6(VL5`0RD18Yx#3m~0wfAXO;E zZ0?53AXf|N3LeF8lQRi$9u1)sVnnPBDgjF);`nrmj7=BQ2wEQ9C}1e)_$s5a)9LKf z+Ivj?9j1hHyt?%lAAYjDwXm?WxkZ;Ci0Tvd18YR$)XMCK2M?@n;ZL4E23ekN?Ya1q zcmB@iaUD8!rf*_cWm8BEs<yG7p~b<4wJ!8dyT`iK((=jCQ|~V?cei(*or8=9<6gB+ zu2u`#3>1%!WYf584o<Ga8k{_>Nv+cx^?I>FfsqIqKDWtYR0w%g0hc0`vS~DoKtPkr zr2;-zA{I*de6>id7K#iKnVik8vg*2n!7h!p#+`sTf}-=6YL1;bSl9gd2WP(Mor4;J zy8w;mkuJ#2!pJ-*lHbJ(Q4K@YUEqfI4!`S6guBMU6rtRcO1a~AB-ZH6#ztMoIpkV* zIw0cHcaZA{7`$r&+~NtF?LHfoMUyK;LM}-yrg{A)nOw;es!UE(vSiNf>BCXI(_%E3 zq=AstAF^u=Qk&CYvKy!@iclty8}SM~&S+yO)HsKOXSZ^kR*qD#Q)RXdc*1b8dDBzz zS&I3{{a2YMf3OuF`ffaP?maXYZUb=bKl0yv?$~{xO<h$vg3ffhdv5CZl}3FaUb^!{ z@3LhoadqyYqjbj^4NB!ig&3-p&f1KS+c(AWAU_&{N(4Qtv$GPqS;!ag6=a1)g=cKc z!^cf7soKorNU-jJ%48P+;3-iw!InF0F**$1u-_SQs?7?cQ)O|QWEzoJ$=2Is7PnfV z6Nr_3K)NcUWys`$n}VXq^{eLGJyqhNKKo3cejo|mRK)ITQV(^R$ELz_0II}&f$!?E zD{b!{J94tKk))7%@@1XJFE^>YF|(=iie(9F-EQz)|I9=!cC)>|^L@E^#-d##Vry3* zUxLT#u3V^HhAt53TeI+q>BYhMl`$%3M``5rk2elaH9JG{XwD4Z83thVaEu<FC#JUe z#2Oph8`q#o>#&U(*yglYO^#-*7LS}GCd#zjDu-uEZ$}360e9h%rSJz$`d?Lv*Rtq+ zW$KkS_YDBxL7sS_NWKIhi$CYPqAN@e-{;Icd*m+c8Ux{IArUWl?R($K{AFh%+tJ;0 zsrnP}SZ(8lUpWkDyAh5?UXk)f#k|3uj?dbg>fo!;!HJfMxdAE%<M3-W7Jm2er3+UM z*0mnuD^N&02#)SkJGYgNHD>~Ej}i=CVjv^gAwla}jxDYYIzv*En`iNgLMfA2O{vnG zyL47~;Z|82x}%K#i!S#keew6I%p-07TSMtPeerjy%vZ|vYfbJOUEvJ?bMcw`<_p{Y zU1hwa371Xbvcc_FSv1nfU3cZVA(-y$@4Z}i5;Rmd-g{0f-d<fgKiYZPYbJzz3&13I z=ICeO$;FK=$eHs;y8Evnw&v;lZ3Jc-&su8eI<&Oe3tH%0#SA**B#j4Z3a?lq8wMZR zo#3KLs~4M&Le@qUMjDE=AW#tU`vJ2{QKi&g)R@3~5AwG3ZAIjzF!Vx^eqz{tB#PaY zryr?uPu2Nn+Tsg+`IV;dT$Xw$kH0pS-iRW%B;h;$Ykzd-zt;Qr!o}-=_uS<d3Rj|M zWPEtIdt((e&~|*R>(s_db6?|mvjh)J5O(8CZ*wgYg4$SHU0Yuo9PVgptKrKDP~;F> zh7_C7=bGO;aP&RUVyidBQMs1o_IbSzq4#1e0Y>*=bI)*dOHWN(U(MXgAep_Xvq~c= zPgN}3Z*@$^OQ!hsyMY_OH{@R{(+^d-+m`)T=DnA?;uA&so;-CI$fzd&NR@qHDgQ~C z{7R920VpF5y%u?&YQhh!>HGHGZ?y5-*2LcM%-rBeClSBc)BO2x=RpZ;VW9aGbgZ7T zeFZZ0`RZKDHf;IgsS7h;&^Tyd0W!uBq9>PH*(yY|qGYI+8ahu;K|93yEi`kOr&(~s zs3t#IX4+|NuK{{@UCZ%H%|~aTeE@B{Pvei-syxQ7pm)XTXS-5yRb<zYdv2|~kw@;o zO*8PSPCin`A81mKjrkYm;wyRhsUrT+e&dbf)*ofbZxqRIHQAS3Pf?qAz<1^K(E^H2 zUs{`{Q5Vpgojme@Qm}x6T|zEgU~KmT96aVli+X2yYIeB4XMKH1uH>)<J8PJ6qF@22 z-j!pr<!~Ge%vU2eNJ9ecnms~O+BezC#kC#K6r>f28zZvkQRE4YjhxxFS$)DP$k<Oq z&Q(u<&sB+sma#k1Ffa}o62BWo$~OgJssFyM@WxU4&XW5^pM0r~KD8E~X|lJ4@ropS zPqX_*mibzmdT74>OdY?Yj$M;^;>l}!K&G8;S~<@TI@YMzcAdP(qyQ-x3%LN%W9^sn z`*>u$fWuTO#K8Cvj2TQ`HdC?UEATi*h{C=qGOUF1Vx<)eK&V@#h{svV35k9~W5>8+ zG*^tGacnBB8)hHb5oT6Z*Zfo_2bqi$_wHyqIxl_lWi8*F1MUW+>l~aiX3TwUDE>|y zex^!12e#jseyqto|4$)|Tvwz3gMAge{<SBWkA$=ZKe1q6*pHDa0fbA~8B>iFEbDd& zL@AtM()$_2H31hV6j2-=wb3n7*$9pZ#o$Ib^LT|Hstqq`g7XYzA6eKhP%eqp>k7w` z*gUKAL#?rOrDH{9M_B_r;18>2=X-`n5855GZZ~usbO8jOJ6<=;HRQk;F2xX4ChtoV zkL9VShVobX(o<Rdx;p#pKZUXUS`xc2@ZU71?g9kTDciM-An%41{mi`(q2fl|@ME8( zCA&d^P6z|0S`m}rv1;`?r9v(7glzt}!RldqB3y+N>&mc{E`-XnY6<TsEJ(AD7SCzj zDYDuH*ZWr$4v4|OX^&ErR-!wqsyciAP<Q_kr+Zl}>4rehM-z7F`c6&5(24fGO_5HQ zzYlaFW$}fw_*|B`qb%I{i@N^|eE~Q$zS3u2szTRsTnT)Ann#=DlR6M{Z9?LtOS*)c zzqHtOY-_p&x7w$Zt)bxa<9(g|-Cccs13UpgS4c~hY$yygFx}P-svBKwRM~Jq_rx(~ zz|i*Yk(yO(m&Uba450YBIf-dS@4;CDEN?<qwSn#L9sUBoc2OjloS8b~adYlHNN=FP zU)0uM#7ax?o;v$fk$)}DJQt)M=&yaH$~^r~0kkGv{##r5jo4kDT0?aVv}$$ud`i^Y zdTI;SWtOfk4WAsla*(+(&cTfZZ7A~geC^54)|TfdK@**w-E1}+hy)BaJGV0R{(+x& zjnv5vL_BkTd9!Z`+0!|EdJ@_w)FBAmNj!IagWQWC^xMO1Ymi$NDl9g3{cvLP1a^C@ ztN9?EJQ$5`1wsouRHQBHb7rqf{nvrwl$mcuiI?iiw|`Oh|3m5<W&DM?@U=F23r677 zceVo~1BnK2Y&eSE8jS_n$c2W<?qf>kqJ}qJj^S0@l`AzLF^KSmxslonXEEr_pwDWz zD#3H3t(_O8DhiPWZSFlpV9yvmB))1@YQPb>kZsBY(4*F{16yQ}+>8fYROL)mi&Ym) zre(Pp#$}FsoU;yFS0K>ou%ioQOLjl+O5d<#U#OF>#E~b;%*(%U&Yz*leyxZ-b?klX zEImaq<zHTCm|R(D9qg^Xcoc=5_Xh+MBj@T)|B{U8F$$+1?b6lU`TDaz0}a$RH=bOD zfgLuL*Qu5Ai5KfmvbdPiZeV($?R?#bLJd-8+=Og2(M78>uyz1H|LCv(;aC3^g6yXW z*K9#ymB#w1&D|iDG^jP5Zg-Dbd)8>I^E&!%x{hdIwY+QCy|bUZ_SBJktWDn2Wgh-T z-G7F@@RdCF0BExM#O)Q5xVjT$OYDVrAM}ilkXU%DL%IwZgwAxkR7AG|7Szn>`70CM zCs44_k-nz&l?4Ht%B5i@hTBI+yR}-e%cEb0Pqg=(-^7C{yyfok(`Oq#MBv6Le0Xik z!PfqBTsaPa(#)#z_-h=_x=6g!6RZxWPVe39E*543j-|BslE>Wa^Q@KjyjLII&p&t_ zy7t7Bx%L;`^Uu%~UP`04ErrM0*!4LK@6+mTo+%}96fZP(ZxcvzjcjbJul;fjdTA67 zZKW*Nuy>{!PJFO3J#hK_sUrtI8SHG|UR^o-$@{HWE`NW<tu5;fis`wb(-#h|Y)rHd zR!=Nl(K+co<F%JNj<4>37gooZBCIQ{tKv!8O|HgB<!~T%!D60qIfsIg%P#w<*FToZ zf>r8TnX*0-Lq-zP*KfWGC9aZGSH+>*s@zR!`Ytf`S&IM4G^g6<AYYt3HMR&7Sptsy zJ>V0PA)(6NqdBvK(!{pb&vr%x@vB6oQbL`GNXLCzh>APNKwZ-F`x#qxX3@Nqwm?Hc z2%9S$3Tg{Br<QPldzss#Llc&Urs@<H978yp+gGtA3sl|=L$o5*k%380q~KJwx1FAx zIcD{D$yA-4O{Z`>{T}xsXz0xN@QFxbB$Di#p7?wR)#8fIE6s2$K|G6)9H|@VSX`5a zN|x+PmG9n{7rF-L=Y<v*MxZ8Xyq>FHb3Ir2!RshZ2q3`Cek1ngM2^^|Dk2S}Jr=H# zJSyTW#T{a|mX!1Jyjqk?g9_Q1eEKRd0<tMPN)byV7n)2eok1+o(D_Onk+Zx_7(rtC z!fBC6h0vHucE8*iFfe$OD)7|Y&~URWv}Lwp&z-D>FOLO6#EzCr=T01$n*JaZU8E7m zmZ8-W{blIpF_BCfj_uCDw(9%F5Hz_v^E8lq@!7FU^-ZlTlgC!NTmJSxSe|{dt#oE& z{hv=ZwLmuEEbB)H&m663?^qRx0#{dHi)W6$Hwl^Gkl2-EmQCFL{QVzo!Ut%C`GNkk zO|3_^H<nwjTmbx*&O~Z1o^0!_mmAo<lZ|I;-#c*l?-_iU&CAP{+%BJ1BIi&UMBpSI zTiY1ly(5Zb*e$IMtH>^QWNmz+83O63KKJ1kVvtE6VlbMyqTZIyPkce$vu7_VH}3UJ z!<s-yNB*@Z`wWQ}Ujjzvk*QYjGR+)iI<orQgNbcsP4~!qM@|fYp(l<U#*vv!&sBBd z1(w0;9qxSR`0-1Zn%}(nu9!<6Jn$}$i#mGz*9X4*S!-|gfdlUikMuNNsnr_fXKRmd zVpexZh$CkYgyIG!Z|ijR$2v1VnQ;q5R5ThPmkF!RR)4y<+;jVh&L3l4tUHawc82m> z1EZG(vQ?1;GuU_O*r6XX=$&>4?Bt1`K^NxJ#pv}%Puiw8yH@zXr3aW>Ls!3cChyY4 z!rvS_**G$ry!-X(j<M?Yeh6ayM?e1I==A7kAN`ogV;S~djF8nw>+7dhX5Kw_=J>_K z_K*=pfc^6?{s)!-|M@#Vy4+R^D6_i0pj7kPJL@{TFAtA(hhy$7EaJW2yc<ZE>Fk~V z_P75<qZ1~RezjVNL$A}wJ5?*t@t)oWtr4d;vg_-vpox>o3a5W?fXsnky)P4pXD?qk zM#A?e^Pq*rPtPB2z|ohb7UL+AOLE*%lz*?tzeFpeJab8=mDV(0>7H5g?>#)$Jb1Z( zOsZ49_u<bvhr7<4{0Ml~?7ciavva)hGDps=2Mr&n{^0ua0$)x2?U(POi5r8UfmIYz zZqn)WLKYj{)qUw7{_(G;ru(c`HJe2}b@C{KkA<vG^$oT;oJNI0pqBF#5~fT*smi9* zYw%GzecE7PY;GU~a#$cqKp;0sym?=G^ZFg7-OSKwM`ML*Z>SBnFf=lL2+P=}YeS~J zKg#m2l=+9vvpa|C#!uIsTio6@r1zxJ>*E;V;nu;qZOrl7^W#w1$<xPx>B#luKj4~l zL*L-Qa7X9F*uje@QrGiBjpUc_zoRqj?Otb7ciV~Dv*RPpRui8_fgd^aOTC7jj=S}8 z2^P6={M_eF9T$ZXb}SmuC`DSOKp~>&<n*fDU23_^-`!^v%c5-7T)0L{?jh|ixh@1X z`3U8GOE!<q?skS!N0WulKyb$Af#*uj%<Y%z)H6=#nkskQRe7NE?Yh$mXJJnq*=GcA z(L%R4p?yuNqKU-J$$g7E?91PyhF-GcuTz!V7QNcy@dZma9kHU$7X14kzr*263VRi! z+Z4`*?%zsQ^3IS?8V{@d4ylYswrLe1hZDGe#WFsJ+hj5800J5*8yLvlW<gb<Bra8? zyZeg0tIEAydATGh7DR=-FqR`lGE8TXV010GqXX&kU?MT-F!nesqrs@iU%siYd?PA6 z7ZvVm3lFUM=d9Q>0L<u9M&t=S{1{l-@#mbx3qs@>HTsO3cnVy#joAnG%pFH!-w`PR zBl;v-c&N6yYoO0&Q{BCj-MtzuRKmcP#r@v>L@*mbC%tR9wduu)c@k;I=%8EOLX%An zUtMIeNIDf?%-JEM=c}S|Ml#LG6@=wo+4nSd<)xxHpA*>qo8MRO+>z)(8hcwH-VqLW z*^O;BYhO4e2v)AEvafjQm$K3eb^eJYbd&7A{}v?QJpjN1HTaMgdW81g#rf~jL-$4T zhuZ98OYV^)d*6||P4`^elKYT!DPN@tCqmJLUt>{n<vgB>qEwpW!LZMc)hlL++Y19- zJ*Q3`WYTw(GA<kjX}VGm#8)K5FGIUlmYS+U5h}nTmEji45`aKuPoB*SVhN_rhxJ97 zRv%uhost<^-J!Nfw9DseF&dkKDXPCzP{yAL;@>JO|DwvjWVm)Ifd_B#w(dWJ6n;nv zJ*0&na-xsKiAS=;Lq+_7B6gn<xg(6;vgGfED!2Wal0BNxdV)N?&6LSnA~%AGtDd0R zV8R--oO$r%!7o3a8X6X}xb^31E}lC_z#>=SV@t3OI&Zcro#g=v00goHVZJ2J<OP8k z&F;kp6TC!G7EEzfR;WbZXY+Q3V;!MjgT{El8G^erE`9Q@GWDIh@Ne?mSKQFex6XNM zp8wxY?8Gx>><K;c2;jg7KVn9nFoTa6frsDQFZ0k)eqt#;&_#Ehh5M1~Us-bx)y1ds z*dwWTH&`wwb|e0{V;(x!+1qpa=uuGrz+gxBl?$~St4kxJ?advhC0bk+V3<sf4{(U5 z*wHi_sNU+uXst+Jj2q4f-Eq3wx+>9*>n*)bUz0CbW3^tkxj?QM&r>Mc@~>5?H`3$_ zMfUsZfxUk#0<iJGE3g93^vDBh=m9x!?|X5=0FxK=$gA%WyHAVU7N;Lc68E|O>)OmS z+wSkA;YWhZSMtJZnxmo!U9)A&5{G^UvC2`|o4Oj#oIk<iGOyIt&QDKlAmLve`gmz| zwhG8=Hp7c2S<wVD7^k};B(oQ-wr^PcRHGNGb8o602$gwRYX(_eSA3y!VPCJ)+2{1b z!v&MSbWIn3B#k}N6kh;&1&V$fgSRdMR^XWxf6RzJ2DTq~1qe_>&nUs?<iInW`z9rL z7YH{i{DADd#qizdhM%&$57^-+n%x(?@NJxK7pIFa&}pp;D|mSl!DY>%wpMpg4Gj%* z(-TD8*4*3}aNbqrvV0)2K!{TXK{U(pC1|z~!RW`Byd<e<MPgnu`7n+E(PV>KoNa+v zP0A1Q*xMbBZhssdEd|`gJNoPsRqnB*@P?aw`Bn#Ded`~91~>Hra1p@at;cAgCzQY= zlJ5aE@PHkA2D}nH_lVy6ME5<4`#w-T+j9f>ZKl7%54=(4{y_Fcmn5cj=?#o6M|b6F zdnUn4D@f!rc6*l3hOMl$Q~^zMw<6oWrULp(ZciG{b6p9lB}xPi0iJf2ub&3^_~SgY zW8GkF^F_|5-BVsmli66~@Pc9mZR+M-_x>wo=Dw`-9Y6gVsQ9e{K)G)T0OtALKf(Jz z060MI6EFDj=e*c6PWU-D{tEBDk9R%frM{tso^2WT(Y9;L48xBOAN|4M+RxibBgDw6 z!AFhWAiDmI82t`qxjjcvJHr{RPGB+O)>kh?qo}I#KEmOe4EWY^DRw?BO(vz@FxMU9 zsD1tJ2sNJ3`J$v)3ZKmgyzU*hds<`t*l0azw0&x|G+XreaE6?@tqCRnk0f=+a_x8G z<ZD6f4KwsL&iO!;|C->xu@SgW$$Yirxg*Sf!vK^CJfV3XD+~WBO1<JnpVEO&6?_ON zfN|WyIPVg?4;u-LpMLNQ5|h7-r5~#~j1Wm+>I8*v9U}8k{A*~QUzJL3Xp-XiJ&a(3 z#TclHq=ucIzE~W(Tc+)nzxR?q&aelF#_$4Dyf!^IxUkY9SFK#X=6-P3YcfOhrZdq{ zPd?L>jStwgvvPHlC%#y$Tnj(?is{V?Lbue}Z{?|P8NLT-OG%V@#7sTsXI}%3XU85h z0NVgLaoz^L1*G77-;o{y1jzn}c=uhr2gv%9D`@7S6GyV8t4yWs!!JHsq_c*|x=+5W zJv%cp2$THdN2fNWeEaP`Z7Pe0FV}W;ovHH2n*-6VTyFN-{!XPrDeZEy6+s}yi0rY3 zr#t`W-~I4X<B_59nu*DtaLAC!$?{o5Dhy3Whi;W;i?Ml)>V(tRoJtEl`=!FmSEk%` z=k5#V{u{^soA|T;P~{#n-4#jfo;Y@2nR@}8Wzx(GR`4#ve_ND%{+7U75daQAHW-m- z^Ah*p{@{PrHFln98R{D!(WXir8@yk<^AX<7(ggQ@^3kVTVyY<dvU);td34$8^i&06 zt+8ZpG&UTKfCK*JM3S&~Q<tr%wZ5(Hv9@!yb=U4?Y<|(%>Z2kF(-q)t<9fS$e~Z~Z zx0_uLx<-(QUu^9h?CJY>5HhIonMPsDwY?))iOIeDm}&^OL(othpQaADDla@Yzx)0_ z^`%#e>{9^J%qxEE2|M(?CV;g74%8qJ^k+*#-w%H9cWvE+^C*VF?GM~~ad`oM=Javb zy$D+y{+pltjAfO$ZvXqb^6nBvJunHWa(FuYfj*O=MW=38N(U^K_1!&7wrDd3Hl~*b zPF9~xSL_1S#)&hZ+FWX-0oOiWPvs-~htAH-9Em339o@e=apu<w1GBmJ+&iECMC;UU z(a1mj^b3l@yv5TD!7$^q@O1*$nY#yMU6Xra-2F;ddZ{ZsQ|G^uB%X33j{pEt06GAD z30S8nmP3aQr7C-=hu>*^32pkp5L#Sw{;>1*9#>sBR^6lw7&!hLIQt`cyhN2s|1Vtr Vu;WKwORfL_002ovPDHLkV1hsqiJAZa literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/esriWorldImagery.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/esriWorldImagery.png new file mode 100644 index 0000000000000000000000000000000000000000..a9429daf31d7ddbef690cca8388521bd04294713 GIT binary patch literal 11575 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≥%k22x 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/esriWorldStreetMap.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/esriWorldStreetMap.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbc1f42d3add0290b2a1a85ff54aa58e305af31 GIT binary patch literal 8501 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png new file mode 100644 index 0000000000000000000000000000000000000000..f2eba41069b5387b697843e0fc2338915644b573 GIT binary patch literal 11342 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 Q2><{907*qoM6N<$g1%1>RR910 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png new file mode 100644 index 0000000000000000000000000000000000000000..30ee6dbd555eb7f1c0d57b82002b1504b9783f22 GIT binary patch literal 9242 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxStreets.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxStreets.png new file mode 100644 index 0000000000000000000000000000000000000000..6eef1fc3adff2d3ceb4aa625ffe60eb924cb2aa4 GIT binary patch literal 7270 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 AxBvhE literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bc3551388c875a0886fedca8923e29d6e5e586 GIT binary patch literal 8300 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png new file mode 100644 index 0000000000000000000000000000000000000000..50271c79a07e623796179e9feacab21f69ff8859 GIT binary patch literal 7491 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 N002ovPDHLkV1oIR%-;Y2 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png new file mode 100644 index 0000000000000000000000000000000000000000..84acdb8095f8efa82d7d9ff5a8c4411741f7b488 GIT binary patch literal 2663 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/sentinel-2.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/sentinel-2.png new file mode 100644 index 0000000000000000000000000000000000000000..775fb38ce12a0ea7e90c762a5d70cb45fc4e1759 GIT binary patch literal 10086 zcmV-sCz;rZP)<h;3K|Lk000e1NJLTq002Ay002A)0ssI2wVqBT00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V04CN+L_t(&LnV0kciU!~F8_o*=kCrVj*Dzb zR-we+D+qvK2S9=VNU-<bDT<<cwVEwgS#q~r;ue=Ui5=VH*ohsdcPEoxW@dM1XYS6- z-n+Z!Y`J@p-E-c9gI`F#-}^o9Q^?`L;%*(UOV96v#QjET7bp~?TDc1n*tI;HM(Tz% zK8q$`5jZtcQm-KOdM^ZeVSof2K}(?E@n`60DL_V?5DKUfrP`=MoJM~t;11Ioi@s0E z?^pA+Hk~U>U_K1@<G3HSd#pw$2w^%Kh2TD0B*&CnnUR@lWhj*_`4dIIC+1=jZaRYd zVnneX9~{m{VkAY|NWxSp$0x?B9EnNBhb3H4)DKH!n4V`*^qZBvh`bAu^qG}X7o?yO zDFyap3LYlsJ7jWPt;97lyWGqm{({#X!$Soh6?0igBa9hzW;JNjQ6aYxGpfxhzD}St zD@`O4DMfr4#+PP13ECYc$SA>ngb1O&Bo!_A!&z@6L&tMWJn!?x38&xYPg8+39Zb>X z!Bk_o5KDSO5qB`?3<R911jErev{JJ|WL8M*8if-SIkbHyMHeXPhNJ?UR!+b&HzalI zd#z$VDi_#g61!Y#l}pSL0|C%!l1#W<5zOW>8C?bl)dN<Q6$d>*-088fgEUdFg)w_G zbZ$5ssf4{5k1OiJLMR@_oMFsF8NCTAQt<l{q&Mn}WW1?Tn4PgR=wR5Uvy3lA#R`GK zKq_5|<jS#9H5rPK;V{Xukg(RFQK34G8<t}RF{<xFl-;1T-=vaZpwf-V2}nlhdk}#X zS4&Z)#43}Rq%yP2-~x!a%a>=YUNho`Kul+FsBJC-#aO~IS2Rh4vy?wi1xnu7Kqxv8 zW(r<s+-dfiVH$==2yhydRuvw^f;pc*?P22XXwH|d#R3@*5y8o%+moV+h?5B8!K}Z~ z%+^Lq!&8lXIT4D|9MprDX`{gnt8jzFt`*yLJ+PDu%h(qM4yxToJ!4T(fEZJ%NkD<A z<u;|#rc&EAAOTr@)>u6jtworhe+eVQ4sRF@M$lr(=L?#N0D^@OdkC=vj21tFMjYmV z8KNOAu2nhIdK^G#6MzF`obaV+cGzqMk~I5n_uDN#n~^jcoCZ4!`eLX!oX^yf*?KZt zO(b$54&k@h858J+l&Dti0+ArbHmY=jDi<Vm=wzr4V9W|aFL!A*q(SY{v&S=etrnjh zj}k<jjMd}G!DO)LkClUiQ^lF3p>jR4wA{>>yto&H2o*r6KvE03b@q@A_P_uEuuW@F zjULw{Gy-6HcCOw8>500?AWHb{7~3v|Xi&YvqE=eeMmOS3dE=E>FwM|WcPPd9V-&{| zMQvX8Oga^+hCC)mjBq4KQwRlUL~K!t%yNSVk-PLNw?RWepvQ#82s+~<Q(pGz$@<+1 zGFS>SX}Ua`J92*i#-+p4^Yzsub8`!Ix8J0;inXX5BK3#|bj5HZ4e4;L!KsG`kVO~h z0<0br9VfhTw>#j#XvFS@U|bL21`&JJuv}qQ0~ly$9CVx}f;i%YoQw_kSUB-KjWdV= zXRjMz`_>T#jZ3d30QN=i0`!Ez7D3HX%o4+`G2E5)1Z#0B>jT}04hQ8HH49A#JE5qv zIa@n(_1MP6)zPWq(GyF1_K*1!7>FqVObNQQb|2!)c^p9-+o%E8AtY>LEO^inD~F1$ zOf>H!19psp?F8uXn5<qaJ7xffV7E!fGO0ylBoLIbvrSvvFcCmG#etA3V6spKvj@^) zYQ0Nm3tG`A>WpLdkkt{kqcPkZMnRuNOG2>Uj>buZu?t~2&mivA@}!8Iy-kb9oUBGx z*5?=Yjg<$ZvkQ$~OO05Lb}+CrWToO56~|+hkSmH=J&40+@g&@dYNRq&XiQaR_Kb|o z)<$P410$JGg1|f`BH{vEu#vKuXe-;a0#WK6fZ2^8F4#&Tbj-yW97{!Vq%ZAsg{^47 zjE1d=!ANW%94vXgS+^%kIwB4o2?@-K9)nO|QV2~d9whHjaQh4*9wgCXddLj}xZdG4 zhccc}noJfv#d^3goGLftnR>W1k}i*=3$0{+DCJ4I$tcc>(ZE!Badqb0^^;S(NA?|= zKYn)KEB7wkcx7X3y6g#|o+NGYp(fhKPTGJ&1`Gr-(BROU2-v|`*#mRNrVEv!Xm%i& zss~d8p?J+-naISdemrb3Q-Ix%K$Jm<NZZx@ZHiv@*<%p*0HRJ+Ki44aRB<IHR%NX0 zj$=M6#Zpz!&P33$+3N0t6H|+g)=Xt;cWd#`<iS(B+5T8cj+KH72dA&yx%lASJNMsu zWo*~L(!q(B?wo)6)#Hype{k*Q$#f~mst+0>K*FTQAT)>v^C2QaXf0|G)mbPbTb%K! zVzn8|RQ$<`FH;Xj@>F3cnjQ$!aR;41nKZ%5hZ5CwYIq$#7k{Ttz*d)5&<{!2rezkT z*~=b}y*m(RtWL&^(eU(A^Wd@hxjn;!lf~v#X@1}M>Z#p}2d6W&Xugp+e0uM#hu2?! z=heH9ZjSG&FRTo|@zzV<{`lSppWHit`Ea$BBBO3+lroZ5qucCF`wGJaf7Zt~4Lbod z2^$HJGc=OPmHfdt?g`t1DOWh{ju$-D(R67zk#9zetwgGsvW1;ogR~cvb_3#0ouE_8 z?*YUDMA@U`%dIL4W7XQ#N~6?D!apO@Z<$zV>^rh+dTFRI5X;sg)mC=(<epu7$MXa6 zLL+hL#O~|2FI>2G^4yhUv&+K^ds+`3-}w0HgI8WXd-BYlsfD^f#Sk%%-HSOGEK~?5 z>q&ox(c3gu8e!RnRas7&)%`dTh+xq)Rc<B<^+>Iio>?9mnXTp<(Oe@|9xviis#`1E zsTHt&_khwa79pU7k0^zRoXU8aEMq2(I*S6dsjLJT&UgkViYsfgi~Gk1$MWUD<ltCw zer3GY$_C=@c+NL8UOIGS>B0*q-udvsrE4c<7YA8XeD>=%-g*D_#j9(34o`a%9!J3C z@Zk<0=I}YJ9t-R==<OOjU}v|&%9uIHv?m-TLQz*L=c~6erGa>*nPLYpJYCIJ!`XpY zb)rnC1HF1lk6t1)Yx<0ePQ9=PlCYW&d95oO`xn;cLu}tpg9+EO70dfZcGYJ0jtotf zMy4uz56vDqwRipGN+9OODH9z)M<yy4ubg=2{nx(y=KY(u&W}zOpTD&F=*f#0E+0C$ zK3yBl(J{(Q*^Dl;g|yl{HZzGpn4Yy8><ap`w26i}g<?3tN>0*~%KD4dSSsgF7em97 z)#^|tSq$VG$<k;gSd42iL}1h?FqmgjZCCTUAqnKO2L}>2pWM3t-reSO&Ba*V0lUo& zWou!!X_hhawdnZFzzZ*)`RLQft4EeeugzrBvd@L(@h5NJ{pP!m-uvLe#<@d<a$saU zx4hDtTd38CVzIo32st5~^|%@cgNTreHC3z`^e3t8U?NiTTfGP;UkDeAk!(H`PkK`s ze<~L!RAQ+@C{vE4N})uN9d_22iQ4^?)@k7x)g4;lb`6j9Cwh-LJ6V4Bn|E(MyxyFu z1ma{kO=Gmt7k5@hGi)VGftkhD+wa}~^6L-w9h&onaMT48l$rglrQPF4kFU(`8Y<V~ z@f00Rxbh`mZ7?!4nr=-MsR#kPj5-_3aY!)ZtBn<hW@>xa=Wo7tb!uf4a_KqcN}^Uv zvrqQBssriTV75?+N7KGsHIb>r0!gnsL^^}CKbx=xDL$fU*9toTAv<ZA6G)BbUwG~6 z#h1?xO;uu9CYks7V@|f|P>!yR=SxGW@!5e(*G_%<#oLtzYul_Y%IqRd9>$SKF{MhZ z-bgowve5(?Pmz;z)stsduH8I!`R1ueA!H&<Fa}%Prbs?8x@&O%v8Bs5&pdqZ&eGu- zJZR$#HVe&WadfOUJ~c2lSzlh6Dc91;e7HJP$kkK04})<Nh?;$=s5L;!9Z(M_>xQK} zK~Wzf^%essuO2`8{Oa&jwNQy<OM!GL5YA9|z`|<E*g|7)yma8m;;Rp?PcOD8#_kPZ zl-K4Y5P#6g&S>xcnbYT1i`7WInYwZN+~;4v_5DvDeg55h<>3PAby(dND`^g;naPFL zsSAg1-nn%5(G8aM!v%)ZY8B@fMh~top1W}L?)@8|e(}z(<%x7Dny$o3twN*_F}rOh zr^6EqVIhx>u&_S6$0%zDc<oxQ)&=B;GmVL2V>mlDS!oVuy&(tgMNpq9l=n2J%k`05 zwi20~Z<ZUWay@xyeW}?h1VYYwBlGIrs~>*+=)DggPR%##t?bG32VZ~Z*1gwnoOpgU z*GRJn!5D{yfT<uhwK#O)+KDUIPfag214)7i**SB&TIbHMzxME@&z`>hkAMEnpa1XQ zy>$0#b+{PL2UtVs&jwHix4Ut|@3naeoy#P$>$+h{yS|@i5?h0|U5BO)9G#zAY);M8 zre<q}N+?|kU_KKTFlXwKY(46WI{h&sQ3#wqzxMX~500NYm@7mY&HUN(M;<@9w{h-B zW2C_HU~9U{>iM44*^#+MvJ!QNoj7B&yNxc7rBI9RUz=UoKbgpRSmg?3J)HGpyWf8I zSAY8RZ~o&y|MH*z^-ury|NipZKYqKswu^O}cnEVwT$m51{2szfTWKduJ7hS>Vx!Z* z0~up!y7cm+>mPsd#>Tn*Q!|zM#liin(~J8@JqZ*IAXE$uX2?*Qa`~*$9P{ocZ~XMT zuO2<QH!<BzWy7^bexO-M<-)Wdb9ybf*TRN?bTyJ6OhpR;SHR(*OgL@ANu!g5D4!|C zGGW^73E78dYMkpg&wT&m$N%>4fBcXC`qMxE`#=2tFF(Bf>FXm4gI2Fehv^`<(d4!e z4CM_6a6e@W5`fp%XI69qeMrzUw?6aQ`?o*-;`N&^Z_Lj(#>We-vF!M+YGEiAtuU;U zDUW3GgK<v;52ff2p1%1HfBxyK?>;%Ox|GRBn1DMF^*AZJ(__OtR*TzcCLr8rXDOd8 zB49@;#Ej}}m=-4tm`fi|x!DMp$a)SQTjIR&*2{nQ`!D|eKmPE)|MLB3U%z$h!IhOG z^U-opi>jq2seyp(3`Y9sU@U?$Zj0Xu`%%74*#U5sPEB>TboR#4+xIV?IJrDMSsEOS zXY!uPP^>nQP7VYkC8pR)mWI--`wJw=OE)%t|EHh6|LvETuAV8?vN&lceJ(3*B77Jf zc4Lek#tnAb!sf+vEym_t(r^EH%x;ioO!1_9Zhm0T-m&@R*0D4DIUjs>|8M`{=@(zW z`QhgePMqIYY{u*!7$N|<MJhH)U>flxeV!l_j>oJd29j3D?+|0^?V7G$0~e+Z`N3#o zB-v<0>(x-b7Ru!5Y|URDPx`VhJZKJNsbVXYD2G^SICAFT*FSy!?Qg!k|Hi8W!&Mi{ z={~oU!k7phN(a1g+D2O}q&b`m<ObrQG#$x!k~v>8L#MLz?v>Hk9$fw8(}$0qynOih zZqCK)>o43qwtszUa6BDI;Y84EA^|oHs8E%}DwkPRMz_U5;(=%wW!#9z0niq{S=z4c z>elz@a20E<S`)cOGchufo!wQNTC5kEk;Fg%kJ_w^(UT;SwFv7-$uOQMgif4Wf9ch0 z2iH~-nJ__Pn9CXnd;Ba&XosD$pk5p1wUJ>bdo%H(Z*-=1Y-8Wb!Kq!#%{SkE<*TpX zefrHicOG0DnW=N8mMV?$Bonima3$hYLbw_tbV|EY;ZO-J@_tyNu<9%XN(LB*mp~|o z&Seyt72P^67vRcF!rWkFVpnZsvN$<c+q*Wqdwn)m3*reB^gs{=qCqy^k?x3#47<D$ zvN2qlo*S(V6v7e4?{~-JzDhL{2(!3`U0$0%PK7fJYXf($PLIr1_8*yh;pL4pSJvkC zw65Md``TN#Zr;B#yLW<4kepD?;R*nDk4|qFYpf!jL#akpGOJQxlJ^-|PbU$;O0yfc z61droLN1HO0ZI@B58(G{d-=K^Uy2x>tIq6hv8ie0_)>GJi6vcX+8{zzQis|=zzAgl zafpu5-Y6YQ1tKvY+iNu9Ef<oz7bo{DO(hau#^=c70)wqQtM(fg5C8i6cW*zua^m^@ zS8km?e(6wdC^0x!8Cf3k<UATwCpODDMOI>lLg~6cUiAgokQ;U&UPO)SMP?<}An8!^ zIu!k4P^mQO01RQ%gckidD)*@Sx)nYBYA!-Rm65{GY;%0~XlrRC+DyrCod8vdaIMg) zlG}Bl+iaq2cG?k42h+uPqgfto6so0UqnbUwzVh(3o26o;T8(d<J#_o-l@C67<J+G; z{pvR#-g$IwbiSTz#sWFo!XOA^guO<IP0<I7`w$5yTJ*)sfmAJ=tVPp}c(fV`6#Zn1 zwg;VTP*XVoF`ElPp$HbqEDEJVBeg2~4Wdp3w_V!Xt?1`##YC7&RMWvi+!^zLURw_& z?lH;wZK{5=LS)hC-6oqK#{$lQiGk&V3(sFVb>YH^<;987R{8S9<DY%{WMZN=GG2b^ z)r;?a_UNO}pS=10{p)uxPVF6G(xjP&v<{WRt`s05zDd#p3A;d1w^728!*Y#TV{{sE zKOV>ilJ!)6xKJ7^6-J7g!EB_=22o5;C?qx>-_+M<<n==QP92*Ux!WXt?K06;9+$7z z$Pq{a>v@2(TPtQ$Sr;ho1cg0DsnDv?5Joggq?@_JXV;#5`1*H0eg6FqPw(EnHZ|2) zS|0oItM~RDoEx63oV{}F&ZC=0&##t8^Zty-NI@!_N(hNrCQzW-K1d{W=ma(m>mWKI zF{fK8;%X#9Kp_BRO0yPno9sRm4?Epaw>RYp7W|P~Ff`z0YLu&pgF&O*t?M$1b^xLs zYBt`=yVc5Gjf$&La@F!4wWLcU>e2~20YRrh(8*2(mI^E?qu)NXJa*#BiKjn&{7?V- zhkyRpKm7X3_tuZ@o|+l>;m4;JuAcmv<8r=iGaV=djFeG}19F>IX47h%kje>)Z5p9X zqovGztELN<wHrj7cBN#yLbP2j*rDKess${LMTnAxf!+xq9>fu{yVC?yVSIHz(+Ik& zertx*1?^%2?ziguj5@AC-L4R|%LH9YVUJqWtr2$X1?*LHf`Sf6)DDWeAhC*ovJ>T{ zqf3uJdHBcw^E=ioeE-8IS8tr2-qrZ<)5kB~yBx2CVK=Nn^>Ukr2T7!Mox~2vF$nNF zw3J0;*Gq6vK_K0*yaSZBgA&emy=tpkwoS{PK+&cX@6ZW)jWUr<DRr>LqCzHPQHAL> zZp0LIyQ?ubD_5-yIheBL{7R3d*C_7+#T`m+mzv+J7j^6ST{>QewzmrsbRp6mkZ8L> z&~KF+7*nhfJAQfnyTARM^$Y*_m+$XAd|`a1eDlup&)?igH`7XowwGNMouC_(itGjz zX=h8%IJI6>>NK*|i>S7!`P=p4PDsw#td(vB6m5`d8z|qR7jFXu-DbG}RZE;|sZ%Ax zRWej9GHGOXSdJqKw^_|tfhcY*FytUhyb+@8$1)_unB)#M7vQ%mc6O+H+SNTfbbTGL zxYH!-GRb<)>=YDe3_EaU<)bg(`t!g1?vH=@=KPhz*=nFRmW|gUIw#Nr2zCO(PEgWo zR`VUOf<on_U4)sqW?dJoYzL%mT5%g2nslOey@<07lyz7%JMH@IX7x5$)&`4rTI5{2 zyw5J>*(CzIOk`E^3@RR=?FE!QkfPTl@3G1xv>wTzSjFwGQGsU2Q}H<B4xO7NN-57M z?gn^m8g3iF??9y8Rz;6l%0+|_1JA8ayz$=cFTQ*G$p^Pio?9V<X4W!Tye7F#)ddK) z>jZ6pr~_8^T0kC(@Ek~&QP-xEZdD7ns03Tpf;Kgut!?UlPLD&)BO!su)Js5}sHWYj z=&(w6Ac8iqcN@^vVc_-}guQBMr&uI3DBG319a`>oefKt?v%|QPhx64w6`pr^t7Kq+ z2@C{?90mI<A}h;x$~HjI28lW?@@}(4gvvpWp*~w&JF~oYdSP_7;EUT)TF*8eDEJ%^ zTxe5oRrf!m=zCVh-vMd1>J@E(YO7YZMJ?K<6}Ri8?K;tO((Wzt-p#UZ4pt42!%6Q% z!I1T+qgXGdZAZjAp#B|(-cGQG3-^l<p%PJ|l-W$0oiUdq=1`NW9;B-s+}>~JDo6<w z)SDwld)!K73A)ITc^{VYz#&{hz+E=g4n)!p^7}1fu~lrM0bdFWrEyQ#?D9dF7bHS9 zIz?h}x5{noGRoTk$yU8=i%!;NP_^lmThx-xO2Jl@fDNWw<=h>r{w}?MElz3g(BS$^ ze(z{vVbC=YQ~9l8r>@^3={NF~m>i2*6E$XFG_h;Byk~V}{oK;QbMy7ZEEG`pz&rXa zJ!-cMV)PJWfIJZFMJyrI5hw99gXaQBf>QbIA~(oxh{!JQhx!#}q1r5fQJIxcI~kA& zAY>Htq$y{T(o&`#M7hHt+ip;7Qn6E0wdv$rRKm@2UYnBFsTFjn`uUJlVo}I!D$dNg z-P0R;hSuh4`^GbKb+R0CrYR$BG~g;<#<}m<)TNsTzxeXS?|*#p``_LD)4zQ5&EG$M z{KbvZbVzLO<|DlzrMHJ{coa8ztxCI=2TB#FL4iX^gs|uQj$+W1q3vl(N5g7VEj08h z5rGj`xco33vY<5R4x_<hfNfgkf;#~577Yt)=_aLc2dLPtlWbA+vjb+W1XnMVAacNI zfJw*|#W|^kT4Jsmoh-#B%c-eKZmN=OrI`%LB+$lKa_z*->yJ+V^y7^`|Ksf+f4cU= zZ(jPlKfm$q?;l*dzvju9<Yq4H*4lk$tJk7O0Wl;K8I@A2PGr%FQ9w!<)r<{}5opHi z&U=X@;Rsl)9>^86kRdA_wv%DICqcMkE`T)hjPe~C!8Uf=w8CvH^8ykU#N7s|(4>-D z)jAx2Tp$^9<y&bsRdI-+1XhpW)eun$dukDXH599dy-6%xqNjJ2PH)WLdU@}M@2>yu z`wJhvzxM8X>!1Gm;&1-&;ENyb%<d~_ExiybL0np+Q*S_ZAZ`E?cxjGdL-PEg#% zQa)}l`0dUN?JozIoR@XjzO*}%_p;?nldcd7x<HXp)(eQb0ZFG$v`y9DVUTn~vOa`W z39SY<K%~*eSW(6tEBaY4xwf&w(U$^X(QhjFtXZ!$MOeai*bTs#EM0W(J1}(m)bz<C zgICTCyncJ`)f*FcUYWand-0=BFMRi#doSKT;0<eywtmRMhwM@Z4O3C4FYC>)Nq#V; zrOj=c{%56KTUA_^faR#p9>HC4H|q;BjYNJZQ);C{c^~XDXdPM}AQTx{u<CiR;(x4* z)S=grh=DW$xE^ssMA$)x9ocGd`M~)4>17T$5Q8c~q~t>@0q<ZWG88pZIvACZexN$w zX$|?BHP@b*!0`jwqX#nUhcbr`<z9Ye`NyB`Ja}|$bkZM;==~v}P^D@kv7wn_zLiW3 zB?7gu*sj{H?%SsB+p6l@EbH2#;)=~G4F;M$Ry2SyX(m#RBnJ}7Mlw_iV-dngTOrD- zaT?_gK>4%ZPzez!>njlojud?L(QG2`3C3|Y+Ko;ZIdC&(ZbTf7ux~tF-P;^n9icNQ z<dk5vG8luxQ7{@ZG)vB@A>Z71Xl~NKdogkD?CAUNpZoOFOB)+Qvva|z$-w+#dSOpt zd_G$k3VX9`iZb^a`rB09JG8v*THbTAu1%uO4h_H8AQ2);shPzn%=%s`?PUs~_&~~E z3=;|38KbC-pDBi2Y1ZN*AO!<X01w*J^+;_vmB>;azd4yDqbU~$9t`253Ey<Ka$xAd z_0<!%j#TH;bP^#W`alw9g8E3<n2I^8dEa<5G2V)<EEP_l9C_jL%o`65y>w&d(uL6r z=Z5#LB&!2>EMpF)EoNFJf_gjD9b4obJGA{fK~@@sTNT_L8h*Q0uwBX9Cg*nRM17!4 zX4Pr_yL)!ho~$q3%GPEF1{Q|Ov-MCT<}3O91;(GDd`VX@<?=@yzM$0~vbjA7$2XI0 z92wtpb>I1i=k9*;^3{hM2hYw<trT0cvC0sguej<1{%R>SK3bR>FYZ}toIW{o@%g!v z#|DoaDjZyi?_Z9bSSuV@Nj3)1Kv?6CK}^yFyA?`I+68d8Dtp?rysaAEb8_xh6|WtT z>;x5^fNZ;l6^p($MSqV@)DK8xEOJmC7RI8LNNOmBCkS_zrm_@E32fFX4kgOXSfvpy zR)d+mCy}8!1N-U+uI#?{_}rt<Z+-OrgV#T}dj9&#k&Vf{ha2;|iw9PR_8w^MKQM9N z@Z`ROV@Hn8oH;Xp^2GSca&C6qKU_m+N2o)~sYAOn<1H$kGDcEJW!M)ipw5I<;*hmz zdN-@M&#AbZlzp3&yf(eG16H?#tX~s7BjIk6a@*wGHfc}0tcwru4Ng54wBr#}?=}D= zXbo8DG#M%|nOe9|4>w0MwMML12^A_~&fa6g=dLc_d$jSvXE)#b=-Ta9*Pp*IfBg8^ z(W4_98#7n09k_Mp<gI(BpTB<K{FQyDo?qN|s5vnipBN48nux8;W%f>|4$bF}?X53Q zC(C)XTyah9N)OGk>*zNIjopaoIaTko%HGWy{xb^xa~km$z5H3V<d<^6CZ%|@O0+{G zWVNG9(<g+*dQ6LuApGAQt1ykit^jZ??9!ti$P>1u3*K-P564}J9K*SF_wfDuM;<;n z_Rd@9-hKQ0<A<l-eB;b(_m1DZzW?Tnhwi_2=Jhu(zkKi1nJfD?F0ULoIzGKn7#s@K zD)d-0w11(xXF5OEitidtOtvERD%BYBx2BVkB9<Ns*yEVo1#H#y|5DboStI<Vod1kc z@SIlij7s=7(*9padB2cww<&q-cCs;4gKCW=WTA~P0Z7eKzM)@c5}8OtC`V_i!C=x^ zs)d75oS@C5&&K)eqs#9<IsNYAQy;x^{*!l~|LpzC-+unem!G}-?vsm;9-e#j=)$ia zoWFd1ZSB;;{`IM;g=(!C$>hmQhG^D9D+~3xv23dr8fipEhN6u|ur?G*mMI6Lk5oMV zN=WaqY*X<!$@(^{1iz5<{ZiJySuNb8<o}JN_m`61XQjP6)B?Uyp|tB@x6$FZ;{k_> z1Qm!#X%^YNP`(*kJUG7Z$V_W0Uu(uo^=NaXkS>KeZ$Ccy!IRV9e0KG3zkBtEU*G)g zH@AQL-QB<c>5Z>HfAzh$uiXFD#<lC~r_UakTO6r3v*mgs94FkgF&x1L2NQF%mBv80 zUJs3oWyYrp^;RrZ@#22O=+?R8xUU!iDEl@UZ-+{_Ny7bW{?2E_-CLBrEy})UW!=xo zdpZGOKO_^Il}fADL|HsZFBPR69+SnTv$-{si`9!a)^9zyc<Z%`=dP@>i@17x>DIj$ zUU=ns&W$UxPhMO5>f=j4eRcEOr`Nvu?Ap^0u6+2;rF*xJT)wb;^2E&k{bRE;g9C&4 zSb_<LT>c>D52DeSvsenWMpD^4U8wr&twgRCpd&WB2Lw<R<kWdGG@T8qP^4WUd`{T2 zNz}cWT{{(zCB8OQ-&RFWhnDw0e~f4_146TkgWDO@=rrosAnZ_h!={5rr?0(y;>A}t zF5Wo0a(FtH^CU`vQ<skHSzF?49IfBEvGDPeQ{R2|!j~Uk`sAH+Z~W@$E7$j)SRdZA zRN6I{9~((mN|9_j7!DGQ#}*FZsT7^b(8Z#!S`P&xwr~nhmb_Hhrnkuyh*)M6YaMDP z=c98Wi3Qj!?0uHs^$fprtCZWW;dkjpJwMwFAr}%$tZKPktHU8HgF5^;>@q1$8nsD* zU}`#K8sAkubMfGz6AR0SCYqB)s~bd|hIl0wEyXw|S4+<yA9(ok?yo<(@bvxjZ{A<O zae4m4dUJL%)*AG+hC&0iKqg5gBSbDqrDM)~hN@SCg9G8g!DuQ&(5!v%f=(X{*yVgp zw?N+~1O-Z)n#wR}%)>Wowo3b1g#4nvoh?>Y`XCuA)N+SjWKs5m;yyquw`c(;0ug2d zjsUpPOqnsp0y`Axa$s_)nXHCUuUVkx@>N`=Ng)DdLW7)hbZ_SBM(eG62cEvY@${Xu zkMAA6erea*f$H=`xY=M@t#G~SE9dB9nj9<#Y6VZNK(`v<naRxDY@s#~^o2}L8Zf)m zYO`1b^a%hSSKG&j#Auu{2Z?@IwMEkVoT&Sk{Pr!9ZdM4z=AZv_LKp|a*omYUBrQTv z&euz%MwJeQ%pM0GA}kalHSo0-1&jkan_3D=#Gpi=7xQ$YoeEx?xQBCYy?p2D%=-@y zfAr|s)3?t&zI*t>#>An$<?)f==xAhSHa9Vzm>7<=>i+S;@NnJNsxwog@s*{@{=I{X z%hhVbPX~>NQ>iowC9r_ih%OaZX46_DZY^o;)=M`Dce2$c?`6eL04wBHJxp2AFu|G) zI>lHROa#ii75#l0k=6m@Vao1z%8ZI0MNgNkt5?D0s`|NVz64Q8OqxzPZ-<QcEN>_0 zm5ZZq-Cg<c^~3K!So`d)jW_SDojpFhvXq;diY@Q195^(*dT4n6a&>7YGu;Y}HGESe z;oS@QwS&#|wUNs&?A^aMnkc$qTq#F{Vpzo0@jBH!nFBC|+)BdCZr<PUcWjmQuwGta z2V@ql+^mJ&W;{$_A(x4^DlIy8z<j;5Pa_7L7Mq{YVa5)2Wkoytv?2+jmRj@zSly$Q zbgIN{QeL}CyhXy}eE9mIPam&;@No6R*VkEiJbZQa0;}Q6g{g_y%xregzQKL_nk$RN z!HT=idcBd*o`w9O{R792jvhZbb>ro=Lno$6Lt)sd5&(TXfY)yj3C(IPWi<u~zE#(z z?(YOdJd={evDBhf+VlVh*}M*Slq91R=6Aww3lZ}eNqfIu-Vew%m`P;RcB{oaP}!@K zb+VGF5VXno&k1`s33@k+dCv&Ao23HIuirWT`IDm`JXmEX{myGgUb}tp=xSqjD&86j zj*P`;7b?qp24-223jp;BvA8R<ez<k?$moevQ>V`Ey7toHBWLEzBQX$H^=W#z+J2!) z$p%C<X=TUUYgBZ@QV9;ooglk;EH>DMW2udb(cZY1Eq^NLPlqDqG!~-y24#m*z=PCW zgGzt^0wd6&lxz}kpW*jB%kTZ`zOMhp?R-Yq|5rUbH%SElA2LAAYnZa0NB{r;07*qo IM6N<$f=G;?=l}o! literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/stamenToner.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/stamenToner.png new file mode 100644 index 0000000000000000000000000000000000000000..af894096c891f908ea13939d7b41574a5d9228a9 GIT binary patch literal 4119 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 Tbyfe%DgZgKvUIJaaq#~EEV0_J literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png b/web/assets/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png new file mode 100644 index 0000000000000000000000000000000000000000..552130eb52c29237b125b2febfbecab41bd41c07 GIT binary patch literal 10806 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/Mouse.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/Mouse.svg new file mode 100644 index 00000000..7fae028c --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/Mouse.svg @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="29.6875" + height="40.625095" + viewBox="0 0 29.6875 40.625095" + enable-background="new 0 0 64 64" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="Mouse.svg"><metadata + id="metadata21"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs19" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="747" + inkscape:window-height="596" + id="namedview17" + showgrid="false" + inkscape:zoom="1.84375" + inkscape:cx="-37.919388" + inkscape:cy="92.305679" + inkscape:window-x="266" + inkscape:window-y="72" + inkscape:window-maximized="0" + inkscape:current-layer="Layer_1" + inkscape:snap-center="false" + inkscape:snap-page="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<g + id="g3" + transform="translate(-17.15625,-19.531154)"> + <g + id="g5" + style="fill:#4d4d4d;stroke:#4d4d4d"> + <path + d="M 31.9335,20.041 C 24.639,20.034 17.653,20.318 17.653,44.617 c 0,10.951 8.799,15.032 14.347,15.032 5.545,0 14.347,-4.081 14.347,-15.032 0,-24.27 -7.119,-24.569 -14.4135,-24.576 z m 0.7515,1.358 c 5.643,0.012 10.927,0.236 12.063,16.153 -3.86,1.805 -7.916,2.765 -12.063,2.86 l 0,-2.966 c 0.845,-0.162 1.481,-0.909 1.481,-1.782 l 0,-8.956 c 0,-0.876 -0.637,-1.621 -1.481,-1.784 z m -1.027,4.855 0.685,0 c 0.249,0 0.453,0.205 0.453,0.454 l 0,8.956 c 0,0.249 -0.204,0.449 -0.453,0.449 l -0.685,0 c -0.249,0 -0.452,-0.2 -0.452,-0.449 l 0,-8.956 c 0,-0.249 0.203,-0.454 0.452,-0.454 z m -0.345,-4.855 0,3.525 c -0.845,0.163 -1.479,0.91 -1.479,1.784 l 0,8.956 c 0,0.873 0.634,1.62 1.479,1.782 l 0,2.966 C 25.002,40.264 20.408,38.16 19.25,37.573 20.381,21.633 25.668,21.411 31.313,21.399 z M 32,58.274 c -5.016,0 -12.976,-3.707 -12.976,-13.658 0,-1.983 0.045,-3.853 0.134,-5.563 2.003,0.929 6.696,2.74 12.868,2.74 4.394,0 8.704,-0.934 12.813,-2.771 0.089,1.718 0.135,3.6 0.135,5.595 0,9.95 -7.958,13.657 -12.974,13.657 z" + id="path7" + style="fill:#4d4d4d;stroke:#4d4d4d" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssscccccssccsssssssssccssccccsscscss" /> + </g> + + +<path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 32.922034,38.950793 c 0,-1.135825 0.114919,-1.458045 0.677966,-1.900938 l 0.677966,-0.533288 0,-5.28078 c 0,-5.271249 -0.0012,-5.282003 -0.677966,-5.958745 -0.557439,-0.557439 -0.677966,-0.940935 -0.677966,-2.157165 l 0,-1.479199 1.535487,0 c 5.657554,0 8.584338,3.728529 9.71855,12.380791 0.498434,3.802265 0.50348,3.525731 -0.0676,3.704572 -0.261017,0.08174 -1.528694,0.512016 -2.817059,0.956167 -2.037206,0.702306 -4.048032,1.113044 -7.488026,1.529528 l -0.881356,0.106707 0,-1.36765 z" + id="path3768" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 31.485081,35.842143 c -0.104591,-0.104591 -0.190166,-2.231347 -0.190166,-4.726123 0,-3.983994 0.05502,-4.557071 0.452127,-4.709456 0.24867,-0.09542 0.556802,-0.06882 0.684738,0.05912 0.127937,0.127936 0.199056,2.296481 0.158043,4.818988 -0.06319,3.886405 -0.13867,4.598683 -0.494572,4.667009 -0.231003,0.04435 -0.505579,-0.0049 -0.61017,-0.109533 l 0,0 z" + id="path3770" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 30.440433,57.945316 c -3.064053,-0.42113 -6.77723,-2.474953 -8.457621,-4.67806 -2.1588,-2.830333 -3.113918,-6.737716 -2.769592,-11.330385 l 0.193121,-2.575872 2.07988,0.735628 c 3.527026,1.247466 6.337701,1.719068 10.215474,1.71405 4.171771,-0.0054 6.642981,-0.38868 10.25836,-1.591058 2.178973,-0.724668 2.692193,-0.815856 2.813444,-0.499883 0.08157,0.21256 0.08664,2.119864 0.01127,4.238453 -0.106217,2.98581 -0.266531,4.212938 -0.712935,5.457208 -1.450217,4.042206 -4.401118,6.844156 -8.437938,8.012017 -2.314747,0.669661 -3.34314,0.772215 -5.193465,0.517902 z" + id="path3772" + inkscape:connector-curvature="0" /></g> +<path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644;stroke-opacity:1" + d="M 11.584306,20.532528 C 9.1265112,20.247533 6.2927846,19.555647 4.1047676,18.706316 c -0.969492,-0.376332 -1.792939,-0.704961 -1.829884,-0.730287 -0.152564,-0.104584 0.766016,-6.242541 1.16801,-7.804656 1.421191,-5.5226316 4.304477,-8.0618496 9.1542404,-8.0618496 l 1.541531,0 0,1.627119 c 0,1.237125 -0.09381,1.627118 -0.391402,1.627118 -0.215271,0 -0.581373,0.271221 -0.813559,0.602714 -0.345889,0.493826 -0.422157,1.5275241 -0.422157,5.7217066 l 0,5.118992 0.813559,0.759978 c 0.675846,0.631335 0.813559,0.971083 0.813559,2.007108 0,0.835921 -0.111771,1.235378 -0.338983,1.211489 -0.18644,-0.0196 -1.18336,-0.133551 -2.215376,-0.25322 l 0,0 z" + id="path3766" + inkscape:connector-curvature="0" /></svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseLeft.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseLeft.svg new file mode 100644 index 00000000..0c49c15f --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseLeft.svg @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="64px" + height="64px" + viewBox="0 0 64 64" + enable-background="new 0 0 64 64" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="MouseLeft.svg"><metadata + id="metadata21"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs19" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1282" + inkscape:window-height="886" + id="namedview17" + showgrid="false" + inkscape:zoom="3.6875" + inkscape:cx="-10.305085" + inkscape:cy="32" + inkscape:window-x="104" + inkscape:window-y="136" + inkscape:window-maximized="0" + inkscape:current-layer="g3" /> +<g + id="g3"> + <g + id="g5" + style="fill:#4d4d4d;stroke:#4d4d4d"> + <path + fill="#020202" + d="M32.854,20.028c-0.015-1.274,0.576-2.269,1.151-3.236c0.758-1.278,1.543-2.6,0.997-4.417 c-0.555-1.667-1.607-2.485-2.539-3.212c-1.254-0.973-2.159-1.676-1.687-4.343l0.041-0.229l-1.35-0.238L29.427,4.58 c-0.615,3.484,0.878,4.643,2.195,5.666c0.85,0.663,1.653,1.288,2.072,2.542c0.366,1.224-0.18,2.143-0.869,3.306 c-0.641,1.081-1.366,2.3-1.349,3.933c-6.837,0.007-13.823,0.291-13.823,24.59c0,10.951,8.799,15.032,14.347,15.032 c5.545,0,14.347-4.081,14.347-15.032C46.347,20.347,39.228,20.048,32.854,20.028z M32.685,21.399 c5.643,0.012,10.927,0.236,12.063,16.153c-3.86,1.805-7.916,2.765-12.063,2.86v-2.966c0.845-0.162,1.481-0.909,1.481-1.782v-8.956 c0-0.876-0.637-1.621-1.481-1.784V21.399z M31.658,26.254h0.685c0.249,0,0.453,0.205,0.453,0.454v8.956 c0,0.249-0.204,0.449-0.453,0.449h-0.685c-0.249,0-0.452-0.2-0.452-0.449v-8.956C31.206,26.459,31.409,26.254,31.658,26.254z M31.313,21.399v3.525c-0.845,0.163-1.479,0.91-1.479,1.784v8.956c0,0.873,0.634,1.62,1.479,1.782v2.966 c-6.311-0.148-10.905-2.252-12.063-2.839C20.381,21.633,25.668,21.411,31.313,21.399z M32,58.274 c-5.016,0-12.976-3.707-12.976-13.658c0-1.983,0.045-3.853,0.134-5.563c2.003,0.929,6.696,2.74,12.868,2.74 c4.394,0,8.704-0.934,12.813-2.771c0.089,1.718,0.135,3.6,0.135,5.595C44.974,54.567,37.016,58.274,32,58.274z" + id="path7" + style="fill:#4d4d4d;stroke:#4d4d4d" /> + </g> + + +<path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 32.922034,38.950793 c 0,-1.135825 0.114919,-1.458045 0.677966,-1.900938 l 0.677966,-0.533288 0,-5.28078 c 0,-5.271249 -0.0012,-5.282003 -0.677966,-5.958745 -0.557439,-0.557439 -0.677966,-0.940935 -0.677966,-2.157165 l 0,-1.479199 1.535487,0 c 5.657554,0 8.584338,3.728529 9.71855,12.380791 0.498434,3.802265 0.50348,3.525731 -0.0676,3.704572 -0.261017,0.08174 -1.528694,0.512016 -2.817059,0.956167 -2.037206,0.702306 -4.048032,1.113044 -7.488026,1.529528 l -0.881356,0.106707 0,-1.36765 z" + id="path3768" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 31.485081,35.842143 c -0.104591,-0.104591 -0.190166,-2.231347 -0.190166,-4.726123 0,-3.983994 0.05502,-4.557071 0.452127,-4.709456 0.24867,-0.09542 0.556802,-0.06882 0.684738,0.05912 0.127937,0.127936 0.199056,2.296481 0.158043,4.818988 -0.06319,3.886405 -0.13867,4.598683 -0.494572,4.667009 -0.231003,0.04435 -0.505579,-0.0049 -0.61017,-0.109533 l 0,0 z" + id="path3770" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 30.440433,57.945316 c -3.064053,-0.42113 -6.77723,-2.474953 -8.457621,-4.67806 -2.1588,-2.830333 -3.113918,-6.737716 -2.769592,-11.330385 l 0.193121,-2.575872 2.07988,0.735628 c 3.527026,1.247466 6.337701,1.719068 10.215474,1.71405 4.171771,-0.0054 6.642981,-0.38868 10.25836,-1.591058 2.178973,-0.724668 2.692193,-0.815856 2.813444,-0.499883 0.08157,0.21256 0.08664,2.119864 0.01127,4.238453 -0.106217,2.98581 -0.266531,4.212938 -0.712935,5.457208 -1.450217,4.042206 -4.401118,6.844156 -8.437938,8.012017 -2.314747,0.669661 -3.34314,0.772215 -5.193465,0.517902 z" + id="path3772" + inkscape:connector-curvature="0" /></g> +<path + style="fill:#66CCFF;stroke:#66CCFF;stroke-width:0.27118643999999997" + d="m 28.740556,40.063682 c -2.457795,-0.284995 -5.291522,-0.976881 -7.479539,-1.826212 -0.969492,-0.376332 -1.792939,-0.704961 -1.829884,-0.730287 -0.152564,-0.104584 0.766016,-6.242541 1.16801,-7.804656 1.421191,-5.522631 4.304477,-8.061849 9.154241,-8.061849 l 1.541531,0 0,1.627119 c 0,1.237125 -0.09381,1.627118 -0.391402,1.627118 -0.215271,0 -0.581373,0.271221 -0.813559,0.602714 -0.345889,0.493826 -0.422157,1.527524 -0.422157,5.721706 l 0,5.118992 0.813559,0.759978 c 0.675846,0.631335 0.813559,0.971083 0.813559,2.007108 0,0.835921 -0.111771,1.235378 -0.338983,1.211489 -0.18644,-0.0196 -1.18336,-0.133551 -2.215376,-0.25322 l 0,0 z" + id="path3766" + inkscape:connector-curvature="0" /></svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg new file mode 100644 index 00000000..9dd533d5 --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="64px" + height="64px" + viewBox="0 0 64 64" + enable-background="new 0 0 64 64" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="MouseMiddle.svg"><metadata + id="metadata21"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs19" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1282" + inkscape:window-height="886" + id="namedview17" + showgrid="false" + inkscape:zoom="3.6875" + inkscape:cx="-10.305085" + inkscape:cy="32" + inkscape:window-x="31" + inkscape:window-y="15" + inkscape:window-maximized="0" + inkscape:current-layer="g3" /> +<g + id="g3"> + <g + id="g5" + style="stroke:#4d4d4d;fill:#4d4d4d"> + <path + fill="#020202" + d="M32.854,20.028c-0.015-1.274,0.576-2.269,1.151-3.236c0.758-1.278,1.543-2.6,0.997-4.417 c-0.555-1.667-1.607-2.485-2.539-3.212c-1.254-0.973-2.159-1.676-1.687-4.343l0.041-0.229l-1.35-0.238L29.427,4.58 c-0.615,3.484,0.878,4.643,2.195,5.666c0.85,0.663,1.653,1.288,2.072,2.542c0.366,1.224-0.18,2.143-0.869,3.306 c-0.641,1.081-1.366,2.3-1.349,3.933c-6.837,0.007-13.823,0.291-13.823,24.59c0,10.951,8.799,15.032,14.347,15.032 c5.545,0,14.347-4.081,14.347-15.032C46.347,20.347,39.228,20.048,32.854,20.028z M32.685,21.399 c5.643,0.012,10.927,0.236,12.063,16.153c-3.86,1.805-7.916,2.765-12.063,2.86v-2.966c0.845-0.162,1.481-0.909,1.481-1.782v-8.956 c0-0.876-0.637-1.621-1.481-1.784V21.399z M31.658,26.254h0.685c0.249,0,0.453,0.205,0.453,0.454v8.956 c0,0.249-0.204,0.449-0.453,0.449h-0.685c-0.249,0-0.452-0.2-0.452-0.449v-8.956C31.206,26.459,31.409,26.254,31.658,26.254z M31.313,21.399v3.525c-0.845,0.163-1.479,0.91-1.479,1.784v8.956c0,0.873,0.634,1.62,1.479,1.782v2.966 c-6.311-0.148-10.905-2.252-12.063-2.839C20.381,21.633,25.668,21.411,31.313,21.399z M32,58.274 c-5.016,0-12.976-3.707-12.976-13.658c0-1.983,0.045-3.853,0.134-5.563c2.003,0.929,6.696,2.74,12.868,2.74 c4.394,0,8.704-0.934,12.813-2.771c0.089,1.718,0.135,3.6,0.135,5.595C44.974,54.567,37.016,58.274,32,58.274z" + id="path7" + style="stroke:#4d4d4d;fill:#4d4d4d" /> + </g> + + +<path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118643999999997" + d="m 32.922034,38.950793 c 0,-1.135825 0.114919,-1.458045 0.677966,-1.900938 l 0.677966,-0.533288 0,-5.28078 c 0,-5.271249 -0.0012,-5.282003 -0.677966,-5.958745 -0.557439,-0.557439 -0.677966,-0.940935 -0.677966,-2.157165 l 0,-1.479199 1.535487,0 c 5.657554,0 8.584338,3.728529 9.71855,12.380791 0.498434,3.802265 0.50348,3.525731 -0.0676,3.704572 -0.261017,0.08174 -1.528694,0.512016 -2.817059,0.956167 -2.037206,0.702306 -4.048032,1.113044 -7.488026,1.529528 l -0.881356,0.106707 0,-1.36765 z" + id="path3768" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 30.440433,57.945316 c -3.064053,-0.42113 -6.77723,-2.474953 -8.457621,-4.67806 -2.1588,-2.830333 -3.113918,-6.737716 -2.769592,-11.330385 l 0.193121,-2.575872 2.07988,0.735628 c 3.527026,1.247466 6.337701,1.719068 10.215474,1.71405 4.171771,-0.0054 6.642981,-0.38868 10.25836,-1.591058 2.178973,-0.724668 2.692193,-0.815856 2.813444,-0.499883 0.08157,0.21256 0.08664,2.119864 0.01127,4.238453 -0.106217,2.98581 -0.266531,4.212938 -0.712935,5.457208 -1.450217,4.042206 -4.401118,6.844156 -8.437938,8.012017 -2.314747,0.669661 -3.34314,0.772215 -5.193465,0.517902 z" + id="path3772" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 28.740556,40.063682 c -2.457795,-0.284995 -5.291522,-0.976881 -7.479539,-1.826212 -0.969492,-0.376332 -1.792939,-0.704961 -1.829884,-0.730287 -0.152564,-0.104584 0.766016,-6.242541 1.16801,-7.804656 1.421191,-5.522631 4.304477,-8.061849 9.154241,-8.061849 l 1.541531,0 0,1.627119 c 0,1.237125 -0.09381,1.627118 -0.391402,1.627118 -0.215271,0 -0.581373,0.271221 -0.813559,0.602714 -0.345889,0.493826 -0.422157,1.527524 -0.422157,5.721706 l 0,5.118992 0.813559,0.759978 c 0.675846,0.631335 0.813559,0.971083 0.813559,2.007108 0,0.835921 -0.111771,1.235378 -0.338983,1.211489 -0.18644,-0.0196 -1.18336,-0.133551 -2.215376,-0.25322 l 0,0 z" + id="path3778" + inkscape:connector-curvature="0" /><path + style="fill:#ffd800;stroke:#ffd800;stroke-width:0.33870965" + d="m 31.356243,35.809264 c -0.164314,-0.103856 -0.298753,-2.215682 -0.298753,-4.692945 0,-3.956026 0.08644,-4.52508 0.710296,-4.676395 0.390663,-0.09475 0.87474,-0.06834 1.075729,0.0587 0.200991,0.127038 0.312719,2.28036 0.248288,4.785159 -0.09927,3.859122 -0.217853,4.566401 -0.776977,4.634247 -0.362909,0.04404 -0.79427,-0.0049 -0.958583,-0.108765 l 0,0 z" + id="path3770" + inkscape:connector-curvature="0" /></g> +</svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseRight.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseRight.svg new file mode 100644 index 00000000..2662ad18 --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/MouseRight.svg @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="64px" + height="64px" + viewBox="0 0 64 64" + enable-background="new 0 0 64 64" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="MouseRight.svg"><metadata + id="metadata21"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs19" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1282" + inkscape:window-height="886" + id="namedview17" + showgrid="false" + inkscape:zoom="3.6875" + inkscape:cx="32" + inkscape:cy="32" + inkscape:window-x="31" + inkscape:window-y="15" + inkscape:window-maximized="0" + inkscape:current-layer="g3" /> +<g + id="g3"> + <g + id="g5" + style="stroke:#4d4d4d;fill:#4d4d4d"> + <path + fill="#020202" + d="M32.854,20.028c-0.015-1.274,0.576-2.269,1.151-3.236c0.758-1.278,1.543-2.6,0.997-4.417 c-0.555-1.667-1.607-2.485-2.539-3.212c-1.254-0.973-2.159-1.676-1.687-4.343l0.041-0.229l-1.35-0.238L29.427,4.58 c-0.615,3.484,0.878,4.643,2.195,5.666c0.85,0.663,1.653,1.288,2.072,2.542c0.366,1.224-0.18,2.143-0.869,3.306 c-0.641,1.081-1.366,2.3-1.349,3.933c-6.837,0.007-13.823,0.291-13.823,24.59c0,10.951,8.799,15.032,14.347,15.032 c5.545,0,14.347-4.081,14.347-15.032C46.347,20.347,39.228,20.048,32.854,20.028z M32.685,21.399 c5.643,0.012,10.927,0.236,12.063,16.153c-3.86,1.805-7.916,2.765-12.063,2.86v-2.966c0.845-0.162,1.481-0.909,1.481-1.782v-8.956 c0-0.876-0.637-1.621-1.481-1.784V21.399z M31.658,26.254h0.685c0.249,0,0.453,0.205,0.453,0.454v8.956 c0,0.249-0.204,0.449-0.453,0.449h-0.685c-0.249,0-0.452-0.2-0.452-0.449v-8.956C31.206,26.459,31.409,26.254,31.658,26.254z M31.313,21.399v3.525c-0.845,0.163-1.479,0.91-1.479,1.784v8.956c0,0.873,0.634,1.62,1.479,1.782v2.966 c-6.311-0.148-10.905-2.252-12.063-2.839C20.381,21.633,25.668,21.411,31.313,21.399z M32,58.274 c-5.016,0-12.976-3.707-12.976-13.658c0-1.983,0.045-3.853,0.134-5.563c2.003,0.929,6.696,2.74,12.868,2.74 c4.394,0,8.704-0.934,12.813-2.771c0.089,1.718,0.135,3.6,0.135,5.595C44.974,54.567,37.016,58.274,32,58.274z" + id="path7" + style="stroke:#4d4d4d;fill:#4d4d4d" /> + </g> + + +<path + style="fill:#65FD00;stroke:#65FD00;stroke-width:0.27118643999999997" + d="m 32.922034,38.950793 c 0,-1.135825 0.114919,-1.458045 0.677966,-1.900938 l 0.677966,-0.533288 0,-5.28078 c 0,-5.271249 -0.0012,-5.282003 -0.677966,-5.958745 -0.557439,-0.557439 -0.677966,-0.940935 -0.677966,-2.157165 l 0,-1.479199 1.535487,0 c 5.657554,0 8.584338,3.728529 9.71855,12.380791 0.498434,3.802265 0.50348,3.525731 -0.0676,3.704572 -0.261017,0.08174 -1.528694,0.512016 -2.817059,0.956167 -2.037206,0.702306 -4.048032,1.113044 -7.488026,1.529528 l -0.881356,0.106707 0,-1.36765 z" + id="path3768" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 31.485081,35.842143 c -0.104591,-0.104591 -0.190166,-2.231347 -0.190166,-4.726123 0,-3.983994 0.05502,-4.557071 0.452127,-4.709456 0.24867,-0.09542 0.556802,-0.06882 0.684738,0.05912 0.127937,0.127936 0.199056,2.296481 0.158043,4.818988 -0.06319,3.886405 -0.13867,4.598683 -0.494572,4.667009 -0.231003,0.04435 -0.505579,-0.0049 -0.61017,-0.109533 l 0,0 z" + id="path3770" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 30.440433,57.945316 c -3.064053,-0.42113 -6.77723,-2.474953 -8.457621,-4.67806 -2.1588,-2.830333 -3.113918,-6.737716 -2.769592,-11.330385 l 0.193121,-2.575872 2.07988,0.735628 c 3.527026,1.247466 6.337701,1.719068 10.215474,1.71405 4.171771,-0.0054 6.642981,-0.38868 10.25836,-1.591058 2.178973,-0.724668 2.692193,-0.815856 2.813444,-0.499883 0.08157,0.21256 0.08664,2.119864 0.01127,4.238453 -0.106217,2.98581 -0.266531,4.212938 -0.712935,5.457208 -1.450217,4.042206 -4.401118,6.844156 -8.437938,8.012017 -2.314747,0.669661 -3.34314,0.772215 -5.193465,0.517902 z" + id="path3772" + inkscape:connector-curvature="0" /><path + style="fill:#ffffff;stroke:#ffffff;stroke-width:0.27118644" + d="m 28.740556,40.063682 c -2.457795,-0.284995 -5.291522,-0.976881 -7.479539,-1.826212 -0.969492,-0.376332 -1.792939,-0.704961 -1.829884,-0.730287 -0.152564,-0.104584 0.766016,-6.242541 1.16801,-7.804656 1.421191,-5.522631 4.304477,-8.061849 9.154241,-8.061849 l 1.541531,0 0,1.627119 c 0,1.237125 -0.09381,1.627118 -0.391402,1.627118 -0.215271,0 -0.581373,0.271221 -0.813559,0.602714 -0.345889,0.493826 -0.422157,1.527524 -0.422157,5.721706 l 0,5.118992 0.813559,0.759978 c 0.675846,0.631335 0.813559,0.971083 0.813559,2.007108 0,0.835921 -0.111771,1.235378 -0.338983,1.211489 -0.18644,-0.0196 -1.18336,-0.133551 -2.215376,-0.25322 l 0,0 z" + id="path3778" + inkscape:connector-curvature="0" /></g> +</svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/Touch.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/Touch.svg new file mode 100644 index 00000000..e682b301 --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/Touch.svg @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Capa_1" + x="0px" + y="0px" + width="76.664284" + height="128.25087" + viewBox="0 0 76.664283 128.25086" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="Touch.svg"><metadata + id="metadata3468"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs3466" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="920" + inkscape:window-height="780" + id="namedview3464" + showgrid="false" + inkscape:zoom="1.7688899" + inkscape:cx="-0.07794217" + inkscape:cy="94.239301" + inkscape:window-x="1529" + inkscape:window-y="186" + inkscape:window-maximized="0" + inkscape:current-layer="g3428" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<g + id="g3428" + transform="translate(-7.9878665e-4,-5.1661327)"> + + <path + d="M 76.151,80.896 C 77.465,66.89 62.145,65.577 62.145,65.577 57.771,52.885 46.39,59.45 46.39,59.45 40.701,46.758 29.322,55.511 29.322,55.511 27.912,55.092 25.613,11.796 24.414,11.604 23.44,7.068 14.011,-1.728 12.511,14.772 c 0,36.5 -1.135,47.304 -1.135,47.304 C 9.188,67.328 5.31,80.458 5.31,80.458 -3.006,89.649 0.933,96.214 0.933,96.214 c 7.002,12.255 21.385,28.449 21.385,28.449 6.129,5.252 2.627,8.316 2.627,8.316 l 42.455,0.438 2.334,-7.878 c 9.628,-18.382 6.417,-44.643 6.417,-44.643 z" + id="path3432" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccc" + style="fill:#ffffff;fill-opacity:1" /> +</g> +<g + id="g3434" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3436" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3438" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3440" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3442" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3444" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3446" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3448" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3450" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3452" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3454" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3456" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3458" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3460" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +<g + id="g3462" + transform="translate(-7.9878665e-4,-5.1661327)"> +</g> +</svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchDrag.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchDrag.svg new file mode 100644 index 00000000..f0509e85 --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchDrag.svg @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Capa_1" + x="0px" + y="0px" + width="76.664284" + height="133.41701" + viewBox="0 0 76.664283 133.417" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="TouchDrag.svg"><metadata + id="metadata3468"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs3466" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="920" + inkscape:window-height="780" + id="namedview3464" + showgrid="false" + inkscape:zoom="1.7688899" + inkscape:cx="-0.077942171" + inkscape:cy="94.239298" + inkscape:window-x="161" + inkscape:window-y="225" + inkscape:window-maximized="0" + inkscape:current-layer="g3428" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<g + id="g3428" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="M 18.653,0 C 12.359,0 7.258,5.102 7.258,11.395 c 0,6.293 5.102,11.395 11.396,11.395 6.293,0 11.395,-5.102 11.395,-11.395 C 30.048,5.102 24.946,0 18.653,0 z m 0,20.43 c -4.989,0 -9.036,-4.046 -9.036,-9.036 0,-4.989 4.047,-9.035 9.036,-9.035 4.989,0 9.035,4.046 9.035,9.035 0,4.99 -4.045,9.036 -9.035,9.036 z" + id="path3430" + inkscape:connector-curvature="0" /> + <path + d="M 76.151,80.896 C 77.465,66.89 62.145,65.577 62.145,65.577 57.771,52.885 46.39,59.45 46.39,59.45 40.701,46.758 29.322,55.511 29.322,55.511 27.912,55.092 25.613,11.796 24.414,11.604 23.44,7.068 14.011,-1.728 12.511,14.772 c 0,36.5 -1.135,47.304 -1.135,47.304 C 9.188,67.328 5.31,80.458 5.31,80.458 -3.006,89.649 0.933,96.214 0.933,96.214 c 7.002,12.255 21.385,28.449 21.385,28.449 6.129,5.252 2.627,8.316 2.627,8.316 l 42.455,0.438 2.334,-7.878 c 9.628,-18.382 6.417,-44.643 6.417,-44.643 z" + id="path3432" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccc" + style="fill:#ffffff;fill-opacity:1" /> +<path + d="m 65.247258,98.823749 c -0.681067,0.71969 -7.149935,7.376421 -7.149935,7.376421 0,0 -0.86404,0.92222 -0.86404,-0.29705 0.0013,-1.22468 0.0013,-3.17039 0.0013,-3.17039 0,0 -0.498094,0.003 -1.261753,0.002 -2.35324,0.002 -6.936466,0.002 -8.692502,0.002 0,0 -0.07751,-0.007 -0.162642,-0.0472 0,0.0378 0,0.0972 0,0.13232 0.01652,0.0891 0.0013,0.16068 0,0.16608 0,0.0149 0,0.0419 0,0.0554 0,0 0.01779,0.077 0,0.17013 0,2.02673 0,6.49066 0,8.99672 0.0013,0.90332 0,1.49203 0,1.49203 0,0 2.283354,0.002 3.229986,0 0.942821,0 0.07751,0.87225 0.07751,0.87225 l -7.121981,7.36157 c 0,0 -0.470139,0.5833 -0.963151,0.0607 -0.677255,-0.72374 -6.941548,-7.59515 -6.941548,-7.59515 0,0 -0.867853,-0.91952 0.280812,-0.91952 1.151207,0.002 2.983481,0.002 2.983481,0.002 0,0 -0.0026,-0.52929 -0.0013,-1.34079 -0.0013,-2.50067 -0.0013,-7.37102 -0.0013,-9.23572 l 0,-0.004 c 0,-0.0567 0,-0.14582 0,-0.21333 -0.08259,0.0392 -0.15883,0.0459 -0.15883,0.0459 -1.756036,0 -6.339262,0 -8.696314,-0.002 -0.759847,0.002 -1.260482,0 -1.260482,0 0,0 0.0026,1.94706 0.0026,3.17039 -0.0013,1.21793 -0.864041,0.29975 -0.864041,0.29975 0,0 -6.467597,-6.655381 -7.147393,-7.377761 -0.493012,-0.52525 0.05464,-1.02484 0.05464,-1.02484 l 6.927571,-7.566801 c 0,0 0.82338,-0.92357 0.82211,0.08236 0.0026,1.004586 0.0026,3.432334 0.0026,3.432334 0,0 0.552732,-0.0014 1.402796,-0.0041 2.439643,0.0041 6.872933,0.0027 8.678524,0.0014 0,0 0.116899,-0.03106 0.23634,0.027 0,-4.084505 0,-8.204115 0.0013,-9.436893 -0.0013,-0.807449 0,-1.339448 0,-1.339448 0,0 -1.832274,0.0027 -2.983481,0.0027 -1.146124,-0.0014 -0.280813,-0.918169 -0.280813,-0.918169 0,0 6.261752,-6.872771 6.942819,-7.596505 0.494283,-0.522547 0.964422,0.05806 0.964422,0.05806 l 7.12071,7.361561 c 0,0 0.869123,0.874963 -0.07624,0.872261 -0.945362,0.0027 -3.229987,0.0027 -3.229987,0.0027 0,0 0.0013,0.587358 0.0038,1.492025 -0.0013,1.284087 -0.0026,5.419901 -0.0026,9.503056 0.120712,-0.06211 0.240153,-0.02835 0.240153,-0.02835 1.804319,0 6.237609,0 8.675982,0 0.851334,-0.0014 1.404066,0 1.404066,0 0,0 0.0013,-2.426399 0,-3.430985 0,-1.003235 0.820838,-0.08236 0.820838,-0.08236 l 6.927572,7.566803 c 0,0.001 0.546378,0.50094 0.05845,1.02484 z" + id="path3238" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccccccsscccccccccccccccccccccccccccccccc" + style="fill:#66ccff;fill-opacity:1" /></g> +<g + id="g3434" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3436" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3438" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3440" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3442" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3444" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3446" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3448" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3450" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3452" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3454" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3456" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3458" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3460" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +<g + id="g3462" + transform="translate(-7.9878665e-4,-2.9265169e-6)"> +</g> +</svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchRotate.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchRotate.svg new file mode 100644 index 00000000..fe968ff4 --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchRotate.svg @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Capa_1" + x="0px" + y="0px" + width="99.001816" + height="101.57817" + viewBox="0 0 99.001814 101.57817" + enable-background="new 0 0 100.775 118.638" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="TouchRotate.svg"><metadata + id="metadata3382"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs3380" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1105" + inkscape:window-height="739" + id="namedview3378" + showgrid="false" + inkscape:zoom="1.9873603" + inkscape:cx="11.856691" + inkscape:cy="15.112094" + inkscape:window-x="67" + inkscape:window-y="152" + inkscape:window-maximized="0" + inkscape:current-layer="Capa_1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + +<path + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="m 48.832974,0 c -5.85006,0 -10.591269,4.862311 -10.591269,10.85967 0,5.997358 4.742138,10.859669 10.592198,10.859669 5.849132,0 10.59127,-4.862311 10.59127,-10.859669 C 59.42425,4.862311 54.682106,0 48.832974,0 z m 0,19.47021 c -4.637107,0 -8.398657,-3.855921 -8.398657,-8.611493 0,-4.754621 3.76155,-8.610543 8.398657,-8.610543 4.637107,0 8.397729,3.855922 8.397729,8.610543 0,4.755572 -3.759691,8.611493 -8.397729,8.611493 z" + id="path3430" /><path + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="m 27.154761,39.321738 c -5.457398,0 -9.88037,4.703155 -9.88037,10.504205 0,5.801049 4.423839,10.504204 9.881237,10.504204 5.456532,0 9.880371,-4.703155 9.880371,-10.504204 -8.67e-4,-5.80105 -4.424707,-10.504205 -9.881238,-10.504205 z m 0,18.8329 c -4.325859,0 -7.834929,-3.729707 -7.834929,-8.329617 0,-4.598989 3.50907,-8.328696 7.834929,-8.328696 4.32586,0 7.834063,3.729707 7.834063,8.328696 0,4.59991 -3.507336,8.329617 -7.834063,8.329617 z" + id="path3430-5" /><path + d="M 93.394891,94.930552 91.5074,101.57817 52.728925,101.21032 c 8.08e-4,-8.5e-4 2.829619,-2.585988 -2.124439,-7.016318 0,0 -10.822746,-5.22596 -18.506953,-18.0968 0,0 -6.310236,-6.742109 -6.091889,-9.206596 -0.583067,-4.408398 -1.209805,-6.954724 -1.715239,-8.534999 -1.063849,-4.039774 -1.553525,-2.844172 -1.553525,-7.228104 2.452812,-14.333817 10.869455,1.810623 12.764445,5.488368 0,0 6.305384,7.578229 9.063029,9.283373 8.851152,-2.291524 3.039071,-22.109494 3.660956,-23.668675 0,0 -1.25024,-10.043558 -2.822341,-23.064577 -3.9949,-15.561935 8.286796,-19.626706 11.636292,-3.093053 1.545414,7.344522 3.686834,19.52689 4.483397,19.774098 0,0 8.395048,-7.385018 12.995707,3.323385 0,0 9.202125,-5.538975 12.741777,5.170273 0,0 12.387573,1.10695 11.326563,12.923992 0,0 2.595085,22.156743 -5.191814,37.665865 z" + id="path3376" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccc" + style="fill:#ffffff" /><path + d="m 36.857901,10.534807 -5.731265,12.511815 c 0,0 -0.666487,1.516584 -1.19043,0.316343 -0.52908,-1.19559 -1.800413,-4.092683 -1.800413,-4.092683 0,0 -0.774356,0.279126 -1.962218,0.711771 -3.412049,1.225827 -9.61846,3.462323 -12.145716,4.370646 0,0 -0.609983,0.412873 -1.019633,-0.532666 -0.419926,-0.944375 -3.7806092,-8.602891 -4.0798222,-9.279772 -0.294076,-0.674552 0.288938,-0.867615 0.288938,-0.867615 2.4553422,-0.886224 8.8659382,-3.19599 12.1688342,-4.381112 1.05816,-0.382636 1.763171,-0.631523 1.763171,-0.631523 0,0 -1.02734,-2.324887 -1.664289,-3.782156 -0.636951,-1.454944 1.049169,-0.79202 1.049169,-0.79202 0,0 12.534822,4.676522 13.866509,5.195231 0.963131,0.382636 0.457165,1.253741 0.457165,1.253741 z" + id="path9" + style="fill:#d800d8;fill-opacity:1" + inkscape:connector-curvature="0" /><g + id="g2997" + transform="matrix(0,-1,1,0,-0.01316643,45.882166)" + inkscape:transform-center-x="-4.9812271" + inkscape:transform-center-y="-4.2696251"><path + id="path2999" + d="M 6.6614176,0.14173229 19.48819,5.5984253 c 0,0 1.559055,0.6377953 0.354331,1.1338583 -1.240158,0.5314961 -4.181103,1.7716536 -4.181103,1.7716536 0,0 0.283465,0.7440945 0.744095,1.9133858 1.27559,3.259843 3.57874,9.248032 4.535433,11.692914 0,0 0.425197,0.566929 -0.566929,0.992126 -0.956693,0.389764 -8.751969,3.685039 -9.460631,4.003937 -0.673228,0.283464 -0.885827,-0.283465 -0.885827,-0.283465 C 9.1062996,24.448819 6.6968507,18.283465 5.4921262,15.094489 5.0669294,14.066929 4.8188979,13.393701 4.8188979,13.393701 c 0,0 -2.3740159,0.992126 -3.86220494,1.629921 -1.48818905,0.637796 -0.81496067,-0.992126 -0.81496067,-0.992126 0,0 4.71259861,-12.1535432 5.24409471,-13.42913378 0.3897638,-0.95669294 1.2755906,-0.46062993 1.2755906,-0.46062993 z" + style="fill:#d800d8;fill-opacity:1;fill-rule:nonzero;stroke:none" + inkscape:connector-curvature="0" /></g></svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchTilt.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchTilt.svg new file mode 100644 index 00000000..e1206c5d --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchTilt.svg @@ -0,0 +1,135 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Capa_1" + x="0px" + y="0px" + width="76.663582" + height="140.44" + viewBox="0 0 76.663581 140.44" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="TouchTilt.svg"><metadata + id="metadata3364"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs3362" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="766" + inkscape:window-height="480" + id="namedview3360" + showgrid="false" + inkscape:zoom="1.6804329" + inkscape:cx="6.1930652" + inkscape:cy="74.717535" + inkscape:window-x="343" + inkscape:window-y="203" + inkscape:window-maximized="0" + inkscape:current-layer="Capa_1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<g + id="g3322" + style="fill:#ffffff" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="m 12.622,5.815 c -6.294,0 -11.396,5.102 -11.396,11.395 0,6.293 5.102,11.395 11.396,11.395 6.293,0 11.395,-5.102 11.395,-11.395 0,-6.293 -5.102,-11.395 -11.395,-11.395 z m 0,20.431 c -4.99,0 -9.036,-4.046 -9.036,-9.036 0,-4.989 4.046,-9.035 9.036,-9.035 4.988,0 9.035,4.046 9.035,9.035 0,4.99 -4.047,9.036 -9.035,9.036 z" + id="path3324" + inkscape:connector-curvature="0" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="m 43.793,0 c -6.294,0 -11.396,5.102 -11.396,11.395 0,6.293 5.102,11.395 11.396,11.395 6.293,0 11.395,-5.102 11.395,-11.395 C 55.188,5.102 50.086,0 43.793,0 z m 0,20.43 c -4.99,0 -9.036,-4.046 -9.036,-9.036 0,-4.989 4.046,-9.035 9.036,-9.035 4.988,0 9.035,4.046 9.035,9.035 0,4.99 -4.047,9.036 -9.035,9.036 z" + id="path3326" + inkscape:connector-curvature="0" /> + <path + d="M 76.151,87.918 C 77.464,73.913 62.146,72.6 62.146,72.6 57.769,59.907 47.556,66.472 47.556,66.472 c 0,0 2.262,-49.025 1.395,-54.713 -0.51,-3.331 -6.383,-10.562 -9.998,-1.684 -2.137,6.166 -5.59,60.75 -9.465,56.874 C 24.984,62.447 20.611,18.817 19.414,18.626 18.438,14.09 9.011,5.294 7.511,21.794 c 3,39.5 3.865,47.304 3.865,47.304 C 9.187,74.35 5.31,87.481 5.31,87.481 c -8.316,9.191 -4.377,15.756 -4.377,15.756 7.002,12.255 21.385,28.449 21.385,28.449 6.127,5.252 2.625,8.316 2.625,8.316 l 42.455,0.438 2.334,-7.879 c 9.628,-18.382 6.419,-44.643 6.419,-44.643 z" + id="path3328" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccc" + style="fill:#ffffff" /> +</g> +<g + id="g3330" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3332" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3334" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3336" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3338" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3340" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3342" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3344" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3346" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3348" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3350" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3352" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3354" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3356" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<g + id="g3358" + transform="translate(-7.9878665e-4,-3.8214145e-7)"> +</g> +<path + inkscape:connector-curvature="0" + d="m 52.342987,124.78465 -8.980622,9.44613 c 0,0 -0.592129,0.74692 -1.214412,0.0786 -0.853927,-0.92772 -8.753091,-9.74549 -8.753091,-9.74549 0,0 -1.096535,-1.17966 0.352262,-1.17818 1.454279,10e-4 3.762485,10e-4 3.762485,10e-4 0,0 -0.0027,-0.67875 -0.0014,-1.72058 -0.0014,-3.20848 -0.0014,-9.4565 -0.0027,-11.8499 0,0 -0.01233,-0.56315 0.655179,-0.56019 0.672999,0 8.298029,0 9.238308,-0.003 0.937537,0.003 0.774428,0.66985 0.774428,0.66985 0,2.45861 0,8.50359 -0.0027,11.82767 0.0041,1.16039 0.0027,1.91472 0.0027,1.91472 0,0 2.879775,0.003 4.070886,0 1.192483,-10e-4 0.09869,1.11889 0.09869,1.11889 z m -0.09869,-37.828986 c -1.191111,0.003 -4.073627,0.003 -4.073627,0.003 0,0 0.0027,0.752845 0.0041,1.914716 -0.0041,3.327041 -0.0041,9.370556 -0.0014,11.83064 0,0 0.16174,0.66393 -0.774427,0.66096 -0.943021,0.006 -8.563939,0.003 -9.235567,0.004 -0.670257,-0.003 -0.65655,-0.56167 -0.65655,-0.56167 -0.0014,-2.393393 -0.0014,-8.642902 0.0014,-11.855831 -0.0014,-1.034421 0,-1.717613 0,-1.717613 0,0 -2.312318,0.003 -3.762486,0.0044 -1.444685,-0.003 -0.355003,-1.178173 -0.355003,-1.178173 0,0 7.896422,-8.81777 8.755832,-9.745488 0.622284,-0.671338 1.215783,0.07558 1.215783,0.07558 l 8.979252,9.444648 c 0,0 1.096534,1.121857 -0.09732,1.120375 z" + id="path3432" + sodipodi:nodetypes="ccccsccccccccccccccccccccccccc" + style="fill:#ffd800;fill-opacity:1" /></svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchZoom.svg b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchZoom.svg new file mode 100644 index 00000000..74e55d7c --- /dev/null +++ b/web/assets/Cesium/Widgets/Images/NavigationHelp/TouchZoom.svg @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Capa_1" + x="0px" + y="0px" + width="95.087433" + height="118.43173" + viewBox="0 0 95.087431 118.43173" + enable-background="new 0 0 100.775 118.638" + xml:space="preserve" + inkscape:version="0.48.4 r9939" + sodipodi:docname="TouchZoom.svg"><metadata + id="metadata3382"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs3380" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1105" + inkscape:window-height="739" + id="namedview3378" + showgrid="false" + inkscape:zoom="2.8132167" + inkscape:cx="10.565593" + inkscape:cy="72.192791" + inkscape:window-x="67" + inkscape:window-y="152" + inkscape:window-maximized="0" + inkscape:current-layer="Capa_1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + +<path + d="m 0.0436199,84.941029 c 0,0 -0.2799964,-1.323641 0.578786,-0.720397 0.8621957,0.601498 2.9536375,2.059778 2.9536375,2.059778 0,0 0.3431801,-0.517567 0.8707286,-1.316651 1.521209,-2.28009 4.281925,-6.427623 5.405325,-8.116707 0,0 0.187721,-0.53855 0.863902,-0.06295 0.682926,0.472104 6.206065,4.329377 6.692655,4.668591 0.483157,0.340966 0.220227,0.718649 0.220227,0.718649 -1.094368,1.641877 -3.948985,5.929292 -5.418977,8.132449 -0.469526,0.711655 -0.783654,1.178514 -0.783654,1.178514 0,0 1.678274,1.168023 2.728271,1.900661 1.043172,0.732637 -0.28341,0.987925 -0.28341,0.987925 0,0 -9.7470195,2.05628 -10.7936043,2.25911 -0.756328,0.145111 -0.8468168,-0.666198 -0.8468168,-0.666198 z" + id="path3376-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccc" + style="fill:#65ff00;fill-opacity:1" /><path + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="m 44.918594,16.853557 c -5.85006,0 -10.591269,4.862311 -10.591269,10.85967 0,5.997358 4.742138,10.859669 10.592198,10.859669 5.849132,0 10.59127,-4.862311 10.59127,-10.859669 -9.23e-4,-5.997359 -4.743067,-10.85967 -10.592199,-10.85967 z m 0,19.47021 c -4.637107,0 -8.398657,-3.855921 -8.398657,-8.611493 0,-4.754621 3.76155,-8.610543 8.398657,-8.610543 4.637107,0 8.397729,3.855922 8.397729,8.610543 0,4.755572 -3.759691,8.611493 -8.397729,8.611493 z" + id="path3430" /><path + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd" + d="m 23.240381,56.175295 c -5.457398,0 -9.88037,4.703155 -9.88037,10.504205 0,5.801049 4.423839,10.504204 9.881237,10.504204 5.456532,0 9.880371,-4.703155 9.880371,-10.504204 -8.67e-4,-5.80105 -4.424707,-10.504205 -9.881238,-10.504205 z m 0,18.8329 c -4.325859,0 -7.834929,-3.729707 -7.834929,-8.329617 0,-4.598989 3.50907,-8.328696 7.834929,-8.328696 4.32586,0 7.834063,3.729707 7.834063,8.328696 0,4.59991 -3.507336,8.329617 -7.834063,8.329617 z" + id="path3430-5" /><path + d="m 89.480511,111.78411 -1.887491,6.64762 -38.778475,-0.36785 c 8.08e-4,-8.5e-4 2.829619,-2.58599 -2.124439,-7.01632 0,0 -10.822746,-5.22596 -18.506953,-18.096801 0,0 -6.310236,-6.742109 -6.091889,-9.206596 C 21.508197,79.335765 20.881459,76.789439 20.376025,75.209164 19.312176,71.16939 18.8225,72.364992 18.8225,67.98106 c 2.452812,-14.333817 10.869455,1.810623 12.764445,5.488368 0,0 6.305384,7.578229 9.063029,9.283373 8.851152,-2.291524 3.039071,-22.109494 3.660956,-23.668675 0,0 -1.25024,-10.043558 -2.822341,-23.064577 -3.9949,-15.561935 8.286796,-19.626706 11.636292,-3.093053 1.545414,7.344522 3.686834,19.52689 4.483397,19.774098 0,0 8.395048,-7.385018 12.995707,3.323385 0,0 9.202125,-5.538975 12.741777,5.170273 0,0 12.387573,1.10695 11.326563,12.923992 0,0 2.59509,22.156743 -5.191814,37.665866 z" + id="path3376" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccccccccccccc" + style="fill:#ffffff" /><path + d="m 49.854025,14.903508 c 0.696314,0.466948 6.359531,4.268019 6.858144,4.604015 0.491619,0.334273 0.748797,-0.05343 0.748797,-0.05343 1.121449,-1.617954 4.044902,-5.844621 5.545997,-8.013953 0.488115,-0.703007 0.803031,-1.164787 0.803031,-1.164787 0,0 1.714536,1.152726 2.792243,1.876411 1.07596,0.721961 0.813533,-0.620302 0.813533,-0.620302 0,0 -1.732034,-9.8989818 -1.933227,-10.95349441 -0.150463,-0.7615853 -0.939496,-0.5513731 -0.939496,-0.5513731 L 53.458049,1.9374693 c 0,0 -1.336636,0.2136595 -0.454876,0.8046693 0.88876,0.5927325 3.02493,2.0297666 3.02493,2.0297666 0,0 -0.355152,0.5083037 -0.895757,1.2940169 -1.558825,2.2468717 -4.387811,6.3339699 -5.538999,7.9984459 -0.0018,0.0017 -0.433883,0.370456 0.260678,0.83914 z" + id="path3376-7-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccc" + style="fill:#65ff00;fill-opacity:1" /></svg> \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png b/web/assets/Cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png new file mode 100644 index 0000000000000000000000000000000000000000..16343ec24135b6250935b07399c51a4eeb214620 GIT binary patch literal 10080 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 CK-V|` literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png b/web/assets/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png new file mode 100644 index 0000000000000000000000000000000000000000..a36259bbecd3db15252723fbeb9d202907306d6a GIT binary patch literal 6173 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/TimelineIcons.png b/web/assets/Cesium/Widgets/Images/TimelineIcons.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a04556a8555469578401d47e8dd07ad3bbf228 GIT binary patch literal 781 zcmV+o1M>WdP)<h;3K|Lk000e1NJLTq001BW000mO1^@s6cL04^00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph? z5)&web1Xvu00NCkL_t(Y$HmpnOB7)o2k`Ga>#7^5Seeq2xT&Q@QV^>LBhXV(hd?9` z(V>G85nZ~h2WRTgA5a8h*QijcLxDjU6cK?|5G~HZ%*>6}UH4^Xb!X;z>0nMXyQ{bx z(Ol-4ndkGH?>zI&Gr)h|q}&r@&!*(rC>>r}<q!ZU7hnLG!BJZYG}U>P!Tv6Jqk_eH zR{&-7tzbScqzVrh0jS_$TtG+?I0XztARf;Gx`_wFJ$d0v@njvJzwuJcTO4XyN5|d< z%tX_ei)!d<_Ty_z$3kiaJ%{`dJ_@6TqP}lTIB)Lsk0!#lpLnj?{?%(W&)WeO4d!|p zb?UpTP59dN@bn@KQ=n#B%GE#D4+QtQ+Uvf*bHB^m0pbZ0TF#KNO(u_#F<i%`dON`J zW}jkdCK&PBoj9X*+v0!9@#PqTjn#^?V5#0Ukq%#aDjM6WP+lgWPA?+RUJVF=xfu;D z9Xr7p#h1@XFg=d&!z+1{(CLrVRpH%y1P}t9O@2&8V&IG-xTgX4#^2bUI13yL_>^?Q z0HX}M{1y17Mxnlspsb8TPpp6%SyYy1(A!?G6dG2ipZqju`|%fH+dr9{c6nETTi1H! z*g_J<iV42T@Nx8lq~5<MeHb|>(NzmZCX39Hh6e9!!S`B<C%HvhJrN}lH^DpvO(*UM z00^ACD>xxYEa~Vuuv-}#3T?O$73=c?JRZ3!)1(235VW^$2LQCS)PPe9B4y(C^#OUa zrL|a33KcnXbceG1GYe+%wa>}25dV=vUw1&+%KBc6FBl*+*emn23G?^jVrET1GZDIc zO5RF<Vm#TX$l2~%C6&wq0JMaT)4@8Wn7`cLdH{gu;7#G&{|o;MAwTPJv`aW700000 LNkvXXu0mjf4a8Z% literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/Images/info-loading.gif b/web/assets/Cesium/Widgets/Images/info-loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..8df10dd5103204269c65a5127154ae9d3ed8e95f GIT binary patch literal 723 zcmZ?wbhEHb6ky<H_`(1Jk1kJFkQLQXlNJ=<zH@Fekh^nDbzZt>Pjjq|g~s7+O$(-G zrzf~{)<;{IsvX$eaPRz-Ig>I(h4~ca#W*-vH!LZYlM&(KWOuOE3idPC)0X4o<pdiH zA{75~`?-b$J39ur8tEA@GlGQvNjVp#CYGe8D3oWGWGEzNC069*C#L9S=B4E`DE?&O z<OZtJ0qF)gl7UrML7^`tbKa5#T#rsMt#c4)wm4&2aJl;4?H%*^*q;ctZ+YZ!f=91- z-8C-PwbPuinV^!8D8ZUAZ$+j|`^0?*ZXH_r=F;-s=Wq7D-W{Q@F^9F$TCh`s37bYU zpw-=pI*&V4IF+P$l9wbc(l{x7eoOCbBdG(^nGZDWjsAGTTd?u$#mhT{{bn8t<<=6J z=66T{n^C4fqn2>E3WhNCJ~l~G@x1uTreFAcY2|b4S-i`cPqf%2ZE*i3+J9zZu_cRC z<?3tQyR_y8DPl9p2ofIGHbp#h37ovc<5E&ksO!lsv5&0c-cGyCn07cm@P#sC?}=w8 zSd-^@t-ShG3aj7DA;zc_#<r~3l(a1KW^3Z~jK_<%<<5%bQ+V^YX?vpJ17^MHzAF7Q zOqk+z8O+R1FWC1Why$CG^dV+F0lH_!rgy7~WK@H;@IEkI|9iVk!F29#T}NgWw#xj9 X(`7JWbB<iU1Zx11Y=$)`iGTqBF97aE literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Widgets/InfoBox/InfoBox.css b/web/assets/Cesium/Widgets/InfoBox/InfoBox.css new file mode 100644 index 00000000..5526dc4b --- /dev/null +++ b/web/assets/Cesium/Widgets/InfoBox/InfoBox.css @@ -0,0 +1 @@ +.cesium-infoBox{display:block;position:absolute;top:50px;right:0;width:40%;max-width:480px;background:rgba(38,38,38,.95);color:#edffff;border:1px solid #444;border-right:none;border-top-left-radius:7px;border-bottom-left-radius:7px;box-shadow:0 0 10px 1px #000;transform:translate(100%,0);visibility:hidden;opacity:0;transition:visibility 0s .2s,opacity .2s ease-in,transform .2s ease-in}.cesium-infoBox-visible{transform:translate(0,0);visibility:visible;opacity:1;transition:opacity .2s ease-out,transform .2s ease-out}.cesium-infoBox-title{display:block;height:20px;padding:5px 30px 5px 25px;background:#545454;border-top-left-radius:7px;text-align:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;box-sizing:content-box}.cesium-infoBox-bodyless .cesium-infoBox-title{border-bottom-left-radius:7px}button.cesium-infoBox-camera{display:block;position:absolute;top:4px;left:4px;width:22px;height:22px;background:0 0;border-color:transparent;border-radius:3px;padding:0 5px;margin:0}button.cesium-infoBox-close{display:block;position:absolute;top:5px;right:5px;height:20px;background:0 0;border:none;border-radius:2px;font-weight:700;font-size:16px;padding:0 5px;margin:0;color:#edffff}button.cesium-infoBox-close:focus{background:rgba(238,136,0,.44);outline:0}button.cesium-infoBox-close:hover{background:#888;color:#000}button.cesium-infoBox-close:active{background:#a00;color:#000}.cesium-infoBox-bodyless .cesium-infoBox-iframe{display:none}.cesium-infoBox-iframe{border:none;width:100%;width:calc(100% - 2px)} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/InfoBox/InfoBoxDescription.css b/web/assets/Cesium/Widgets/InfoBox/InfoBoxDescription.css new file mode 100644 index 00000000..93b6e2e8 --- /dev/null +++ b/web/assets/Cesium/Widgets/InfoBox/InfoBoxDescription.css @@ -0,0 +1 @@ +.cesium-svgPath-svg{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.cesium-button{display:inline-block;position:relative;background:#303336;border:1px solid #444;color:#edffff;fill:#edffff;border-radius:4px;padding:5px 12px;margin:2px 3px;cursor:pointer;overflow:hidden;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-button:focus{color:#fff;fill:#fff;border-color:#ea4;outline:0}.cesium-button:hover{color:#fff;fill:#fff;background:#48b;border-color:#aef;box-shadow:0 0 8px #fff}.cesium-button:active{color:#000;fill:#000;background:#adf;border-color:#fff;box-shadow:0 0 8px #fff}.cesium-button-disabled,.cesium-button-disabled:active,.cesium-button-disabled:focus,.cesium-button-disabled:hover,.cesium-button:disabled{background:#303336;border-color:#444;color:#646464;fill:#646464;box-shadow:none;cursor:default}.cesium-button option{background-color:#000;color:#eee}.cesium-button option:disabled{color:#777}.cesium-button input,.cesium-button label{cursor:pointer}.cesium-button input{vertical-align:sub}.cesium-toolbar-button{box-sizing:border-box;width:32px;height:32px;border-radius:14%;padding:0;vertical-align:middle;z-index:0}.cesium-performanceDisplay-defaultContainer{position:absolute;top:50px;right:10px;text-align:right}.cesium-performanceDisplay{background-color:rgba(40,40,40,.7);padding:7px;border-radius:5px;border:1px solid #444;font:bold 12px sans-serif}.cesium-performanceDisplay-fps{color:#e52}.cesium-performanceDisplay-throttled{color:#a42}.cesium-performanceDisplay-ms{color:#de3}body{margin:0;padding:0}.cesium-infoBox-description{font-family:sans-serif;font-size:13px;padding:4px 10px;margin-right:4px;color:#edffff}.cesium-infoBox-description a:active,.cesium-infoBox-description a:hover,.cesium-infoBox-description a:link,.cesium-infoBox-description a:visited{color:#edffff}.cesium-infoBox-description table{color:#edffff}.cesium-infoBox-defaultTable{width:100%;color:#edffff}.cesium-infoBox-defaultTable tr:nth-child(odd){background-color:rgba(84,84,84,.8)}.cesium-infoBox-defaultTable tr:nth-child(even){background-color:rgba(84,84,84,.25)}.cesium-infoBox-defaultTable th{font-weight:400;padding:3px;vertical-align:middle;text-align:center}.cesium-infoBox-defaultTable td{padding:3px;vertical-align:middle;text-align:left}.cesium-infoBox-description-lighter{color:#000}.cesium-infoBox-description-lighter a:active,.cesium-infoBox-description-lighter a:hover,.cesium-infoBox-description-lighter a:link,.cesium-infoBox-description-lighter a:visited{color:#000}.cesium-infoBox-description-lighter table{color:#000}.cesium-infoBox-defaultTable-lighter{width:100%;color:#000}.cesium-infoBox-defaultTable-lighter tr:nth-child(odd){background-color:rgba(179,179,179,.8)}.cesium-infoBox-defaultTable-lighter tr:nth-child(even){background-color:rgba(179,179,179,.25)}.cesium-infoBox-loadingContainer{margin:5px;text-align:center}.cesium-infoBox-loading{display:inline-block;background-image:url(../Images/info-loading.gif);width:16px;height:11px} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css b/web/assets/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css new file mode 100644 index 00000000..2e6a72f7 --- /dev/null +++ b/web/assets/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css @@ -0,0 +1 @@ +.cesium-navigationHelpButton-wrapper{position:relative;display:inline-block}.cesium-navigation-help{visibility:hidden;position:absolute;top:38px;right:2px;width:250px;border-radius:10px;transform:scale(.01);transform-origin:234px -10px;transition:visibility 0s .25s,transform .25s ease-in}.cesium-navigation-help-visible{visibility:visible;transform:scale(1);transition:transform .25s ease-out}.cesium-navigation-help-instructions{border:1px solid #444;background-color:rgba(38,38,38,.75);padding-bottom:5px;border-radius:0 0 10px 10px}.cesium-click-navigation-help{display:none}.cesium-touch-navigation-help{display:none;padding-top:5px}.cesium-click-navigation-help-visible{display:block}.cesium-touch-navigation-help-visible{display:block}.cesium-navigation-help-pan{color:#6cf;font-weight:700}.cesium-navigation-help-zoom{color:#65fd00;font-weight:700}.cesium-navigation-help-rotate{color:#ffd800;font-weight:700}.cesium-navigation-help-tilt{color:#d800d8;font-weight:700}.cesium-navigation-help-details{color:#fff}.cesium-navigation-button{color:#fff;background-color:transparent;border-bottom:none;border-top:1px solid #444;border-right:1px solid #444;margin:0;width:50%;cursor:pointer}.cesium-navigation-button-icon{vertical-align:middle;padding:5px 1px}.cesium-navigation-button:focus{outline:0}.cesium-navigation-button-left{border-radius:10px 0 0 0;border-left:1px solid #444}.cesium-navigation-button-right{border-radius:0 10px 0 0;border-left:none}.cesium-navigation-button-selected{background-color:rgba(38,38,38,.75)}.cesium-navigation-button-unselected{background-color:rgba(0,0,0,.75)}.cesium-navigation-button-unselected:hover{background-color:rgba(76,76,76,.75)} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/NavigationHelpButton/lighter.css b/web/assets/Cesium/Widgets/NavigationHelpButton/lighter.css new file mode 100644 index 00000000..60b4ad5e --- /dev/null +++ b/web/assets/Cesium/Widgets/NavigationHelpButton/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-navigation-help-instructions{border:1px solid #759dc0;background-color:rgba(255,255,255,.9)}.cesium-lighter .cesium-navigation-help-pan{color:#6ce;font-weight:700}.cesium-lighter .cesium-navigation-help-zoom{color:#65ec00;font-weight:700}.cesium-lighter .cesium-navigation-help-rotate{color:#eec722;font-weight:700}.cesium-lighter .cesium-navigation-help-tilt{color:#d800d8;font-weight:700}.cesium-lighter .cesium-navigation-help-details{color:#222}.cesium-lighter .cesium-navigation-button{color:#222;border-top:1px solid #759dc0;border-right:1px solid #759dc0}.cesium-lighter .cesium-navigation-button-selected{background-color:rgba(196,225,255,.9)}.cesium-lighter .cesium-navigation-button-unselected{background-color:rgba(226,240,255,.9)}.cesium-lighter .cesium-navigation-button-unselected:hover{background-color:rgba(166,210,255,.9)} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css b/web/assets/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css new file mode 100644 index 00000000..4893be2d --- /dev/null +++ b/web/assets/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css @@ -0,0 +1 @@ +.cesium-performance-watchdog-message-area{position:relative;background-color:#ff0;color:#000;padding:10px}.cesium-performance-watchdog-message{margin-right:30px}.cesium-performance-watchdog-message-dismiss{position:absolute;right:0;margin:0 10px 0 0} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/ProjectionPicker/ProjectionPicker.css b/web/assets/Cesium/Widgets/ProjectionPicker/ProjectionPicker.css new file mode 100644 index 00000000..f04f318d --- /dev/null +++ b/web/assets/Cesium/Widgets/ProjectionPicker/ProjectionPicker.css @@ -0,0 +1 @@ +span.cesium-projectionPicker-wrapper{display:inline-block;position:relative;margin:0 3px}.cesium-projectionPicker-visible{visibility:visible;opacity:1;transition:opacity .25s linear}.cesium-projectionPicker-hidden{visibility:hidden;opacity:0;transition:visibility 0s .25s,opacity .25s linear}.cesium-projectionPicker-wrapper .cesium-projectionPicker-none{display:none}.cesium-projectionPicker-wrapper .cesium-projectionPicker-dropDown-icon{box-sizing:border-box;padding:0;margin:3px 0}.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonOrthographic,.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonPerspective{margin:0 0 3px 0}.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonPerspective .cesium-projectionPicker-iconOrthographic{left:100%}.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonOrthographic .cesium-projectionPicker-iconPerspective{left:-100%}.cesium-projectionPicker-wrapper .cesium-projectionPicker-selected{border-color:#2e2;box-shadow:0 0 8px #fff,0 0 8px #fff} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/SceneModePicker/SceneModePicker.css b/web/assets/Cesium/Widgets/SceneModePicker/SceneModePicker.css new file mode 100644 index 00000000..97ba729a --- /dev/null +++ b/web/assets/Cesium/Widgets/SceneModePicker/SceneModePicker.css @@ -0,0 +1 @@ +span.cesium-sceneModePicker-wrapper{display:inline-block;position:relative;margin:0 3px}.cesium-sceneModePicker-visible{visibility:visible;opacity:1;transition:opacity .25s linear}.cesium-sceneModePicker-hidden{visibility:hidden;opacity:0;transition:visibility 0s .25s,opacity .25s linear}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-none{display:none}.cesium-sceneModePicker-slide-svg{transition:left 2s;top:0;left:0}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon{box-sizing:border-box;padding:0;margin:3px 0}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D,.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D,.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView{margin:0 0 3px 0}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-icon2D{left:100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-iconColumbusView{left:200%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon3D{left:-200%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon2D{left:-100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-icon3D{left:-100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-iconColumbusView{left:100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-selected{border-color:#2e2;box-shadow:0 0 8px #fff,0 0 8px #fff} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css b/web/assets/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css new file mode 100644 index 00000000..896c1d79 --- /dev/null +++ b/web/assets/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css @@ -0,0 +1 @@ +.cesium-selection-wrapper{position:absolute;width:160px;height:160px;pointer-events:none;visibility:hidden;opacity:0;transition:visibility 0s .2s,opacity .2s ease-in}.cesium-selection-wrapper-visible{visibility:visible;opacity:1;transition:opacity .2s ease-out}.cesium-selection-wrapper svg{fill:#2e2;stroke:#000;stroke-width:1.1px} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Timeline/Timeline.css b/web/assets/Cesium/Widgets/Timeline/Timeline.css new file mode 100644 index 00000000..f149aac6 --- /dev/null +++ b/web/assets/Cesium/Widgets/Timeline/Timeline.css @@ -0,0 +1 @@ +.cesium-timeline-main{position:relative;left:0;bottom:0;overflow:hidden;border:solid 1px #888}.cesium-timeline-trackContainer{width:100%;overflow:auto;border-top:solid 1px #888;position:relative;top:0;left:0}.cesium-timeline-tracks{position:absolute;top:0;left:0;width:100%}.cesium-timeline-needle{position:absolute;left:0;top:1.7em;bottom:0;width:1px;background:red}.cesium-timeline-bar{position:relative;left:0;top:0;overflow:hidden;cursor:pointer;width:100%;height:1.7em;background:linear-gradient(to bottom,rgba(116,117,119,.8) 0,rgba(58,68,82,.8) 11%,rgba(46,50,56,.8) 46%,rgba(53,53,53,.8) 81%,rgba(53,53,53,.8) 100%)}.cesium-timeline-ruler{visibility:hidden;white-space:nowrap;font-size:80%;z-index:-200}.cesium-timeline-highlight{position:absolute;bottom:0;left:0;background:#08f}.cesium-timeline-ticLabel{position:absolute;top:0;left:0;white-space:nowrap;font-size:80%;color:#eee}.cesium-timeline-ticMain{position:absolute;bottom:0;left:0;width:1px;height:50%;background:#eee}.cesium-timeline-ticSub{position:absolute;bottom:0;left:0;width:1px;height:33%;background:#aaa}.cesium-timeline-ticTiny{position:absolute;bottom:0;left:0;width:1px;height:25%;background:#888}.cesium-timeline-icon16{display:block;position:absolute;width:16px;height:16px;background-image:url(../Images/TimelineIcons.png);background-repeat:no-repeat} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Timeline/lighter.css b/web/assets/Cesium/Widgets/Timeline/lighter.css new file mode 100644 index 00000000..f62ae6bf --- /dev/null +++ b/web/assets/Cesium/Widgets/Timeline/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-timeline-bar{background:linear-gradient(to bottom,#eee 0,#fff 50%,#fafafa 100%)}.cesium-lighter .cesium-timeline-ticLabel{color:#000}.cesium-lighter .cesium-timeline-ticMain{position:absolute;bottom:0;left:0;width:1px;height:50%;background:#000}.cesium-lighter .cesium-timeline-ticSub{background:#444} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/VRButton/VRButton.css b/web/assets/Cesium/Widgets/VRButton/VRButton.css new file mode 100644 index 00000000..99f95d9d --- /dev/null +++ b/web/assets/Cesium/Widgets/VRButton/VRButton.css @@ -0,0 +1 @@ +.cesium-button.cesium-vrButton{display:block;width:100%;height:100%;margin:0;border-radius:0} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/Viewer/Viewer.css b/web/assets/Cesium/Widgets/Viewer/Viewer.css new file mode 100644 index 00000000..cb5c0138 --- /dev/null +++ b/web/assets/Cesium/Widgets/Viewer/Viewer.css @@ -0,0 +1 @@ +.cesium-viewer{font-family:sans-serif;font-size:16px;overflow:hidden;display:block;position:relative;top:0;left:0;width:100%;height:100%}.cesium-viewer-cesiumWidgetContainer{width:100%;height:100%}.cesium-viewer-bottom{display:block;position:absolute;bottom:0;left:0;right:0;padding-right:5px}.cesium-viewer .cesium-widget-credits{display:inline;position:static;bottom:auto;left:auto;padding-right:0;color:#fff;font-size:10px;text-shadow:0 0 2px #000}.cesium-viewer-timelineContainer{position:absolute;bottom:0;left:169px;right:29px;height:27px;padding:0;margin:0;overflow:hidden;font-size:14px}.cesium-viewer-animationContainer{position:absolute;bottom:0;left:0;padding:0;width:169px;height:112px}.cesium-viewer-fullscreenContainer{position:absolute;bottom:0;right:0;padding:0;width:29px;height:29px;overflow:hidden}.cesium-viewer-vrContainer{position:absolute;bottom:0;right:0;padding:0;width:29px;height:29px;overflow:hidden}.cesium-viewer-toolbar{display:block;position:absolute;top:5px;right:5px}.cesium-viewer-cesiumInspectorContainer{display:block;position:absolute;top:50px;right:10px}.cesium-viewer-geocoderContainer{position:relative;display:inline-block;margin:0 3px}.cesium-viewer-cesium3DTilesInspectorContainer{display:block;position:absolute;top:50px;right:10px;max-height:calc(100% - 120px);box-sizing:border-box;overflow-y:auto;overflow-x:hidden} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/lighter.css b/web/assets/Cesium/Widgets/lighter.css new file mode 100644 index 00000000..cb19342d --- /dev/null +++ b/web/assets/Cesium/Widgets/lighter.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-button{color:#111;fill:#111;background:#e2f0ff;border:1px solid #759dc0}.cesium-lighter .cesium-button:focus{color:#000;fill:#000;border-color:#ea4}.cesium-lighter .cesium-button:hover{color:#000;fill:#000;background:#a6d2ff;border-color:#aef;box-shadow:0 0 8px #777}.cesium-lighter .cesium-button:active{color:#fff;fill:#fff;background:#48b;border-color:#ea0}.cesium-lighter .cesium-button-disabled,.cesium-lighter .cesium-button-disabled:active,.cesium-lighter .cesium-button-disabled:focus,.cesium-lighter .cesium-button-disabled:hover,.cesium-lighter .cesium-button:disabled{background:#ccc;border-color:#999;color:#999;fill:#999;box-shadow:none}.cesium-lighter .cesium-performanceDisplay{background-color:#e2f0ff;border-color:#759dc0}.cesium-lighter .cesium-performanceDisplay-fps{color:#e52}.cesium-lighter .cesium-performanceDisplay-ms{color:#ea4}.cesium-lighter .cesium-animation-themeNormal{color:#e5f2fe}.cesium-lighter .cesium-animation-themeHover{color:#abd6ff}.cesium-lighter .cesium-animation-themeSelect{color:#e5f2fe}.cesium-lighter .cesium-animation-themeDisabled{color:#efefef}.cesium-lighter .cesium-animation-themeKnob{color:#e1e2e3}.cesium-lighter .cesium-animation-themePointer{color:#fa5}.cesium-lighter .cesium-animation-themeSwoosh{color:#ace}.cesium-lighter .cesium-animation-themeSwooshHover{color:#bdf}.cesium-lighter .cesium-animation-svgText{fill:#111}.cesium-lighter .cesium-animation-rectButton .cesium-animation-buttonPath{fill:#111}.cesium-lighter .cesium-animation-rectButton .cesium-animation-buttonMain{stroke:#759dc0}.cesium-lighter .cesium-animation-buttonToggled .cesium-animation-buttonGlow{fill:#ffaa2a}.cesium-lighter .cesium-animation-buttonToggled .cesium-animation-buttonMain{stroke:#ea0}.cesium-lighter .cesium-animation-rectButton:hover .cesium-animation-buttonMain{stroke:#759dc0}.cesium-lighter .cesium-animation-buttonToggled:hover .cesium-animation-buttonGlow{fill:#fff}.cesium-lighter .cesium-animation-buttonToggled:hover .cesium-animation-buttonMain{stroke:#ea0}.cesium-lighter .cesium-animation-rectButton:active .cesium-animation-buttonMain{fill:#abd6ff}.cesium-lighter .cesium-animation-buttonDisabled .cesium-animation-buttonMain{stroke:#d3d3d3}.cesium-lighter .cesium-animation-buttonDisabled .cesium-animation-buttonPath{fill:#818181}.cesium-lighter .cesium-animation-shuttleRingBack{fill:#fafafa;fill-opacity:1;stroke:#aeaeae;stroke-width:1.2}.cesium-lighter .cesium-animation-shuttleRingSwoosh line{stroke:#8ac}.cesium-lighter .cesium-animation-knobOuter{stroke:#a5a5a5}.cesium-lighter .cesium-baseLayerPicker-itemIcon{border-color:#759dc0}.cesium-lighter .cesium-baseLayerPicker-dropDown{background-color:rgba(240,240,240,.75)}.cesium-lighter .cesium-baseLayerPicker-sectionTitle{color:#000}.cesium-lighter .cesium-baseLayerPicker-itemLabel{color:#000}.cesium-lighter .cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemIcon{border-color:#000}.cesium-lighter .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemLabel{color:#003da8}.cesium-lighter .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemIcon{border:double 4px #003da8}.cesium-lighter .cesium-widget-errorPanel{background:rgba(255,255,255,.7)}.cesium-lighter .cesium-widget-errorPanel-content{border:1px solid #526f82;border-radius:7px;background-color:#fff;color:#000}.cesium-lighter .cesium-widget-errorPanel-header{color:#b87d00}.cesium-lighter .cesium-geocoder-input{border:solid 1px #759dc0;background-color:rgba(240,240,240,.9);color:#000}.cesium-lighter .cesium-viewer-geocoderContainer:hover .cesium-geocoder-input{border-color:#aef;box-shadow:0 0 8px #fff}.cesium-lighter .cesium-geocoder-searchButton{background-color:#e2f0ff;fill:#111}.cesium-lighter .cesium-geocoder-searchButton:hover{background-color:#a6d2ff}.cesium-lighter .cesium-timeline-bar{background:linear-gradient(to bottom,#eee 0,#fff 50%,#fafafa 100%)}.cesium-lighter .cesium-timeline-ticLabel{color:#000}.cesium-lighter .cesium-timeline-ticMain{position:absolute;bottom:0;left:0;width:1px;height:50%;background:#000}.cesium-lighter .cesium-timeline-ticSub{background:#444}.cesium-lighter .cesium-navigation-help-instructions{border:1px solid #759dc0;background-color:rgba(255,255,255,.9)}.cesium-lighter .cesium-navigation-help-pan{color:#6ce;font-weight:700}.cesium-lighter .cesium-navigation-help-zoom{color:#65ec00;font-weight:700}.cesium-lighter .cesium-navigation-help-rotate{color:#eec722;font-weight:700}.cesium-lighter .cesium-navigation-help-tilt{color:#d800d8;font-weight:700}.cesium-lighter .cesium-navigation-help-details{color:#222}.cesium-lighter .cesium-navigation-button{color:#222;border-top:1px solid #759dc0;border-right:1px solid #759dc0}.cesium-lighter .cesium-navigation-button-selected{background-color:rgba(196,225,255,.9)}.cesium-lighter .cesium-navigation-button-unselected{background-color:rgba(226,240,255,.9)}.cesium-lighter .cesium-navigation-button-unselected:hover{background-color:rgba(166,210,255,.9)} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/lighterShared.css b/web/assets/Cesium/Widgets/lighterShared.css new file mode 100644 index 00000000..7a3818bd --- /dev/null +++ b/web/assets/Cesium/Widgets/lighterShared.css @@ -0,0 +1 @@ +.cesium-lighter .cesium-button{color:#111;fill:#111;background:#e2f0ff;border:1px solid #759dc0}.cesium-lighter .cesium-button:focus{color:#000;fill:#000;border-color:#ea4}.cesium-lighter .cesium-button:hover{color:#000;fill:#000;background:#a6d2ff;border-color:#aef;box-shadow:0 0 8px #777}.cesium-lighter .cesium-button:active{color:#fff;fill:#fff;background:#48b;border-color:#ea0}.cesium-lighter .cesium-button-disabled,.cesium-lighter .cesium-button-disabled:active,.cesium-lighter .cesium-button-disabled:focus,.cesium-lighter .cesium-button-disabled:hover,.cesium-lighter .cesium-button:disabled{background:#ccc;border-color:#999;color:#999;fill:#999;box-shadow:none}.cesium-lighter .cesium-performanceDisplay{background-color:#e2f0ff;border-color:#759dc0}.cesium-lighter .cesium-performanceDisplay-fps{color:#e52}.cesium-lighter .cesium-performanceDisplay-ms{color:#ea4} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/shared.css b/web/assets/Cesium/Widgets/shared.css new file mode 100644 index 00000000..511e15f0 --- /dev/null +++ b/web/assets/Cesium/Widgets/shared.css @@ -0,0 +1 @@ +.cesium-svgPath-svg{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.cesium-button{display:inline-block;position:relative;background:#303336;border:1px solid #444;color:#edffff;fill:#edffff;border-radius:4px;padding:5px 12px;margin:2px 3px;cursor:pointer;overflow:hidden;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-button:focus{color:#fff;fill:#fff;border-color:#ea4;outline:0}.cesium-button:hover{color:#fff;fill:#fff;background:#48b;border-color:#aef;box-shadow:0 0 8px #fff}.cesium-button:active{color:#000;fill:#000;background:#adf;border-color:#fff;box-shadow:0 0 8px #fff}.cesium-button-disabled,.cesium-button-disabled:active,.cesium-button-disabled:focus,.cesium-button-disabled:hover,.cesium-button:disabled{background:#303336;border-color:#444;color:#646464;fill:#646464;box-shadow:none;cursor:default}.cesium-button option{background-color:#000;color:#eee}.cesium-button option:disabled{color:#777}.cesium-button input,.cesium-button label{cursor:pointer}.cesium-button input{vertical-align:sub}.cesium-toolbar-button{box-sizing:border-box;width:32px;height:32px;border-radius:14%;padding:0;vertical-align:middle;z-index:0}.cesium-performanceDisplay-defaultContainer{position:absolute;top:50px;right:10px;text-align:right}.cesium-performanceDisplay{background-color:rgba(40,40,40,.7);padding:7px;border-radius:5px;border:1px solid #444;font:bold 12px sans-serif}.cesium-performanceDisplay-fps{color:#e52}.cesium-performanceDisplay-throttled{color:#a42}.cesium-performanceDisplay-ms{color:#de3} \ No newline at end of file diff --git a/web/assets/Cesium/Widgets/widgets.css b/web/assets/Cesium/Widgets/widgets.css new file mode 100644 index 00000000..84e783eb --- /dev/null +++ b/web/assets/Cesium/Widgets/widgets.css @@ -0,0 +1 @@ +.cesium-svgPath-svg{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.cesium-button{display:inline-block;position:relative;background:#303336;border:1px solid #444;color:#edffff;fill:#edffff;border-radius:4px;padding:5px 12px;margin:2px 3px;cursor:pointer;overflow:hidden;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-button:focus{color:#fff;fill:#fff;border-color:#ea4;outline:0}.cesium-button:hover{color:#fff;fill:#fff;background:#48b;border-color:#aef;box-shadow:0 0 8px #fff}.cesium-button:active{color:#000;fill:#000;background:#adf;border-color:#fff;box-shadow:0 0 8px #fff}.cesium-button-disabled,.cesium-button-disabled:active,.cesium-button-disabled:focus,.cesium-button-disabled:hover,.cesium-button:disabled{background:#303336;border-color:#444;color:#646464;fill:#646464;box-shadow:none;cursor:default}.cesium-button option{background-color:#000;color:#eee}.cesium-button option:disabled{color:#777}.cesium-button input,.cesium-button label{cursor:pointer}.cesium-button input{vertical-align:sub}.cesium-toolbar-button{box-sizing:border-box;width:32px;height:32px;border-radius:14%;padding:0;vertical-align:middle;z-index:0}.cesium-performanceDisplay-defaultContainer{position:absolute;top:50px;right:10px;text-align:right}.cesium-performanceDisplay{background-color:rgba(40,40,40,.7);padding:7px;border-radius:5px;border:1px solid #444;font:bold 12px sans-serif}.cesium-performanceDisplay-fps{color:#e52}.cesium-performanceDisplay-throttled{color:#a42}.cesium-performanceDisplay-ms{color:#de3}.cesium-animation-theme{visibility:hidden;display:block;position:absolute;z-index:-100}.cesium-animation-themeNormal{color:#222}.cesium-animation-themeHover{color:#4488b0}.cesium-animation-themeSelect{color:#242}.cesium-animation-themeDisabled{color:#333}.cesium-animation-themeKnob{color:#222}.cesium-animation-themePointer{color:#2e2}.cesium-animation-themeSwoosh{color:#8ac}.cesium-animation-themeSwooshHover{color:#aef}.cesium-animation-svgText{fill:#edffff;font-family:Sans-Serif;font-size:15px;text-anchor:middle}.cesium-animation-blank{fill:#000;fill-opacity:.01;stroke:none}.cesium-animation-rectButton{cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-animation-rectButton .cesium-animation-buttonGlow{fill:#fff;stroke:none;display:none}.cesium-animation-rectButton:hover .cesium-animation-buttonGlow{display:block}.cesium-animation-rectButton .cesium-animation-buttonPath{fill:#edffff}.cesium-animation-rectButton .cesium-animation-buttonMain{stroke:#444;stroke-width:1.2}.cesium-animation-rectButton:hover .cesium-animation-buttonMain{stroke:#aef}.cesium-animation-rectButton:active .cesium-animation-buttonMain{fill:#abd6ff}.cesium-animation-buttonDisabled{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cesium-animation-buttonDisabled .cesium-animation-buttonMain{stroke:#555}.cesium-animation-buttonDisabled .cesium-animation-buttonPath{fill:#818181}.cesium-animation-buttonDisabled .cesium-animation-buttonGlow{display:none}.cesium-animation-buttonToggled .cesium-animation-buttonGlow{display:block;fill:#2e2}.cesium-animation-buttonToggled .cesium-animation-buttonMain{stroke:#2e2}.cesium-animation-buttonToggled:hover .cesium-animation-buttonGlow{fill:#fff}.cesium-animation-buttonToggled:hover .cesium-animation-buttonMain{stroke:#2e2}.cesium-animation-shuttleRingG{cursor:pointer}.cesium-animation-shuttleRingPointer{cursor:pointer}.cesium-animation-shuttleRingPausePointer{cursor:pointer}.cesium-animation-shuttleRingBack{fill:#181818;fill-opacity:.8;stroke:#333;stroke-width:1.2}.cesium-animation-shuttleRingSwoosh line{stroke:#8ac;stroke-width:3;stroke-opacity:.2;stroke-linecap:round}.cesium-animation-knobOuter{cursor:pointer;stroke:#444;stroke-width:1.2}.cesium-animation-knobInner{cursor:pointer}.cesium-baseLayerPicker-selected{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.cesium-baseLayerPicker-dropDown{display:block;position:absolute;box-sizing:content-box;top:auto;right:0;width:320px;max-height:500px;margin-top:5px;background-color:rgba(38,38,38,.75);border:1px solid #444;padding:6px;overflow:auto;border-radius:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;transform:translate(0,-20%);visibility:hidden;opacity:0;transition:visibility 0s .2s,opacity .2s ease-in,transform .2s ease-in}.cesium-baseLayerPicker-dropDown-visible{transform:translate(0,0);visibility:visible;opacity:1;transition:opacity .2s ease-out,transform .2s ease-out}.cesium-baseLayerPicker-sectionTitle{display:block;font-family:sans-serif;font-size:16pt;text-align:left;color:#edffff;margin-bottom:4px}.cesium-baseLayerPicker-choices{margin-bottom:5px}.cesium-baseLayerPicker-categoryTitle{color:#edffff;font-size:11pt}.cesium-baseLayerPicker-choices{display:block;border:1px solid #888;border-radius:5px;padding:5px 0}.cesium-baseLayerPicker-item{display:inline-block;vertical-align:top;margin:2px 5px;width:64px;text-align:center;cursor:pointer}.cesium-baseLayerPicker-itemLabel{display:block;font-family:sans-serif;font-size:8pt;text-align:center;vertical-align:middle;color:#edffff;cursor:pointer;word-wrap:break-word}.cesium-baseLayerPicker-item:focus .cesium-baseLayerPicker-itemLabel,.cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemLabel{text-decoration:underline}.cesium-baseLayerPicker-itemIcon{display:inline-block;position:relative;width:inherit;height:auto;background-size:100% 100%;border:solid 1px #444;border-radius:9px;color:#edffff;margin:0;padding:0;cursor:pointer;box-sizing:border-box}.cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemIcon{border-color:#fff;box-shadow:0 0 8px #fff,0 0 8px #fff}.cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemLabel{color:#bdecf8}.cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemIcon{border:double 4px #bdecf8}.cesium-widget{position:relative}.cesium-widget,.cesium-widget canvas{width:100%;height:100%;touch-action:none}.cesium-widget-credits{display:block;position:absolute;bottom:0;left:0;color:#fff;font-size:10px;text-shadow:0 0 2px #000;padding-right:5px}.cesium-widget-credits a,.cesium-widget-credits a:visited{color:#fff}.cesium-widget-errorPanel{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;background:rgba(0,0,0,.7);z-index:99999}.cesium-widget-errorPanel:before{display:inline-block;vertical-align:middle;height:100%;content:""}.cesium-widget-errorPanel-content{width:75%;max-width:500px;display:inline-block;text-align:left;vertical-align:middle;border:1px solid #510c00;border-radius:7px;background-color:#f0d9d5;font-size:14px;color:#510c00}.cesium-widget-errorPanel-content.expanded{max-width:75%}.cesium-widget-errorPanel-header{font-size:18px;font-family:"Open Sans",Verdana,Geneva,sans-serif;background:#d69d93;border-bottom:2px solid #510c00;padding-bottom:10px;border-radius:3px 3px 0 0;padding:15px}.cesium-widget-errorPanel-scroll{overflow:auto;font-family:"Open Sans",Verdana,Geneva,sans-serif;white-space:pre-wrap;padding:0 15px;margin:10px 0 20px 0}.cesium-widget-errorPanel-buttonPanel{padding:0 15px;margin:10px 0 20px 0;text-align:right}.cesium-widget-errorPanel-buttonPanel button{border-color:#510c00;background:#d69d93;color:#202020;margin:0}.cesium-widget-errorPanel-buttonPanel button:focus{border-color:#510c00;background:#f0d9d5;color:#510c00}.cesium-widget-errorPanel-buttonPanel button:hover{border-color:#510c00;background:#f0d9d5;color:#510c00}.cesium-widget-errorPanel-buttonPanel button:active{border-color:#510c00;background:#b17b72;color:#510c00}.cesium-widget-errorPanel-more-details{text-decoration:underline;cursor:pointer}.cesium-widget-errorPanel-more-details:hover{color:#2b0700}.cesium-cesiumInspector{border-radius:5px;transition:width ease-in-out .25s;background:rgba(48,51,54,.8);border:1px solid #444;color:#edffff;display:inline-block;position:relative;padding:4px 12px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.cesium-cesiumInspector-button{text-align:center;font-size:11pt}.cesium-cesiumInspector-visible .cesium-cesiumInspector-button{border-bottom:1px solid #aaa;padding-bottom:3px}.cesium-cesiumInspector input:enabled,.cesium-cesiumInspector-button{cursor:pointer}.cesium-cesiumInspector-visible{width:185px;height:auto}.cesium-cesiumInspector-hidden{width:122px;height:17px}.cesium-cesiumInspector-sectionContent{max-height:500px}.cesium-cesiumInspector-section-collapsed .cesium-cesiumInspector-sectionContent{max-height:0;padding:0!important;overflow:hidden}.cesium-cesiumInspector-dropDown{margin:5px 0;font-family:sans-serif;font-size:10pt;width:185px}.cesium-cesiumInspector-frustumStatistics{padding-left:10px;padding:5px;background-color:rgba(80,80,80,.75)}.cesium-cesiumInspector-pickButton{background-color:rgba(0,0,0,.3);border:1px solid #444;color:#edffff;border-radius:5px;padding:3px 7px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;margin:0 auto}.cesium-cesiumInspector-pickButton:focus{outline:0}.cesium-cesiumInspector-pickButton:active,.cesium-cesiumInspector-pickButtonHighlight{color:#000;background:#adf;border-color:#fff;box-shadow:0 0 8px #fff}.cesium-cesiumInspector-center{text-align:center}.cesium-cesiumInspector-sectionHeader{font-weight:700;font-size:10pt;margin:0;cursor:pointer}.cesium-cesiumInspector-pickSection{border:1px solid #aaa;border-radius:5px;padding:3px;margin-bottom:5px}.cesium-cesiumInspector-sectionContent{margin-bottom:10px;transition:max-height .25s}.cesium-cesiumInspector-tileText{padding-bottom:10px;border-bottom:1px solid #aaa}.cesium-cesiumInspector-relativeText{padding-top:10px}.cesium-cesiumInspector-sectionHeader::before{margin-right:5px;content:"-";width:1ch;display:inline-block}.cesium-cesiumInspector-section-collapsed .cesium-cesiumInspector-sectionHeader::before{content:"+"}ul.cesium-cesiumInspector-statistics{margin:0;padding-top:3px;padding-bottom:3px}ul.cesium-cesiumInspector-statistics+ul.cesium-cesiumInspector-statistics{border-top:1px solid #aaa}.cesium-cesiumInspector-slider{margin-top:5px}.cesium-cesiumInspector-slider input[type=number]{text-align:left;background-color:#222;outline:0;border:1px solid #444;color:#edffff;width:100px;border-radius:3px;padding:1px;margin-left:10px;cursor:auto}.cesium-cesiumInspector-slider input[type=number]::-webkit-inner-spin-button,.cesium-cesiumInspector-slider input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cesium-cesiumInspector-slider input[type=range]{margin-left:5px;vertical-align:middle}.cesium-cesiumInspector-hide .cesium-cesiumInspector-styleEditor{display:none}.cesium-cesiumInspector-styleEditor{padding:10px;border-radius:5px;background:rgba(48,51,54,.8);border:1px solid #444}.cesium-cesiumInspector-styleEditor textarea{width:100%;height:300px;background:0 0;color:#edffff;border:none;padding:0;white-space:pre;overflow-wrap:normal;overflow-x:auto}.cesium-3DTilesInspector{width:300px;pointer-events:all}.cesium-3DTilesInspector-statistics{font-size:11px}.cesium-3DTilesInspector div,.cesium-3DTilesInspector input[type=range]{width:100%;box-sizing:border-box}.cesium-cesiumInspector-error{color:#ff9e9e;overflow:auto}.cesium-3DTilesInspector .cesium-cesiumInspector-section{margin-top:3px}.cesium-3DTilesInspector .cesium-cesiumInspector-sectionHeader+.cesium-cesiumInspector-show{border-top:1px solid #fff}input.cesium-cesiumInspector-url{overflow:hidden;white-space:nowrap;overflow-x:scroll;background-color:transparent;color:#fff;outline:0;border:none;height:1em;width:100%}.cesium-cesiumInspector .field-group{display:table}.cesium-cesiumInspector .field-group>label{display:table-cell;font-weight:700}.cesium-cesiumInspector .field-group>.field{display:table-cell;width:100%}.cesium-button.cesium-fullscreenButton{display:block;width:100%;height:100%;margin:0;border-radius:0}.cesium-button.cesium-vrButton{display:block;width:100%;height:100%;margin:0;border-radius:0}.cesium-viewer-geocoderContainer .cesium-geocoder-input{border:solid 1px #444;background-color:rgba(40,40,40,.7);color:#fff;display:inline-block;vertical-align:middle;width:0;height:32px;margin:0;padding:0 32px 0 0;border-radius:0;box-sizing:border-box;transition:width ease-in-out .25s,background-color .2s ease-in-out;-webkit-appearance:none}.cesium-viewer-geocoderContainer:hover .cesium-geocoder-input{border-color:#aef;box-shadow:0 0 8px #fff}.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus{border-color:#ea4;background-color:rgba(15,15,15,.9);box-shadow:none;outline:0}.cesium-viewer-geocoderContainer .cesium-geocoder-input-wide,.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus,.cesium-viewer-geocoderContainer:hover .cesium-geocoder-input{padding-left:4px;width:250px}.cesium-viewer-geocoderContainer .search-results{position:absolute;background-color:#000;color:#eee;overflow-y:auto;opacity:.8;width:100%}.cesium-viewer-geocoderContainer .search-results ul{list-style-type:none;margin:0;padding:0}.cesium-viewer-geocoderContainer .search-results ul li{font-size:14px;padding:3px 10px}.cesium-viewer-geocoderContainer .search-results ul li:hover{cursor:pointer}.cesium-viewer-geocoderContainer .search-results ul li.active{background:#48b}.cesium-geocoder-searchButton{background-color:#303336;display:inline-block;position:absolute;cursor:pointer;width:32px;top:1px;right:1px;height:30px;vertical-align:middle;fill:#edffff}.cesium-geocoder-searchButton:hover{background-color:#48b}.cesium-infoBox{display:block;position:absolute;top:50px;right:0;width:40%;max-width:480px;background:rgba(38,38,38,.95);color:#edffff;border:1px solid #444;border-right:none;border-top-left-radius:7px;border-bottom-left-radius:7px;box-shadow:0 0 10px 1px #000;transform:translate(100%,0);visibility:hidden;opacity:0;transition:visibility 0s .2s,opacity .2s ease-in,transform .2s ease-in}.cesium-infoBox-visible{transform:translate(0,0);visibility:visible;opacity:1;transition:opacity .2s ease-out,transform .2s ease-out}.cesium-infoBox-title{display:block;height:20px;padding:5px 30px 5px 25px;background:#545454;border-top-left-radius:7px;text-align:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;box-sizing:content-box}.cesium-infoBox-bodyless .cesium-infoBox-title{border-bottom-left-radius:7px}button.cesium-infoBox-camera{display:block;position:absolute;top:4px;left:4px;width:22px;height:22px;background:0 0;border-color:transparent;border-radius:3px;padding:0 5px;margin:0}button.cesium-infoBox-close{display:block;position:absolute;top:5px;right:5px;height:20px;background:0 0;border:none;border-radius:2px;font-weight:700;font-size:16px;padding:0 5px;margin:0;color:#edffff}button.cesium-infoBox-close:focus{background:rgba(238,136,0,.44);outline:0}button.cesium-infoBox-close:hover{background:#888;color:#000}button.cesium-infoBox-close:active{background:#a00;color:#000}.cesium-infoBox-bodyless .cesium-infoBox-iframe{display:none}.cesium-infoBox-iframe{border:none;width:100%;width:calc(100% - 2px)}span.cesium-sceneModePicker-wrapper{display:inline-block;position:relative;margin:0 3px}.cesium-sceneModePicker-visible{visibility:visible;opacity:1;transition:opacity .25s linear}.cesium-sceneModePicker-hidden{visibility:hidden;opacity:0;transition:visibility 0s .25s,opacity .25s linear}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-none{display:none}.cesium-sceneModePicker-slide-svg{transition:left 2s;top:0;left:0}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon{box-sizing:border-box;padding:0;margin:3px 0}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D,.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D,.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView{margin:0 0 3px 0}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-icon2D{left:100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-iconColumbusView{left:200%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon3D{left:-200%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon2D{left:-100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-icon3D{left:-100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-iconColumbusView{left:100%}.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-selected{border-color:#2e2;box-shadow:0 0 8px #fff,0 0 8px #fff}span.cesium-projectionPicker-wrapper{display:inline-block;position:relative;margin:0 3px}.cesium-projectionPicker-visible{visibility:visible;opacity:1;transition:opacity .25s linear}.cesium-projectionPicker-hidden{visibility:hidden;opacity:0;transition:visibility 0s .25s,opacity .25s linear}.cesium-projectionPicker-wrapper .cesium-projectionPicker-none{display:none}.cesium-projectionPicker-wrapper .cesium-projectionPicker-dropDown-icon{box-sizing:border-box;padding:0;margin:3px 0}.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonOrthographic,.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonPerspective{margin:0 0 3px 0}.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonPerspective .cesium-projectionPicker-iconOrthographic{left:100%}.cesium-projectionPicker-wrapper .cesium-projectionPicker-buttonOrthographic .cesium-projectionPicker-iconPerspective{left:-100%}.cesium-projectionPicker-wrapper .cesium-projectionPicker-selected{border-color:#2e2;box-shadow:0 0 8px #fff,0 0 8px #fff}.cesium-performance-watchdog-message-area{position:relative;background-color:#ff0;color:#000;padding:10px}.cesium-performance-watchdog-message{margin-right:30px}.cesium-performance-watchdog-message-dismiss{position:absolute;right:0;margin:0 10px 0 0}.cesium-navigationHelpButton-wrapper{position:relative;display:inline-block}.cesium-navigation-help{visibility:hidden;position:absolute;top:38px;right:2px;width:250px;border-radius:10px;transform:scale(.01);transform-origin:234px -10px;transition:visibility 0s .25s,transform .25s ease-in}.cesium-navigation-help-visible{visibility:visible;transform:scale(1);transition:transform .25s ease-out}.cesium-navigation-help-instructions{border:1px solid #444;background-color:rgba(38,38,38,.75);padding-bottom:5px;border-radius:0 0 10px 10px}.cesium-click-navigation-help{display:none}.cesium-touch-navigation-help{display:none;padding-top:5px}.cesium-click-navigation-help-visible{display:block}.cesium-touch-navigation-help-visible{display:block}.cesium-navigation-help-pan{color:#6cf;font-weight:700}.cesium-navigation-help-zoom{color:#65fd00;font-weight:700}.cesium-navigation-help-rotate{color:#ffd800;font-weight:700}.cesium-navigation-help-tilt{color:#d800d8;font-weight:700}.cesium-navigation-help-details{color:#fff}.cesium-navigation-button{color:#fff;background-color:transparent;border-bottom:none;border-top:1px solid #444;border-right:1px solid #444;margin:0;width:50%;cursor:pointer}.cesium-navigation-button-icon{vertical-align:middle;padding:5px 1px}.cesium-navigation-button:focus{outline:0}.cesium-navigation-button-left{border-radius:10px 0 0 0;border-left:1px solid #444}.cesium-navigation-button-right{border-radius:0 10px 0 0;border-left:none}.cesium-navigation-button-selected{background-color:rgba(38,38,38,.75)}.cesium-navigation-button-unselected{background-color:rgba(0,0,0,.75)}.cesium-navigation-button-unselected:hover{background-color:rgba(76,76,76,.75)}.cesium-selection-wrapper{position:absolute;width:160px;height:160px;pointer-events:none;visibility:hidden;opacity:0;transition:visibility 0s .2s,opacity .2s ease-in}.cesium-selection-wrapper-visible{visibility:visible;opacity:1;transition:opacity .2s ease-out}.cesium-selection-wrapper svg{fill:#2e2;stroke:#000;stroke-width:1.1px}.cesium-timeline-main{position:relative;left:0;bottom:0;overflow:hidden;border:solid 1px #888}.cesium-timeline-trackContainer{width:100%;overflow:auto;border-top:solid 1px #888;position:relative;top:0;left:0}.cesium-timeline-tracks{position:absolute;top:0;left:0;width:100%}.cesium-timeline-needle{position:absolute;left:0;top:1.7em;bottom:0;width:1px;background:red}.cesium-timeline-bar{position:relative;left:0;top:0;overflow:hidden;cursor:pointer;width:100%;height:1.7em;background:linear-gradient(to bottom,rgba(116,117,119,.8) 0,rgba(58,68,82,.8) 11%,rgba(46,50,56,.8) 46%,rgba(53,53,53,.8) 81%,rgba(53,53,53,.8) 100%)}.cesium-timeline-ruler{visibility:hidden;white-space:nowrap;font-size:80%;z-index:-200}.cesium-timeline-highlight{position:absolute;bottom:0;left:0;background:#08f}.cesium-timeline-ticLabel{position:absolute;top:0;left:0;white-space:nowrap;font-size:80%;color:#eee}.cesium-timeline-ticMain{position:absolute;bottom:0;left:0;width:1px;height:50%;background:#eee}.cesium-timeline-ticSub{position:absolute;bottom:0;left:0;width:1px;height:33%;background:#aaa}.cesium-timeline-ticTiny{position:absolute;bottom:0;left:0;width:1px;height:25%;background:#888}.cesium-timeline-icon16{display:block;position:absolute;width:16px;height:16px;background-image:url(Images/TimelineIcons.png);background-repeat:no-repeat}.cesium-viewer{font-family:sans-serif;font-size:16px;overflow:hidden;display:block;position:relative;top:0;left:0;width:100%;height:100%}.cesium-viewer-cesiumWidgetContainer{width:100%;height:100%}.cesium-viewer-bottom{display:block;position:absolute;bottom:0;left:0;right:0;padding-right:5px}.cesium-viewer .cesium-widget-credits{display:inline;position:static;bottom:auto;left:auto;padding-right:0;color:#fff;font-size:10px;text-shadow:0 0 2px #000}.cesium-viewer-timelineContainer{position:absolute;bottom:0;left:169px;right:29px;height:27px;padding:0;margin:0;overflow:hidden;font-size:14px}.cesium-viewer-animationContainer{position:absolute;bottom:0;left:0;padding:0;width:169px;height:112px}.cesium-viewer-fullscreenContainer{position:absolute;bottom:0;right:0;padding:0;width:29px;height:29px;overflow:hidden}.cesium-viewer-vrContainer{position:absolute;bottom:0;right:0;padding:0;width:29px;height:29px;overflow:hidden}.cesium-viewer-toolbar{display:block;position:absolute;top:5px;right:5px}.cesium-viewer-cesiumInspectorContainer{display:block;position:absolute;top:50px;right:10px}.cesium-viewer-geocoderContainer{position:relative;display:inline-block;margin:0 3px}.cesium-viewer-cesium3DTilesInspectorContainer{display:block;position:absolute;top:50px;right:10px;max-height:calc(100% - 120px);box-sizing:border-box;overflow-y:auto;overflow-x:hidden} \ No newline at end of file diff --git a/web/assets/Cesium/Workers/ArcType-dc1c5aee.js b/web/assets/Cesium/Workers/ArcType-dc1c5aee.js new file mode 100644 index 00000000..bfd92b2d --- /dev/null +++ b/web/assets/Cesium/Workers/ArcType-dc1c5aee.js @@ -0,0 +1 @@ +define(["exports"],function(e){"use strict";var r=Object.freeze({NONE:0,GEODESIC:1,RHUMB:2});e.ArcType=r}); diff --git a/web/assets/Cesium/Workers/AttributeCompression-9fc99391.js b/web/assets/Cesium/Workers/AttributeCompression-9fc99391.js new file mode 100644 index 00000000..f44db40f --- /dev/null +++ b/web/assets/Cesium/Workers/AttributeCompression-9fc99391.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162"],function(t,u,o,c,r){"use strict";var s={octEncodeInRange:function(t,o,e){var n,a;return e.x=t.x/(Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)),e.y=t.y/(Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)),t.z<0&&(n=e.x,a=e.y,e.x=(1-Math.abs(a))*c.CesiumMath.signNotZero(n),e.y=(1-Math.abs(n))*c.CesiumMath.signNotZero(a)),e.x=c.CesiumMath.toSNorm(e.x,o),e.y=c.CesiumMath.toSNorm(e.y,o),e},octEncode:function(t,o){return s.octEncodeInRange(t,255,o)}},e=new r.Cartesian2,n=new Uint8Array(1);function a(t){return n[0]=t,n[0]}s.octEncodeToCartesian4=function(t,o){return s.octEncodeInRange(t,65535,e),o.x=a(e.x*(1/256)),o.y=a(e.x),o.z=a(e.y*(1/256)),o.w=a(e.y),o},s.octDecodeInRange=function(t,o,e,n){var a;return n.x=c.CesiumMath.fromSNorm(t,e),n.y=c.CesiumMath.fromSNorm(o,e),n.z=1-(Math.abs(n.x)+Math.abs(n.y)),n.z<0&&(a=n.x,n.x=(1-Math.abs(n.y))*c.CesiumMath.signNotZero(a),n.y=(1-Math.abs(a))*c.CesiumMath.signNotZero(n.y)),r.Cartesian3.normalize(n,n)},s.octDecode=function(t,o,e){return s.octDecodeInRange(t,o,255,e)},s.octDecodeFromCartesian4=function(t,o){var e=256*t.x+t.y,n=256*t.z+t.w;return s.octDecodeInRange(e,n,65535,o)},s.octPackFloat=function(t){return 256*t.x+t.y};var i=new r.Cartesian2;function d(t){return t>>1^-(1&t)}s.octEncodeFloat=function(t){return s.octEncode(t,i),s.octPackFloat(i)},s.octDecodeFloat=function(t,o){var e=t/256,n=Math.floor(e),a=256*(e-n);return s.octDecode(n,a,o)},s.octPack=function(t,o,e,n){var a=s.octEncodeFloat(t),c=s.octEncodeFloat(o),r=s.octEncode(e,i);return n.x=65536*r.x+a,n.y=65536*r.y+c,n},s.octUnpack=function(t,o,e,n){var a=t.x/65536,c=Math.floor(a),r=65536*(a-c),a=t.y/65536,i=Math.floor(a),u=65536*(a-i);s.octDecodeFloat(r,o),s.octDecodeFloat(u,e),s.octDecode(c,i,n)},s.compressTextureCoordinates=function(t){return 4096*(4095*t.x|0)+(4095*t.y|0)},s.decompressTextureCoordinates=function(t,o){var e=t/4096,n=Math.floor(e);return o.x=n/4095,o.y=(t-4096*n)/4095,o},s.zigZagDeltaDecode=function(t,o,e){for(var n=t.length,a=0,c=0,r=0,i=0;i<n;++i)a+=d(t[i]),c+=d(o[i]),t[i]=a,o[i]=c,u.defined(e)&&(r+=d(e[i]),e[i]=r)},t.AttributeCompression=s}); diff --git a/web/assets/Cesium/Workers/BoundingRectangle-8de79d83.js b/web/assets/Cesium/Workers/BoundingRectangle-8de79d83.js new file mode 100644 index 00000000..fa104080 --- /dev/null +++ b/web/assets/Cesium/Workers/BoundingRectangle-8de79d83.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Cartesian2-bddc1162","./Transforms-ec27f304"],function(t,f,e,r,a){"use strict";function x(t,e,n,i){this.x=f.defaultValue(t,0),this.y=f.defaultValue(e,0),this.width=f.defaultValue(n,0),this.height=f.defaultValue(i,0)}x.packedLength=4,x.pack=function(t,e,n){return n=f.defaultValue(n,0),e[n++]=t.x,e[n++]=t.y,e[n++]=t.width,e[n]=t.height,e},x.unpack=function(t,e,n){return e=f.defaultValue(e,0),f.defined(n)||(n=new x),n.x=t[e++],n.y=t[e++],n.width=t[e++],n.height=t[e],n},x.fromPoints=function(t,e){if(f.defined(e)||(e=new x),!f.defined(t)||0===t.length)return e.x=0,e.y=0,e.width=0,e.height=0,e;for(var n=t.length,i=t[0].x,h=t[0].y,r=t[0].x,a=t[0].y,d=1;d<n;d++)var u=t[d],c=u.x,o=u.y,i=Math.min(c,i),r=Math.max(c,r),h=Math.min(o,h),a=Math.max(o,a);return e.x=i,e.y=h,e.width=r-i,e.height=a-h,e};var d=new a.GeographicProjection,u=new r.Cartographic,c=new r.Cartographic;x.fromRectangle=function(t,e,n){if(f.defined(n)||(n=new x),!f.defined(t))return n.x=0,n.y=0,n.width=0,n.height=0,n;var i=(e=f.defaultValue(e,d)).project(r.Rectangle.southwest(t,u)),h=e.project(r.Rectangle.northeast(t,c));return r.Cartesian2.subtract(h,i,h),n.x=i.x,n.y=i.y,n.width=h.x,n.height=h.y,n},x.clone=function(t,e){if(f.defined(t))return f.defined(e)?(e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e):new x(t.x,t.y,t.width,t.height)},x.union=function(t,e,n){f.defined(n)||(n=new x);var i=Math.min(t.x,e.x),h=Math.min(t.y,e.y),r=Math.max(t.x+t.width,e.x+e.width),a=Math.max(t.y+t.height,e.y+e.height);return n.x=i,n.y=h,n.width=r-i,n.height=a-h,n},x.expand=function(t,e,n){n=x.clone(t,n);var i=e.x-n.x,h=e.y-n.y;return i>n.width?n.width=i:i<0&&(n.width-=i,n.x=e.x),h>n.height?n.height=h:h<0&&(n.height-=h,n.y=e.y),n},x.intersect=function(t,e){var n=t.x,i=t.y,h=e.x,r=e.y;return n>h+e.width||n+t.width<h||i+t.height<r||i>r+e.height?a.Intersect.OUTSIDE:a.Intersect.INTERSECTING},x.equals=function(t,e){return t===e||f.defined(t)&&f.defined(e)&&t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height},x.prototype.clone=function(t){return x.clone(this,t)},x.prototype.intersect=function(t){return x.intersect(this,t)},x.prototype.equals=function(t){return x.equals(this,t)},t.BoundingRectangle=x}); diff --git a/web/assets/Cesium/Workers/BoxGeometry-ee1413aa.js b/web/assets/Cesium/Workers/BoxGeometry-ee1413aa.js new file mode 100644 index 00000000..367d0786 --- /dev/null +++ b/web/assets/Cesium/Workers/BoxGeometry-ee1413aa.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785"],function(t,l,e,d,b,C,z,F,w,m){"use strict";var v=new d.Cartesian3;function u(t){var e=(t=l.defaultValue(t,l.defaultValue.EMPTY_OBJECT)).minimum,a=t.maximum,n=l.defaultValue(t.vertexFormat,m.VertexFormat.DEFAULT);this._minimum=d.Cartesian3.clone(e),this._maximum=d.Cartesian3.clone(a),this._vertexFormat=n,this._offsetAttribute=t.offsetAttribute,this._workerName="createBoxGeometry"}u.fromDimensions=function(t){var e=(t=l.defaultValue(t,l.defaultValue.EMPTY_OBJECT)).dimensions,a=d.Cartesian3.multiplyByScalar(e,.5,new d.Cartesian3);return new u({minimum:d.Cartesian3.negate(a,new d.Cartesian3),maximum:a,vertexFormat:t.vertexFormat,offsetAttribute:t.offsetAttribute})},u.fromAxisAlignedBoundingBox=function(t){return new u({minimum:t.minimum,maximum:t.maximum})},u.packedLength=2*d.Cartesian3.packedLength+m.VertexFormat.packedLength+1,u.pack=function(t,e,a){return a=l.defaultValue(a,0),d.Cartesian3.pack(t._minimum,e,a),d.Cartesian3.pack(t._maximum,e,a+d.Cartesian3.packedLength),m.VertexFormat.pack(t._vertexFormat,e,a+2*d.Cartesian3.packedLength),e[a+2*d.Cartesian3.packedLength+m.VertexFormat.packedLength]=l.defaultValue(t._offsetAttribute,-1),e};var a,s=new d.Cartesian3,y=new d.Cartesian3,p=new m.VertexFormat,x={minimum:s,maximum:y,vertexFormat:p,offsetAttribute:void 0};u.unpack=function(t,e,a){e=l.defaultValue(e,0);var n=d.Cartesian3.unpack(t,e,s),r=d.Cartesian3.unpack(t,e+d.Cartesian3.packedLength,y),i=m.VertexFormat.unpack(t,e+2*d.Cartesian3.packedLength,p),o=t[e+2*d.Cartesian3.packedLength+m.VertexFormat.packedLength];return l.defined(a)?(a._minimum=d.Cartesian3.clone(n,a._minimum),a._maximum=d.Cartesian3.clone(r,a._maximum),a._vertexFormat=m.VertexFormat.clone(i,a._vertexFormat),a._offsetAttribute=-1===o?void 0:o,a):(x.offsetAttribute=-1===o?void 0:o,new u(x))},u.createGeometry=function(t){var e=t._minimum,a=t._maximum,n=t._vertexFormat;if(!d.Cartesian3.equals(e,a)){var r,i,o,m,u,s,y=new F.GeometryAttributes;n.position&&(n.st||n.normal||n.tangent||n.bitangent)?(n.position&&((i=new Float64Array(72))[0]=e.x,i[1]=e.y,i[2]=a.z,i[3]=a.x,i[4]=e.y,i[5]=a.z,i[6]=a.x,i[7]=a.y,i[8]=a.z,i[9]=e.x,i[10]=a.y,i[11]=a.z,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=a.x,i[16]=e.y,i[17]=e.z,i[18]=a.x,i[19]=a.y,i[20]=e.z,i[21]=e.x,i[22]=a.y,i[23]=e.z,i[24]=a.x,i[25]=e.y,i[26]=e.z,i[27]=a.x,i[28]=a.y,i[29]=e.z,i[30]=a.x,i[31]=a.y,i[32]=a.z,i[33]=a.x,i[34]=e.y,i[35]=a.z,i[36]=e.x,i[37]=e.y,i[38]=e.z,i[39]=e.x,i[40]=a.y,i[41]=e.z,i[42]=e.x,i[43]=a.y,i[44]=a.z,i[45]=e.x,i[46]=e.y,i[47]=a.z,i[48]=e.x,i[49]=a.y,i[50]=e.z,i[51]=a.x,i[52]=a.y,i[53]=e.z,i[54]=a.x,i[55]=a.y,i[56]=a.z,i[57]=e.x,i[58]=a.y,i[59]=a.z,i[60]=e.x,i[61]=e.y,i[62]=e.z,i[63]=a.x,i[64]=e.y,i[65]=e.z,i[66]=a.x,i[67]=e.y,i[68]=a.z,i[69]=e.x,i[70]=e.y,i[71]=a.z,y.position=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:i})),n.normal&&((o=new Float32Array(72))[0]=0,o[1]=0,o[2]=1,o[3]=0,o[4]=0,o[5]=1,o[6]=0,o[7]=0,o[8]=1,o[9]=0,o[10]=0,o[11]=1,o[12]=0,o[13]=0,o[14]=-1,o[15]=0,o[16]=0,o[17]=-1,o[18]=0,o[19]=0,o[20]=-1,o[21]=0,o[22]=0,o[23]=-1,o[24]=1,o[25]=0,o[26]=0,o[27]=1,o[28]=0,o[29]=0,o[30]=1,o[31]=0,o[32]=0,o[33]=1,o[34]=0,o[35]=0,o[36]=-1,o[37]=0,o[38]=0,o[39]=-1,o[40]=0,o[41]=0,o[42]=-1,o[43]=0,o[44]=0,o[45]=-1,o[46]=0,o[47]=0,o[48]=0,o[49]=1,o[50]=0,o[51]=0,o[52]=1,o[53]=0,o[54]=0,o[55]=1,o[56]=0,o[57]=0,o[58]=1,o[59]=0,o[60]=0,o[61]=-1,o[62]=0,o[63]=0,o[64]=-1,o[65]=0,o[66]=0,o[67]=-1,o[68]=0,o[69]=0,o[70]=-1,o[71]=0,y.normal=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:o})),n.st&&((m=new Float32Array(48))[0]=0,m[1]=0,m[2]=1,m[3]=0,m[4]=1,m[5]=1,m[6]=0,m[7]=1,m[8]=1,m[9]=0,m[10]=0,m[11]=0,m[12]=0,m[13]=1,m[14]=1,m[15]=1,m[16]=0,m[17]=0,m[18]=1,m[19]=0,m[20]=1,m[21]=1,m[22]=0,m[23]=1,m[24]=1,m[25]=0,m[26]=0,m[27]=0,m[28]=0,m[29]=1,m[30]=1,m[31]=1,m[32]=1,m[33]=0,m[34]=0,m[35]=0,m[36]=0,m[37]=1,m[38]=1,m[39]=1,m[40]=0,m[41]=0,m[42]=1,m[43]=0,m[44]=1,m[45]=1,m[46]=0,m[47]=1,y.st=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:m})),n.tangent&&((u=new Float32Array(72))[0]=1,u[1]=0,u[2]=0,u[3]=1,u[4]=0,u[5]=0,u[6]=1,u[7]=0,u[8]=0,u[9]=1,u[10]=0,u[11]=0,u[12]=-1,u[13]=0,u[14]=0,u[15]=-1,u[16]=0,u[17]=0,u[18]=-1,u[19]=0,u[20]=0,u[21]=-1,u[22]=0,u[23]=0,u[24]=0,u[25]=1,u[26]=0,u[27]=0,u[28]=1,u[29]=0,u[30]=0,u[31]=1,u[32]=0,u[33]=0,u[34]=1,u[35]=0,u[36]=0,u[37]=-1,u[38]=0,u[39]=0,u[40]=-1,u[41]=0,u[42]=0,u[43]=-1,u[44]=0,u[45]=0,u[46]=-1,u[47]=0,u[48]=-1,u[49]=0,u[50]=0,u[51]=-1,u[52]=0,u[53]=0,u[54]=-1,u[55]=0,u[56]=0,u[57]=-1,u[58]=0,u[59]=0,u[60]=1,u[61]=0,u[62]=0,u[63]=1,u[64]=0,u[65]=0,u[66]=1,u[67]=0,u[68]=0,u[69]=1,u[70]=0,u[71]=0,y.tangent=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:u})),n.bitangent&&((s=new Float32Array(72))[0]=0,s[1]=1,s[2]=0,s[3]=0,s[4]=1,s[5]=0,s[6]=0,s[7]=1,s[8]=0,s[9]=0,s[10]=1,s[11]=0,s[12]=0,s[13]=1,s[14]=0,s[15]=0,s[16]=1,s[17]=0,s[18]=0,s[19]=1,s[20]=0,s[21]=0,s[22]=1,s[23]=0,s[24]=0,s[25]=0,s[26]=1,s[27]=0,s[28]=0,s[29]=1,s[30]=0,s[31]=0,s[32]=1,s[33]=0,s[34]=0,s[35]=1,s[36]=0,s[37]=0,s[38]=1,s[39]=0,s[40]=0,s[41]=1,s[42]=0,s[43]=0,s[44]=1,s[45]=0,s[46]=0,s[47]=1,s[48]=0,s[49]=0,s[50]=1,s[51]=0,s[52]=0,s[53]=1,s[54]=0,s[55]=0,s[56]=1,s[57]=0,s[58]=0,s[59]=1,s[60]=0,s[61]=0,s[62]=1,s[63]=0,s[64]=0,s[65]=1,s[66]=0,s[67]=0,s[68]=1,s[69]=0,s[70]=0,s[71]=1,y.bitangent=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:s})),(r=new Uint16Array(36))[0]=0,r[1]=1,r[2]=2,r[3]=0,r[4]=2,r[5]=3,r[6]=6,r[7]=5,r[8]=4,r[9]=7,r[10]=6,r[11]=4,r[12]=8,r[13]=9,r[14]=10,r[15]=8,r[16]=10,r[17]=11,r[18]=14,r[19]=13,r[20]=12,r[21]=15,r[22]=14,r[23]=12,r[24]=18,r[25]=17,r[26]=16,r[27]=19,r[28]=18,r[29]=16,r[30]=20,r[31]=21,r[32]=22,r[33]=20,r[34]=22,r[35]=23):((i=new Float64Array(24))[0]=e.x,i[1]=e.y,i[2]=e.z,i[3]=a.x,i[4]=e.y,i[5]=e.z,i[6]=a.x,i[7]=a.y,i[8]=e.z,i[9]=e.x,i[10]=a.y,i[11]=e.z,i[12]=e.x,i[13]=e.y,i[14]=a.z,i[15]=a.x,i[16]=e.y,i[17]=a.z,i[18]=a.x,i[19]=a.y,i[20]=a.z,i[21]=e.x,i[22]=a.y,i[23]=a.z,y.position=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:i}),(r=new Uint16Array(36))[0]=4,r[1]=5,r[2]=6,r[3]=4,r[4]=6,r[5]=7,r[6]=1,r[7]=0,r[8]=3,r[9]=1,r[10]=3,r[11]=2,r[12]=1,r[13]=6,r[14]=5,r[15]=1,r[16]=2,r[17]=6,r[18]=2,r[19]=3,r[20]=7,r[21]=2,r[22]=7,r[23]=6,r[24]=3,r[25]=0,r[26]=4,r[27]=3,r[28]=4,r[29]=7,r[30]=0,r[31]=1,r[32]=5,r[33]=0,r[34]=5,r[35]=4);var p,x,c,f=d.Cartesian3.subtract(a,e,v),A=.5*d.Cartesian3.magnitude(f);return l.defined(t._offsetAttribute)&&(p=i.length,x=new Uint8Array(p/3),c=t._offsetAttribute===w.GeometryOffsetAttribute.NONE?0:1,w.arrayFill(x,c),y.applyOffset=new z.GeometryAttribute({componentDatatype:C.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:x})),new z.Geometry({attributes:y,indices:r,primitiveType:z.PrimitiveType.TRIANGLES,boundingSphere:new b.BoundingSphere(d.Cartesian3.ZERO,A),offsetAttribute:t._offsetAttribute})}},u.getUnitBox=function(){return l.defined(a)||(a=u.createGeometry(u.fromDimensions({dimensions:new d.Cartesian3(1,1,1),vertexFormat:m.VertexFormat.POSITION_ONLY}))),a},t.BoxGeometry=u}); diff --git a/web/assets/Cesium/Workers/Cartesian2-bddc1162.js b/web/assets/Cesium/Workers/Cartesian2-bddc1162.js new file mode 100644 index 00000000..3cc94b33 --- /dev/null +++ b/web/assets/Cesium/Workers/Cartesian2-bddc1162.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5"],function(e,R,i,V){"use strict";function b(e,t,n){this.x=R.defaultValue(e,0),this.y=R.defaultValue(t,0),this.z=R.defaultValue(n,0)}b.fromSpherical=function(e,t){R.defined(t)||(t=new b);var n=e.clock,a=e.cone,r=R.defaultValue(e.magnitude,1),i=r*Math.sin(a);return t.x=i*Math.cos(n),t.y=i*Math.sin(n),t.z=r*Math.cos(a),t},b.fromElements=function(e,t,n,a){return R.defined(a)?(a.x=e,a.y=t,a.z=n,a):new b(e,t,n)},b.fromCartesian4=b.clone=function(e,t){if(R.defined(e))return R.defined(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t):new b(e.x,e.y,e.z)},b.packedLength=3,b.pack=function(e,t,n){return n=R.defaultValue(n,0),t[n++]=e.x,t[n++]=e.y,t[n]=e.z,t},b.unpack=function(e,t,n){return t=R.defaultValue(t,0),R.defined(n)||(n=new b),n.x=e[t++],n.y=e[t++],n.z=e[t],n},b.packArray=function(e,t){var n=e.length,a=3*n;if(R.defined(t)){if(!Array.isArray(t)&&t.length!==a)throw new i.DeveloperError("If result is a typed array, it must have exactly array.length * 3 elements");t.length!==a&&(t.length=a)}else t=new Array(a);for(var r=0;r<n;++r)b.pack(e[r],t,3*r);return t},b.unpackArray=function(e,t){var n=e.length;R.defined(t)?t.length=n/3:t=new Array(n/3);for(var a=0;a<n;a+=3){var r=a/3;t[r]=b.unpack(e,a,t[r])}return t},b.fromArray=b.unpack,b.maximumComponent=function(e){return Math.max(e.x,e.y,e.z)},b.minimumComponent=function(e){return Math.min(e.x,e.y,e.z)},b.minimumByComponent=function(e,t,n){return n.x=Math.min(e.x,t.x),n.y=Math.min(e.y,t.y),n.z=Math.min(e.z,t.z),n},b.maximumByComponent=function(e,t,n){return n.x=Math.max(e.x,t.x),n.y=Math.max(e.y,t.y),n.z=Math.max(e.z,t.z),n},b.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y+e.z*e.z},b.magnitude=function(e){return Math.sqrt(b.magnitudeSquared(e))};var n=new b;b.distance=function(e,t){return b.subtract(e,t,n),b.magnitude(n)},b.distanceSquared=function(e,t){return b.subtract(e,t,n),b.magnitudeSquared(n)},b.normalize=function(e,t){var n=b.magnitude(e);return t.x=e.x/n,t.y=e.y/n,t.z=e.z/n,t},b.dot=function(e,t){return e.x*t.x+e.y*t.y+e.z*t.z},b.multiplyComponents=function(e,t,n){return n.x=e.x*t.x,n.y=e.y*t.y,n.z=e.z*t.z,n},b.divideComponents=function(e,t,n){return n.x=e.x/t.x,n.y=e.y/t.y,n.z=e.z/t.z,n},b.add=function(e,t,n){return n.x=e.x+t.x,n.y=e.y+t.y,n.z=e.z+t.z,n},b.subtract=function(e,t,n){return n.x=e.x-t.x,n.y=e.y-t.y,n.z=e.z-t.z,n},b.multiplyByScalar=function(e,t,n){return n.x=e.x*t,n.y=e.y*t,n.z=e.z*t,n},b.divideByScalar=function(e,t,n){return n.x=e.x/t,n.y=e.y/t,n.z=e.z/t,n},b.negate=function(e,t){return t.x=-e.x,t.y=-e.y,t.z=-e.z,t},b.abs=function(e,t){return t.x=Math.abs(e.x),t.y=Math.abs(e.y),t.z=Math.abs(e.z),t};var r=new b;b.lerp=function(e,t,n,a){return b.multiplyByScalar(t,n,r),a=b.multiplyByScalar(e,1-n,a),b.add(r,a,a)};var u=new b,o=new b;b.angleBetween=function(e,t){b.normalize(e,u),b.normalize(t,o);var n=b.dot(u,o),a=b.magnitude(b.cross(u,o,u));return Math.atan2(a,n)};var a=new b;b.mostOrthogonalAxis=function(e,t){var n=b.normalize(e,a);return b.abs(n,n),t=n.x<=n.y?n.x<=n.z?b.clone(b.UNIT_X,t):b.clone(b.UNIT_Z,t):n.y<=n.z?b.clone(b.UNIT_Y,t):b.clone(b.UNIT_Z,t)},b.projectVector=function(e,t,n){var a=b.dot(e,t)/b.dot(t,t);return b.multiplyByScalar(t,a,n)},b.equals=function(e,t){return e===t||R.defined(e)&&R.defined(t)&&e.x===t.x&&e.y===t.y&&e.z===t.z},b.equalsArray=function(e,t,n){return e.x===t[n]&&e.y===t[n+1]&&e.z===t[n+2]},b.equalsEpsilon=function(e,t,n,a){return e===t||R.defined(e)&&R.defined(t)&&V.CesiumMath.equalsEpsilon(e.x,t.x,n,a)&&V.CesiumMath.equalsEpsilon(e.y,t.y,n,a)&&V.CesiumMath.equalsEpsilon(e.z,t.z,n,a)},b.cross=function(e,t,n){var a=e.x,r=e.y,i=e.z,u=t.x,o=t.y,d=t.z,s=r*d-i*o,h=i*u-a*d,l=a*o-r*u;return n.x=s,n.y=h,n.z=l,n},b.midpoint=function(e,t,n){return n.x=.5*(e.x+t.x),n.y=.5*(e.y+t.y),n.z=.5*(e.z+t.z),n},b.fromDegrees=function(e,t,n,a,r){return e=V.CesiumMath.toRadians(e),t=V.CesiumMath.toRadians(t),b.fromRadians(e,t,n,a,r)};var d=new b,s=new b,h=new b(40680631590769,40680631590769,40408299984661.445);b.fromRadians=function(e,t,n,a,r){n=R.defaultValue(n,0);var i=R.defined(a)?a.radiiSquared:h,u=Math.cos(t);d.x=u*Math.cos(e),d.y=u*Math.sin(e),d.z=Math.sin(t),d=b.normalize(d,d),b.multiplyComponents(i,d,s);var o=Math.sqrt(b.dot(d,s));return s=b.divideByScalar(s,o,s),d=b.multiplyByScalar(d,n,d),R.defined(r)||(r=new b),b.add(s,d,r)},b.fromDegreesArray=function(e,t,n){var a=e.length;R.defined(n)?n.length=a/2:n=new Array(a/2);for(var r=0;r<a;r+=2){var i=e[r],u=e[r+1],o=r/2;n[o]=b.fromDegrees(i,u,0,t,n[o])}return n},b.fromRadiansArray=function(e,t,n){var a=e.length;R.defined(n)?n.length=a/2:n=new Array(a/2);for(var r=0;r<a;r+=2){var i=e[r],u=e[r+1],o=r/2;n[o]=b.fromRadians(i,u,0,t,n[o])}return n},b.fromDegreesArrayHeights=function(e,t,n){var a=e.length;R.defined(n)?n.length=a/3:n=new Array(a/3);for(var r=0;r<a;r+=3){var i=e[r],u=e[r+1],o=e[r+2],d=r/3;n[d]=b.fromDegrees(i,u,o,t,n[d])}return n},b.fromRadiansArrayHeights=function(e,t,n){var a=e.length;R.defined(n)?n.length=a/3:n=new Array(a/3);for(var r=0;r<a;r+=3){var i=e[r],u=e[r+1],o=e[r+2],d=r/3;n[d]=b.fromRadians(i,u,o,t,n[d])}return n},b.ZERO=Object.freeze(new b(0,0,0)),b.UNIT_X=Object.freeze(new b(1,0,0)),b.UNIT_Y=Object.freeze(new b(0,1,0)),b.UNIT_Z=Object.freeze(new b(0,0,1)),b.prototype.clone=function(e){return b.clone(this,e)},b.prototype.equals=function(e){return b.equals(this,e)},b.prototype.equalsEpsilon=function(e,t,n){return b.equalsEpsilon(this,e,t,n)},b.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+")"};var I=new b,E=new b;function l(e,t,n,a,r){var i=e.x,u=e.y,o=e.z,d=t.x,s=t.y,h=t.z,l=i*i*d*d,f=u*u*s*s,c=o*o*h*h,m=l+f+c,y=Math.sqrt(1/m),p=b.multiplyByScalar(e,y,I);if(m<a)return isFinite(y)?b.clone(p,r):void 0;var g=n.x,M=n.y,x=n.z,w=E;w.x=p.x*g*2,w.y=p.y*M*2,w.z=p.z*x*2;var v,_,C,z,S,q,O,T=(1-y)*b.magnitude(e)/(.5*b.magnitude(w)),A=0;do{A=(v=l*(S=(_=1/(1+(T-=A)*g))*_)+f*(q=(C=1/(1+T*M))*C)+c*(O=(z=1/(1+T*x))*z)-1)/(-2*(l*(S*_)*g+f*(q*C)*M+c*(O*z)*x))}while(Math.abs(v)>V.CesiumMath.EPSILON12);return R.defined(r)?(r.x=i*_,r.y=u*C,r.z=o*z,r):new b(i*_,u*C,o*z)}function f(e,t,n){this.longitude=R.defaultValue(e,0),this.latitude=R.defaultValue(t,0),this.height=R.defaultValue(n,0)}f.fromRadians=function(e,t,n,a){return n=R.defaultValue(n,0),R.defined(a)?(a.longitude=e,a.latitude=t,a.height=n,a):new f(e,t,n)},f.fromDegrees=function(e,t,n,a){return e=V.CesiumMath.toRadians(e),t=V.CesiumMath.toRadians(t),f.fromRadians(e,t,n,a)};var c=new b,m=new b,y=new b,p=new b(1/6378137,1/6378137,1/6356752.314245179),g=new b(1/40680631590769,1/40680631590769,1/40408299984661.445),M=V.CesiumMath.EPSILON1;function x(e,t,n,a){t=R.defaultValue(t,0),n=R.defaultValue(n,0),a=R.defaultValue(a,0),e._radii=new b(t,n,a),e._radiiSquared=new b(t*t,n*n,a*a),e._radiiToTheFourth=new b(t*t*t*t,n*n*n*n,a*a*a*a),e._oneOverRadii=new b(0===t?0:1/t,0===n?0:1/n,0===a?0:1/a),e._oneOverRadiiSquared=new b(0===t?0:1/(t*t),0===n?0:1/(n*n),0===a?0:1/(a*a)),e._minimumRadius=Math.min(t,n,a),e._maximumRadius=Math.max(t,n,a),e._centerToleranceSquared=V.CesiumMath.EPSILON1,0!==e._radiiSquared.z&&(e._squaredXOverSquaredZ=e._radiiSquared.x/e._radiiSquared.z)}function w(e,t,n){this._radii=void 0,this._radiiSquared=void 0,this._radiiToTheFourth=void 0,this._oneOverRadii=void 0,this._oneOverRadiiSquared=void 0,this._minimumRadius=void 0,this._maximumRadius=void 0,this._centerToleranceSquared=void 0,this._squaredXOverSquaredZ=void 0,x(this,e,t,n)}f.fromCartesian=function(e,t,n){var a=R.defined(t)?t.oneOverRadii:p,r=R.defined(t)?t.oneOverRadiiSquared:g,i=l(e,a,r,R.defined(t)?t._centerToleranceSquared:M,m);if(R.defined(i)){var u=b.multiplyComponents(i,r,c),u=b.normalize(u,u),o=b.subtract(e,i,y),d=Math.atan2(u.y,u.x),s=Math.asin(u.z),h=V.CesiumMath.sign(b.dot(o,e))*b.magnitude(o);return R.defined(n)?(n.longitude=d,n.latitude=s,n.height=h,n):new f(d,s,h)}},f.toCartesian=function(e,t,n){return b.fromRadians(e.longitude,e.latitude,e.height,t,n)},f.clone=function(e,t){if(R.defined(e))return R.defined(t)?(t.longitude=e.longitude,t.latitude=e.latitude,t.height=e.height,t):new f(e.longitude,e.latitude,e.height)},f.equals=function(e,t){return e===t||R.defined(e)&&R.defined(t)&&e.longitude===t.longitude&&e.latitude===t.latitude&&e.height===t.height},f.equalsEpsilon=function(e,t,n){return n=R.defaultValue(n,0),e===t||R.defined(e)&&R.defined(t)&&Math.abs(e.longitude-t.longitude)<=n&&Math.abs(e.latitude-t.latitude)<=n&&Math.abs(e.height-t.height)<=n},f.ZERO=Object.freeze(new f(0,0,0)),f.prototype.clone=function(e){return f.clone(this,e)},f.prototype.equals=function(e){return f.equals(this,e)},f.prototype.equalsEpsilon=function(e,t){return f.equalsEpsilon(this,e,t)},f.prototype.toString=function(){return"("+this.longitude+", "+this.latitude+", "+this.height+")"},Object.defineProperties(w.prototype,{radii:{get:function(){return this._radii}},radiiSquared:{get:function(){return this._radiiSquared}},radiiToTheFourth:{get:function(){return this._radiiToTheFourth}},oneOverRadii:{get:function(){return this._oneOverRadii}},oneOverRadiiSquared:{get:function(){return this._oneOverRadiiSquared}},minimumRadius:{get:function(){return this._minimumRadius}},maximumRadius:{get:function(){return this._maximumRadius}}}),w.clone=function(e,t){if(R.defined(e)){var n=e._radii;return R.defined(t)?(b.clone(n,t._radii),b.clone(e._radiiSquared,t._radiiSquared),b.clone(e._radiiToTheFourth,t._radiiToTheFourth),b.clone(e._oneOverRadii,t._oneOverRadii),b.clone(e._oneOverRadiiSquared,t._oneOverRadiiSquared),t._minimumRadius=e._minimumRadius,t._maximumRadius=e._maximumRadius,t._centerToleranceSquared=e._centerToleranceSquared,t):new w(n.x,n.y,n.z)}},w.fromCartesian3=function(e,t){return R.defined(t)||(t=new w),R.defined(e)&&x(t,e.x,e.y,e.z),t},w.WGS84=Object.freeze(new w(6378137,6378137,6356752.314245179)),w.UNIT_SPHERE=Object.freeze(new w(1,1,1)),w.MOON=Object.freeze(new w(V.CesiumMath.LUNAR_RADIUS,V.CesiumMath.LUNAR_RADIUS,V.CesiumMath.LUNAR_RADIUS)),w.prototype.clone=function(e){return w.clone(this,e)},w.packedLength=b.packedLength,w.pack=function(e,t,n){return n=R.defaultValue(n,0),b.pack(e._radii,t,n),t},w.unpack=function(e,t,n){t=R.defaultValue(t,0);var a=b.unpack(e,t);return w.fromCartesian3(a,n)},w.prototype.geocentricSurfaceNormal=b.normalize,w.prototype.geodeticSurfaceNormalCartographic=function(e,t){var n=e.longitude,a=e.latitude,r=Math.cos(a),i=r*Math.cos(n),u=r*Math.sin(n),o=Math.sin(a);return R.defined(t)||(t=new b),t.x=i,t.y=u,t.z=o,b.normalize(t,t)},w.prototype.geodeticSurfaceNormal=function(e,t){if(!b.equalsEpsilon(e,b.ZERO,V.CesiumMath.EPSILON14))return R.defined(t)||(t=new b),t=b.multiplyComponents(e,this._oneOverRadiiSquared,t),b.normalize(t,t)};var v=new b,_=new b;w.prototype.cartographicToCartesian=function(e,t){var n=v,a=_;this.geodeticSurfaceNormalCartographic(e,n),b.multiplyComponents(this._radiiSquared,n,a);var r=Math.sqrt(b.dot(n,a));return b.divideByScalar(a,r,a),b.multiplyByScalar(n,e.height,n),R.defined(t)||(t=new b),b.add(a,n,t)},w.prototype.cartographicArrayToCartesianArray=function(e,t){var n=e.length;R.defined(t)?t.length=n:t=new Array(n);for(var a=0;a<n;a++)t[a]=this.cartographicToCartesian(e[a],t[a]);return t};var C=new b,z=new b,S=new b;w.prototype.cartesianToCartographic=function(e,t){var n=this.scaleToGeodeticSurface(e,z);if(R.defined(n)){var a=this.geodeticSurfaceNormal(n,C),r=b.subtract(e,n,S),i=Math.atan2(a.y,a.x),u=Math.asin(a.z),o=V.CesiumMath.sign(b.dot(r,e))*b.magnitude(r);return R.defined(t)?(t.longitude=i,t.latitude=u,t.height=o,t):new f(i,u,o)}},w.prototype.cartesianArrayToCartographicArray=function(e,t){var n=e.length;R.defined(t)?t.length=n:t=new Array(n);for(var a=0;a<n;++a)t[a]=this.cartesianToCartographic(e[a],t[a]);return t},w.prototype.scaleToGeodeticSurface=function(e,t){return l(e,this._oneOverRadii,this._oneOverRadiiSquared,this._centerToleranceSquared,t)},w.prototype.scaleToGeocentricSurface=function(e,t){R.defined(t)||(t=new b);var n=e.x,a=e.y,r=e.z,i=this._oneOverRadiiSquared,u=1/Math.sqrt(n*n*i.x+a*a*i.y+r*r*i.z);return b.multiplyByScalar(e,u,t)},w.prototype.transformPositionToScaledSpace=function(e,t){return R.defined(t)||(t=new b),b.multiplyComponents(e,this._oneOverRadii,t)},w.prototype.transformPositionFromScaledSpace=function(e,t){return R.defined(t)||(t=new b),b.multiplyComponents(e,this._radii,t)},w.prototype.equals=function(e){return this===e||R.defined(e)&&b.equals(this._radii,e._radii)},w.prototype.toString=function(){return this._radii.toString()},w.prototype.getSurfaceNormalIntersectionWithZAxis=function(e,t,n){t=R.defaultValue(t,0);var a=this._squaredXOverSquaredZ;if(R.defined(n)||(n=new b),n.x=0,n.y=0,n.z=e.z*(1-a),!(Math.abs(n.z)>=this._radii.z-t))return n};var q=[.14887433898163,.43339539412925,.67940956829902,.86506336668898,.97390652851717,0],O=[.29552422471475,.26926671930999,.21908636251598,.14945134915058,.066671344308684,0];function T(e,t,n){for(var a=.5*(t+e),r=.5*(t-e),i=0,u=0;u<5;u++){var o=r*q[u];i+=O[u]*(n(a+o)+n(a-o))}return i*=r}function A(e,t,n,a){this.west=R.defaultValue(e,0),this.south=R.defaultValue(t,0),this.east=R.defaultValue(n,0),this.north=R.defaultValue(a,0)}w.prototype.surfaceArea=function(e){for(var t=e.west,n=e.east,a=e.south,r=e.north;n<t;)n+=V.CesiumMath.TWO_PI;var i=this._radiiSquared,u=i.x,o=i.y,d=i.z,s=u*o;return T(a,r,function(e){var a=Math.cos(e),r=Math.sin(e);return Math.cos(e)*T(t,n,function(e){var t=Math.cos(e),n=Math.sin(e);return Math.sqrt(s*r*r+d*(o*t*t+u*n*n)*a*a)})})},Object.defineProperties(A.prototype,{width:{get:function(){return A.computeWidth(this)}},height:{get:function(){return A.computeHeight(this)}}}),A.packedLength=4,A.pack=function(e,t,n){return n=R.defaultValue(n,0),t[n++]=e.west,t[n++]=e.south,t[n++]=e.east,t[n]=e.north,t},A.unpack=function(e,t,n){return t=R.defaultValue(t,0),R.defined(n)||(n=new A),n.west=e[t++],n.south=e[t++],n.east=e[t++],n.north=e[t],n},A.computeWidth=function(e){var t=e.east,n=e.west;return t<n&&(t+=V.CesiumMath.TWO_PI),t-n},A.computeHeight=function(e){return e.north-e.south},A.fromDegrees=function(e,t,n,a,r){return e=V.CesiumMath.toRadians(R.defaultValue(e,0)),t=V.CesiumMath.toRadians(R.defaultValue(t,0)),n=V.CesiumMath.toRadians(R.defaultValue(n,0)),a=V.CesiumMath.toRadians(R.defaultValue(a,0)),R.defined(r)?(r.west=e,r.south=t,r.east=n,r.north=a,r):new A(e,t,n,a)},A.fromRadians=function(e,t,n,a,r){return R.defined(r)?(r.west=R.defaultValue(e,0),r.south=R.defaultValue(t,0),r.east=R.defaultValue(n,0),r.north=R.defaultValue(a,0),r):new A(e,t,n,a)},A.fromCartographicArray=function(e,t){for(var n=Number.MAX_VALUE,a=-Number.MAX_VALUE,r=Number.MAX_VALUE,i=-Number.MAX_VALUE,u=Number.MAX_VALUE,o=-Number.MAX_VALUE,d=0,s=e.length;d<s;d++)var h=e[d],n=Math.min(n,h.longitude),a=Math.max(a,h.longitude),u=Math.min(u,h.latitude),o=Math.max(o,h.latitude),l=0<=h.longitude?h.longitude:h.longitude+V.CesiumMath.TWO_PI,r=Math.min(r,l),i=Math.max(i,l);return i-r<a-n&&(n=r,(a=i)>V.CesiumMath.PI&&(a-=V.CesiumMath.TWO_PI),n>V.CesiumMath.PI&&(n-=V.CesiumMath.TWO_PI)),R.defined(t)?(t.west=n,t.south=u,t.east=a,t.north=o,t):new A(n,u,a,o)},A.fromCartesianArray=function(e,t,n){t=R.defaultValue(t,w.WGS84);for(var a=Number.MAX_VALUE,r=-Number.MAX_VALUE,i=Number.MAX_VALUE,u=-Number.MAX_VALUE,o=Number.MAX_VALUE,d=-Number.MAX_VALUE,s=0,h=e.length;s<h;s++)var l=t.cartesianToCartographic(e[s]),a=Math.min(a,l.longitude),r=Math.max(r,l.longitude),o=Math.min(o,l.latitude),d=Math.max(d,l.latitude),f=0<=l.longitude?l.longitude:l.longitude+V.CesiumMath.TWO_PI,i=Math.min(i,f),u=Math.max(u,f);return u-i<r-a&&(a=i,(r=u)>V.CesiumMath.PI&&(r-=V.CesiumMath.TWO_PI),a>V.CesiumMath.PI&&(a-=V.CesiumMath.TWO_PI)),R.defined(n)?(n.west=a,n.south=o,n.east=r,n.north=d,n):new A(a,o,r,d)},A.clone=function(e,t){if(R.defined(e))return R.defined(t)?(t.west=e.west,t.south=e.south,t.east=e.east,t.north=e.north,t):new A(e.west,e.south,e.east,e.north)},A.equalsEpsilon=function(e,t,n){return n=R.defaultValue(n,0),e===t||R.defined(e)&&R.defined(t)&&Math.abs(e.west-t.west)<=n&&Math.abs(e.south-t.south)<=n&&Math.abs(e.east-t.east)<=n&&Math.abs(e.north-t.north)<=n},A.prototype.clone=function(e){return A.clone(this,e)},A.prototype.equals=function(e){return A.equals(this,e)},A.equals=function(e,t){return e===t||R.defined(e)&&R.defined(t)&&e.west===t.west&&e.south===t.south&&e.east===t.east&&e.north===t.north},A.prototype.equalsEpsilon=function(e,t){return A.equalsEpsilon(this,e,t)},A.validate=function(e){},A.southwest=function(e,t){return R.defined(t)?(t.longitude=e.west,t.latitude=e.south,t.height=0,t):new f(e.west,e.south)},A.northwest=function(e,t){return R.defined(t)?(t.longitude=e.west,t.latitude=e.north,t.height=0,t):new f(e.west,e.north)},A.northeast=function(e,t){return R.defined(t)?(t.longitude=e.east,t.latitude=e.north,t.height=0,t):new f(e.east,e.north)},A.southeast=function(e,t){return R.defined(t)?(t.longitude=e.east,t.latitude=e.south,t.height=0,t):new f(e.east,e.south)},A.center=function(e,t){var n=e.east,a=e.west;n<a&&(n+=V.CesiumMath.TWO_PI);var r=V.CesiumMath.negativePiToPi(.5*(a+n)),i=.5*(e.south+e.north);return R.defined(t)?(t.longitude=r,t.latitude=i,t.height=0,t):new f(r,i)},A.intersection=function(e,t,n){var a=e.east,r=e.west,i=t.east,u=t.west;a<r&&0<i?a+=V.CesiumMath.TWO_PI:i<u&&0<a&&(i+=V.CesiumMath.TWO_PI),a<r&&u<0?u+=V.CesiumMath.TWO_PI:i<u&&r<0&&(r+=V.CesiumMath.TWO_PI);var o=V.CesiumMath.negativePiToPi(Math.max(r,u)),d=V.CesiumMath.negativePiToPi(Math.min(a,i));if(!((e.west<e.east||t.west<t.east)&&d<=o)){var s=Math.max(e.south,t.south),h=Math.min(e.north,t.north);if(!(h<=s))return R.defined(n)?(n.west=o,n.south=s,n.east=d,n.north=h,n):new A(o,s,d,h)}},A.simpleIntersection=function(e,t,n){var a=Math.max(e.west,t.west),r=Math.max(e.south,t.south),i=Math.min(e.east,t.east),u=Math.min(e.north,t.north);if(!(u<=r||i<=a))return R.defined(n)?(n.west=a,n.south=r,n.east=i,n.north=u,n):new A(a,r,i,u)},A.union=function(e,t,n){R.defined(n)||(n=new A);var a=e.east,r=e.west,i=t.east,u=t.west;a<r&&0<i?a+=V.CesiumMath.TWO_PI:i<u&&0<a&&(i+=V.CesiumMath.TWO_PI),a<r&&u<0?u+=V.CesiumMath.TWO_PI:i<u&&r<0&&(r+=V.CesiumMath.TWO_PI);var o=V.CesiumMath.convertLongitudeRange(Math.min(r,u)),d=V.CesiumMath.convertLongitudeRange(Math.max(a,i));return n.west=o,n.south=Math.min(e.south,t.south),n.east=d,n.north=Math.max(e.north,t.north),n},A.expand=function(e,t,n){return R.defined(n)||(n=new A),n.west=Math.min(e.west,t.longitude),n.south=Math.min(e.south,t.latitude),n.east=Math.max(e.east,t.longitude),n.north=Math.max(e.north,t.latitude),n},A.contains=function(e,t){var n=t.longitude,a=t.latitude,r=e.west,i=e.east;return i<r&&(i+=V.CesiumMath.TWO_PI,n<0&&(n+=V.CesiumMath.TWO_PI)),(r<n||V.CesiumMath.equalsEpsilon(n,r,V.CesiumMath.EPSILON14))&&(n<i||V.CesiumMath.equalsEpsilon(n,i,V.CesiumMath.EPSILON14))&&a>=e.south&&a<=e.north};var P=new f;function N(e,t){this.x=R.defaultValue(e,0),this.y=R.defaultValue(t,0)}A.subsample=function(e,t,n,a){t=R.defaultValue(t,w.WGS84),n=R.defaultValue(n,0),R.defined(a)||(a=[]);var r=0,i=e.north,u=e.south,o=e.east,d=e.west,s=P;s.height=n,s.longitude=d,s.latitude=i,a[r]=t.cartographicToCartesian(s,a[r]),r++,s.longitude=o,a[r]=t.cartographicToCartesian(s,a[r]),r++,s.latitude=u,a[r]=t.cartographicToCartesian(s,a[r]),r++,s.longitude=d,a[r]=t.cartographicToCartesian(s,a[r]),r++,s.latitude=i<0?i:0<u?u:0;for(var h=1;h<8;++h)s.longitude=-Math.PI+h*V.CesiumMath.PI_OVER_TWO,A.contains(e,s)&&(a[r]=t.cartographicToCartesian(s,a[r]),r++);return 0===s.latitude&&(s.longitude=d,a[r]=t.cartographicToCartesian(s,a[r]),r++,s.longitude=o,a[r]=t.cartographicToCartesian(s,a[r]),r++),a.length=r,a},A.MAX_VALUE=Object.freeze(new A(-Math.PI,-V.CesiumMath.PI_OVER_TWO,Math.PI,V.CesiumMath.PI_OVER_TWO)),N.fromElements=function(e,t,n){return R.defined(n)?(n.x=e,n.y=t,n):new N(e,t)},N.fromCartesian3=N.clone=function(e,t){if(R.defined(e))return R.defined(t)?(t.x=e.x,t.y=e.y,t):new N(e.x,e.y)},N.fromCartesian4=N.clone,N.packedLength=2,N.pack=function(e,t,n){return n=R.defaultValue(n,0),t[n++]=e.x,t[n]=e.y,t},N.unpack=function(e,t,n){return t=R.defaultValue(t,0),R.defined(n)||(n=new N),n.x=e[t++],n.y=e[t],n},N.packArray=function(e,t){var n=e.length,a=2*n;if(R.defined(t)){if(!Array.isArray(t)&&t.length!==a)throw new i.DeveloperError("If result is a typed array, it must have exactly array.length * 2 elements");t.length!==a&&(t.length=a)}else t=new Array(a);for(var r=0;r<n;++r)N.pack(e[r],t,2*r);return t},N.unpackArray=function(e,t){var n=e.length;R.defined(t)?t.length=n/2:t=new Array(n/2);for(var a=0;a<n;a+=2){var r=a/2;t[r]=N.unpack(e,a,t[r])}return t},N.fromArray=N.unpack,N.maximumComponent=function(e){return Math.max(e.x,e.y)},N.minimumComponent=function(e){return Math.min(e.x,e.y)},N.minimumByComponent=function(e,t,n){return n.x=Math.min(e.x,t.x),n.y=Math.min(e.y,t.y),n},N.maximumByComponent=function(e,t,n){return n.x=Math.max(e.x,t.x),n.y=Math.max(e.y,t.y),n},N.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y},N.magnitude=function(e){return Math.sqrt(N.magnitudeSquared(e))};var U=new N;N.distance=function(e,t){return N.subtract(e,t,U),N.magnitude(U)},N.distanceSquared=function(e,t){return N.subtract(e,t,U),N.magnitudeSquared(U)},N.normalize=function(e,t){var n=N.magnitude(e);return t.x=e.x/n,t.y=e.y/n,t},N.dot=function(e,t){return e.x*t.x+e.y*t.y},N.multiplyComponents=function(e,t,n){return n.x=e.x*t.x,n.y=e.y*t.y,n},N.divideComponents=function(e,t,n){return n.x=e.x/t.x,n.y=e.y/t.y,n},N.add=function(e,t,n){return n.x=e.x+t.x,n.y=e.y+t.y,n},N.subtract=function(e,t,n){return n.x=e.x-t.x,n.y=e.y-t.y,n},N.multiplyByScalar=function(e,t,n){return n.x=e.x*t,n.y=e.y*t,n},N.divideByScalar=function(e,t,n){return n.x=e.x/t,n.y=e.y/t,n},N.negate=function(e,t){return t.x=-e.x,t.y=-e.y,t},N.abs=function(e,t){return t.x=Math.abs(e.x),t.y=Math.abs(e.y),t};var L=new N;N.lerp=function(e,t,n,a){return N.multiplyByScalar(t,n,L),a=N.multiplyByScalar(e,1-n,a),N.add(L,a,a)};var W=new N,k=new N;N.angleBetween=function(e,t){return N.normalize(e,W),N.normalize(t,k),V.CesiumMath.acosClamped(N.dot(W,k))};var B=new N;N.mostOrthogonalAxis=function(e,t){var n=N.normalize(e,B);return N.abs(n,n),t=n.x<=n.y?N.clone(N.UNIT_X,t):N.clone(N.UNIT_Y,t)},N.equals=function(e,t){return e===t||R.defined(e)&&R.defined(t)&&e.x===t.x&&e.y===t.y},N.equalsArray=function(e,t,n){return e.x===t[n]&&e.y===t[n+1]},N.equalsEpsilon=function(e,t,n,a){return e===t||R.defined(e)&&R.defined(t)&&V.CesiumMath.equalsEpsilon(e.x,t.x,n,a)&&V.CesiumMath.equalsEpsilon(e.y,t.y,n,a)},N.ZERO=Object.freeze(new N(0,0)),N.UNIT_X=Object.freeze(new N(1,0)),N.UNIT_Y=Object.freeze(new N(0,1)),N.prototype.clone=function(e){return N.clone(this,e)},N.prototype.equals=function(e){return N.equals(this,e)},N.prototype.equalsEpsilon=function(e,t,n){return N.equalsEpsilon(this,e,t,n)},N.prototype.toString=function(){return"("+this.x+", "+this.y+")"},e.Cartesian2=N,e.Cartesian3=b,e.Cartographic=f,e.Ellipsoid=w,e.Rectangle=A}); diff --git a/web/assets/Cesium/Workers/Check-6c0211bc.js b/web/assets/Cesium/Workers/Check-6c0211bc.js new file mode 100644 index 00000000..90d40195 --- /dev/null +++ b/web/assets/Cesium/Workers/Check-6c0211bc.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71"],function(e,n){"use strict";function r(e){var t;this.name="DeveloperError",this.message=e;try{throw new Error}catch(e){t=e.stack}this.stack=t}n.defined(Object.create)&&((r.prototype=Object.create(Error.prototype)).constructor=r),r.prototype.toString=function(){var e=this.name+": "+this.message;return n.defined(this.stack)&&(e+="\n"+this.stack.toString()),e},r.throwInstantiationError=function(){throw new r("This function defines an interface and should not be called directly.")};var a={};function o(e,t,n){return"Expected "+n+" to be typeof "+t+", actual typeof was "+e}a.typeOf={},a.defined=function(e,t){if(!n.defined(t))throw new r(e+" is required, actual value was undefined")},a.typeOf.func=function(e,t){if("function"!=typeof t)throw new r(o(typeof t,"function",e))},a.typeOf.string=function(e,t){if("string"!=typeof t)throw new r(o(typeof t,"string",e))},a.typeOf.number=function(e,t){if("number"!=typeof t)throw new r(o(typeof t,"number",e))},a.typeOf.number.lessThan=function(e,t,n){if(a.typeOf.number(e,t),n<=t)throw new r("Expected "+e+" to be less than "+n+", actual value was "+t)},a.typeOf.number.lessThanOrEquals=function(e,t,n){if(a.typeOf.number(e,t),n<t)throw new r("Expected "+e+" to be less than or equal to "+n+", actual value was "+t)},a.typeOf.number.greaterThan=function(e,t,n){if(a.typeOf.number(e,t),t<=n)throw new r("Expected "+e+" to be greater than "+n+", actual value was "+t)},a.typeOf.number.greaterThanOrEquals=function(e,t,n){if(a.typeOf.number(e,t),t<n)throw new r("Expected "+e+" to be greater than or equal to"+n+", actual value was "+t)},a.typeOf.object=function(e,t){if("object"!=typeof t)throw new r(o(typeof t,"object",e))},a.typeOf.bool=function(e,t){if("boolean"!=typeof t)throw new r(o(typeof t,"boolean",e))},a.typeOf.number.equals=function(e,t,n,o){if(a.typeOf.number(e,n),a.typeOf.number(t,o),n!==o)throw new r(e+" must be equal to "+t+", the actual values are "+n+" and "+o)},e.Check=a,e.DeveloperError=r}); diff --git a/web/assets/Cesium/Workers/Color-bc1ab1f9.js b/web/assets/Cesium/Workers/Color-bc1ab1f9.js new file mode 100644 index 00000000..25d94189 --- /dev/null +++ b/web/assets/Cesium/Workers/Color-bc1ab1f9.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Transforms-ec27f304"],function(e,O,r,g,o){"use strict";function i(e,r,o){return o<0&&(o+=1),1<o&&--o,6*o<1?e+6*(r-e)*o:2*o<1?r:3*o<2?e+(r-e)*(2/3-o)*6:e}function c(e,r,o,t){this.red=O.defaultValue(e,1),this.green=O.defaultValue(r,1),this.blue=O.defaultValue(o,1),this.alpha=O.defaultValue(t,1)}var t,f,s;c.fromCartesian4=function(e,r){return O.defined(r)?(r.red=e.x,r.green=e.y,r.blue=e.z,r.alpha=e.w,r):new c(e.x,e.y,e.z,e.w)},c.fromBytes=function(e,r,o,t,f){return e=c.byteToFloat(O.defaultValue(e,255)),r=c.byteToFloat(O.defaultValue(r,255)),o=c.byteToFloat(O.defaultValue(o,255)),t=c.byteToFloat(O.defaultValue(t,255)),O.defined(f)?(f.red=e,f.green=r,f.blue=o,f.alpha=t,f):new c(e,r,o,t)},c.fromAlpha=function(e,r,o){return O.defined(o)?(o.red=e.red,o.green=e.green,o.blue=e.blue,o.alpha=r,o):new c(e.red,e.green,e.blue,r)},o.FeatureDetection.supportsTypedArrays()&&(t=new ArrayBuffer(4),f=new Uint32Array(t),s=new Uint8Array(t)),c.fromRgba=function(e,r){return f[0]=e,c.fromBytes(s[0],s[1],s[2],s[3],r)},c.fromHsl=function(e,r,o,t,f){e=O.defaultValue(e,0)%1,r=O.defaultValue(r,0),o=O.defaultValue(o,0),t=O.defaultValue(t,1);var s,n,l=o,C=o,a=o;return 0!==r&&(l=i(n=2*o-(s=o<.5?o*(1+r):o+r-o*r),s,e+1/3),C=i(n,s,e),a=i(n,s,e-1/3)),O.defined(f)?(f.red=l,f.green=C,f.blue=a,f.alpha=t,f):new c(l,C,a,t)},c.fromRandom=function(e,r){var o,t,f=(e=O.defaultValue(e,O.defaultValue.EMPTY_OBJECT)).red;O.defined(f)||(o=O.defaultValue(e.minimumRed,0),t=O.defaultValue(e.maximumRed,1),f=o+g.CesiumMath.nextRandomNumber()*(t-o));var s,n,l=e.green;O.defined(l)||(s=O.defaultValue(e.minimumGreen,0),n=O.defaultValue(e.maximumGreen,1),l=s+g.CesiumMath.nextRandomNumber()*(n-s));var C,a,i=e.blue;O.defined(i)||(C=O.defaultValue(e.minimumBlue,0),a=O.defaultValue(e.maximumBlue,1),i=C+g.CesiumMath.nextRandomNumber()*(a-C));var E,u,b=e.alpha;return O.defined(b)||(E=O.defaultValue(e.minimumAlpha,0),u=O.defaultValue(e.maximumAlpha,1),b=E+g.CesiumMath.nextRandomNumber()*(u-E)),O.defined(r)?(r.red=f,r.green=l,r.blue=i,r.alpha=b,r):new c(f,l,i,b)};var n=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,l=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,C=/^rgba?\(\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)(?:\s*,\s*([0-9.]+))?\s*\)$/i,a=/^hsla?\(\s*([0-9.]+)\s*,\s*([0-9.]+%)\s*,\s*([0-9.]+%)(?:\s*,\s*([0-9.]+))?\s*\)$/i;c.fromCssColorString=function(e,r){O.defined(r)||(r=new c);var o=c[(e=e.replace(/\s/g,"")).toUpperCase()];if(O.defined(o))return c.clone(o,r),r;var t=n.exec(e);return null!==t?(r.red=parseInt(t[1],16)/15,r.green=parseInt(t[2],16)/15,r.blue=parseInt(t[3],16)/15,r.alpha=parseInt(O.defaultValue(t[4],"f"),16)/15,r):null!==(t=l.exec(e))?(r.red=parseInt(t[1],16)/255,r.green=parseInt(t[2],16)/255,r.blue=parseInt(t[3],16)/255,r.alpha=parseInt(O.defaultValue(t[4],"ff"),16)/255,r):null!==(t=C.exec(e))?(r.red=parseFloat(t[1])/("%"===t[1].substr(-1)?100:255),r.green=parseFloat(t[2])/("%"===t[2].substr(-1)?100:255),r.blue=parseFloat(t[3])/("%"===t[3].substr(-1)?100:255),r.alpha=parseFloat(O.defaultValue(t[4],"1.0")),r):null!==(t=a.exec(e))?c.fromHsl(parseFloat(t[1])/360,parseFloat(t[2])/100,parseFloat(t[3])/100,parseFloat(O.defaultValue(t[4],"1.0")),r):r=void 0},c.packedLength=4,c.pack=function(e,r,o){return o=O.defaultValue(o,0),r[o++]=e.red,r[o++]=e.green,r[o++]=e.blue,r[o]=e.alpha,r},c.unpack=function(e,r,o){return r=O.defaultValue(r,0),O.defined(o)||(o=new c),o.red=e[r++],o.green=e[r++],o.blue=e[r++],o.alpha=e[r],o},c.byteToFloat=function(e){return e/255},c.floatToByte=function(e){return 1===e?255:256*e|0},c.clone=function(e,r){if(O.defined(e))return O.defined(r)?(r.red=e.red,r.green=e.green,r.blue=e.blue,r.alpha=e.alpha,r):new c(e.red,e.green,e.blue,e.alpha)},c.equals=function(e,r){return e===r||O.defined(e)&&O.defined(r)&&e.red===r.red&&e.green===r.green&&e.blue===r.blue&&e.alpha===r.alpha},c.equalsArray=function(e,r,o){return e.red===r[o]&&e.green===r[o+1]&&e.blue===r[o+2]&&e.alpha===r[o+3]},c.prototype.clone=function(e){return c.clone(this,e)},c.prototype.equals=function(e){return c.equals(this,e)},c.prototype.equalsEpsilon=function(e,r){return this===e||O.defined(e)&&Math.abs(this.red-e.red)<=r&&Math.abs(this.green-e.green)<=r&&Math.abs(this.blue-e.blue)<=r&&Math.abs(this.alpha-e.alpha)<=r},c.prototype.toString=function(){return"("+this.red+", "+this.green+", "+this.blue+", "+this.alpha+")"},c.prototype.toCssColorString=function(){var e=c.floatToByte(this.red),r=c.floatToByte(this.green),o=c.floatToByte(this.blue);return 1===this.alpha?"rgb("+e+","+r+","+o+")":"rgba("+e+","+r+","+o+","+this.alpha+")"},c.prototype.toCssHexString=function(){var e=c.floatToByte(this.red).toString(16);e.length<2&&(e="0"+e);var r=c.floatToByte(this.green).toString(16);r.length<2&&(r="0"+r);var o=c.floatToByte(this.blue).toString(16);if(o.length<2&&(o="0"+o),this.alpha<1){var t=c.floatToByte(this.alpha).toString(16);return t.length<2&&(t="0"+t),"#"+e+r+o+t}return"#"+e+r+o},c.prototype.toBytes=function(e){var r=c.floatToByte(this.red),o=c.floatToByte(this.green),t=c.floatToByte(this.blue),f=c.floatToByte(this.alpha);return O.defined(e)?(e[0]=r,e[1]=o,e[2]=t,e[3]=f,e):[r,o,t,f]},c.prototype.toRgba=function(){return s[0]=c.floatToByte(this.red),s[1]=c.floatToByte(this.green),s[2]=c.floatToByte(this.blue),s[3]=c.floatToByte(this.alpha),f[0]},c.prototype.brighten=function(e,r){return e=1-e,r.red=1-(1-this.red)*e,r.green=1-(1-this.green)*e,r.blue=1-(1-this.blue)*e,r.alpha=this.alpha,r},c.prototype.darken=function(e,r){return e=1-e,r.red=this.red*e,r.green=this.green*e,r.blue=this.blue*e,r.alpha=this.alpha,r},c.prototype.withAlpha=function(e,r){return c.fromAlpha(this,e,r)},c.add=function(e,r,o){return o.red=e.red+r.red,o.green=e.green+r.green,o.blue=e.blue+r.blue,o.alpha=e.alpha+r.alpha,o},c.subtract=function(e,r,o){return o.red=e.red-r.red,o.green=e.green-r.green,o.blue=e.blue-r.blue,o.alpha=e.alpha-r.alpha,o},c.multiply=function(e,r,o){return o.red=e.red*r.red,o.green=e.green*r.green,o.blue=e.blue*r.blue,o.alpha=e.alpha*r.alpha,o},c.divide=function(e,r,o){return o.red=e.red/r.red,o.green=e.green/r.green,o.blue=e.blue/r.blue,o.alpha=e.alpha/r.alpha,o},c.mod=function(e,r,o){return o.red=e.red%r.red,o.green=e.green%r.green,o.blue=e.blue%r.blue,o.alpha=e.alpha%r.alpha,o},c.lerp=function(e,r,o,t){return t.red=g.CesiumMath.lerp(e.red,r.red,o),t.green=g.CesiumMath.lerp(e.green,r.green,o),t.blue=g.CesiumMath.lerp(e.blue,r.blue,o),t.alpha=g.CesiumMath.lerp(e.alpha,r.alpha,o),t},c.multiplyByScalar=function(e,r,o){return o.red=e.red*r,o.green=e.green*r,o.blue=e.blue*r,o.alpha=e.alpha*r,o},c.divideByScalar=function(e,r,o){return o.red=e.red/r,o.green=e.green/r,o.blue=e.blue/r,o.alpha=e.alpha/r,o},c.ALICEBLUE=Object.freeze(c.fromCssColorString("#F0F8FF")),c.ANTIQUEWHITE=Object.freeze(c.fromCssColorString("#FAEBD7")),c.AQUA=Object.freeze(c.fromCssColorString("#00FFFF")),c.AQUAMARINE=Object.freeze(c.fromCssColorString("#7FFFD4")),c.AZURE=Object.freeze(c.fromCssColorString("#F0FFFF")),c.BEIGE=Object.freeze(c.fromCssColorString("#F5F5DC")),c.BISQUE=Object.freeze(c.fromCssColorString("#FFE4C4")),c.BLACK=Object.freeze(c.fromCssColorString("#000000")),c.BLANCHEDALMOND=Object.freeze(c.fromCssColorString("#FFEBCD")),c.BLUE=Object.freeze(c.fromCssColorString("#0000FF")),c.BLUEVIOLET=Object.freeze(c.fromCssColorString("#8A2BE2")),c.BROWN=Object.freeze(c.fromCssColorString("#A52A2A")),c.BURLYWOOD=Object.freeze(c.fromCssColorString("#DEB887")),c.CADETBLUE=Object.freeze(c.fromCssColorString("#5F9EA0")),c.CHARTREUSE=Object.freeze(c.fromCssColorString("#7FFF00")),c.CHOCOLATE=Object.freeze(c.fromCssColorString("#D2691E")),c.CORAL=Object.freeze(c.fromCssColorString("#FF7F50")),c.CORNFLOWERBLUE=Object.freeze(c.fromCssColorString("#6495ED")),c.CORNSILK=Object.freeze(c.fromCssColorString("#FFF8DC")),c.CRIMSON=Object.freeze(c.fromCssColorString("#DC143C")),c.CYAN=Object.freeze(c.fromCssColorString("#00FFFF")),c.DARKBLUE=Object.freeze(c.fromCssColorString("#00008B")),c.DARKCYAN=Object.freeze(c.fromCssColorString("#008B8B")),c.DARKGOLDENROD=Object.freeze(c.fromCssColorString("#B8860B")),c.DARKGRAY=Object.freeze(c.fromCssColorString("#A9A9A9")),c.DARKGREEN=Object.freeze(c.fromCssColorString("#006400")),c.DARKGREY=c.DARKGRAY,c.DARKKHAKI=Object.freeze(c.fromCssColorString("#BDB76B")),c.DARKMAGENTA=Object.freeze(c.fromCssColorString("#8B008B")),c.DARKOLIVEGREEN=Object.freeze(c.fromCssColorString("#556B2F")),c.DARKORANGE=Object.freeze(c.fromCssColorString("#FF8C00")),c.DARKORCHID=Object.freeze(c.fromCssColorString("#9932CC")),c.DARKRED=Object.freeze(c.fromCssColorString("#8B0000")),c.DARKSALMON=Object.freeze(c.fromCssColorString("#E9967A")),c.DARKSEAGREEN=Object.freeze(c.fromCssColorString("#8FBC8F")),c.DARKSLATEBLUE=Object.freeze(c.fromCssColorString("#483D8B")),c.DARKSLATEGRAY=Object.freeze(c.fromCssColorString("#2F4F4F")),c.DARKSLATEGREY=c.DARKSLATEGRAY,c.DARKTURQUOISE=Object.freeze(c.fromCssColorString("#00CED1")),c.DARKVIOLET=Object.freeze(c.fromCssColorString("#9400D3")),c.DEEPPINK=Object.freeze(c.fromCssColorString("#FF1493")),c.DEEPSKYBLUE=Object.freeze(c.fromCssColorString("#00BFFF")),c.DIMGRAY=Object.freeze(c.fromCssColorString("#696969")),c.DIMGREY=c.DIMGRAY,c.DODGERBLUE=Object.freeze(c.fromCssColorString("#1E90FF")),c.FIREBRICK=Object.freeze(c.fromCssColorString("#B22222")),c.FLORALWHITE=Object.freeze(c.fromCssColorString("#FFFAF0")),c.FORESTGREEN=Object.freeze(c.fromCssColorString("#228B22")),c.FUCHSIA=Object.freeze(c.fromCssColorString("#FF00FF")),c.GAINSBORO=Object.freeze(c.fromCssColorString("#DCDCDC")),c.GHOSTWHITE=Object.freeze(c.fromCssColorString("#F8F8FF")),c.GOLD=Object.freeze(c.fromCssColorString("#FFD700")),c.GOLDENROD=Object.freeze(c.fromCssColorString("#DAA520")),c.GRAY=Object.freeze(c.fromCssColorString("#808080")),c.GREEN=Object.freeze(c.fromCssColorString("#008000")),c.GREENYELLOW=Object.freeze(c.fromCssColorString("#ADFF2F")),c.GREY=c.GRAY,c.HONEYDEW=Object.freeze(c.fromCssColorString("#F0FFF0")),c.HOTPINK=Object.freeze(c.fromCssColorString("#FF69B4")),c.INDIANRED=Object.freeze(c.fromCssColorString("#CD5C5C")),c.INDIGO=Object.freeze(c.fromCssColorString("#4B0082")),c.IVORY=Object.freeze(c.fromCssColorString("#FFFFF0")),c.KHAKI=Object.freeze(c.fromCssColorString("#F0E68C")),c.LAVENDER=Object.freeze(c.fromCssColorString("#E6E6FA")),c.LAVENDAR_BLUSH=Object.freeze(c.fromCssColorString("#FFF0F5")),c.LAWNGREEN=Object.freeze(c.fromCssColorString("#7CFC00")),c.LEMONCHIFFON=Object.freeze(c.fromCssColorString("#FFFACD")),c.LIGHTBLUE=Object.freeze(c.fromCssColorString("#ADD8E6")),c.LIGHTCORAL=Object.freeze(c.fromCssColorString("#F08080")),c.LIGHTCYAN=Object.freeze(c.fromCssColorString("#E0FFFF")),c.LIGHTGOLDENRODYELLOW=Object.freeze(c.fromCssColorString("#FAFAD2")),c.LIGHTGRAY=Object.freeze(c.fromCssColorString("#D3D3D3")),c.LIGHTGREEN=Object.freeze(c.fromCssColorString("#90EE90")),c.LIGHTGREY=c.LIGHTGRAY,c.LIGHTPINK=Object.freeze(c.fromCssColorString("#FFB6C1")),c.LIGHTSEAGREEN=Object.freeze(c.fromCssColorString("#20B2AA")),c.LIGHTSKYBLUE=Object.freeze(c.fromCssColorString("#87CEFA")),c.LIGHTSLATEGRAY=Object.freeze(c.fromCssColorString("#778899")),c.LIGHTSLATEGREY=c.LIGHTSLATEGRAY,c.LIGHTSTEELBLUE=Object.freeze(c.fromCssColorString("#B0C4DE")),c.LIGHTYELLOW=Object.freeze(c.fromCssColorString("#FFFFE0")),c.LIME=Object.freeze(c.fromCssColorString("#00FF00")),c.LIMEGREEN=Object.freeze(c.fromCssColorString("#32CD32")),c.LINEN=Object.freeze(c.fromCssColorString("#FAF0E6")),c.MAGENTA=Object.freeze(c.fromCssColorString("#FF00FF")),c.MAROON=Object.freeze(c.fromCssColorString("#800000")),c.MEDIUMAQUAMARINE=Object.freeze(c.fromCssColorString("#66CDAA")),c.MEDIUMBLUE=Object.freeze(c.fromCssColorString("#0000CD")),c.MEDIUMORCHID=Object.freeze(c.fromCssColorString("#BA55D3")),c.MEDIUMPURPLE=Object.freeze(c.fromCssColorString("#9370DB")),c.MEDIUMSEAGREEN=Object.freeze(c.fromCssColorString("#3CB371")),c.MEDIUMSLATEBLUE=Object.freeze(c.fromCssColorString("#7B68EE")),c.MEDIUMSPRINGGREEN=Object.freeze(c.fromCssColorString("#00FA9A")),c.MEDIUMTURQUOISE=Object.freeze(c.fromCssColorString("#48D1CC")),c.MEDIUMVIOLETRED=Object.freeze(c.fromCssColorString("#C71585")),c.MIDNIGHTBLUE=Object.freeze(c.fromCssColorString("#191970")),c.MINTCREAM=Object.freeze(c.fromCssColorString("#F5FFFA")),c.MISTYROSE=Object.freeze(c.fromCssColorString("#FFE4E1")),c.MOCCASIN=Object.freeze(c.fromCssColorString("#FFE4B5")),c.NAVAJOWHITE=Object.freeze(c.fromCssColorString("#FFDEAD")),c.NAVY=Object.freeze(c.fromCssColorString("#000080")),c.OLDLACE=Object.freeze(c.fromCssColorString("#FDF5E6")),c.OLIVE=Object.freeze(c.fromCssColorString("#808000")),c.OLIVEDRAB=Object.freeze(c.fromCssColorString("#6B8E23")),c.ORANGE=Object.freeze(c.fromCssColorString("#FFA500")),c.ORANGERED=Object.freeze(c.fromCssColorString("#FF4500")),c.ORCHID=Object.freeze(c.fromCssColorString("#DA70D6")),c.PALEGOLDENROD=Object.freeze(c.fromCssColorString("#EEE8AA")),c.PALEGREEN=Object.freeze(c.fromCssColorString("#98FB98")),c.PALETURQUOISE=Object.freeze(c.fromCssColorString("#AFEEEE")),c.PALEVIOLETRED=Object.freeze(c.fromCssColorString("#DB7093")),c.PAPAYAWHIP=Object.freeze(c.fromCssColorString("#FFEFD5")),c.PEACHPUFF=Object.freeze(c.fromCssColorString("#FFDAB9")),c.PERU=Object.freeze(c.fromCssColorString("#CD853F")),c.PINK=Object.freeze(c.fromCssColorString("#FFC0CB")),c.PLUM=Object.freeze(c.fromCssColorString("#DDA0DD")),c.POWDERBLUE=Object.freeze(c.fromCssColorString("#B0E0E6")),c.PURPLE=Object.freeze(c.fromCssColorString("#800080")),c.RED=Object.freeze(c.fromCssColorString("#FF0000")),c.ROSYBROWN=Object.freeze(c.fromCssColorString("#BC8F8F")),c.ROYALBLUE=Object.freeze(c.fromCssColorString("#4169E1")),c.SADDLEBROWN=Object.freeze(c.fromCssColorString("#8B4513")),c.SALMON=Object.freeze(c.fromCssColorString("#FA8072")),c.SANDYBROWN=Object.freeze(c.fromCssColorString("#F4A460")),c.SEAGREEN=Object.freeze(c.fromCssColorString("#2E8B57")),c.SEASHELL=Object.freeze(c.fromCssColorString("#FFF5EE")),c.SIENNA=Object.freeze(c.fromCssColorString("#A0522D")),c.SILVER=Object.freeze(c.fromCssColorString("#C0C0C0")),c.SKYBLUE=Object.freeze(c.fromCssColorString("#87CEEB")),c.SLATEBLUE=Object.freeze(c.fromCssColorString("#6A5ACD")),c.SLATEGRAY=Object.freeze(c.fromCssColorString("#708090")),c.SLATEGREY=c.SLATEGRAY,c.SNOW=Object.freeze(c.fromCssColorString("#FFFAFA")),c.SPRINGGREEN=Object.freeze(c.fromCssColorString("#00FF7F")),c.STEELBLUE=Object.freeze(c.fromCssColorString("#4682B4")),c.TAN=Object.freeze(c.fromCssColorString("#D2B48C")),c.TEAL=Object.freeze(c.fromCssColorString("#008080")),c.THISTLE=Object.freeze(c.fromCssColorString("#D8BFD8")),c.TOMATO=Object.freeze(c.fromCssColorString("#FF6347")),c.TURQUOISE=Object.freeze(c.fromCssColorString("#40E0D0")),c.VIOLET=Object.freeze(c.fromCssColorString("#EE82EE")),c.WHEAT=Object.freeze(c.fromCssColorString("#F5DEB3")),c.WHITE=Object.freeze(c.fromCssColorString("#FFFFFF")),c.WHITESMOKE=Object.freeze(c.fromCssColorString("#F5F5F5")),c.YELLOW=Object.freeze(c.fromCssColorString("#FFFF00")),c.YELLOWGREEN=Object.freeze(c.fromCssColorString("#9ACD32")),c.TRANSPARENT=Object.freeze(new c(0,0,0,0)),e.Color=c}); diff --git a/web/assets/Cesium/Workers/ComponentDatatype-6d99a1ee.js b/web/assets/Cesium/Workers/ComponentDatatype-6d99a1ee.js new file mode 100644 index 00000000..0fe53f87 --- /dev/null +++ b/web/assets/Cesium/Workers/ComponentDatatype-6d99a1ee.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./WebGLConstants-76bb35d1"],function(r,a,e,n){"use strict";var E={BYTE:n.WebGLConstants.BYTE,UNSIGNED_BYTE:n.WebGLConstants.UNSIGNED_BYTE,SHORT:n.WebGLConstants.SHORT,UNSIGNED_SHORT:n.WebGLConstants.UNSIGNED_SHORT,INT:n.WebGLConstants.INT,UNSIGNED_INT:n.WebGLConstants.UNSIGNED_INT,FLOAT:n.WebGLConstants.FLOAT,DOUBLE:n.WebGLConstants.DOUBLE,getSizeInBytes:function(r){switch(r){case E.BYTE:return Int8Array.BYTES_PER_ELEMENT;case E.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case E.SHORT:return Int16Array.BYTES_PER_ELEMENT;case E.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case E.INT:return Int32Array.BYTES_PER_ELEMENT;case E.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT;case E.FLOAT:return Float32Array.BYTES_PER_ELEMENT;case E.DOUBLE:return Float64Array.BYTES_PER_ELEMENT}},fromTypedArray:function(r){return r instanceof Int8Array?E.BYTE:r instanceof Uint8Array?E.UNSIGNED_BYTE:r instanceof Int16Array?E.SHORT:r instanceof Uint16Array?E.UNSIGNED_SHORT:r instanceof Int32Array?E.INT:r instanceof Uint32Array?E.UNSIGNED_INT:r instanceof Float32Array?E.FLOAT:r instanceof Float64Array?E.DOUBLE:void 0},validate:function(r){return a.defined(r)&&(r===E.BYTE||r===E.UNSIGNED_BYTE||r===E.SHORT||r===E.UNSIGNED_SHORT||r===E.INT||r===E.UNSIGNED_INT||r===E.FLOAT||r===E.DOUBLE)},createTypedArray:function(r,e){switch(r){case E.BYTE:return new Int8Array(e);case E.UNSIGNED_BYTE:return new Uint8Array(e);case E.SHORT:return new Int16Array(e);case E.UNSIGNED_SHORT:return new Uint16Array(e);case E.INT:return new Int32Array(e);case E.UNSIGNED_INT:return new Uint32Array(e);case E.FLOAT:return new Float32Array(e);case E.DOUBLE:return new Float64Array(e)}},createArrayBufferView:function(r,e,n,t){switch(n=a.defaultValue(n,0),t=a.defaultValue(t,(e.byteLength-n)/E.getSizeInBytes(r)),r){case E.BYTE:return new Int8Array(e,n,t);case E.UNSIGNED_BYTE:return new Uint8Array(e,n,t);case E.SHORT:return new Int16Array(e,n,t);case E.UNSIGNED_SHORT:return new Uint16Array(e,n,t);case E.INT:return new Int32Array(e,n,t);case E.UNSIGNED_INT:return new Uint32Array(e,n,t);case E.FLOAT:return new Float32Array(e,n,t);case E.DOUBLE:return new Float64Array(e,n,t)}},fromName:function(r){switch(r){case"BYTE":return E.BYTE;case"UNSIGNED_BYTE":return E.UNSIGNED_BYTE;case"SHORT":return E.SHORT;case"UNSIGNED_SHORT":return E.UNSIGNED_SHORT;case"INT":return E.INT;case"UNSIGNED_INT":return E.UNSIGNED_INT;case"FLOAT":return E.FLOAT;case"DOUBLE":return E.DOUBLE}}},t=Object.freeze(E);r.ComponentDatatype=t}); diff --git a/web/assets/Cesium/Workers/CoplanarPolygonGeometryLibrary-dc8e954f.js b/web/assets/Cesium/Workers/CoplanarPolygonGeometryLibrary-dc8e954f.js new file mode 100644 index 00000000..2b353c3f --- /dev/null +++ b/web/assets/Cesium/Workers/CoplanarPolygonGeometryLibrary-dc8e954f.js @@ -0,0 +1 @@ +define(["exports","./Check-6c0211bc","./Cartesian2-bddc1162","./Transforms-ec27f304","./OrientedBoundingBox-c9ad91c4"],function(n,t,f,x,B){"use strict";var e={},s=new f.Cartesian3,P=new f.Cartesian3,M=new f.Cartesian3,h=new f.Cartesian3,v=new B.OrientedBoundingBox;function o(n,t,e,r,a){var i=f.Cartesian3.subtract(n,t,s),o=f.Cartesian3.dot(e,i),u=f.Cartesian3.dot(r,i);return f.Cartesian2.fromElements(o,u,a)}e.validOutline=function(n){var t=B.OrientedBoundingBox.fromPoints(n,v).halfAxes,e=x.Matrix3.getColumn(t,0,P),r=x.Matrix3.getColumn(t,1,M),a=x.Matrix3.getColumn(t,2,h),i=f.Cartesian3.magnitude(e),o=f.Cartesian3.magnitude(r),u=f.Cartesian3.magnitude(a);return!(0===i&&(0===o||0===u)||0===o&&0===u)},e.computeProjectTo2DArguments=function(n,t,e,r){var a,i,o=B.OrientedBoundingBox.fromPoints(n,v),u=o.halfAxes,s=x.Matrix3.getColumn(u,0,P),c=x.Matrix3.getColumn(u,1,M),C=x.Matrix3.getColumn(u,2,h),m=f.Cartesian3.magnitude(s),d=f.Cartesian3.magnitude(c),g=f.Cartesian3.magnitude(C),l=Math.min(m,d,g);return(0!==m||0!==d&&0!==g)&&(0!==d||0!==g)&&(l!==d&&l!==g||(a=s),l===m?a=c:l===g&&(i=c),l!==m&&l!==d||(i=C),f.Cartesian3.normalize(a,e),f.Cartesian3.normalize(i,r),f.Cartesian3.clone(o.center,t),!0)},e.createProjectPointsTo2DFunction=function(r,a,i){return function(n){for(var t=new Array(n.length),e=0;e<n.length;e++)t[e]=o(n[e],r,a,i);return t}},e.createProjectPointTo2DFunction=function(e,r,a){return function(n,t){return o(n,e,r,a,t)}},n.CoplanarPolygonGeometryLibrary=e}); diff --git a/web/assets/Cesium/Workers/CorridorGeometryLibrary-38c8d28f.js b/web/assets/Cesium/Workers/CorridorGeometryLibrary-38c8d28f.js new file mode 100644 index 00000000..979a6b75 --- /dev/null +++ b/web/assets/Cesium/Workers/CorridorGeometryLibrary-38c8d28f.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./PolylineVolumeGeometryLibrary-ec7dce94","./PolylinePipeline-8a1a1e4f"],function(a,o,U,G,c,I,q){"use strict";var e={},j=new G.Cartesian3,p=new G.Cartesian3,m=new G.Cartesian3,g=new G.Cartesian3,k=[new G.Cartesian3,new G.Cartesian3],F=new G.Cartesian3,H=new G.Cartesian3,J=new G.Cartesian3,K=new G.Cartesian3,W=new G.Cartesian3,X=new G.Cartesian3,Y=new G.Cartesian3,Z=new G.Cartesian3,$=new G.Cartesian3,_=new G.Cartesian3,d=new c.Quaternion,h=new c.Matrix3;function aa(a,e,r,n,t){var i,s=G.Cartesian3.angleBetween(G.Cartesian3.subtract(e,a,j),G.Cartesian3.subtract(r,a,p)),o=n===I.CornerType.BEVELED?1:Math.ceil(s/U.CesiumMath.toRadians(5))+1,C=3*o,l=new Array(C);l[C-3]=r.x,l[C-2]=r.y,l[C-1]=r.z,i=t?c.Matrix3.fromQuaternion(c.Quaternion.fromAxisAngle(G.Cartesian3.negate(a,j),s/o,d),h):c.Matrix3.fromQuaternion(c.Quaternion.fromAxisAngle(a,s/o,d),h);var y=0;e=G.Cartesian3.clone(e,j);for(var u=0;u<o;u++)e=c.Matrix3.multiplyByVector(i,e,e),l[y++]=e.x,l[y++]=e.y,l[y++]=e.z;return l}function ea(a,e,r,n){var t=j;return[(t=(n||(e=G.Cartesian3.negate(e,e)),G.Cartesian3.add(a,e,t))).x,t.y,t.z,r.x,r.y,r.z]}function ra(a,e,r,n){for(var t=new Array(a.length),i=new Array(a.length),s=G.Cartesian3.multiplyByScalar(e,r,j),o=G.Cartesian3.negate(s,p),C=0,l=a.length-1,y=0;y<a.length;y+=3){var u=G.Cartesian3.fromArray(a,y,m),c=G.Cartesian3.add(u,o,g);t[C++]=c.x,t[C++]=c.y,t[C++]=c.z;var d=G.Cartesian3.add(u,s,g);i[l--]=d.z,i[l--]=d.y,i[l--]=d.x}return n.push(t,i),n}e.addAttribute=function(a,e,r,n){var t=e.x,i=e.y,s=e.z;o.defined(r)&&(a[r]=t,a[r+1]=i,a[r+2]=s),o.defined(n)&&(a[n]=s,a[n-1]=i,a[n-2]=t)};var na=new G.Cartesian3,ta=new G.Cartesian3;e.computePositions=function(a){var e=a.granularity,r=a.positions,n=a.ellipsoid,t=a.width/2,i=a.cornerType,s=a.saveAttributes,o=F,C=H,l=J,y=K,u=W,c=X,d=Y,p=Z,m=$,g=_,h=[],f=s?[]:void 0,w=s?[]:void 0,z=r[0],x=r[1],C=G.Cartesian3.normalize(G.Cartesian3.subtract(x,z,C),C),o=n.geodeticSurfaceNormal(z,o),y=G.Cartesian3.normalize(G.Cartesian3.cross(o,C,y),y);s&&(f.push(y.x,y.y,y.z),w.push(o.x,o.y,o.z)),d=G.Cartesian3.clone(z,d),z=x,l=G.Cartesian3.negate(C,l);for(var P,v,A,B,E,S,b,D,M,T=[],N=r.length,L=1;L<N-1;L++){o=n.geodeticSurfaceNormal(z,o),x=r[L+1],C=G.Cartesian3.normalize(G.Cartesian3.subtract(x,z,C),C),u=G.Cartesian3.normalize(G.Cartesian3.add(C,l,u),u);var O=G.Cartesian3.multiplyByScalar(o,G.Cartesian3.dot(C,o),na);G.Cartesian3.subtract(C,O,O),G.Cartesian3.normalize(O,O);var R,V,Q=G.Cartesian3.multiplyByScalar(o,G.Cartesian3.dot(l,o),ta);G.Cartesian3.subtract(l,Q,Q),G.Cartesian3.normalize(Q,Q),U.CesiumMath.equalsEpsilon(Math.abs(G.Cartesian3.dot(O,Q)),1,U.CesiumMath.EPSILON7)||(u=G.Cartesian3.cross(u,o,u),u=G.Cartesian3.cross(o,u,u),u=G.Cartesian3.normalize(u,u),R=t/Math.max(.25,G.Cartesian3.magnitude(G.Cartesian3.cross(u,l,j))),V=I.PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(C,l,z,n),u=G.Cartesian3.multiplyByScalar(u,R,u),V?(p=G.Cartesian3.add(z,u,p),g=G.Cartesian3.add(p,G.Cartesian3.multiplyByScalar(y,t,g),g),m=G.Cartesian3.add(p,G.Cartesian3.multiplyByScalar(y,2*t,m),m),k[0]=G.Cartesian3.clone(d,k[0]),k[1]=G.Cartesian3.clone(g,k[1]),h=ra(q.PolylinePipeline.generateArc({positions:k,granularity:e,ellipsoid:n}),y,t,h),s&&(f.push(y.x,y.y,y.z),w.push(o.x,o.y,o.z)),c=G.Cartesian3.clone(m,c),y=G.Cartesian3.normalize(G.Cartesian3.cross(o,C,y),y),m=G.Cartesian3.add(p,G.Cartesian3.multiplyByScalar(y,2*t,m),m),d=G.Cartesian3.add(p,G.Cartesian3.multiplyByScalar(y,t,d),d),i===I.CornerType.ROUNDED||i===I.CornerType.BEVELED?T.push({leftPositions:aa(p,c,m,i,V)}):T.push({leftPositions:ea(z,G.Cartesian3.negate(u,u),m,V)})):(m=G.Cartesian3.add(z,u,m),g=G.Cartesian3.add(m,G.Cartesian3.negate(G.Cartesian3.multiplyByScalar(y,t,g),g),g),p=G.Cartesian3.add(m,G.Cartesian3.negate(G.Cartesian3.multiplyByScalar(y,2*t,p),p),p),k[0]=G.Cartesian3.clone(d,k[0]),k[1]=G.Cartesian3.clone(g,k[1]),h=ra(q.PolylinePipeline.generateArc({positions:k,granularity:e,ellipsoid:n}),y,t,h),s&&(f.push(y.x,y.y,y.z),w.push(o.x,o.y,o.z)),c=G.Cartesian3.clone(p,c),y=G.Cartesian3.normalize(G.Cartesian3.cross(o,C,y),y),p=G.Cartesian3.add(m,G.Cartesian3.negate(G.Cartesian3.multiplyByScalar(y,2*t,p),p),p),d=G.Cartesian3.add(m,G.Cartesian3.negate(G.Cartesian3.multiplyByScalar(y,t,d),d),d),i===I.CornerType.ROUNDED||i===I.CornerType.BEVELED?T.push({rightPositions:aa(m,c,p,i,V)}):T.push({rightPositions:ea(z,u,p,V)})),l=G.Cartesian3.negate(C,l)),z=x}return o=n.geodeticSurfaceNormal(z,o),k[0]=G.Cartesian3.clone(d,k[0]),k[1]=G.Cartesian3.clone(z,k[1]),h=ra(q.PolylinePipeline.generateArc({positions:k,granularity:e,ellipsoid:n}),y,t,h),s&&(f.push(y.x,y.y,y.z),w.push(o.x,o.y,o.z)),i===I.CornerType.ROUNDED&&(A=F,B=H,E=J,S=(v=h)[1],B=G.Cartesian3.fromArray(v[1],S.length-3,B),E=G.Cartesian3.fromArray(v[0],0,E),b=aa(A=G.Cartesian3.midpoint(B,E,A),B,E,I.CornerType.ROUNDED,!1),D=v.length-1,M=v[D-1],S=v[D],B=G.Cartesian3.fromArray(M,M.length-3,B),E=G.Cartesian3.fromArray(S,0,E),P=[b,aa(A=G.Cartesian3.midpoint(B,E,A),B,E,I.CornerType.ROUNDED,!1)]),{positions:h,corners:T,lefts:f,normals:w,endPositions:P}},a.CorridorGeometryLibrary=e}); diff --git a/web/assets/Cesium/Workers/CylinderGeometry-01400a36.js b/web/assets/Cesium/Workers/CylinderGeometry-01400a36.js new file mode 100644 index 00000000..cf311089 --- /dev/null +++ b/web/assets/Cesium/Workers/CylinderGeometry-01400a36.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./CylinderGeometryLibrary-b0214ab1"],function(t,I,e,U,S,B,Y,Z,J,W,j,u,q){"use strict";var H=new S.Cartesian2,K=new S.Cartesian3,Q=new S.Cartesian3,X=new S.Cartesian3,$=new S.Cartesian3;function f(t){var e=(t=I.defaultValue(t,I.defaultValue.EMPTY_OBJECT)).length,a=t.topRadius,r=t.bottomRadius,n=I.defaultValue(t.vertexFormat,u.VertexFormat.DEFAULT),o=I.defaultValue(t.slices,128);this._length=e,this._topRadius=a,this._bottomRadius=r,this._vertexFormat=u.VertexFormat.clone(n),this._slices=o,this._offsetAttribute=t.offsetAttribute,this._workerName="createCylinderGeometry"}f.packedLength=u.VertexFormat.packedLength+5,f.pack=function(t,e,a){return a=I.defaultValue(a,0),u.VertexFormat.pack(t._vertexFormat,e,a),a+=u.VertexFormat.packedLength,e[a++]=t._length,e[a++]=t._topRadius,e[a++]=t._bottomRadius,e[a++]=t._slices,e[a]=I.defaultValue(t._offsetAttribute,-1),e};var a,d=new u.VertexFormat,p={vertexFormat:d,length:void 0,topRadius:void 0,bottomRadius:void 0,slices:void 0,offsetAttribute:void 0};f.unpack=function(t,e,a){e=I.defaultValue(e,0);var r=u.VertexFormat.unpack(t,e,d);e+=u.VertexFormat.packedLength;var n=t[e++],o=t[e++],i=t[e++],s=t[e++],m=t[e];return I.defined(a)?(a._vertexFormat=u.VertexFormat.clone(r,a._vertexFormat),a._length=n,a._topRadius=o,a._bottomRadius=i,a._slices=s,a._offsetAttribute=-1===m?void 0:m,a):(p.length=n,p.topRadius=o,p.bottomRadius=i,p.slices=s,p.offsetAttribute=-1===m?void 0:m,new f(p))},f.createGeometry=function(t){var e=t._length,a=t._topRadius,r=t._bottomRadius,n=t._vertexFormat,o=t._slices;if(!(e<=0||a<0||r<0||0===a&&0===r)){var i=o+o,s=o+i,m=i+i,u=q.CylinderGeometryLibrary.computePositions(e,a,r,o,!0),f=n.st?new Float32Array(2*m):void 0,d=n.normal?new Float32Array(3*m):void 0,p=n.tangent?new Float32Array(3*m):void 0,y=n.bitangent?new Float32Array(3*m):void 0,c=n.normal||n.tangent||n.bitangent;if(c){var l=n.tangent||n.bitangent,b=0,v=0,A=0,g=Math.atan2(r-a,e),h=K;h.z=Math.sin(g);for(var x=Math.cos(g),_=X,C=Q,F=0;F<o;F++){var w=F/o*U.CesiumMath.TWO_PI,G=x*Math.cos(w),D=x*Math.sin(w);c&&(h.x=G,h.y=D,l&&(_=S.Cartesian3.normalize(S.Cartesian3.cross(S.Cartesian3.UNIT_Z,h,_),_)),n.normal&&(d[b++]=h.x,d[b++]=h.y,d[b++]=h.z,d[b++]=h.x,d[b++]=h.y,d[b++]=h.z),n.tangent&&(p[v++]=_.x,p[v++]=_.y,p[v++]=_.z,p[v++]=_.x,p[v++]=_.y,p[v++]=_.z),n.bitangent&&(C=S.Cartesian3.normalize(S.Cartesian3.cross(h,_,C),C),y[A++]=C.x,y[A++]=C.y,y[A++]=C.z,y[A++]=C.x,y[A++]=C.y,y[A++]=C.z))}for(F=0;F<o;F++)n.normal&&(d[b++]=0,d[b++]=0,d[b++]=-1),n.tangent&&(p[v++]=1,p[v++]=0,p[v++]=0),n.bitangent&&(y[A++]=0,y[A++]=-1,y[A++]=0);for(F=0;F<o;F++)n.normal&&(d[b++]=0,d[b++]=0,d[b++]=1),n.tangent&&(p[v++]=1,p[v++]=0,p[v++]=0),n.bitangent&&(y[A++]=0,y[A++]=1,y[A++]=0)}var R=12*o-12,V=W.IndexDatatype.createTypedArray(m,R),T=0,O=0;for(F=0;F<o-1;F++)V[T++]=O,V[T++]=O+2,V[T++]=O+3,V[T++]=O,V[T++]=O+3,V[T++]=O+1,O+=2;for(V[T++]=i-2,V[T++]=0,V[T++]=1,V[T++]=i-2,V[T++]=1,V[T++]=i-1,F=1;F<o-1;F++)V[T++]=i+F+1,V[T++]=i+F,V[T++]=i;for(F=1;F<o-1;F++)V[T++]=s,V[T++]=s+F,V[T++]=s+F+1;var L=0;if(n.st){var P=Math.max(a,r);for(F=0;F<m;F++){var k=S.Cartesian3.fromArray(u,3*F,$);f[L++]=(k.x+P)/(2*P),f[L++]=(k.y+P)/(2*P)}}var M=new J.GeometryAttributes;n.position&&(M.position=new Z.GeometryAttribute({componentDatatype:Y.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:u})),n.normal&&(M.normal=new Z.GeometryAttribute({componentDatatype:Y.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:d})),n.tangent&&(M.tangent=new Z.GeometryAttribute({componentDatatype:Y.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:p})),n.bitangent&&(M.bitangent=new Z.GeometryAttribute({componentDatatype:Y.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:y})),n.st&&(M.st=new Z.GeometryAttribute({componentDatatype:Y.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:f})),H.x=.5*e,H.y=Math.max(r,a);var z,E,N=new B.BoundingSphere(S.Cartesian3.ZERO,S.Cartesian2.magnitude(H));return I.defined(t._offsetAttribute)&&(e=u.length,z=new Uint8Array(e/3),E=t._offsetAttribute===j.GeometryOffsetAttribute.NONE?0:1,j.arrayFill(z,E),M.applyOffset=new Z.GeometryAttribute({componentDatatype:Y.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:z})),new Z.Geometry({attributes:M,indices:V,primitiveType:Z.PrimitiveType.TRIANGLES,boundingSphere:N,offsetAttribute:t._offsetAttribute})}},f.getUnitCylinder=function(){return I.defined(a)||(a=f.createGeometry(new f({topRadius:1,bottomRadius:1,length:1,vertexFormat:u.VertexFormat.POSITION_ONLY}))),a},t.CylinderGeometry=f}); diff --git a/web/assets/Cesium/Workers/CylinderGeometryLibrary-b0214ab1.js b/web/assets/Cesium/Workers/CylinderGeometryLibrary-b0214ab1.js new file mode 100644 index 00000000..7618e7fb --- /dev/null +++ b/web/assets/Cesium/Workers/CylinderGeometryLibrary-b0214ab1.js @@ -0,0 +1 @@ +define(["exports","./Math-fc8cecf5"],function(r,b){"use strict";var t={computePositions:function(r,t,e,a,i){for(var n=.5*r,o=-n,c=a+a,s=new Float64Array(3*(i?2*c:c)),f=0,u=0,h=i?3*c:0,y=i?3*(c+a):3*a,M=0;M<a;M++){var m=M/a*b.CesiumMath.TWO_PI,v=Math.cos(m),d=Math.sin(m),l=v*e,p=d*e,C=v*t,P=d*t;s[u+h]=l,s[u+h+1]=p,s[u+h+2]=o,s[u+y]=C,s[u+y+1]=P,s[u+y+2]=n,u+=3,i&&(s[f++]=l,s[f++]=p,s[f++]=o,s[f++]=C,s[f++]=P,s[f++]=n)}return s}};r.CylinderGeometryLibrary=t}); diff --git a/web/assets/Cesium/Workers/EllipseGeometry-b2472656.js b/web/assets/Cesium/Workers/EllipseGeometry-b2472656.js new file mode 100644 index 00000000..86fafadf --- /dev/null +++ b/web/assets/Cesium/Workers/EllipseGeometry-b2472656.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./GeometryPipeline-b49b2e59","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./EllipseGeometryLibrary-c9c767e4","./GeometryInstance-11f9a3bd"],function(t,U,e,p,Q,W,J,q,Z,b,C,K,f,B,v){"use strict";var X=new Q.Cartesian3,$=new Q.Cartesian3,tt=new Q.Cartesian3,et=new Q.Cartesian3,rt=new Q.Cartesian2,at=new W.Matrix3,Y=new W.Matrix3,it=new W.Quaternion,nt=new Q.Cartesian3,ot=new Q.Cartesian3,st=new Q.Cartesian3,ut=new Q.Cartographic,lt=new Q.Cartesian3,mt=new Q.Cartesian2,ct=new Q.Cartesian2;function w(t,e,r){var a=e.vertexFormat,i=e.center,n=e.semiMajorAxis,o=e.semiMinorAxis,s=e.ellipsoid,u=e.stRotation,l=r?t.length/3*2:t.length/3,m=e.shadowVolume,c=a.st?new Float32Array(2*l):void 0,p=a.normal?new Float32Array(3*l):void 0,y=a.tangent?new Float32Array(3*l):void 0,d=a.bitangent?new Float32Array(3*l):void 0,f=m?new Float32Array(3*l):void 0,A=0,h=nt,x=ot,g=st,_=new W.GeographicProjection(s),b=_.project(s.cartesianToCartographic(i,ut),lt),C=s.scaleToGeodeticSurface(i,X);s.geodeticSurfaceNormal(C,C);var v,w=at,M=Y;M=0!==u?(v=W.Quaternion.fromAxisAngle(C,u,it),w=W.Matrix3.fromQuaternion(v,w),v=W.Quaternion.fromAxisAngle(C,-u,it),W.Matrix3.fromQuaternion(v,M)):(w=W.Matrix3.clone(W.Matrix3.IDENTITY,w),W.Matrix3.clone(W.Matrix3.IDENTITY,M));for(var E=Q.Cartesian2.fromElements(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,mt),I=Q.Cartesian2.fromElements(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,ct),T=t.length,G=r?T:0,N=G/3*2,P=0;P<T;P+=3){var F,V,D=P+1,O=P+2,S=Q.Cartesian3.fromArray(t,P,X);a.st&&(F=W.Matrix3.multiplyByVector(w,S,$),V=_.project(s.cartesianToCartographic(F,ut),tt),Q.Cartesian3.subtract(V,b,V),rt.x=(V.x+n)/(2*n),rt.y=(V.y+o)/(2*o),E.x=Math.min(rt.x,E.x),E.y=Math.min(rt.y,E.y),I.x=Math.max(rt.x,I.x),I.y=Math.max(rt.y,I.y),r&&(c[A+N]=rt.x,c[A+1+N]=rt.y),c[A++]=rt.x,c[A++]=rt.y),(a.normal||a.tangent||a.bitangent||m)&&(h=s.geodeticSurfaceNormal(S,h),m&&(f[P+G]=-h.x,f[D+G]=-h.y,f[O+G]=-h.z),(a.normal||a.tangent||a.bitangent)&&((a.tangent||a.bitangent)&&(x=Q.Cartesian3.normalize(Q.Cartesian3.cross(Q.Cartesian3.UNIT_Z,h,x),x),W.Matrix3.multiplyByVector(M,x,x)),a.normal&&(p[P]=h.x,p[D]=h.y,p[O]=h.z,r&&(p[P+G]=-h.x,p[D+G]=-h.y,p[O+G]=-h.z)),a.tangent&&(y[P]=x.x,y[D]=x.y,y[O]=x.z,r&&(y[P+G]=-x.x,y[D+G]=-x.y,y[O+G]=-x.z)),a.bitangent&&(g=Q.Cartesian3.normalize(Q.Cartesian3.cross(h,x,g),g),d[P]=g.x,d[D]=g.y,d[O]=g.z,r&&(d[P+G]=g.x,d[D+G]=g.y,d[O+G]=g.z))))}if(a.st){T=c.length;for(var L=0;L<T;L+=2)c[L]=(c[L]-E.x)/(I.x-E.x),c[L+1]=(c[L+1]-E.y)/(I.y-E.y)}var R,j,k,z=new Z.GeometryAttributes;return a.position&&(R=B.EllipseGeometryLibrary.raisePositionsToHeight(t,e,r),z.position=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:R})),a.st&&(z.st=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:c})),a.normal&&(z.normal=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:p})),a.tangent&&(z.tangent=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:y})),a.bitangent&&(z.bitangent=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:d})),m&&(z.extrudeDirection=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:f})),r&&U.defined(e.offsetAttribute)&&(k=new Uint8Array(l),k=e.offsetAttribute===K.GeometryOffsetAttribute.TOP?K.arrayFill(k,1,0,l/2):(j=e.offsetAttribute===K.GeometryOffsetAttribute.NONE?0:1,K.arrayFill(k,j)),z.applyOffset=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:k})),z}function M(t){for(var e,r,a=new Array(t*(t+1)*12-6),i=0,n=0,o=1,s=0;s<3;s++)a[i++]=o++,a[i++]=n,a[i++]=o;for(s=2;s<t+1;++s){for(o=s*(s+1)-1,n=(s-1)*s-1,a[i++]=o++,a[i++]=n,a[i++]=o,e=2*s,r=0;r<e-1;++r)a[i++]=o,a[i++]=n++,a[i++]=n,a[i++]=o++,a[i++]=n,a[i++]=o;a[i++]=o++,a[i++]=n,a[i++]=o}for(e=2*t,++o,++n,s=0;s<e-1;++s)a[i++]=o,a[i++]=n++,a[i++]=n,a[i++]=o++,a[i++]=n,a[i++]=o;for(a[i++]=o,a[i++]=n++,a[i++]=n,a[i++]=o++,a[i++]=n++,a[i++]=n,++n,s=t-1;1<s;--s){for(a[i++]=n++,a[i++]=n,a[i++]=o,e=2*s,r=0;r<e-1;++r)a[i++]=o,a[i++]=n++,a[i++]=n,a[i++]=o++,a[i++]=n,a[i++]=o;a[i++]=n++,a[i++]=n++,a[i++]=o++}for(s=0;s<3;s++)a[i++]=n++,a[i++]=n,a[i++]=o;return a}var l=new Q.Cartesian3;var E=new W.BoundingSphere,I=new W.BoundingSphere;function m(t){var e=t.center,r=t.ellipsoid,a=t.semiMajorAxis,i=Q.Cartesian3.multiplyByScalar(r.geodeticSurfaceNormal(e,X),t.height,X);E.center=Q.Cartesian3.add(e,i,E.center),E.radius=a,i=Q.Cartesian3.multiplyByScalar(r.geodeticSurfaceNormal(e,i),t.extrudedHeight,i),I.center=Q.Cartesian3.add(e,i,I.center),I.radius=a;var n=B.EllipseGeometryLibrary.computeEllipsePositions(t,!0,!0),o=n.positions,s=n.numPts,u=n.outerPositions,l=W.BoundingSphere.union(E,I),m=w(o,t,!0),c=(h=M(s)).length;h.length=2*c;for(var p=o.length/3,y=0;y<c;y+=3)h[y+c]=h[y+2]+p,h[y+1+c]=h[y+1]+p,h[y+2+c]=h[y]+p;var d=C.IndexDatatype.createTypedArray(2*p/3,h),f=new q.Geometry({attributes:m,indices:d,primitiveType:q.PrimitiveType.TRIANGLES}),A=function(t,e){var r=e.vertexFormat,a=e.center,i=e.semiMajorAxis,n=e.semiMinorAxis,o=e.ellipsoid,s=e.height,u=e.extrudedHeight,l=e.stRotation,m=t.length/3*2,c=new Float64Array(3*m),p=r.st?new Float32Array(2*m):void 0,y=r.normal?new Float32Array(3*m):void 0,d=r.tangent?new Float32Array(3*m):void 0,f=r.bitangent?new Float32Array(3*m):void 0,A=e.shadowVolume,h=A?new Float32Array(3*m):void 0,x=0,g=nt,_=ot,b=st,C=new W.GeographicProjection(o),v=C.project(o.cartesianToCartographic(a,ut),lt),w=o.scaleToGeodeticSurface(a,X);o.geodeticSurfaceNormal(w,w);for(var M=W.Quaternion.fromAxisAngle(w,l,it),E=W.Matrix3.fromQuaternion(M,at),I=Q.Cartesian2.fromElements(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,mt),T=Q.Cartesian2.fromElements(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,ct),G=t.length,N=G/3*2,P=0;P<G;P+=3){var F,V,D=P+1,O=P+2,S=Q.Cartesian3.fromArray(t,P,X);r.st&&(F=W.Matrix3.multiplyByVector(E,S,$),V=C.project(o.cartesianToCartographic(F,ut),tt),Q.Cartesian3.subtract(V,v,V),rt.x=(V.x+i)/(2*i),rt.y=(V.y+n)/(2*n),I.x=Math.min(rt.x,I.x),I.y=Math.min(rt.y,I.y),T.x=Math.max(rt.x,T.x),T.y=Math.max(rt.y,T.y),p[x+N]=rt.x,p[x+1+N]=rt.y,p[x++]=rt.x,p[x++]=rt.y),S=o.scaleToGeodeticSurface(S,S),k=Q.Cartesian3.clone(S,$),g=o.geodeticSurfaceNormal(S,g),A&&(h[P+G]=-g.x,h[D+G]=-g.y,h[O+G]=-g.z);var L,R,j=Q.Cartesian3.multiplyByScalar(g,s,et),S=Q.Cartesian3.add(S,j,S),j=Q.Cartesian3.multiplyByScalar(g,u,j),k=Q.Cartesian3.add(k,j,k);r.position&&(c[P+G]=k.x,c[D+G]=k.y,c[O+G]=k.z,c[P]=S.x,c[D]=S.y,c[O]=S.z),(r.normal||r.tangent||r.bitangent)&&(b=Q.Cartesian3.clone(g,b),L=Q.Cartesian3.fromArray(t,(P+3)%G,et),Q.Cartesian3.subtract(L,S,L),R=Q.Cartesian3.subtract(k,S,tt),g=Q.Cartesian3.normalize(Q.Cartesian3.cross(R,L,g),g),r.normal&&(y[P]=g.x,y[D]=g.y,y[O]=g.z,y[P+G]=g.x,y[D+G]=g.y,y[O+G]=g.z),r.tangent&&(_=Q.Cartesian3.normalize(Q.Cartesian3.cross(b,g,_),_),d[P]=_.x,d[D]=_.y,d[O]=_.z,d[P+G]=_.x,d[P+1+G]=_.y,d[P+2+G]=_.z),r.bitangent&&(f[P]=b.x,f[D]=b.y,f[O]=b.z,f[P+G]=b.x,f[D+G]=b.y,f[O+G]=b.z))}if(r.st){G=p.length;for(var z=0;z<G;z+=2)p[z]=(p[z]-I.x)/(T.x-I.x),p[z+1]=(p[z+1]-I.y)/(T.y-I.y)}var B,Y,H=new Z.GeometryAttributes;return r.position&&(H.position=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:c})),r.st&&(H.st=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:p})),r.normal&&(H.normal=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:y})),r.tangent&&(H.tangent=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:d})),r.bitangent&&(H.bitangent=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:f})),A&&(H.extrudeDirection=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:h})),U.defined(e.offsetAttribute)&&(Y=new Uint8Array(m),Y=e.offsetAttribute===K.GeometryOffsetAttribute.TOP?K.arrayFill(Y,1,0,m/2):(B=e.offsetAttribute===K.GeometryOffsetAttribute.NONE?0:1,K.arrayFill(Y,B)),H.applyOffset=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:Y})),H}(u,t),h=function(t){for(var e=t.length/3,r=C.IndexDatatype.createTypedArray(e,6*e),a=0,i=0;i<e;i++){var n=i+e,o=(i+1)%e,s=o+e;r[a++]=i,r[a++]=n,r[a++]=o,r[a++]=o,r[a++]=n,r[a++]=s}return r}(u),x=C.IndexDatatype.createTypedArray(2*u.length/3,h),g=new q.Geometry({attributes:A,indices:x,primitiveType:q.PrimitiveType.TRIANGLES}),_=b.GeometryPipeline.combineInstances([new v.GeometryInstance({geometry:f}),new v.GeometryInstance({geometry:g})]);return{boundingSphere:l,attributes:_[0].attributes,indices:_[0].indices}}function s(t,e,r,a,i,n,o){for(var s=B.EllipseGeometryLibrary.computeEllipsePositions({center:t,semiMajorAxis:e,semiMinorAxis:r,rotation:a,granularity:i},!1,!0).outerPositions,u=s.length/3,l=new Array(u),m=0;m<u;++m)l[m]=Q.Cartesian3.fromArray(s,3*m);var c=Q.Rectangle.fromCartesianArray(l,n,o);return c.width>p.CesiumMath.PI&&(c.north=0<c.north?p.CesiumMath.PI_OVER_TWO-p.CesiumMath.EPSILON7:c.north,c.south=c.south<0?p.CesiumMath.EPSILON7-p.CesiumMath.PI_OVER_TWO:c.south,c.east=p.CesiumMath.PI,c.west=-p.CesiumMath.PI),c}function A(t){var e=(t=U.defaultValue(t,U.defaultValue.EMPTY_OBJECT)).center,r=U.defaultValue(t.ellipsoid,Q.Ellipsoid.WGS84),a=t.semiMajorAxis,i=t.semiMinorAxis,n=U.defaultValue(t.granularity,p.CesiumMath.RADIANS_PER_DEGREE),o=U.defaultValue(t.vertexFormat,f.VertexFormat.DEFAULT),s=U.defaultValue(t.height,0),u=U.defaultValue(t.extrudedHeight,s);this._center=Q.Cartesian3.clone(e),this._semiMajorAxis=a,this._semiMinorAxis=i,this._ellipsoid=Q.Ellipsoid.clone(r),this._rotation=U.defaultValue(t.rotation,0),this._stRotation=U.defaultValue(t.stRotation,0),this._height=Math.max(u,s),this._granularity=n,this._vertexFormat=f.VertexFormat.clone(o),this._extrudedHeight=Math.min(u,s),this._shadowVolume=U.defaultValue(t.shadowVolume,!1),this._workerName="createEllipseGeometry",this._offsetAttribute=t.offsetAttribute,this._rectangle=void 0,this._textureCoordinateRotationPoints=void 0}A.packedLength=Q.Cartesian3.packedLength+Q.Ellipsoid.packedLength+f.VertexFormat.packedLength+9,A.pack=function(t,e,r){return r=U.defaultValue(r,0),Q.Cartesian3.pack(t._center,e,r),r+=Q.Cartesian3.packedLength,Q.Ellipsoid.pack(t._ellipsoid,e,r),r+=Q.Ellipsoid.packedLength,f.VertexFormat.pack(t._vertexFormat,e,r),r+=f.VertexFormat.packedLength,e[r++]=t._semiMajorAxis,e[r++]=t._semiMinorAxis,e[r++]=t._rotation,e[r++]=t._stRotation,e[r++]=t._height,e[r++]=t._granularity,e[r++]=t._extrudedHeight,e[r++]=t._shadowVolume?1:0,e[r]=U.defaultValue(t._offsetAttribute,-1),e};var h=new Q.Cartesian3,x=new Q.Ellipsoid,g=new f.VertexFormat,_={center:h,ellipsoid:x,vertexFormat:g,semiMajorAxis:void 0,semiMinorAxis:void 0,rotation:void 0,stRotation:void 0,height:void 0,granularity:void 0,extrudedHeight:void 0,shadowVolume:void 0,offsetAttribute:void 0};A.unpack=function(t,e,r){e=U.defaultValue(e,0);var a=Q.Cartesian3.unpack(t,e,h);e+=Q.Cartesian3.packedLength;var i=Q.Ellipsoid.unpack(t,e,x);e+=Q.Ellipsoid.packedLength;var n=f.VertexFormat.unpack(t,e,g);e+=f.VertexFormat.packedLength;var o=t[e++],s=t[e++],u=t[e++],l=t[e++],m=t[e++],c=t[e++],p=t[e++],y=1===t[e++],d=t[e];return U.defined(r)?(r._center=Q.Cartesian3.clone(a,r._center),r._ellipsoid=Q.Ellipsoid.clone(i,r._ellipsoid),r._vertexFormat=f.VertexFormat.clone(n,r._vertexFormat),r._semiMajorAxis=o,r._semiMinorAxis=s,r._rotation=u,r._stRotation=l,r._height=m,r._granularity=c,r._extrudedHeight=p,r._shadowVolume=y,r._offsetAttribute=-1===d?void 0:d,r):(_.height=m,_.extrudedHeight=p,_.granularity=c,_.stRotation=l,_.rotation=u,_.semiMajorAxis=o,_.semiMinorAxis=s,_.shadowVolume=y,_.offsetAttribute=-1===d?void 0:d,new A(_))},A.computeRectangle=function(t,e){var r=(t=U.defaultValue(t,U.defaultValue.EMPTY_OBJECT)).center,a=U.defaultValue(t.ellipsoid,Q.Ellipsoid.WGS84),i=t.semiMajorAxis,n=t.semiMinorAxis,o=U.defaultValue(t.granularity,p.CesiumMath.RADIANS_PER_DEGREE);return s(r,i,n,U.defaultValue(t.rotation,0),o,a,e)},A.createGeometry=function(t){if(!(t._semiMajorAxis<=0||t._semiMinorAxis<=0)){var e=t._height,r=t._extrudedHeight,a=!p.CesiumMath.equalsEpsilon(e,r,0,p.CesiumMath.EPSILON2);t._center=t._ellipsoid.scaleToGeodeticSurface(t._center,t._center);var i,n,o,s,u={center:t._center,semiMajorAxis:t._semiMajorAxis,semiMinorAxis:t._semiMinorAxis,ellipsoid:t._ellipsoid,rotation:t._rotation,height:e,granularity:t._granularity,vertexFormat:t._vertexFormat,stRotation:t._stRotation};return a?(u.extrudedHeight=r,u.shadowVolume=t._shadowVolume,u.offsetAttribute=t._offsetAttribute,s=m(u)):(s=function(t){var e=t.center;l=Q.Cartesian3.multiplyByScalar(t.ellipsoid.geodeticSurfaceNormal(e,l),t.height,l),l=Q.Cartesian3.add(e,l,l);var r=new W.BoundingSphere(l,t.semiMajorAxis),a=B.EllipseGeometryLibrary.computeEllipsePositions(t,!0,!1),i=a.positions,n=a.numPts,o=w(i,t,!1),s=M(n);return{boundingSphere:r,attributes:o,indices:s=C.IndexDatatype.createTypedArray(i.length/3,s)}}(u),U.defined(t._offsetAttribute)&&(i=s.attributes.position.values.length,n=new Uint8Array(i/3),o=t._offsetAttribute===K.GeometryOffsetAttribute.NONE?0:1,K.arrayFill(n,o),s.attributes.applyOffset=new q.GeometryAttribute({componentDatatype:J.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:n}))),new q.Geometry({attributes:s.attributes,indices:s.indices,primitiveType:q.PrimitiveType.TRIANGLES,boundingSphere:s.boundingSphere,offsetAttribute:t._offsetAttribute})}},A.createShadowVolume=function(t,e,r){var a=t._granularity,i=t._ellipsoid,n=e(a,i),o=r(a,i);return new A({center:t._center,semiMajorAxis:t._semiMajorAxis,semiMinorAxis:t._semiMinorAxis,ellipsoid:i,rotation:t._rotation,stRotation:t._stRotation,granularity:a,extrudedHeight:n,height:o,vertexFormat:f.VertexFormat.POSITION_ONLY,shadowVolume:!0})},Object.defineProperties(A.prototype,{rectangle:{get:function(){return U.defined(this._rectangle)||(this._rectangle=s(this._center,this._semiMajorAxis,this._semiMinorAxis,this._rotation,this._granularity,this._ellipsoid)),this._rectangle}},textureCoordinateRotationPoints:{get:function(){return U.defined(this._textureCoordinateRotationPoints)||(this._textureCoordinateRotationPoints=function(t){var e=-t._stRotation;if(0==e)return[0,0,0,1,1,0];for(var r=B.EllipseGeometryLibrary.computeEllipsePositions({center:t._center,semiMajorAxis:t._semiMajorAxis,semiMinorAxis:t._semiMinorAxis,rotation:t._rotation,granularity:t._granularity},!1,!0).outerPositions,a=r.length/3,i=new Array(a),n=0;n<a;++n)i[n]=Q.Cartesian3.fromArray(r,3*n);var o=t._ellipsoid,s=t.rectangle;return q.Geometry._textureCoordinateRotationPoints(i,e,o,s)}(this)),this._textureCoordinateRotationPoints}}}),t.EllipseGeometry=A}); diff --git a/web/assets/Cesium/Workers/EllipseGeometryLibrary-c9c767e4.js b/web/assets/Cesium/Workers/EllipseGeometryLibrary-c9c767e4.js new file mode 100644 index 00000000..aed6f2ad --- /dev/null +++ b/web/assets/Cesium/Workers/EllipseGeometryLibrary-c9c767e4.js @@ -0,0 +1 @@ +define(["exports","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304"],function(a,R,W,h){"use strict";var r={},x=new W.Cartesian3,M=new W.Cartesian3,f=new h.Quaternion,z=new h.Matrix3;function S(a,r,e,t,i,n,s,o,l,C){var y=a+r;W.Cartesian3.multiplyByScalar(t,Math.cos(y),x),W.Cartesian3.multiplyByScalar(e,Math.sin(y),M),W.Cartesian3.add(x,M,x);var u=Math.cos(a);u*=u;var c=Math.sin(a);c*=c;var m=n/Math.sqrt(s*u+i*c)/o;return h.Quaternion.fromAxisAngle(x,m,f),h.Matrix3.fromQuaternion(f,z),h.Matrix3.multiplyByVector(z,l,C),W.Cartesian3.normalize(C,C),W.Cartesian3.multiplyByScalar(C,o,C),C}var B=new W.Cartesian3,b=new W.Cartesian3,Q=new W.Cartesian3,d=new W.Cartesian3;r.raisePositionsToHeight=function(a,r,e){for(var t=r.ellipsoid,i=r.height,n=r.extrudedHeight,s=e?a.length/3*2:a.length/3,o=new Float64Array(3*s),l=a.length,C=e?l:0,y=0;y<l;y+=3){var u=y+1,c=y+2,m=W.Cartesian3.fromArray(a,y,B);t.scaleToGeodeticSurface(m,m);var h=W.Cartesian3.clone(m,b),x=t.geodeticSurfaceNormal(m,d),M=W.Cartesian3.multiplyByScalar(x,i,Q);W.Cartesian3.add(m,M,m),e&&(W.Cartesian3.multiplyByScalar(x,n,M),W.Cartesian3.add(h,M,h),o[y+C]=h.x,o[u+C]=h.y,o[c+C]=h.z),o[y]=m.x,o[u]=m.y,o[c]=m.z}return o};var G=new W.Cartesian3,H=new W.Cartesian3,N=new W.Cartesian3;r.computeEllipsePositions=function(a,r,e){var t=a.semiMinorAxis,i=a.semiMajorAxis,n=a.rotation,s=a.center,o=8*a.granularity,l=t*t,C=i*i,y=i*t,u=W.Cartesian3.magnitude(s),c=W.Cartesian3.normalize(s,G),m=W.Cartesian3.cross(W.Cartesian3.UNIT_Z,s,H),m=W.Cartesian3.normalize(m,m),h=W.Cartesian3.cross(c,m,N),x=1+Math.ceil(R.CesiumMath.PI_OVER_TWO/o),M=R.CesiumMath.PI_OVER_TWO/(x-1),f=R.CesiumMath.PI_OVER_TWO-x*M;f<0&&(x-=Math.ceil(Math.abs(f)/M));var z,d,_,O,v,p=r?new Array(3*(x*(x+2)*2)):void 0,w=0,P=B,T=b,I=4*x*3,g=I-1,E=0,V=e?new Array(I):void 0,P=S(f=R.CesiumMath.PI_OVER_TWO,n,h,m,l,y,C,u,c,P);for(r&&(p[w++]=P.x,p[w++]=P.y,p[w++]=P.z),e&&(V[g--]=P.z,V[g--]=P.y,V[g--]=P.x),f=R.CesiumMath.PI_OVER_TWO-M,z=1;z<x+1;++z){if(P=S(f,n,h,m,l,y,C,u,c,P),T=S(Math.PI-f,n,h,m,l,y,C,u,c,T),r){for(p[w++]=P.x,p[w++]=P.y,p[w++]=P.z,_=2*z+2,d=1;d<_-1;++d)O=d/(_-1),v=W.Cartesian3.lerp(P,T,O,Q),p[w++]=v.x,p[w++]=v.y,p[w++]=v.z;p[w++]=T.x,p[w++]=T.y,p[w++]=T.z}e&&(V[g--]=P.z,V[g--]=P.y,V[g--]=P.x,V[E++]=T.x,V[E++]=T.y,V[E++]=T.z),f=R.CesiumMath.PI_OVER_TWO-(z+1)*M}for(z=x;1<z;--z){if(P=S(-(f=R.CesiumMath.PI_OVER_TWO-(z-1)*M),n,h,m,l,y,C,u,c,P),T=S(f+Math.PI,n,h,m,l,y,C,u,c,T),r){for(p[w++]=P.x,p[w++]=P.y,p[w++]=P.z,_=2*(z-1)+2,d=1;d<_-1;++d)O=d/(_-1),v=W.Cartesian3.lerp(P,T,O,Q),p[w++]=v.x,p[w++]=v.y,p[w++]=v.z;p[w++]=T.x,p[w++]=T.y,p[w++]=T.z}e&&(V[g--]=P.z,V[g--]=P.y,V[g--]=P.x,V[E++]=T.x,V[E++]=T.y,V[E++]=T.z)}P=S(-(f=R.CesiumMath.PI_OVER_TWO),n,h,m,l,y,C,u,c,P);var A={};return r&&(p[w++]=P.x,p[w++]=P.y,p[w++]=P.z,A.positions=p,A.numPts=x),e&&(V[g--]=P.z,V[g--]=P.y,V[g--]=P.x,A.outerPositions=V),A},a.EllipseGeometryLibrary=r}); diff --git a/web/assets/Cesium/Workers/EllipseOutlineGeometry-2cffcd24.js b/web/assets/Cesium/Workers/EllipseOutlineGeometry-2cffcd24.js new file mode 100644 index 00000000..927e01cd --- /dev/null +++ b/web/assets/Cesium/Workers/EllipseOutlineGeometry-2cffcd24.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./EllipseGeometryLibrary-c9c767e4"],function(e,A,t,_,g,x,E,v,M,C,G,L){"use strict";var O=new g.Cartesian3,l=new g.Cartesian3;var S=new x.BoundingSphere,V=new x.BoundingSphere;function f(e){var t=(e=A.defaultValue(e,A.defaultValue.EMPTY_OBJECT)).center,i=A.defaultValue(e.ellipsoid,g.Ellipsoid.WGS84),r=e.semiMajorAxis,a=e.semiMinorAxis,n=A.defaultValue(e.granularity,_.CesiumMath.RADIANS_PER_DEGREE),o=A.defaultValue(e.height,0),s=A.defaultValue(e.extrudedHeight,o);this._center=g.Cartesian3.clone(t),this._semiMajorAxis=r,this._semiMinorAxis=a,this._ellipsoid=g.Ellipsoid.clone(i),this._rotation=A.defaultValue(e.rotation,0),this._height=Math.max(s,o),this._granularity=n,this._extrudedHeight=Math.min(s,o),this._numberOfVerticalLines=Math.max(A.defaultValue(e.numberOfVerticalLines,16),0),this._offsetAttribute=e.offsetAttribute,this._workerName="createEllipseOutlineGeometry"}f.packedLength=g.Cartesian3.packedLength+g.Ellipsoid.packedLength+8,f.pack=function(e,t,i){return i=A.defaultValue(i,0),g.Cartesian3.pack(e._center,t,i),i+=g.Cartesian3.packedLength,g.Ellipsoid.pack(e._ellipsoid,t,i),i+=g.Ellipsoid.packedLength,t[i++]=e._semiMajorAxis,t[i++]=e._semiMinorAxis,t[i++]=e._rotation,t[i++]=e._height,t[i++]=e._granularity,t[i++]=e._extrudedHeight,t[i++]=e._numberOfVerticalLines,t[i]=A.defaultValue(e._offsetAttribute,-1),t};var m=new g.Cartesian3,h=new g.Ellipsoid,y={center:m,ellipsoid:h,semiMajorAxis:void 0,semiMinorAxis:void 0,rotation:void 0,height:void 0,granularity:void 0,extrudedHeight:void 0,numberOfVerticalLines:void 0,offsetAttribute:void 0};f.unpack=function(e,t,i){t=A.defaultValue(t,0);var r=g.Cartesian3.unpack(e,t,m);t+=g.Cartesian3.packedLength;var a=g.Ellipsoid.unpack(e,t,h);t+=g.Ellipsoid.packedLength;var n=e[t++],o=e[t++],s=e[t++],u=e[t++],l=e[t++],d=e[t++],c=e[t++],p=e[t];return A.defined(i)?(i._center=g.Cartesian3.clone(r,i._center),i._ellipsoid=g.Ellipsoid.clone(a,i._ellipsoid),i._semiMajorAxis=n,i._semiMinorAxis=o,i._rotation=s,i._height=u,i._granularity=l,i._extrudedHeight=d,i._numberOfVerticalLines=c,i._offsetAttribute=-1===p?void 0:p,i):(y.height=u,y.extrudedHeight=d,y.granularity=l,y.rotation=s,y.semiMajorAxis=n,y.semiMinorAxis=o,y.numberOfVerticalLines=c,y.offsetAttribute=-1===p?void 0:p,new f(y))},f.createGeometry=function(e){if(!(e._semiMajorAxis<=0||e._semiMinorAxis<=0)){var t=e._height,i=e._extrudedHeight,r=!_.CesiumMath.equalsEpsilon(t,i,0,_.CesiumMath.EPSILON2);e._center=e._ellipsoid.scaleToGeodeticSurface(e._center,e._center);var a,n,o,s,u={center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:e._ellipsoid,rotation:e._rotation,height:t,granularity:e._granularity,numberOfVerticalLines:e._numberOfVerticalLines};return r?(u.extrudedHeight=i,u.offsetAttribute=e._offsetAttribute,s=function(e){var t=e.center,i=e.ellipsoid,r=e.semiMajorAxis,a=g.Cartesian3.multiplyByScalar(i.geodeticSurfaceNormal(t,O),e.height,O);S.center=g.Cartesian3.add(t,a,S.center),S.radius=r,a=g.Cartesian3.multiplyByScalar(i.geodeticSurfaceNormal(t,a),e.extrudedHeight,a),V.center=g.Cartesian3.add(t,a,V.center),V.radius=r;var n,o,s=L.EllipseGeometryLibrary.computeEllipsePositions(e,!1,!0).outerPositions,u=new M.GeometryAttributes({position:new v.GeometryAttribute({componentDatatype:E.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:L.EllipseGeometryLibrary.raisePositionsToHeight(s,e,!0)})}),s=u.position.values,l=x.BoundingSphere.union(S,V),d=s.length/3;A.defined(e.offsetAttribute)&&(o=new Uint8Array(d),o=e.offsetAttribute===G.GeometryOffsetAttribute.TOP?G.arrayFill(o,1,0,d/2):(n=e.offsetAttribute===G.GeometryOffsetAttribute.NONE?0:1,G.arrayFill(o,n)),u.applyOffset=new v.GeometryAttribute({componentDatatype:E.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:o}));var c=A.defaultValue(e.numberOfVerticalLines,16),c=_.CesiumMath.clamp(c,0,d/2),p=C.IndexDatatype.createTypedArray(d,2*d+2*c);d/=2;var f=0;for(b=0;b<d;++b)p[f++]=b,p[f++]=(b+1)%d,p[f++]=b+d,p[f++]=(b+1)%d+d;if(0<c)for(var m=Math.min(c,d),h=Math.round(d/m),y=Math.min(h*c,d),b=0;b<y;b+=h)p[f++]=b,p[f++]=b+d;return{boundingSphere:l,attributes:u,indices:p}}(u)):(s=function(e){var t=e.center;l=g.Cartesian3.multiplyByScalar(e.ellipsoid.geodeticSurfaceNormal(t,l),e.height,l),l=g.Cartesian3.add(t,l,l);for(var i=new x.BoundingSphere(l,e.semiMajorAxis),r=L.EllipseGeometryLibrary.computeEllipsePositions(e,!1,!0).outerPositions,a=new M.GeometryAttributes({position:new v.GeometryAttribute({componentDatatype:E.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:L.EllipseGeometryLibrary.raisePositionsToHeight(r,e,!1)})}),n=r.length/3,o=C.IndexDatatype.createTypedArray(n,2*n),s=0,u=0;u<n;++u)o[s++]=u,o[s++]=(u+1)%n;return{boundingSphere:i,attributes:a,indices:o}}(u),A.defined(e._offsetAttribute)&&(a=s.attributes.position.values.length,n=new Uint8Array(a/3),o=e._offsetAttribute===G.GeometryOffsetAttribute.NONE?0:1,G.arrayFill(n,o),s.attributes.applyOffset=new v.GeometryAttribute({componentDatatype:E.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:n}))),new v.Geometry({attributes:s.attributes,indices:s.indices,primitiveType:v.PrimitiveType.LINES,boundingSphere:s.boundingSphere,offsetAttribute:e._offsetAttribute})}},e.EllipseOutlineGeometry=f}); diff --git a/web/assets/Cesium/Workers/EllipsoidGeodesic-30fae80b.js b/web/assets/Cesium/Workers/EllipsoidGeodesic-30fae80b.js new file mode 100644 index 00000000..7d763f91 --- /dev/null +++ b/web/assets/Cesium/Workers/EllipsoidGeodesic-30fae80b.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162"],function(t,b,a,T,R){"use strict";function z(t,a,i,n,e,s,r){var h,o,d=(h=t)*(o=i)*(4+h*(4-3*o))/16;return(1-d)*t*a*(n+d*e*(r+d*s*(2*r*r-1)))}var y=new R.Cartesian3,E=new R.Cartesian3;function e(t,a,i,n){var e,s,r,h,o,d,c,u,M,l,g,_,p,f,v,m,C,H,O,S,q,U,b,w,A;R.Cartesian3.normalize(n.cartographicToCartesian(a,E),y),R.Cartesian3.normalize(n.cartographicToCartesian(i,E),E);!function(t,a,i,n,e,s,r){var h=(a-i)/a,o=s-n,d=Math.atan((1-h)*Math.tan(e)),c=Math.atan((1-h)*Math.tan(r)),u=Math.cos(d),M=Math.sin(d),l=Math.cos(c),g=Math.sin(c),_=u*l,p=u*g,f=M*g,v=M*l,m=o,C=T.CesiumMath.TWO_PI,H=Math.cos(m),O=Math.sin(m);do{H=Math.cos(m),O=Math.sin(m);var S,q,U=p-v*H,b=Math.sqrt(l*l*O*O+U*U),w=f+_*H,A=Math.atan2(b,w),C=m,R=w-2*f/(q=0===b?(S=0,1):1-(S=_*O/b)*S);isNaN(R)&&(R=0),m=o+z(h,S,q,A,b,w,R)}while(Math.abs(m-C)>T.CesiumMath.EPSILON12);var y=q*(a*a-i*i)/(i*i),E=y*(256+y*(y*(74-47*y)-128))/1024,P=R*R,x=i*(1+y*(4096+y*(y*(320-175*y)-768))/16384)*(A-E*b*(R+E*(w*(2*P-1)-E*R*(4*b*b-3)*(4*P-3)/6)/4)),D=Math.atan2(l*O,p-v*H),N=Math.atan2(u*O,p*H-v);t._distance=x,t._startHeading=D,t._endHeading=N,t._uSquared=y}(t,n.maximumRadius,n.minimumRadius,a.longitude,a.latitude,i.longitude,i.latitude),t._start=R.Cartographic.clone(a,t._start),t._end=R.Cartographic.clone(i,t._end),t._start.height=0,t._end.height=0,s=(e=t)._uSquared,r=e._ellipsoid.maximumRadius,h=e._ellipsoid.minimumRadius,o=(r-h)/r,d=Math.cos(e._startHeading),c=Math.sin(e._startHeading),u=(1-o)*Math.tan(e._start.latitude),M=1/Math.sqrt(1+u*u),l=M*u,g=Math.atan2(u,d),f=1-(p=(_=M*c)*_),v=Math.sqrt(f),U=1-3*(m=s/4)+35*(C=m*m)/4,b=1-5*m,w=(S=1+m-3*C/4+5*(H=C*m)/4-175*(O=C*C)/64)*g-(q=1-m+15*C/8-35*H/8)*Math.sin(2*g)*m/2-U*Math.sin(4*g)*C/16-b*Math.sin(6*g)*H/48-5*Math.sin(8*g)*O/512,(A=e._constants).a=r,A.b=h,A.f=o,A.cosineHeading=d,A.sineHeading=c,A.tanU=u,A.cosineU=M,A.sineU=l,A.sigma=g,A.sineAlpha=_,A.sineSquaredAlpha=p,A.cosineSquaredAlpha=f,A.cosineAlpha=v,A.u2Over4=m,A.u4Over16=C,A.u6Over64=H,A.u8Over256=O,A.a0=S,A.a1=q,A.a2=U,A.a3=b,A.distanceRatio=w}function i(t,a,i){var n=b.defaultValue(i,R.Ellipsoid.WGS84);this._ellipsoid=n,this._start=new R.Cartographic,this._end=new R.Cartographic,this._constants={},this._startHeading=void 0,this._endHeading=void 0,this._distance=void 0,this._uSquared=void 0,b.defined(t)&&b.defined(a)&&e(this,t,a,n)}Object.defineProperties(i.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},startHeading:{get:function(){return this._startHeading}},endHeading:{get:function(){return this._endHeading}}}),i.prototype.setEndPoints=function(t,a){e(this,t,a,this._ellipsoid)},i.prototype.interpolateUsingFraction=function(t,a){return this.interpolateUsingSurfaceDistance(this._distance*t,a)},i.prototype.interpolateUsingSurfaceDistance=function(t,a){var i=this._constants,n=i.distanceRatio+t/i.b,e=Math.cos(2*n),s=Math.cos(4*n),r=Math.cos(6*n),h=Math.sin(2*n),o=Math.sin(4*n),d=Math.sin(6*n),c=Math.sin(8*n),u=n*n,M=n*u,l=i.u8Over256,g=i.u2Over4,_=i.u6Over64,p=i.u4Over16,f=2*M*l*e/3+n*(1-g+7*p/4-15*_/4+579*l/64-(p-15*_/4+187*l/16)*e-(5*_/4-115*l/16)*s-29*l*r/16)+(g/2-p+71*_/32-85*l/16)*h+(5*p/16-5*_/4+383*l/96)*o-u*((_-11*l/2)*h+5*l*o/2)+(29*_/96-29*l/16)*d+539*l*c/1536,v=Math.asin(Math.sin(f)*i.cosineAlpha),m=Math.atan(i.a/i.b*Math.tan(v));f-=i.sigma;var C=Math.cos(2*i.sigma+f),H=Math.sin(f),O=Math.cos(f),S=i.cosineU*O,q=i.sineU*H,U=Math.atan2(H*i.sineHeading,S-q*i.cosineHeading)-z(i.f,i.sineAlpha,i.cosineSquaredAlpha,f,H,O,C);return b.defined(a)?(a.longitude=this._start.longitude+U,a.latitude=m,a.height=0,a):new R.Cartographic(this._start.longitude+U,m,0)},t.EllipsoidGeodesic=i}); diff --git a/web/assets/Cesium/Workers/EllipsoidGeometry-ceb731dc.js b/web/assets/Cesium/Workers/EllipsoidGeometry-ceb731dc.js new file mode 100644 index 00000000..3901351a --- /dev/null +++ b/web/assets/Cesium/Workers/EllipsoidGeometry-ceb731dc.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785"],function(t,ut,e,lt,ct,ft,dt,Ct,pt,yt,_t,d){"use strict";var ht=new ct.Cartesian3,vt=new ct.Cartesian3,At=new ct.Cartesian3,xt=new ct.Cartesian3,bt=new ct.Cartesian3,l=new ct.Cartesian3(1,1,1),kt=Math.cos,wt=Math.sin;function C(t){t=ut.defaultValue(t,ut.defaultValue.EMPTY_OBJECT);var e=ut.defaultValue(t.radii,l),a=ut.defaultValue(t.innerRadii,e),i=ut.defaultValue(t.minimumClock,0),r=ut.defaultValue(t.maximumClock,lt.CesiumMath.TWO_PI),n=ut.defaultValue(t.minimumCone,0),o=ut.defaultValue(t.maximumCone,lt.CesiumMath.PI),m=Math.round(ut.defaultValue(t.stackPartitions,64)),s=Math.round(ut.defaultValue(t.slicePartitions,64)),u=ut.defaultValue(t.vertexFormat,d.VertexFormat.DEFAULT);this._radii=ct.Cartesian3.clone(e),this._innerRadii=ct.Cartesian3.clone(a),this._minimumClock=i,this._maximumClock=r,this._minimumCone=n,this._maximumCone=o,this._stackPartitions=m,this._slicePartitions=s,this._vertexFormat=d.VertexFormat.clone(u),this._offsetAttribute=t.offsetAttribute,this._workerName="createEllipsoidGeometry"}C.packedLength=2*ct.Cartesian3.packedLength+d.VertexFormat.packedLength+7,C.pack=function(t,e,a){return a=ut.defaultValue(a,0),ct.Cartesian3.pack(t._radii,e,a),a+=ct.Cartesian3.packedLength,ct.Cartesian3.pack(t._innerRadii,e,a),a+=ct.Cartesian3.packedLength,d.VertexFormat.pack(t._vertexFormat,e,a),a+=d.VertexFormat.packedLength,e[a++]=t._minimumClock,e[a++]=t._maximumClock,e[a++]=t._minimumCone,e[a++]=t._maximumCone,e[a++]=t._stackPartitions,e[a++]=t._slicePartitions,e[a]=ut.defaultValue(t._offsetAttribute,-1),e};var a,p=new ct.Cartesian3,y=new ct.Cartesian3,_=new d.VertexFormat,h={radii:p,innerRadii:y,vertexFormat:_,minimumClock:void 0,maximumClock:void 0,minimumCone:void 0,maximumCone:void 0,stackPartitions:void 0,slicePartitions:void 0,offsetAttribute:void 0};C.unpack=function(t,e,a){e=ut.defaultValue(e,0);var i=ct.Cartesian3.unpack(t,e,p);e+=ct.Cartesian3.packedLength;var r=ct.Cartesian3.unpack(t,e,y);e+=ct.Cartesian3.packedLength;var n=d.VertexFormat.unpack(t,e,_);e+=d.VertexFormat.packedLength;var o=t[e++],m=t[e++],s=t[e++],u=t[e++],l=t[e++],c=t[e++],f=t[e];return ut.defined(a)?(a._radii=ct.Cartesian3.clone(i,a._radii),a._innerRadii=ct.Cartesian3.clone(r,a._innerRadii),a._vertexFormat=d.VertexFormat.clone(n,a._vertexFormat),a._minimumClock=o,a._maximumClock=m,a._minimumCone=s,a._maximumCone=u,a._stackPartitions=l,a._slicePartitions=c,a._offsetAttribute=-1===f?void 0:f,a):(h.minimumClock=o,h.maximumClock=m,h.minimumCone=s,h.maximumCone=u,h.stackPartitions=l,h.slicePartitions=c,h.offsetAttribute=-1===f?void 0:f,new C(h))},C.createGeometry=function(t){var e=t._radii;if(!(e.x<=0||e.y<=0||e.z<=0)){var a=t._innerRadii;if(!(a.x<=0||a.y<=0||a.z<=0)){var i=t._minimumClock,r=t._maximumClock,n=t._minimumCone,o=t._maximumCone,m=t._vertexFormat,s=t._slicePartitions+1,u=t._stackPartitions+1;(s=Math.round(s*Math.abs(r-i)/lt.CesiumMath.TWO_PI))<2&&(s=2),(u=Math.round(u*Math.abs(o-n)/lt.CesiumMath.PI))<2&&(u=2);var l=0,c=[n],f=[i];for(W=0;W<u;W++)c.push(n+W*(o-n)/(u-1));for(c.push(o),E=0;E<s;E++)f.push(i+E*(r-i)/(s-1));f.push(r);var d=c.length,C=f.length,p=0,y=1,_=a.x!==e.x||a.y!==e.y||a.z!==e.z,h=!1,v=!1,A=!1;_&&(y=2,0<n&&(h=!0,p+=s-1),o<Math.PI&&(v=!0,p+=s-1),(r-i)%lt.CesiumMath.TWO_PI?(A=!0,p+=2*(u-1)+1):p+=1);var x=C*d*y,b=new Float64Array(3*x),k=_t.arrayFill(new Array(x),!1),w=_t.arrayFill(new Array(x),!1),F=s*u*y,P=6*(F+p+1-(s+u)*y),g=yt.IndexDatatype.createTypedArray(F,P),V=m.normal?new Float32Array(3*x):void 0,M=m.tangent?new Float32Array(3*x):void 0,T=m.bitangent?new Float32Array(3*x):void 0,D=m.st?new Float32Array(2*x):void 0,G=new Array(d),L=new Array(d);for(W=0;W<d;W++)G[W]=wt(c[W]),L[W]=kt(c[W]);for(var O=new Array(C),I=new Array(C),E=0;E<C;E++)I[E]=kt(f[E]),O[E]=wt(f[E]);for(W=0;W<d;W++)for(E=0;E<C;E++)b[l++]=e.x*G[W]*I[E],b[l++]=e.y*G[W]*O[E],b[l++]=e.z*L[W];var z,N,R,U,S=x/2;if(_)for(W=0;W<d;W++)for(E=0;E<C;E++)b[l++]=a.x*G[W]*I[E],b[l++]=a.y*G[W]*O[E],b[l++]=a.z*L[W],k[S]=!0,0<W&&W!==d-1&&0!==E&&E!==C-1&&(w[S]=!0),S++;for(l=0,W=1;W<d-2;W++)for(z=W*C,N=(W+1)*C,E=1;E<C-2;E++)g[l++]=N+E,g[l++]=N+E+1,g[l++]=z+E+1,g[l++]=N+E,g[l++]=z+E+1,g[l++]=z+E;if(_)for(var B=d*C,W=1;W<d-2;W++)for(z=B+W*C,N=B+(W+1)*C,E=1;E<C-2;E++)g[l++]=N+E,g[l++]=z+E,g[l++]=z+E+1,g[l++]=N+E,g[l++]=z+E+1,g[l++]=N+E+1;if(_){if(h)for(U=d*C,W=1;W<C-2;W++)g[l++]=W,g[l++]=W+1,g[l++]=U+W+1,g[l++]=W,g[l++]=U+W+1,g[l++]=U+W;if(v)for(R=d*C-C,U=d*C*y-C,W=1;W<C-2;W++)g[l++]=R+W+1,g[l++]=R+W,g[l++]=U+W,g[l++]=R+W+1,g[l++]=U+W,g[l++]=U+W+1}if(A){for(W=1;W<d-2;W++)U=C*d+C*W,R=C*W,g[l++]=U,g[l++]=R+C,g[l++]=R,g[l++]=U,g[l++]=U+C,g[l++]=R+C;for(W=1;W<d-2;W++)U=C*d+C*(W+1)-1,R=C*(W+1)-1,g[l++]=R+C,g[l++]=U,g[l++]=R,g[l++]=R+C,g[l++]=U+C,g[l++]=U}var Y=new pt.GeometryAttributes;m.position&&(Y.position=new Ct.GeometryAttribute({componentDatatype:dt.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:b}));var J,X,Z,j,q=0,H=0,K=0,Q=0,$=x/2,tt=ct.Ellipsoid.fromCartesian3(e),et=ct.Ellipsoid.fromCartesian3(a);if(m.st||m.normal||m.tangent||m.bitangent){for(W=0;W<x;W++){J=k[W]?et:tt;var at,it,rt,nt,ot,mt=ct.Cartesian3.fromArray(b,3*W,ht),st=J.geodeticSurfaceNormal(mt,vt);w[W]&&ct.Cartesian3.negate(st,st),m.st&&(at=ct.Cartesian2.negate(st,bt),D[q++]=Math.atan2(at.y,at.x)/lt.CesiumMath.TWO_PI+.5,D[q++]=Math.asin(st.z)/Math.PI+.5),m.normal&&(V[H++]=st.x,V[H++]=st.y,V[H++]=st.z),(m.tangent||m.bitangent)&&(it=At,rt=0,k[W]&&(rt=$),nt=!h&&rt<=W&&W<rt+2*C?ct.Cartesian3.UNIT_X:ct.Cartesian3.UNIT_Z,ct.Cartesian3.cross(nt,st,it),ct.Cartesian3.normalize(it,it),m.tangent&&(M[K++]=it.x,M[K++]=it.y,M[K++]=it.z),m.bitangent&&(ot=ct.Cartesian3.cross(st,it,xt),ct.Cartesian3.normalize(ot,ot),T[Q++]=ot.x,T[Q++]=ot.y,T[Q++]=ot.z))}m.st&&(Y.st=new Ct.GeometryAttribute({componentDatatype:dt.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:D})),m.normal&&(Y.normal=new Ct.GeometryAttribute({componentDatatype:dt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:V})),m.tangent&&(Y.tangent=new Ct.GeometryAttribute({componentDatatype:dt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:M})),m.bitangent&&(Y.bitangent=new Ct.GeometryAttribute({componentDatatype:dt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:T}))}return ut.defined(t._offsetAttribute)&&(X=b.length,Z=new Uint8Array(X/3),j=t._offsetAttribute===_t.GeometryOffsetAttribute.NONE?0:1,_t.arrayFill(Z,j),Y.applyOffset=new Ct.GeometryAttribute({componentDatatype:dt.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:Z})),new Ct.Geometry({attributes:Y,indices:g,primitiveType:Ct.PrimitiveType.TRIANGLES,boundingSphere:ft.BoundingSphere.fromEllipsoid(tt),offsetAttribute:t._offsetAttribute})}}},C.getUnitEllipsoid=function(){return ut.defined(a)||(a=C.createGeometry(new C({radii:new ct.Cartesian3(1,1,1),vertexFormat:d.VertexFormat.POSITION_ONLY}))),a},t.EllipsoidGeometry=C}); diff --git a/web/assets/Cesium/Workers/EllipsoidOutlineGeometry-5b7b6e19.js b/web/assets/Cesium/Workers/EllipsoidOutlineGeometry-5b7b6e19.js new file mode 100644 index 00000000..7dba9db7 --- /dev/null +++ b/web/assets/Cesium/Workers/EllipsoidOutlineGeometry-5b7b6e19.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af"],function(i,R,t,N,B,S,U,F,W,Y,J){"use strict";var f=new B.Cartesian3(1,1,1),j=Math.cos,q=Math.sin;function c(i){i=R.defaultValue(i,R.defaultValue.EMPTY_OBJECT);var t=R.defaultValue(i.radii,f),e=R.defaultValue(i.innerRadii,t),a=R.defaultValue(i.minimumClock,0),n=R.defaultValue(i.maximumClock,N.CesiumMath.TWO_PI),r=R.defaultValue(i.minimumCone,0),o=R.defaultValue(i.maximumCone,N.CesiumMath.PI),s=Math.round(R.defaultValue(i.stackPartitions,10)),m=Math.round(R.defaultValue(i.slicePartitions,8)),u=Math.round(R.defaultValue(i.subdivisions,128));this._radii=B.Cartesian3.clone(t),this._innerRadii=B.Cartesian3.clone(e),this._minimumClock=a,this._maximumClock=n,this._minimumCone=r,this._maximumCone=o,this._stackPartitions=s,this._slicePartitions=m,this._subdivisions=u,this._offsetAttribute=i.offsetAttribute,this._workerName="createEllipsoidOutlineGeometry"}c.packedLength=2*B.Cartesian3.packedLength+8,c.pack=function(i,t,e){return e=R.defaultValue(e,0),B.Cartesian3.pack(i._radii,t,e),e+=B.Cartesian3.packedLength,B.Cartesian3.pack(i._innerRadii,t,e),e+=B.Cartesian3.packedLength,t[e++]=i._minimumClock,t[e++]=i._maximumClock,t[e++]=i._minimumCone,t[e++]=i._maximumCone,t[e++]=i._stackPartitions,t[e++]=i._slicePartitions,t[e++]=i._subdivisions,t[e]=R.defaultValue(i._offsetAttribute,-1),t};var C=new B.Cartesian3,_=new B.Cartesian3,h={radii:C,innerRadii:_,minimumClock:void 0,maximumClock:void 0,minimumCone:void 0,maximumCone:void 0,stackPartitions:void 0,slicePartitions:void 0,subdivisions:void 0,offsetAttribute:void 0};c.unpack=function(i,t,e){t=R.defaultValue(t,0);var a=B.Cartesian3.unpack(i,t,C);t+=B.Cartesian3.packedLength;var n=B.Cartesian3.unpack(i,t,_);t+=B.Cartesian3.packedLength;var r=i[t++],o=i[t++],s=i[t++],m=i[t++],u=i[t++],f=i[t++],d=i[t++],l=i[t];return R.defined(e)?(e._radii=B.Cartesian3.clone(a,e._radii),e._innerRadii=B.Cartesian3.clone(n,e._innerRadii),e._minimumClock=r,e._maximumClock=o,e._minimumCone=s,e._maximumCone=m,e._stackPartitions=u,e._slicePartitions=f,e._subdivisions=d,e._offsetAttribute=-1===l?void 0:l,e):(h.minimumClock=r,h.maximumClock=o,h.minimumCone=s,h.maximumCone=m,h.stackPartitions=u,h.slicePartitions=f,h.subdivisions=d,h.offsetAttribute=-1===l?void 0:l,new c(h))},c.createGeometry=function(i){var t=i._radii;if(!(t.x<=0||t.y<=0||t.z<=0)){var e=i._innerRadii;if(!(e.x<=0||e.y<=0||e.z<=0)){var a=i._minimumClock,n=i._maximumClock,r=i._minimumCone,o=i._maximumCone,s=i._subdivisions,m=B.Ellipsoid.fromCartesian3(t),u=i._slicePartitions+1,f=i._stackPartitions+1;(u=Math.round(u*Math.abs(n-a)/N.CesiumMath.TWO_PI))<2&&(u=2),(f=Math.round(f*Math.abs(o-r)/N.CesiumMath.PI))<2&&(f=2);var d=0,l=1,c=e.x!==t.x||e.y!==t.y||e.z!==t.z,C=!1,_=!1;c&&(l=2,0<r&&(C=!0,d+=u),o<Math.PI&&(_=!0,d+=u));for(var h,p,y=s*l*(f+u),v=new Float64Array(3*y),k=2*(y+d-(u+f)*l),b=Y.IndexDatatype.createTypedArray(y,k),A=0,x=new Array(f),P=new Array(f),w=0;w<f;w++)p=r+w*(o-r)/(f-1),x[w]=q(p),P[w]=j(p);var M=new Array(s),V=new Array(s);for(w=0;w<s;w++)h=a+w*(n-a)/(s-1),M[w]=q(h),V[w]=j(h);for(w=0;w<f;w++)for(G=0;G<s;G++)v[A++]=t.x*x[w]*V[G],v[A++]=t.y*x[w]*M[G],v[A++]=t.z*P[w];if(c)for(w=0;w<f;w++)for(G=0;G<s;G++)v[A++]=e.x*x[w]*V[G],v[A++]=e.y*x[w]*M[G],v[A++]=e.z*P[w];for(x.length=s,P.length=s,w=0;w<s;w++)p=r+w*(o-r)/(s-1),x[w]=q(p),P[w]=j(p);for(M.length=u,V.length=u,w=0;w<u;w++)h=a+w*(n-a)/(u-1),M[w]=q(h),V[w]=j(h);for(w=0;w<s;w++)for(G=0;G<u;G++)v[A++]=t.x*x[w]*V[G],v[A++]=t.y*x[w]*M[G],v[A++]=t.z*P[w];if(c)for(w=0;w<s;w++)for(G=0;G<u;G++)v[A++]=e.x*x[w]*V[G],v[A++]=e.y*x[w]*M[G],v[A++]=e.z*P[w];for(w=A=0;w<f*l;w++)for(var g=w*s,G=0;G<s-1;G++)b[A++]=g+G,b[A++]=g+G+1;var E=f*s*l;for(w=0;w<u;w++)for(G=0;G<s-1;G++)b[A++]=E+w+G*u,b[A++]=E+w+(G+1)*u;if(c)for(E=f*s*l+u*s,w=0;w<u;w++)for(G=0;G<s-1;G++)b[A++]=E+w+G*u,b[A++]=E+w+(G+1)*u;if(c){var O=f*s*l,D=O+s*u;if(C)for(w=0;w<u;w++)b[A++]=O+w,b[A++]=D+w;if(_)for(O+=s*u-u,D+=s*u-u,w=0;w<u;w++)b[A++]=O+w,b[A++]=D+w}var I,T,z,L=new W.GeometryAttributes({position:new F.GeometryAttribute({componentDatatype:U.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:v})});return R.defined(i._offsetAttribute)&&(I=v.length,T=new Uint8Array(I/3),z=i._offsetAttribute===J.GeometryOffsetAttribute.NONE?0:1,J.arrayFill(T,z),L.applyOffset=new F.GeometryAttribute({componentDatatype:U.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:T})),new F.Geometry({attributes:L,indices:b,primitiveType:F.PrimitiveType.LINES,boundingSphere:S.BoundingSphere.fromEllipsoid(m),offsetAttribute:i._offsetAttribute})}}},i.EllipsoidOutlineGeometry=c}); diff --git a/web/assets/Cesium/Workers/EllipsoidRhumbLine-c704bf4c.js b/web/assets/Cesium/Workers/EllipsoidRhumbLine-c704bf4c.js new file mode 100644 index 00000000..802d7415 --- /dev/null +++ b/web/assets/Cesium/Workers/EllipsoidRhumbLine-c704bf4c.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162"],function(t,m,i,y,S){"use strict";function W(t,i,a){if(0===t)return i*a;var e=t*t,n=e*e,s=n*e,h=s*e,u=h*e,r=u*e,o=a;return i*((1-e/4-3*n/64-5*s/256-175*h/16384-441*u/65536-4851*r/1048576)*o-(3*e/8+3*n/32+45*s/1024+105*h/4096+2205*u/131072+6237*r/524288)*Math.sin(2*o)+(15*n/256+45*s/1024+525*h/16384+1575*u/65536+155925*r/8388608)*Math.sin(4*o)-(35*s/3072+175*h/12288+3675*u/262144+13475*r/1048576)*Math.sin(6*o)+(315*h/131072+2205*u/524288+43659*r/8388608)*Math.sin(8*o)-(693*u/1310720+6237*r/5242880)*Math.sin(10*o)+1001*r/8388608*Math.sin(12*o))}function q(t,i){if(0===t)return Math.log(Math.tan(.5*(y.CesiumMath.PI_OVER_TWO+i)));var a=t*Math.sin(i);return Math.log(Math.tan(.5*(y.CesiumMath.PI_OVER_TWO+i)))-t/2*Math.log((1+a)/(1-a))}var V=new S.Cartesian3,b=new S.Cartesian3;function n(t,i,a,e){S.Cartesian3.normalize(e.cartographicToCartesian(i,b),V),S.Cartesian3.normalize(e.cartographicToCartesian(a,b),b);var n,s,h,u,r,o,d,l,M,c,m,_,g,p,C,f,P,O,E,v=e.maximumRadius,I=e.minimumRadius,T=v*v,R=I*I;t._ellipticitySquared=(T-R)/T,t._ellipticity=Math.sqrt(t._ellipticitySquared),t._start=S.Cartographic.clone(i,t._start),t._start.height=0,t._end=S.Cartographic.clone(a,t._end),t._end.height=0,t._heading=(n=t,s=i.longitude,h=i.latitude,u=a.longitude,r=a.latitude,o=q(n._ellipticity,h),d=q(n._ellipticity,r),Math.atan2(y.CesiumMath.negativePiToPi(u-s),d-o)),t._distance=(l=t,M=e.maximumRadius,c=e.minimumRadius,m=i.longitude,_=i.latitude,g=a.longitude,p=a.latitude,P=l._heading,O=g-m,E=0,E=y.CesiumMath.equalsEpsilon(Math.abs(P),y.CesiumMath.PI_OVER_TWO,y.CesiumMath.EPSILON8)?M===c?M*Math.cos(_)*y.CesiumMath.negativePiToPi(O):(C=Math.sin(_),M*Math.cos(_)*y.CesiumMath.negativePiToPi(O)/Math.sqrt(1-l._ellipticitySquared*C*C)):(f=W(l._ellipticity,M,_),(W(l._ellipticity,M,p)-f)/Math.cos(P)),Math.abs(E))}function M(t,i,a,e,n,s){var h,u,r,o,d,l,M=n*n;return d=Math.abs(y.CesiumMath.PI_OVER_TWO-Math.abs(i))>y.CesiumMath.EPSILON8?(h=function(t,i,a){var e=t/a;if(0===i)return e;var n=e*e,s=n*e,h=s*e,u=i*i,r=u*u,o=r*u,d=o*u,l=d*u,M=l*u,c=Math.sin(2*e),m=Math.cos(2*e),_=Math.sin(4*e),g=Math.cos(4*e),p=Math.sin(6*e),C=Math.cos(6*e),f=Math.sin(8*e),P=Math.cos(8*e),O=Math.sin(10*e);return e+e*u/4+7*e*r/64+15*e*o/256+579*e*d/16384+1515*e*l/65536+16837*e*M/1048576+(3*e*r/16+45*e*o/256-e*(32*n-561)*d/4096-e*(232*n-1677)*l/16384+e*(399985-90560*n+512*h)*M/5242880)*m+(21*e*o/256+483*e*d/4096-e*(224*n-1969)*l/16384-e*(33152*n-112599)*M/1048576)*g+(151*e*d/4096+4681*e*l/65536+1479*e*M/16384-453*s*M/32768)*C+(1097*e*l/65536+42783*e*M/1048576)*P+8011*e*M/1048576*Math.cos(10*e)+(3*u/8+3*r/16+213*o/2048-3*n*o/64+255*d/4096-33*n*d/512+20861*l/524288-33*n*l/512+h*l/1024+28273*M/1048576-471*n*M/8192+9*h*M/4096)*c+(21*r/256+21*o/256+533*d/8192-21*n*d/512+197*l/4096-315*n*l/4096+584039*M/16777216-12517*n*M/131072+7*h*M/2048)*_+(151*o/6144+151*d/4096+5019*l/131072-453*n*l/16384+26965*M/786432-8607*n*M/131072)*p+(1097*d/131072+1097*l/65536+225797*M/10485760-1097*n*M/65536)*f+(8011*l/2621440+8011*M/1048576)*O+293393*M/251658240*Math.sin(12*e)}(W(n,e,t.latitude)+a*Math.cos(i),n,e),u=q(n,t.latitude),r=q(n,h),o=Math.tan(i)*(r-u),y.CesiumMath.negativePiToPi(t.longitude+o)):(h=t.latitude,o=a/(0===n?e*Math.cos(t.latitude):(l=Math.sin(t.latitude),e*Math.cos(t.latitude)/Math.sqrt(1-M*l*l))),0<i?y.CesiumMath.negativePiToPi(t.longitude+o):y.CesiumMath.negativePiToPi(t.longitude-o)),m.defined(s)?(s.longitude=d,s.latitude=h,s.height=0,s):new S.Cartographic(d,h,0)}function c(t,i,a){var e=m.defaultValue(a,S.Ellipsoid.WGS84);this._ellipsoid=e,this._start=new S.Cartographic,this._end=new S.Cartographic,this._heading=void 0,this._distance=void 0,this._ellipticity=void 0,this._ellipticitySquared=void 0,m.defined(t)&&m.defined(i)&&n(this,t,i,e)}Object.defineProperties(c.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},heading:{get:function(){return this._heading}}}),c.fromStartHeadingDistance=function(t,i,a,e,n){var s=m.defaultValue(e,S.Ellipsoid.WGS84),h=s.maximumRadius,u=s.minimumRadius,r=h*h,o=u*u,d=Math.sqrt((r-o)/r),l=M(t,i=y.CesiumMath.negativePiToPi(i),a,s.maximumRadius,d);return!m.defined(n)||m.defined(e)&&!e.equals(n.ellipsoid)?new c(t,l,s):(n.setEndPoints(t,l),n)},c.prototype.setEndPoints=function(t,i){n(this,t,i,this._ellipsoid)},c.prototype.interpolateUsingFraction=function(t,i){return this.interpolateUsingSurfaceDistance(t*this._distance,i)},c.prototype.interpolateUsingSurfaceDistance=function(t,i){return M(this._start,this._heading,t,this._ellipsoid.maximumRadius,this._ellipticity,i)},c.prototype.findIntersectionWithLongitude=function(t,i){var a=this._ellipticity,e=this._heading,n=Math.abs(e),s=this._start;if(t=y.CesiumMath.negativePiToPi(t),y.CesiumMath.equalsEpsilon(Math.abs(t),Math.PI,y.CesiumMath.EPSILON14)&&(t=y.CesiumMath.sign(s.longitude)*Math.PI),m.defined(i)||(i=new S.Cartographic),Math.abs(y.CesiumMath.PI_OVER_TWO-n)<=y.CesiumMath.EPSILON8)return i.longitude=t,i.latitude=s.latitude,i.height=0,i;if(y.CesiumMath.equalsEpsilon(Math.abs(y.CesiumMath.PI_OVER_TWO-n),y.CesiumMath.PI_OVER_TWO,y.CesiumMath.EPSILON8)){if(y.CesiumMath.equalsEpsilon(t,s.longitude,y.CesiumMath.EPSILON12))return;return i.longitude=t,i.latitude=y.CesiumMath.PI_OVER_TWO*y.CesiumMath.sign(y.CesiumMath.PI_OVER_TWO-e),i.height=0,i}var h,u=s.latitude,r=a*Math.sin(u),o=Math.tan(.5*(y.CesiumMath.PI_OVER_TWO+u))*Math.exp((t-s.longitude)/Math.tan(e)),d=(1+r)/(1-r),l=s.latitude;do{h=l;var M=a*Math.sin(h),c=(1+M)/(1-M),l=2*Math.atan(o*Math.pow(c/d,a/2))-y.CesiumMath.PI_OVER_TWO}while(!y.CesiumMath.equalsEpsilon(l,h,y.CesiumMath.EPSILON12));return i.longitude=t,i.latitude=l,i.height=0,i},c.prototype.findIntersectionWithLatitude=function(t,i){var a=this._ellipticity,e=this._heading,n=this._start;if(!y.CesiumMath.equalsEpsilon(Math.abs(e),y.CesiumMath.PI_OVER_TWO,y.CesiumMath.EPSILON8)){var s=q(a,n.latitude),h=q(a,t),u=Math.tan(e)*(h-s),r=y.CesiumMath.negativePiToPi(n.longitude+u);return m.defined(i)?(i.longitude=r,i.latitude=t,i.height=0,i):new S.Cartographic(r,t,0)}},t.EllipsoidRhumbLine=c}); diff --git a/web/assets/Cesium/Workers/EllipsoidTangentPlane-ed172748.js b/web/assets/Cesium/Workers/EllipsoidTangentPlane-ed172748.js new file mode 100644 index 00000000..c711b6d4 --- /dev/null +++ b/web/assets/Cesium/Workers/EllipsoidTangentPlane-ed172748.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Cartesian2-bddc1162","./Transforms-ec27f304","./IntersectionTests-2626c9e9","./Plane-231f1723"],function(e,p,n,x,s,o,a){"use strict";function y(e,n,t){this.minimum=x.Cartesian3.clone(p.defaultValue(e,x.Cartesian3.ZERO)),this.maximum=x.Cartesian3.clone(p.defaultValue(n,x.Cartesian3.ZERO)),t=p.defined(t)?x.Cartesian3.clone(t):x.Cartesian3.midpoint(this.minimum,this.maximum,new x.Cartesian3),this.center=t}y.fromPoints=function(e,n){if(p.defined(n)||(n=new y),!p.defined(e)||0===e.length)return n.minimum=x.Cartesian3.clone(x.Cartesian3.ZERO,n.minimum),n.maximum=x.Cartesian3.clone(x.Cartesian3.ZERO,n.maximum),n.center=x.Cartesian3.clone(x.Cartesian3.ZERO,n.center),n;for(var t=e[0].x,i=e[0].y,a=e[0].z,r=e[0].x,s=e[0].y,o=e[0].z,m=e.length,c=1;c<m;c++)var l=e[c],u=l.x,d=l.y,f=l.z,t=Math.min(u,t),r=Math.max(u,r),i=Math.min(d,i),s=Math.max(d,s),a=Math.min(f,a),o=Math.max(f,o);var h=n.minimum;h.x=t,h.y=i,h.z=a;var C=n.maximum;return C.x=r,C.y=s,C.z=o,n.center=x.Cartesian3.midpoint(h,C,n.center),n},y.clone=function(e,n){if(p.defined(e))return p.defined(n)?(n.minimum=x.Cartesian3.clone(e.minimum,n.minimum),n.maximum=x.Cartesian3.clone(e.maximum,n.maximum),n.center=x.Cartesian3.clone(e.center,n.center),n):new y(e.minimum,e.maximum,e.center)},y.equals=function(e,n){return e===n||p.defined(e)&&p.defined(n)&&x.Cartesian3.equals(e.center,n.center)&&x.Cartesian3.equals(e.minimum,n.minimum)&&x.Cartesian3.equals(e.maximum,n.maximum)};var m=new x.Cartesian3;y.intersectPlane=function(e,n){m=x.Cartesian3.subtract(e.maximum,e.minimum,m);var t=x.Cartesian3.multiplyByScalar(m,.5,m),i=n.normal,a=t.x*Math.abs(i.x)+t.y*Math.abs(i.y)+t.z*Math.abs(i.z),r=x.Cartesian3.dot(e.center,i)+n.distance;return 0<r-a?s.Intersect.INSIDE:r+a<0?s.Intersect.OUTSIDE:s.Intersect.INTERSECTING},y.prototype.clone=function(e){return y.clone(this,e)},y.prototype.intersectPlane=function(e){return y.intersectPlane(this,e)},y.prototype.equals=function(e){return y.equals(this,e)};var r=new s.Cartesian4;function t(e,n){e=(n=p.defaultValue(n,x.Ellipsoid.WGS84)).scaleToGeodeticSurface(e);var t=s.Transforms.eastNorthUpToFixedFrame(e,n);this._ellipsoid=n,this._origin=e,this._xAxis=x.Cartesian3.fromCartesian4(s.Matrix4.getColumn(t,0,r)),this._yAxis=x.Cartesian3.fromCartesian4(s.Matrix4.getColumn(t,1,r));var i=x.Cartesian3.fromCartesian4(s.Matrix4.getColumn(t,2,r));this._plane=a.Plane.fromPointNormal(e,i)}Object.defineProperties(t.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},origin:{get:function(){return this._origin}},plane:{get:function(){return this._plane}},xAxis:{get:function(){return this._xAxis}},yAxis:{get:function(){return this._yAxis}},zAxis:{get:function(){return this._plane.normal}}});var i=new y;t.fromPoints=function(e,n){return new t(y.fromPoints(e,i).center,n)};var c=new o.Ray,l=new x.Cartesian3;t.prototype.projectPointOntoPlane=function(e,n){var t=c;t.origin=e,x.Cartesian3.normalize(e,t.direction);var i=o.IntersectionTests.rayPlane(t,this._plane,l);if(p.defined(i)||(x.Cartesian3.negate(t.direction,t.direction),i=o.IntersectionTests.rayPlane(t,this._plane,l)),p.defined(i)){var a=x.Cartesian3.subtract(i,this._origin,i),r=x.Cartesian3.dot(this._xAxis,a),s=x.Cartesian3.dot(this._yAxis,a);return p.defined(n)?(n.x=r,n.y=s,n):new x.Cartesian2(r,s)}},t.prototype.projectPointsOntoPlane=function(e,n){p.defined(n)||(n=[]);for(var t=0,i=e.length,a=0;a<i;a++){var r=this.projectPointOntoPlane(e[a],n[t]);p.defined(r)&&(n[t]=r,t++)}return n.length=t,n},t.prototype.projectPointToNearestOnPlane=function(e,n){p.defined(n)||(n=new x.Cartesian2);var t=c;t.origin=e,x.Cartesian3.clone(this._plane.normal,t.direction);var i=o.IntersectionTests.rayPlane(t,this._plane,l);p.defined(i)||(x.Cartesian3.negate(t.direction,t.direction),i=o.IntersectionTests.rayPlane(t,this._plane,l));var a=x.Cartesian3.subtract(i,this._origin,i),r=x.Cartesian3.dot(this._xAxis,a),s=x.Cartesian3.dot(this._yAxis,a);return n.x=r,n.y=s,n},t.prototype.projectPointsToNearestOnPlane=function(e,n){p.defined(n)||(n=[]);var t=e.length;n.length=t;for(var i=0;i<t;i++)n[i]=this.projectPointToNearestOnPlane(e[i],n[i]);return n};var u=new x.Cartesian3;t.prototype.projectPointOntoEllipsoid=function(e,n){p.defined(n)||(n=new x.Cartesian3);var t=this._ellipsoid,i=this._origin,a=this._xAxis,r=this._yAxis,s=u;return x.Cartesian3.multiplyByScalar(a,e.x,s),n=x.Cartesian3.add(i,s,n),x.Cartesian3.multiplyByScalar(r,e.y,s),x.Cartesian3.add(n,s,n),t.scaleToGeocentricSurface(n,n),n},t.prototype.projectPointsOntoEllipsoid=function(e,n){var t=e.length;p.defined(n)?n.length=t:n=new Array(t);for(var i=0;i<t;++i)n[i]=this.projectPointOntoEllipsoid(e[i],n[i]);return n},e.AxisAlignedBoundingBox=y,e.EllipsoidTangentPlane=t}); diff --git a/web/assets/Cesium/Workers/EncodedCartesian3-e9c71cf0.js b/web/assets/Cesium/Workers/EncodedCartesian3-e9c71cf0.js new file mode 100644 index 00000000..0d08b9c9 --- /dev/null +++ b/web/assets/Cesium/Workers/EncodedCartesian3-e9c71cf0.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Cartesian2-bddc1162"],function(e,h,n,i){"use strict";function r(){this.high=i.Cartesian3.clone(i.Cartesian3.ZERO),this.low=i.Cartesian3.clone(i.Cartesian3.ZERO)}r.encode=function(e,n){var i;return h.defined(n)||(n={high:0,low:0}),0<=e?(i=65536*Math.floor(e/65536),n.high=i,n.low=e-i):(i=65536*Math.floor(-e/65536),n.high=-i,n.low=e+i),n};var t={high:0,low:0};r.fromCartesian=function(e,n){h.defined(n)||(n=new r);var i=n.high,o=n.low;return r.encode(e.x,t),i.x=t.high,o.x=t.low,r.encode(e.y,t),i.y=t.high,o.y=t.low,r.encode(e.z,t),i.z=t.high,o.z=t.low,n};var a=new r;r.writeElements=function(e,n,i){r.fromCartesian(e,a);var o=a.high,h=a.low;n[i]=o.x,n[i+1]=o.y,n[i+2]=o.z,n[i+3]=h.x,n[i+4]=h.y,n[i+5]=h.z},e.EncodedCartesian3=r}); diff --git a/web/assets/Cesium/Workers/FrustumGeometry-d632cb92.js b/web/assets/Cesium/Workers/FrustumGeometry-d632cb92.js new file mode 100644 index 00000000..8e54cbc6 --- /dev/null +++ b/web/assets/Cesium/Workers/FrustumGeometry-d632cb92.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./Plane-231f1723","./VertexFormat-7572c785"],function(t,F,e,i,V,E,O,P,z,f,l){"use strict";function h(t){this.planes=F.defaultValue(t,[])}var p=[new V.Cartesian3,new V.Cartesian3,new V.Cartesian3];V.Cartesian3.clone(V.Cartesian3.UNIT_X,p[0]),V.Cartesian3.clone(V.Cartesian3.UNIT_Y,p[1]),V.Cartesian3.clone(V.Cartesian3.UNIT_Z,p[2]);var c=new V.Cartesian3,d=new V.Cartesian3,u=new f.Plane(new V.Cartesian3(1,0,0),0);function r(t){t=F.defaultValue(t,F.defaultValue.EMPTY_OBJECT),this.left=t.left,this._left=void 0,this.right=t.right,this._right=void 0,this.top=t.top,this._top=void 0,this.bottom=t.bottom,this._bottom=void 0,this.near=F.defaultValue(t.near,1),this._near=this.near,this.far=F.defaultValue(t.far,5e8),this._far=this.far,this._cullingVolume=new h,this._orthographicMatrix=new E.Matrix4}function s(t){t.top===t._top&&t.bottom===t._bottom&&t.left===t._left&&t.right===t._right&&t.near===t._near&&t.far===t._far||(t._left=t.left,t._right=t.right,t._top=t.top,t._bottom=t.bottom,t._near=t.near,t._far=t.far,t._orthographicMatrix=E.Matrix4.computeOrthographicOffCenter(t.left,t.right,t.bottom,t.top,t.near,t.far,t._orthographicMatrix))}h.fromBoundingSphere=function(t,e){F.defined(e)||(e=new h);var a=p.length,i=e.planes;i.length=2*a;for(var r=t.center,n=t.radius,o=0,s=0;s<a;++s){var f=p[s],u=i[o],l=i[o+1];F.defined(u)||(u=i[o]=new E.Cartesian4),F.defined(l)||(l=i[o+1]=new E.Cartesian4),V.Cartesian3.multiplyByScalar(f,-n,c),V.Cartesian3.add(r,c,c),u.x=f.x,u.y=f.y,u.z=f.z,u.w=-V.Cartesian3.dot(f,c),V.Cartesian3.multiplyByScalar(f,n,c),V.Cartesian3.add(r,c,c),l.x=-f.x,l.y=-f.y,l.z=-f.z,l.w=-V.Cartesian3.dot(V.Cartesian3.negate(f,d),c),o+=2}return e},h.prototype.computeVisibility=function(t){for(var e=this.planes,a=!1,i=0,r=e.length;i<r;++i){var n=t.intersectPlane(f.Plane.fromCartesian4(e[i],u));if(n===E.Intersect.OUTSIDE)return E.Intersect.OUTSIDE;n===E.Intersect.INTERSECTING&&(a=!0)}return a?E.Intersect.INTERSECTING:E.Intersect.INSIDE},h.prototype.computeVisibilityWithPlaneMask=function(t,e){if(e===h.MASK_OUTSIDE||e===h.MASK_INSIDE)return e;for(var a=h.MASK_INSIDE,i=this.planes,r=0,n=i.length;r<n;++r){var o=r<31?1<<r:0;if(!(r<31&&0==(e&o))){var s=t.intersectPlane(f.Plane.fromCartesian4(i[r],u));if(s===E.Intersect.OUTSIDE)return h.MASK_OUTSIDE;s===E.Intersect.INTERSECTING&&(a|=o)}}return a},h.MASK_OUTSIDE=4294967295,h.MASK_INSIDE=0,h.MASK_INDETERMINATE=2147483647,Object.defineProperties(r.prototype,{projectionMatrix:{get:function(){return s(this),this._orthographicMatrix}}});var m=new V.Cartesian3,C=new V.Cartesian3,_=new V.Cartesian3,y=new V.Cartesian3;function v(t){t=F.defaultValue(t,F.defaultValue.EMPTY_OBJECT),this._offCenterFrustum=new r,this.width=t.width,this._width=void 0,this.aspectRatio=t.aspectRatio,this._aspectRatio=void 0,this.near=F.defaultValue(t.near,1),this._near=this.near,this.far=F.defaultValue(t.far,5e8),this._far=this.far}function n(t){var e,a=t._offCenterFrustum;t.width===t._width&&t.aspectRatio===t._aspectRatio&&t.near===t._near&&t.far===t._far||(t._aspectRatio=t.aspectRatio,t._width=t.width,t._near=t.near,t._far=t.far,e=1/t.aspectRatio,a.right=.5*t.width,a.left=-a.right,a.top=e*a.right,a.bottom=-a.top,a.near=t.near,a.far=t.far)}function o(t){t=F.defaultValue(t,F.defaultValue.EMPTY_OBJECT),this.left=t.left,this._left=void 0,this.right=t.right,this._right=void 0,this.top=t.top,this._top=void 0,this.bottom=t.bottom,this._bottom=void 0,this.near=F.defaultValue(t.near,1),this._near=this.near,this.far=F.defaultValue(t.far,5e8),this._far=this.far,this._cullingVolume=new h,this._perspectiveMatrix=new E.Matrix4,this._infinitePerspective=new E.Matrix4}function g(t){var e=t.top,a=t.bottom,i=t.right,r=t.left,n=t.near,o=t.far;e===t._top&&a===t._bottom&&r===t._left&&i===t._right&&n===t._near&&o===t._far||(t._left=r,t._right=i,t._top=e,t._bottom=a,t._near=n,t._far=o,t._perspectiveMatrix=E.Matrix4.computePerspectiveOffCenter(r,i,a,e,n,o,t._perspectiveMatrix),t._infinitePerspective=E.Matrix4.computeInfinitePerspectiveOffCenter(r,i,a,e,n,t._infinitePerspective))}r.prototype.computeCullingVolume=function(t,e,a){var i=this._cullingVolume.planes,r=this.top,n=this.bottom,o=this.right,s=this.left,f=this.near,u=this.far,l=V.Cartesian3.cross(e,a,m);V.Cartesian3.normalize(l,l);var h=C;V.Cartesian3.multiplyByScalar(e,f,h),V.Cartesian3.add(t,h,h);var p=_;V.Cartesian3.multiplyByScalar(l,s,p),V.Cartesian3.add(h,p,p);var c=i[0];return F.defined(c)||(c=i[0]=new E.Cartesian4),c.x=l.x,c.y=l.y,c.z=l.z,c.w=-V.Cartesian3.dot(l,p),V.Cartesian3.multiplyByScalar(l,o,p),V.Cartesian3.add(h,p,p),c=i[1],F.defined(c)||(c=i[1]=new E.Cartesian4),c.x=-l.x,c.y=-l.y,c.z=-l.z,c.w=-V.Cartesian3.dot(V.Cartesian3.negate(l,y),p),V.Cartesian3.multiplyByScalar(a,n,p),V.Cartesian3.add(h,p,p),c=i[2],F.defined(c)||(c=i[2]=new E.Cartesian4),c.x=a.x,c.y=a.y,c.z=a.z,c.w=-V.Cartesian3.dot(a,p),V.Cartesian3.multiplyByScalar(a,r,p),V.Cartesian3.add(h,p,p),c=i[3],F.defined(c)||(c=i[3]=new E.Cartesian4),c.x=-a.x,c.y=-a.y,c.z=-a.z,c.w=-V.Cartesian3.dot(V.Cartesian3.negate(a,y),p),c=i[4],F.defined(c)||(c=i[4]=new E.Cartesian4),c.x=e.x,c.y=e.y,c.z=e.z,c.w=-V.Cartesian3.dot(e,h),V.Cartesian3.multiplyByScalar(e,u,p),V.Cartesian3.add(t,p,p),c=i[5],F.defined(c)||(c=i[5]=new E.Cartesian4),c.x=-e.x,c.y=-e.y,c.z=-e.z,c.w=-V.Cartesian3.dot(V.Cartesian3.negate(e,y),p),this._cullingVolume},r.prototype.getPixelDimensions=function(t,e,a,i,r){s(this);var n=i*(this.right-this.left)/t,o=i*(this.top-this.bottom)/e;return r.x=n,r.y=o,r},r.prototype.clone=function(t){return F.defined(t)||(t=new r),t.left=this.left,t.right=this.right,t.top=this.top,t.bottom=this.bottom,t.near=this.near,t.far=this.far,t._left=void 0,t._right=void 0,t._top=void 0,t._bottom=void 0,t._near=void 0,t._far=void 0,t},r.prototype.equals=function(t){return F.defined(t)&&t instanceof r&&this.right===t.right&&this.left===t.left&&this.top===t.top&&this.bottom===t.bottom&&this.near===t.near&&this.far===t.far},r.prototype.equalsEpsilon=function(t,e,a){return t===this||F.defined(t)&&t instanceof r&&i.CesiumMath.equalsEpsilon(this.right,t.right,e,a)&&i.CesiumMath.equalsEpsilon(this.left,t.left,e,a)&&i.CesiumMath.equalsEpsilon(this.top,t.top,e,a)&&i.CesiumMath.equalsEpsilon(this.bottom,t.bottom,e,a)&&i.CesiumMath.equalsEpsilon(this.near,t.near,e,a)&&i.CesiumMath.equalsEpsilon(this.far,t.far,e,a)},v.packedLength=4,v.pack=function(t,e,a){return a=F.defaultValue(a,0),e[a++]=t.width,e[a++]=t.aspectRatio,e[a++]=t.near,e[a]=t.far,e},v.unpack=function(t,e,a){return e=F.defaultValue(e,0),F.defined(a)||(a=new v),a.width=t[e++],a.aspectRatio=t[e++],a.near=t[e++],a.far=t[e],a},Object.defineProperties(v.prototype,{projectionMatrix:{get:function(){return n(this),this._offCenterFrustum.projectionMatrix}}}),v.prototype.computeCullingVolume=function(t,e,a){return n(this),this._offCenterFrustum.computeCullingVolume(t,e,a)},v.prototype.getPixelDimensions=function(t,e,a,i,r){return n(this),this._offCenterFrustum.getPixelDimensions(t,e,a,i,r)},v.prototype.clone=function(t){return F.defined(t)||(t=new v),t.aspectRatio=this.aspectRatio,t.width=this.width,t.near=this.near,t.far=this.far,t._aspectRatio=void 0,t._width=void 0,t._near=void 0,t._far=void 0,this._offCenterFrustum.clone(t._offCenterFrustum),t},v.prototype.equals=function(t){return!!(F.defined(t)&&t instanceof v)&&(n(this),n(t),this.width===t.width&&this.aspectRatio===t.aspectRatio&&this._offCenterFrustum.equals(t._offCenterFrustum))},v.prototype.equalsEpsilon=function(t,e,a){return!!(F.defined(t)&&t instanceof v)&&(n(this),n(t),i.CesiumMath.equalsEpsilon(this.width,t.width,e,a)&&i.CesiumMath.equalsEpsilon(this.aspectRatio,t.aspectRatio,e,a)&&this._offCenterFrustum.equalsEpsilon(t._offCenterFrustum,e,a))},Object.defineProperties(o.prototype,{projectionMatrix:{get:function(){return g(this),this._perspectiveMatrix}},infiniteProjectionMatrix:{get:function(){return g(this),this._infinitePerspective}}});var w=new V.Cartesian3,x=new V.Cartesian3,M=new V.Cartesian3,b=new V.Cartesian3;function R(t){t=F.defaultValue(t,F.defaultValue.EMPTY_OBJECT),this._offCenterFrustum=new o,this.fov=t.fov,this._fov=void 0,this._fovy=void 0,this._sseDenominator=void 0,this.aspectRatio=t.aspectRatio,this._aspectRatio=void 0,this.near=F.defaultValue(t.near,1),this._near=this.near,this.far=F.defaultValue(t.far,5e8),this._far=this.far,this.xOffset=F.defaultValue(t.xOffset,0),this._xOffset=this.xOffset,this.yOffset=F.defaultValue(t.yOffset,0),this._yOffset=this.yOffset}function S(t){var e=t._offCenterFrustum;t.fov===t._fov&&t.aspectRatio===t._aspectRatio&&t.near===t._near&&t.far===t._far&&t.xOffset===t._xOffset&&t.yOffset===t._yOffset||(t._aspectRatio=t.aspectRatio,t._fov=t.fov,t._fovy=t.aspectRatio<=1?t.fov:2*Math.atan(Math.tan(.5*t.fov)/t.aspectRatio),t._near=t.near,t._far=t.far,t._sseDenominator=2*Math.tan(.5*t._fovy),t._xOffset=t.xOffset,t._yOffset=t.yOffset,e.top=t.near*Math.tan(.5*t._fovy),e.bottom=-e.top,e.right=t.aspectRatio*e.top,e.left=-e.right,e.near=t.near,e.far=t.far,e.right+=t.xOffset,e.left+=t.xOffset,e.top+=t.yOffset,e.bottom+=t.yOffset)}o.prototype.computeCullingVolume=function(t,e,a){var i=this._cullingVolume.planes,r=this.top,n=this.bottom,o=this.right,s=this.left,f=this.near,u=this.far,l=V.Cartesian3.cross(e,a,w),h=x;V.Cartesian3.multiplyByScalar(e,f,h),V.Cartesian3.add(t,h,h);var p=M;V.Cartesian3.multiplyByScalar(e,u,p),V.Cartesian3.add(t,p,p);var c=b;V.Cartesian3.multiplyByScalar(l,s,c),V.Cartesian3.add(h,c,c),V.Cartesian3.subtract(c,t,c),V.Cartesian3.normalize(c,c),V.Cartesian3.cross(c,a,c),V.Cartesian3.normalize(c,c);var d=i[0];return F.defined(d)||(d=i[0]=new E.Cartesian4),d.x=c.x,d.y=c.y,d.z=c.z,d.w=-V.Cartesian3.dot(c,t),V.Cartesian3.multiplyByScalar(l,o,c),V.Cartesian3.add(h,c,c),V.Cartesian3.subtract(c,t,c),V.Cartesian3.cross(a,c,c),V.Cartesian3.normalize(c,c),d=i[1],F.defined(d)||(d=i[1]=new E.Cartesian4),d.x=c.x,d.y=c.y,d.z=c.z,d.w=-V.Cartesian3.dot(c,t),V.Cartesian3.multiplyByScalar(a,n,c),V.Cartesian3.add(h,c,c),V.Cartesian3.subtract(c,t,c),V.Cartesian3.cross(l,c,c),V.Cartesian3.normalize(c,c),d=i[2],F.defined(d)||(d=i[2]=new E.Cartesian4),d.x=c.x,d.y=c.y,d.z=c.z,d.w=-V.Cartesian3.dot(c,t),V.Cartesian3.multiplyByScalar(a,r,c),V.Cartesian3.add(h,c,c),V.Cartesian3.subtract(c,t,c),V.Cartesian3.cross(c,l,c),V.Cartesian3.normalize(c,c),d=i[3],F.defined(d)||(d=i[3]=new E.Cartesian4),d.x=c.x,d.y=c.y,d.z=c.z,d.w=-V.Cartesian3.dot(c,t),d=i[4],F.defined(d)||(d=i[4]=new E.Cartesian4),d.x=e.x,d.y=e.y,d.z=e.z,d.w=-V.Cartesian3.dot(e,h),V.Cartesian3.negate(e,c),d=i[5],F.defined(d)||(d=i[5]=new E.Cartesian4),d.x=c.x,d.y=c.y,d.z=c.z,d.w=-V.Cartesian3.dot(c,p),this._cullingVolume},o.prototype.getPixelDimensions=function(t,e,a,i,r){g(this);var n=1/this.near,o=2*i*a*(this.top*n)/e,s=2*i*a*(this.right*n)/t;return r.x=s,r.y=o,r},o.prototype.clone=function(t){return F.defined(t)||(t=new o),t.right=this.right,t.left=this.left,t.top=this.top,t.bottom=this.bottom,t.near=this.near,t.far=this.far,t._left=void 0,t._right=void 0,t._top=void 0,t._bottom=void 0,t._near=void 0,t._far=void 0,t},o.prototype.equals=function(t){return F.defined(t)&&t instanceof o&&this.right===t.right&&this.left===t.left&&this.top===t.top&&this.bottom===t.bottom&&this.near===t.near&&this.far===t.far},o.prototype.equalsEpsilon=function(t,e,a){return t===this||F.defined(t)&&t instanceof o&&i.CesiumMath.equalsEpsilon(this.right,t.right,e,a)&&i.CesiumMath.equalsEpsilon(this.left,t.left,e,a)&&i.CesiumMath.equalsEpsilon(this.top,t.top,e,a)&&i.CesiumMath.equalsEpsilon(this.bottom,t.bottom,e,a)&&i.CesiumMath.equalsEpsilon(this.near,t.near,e,a)&&i.CesiumMath.equalsEpsilon(this.far,t.far,e,a)},R.packedLength=6,R.pack=function(t,e,a){return a=F.defaultValue(a,0),e[a++]=t.fov,e[a++]=t.aspectRatio,e[a++]=t.near,e[a++]=t.far,e[a++]=t.xOffset,e[a]=t.yOffset,e},R.unpack=function(t,e,a){return e=F.defaultValue(e,0),F.defined(a)||(a=new R),a.fov=t[e++],a.aspectRatio=t[e++],a.near=t[e++],a.far=t[e++],a.xOffset=t[e++],a.yOffset=t[e],a},Object.defineProperties(R.prototype,{projectionMatrix:{get:function(){return S(this),this._offCenterFrustum.projectionMatrix}},infiniteProjectionMatrix:{get:function(){return S(this),this._offCenterFrustum.infiniteProjectionMatrix}},fovy:{get:function(){return S(this),this._fovy}},sseDenominator:{get:function(){return S(this),this._sseDenominator}}}),R.prototype.computeCullingVolume=function(t,e,a){return S(this),this._offCenterFrustum.computeCullingVolume(t,e,a)},R.prototype.getPixelDimensions=function(t,e,a,i,r){return S(this),this._offCenterFrustum.getPixelDimensions(t,e,a,i,r)},R.prototype.clone=function(t){return F.defined(t)||(t=new R),t.aspectRatio=this.aspectRatio,t.fov=this.fov,t.near=this.near,t.far=this.far,t._aspectRatio=void 0,t._fov=void 0,t._near=void 0,t._far=void 0,this._offCenterFrustum.clone(t._offCenterFrustum),t},R.prototype.equals=function(t){return!!(F.defined(t)&&t instanceof R)&&(S(this),S(t),this.fov===t.fov&&this.aspectRatio===t.aspectRatio&&this._offCenterFrustum.equals(t._offCenterFrustum))},R.prototype.equalsEpsilon=function(t,e,a){return!!(F.defined(t)&&t instanceof R)&&(S(this),S(t),i.CesiumMath.equalsEpsilon(this.fov,t.fov,e,a)&&i.CesiumMath.equalsEpsilon(this.aspectRatio,t.aspectRatio,e,a)&&this._offCenterFrustum.equalsEpsilon(t._offCenterFrustum,e,a))};function T(t){var e,a,i=t.frustum,r=t.orientation,n=t.origin,o=F.defaultValue(t.vertexFormat,l.VertexFormat.DEFAULT),s=F.defaultValue(t._drawNearPlane,!0);i instanceof R?(e=0,a=R.packedLength):i instanceof v&&(e=1,a=v.packedLength),this._frustumType=e,this._frustum=i.clone(),this._origin=V.Cartesian3.clone(n),this._orientation=E.Quaternion.clone(r),this._drawNearPlane=s,this._vertexFormat=o,this._workerName="createFrustumGeometry",this.packedLength=2+a+V.Cartesian3.packedLength+E.Quaternion.packedLength+l.VertexFormat.packedLength}T.pack=function(t,e,a){a=F.defaultValue(a,0);var i=t._frustumType,r=t._frustum;return 0===(e[a++]=i)?(R.pack(r,e,a),a+=R.packedLength):(v.pack(r,e,a),a+=v.packedLength),V.Cartesian3.pack(t._origin,e,a),a+=V.Cartesian3.packedLength,E.Quaternion.pack(t._orientation,e,a),a+=E.Quaternion.packedLength,l.VertexFormat.pack(t._vertexFormat,e,a),e[a+=l.VertexFormat.packedLength]=t._drawNearPlane?1:0,e};var k=new R,A=new v,D=new E.Quaternion,I=new V.Cartesian3,q=new l.VertexFormat;function B(t,e,a,i,r,n,o,s){for(var f=t/3*2,u=0;u<4;++u)F.defined(e)&&(e[t]=n.x,e[t+1]=n.y,e[t+2]=n.z),F.defined(a)&&(a[t]=o.x,a[t+1]=o.y,a[t+2]=o.z),F.defined(i)&&(i[t]=s.x,i[t+1]=s.y,i[t+2]=s.z),t+=3;r[f]=0,r[1+f]=0,r[2+f]=1,r[3+f]=0,r[4+f]=1,r[5+f]=1,r[6+f]=0,r[7+f]=1}T.unpack=function(t,e,a){e=F.defaultValue(e,0);var i,r=t[e++];0===r?(i=R.unpack(t,e,k),e+=R.packedLength):(i=v.unpack(t,e,A),e+=v.packedLength);var n=V.Cartesian3.unpack(t,e,I);e+=V.Cartesian3.packedLength;var o=E.Quaternion.unpack(t,e,D);e+=E.Quaternion.packedLength;var s=l.VertexFormat.unpack(t,e,q),f=1===t[e+=l.VertexFormat.packedLength];if(!F.defined(a))return new T({frustum:i,origin:n,orientation:o,vertexFormat:s,_drawNearPlane:f});var u=r===a._frustumType?a._frustum:void 0;return a._frustum=i.clone(u),a._frustumType=r,a._origin=V.Cartesian3.clone(n,a._origin),a._orientation=E.Quaternion.clone(o,a._orientation),a._vertexFormat=l.VertexFormat.clone(s,a._vertexFormat),a._drawNearPlane=f,a};var L=new E.Matrix3,N=new E.Matrix4,G=new E.Matrix4,j=new V.Cartesian3,U=new V.Cartesian3,Q=new V.Cartesian3,K=new V.Cartesian3,Y=new V.Cartesian3,J=new V.Cartesian3,W=new Array(3),X=new Array(4);X[0]=new E.Cartesian4(-1,-1,1,1),X[1]=new E.Cartesian4(1,-1,1,1),X[2]=new E.Cartesian4(1,1,1,1),X[3]=new E.Cartesian4(-1,1,1,1);for(var Z=new Array(4),a=0;a<4;++a)Z[a]=new E.Cartesian4;T._computeNearFarPlanes=function(t,e,a,i,r,n,o,s){var f=E.Matrix3.fromQuaternion(e,L),u=F.defaultValue(n,j),l=F.defaultValue(o,U),h=F.defaultValue(s,Q),u=E.Matrix3.getColumn(f,0,u),l=E.Matrix3.getColumn(f,1,l),h=E.Matrix3.getColumn(f,2,h);V.Cartesian3.normalize(u,u),V.Cartesian3.normalize(l,l),V.Cartesian3.normalize(h,h),V.Cartesian3.negate(u,u);var p,c,d,m,C=E.Matrix4.computeView(t,h,l,u,N);0===a?(c=i.projectionMatrix,d=E.Matrix4.multiply(c,C,G),m=E.Matrix4.inverse(d,G)):p=E.Matrix4.inverseTransformation(C,G),F.defined(m)?(W[0]=i.near,W[1]=i.far):(W[0]=0,W[1]=i.near,W[2]=i.far);for(var _=0;_<2;++_)for(var y=0;y<4;++y){var v,g,w,x,M=E.Cartesian4.clone(X[y],Z[y]);F.defined(m)?(v=1/(M=E.Matrix4.multiplyByVector(m,M,M)).w,V.Cartesian3.multiplyByScalar(M,v,M),V.Cartesian3.subtract(M,t,M),V.Cartesian3.normalize(M,M),g=V.Cartesian3.dot(h,M),V.Cartesian3.multiplyByScalar(M,W[_]/g,M),V.Cartesian3.add(M,t,M)):(F.defined(i._offCenterFrustum)&&(i=i._offCenterFrustum),w=W[_],x=W[_+1],M.x=.5*(M.x*(i.right-i.left)+i.left+i.right),M.y=.5*(M.y*(i.top-i.bottom)+i.bottom+i.top),M.z=.5*(M.z*(w-x)-w-x),M.w=1,E.Matrix4.multiplyByVector(p,M,M)),r[12*_+3*y]=M.x,r[12*_+3*y+1]=M.y,r[12*_+3*y+2]=M.z}},T.createGeometry=function(t){var e=t._frustumType,a=t._frustum,i=t._origin,r=t._orientation,n=t._drawNearPlane,o=t._vertexFormat,s=n?6:5,f=new Float64Array(72);T._computeNearFarPlanes(i,r,e,a,f);var u=24;f[u]=f[12],f[u+1]=f[13],f[u+2]=f[14],f[u+3]=f[0],f[u+4]=f[1],f[u+5]=f[2],f[u+6]=f[9],f[u+7]=f[10],f[u+8]=f[11],f[u+9]=f[21],f[u+10]=f[22],f[u+11]=f[23],f[u+=12]=f[15],f[u+1]=f[16],f[u+2]=f[17],f[u+3]=f[3],f[u+4]=f[4],f[u+5]=f[5],f[u+6]=f[0],f[u+7]=f[1],f[u+8]=f[2],f[u+9]=f[12],f[u+10]=f[13],f[u+11]=f[14],f[u+=12]=f[3],f[u+1]=f[4],f[u+2]=f[5],f[u+3]=f[15],f[u+4]=f[16],f[u+5]=f[17],f[u+6]=f[18],f[u+7]=f[19],f[u+8]=f[20],f[u+9]=f[6],f[u+10]=f[7],f[u+11]=f[8],f[u+=12]=f[6],f[u+1]=f[7],f[u+2]=f[8],f[u+3]=f[18],f[u+4]=f[19],f[u+5]=f[20],f[u+6]=f[21],f[u+7]=f[22],f[u+8]=f[23],f[u+9]=f[9],f[u+10]=f[10],f[u+11]=f[11],n||(f=f.subarray(12));var l,h,p,c,d,m,C,_,y,v,g=new z.GeometryAttributes({position:new P.GeometryAttribute({componentDatatype:O.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:f})});(F.defined(o.normal)||F.defined(o.tangent)||F.defined(o.bitangent)||F.defined(o.st))&&(l=F.defined(o.normal)?new Float32Array(12*s):void 0,h=F.defined(o.tangent)?new Float32Array(12*s):void 0,p=F.defined(o.bitangent)?new Float32Array(12*s):void 0,c=F.defined(o.st)?new Float32Array(8*s):void 0,d=j,m=U,C=Q,_=V.Cartesian3.negate(d,K),y=V.Cartesian3.negate(m,Y),v=V.Cartesian3.negate(C,J),u=0,n&&(B(u,l,h,p,c,v,d,m),u+=12),B(u,l,h,p,c,C,_,m),B(u+=12,l,h,p,c,_,v,m),B(u+=12,l,h,p,c,y,v,_),B(u+=12,l,h,p,c,d,C,m),B(u+=12,l,h,p,c,m,C,_),F.defined(l)&&(g.normal=new P.GeometryAttribute({componentDatatype:O.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:l})),F.defined(h)&&(g.tangent=new P.GeometryAttribute({componentDatatype:O.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:h})),F.defined(p)&&(g.bitangent=new P.GeometryAttribute({componentDatatype:O.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:p})),F.defined(c)&&(g.st=new P.GeometryAttribute({componentDatatype:O.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:c})));for(var w=new Uint16Array(6*s),x=0;x<s;++x){var M=6*x,b=4*x;w[M]=b,w[1+M]=1+b,w[2+M]=2+b,w[3+M]=b,w[4+M]=2+b,w[5+M]=3+b}return new P.Geometry({attributes:g,indices:w,primitiveType:P.PrimitiveType.TRIANGLES,boundingSphere:E.BoundingSphere.fromVertices(f)})},t.FrustumGeometry=T,t.OrthographicFrustum=v,t.PerspectiveFrustum=R}); diff --git a/web/assets/Cesium/Workers/GeometryAttribute-44fb48f1.js b/web/assets/Cesium/Workers/GeometryAttribute-44fb48f1.js new file mode 100644 index 00000000..c170b751 --- /dev/null +++ b/web/assets/Cesium/Workers/GeometryAttribute-44fb48f1.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Cartesian2-bddc1162","./Transforms-ec27f304","./WebGLConstants-76bb35d1"],function(t,a,e,O,M,n){"use strict";var r=Object.freeze({NONE:0,TRIANGLES:1,LINES:2,POLYLINES:3});function v(t,e,n,r){this[0]=a.defaultValue(t,0),this[1]=a.defaultValue(n,0),this[2]=a.defaultValue(e,0),this[3]=a.defaultValue(r,0)}v.packedLength=4,v.pack=function(t,e,n){return n=a.defaultValue(n,0),e[n++]=t[0],e[n++]=t[1],e[n++]=t[2],e[n++]=t[3],e},v.unpack=function(t,e,n){return e=a.defaultValue(e,0),a.defined(n)||(n=new v),n[0]=t[e++],n[1]=t[e++],n[2]=t[e++],n[3]=t[e++],n},v.clone=function(t,e){if(a.defined(t))return a.defined(e)?(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e):new v(t[0],t[2],t[1],t[3])},v.fromArray=function(t,e,n){return e=a.defaultValue(e,0),a.defined(n)||(n=new v),n[0]=t[e],n[1]=t[e+1],n[2]=t[e+2],n[3]=t[e+3],n},v.fromColumnMajorArray=function(t,e){return v.clone(t,e)},v.fromRowMajorArray=function(t,e){return a.defined(e)?(e[0]=t[0],e[1]=t[2],e[2]=t[1],e[3]=t[3],e):new v(t[0],t[1],t[2],t[3])},v.fromScale=function(t,e){return a.defined(e)?(e[0]=t.x,e[1]=0,e[2]=0,e[3]=t.y,e):new v(t.x,0,0,t.y)},v.fromUniformScale=function(t,e){return a.defined(e)?(e[0]=t,e[1]=0,e[2]=0,e[3]=t,e):new v(t,0,0,t)},v.fromRotation=function(t,e){var n=Math.cos(t),r=Math.sin(t);return a.defined(e)?(e[0]=n,e[1]=r,e[2]=-r,e[3]=n,e):new v(n,-r,r,n)},v.toArray=function(t,e){return a.defined(e)?(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e):[t[0],t[1],t[2],t[3]]},v.getElementIndex=function(t,e){return 2*t+e},v.getColumn=function(t,e,n){var r=2*e,a=t[r],i=t[1+r];return n.x=a,n.y=i,n},v.setColumn=function(t,e,n,r){var a=2*e;return(r=v.clone(t,r))[a]=n.x,r[1+a]=n.y,r},v.getRow=function(t,e,n){var r=t[e],a=t[e+2];return n.x=r,n.y=a,n},v.setRow=function(t,e,n,r){return(r=v.clone(t,r))[e]=n.x,r[e+2]=n.y,r};var i=new O.Cartesian2;v.getScale=function(t,e){return e.x=O.Cartesian2.magnitude(O.Cartesian2.fromElements(t[0],t[1],i)),e.y=O.Cartesian2.magnitude(O.Cartesian2.fromElements(t[2],t[3],i)),e};var u=new O.Cartesian2;v.getMaximumScale=function(t){return v.getScale(t,u),O.Cartesian2.maximumComponent(u)},v.multiply=function(t,e,n){var r=t[0]*e[0]+t[2]*e[1],a=t[0]*e[2]+t[2]*e[3],i=t[1]*e[0]+t[3]*e[1],u=t[1]*e[2]+t[3]*e[3];return n[0]=r,n[1]=i,n[2]=a,n[3]=u,n},v.add=function(t,e,n){return n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n[3]=t[3]+e[3],n},v.subtract=function(t,e,n){return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],n[3]=t[3]-e[3],n},v.multiplyByVector=function(t,e,n){var r=t[0]*e.x+t[2]*e.y,a=t[1]*e.x+t[3]*e.y;return n.x=r,n.y=a,n},v.multiplyByScalar=function(t,e,n){return n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n[3]=t[3]*e,n},v.multiplyByScale=function(t,e,n){return n[0]=t[0]*e.x,n[1]=t[1]*e.x,n[2]=t[2]*e.y,n[3]=t[3]*e.y,n},v.negate=function(t,e){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=-t[3],e},v.transpose=function(t,e){var n=t[0],r=t[2],a=t[1],i=t[3];return e[0]=n,e[1]=r,e[2]=a,e[3]=i,e},v.abs=function(t,e){return e[0]=Math.abs(t[0]),e[1]=Math.abs(t[1]),e[2]=Math.abs(t[2]),e[3]=Math.abs(t[3]),e},v.equals=function(t,e){return t===e||a.defined(t)&&a.defined(e)&&t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},v.equalsArray=function(t,e,n){return t[0]===e[n]&&t[1]===e[n+1]&&t[2]===e[n+2]&&t[3]===e[n+3]},v.equalsEpsilon=function(t,e,n){return n=a.defaultValue(n,0),t===e||a.defined(t)&&a.defined(e)&&Math.abs(t[0]-e[0])<=n&&Math.abs(t[1]-e[1])<=n&&Math.abs(t[2]-e[2])<=n&&Math.abs(t[3]-e[3])<=n},v.IDENTITY=Object.freeze(new v(1,0,0,1)),v.ZERO=Object.freeze(new v(0,0,0,0)),v.COLUMN0ROW0=0,v.COLUMN0ROW1=1,v.COLUMN1ROW0=2,v.COLUMN1ROW1=3,Object.defineProperties(v.prototype,{length:{get:function(){return v.packedLength}}}),v.prototype.clone=function(t){return v.clone(this,t)},v.prototype.equals=function(t){return v.equals(this,t)},v.prototype.equalsEpsilon=function(t,e){return v.equalsEpsilon(this,t,e)},v.prototype.toString=function(){return"("+this[0]+", "+this[2]+")\n("+this[1]+", "+this[3]+")"};var o={POINTS:n.WebGLConstants.POINTS,LINES:n.WebGLConstants.LINES,LINE_LOOP:n.WebGLConstants.LINE_LOOP,LINE_STRIP:n.WebGLConstants.LINE_STRIP,TRIANGLES:n.WebGLConstants.TRIANGLES,TRIANGLE_STRIP:n.WebGLConstants.TRIANGLE_STRIP,TRIANGLE_FAN:n.WebGLConstants.TRIANGLE_FAN,validate:function(t){return t===o.POINTS||t===o.LINES||t===o.LINE_LOOP||t===o.LINE_STRIP||t===o.TRIANGLES||t===o.TRIANGLE_STRIP||t===o.TRIANGLE_FAN}},s=Object.freeze(o);function f(t){t=a.defaultValue(t,a.defaultValue.EMPTY_OBJECT),this.attributes=t.attributes,this.indices=t.indices,this.primitiveType=a.defaultValue(t.primitiveType,s.TRIANGLES),this.boundingSphere=t.boundingSphere,this.geometryType=a.defaultValue(t.geometryType,r.NONE),this.boundingSphereCV=t.boundingSphereCV,this.offsetAttribute=t.offsetAttribute}f.computeNumberOfVertices=function(t){var e,n=-1;for(var r in t.attributes){t.attributes.hasOwnProperty(r)&&a.defined(t.attributes[r])&&a.defined(t.attributes[r].values)&&(n=(e=t.attributes[r]).values.length/e.componentsPerAttribute)}return n};var R=new O.Cartographic,V=new O.Cartesian3,P=new M.Matrix4,G=[new O.Cartographic,new O.Cartographic,new O.Cartographic],_=[new O.Cartesian2,new O.Cartesian2,new O.Cartesian2],W=[new O.Cartesian2,new O.Cartesian2,new O.Cartesian2],B=new O.Cartesian3,F=new M.Quaternion,k=new M.Matrix4,Y=new v;f._textureCoordinateRotationPoints=function(t,e,n,r){var a=O.Rectangle.center(r,R),i=O.Cartographic.toCartesian(a,n,V),u=M.Transforms.eastNorthUpToFixedFrame(i,n,P),o=M.Matrix4.inverse(u,P),s=_,f=G;f[0].longitude=r.west,f[0].latitude=r.south,f[1].longitude=r.west,f[1].latitude=r.north,f[2].longitude=r.east,f[2].latitude=r.south;for(var c=B,l=0;l<3;l++)O.Cartographic.toCartesian(f[l],n,c),c=M.Matrix4.multiplyByPointAsVector(o,c,c),s[l].x=c.x,s[l].y=c.y;var d=M.Quaternion.fromAxisAngle(O.Cartesian3.UNIT_Z,-e,F),y=M.Matrix3.fromQuaternion(d,k),m=t.length,p=Number.POSITIVE_INFINITY,h=Number.POSITIVE_INFINITY,N=Number.NEGATIVE_INFINITY,I=Number.NEGATIVE_INFINITY;for(l=0;l<m;l++)c=M.Matrix4.multiplyByPointAsVector(o,t[l],c),c=M.Matrix3.multiplyByVector(y,c,c),p=Math.min(p,c.x),h=Math.min(h,c.y),N=Math.max(N,c.x),I=Math.max(I,c.y);var C=v.fromRotation(e,Y),b=W;b[0].x=p,b[0].y=h,b[1].x=p,b[1].y=I,b[2].x=N,b[2].y=h;var T=s[0],E=s[2].x-T.x,x=s[1].y-T.y;for(l=0;l<3;l++){var L=b[l];v.multiplyByVector(C,L,L),L.x=(L.x-T.x)/E,L.y=(L.y-T.y)/x}var w=b[0],g=b[1],S=b[2],A=new Array(6);return O.Cartesian2.pack(w,A),O.Cartesian2.pack(g,A,2),O.Cartesian2.pack(S,A,4),A},t.Geometry=f,t.GeometryAttribute=function(t){t=a.defaultValue(t,a.defaultValue.EMPTY_OBJECT),this.componentDatatype=t.componentDatatype,this.componentsPerAttribute=t.componentsPerAttribute,this.normalize=a.defaultValue(t.normalize,!1),this.values=t.values},t.GeometryType=r,t.Matrix2=v,t.PrimitiveType=s}); diff --git a/web/assets/Cesium/Workers/GeometryAttributes-4fcfcf40.js b/web/assets/Cesium/Workers/GeometryAttributes-4fcfcf40.js new file mode 100644 index 00000000..bcd3d165 --- /dev/null +++ b/web/assets/Cesium/Workers/GeometryAttributes-4fcfcf40.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71"],function(t,n){"use strict";t.GeometryAttributes=function(t){t=n.defaultValue(t,n.defaultValue.EMPTY_OBJECT),this.position=t.position,this.normal=t.normal,this.st=t.st,this.bitangent=t.bitangent,this.tangent=t.tangent,this.color=t.color}}); diff --git a/web/assets/Cesium/Workers/GeometryInstance-11f9a3bd.js b/web/assets/Cesium/Workers/GeometryInstance-11f9a3bd.js new file mode 100644 index 00000000..91595c69 --- /dev/null +++ b/web/assets/Cesium/Workers/GeometryInstance-11f9a3bd.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Transforms-ec27f304"],function(e,t,i,r){"use strict";e.GeometryInstance=function(e){e=t.defaultValue(e,t.defaultValue.EMPTY_OBJECT),this.geometry=e.geometry,this.modelMatrix=r.Matrix4.clone(t.defaultValue(e.modelMatrix,r.Matrix4.IDENTITY)),this.id=e.id,this.pickPrimitive=e.pickPrimitive,this.attributes=t.defaultValue(e.attributes,{}),this.westHemisphereGeometry=void 0,this.eastHemisphereGeometry=void 0}}); diff --git a/web/assets/Cesium/Workers/GeometryOffsetAttribute-7350d9af.js b/web/assets/Cesium/Workers/GeometryOffsetAttribute-7350d9af.js new file mode 100644 index 00000000..8f792ab3 --- /dev/null +++ b/web/assets/Cesium/Workers/GeometryOffsetAttribute-7350d9af.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc"],function(e,c,t){"use strict";var a=Object.freeze({NONE:0,TOP:1,ALL:2});e.GeometryOffsetAttribute=a,e.arrayFill=function(e,t,a,f){if("function"==typeof e.fill)return e.fill(t,a,f);for(var r=e.length>>>0,n=c.defaultValue(a,0),i=n<0?Math.max(r+n,0):Math.min(n,r),l=c.defaultValue(f,r),u=l<0?Math.max(r+l,0):Math.min(l,r);i<u;)e[i]=t,i++;return e}}); diff --git a/web/assets/Cesium/Workers/GeometryPipeline-b49b2e59.js b/web/assets/Cesium/Workers/GeometryPipeline-b49b2e59.js new file mode 100644 index 00000000..cd4ff582 --- /dev/null +++ b/web/assets/Cesium/Workers/GeometryPipeline-b49b2e59.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./AttributeCompression-9fc99391","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723"],function(e,_,t,q,U,Y,M,G,P,l,w,Z,a){"use strict";var x=new U.Cartesian3,S=new U.Cartesian3,I=new U.Cartesian3;var s={calculateACMR:function(e){var t=(e=_.defaultValue(e,_.defaultValue.EMPTY_OBJECT)).indices,r=e.maximumIndex,a=_.defaultValue(e.cacheSize,24),n=t.length;if(!_.defined(r))for(var i=r=0,s=t[i];i<n;)r<s&&(r=s),s=t[++i];for(var o=[],u=0;u<r+1;u++)o[u]=0;for(var p=a+1,d=0;d<n;++d)p-o[t[d]]>a&&(o[t[d]]=p,++p);return(p-a+1)/(n/3)}};s.tipsify=function(e){var t=(e=_.defaultValue(e,_.defaultValue.EMPTY_OBJECT)).indices,r=e.maximumIndex,a=_.defaultValue(e.cacheSize,24);function n(e,t,r,a,n,i,s){for(var o,u=-1,p=-1,d=0;d<r.length;){var l=r[d];a[l].numLiveTriangles&&(o=0,n-a[l].timeStamp+2*a[l].numLiveTriangles<=t&&(o=n-a[l].timeStamp),(p<o||-1===p)&&(p=o,u=l)),++d}return-1===u?function(e,t,r){for(;1<=t.length;){var a=t[t.length-1];if(t.splice(t.length-1,1),0<e[a].numLiveTriangles)return a}for(;b<r;){if(0<e[b].numLiveTriangles)return++b-1;++b}return-1}(a,i,s):u}var i=t.length,s=0,o=0,u=t[o],p=i;if(_.defined(r))s=r+1;else{for(;o<p;)s<u&&(s=u),u=t[++o];if(-1===s)return 0;++s}for(var d=[],l=0;l<s;l++)d[l]={numLiveTriangles:0,timeStamp:0,vertexTriangles:[]};for(var y=o=0;o<p;)d[t[o]].vertexTriangles.push(y),++d[t[o]].numLiveTriangles,d[t[o+1]].vertexTriangles.push(y),++d[t[o+1]].numLiveTriangles,d[t[o+2]].vertexTriangles.push(y),++d[t[o+2]].numLiveTriangles,++y,o+=3;var f,v,c,m,C=0,h=a+1,b=1,g=[],A=[],T=0,x=[],P=i/3,w=[];for(l=0;l<P;l++)w[l]=!1;for(;-1!==C;){g=[],m=(v=d[C]).vertexTriangles.length;for(var S=0;S<m;++S)if(!w[y=v.vertexTriangles[S]]){w[y]=!0,o=y+y+y;for(var I=0;I<3;++I)c=t[o],g.push(c),A.push(c),x[T]=c,++T,--(f=d[c]).numLiveTriangles,h-f.timeStamp>a&&(f.timeStamp=h,++h),++o}C=n(0,a,g,d,h,A,s)}return x};var r={};function o(e,t,r,a,n){e[t++]=r,e[t++]=a,e[t++]=a,e[t++]=n,e[t++]=n,e[t]=r}function v(e){var t,r={};for(var a in e){e.hasOwnProperty(a)&&_.defined(e[a])&&_.defined(e[a].values)&&(t=e[a],r[a]=new G.GeometryAttribute({componentDatatype:t.componentDatatype,componentsPerAttribute:t.componentsPerAttribute,normalize:t.normalize,values:[]}))}return r}r.toWireframe=function(e){var t=e.indices;if(_.defined(t)){switch(e.primitiveType){case G.PrimitiveType.TRIANGLES:e.indices=function(e){for(var t=e.length,r=t/3*6,a=w.IndexDatatype.createTypedArray(t,r),n=0,i=0;i<t;i+=3,n+=6)o(a,n,e[i],e[i+1],e[i+2]);return a}(t);break;case G.PrimitiveType.TRIANGLE_STRIP:e.indices=function(e){var t=e.length;if(3<=t){var r=6*(t-2),a=w.IndexDatatype.createTypedArray(t,r);o(a,0,e[0],e[1],e[2]);for(var n=6,i=3;i<t;++i,n+=6)o(a,n,e[i-1],e[i],e[i-2]);return a}return new Uint16Array}(t);break;case G.PrimitiveType.TRIANGLE_FAN:e.indices=function(e){if(0<e.length){for(var t=e.length-1,r=6*(t-1),a=w.IndexDatatype.createTypedArray(t,r),n=e[0],i=0,s=1;s<t;++s,i+=6)o(a,i,n,e[s],e[s+1]);return a}return new Uint16Array}(t)}e.primitiveType=G.PrimitiveType.LINES}return e},r.createLineSegmentsForVectors=function(e,t,r){t=_.defaultValue(t,"normal"),r=_.defaultValue(r,1e4);for(var a,n=e.attributes.position.values,i=e.attributes[t].values,s=n.length,o=new Float64Array(2*s),u=0,p=0;p<s;p+=3)o[u++]=n[p],o[u++]=n[p+1],o[u++]=n[p+2],o[u++]=n[p]+i[p]*r,o[u++]=n[p+1]+i[p+1]*r,o[u++]=n[p+2]+i[p+2]*r;var d=e.boundingSphere;return _.defined(d)&&(a=new Y.BoundingSphere(d.center,d.radius+r)),new G.Geometry({attributes:{position:new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:o})},primitiveType:G.PrimitiveType.LINES,boundingSphere:a})},r.createAttributeLocations=function(e){for(var t=["position","positionHigh","positionLow","position3DHigh","position3DLow","position2DHigh","position2DLow","pickColor","normal","st","tangent","bitangent","extrudeDirection","compressedAttributes"],r=e.attributes,a={},n=0,i=t.length,s=0;s<i;++s){var o=t[s];_.defined(r[o])&&(a[o]=n++)}for(var u in r)r.hasOwnProperty(u)&&!_.defined(a[u])&&(a[u]=n++);return a},r.reorderForPreVertexCache=function(e){var t=G.Geometry.computeNumberOfVertices(e),r=e.indices;if(_.defined(r)){for(var a=new Int32Array(t),n=0;n<t;n++)a[n]=-1;for(var i,s=r,o=s.length,u=w.IndexDatatype.createTypedArray(t,o),p=0,d=0,l=0;p<o;)-1!==(i=a[s[p]])?u[d]=i:(a[i=s[p]]=l,u[d]=l,++l),++p,++d;e.indices=u;var y=e.attributes;for(var f in y)if(y.hasOwnProperty(f)&&_.defined(y[f])&&_.defined(y[f].values)){for(var v=y[f],c=v.values,m=0,C=v.componentsPerAttribute,h=M.ComponentDatatype.createTypedArray(v.componentDatatype,l*C);m<t;){var b=a[m];if(-1!==b)for(var g=0;g<C;g++)h[C*b+g]=c[C*m+g];++m}v.values=h}}return e},r.reorderForPostVertexCache=function(e,t){var r=e.indices;if(e.primitiveType===G.PrimitiveType.TRIANGLES&&_.defined(r)){for(var a=r.length,n=0,i=0;i<a;i++)r[i]>n&&(n=r[i]);e.indices=s.tipsify({indices:r,maximumIndex:n,cacheSize:t})}return e},r.fitToUnsignedShortIndices=function(e){var t=[],r=G.Geometry.computeNumberOfVertices(e);if(_.defined(e.indices)&&r>=q.CesiumMath.SIXTY_FOUR_KILOBYTES){var a,n=[],i=[],s=0,o=v(e.attributes),u=e.indices,p=u.length;e.primitiveType===G.PrimitiveType.TRIANGLES?a=3:e.primitiveType===G.PrimitiveType.LINES?a=2:e.primitiveType===G.PrimitiveType.POINTS&&(a=1);for(var d=0;d<p;d+=a){for(var l=0;l<a;++l){var y=u[d+l],f=n[y];_.defined(f)||(f=s++,n[y]=f,function(e,t,r){for(var a in t)if(t.hasOwnProperty(a)&&_.defined(t[a])&&_.defined(t[a].values))for(var n=t[a],i=0;i<n.componentsPerAttribute;++i)e[a].values.push(n.values[r*n.componentsPerAttribute+i])}(o,e.attributes,y)),i.push(f)}s+a>=q.CesiumMath.SIXTY_FOUR_KILOBYTES&&(t.push(new G.Geometry({attributes:o,indices:i,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV})),n=[],i=[],s=0,o=v(e.attributes))}0!==i.length&&t.push(new G.Geometry({attributes:o,indices:i,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV}))}else t.push(e);return t};var c=new U.Cartesian3,m=new U.Cartographic;r.projectTo2D=function(e,t,r,a,n){for(var i=e.attributes[t],s=(n=_.defined(n)?n:new Y.GeographicProjection).ellipsoid,o=i.values,u=new Float64Array(o.length),p=0,d=0;d<o.length;d+=3){var l=U.Cartesian3.fromArray(o,d,c),y=s.cartesianToCartographic(l,m),f=n.project(y,c);u[p++]=f.x,u[p++]=f.y,u[p++]=f.z}return e.attributes[r]=i,e.attributes[a]=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:u}),delete e.attributes[t],e};var y={high:0,low:0};r.encodeAttribute=function(e,t,r,a){for(var n=e.attributes[t],i=n.values,s=i.length,o=new Float32Array(s),u=new Float32Array(s),p=0;p<s;++p)l.EncodedCartesian3.encode(i[p],y),o[p]=y.high,u[p]=y.low;var d=n.componentsPerAttribute;return e.attributes[r]=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:d,values:o}),e.attributes[a]=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:d,values:u}),delete e.attributes[t],e};var i=new U.Cartesian3;function n(e,t){if(_.defined(t))for(var r=t.values,a=r.length,n=0;n<a;n+=3)U.Cartesian3.unpack(r,n,i),Y.Matrix4.multiplyByPoint(e,i,i),U.Cartesian3.pack(i,r,n)}function u(e,t){if(_.defined(t))for(var r=t.values,a=r.length,n=0;n<a;n+=3)U.Cartesian3.unpack(r,n,i),Y.Matrix3.multiplyByVector(e,i,i),i=U.Cartesian3.normalize(i,i),U.Cartesian3.pack(i,r,n)}var p=new Y.Matrix4,d=new Y.Matrix3;r.transformToWorldCoordinates=function(e){var t=e.modelMatrix;if(Y.Matrix4.equals(t,Y.Matrix4.IDENTITY))return e;var r=e.geometry.attributes;n(t,r.position),n(t,r.prevPosition),n(t,r.nextPosition),(_.defined(r.normal)||_.defined(r.tangent)||_.defined(r.bitangent))&&(Y.Matrix4.inverse(t,p),Y.Matrix4.transpose(p,p),Y.Matrix4.getMatrix3(p,d),u(d,r.normal),u(d,r.tangent),u(d,r.bitangent));var a=e.geometry.boundingSphere;return _.defined(a)&&(e.geometry.boundingSphere=Y.BoundingSphere.transform(a,t,a)),e.modelMatrix=Y.Matrix4.clone(Y.Matrix4.IDENTITY),e};var O=new U.Cartesian3;function f(e,t){var r,a,n,i,s,o,u=e.length,p=(e[0].modelMatrix,_.defined(e[0][t].indices)),d=e[0][t].primitiveType,l=function(e,t){var r,a=e.length,n={},i=e[0][t].attributes;for(r in i)if(i.hasOwnProperty(r)&&_.defined(i[r])&&_.defined(i[r].values)){for(var s=i[r],o=s.values.length,u=!0,p=1;p<a;++p){var d=e[p][t].attributes[r];if(!_.defined(d)||s.componentDatatype!==d.componentDatatype||s.componentsPerAttribute!==d.componentsPerAttribute||s.normalize!==d.normalize){u=!1;break}o+=d.values.length}u&&(n[r]=new G.GeometryAttribute({componentDatatype:s.componentDatatype,componentsPerAttribute:s.componentsPerAttribute,normalize:s.normalize,values:M.ComponentDatatype.createTypedArray(s.componentDatatype,o)}))}return n}(e,t);for(r in l)if(l.hasOwnProperty(r))for(n=l[r].values,f=g=0;f<u;++f)for(s=(i=e[f][t].attributes[r].values).length,a=0;a<s;++a)n[g++]=i[a];if(p){for(var y=0,f=0;f<u;++f)y+=e[f][t].indices.length;var v=G.Geometry.computeNumberOfVertices(new G.Geometry({attributes:l,primitiveType:G.PrimitiveType.POINTS})),c=w.IndexDatatype.createTypedArray(v,y),m=0,C=0;for(f=0;f<u;++f){for(var h=e[f][t].indices,b=h.length,g=0;g<b;++g)c[m++]=C+h[g];C+=G.Geometry.computeNumberOfVertices(e[f][t])}o=c}var A,T=new U.Cartesian3,x=0;for(f=0;f<u;++f){if(A=e[f][t].boundingSphere,!_.defined(A)){T=void 0;break}U.Cartesian3.add(A.center,T,T)}if(_.defined(T))for(U.Cartesian3.divideByScalar(T,u,T),f=0;f<u;++f){A=e[f][t].boundingSphere;var P=U.Cartesian3.magnitude(U.Cartesian3.subtract(A.center,T,O))+A.radius;x<P&&(x=P)}return new G.Geometry({attributes:l,indices:o,primitiveType:d,boundingSphere:_.defined(T)?new Y.BoundingSphere(T,x):void 0})}r.combineInstances=function(e){for(var t=[],r=[],a=e.length,n=0;n<a;++n){var i=e[n];_.defined(i.geometry)?t.push(i):_.defined(i.westHemisphereGeometry)&&_.defined(i.eastHemisphereGeometry)&&r.push(i)}var s=[];return 0<t.length&&s.push(f(t,"geometry")),0<r.length&&(s.push(f(r,"westHemisphereGeometry")),s.push(f(r,"eastHemisphereGeometry"))),s};var T=new U.Cartesian3,E=new U.Cartesian3,N=new U.Cartesian3,L=new U.Cartesian3;r.computeNormal=function(e){for(var t=e.indices,r=e.attributes,a=r.position.values,n=r.position.values.length/3,i=t.length,s=new Array(n),o=new Array(i/3),u=new Array(i),p=0;p<n;p++)s[p]={indexOffset:0,count:0,currentCount:0};var d=0;for(p=0;p<i;p+=3){var l=t[p],y=t[p+1],f=t[p+2],v=3*l,c=3*y,m=3*f;E.x=a[v],E.y=a[1+v],E.z=a[2+v],N.x=a[c],N.y=a[1+c],N.z=a[2+c],L.x=a[m],L.y=a[1+m],L.z=a[2+m],s[l].count++,s[y].count++,s[f].count++,U.Cartesian3.subtract(N,E,N),U.Cartesian3.subtract(L,E,L),o[d]=U.Cartesian3.cross(N,L,new U.Cartesian3),d++}var C=0;for(p=0;p<n;p++)s[p].indexOffset+=C,C+=s[p].count;for(p=d=0;p<i;p+=3){var h=(A=s[t[p]]).indexOffset+A.currentCount;u[h]=d,A.currentCount++,u[(A=s[t[p+1]]).indexOffset+A.currentCount]=d,A.currentCount++,u[(A=s[t[p+2]]).indexOffset+A.currentCount]=d,A.currentCount++,d++}var b=new Float32Array(3*n);for(p=0;p<n;p++){var g=3*p,A=s[p];if(U.Cartesian3.clone(U.Cartesian3.ZERO,T),0<A.count){for(d=0;d<A.count;d++)U.Cartesian3.add(T,o[u[A.indexOffset+d]],T);U.Cartesian3.equalsEpsilon(U.Cartesian3.ZERO,T,q.CesiumMath.EPSILON10)&&U.Cartesian3.clone(o[u[A.indexOffset]],T)}U.Cartesian3.equalsEpsilon(U.Cartesian3.ZERO,T,q.CesiumMath.EPSILON10)&&(T.z=1),U.Cartesian3.normalize(T,T),b[g]=T.x,b[1+g]=T.y,b[2+g]=T.z}return e.attributes.normal=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:b}),e};var R=new U.Cartesian3,V=new U.Cartesian3,F=new U.Cartesian3;r.computeTangentAndBitangent=function(e){e.attributes;for(var t=e.indices,r=e.attributes.position.values,a=e.attributes.normal.values,n=e.attributes.st.values,i=e.attributes.position.values.length/3,s=t.length,o=new Array(3*i),u=0;u<o.length;u++)o[u]=0;for(u=0;u<s;u+=3){var p,d=t[u],l=t[u+1],y=t[u+2],f=3*l,v=3*y,c=2*d,m=2*l,C=2*y,h=r[p=3*d],b=r[p+1],g=r[p+2],A=n[c],T=n[1+c],x=n[1+m]-T,P=n[1+C]-T,w=1/((n[m]-A)*P-(n[C]-A)*x),S=(P*(r[f]-h)-x*(r[v]-h))*w,I=(P*(r[f+1]-b)-x*(r[v+1]-b))*w,O=(P*(r[f+2]-g)-x*(r[v+2]-g))*w;o[p]+=S,o[p+1]+=I,o[p+2]+=O,o[f]+=S,o[f+1]+=I,o[f+2]+=O,o[v]+=S,o[v+1]+=I,o[v+2]+=O}var E=new Float32Array(3*i),N=new Float32Array(3*i);for(u=0;u<i;u++){f=(p=3*u)+1,v=p+2;var L=U.Cartesian3.fromArray(a,p,R),z=U.Cartesian3.fromArray(o,p,F),D=U.Cartesian3.dot(L,z);U.Cartesian3.multiplyByScalar(L,D,V),U.Cartesian3.normalize(U.Cartesian3.subtract(z,V,z),z),E[p]=z.x,E[f]=z.y,E[v]=z.z,U.Cartesian3.normalize(U.Cartesian3.cross(L,z,z),z),N[p]=z.x,N[f]=z.y,N[v]=z.z}return e.attributes.tangent=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:E}),e.attributes.bitangent=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:N}),e};var z=new U.Cartesian2,D=new U.Cartesian3,B=new U.Cartesian3,k=new U.Cartesian3,H=new U.Cartesian2;function C(e){switch(e.primitiveType){case G.PrimitiveType.TRIANGLE_FAN:return function(e){var t=G.Geometry.computeNumberOfVertices(e),r=w.IndexDatatype.createTypedArray(t,3*(t-2));r[0]=1,r[1]=0,r[2]=2;for(var a=3,n=3;n<t;++n)r[a++]=n-1,r[a++]=0,r[a++]=n;return e.indices=r,e.primitiveType=G.PrimitiveType.TRIANGLES,e}(e);case G.PrimitiveType.TRIANGLE_STRIP:return function(e){var t=G.Geometry.computeNumberOfVertices(e),r=w.IndexDatatype.createTypedArray(t,3*(t-2));r[0]=0,r[1]=1,r[2]=2,3<t&&(r[3]=0,r[4]=2,r[5]=3);for(var a=6,n=3;n<t-1;n+=2)r[a++]=n,r[a++]=n-1,r[a++]=n+1,n+2<t&&(r[a++]=n,r[a++]=n+1,r[a++]=n+2);return e.indices=r,e.primitiveType=G.PrimitiveType.TRIANGLES,e}(e);case G.PrimitiveType.TRIANGLES:return function(e){if(_.defined(e.indices))return e;for(var t=G.Geometry.computeNumberOfVertices(e),r=w.IndexDatatype.createTypedArray(t,t),a=0;a<t;++a)r[a]=a;return e.indices=r,e}(e);case G.PrimitiveType.LINE_STRIP:return function(e){var t=G.Geometry.computeNumberOfVertices(e),r=w.IndexDatatype.createTypedArray(t,2*(t-1));r[0]=0,r[1]=1;for(var a=2,n=2;n<t;++n)r[a++]=n-1,r[a++]=n;return e.indices=r,e.primitiveType=G.PrimitiveType.LINES,e}(e);case G.PrimitiveType.LINE_LOOP:return function(e){var t=G.Geometry.computeNumberOfVertices(e),r=w.IndexDatatype.createTypedArray(t,2*t);r[0]=0,r[1]=1;for(var a=2,n=2;n<t;++n)r[a++]=n-1,r[a++]=n;return r[a++]=t-1,r[a]=0,e.indices=r,e.primitiveType=G.PrimitiveType.LINES,e}(e);case G.PrimitiveType.LINES:return function(e){if(_.defined(e.indices))return e;for(var t=G.Geometry.computeNumberOfVertices(e),r=w.IndexDatatype.createTypedArray(t,t),a=0;a<t;++a)r[a]=a;return e.indices=r,e}(e)}return e}function h(e,t){Math.abs(e.y)<q.CesiumMath.EPSILON6&&(e.y=t?-q.CesiumMath.EPSILON6:q.CesiumMath.EPSILON6)}r.compressVertices=function(e){var t=e.attributes.extrudeDirection;if(_.defined(t)){for(var r=t.values,a=r.length/3,n=new Float32Array(2*a),i=0,s=0;s<a;++s)U.Cartesian3.fromArray(r,3*s,D),U.Cartesian3.equals(D,U.Cartesian3.ZERO)?i+=2:(H=P.AttributeCompression.octEncodeInRange(D,65535,H),n[i++]=H.x,n[i++]=H.y);return e.attributes.compressedAttributes=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:n}),delete e.attributes.extrudeDirection,e}var o=e.attributes.normal,u=e.attributes.st,p=_.defined(o),d=_.defined(u);if(!p&&!d)return e;var l,y,f,v,c=e.attributes.tangent,m=e.attributes.bitangent,C=_.defined(c),h=_.defined(m);p&&(l=o.values),d&&(y=u.values),C&&(f=c.values),h&&(v=m.values);var b=a=(p?l.length:y.length)/(p?3:2),g=d&&p?2:1;b*=g+=C||h?1:0;var A=new Float32Array(b),T=0;for(s=0;s<a;++s){d&&(U.Cartesian2.fromArray(y,2*s,z),A[T++]=P.AttributeCompression.compressTextureCoordinates(z));var x=3*s;p&&_.defined(f)&&_.defined(v)?(U.Cartesian3.fromArray(l,x,D),U.Cartesian3.fromArray(f,x,B),U.Cartesian3.fromArray(v,x,k),P.AttributeCompression.octPack(D,B,k,z),A[T++]=z.x,A[T++]=z.y):(p&&(U.Cartesian3.fromArray(l,x,D),A[T++]=P.AttributeCompression.octEncodeFloat(D)),C&&(U.Cartesian3.fromArray(f,x,D),A[T++]=P.AttributeCompression.octEncodeFloat(D)),h&&(U.Cartesian3.fromArray(v,x,D),A[T++]=P.AttributeCompression.octEncodeFloat(D)))}return e.attributes.compressedAttributes=new G.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:g,values:A}),p&&delete e.attributes.normal,d&&delete e.attributes.st,h&&delete e.attributes.bitangent,C&&delete e.attributes.tangent,e};var b=new U.Cartesian3;function g(e,t,r,a){U.Cartesian3.add(e,U.Cartesian3.multiplyByScalar(U.Cartesian3.subtract(t,e,b),e.y/(e.y-t.y),b),r),U.Cartesian3.clone(r,a),h(r,!0),h(a,!1)}var A=new U.Cartesian3,W=new U.Cartesian3,X=new U.Cartesian3,j=new U.Cartesian3,J={positions:new Array(7),indices:new Array(9)};function K(e,t,r){if(!(0<=e.x||0<=t.x||0<=r.x)){!function(e,t,r){if(0!==e.y&&0!==t.y&&0!==r.y)return h(e,e.y<0),h(t,t.y<0),h(r,r.y<0);var a=Math.abs(e.y),n=Math.abs(t.y),i=Math.abs(r.y),s=n<a?i<a?q.CesiumMath.sign(e.y):q.CesiumMath.sign(r.y):i<n?q.CesiumMath.sign(t.y):q.CesiumMath.sign(r.y),o=s<0;h(e,o),h(t,o),h(r,o)}(e,t,r);var a=e.y<0,n=t.y<0,i=r.y<0,s=0;s+=a?1:0,s+=n?1:0,s+=i?1:0;var o=J.indices;1==s?(o[1]=3,o[2]=4,o[5]=6,o[7]=6,o[8]=5,a?(g(e,t,A,X),g(e,r,W,j),o[0]=0,o[3]=1,o[4]=2,o[6]=1):n?(g(t,r,A,X),g(t,e,W,j),o[0]=1,o[3]=2,o[4]=0,o[6]=2):i&&(g(r,e,A,X),g(r,t,W,j),o[0]=2,o[3]=0,o[4]=1,o[6]=0)):2==s&&(o[2]=4,o[4]=4,o[5]=3,o[7]=5,o[8]=6,a?n?i||(g(r,e,A,X),g(r,t,W,j),o[0]=0,o[1]=1,o[3]=0,o[6]=2):(g(t,r,A,X),g(t,e,W,j),o[0]=2,o[1]=0,o[3]=2,o[6]=1):(g(e,t,A,X),g(e,r,W,j),o[0]=1,o[1]=2,o[3]=1,o[6]=0));var u=J.positions;return u[0]=e,u[1]=t,u[2]=r,u.length=3,1!=s&&2!=s||(u[3]=A,u[4]=W,u[5]=X,u[6]=j,u.length=7),J}}function Q(e,t){var r,a=e.attributes;if(0!==a.position.values.length){for(var n in a){a.hasOwnProperty(n)&&_.defined(a[n])&&_.defined(a[n].values)&&((r=a[n]).values=M.ComponentDatatype.createTypedArray(r.componentDatatype,r.values))}var i=G.Geometry.computeNumberOfVertices(e);return e.indices=w.IndexDatatype.createTypedArray(i,e.indices),t&&(e.boundingSphere=Y.BoundingSphere.fromVertices(a.position.values)),e}}function $(e){var t,r=e.attributes,a={};for(var n in r){r.hasOwnProperty(n)&&_.defined(r[n])&&_.defined(r[n].values)&&(t=r[n],a[n]=new G.GeometryAttribute({componentDatatype:t.componentDatatype,componentsPerAttribute:t.componentsPerAttribute,normalize:t.normalize,values:[]}))}return new G.Geometry({attributes:a,indices:[],primitiveType:e.primitiveType})}function ee(e,t,r){var a=_.defined(e.geometry.boundingSphere);t=Q(t,a),r=Q(r,a),_.defined(r)&&!_.defined(t)?e.geometry=r:!_.defined(r)&&_.defined(t)?e.geometry=t:(e.westHemisphereGeometry=t,e.eastHemisphereGeometry=r,e.geometry=void 0)}function te(y,f){var v=new y,c=new y,m=new y;return function(e,t,r,a,n,i,s,o){var u=y.fromArray(n,e*f,v),p=y.fromArray(n,t*f,c),d=y.fromArray(n,r*f,m);y.multiplyByScalar(u,a.x,u),y.multiplyByScalar(p,a.y,p),y.multiplyByScalar(d,a.z,d);var l=y.add(u,p,u);y.add(l,d,l),o&&y.normalize(l,l),y.pack(l,i,s*f)}}var re=te(Y.Cartesian4,4),ae=te(U.Cartesian3,3),ne=te(U.Cartesian2,2),ie=function(e,t,r,a,n,i,s){var o=n[e]*a.x,u=n[t]*a.y,p=n[r]*a.z;i[s]=o+u+p>q.CesiumMath.EPSILON6?1:0},se=new U.Cartesian3,oe=new U.Cartesian3,ue=new U.Cartesian3,pe=new U.Cartesian3;function de(e,t,r,a,n,i,s,o,u,p,d,l,y,f,v,c){if(_.defined(i)||_.defined(s)||_.defined(o)||_.defined(u)||_.defined(p)||0!==f){var m,C,h,b,g=function(e,t,r,a,n){var i,s,o,u,p,d,l,y;if(_.defined(n)||(n=new U.Cartesian3),_.defined(t.z)){if(U.Cartesian3.equalsEpsilon(e,t,q.CesiumMath.EPSILON14))return U.Cartesian3.clone(U.Cartesian3.UNIT_X,n);if(U.Cartesian3.equalsEpsilon(e,r,q.CesiumMath.EPSILON14))return U.Cartesian3.clone(U.Cartesian3.UNIT_Y,n);if(U.Cartesian3.equalsEpsilon(e,a,q.CesiumMath.EPSILON14))return U.Cartesian3.clone(U.Cartesian3.UNIT_Z,n);i=U.Cartesian3.subtract(r,t,x),s=U.Cartesian3.subtract(a,t,S),o=U.Cartesian3.subtract(e,t,I),u=U.Cartesian3.dot(i,i),p=U.Cartesian3.dot(i,s),d=U.Cartesian3.dot(i,o),l=U.Cartesian3.dot(s,s),y=U.Cartesian3.dot(s,o)}else{if(U.Cartesian2.equalsEpsilon(e,t,q.CesiumMath.EPSILON14))return U.Cartesian3.clone(U.Cartesian3.UNIT_X,n);if(U.Cartesian2.equalsEpsilon(e,r,q.CesiumMath.EPSILON14))return U.Cartesian3.clone(U.Cartesian3.UNIT_Y,n);if(U.Cartesian2.equalsEpsilon(e,a,q.CesiumMath.EPSILON14))return U.Cartesian3.clone(U.Cartesian3.UNIT_Z,n);i=U.Cartesian2.subtract(r,t,x),s=U.Cartesian2.subtract(a,t,S),o=U.Cartesian2.subtract(e,t,I),u=U.Cartesian2.dot(i,i),p=U.Cartesian2.dot(i,s),d=U.Cartesian2.dot(i,o),l=U.Cartesian2.dot(s,s),y=U.Cartesian2.dot(s,o)}n.y=l*d-p*y,n.z=u*y-p*d;var f=u*l-p*p;return 0!==n.y&&(n.y/=f),0!==n.z&&(n.z/=f),n.x=1-n.y-n.z,n}(a,U.Cartesian3.fromArray(n,3*e,se),U.Cartesian3.fromArray(n,3*t,oe),U.Cartesian3.fromArray(n,3*r,ue),pe);if(_.defined(i)&&ae(e,t,r,g,i,l.normal.values,c,!0),_.defined(p)&&(m=U.Cartesian3.fromArray(p,3*e,se),C=U.Cartesian3.fromArray(p,3*t,oe),h=U.Cartesian3.fromArray(p,3*r,ue),U.Cartesian3.multiplyByScalar(m,g.x,m),U.Cartesian3.multiplyByScalar(C,g.y,C),U.Cartesian3.multiplyByScalar(h,g.z,h),U.Cartesian3.equals(m,U.Cartesian3.ZERO)&&U.Cartesian3.equals(C,U.Cartesian3.ZERO)&&U.Cartesian3.equals(h,U.Cartesian3.ZERO)?((b=se).x=0,b.y=0,b.z=0):(b=U.Cartesian3.add(m,C,m),U.Cartesian3.add(b,h,b),U.Cartesian3.normalize(b,b)),U.Cartesian3.pack(b,l.extrudeDirection.values,3*c)),_.defined(d)&&ie(e,t,r,g,d,l.applyOffset.values,c),_.defined(s)&&ae(e,t,r,g,s,l.tangent.values,c,!0),_.defined(o)&&ae(e,t,r,g,o,l.bitangent.values,c,!0),_.defined(u)&&ne(e,t,r,g,u,l.st.values,c),0<f)for(var A=0;A<f;A++){var T=y[A];!function(e,t,r,a,n,i,s){var o=i.componentsPerAttribute,u=i.values,p=s.values;switch(o){case 4:re(e,t,r,a,u,p,n,!1);break;case 3:ae(e,t,r,a,u,p,n,!1);break;case 2:ne(e,t,r,a,u,p,n,!1);break;default:p[n]=u[e]*a.x+u[t]*a.y+u[r]*a.z}}(e,t,r,g,c,v[T],l[T])}}}function le(e,t,r,a,n,i){var s=e.position.values.length/3;if(-1===n)return e.position.values.push(i.x,i.y,i.z),t.push(s),s;var o=a[n],u=r[o];return-1===u?(r[o]=s,e.position.values.push(i.x,i.y,i.z),t.push(s),s):(t.push(u),u)}var ye={position:!0,normal:!0,bitangent:!0,tangent:!0,st:!0,extrudeDirection:!0,applyOffset:!0};function fe(e){var t=e.geometry,r=t.attributes,a=r.position.values,n=_.defined(r.normal)?r.normal.values:void 0,i=_.defined(r.bitangent)?r.bitangent.values:void 0,s=_.defined(r.tangent)?r.tangent.values:void 0,o=_.defined(r.st)?r.st.values:void 0,u=_.defined(r.extrudeDirection)?r.extrudeDirection.values:void 0,p=_.defined(r.applyOffset)?r.applyOffset.values:void 0,d=t.indices,l=[];for(var y in r)r.hasOwnProperty(y)&&!ye[y]&&_.defined(r[y])&&l.push(y);var f,v,c=l.length,m=$(t),C=$(t),h=[];h.length=a.length/3;var b=[];for(b.length=a.length/3,A=0;A<h.length;++A)h[A]=-1,b[A]=-1;for(var g=d.length,A=0;A<g;A+=3){var T=d[A],x=d[A+1],P=d[A+2],w=U.Cartesian3.fromArray(a,3*T),S=U.Cartesian3.fromArray(a,3*x),I=U.Cartesian3.fromArray(a,3*P),O=K(w,S,I);if(_.defined(O)&&3<O.positions.length)for(var E=O.positions,N=O.indices,L=N.length,z=0;z<L;++z){var D=N[z],M=E[D],G=M.y<0?(f=C.attributes,v=C.indices,h):(f=m.attributes,v=m.indices,b);de(T,x,P,M,a,n,s,i,o,u,p,f,l,c,r,le(f,v,G,d,D<3?A+D:-1,M))}else _.defined(O)&&(w=O.positions[0],S=O.positions[1],I=O.positions[2]),G=w.y<0?(f=C.attributes,v=C.indices,h):(f=m.attributes,v=m.indices,b),de(T,x,P,w,a,n,s,i,o,u,p,f,l,c,r,le(f,v,G,d,A,w)),de(T,x,P,S,a,n,s,i,o,u,p,f,l,c,r,le(f,v,G,d,A+1,S)),de(T,x,P,I,a,n,s,i,o,u,p,f,l,c,r,le(f,v,G,d,A+2,I))}ee(e,C,m)}var ve=a.Plane.fromPointNormal(U.Cartesian3.ZERO,U.Cartesian3.UNIT_Y),ce=new U.Cartesian3,me=new U.Cartesian3;function Ce(e,t,r,a,n,i,s){var o;_.defined(s)&&(o=U.Cartesian3.fromArray(a,3*e,se),U.Cartesian3.equalsEpsilon(o,r,q.CesiumMath.EPSILON10)?i.applyOffset.values[n]=s[e]:i.applyOffset.values[n]=s[t])}function he(e){var t,r=e.geometry,a=r.attributes,n=a.position.values,i=_.defined(a.applyOffset)?a.applyOffset.values:void 0,s=r.indices,o=$(r),u=$(r),p=s.length,d=[];d.length=n.length/3;var l=[];for(l.length=n.length/3,t=0;t<d.length;++t)d[t]=-1,l[t]=-1;for(t=0;t<p;t+=2){var y=s[t],f=s[t+1],v=U.Cartesian3.fromArray(n,3*y,se),c=U.Cartesian3.fromArray(n,3*f,oe);Math.abs(v.y)<q.CesiumMath.EPSILON6&&(v.y<0?v.y=-q.CesiumMath.EPSILON6:v.y=q.CesiumMath.EPSILON6),Math.abs(c.y)<q.CesiumMath.EPSILON6&&(c.y<0?c.y=-q.CesiumMath.EPSILON6:c.y=q.CesiumMath.EPSILON6);var m,C,h,b,g,A=o.attributes,T=o.indices,x=l,P=u.attributes,w=u.indices,S=d,I=Z.IntersectionTests.lineSegmentPlane(v,c,ve,ue);_.defined(I)?(m=U.Cartesian3.multiplyByScalar(U.Cartesian3.UNIT_Y,5*q.CesiumMath.EPSILON9,ce),v.y<0&&(U.Cartesian3.negate(m,m),A=u.attributes,T=u.indices,x=d,P=o.attributes,w=o.indices,S=l),C=U.Cartesian3.add(I,m,me),Ce(y,f,v,n,le(A,T,x,s,t,v),A,i),Ce(y,f,C,n,le(A,T,x,s,-1,C),A,i),U.Cartesian3.negate(m,m),U.Cartesian3.add(I,m,C),Ce(y,f,C,n,le(P,w,S,s,-1,C),P,i),Ce(y,f,c,n,le(P,w,S,s,t+1,c),P,i)):(g=v.y<0?(h=u.attributes,b=u.indices,d):(h=o.attributes,b=o.indices,l),Ce(y,f,v,n,le(h,b,g,s,t,v),h,i),Ce(y,f,c,n,le(h,b,g,s,t+1,c),h,i))}ee(e,u,o)}var be=new U.Cartesian2,ge=new U.Cartesian2,Ae=new U.Cartesian3,Te=new U.Cartesian3,xe=new U.Cartesian3,Pe=new U.Cartesian3,we=new U.Cartesian3,Se=new U.Cartesian3,Ie=new Y.Cartesian4;function Oe(e){for(var t=e.attributes,r=t.position.values,a=t.prevPosition.values,n=t.nextPosition.values,i=r.length,s=0;s<i;s+=3){var o,u,p=U.Cartesian3.unpack(r,s,Ae);0<p.x||(o=U.Cartesian3.unpack(a,s,Te),(p.y<0&&0<o.y||0<p.y&&o.y<0)&&(0<s-3?(a[s]=r[s-3],a[s+1]=r[s-2],a[s+2]=r[s-1]):U.Cartesian3.pack(p,a,s)),u=U.Cartesian3.unpack(n,s,xe),(p.y<0&&0<u.y||0<p.y&&u.y<0)&&(s+3<i?(n[s]=r[s+3],n[s+1]=r[s+4],n[s+2]=r[s+5]):U.Cartesian3.pack(p,n,s)))}}var Ee=5*q.CesiumMath.EPSILON9,Ne=q.CesiumMath.EPSILON6;r.splitLongitude=function(e){var t=e.geometry,r=t.boundingSphere;if(_.defined(r)&&(0<r.center.x-r.radius||Y.BoundingSphere.intersectPlane(r,a.Plane.ORIGIN_ZX_PLANE)!==Y.Intersect.INTERSECTING))return e;if(t.geometryType!==G.GeometryType.NONE)switch(t.geometryType){case G.GeometryType.POLYLINES:!function(e){for(var t,r=e.geometry,a=r.attributes,n=a.position.values,i=a.prevPosition.values,s=a.nextPosition.values,o=a.expandAndWidth.values,u=_.defined(a.st)?a.st.values:void 0,p=_.defined(a.color)?a.color.values:void 0,d=$(r),l=$(r),y=!1,f=n.length/3,v=0;v<f;v+=4){var c=v,m=v+2,C=U.Cartesian3.fromArray(n,3*c,Ae),h=U.Cartesian3.fromArray(n,3*m,Te);if(Math.abs(C.y)<Ne)for(C.y=Ne*(h.y<0?-1:1),n[3*v+1]=C.y,n[3*(v+1)+1]=C.y,G=3*c;G<3*c+12;G+=3)i[G]=n[3*v],i[G+1]=n[3*v+1],i[G+2]=n[3*v+2];if(Math.abs(h.y)<Ne)for(h.y=Ne*(C.y<0?-1:1),n[3*(v+2)+1]=h.y,n[3*(v+3)+1]=h.y,G=3*c;G<3*c+12;G+=3)s[G]=n[3*(v+2)],s[G+1]=n[3*(v+2)+1],s[G+2]=n[3*(v+2)+2];var b=d.attributes,g=d.indices,A=l.attributes,T=l.indices,x=Z.IntersectionTests.lineSegmentPlane(C,h,ve,Pe);if(_.defined(x)){y=!0;var P=U.Cartesian3.multiplyByScalar(U.Cartesian3.UNIT_Y,Ee,we);C.y<0&&(U.Cartesian3.negate(P,P),b=l.attributes,g=l.indices,A=d.attributes,T=d.indices);var w=U.Cartesian3.add(x,P,Se);b.position.values.push(C.x,C.y,C.z,C.x,C.y,C.z),b.position.values.push(w.x,w.y,w.z),b.position.values.push(w.x,w.y,w.z),b.prevPosition.values.push(i[3*c],i[3*c+1],i[3*c+2]),b.prevPosition.values.push(i[3*c+3],i[3*c+4],i[3*c+5]),b.prevPosition.values.push(C.x,C.y,C.z,C.x,C.y,C.z),b.nextPosition.values.push(w.x,w.y,w.z),b.nextPosition.values.push(w.x,w.y,w.z),b.nextPosition.values.push(w.x,w.y,w.z),b.nextPosition.values.push(w.x,w.y,w.z),U.Cartesian3.negate(P,P),U.Cartesian3.add(x,P,w),A.position.values.push(w.x,w.y,w.z),A.position.values.push(w.x,w.y,w.z),A.position.values.push(h.x,h.y,h.z,h.x,h.y,h.z),A.prevPosition.values.push(w.x,w.y,w.z),A.prevPosition.values.push(w.x,w.y,w.z),A.prevPosition.values.push(w.x,w.y,w.z),A.prevPosition.values.push(w.x,w.y,w.z),A.nextPosition.values.push(h.x,h.y,h.z,h.x,h.y,h.z),A.nextPosition.values.push(s[3*m],s[3*m+1],s[3*m+2]),A.nextPosition.values.push(s[3*m+3],s[3*m+4],s[3*m+5]);var S=U.Cartesian2.fromArray(o,2*c,be),I=Math.abs(S.y);b.expandAndWidth.values.push(-1,I,1,I),b.expandAndWidth.values.push(-1,-I,1,-I),A.expandAndWidth.values.push(-1,I,1,I),A.expandAndWidth.values.push(-1,-I,1,-I);var O=U.Cartesian3.magnitudeSquared(U.Cartesian3.subtract(x,C,xe));if(O/=U.Cartesian3.magnitudeSquared(U.Cartesian3.subtract(h,C,xe)),_.defined(p)){for(var E=Y.Cartesian4.fromArray(p,4*c,Ie),N=Y.Cartesian4.fromArray(p,4*m,Ie),L=q.CesiumMath.lerp(E.x,N.x,O),z=q.CesiumMath.lerp(E.y,N.y,O),D=q.CesiumMath.lerp(E.z,N.z,O),M=q.CesiumMath.lerp(E.w,N.w,O),G=4*c;G<4*c+8;++G)b.color.values.push(p[G]);for(b.color.values.push(L,z,D,M),b.color.values.push(L,z,D,M),A.color.values.push(L,z,D,M),A.color.values.push(L,z,D,M),G=4*m;G<4*m+8;++G)A.color.values.push(p[G])}if(_.defined(u)){var R=U.Cartesian2.fromArray(u,2*c,be),V=U.Cartesian2.fromArray(u,2*(v+3),ge),F=q.CesiumMath.lerp(R.x,V.x,O);for(G=2*c;G<2*c+4;++G)b.st.values.push(u[G]);for(b.st.values.push(F,R.y),b.st.values.push(F,V.y),A.st.values.push(F,R.y),A.st.values.push(F,V.y),G=2*m;G<2*m+4;++G)A.st.values.push(u[G])}t=b.position.values.length/3-4,g.push(t,t+2,t+1),g.push(t+1,t+2,t+3),t=A.position.values.length/3-4,T.push(t,t+2,t+1),T.push(t+1,t+2,t+3)}else{var B,k=C.y<0?(B=l.attributes,l.indices):(B=d.attributes,d.indices);for(B.position.values.push(C.x,C.y,C.z),B.position.values.push(C.x,C.y,C.z),B.position.values.push(h.x,h.y,h.z),B.position.values.push(h.x,h.y,h.z),G=3*v;G<3*v+12;++G)B.prevPosition.values.push(i[G]),B.nextPosition.values.push(s[G]);for(G=2*v;G<2*v+8;++G)B.expandAndWidth.values.push(o[G]),_.defined(u)&&B.st.values.push(u[G]);if(_.defined(p))for(G=4*v;G<4*v+16;++G)B.color.values.push(p[G]);t=B.position.values.length/3-4,k.push(t,t+2,t+1),k.push(t+1,t+2,t+3)}}y&&(Oe(l),Oe(d)),ee(e,l,d)}(e);break;case G.GeometryType.TRIANGLES:fe(e);break;case G.GeometryType.LINES:he(e)}else C(t),t.primitiveType===G.PrimitiveType.TRIANGLES?fe(e):t.primitiveType===G.PrimitiveType.LINES&&he(e);return e},e.GeometryPipeline=r}); diff --git a/web/assets/Cesium/Workers/IndexDatatype-53503fee.js b/web/assets/Cesium/Workers/IndexDatatype-53503fee.js new file mode 100644 index 00000000..ad455b8e --- /dev/null +++ b/web/assets/Cesium/Workers/IndexDatatype-53503fee.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./WebGLConstants-76bb35d1"],function(e,r,t,N,n){"use strict";var E={UNSIGNED_BYTE:n.WebGLConstants.UNSIGNED_BYTE,UNSIGNED_SHORT:n.WebGLConstants.UNSIGNED_SHORT,UNSIGNED_INT:n.WebGLConstants.UNSIGNED_INT,getSizeInBytes:function(e){switch(e){case E.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case E.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case E.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT}},fromSizeInBytes:function(e){switch(e){case 2:return E.UNSIGNED_SHORT;case 4:return E.UNSIGNED_INT;case 1:return E.UNSIGNED_BYTE}},validate:function(e){return r.defined(e)&&(e===E.UNSIGNED_BYTE||e===E.UNSIGNED_SHORT||e===E.UNSIGNED_INT)},createTypedArray:function(e,r){return new(e>=N.CesiumMath.SIXTY_FOUR_KILOBYTES?Uint32Array:Uint16Array)(r)},createTypedArrayFromArrayBuffer:function(e,r,t,n){return new(e>=N.CesiumMath.SIXTY_FOUR_KILOBYTES?Uint32Array:Uint16Array)(r,t,n)}},a=Object.freeze(E);e.IndexDatatype=a}); diff --git a/web/assets/Cesium/Workers/IntersectionTests-2626c9e9.js b/web/assets/Cesium/Workers/IntersectionTests-2626c9e9.js new file mode 100644 index 00000000..089b35d6 --- /dev/null +++ b/web/assets/Cesium/Workers/IntersectionTests-2626c9e9.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304"],function(a,q,t,T,U,W){"use strict";var B={};function c(a,t,e){var r=a+t;return T.CesiumMath.sign(a)!==T.CesiumMath.sign(t)&&Math.abs(r/Math.max(Math.abs(a),Math.abs(t)))<e?0:r}B.computeDiscriminant=function(a,t,e){return t*t-4*a*e},B.computeRealRoots=function(a,t,e){var r;if(0===a)return 0===t?[]:[-e/t];if(0===t){if(0===e)return[0,0];var n=Math.abs(e),i=Math.abs(a);if(n<i&&n/i<T.CesiumMath.EPSILON14)return[0,0];if(i<n&&i/n<T.CesiumMath.EPSILON14)return[];if((r=-e/a)<0)return[];var s=Math.sqrt(r);return[-s,s]}if(0===e)return(r=-t/a)<0?[r,0]:[0,r];var o=c(t*t,-(4*a*e),T.CesiumMath.EPSILON14);if(o<0)return[];var u=-.5*c(t,T.CesiumMath.sign(t)*Math.sqrt(o),T.CesiumMath.EPSILON14);return 0<t?[u/a,e/u]:[e/u,u/a]};var N={};function o(a,t,e,r){var n=a,i=t/3,s=e/3,o=r,u=n*s,c=i*o,C=i*i,l=s*s,h=n*s-C,M=n*o-i*s,f=i*o-l,m=4*h*f-M*M;if(m<0){var d,g,v,p=u*l<=C*c?-2*i*(g=h)+(d=n)*M:-(d=o)*M+2*s*(g=f),w=-(p<0?-1:1)*Math.abs(d)*Math.sqrt(-m),R=(v=w-p)/2,S=R<0?-Math.pow(-R,1/3):Math.pow(R,1/3),O=v===w?-S:-g/S,x=g<=0?S+O:-p/(S*S+O*O+g);return u*l<=C*c?[(x-i)/n]:[-o/(x+s)]}var y=h,P=-2*i*h+n*M,b=f,N=-o*M+2*s*f,q=Math.sqrt(m),L=Math.sqrt(3)/2,I=Math.abs(Math.atan2(n*q,-P)/3);x=2*Math.sqrt(-y);var E=Math.cos(I);v=x*E;var z=x*(-E/2-L*Math.sin(I)),T=2*i<v+z?v-i:z-i,U=n,W=T/U,I=Math.abs(Math.atan2(o*q,-N)/3),B=-o,V=(v=(x=2*Math.sqrt(-b))*(E=Math.cos(I)))+(z=x*(-E/2-L*Math.sin(I)))<2*s?v+s:z+s,Z=B/V,A=-T*V-U*B,D=(s*A-i*(T*B))/(-i*A+s*(U*V));return W<=D?W<=Z?D<=Z?[W,D,Z]:[W,Z,D]:[Z,W,D]:W<=Z?[D,W,Z]:D<=Z?[D,Z,W]:[Z,D,W]}N.computeDiscriminant=function(a,t,e,r){var n=t*t,i=e*e;return 18*a*t*e*r+n*i-27*(a*a)*(r*r)-4*(a*i*e+n*t*r)},N.computeRealRoots=function(a,t,e,r){var n,i;if(0===a)return B.computeRealRoots(t,e,r);if(0!==t)return 0===e?0===r?(i=-t/a)<0?[i,0,0]:[0,0,i]:o(a,t,0,r):0===r?0===(n=B.computeRealRoots(a,t,e)).length?[0]:n[1]<=0?[n[0],n[1],0]:0<=n[0]?[0,n[0],n[1]]:[n[0],0,n[1]]:o(a,t,e,r);if(0!==e)return 0===r?0===(n=B.computeRealRoots(a,0,e)).Length?[0]:[n[0],0,n[1]]:o(a,0,e,r);if(0===r)return[0,0,0];var s=(i=-r/a)<0?-Math.pow(-i,1/3):Math.pow(i,1/3);return[s,s,s]};var V={};function C(a,t,e,r){var n=a*a,i=t-3*n/8,s=e-t*a/2+n*a/8,o=r-e*a/4+t*n/16-3*n*n/256,u=N.computeRealRoots(1,2*i,i*i-4*o,-s*s);if(0<u.length){var c=-a/4,C=u[u.length-1];if(Math.abs(C)<T.CesiumMath.EPSILON14){var l=B.computeRealRoots(1,i,o);if(2===l.length){var h,M=l[0],f=l[1];if(0<=M&&0<=f){var m=Math.sqrt(M),d=Math.sqrt(f);return[c-d,c-m,c+m,c+d]}if(0<=M&&f<0)return[c-(h=Math.sqrt(M)),c+h];if(M<0&&0<=f)return[c-(h=Math.sqrt(f)),c+h]}return[]}if(0<C){var g=Math.sqrt(C),v=(i+C-s/g)/2,p=(i+C+s/g)/2,w=B.computeRealRoots(1,g,v),R=B.computeRealRoots(1,-g,p);return 0!==w.length?(w[0]+=c,w[1]+=c,0!==R.length?(R[0]+=c,R[1]+=c,w[1]<=R[0]?[w[0],w[1],R[0],R[1]]:R[1]<=w[0]?[R[0],R[1],w[0],w[1]]:w[0]>=R[0]&&w[1]<=R[1]?[R[0],w[0],w[1],R[1]]:R[0]>=w[0]&&R[1]<=w[1]?[w[0],R[0],R[1],w[1]]:w[0]>R[0]&&w[0]<R[1]?[R[0],w[0],R[1],w[1]]:[w[0],R[0],w[1],R[1]]):w):0!==R.length?(R[0]+=c,R[1]+=c,R):[]}}return[]}function l(a,t,e,r){var n=a*a,i=-2*t,s=e*a+t*t-4*r,o=n*r-e*t*a+e*e,u=N.computeRealRoots(1,i,s,o);if(0<u.length){var c,C,l,h,M,f,m,d,g=u[0],v=t-g,p=v*v,w=a/2,R=v/2,S=p-4*r,O=p+4*Math.abs(r),x=n-4*g,y=n+4*Math.abs(g);l=g<0||S*y<x*O?(C=(c=Math.sqrt(x))/2,0===c?0:(a*R-e)/c):(C=0===(h=Math.sqrt(S))?0:(a*R-e)/h,h/2),0==w&&0===C?f=M=0:T.CesiumMath.sign(w)===T.CesiumMath.sign(C)?f=g/(M=w+C):M=g/(f=w-C),0==R&&0===l?d=m=0:T.CesiumMath.sign(R)===T.CesiumMath.sign(l)?d=r/(m=R+l):m=r/(d=R-l);var P=B.computeRealRoots(1,M,m),b=B.computeRealRoots(1,f,d);if(0!==P.length)return 0!==b.length?P[1]<=b[0]?[P[0],P[1],b[0],b[1]]:b[1]<=P[0]?[b[0],b[1],P[0],P[1]]:P[0]>=b[0]&&P[1]<=b[1]?[b[0],P[0],P[1],b[1]]:b[0]>=P[0]&&b[1]<=P[1]?[P[0],b[0],b[1],P[1]]:P[0]>b[0]&&P[0]<b[1]?[b[0],P[0],b[1],P[1]]:[P[0],b[0],P[1],b[1]]:P;if(0!==b.length)return b}return[]}function e(a,t){t=U.Cartesian3.clone(q.defaultValue(t,U.Cartesian3.ZERO)),U.Cartesian3.equals(t,U.Cartesian3.ZERO)||U.Cartesian3.normalize(t,t),this.origin=U.Cartesian3.clone(q.defaultValue(a,U.Cartesian3.ZERO)),this.direction=t}V.computeDiscriminant=function(a,t,e,r,n){var i=a*a,s=t*t,o=s*t,u=e*e,c=u*e,C=r*r,l=C*r,h=n*n;return s*u*C-4*o*l-4*a*c*C+18*a*t*e*l-27*i*C*C+256*(i*a)*(h*n)+n*(18*o*e*r-4*s*c+16*a*u*u-80*a*t*u*r-6*a*s*C+144*i*e*C)+h*(144*a*s*e-27*s*s-128*i*u-192*i*t*r)},V.computeRealRoots=function(a,t,e,r,n){if(Math.abs(a)<T.CesiumMath.EPSILON15)return N.computeRealRoots(t,e,r,n);var i=t/a,s=e/a,o=r/a,u=n/a,c=i<0?1:0;switch(c+=s<0?c+1:c,c+=o<0?c+1:c,c+=u<0?c+1:c){case 0:return C(i,s,o,u);case 1:case 2:return l(i,s,o,u);case 3:case 4:return C(i,s,o,u);case 5:return l(i,s,o,u);case 6:case 7:return C(i,s,o,u);case 8:return l(i,s,o,u);case 9:case 10:return C(i,s,o,u);case 11:return l(i,s,o,u);case 12:case 13:case 14:case 15:return C(i,s,o,u);default:return}},e.clone=function(a,t){if(q.defined(a))return q.defined(t)?(t.origin=U.Cartesian3.clone(a.origin),t.direction=U.Cartesian3.clone(a.direction),t):new e(a.origin,a.direction)},e.getPoint=function(a,t,e){return q.defined(e)||(e=new U.Cartesian3),e=U.Cartesian3.multiplyByScalar(a.direction,t,e),U.Cartesian3.add(a.origin,e,e)};var h={rayPlane:function(a,t,e){q.defined(e)||(e=new U.Cartesian3);var r=a.origin,n=a.direction,i=t.normal,s=U.Cartesian3.dot(i,n);if(!(Math.abs(s)<T.CesiumMath.EPSILON15)){var o=(-t.distance-U.Cartesian3.dot(i,r))/s;if(!(o<0))return e=U.Cartesian3.multiplyByScalar(n,o,e),U.Cartesian3.add(r,e,e)}}},g=new U.Cartesian3,v=new U.Cartesian3,p=new U.Cartesian3,w=new U.Cartesian3,R=new U.Cartesian3;h.rayTriangleParametric=function(a,t,e,r,n){n=q.defaultValue(n,!1);var i,s,o,u=a.origin,c=a.direction,C=U.Cartesian3.subtract(e,t,g),l=U.Cartesian3.subtract(r,t,v),h=U.Cartesian3.cross(c,l,p),M=U.Cartesian3.dot(C,h);if(n){if(M<T.CesiumMath.EPSILON6)return;if(d=U.Cartesian3.subtract(u,t,w),(f=U.Cartesian3.dot(d,h))<0||M<f)return;if(i=U.Cartesian3.cross(d,C,R),(s=U.Cartesian3.dot(c,i))<0||M<f+s)return;o=U.Cartesian3.dot(l,i)/M}else{if(Math.abs(M)<T.CesiumMath.EPSILON6)return;var f,m=1/M,d=U.Cartesian3.subtract(u,t,w);if((f=U.Cartesian3.dot(d,h)*m)<0||1<f)return;if(i=U.Cartesian3.cross(d,C,R),(s=U.Cartesian3.dot(c,i)*m)<0||1<f+s)return;o=U.Cartesian3.dot(l,i)*m}return o},h.rayTriangle=function(a,t,e,r,n,i){var s=h.rayTriangleParametric(a,t,e,r,n);if(q.defined(s)&&!(s<0))return q.defined(i)||(i=new U.Cartesian3),U.Cartesian3.multiplyByScalar(a.direction,s,i),U.Cartesian3.add(a.origin,i,i)};var M=new e;h.lineSegmentTriangle=function(a,t,e,r,n,i,s){var o=M;U.Cartesian3.clone(a,o.origin),U.Cartesian3.subtract(t,a,o.direction),U.Cartesian3.normalize(o.direction,o.direction);var u=h.rayTriangleParametric(o,e,r,n,i);if(!(!q.defined(u)||u<0||u>U.Cartesian3.distance(a,t)))return q.defined(s)||(s=new U.Cartesian3),U.Cartesian3.multiplyByScalar(o.direction,u,s),U.Cartesian3.add(o.origin,s,s)};var f={root0:0,root1:0};function u(a,t,e){q.defined(e)||(e=new W.Interval);var r=a.origin,n=a.direction,i=t.center,s=t.radius*t.radius,o=U.Cartesian3.subtract(r,i,p),u=function(a,t,e,r){var n=t*t-4*a*e;if(!(n<0)){if(0<n){var i=1/(2*a),s=Math.sqrt(n),o=(-t+s)*i,u=(-t-s)*i;return o<u?(r.root0=o,r.root1=u):(r.root0=u,r.root1=o),r}var c=-t/(2*a);if(0!=c)return r.root0=r.root1=c,r}}(U.Cartesian3.dot(n,n),2*U.Cartesian3.dot(n,o),U.Cartesian3.magnitudeSquared(o)-s,f);if(q.defined(u))return e.start=u.root0,e.stop=u.root1,e}h.raySphere=function(a,t,e){if(e=u(a,t,e),q.defined(e)&&!(e.stop<0))return e.start=Math.max(e.start,0),e};var m=new e;h.lineSegmentSphere=function(a,t,e,r){var n=m;U.Cartesian3.clone(a,n.origin);var i=U.Cartesian3.subtract(t,a,n.direction),s=U.Cartesian3.magnitude(i);if(U.Cartesian3.normalize(i,i),r=u(n,e,r),!(!q.defined(r)||r.stop<0||r.start>s))return r.start=Math.max(r.start,0),r.stop=Math.min(r.stop,s),r};var d=new U.Cartesian3,S=new U.Cartesian3;function Z(a,t,e){var r=a+t;return T.CesiumMath.sign(a)!==T.CesiumMath.sign(t)&&Math.abs(r/Math.max(Math.abs(a),Math.abs(t)))<e?0:r}h.rayEllipsoid=function(a,t){var e,r,n=t.oneOverRadii,i=U.Cartesian3.multiplyComponents(n,a.origin,d),s=U.Cartesian3.multiplyComponents(n,a.direction,S),o=U.Cartesian3.magnitudeSquared(i),u=U.Cartesian3.dot(i,s);if(1<o){if(0<=u)return;var c,C,l=u*u,h=o-1;if(l<(C=(c=U.Cartesian3.magnitudeSquared(s))*h))return;if(C<l){e=u*u-C;var M=(r=-u+Math.sqrt(e))/c,f=h/r;return M<f?new W.Interval(M,f):{start:f,stop:M}}var m=Math.sqrt(h/c);return new W.Interval(m,m)}return o<1?(h=o-1,e=u*u-(C=(c=U.Cartesian3.magnitudeSquared(s))*h),r=-u+Math.sqrt(e),new W.Interval(0,r/c)):u<0?(c=U.Cartesian3.magnitudeSquared(s),new W.Interval(0,-u/c)):void 0};var L=new U.Cartesian3,I=new U.Cartesian3,E=new U.Cartesian3,z=new U.Cartesian3,A=new U.Cartesian3,D=new W.Matrix3,k=new W.Matrix3,F=new W.Matrix3,G=new W.Matrix3,Y=new W.Matrix3,_=new W.Matrix3,j=new W.Matrix3,H=new U.Cartesian3,J=new U.Cartesian3,K=new U.Cartographic;h.grazingAltitudeLocation=function(a,t){var e=a.origin,r=a.direction;if(!U.Cartesian3.equals(e,U.Cartesian3.ZERO)){var n=t.geodeticSurfaceNormal(e,L);if(0<=U.Cartesian3.dot(r,n))return e}var i=q.defined(this.rayEllipsoid(a,t)),s=t.transformPositionToScaledSpace(r,L),o=U.Cartesian3.normalize(s,s),u=U.Cartesian3.mostOrthogonalAxis(s,z),c=U.Cartesian3.normalize(U.Cartesian3.cross(u,o,I),I),C=U.Cartesian3.normalize(U.Cartesian3.cross(o,c,E),E),l=D;l[0]=o.x,l[1]=o.y,l[2]=o.z,l[3]=c.x,l[4]=c.y,l[5]=c.z,l[6]=C.x,l[7]=C.y,l[8]=C.z;var h=W.Matrix3.transpose(l,k),M=W.Matrix3.fromScale(t.radii,F),f=W.Matrix3.fromScale(t.oneOverRadii,G),m=Y;m[0]=0,m[1]=-r.z,m[2]=r.y,m[3]=r.z,m[4]=0,m[5]=-r.x,m[6]=-r.y,m[7]=r.x,m[8]=0;var d,g=W.Matrix3.multiply(W.Matrix3.multiply(h,f,_),m,_),v=W.Matrix3.multiply(W.Matrix3.multiply(g,M,j),l,j),p=W.Matrix3.multiplyByVector(g,e,A),w=function(a,t,e,r,n){var i,s=r*r,o=n*n,u=(a[W.Matrix3.COLUMN1ROW1]-a[W.Matrix3.COLUMN2ROW2])*o,c=n*(r*Z(a[W.Matrix3.COLUMN1ROW0],a[W.Matrix3.COLUMN0ROW1],T.CesiumMath.EPSILON15)+t.y),C=a[W.Matrix3.COLUMN0ROW0]*s+a[W.Matrix3.COLUMN2ROW2]*o+r*t.x+e,l=o*Z(a[W.Matrix3.COLUMN2ROW1],a[W.Matrix3.COLUMN1ROW2],T.CesiumMath.EPSILON15),h=n*(r*Z(a[W.Matrix3.COLUMN2ROW0],a[W.Matrix3.COLUMN0ROW2])+t.z),M=[];if(0==h&&0==l){if(0===(i=B.computeRealRoots(u,c,C)).length)return M;var f,m,d=i[0],g=Math.sqrt(Math.max(1-d*d,0));return M.push(new U.Cartesian3(r,n*d,n*-g)),M.push(new U.Cartesian3(r,n*d,n*g)),2===i.length&&(f=i[1],m=Math.sqrt(Math.max(1-f*f,0)),M.push(new U.Cartesian3(r,n*f,n*-m)),M.push(new U.Cartesian3(r,n*f,n*m))),M}var v=h*h,p=l*l,w=h*l,R=u*u+p,S=2*(c*u+w),O=2*C*u+c*c-p+v,x=2*(C*c-w),y=C*C-v;if(0==R&&0==S&&0==O&&0==x)return M;var P=(i=V.computeRealRoots(R,S,O,x,y)).length;if(0===P)return M;for(var b=0;b<P;++b){var N=i[b],q=N*N,L=Math.max(1-q,0),I=Math.sqrt(L),E=T.CesiumMath.sign(u)===T.CesiumMath.sign(C)?Z(u*q+C,c*N,T.CesiumMath.EPSILON12):T.CesiumMath.sign(C)===T.CesiumMath.sign(c*N)?Z(u*q,c*N+C,T.CesiumMath.EPSILON12):Z(u*q+c*N,C,T.CesiumMath.EPSILON12),z=E*Z(l*N,h,T.CesiumMath.EPSILON15);z<0?M.push(new U.Cartesian3(r,n*N,n*I)):0<z?M.push(new U.Cartesian3(r,n*N,n*-I)):0!==I?(M.push(new U.Cartesian3(r,n*N,n*-I)),M.push(new U.Cartesian3(r,n*N,n*I)),++b):M.push(new U.Cartesian3(r,n*N,n*I))}return M}(v,U.Cartesian3.negate(p,L),0,0,1),R=w.length;if(0<R){for(var S=U.Cartesian3.clone(U.Cartesian3.ZERO,J),O=Number.NEGATIVE_INFINITY,x=0;x<R;++x){d=W.Matrix3.multiplyByVector(M,W.Matrix3.multiplyByVector(l,w[x],H),H);var y=U.Cartesian3.normalize(U.Cartesian3.subtract(d,e,z),z),P=U.Cartesian3.dot(y,r);O<P&&(O=P,S=U.Cartesian3.clone(d,S))}var b=t.cartesianToCartographic(S,K),O=T.CesiumMath.clamp(O,0,1),N=U.Cartesian3.magnitude(U.Cartesian3.subtract(S,e,z))*Math.sqrt(1-O*O);return N=i?-N:N,b.height=N,t.cartographicToCartesian(b,new U.Cartesian3)}};var O=new U.Cartesian3;h.lineSegmentPlane=function(a,t,e,r){q.defined(r)||(r=new U.Cartesian3);var n=U.Cartesian3.subtract(t,a,O),i=e.normal,s=U.Cartesian3.dot(i,n);if(!(Math.abs(s)<T.CesiumMath.EPSILON6)){var o=U.Cartesian3.dot(i,a),u=-(e.distance+o)/s;if(!(u<0||1<u))return U.Cartesian3.multiplyByScalar(n,u,r),U.Cartesian3.add(a,r,r),r}},h.trianglePlaneIntersection=function(a,t,e,r){var n,i,s=r.normal,o=r.distance,u=U.Cartesian3.dot(s,a)+o<0,c=U.Cartesian3.dot(s,t)+o<0,C=U.Cartesian3.dot(s,e)+o<0,l=0;if(l+=u?1:0,l+=c?1:0,1!=(l+=C?1:0)&&2!=l||(n=new U.Cartesian3,i=new U.Cartesian3),1==l){if(u)return h.lineSegmentPlane(a,t,r,n),h.lineSegmentPlane(a,e,r,i),{positions:[a,t,e,n,i],indices:[0,3,4,1,2,4,1,4,3]};if(c)return h.lineSegmentPlane(t,e,r,n),h.lineSegmentPlane(t,a,r,i),{positions:[a,t,e,n,i],indices:[1,3,4,2,0,4,2,4,3]};if(C)return h.lineSegmentPlane(e,a,r,n),h.lineSegmentPlane(e,t,r,i),{positions:[a,t,e,n,i],indices:[2,3,4,0,1,4,0,4,3]}}else if(2==l){if(!u)return h.lineSegmentPlane(t,a,r,n),h.lineSegmentPlane(e,a,r,i),{positions:[a,t,e,n,i],indices:[1,2,4,1,4,3,0,3,4]};if(!c)return h.lineSegmentPlane(e,t,r,n),h.lineSegmentPlane(a,t,r,i),{positions:[a,t,e,n,i],indices:[2,0,4,2,4,3,1,3,4]};if(!C)return h.lineSegmentPlane(a,e,r,n),h.lineSegmentPlane(t,e,r,i),{positions:[a,t,e,n,i],indices:[0,1,4,0,4,3,2,3,4]}}},a.IntersectionTests=h,a.Ray=e}); diff --git a/web/assets/Cesium/Workers/Math-fc8cecf5.js b/web/assets/Cesium/Workers/Math-fc8cecf5.js new file mode 100644 index 00000000..06e7298f --- /dev/null +++ b/web/assets/Cesium/Workers/Math-fc8cecf5.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc"],function(t,r,n){"use strict";function i(t){null==t&&(t=(new Date).getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=new Array(this.N),this.mti=this.N+1,this.init_genrand(t)}i.prototype.init_genrand=function(t){for(this.mt[0]=t>>>0,this.mti=1;this.mti<this.N;this.mti++){t=this.mt[this.mti-1]^this.mt[this.mti-1]>>>30;this.mt[this.mti]=(1812433253*((4294901760&t)>>>16)<<16)+1812433253*(65535&t)+this.mti,this.mt[this.mti]>>>=0}},i.prototype.genrand_int32=function(){var t,n,i=new Array(0,this.MATRIX_A);if(this.mti>=this.N){for(this.mti==this.N+1&&this.init_genrand(5489),n=0;n<this.N-this.M;n++)t=this.mt[n]&this.UPPER_MASK|this.mt[n+1]&this.LOWER_MASK,this.mt[n]=this.mt[n+this.M]^t>>>1^i[1&t];for(;n<this.N-1;n++)t=this.mt[n]&this.UPPER_MASK|this.mt[n+1]&this.LOWER_MASK,this.mt[n]=this.mt[n+(this.M-this.N)]^t>>>1^i[1&t];t=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^t>>>1^i[1&t],this.mti=0}return t=this.mt[this.mti++],t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,(t^=t>>>18)>>>0},i.prototype.random=function(){return this.genrand_int32()*(1/4294967296)};var h={EPSILON1:.1,EPSILON2:.01,EPSILON3:.001,EPSILON4:1e-4,EPSILON5:1e-5,EPSILON6:1e-6,EPSILON7:1e-7,EPSILON8:1e-8,EPSILON9:1e-9,EPSILON10:1e-10,EPSILON11:1e-11,EPSILON12:1e-12,EPSILON13:1e-13,EPSILON14:1e-14,EPSILON15:1e-15,EPSILON16:1e-16,EPSILON17:1e-17,EPSILON18:1e-18,EPSILON19:1e-19,EPSILON20:1e-20,EPSILON21:1e-21,GRAVITATIONALPARAMETER:3986004418e5,SOLAR_RADIUS:6955e5,LUNAR_RADIUS:1737400,SIXTY_FOUR_KILOBYTES:65536,FOUR_GIGABYTES:4294967296};h.sign=r.defaultValue(Math.sign,function(t){return 0===(t=+t)||t!=t?t:0<t?1:-1}),h.signNotZero=function(t){return t<0?-1:1},h.toSNorm=function(t,n){return n=r.defaultValue(n,255),Math.round((.5*h.clamp(t,-1,1)+.5)*n)},h.fromSNorm=function(t,n){return n=r.defaultValue(n,255),h.clamp(t,0,n)/n*2-1},h.normalize=function(t,n,i){return 0===(i=Math.max(i-n,0))?0:h.clamp((t-n)/i,0,1)},h.sinh=r.defaultValue(Math.sinh,function(t){return(Math.exp(t)-Math.exp(-t))/2}),h.cosh=r.defaultValue(Math.cosh,function(t){return(Math.exp(t)+Math.exp(-t))/2}),h.lerp=function(t,n,i){return(1-i)*t+i*n},h.PI=Math.PI,h.ONE_OVER_PI=1/Math.PI,h.PI_OVER_TWO=Math.PI/2,h.PI_OVER_THREE=Math.PI/3,h.PI_OVER_FOUR=Math.PI/4,h.PI_OVER_SIX=Math.PI/6,h.THREE_PI_OVER_TWO=3*Math.PI/2,h.TWO_PI=2*Math.PI,h.ONE_OVER_TWO_PI=1/(2*Math.PI),h.RADIANS_PER_DEGREE=Math.PI/180,h.DEGREES_PER_RADIAN=180/Math.PI,h.RADIANS_PER_ARCSECOND=h.RADIANS_PER_DEGREE/3600,h.toRadians=function(t){return t*h.RADIANS_PER_DEGREE},h.toDegrees=function(t){return t*h.DEGREES_PER_RADIAN},h.convertLongitudeRange=function(t){var n=h.TWO_PI,i=t-Math.floor(t/n)*n;return i<-Math.PI?i+n:i>=Math.PI?i-n:i},h.clampToLatitudeRange=function(t){return h.clamp(t,-1*h.PI_OVER_TWO,h.PI_OVER_TWO)},h.negativePiToPi=function(t){return h.zeroToTwoPi(t+h.PI)-h.PI},h.zeroToTwoPi=function(t){var n=h.mod(t,h.TWO_PI);return Math.abs(n)<h.EPSILON14&&Math.abs(t)>h.EPSILON14?h.TWO_PI:n},h.mod=function(t,n){return(t%n+n)%n},h.equalsEpsilon=function(t,n,i,a){i=r.defaultValue(i,0),a=r.defaultValue(a,i);var e=Math.abs(t-n);return e<=a||e<=i*Math.max(Math.abs(t),Math.abs(n))},h.lessThan=function(t,n,i){return t-n<-i},h.lessThanOrEquals=function(t,n,i){return t-n<i},h.greaterThan=function(t,n,i){return i<t-n},h.greaterThanOrEquals=function(t,n,i){return-i<t-n};var u=[1];h.factorial=function(t){var n=u.length;if(n<=t)for(var i=u[n-1],a=n;a<=t;a++){var e=i*a;u.push(e),i=e}return u[t]},h.incrementWrap=function(t,n,i){return i=r.defaultValue(i,0),n<++t&&(t=i),t},h.isPowerOfTwo=function(t){return 0!==t&&0==(t&t-1)},h.nextPowerOfTwo=function(t){return--t,t|=t>>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,++t},h.clamp=function(t,n,i){return t<n?n:i<t?i:t};var a=new i;h.setRandomNumberSeed=function(t){a=new i(t)},h.nextRandomNumber=function(){return a.random()},h.randomBetween=function(t,n){return h.nextRandomNumber()*(n-t)+t},h.acosClamped=function(t){return Math.acos(h.clamp(t,-1,1))},h.asinClamped=function(t){return Math.asin(h.clamp(t,-1,1))},h.chordLength=function(t,n){return 2*n*Math.sin(.5*t)},h.logBase=function(t,n){return Math.log(t)/Math.log(n)},h.cbrt=r.defaultValue(Math.cbrt,function(t){var n=Math.pow(Math.abs(t),1/3);return t<0?-n:n}),h.log2=r.defaultValue(Math.log2,function(t){return Math.log(t)*Math.LOG2E}),h.fog=function(t,n){var i=t*n;return 1-Math.exp(-i*i)},h.fastApproximateAtan=function(t){return t*(-.1784*Math.abs(t)-.0663*t*t+1.0301)},h.fastApproximateAtan2=function(t,n){var i=Math.abs(t),a=Math.abs(n),e=Math.max(i,a),r=Math.min(i,a)/e,i=h.fastApproximateAtan(r);return i=Math.abs(n)>Math.abs(t)?h.PI_OVER_TWO-i:i,i=t<0?h.PI-i:i,i=n<0?-i:i},t.CesiumMath=h}); diff --git a/web/assets/Cesium/Workers/OrientedBoundingBox-c9ad91c4.js b/web/assets/Cesium/Workers/OrientedBoundingBox-c9ad91c4.js new file mode 100644 index 00000000..e01e6337 --- /dev/null +++ b/web/assets/Cesium/Workers/OrientedBoundingBox-c9ad91c4.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./Plane-231f1723","./EllipsoidTangentPlane-ed172748"],function(a,q,t,X,j,T,Z,G){"use strict";function v(a,t){this.center=j.Cartesian3.clone(q.defaultValue(a,j.Cartesian3.ZERO)),this.halfAxes=T.Matrix3.clone(q.defaultValue(t,T.Matrix3.ZERO))}v.packedLength=j.Cartesian3.packedLength+T.Matrix3.packedLength,v.pack=function(a,t,e){return e=q.defaultValue(e,0),j.Cartesian3.pack(a.center,t,e),T.Matrix3.pack(a.halfAxes,t,e+j.Cartesian3.packedLength),t},v.unpack=function(a,t,e){return t=q.defaultValue(t,0),q.defined(e)||(e=new v),j.Cartesian3.unpack(a,t,e.center),T.Matrix3.unpack(a,t+j.Cartesian3.packedLength,e.halfAxes),e};var R=new j.Cartesian3,I=new j.Cartesian3,E=new j.Cartesian3,L=new j.Cartesian3,z=new j.Cartesian3,S=new j.Cartesian3,U=new T.Matrix3,V={unitary:new T.Matrix3,diagonal:new T.Matrix3};v.fromPoints=function(a,t){if(q.defined(t)||(t=new v),!q.defined(a)||0===a.length)return t.halfAxes=T.Matrix3.ZERO,t.center=j.Cartesian3.ZERO,t;for(var e=a.length,n=j.Cartesian3.clone(a[0],R),r=1;r<e;r++)j.Cartesian3.add(n,a[r],n);var i=1/e;j.Cartesian3.multiplyByScalar(n,i,n);var s,o=0,C=0,c=0,u=0,d=0,l=0;for(r=0;r<e;r++)o+=(s=j.Cartesian3.subtract(a[r],n,I)).x*s.x,C+=s.x*s.y,c+=s.x*s.z,u+=s.y*s.y,d+=s.y*s.z,l+=s.z*s.z;o*=i,C*=i,c*=i,u*=i,d*=i,l*=i;var h=U;h[0]=o,h[1]=C,h[2]=c,h[3]=C,h[4]=u,h[5]=d,h[6]=c,h[7]=d,h[8]=l;var x=T.Matrix3.computeEigenDecomposition(h,V),M=T.Matrix3.clone(x.unitary,t.halfAxes),m=T.Matrix3.getColumn(M,0,L),f=T.Matrix3.getColumn(M,1,z),p=T.Matrix3.getColumn(M,2,S),g=-Number.MAX_VALUE,w=-Number.MAX_VALUE,y=-Number.MAX_VALUE,O=Number.MAX_VALUE,b=Number.MAX_VALUE,P=Number.MAX_VALUE;for(r=0;r<e;r++)s=a[r],g=Math.max(j.Cartesian3.dot(m,s),g),w=Math.max(j.Cartesian3.dot(f,s),w),y=Math.max(j.Cartesian3.dot(p,s),y),O=Math.min(j.Cartesian3.dot(m,s),O),b=Math.min(j.Cartesian3.dot(f,s),b),P=Math.min(j.Cartesian3.dot(p,s),P);m=j.Cartesian3.multiplyByScalar(m,.5*(O+g),m),f=j.Cartesian3.multiplyByScalar(f,.5*(b+w),f),p=j.Cartesian3.multiplyByScalar(p,.5*(P+y),p);var N=j.Cartesian3.add(m,f,t.center);j.Cartesian3.add(N,p,N);var A=E;return A.x=g-O,A.y=w-b,A.z=y-P,j.Cartesian3.multiplyByScalar(A,.5,A),T.Matrix3.multiplyByScale(t.halfAxes,A,t.halfAxes),t};var M=new j.Cartesian3,m=new j.Cartesian3;function F(a,t,e,n,r,i,s,o,C,c,u){q.defined(u)||(u=new v);var d=u.halfAxes;T.Matrix3.setColumn(d,0,t,d),T.Matrix3.setColumn(d,1,e,d),T.Matrix3.setColumn(d,2,n,d),(x=M).x=(r+i)/2,x.y=(s+o)/2,x.z=(C+c)/2;var l=m;l.x=(i-r)/2,l.y=(o-s)/2,l.z=(c-C)/2;var h=u.center,x=T.Matrix3.multiplyByVector(d,x,x);return j.Cartesian3.add(a,x,h),T.Matrix3.multiplyByScale(d,l,d),u}var Y=new j.Cartographic,H=new j.Cartesian3,J=new j.Cartographic,K=new j.Cartographic,Q=new j.Cartographic,$=new j.Cartographic,aa=new j.Cartographic,ta=new j.Cartesian3,ea=new j.Cartesian3,na=new j.Cartesian3,ra=new j.Cartesian3,ia=new j.Cartesian3,sa=new j.Cartesian2,oa=new j.Cartesian2,Ca=new j.Cartesian2,ca=new j.Cartesian2,ua=new j.Cartesian2,da=new j.Cartesian3,la=new j.Cartesian3,ha=new j.Cartesian3,xa=new j.Cartesian3,Ma=new j.Cartesian2,ma=new j.Cartesian3,fa=new j.Cartesian3,pa=new j.Cartesian3,ga=new Z.Plane(j.Cartesian3.UNIT_X,0);v.fromRectangle=function(a,t,e,n,r){if(t=q.defaultValue(t,0),e=q.defaultValue(e,0),n=q.defaultValue(n,j.Ellipsoid.WGS84),a.width<=X.CesiumMath.PI){var i,s=j.Rectangle.center(a,Y),o=n.cartographicToCartesian(s,H),C=new G.EllipsoidTangentPlane(o,n),c=C.plane,u=s.longitude,d=a.south<0&&0<a.north?0:s.latitude,l=j.Cartographic.fromRadians(u,a.north,e,J),h=j.Cartographic.fromRadians(a.west,a.north,e,K),x=j.Cartographic.fromRadians(a.west,d,e,Q),M=j.Cartographic.fromRadians(a.west,a.south,e,$),m=j.Cartographic.fromRadians(u,a.south,e,aa),f=n.cartographicToCartesian(l,ta),p=n.cartographicToCartesian(h,ea),g=n.cartographicToCartesian(x,na),w=n.cartographicToCartesian(M,ra),y=n.cartographicToCartesian(m,ia),O=C.projectPointToNearestOnPlane(f,sa),b=C.projectPointToNearestOnPlane(p,oa),P=C.projectPointToNearestOnPlane(g,Ca),N=C.projectPointToNearestOnPlane(w,ca),A=C.projectPointToNearestOnPlane(y,ua),T=-(i=Math.min(b.x,P.x,N.x)),v=Math.max(b.y,O.y),R=Math.min(N.y,A.y);return h.height=M.height=t,p=n.cartographicToCartesian(h,ea),w=n.cartographicToCartesian(M,ra),k=Math.min(Z.Plane.getPointDistance(c,p),Z.Plane.getPointDistance(c,w)),W=e,F(C.origin,C.xAxis,C.yAxis,C.zAxis,i,T,R,v,k,W,r)}var I=0<a.south,E=a.north<0,L=I?a.south:E?a.north:0,z=j.Rectangle.center(a,Y).longitude,S=j.Cartesian3.fromRadians(z,L,e,n,da);S.z=0;var U=Math.abs(S.x)<X.CesiumMath.EPSILON10&&Math.abs(S.y)<X.CesiumMath.EPSILON10?j.Cartesian3.UNIT_X:j.Cartesian3.normalize(S,la),V=j.Cartesian3.UNIT_Z,B=j.Cartesian3.cross(U,V,ha);c=Z.Plane.fromPointNormal(S,U,ga);var _=j.Cartesian3.fromRadians(z+X.CesiumMath.PI_OVER_TWO,L,e,n,xa);i=-(T=j.Cartesian3.dot(Z.Plane.projectPointOntoPlane(c,_,Ma),B)),v=j.Cartesian3.fromRadians(0,a.north,E?t:e,n,ma).z,R=j.Cartesian3.fromRadians(0,a.south,I?t:e,n,fa).z;var k,W,D=j.Cartesian3.fromRadians(a.east,L,e,n,pa);return F(S,B,V,U,i,T,R,v,k=Z.Plane.getPointDistance(c,D),W=0,r)},v.clone=function(a,t){if(q.defined(a))return q.defined(t)?(j.Cartesian3.clone(a.center,t.center),T.Matrix3.clone(a.halfAxes,t.halfAxes),t):new v(a.center,a.halfAxes)},v.intersectPlane=function(a,t){var e=a.center,n=t.normal,r=a.halfAxes,i=n.x,s=n.y,o=n.z,C=Math.abs(i*r[T.Matrix3.COLUMN0ROW0]+s*r[T.Matrix3.COLUMN0ROW1]+o*r[T.Matrix3.COLUMN0ROW2])+Math.abs(i*r[T.Matrix3.COLUMN1ROW0]+s*r[T.Matrix3.COLUMN1ROW1]+o*r[T.Matrix3.COLUMN1ROW2])+Math.abs(i*r[T.Matrix3.COLUMN2ROW0]+s*r[T.Matrix3.COLUMN2ROW1]+o*r[T.Matrix3.COLUMN2ROW2]),c=j.Cartesian3.dot(n,e)+t.distance;return c<=-C?T.Intersect.OUTSIDE:C<=c?T.Intersect.INSIDE:T.Intersect.INTERSECTING};var x=new j.Cartesian3,f=new j.Cartesian3,p=new j.Cartesian3,h=new j.Cartesian3;v.distanceSquaredTo=function(a,t){var e=j.Cartesian3.subtract(t,a.center,M),n=a.halfAxes,r=T.Matrix3.getColumn(n,0,x),i=T.Matrix3.getColumn(n,1,f),s=T.Matrix3.getColumn(n,2,p),o=j.Cartesian3.magnitude(r),C=j.Cartesian3.magnitude(i),c=j.Cartesian3.magnitude(s);j.Cartesian3.normalize(r,r),j.Cartesian3.normalize(i,i),j.Cartesian3.normalize(s,s);var u=h;u.x=j.Cartesian3.dot(e,r),u.y=j.Cartesian3.dot(e,i),u.z=j.Cartesian3.dot(e,s);var d,l=0;return u.x<-o?l+=(d=u.x+o)*d:u.x>o&&(l+=(d=u.x-o)*d),u.y<-C?l+=(d=u.y+C)*d:u.y>C&&(l+=(d=u.y-C)*d),u.z<-c?l+=(d=u.z+c)*d:u.z>c&&(l+=(d=u.z-c)*d),l};var g=new j.Cartesian3,w=new j.Cartesian3;v.computePlaneDistances=function(a,t,e,n){q.defined(n)||(n=new T.Interval);var r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,s=a.center,o=a.halfAxes,C=T.Matrix3.getColumn(o,0,x),c=T.Matrix3.getColumn(o,1,f),u=T.Matrix3.getColumn(o,2,p),d=j.Cartesian3.add(C,c,g);j.Cartesian3.add(d,u,d),j.Cartesian3.add(d,s,d);var l=j.Cartesian3.subtract(d,t,w),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i);return j.Cartesian3.add(s,C,d),j.Cartesian3.add(d,c,d),j.Cartesian3.subtract(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),j.Cartesian3.add(s,C,d),j.Cartesian3.subtract(d,c,d),j.Cartesian3.add(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),j.Cartesian3.add(s,C,d),j.Cartesian3.subtract(d,c,d),j.Cartesian3.subtract(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),j.Cartesian3.subtract(s,C,d),j.Cartesian3.add(d,c,d),j.Cartesian3.add(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),j.Cartesian3.subtract(s,C,d),j.Cartesian3.add(d,c,d),j.Cartesian3.subtract(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),j.Cartesian3.subtract(s,C,d),j.Cartesian3.subtract(d,c,d),j.Cartesian3.add(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),j.Cartesian3.subtract(s,C,d),j.Cartesian3.subtract(d,c,d),j.Cartesian3.subtract(d,u,d),j.Cartesian3.subtract(d,t,l),h=j.Cartesian3.dot(e,l),r=Math.min(h,r),i=Math.max(h,i),n.start=r,n.stop=i,n};var n=new T.BoundingSphere;v.isOccluded=function(a,t){var e=T.BoundingSphere.fromOrientedBoundingBox(a,n);return!t.isBoundingSphereVisible(e)},v.prototype.intersectPlane=function(a){return v.intersectPlane(this,a)},v.prototype.distanceSquaredTo=function(a){return v.distanceSquaredTo(this,a)},v.prototype.computePlaneDistances=function(a,t,e){return v.computePlaneDistances(this,a,t,e)},v.prototype.isOccluded=function(a){return v.isOccluded(this,a)},v.equals=function(a,t){return a===t||q.defined(a)&&q.defined(t)&&j.Cartesian3.equals(a.center,t.center)&&T.Matrix3.equals(a.halfAxes,t.halfAxes)},v.prototype.clone=function(a){return v.clone(this,a)},v.prototype.equals=function(a){return v.equals(this,a)},a.OrientedBoundingBox=v}); diff --git a/web/assets/Cesium/Workers/Plane-231f1723.js b/web/assets/Cesium/Workers/Plane-231f1723.js new file mode 100644 index 00000000..aafb8e2b --- /dev/null +++ b/web/assets/Cesium/Workers/Plane-231f1723.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304"],function(n,i,e,a,o,t){"use strict";function s(n,e){this.normal=o.Cartesian3.clone(n),this.distance=e}s.fromPointNormal=function(n,e,a){var t=-o.Cartesian3.dot(e,n);return i.defined(a)?(o.Cartesian3.clone(e,a.normal),a.distance=t,a):new s(e,t)};var r=new o.Cartesian3;s.fromCartesian4=function(n,e){var a=o.Cartesian3.fromCartesian4(n,r),t=n.w;return i.defined(e)?(o.Cartesian3.clone(a,e.normal),e.distance=t,e):new s(a,t)},s.getPointDistance=function(n,e){return o.Cartesian3.dot(n.normal,e)+n.distance};var c=new o.Cartesian3;s.projectPointOntoPlane=function(n,e,a){i.defined(a)||(a=new o.Cartesian3);var t=s.getPointDistance(n,e),r=o.Cartesian3.multiplyByScalar(n.normal,t,c);return o.Cartesian3.subtract(e,r,a)};var l=new o.Cartesian3;s.transform=function(n,e,a){return t.Matrix4.multiplyByPointAsVector(e,n.normal,r),o.Cartesian3.normalize(r,r),o.Cartesian3.multiplyByScalar(n.normal,-n.distance,l),t.Matrix4.multiplyByPoint(e,l,l),s.fromPointNormal(l,r,a)},s.clone=function(n,e){return i.defined(e)?(o.Cartesian3.clone(n.normal,e.normal),e.distance=n.distance,e):new s(n.normal,n.distance)},s.equals=function(n,e){return n.distance===e.distance&&o.Cartesian3.equals(n.normal,e.normal)},s.ORIGIN_XY_PLANE=Object.freeze(new s(o.Cartesian3.UNIT_Z,0)),s.ORIGIN_YZ_PLANE=Object.freeze(new s(o.Cartesian3.UNIT_X,0)),s.ORIGIN_ZX_PLANE=Object.freeze(new s(o.Cartesian3.UNIT_Y,0)),n.Plane=s}); diff --git a/web/assets/Cesium/Workers/PolygonGeometryLibrary-29b9a52e.js b/web/assets/Cesium/Workers/PolygonGeometryLibrary-29b9a52e.js new file mode 100644 index 00000000..84edf42f --- /dev/null +++ b/web/assets/Cesium/Workers/PolygonGeometryLibrary-29b9a52e.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./GeometryPipeline-b49b2e59","./IndexDatatype-53503fee","./arrayRemoveDuplicates-ebc732b0","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47"],function(e,I,x,E,y,A,P,_,d,G,L,M,v,D){"use strict";function S(){this._array=[],this._offset=0,this._length=0}Object.defineProperties(S.prototype,{length:{get:function(){return this._length}}}),S.prototype.enqueue=function(e){this._array.push(e),this._length++},S.prototype.dequeue=function(){if(0!==this._length){var e=this._array,t=this._offset,r=e[t];return e[t]=void 0,10<++t&&2*t>e.length&&(this._array=e.slice(t),t=0),this._offset=t,this._length--,r}},S.prototype.peek=function(){if(0!==this._length)return this._array[this._offset]},S.prototype.contains=function(e){return-1!==this._array.indexOf(e)},S.prototype.clear=function(){this._array.length=this._offset=this._length=0},S.prototype.sort=function(e){0<this._offset&&(this._array=this._array.slice(this._offset),this._offset=0),this._array.sort(e)};var R={computeHierarchyPackedLength:function(e){for(var t=0,r=[e];0<r.length;){var i=r.pop();if(I.defined(i)){t+=2;var n=i.positions,a=i.holes;if(I.defined(n)&&(t+=n.length*E.Cartesian3.packedLength),I.defined(a))for(var o=a.length,s=0;s<o;++s)r.push(a[s])}}return t},packPolygonHierarchy:function(e,t,r){for(var i=[e];0<i.length;){var n=i.pop();if(I.defined(n)){var a=n.positions,o=n.holes;if(t[r++]=I.defined(a)?a.length:0,t[r++]=I.defined(o)?o.length:0,I.defined(a))for(var s=a.length,u=0;u<s;++u,r+=3)E.Cartesian3.pack(a[u],t,r);if(I.defined(o))for(var l=o.length,h=0;h<l;++h)i.push(o[h])}}return r},unpackPolygonHierarchy:function(e,t){for(var r=e[t++],i=e[t++],n=new Array(r),a=0<i?new Array(i):void 0,o=0;o<r;++o,t+=E.Cartesian3.packedLength)n[o]=E.Cartesian3.unpack(e,t);for(var s=0;s<i;++s)a[s]=R.unpackPolygonHierarchy(e,t),t=a[s].startingIndex,delete a[s].startingIndex;return{positions:n,holes:a,startingIndex:t}}},g=new E.Cartesian3;R.subdivideLineCount=function(e,t,r){var i=E.Cartesian3.distance(e,t)/r,n=Math.max(0,Math.ceil(x.CesiumMath.log2(i)));return Math.pow(2,n)};var m=new E.Cartographic,C=new E.Cartographic,b=new E.Cartographic,w=new E.Cartesian3;R.subdivideRhumbLineCount=function(e,t,r,i){var n=e.cartesianToCartographic(t,m),a=e.cartesianToCartographic(r,C),o=new v.EllipsoidRhumbLine(n,a,e).surfaceDistance/i,s=Math.max(0,Math.ceil(x.CesiumMath.log2(o)));return Math.pow(2,s)},R.subdivideLine=function(e,t,r,i){var n=R.subdivideLineCount(e,t,r),a=E.Cartesian3.distance(e,t),o=a/n;I.defined(i)||(i=[]);var s=i;s.length=3*n;for(var u,l,h,c,f=0,p=0;p<n;p++){var d=(u=e,l=t,h=p*o,c=a,E.Cartesian3.subtract(l,u,g),E.Cartesian3.multiplyByScalar(g,h/c,g),E.Cartesian3.add(u,g,g),[g.x,g.y,g.z]);s[f++]=d[0],s[f++]=d[1],s[f++]=d[2]}return s},R.subdivideRhumbLine=function(e,t,r,i,n){var a=e.cartesianToCartographic(t,m),o=e.cartesianToCartographic(r,C),s=new v.EllipsoidRhumbLine(a,o,e),u=s.surfaceDistance/i,l=Math.max(0,Math.ceil(x.CesiumMath.log2(u))),h=Math.pow(2,l),c=s.surfaceDistance/h;I.defined(n)||(n=[]);var f=n;f.length=3*h;for(var p=0,d=0;d<h;d++){var y=s.interpolateUsingSurfaceDistance(d*c,b),g=e.cartographicToCartesian(y,w);f[p++]=g.x,f[p++]=g.y,f[p++]=g.z}return f};var f=new E.Cartesian3,p=new E.Cartesian3,T=new E.Cartesian3,N=new E.Cartesian3;R.scaleToGeodeticHeightExtruded=function(e,t,r,i,n){i=I.defaultValue(i,E.Ellipsoid.WGS84);var a=f,o=p,s=T,u=N;if(I.defined(e)&&I.defined(e.attributes)&&I.defined(e.attributes.position))for(var l=e.attributes.position.values,h=l.length/2,c=0;c<h;c+=3)E.Cartesian3.fromArray(l,c,s),i.geodeticSurfaceNormal(s,a),u=i.scaleToGeodeticSurface(s,u),o=E.Cartesian3.multiplyByScalar(a,r,o),o=E.Cartesian3.add(u,o,o),l[c+h]=o.x,l[c+1+h]=o.y,l[c+2+h]=o.z,n&&(u=E.Cartesian3.clone(s,u)),o=E.Cartesian3.multiplyByScalar(a,t,o),o=E.Cartesian3.add(u,o,o),l[c]=o.x,l[c+1]=o.y,l[c+2]=o.z;return e},R.polygonOutlinesFromHierarchy=function(e,t,r){var i,n,a=[],o=new S;for(o.enqueue(e);0!==o.length;){var s=o.dequeue(),u=s.positions;if(t)for(n=u.length,h=0;h<n;h++)r.scaleToGeodeticSurface(u[h],u[h]);if(!((u=L.arrayRemoveDuplicates(u,E.Cartesian3.equalsEpsilon,!0)).length<3)){for(var l=s.holes?s.holes.length:0,h=0;h<l;h++){var c=s.holes[h],f=c.positions;if(t)for(n=f.length,i=0;i<n;++i)r.scaleToGeodeticSurface(f[i],f[i]);if(!((f=L.arrayRemoveDuplicates(f,E.Cartesian3.equalsEpsilon,!0)).length<3)){a.push(f);var p=0;for(I.defined(c.holes)&&(p=c.holes.length),i=0;i<p;i++)o.enqueue(c.holes[i])}}a.push(u)}}return a},R.polygonsFromHierarchy=function(e,t,r,i){var n=[],a=[],o=new S;for(o.enqueue(e);0!==o.length;){var s,u=o.dequeue(),l=u.positions,h=u.holes;if(r)for(s=l.length,m=0;m<s;m++)i.scaleToGeodeticSurface(l[m],l[m]);if(!((l=L.arrayRemoveDuplicates(l,E.Cartesian3.equalsEpsilon,!0)).length<3)){var c=t(l);if(I.defined(c)){var f=[],p=D.PolygonPipeline.computeWindingOrder2D(c);p===D.WindingOrder.CLOCKWISE&&(c.reverse(),l=l.slice().reverse());for(var d,y=l.slice(),g=I.defined(h)?h.length:0,v=[],m=0;m<g;m++){var C=h[m],b=C.positions;if(r)for(s=b.length,d=0;d<s;++d)i.scaleToGeodeticSurface(b[d],b[d]);if(!((b=L.arrayRemoveDuplicates(b,E.Cartesian3.equalsEpsilon,!0)).length<3)){var w=t(b);if(I.defined(w)){D.PolygonPipeline.computeWindingOrder2D(w)===D.WindingOrder.CLOCKWISE&&(w.reverse(),b=b.slice().reverse()),v.push(b),f.push(y.length),y=y.concat(b),c=c.concat(w);var T=0;for(I.defined(C.holes)&&(T=C.holes.length),d=0;d<T;d++)o.enqueue(C.holes[d])}}}n.push({outerRing:l,holes:v}),a.push({positions:y,positions2D:c,holes:f})}}}return{hierarchy:n,polygons:a}};var O=new E.Cartesian2,q=new E.Cartesian3,B=new y.Quaternion,H=new y.Matrix3;R.computeBoundingRectangle=function(e,t,r,i,n){for(var a=y.Quaternion.fromAxisAngle(e,i,B),o=y.Matrix3.fromQuaternion(a,H),s=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,l=Number.POSITIVE_INFINITY,h=Number.NEGATIVE_INFINITY,c=r.length,f=0;f<c;++f){var p=E.Cartesian3.clone(r[f],q);y.Matrix3.multiplyByVector(o,p,p);var d=t(p,O);I.defined(d)&&(s=Math.min(s,d.x),u=Math.max(u,d.x),l=Math.min(l,d.y),h=Math.max(h,d.y))}return n.x=s,n.y=l,n.width=u-s,n.height=h-l,n},R.createGeometryFromPositions=function(e,t,r,i,n,a){var o=D.PolygonPipeline.triangulate(t.positions2D,t.holes);o.length<3&&(o=[0,1,2]);var s=t.positions;if(i){for(var u=s.length,l=new Array(3*u),h=0,c=0;c<u;c++){var f=s[c];l[h++]=f.x,l[h++]=f.y,l[h++]=f.z}var p=new P.Geometry({attributes:{position:new P.GeometryAttribute({componentDatatype:A.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:l})},indices:o,primitiveType:P.PrimitiveType.TRIANGLES});return n.normal?d.GeometryPipeline.computeNormal(p):p}return a===M.ArcType.GEODESIC?D.PolygonPipeline.computeSubdivision(e,s,o,r):a===M.ArcType.RHUMB?D.PolygonPipeline.computeRhumbLineSubdivision(e,s,o,r):void 0};var k=[],z=new E.Cartesian3,W=new E.Cartesian3;R.computeWallGeometry=function(e,t,r,i,n){var a,o,s,u=e.length,l=0;if(i)for(o=3*u*2,a=new Array(2*o),s=0;s<u;s++)p=e[s],d=e[(s+1)%u],a[l]=a[l+o]=p.x,a[++l]=a[l+o]=p.y,a[++l]=a[l+o]=p.z,a[++l]=a[l+o]=d.x,a[++l]=a[l+o]=d.y,a[++l]=a[l+o]=d.z,++l;else{var h=x.CesiumMath.chordLength(r,t.maximumRadius),c=0;if(n===M.ArcType.GEODESIC)for(s=0;s<u;s++)c+=R.subdivideLineCount(e[s],e[(s+1)%u],h);else if(n===M.ArcType.RHUMB)for(s=0;s<u;s++)c+=R.subdivideRhumbLineCount(t,e[s],e[(s+1)%u],h);for(o=3*(c+u),a=new Array(2*o),s=0;s<u;s++){var f,p=e[s],d=e[(s+1)%u];n===M.ArcType.GEODESIC?f=R.subdivideLine(p,d,h,k):n===M.ArcType.RHUMB&&(f=R.subdivideRhumbLine(t,p,d,h,k));for(var y=f.length,g=0;g<y;++g,++l)a[l]=f[g],a[l+o]=f[g];a[l]=d.x,a[l+o]=d.x,a[++l]=d.y,a[l+o]=d.y,a[++l]=d.z,a[l+o]=d.z,++l}}u=a.length;var v=G.IndexDatatype.createTypedArray(u/3,u-6*e.length),m=0;for(u/=6,s=0;s<u;s++){var C=s,b=C+1,w=C+u,T=w+1;p=E.Cartesian3.fromArray(a,3*C,z),d=E.Cartesian3.fromArray(a,3*b,W),E.Cartesian3.equalsEpsilon(p,d,x.CesiumMath.EPSILON10,x.CesiumMath.EPSILON10)||(v[m++]=C,v[m++]=w,v[m++]=b,v[m++]=b,v[m++]=w,v[m++]=T)}return new P.Geometry({attributes:new _.GeometryAttributes({position:new P.GeometryAttribute({componentDatatype:A.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:a})}),indices:v,primitiveType:P.PrimitiveType.TRIANGLES})},e.PolygonGeometryLibrary=R}); diff --git a/web/assets/Cesium/Workers/PolygonPipeline-ff364b47.js b/web/assets/Cesium/Workers/PolygonPipeline-ff364b47.js new file mode 100644 index 00000000..e6c2e1ed --- /dev/null +++ b/web/assets/Cesium/Workers/PolygonPipeline-ff364b47.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./EllipsoidRhumbLine-c704bf4c"],function(e,T,t,W,P,n,I,B,N){"use strict";function r(e,t,n){n=n||2;var r,a,i,x,u,o,s,p=t&&t.length,h=p?t[0]*n:e.length,f=l(e,0,h,n,!0),y=[];if(!f||f.next===f.prev)return y;if(p&&(f=function(e,t,n,r){var a,i,x,u,o,s=[];for(a=0,i=t.length;a<i;a++)x=t[a]*r,u=a<i-1?t[a+1]*r:e.length,(o=l(e,x,u,r,!1))===o.next&&(o.steiner=!0),s.push(function(e){var t=e,n=e;for(;(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next,t!==e;);return n}(o));for(s.sort(m),a=0;a<s.length;a++)!function(e,t){{var n;(t=function(e,t){var n,r=t,a=e.x,i=e.y,x=-1/0;do{if(i<=r.y&&i>=r.next.y&&r.next.y!==r.y){var u=r.x+(i-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(u<=a&&x<u){if((x=u)===a){if(i===r.y)return r;if(i===r.next.y)return r.next}n=r.x<r.next.x?r:r.next}}r=r.next}while(r!==t);if(!n)return null;if(a===x)return n;var o,s=n,p=n.x,h=n.y,f=1/0;r=n;for(;a>=r.x&&r.x>=p&&a!==r.x&&g(i<h?a:x,i,p,h,i<h?x:a,i,r.x,r.y)&&(o=Math.abs(i-r.y)/(a-r.x),w(r,e)&&(o<f||o===f&&(r.x>n.x||r.x===n.x&&function(e,t){return b(e.prev,e,t.prev)<0&&b(t.next,e,e.next)<0}(n,r)))&&(n=r,f=o)),r=r.next,r!==s;);return n}(e,t))&&c(n=E(t,e),n.next)}}(s[a],n),n=c(n,n.next);return n}(e,t,f,n)),e.length>80*n){r=i=e[0],a=x=e[1];for(var v=n;v<h;v+=n)(u=e[v])<r&&(r=u),(o=e[v+1])<a&&(a=o),i<u&&(i=u),x<o&&(x=o);s=0!==(s=Math.max(i-r,x-a))?1/s:0}return d(f,y,n,r,a,s),y}function l(e,t,n,r,a){var i,x;if(a===0<M(e,t,n,r))for(i=t;i<n;i+=r)x=u(i,e[i],e[i+1],x);else for(i=n-r;t<=i;i-=r)x=u(i,e[i],e[i+1],x);return x&&p(x,x.next)&&(f(x),x=x.next),x}function c(e,t){if(!e)return e;t=t||e;var n,r=e;do{if(n=!1,r.steiner||!p(r,r.next)&&0!==b(r.prev,r,r.next))r=r.next;else{if(f(r),(r=t=r.prev)===r.next)break;n=!0}}while(n||r!==t);return t}function d(e,t,n,r,a,i,x){if(e){!x&&i&&function(e,t,n,r){var a=e;for(;null===a.z&&(a.z=C(a.x,a.y,t,n,r)),a.prevZ=a.prev,a.nextZ=a.next,a=a.next,a!==e;);a.prevZ.nextZ=null,a.prevZ=null,function(e){var t,n,r,a,i,x,u,o,s=1;do{for(n=e,i=e=null,x=0;n;){for(x++,r=n,t=u=0;t<s&&(u++,r=r.nextZ);t++);for(o=s;0<u||0<o&&r;)0!==u&&(0===o||!r||n.z<=r.z)?(n=(a=n).nextZ,u--):(r=(a=r).nextZ,o--),i?i.nextZ=a:e=a,a.prevZ=i,i=a;n=r}i.nextZ=null,s*=2}while(1<x)}(a)}(e,r,a,i);for(var u,o,s=e;e.prev!==e.next;)if(u=e.prev,o=e.next,i?function(e,t,n,r){var a=e.prev,i=e,x=e.next;if(0<=b(a,i,x))return!1;var u=a.x<i.x?a.x<x.x?a.x:x.x:i.x<x.x?i.x:x.x,o=a.y<i.y?a.y<x.y?a.y:x.y:i.y<x.y?i.y:x.y,s=a.x>i.x?a.x>x.x?a.x:x.x:i.x>x.x?i.x:x.x,p=a.y>i.y?a.y>x.y?a.y:x.y:i.y>x.y?i.y:x.y,h=C(u,o,t,n,r),f=C(s,p,t,n,r),y=e.prevZ,v=e.nextZ;for(;y&&y.z>=h&&v&&v.z<=f;){if(y!==e.prev&&y!==e.next&&g(a.x,a.y,i.x,i.y,x.x,x.y,y.x,y.y)&&0<=b(y.prev,y,y.next))return!1;if(y=y.prevZ,v!==e.prev&&v!==e.next&&g(a.x,a.y,i.x,i.y,x.x,x.y,v.x,v.y)&&0<=b(v.prev,v,v.next))return!1;v=v.nextZ}for(;y&&y.z>=h;){if(y!==e.prev&&y!==e.next&&g(a.x,a.y,i.x,i.y,x.x,x.y,y.x,y.y)&&0<=b(y.prev,y,y.next))return!1;y=y.prevZ}for(;v&&v.z<=f;){if(v!==e.prev&&v!==e.next&&g(a.x,a.y,i.x,i.y,x.x,x.y,v.x,v.y)&&0<=b(v.prev,v,v.next))return!1;v=v.nextZ}return!0}(e,r,a,i):function(e){var t=e.prev,n=e,r=e.next;if(0<=b(t,n,r))return!1;var a=e.next.next;for(;a!==e.prev;){if(g(t.x,t.y,n.x,n.y,r.x,r.y,a.x,a.y)&&0<=b(a.prev,a,a.next))return!1;a=a.next}return!0}(e))t.push(u.i/n),t.push(e.i/n),t.push(o.i/n),f(e),e=o.next,s=o.next;else if((e=o)===s){x?1===x?d(e=function(e,t,n){var r=e;do{var a=r.prev,i=r.next.next;!p(a,i)&&h(a,r,r.next,i)&&w(a,i)&&w(i,a)&&(t.push(a.i/n),t.push(r.i/n),t.push(i.i/n),f(r),f(r.next),r=e=i),r=r.next}while(r!==e);return c(r)}(c(e),t,n),t,n,r,a,i,2):2===x&&function(e,t,n,r,a,i){var x=e;do{for(var u=x.next.next;u!==x.prev;){if(x.i!==u.i&&function(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&h(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}(e,t)&&(w(e,t)&&w(t,e)&&function(e,t){var n=e,r=!1,a=(e.x+t.x)/2,i=(e.y+t.y)/2;for(;n.y>i!=n.next.y>i&&n.next.y!==n.y&&a<(n.next.x-n.x)*(i-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next,n!==e;);return r}(e,t)&&(b(e.prev,e,t.prev)||b(e,t.prev,t))||p(e,t)&&0<b(e.prev,e,e.next)&&0<b(t.prev,t,t.next))}(x,u)){var o=E(x,u);return x=c(x,x.next),o=c(o,o.next),d(x,t,n,r,a,i),d(o,t,n,r,a,i)}u=u.next}x=x.next}while(x!==e)}(e,t,n,r,a,i):d(c(e),t,n,r,a,i,1);break}}}function m(e,t){return e.x-t.x}function C(e,t,n,r,a){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*a)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*a)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function g(e,t,n,r,a,i,x,u){return 0<=(a-x)*(t-u)-(e-x)*(i-u)&&0<=(e-x)*(r-u)-(n-x)*(t-u)&&0<=(n-x)*(i-u)-(a-x)*(r-u)}function b(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function p(e,t){return e.x===t.x&&e.y===t.y}function h(e,t,n,r){var a=s(b(e,t,n)),i=s(b(e,t,r)),x=s(b(n,r,e)),u=s(b(n,r,t));return a!==i&&x!==u||(0===a&&o(e,n,t)||(0===i&&o(e,r,t)||(0===x&&o(n,e,r)||!(0!==u||!o(n,t,r)))))}function o(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function s(e){return 0<e?1:e<0?-1:0}function w(e,t){return b(e.prev,e,e.next)<0?0<=b(e,t,e.next)&&0<=b(e,e.prev,t):b(e,t,e.prev)<0||b(e,e.next,t)<0}function E(e,t){var n=new x(e.i,e.x,e.y),r=new x(t.i,t.x,t.y),a=e.next,i=t.prev;return(e.next=t).prev=e,(n.next=a).prev=n,(r.next=n).prev=r,(i.next=r).prev=i,r}function u(e,t,n,r){var a=new x(e,t,n);return r?(a.next=r.next,(a.prev=r).next.prev=a,r.next=a):(a.prev=a).next=a,a}function f(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function x(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function M(e,t,n,r){for(var a=0,i=t,x=n-r;i<n;i+=r)a+=(e[x]-e[i])*(e[i+1]+e[x+1]),x=i;return a}r.deviation=function(e,t,n,r){var a=t&&t.length,i=a?t[0]*n:e.length,x=Math.abs(M(e,0,i,n));if(a)for(var u=0,o=t.length;u<o;u++){var s=t[u]*n,p=u<o-1?t[u+1]*n:e.length;x-=Math.abs(M(e,s,p,n))}for(var h=0,u=0;u<r.length;u+=3){var f=r[u]*n,y=r[u+1]*n,v=r[u+2]*n;h+=Math.abs((e[f]-e[v])*(e[1+y]-e[1+f])-(e[f]-e[y])*(e[1+v]-e[1+f]))}return 0===x&&0===h?0:Math.abs((h-x)/x)},r.flatten=function(e){for(var t=e[0][0].length,n={vertices:[],holes:[],dimensions:t},r=0,a=0;a<e.length;a++){for(var i=0;i<e[a].length;i++)for(var x=0;x<t;x++)n.vertices.push(e[a][i][x]);0<a&&(r+=e[a-1].length,n.holes.push(r))}return n};var a={CLOCKWISE:n.WebGLConstants.CW,COUNTER_CLOCKWISE:n.WebGLConstants.CCW,validate:function(e){return e===a.CLOCKWISE||e===a.COUNTER_CLOCKWISE}},i=Object.freeze(a),y=new P.Cartesian3,v=new P.Cartesian3,Z={computeArea2D:function(e){for(var t=e.length,n=0,r=t-1,a=0;a<t;r=a++){var i=e[r],x=e[a];n+=i.x*x.y-x.x*i.y}return.5*n},computeWindingOrder2D:function(e){return 0<Z.computeArea2D(e)?i.COUNTER_CLOCKWISE:i.CLOCKWISE},triangulate:function(e,t){return r(P.Cartesian2.packArray(e),t,2)}},U=new P.Cartesian3,_=new P.Cartesian3,K=new P.Cartesian3,L=new P.Cartesian3,D=new P.Cartesian3,G=new P.Cartesian3,V=new P.Cartesian3;Z.computeSubdivision=function(e,t,n,r){r=T.defaultValue(r,W.CesiumMath.RADIANS_PER_DEGREE);for(var a=n.slice(0),i=t.length,x=new Array(3*i),u=0,o=0;o<i;o++){var s=t[o];x[u++]=s.x,x[u++]=s.y,x[u++]=s.z}for(var p=[],h={},f=e.maximumRadius,y=W.CesiumMath.chordLength(r,f),v=y*y;0<a.length;){var l,c,d=a.pop(),m=a.pop(),C=a.pop(),g=P.Cartesian3.fromArray(x,3*C,U),b=P.Cartesian3.fromArray(x,3*m,_),w=P.Cartesian3.fromArray(x,3*d,K),E=P.Cartesian3.multiplyByScalar(P.Cartesian3.normalize(g,L),f,L),M=P.Cartesian3.multiplyByScalar(P.Cartesian3.normalize(b,D),f,D),Z=P.Cartesian3.multiplyByScalar(P.Cartesian3.normalize(w,G),f,G),S=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(E,M,V)),A=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(M,Z,V)),z=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(Z,E,V)),R=Math.max(S,A,z);v<R?S===R?(o=h[l=Math.min(C,m)+" "+Math.max(C,m)],T.defined(o)||(c=P.Cartesian3.add(g,b,V),P.Cartesian3.multiplyByScalar(c,.5,c),x.push(c.x,c.y,c.z),o=x.length/3-1,h[l]=o),a.push(C,o,d),a.push(o,m,d)):A===R?(o=h[l=Math.min(m,d)+" "+Math.max(m,d)],T.defined(o)||(c=P.Cartesian3.add(b,w,V),P.Cartesian3.multiplyByScalar(c,.5,c),x.push(c.x,c.y,c.z),o=x.length/3-1,h[l]=o),a.push(m,o,C),a.push(o,d,C)):z===R&&(o=h[l=Math.min(d,C)+" "+Math.max(d,C)],T.defined(o)||(c=P.Cartesian3.add(w,g,V),P.Cartesian3.multiplyByScalar(c,.5,c),x.push(c.x,c.y,c.z),o=x.length/3-1,h[l]=o),a.push(d,o,m),a.push(o,C,m)):(p.push(C),p.push(m),p.push(d))}return new B.Geometry({attributes:{position:new B.GeometryAttribute({componentDatatype:I.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:x})},indices:p,primitiveType:B.PrimitiveType.TRIANGLES})};var k=new P.Cartographic,q=new P.Cartographic,F=new P.Cartographic,j=new P.Cartographic;Z.computeRhumbLineSubdivision=function(e,t,n,r){r=T.defaultValue(r,W.CesiumMath.RADIANS_PER_DEGREE);for(var a=n.slice(0),i=t.length,x=new Array(3*i),u=0,o=0;o<i;o++){var s=t[o];x[u++]=s.x,x[u++]=s.y,x[u++]=s.z}for(var p=[],h={},f=e.maximumRadius,y=W.CesiumMath.chordLength(r,f),v=new N.EllipsoidRhumbLine(void 0,void 0,e),l=new N.EllipsoidRhumbLine(void 0,void 0,e),c=new N.EllipsoidRhumbLine(void 0,void 0,e);0<a.length;){var d=a.pop(),m=a.pop(),C=a.pop(),g=P.Cartesian3.fromArray(x,3*C,U),b=P.Cartesian3.fromArray(x,3*m,_),w=P.Cartesian3.fromArray(x,3*d,K),E=e.cartesianToCartographic(g,k),M=e.cartesianToCartographic(b,q),Z=e.cartesianToCartographic(w,F);v.setEndPoints(E,M);var S=v.surfaceDistance;l.setEndPoints(M,Z);var A=l.surfaceDistance;c.setEndPoints(Z,E);var z,R,L,D,G=c.surfaceDistance,O=Math.max(S,A,G);y<O?S===O?(o=h[z=Math.min(C,m)+" "+Math.max(C,m)],T.defined(o)||(R=v.interpolateUsingFraction(.5,j),L=.5*(E.height+M.height),D=P.Cartesian3.fromRadians(R.longitude,R.latitude,L,e,V),x.push(D.x,D.y,D.z),o=x.length/3-1,h[z]=o),a.push(C,o,d),a.push(o,m,d)):A===O?(o=h[z=Math.min(m,d)+" "+Math.max(m,d)],T.defined(o)||(R=l.interpolateUsingFraction(.5,j),L=.5*(M.height+Z.height),D=P.Cartesian3.fromRadians(R.longitude,R.latitude,L,e,V),x.push(D.x,D.y,D.z),o=x.length/3-1,h[z]=o),a.push(m,o,C),a.push(o,d,C)):G===O&&(o=h[z=Math.min(d,C)+" "+Math.max(d,C)],T.defined(o)||(R=c.interpolateUsingFraction(.5,j),L=.5*(Z.height+E.height),D=P.Cartesian3.fromRadians(R.longitude,R.latitude,L,e,V),x.push(D.x,D.y,D.z),o=x.length/3-1,h[z]=o),a.push(d,o,m),a.push(o,C,m)):(p.push(C),p.push(m),p.push(d))}return new B.Geometry({attributes:{position:new B.GeometryAttribute({componentDatatype:I.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:x})},indices:p,primitiveType:B.PrimitiveType.TRIANGLES})},Z.scaleToGeodeticHeight=function(e,t,n,r){n=T.defaultValue(n,P.Ellipsoid.WGS84);var a=y,i=v;if(t=T.defaultValue(t,0),r=T.defaultValue(r,!0),T.defined(e))for(var x=e.length,u=0;u<x;u+=3)P.Cartesian3.fromArray(e,u,i),r&&(i=n.scaleToGeodeticSurface(i,i)),0!==t&&(a=n.geodeticSurfaceNormal(i,a),P.Cartesian3.multiplyByScalar(a,t,a),P.Cartesian3.add(i,a,i)),e[u]=i.x,e[u+1]=i.y,e[u+2]=i.z;return e},e.PolygonPipeline=Z,e.WindingOrder=i}); diff --git a/web/assets/Cesium/Workers/PolylinePipeline-8a1a1e4f.js b/web/assets/Cesium/Workers/PolylinePipeline-8a1a1e4f.js new file mode 100644 index 00000000..5b6be1ce --- /dev/null +++ b/web/assets/Cesium/Workers/PolylinePipeline-8a1a1e4f.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./IntersectionTests-2626c9e9","./Plane-231f1723","./EllipsoidRhumbLine-c704bf4c","./EllipsoidGeodesic-30fae80b"],function(a,w,e,P,T,v,m,y,A,r){"use strict";var b={numberOfPoints:function(a,e,r){var t=T.Cartesian3.distance(a,e);return Math.ceil(t/r)},numberOfPointsRhumbLine:function(a,e,r){var t=Math.pow(a.longitude-e.longitude,2)+Math.pow(a.latitude-e.latitude,2);return Math.max(1,Math.ceil(Math.sqrt(t/(r*r))))}},o=new T.Cartographic;b.extractHeights=function(a,e){for(var r=a.length,t=new Array(r),n=0;n<r;n++){var i=a[n];t[n]=e.cartesianToCartographic(i,o).height}return t};var E=new v.Matrix4,R=new T.Cartesian3,M=new T.Cartesian3,S=new y.Plane(T.Cartesian3.UNIT_X,0),D=new T.Cartesian3,x=new y.Plane(T.Cartesian3.UNIT_X,0),N=new T.Cartesian3,G=new T.Cartesian3,I=[];function k(a,e,r){var t=I;if(t.length=a,e===r){for(i=0;i<a;i++)t[i]=e;return t}for(var n=(r-e)/a,i=0;i<a;i++){var o=e+i*n;t[i]=o}return t}var V=new T.Cartographic,L=new T.Cartographic,_=new T.Cartesian3,O=new T.Cartesian3,B=new T.Cartesian3,U=new r.EllipsoidGeodesic,z=new A.EllipsoidRhumbLine;b.wrapLongitude=function(a,e){var r=[],t=[];if(w.defined(a)&&0<a.length){e=w.defaultValue(e,v.Matrix4.IDENTITY);var n=v.Matrix4.inverseTransformation(e,E),i=v.Matrix4.multiplyByPoint(n,T.Cartesian3.ZERO,R),o=T.Cartesian3.normalize(v.Matrix4.multiplyByPointAsVector(n,T.Cartesian3.UNIT_Y,M),M),s=y.Plane.fromPointNormal(i,o,S),c=T.Cartesian3.normalize(v.Matrix4.multiplyByPointAsVector(n,T.Cartesian3.UNIT_X,D),D),l=y.Plane.fromPointNormal(i,c,x),u=1;r.push(T.Cartesian3.clone(a[0]));for(var h=r[0],f=a.length,g=1;g<f;++g){var C,p,d=a[g];(y.Plane.getPointDistance(l,h)<0||y.Plane.getPointDistance(l,d)<0)&&(C=m.IntersectionTests.lineSegmentPlane(h,d,s,N),w.defined(C)&&(p=T.Cartesian3.multiplyByScalar(o,5e-9,G),y.Plane.getPointDistance(s,h)<0&&T.Cartesian3.negate(p,p),r.push(T.Cartesian3.add(C,p,new T.Cartesian3)),t.push(u+1),T.Cartesian3.negate(p,p),r.push(T.Cartesian3.add(C,p,new T.Cartesian3)),u=1)),r.push(T.Cartesian3.clone(a[g])),u++,h=d}t.push(u)}return{positions:r,lengths:t}},b.generateArc=function(a){w.defined(a)||(a={});var e=a.positions,r=e.length,t=w.defaultValue(a.ellipsoid,T.Ellipsoid.WGS84),n=w.defaultValue(a.height,0),i=Array.isArray(n);if(r<1)return[];if(1===r){var o,s=t.scaleToGeodeticSurface(e[0],O);return 0!==(n=i?n[0]:n)&&(o=t.geodeticSurfaceNormal(s,_),T.Cartesian3.multiplyByScalar(o,n,o),T.Cartesian3.add(s,o,s)),[s.x,s.y,s.z]}var c,l=a.minDistance;w.defined(l)||(c=w.defaultValue(a.granularity,P.CesiumMath.RADIANS_PER_DEGREE),l=P.CesiumMath.chordLength(c,t.maximumRadius));for(var u=0,h=0;h<r-1;h++)u+=b.numberOfPoints(e[h],e[h+1],l);var f=3*(u+1),g=new Array(f),C=0;for(h=0;h<r-1;h++)C=function(a,e,r,t,n,i,o,s){var c=t.scaleToGeodeticSurface(a,O),l=t.scaleToGeodeticSurface(e,B),u=b.numberOfPoints(a,e,r),h=t.cartesianToCartographic(c,V),f=t.cartesianToCartographic(l,L),g=k(u,n,i);U.setEndPoints(h,f);var C=U.surfaceDistance/u,p=s;h.height=n;var d=t.cartographicToCartesian(h,_);T.Cartesian3.pack(d,o,p),p+=3;for(var v=1;v<u;v++){var m=U.interpolateUsingSurfaceDistance(v*C,L);m.height=g[v],d=t.cartographicToCartesian(m,_),T.Cartesian3.pack(d,o,p),p+=3}return p}(e[h],e[h+1],l,t,i?n[h]:n,i?n[h+1]:n,g,C);I.length=0;var p=e[r-1],d=t.cartesianToCartographic(p,V);d.height=i?n[r-1]:n;var v=t.cartographicToCartesian(d,_);return T.Cartesian3.pack(v,g,f-3),g};var X=new T.Cartographic,q=new T.Cartographic;b.generateRhumbArc=function(a){w.defined(a)||(a={});var e=a.positions,r=e.length,t=w.defaultValue(a.ellipsoid,T.Ellipsoid.WGS84),n=w.defaultValue(a.height,0),i=Array.isArray(n);if(r<1)return[];if(1===r){var o,s=t.scaleToGeodeticSurface(e[0],O);return 0!==(n=i?n[0]:n)&&(o=t.geodeticSurfaceNormal(s,_),T.Cartesian3.multiplyByScalar(o,n,o),T.Cartesian3.add(s,o,s)),[s.x,s.y,s.z]}for(var c,l=w.defaultValue(a.granularity,P.CesiumMath.RADIANS_PER_DEGREE),u=0,h=t.cartesianToCartographic(e[0],X),f=0;f<r-1;f++)c=t.cartesianToCartographic(e[f+1],q),u+=b.numberOfPointsRhumbLine(h,c,l),h=T.Cartographic.clone(c,X);var g=3*(u+1),C=new Array(g),p=0;for(f=0;f<r-1;f++)p=function(a,e,r,t,n,i,o,s){var c=t.cartesianToCartographic(a,V),l=t.cartesianToCartographic(e,L),u=b.numberOfPointsRhumbLine(c,l,r);c.height=0,l.height=0;var h=k(u,n,i);z.ellipsoid.equals(t)||(z=new A.EllipsoidRhumbLine(void 0,void 0,t)),z.setEndPoints(c,l);var f=z.surfaceDistance/u,g=s;c.height=n;var C=t.cartographicToCartesian(c,_);T.Cartesian3.pack(C,o,g),g+=3;for(var p=1;p<u;p++){var d=z.interpolateUsingSurfaceDistance(p*f,L);d.height=h[p],C=t.cartographicToCartesian(d,_),T.Cartesian3.pack(C,o,g),g+=3}return g}(e[f],e[f+1],l,t,i?n[f]:n,i?n[f+1]:n,C,p);I.length=0;var d=e[r-1],v=t.cartesianToCartographic(d,V);v.height=i?n[r-1]:n;var m=t.cartographicToCartesian(v,_);return T.Cartesian3.pack(m,C,g-3),C},b.generateCartesianArc=function(a){for(var e=b.generateArc(a),r=e.length/3,t=new Array(r),n=0;n<r;n++)t[n]=T.Cartesian3.unpack(e,3*n);return t},b.generateCartesianRhumbArc=function(a){for(var e=b.generateRhumbArc(a),r=e.length/3,t=new Array(r),n=0;n<r;n++)t[n]=T.Cartesian3.unpack(e,3*n);return t},a.PolylinePipeline=b}); diff --git a/web/assets/Cesium/Workers/PolylineVolumeGeometryLibrary-ec7dce94.js b/web/assets/Cesium/Workers/PolylineVolumeGeometryLibrary-ec7dce94.js new file mode 100644 index 00000000..7dd13c73 --- /dev/null +++ b/web/assets/Cesium/Workers/PolylineVolumeGeometryLibrary-ec7dce94.js @@ -0,0 +1 @@ +define(["exports","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./EllipsoidTangentPlane-ed172748","./PolylinePipeline-8a1a1e4f"],function(a,L,j,P,E,Q){"use strict";var F=Object.freeze({ROUNDED:0,MITERED:1,BEVELED:2}),U=[new j.Cartesian3,new j.Cartesian3],_=new j.Cartesian3,q=new j.Cartesian3,Y=new j.Cartesian3,Z=new j.Cartesian3,k=new j.Cartesian3,H=new j.Cartesian3,J=new j.Cartesian3,K=new j.Cartesian3,W=new j.Cartesian3,X=new j.Cartesian3,p=new j.Cartesian3,$={},aa=new j.Cartographic;function ea(a,e,r,n){var t=a[0],i=a[1],s=j.Cartesian3.angleBetween(t,i),o=Math.ceil(s/n),l=new Array(o);if(e===r){for(c=0;c<o;c++)l[c]=e;return l.push(r),l}for(var C=(r-e)/o,c=1;c<o;c++){var u=e+c*C;l[c]=u}return l[0]=e,l.push(r),l}var M=new j.Cartesian3,T=new j.Cartesian3;var B=new j.Cartesian3(-1,0,0),z=new P.Matrix4,S=new P.Matrix4,A=new P.Matrix3,b=P.Matrix3.IDENTITY.clone(),D=new j.Cartesian3,O=new P.Cartesian4,N=new j.Cartesian3;function ra(a,e,r,n,t,i,s,o){var l=D,C=O;z=P.Transforms.eastNorthUpToFixedFrame(a,t,z),l=P.Matrix4.multiplyByPointAsVector(z,B,l),l=j.Cartesian3.normalize(l,l);var c,u,y,d,m,f,p,g,w=(c=l,u=e,y=a,d=t,m=new E.EllipsoidTangentPlane(y,d),f=m.projectPointOntoPlane(j.Cartesian3.add(y,c,M),M),p=m.projectPointOntoPlane(j.Cartesian3.add(y,u,T),T),g=j.Cartesian2.angleBetween(f,p),0<=p.x*f.y-p.y*f.x?-g:g);A=P.Matrix3.fromRotationZ(w,A),N.z=i,z=P.Matrix4.multiplyTransformation(z,P.Matrix4.fromRotationTranslation(A,N,S),z);var h=b;h[0]=s;for(var v=0;v<o;v++)for(var x=0;x<r.length;x+=3)C=j.Cartesian3.fromArray(r,x,C),C=P.Matrix3.multiplyByVector(h,C,C),C=P.Matrix4.multiplyByPoint(z,C,C),n.push(C.x,C.y,C.z);return n}var l=new j.Cartesian3;function na(a,e,r,n,t,i,s){for(var o=0;o<a.length;o+=3){n=ra(j.Cartesian3.fromArray(a,o,l),e,r,n,t,i[o/3],s,1)}return n}function ta(a,e){for(var r=a.length,n=new Array(3*r),t=0,i=e.x+e.width/2,s=e.y+e.height/2,o=0;o<r;o++)n[t++]=a[o].x-i,n[t++]=0,n[t++]=a[o].y-s;return n}var g=new P.Quaternion,w=new j.Cartesian3,h=new P.Matrix3;function ia(a,e,r,n,t,i,s,o,l,C){var c,u=j.Cartesian3.angleBetween(j.Cartesian3.subtract(e,a,X),j.Cartesian3.subtract(r,a,p)),y=n===F.BEVELED?0:Math.ceil(u/L.CesiumMath.toRadians(5)),d=t?P.Matrix3.fromQuaternion(P.Quaternion.fromAxisAngle(j.Cartesian3.negate(a,X),u/(y+1),g),h):P.Matrix3.fromQuaternion(P.Quaternion.fromAxisAngle(a,u/(y+1),g),h);if(e=j.Cartesian3.clone(e,w),0<y)for(var m=C?2:1,f=0;f<y;f++)e=P.Matrix3.multiplyByVector(d,e,e),c=j.Cartesian3.subtract(e,a,X),c=j.Cartesian3.normalize(c,c),t||(c=j.Cartesian3.negate(c,c)),s=ra(i.scaleToGeodeticSurface(e,p),c,o,s,i,l,1,m);else c=j.Cartesian3.subtract(e,a,X),c=j.Cartesian3.normalize(c,c),t||(c=j.Cartesian3.negate(c,c)),s=ra(i.scaleToGeodeticSurface(e,p),c,o,s,i,l,1,1),r=j.Cartesian3.clone(r,w),c=j.Cartesian3.subtract(r,a,X),c=j.Cartesian3.normalize(c,c),t||(c=j.Cartesian3.negate(c,c)),s=ra(i.scaleToGeodeticSurface(r,p),c,o,s,i,l,1,1);return s}$.removeDuplicatesFromShape=function(a){for(var e=a.length,r=[],n=e-1,t=0;t<e;n=t++){var i=a[n],s=a[t];j.Cartesian2.equals(i,s)||r.push(s)}return r},$.angleIsGreaterThanPi=function(a,e,r,n){var t=new E.EllipsoidTangentPlane(r,n),i=t.projectPointOntoPlane(j.Cartesian3.add(r,a,M),M),s=t.projectPointOntoPlane(j.Cartesian3.add(r,e,T),T);return 0<=s.x*i.y-s.y*i.x};var sa=new j.Cartesian3,oa=new j.Cartesian3;$.computePositions=function(a,e,r,n,t){var i=n._ellipsoid,s=function(a,e){for(var r=new Array(a.length),n=0;n<a.length;n++){var t=a[n];aa=e.cartesianToCartographic(t,aa),r[n]=aa.height,a[n]=e.scaleToGeodeticSurface(t,t)}return r}(a,i),o=n._granularity,l=n._cornerType,C=(t?function(a,e){var r=a.length,n=new Array(6*r),t=0,i=e.x+e.width/2,s=e.y+e.height/2,o=a[0];n[t++]=o.x-i,n[t++]=0,n[t++]=o.y-s;for(var l=1;l<r;l++){var C=(o=a[l]).x-i,c=o.y-s;n[t++]=C,n[t++]=0,n[t++]=c,n[t++]=C,n[t++]=0,n[t++]=c}return o=a[0],n[t++]=o.x-i,n[t++]=0,n[t++]=o.y-s,n}:ta)(e,r),c=t?ta(e,r):void 0,u=r.height/2,y=r.width/2,d=a.length,m=[],f=t?[]:void 0,p=_,g=q,w=Y,h=Z,v=k,x=H,P=J,E=K,M=W,T=a[0],B=a[1],h=i.geodeticSurfaceNormal(T,h);p=j.Cartesian3.subtract(B,T,p),p=j.Cartesian3.normalize(p,p),E=j.Cartesian3.cross(h,p,E),E=j.Cartesian3.normalize(E,E);var z,S=s[0],A=s[1];t&&(f=ra(T,E,c,f,i,S+u,1,1)),M=j.Cartesian3.clone(T,M),T=B,g=j.Cartesian3.negate(p,g);for(var b=1;b<d-1;b++){var D=t?2:1,B=a[b+1],p=j.Cartesian3.subtract(B,T,p);p=j.Cartesian3.normalize(p,p),w=j.Cartesian3.add(p,g,w),w=j.Cartesian3.normalize(w,w),h=i.geodeticSurfaceNormal(T,h);var O=j.Cartesian3.multiplyByScalar(h,j.Cartesian3.dot(p,h),sa);j.Cartesian3.subtract(p,O,O),j.Cartesian3.normalize(O,O);var N,V,G=j.Cartesian3.multiplyByScalar(h,j.Cartesian3.dot(g,h),oa);j.Cartesian3.subtract(g,G,G),j.Cartesian3.normalize(G,G),!L.CesiumMath.equalsEpsilon(Math.abs(j.Cartesian3.dot(O,G)),1,L.CesiumMath.EPSILON7)?(w=j.Cartesian3.cross(w,h,w),w=j.Cartesian3.cross(h,w,w),w=j.Cartesian3.normalize(w,w),N=1/Math.max(.25,j.Cartesian3.magnitude(j.Cartesian3.cross(w,g,X))),(V=$.angleIsGreaterThanPi(p,g,T,i))?(v=j.Cartesian3.add(T,j.Cartesian3.multiplyByScalar(w,N*y,w),v),x=j.Cartesian3.add(v,j.Cartesian3.multiplyByScalar(E,y,x),x),U[0]=j.Cartesian3.clone(M,U[0]),U[1]=j.Cartesian3.clone(x,U[1]),z=ea(U,S+u,A+u,o),m=na(Q.PolylinePipeline.generateArc({positions:U,granularity:o,ellipsoid:i}),E,C,m,i,z,1),E=j.Cartesian3.cross(h,p,E),E=j.Cartesian3.normalize(E,E),P=j.Cartesian3.add(v,j.Cartesian3.multiplyByScalar(E,y,P),P),l===F.ROUNDED||l===F.BEVELED?ia(v,x,P,l,V,i,m,C,A+u,t):m=ra(T,w=j.Cartesian3.negate(w,w),C,m,i,A+u,N,D)):(v=j.Cartesian3.add(T,j.Cartesian3.multiplyByScalar(w,N*y,w),v),x=j.Cartesian3.add(v,j.Cartesian3.multiplyByScalar(E,-y,x),x),U[0]=j.Cartesian3.clone(M,U[0]),U[1]=j.Cartesian3.clone(x,U[1]),z=ea(U,S+u,A+u,o),m=na(Q.PolylinePipeline.generateArc({positions:U,granularity:o,ellipsoid:i}),E,C,m,i,z,1),E=j.Cartesian3.cross(h,p,E),E=j.Cartesian3.normalize(E,E),P=j.Cartesian3.add(v,j.Cartesian3.multiplyByScalar(E,-y,P),P),l===F.ROUNDED||l===F.BEVELED?ia(v,x,P,l,V,i,m,C,A+u,t):m=ra(T,w,C,m,i,A+u,N,D)),M=j.Cartesian3.clone(P,M),g=j.Cartesian3.negate(p,g)):(m=ra(M,E,C,m,i,S+u,1,1),M=T),S=A,A=s[b+1],T=B}U[0]=j.Cartesian3.clone(M,U[0]),U[1]=j.Cartesian3.clone(T,U[1]),z=ea(U,S+u,A+u,o),m=na(Q.PolylinePipeline.generateArc({positions:U,granularity:o,ellipsoid:i}),E,C,m,i,z,1),t&&(f=ra(T,E,c,f,i,A+u,1,1)),d=m.length;var R=t?d+f.length:d,I=new Float64Array(R);return I.set(m),t&&I.set(f,d),I},a.CornerType=F,a.PolylineVolumeGeometryLibrary=$}); diff --git a/web/assets/Cesium/Workers/PrimitivePipeline-bde6ab6f.js b/web/assets/Cesium/Workers/PrimitivePipeline-bde6ab6f.js new file mode 100644 index 00000000..8df1d7fc --- /dev/null +++ b/web/assets/Cesium/Workers/PrimitivePipeline-bde6ab6f.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./GeometryPipeline-b49b2e59","./IndexDatatype-53503fee","./WebMercatorProjection-df58d479"],function(e,v,t,f,P,k,C,w,b,A,c){"use strict";function m(e,t,r){e=v.defaultValue(e,0),t=v.defaultValue(t,0),r=v.defaultValue(r,0),this.value=new Float32Array([e,t,r])}function G(e,t){var r=e.attributes,n=r.position,i=n.values.length/n.componentsPerAttribute;r.batchId=new C.GeometryAttribute({componentDatatype:k.ComponentDatatype.FLOAT,componentsPerAttribute:1,values:new Float32Array(i)});for(var o=r.batchId.values,a=0;a<i;++a)o[a]=t}function x(e){var t,r=e.instances,n=e.projection,i=e.elementIndexUintSupported,o=e.scene3DOnly,a=e.vertexCacheOptimize,s=e.compressVertices,d=e.modelMatrix,p=r.length;for(y=0;y<p;++y)if(v.defined(r[y].geometry)){r[y].geometry.primitiveType;break}if(!function(e,t,r){var n=!r,i=e.length;if(!n&&1<i)for(var o=e[0].modelMatrix,a=1;a<i;++a)if(!P.Matrix4.equals(o,e[a].modelMatrix)){n=!0;break}if(n)for(a=0;a<i;++a)v.defined(e[a].geometry)&&b.GeometryPipeline.transformToWorldCoordinates(e[a]);else P.Matrix4.multiplyTransformation(t,e[0].modelMatrix,t)}(r,d,o),!o)for(y=0;y<p;++y)v.defined(r[y].geometry)&&b.GeometryPipeline.splitLongitude(r[y]);if(!function(e){for(var t=e.length,r=0;r<t;++r){var n=e[r];v.defined(n.geometry)?G(n.geometry,r):v.defined(n.westHemisphereGeometry)&&v.defined(n.eastHemisphereGeometry)&&(G(n.westHemisphereGeometry,r),G(n.eastHemisphereGeometry,r))}}(r),a)for(y=0;y<p;++y){var u=r[y];v.defined(u.geometry)?(b.GeometryPipeline.reorderForPostVertexCache(u.geometry),b.GeometryPipeline.reorderForPreVertexCache(u.geometry)):v.defined(u.westHemisphereGeometry)&&v.defined(u.eastHemisphereGeometry)&&(b.GeometryPipeline.reorderForPostVertexCache(u.westHemisphereGeometry),b.GeometryPipeline.reorderForPreVertexCache(u.westHemisphereGeometry),b.GeometryPipeline.reorderForPostVertexCache(u.eastHemisphereGeometry),b.GeometryPipeline.reorderForPreVertexCache(u.eastHemisphereGeometry))}var f=b.GeometryPipeline.combineInstances(r);for(p=f.length,y=0;y<p;++y){var c,m,h,l=(t=f[y]).attributes;if(o)for(c in l)l.hasOwnProperty(c)&&l[c].componentDatatype===k.ComponentDatatype.DOUBLE&&b.GeometryPipeline.encodeAttribute(t,c,c+"3DHigh",c+"3DLow");else for(c in l){l.hasOwnProperty(c)&&l[c].componentDatatype===k.ComponentDatatype.DOUBLE&&(m=c+"3D",h=c+"2D",b.GeometryPipeline.projectTo2D(t,c,m,h,n),v.defined(t.boundingSphere)&&"position"===c&&(t.boundingSphereCV=P.BoundingSphere.fromVertices(t.attributes.position2D.values)),b.GeometryPipeline.encodeAttribute(t,m,m+"High",m+"Low"),b.GeometryPipeline.encodeAttribute(t,h,h+"High",h+"Low"))}s&&b.GeometryPipeline.compressVertices(t)}if(!i){for(var g=[],p=f.length,y=0;y<p;++y)t=f[y],g=g.concat(b.GeometryPipeline.fitToUnsignedShortIndices(t));f=g}return f}function S(e,t,r,n){var i,o,a,s,d=n.length-1;s=0<=d?(o=(i=n[d]).offset+i.count,r[a=i.index].indices.length):r[a=o=0].indices.length;for(var p=e.length,u=0;u<p;++u){var f,c=e[u][t];v.defined(c)&&(s<o+(f=c.indices.length)&&(o=0,s=r[++a].indices.length),n.push({index:a,offset:o,count:f}),o+=f)}}Object.defineProperties(m.prototype,{componentDatatype:{get:function(){return k.ComponentDatatype.FLOAT}},componentsPerAttribute:{get:function(){return 3}},normalize:{get:function(){return!1}}}),m.fromCartesian3=function(e){return new m(e.x,e.y,e.z)},m.toValue=function(e,t){return v.defined(t)||(t=new Float32Array([e.x,e.y,e.z])),t[0]=e.x,t[1]=e.y,t[2]=e.z,t};var h={};function i(e,t){for(var r=e.length,n=0;n<r;++n)!function(e,t){var r,n=e.attributes;for(var i in n){n.hasOwnProperty(i)&&(r=n[i],v.defined(r)&&v.defined(r.values)&&t.push(r.values.buffer))}v.defined(e.indices)&&t.push(e.indices.buffer)}(e[n],t)}function o(e){var t=e.length,r=1+(P.BoundingSphere.packedLength+1)*t,n=new Float32Array(r),i=0;n[i++]=t;for(var o=0;o<t;++o){var a=e[o];v.defined(a)?(n[i++]=1,P.BoundingSphere.pack(e[o],n,i)):n[i++]=0,i+=P.BoundingSphere.packedLength}return n}function r(e){for(var t=new Array(e[0]),r=0,n=1;n<e.length;)1===e[n++]&&(t[r]=P.BoundingSphere.unpack(e,n)),++r,n+=P.BoundingSphere.packedLength;return t}h.combineGeometry=function(e){var t,r,n,i,o,a,s,d=e.instances,p=d.length,u=!1;0<p&&(0<(t=x(e)).length&&(r=b.GeometryPipeline.createAttributeLocations(t[0]),e.createPickOffsets&&(S(o=d,"geometry",a=t,s=[]),S(o,"westHemisphereGeometry",a,s),S(o,"eastHemisphereGeometry",a,s),n=s)),v.defined(d[0].attributes)&&v.defined(d[0].attributes.offset)&&(i=new Array(p),u=!0));for(var f=new Array(p),c=new Array(p),m=0;m<p;++m){var h=d[m],l=h.geometry;v.defined(l)&&(f[m]=l.boundingSphere,c[m]=l.boundingSphereCV,u&&(i[m]=h.geometry.offsetAttribute));var g=h.eastHemisphereGeometry,y=h.westHemisphereGeometry;v.defined(g)&&v.defined(y)&&(v.defined(g.boundingSphere)&&v.defined(y.boundingSphere)&&(f[m]=P.BoundingSphere.union(g.boundingSphere,y.boundingSphere)),v.defined(g.boundingSphereCV)&&v.defined(y.boundingSphereCV)&&(c[m]=P.BoundingSphere.union(g.boundingSphereCV,y.boundingSphereCV)))}return{geometries:t,modelMatrix:e.modelMatrix,attributeLocations:r,pickOffsets:n,offsetInstanceExtend:i,boundingSpheres:f,boundingSpheresCV:c}},h.packCreateGeometryResults=function(e,t){var r=new Float64Array(function(e){for(var t=1,r=e.length,n=0;n<r;n++){var i=e[n];if(++t,v.defined(i)){var o=i.attributes;for(var a in t+=7+2*P.BoundingSphere.packedLength+(v.defined(i.indices)?i.indices.length:0),o){o.hasOwnProperty(a)&&v.defined(o[a])&&(t+=5+o[a].values.length)}}}return t}(e)),n=[],i={},o=e.length,a=0;r[a++]=o;for(var s=0;s<o;s++){var d=e[s],p=v.defined(d);if(r[a++]=p?1:0,p){r[a++]=d.primitiveType,r[a++]=d.geometryType,r[a++]=v.defaultValue(d.offsetAttribute,-1);var u=v.defined(d.boundingSphere)?1:0;(r[a++]=u)&&P.BoundingSphere.pack(d.boundingSphere,r,a),a+=P.BoundingSphere.packedLength;var f=v.defined(d.boundingSphereCV)?1:0;(r[a++]=f)&&P.BoundingSphere.pack(d.boundingSphereCV,r,a),a+=P.BoundingSphere.packedLength;var c=d.attributes,m=[];for(var h in c)c.hasOwnProperty(h)&&v.defined(c[h])&&(m.push(h),v.defined(i[h])||(i[h]=n.length,n.push(h)));r[a++]=m.length;for(var l=0;l<m.length;l++){var g=m[l],y=c[g];r[a++]=i[g],r[a++]=y.componentDatatype,r[a++]=y.componentsPerAttribute,r[a++]=y.normalize?1:0,r[a++]=y.values.length,r.set(y.values,a),a+=y.values.length}var b=v.defined(d.indices)?d.indices.length:0;0<(r[a++]=b)&&(r.set(d.indices,a),a+=b)}}return t.push(r.buffer),{stringTable:n,packedData:r}},h.unpackCreateGeometryResults=function(e){for(var t=e.stringTable,r=e.packedData,n=new Array(r[0]),i=0,o=1;o<r.length;){if(1===r[o++]){var a,s,d=r[o++],p=r[o++],u=r[o++];-1===u&&(u=void 0),1===r[o++]&&(a=P.BoundingSphere.unpack(r,o)),o+=P.BoundingSphere.packedLength,1===r[o++]&&(s=P.BoundingSphere.unpack(r,o)),o+=P.BoundingSphere.packedLength;var f=new w.GeometryAttributes,c=r[o++];for(S=0;S<c;S++){for(var m=t[r[o++]],h=r[o++],l=r[o++],g=0!==r[o++],y=r[o++],b=k.ComponentDatatype.createTypedArray(h,y),v=0;v<y;v++)b[v]=r[o++];f[m]=new C.GeometryAttribute({componentDatatype:h,componentsPerAttribute:l,normalize:g,values:b})}if(0<(y=r[o++]))for(var G=b.length/l,x=A.IndexDatatype.createTypedArray(G,y),S=0;S<y;S++)x[S]=r[o++];n[i++]=new C.Geometry({primitiveType:d,geometryType:p,boundingSphere:a,boundingSphereCV:s,indices:x,attributes:f,offsetAttribute:u})}else n[i++]=void 0}return n},h.packCombineGeometryParameters=function(e,t){for(var r=e.createGeometryResults,n=r.length,i=0;i<n;i++)t.push(r[i].packedData.buffer);return{createGeometryResults:e.createGeometryResults,packedInstances:function(e,t){var r=e.length,n=new Float64Array(1+19*r),i=0;n[i++]=r;for(var o=0;o<r;o++){var a,s=e[o];P.Matrix4.pack(s.modelMatrix,n,i),i+=P.Matrix4.packedLength,v.defined(s.attributes)&&v.defined(s.attributes.offset)&&(a=s.attributes.offset.value,n[i]=a[0],n[i+1]=a[1],n[i+2]=a[2]),i+=3}return t.push(n.buffer),n}(e.instances,t),ellipsoid:e.ellipsoid,isGeographic:e.projection instanceof P.GeographicProjection,elementIndexUintSupported:e.elementIndexUintSupported,scene3DOnly:e.scene3DOnly,vertexCacheOptimize:e.vertexCacheOptimize,compressVertices:e.compressVertices,modelMatrix:e.modelMatrix,createPickOffsets:e.createPickOffsets}},h.unpackCombineGeometryParameters=function(e){for(var t=function(e){for(var t=e,r=new Array(t[0]),n=0,i=1;i<t.length;){var o,a=P.Matrix4.unpack(t,i);i+=P.Matrix4.packedLength,v.defined(t[i])&&(o={offset:new m(t[i],t[i+1],t[i+2])}),i+=3,r[n++]={modelMatrix:a,attributes:o}}return r}(e.packedInstances),r=e.createGeometryResults,n=r.length,i=0,o=0;o<n;o++)for(var a=h.unpackCreateGeometryResults(r[o]),s=a.length,d=0;d<s;d++){var p=a[d];t[i].geometry=p,++i}var u=f.Ellipsoid.clone(e.ellipsoid);return{instances:t,ellipsoid:u,projection:e.isGeographic?new P.GeographicProjection(u):new c.WebMercatorProjection(u),elementIndexUintSupported:e.elementIndexUintSupported,scene3DOnly:e.scene3DOnly,vertexCacheOptimize:e.vertexCacheOptimize,compressVertices:e.compressVertices,modelMatrix:P.Matrix4.clone(e.modelMatrix),createPickOffsets:e.createPickOffsets}},h.packCombineGeometryResults=function(e,t){v.defined(e.geometries)&&i(e.geometries,t);var r=o(e.boundingSpheres),n=o(e.boundingSpheresCV);return t.push(r.buffer,n.buffer),{geometries:e.geometries,attributeLocations:e.attributeLocations,modelMatrix:e.modelMatrix,pickOffsets:e.pickOffsets,offsetInstanceExtend:e.offsetInstanceExtend,boundingSpheres:r,boundingSpheresCV:n}},h.unpackCombineGeometryResults=function(e){return{geometries:e.geometries,attributeLocations:e.attributeLocations,modelMatrix:e.modelMatrix,pickOffsets:e.pickOffsets,offsetInstanceExtend:e.offsetInstanceExtend,boundingSpheres:r(e.boundingSpheres),boundingSpheresCV:r(e.boundingSpheresCV)}},e.PrimitivePipeline=h}); diff --git a/web/assets/Cesium/Workers/RectangleGeometryLibrary-341b00f2.js b/web/assets/Cesium/Workers/RectangleGeometryLibrary-341b00f2.js new file mode 100644 index 00000000..124a0a9a --- /dev/null +++ b/web/assets/Cesium/Workers/RectangleGeometryLibrary-341b00f2.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./GeometryAttribute-44fb48f1"],function(t,f,n,v,O,a,x){"use strict";var p=Math.cos,G=Math.sin,R=Math.sqrt,r={computePosition:function(t,n,a,r,e,o,s){var i,c=n.radiiSquared,g=t.nwCorner,h=t.boundingRectangle,u=g.latitude-t.granYCos*r+e*t.granXSin,C=p(u),l=G(u),S=c.z*l,d=g.longitude+r*t.granYSin+e*t.granXCos,w=C*p(d),M=C*G(d),X=c.x*w,Y=c.y*M,m=R(X*w+Y*M+S*l);o.x=X/m,o.y=Y/m,o.z=S/m,a&&(i=t.stNwCorner,f.defined(i)?(u=i.latitude-t.stGranYCos*r+e*t.stGranXSin,d=i.longitude+r*t.stGranYSin+e*t.stGranXCos,s.x=(d-t.stWest)*t.lonScalar,s.y=(u-t.stSouth)*t.latScalar):(s.x=(d-h.west)*t.lonScalar,s.y=(u-h.south)*t.latScalar))}},y=new x.Matrix2,b=new O.Cartesian3,P=new O.Cartographic,W=new O.Cartesian3,_=new a.GeographicProjection;function T(t,n,a,r,e,o,s){var i=Math.cos(n),c=r*i,g=a*i,h=Math.sin(n),u=r*h,C=a*h;b=_.project(t,b),b=O.Cartesian3.subtract(b,W,b);var l=x.Matrix2.fromRotation(n,y);b=x.Matrix2.multiplyByVector(l,b,b),b=O.Cartesian3.add(b,W,b),--o,--s;var S=(t=_.unproject(b,t)).latitude,d=S+o*C,w=S-c*s,M=S-c*s+o*C,X=Math.max(S,d,w,M),Y=Math.min(S,d,w,M),m=t.longitude,f=m+o*g,p=m+s*u,G=m+s*u+o*g;return{north:X,south:Y,east:Math.max(m,f,p,G),west:Math.min(m,f,p,G),granYCos:c,granYSin:u,granXCos:g,granXSin:C,nwCorner:t}}r.computeOptions=function(t,n,a,r,e,o,s){var i=t.east,c=t.west,g=t.north,h=t.south,u=!1,C=!1;g===v.CesiumMath.PI_OVER_TWO&&(u=!0),h===-v.CesiumMath.PI_OVER_TWO&&(C=!0);var l,S,d,w=g-h,M=(l=i<c?v.CesiumMath.TWO_PI-c+i:i-c)/((S=Math.ceil(l/n)+1)-1),X=w/((d=Math.ceil(w/n)+1)-1),Y=O.Rectangle.northwest(t,o),m=O.Rectangle.center(t,P);0===a&&0===r||(m.longitude<Y.longitude&&(m.longitude+=v.CesiumMath.TWO_PI),W=_.project(m,W));var f,p,G,x=X,R=M,y=O.Rectangle.clone(t,e),b={granYCos:x,granYSin:0,granXCos:R,granXSin:0,nwCorner:Y,boundingRectangle:y,width:S,height:d,northCap:u,southCap:C};return 0!==a&&(g=(f=T(Y,a,M,X,0,S,d)).north,h=f.south,i=f.east,c=f.west,b.granYCos=f.granYCos,b.granYSin=f.granYSin,b.granXCos=f.granXCos,b.granXSin=f.granXSin,y.north=g,y.south=h,y.east=i,y.west=c),0!==r&&(a-=r,G=T(p=O.Rectangle.northwest(y,s),a,M,X,0,S,d),b.stGranYCos=G.granYCos,b.stGranXCos=G.granXCos,b.stGranYSin=G.granYSin,b.stGranXSin=G.granXSin,b.stNwCorner=p,b.stWest=G.west,b.stSouth=G.south),b},t.RectangleGeometryLibrary=r}); diff --git a/web/assets/Cesium/Workers/RuntimeError-2109023a.js b/web/assets/Cesium/Workers/RuntimeError-2109023a.js new file mode 100644 index 00000000..d81ae6d8 --- /dev/null +++ b/web/assets/Cesium/Workers/RuntimeError-2109023a.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71"],function(t,r){"use strict";function e(t){var r;this.name="RuntimeError",this.message=t;try{throw new Error}catch(t){r=t.stack}this.stack=r}r.defined(Object.create)&&((e.prototype=Object.create(Error.prototype)).constructor=e),e.prototype.toString=function(){var t=this.name+": "+this.message;return r.defined(this.stack)&&(t+="\n"+this.stack.toString()),t},t.RuntimeError=e}); diff --git a/web/assets/Cesium/Workers/TerrainEncoding-b34235ca.js b/web/assets/Cesium/Workers/TerrainEncoding-b34235ca.js new file mode 100644 index 00000000..a07bf55d --- /dev/null +++ b/web/assets/Cesium/Workers/TerrainEncoding-b34235ca.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./ComponentDatatype-6d99a1ee","./AttributeCompression-9fc99391"],function(t,y,e,f,b,M,o,x){"use strict";function i(t,e){this._ellipsoid=t,this._cameraPosition=new b.Cartesian3,this._cameraPositionInScaledSpace=new b.Cartesian3,this._distanceToLimbInScaledSpaceSquared=0,y.defined(e)&&(this.cameraPosition=e)}Object.defineProperties(i.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},cameraPosition:{get:function(){return this._cameraPosition},set:function(t){var e=this._ellipsoid.transformPositionToScaledSpace(t,this._cameraPositionInScaledSpace),i=b.Cartesian3.magnitudeSquared(e)-1;b.Cartesian3.clone(t,this._cameraPosition),this._cameraPositionInScaledSpace=e,this._distanceToLimbInScaledSpaceSquared=i}}});var s=new b.Cartesian3;i.prototype.isPointVisible=function(t){return h(this._ellipsoid.transformPositionToScaledSpace(t,s),this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared)},i.prototype.isScaledSpacePointVisible=function(t){return h(t,this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared)};var n=new b.Cartesian3;i.prototype.isScaledSpacePointVisiblePossiblyUnderEllipsoid=function(t,e){var i,r=this._ellipsoid,a=y.defined(e)&&e<0&&r.minimumRadius>-e?((i=n).x=this._cameraPosition.x/(r.radii.x+e),i.y=this._cameraPosition.y/(r.radii.y+e),i.z=this._cameraPosition.z/(r.radii.z+e),i.x*i.x+i.y*i.y+i.z*i.z-1):(i=this._cameraPositionInScaledSpace,this._distanceToLimbInScaledSpaceSquared);return h(t,i,a)},i.prototype.computeHorizonCullingPoint=function(t,e,i){return d(this._ellipsoid,t,e,i)};var c=b.Ellipsoid.clone(b.Ellipsoid.UNIT_SPHERE);i.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid=function(t,e,i,r){return d(u(this._ellipsoid,i,c),t,e,r)},i.prototype.computeHorizonCullingPointFromVertices=function(t,e,i,r,a){return p(this._ellipsoid,t,e,i,r,a)},i.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid=function(t,e,i,r,a,n){return p(u(this._ellipsoid,a,c),t,e,i,r,n)};var m=[];i.prototype.computeHorizonCullingPointFromRectangle=function(t,e,i){var r=b.Rectangle.subsample(t,e,0,m),a=M.BoundingSphere.fromPoints(r);if(!(b.Cartesian3.magnitude(a.center)<.1*e.minimumRadius))return this.computeHorizonCullingPoint(a.center,r,i)};var a=new b.Cartesian3;function u(t,e,i){var r;return y.defined(e)&&e<0&&t.minimumRadius>-e&&(r=b.Cartesian3.fromElements(t.radii.x+e,t.radii.y+e,t.radii.z+e,a),t=b.Ellipsoid.fromCartesian3(r,i)),t}function d(t,e,i,r){y.defined(r)||(r=new b.Cartesian3);for(var a=P(t,e),n=0,o=0,s=i.length;o<s;++o){var c=g(t,i[o],a);if(c<0)return;n=Math.max(n,c)}return T(a,n,r)}var l=new b.Cartesian3;function p(t,e,i,r,a,n){y.defined(n)||(n=new b.Cartesian3),r=y.defaultValue(r,3),a=y.defaultValue(a,b.Cartesian3.ZERO);for(var o=P(t,e),s=0,c=0,m=i.length;c<m;c+=r){l.x=i[c]+a.x,l.y=i[c+1]+a.y,l.z=i[c+2]+a.z;var u=g(t,l,o);if(u<0)return;s=Math.max(s,u)}return T(o,s,n)}function h(t,e,i){var r=e,a=i,n=b.Cartesian3.subtract(t,r,s),o=-b.Cartesian3.dot(n,r);return!(a<0?0<o:a<o&&o*o/b.Cartesian3.magnitudeSquared(n)>a)}var C=new b.Cartesian3,S=new b.Cartesian3;function g(t,e,i){var r=t.transformPositionToScaledSpace(e,C),a=b.Cartesian3.magnitudeSquared(r),n=Math.sqrt(a),o=b.Cartesian3.divideByScalar(r,n,S),a=Math.max(1,a),s=1/(n=Math.max(1,n));return 1/(b.Cartesian3.dot(o,i)*s-b.Cartesian3.magnitude(b.Cartesian3.cross(o,i,o))*(Math.sqrt(a-1)*s))}function T(t,e,i){if(!(e<=0||e===1/0||e!=e))return b.Cartesian3.multiplyByScalar(t,e,i)}var r=new b.Cartesian3;function P(t,e){return b.Cartesian3.equals(e,b.Cartesian3.ZERO)?e:(t.transformPositionToScaledSpace(e,r),b.Cartesian3.normalize(r,r))}var v=Object.freeze({NONE:0,BITS12:1}),z=new b.Cartesian3,E=new b.Cartesian3,N=new b.Cartesian2,I=new M.Matrix4,B=new M.Matrix4,_=Math.pow(2,12);function w(t,e,i,r,a,n){var o,s,c,m,u,d,l,p,h,f,x,C,S=v.NONE;y.defined(t)&&y.defined(e)&&y.defined(i)&&y.defined(r)&&(s=t.minimum,c=t.maximum,m=b.Cartesian3.subtract(c,s,E),u=i-e,S=Math.max(b.Cartesian3.maximumComponent(m),u)<_-1?v.BITS12:v.NONE,d=t.center,l=M.Matrix4.inverseTransformation(r,new M.Matrix4),p=b.Cartesian3.negate(s,z),M.Matrix4.multiply(M.Matrix4.fromTranslation(p,I),l,l),(h=z).x=1/m.x,h.y=1/m.y,h.z=1/m.z,M.Matrix4.multiply(M.Matrix4.fromScale(h,I),l,l),o=M.Matrix4.clone(r),M.Matrix4.setTranslation(o,b.Cartesian3.ZERO,o),r=M.Matrix4.clone(r,new M.Matrix4),f=M.Matrix4.fromTranslation(s,I),x=M.Matrix4.fromScale(m,B),C=M.Matrix4.multiply(f,x,I),M.Matrix4.multiply(r,C,r),M.Matrix4.multiply(o,C,o)),this.quantization=S,this.minimumHeight=e,this.maximumHeight=i,this.center=d,this.toScaledENU=l,this.fromScaledENU=r,this.matrix=o,this.hasVertexNormals=a,this.hasWebMercatorT=y.defaultValue(n,!1)}w.prototype.encode=function(t,e,i,r,a,n,o){var s,c,m,u,d,l,p=r.x,h=r.y;return this.quantization===v.BITS12?((i=M.Matrix4.multiplyByPoint(this.toScaledENU,i,z)).x=f.CesiumMath.clamp(i.x,0,1),i.y=f.CesiumMath.clamp(i.y,0,1),i.z=f.CesiumMath.clamp(i.z,0,1),s=this.maximumHeight-this.minimumHeight,c=f.CesiumMath.clamp((a-this.minimumHeight)/s,0,1),b.Cartesian2.fromElements(i.x,i.y,N),m=x.AttributeCompression.compressTextureCoordinates(N),b.Cartesian2.fromElements(i.z,c,N),u=x.AttributeCompression.compressTextureCoordinates(N),b.Cartesian2.fromElements(p,h,N),d=x.AttributeCompression.compressTextureCoordinates(N),t[e++]=m,t[e++]=u,t[e++]=d,this.hasWebMercatorT&&(b.Cartesian2.fromElements(o,0,N),l=x.AttributeCompression.compressTextureCoordinates(N),t[e++]=l)):(b.Cartesian3.subtract(i,this.center,z),t[e++]=z.x,t[e++]=z.y,t[e++]=z.z,t[e++]=a,t[e++]=p,t[e++]=h,this.hasWebMercatorT&&(t[e++]=o)),this.hasVertexNormals&&(t[e++]=x.AttributeCompression.octPackFloat(n)),e},w.prototype.decodePosition=function(t,e,i){if(y.defined(i)||(i=new b.Cartesian3),e*=this.getStride(),this.quantization!==v.BITS12)return i.x=t[e],i.y=t[e+1],i.z=t[e+2],b.Cartesian3.add(i,this.center,i);var r=x.AttributeCompression.decompressTextureCoordinates(t[e],N);i.x=r.x,i.y=r.y;var a=x.AttributeCompression.decompressTextureCoordinates(t[e+1],N);return i.z=a.x,M.Matrix4.multiplyByPoint(this.fromScaledENU,i,i)},w.prototype.decodeTextureCoordinates=function(t,e,i){return y.defined(i)||(i=new b.Cartesian2),e*=this.getStride(),this.quantization===v.BITS12?x.AttributeCompression.decompressTextureCoordinates(t[e+2],i):b.Cartesian2.fromElements(t[e+4],t[e+5],i)},w.prototype.decodeHeight=function(t,e){return e*=this.getStride(),this.quantization!==v.BITS12?t[e+3]:x.AttributeCompression.decompressTextureCoordinates(t[e+1],N).y*(this.maximumHeight-this.minimumHeight)+this.minimumHeight},w.prototype.decodeWebMercatorT=function(t,e){return e*=this.getStride(),this.quantization===v.BITS12?x.AttributeCompression.decompressTextureCoordinates(t[e+3],N).x:t[e+6]},w.prototype.getOctEncodedNormal=function(t,e,i){var r=t[e=(e+1)*this.getStride()-1]/256,a=Math.floor(r),n=256*(r-a);return b.Cartesian2.fromElements(a,n,i)},w.prototype.getStride=function(){var t;switch(this.quantization){case v.BITS12:t=3;break;default:t=6}return this.hasWebMercatorT&&++t,this.hasVertexNormals&&++t,t};var A={position3DAndHeight:0,textureCoordAndEncodedNormals:1},q={compressed0:0,compressed1:1};w.prototype.getAttributes=function(t){var e,i=o.ComponentDatatype.FLOAT,r=o.ComponentDatatype.getSizeInBytes(i);if(this.quantization===v.NONE){var a=2;return this.hasWebMercatorT&&++a,this.hasVertexNormals&&++a,[{index:A.position3DAndHeight,vertexBuffer:t,componentDatatype:i,componentsPerAttribute:4,offsetInBytes:0,strideInBytes:e=(4+a)*r},{index:A.textureCoordAndEncodedNormals,vertexBuffer:t,componentDatatype:i,componentsPerAttribute:a,offsetInBytes:4*r,strideInBytes:e}]}var n=3;return(this.hasWebMercatorT||this.hasVertexNormals)&&++n,this.hasWebMercatorT&&this.hasVertexNormals?[{index:q.compressed0,vertexBuffer:t,componentDatatype:i,componentsPerAttribute:n,offsetInBytes:0,strideInBytes:e=(n+1)*r},{index:q.compressed1,vertexBuffer:t,componentDatatype:i,componentsPerAttribute:1,offsetInBytes:n*r,strideInBytes:e}]:[{index:q.compressed0,vertexBuffer:t,componentDatatype:i,componentsPerAttribute:n}]},w.prototype.getAttributeLocations=function(){return this.quantization===v.NONE?A:q},w.clone=function(t,e){return y.defined(e)||(e=new w),e.quantization=t.quantization,e.minimumHeight=t.minimumHeight,e.maximumHeight=t.maximumHeight,e.center=b.Cartesian3.clone(t.center),e.toScaledENU=M.Matrix4.clone(t.toScaledENU),e.fromScaledENU=M.Matrix4.clone(t.fromScaledENU),e.matrix=M.Matrix4.clone(t.matrix),e.hasVertexNormals=t.hasVertexNormals,e.hasWebMercatorT=t.hasWebMercatorT,e},t.EllipsoidalOccluder=i,t.TerrainEncoding=w}); diff --git a/web/assets/Cesium/Workers/Transforms-ec27f304.js b/web/assets/Cesium/Workers/Transforms-ec27f304.js new file mode 100644 index 00000000..39371cf8 --- /dev/null +++ b/web/assets/Cesium/Workers/Transforms-ec27f304.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./RuntimeError-2109023a"],function(e,I,i,X,P,H){"use strict";function t(e){this._ellipsoid=I.defaultValue(e,P.Ellipsoid.WGS84),this._semimajorAxis=this._ellipsoid.maximumRadius,this._oneOverSemimajorAxis=1/this._semimajorAxis}Object.defineProperties(t.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}}),t.prototype.project=function(e,t){var n=this._semimajorAxis,r=e.longitude*n,a=e.latitude*n,i=e.height;return I.defined(t)?(t.x=r,t.y=a,t.z=i,t):new P.Cartesian3(r,a,i)},t.prototype.unproject=function(e,t){var n=this._oneOverSemimajorAxis,r=e.x*n,a=e.y*n,i=e.z;return I.defined(t)?(t.longitude=r,t.latitude=a,t.height=i,t):new P.Cartographic(r,a,i)};var s=Object.freeze({OUTSIDE:-1,INTERSECTING:0,INSIDE:1});function o(e,t){this.start=I.defaultValue(e,0),this.stop=I.defaultValue(t,0)}function J(e,t,n,r,a,i,s,o,u){this[0]=I.defaultValue(e,0),this[1]=I.defaultValue(r,0),this[2]=I.defaultValue(s,0),this[3]=I.defaultValue(t,0),this[4]=I.defaultValue(a,0),this[5]=I.defaultValue(o,0),this[6]=I.defaultValue(n,0),this[7]=I.defaultValue(i,0),this[8]=I.defaultValue(u,0)}J.packedLength=9,J.pack=function(e,t,n){return n=I.defaultValue(n,0),t[n++]=e[0],t[n++]=e[1],t[n++]=e[2],t[n++]=e[3],t[n++]=e[4],t[n++]=e[5],t[n++]=e[6],t[n++]=e[7],t[n++]=e[8],t},J.unpack=function(e,t,n){return t=I.defaultValue(t,0),I.defined(n)||(n=new J),n[0]=e[t++],n[1]=e[t++],n[2]=e[t++],n[3]=e[t++],n[4]=e[t++],n[5]=e[t++],n[6]=e[t++],n[7]=e[t++],n[8]=e[t++],n},J.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t):new J(e[0],e[3],e[6],e[1],e[4],e[7],e[2],e[5],e[8])},J.fromArray=function(e,t,n){return t=I.defaultValue(t,0),I.defined(n)||(n=new J),n[0]=e[t],n[1]=e[t+1],n[2]=e[t+2],n[3]=e[t+3],n[4]=e[t+4],n[5]=e[t+5],n[6]=e[t+6],n[7]=e[t+7],n[8]=e[t+8],n},J.fromColumnMajorArray=function(e,t){return J.clone(e,t)},J.fromRowMajorArray=function(e,t){return I.defined(t)?(t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],t):new J(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8])},J.fromQuaternion=function(e,t){var n=e.x*e.x,r=e.x*e.y,a=e.x*e.z,i=e.x*e.w,s=e.y*e.y,o=e.y*e.z,u=e.y*e.w,l=e.z*e.z,c=e.z*e.w,d=e.w*e.w,f=n-s-l+d,h=2*(r-c),p=2*(a+u),m=2*(r+c),y=s-n-l+d,v=2*(o-i),C=2*(a-u),w=2*(o+i),g=-n-s+l+d;return I.defined(t)?(t[0]=f,t[1]=m,t[2]=C,t[3]=h,t[4]=y,t[5]=w,t[6]=p,t[7]=v,t[8]=g,t):new J(f,h,p,m,y,v,C,w,g)},J.fromHeadingPitchRoll=function(e,t){var n=Math.cos(-e.pitch),r=Math.cos(-e.heading),a=Math.cos(e.roll),i=Math.sin(-e.pitch),s=Math.sin(-e.heading),o=Math.sin(e.roll),u=n*r,l=-a*s+o*i*r,c=o*s+a*i*r,d=n*s,f=a*r+o*i*s,h=-o*r+a*i*s,p=-i,m=o*n,y=a*n;return I.defined(t)?(t[0]=u,t[1]=d,t[2]=p,t[3]=l,t[4]=f,t[5]=m,t[6]=c,t[7]=h,t[8]=y,t):new J(u,l,c,d,f,h,p,m,y)},J.fromScale=function(e,t){return I.defined(t)?(t[0]=e.x,t[1]=0,t[2]=0,t[3]=0,t[4]=e.y,t[5]=0,t[6]=0,t[7]=0,t[8]=e.z,t):new J(e.x,0,0,0,e.y,0,0,0,e.z)},J.fromUniformScale=function(e,t){return I.defined(t)?(t[0]=e,t[1]=0,t[2]=0,t[3]=0,t[4]=e,t[5]=0,t[6]=0,t[7]=0,t[8]=e,t):new J(e,0,0,0,e,0,0,0,e)},J.fromCrossProduct=function(e,t){return I.defined(t)?(t[0]=0,t[1]=e.z,t[2]=-e.y,t[3]=-e.z,t[4]=0,t[5]=e.x,t[6]=e.y,t[7]=-e.x,t[8]=0,t):new J(0,-e.z,e.y,e.z,0,-e.x,-e.y,e.x,0)},J.fromRotationX=function(e,t){var n=Math.cos(e),r=Math.sin(e);return I.defined(t)?(t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=n,t[5]=r,t[6]=0,t[7]=-r,t[8]=n,t):new J(1,0,0,0,n,-r,0,r,n)},J.fromRotationY=function(e,t){var n=Math.cos(e),r=Math.sin(e);return I.defined(t)?(t[0]=n,t[1]=0,t[2]=-r,t[3]=0,t[4]=1,t[5]=0,t[6]=r,t[7]=0,t[8]=n,t):new J(n,0,r,0,1,0,-r,0,n)},J.fromRotationZ=function(e,t){var n=Math.cos(e),r=Math.sin(e);return I.defined(t)?(t[0]=n,t[1]=r,t[2]=0,t[3]=-r,t[4]=n,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t):new J(n,-r,0,r,n,0,0,0,1)},J.toArray=function(e,t){return I.defined(t)?(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t):[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8]]},J.getElementIndex=function(e,t){return 3*e+t},J.getColumn=function(e,t,n){var r=3*t,a=e[r],i=e[1+r],s=e[2+r];return n.x=a,n.y=i,n.z=s,n},J.setColumn=function(e,t,n,r){var a=3*t;return(r=J.clone(e,r))[a]=n.x,r[1+a]=n.y,r[2+a]=n.z,r},J.getRow=function(e,t,n){var r=e[t],a=e[t+3],i=e[t+6];return n.x=r,n.y=a,n.z=i,n},J.setRow=function(e,t,n,r){return(r=J.clone(e,r))[t]=n.x,r[t+3]=n.y,r[t+6]=n.z,r};var n=new P.Cartesian3;J.getScale=function(e,t){return t.x=P.Cartesian3.magnitude(P.Cartesian3.fromElements(e[0],e[1],e[2],n)),t.y=P.Cartesian3.magnitude(P.Cartesian3.fromElements(e[3],e[4],e[5],n)),t.z=P.Cartesian3.magnitude(P.Cartesian3.fromElements(e[6],e[7],e[8],n)),t};var r=new P.Cartesian3;J.getMaximumScale=function(e){return J.getScale(e,r),P.Cartesian3.maximumComponent(r)},J.multiply=function(e,t,n){var r=e[0]*t[0]+e[3]*t[1]+e[6]*t[2],a=e[1]*t[0]+e[4]*t[1]+e[7]*t[2],i=e[2]*t[0]+e[5]*t[1]+e[8]*t[2],s=e[0]*t[3]+e[3]*t[4]+e[6]*t[5],o=e[1]*t[3]+e[4]*t[4]+e[7]*t[5],u=e[2]*t[3]+e[5]*t[4]+e[8]*t[5],l=e[0]*t[6]+e[3]*t[7]+e[6]*t[8],c=e[1]*t[6]+e[4]*t[7]+e[7]*t[8],d=e[2]*t[6]+e[5]*t[7]+e[8]*t[8];return n[0]=r,n[1]=a,n[2]=i,n[3]=s,n[4]=o,n[5]=u,n[6]=l,n[7]=c,n[8]=d,n},J.add=function(e,t,n){return n[0]=e[0]+t[0],n[1]=e[1]+t[1],n[2]=e[2]+t[2],n[3]=e[3]+t[3],n[4]=e[4]+t[4],n[5]=e[5]+t[5],n[6]=e[6]+t[6],n[7]=e[7]+t[7],n[8]=e[8]+t[8],n},J.subtract=function(e,t,n){return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],n[3]=e[3]-t[3],n[4]=e[4]-t[4],n[5]=e[5]-t[5],n[6]=e[6]-t[6],n[7]=e[7]-t[7],n[8]=e[8]-t[8],n},J.multiplyByVector=function(e,t,n){var r=t.x,a=t.y,i=t.z,s=e[0]*r+e[3]*a+e[6]*i,o=e[1]*r+e[4]*a+e[7]*i,u=e[2]*r+e[5]*a+e[8]*i;return n.x=s,n.y=o,n.z=u,n},J.multiplyByScalar=function(e,t,n){return n[0]=e[0]*t,n[1]=e[1]*t,n[2]=e[2]*t,n[3]=e[3]*t,n[4]=e[4]*t,n[5]=e[5]*t,n[6]=e[6]*t,n[7]=e[7]*t,n[8]=e[8]*t,n},J.multiplyByScale=function(e,t,n){return n[0]=e[0]*t.x,n[1]=e[1]*t.x,n[2]=e[2]*t.x,n[3]=e[3]*t.y,n[4]=e[4]*t.y,n[5]=e[5]*t.y,n[6]=e[6]*t.z,n[7]=e[7]*t.z,n[8]=e[8]*t.z,n},J.negate=function(e,t){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t[4]=-e[4],t[5]=-e[5],t[6]=-e[6],t[7]=-e[7],t[8]=-e[8],t},J.transpose=function(e,t){var n=e[0],r=e[3],a=e[6],i=e[1],s=e[4],o=e[7],u=e[2],l=e[5],c=e[8];return t[0]=n,t[1]=r,t[2]=a,t[3]=i,t[4]=s,t[5]=o,t[6]=u,t[7]=l,t[8]=c,t};var a=new P.Cartesian3(1,1,1);J.getRotation=function(e,t){var n=P.Cartesian3.divideComponents(a,J.getScale(e,r),r);return t=J.multiplyByScale(e,n,t)};var h=[1,0,0],p=[2,2,1];var u=new J,l=new J;function G(e,t,n,r){this.x=I.defaultValue(e,0),this.y=I.defaultValue(t,0),this.z=I.defaultValue(n,0),this.w=I.defaultValue(r,0)}J.computeEigenDecomposition=function(e,t){var n=X.CesiumMath.EPSILON20,r=0,a=0;I.defined(t)||(t={});for(var i=t.unitary=J.clone(J.IDENTITY,t.unitary),s=t.diagonal=J.clone(e,t.diagonal),o=n*function(e){for(var t=0,n=0;n<9;++n){var r=e[n];t+=r*r}return Math.sqrt(t)}(s);a<10&&function(e){for(var t=0,n=0;n<3;++n){var r=e[J.getElementIndex(p[n],h[n])];t+=2*r*r}return Math.sqrt(t)}(s)>o;)!function(e,t){for(var n=X.CesiumMath.EPSILON15,r=0,a=1,i=0;i<3;++i){var s=Math.abs(e[J.getElementIndex(p[i],h[i])]);r<s&&(a=i,r=s)}var o,u,l=1,c=0,d=h[a],f=p[a];Math.abs(e[J.getElementIndex(f,d)])>n&&(c=(u=(o=(e[J.getElementIndex(f,f)]-e[J.getElementIndex(d,d)])/2/e[J.getElementIndex(f,d)])<0?-1/(-o+Math.sqrt(1+o*o)):1/(o+Math.sqrt(1+o*o)))*(l=1/Math.sqrt(1+u*u))),(t=J.clone(J.IDENTITY,t))[J.getElementIndex(d,d)]=t[J.getElementIndex(f,f)]=l,t[J.getElementIndex(f,d)]=c,t[J.getElementIndex(d,f)]=-c}(s,u),J.transpose(u,l),J.multiply(s,u,s),J.multiply(l,s,s),J.multiply(i,u,i),2<++r&&(++a,r=0);return t},J.abs=function(e,t){return t[0]=Math.abs(e[0]),t[1]=Math.abs(e[1]),t[2]=Math.abs(e[2]),t[3]=Math.abs(e[3]),t[4]=Math.abs(e[4]),t[5]=Math.abs(e[5]),t[6]=Math.abs(e[6]),t[7]=Math.abs(e[7]),t[8]=Math.abs(e[8]),t},J.determinant=function(e){var t=e[0],n=e[3],r=e[6],a=e[1],i=e[4],s=e[7],o=e[2],u=e[5],l=e[8];return t*(i*l-u*s)+a*(u*r-n*l)+o*(n*s-i*r)},J.inverse=function(e,t){var n=e[0],r=e[1],a=e[2],i=e[3],s=e[4],o=e[5],u=e[6],l=e[7],c=e[8],d=J.determinant(e);return t[0]=s*c-l*o,t[1]=l*a-r*c,t[2]=r*o-s*a,t[3]=u*o-i*c,t[4]=n*c-u*a,t[5]=i*a-n*o,t[6]=i*l-u*s,t[7]=u*r-n*l,t[8]=n*s-i*r,J.multiplyByScalar(t,1/d,t)},J.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[7]===t[7]&&e[8]===t[8]},J.equalsEpsilon=function(e,t,n){return n=I.defaultValue(n,0),e===t||I.defined(e)&&I.defined(t)&&Math.abs(e[0]-t[0])<=n&&Math.abs(e[1]-t[1])<=n&&Math.abs(e[2]-t[2])<=n&&Math.abs(e[3]-t[3])<=n&&Math.abs(e[4]-t[4])<=n&&Math.abs(e[5]-t[5])<=n&&Math.abs(e[6]-t[6])<=n&&Math.abs(e[7]-t[7])<=n&&Math.abs(e[8]-t[8])<=n},J.IDENTITY=Object.freeze(new J(1,0,0,0,1,0,0,0,1)),J.ZERO=Object.freeze(new J(0,0,0,0,0,0,0,0,0)),J.COLUMN0ROW0=0,J.COLUMN0ROW1=1,J.COLUMN0ROW2=2,J.COLUMN1ROW0=3,J.COLUMN1ROW1=4,J.COLUMN1ROW2=5,J.COLUMN2ROW0=6,J.COLUMN2ROW1=7,J.COLUMN2ROW2=8,Object.defineProperties(J.prototype,{length:{get:function(){return J.packedLength}}}),J.prototype.clone=function(e){return J.clone(this,e)},J.prototype.equals=function(e){return J.equals(this,e)},J.equalsArray=function(e,t,n){return e[0]===t[n]&&e[1]===t[n+1]&&e[2]===t[n+2]&&e[3]===t[n+3]&&e[4]===t[n+4]&&e[5]===t[n+5]&&e[6]===t[n+6]&&e[7]===t[n+7]&&e[8]===t[n+8]},J.prototype.equalsEpsilon=function(e,t){return J.equalsEpsilon(this,e,t)},J.prototype.toString=function(){return"("+this[0]+", "+this[3]+", "+this[6]+")\n("+this[1]+", "+this[4]+", "+this[7]+")\n("+this[2]+", "+this[5]+", "+this[8]+")"},G.fromElements=function(e,t,n,r,a){return I.defined(a)?(a.x=e,a.y=t,a.z=n,a.w=r,a):new G(e,t,n,r)},G.fromColor=function(e,t){return I.defined(t)?(t.x=e.red,t.y=e.green,t.z=e.blue,t.w=e.alpha,t):new G(e.red,e.green,e.blue,e.alpha)},G.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t):new G(e.x,e.y,e.z,e.w)},G.packedLength=4,G.pack=function(e,t,n){return n=I.defaultValue(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.z,t[n]=e.w,t},G.unpack=function(e,t,n){return t=I.defaultValue(t,0),I.defined(n)||(n=new G),n.x=e[t++],n.y=e[t++],n.z=e[t++],n.w=e[t],n},G.packArray=function(e,t){var n=e.length,r=4*n;if(I.defined(t)){if(!Array.isArray(t)&&t.length!==r)throw new i.DeveloperError("If result is a typed array, it must have exactly array.length * 4 elements");t.length!==r&&(t.length=r)}else t=new Array(r);for(var a=0;a<n;++a)G.pack(e[a],t,4*a);return t},G.unpackArray=function(e,t){var n=e.length;I.defined(t)?t.length=n/4:t=new Array(n/4);for(var r=0;r<n;r+=4){var a=r/4;t[a]=G.unpack(e,r,t[a])}return t},G.fromArray=G.unpack,G.maximumComponent=function(e){return Math.max(e.x,e.y,e.z,e.w)},G.minimumComponent=function(e){return Math.min(e.x,e.y,e.z,e.w)},G.minimumByComponent=function(e,t,n){return n.x=Math.min(e.x,t.x),n.y=Math.min(e.y,t.y),n.z=Math.min(e.z,t.z),n.w=Math.min(e.w,t.w),n},G.maximumByComponent=function(e,t,n){return n.x=Math.max(e.x,t.x),n.y=Math.max(e.y,t.y),n.z=Math.max(e.z,t.z),n.w=Math.max(e.w,t.w),n},G.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y+e.z*e.z+e.w*e.w},G.magnitude=function(e){return Math.sqrt(G.magnitudeSquared(e))};var c=new G;G.distance=function(e,t){return G.subtract(e,t,c),G.magnitude(c)},G.distanceSquared=function(e,t){return G.subtract(e,t,c),G.magnitudeSquared(c)},G.normalize=function(e,t){var n=G.magnitude(e);return t.x=e.x/n,t.y=e.y/n,t.z=e.z/n,t.w=e.w/n,t},G.dot=function(e,t){return e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},G.multiplyComponents=function(e,t,n){return n.x=e.x*t.x,n.y=e.y*t.y,n.z=e.z*t.z,n.w=e.w*t.w,n},G.divideComponents=function(e,t,n){return n.x=e.x/t.x,n.y=e.y/t.y,n.z=e.z/t.z,n.w=e.w/t.w,n},G.add=function(e,t,n){return n.x=e.x+t.x,n.y=e.y+t.y,n.z=e.z+t.z,n.w=e.w+t.w,n},G.subtract=function(e,t,n){return n.x=e.x-t.x,n.y=e.y-t.y,n.z=e.z-t.z,n.w=e.w-t.w,n},G.multiplyByScalar=function(e,t,n){return n.x=e.x*t,n.y=e.y*t,n.z=e.z*t,n.w=e.w*t,n},G.divideByScalar=function(e,t,n){return n.x=e.x/t,n.y=e.y/t,n.z=e.z/t,n.w=e.w/t,n},G.negate=function(e,t){return t.x=-e.x,t.y=-e.y,t.z=-e.z,t.w=-e.w,t},G.abs=function(e,t){return t.x=Math.abs(e.x),t.y=Math.abs(e.y),t.z=Math.abs(e.z),t.w=Math.abs(e.w),t};var d=new G;G.lerp=function(e,t,n,r){return G.multiplyByScalar(t,n,d),r=G.multiplyByScalar(e,1-n,r),G.add(d,r,r)};var f=new G;G.mostOrthogonalAxis=function(e,t){var n=G.normalize(e,f);return G.abs(n,n),t=n.x<=n.y?n.x<=n.z?n.x<=n.w?G.clone(G.UNIT_X,t):G.clone(G.UNIT_W,t):n.z<=n.w?G.clone(G.UNIT_Z,t):G.clone(G.UNIT_W,t):n.y<=n.z?n.y<=n.w?G.clone(G.UNIT_Y,t):G.clone(G.UNIT_W,t):n.z<=n.w?G.clone(G.UNIT_Z,t):G.clone(G.UNIT_W,t)},G.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w},G.equalsArray=function(e,t,n){return e.x===t[n]&&e.y===t[n+1]&&e.z===t[n+2]&&e.w===t[n+3]},G.equalsEpsilon=function(e,t,n,r){return e===t||I.defined(e)&&I.defined(t)&&X.CesiumMath.equalsEpsilon(e.x,t.x,n,r)&&X.CesiumMath.equalsEpsilon(e.y,t.y,n,r)&&X.CesiumMath.equalsEpsilon(e.z,t.z,n,r)&&X.CesiumMath.equalsEpsilon(e.w,t.w,n,r)},G.ZERO=Object.freeze(new G(0,0,0,0)),G.UNIT_X=Object.freeze(new G(1,0,0,0)),G.UNIT_Y=Object.freeze(new G(0,1,0,0)),G.UNIT_Z=Object.freeze(new G(0,0,1,0)),G.UNIT_W=Object.freeze(new G(0,0,0,1)),G.prototype.clone=function(e){return G.clone(this,e)},G.prototype.equals=function(e){return G.equals(this,e)},G.prototype.equalsEpsilon=function(e,t,n){return G.equalsEpsilon(this,e,t,n)},G.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+", "+this.w+")"};var m=new Float32Array(1),y=256;function Q(e,t,n,r,a,i,s,o,u,l,c,d,f,h,p,m){this[0]=I.defaultValue(e,0),this[1]=I.defaultValue(a,0),this[2]=I.defaultValue(u,0),this[3]=I.defaultValue(f,0),this[4]=I.defaultValue(t,0),this[5]=I.defaultValue(i,0),this[6]=I.defaultValue(l,0),this[7]=I.defaultValue(h,0),this[8]=I.defaultValue(n,0),this[9]=I.defaultValue(s,0),this[10]=I.defaultValue(c,0),this[11]=I.defaultValue(p,0),this[12]=I.defaultValue(r,0),this[13]=I.defaultValue(o,0),this[14]=I.defaultValue(d,0),this[15]=I.defaultValue(m,0)}G.packFloat=function(e,t){if(I.defined(t)||(t=new G),m[0]=e,0===(e=m[0]))return G.clone(G.ZERO,t);var n,r=e<0?1:0;isFinite(e)?(e=Math.abs(e),n=Math.floor(X.CesiumMath.logBase(e,10))+1,e/=Math.pow(10,n)):(e=.1,n=38);var a=e*y;return t.x=Math.floor(a),a=(a-t.x)*y,t.y=Math.floor(a),a=(a-t.y)*y,t.z=Math.floor(a),t.w=2*(n+38)+r,t},G.unpackFloat=function(e){var t=e.w/2,n=Math.floor(t),r=-(r=2*(r=2*(t-n))-1);if(38<=(n-=38))return r<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY;var a=r*e.x*.00390625;return a+=r*e.y*(1/65536),(a+=r*e.z*(1/16777216))*Math.pow(10,n)},Q.packedLength=16,Q.pack=function(e,t,n){return n=I.defaultValue(n,0),t[n++]=e[0],t[n++]=e[1],t[n++]=e[2],t[n++]=e[3],t[n++]=e[4],t[n++]=e[5],t[n++]=e[6],t[n++]=e[7],t[n++]=e[8],t[n++]=e[9],t[n++]=e[10],t[n++]=e[11],t[n++]=e[12],t[n++]=e[13],t[n++]=e[14],t[n]=e[15],t},Q.unpack=function(e,t,n){return t=I.defaultValue(t,0),I.defined(n)||(n=new Q),n[0]=e[t++],n[1]=e[t++],n[2]=e[t++],n[3]=e[t++],n[4]=e[t++],n[5]=e[t++],n[6]=e[t++],n[7]=e[t++],n[8]=e[t++],n[9]=e[t++],n[10]=e[t++],n[11]=e[t++],n[12]=e[t++],n[13]=e[t++],n[14]=e[t++],n[15]=e[t],n},Q.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t):new Q(e[0],e[4],e[8],e[12],e[1],e[5],e[9],e[13],e[2],e[6],e[10],e[14],e[3],e[7],e[11],e[15])},Q.fromArray=Q.unpack,Q.fromColumnMajorArray=function(e,t){return Q.clone(e,t)},Q.fromRowMajorArray=function(e,t){return I.defined(t)?(t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15],t):new Q(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])},Q.fromRotationTranslation=function(e,t,n){return t=I.defaultValue(t,P.Cartesian3.ZERO),I.defined(n)?(n[0]=e[0],n[1]=e[1],n[2]=e[2],n[3]=0,n[4]=e[3],n[5]=e[4],n[6]=e[5],n[7]=0,n[8]=e[6],n[9]=e[7],n[10]=e[8],n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,n):new Q(e[0],e[3],e[6],t.x,e[1],e[4],e[7],t.y,e[2],e[5],e[8],t.z,0,0,0,1)},Q.fromTranslationQuaternionRotationScale=function(e,t,n,r){I.defined(r)||(r=new Q);var a=n.x,i=n.y,s=n.z,o=t.x*t.x,u=t.x*t.y,l=t.x*t.z,c=t.x*t.w,d=t.y*t.y,f=t.y*t.z,h=t.y*t.w,p=t.z*t.z,m=t.z*t.w,y=t.w*t.w,v=o-d-p+y,C=2*(u-m),w=2*(l+h),g=2*(u+m),x=d-o-p+y,E=2*(f-c),O=2*(l-h),_=2*(f+c),S=-o-d+p+y;return r[0]=v*a,r[1]=g*a,r[2]=O*a,r[3]=0,r[4]=C*i,r[5]=x*i,r[6]=_*i,r[7]=0,r[8]=w*s,r[9]=E*s,r[10]=S*s,r[11]=0,r[12]=e.x,r[13]=e.y,r[14]=e.z,r[15]=1,r},Q.fromTranslationRotationScale=function(e,t){return Q.fromTranslationQuaternionRotationScale(e.translation,e.rotation,e.scale,t)},Q.fromTranslation=function(e,t){return Q.fromRotationTranslation(J.IDENTITY,e,t)},Q.fromScale=function(e,t){return I.defined(t)?(t[0]=e.x,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e.y,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e.z,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t):new Q(e.x,0,0,0,0,e.y,0,0,0,0,e.z,0,0,0,0,1)},Q.fromUniformScale=function(e,t){return I.defined(t)?(t[0]=e,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t):new Q(e,0,0,0,0,e,0,0,0,0,e,0,0,0,0,1)};var g=new P.Cartesian3,x=new P.Cartesian3,E=new P.Cartesian3;Q.fromCamera=function(e,t){var n=e.position,r=e.direction,a=e.up;P.Cartesian3.normalize(r,g),P.Cartesian3.normalize(P.Cartesian3.cross(g,a,x),x),P.Cartesian3.normalize(P.Cartesian3.cross(x,g,E),E);var i=x.x,s=x.y,o=x.z,u=g.x,l=g.y,c=g.z,d=E.x,f=E.y,h=E.z,p=n.x,m=n.y,y=n.z,v=i*-p+s*-m+o*-y,C=d*-p+f*-m+h*-y,w=u*p+l*m+c*y;return I.defined(t)?(t[0]=i,t[1]=d,t[2]=-u,t[3]=0,t[4]=s,t[5]=f,t[6]=-l,t[7]=0,t[8]=o,t[9]=h,t[10]=-c,t[11]=0,t[12]=v,t[13]=C,t[14]=w,t[15]=1,t):new Q(i,s,o,v,d,f,h,C,-u,-l,-c,w,0,0,0,1)},Q.computePerspectiveFieldOfView=function(e,t,n,r,a){var i=1/Math.tan(.5*e),s=i/t,o=(r+n)/(n-r),u=2*r*n/(n-r);return a[0]=s,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=i,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=o,a[11]=-1,a[12]=0,a[13]=0,a[14]=u,a[15]=0,a},Q.computeOrthographicOffCenter=function(e,t,n,r,a,i,s){var o=1/(t-e),u=1/(r-n),l=1/(i-a),c=-(t+e)*o,d=-(r+n)*u,f=-(i+a)*l;return o*=2,u*=2,l*=-2,s[0]=o,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=u,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[10]=l,s[11]=0,s[12]=c,s[13]=d,s[14]=f,s[15]=1,s},Q.computePerspectiveOffCenter=function(e,t,n,r,a,i,s){var o=2*a/(t-e),u=2*a/(r-n),l=(t+e)/(t-e),c=(r+n)/(r-n),d=-(i+a)/(i-a),f=-2*i*a/(i-a);return s[0]=o,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=u,s[6]=0,s[7]=0,s[8]=l,s[9]=c,s[10]=d,s[11]=-1,s[12]=0,s[13]=0,s[14]=f,s[15]=0,s},Q.computeInfinitePerspectiveOffCenter=function(e,t,n,r,a,i){var s=2*a/(t-e),o=2*a/(r-n),u=(t+e)/(t-e),l=(r+n)/(r-n),c=-2*a;return i[0]=s,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=o,i[6]=0,i[7]=0,i[8]=u,i[9]=l,i[10]=-1,i[11]=-1,i[12]=0,i[13]=0,i[14]=c,i[15]=0,i},Q.computeViewportTransformation=function(e,t,n,r){I.defined(r)||(r=new Q),e=I.defaultValue(e,I.defaultValue.EMPTY_OBJECT);var a=I.defaultValue(e.x,0),i=I.defaultValue(e.y,0),s=I.defaultValue(e.width,0),o=I.defaultValue(e.height,0);t=I.defaultValue(t,0);var u=.5*s,l=.5*o,c=.5*((n=I.defaultValue(n,1))-t),d=l,f=c,h=a+u,p=i+l,m=t+c;return r[0]=u,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=d,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=f,r[11]=0,r[12]=h,r[13]=p,r[14]=m,r[15]=1,r},Q.computeView=function(e,t,n,r,a){return a[0]=r.x,a[1]=n.x,a[2]=-t.x,a[3]=0,a[4]=r.y,a[5]=n.y,a[6]=-t.y,a[7]=0,a[8]=r.z,a[9]=n.z,a[10]=-t.z,a[11]=0,a[12]=-P.Cartesian3.dot(r,e),a[13]=-P.Cartesian3.dot(n,e),a[14]=P.Cartesian3.dot(t,e),a[15]=1,a},Q.toArray=function(e,t){return I.defined(t)?(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t):[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]]},Q.getElementIndex=function(e,t){return 4*e+t},Q.getColumn=function(e,t,n){var r=4*t,a=e[r],i=e[1+r],s=e[2+r],o=e[3+r];return n.x=a,n.y=i,n.z=s,n.w=o,n},Q.setColumn=function(e,t,n,r){var a=4*t;return(r=Q.clone(e,r))[a]=n.x,r[1+a]=n.y,r[2+a]=n.z,r[3+a]=n.w,r},Q.setTranslation=function(e,t,n){return n[0]=e[0],n[1]=e[1],n[2]=e[2],n[3]=e[3],n[4]=e[4],n[5]=e[5],n[6]=e[6],n[7]=e[7],n[8]=e[8],n[9]=e[9],n[10]=e[10],n[11]=e[11],n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=e[15],n};var v=new P.Cartesian3;Q.setScale=function(e,t,n){var r=Q.getScale(e,v),a=P.Cartesian3.divideComponents(t,r,v);return Q.multiplyByScale(e,a,n)},Q.getRow=function(e,t,n){var r=e[t],a=e[t+4],i=e[t+8],s=e[t+12];return n.x=r,n.y=a,n.z=i,n.w=s,n},Q.setRow=function(e,t,n,r){return(r=Q.clone(e,r))[t]=n.x,r[t+4]=n.y,r[t+8]=n.z,r[t+12]=n.w,r};var C=new P.Cartesian3;Q.getScale=function(e,t){return t.x=P.Cartesian3.magnitude(P.Cartesian3.fromElements(e[0],e[1],e[2],C)),t.y=P.Cartesian3.magnitude(P.Cartesian3.fromElements(e[4],e[5],e[6],C)),t.z=P.Cartesian3.magnitude(P.Cartesian3.fromElements(e[8],e[9],e[10],C)),t};var w=new P.Cartesian3;Q.getMaximumScale=function(e){return Q.getScale(e,w),P.Cartesian3.maximumComponent(w)},Q.multiply=function(e,t,n){var r=e[0],a=e[1],i=e[2],s=e[3],o=e[4],u=e[5],l=e[6],c=e[7],d=e[8],f=e[9],h=e[10],p=e[11],m=e[12],y=e[13],v=e[14],C=e[15],w=t[0],g=t[1],x=t[2],E=t[3],O=t[4],_=t[5],S=t[6],b=t[7],M=t[8],R=t[9],A=t[10],T=t[11],q=t[12],z=t[13],I=t[14],P=t[15],D=r*w+o*g+d*x+m*E,N=a*w+u*g+f*x+y*E,U=i*w+l*g+h*x+v*E,F=s*w+c*g+p*x+C*E,V=r*O+o*_+d*S+m*b,L=a*O+u*_+f*S+y*b,B=i*O+l*_+h*S+v*b,W=s*O+c*_+p*S+C*b,j=r*M+o*R+d*A+m*T,k=a*M+u*R+f*A+y*T,Y=i*M+l*R+h*A+v*T,Z=s*M+c*R+p*A+C*T,X=r*q+o*z+d*I+m*P,H=a*q+u*z+f*I+y*P,J=i*q+l*z+h*I+v*P,G=s*q+c*z+p*I+C*P;return n[0]=D,n[1]=N,n[2]=U,n[3]=F,n[4]=V,n[5]=L,n[6]=B,n[7]=W,n[8]=j,n[9]=k,n[10]=Y,n[11]=Z,n[12]=X,n[13]=H,n[14]=J,n[15]=G,n},Q.add=function(e,t,n){return n[0]=e[0]+t[0],n[1]=e[1]+t[1],n[2]=e[2]+t[2],n[3]=e[3]+t[3],n[4]=e[4]+t[4],n[5]=e[5]+t[5],n[6]=e[6]+t[6],n[7]=e[7]+t[7],n[8]=e[8]+t[8],n[9]=e[9]+t[9],n[10]=e[10]+t[10],n[11]=e[11]+t[11],n[12]=e[12]+t[12],n[13]=e[13]+t[13],n[14]=e[14]+t[14],n[15]=e[15]+t[15],n},Q.subtract=function(e,t,n){return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],n[3]=e[3]-t[3],n[4]=e[4]-t[4],n[5]=e[5]-t[5],n[6]=e[6]-t[6],n[7]=e[7]-t[7],n[8]=e[8]-t[8],n[9]=e[9]-t[9],n[10]=e[10]-t[10],n[11]=e[11]-t[11],n[12]=e[12]-t[12],n[13]=e[13]-t[13],n[14]=e[14]-t[14],n[15]=e[15]-t[15],n},Q.multiplyTransformation=function(e,t,n){var r=e[0],a=e[1],i=e[2],s=e[4],o=e[5],u=e[6],l=e[8],c=e[9],d=e[10],f=e[12],h=e[13],p=e[14],m=t[0],y=t[1],v=t[2],C=t[4],w=t[5],g=t[6],x=t[8],E=t[9],O=t[10],_=t[12],S=t[13],b=t[14],M=r*m+s*y+l*v,R=a*m+o*y+c*v,A=i*m+u*y+d*v,T=r*C+s*w+l*g,q=a*C+o*w+c*g,z=i*C+u*w+d*g,I=r*x+s*E+l*O,P=a*x+o*E+c*O,D=i*x+u*E+d*O,N=r*_+s*S+l*b+f,U=a*_+o*S+c*b+h,F=i*_+u*S+d*b+p;return n[0]=M,n[1]=R,n[2]=A,n[3]=0,n[4]=T,n[5]=q,n[6]=z,n[7]=0,n[8]=I,n[9]=P,n[10]=D,n[11]=0,n[12]=N,n[13]=U,n[14]=F,n[15]=1,n},Q.multiplyByMatrix3=function(e,t,n){var r=e[0],a=e[1],i=e[2],s=e[4],o=e[5],u=e[6],l=e[8],c=e[9],d=e[10],f=t[0],h=t[1],p=t[2],m=t[3],y=t[4],v=t[5],C=t[6],w=t[7],g=t[8],x=r*f+s*h+l*p,E=a*f+o*h+c*p,O=i*f+u*h+d*p,_=r*m+s*y+l*v,S=a*m+o*y+c*v,b=i*m+u*y+d*v,M=r*C+s*w+l*g,R=a*C+o*w+c*g,A=i*C+u*w+d*g;return n[0]=x,n[1]=E,n[2]=O,n[3]=0,n[4]=_,n[5]=S,n[6]=b,n[7]=0,n[8]=M,n[9]=R,n[10]=A,n[11]=0,n[12]=e[12],n[13]=e[13],n[14]=e[14],n[15]=e[15],n},Q.multiplyByTranslation=function(e,t,n){var r=t.x,a=t.y,i=t.z,s=r*e[0]+a*e[4]+i*e[8]+e[12],o=r*e[1]+a*e[5]+i*e[9]+e[13],u=r*e[2]+a*e[6]+i*e[10]+e[14];return n[0]=e[0],n[1]=e[1],n[2]=e[2],n[3]=e[3],n[4]=e[4],n[5]=e[5],n[6]=e[6],n[7]=e[7],n[8]=e[8],n[9]=e[9],n[10]=e[10],n[11]=e[11],n[12]=s,n[13]=o,n[14]=u,n[15]=e[15],n};var O=new P.Cartesian3;Q.multiplyByUniformScale=function(e,t,n){return O.x=t,O.y=t,O.z=t,Q.multiplyByScale(e,O,n)},Q.multiplyByScale=function(e,t,n){var r=t.x,a=t.y,i=t.z;return 1===r&&1===a&&1===i?Q.clone(e,n):(n[0]=r*e[0],n[1]=r*e[1],n[2]=r*e[2],n[3]=0,n[4]=a*e[4],n[5]=a*e[5],n[6]=a*e[6],n[7]=0,n[8]=i*e[8],n[9]=i*e[9],n[10]=i*e[10],n[11]=0,n[12]=e[12],n[13]=e[13],n[14]=e[14],n[15]=1,n)},Q.multiplyByVector=function(e,t,n){var r=t.x,a=t.y,i=t.z,s=t.w,o=e[0]*r+e[4]*a+e[8]*i+e[12]*s,u=e[1]*r+e[5]*a+e[9]*i+e[13]*s,l=e[2]*r+e[6]*a+e[10]*i+e[14]*s,c=e[3]*r+e[7]*a+e[11]*i+e[15]*s;return n.x=o,n.y=u,n.z=l,n.w=c,n},Q.multiplyByPointAsVector=function(e,t,n){var r=t.x,a=t.y,i=t.z,s=e[0]*r+e[4]*a+e[8]*i,o=e[1]*r+e[5]*a+e[9]*i,u=e[2]*r+e[6]*a+e[10]*i;return n.x=s,n.y=o,n.z=u,n},Q.multiplyByPoint=function(e,t,n){var r=t.x,a=t.y,i=t.z,s=e[0]*r+e[4]*a+e[8]*i+e[12],o=e[1]*r+e[5]*a+e[9]*i+e[13],u=e[2]*r+e[6]*a+e[10]*i+e[14];return n.x=s,n.y=o,n.z=u,n},Q.multiplyByScalar=function(e,t,n){return n[0]=e[0]*t,n[1]=e[1]*t,n[2]=e[2]*t,n[3]=e[3]*t,n[4]=e[4]*t,n[5]=e[5]*t,n[6]=e[6]*t,n[7]=e[7]*t,n[8]=e[8]*t,n[9]=e[9]*t,n[10]=e[10]*t,n[11]=e[11]*t,n[12]=e[12]*t,n[13]=e[13]*t,n[14]=e[14]*t,n[15]=e[15]*t,n},Q.negate=function(e,t){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t[4]=-e[4],t[5]=-e[5],t[6]=-e[6],t[7]=-e[7],t[8]=-e[8],t[9]=-e[9],t[10]=-e[10],t[11]=-e[11],t[12]=-e[12],t[13]=-e[13],t[14]=-e[14],t[15]=-e[15],t},Q.transpose=function(e,t){var n=e[1],r=e[2],a=e[3],i=e[6],s=e[7],o=e[11];return t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=n,t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=r,t[9]=i,t[10]=e[10],t[11]=e[14],t[12]=a,t[13]=s,t[14]=o,t[15]=e[15],t},Q.abs=function(e,t){return t[0]=Math.abs(e[0]),t[1]=Math.abs(e[1]),t[2]=Math.abs(e[2]),t[3]=Math.abs(e[3]),t[4]=Math.abs(e[4]),t[5]=Math.abs(e[5]),t[6]=Math.abs(e[6]),t[7]=Math.abs(e[7]),t[8]=Math.abs(e[8]),t[9]=Math.abs(e[9]),t[10]=Math.abs(e[10]),t[11]=Math.abs(e[11]),t[12]=Math.abs(e[12]),t[13]=Math.abs(e[13]),t[14]=Math.abs(e[14]),t[15]=Math.abs(e[15]),t},Q.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&e[12]===t[12]&&e[13]===t[13]&&e[14]===t[14]&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[8]===t[8]&&e[9]===t[9]&&e[10]===t[10]&&e[3]===t[3]&&e[7]===t[7]&&e[11]===t[11]&&e[15]===t[15]},Q.equalsEpsilon=function(e,t,n){return n=I.defaultValue(n,0),e===t||I.defined(e)&&I.defined(t)&&Math.abs(e[0]-t[0])<=n&&Math.abs(e[1]-t[1])<=n&&Math.abs(e[2]-t[2])<=n&&Math.abs(e[3]-t[3])<=n&&Math.abs(e[4]-t[4])<=n&&Math.abs(e[5]-t[5])<=n&&Math.abs(e[6]-t[6])<=n&&Math.abs(e[7]-t[7])<=n&&Math.abs(e[8]-t[8])<=n&&Math.abs(e[9]-t[9])<=n&&Math.abs(e[10]-t[10])<=n&&Math.abs(e[11]-t[11])<=n&&Math.abs(e[12]-t[12])<=n&&Math.abs(e[13]-t[13])<=n&&Math.abs(e[14]-t[14])<=n&&Math.abs(e[15]-t[15])<=n},Q.getTranslation=function(e,t){return t.x=e[12],t.y=e[13],t.z=e[14],t},Q.getMatrix3=function(e,t){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t};var K=new J,$=new J,ee=new G,te=new G(0,0,0,1);function D(e,t){this.center=P.Cartesian3.clone(I.defaultValue(e,P.Cartesian3.ZERO)),this.radius=I.defaultValue(t,0)}Q.inverse=function(e,t){var n=e[0],r=e[4],a=e[8],i=e[12],s=e[1],o=e[5],u=e[9],l=e[13],c=e[2],d=e[6],f=e[10],h=e[14],p=e[3],m=e[7],y=e[11],v=e[15],C=f*v,w=h*y,g=d*v,x=h*m,E=d*y,O=f*m,_=c*v,S=h*p,b=c*y,M=f*p,R=c*m,A=d*p,T=C*o+x*u+E*l-(w*o+g*u+O*l),q=w*s+_*u+M*l-(C*s+S*u+b*l),z=g*s+S*o+R*l-(x*s+_*o+A*l),I=O*s+b*o+A*u-(E*s+M*o+R*u),P=w*r+g*a+O*i-(C*r+x*a+E*i),D=C*n+S*a+b*i-(w*n+_*a+M*i),N=x*n+_*r+A*i-(g*n+S*r+R*i),U=E*n+M*r+R*a-(O*n+b*r+A*a),F=(C=a*l)*m+(x=i*o)*y+(E=r*u)*v-((w=i*u)*m+(g=r*l)*y+(O=a*o)*v),V=w*p+(_=n*l)*y+(M=a*s)*v-(C*p+(S=i*s)*y+(b=n*u)*v),L=g*p+S*m+(R=n*o)*v-(x*p+_*m+(A=r*s)*v),B=O*p+b*m+A*y-(E*p+M*m+R*y),W=g*f+O*h+w*d-(E*h+C*d+x*f),j=b*h+C*c+S*f-(_*f+M*h+w*c),k=_*d+A*h+x*c-(R*h+g*c+S*d),Y=R*f+E*c+M*d-(b*d+A*f+O*c),Z=n*T+r*q+a*z+i*I;if(Math.abs(Z)<X.CesiumMath.EPSILON21){if(J.equalsEpsilon(Q.getMatrix3(e,K),$,X.CesiumMath.EPSILON7)&&G.equals(Q.getRow(e,3,ee),te))return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=0,t[11]=0,t[12]=-e[12],t[13]=-e[13],t[14]=-e[14],t[15]=1,t;throw new H.RuntimeError("matrix is not invertible because its determinate is zero.")}return Z=1/Z,t[0]=T*Z,t[1]=q*Z,t[2]=z*Z,t[3]=I*Z,t[4]=P*Z,t[5]=D*Z,t[6]=N*Z,t[7]=U*Z,t[8]=F*Z,t[9]=V*Z,t[10]=L*Z,t[11]=B*Z,t[12]=W*Z,t[13]=j*Z,t[14]=k*Z,t[15]=Y*Z,t},Q.inverseTransformation=function(e,t){var n=e[0],r=e[1],a=e[2],i=e[4],s=e[5],o=e[6],u=e[8],l=e[9],c=e[10],d=e[12],f=e[13],h=e[14],p=-n*d-r*f-a*h,m=-i*d-s*f-o*h,y=-u*d-l*f-c*h;return t[0]=n,t[1]=i,t[2]=u,t[3]=0,t[4]=r,t[5]=s,t[6]=l,t[7]=0,t[8]=a,t[9]=o,t[10]=c,t[11]=0,t[12]=p,t[13]=m,t[14]=y,t[15]=1,t},Q.IDENTITY=Object.freeze(new Q(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)),Q.ZERO=Object.freeze(new Q(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)),Q.COLUMN0ROW0=0,Q.COLUMN0ROW1=1,Q.COLUMN0ROW2=2,Q.COLUMN0ROW3=3,Q.COLUMN1ROW0=4,Q.COLUMN1ROW1=5,Q.COLUMN1ROW2=6,Q.COLUMN1ROW3=7,Q.COLUMN2ROW0=8,Q.COLUMN2ROW1=9,Q.COLUMN2ROW2=10,Q.COLUMN2ROW3=11,Q.COLUMN3ROW0=12,Q.COLUMN3ROW1=13,Q.COLUMN3ROW2=14,Q.COLUMN3ROW3=15,Object.defineProperties(Q.prototype,{length:{get:function(){return Q.packedLength}}}),Q.prototype.clone=function(e){return Q.clone(this,e)},Q.prototype.equals=function(e){return Q.equals(this,e)},Q.equalsArray=function(e,t,n){return e[0]===t[n]&&e[1]===t[n+1]&&e[2]===t[n+2]&&e[3]===t[n+3]&&e[4]===t[n+4]&&e[5]===t[n+5]&&e[6]===t[n+6]&&e[7]===t[n+7]&&e[8]===t[n+8]&&e[9]===t[n+9]&&e[10]===t[n+10]&&e[11]===t[n+11]&&e[12]===t[n+12]&&e[13]===t[n+13]&&e[14]===t[n+14]&&e[15]===t[n+15]},Q.prototype.equalsEpsilon=function(e,t){return Q.equalsEpsilon(this,e,t)},Q.prototype.toString=function(){return"("+this[0]+", "+this[4]+", "+this[8]+", "+this[12]+")\n("+this[1]+", "+this[5]+", "+this[9]+", "+this[13]+")\n("+this[2]+", "+this[6]+", "+this[10]+", "+this[14]+")\n("+this[3]+", "+this[7]+", "+this[11]+", "+this[15]+")"};var N=new P.Cartesian3,U=new P.Cartesian3,F=new P.Cartesian3,V=new P.Cartesian3,L=new P.Cartesian3,B=new P.Cartesian3,W=new P.Cartesian3,j=new P.Cartesian3,k=new P.Cartesian3,Y=new P.Cartesian3,Z=new P.Cartesian3,ne=new P.Cartesian3,_=4/3*X.CesiumMath.PI;D.fromPoints=function(e,t){if(I.defined(t)||(t=new D),!I.defined(e)||0===e.length)return t.center=P.Cartesian3.clone(P.Cartesian3.ZERO,t.center),t.radius=0,t;for(var n=P.Cartesian3.clone(e[0],W),r=P.Cartesian3.clone(n,N),a=P.Cartesian3.clone(n,U),i=P.Cartesian3.clone(n,F),s=P.Cartesian3.clone(n,V),o=P.Cartesian3.clone(n,L),u=P.Cartesian3.clone(n,B),l=e.length,c=1;c<l;c++){P.Cartesian3.clone(e[c],n);var d=n.x,f=n.y,h=n.z;d<r.x&&P.Cartesian3.clone(n,r),d>s.x&&P.Cartesian3.clone(n,s),f<a.y&&P.Cartesian3.clone(n,a),f>o.y&&P.Cartesian3.clone(n,o),h<i.z&&P.Cartesian3.clone(n,i),h>u.z&&P.Cartesian3.clone(n,u)}var p=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(s,r,j)),m=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(o,a,j)),y=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(u,i,j)),v=r,C=s,w=p;w<m&&(w=m,v=a,C=o),w<y&&(w=y,v=i,C=u);var g=k;g.x=.5*(v.x+C.x),g.y=.5*(v.y+C.y),g.z=.5*(v.z+C.z);var x=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(C,g,j)),E=Math.sqrt(x),O=Y;O.x=r.x,O.y=a.y,O.z=i.z;var _=Z;_.x=s.x,_.y=o.y,_.z=u.z;var S=P.Cartesian3.midpoint(O,_,ne),b=0;for(c=0;c<l;c++){P.Cartesian3.clone(e[c],n);var M=P.Cartesian3.magnitude(P.Cartesian3.subtract(n,S,j));b<M&&(b=M);var R,A,T=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(n,g,j));x<T&&(x=(E=.5*(E+(R=Math.sqrt(T))))*E,A=R-E,g.x=(E*g.x+A*n.x)/R,g.y=(E*g.y+A*n.y)/R,g.z=(E*g.z+A*n.z)/R)}return E<b?(P.Cartesian3.clone(g,t.center),t.radius=E):(P.Cartesian3.clone(S,t.center),t.radius=b),t};var S=new t,b=new P.Cartesian3,M=new P.Cartesian3,R=new P.Cartographic,A=new P.Cartographic;D.fromRectangle2D=function(e,t,n){return D.fromRectangleWithHeights2D(e,t,0,0,n)},D.fromRectangleWithHeights2D=function(e,t,n,r,a){if(I.defined(a)||(a=new D),!I.defined(e))return a.center=P.Cartesian3.clone(P.Cartesian3.ZERO,a.center),a.radius=0,a;t=I.defaultValue(t,S),P.Rectangle.southwest(e,R),R.height=n,P.Rectangle.northeast(e,A),A.height=r;var i=t.project(R,b),s=t.project(A,M),o=s.x-i.x,u=s.y-i.y,l=s.z-i.z;a.radius=.5*Math.sqrt(o*o+u*u+l*l);var c=a.center;return c.x=i.x+.5*o,c.y=i.y+.5*u,c.z=i.z+.5*l,a};var T=[];D.fromRectangle3D=function(e,t,n,r){if(t=I.defaultValue(t,P.Ellipsoid.WGS84),n=I.defaultValue(n,0),I.defined(r)||(r=new D),!I.defined(e))return r.center=P.Cartesian3.clone(P.Cartesian3.ZERO,r.center),r.radius=0,r;var a=P.Rectangle.subsample(e,t,n,T);return D.fromPoints(a,r)},D.fromVertices=function(e,t,n,r){if(I.defined(r)||(r=new D),!I.defined(e)||0===e.length)return r.center=P.Cartesian3.clone(P.Cartesian3.ZERO,r.center),r.radius=0,r;t=I.defaultValue(t,P.Cartesian3.ZERO),n=I.defaultValue(n,3);var a=W;a.x=e[0]+t.x,a.y=e[1]+t.y,a.z=e[2]+t.z;for(var i=P.Cartesian3.clone(a,N),s=P.Cartesian3.clone(a,U),o=P.Cartesian3.clone(a,F),u=P.Cartesian3.clone(a,V),l=P.Cartesian3.clone(a,L),c=P.Cartesian3.clone(a,B),d=e.length,f=0;f<d;f+=n){var h=e[f]+t.x,p=e[f+1]+t.y,m=e[f+2]+t.z;a.x=h,a.y=p,a.z=m,h<i.x&&P.Cartesian3.clone(a,i),h>u.x&&P.Cartesian3.clone(a,u),p<s.y&&P.Cartesian3.clone(a,s),p>l.y&&P.Cartesian3.clone(a,l),m<o.z&&P.Cartesian3.clone(a,o),m>c.z&&P.Cartesian3.clone(a,c)}var y=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(u,i,j)),v=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(l,s,j)),C=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(c,o,j)),w=i,g=u,x=y;x<v&&(x=v,w=s,g=l),x<C&&(x=C,w=o,g=c);var E=k;E.x=.5*(w.x+g.x),E.y=.5*(w.y+g.y),E.z=.5*(w.z+g.z);var O=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(g,E,j)),_=Math.sqrt(O),S=Y;S.x=i.x,S.y=s.y,S.z=o.z;var b=Z;b.x=u.x,b.y=l.y,b.z=c.z;var M=P.Cartesian3.midpoint(S,b,ne),R=0;for(f=0;f<d;f+=n){a.x=e[f]+t.x,a.y=e[f+1]+t.y,a.z=e[f+2]+t.z;var A=P.Cartesian3.magnitude(P.Cartesian3.subtract(a,M,j));R<A&&(R=A);var T,q,z=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(a,E,j));O<z&&(O=(_=.5*(_+(T=Math.sqrt(z))))*_,q=T-_,E.x=(_*E.x+q*a.x)/T,E.y=(_*E.y+q*a.y)/T,E.z=(_*E.z+q*a.z)/T)}return _<R?(P.Cartesian3.clone(E,r.center),r.radius=_):(P.Cartesian3.clone(M,r.center),r.radius=R),r},D.fromEncodedCartesianVertices=function(e,t,n){if(I.defined(n)||(n=new D),!I.defined(e)||!I.defined(t)||e.length!==t.length||0===e.length)return n.center=P.Cartesian3.clone(P.Cartesian3.ZERO,n.center),n.radius=0,n;var r=W;r.x=e[0]+t[0],r.y=e[1]+t[1],r.z=e[2]+t[2];for(var a=P.Cartesian3.clone(r,N),i=P.Cartesian3.clone(r,U),s=P.Cartesian3.clone(r,F),o=P.Cartesian3.clone(r,V),u=P.Cartesian3.clone(r,L),l=P.Cartesian3.clone(r,B),c=e.length,d=0;d<c;d+=3){var f=e[d]+t[d],h=e[d+1]+t[d+1],p=e[d+2]+t[d+2];r.x=f,r.y=h,r.z=p,f<a.x&&P.Cartesian3.clone(r,a),f>o.x&&P.Cartesian3.clone(r,o),h<i.y&&P.Cartesian3.clone(r,i),h>u.y&&P.Cartesian3.clone(r,u),p<s.z&&P.Cartesian3.clone(r,s),p>l.z&&P.Cartesian3.clone(r,l)}var m=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(o,a,j)),y=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(u,i,j)),v=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(l,s,j)),C=a,w=o,g=m;g<y&&(g=y,C=i,w=u),g<v&&(g=v,C=s,w=l);var x=k;x.x=.5*(C.x+w.x),x.y=.5*(C.y+w.y),x.z=.5*(C.z+w.z);var E=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(w,x,j)),O=Math.sqrt(E),_=Y;_.x=a.x,_.y=i.y,_.z=s.z;var S=Z;S.x=o.x,S.y=u.y,S.z=l.z;var b=P.Cartesian3.midpoint(_,S,ne),M=0;for(d=0;d<c;d+=3){r.x=e[d]+t[d],r.y=e[d+1]+t[d+1],r.z=e[d+2]+t[d+2];var R=P.Cartesian3.magnitude(P.Cartesian3.subtract(r,b,j));M<R&&(M=R);var A,T,q=P.Cartesian3.magnitudeSquared(P.Cartesian3.subtract(r,x,j));E<q&&(E=(O=.5*(O+(A=Math.sqrt(q))))*O,T=A-O,x.x=(O*x.x+T*r.x)/A,x.y=(O*x.y+T*r.y)/A,x.z=(O*x.z+T*r.z)/A)}return O<M?(P.Cartesian3.clone(x,n.center),n.radius=O):(P.Cartesian3.clone(b,n.center),n.radius=M),n},D.fromCornerPoints=function(e,t,n){I.defined(n)||(n=new D);var r=P.Cartesian3.midpoint(e,t,n.center);return n.radius=P.Cartesian3.distance(r,t),n},D.fromEllipsoid=function(e,t){return I.defined(t)||(t=new D),P.Cartesian3.clone(P.Cartesian3.ZERO,t.center),t.radius=e.maximumRadius,t};var q=new P.Cartesian3;D.fromBoundingSpheres=function(e,t){if(I.defined(t)||(t=new D),!I.defined(e)||0===e.length)return t.center=P.Cartesian3.clone(P.Cartesian3.ZERO,t.center),t.radius=0,t;var n=e.length;if(1===n)return D.clone(e[0],t);if(2===n)return D.union(e[0],e[1],t);for(var r=[],a=0;a<n;a++)r.push(e[a].center);var i=(t=D.fromPoints(r,t)).center,s=t.radius;for(a=0;a<n;a++)var o=e[a],s=Math.max(s,P.Cartesian3.distance(i,o.center,q)+o.radius);return t.radius=s,t};var z=new P.Cartesian3,re=new P.Cartesian3,ae=new P.Cartesian3;D.fromOrientedBoundingBox=function(e,t){I.defined(t)||(t=new D);var n=e.halfAxes,r=J.getColumn(n,0,z),a=J.getColumn(n,1,re),i=J.getColumn(n,2,ae);return P.Cartesian3.add(r,a,r),P.Cartesian3.add(r,i,r),t.center=P.Cartesian3.clone(e.center,t.center),t.radius=P.Cartesian3.magnitude(r),t},D.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t.center=P.Cartesian3.clone(e.center,t.center),t.radius=e.radius,t):new D(e.center,e.radius)},D.packedLength=4,D.pack=function(e,t,n){n=I.defaultValue(n,0);var r=e.center;return t[n++]=r.x,t[n++]=r.y,t[n++]=r.z,t[n]=e.radius,t},D.unpack=function(e,t,n){t=I.defaultValue(t,0),I.defined(n)||(n=new D);var r=n.center;return r.x=e[t++],r.y=e[t++],r.z=e[t++],n.radius=e[t],n};var ie=new P.Cartesian3,se=new P.Cartesian3;D.union=function(e,t,n){I.defined(n)||(n=new D);var r=e.center,a=e.radius,i=t.center,s=t.radius,o=P.Cartesian3.subtract(i,r,ie),u=P.Cartesian3.magnitude(o);if(u+s<=a)return e.clone(n),n;if(u+a<=s)return t.clone(n),n;var l=.5*(a+u+s),c=P.Cartesian3.multiplyByScalar(o,(l-a)/u,se);return P.Cartesian3.add(c,r,c),P.Cartesian3.clone(c,n.center),n.radius=l,n};var oe=new P.Cartesian3;D.expand=function(e,t,n){n=D.clone(e,n);var r=P.Cartesian3.magnitude(P.Cartesian3.subtract(t,n.center,oe));return r>n.radius&&(n.radius=r),n},D.intersectPlane=function(e,t){var n=e.center,r=e.radius,a=t.normal,i=P.Cartesian3.dot(a,n)+t.distance;return i<-r?s.OUTSIDE:i<r?s.INTERSECTING:s.INSIDE},D.transform=function(e,t,n){return I.defined(n)||(n=new D),n.center=Q.multiplyByPoint(t,e.center,n.center),n.radius=Q.getMaximumScale(t)*e.radius,n};var ue=new P.Cartesian3;D.distanceSquaredTo=function(e,t){var n=P.Cartesian3.subtract(e.center,t,ue);return P.Cartesian3.magnitudeSquared(n)-e.radius*e.radius},D.transformWithoutScale=function(e,t,n){return I.defined(n)||(n=new D),n.center=Q.multiplyByPoint(t,e.center,n.center),n.radius=e.radius,n};var le=new P.Cartesian3;D.computePlaneDistances=function(e,t,n,r){I.defined(r)||(r=new o);var a=P.Cartesian3.subtract(e.center,t,le),i=P.Cartesian3.dot(n,a);return r.start=i-e.radius,r.stop=i+e.radius,r};for(var ce=new P.Cartesian3,de=new P.Cartesian3,fe=new P.Cartesian3,he=new P.Cartesian3,pe=new P.Cartesian3,me=new P.Cartographic,ye=new Array(8),ve=0;ve<8;++ve)ye[ve]=new P.Cartesian3;var Ce,we=new t;D.projectTo2D=function(e,t,n){var r=(t=I.defaultValue(t,we)).ellipsoid,a=e.center,i=e.radius,s=P.Cartesian3.equals(a,P.Cartesian3.ZERO)?P.Cartesian3.clone(P.Cartesian3.UNIT_X,ce):r.geodeticSurfaceNormal(a,ce),o=P.Cartesian3.cross(P.Cartesian3.UNIT_Z,s,de);P.Cartesian3.normalize(o,o);var u=P.Cartesian3.cross(s,o,fe);P.Cartesian3.normalize(u,u),P.Cartesian3.multiplyByScalar(s,i,s),P.Cartesian3.multiplyByScalar(u,i,u),P.Cartesian3.multiplyByScalar(o,i,o);var l=P.Cartesian3.negate(u,pe),c=P.Cartesian3.negate(o,he),d=ye,f=d[0];P.Cartesian3.add(s,u,f),P.Cartesian3.add(f,o,f),f=d[1],P.Cartesian3.add(s,u,f),P.Cartesian3.add(f,c,f),f=d[2],P.Cartesian3.add(s,l,f),P.Cartesian3.add(f,c,f),f=d[3],P.Cartesian3.add(s,l,f),P.Cartesian3.add(f,o,f),P.Cartesian3.negate(s,s),f=d[4],P.Cartesian3.add(s,u,f),P.Cartesian3.add(f,o,f),f=d[5],P.Cartesian3.add(s,u,f),P.Cartesian3.add(f,c,f),f=d[6],P.Cartesian3.add(s,l,f),P.Cartesian3.add(f,c,f),f=d[7],P.Cartesian3.add(s,l,f),P.Cartesian3.add(f,o,f);for(var h=d.length,p=0;p<h;++p){var m=d[p];P.Cartesian3.add(a,m,m);var y=r.cartesianToCartographic(m,me);t.project(y,m)}var v=(a=(n=D.fromPoints(d,n)).center).x,C=a.y,w=a.z;return a.x=w,a.y=v,a.z=C,n},D.isOccluded=function(e,t){return!t.isBoundingSphereVisible(e)},D.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&P.Cartesian3.equals(e.center,t.center)&&e.radius===t.radius},D.prototype.intersectPlane=function(e){return D.intersectPlane(this,e)},D.prototype.distanceSquaredTo=function(e){return D.distanceSquaredTo(this,e)},D.prototype.computePlaneDistances=function(e,t,n){return D.computePlaneDistances(this,e,t,n)},D.prototype.isOccluded=function(e){return D.isOccluded(this,e)},D.prototype.equals=function(e){return D.equals(this,e)},D.prototype.clone=function(e){return D.clone(this,e)},D.prototype.volume=function(){var e=this.radius;return _*e*e*e};var ge,xe,Ee,Oe,_e,Se,be,Me,Re,Ae,Te,qe,ze,Ie,Pe,De,Ne,Ue={requestFullscreen:void 0,exitFullscreen:void 0,fullscreenEnabled:void 0,fullscreenElement:void 0,fullscreenchange:void 0,fullscreenerror:void 0},Fe={};function Ve(e){for(var t=e.split("."),n=0,r=t.length;n<r;++n)t[n]=parseInt(t[n],10);return t}function Le(){var e;return I.defined(xe)||(xe=!1,ke()||null!==(e=/ Chrome\/([\.0-9]+)/.exec(ge.userAgent))&&(xe=!0,Ee=Ve(e[1]))),xe}function Be(){var e;return I.defined(Oe)||(Oe=!1,Le()||ke()||!/ Safari\/[\.0-9]+/.test(ge.userAgent)||null!==(e=/ Version\/([\.0-9]+)/.exec(ge.userAgent))&&(Oe=!0,_e=Ve(e[1]))),Oe}function We(){var e;return I.defined(Se)||(Se=!1,null!==(e=/ AppleWebKit\/([\.0-9]+)(\+?)/.exec(ge.userAgent))&&(Se=!0,(be=Ve(e[1])).isNightly=!!e[2])),Se}function je(){var e;return I.defined(Me)||(Me=!1,"Microsoft Internet Explorer"===ge.appName?null!==(e=/MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(ge.userAgent))&&(Me=!0,Re=Ve(e[1])):"Netscape"===ge.appName&&null!==(e=/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(ge.userAgent))&&(Me=!0,Re=Ve(e[1]))),Me}function ke(){var e;return I.defined(Ae)||(Ae=!1,null!==(e=/ Edge\/([\.0-9]+)/.exec(ge.userAgent))&&(Ae=!0,Te=Ve(e[1]))),Ae}function Ye(){var e;return I.defined(qe)||(qe=!1,null!==(e=/Firefox\/([\.0-9]+)/.exec(ge.userAgent))&&(qe=!0,ze=Ve(e[1]))),qe}function Ze(){var e,t;return I.defined(Ne)||((e=document.createElement("canvas")).setAttribute("style","image-rendering: -moz-crisp-edges;image-rendering: pixelated;"),t=e.style.imageRendering,(Ne=I.defined(t)&&""!==t)&&(De=t)),Ne}function Xe(){return Xe._result}Object.defineProperties(Fe,{element:{get:function(){if(Fe.supportsFullscreen())return document[Ue.fullscreenElement]}},changeEventName:{get:function(){if(Fe.supportsFullscreen())return Ue.fullscreenchange}},errorEventName:{get:function(){if(Fe.supportsFullscreen())return Ue.fullscreenerror}},enabled:{get:function(){if(Fe.supportsFullscreen())return document[Ue.fullscreenEnabled]}},fullscreen:{get:function(){if(Fe.supportsFullscreen())return null!==Fe.element}}}),Fe.supportsFullscreen=function(){if(I.defined(Ce))return Ce;Ce=!1;var e=document.body;if("function"==typeof e.requestFullscreen)return Ue.requestFullscreen="requestFullscreen",Ue.exitFullscreen="exitFullscreen",Ue.fullscreenEnabled="fullscreenEnabled",Ue.fullscreenElement="fullscreenElement",Ue.fullscreenchange="fullscreenchange",Ue.fullscreenerror="fullscreenerror",Ce=!0;for(var t=["webkit","moz","o","ms","khtml"],n=0,r=t.length;n<r;++n){var a,i=t[n];"function"!=typeof e[a=i+"RequestFullscreen"]&&"function"!=typeof e[a=i+"RequestFullScreen"]||(Ue.requestFullscreen=a,Ce=!0),a=i+"ExitFullscreen","function"==typeof document[a]?Ue.exitFullscreen=a:(a=i+"CancelFullScreen","function"==typeof document[a]&&(Ue.exitFullscreen=a)),a=i+"FullscreenEnabled",void 0!==document[a]?Ue.fullscreenEnabled=a:(a=i+"FullScreenEnabled",void 0!==document[a]&&(Ue.fullscreenEnabled=a)),a=i+"FullscreenElement",void 0!==document[a]?Ue.fullscreenElement=a:(a=i+"FullScreenElement",void 0!==document[a]&&(Ue.fullscreenElement=a)),a=i+"fullscreenchange",void 0!==document["on"+a]&&("ms"===i&&(a="MSFullscreenChange"),Ue.fullscreenchange=a),a=i+"fullscreenerror",void 0!==document["on"+a]&&("ms"===i&&(a="MSFullscreenError"),Ue.fullscreenerror=a)}return Ce},Fe.requestFullscreen=function(e,t){Fe.supportsFullscreen()&&e[Ue.requestFullscreen]({vrDisplay:t})},Fe.exitFullscreen=function(){Fe.supportsFullscreen()&&document[Ue.exitFullscreen]()},Fe._names=Ue,ge="undefined"!=typeof navigator?navigator:{},Xe._promise=void 0,Xe._result=void 0,Xe.initialize=function(){if(I.defined(Xe._promise))return Xe._promise;var e=I.when.defer();if(Xe._promise=e.promise,ke())return Xe._result=!1,e.resolve(Xe._result),e.promise;var t=new Image;return t.onload=function(){Xe._result=0<t.width&&0<t.height,e.resolve(Xe._result)},t.onerror=function(){Xe._result=!1,e.resolve(Xe._result)},t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",e.promise},Object.defineProperties(Xe,{initialized:{get:function(){return I.defined(Xe._result)}}});var He=[];"undefined"!=typeof ArrayBuffer&&(He.push(Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array),"undefined"!=typeof Uint8ClampedArray&&He.push(Uint8ClampedArray),"undefined"!=typeof Uint8ClampedArray&&He.push(Uint8ClampedArray));var Je={isChrome:Le,chromeVersion:function(){return Le()&&Ee},isSafari:Be,safariVersion:function(){return Be()&&_e},isWebkit:We,webkitVersion:function(){return We()&&be},isInternetExplorer:je,internetExplorerVersion:function(){return je()&&Re},isEdge:ke,edgeVersion:function(){return ke()&&Te},isFirefox:Ye,firefoxVersion:function(){return Ye()&&ze},isWindows:function(){return I.defined(Ie)||(Ie=/Windows/i.test(ge.appVersion)),Ie},hardwareConcurrency:I.defaultValue(ge.hardwareConcurrency,3),supportsPointerEvents:function(){return I.defined(Pe)||(Pe=!Ye()&&"undefined"!=typeof PointerEvent&&(!I.defined(ge.pointerEnabled)||ge.pointerEnabled)),Pe},supportsImageRenderingPixelated:Ze,supportsWebP:Xe,imageRenderingValue:function(){return Ze()?De:void 0},typedArrayTypes:He};function Ge(e,t,n,r){this.x=I.defaultValue(e,0),this.y=I.defaultValue(t,0),this.z=I.defaultValue(n,0),this.w=I.defaultValue(r,0)}Je.supportsFullscreen=function(){return Fe.supportsFullscreen()},Je.supportsTypedArrays=function(){return"undefined"!=typeof ArrayBuffer},Je.supportsWebWorkers=function(){return"undefined"!=typeof Worker},Je.supportsWebAssembly=function(){return"undefined"!=typeof WebAssembly&&!Je.isEdge()};var Qe=new P.Cartesian3;Ge.fromAxisAngle=function(e,t,n){var r=t/2,a=Math.sin(r),i=(Qe=P.Cartesian3.normalize(e,Qe)).x*a,s=Qe.y*a,o=Qe.z*a,u=Math.cos(r);return I.defined(n)?(n.x=i,n.y=s,n.z=o,n.w=u,n):new Ge(i,s,o,u)};var Ke=[1,2,0],$e=new Array(3);Ge.fromRotationMatrix=function(e,t){var n,r,a,i,s,o,u,l,c=e[J.COLUMN0ROW0],d=e[J.COLUMN1ROW1],f=e[J.COLUMN2ROW2],h=c+d+f,p=0<h?(a=.5*(u=Math.sqrt(h+1)),u=.5/u,n=(e[J.COLUMN1ROW2]-e[J.COLUMN2ROW1])*u,r=(e[J.COLUMN2ROW0]-e[J.COLUMN0ROW2])*u,(e[J.COLUMN0ROW1]-e[J.COLUMN1ROW0])*u):(o=Ke[s=Ke[i=c<f&&d<f?2:c<d?1:0]],u=Math.sqrt(e[J.getElementIndex(i,i)]-e[J.getElementIndex(s,s)]-e[J.getElementIndex(o,o)]+1),(l=$e)[i]=.5*u,u=.5/u,a=(e[J.getElementIndex(o,s)]-e[J.getElementIndex(s,o)])*u,l[s]=(e[J.getElementIndex(s,i)]+e[J.getElementIndex(i,s)])*u,l[o]=(e[J.getElementIndex(o,i)]+e[J.getElementIndex(i,o)])*u,n=-l[0],r=-l[1],-l[2]);return I.defined(t)?(t.x=n,t.y=r,t.z=p,t.w=a,t):new Ge(n,r,p,a)};var et=new Ge,tt=new Ge,nt=new Ge,rt=new Ge;Ge.fromHeadingPitchRoll=function(e,t){return rt=Ge.fromAxisAngle(P.Cartesian3.UNIT_X,e.roll,et),nt=Ge.fromAxisAngle(P.Cartesian3.UNIT_Y,-e.pitch,t),t=Ge.multiply(nt,rt,nt),tt=Ge.fromAxisAngle(P.Cartesian3.UNIT_Z,-e.heading,et),Ge.multiply(tt,t,t)};var at=new P.Cartesian3,it=new P.Cartesian3,st=new Ge,ot=new Ge,ut=new Ge;Ge.packedLength=4,Ge.pack=function(e,t,n){return n=I.defaultValue(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.z,t[n]=e.w,t},Ge.unpack=function(e,t,n){return t=I.defaultValue(t,0),I.defined(n)||(n=new Ge),n.x=e[t],n.y=e[t+1],n.z=e[t+2],n.w=e[t+3],n},Ge.packedInterpolationLength=3,Ge.convertPackedArrayForInterpolation=function(e,t,n,r){Ge.unpack(e,4*n,ut),Ge.conjugate(ut,ut);for(var a=0,i=n-t+1;a<i;a++){var s=3*a;Ge.unpack(e,4*(t+a),st),Ge.multiply(st,ut,st),st.w<0&&Ge.negate(st,st),Ge.computeAxis(st,at);var o=Ge.computeAngle(st);I.defined(r)||(r=[]),r[s]=at.x*o,r[1+s]=at.y*o,r[2+s]=at.z*o}},Ge.unpackInterpolationResult=function(e,t,n,r,a){I.defined(a)||(a=new Ge),P.Cartesian3.fromArray(e,0,it);var i=P.Cartesian3.magnitude(it);return Ge.unpack(t,4*r,ot),0===i?Ge.clone(Ge.IDENTITY,st):Ge.fromAxisAngle(it,i,st),Ge.multiply(st,ot,a)},Ge.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t):new Ge(e.x,e.y,e.z,e.w)},Ge.conjugate=function(e,t){return t.x=-e.x,t.y=-e.y,t.z=-e.z,t.w=e.w,t},Ge.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y+e.z*e.z+e.w*e.w},Ge.magnitude=function(e){return Math.sqrt(Ge.magnitudeSquared(e))},Ge.normalize=function(e,t){var n=1/Ge.magnitude(e),r=e.x*n,a=e.y*n,i=e.z*n,s=e.w*n;return t.x=r,t.y=a,t.z=i,t.w=s,t},Ge.inverse=function(e,t){var n=Ge.magnitudeSquared(e);return t=Ge.conjugate(e,t),Ge.multiplyByScalar(t,1/n,t)},Ge.add=function(e,t,n){return n.x=e.x+t.x,n.y=e.y+t.y,n.z=e.z+t.z,n.w=e.w+t.w,n},Ge.subtract=function(e,t,n){return n.x=e.x-t.x,n.y=e.y-t.y,n.z=e.z-t.z,n.w=e.w-t.w,n},Ge.negate=function(e,t){return t.x=-e.x,t.y=-e.y,t.z=-e.z,t.w=-e.w,t},Ge.dot=function(e,t){return e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},Ge.multiply=function(e,t,n){var r=e.x,a=e.y,i=e.z,s=e.w,o=t.x,u=t.y,l=t.z,c=t.w,d=s*o+r*c+a*l-i*u,f=s*u-r*l+a*c+i*o,h=s*l+r*u-a*o+i*c,p=s*c-r*o-a*u-i*l;return n.x=d,n.y=f,n.z=h,n.w=p,n},Ge.multiplyByScalar=function(e,t,n){return n.x=e.x*t,n.y=e.y*t,n.z=e.z*t,n.w=e.w*t,n},Ge.divideByScalar=function(e,t,n){return n.x=e.x/t,n.y=e.y/t,n.z=e.z/t,n.w=e.w/t,n},Ge.computeAxis=function(e,t){var n=e.w;if(Math.abs(n-1)<X.CesiumMath.EPSILON6)return t.x=t.y=t.z=0,t;var r=1/Math.sqrt(1-n*n);return t.x=e.x*r,t.y=e.y*r,t.z=e.z*r,t},Ge.computeAngle=function(e){return Math.abs(e.w-1)<X.CesiumMath.EPSILON6?0:2*Math.acos(e.w)};var lt=new Ge;Ge.lerp=function(e,t,n,r){return lt=Ge.multiplyByScalar(t,n,lt),r=Ge.multiplyByScalar(e,1-n,r),Ge.add(lt,r,r)};var ct=new Ge,dt=new Ge,ft=new Ge;Ge.slerp=function(e,t,n,r){var a=Ge.dot(e,t),i=t;if(a<0&&(a=-a,i=ct=Ge.negate(t,ct)),1-a<X.CesiumMath.EPSILON6)return Ge.lerp(e,i,n,r);var s=Math.acos(a);return dt=Ge.multiplyByScalar(e,Math.sin((1-n)*s),dt),ft=Ge.multiplyByScalar(i,Math.sin(n*s),ft),r=Ge.add(dt,ft,r),Ge.multiplyByScalar(r,1/Math.sin(s),r)},Ge.log=function(e,t){var n=X.CesiumMath.acosClamped(e.w),r=0;return 0!==n&&(r=n/Math.sin(n)),P.Cartesian3.multiplyByScalar(e,r,t)},Ge.exp=function(e,t){var n=P.Cartesian3.magnitude(e),r=0;return 0!==n&&(r=Math.sin(n)/n),t.x=e.x*r,t.y=e.y*r,t.z=e.z*r,t.w=Math.cos(n),t};var ht=new P.Cartesian3,pt=new P.Cartesian3,mt=new Ge,yt=new Ge;Ge.computeInnerQuadrangle=function(e,t,n,r){var a=Ge.conjugate(t,mt);Ge.multiply(a,n,yt);var i=Ge.log(yt,ht);Ge.multiply(a,e,yt);var s=Ge.log(yt,pt);return P.Cartesian3.add(i,s,i),P.Cartesian3.multiplyByScalar(i,.25,i),P.Cartesian3.negate(i,i),Ge.exp(i,mt),Ge.multiply(t,mt,r)},Ge.squad=function(e,t,n,r,a,i){var s=Ge.slerp(e,t,a,mt),o=Ge.slerp(n,r,a,yt);return Ge.slerp(s,o,2*a*(1-a),i)};for(var vt=new Ge,Ct=1.9011074535173003,wt=Je.supportsTypedArrays()?new Float32Array(8):[],gt=Je.supportsTypedArrays()?new Float32Array(8):[],xt=Je.supportsTypedArrays()?new Float32Array(8):[],Et=Je.supportsTypedArrays()?new Float32Array(8):[],Ot=0;Ot<7;++Ot){var _t=Ot+1,St=2*_t+1;wt[Ot]=1/(_t*St),gt[Ot]=_t/St}function bt(e,t,n){for(var r,a,i=0,s=e.length-1;i<=s;)if((a=n(e[r=~~((i+s)/2)],t))<0)i=1+r;else{if(!(0<a))return r;s=r-1}return~(s+1)}function Mt(e,t,n,r,a){this.xPoleWander=e,this.yPoleWander=t,this.xPoleOffset=n,this.yPoleOffset=r,this.ut1MinusUtc=a}function Rt(){function w(e,t,n,r){n=n||" ";var a=e.length>=t?"":Array(1+t-e.length>>>0).join(n);return r?e+a:a+e}function g(e,t,n,r,a,i){var s=r-e.length;return 0<s&&(e=n||!a?w(e,r,i,n):e.slice(0,t.length)+w("",s,"0",!0)+e.slice(t.length)),e}function x(e,t,n,r,a,i,s){var o=e>>>0;return e=(n=n&&o&&{2:"0b",8:"0",16:"0x"}[t]||"")+w(o.toString(t),i||0,"0",!1),g(e,n,r,a,s)}function E(e,t,n,r,a,i){return null!=r&&(e=e.slice(0,r)),g(e,"",t,n,a,i)}var O=arguments,_=0,e=O[_++];return e.replace(/%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g,function(e,t,n,r,a,i,s){var o,u,l,c,d;if("%%"==e)return"%";for(var f=!1,h="",p=!1,m=!1,y=" ",v=n.length,C=0;n&&C<v;C++)switch(n.charAt(C)){case" ":h=" ";break;case"+":h="+";break;case"-":f=!0;break;case"'":y=n.charAt(C+1);break;case"0":p=!0;break;case"#":m=!0}if((r=r?"*"==r?+O[_++]:"*"==r.charAt(0)?+O[r.slice(1,-1)]:+r:0)<0&&(r=-r,f=!0),!isFinite(r))throw new Error("sprintf: (minimum-)width must be finite");switch(i=i?"*"==i?+O[_++]:"*"==i.charAt(0)?+O[i.slice(1,-1)]:+i:-1<"fFeE".indexOf(s)?6:"d"==s?0:void 0,d=t?O[t.slice(0,-1)]:O[_++],s){case"s":return E(String(d),f,r,i,p,y);case"c":return E(String.fromCharCode(+d),f,r,i,p);case"b":return x(d,2,m,f,r,i,p);case"o":return x(d,8,m,f,r,i,p);case"x":return x(d,16,m,f,r,i,p);case"X":return x(d,16,m,f,r,i,p).toUpperCase();case"u":return x(d,10,m,f,r,i,p);case"i":case"d":return o=+d||0,d=(u=(o=Math.round(o-o%1))<0?"-":h)+w(String(Math.abs(o)),i,"0",!1),g(d,u,f,r,p);case"e":case"E":case"f":case"F":case"g":case"G":return u=(o=+d)<0?"-":h,l=["toExponential","toFixed","toPrecision"]["efg".indexOf(s.toLowerCase())],c=["toString","toUpperCase"]["eEfFgG".indexOf(s)%2],d=u+Math.abs(o)[l](i),g(d,u,f,r,p)[c]();default:return e}})}function At(e,t,n,r,a,i,s,o){this.year=e,this.month=t,this.day=n,this.hour=r,this.minute=a,this.second=i,this.millisecond=s,this.isLeapSecond=o}function Tt(e){return e%4==0&&e%100!=0||e%400==0}function qt(e,t){this.julianDate=e,this.offset=t}wt[7]=Ct/136,gt[7]=8*Ct/17,Ge.fastSlerp=function(e,t,n,r){var a,i=Ge.dot(e,t);0<=i?a=1:(a=-1,i=-i);for(var s=i-1,o=1-n,u=n*n,l=o*o,c=7;0<=c;--c)xt[c]=(wt[c]*u-gt[c])*s,Et[c]=(wt[c]*l-gt[c])*s;var d=a*n*(1+xt[0]*(1+xt[1]*(1+xt[2]*(1+xt[3]*(1+xt[4]*(1+xt[5]*(1+xt[6]*(1+xt[7])))))))),f=o*(1+Et[0]*(1+Et[1]*(1+Et[2]*(1+Et[3]*(1+Et[4]*(1+Et[5]*(1+Et[6]*(1+Et[7])))))))),h=Ge.multiplyByScalar(e,f,vt);return Ge.multiplyByScalar(t,d,r),Ge.add(h,r,r)},Ge.fastSquad=function(e,t,n,r,a,i){var s=Ge.fastSlerp(e,t,a,mt),o=Ge.fastSlerp(n,r,a,yt);return Ge.fastSlerp(s,o,2*a*(1-a),i)},Ge.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w},Ge.equalsEpsilon=function(e,t,n){return n=I.defaultValue(n,0),e===t||I.defined(e)&&I.defined(t)&&Math.abs(e.x-t.x)<=n&&Math.abs(e.y-t.y)<=n&&Math.abs(e.z-t.z)<=n&&Math.abs(e.w-t.w)<=n},Ge.ZERO=Object.freeze(new Ge(0,0,0,0)),Ge.IDENTITY=Object.freeze(new Ge(0,0,0,1)),Ge.prototype.clone=function(e){return Ge.clone(this,e)},Ge.prototype.equals=function(e){return Ge.equals(this,e)},Ge.prototype.equalsEpsilon=function(e,t){return Ge.equalsEpsilon(this,e,t)},Ge.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+", "+this.w+")"};var zt=Object.freeze({SECONDS_PER_MILLISECOND:.001,SECONDS_PER_MINUTE:60,MINUTES_PER_HOUR:60,HOURS_PER_DAY:24,SECONDS_PER_HOUR:3600,MINUTES_PER_DAY:1440,SECONDS_PER_DAY:86400,DAYS_PER_JULIAN_CENTURY:36525,PICOSECOND:1e-9,MODIFIED_JULIAN_DATE_DIFFERENCE:2400000.5}),It=Object.freeze({UTC:0,TAI:1}),Pt=new At,Dt=[31,28,31,30,31,30,31,31,30,31,30,31];function Nt(e,t){return Qt.compare(e.julianDate,t.julianDate)}var Ut=new qt;function Ft(e){Ut.julianDate=e;var t=Qt.leapSeconds,n=bt(t,Ut,Nt);n<0&&(n=~n),n>=t.length&&(n=t.length-1);var r=t[n].offset;0<n&&r<Qt.secondsDifference(t[n].julianDate,e)&&(r=t[--n].offset),Qt.addSeconds(e,r,e)}function Vt(e,t){Ut.julianDate=e;var n=Qt.leapSeconds,r=bt(n,Ut,Nt);if(r<0&&(r=~r),0===r)return Qt.addSeconds(e,-n[0].offset,t);if(r>=n.length)return Qt.addSeconds(e,-n[r-1].offset,t);var a=Qt.secondsDifference(n[r].julianDate,e);return 0===a?Qt.addSeconds(e,-n[r].offset,t):a<=1?void 0:Qt.addSeconds(e,-n[--r].offset,t)}function Lt(e,t,n){var r=t/zt.SECONDS_PER_DAY|0;return e+=r,(t-=zt.SECONDS_PER_DAY*r)<0&&(e--,t+=zt.SECONDS_PER_DAY),n.dayNumber=e,n.secondsOfDay=t,n}function Bt(e,t,n,r,a,i,s){var o=(t-14)/12|0,u=e+4800+o,l=(1461*u/4|0)+(367*(t-2-12*o)/12|0)-(3*((u+100)/100|0)/4|0)+n-32075;(r-=12)<0&&(r+=24);var c=i+(r*zt.SECONDS_PER_HOUR+a*zt.SECONDS_PER_MINUTE+s*zt.SECONDS_PER_MILLISECOND);return 43200<=c&&--l,[l,c]}var Wt=/^(\d{4})$/,jt=/^(\d{4})-(\d{2})$/,kt=/^(\d{4})-?(\d{3})$/,Yt=/^(\d{4})-?W(\d{2})-?(\d{1})?$/,Zt=/^(\d{4})-?(\d{2})-?(\d{2})$/,Xt=/([Z+\-])?(\d{2})?:?(\d{2})?$/,Ht=/^(\d{2})(\.\d+)?/.source+Xt.source,Jt=/^(\d{2}):?(\d{2})(\.\d+)?/.source+Xt.source,Gt=/^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source+Xt.source;function Qt(e,t,n){this.dayNumber=void 0,this.secondsOfDay=void 0,e=I.defaultValue(e,0),t=I.defaultValue(t,0),n=I.defaultValue(n,It.UTC);var r=0|e;Lt(r,t+=(e-r)*zt.SECONDS_PER_DAY,this),n===It.UTC&&Ft(this)}Qt.fromGregorianDate=function(e,t){var n=Bt(e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond);return I.defined(t)?(Lt(n[0],n[1],t),Ft(t),t):new Qt(n[0],n[1],It.UTC)},Qt.fromDate=function(e,t){var n=Bt(e.getUTCFullYear(),e.getUTCMonth()+1,e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds());return I.defined(t)?(Lt(n[0],n[1],t),Ft(t),t):new Qt(n[0],n[1],It.UTC)},Qt.fromIso8601=function(e,t){var n,r,a,i,s,o=(e=e.replace(",",".")).split("T"),u=1,l=1,c=0,d=0,f=0,h=0,p=o[0],m=o[1];if(null!==(o=p.match(Zt))?(n=+o[1],u=+o[2],l=+o[3]):null!==(o=p.match(jt))?(n=+o[1],u=+o[2]):null!==(o=p.match(Wt))?n=+o[1]:(null!==(o=p.match(kt))?(n=+o[1],i=+o[2],a=Tt(n)):null!==(o=p.match(Yt))&&(n=+o[1],i=7*+o[2]+(+o[3]||0)-new Date(Date.UTC(n,0,4)).getUTCDay()-3),(r=new Date(Date.UTC(n,0,1))).setUTCDate(i),u=r.getUTCMonth()+1,l=r.getUTCDate()),a=Tt(n),I.defined(m)){null!==(o=m.match(Gt))?(c=+o[1],d=+o[2],f=+o[3],h=1e3*(o[4]||0),s=5):null!==(o=m.match(Jt))?(c=+o[1],d=+o[2],f=60*(o[3]||0),s=4):null!==(o=m.match(Ht))&&(c=+o[1],d=60*(o[2]||0),s=3);var y=o[s],v=+o[s+1],C=+(o[s+2]||0);switch(y){case"+":c-=v,d-=C;break;case"-":c+=v,d+=C;break;case"Z":break;default:d+=new Date(Date.UTC(n,u-1,l,c,d)).getTimezoneOffset()}}var w=60===f;for(w&&f--;60<=d;)d-=60,c++;for(;24<=c;)c-=24,l++;for(r=a&&2===u?29:Dt[u-1];r<l;)l-=r,12<++u&&(u-=12,n++),r=a&&2===u?29:Dt[u-1];for(;d<0;)d+=60,c--;for(;c<0;)c+=24,l--;for(;l<1;)--u<1&&(u+=12,n--),l+=r=a&&2===u?29:Dt[u-1];var g=Bt(n,u,l,c,d,f,h);return I.defined(t)?(Lt(g[0],g[1],t),Ft(t)):t=new Qt(g[0],g[1],It.UTC),w&&Qt.addSeconds(t,1,t),t},Qt.now=function(e){return Qt.fromDate(new Date,e)};var Kt=new Qt(0,0,It.TAI);function $t(e){var t;e instanceof $t?(this.scheme=e.scheme,this.authority=e.authority,this.path=e.path,this.query=e.query,this.fragment=e.fragment):e&&(t=en.exec(e),this.scheme=t[1],this.authority=t[2],this.path=t[3],this.query=t[4],this.fragment=t[5])}Qt.toGregorianDate=function(e,t){var n=!1,r=Vt(e,Kt);I.defined(r)||(Qt.addSeconds(e,-1,Kt),r=Vt(Kt,Kt),n=!0);var a=r.dayNumber,i=r.secondsOfDay;43200<=i&&(a+=1);var s=a+68569|0,o=4*s/146097|0,u=4e3*(1+(s=s-((146097*o+3)/4|0)|0))/1461001|0,l=80*(s=s-(1461*u/4|0)+31|0)/2447|0,c=s-(2447*l/80|0)|0,d=2+l-12*(s=l/11|0)|0,f=100*(o-49)+u+s|0,h=i/zt.SECONDS_PER_HOUR|0,p=i-h*zt.SECONDS_PER_HOUR,m=p/zt.SECONDS_PER_MINUTE|0,y=0|(p-=m*zt.SECONDS_PER_MINUTE),v=(p-y)/zt.SECONDS_PER_MILLISECOND;return 23<(h+=12)&&(h-=24),n&&(y+=1),I.defined(t)?(t.year=f,t.month=d,t.day=c,t.hour=h,t.minute=m,t.second=y,t.millisecond=v,t.isLeapSecond=n,t):new At(f,d,c,h,m,y,v,n)},Qt.toDate=function(e){var t=Qt.toGregorianDate(e,Pt),n=t.second;return t.isLeapSecond&&--n,new Date(Date.UTC(t.year,t.month-1,t.day,t.hour,t.minute,n,t.millisecond))},Qt.toIso8601=function(e,t){var n=Qt.toGregorianDate(e,Pt),r=n.year,a=n.month,i=n.day,s=n.hour,o=n.minute,u=n.second,l=n.millisecond;return 1e4===r&&1===a&&1===i&&0===s&&0===o&&0===u&&0===l&&(r=9999,a=12,i=31,s=24),I.defined(t)||0===l?I.defined(t)&&0!==t?Rt("%04d-%02d-%02dT%02d:%02d:%02d.%sZ",r,a,i,s,o,u,(.01*l).toFixed(t).replace(".","").slice(0,t)):Rt("%04d-%02d-%02dT%02d:%02d:%02dZ",r,a,i,s,o,u):Rt("%04d-%02d-%02dT%02d:%02d:%02d.%sZ",r,a,i,s,o,u,(.01*l).toString().replace(".",""))},Qt.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t.dayNumber=e.dayNumber,t.secondsOfDay=e.secondsOfDay,t):new Qt(e.dayNumber,e.secondsOfDay,It.TAI)},Qt.compare=function(e,t){var n=e.dayNumber-t.dayNumber;return 0!=n?n:e.secondsOfDay-t.secondsOfDay},Qt.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&e.dayNumber===t.dayNumber&&e.secondsOfDay===t.secondsOfDay},Qt.equalsEpsilon=function(e,t,n){return n=I.defaultValue(n,0),e===t||I.defined(e)&&I.defined(t)&&Math.abs(Qt.secondsDifference(e,t))<=n},Qt.totalDays=function(e){return e.dayNumber+e.secondsOfDay/zt.SECONDS_PER_DAY},Qt.secondsDifference=function(e,t){return(e.dayNumber-t.dayNumber)*zt.SECONDS_PER_DAY+(e.secondsOfDay-t.secondsOfDay)},Qt.daysDifference=function(e,t){return e.dayNumber-t.dayNumber+(e.secondsOfDay-t.secondsOfDay)/zt.SECONDS_PER_DAY},Qt.computeTaiMinusUtc=function(e){Ut.julianDate=e;var t=Qt.leapSeconds,n=bt(t,Ut,Nt);return n<0&&(n=~n,--n<0&&(n=0)),t[n].offset},Qt.addSeconds=function(e,t,n){return Lt(e.dayNumber,e.secondsOfDay+t,n)},Qt.addMinutes=function(e,t,n){var r=e.secondsOfDay+t*zt.SECONDS_PER_MINUTE;return Lt(e.dayNumber,r,n)},Qt.addHours=function(e,t,n){var r=e.secondsOfDay+t*zt.SECONDS_PER_HOUR;return Lt(e.dayNumber,r,n)},Qt.addDays=function(e,t,n){return Lt(e.dayNumber+t,e.secondsOfDay,n)},Qt.lessThan=function(e,t){return Qt.compare(e,t)<0},Qt.lessThanOrEquals=function(e,t){return Qt.compare(e,t)<=0},Qt.greaterThan=function(e,t){return 0<Qt.compare(e,t)},Qt.greaterThanOrEquals=function(e,t){return 0<=Qt.compare(e,t)},Qt.prototype.clone=function(e){return Qt.clone(this,e)},Qt.prototype.equals=function(e){return Qt.equals(this,e)},Qt.prototype.equalsEpsilon=function(e,t){return Qt.equalsEpsilon(this,e,t)},Qt.prototype.toString=function(){return Qt.toIso8601(this)},Qt.leapSeconds=[new qt(new Qt(2441317,43210,It.TAI),10),new qt(new Qt(2441499,43211,It.TAI),11),new qt(new Qt(2441683,43212,It.TAI),12),new qt(new Qt(2442048,43213,It.TAI),13),new qt(new Qt(2442413,43214,It.TAI),14),new qt(new Qt(2442778,43215,It.TAI),15),new qt(new Qt(2443144,43216,It.TAI),16),new qt(new Qt(2443509,43217,It.TAI),17),new qt(new Qt(2443874,43218,It.TAI),18),new qt(new Qt(2444239,43219,It.TAI),19),new qt(new Qt(2444786,43220,It.TAI),20),new qt(new Qt(2445151,43221,It.TAI),21),new qt(new Qt(2445516,43222,It.TAI),22),new qt(new Qt(2446247,43223,It.TAI),23),new qt(new Qt(2447161,43224,It.TAI),24),new qt(new Qt(2447892,43225,It.TAI),25),new qt(new Qt(2448257,43226,It.TAI),26),new qt(new Qt(2448804,43227,It.TAI),27),new qt(new Qt(2449169,43228,It.TAI),28),new qt(new Qt(2449534,43229,It.TAI),29),new qt(new Qt(2450083,43230,It.TAI),30),new qt(new Qt(2450630,43231,It.TAI),31),new qt(new Qt(2451179,43232,It.TAI),32),new qt(new Qt(2453736,43233,It.TAI),33),new qt(new Qt(2454832,43234,It.TAI),34),new qt(new Qt(2456109,43235,It.TAI),35),new qt(new Qt(2457204,43236,It.TAI),36),new qt(new Qt(2457754,43237,It.TAI),37)],$t.prototype.scheme=null,$t.prototype.authority=null,$t.prototype.path="",$t.prototype.query=null,$t.prototype.fragment=null;var en=new RegExp("^(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?$");$t.prototype.getScheme=function(){return this.scheme},$t.prototype.getAuthority=function(){return this.authority},$t.prototype.getPath=function(){return this.path},$t.prototype.getQuery=function(){return this.query},$t.prototype.getFragment=function(){return this.fragment},$t.prototype.isAbsolute=function(){return!!this.scheme&&!this.fragment},$t.prototype.isSameDocumentAs=function(e){return e.scheme==this.scheme&&e.authority==this.authority&&e.path==this.path&&e.query==this.query},$t.prototype.equals=function(e){return this.isSameDocumentAs(e)&&e.fragment==this.fragment},$t.prototype.normalize=function(){this.removeDotSegments(),this.scheme&&(this.scheme=this.scheme.toLowerCase()),this.authority&&(this.authority=this.authority.replace(rn,sn).replace(tn,an)),this.path&&(this.path=this.path.replace(tn,an)),this.query&&(this.query=this.query.replace(tn,an)),this.fragment&&(this.fragment=this.fragment.replace(tn,an))};var tn=/%[0-9a-z]{2}/gi,nn=/[a-zA-Z0-9\-\._~]/,rn=/(.*@)?([^@:]*)(:.*)?/;function an(e){var t=unescape(e);return nn.test(t)?t:e.toUpperCase()}function sn(e,t,n,r){return(t||"")+n.toLowerCase()+(r||"")}function on(e,t){if(null===e||"object"!=typeof e)return e;t=I.defaultValue(t,!1);var n,r=new e.constructor;for(var a in e){e.hasOwnProperty(a)&&(n=e[a],t&&(n=on(n,t)),r[a]=n)}return r}function un(e,t,n){n=I.defaultValue(n,!1);var r,a,i,s={},o=I.defined(e),u=I.defined(t);if(o)for(r in e)e.hasOwnProperty(r)&&(a=e[r],u&&n&&"object"==typeof a&&t.hasOwnProperty(r)?(i=t[r],s[r]="object"==typeof i?un(a,i,n):a):s[r]=a);if(u)for(r in t)t.hasOwnProperty(r)&&!s.hasOwnProperty(r)&&(i=t[r],s[r]=i);return s}function ln(e,t){var n;return"undefined"!=typeof document&&(n=document),ln._implementation(e,t,n)}$t.prototype.resolve=function(e){var t=new $t;return this.scheme?(t.scheme=this.scheme,t.authority=this.authority,t.path=this.path,t.query=this.query):(t.scheme=e.scheme,this.authority?(t.authority=this.authority,t.path=this.path,t.query=this.query):(t.authority=e.authority,""==this.path?(t.path=e.path,t.query=this.query||e.query):("/"==this.path.charAt(0)?t.path=this.path:e.authority&&""==e.path?t.path="/"+this.path:t.path=e.path.substring(0,e.path.lastIndexOf("/")+1)+this.path,t.removeDotSegments(),t.query=this.query))),t.fragment=this.fragment,t},$t.prototype.removeDotSegments=function(){var e,t=this.path.split("/"),n=[],r=""==t[0];r&&t.shift();for(""==t[0]&&t.shift();t.length;)".."==(e=t.shift())?n.pop():"."!=e&&n.push(e);"."!=e&&".."!=e||n.push(""),r&&n.unshift(""),this.path=n.join("/")},$t.prototype.toString=function(){var e="";return this.scheme&&(e+=this.scheme+":"),this.authority&&(e+="//"+this.authority),e+=this.path,this.query&&(e+="?"+this.query),this.fragment&&(e+="#"+this.fragment),e},ln._implementation=function(e,t,n){if(!I.defined(t)){if(void 0===n)return e;t=I.defaultValue(n.baseURI,n.location.href)}var r=new $t(t);return new $t(e).resolve(r).toString()};var cn,dn=/^blob:/i;function fn(e){return dn.test(e)}var hn=/^data:/i;function pn(e){return hn.test(e)}var mn=Object.freeze({UNISSUED:0,ISSUED:1,ACTIVE:2,RECEIVED:3,CANCELLED:4,FAILED:5}),yn=Object.freeze({TERRAIN:0,IMAGERY:1,TILES3D:2,OTHER:3});function vn(e){e=I.defaultValue(e,I.defaultValue.EMPTY_OBJECT);var t=I.defaultValue(e.throttleByServer,!1),n=I.defaultValue(e.throttle,!1);this.url=e.url,this.requestFunction=e.requestFunction,this.cancelFunction=e.cancelFunction,this.priorityFunction=e.priorityFunction,this.priority=I.defaultValue(e.priority,0),this.throttle=n,this.throttleByServer=t,this.type=I.defaultValue(e.type,yn.OTHER),this.serverKey=void 0,this.state=mn.UNISSUED,this.deferred=void 0,this.cancelled=!1}function Cn(e,t,n){this.statusCode=e,this.response=t,this.responseHeaders=n,"string"==typeof this.responseHeaders&&(this.responseHeaders=function(e){var t={};if(!e)return t;for(var n=e.split("\r\n"),r=0;r<n.length;++r){var a,i,s=n[r],o=s.indexOf(": ");0<o&&(a=s.substring(0,o),i=s.substring(o+2),t[a]=i)}return t}(this.responseHeaders))}function wn(){this._listeners=[],this._scopes=[],this._toRemove=[],this._insideRaiseEvent=!1}function gn(e,t){return t-e}function xn(e){this._comparator=e.comparator,this._array=[],this._length=0,this._maximumLength=void 0}function En(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}vn.prototype.cancel=function(){this.cancelled=!0},vn.prototype.clone=function(e){return I.defined(e)?(e.url=this.url,e.requestFunction=this.requestFunction,e.cancelFunction=this.cancelFunction,e.priorityFunction=this.priorityFunction,e.priority=this.priority,e.throttle=this.throttle,e.throttleByServer=this.throttleByServer,e.type=this.type,e.serverKey=this.serverKey,e.state=this.RequestState.UNISSUED,e.deferred=void 0,e.cancelled=!1,e):new vn(this)},Cn.prototype.toString=function(){var e="Request has failed.";return I.defined(this.statusCode)&&(e+=" Status Code: "+this.statusCode),e},Object.defineProperties(wn.prototype,{numberOfListeners:{get:function(){return this._listeners.length-this._toRemove.length}}}),wn.prototype.addEventListener=function(e,t){this._listeners.push(e),this._scopes.push(t);var n=this;return function(){n.removeEventListener(e,t)}},wn.prototype.removeEventListener=function(e,t){for(var n=this._listeners,r=this._scopes,a=-1,i=0;i<n.length;i++)if(n[i]===e&&r[i]===t){a=i;break}return-1!==a&&(this._insideRaiseEvent?(this._toRemove.push(a),n[a]=void 0,r[a]=void 0):(n.splice(a,1),r.splice(a,1)),!0)},wn.prototype.raiseEvent=function(){this._insideRaiseEvent=!0;for(var e=this._listeners,t=this._scopes,n=e.length,r=0;r<n;r++){var a=e[r];I.defined(a)&&e[r].apply(t[r],arguments)}var i=this._toRemove;if(0<(n=i.length)){for(i.sort(gn),r=0;r<n;r++){var s=i[r];e.splice(s,1),t.splice(s,1)}i.length=0}this._insideRaiseEvent=!1},Object.defineProperties(xn.prototype,{length:{get:function(){return this._length}},internalArray:{get:function(){return this._array}},maximumLength:{get:function(){return this._maximumLength},set:function(e){var t=this._length;if(e<t){for(var n=this._array,r=e;r<t;++r)n[r]=void 0;this._length=e,n.length=e}this._maximumLength=e}},comparator:{get:function(){return this._comparator}}}),xn.prototype.reserve=function(e){e=I.defaultValue(e,this._length),this._array.length=e},xn.prototype.heapify=function(e){e=I.defaultValue(e,0);for(var t=this._length,n=this._comparator,r=this._array,a=-1,i=!0;i;){var s=2*(e+1),o=s-1,a=o<t&&n(r[o],r[e])<0?o:e;s<t&&n(r[s],r[a])<0&&(a=s),a!==e?(En(r,a,e),e=a):i=!1}},xn.prototype.resort=function(){for(var e=this._length,t=Math.ceil(e/2);0<=t;--t)this.heapify(t)},xn.prototype.insert=function(e){var t,n=this._array,r=this._comparator,a=this._maximumLength,i=this._length++;for(i<n.length?n[i]=e:n.push(e);0!==i;){var s=Math.floor((i-1)/2);if(!(r(n[i],n[s])<0))break;En(n,i,s),i=s}return I.defined(a)&&this._length>a&&(t=n[a],this._length=a),t},xn.prototype.pop=function(e){if(e=I.defaultValue(e,0),0!==this._length){var t=this._array,n=t[e];return En(t,e,--this._length),this.heapify(e),t[this._length]=void 0,n}};var On={numberOfAttemptedRequests:0,numberOfActiveRequests:0,numberOfCancelledRequests:0,numberOfCancelledActiveRequests:0,numberOfFailedRequests:0,numberOfActiveRequestsEver:0,lastNumberOfActiveRequests:0},_n=20,Sn=new xn({comparator:function(e,t){return e.priority-t.priority}});Sn.maximumLength=_n,Sn.reserve(_n);var bn=[],Mn={},Rn="undefined"!=typeof document?new $t(document.location.href):new $t,An=new wn;function Tn(){}function qn(e){I.defined(e.priorityFunction)&&(e.priority=e.priorityFunction())}function zn(e){var t=I.defaultValue(Tn.requestsByServer[e],Tn.maximumRequestsPerServer);return Mn[e]<t}function In(e){return e.state===mn.UNISSUED&&(e.state=mn.ISSUED,e.deferred=I.when.defer()),e.deferred.promise}function Pn(e){var t,n,r=In(e);return e.state=mn.ACTIVE,bn.push(e),++On.numberOfActiveRequests,++On.numberOfActiveRequestsEver,++Mn[e.serverKey],e.requestFunction().then((n=e,function(e){n.state!==mn.CANCELLED&&(--On.numberOfActiveRequests,--Mn[n.serverKey],An.raiseEvent(),n.state=mn.RECEIVED,n.deferred.resolve(e),n.deferred=void 0)})).otherwise((t=e,function(e){t.state!==mn.CANCELLED&&(++On.numberOfFailedRequests,--On.numberOfActiveRequests,--Mn[t.serverKey],An.raiseEvent(e),t.state=mn.FAILED,t.deferred.reject(e))})),r}function Dn(e){var t=e.state===mn.ACTIVE;e.state=mn.CANCELLED,++On.numberOfCancelledRequests,I.defined(e.deferred)&&(e.deferred.reject(),e.deferred=void 0),t&&(--On.numberOfActiveRequests,--Mn[e.serverKey],++On.numberOfCancelledActiveRequests),I.defined(e.cancelFunction)&&e.cancelFunction()}Tn.maximumRequests=50,Tn.maximumRequestsPerServer=6,Tn.requestsByServer={"api.cesium.com:443":18,"assets.cesium.com:443":18},Tn.throttleRequests=!0,Tn.debugShowStatistics=!1,Tn.requestCompletedEvent=An,Object.defineProperties(Tn,{statistics:{get:function(){return On}},priorityHeapLength:{get:function(){return _n},set:function(e){if(e<_n)for(;Sn.length>e;){Dn(Sn.pop())}_n=e,Sn.maximumLength=e,Sn.reserve(e)}}}),Tn.update=function(){for(var e,t=0,n=bn.length,r=0;r<n;++r)(e=bn[r]).cancelled&&Dn(e),e.state===mn.ACTIVE?0<t&&(bn[r-t]=e):++t;bn.length-=t;var a=Sn.internalArray,i=Sn.length;for(r=0;r<i;++r)qn(a[r]);Sn.resort();for(var s=Math.max(Tn.maximumRequests-bn.length,0),o=0;o<s&&0<Sn.length;)!(e=Sn.pop()).cancelled&&(!e.throttleByServer||zn(e.serverKey))?(Pn(e),++o):Dn(e);!function(){if(!Tn.debugShowStatistics)return;0===On.numberOfActiveRequests&&0<On.lastNumberOfActiveRequests&&(0<On.numberOfAttemptedRequests&&(console.log("Number of attempted requests: "+On.numberOfAttemptedRequests),On.numberOfAttemptedRequests=0),0<On.numberOfCancelledRequests&&(console.log("Number of cancelled requests: "+On.numberOfCancelledRequests),On.numberOfCancelledRequests=0),0<On.numberOfCancelledActiveRequests&&(console.log("Number of cancelled active requests: "+On.numberOfCancelledActiveRequests),On.numberOfCancelledActiveRequests=0),0<On.numberOfFailedRequests&&(console.log("Number of failed requests: "+On.numberOfFailedRequests),On.numberOfFailedRequests=0));On.lastNumberOfActiveRequests=On.numberOfActiveRequests}()},Tn.getServerKey=function(e){var t=new $t(e).resolve(Rn);t.normalize();var n=t.authority;/:/.test(n)||(n=n+":"+("https"===t.scheme?"443":"80"));var r=Mn[n];return I.defined(r)||(Mn[n]=0),n},Tn.request=function(e){if(pn(e.url)||fn(e.url))return An.raiseEvent(),e.state=mn.RECEIVED,e.requestFunction();if(++On.numberOfAttemptedRequests,I.defined(e.serverKey)||(e.serverKey=Tn.getServerKey(e.url)),!Tn.throttleRequests||!e.throttleByServer||zn(e.serverKey)){if(!Tn.throttleRequests||!e.throttle)return Pn(e);if(!(bn.length>=Tn.maximumRequests)){qn(e);var t=Sn.insert(e);if(I.defined(t)){if(t===e)return;Dn(t)}return In(e)}}},Tn.clearForSpecs=function(){for(;0<Sn.length;){Dn(Sn.pop())}for(var e=bn.length,t=0;t<e;++t)Dn(bn[t]);bn.length=0,Mn={},On.numberOfAttemptedRequests=0,On.numberOfActiveRequests=0,On.numberOfCancelledRequests=0,On.numberOfCancelledActiveRequests=0,On.numberOfFailedRequests=0,On.numberOfActiveRequestsEver=0,On.lastNumberOfActiveRequests=0},Tn.numberOfActiveRequestsByServer=function(e){return Mn[e]},Tn.requestHeap=Sn;var Nn={},Un={};Nn.add=function(e,t){var n=e.toLowerCase()+":"+t;I.defined(Un[n])||(Un[n]=!0)},Nn.remove=function(e,t){var n=e.toLowerCase()+":"+t;I.defined(Un[n])&&delete Un[n]},Nn.contains=function(e){var t=function(e){var t=new $t(e);t.normalize();var n=t.getAuthority();if(I.defined(n)){if(-1!==n.indexOf("@")&&(n=n.split("@")[1]),-1===n.indexOf(":")){var r=t.getScheme();if(I.defined(r)||(r=(r=window.location.protocol).substring(0,r.length-1)),"http"===r)n+=":80";else{if("https"!==r)return;n+=":443"}}return n}}(e);return!(!I.defined(t)||!I.defined(Un[t]))},Nn.clear=function(){Un={}};var Fn,Vn=function(){try{var e=new XMLHttpRequest;return e.open("GET","#",!0),(e.responseType="blob")===e.responseType}catch(e){return!1}}();function Ln(e,t,n,r){var a,i,s=e.query;if(!I.defined(s)||0===s.length)return 1;a=-1===s.indexOf("=")?((i={})[s]=void 0,i):function(e){var t={};if(""===e)return t;for(var n=e.replace(/\+/g,"%20").split(/[&;]/),r=0,a=n.length;r<a;++r){var i=n[r].split("="),s=decodeURIComponent(i[0]),o=i[1],o=I.defined(o)?decodeURIComponent(o):"",u=t[s];"string"==typeof u?t[s]=[u,o]:Array.isArray(u)?u.push(o):t[s]=o}return t}(s),t._queryParameters=n?kn(a,t._queryParameters,r):a,e.query=void 0}function Bn(e,t){var n=t._queryParameters,r=Object.keys(n);1!==r.length||I.defined(n[r[0]])?e.query=function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n],a=encodeURIComponent(n)+"=";if(Array.isArray(r))for(var i=0,s=r.length;i<s;++i)t+=a+encodeURIComponent(r[i])+"&";else t+=a+encodeURIComponent(r)+"&"}return t=t.slice(0,-1)}(n):e.query=r[0]}function Wn(e,t){return I.defined(e)?I.defined(e.clone)?e.clone():on(e):t}function jn(e){if(e.state===mn.ISSUED||e.state===mn.ACTIVE)throw new H.RuntimeError("The Resource is already being fetched.");e.state=mn.UNISSUED,e.deferred=void 0}function kn(e,t,n){if(!n)return un(e,t);var r,a,i=on(e,!0);for(var s in t){t.hasOwnProperty(s)&&(r=i[s],a=t[s],I.defined(r)?(Array.isArray(r)||(r=i[s]=[r]),i[s]=r.concat(a)):i[s]=Array.isArray(a)?a.slice():a)}return i}function Yn(e){"string"==typeof(e=I.defaultValue(e,I.defaultValue.EMPTY_OBJECT))&&(e={url:e}),this._url=void 0,this._templateValues=Wn(e.templateValues,{}),this._queryParameters=Wn(e.queryParameters,{}),this.headers=Wn(e.headers,{}),this.request=I.defaultValue(e.request,new vn),this.proxy=e.proxy,this.retryCallback=e.retryCallback,this.retryAttempts=I.defaultValue(e.retryAttempts,0),this._retryCount=0;var t=new $t(e.url);Ln(t,this,!0,!0),t.fragment=void 0,this._url=t.toString()}function Zn(e){var n=e.resource,r=e.flipY,a=e.preferImageBitmap,i=n.request;i.url=n.url,i.requestFunction=function(){var e=!1;n.isDataUri||n.isBlobUri||(e=n.isCrossOriginUrl);var t=I.when.defer();return Yn._Implementations.createImage(i,e,t,r,a),t.promise};var t=Tn.request(i);if(I.defined(t))return t.otherwise(function(t){return i.state!==mn.FAILED?I.when.reject(t):n.retryOnError(t).then(function(e){return e?(i.state=mn.UNISSUED,i.deferred=void 0,Zn({resource:n,flipY:r,preferImageBitmap:a})):I.when.reject(t)})})}Yn.createIfNeeded=function(e){return e instanceof Yn?e.getDerivedResource({request:e.request}):"string"!=typeof e?e:new Yn({url:e})},Yn.supportsImageBitmapOptions=function(){if(I.defined(Fn))return Fn;if("function"!=typeof createImageBitmap)return Fn=I.when.resolve(!1);return Fn=Yn.fetchBlob({url:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg=="}).then(function(e){return createImageBitmap(e,{imageOrientation:"flipY",premultiplyAlpha:"none"})}).then(function(e){return!0}).otherwise(function(){return!1})},Object.defineProperties(Yn,{isBlobSupported:{get:function(){return Vn}}}),Object.defineProperties(Yn.prototype,{queryParameters:{get:function(){return this._queryParameters}},templateValues:{get:function(){return this._templateValues}},url:{get:function(){return this.getUrlComponent(!0,!0)},set:function(e){var t=new $t(e);Ln(t,this,!1),t.fragment=void 0,this._url=t.toString()}},extension:{get:function(){return function(e){var t=new $t(e);t.normalize();var n=t.path,r=n.lastIndexOf("/");return-1!==r&&(n=n.substr(r+1)),n=-1===(r=n.lastIndexOf("."))?"":n.substr(r+1)}(this._url)}},isDataUri:{get:function(){return pn(this._url)}},isBlobUri:{get:function(){return fn(this._url)}},isCrossOriginUrl:{get:function(){return function(e){I.defined(cn)||(cn=document.createElement("a")),cn.href=window.location.href;var t=cn.host,n=cn.protocol;return cn.href=e,cn.href=cn.href,n!==cn.protocol||t!==cn.host}(this._url)}},hasHeaders:{get:function(){return 0<Object.keys(this.headers).length}}}),Yn.prototype.toString=function(){return this.getUrlComponent(!0,!0)},Yn.prototype.getUrlComponent=function(e,t){if(this.isDataUri)return this._url;var n=new $t(this._url);e&&Bn(n,this);var r=n.toString().replace(/%7B/g,"{").replace(/%7D/g,"}"),a=this._templateValues,r=r.replace(/{(.*?)}/g,function(e,t){var n=a[t];return I.defined(n)?encodeURIComponent(n):e});return t&&I.defined(this.proxy)&&(r=this.proxy.getURL(r)),r},Yn.prototype.setQueryParameters=function(e,t){this._queryParameters=t?kn(this._queryParameters,e,!1):kn(e,this._queryParameters,!1)},Yn.prototype.appendQueryParameters=function(e){this._queryParameters=kn(e,this._queryParameters,!0)},Yn.prototype.setTemplateValues=function(e,t){this._templateValues=t?un(this._templateValues,e):un(e,this._templateValues)},Yn.prototype.getDerivedResource=function(e){var t,n=this.clone();return n._retryCount=0,I.defined(e.url)&&(Ln(t=new $t(e.url),n,!0,I.defaultValue(e.preserveQueryParameters,!1)),t.fragment=void 0,n._url=t.resolve(new $t(ln(this._url))).toString()),I.defined(e.queryParameters)&&(n._queryParameters=un(e.queryParameters,n._queryParameters)),I.defined(e.templateValues)&&(n._templateValues=un(e.templateValues,n.templateValues)),I.defined(e.headers)&&(n.headers=un(e.headers,n.headers)),I.defined(e.proxy)&&(n.proxy=e.proxy),I.defined(e.request)&&(n.request=e.request),I.defined(e.retryCallback)&&(n.retryCallback=e.retryCallback),I.defined(e.retryAttempts)&&(n.retryAttempts=e.retryAttempts),n},Yn.prototype.retryOnError=function(e){var t=this.retryCallback;if("function"!=typeof t||this._retryCount>=this.retryAttempts)return I.when(!1);var n=this;return I.when(t(this,e)).then(function(e){return++n._retryCount,e})},Yn.prototype.clone=function(e){return I.defined(e)||(e=new Yn({url:this._url})),e._url=this._url,e._queryParameters=on(this._queryParameters),e._templateValues=on(this._templateValues),e.headers=on(this.headers),e.proxy=this.proxy,e.retryCallback=this.retryCallback,e.retryAttempts=this.retryAttempts,e._retryCount=0,e.request=this.request.clone(),e},Yn.prototype.getBaseUri=function(e){return t=this.getUrlComponent(e),n=e,r="",-1!==(a=t.lastIndexOf("/"))&&(r=t.substring(0,a+1)),n&&(t=new $t(t),I.defined(t.query)&&(r+="?"+t.query),I.defined(t.fragment)&&(r+="#"+t.fragment)),r;var t,n,r,a},Yn.prototype.appendForwardSlash=function(){var e;this._url=(0!==(e=this._url).length&&"/"===e[e.length-1]||(e+="/"),e)},Yn.prototype.fetchArrayBuffer=function(){return this.fetch({responseType:"arraybuffer"})},Yn.fetchArrayBuffer=function(e){return new Yn(e).fetchArrayBuffer()},Yn.prototype.fetchBlob=function(){return this.fetch({responseType:"blob"})},Yn.fetchBlob=function(e){return new Yn(e).fetchBlob()},Yn.prototype.fetchImage=function(e){e=I.defaultValue(e,I.defaultValue.EMPTY_OBJECT);var t=I.defaultValue(e.preferImageBitmap,!1),n=I.defaultValue(e.preferBlob,!1),r=I.defaultValue(e.flipY,!1);if(jn(this.request),!Vn||this.isDataUri||this.isBlobUri||!this.hasHeaders&&!n)return Zn({resource:this,flipY:r,preferImageBitmap:t});var a,i,s,o=this.fetchBlob();return I.defined(o)?Yn.supportsImageBitmapOptions().then(function(e){return a=e&&t,o}).then(function(e){if(I.defined(e)){if(s=e,a)return Yn.createImageBitmapFromBlob(e,{flipY:r,premultiplyAlpha:!1});var t=window.URL.createObjectURL(e);return Zn({resource:i=new Yn({url:t}),flipY:r,preferImageBitmap:!1})}}).then(function(e){if(I.defined(e))return e.blob=s,a||window.URL.revokeObjectURL(i.url),e}).otherwise(function(e){return I.defined(i)&&window.URL.revokeObjectURL(i.url),e.blob=s,I.when.reject(e)}):void 0},Yn.fetchImage=function(e){return new Yn(e).fetchImage({flipY:e.flipY,preferBlob:e.preferBlob,preferImageBitmap:e.preferImageBitmap})},Yn.prototype.fetchText=function(){return this.fetch({responseType:"text"})},Yn.fetchText=function(e){return new Yn(e).fetchText()},Yn.prototype.fetchJson=function(){var e=this.fetch({responseType:"text",headers:{Accept:"application/json,*/*;q=0.01"}});if(I.defined(e))return e.then(function(e){if(I.defined(e))return JSON.parse(e)})},Yn.fetchJson=function(e){return new Yn(e).fetchJson()},Yn.prototype.fetchXML=function(){return this.fetch({responseType:"document",overrideMimeType:"text/xml"})},Yn.fetchXML=function(e){return new Yn(e).fetchXML()},Yn.prototype.fetchJsonp=function(e){var t;for(e=I.defaultValue(e,"callback"),jn(this.request);t="loadJsonp"+Math.random().toString().substring(2,8),I.defined(window[t]););return function n(r,a,i){var e={};e[a]=i;r.setQueryParameters(e);var s=r.request;s.url=r.url;s.requestFunction=function(){var t=I.when.defer();return window[i]=function(e){t.resolve(e);try{delete window[i]}catch(e){window[i]=void 0}},Yn._Implementations.loadAndExecuteScript(r.url,i,t),t.promise};var t=Tn.request(s);if(!I.defined(t))return;return t.otherwise(function(t){return s.state!==mn.FAILED?I.when.reject(t):r.retryOnError(t).then(function(e){return e?(s.state=mn.UNISSUED,s.deferred=void 0,n(r,a,i)):I.when.reject(t)})})}(this,e,t)},Yn.fetchJsonp=function(e){return new Yn(e).fetchJsonp(e.callbackParameterName)},Yn.prototype._makeRequest=function(o){var u=this;jn(u.request);var l=u.request;l.url=u.url,l.requestFunction=function(){var e=o.responseType,t=un(o.headers,u.headers),n=o.overrideMimeType,r=o.method,a=o.data,i=I.when.defer(),s=Yn._Implementations.loadWithXhr(u.url,e,r,a,t,i,n);return I.defined(s)&&I.defined(s.abort)&&(l.cancelFunction=function(){s.abort()}),i.promise};var e=Tn.request(l);if(I.defined(e))return e.then(function(e){return l.cancelFunction=void 0,e}).otherwise(function(t){return l.cancelFunction=void 0,l.state!==mn.FAILED?I.when.reject(t):u.retryOnError(t).then(function(e){return e?(l.state=mn.UNISSUED,l.deferred=void 0,u.fetch(o)):I.when.reject(t)})})};var Xn=/^data:(.*?)(;base64)?,(.*)$/;function Hn(e,t){var n=decodeURIComponent(t);return e?atob(n):n}function Jn(e,t){for(var n=Hn(e,t),r=new ArrayBuffer(n.length),a=new Uint8Array(r),i=0;i<n.length;i++)a[i]=n.charCodeAt(i);return r}function Gn(e,t){switch(t){case"text":return e.toString("utf8");case"json":return JSON.parse(e.toString("utf8"));default:return new Uint8Array(e).buffer}}Yn.prototype.fetch=function(e){return(e=Wn(e,{})).method="GET",this._makeRequest(e)},Yn.fetch=function(e){return new Yn(e).fetch({responseType:e.responseType,overrideMimeType:e.overrideMimeType})},Yn.prototype.delete=function(e){return(e=Wn(e,{})).method="DELETE",this._makeRequest(e)},Yn.delete=function(e){return new Yn(e).delete({responseType:e.responseType,overrideMimeType:e.overrideMimeType,data:e.data})},Yn.prototype.head=function(e){return(e=Wn(e,{})).method="HEAD",this._makeRequest(e)},Yn.head=function(e){return new Yn(e).head({responseType:e.responseType,overrideMimeType:e.overrideMimeType})},Yn.prototype.options=function(e){return(e=Wn(e,{})).method="OPTIONS",this._makeRequest(e)},Yn.options=function(e){return new Yn(e).options({responseType:e.responseType,overrideMimeType:e.overrideMimeType})},Yn.prototype.post=function(e,t){return i.Check.defined("data",e),(t=Wn(t,{})).method="POST",t.data=e,this._makeRequest(t)},Yn.post=function(e){return new Yn(e).post(e.data,{responseType:e.responseType,overrideMimeType:e.overrideMimeType})},Yn.prototype.put=function(e,t){return i.Check.defined("data",e),(t=Wn(t,{})).method="PUT",t.data=e,this._makeRequest(t)},Yn.put=function(e){return new Yn(e).put(e.data,{responseType:e.responseType,overrideMimeType:e.overrideMimeType})},Yn.prototype.patch=function(e,t){return i.Check.defined("data",e),(t=Wn(t,{})).method="PATCH",t.data=e,this._makeRequest(t)},Yn.patch=function(e){return new Yn(e).patch(e.data,{responseType:e.responseType,overrideMimeType:e.overrideMimeType})},(Yn._Implementations={}).createImage=function(o,u,l,c,d){var f=o.url;Yn.supportsImageBitmapOptions().then(function(e){if(!e||!d)return t=f,n=u,r=l,(a=new Image).onload=function(){r.resolve(a)},a.onerror=function(e){r.reject(e)},n&&(Nn.contains(t)?a.crossOrigin="use-credentials":a.crossOrigin=""),void(a.src=t);var t,n,r,a,i=I.when.defer(),s=Yn._Implementations.loadWithXhr(f,"blob","GET",void 0,void 0,i,void 0,void 0,void 0);return I.defined(s)&&I.defined(s.abort)&&(o.cancelFunction=function(){s.abort()}),i.promise.then(function(e){return I.defined(e)?Yn.createImageBitmapFromBlob(e,{flipY:c,premultiplyAlpha:!1}):void l.reject(new H.RuntimeError("Successfully retrieved "+f+" but it contained no content."))}).then(l.resolve)}).otherwise(l.reject)},Yn.createImageBitmapFromBlob=function(e,t){return i.Check.defined("options",t),i.Check.typeOf.bool("options.flipY",t.flipY),i.Check.typeOf.bool("options.premultiplyAlpha",t.premultiplyAlpha),createImageBitmap(e,{imageOrientation:t.flipY?"flipY":"none",premultiplyAlpha:t.premultiplyAlpha?"premultiply":"none"})};var Qn="undefined"==typeof XMLHttpRequest;function Kn(e){var t,n;e=I.defaultValue(e,I.defaultValue.EMPTY_OBJECT),this._dates=void 0,this._samples=void 0,this._dateColumn=-1,this._xPoleWanderRadiansColumn=-1,this._yPoleWanderRadiansColumn=-1,this._ut1MinusUtcSecondsColumn=-1,this._xCelestialPoleOffsetRadiansColumn=-1,this._yCelestialPoleOffsetRadiansColumn=-1,this._taiMinusUtcSecondsColumn=-1,this._columnCount=0,this._lastIndex=-1,this._downloadPromise=void 0,this._dataError=void 0,this._addNewLeapSeconds=I.defaultValue(e.addNewLeapSeconds,!0),I.defined(e.data)?er(this,e.data):I.defined(e.url)?(t=Yn.createIfNeeded(e.url),(n=this)._downloadPromise=t.fetchJson().then(function(e){er(n,e)}).otherwise(function(){n._dataError="An error occurred while retrieving the EOP data from the URL "+t.url+"."})):er(this,{columnNames:["dateIso8601","modifiedJulianDateUtc","xPoleWanderRadians","yPoleWanderRadians","ut1MinusUtcSeconds","lengthOfDayCorrectionSeconds","xCelestialPoleOffsetRadians","yCelestialPoleOffsetRadians","taiMinusUtcSeconds"],samples:[]})}function $n(e,t){return Qt.compare(e.julianDate,t)}function er(e,t){if(I.defined(t.columnNames))if(I.defined(t.samples)){var n=t.columnNames.indexOf("modifiedJulianDateUtc"),r=t.columnNames.indexOf("xPoleWanderRadians"),a=t.columnNames.indexOf("yPoleWanderRadians"),i=t.columnNames.indexOf("ut1MinusUtcSeconds"),s=t.columnNames.indexOf("xCelestialPoleOffsetRadians"),o=t.columnNames.indexOf("yCelestialPoleOffsetRadians"),u=t.columnNames.indexOf("taiMinusUtcSeconds");if(n<0||r<0||a<0||i<0||s<0||o<0||u<0)e._dataError="Error in loaded EOP data: The columnNames property must include modifiedJulianDateUtc, xPoleWanderRadians, yPoleWanderRadians, ut1MinusUtcSeconds, xCelestialPoleOffsetRadians, yCelestialPoleOffsetRadians, and taiMinusUtcSeconds columns";else{var l,c=e._samples=t.samples,d=e._dates=[];e._dateColumn=n,e._xPoleWanderRadiansColumn=r,e._yPoleWanderRadiansColumn=a,e._ut1MinusUtcSecondsColumn=i,e._xCelestialPoleOffsetRadiansColumn=s,e._yCelestialPoleOffsetRadiansColumn=o,e._taiMinusUtcSecondsColumn=u,e._columnCount=t.columnNames.length,e._lastIndex=void 0;for(var f=e._addNewLeapSeconds,h=0,p=c.length;h<p;h+=e._columnCount){var m,y,v,C=c[h+n],w=c[h+u],g=new Qt(C+zt.MODIFIED_JULIAN_DATE_DIFFERENCE,w,It.TAI);d.push(g),f&&(w===l||!I.defined(l)||(y=bt(m=Qt.leapSeconds,g,$n))<0&&(v=new qt(g,w),m.splice(~y,0,v)),l=w)}}}else e._dataError="Error in loaded EOP data: The samples property is required.";else e._dataError="Error in loaded EOP data: The columnNames property is required."}function tr(e,t,n,r,a){var i=n*r;a.xPoleWander=t[i+e._xPoleWanderRadiansColumn],a.yPoleWander=t[i+e._yPoleWanderRadiansColumn],a.xPoleOffset=t[i+e._xCelestialPoleOffsetRadiansColumn],a.yPoleOffset=t[i+e._yCelestialPoleOffsetRadiansColumn],a.ut1MinusUtc=t[i+e._ut1MinusUtcSecondsColumn]}function nr(e,t,n){return t+e*(n-t)}function rr(e,t,n,r,a,i,s){var o=e._columnCount;if(i>t.length-1)return s.xPoleWander=0,s.yPoleWander=0,s.xPoleOffset=0,s.yPoleOffset=0,s.ut1MinusUtc=0,s;var u=t[a],l=t[i];if(u.equals(l)||r.equals(u))return tr(e,n,a,o,s),s;if(r.equals(l))return tr(e,n,i,o,s),s;var c,d,f=Qt.secondsDifference(r,u)/Qt.secondsDifference(l,u),h=a*o,p=i*o,m=n[h+e._ut1MinusUtcSecondsColumn],y=n[p+e._ut1MinusUtcSecondsColumn],v=y-m;return!(.5<v||v<-.5)||(c=n[h+e._taiMinusUtcSecondsColumn])!==(d=n[p+e._taiMinusUtcSecondsColumn])&&(l.equals(r)?m=y:y-=d-c),s.xPoleWander=nr(f,n[h+e._xPoleWanderRadiansColumn],n[p+e._xPoleWanderRadiansColumn]),s.yPoleWander=nr(f,n[h+e._yPoleWanderRadiansColumn],n[p+e._yPoleWanderRadiansColumn]),s.xPoleOffset=nr(f,n[h+e._xCelestialPoleOffsetRadiansColumn],n[p+e._xCelestialPoleOffsetRadiansColumn]),s.yPoleOffset=nr(f,n[h+e._yCelestialPoleOffsetRadiansColumn],n[p+e._yCelestialPoleOffsetRadiansColumn]),s.ut1MinusUtc=nr(f,m,y),s}function ar(e,t,n){this.heading=I.defaultValue(e,0),this.pitch=I.defaultValue(t,0),this.roll=I.defaultValue(n,0)}Yn._Implementations.loadWithXhr=function(e,a,i,t,n,s,r){var o=Xn.exec(e);if(null===o){if(Qn)return u=e,l=a,c=i,d=n,f=s,h=require("url").parse(u),p="https:"===h.protocol?require("https"):require("http"),m=require("zlib"),y={protocol:h.protocol,hostname:h.hostname,port:h.port,path:h.path,query:h.query,method:c,headers:d},void p.request(y).on("response",function(t){var n;t.statusCode<200||300<=t.statusCode?f.reject(new Cn(t.statusCode,t,t.headers)):(n=[],t.on("data",function(e){n.push(e)}),t.on("end",function(){var e=Buffer.concat(n);"gzip"===t.headers["content-encoding"]?m.gunzip(e,function(e,t){e?f.reject(new H.RuntimeError("Error decompressing response.")):f.resolve(Gn(t,l))}):f.resolve(Gn(e,l))}))}).on("error",function(e){f.reject(new Cn)}).end();var u,l,c,d,f,h,p,m,y,v=new XMLHttpRequest;if(Nn.contains(e)&&(v.withCredentials=!0),v.open(i,e,!0),I.defined(r)&&I.defined(v.overrideMimeType)&&v.overrideMimeType(r),I.defined(n))for(var C in n)n.hasOwnProperty(C)&&v.setRequestHeader(C,n[C]);I.defined(a)&&(v.responseType=a);var w=!1;return"string"==typeof e&&(w=0===e.indexOf("file://")||"undefined"!=typeof window&&"file://"===window.location.origin),v.onload=function(){if(!(v.status<200||300<=v.status)||w&&0===v.status){var e=v.response,t=v.responseType;if("HEAD"===i||"OPTIONS"===i){var n=v.getAllResponseHeaders().trim().split(/[\r\n]+/),r={};return n.forEach(function(e){var t=e.split(": "),n=t.shift();r[n]=t.join(": ")}),void s.resolve(r)}if(204===v.status)s.resolve();else if(!I.defined(e)||I.defined(a)&&t!==a)if("json"===a&&"string"==typeof e)try{s.resolve(JSON.parse(e))}catch(e){s.reject(e)}else(""===t||"document"===t)&&I.defined(v.responseXML)&&v.responseXML.hasChildNodes()?s.resolve(v.responseXML):""!==t&&"text"!==t||!I.defined(v.responseText)?s.reject(new H.RuntimeError("Invalid XMLHttpRequest response type.")):s.resolve(v.responseText);else s.resolve(e)}else s.reject(new Cn(v.status,v.response,v.getAllResponseHeaders()))},v.onerror=function(e){s.reject(new Cn)},v.send(t),v}s.resolve(function(e,t){t=I.defaultValue(t,"");var n=e[1],r=!!e[2],a=e[3];switch(t){case"":case"text":return Hn(r,a);case"arraybuffer":return Jn(r,a);case"blob":var i=Jn(r,a);return new Blob([i],{type:n});case"document":return(new DOMParser).parseFromString(Hn(r,a),n);case"json":return JSON.parse(Hn(r,a))}}(o,a))},Yn._Implementations.loadAndExecuteScript=function(e,t,n){return function(e){var t=I.when.defer(),n=document.createElement("script");n.async=!0,n.src=e;var r=document.getElementsByTagName("head")[0];return n.onload=function(){n.onload=void 0,r.removeChild(n),t.resolve()},n.onerror=function(e){t.reject(e)},r.appendChild(n),t.promise}(e).otherwise(n.reject)},(Yn._DefaultImplementations={}).createImage=Yn._Implementations.createImage,Yn._DefaultImplementations.loadWithXhr=Yn._Implementations.loadWithXhr,Yn._DefaultImplementations.loadAndExecuteScript=Yn._Implementations.loadAndExecuteScript,Yn.DEFAULT=Object.freeze(new Yn({url:"undefined"==typeof document?"":document.location.href.split("?")[0]})),Kn.NONE=Object.freeze({getPromiseToLoad:function(){return I.when.resolve()},compute:function(e,t){return I.defined(t)?(t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0):t=new Mt(0,0,0,0,0),t}}),Kn.prototype.getPromiseToLoad=function(){return I.when(this._downloadPromise)},Kn.prototype.compute=function(e,t){if(I.defined(this._samples)){if(I.defined(t)||(t=new Mt(0,0,0,0,0)),0===this._samples.length)return t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0,t;var n=this._dates,r=this._lastIndex,a=0,i=0;if(I.defined(r)){var s=n[r],o=n[r+1],u=Qt.lessThanOrEquals(s,e),l=!I.defined(o),c=l||Qt.greaterThanOrEquals(o,e);if(u&&c)return a=r,!l&&o.equals(e)&&++a,i=a+1,rr(this,n,this._samples,e,a,i,t),t}var d=bt(n,e,Qt.compare,this._dateColumn);return 0<=d?(d<n.length-1&&n[d+1].equals(e)&&++d,i=a=d):(a=(i=~d)-1)<0&&(a=0),this._lastIndex=a,rr(this,n,this._samples,e,a,i,t),t}if(I.defined(this._dataError))throw new H.RuntimeError(this._dataError)},ar.fromQuaternion=function(e,t){I.defined(t)||(t=new ar);var n=2*(e.w*e.y-e.z*e.x),r=1-2*(e.x*e.x+e.y*e.y),a=2*(e.w*e.x+e.y*e.z),i=1-2*(e.y*e.y+e.z*e.z),s=2*(e.w*e.z+e.x*e.y);return t.heading=-Math.atan2(s,i),t.roll=Math.atan2(a,r),t.pitch=-X.CesiumMath.asinClamped(n),t},ar.fromDegrees=function(e,t,n,r){return I.defined(r)||(r=new ar),r.heading=e*X.CesiumMath.RADIANS_PER_DEGREE,r.pitch=t*X.CesiumMath.RADIANS_PER_DEGREE,r.roll=n*X.CesiumMath.RADIANS_PER_DEGREE,r},ar.clone=function(e,t){if(I.defined(e))return I.defined(t)?(t.heading=e.heading,t.pitch=e.pitch,t.roll=e.roll,t):new ar(e.heading,e.pitch,e.roll)},ar.equals=function(e,t){return e===t||I.defined(e)&&I.defined(t)&&e.heading===t.heading&&e.pitch===t.pitch&&e.roll===t.roll},ar.equalsEpsilon=function(e,t,n,r){return e===t||I.defined(e)&&I.defined(t)&&X.CesiumMath.equalsEpsilon(e.heading,t.heading,n,r)&&X.CesiumMath.equalsEpsilon(e.pitch,t.pitch,n,r)&&X.CesiumMath.equalsEpsilon(e.roll,t.roll,n,r)},ar.prototype.clone=function(e){return ar.clone(this,e)},ar.prototype.equals=function(e){return ar.equals(this,e)},ar.prototype.equalsEpsilon=function(e,t,n){return ar.equalsEpsilon(this,e,t,n)},ar.prototype.toString=function(){return"("+this.heading+", "+this.pitch+", "+this.roll+")"};var ir,sr,or,ur=/((?:.*\/)|^)Cesium\.js(?:\?|\#|$)/;function lr(e){return"undefined"==typeof document?e:(I.defined(ir)||(ir=document.createElement("a")),ir.href=e,ir.href=ir.href,ir.href)}function cr(){if(I.defined(sr))return sr;var e="undefined"!=typeof CESIUM_BASE_URL?CESIUM_BASE_URL:"object"==typeof define&&I.defined(define.amd)&&!define.amd.toUrlUndefined&&I.defined(require.toUrl)?ln("..",hr("Core/buildModuleUrl.js")):function(){for(var e=document.getElementsByTagName("script"),t=0,n=e.length;t<n;++t){var r=e[t].getAttribute("src"),a=ur.exec(r);if(null!==a)return a[1]}}();return(sr=new Yn({url:lr(e)})).appendForwardSlash(),sr}function dr(e){return lr(require.toUrl("../"+e))}function fr(e){return cr().getDerivedResource({url:e}).url}function hr(e){return I.defined(or)||(or="object"==typeof define&&I.defined(define.amd)&&!define.amd.toUrlUndefined&&I.defined(require.toUrl)?dr:fr),or(e)}function pr(e,t,n){this.x=e,this.y=t,this.s=n}function mr(e){e=I.defaultValue(e,I.defaultValue.EMPTY_OBJECT),this._xysFileUrlTemplate=Yn.createIfNeeded(e.xysFileUrlTemplate),this._interpolationOrder=I.defaultValue(e.interpolationOrder,9),this._sampleZeroJulianEphemerisDate=I.defaultValue(e.sampleZeroJulianEphemerisDate,2442396.5),this._sampleZeroDateTT=new Qt(this._sampleZeroJulianEphemerisDate,0,It.TAI),this._stepSizeDays=I.defaultValue(e.stepSizeDays,1),this._samplesPerXysFile=I.defaultValue(e.samplesPerXysFile,1e3),this._totalSamples=I.defaultValue(e.totalSamples,27426),this._samples=new Array(3*this._totalSamples),this._chunkDownloadsInProgress=[];for(var t=this._interpolationOrder,n=this._denominators=new Array(t+1),r=this._xTable=new Array(t+1),a=Math.pow(this._stepSizeDays,t),i=0;i<=t;++i){n[i]=a,r[i]=i*this._stepSizeDays;for(var s=0;s<=t;++s)s!==i&&(n[i]*=i-s);n[i]=1/n[i]}this._work=new Array(t+1),this._coef=new Array(t+1)}hr._cesiumScriptRegex=ur,hr._buildModuleUrlFromBaseUrl=fr,hr._clearBaseResource=function(){sr=void 0},hr.setBaseUrl=function(e){sr=Yn.DEFAULT.getDerivedResource({url:e})},hr.getCesiumBaseUrl=cr;var yr=new Qt(0,0,It.TAI);function vr(e,t,n){var r=yr;return r.dayNumber=t,r.secondsOfDay=n,Qt.daysDifference(r,e._sampleZeroDateTT)}function Cr(s,o){if(s._chunkDownloadsInProgress[o])return s._chunkDownloadsInProgress[o];var u=I.when.defer();s._chunkDownloadsInProgress[o]=u;var e=s._xysFileUrlTemplate,t=I.defined(e)?e.getDerivedResource({templateValues:{0:o}}):new Yn({url:hr("Assets/IAU2006_XYS/IAU2006_XYS_"+o+".json")});return I.when(t.fetchJson(),function(e){s._chunkDownloadsInProgress[o]=!1;for(var t=s._samples,n=e.samples,r=o*s._samplesPerXysFile*3,a=0,i=n.length;a<i;++a)t[r+a]=n[a];u.resolve()}),u.promise}mr.prototype.preload=function(e,t,n,r){var a=vr(this,e,t),i=vr(this,n,r),s=a/this._stepSizeDays-this._interpolationOrder/2|0;s<0&&(s=0);var o=i/this._stepSizeDays-this._interpolationOrder/2|0+this._interpolationOrder;o>=this._totalSamples&&(o=this._totalSamples-1);for(var u=s/this._samplesPerXysFile|0,l=o/this._samplesPerXysFile|0,c=[],d=u;d<=l;++d)c.push(Cr(this,d));return I.when.all(c)},mr.prototype.computeXysRadians=function(e,t,n){var r=vr(this,e,t);if(!(r<0)){var a=r/this._stepSizeDays|0;if(!(a>=this._totalSamples)){var i=this._interpolationOrder,s=a-(i/2|0);s<0&&(s=0);var o=s+i;o>=this._totalSamples&&(s=(o=this._totalSamples-1)-i)<0&&(s=0);var u=!1,l=this._samples;if(I.defined(l[3*s])||(Cr(this,s/this._samplesPerXysFile|0),u=!0),I.defined(l[3*o])||(Cr(this,o/this._samplesPerXysFile|0),u=!0),!u){I.defined(n)?(n.x=0,n.y=0,n.s=0):n=new pr(0,0,0);for(var c,d=r-s*this._stepSizeDays,f=this._work,h=this._denominators,p=this._coef,m=this._xTable,y=0;y<=i;++y)f[y]=d-m[y];for(y=0;y<=i;++y){for(p[y]=1,c=0;c<=i;++c)c!==y&&(p[y]*=f[c]);p[y]*=h[y];var v=3*(s+y);n.x+=p[y]*l[v++],n.y+=p[y]*l[v++],n.s+=p[y]*l[v]}return n}}}};var wr={},gr={up:{south:"east",north:"west",west:"south",east:"north"},down:{south:"west",north:"east",west:"north",east:"south"},south:{up:"west",down:"east",west:"down",east:"up"},north:{up:"east",down:"west",west:"up",east:"down"},west:{up:"north",down:"south",north:"down",south:"up"},east:{up:"south",down:"north",north:"up",south:"down"}},xr={north:[-1,0,0],east:[0,1,0],up:[0,0,1],south:[1,0,0],west:[0,-1,0],down:[0,0,-1]},Er={},Or={east:new P.Cartesian3,north:new P.Cartesian3,up:new P.Cartesian3,west:new P.Cartesian3,south:new P.Cartesian3,down:new P.Cartesian3},_r=new P.Cartesian3,Sr=new P.Cartesian3,br=new P.Cartesian3;wr.localFrameToFixedFrameGenerator=function(s,o){if(!gr.hasOwnProperty(s)||!gr[s].hasOwnProperty(o))throw new i.DeveloperError("firstAxis and secondAxis must be east, north, up, west, south or down.");var e,u=gr[s][o],t=s+o;return I.defined(Er[t])?e=Er[t]:(e=function(e,t,n){var r,a,i;return I.defined(n)||(n=new Q),P.Cartesian3.equalsEpsilon(e,P.Cartesian3.ZERO,X.CesiumMath.EPSILON14)?(P.Cartesian3.unpack(xr[s],0,_r),P.Cartesian3.unpack(xr[o],0,Sr),P.Cartesian3.unpack(xr[u],0,br)):X.CesiumMath.equalsEpsilon(e.x,0,X.CesiumMath.EPSILON14)&&X.CesiumMath.equalsEpsilon(e.y,0,X.CesiumMath.EPSILON14)?(r=X.CesiumMath.sign(e.z),P.Cartesian3.unpack(xr[s],0,_r),"east"!==s&&"west"!==s&&P.Cartesian3.multiplyByScalar(_r,r,_r),P.Cartesian3.unpack(xr[o],0,Sr),"east"!==o&&"west"!==o&&P.Cartesian3.multiplyByScalar(Sr,r,Sr),P.Cartesian3.unpack(xr[u],0,br),"east"!==u&&"west"!==u&&P.Cartesian3.multiplyByScalar(br,r,br)):((t=I.defaultValue(t,P.Ellipsoid.WGS84)).geodeticSurfaceNormal(e,Or.up),a=Or.up,(i=Or.east).x=-e.y,i.y=e.x,i.z=0,P.Cartesian3.normalize(i,Or.east),P.Cartesian3.cross(a,i,Or.north),P.Cartesian3.multiplyByScalar(Or.up,-1,Or.down),P.Cartesian3.multiplyByScalar(Or.east,-1,Or.west),P.Cartesian3.multiplyByScalar(Or.north,-1,Or.south),_r=Or[s],Sr=Or[o],br=Or[u]),n[0]=_r.x,n[1]=_r.y,n[2]=_r.z,n[3]=0,n[4]=Sr.x,n[5]=Sr.y,n[6]=Sr.z,n[7]=0,n[8]=br.x,n[9]=br.y,n[10]=br.z,n[11]=0,n[12]=e.x,n[13]=e.y,n[14]=e.z,n[15]=1,n},Er[t]=e),e},wr.eastNorthUpToFixedFrame=wr.localFrameToFixedFrameGenerator("east","north"),wr.northEastDownToFixedFrame=wr.localFrameToFixedFrameGenerator("north","east"),wr.northUpEastToFixedFrame=wr.localFrameToFixedFrameGenerator("north","up"),wr.northWestUpToFixedFrame=wr.localFrameToFixedFrameGenerator("north","west");var Mr=new Ge,Rr=new P.Cartesian3(1,1,1),Ar=new Q;wr.headingPitchRollToFixedFrame=function(e,t,n,r,a){r=I.defaultValue(r,wr.eastNorthUpToFixedFrame);var i=Ge.fromHeadingPitchRoll(t,Mr),s=Q.fromTranslationQuaternionRotationScale(P.Cartesian3.ZERO,i,Rr,Ar);return a=r(e,n,a),Q.multiply(a,s,a)};var Tr=new Q,qr=new J;wr.headingPitchRollQuaternion=function(e,t,n,r,a){var i=wr.headingPitchRollToFixedFrame(e,t,n,r,Tr),s=Q.getMatrix3(i,qr);return Ge.fromRotationMatrix(s,a)};var zr=new P.Cartesian3(1,1,1),Ir=new P.Cartesian3,Pr=new Q,Dr=new Q,Nr=new J,Ur=new Ge;wr.fixedFrameToHeadingPitchRoll=function(e,t,n,r){t=I.defaultValue(t,P.Ellipsoid.WGS84),n=I.defaultValue(n,wr.eastNorthUpToFixedFrame),I.defined(r)||(r=new ar);var a=Q.getTranslation(e,Ir);if(P.Cartesian3.equals(a,P.Cartesian3.ZERO))return r.heading=0,r.pitch=0,r.roll=0,r;var i=Q.inverseTransformation(n(a,t,Pr),Pr),s=Q.setScale(e,zr,Dr),s=Q.setTranslation(s,P.Cartesian3.ZERO,s),i=Q.multiply(i,s,i),o=Ge.fromRotationMatrix(Q.getMatrix3(i,Nr),Ur),o=Ge.normalize(o,o);return ar.fromQuaternion(o,r)};var Fr=X.CesiumMath.TWO_PI/86400,Vr=new Qt;wr.computeTemeToPseudoFixedMatrix=function(e,t){var n=(Vr=Qt.addSeconds(e,-Qt.computeTaiMinusUtc(e),Vr)).dayNumber,r=Vr.secondsOfDay,a=n-2451545,i=43200<=r?(.5+a)/zt.DAYS_PER_JULIAN_CENTURY:(a-.5)/zt.DAYS_PER_JULIAN_CENTURY,s=(24110.54841+i*(8640184.812866+i*(.093104+-62e-7*i)))*Fr%X.CesiumMath.TWO_PI+(72921158553e-15+11772758384668e-32*(n-2451545.5))*((r+.5*zt.SECONDS_PER_DAY)%zt.SECONDS_PER_DAY),o=Math.cos(s),u=Math.sin(s);return I.defined(t)?(t[0]=o,t[1]=-u,t[2]=0,t[3]=u,t[4]=o,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t):new J(o,u,0,-u,o,0,0,0,1)},wr.iau2006XysData=new mr,wr.earthOrientationParameters=Kn.NONE;var Lr=32.184;wr.preloadIcrfFixed=function(e){var t=e.start.dayNumber,n=e.start.secondsOfDay+Lr,r=e.stop.dayNumber,a=e.stop.secondsOfDay+Lr,i=wr.iau2006XysData.preload(t,n,r,a),s=wr.earthOrientationParameters.getPromiseToLoad();return I.when.all([i,s])},wr.computeIcrfToFixedMatrix=function(e,t){I.defined(t)||(t=new J);var n=wr.computeFixedToIcrfMatrix(e,t);if(I.defined(n))return J.transpose(n,t)};var Br=new pr(0,0,0),Wr=new Mt(0,0,0,0,0),jr=new J,kr=new J;wr.computeFixedToIcrfMatrix=function(e,t){I.defined(t)||(t=new J);var n=wr.earthOrientationParameters.compute(e,Wr);if(I.defined(n)){var r=e.dayNumber,a=e.secondsOfDay+Lr,i=wr.iau2006XysData.computeXysRadians(r,a,Br);if(I.defined(i)){var s=i.x+n.xPoleOffset,o=i.y+n.yPoleOffset,u=1/(1+Math.sqrt(1-s*s-o*o)),l=jr;l[0]=1-u*s*s,l[3]=-u*s*o,l[6]=s,l[1]=-u*s*o,l[4]=1-u*o*o,l[7]=o,l[2]=-s,l[5]=-o,l[8]=1-u*(s*s+o*o);var c=J.fromRotationZ(-i.s,kr),d=J.multiply(l,c,jr),f=e.dayNumber-2451545,h=(e.secondsOfDay-Qt.computeTaiMinusUtc(e)+n.ut1MinusUtc)/zt.SECONDS_PER_DAY,p=(p=.779057273264+h+.00273781191135448*(f+h))%1*X.CesiumMath.TWO_PI,m=J.fromRotationZ(p,kr),y=J.multiply(d,m,jr),v=Math.cos(n.xPoleWander),C=Math.cos(n.yPoleWander),w=Math.sin(n.xPoleWander),g=Math.sin(n.yPoleWander),x=r-2451545+a/zt.SECONDS_PER_DAY,E=-47e-6*(x/=36525)*X.CesiumMath.RADIANS_PER_DEGREE/3600,O=Math.cos(E),_=Math.sin(E),S=kr;return S[0]=v*O,S[1]=v*_,S[2]=w,S[3]=-C*_+g*w*O,S[4]=C*O+g*w*_,S[5]=-g*v,S[6]=-g*_-C*w*O,S[7]=g*O-C*w*_,S[8]=C*v,J.multiply(y,S,t)}}};var Yr=new G;wr.pointToWindowCoordinates=function(e,t,n,r){return(r=wr.pointToGLWindowCoordinates(e,t,n,r)).y=2*t[5]-r.y,r},wr.pointToGLWindowCoordinates=function(e,t,n,r){I.defined(r)||(r=new P.Cartesian2);var a=Yr;return Q.multiplyByVector(e,G.fromElements(n.x,n.y,n.z,1,a),a),G.multiplyByScalar(a,1/a.w,a),Q.multiplyByVector(t,a,a),P.Cartesian2.fromCartesian4(a,r)};var Zr=new P.Cartesian3,Xr=new P.Cartesian3,Hr=new P.Cartesian3;wr.rotationMatrixFromPositionVelocity=function(e,t,n,r){var a=I.defaultValue(n,P.Ellipsoid.WGS84).geodeticSurfaceNormal(e,Zr),i=P.Cartesian3.cross(t,a,Xr);P.Cartesian3.equalsEpsilon(i,P.Cartesian3.ZERO,X.CesiumMath.EPSILON6)&&(i=P.Cartesian3.clone(P.Cartesian3.UNIT_X,i));var s=P.Cartesian3.cross(i,t,Hr);return P.Cartesian3.normalize(s,s),P.Cartesian3.cross(t,s,i),P.Cartesian3.negate(i,i),P.Cartesian3.normalize(i,i),I.defined(r)||(r=new J),r[0]=t.x,r[1]=t.y,r[2]=t.z,r[3]=i.x,r[4]=i.y,r[5]=i.z,r[6]=s.x,r[7]=s.y,r[8]=s.z,r};var Jr=new Q(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1),Gr=new P.Cartographic,Qr=new P.Cartesian3,Kr=new P.Cartesian3,$r=new J,ea=new Q,ta=new Q;wr.basisTo2D=function(e,t,n){var r=Q.getTranslation(t,Kr),a=e.ellipsoid,i=a.cartesianToCartographic(r,Gr),s=e.project(i,Qr);P.Cartesian3.fromElements(s.z,s.x,s.y,s);var o=wr.eastNorthUpToFixedFrame(r,a,ea),u=Q.inverseTransformation(o,ta),l=Q.getMatrix3(t,$r),c=Q.multiplyByMatrix3(u,l,n);return Q.multiply(Jr,c,n),Q.setTranslation(n,s,n),n},wr.wgs84To2DModelMatrix=function(e,t,n){var r=e.ellipsoid,a=wr.eastNorthUpToFixedFrame(t,r,ea),i=Q.inverseTransformation(a,ta),s=r.cartesianToCartographic(t,Gr),o=e.project(s,Qr);P.Cartesian3.fromElements(o.z,o.x,o.y,o);var u=Q.fromTranslation(o,ea);return Q.multiply(Jr,i,n),Q.multiply(u,n,n),n},e.BoundingSphere=D,e.Cartesian4=G,e.FeatureDetection=Je,e.GeographicProjection=t,e.Intersect=s,e.Interval=o,e.Matrix3=J,e.Matrix4=Q,e.Quaternion=Ge,e.Resource=Yn,e.Transforms=wr,e.buildModuleUrl=hr}); diff --git a/web/assets/Cesium/Workers/VertexFormat-7572c785.js b/web/assets/Cesium/Workers/VertexFormat-7572c785.js new file mode 100644 index 00000000..1d20521d --- /dev/null +++ b/web/assets/Cesium/Workers/VertexFormat-7572c785.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc"],function(e,o,t){"use strict";function i(e){e=o.defaultValue(e,o.defaultValue.EMPTY_OBJECT),this.position=o.defaultValue(e.position,!1),this.normal=o.defaultValue(e.normal,!1),this.st=o.defaultValue(e.st,!1),this.bitangent=o.defaultValue(e.bitangent,!1),this.tangent=o.defaultValue(e.tangent,!1),this.color=o.defaultValue(e.color,!1)}i.POSITION_ONLY=Object.freeze(new i({position:!0})),i.POSITION_AND_NORMAL=Object.freeze(new i({position:!0,normal:!0})),i.POSITION_NORMAL_AND_ST=Object.freeze(new i({position:!0,normal:!0,st:!0})),i.POSITION_AND_ST=Object.freeze(new i({position:!0,st:!0})),i.POSITION_AND_COLOR=Object.freeze(new i({position:!0,color:!0})),i.ALL=Object.freeze(new i({position:!0,normal:!0,st:!0,tangent:!0,bitangent:!0})),i.DEFAULT=i.POSITION_NORMAL_AND_ST,i.packedLength=6,i.pack=function(e,t,n){return n=o.defaultValue(n,0),t[n++]=e.position?1:0,t[n++]=e.normal?1:0,t[n++]=e.st?1:0,t[n++]=e.tangent?1:0,t[n++]=e.bitangent?1:0,t[n]=e.color?1:0,t},i.unpack=function(e,t,n){return t=o.defaultValue(t,0),o.defined(n)||(n=new i),n.position=1===e[t++],n.normal=1===e[t++],n.st=1===e[t++],n.tangent=1===e[t++],n.bitangent=1===e[t++],n.color=1===e[t],n},i.clone=function(e,t){if(o.defined(e))return o.defined(t)||(t=new i),t.position=e.position,t.normal=e.normal,t.st=e.st,t.tangent=e.tangent,t.bitangent=e.bitangent,t.color=e.color,t},e.VertexFormat=i}); diff --git a/web/assets/Cesium/Workers/WallGeometryLibrary-cfdc73e3.js b/web/assets/Cesium/Workers/WallGeometryLibrary-cfdc73e3.js new file mode 100644 index 00000000..1deef9a9 --- /dev/null +++ b/web/assets/Cesium/Workers/WallGeometryLibrary-cfdc73e3.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Math-fc8cecf5","./Cartesian2-bddc1162","./arrayRemoveDuplicates-ebc732b0","./PolylinePipeline-8a1a1e4f"],function(e,P,A,C,w,b){"use strict";var i={};var M=new C.Cartographic,E=new C.Cartographic;function F(e,i,t,r){var a=(i=w.arrayRemoveDuplicates(i,C.Cartesian3.equalsEpsilon)).length;if(!(a<2)){var n=P.defined(r),o=P.defined(t),l=new Array(a),s=new Array(a),h=new Array(a),g=i[0];l[0]=g;var c=e.cartesianToCartographic(g,M);o&&(c.height=t[0]),s[0]=c.height,h[0]=n?r[0]:0;for(var p,u,d=s[0]===h[0],v=1,y=1;y<a;++y){var f=i[y],m=e.cartesianToCartographic(f,E);o&&(m.height=t[y]),d=d&&0===m.height,p=c,u=m,A.CesiumMath.equalsEpsilon(p.latitude,u.latitude,A.CesiumMath.EPSILON10)&&A.CesiumMath.equalsEpsilon(p.longitude,u.longitude,A.CesiumMath.EPSILON10)?c.height<m.height&&(s[v-1]=m.height):(l[v]=f,s[v]=m.height,h[v]=n?r[y]:0,d=d&&s[v]===h[v],C.Cartographic.clone(m,c),++v)}if(!(d||v<2))return l.length=v,s.length=v,h.length=v,{positions:l,topHeights:s,bottomHeights:h}}}var H=new Array(2),L=new Array(2),q={positions:void 0,height:void 0,granularity:void 0,ellipsoid:void 0};i.computePositions=function(e,i,t,r,a,n){var o=F(e,i,t,r);if(P.defined(o)){i=o.positions,t=o.topHeights,r=o.bottomHeights;var l,s,h=i.length,g=h-2,c=A.CesiumMath.chordLength(a,e.maximumRadius),p=q;if(p.minDistance=c,p.ellipsoid=e,n){for(var u=0,d=0;d<h-1;d++)u+=b.PolylinePipeline.numberOfPoints(i[d],i[d+1],c)+1;l=new Float64Array(3*u),s=new Float64Array(3*u);var v=H,y=L;p.positions=v,p.height=y;var f=0;for(d=0;d<h-1;d++){v[0]=i[d],v[1]=i[d+1],y[0]=t[d],y[1]=t[d+1];var m=b.PolylinePipeline.generateArc(p);l.set(m,f),y[0]=r[d],y[1]=r[d+1],s.set(b.PolylinePipeline.generateArc(p),f),f+=m.length}}else p.positions=i,p.height=t,l=new Float64Array(b.PolylinePipeline.generateArc(p)),p.height=r,s=new Float64Array(b.PolylinePipeline.generateArc(p));return{bottomPositions:s,topPositions:l,numCorners:g}}},e.WallGeometryLibrary=i}); diff --git a/web/assets/Cesium/Workers/WebGLConstants-76bb35d1.js b/web/assets/Cesium/Workers/WebGLConstants-76bb35d1.js new file mode 100644 index 00000000..bf779723 --- /dev/null +++ b/web/assets/Cesium/Workers/WebGLConstants-76bb35d1.js @@ -0,0 +1 @@ +define(["exports"],function(E){"use strict";var _=Object.freeze({DEPTH_BUFFER_BIT:256,STENCIL_BUFFER_BIT:1024,COLOR_BUFFER_BIT:16384,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,ZERO:0,ONE:1,SRC_COLOR:768,ONE_MINUS_SRC_COLOR:769,SRC_ALPHA:770,ONE_MINUS_SRC_ALPHA:771,DST_ALPHA:772,ONE_MINUS_DST_ALPHA:773,DST_COLOR:774,ONE_MINUS_DST_COLOR:775,SRC_ALPHA_SATURATE:776,FUNC_ADD:32774,BLEND_EQUATION:32777,BLEND_EQUATION_RGB:32777,BLEND_EQUATION_ALPHA:34877,FUNC_SUBTRACT:32778,FUNC_REVERSE_SUBTRACT:32779,BLEND_DST_RGB:32968,BLEND_SRC_RGB:32969,BLEND_DST_ALPHA:32970,BLEND_SRC_ALPHA:32971,CONSTANT_COLOR:32769,ONE_MINUS_CONSTANT_COLOR:32770,CONSTANT_ALPHA:32771,ONE_MINUS_CONSTANT_ALPHA:32772,BLEND_COLOR:32773,ARRAY_BUFFER:34962,ELEMENT_ARRAY_BUFFER:34963,ARRAY_BUFFER_BINDING:34964,ELEMENT_ARRAY_BUFFER_BINDING:34965,STREAM_DRAW:35040,STATIC_DRAW:35044,DYNAMIC_DRAW:35048,BUFFER_SIZE:34660,BUFFER_USAGE:34661,CURRENT_VERTEX_ATTRIB:34342,FRONT:1028,BACK:1029,FRONT_AND_BACK:1032,CULL_FACE:2884,BLEND:3042,DITHER:3024,STENCIL_TEST:2960,DEPTH_TEST:2929,SCISSOR_TEST:3089,POLYGON_OFFSET_FILL:32823,SAMPLE_ALPHA_TO_COVERAGE:32926,SAMPLE_COVERAGE:32928,NO_ERROR:0,INVALID_ENUM:1280,INVALID_VALUE:1281,INVALID_OPERATION:1282,OUT_OF_MEMORY:1285,CW:2304,CCW:2305,LINE_WIDTH:2849,ALIASED_POINT_SIZE_RANGE:33901,ALIASED_LINE_WIDTH_RANGE:33902,CULL_FACE_MODE:2885,FRONT_FACE:2886,DEPTH_RANGE:2928,DEPTH_WRITEMASK:2930,DEPTH_CLEAR_VALUE:2931,DEPTH_FUNC:2932,STENCIL_CLEAR_VALUE:2961,STENCIL_FUNC:2962,STENCIL_FAIL:2964,STENCIL_PASS_DEPTH_FAIL:2965,STENCIL_PASS_DEPTH_PASS:2966,STENCIL_REF:2967,STENCIL_VALUE_MASK:2963,STENCIL_WRITEMASK:2968,STENCIL_BACK_FUNC:34816,STENCIL_BACK_FAIL:34817,STENCIL_BACK_PASS_DEPTH_FAIL:34818,STENCIL_BACK_PASS_DEPTH_PASS:34819,STENCIL_BACK_REF:36003,STENCIL_BACK_VALUE_MASK:36004,STENCIL_BACK_WRITEMASK:36005,VIEWPORT:2978,SCISSOR_BOX:3088,COLOR_CLEAR_VALUE:3106,COLOR_WRITEMASK:3107,UNPACK_ALIGNMENT:3317,PACK_ALIGNMENT:3333,MAX_TEXTURE_SIZE:3379,MAX_VIEWPORT_DIMS:3386,SUBPIXEL_BITS:3408,RED_BITS:3410,GREEN_BITS:3411,BLUE_BITS:3412,ALPHA_BITS:3413,DEPTH_BITS:3414,STENCIL_BITS:3415,POLYGON_OFFSET_UNITS:10752,POLYGON_OFFSET_FACTOR:32824,TEXTURE_BINDING_2D:32873,SAMPLE_BUFFERS:32936,SAMPLES:32937,SAMPLE_COVERAGE_VALUE:32938,SAMPLE_COVERAGE_INVERT:32939,COMPRESSED_TEXTURE_FORMATS:34467,DONT_CARE:4352,FASTEST:4353,NICEST:4354,GENERATE_MIPMAP_HINT:33170,BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,DEPTH_COMPONENT:6402,ALPHA:6406,RGB:6407,RGBA:6408,LUMINANCE:6409,LUMINANCE_ALPHA:6410,UNSIGNED_SHORT_4_4_4_4:32819,UNSIGNED_SHORT_5_5_5_1:32820,UNSIGNED_SHORT_5_6_5:33635,FRAGMENT_SHADER:35632,VERTEX_SHADER:35633,MAX_VERTEX_ATTRIBS:34921,MAX_VERTEX_UNIFORM_VECTORS:36347,MAX_VARYING_VECTORS:36348,MAX_COMBINED_TEXTURE_IMAGE_UNITS:35661,MAX_VERTEX_TEXTURE_IMAGE_UNITS:35660,MAX_TEXTURE_IMAGE_UNITS:34930,MAX_FRAGMENT_UNIFORM_VECTORS:36349,SHADER_TYPE:35663,DELETE_STATUS:35712,LINK_STATUS:35714,VALIDATE_STATUS:35715,ATTACHED_SHADERS:35717,ACTIVE_UNIFORMS:35718,ACTIVE_ATTRIBUTES:35721,SHADING_LANGUAGE_VERSION:35724,CURRENT_PROGRAM:35725,NEVER:512,LESS:513,EQUAL:514,LEQUAL:515,GREATER:516,NOTEQUAL:517,GEQUAL:518,ALWAYS:519,KEEP:7680,REPLACE:7681,INCR:7682,DECR:7683,INVERT:5386,INCR_WRAP:34055,DECR_WRAP:34056,VENDOR:7936,RENDERER:7937,VERSION:7938,NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987,TEXTURE_MAG_FILTER:10240,TEXTURE_MIN_FILTER:10241,TEXTURE_WRAP_S:10242,TEXTURE_WRAP_T:10243,TEXTURE_2D:3553,TEXTURE:5890,TEXTURE_CUBE_MAP:34067,TEXTURE_BINDING_CUBE_MAP:34068,TEXTURE_CUBE_MAP_POSITIVE_X:34069,TEXTURE_CUBE_MAP_NEGATIVE_X:34070,TEXTURE_CUBE_MAP_POSITIVE_Y:34071,TEXTURE_CUBE_MAP_NEGATIVE_Y:34072,TEXTURE_CUBE_MAP_POSITIVE_Z:34073,TEXTURE_CUBE_MAP_NEGATIVE_Z:34074,MAX_CUBE_MAP_TEXTURE_SIZE:34076,TEXTURE0:33984,TEXTURE1:33985,TEXTURE2:33986,TEXTURE3:33987,TEXTURE4:33988,TEXTURE5:33989,TEXTURE6:33990,TEXTURE7:33991,TEXTURE8:33992,TEXTURE9:33993,TEXTURE10:33994,TEXTURE11:33995,TEXTURE12:33996,TEXTURE13:33997,TEXTURE14:33998,TEXTURE15:33999,TEXTURE16:34e3,TEXTURE17:34001,TEXTURE18:34002,TEXTURE19:34003,TEXTURE20:34004,TEXTURE21:34005,TEXTURE22:34006,TEXTURE23:34007,TEXTURE24:34008,TEXTURE25:34009,TEXTURE26:34010,TEXTURE27:34011,TEXTURE28:34012,TEXTURE29:34013,TEXTURE30:34014,TEXTURE31:34015,ACTIVE_TEXTURE:34016,REPEAT:10497,CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,INT_VEC2:35667,INT_VEC3:35668,INT_VEC4:35669,BOOL:35670,BOOL_VEC2:35671,BOOL_VEC3:35672,BOOL_VEC4:35673,FLOAT_MAT2:35674,FLOAT_MAT3:35675,FLOAT_MAT4:35676,SAMPLER_2D:35678,SAMPLER_CUBE:35680,VERTEX_ATTRIB_ARRAY_ENABLED:34338,VERTEX_ATTRIB_ARRAY_SIZE:34339,VERTEX_ATTRIB_ARRAY_STRIDE:34340,VERTEX_ATTRIB_ARRAY_TYPE:34341,VERTEX_ATTRIB_ARRAY_NORMALIZED:34922,VERTEX_ATTRIB_ARRAY_POINTER:34373,VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:34975,IMPLEMENTATION_COLOR_READ_TYPE:35738,IMPLEMENTATION_COLOR_READ_FORMAT:35739,COMPILE_STATUS:35713,LOW_FLOAT:36336,MEDIUM_FLOAT:36337,HIGH_FLOAT:36338,LOW_INT:36339,MEDIUM_INT:36340,HIGH_INT:36341,FRAMEBUFFER:36160,RENDERBUFFER:36161,RGBA4:32854,RGB5_A1:32855,RGB565:36194,DEPTH_COMPONENT16:33189,STENCIL_INDEX:6401,STENCIL_INDEX8:36168,DEPTH_STENCIL:34041,RENDERBUFFER_WIDTH:36162,RENDERBUFFER_HEIGHT:36163,RENDERBUFFER_INTERNAL_FORMAT:36164,RENDERBUFFER_RED_SIZE:36176,RENDERBUFFER_GREEN_SIZE:36177,RENDERBUFFER_BLUE_SIZE:36178,RENDERBUFFER_ALPHA_SIZE:36179,RENDERBUFFER_DEPTH_SIZE:36180,RENDERBUFFER_STENCIL_SIZE:36181,FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:36048,FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:36049,FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:36050,FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:36051,COLOR_ATTACHMENT0:36064,DEPTH_ATTACHMENT:36096,STENCIL_ATTACHMENT:36128,DEPTH_STENCIL_ATTACHMENT:33306,NONE:0,FRAMEBUFFER_COMPLETE:36053,FRAMEBUFFER_INCOMPLETE_ATTACHMENT:36054,FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:36055,FRAMEBUFFER_INCOMPLETE_DIMENSIONS:36057,FRAMEBUFFER_UNSUPPORTED:36061,FRAMEBUFFER_BINDING:36006,RENDERBUFFER_BINDING:36007,MAX_RENDERBUFFER_SIZE:34024,INVALID_FRAMEBUFFER_OPERATION:1286,UNPACK_FLIP_Y_WEBGL:37440,UNPACK_PREMULTIPLY_ALPHA_WEBGL:37441,CONTEXT_LOST_WEBGL:37442,UNPACK_COLORSPACE_CONVERSION_WEBGL:37443,BROWSER_DEFAULT_WEBGL:37444,COMPRESSED_RGB_S3TC_DXT1_EXT:33776,COMPRESSED_RGBA_S3TC_DXT1_EXT:33777,COMPRESSED_RGBA_S3TC_DXT3_EXT:33778,COMPRESSED_RGBA_S3TC_DXT5_EXT:33779,COMPRESSED_RGB_PVRTC_4BPPV1_IMG:35840,COMPRESSED_RGB_PVRTC_2BPPV1_IMG:35841,COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:35842,COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:35843,COMPRESSED_RGB_ETC1_WEBGL:36196,HALF_FLOAT_OES:36193,DOUBLE:5130,READ_BUFFER:3074,UNPACK_ROW_LENGTH:3314,UNPACK_SKIP_ROWS:3315,UNPACK_SKIP_PIXELS:3316,PACK_ROW_LENGTH:3330,PACK_SKIP_ROWS:3331,PACK_SKIP_PIXELS:3332,COLOR:6144,DEPTH:6145,STENCIL:6146,RED:6403,RGB8:32849,RGBA8:32856,RGB10_A2:32857,TEXTURE_BINDING_3D:32874,UNPACK_SKIP_IMAGES:32877,UNPACK_IMAGE_HEIGHT:32878,TEXTURE_3D:32879,TEXTURE_WRAP_R:32882,MAX_3D_TEXTURE_SIZE:32883,UNSIGNED_INT_2_10_10_10_REV:33640,MAX_ELEMENTS_VERTICES:33e3,MAX_ELEMENTS_INDICES:33001,TEXTURE_MIN_LOD:33082,TEXTURE_MAX_LOD:33083,TEXTURE_BASE_LEVEL:33084,TEXTURE_MAX_LEVEL:33085,MIN:32775,MAX:32776,DEPTH_COMPONENT24:33190,MAX_TEXTURE_LOD_BIAS:34045,TEXTURE_COMPARE_MODE:34892,TEXTURE_COMPARE_FUNC:34893,CURRENT_QUERY:34917,QUERY_RESULT:34918,QUERY_RESULT_AVAILABLE:34919,STREAM_READ:35041,STREAM_COPY:35042,STATIC_READ:35045,STATIC_COPY:35046,DYNAMIC_READ:35049,DYNAMIC_COPY:35050,MAX_DRAW_BUFFERS:34852,DRAW_BUFFER0:34853,DRAW_BUFFER1:34854,DRAW_BUFFER2:34855,DRAW_BUFFER3:34856,DRAW_BUFFER4:34857,DRAW_BUFFER5:34858,DRAW_BUFFER6:34859,DRAW_BUFFER7:34860,DRAW_BUFFER8:34861,DRAW_BUFFER9:34862,DRAW_BUFFER10:34863,DRAW_BUFFER11:34864,DRAW_BUFFER12:34865,DRAW_BUFFER13:34866,DRAW_BUFFER14:34867,DRAW_BUFFER15:34868,MAX_FRAGMENT_UNIFORM_COMPONENTS:35657,MAX_VERTEX_UNIFORM_COMPONENTS:35658,SAMPLER_3D:35679,SAMPLER_2D_SHADOW:35682,FRAGMENT_SHADER_DERIVATIVE_HINT:35723,PIXEL_PACK_BUFFER:35051,PIXEL_UNPACK_BUFFER:35052,PIXEL_PACK_BUFFER_BINDING:35053,PIXEL_UNPACK_BUFFER_BINDING:35055,FLOAT_MAT2x3:35685,FLOAT_MAT2x4:35686,FLOAT_MAT3x2:35687,FLOAT_MAT3x4:35688,FLOAT_MAT4x2:35689,FLOAT_MAT4x3:35690,SRGB:35904,SRGB8:35905,SRGB8_ALPHA8:35907,COMPARE_REF_TO_TEXTURE:34894,RGBA32F:34836,RGB32F:34837,RGBA16F:34842,RGB16F:34843,VERTEX_ATTRIB_ARRAY_INTEGER:35069,MAX_ARRAY_TEXTURE_LAYERS:35071,MIN_PROGRAM_TEXEL_OFFSET:35076,MAX_PROGRAM_TEXEL_OFFSET:35077,MAX_VARYING_COMPONENTS:35659,TEXTURE_2D_ARRAY:35866,TEXTURE_BINDING_2D_ARRAY:35869,R11F_G11F_B10F:35898,UNSIGNED_INT_10F_11F_11F_REV:35899,RGB9_E5:35901,UNSIGNED_INT_5_9_9_9_REV:35902,TRANSFORM_FEEDBACK_BUFFER_MODE:35967,MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:35968,TRANSFORM_FEEDBACK_VARYINGS:35971,TRANSFORM_FEEDBACK_BUFFER_START:35972,TRANSFORM_FEEDBACK_BUFFER_SIZE:35973,TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:35976,RASTERIZER_DISCARD:35977,MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:35978,MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:35979,INTERLEAVED_ATTRIBS:35980,SEPARATE_ATTRIBS:35981,TRANSFORM_FEEDBACK_BUFFER:35982,TRANSFORM_FEEDBACK_BUFFER_BINDING:35983,RGBA32UI:36208,RGB32UI:36209,RGBA16UI:36214,RGB16UI:36215,RGBA8UI:36220,RGB8UI:36221,RGBA32I:36226,RGB32I:36227,RGBA16I:36232,RGB16I:36233,RGBA8I:36238,RGB8I:36239,RED_INTEGER:36244,RGB_INTEGER:36248,RGBA_INTEGER:36249,SAMPLER_2D_ARRAY:36289,SAMPLER_2D_ARRAY_SHADOW:36292,SAMPLER_CUBE_SHADOW:36293,UNSIGNED_INT_VEC2:36294,UNSIGNED_INT_VEC3:36295,UNSIGNED_INT_VEC4:36296,INT_SAMPLER_2D:36298,INT_SAMPLER_3D:36299,INT_SAMPLER_CUBE:36300,INT_SAMPLER_2D_ARRAY:36303,UNSIGNED_INT_SAMPLER_2D:36306,UNSIGNED_INT_SAMPLER_3D:36307,UNSIGNED_INT_SAMPLER_CUBE:36308,UNSIGNED_INT_SAMPLER_2D_ARRAY:36311,DEPTH_COMPONENT32F:36012,DEPTH32F_STENCIL8:36013,FLOAT_32_UNSIGNED_INT_24_8_REV:36269,FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:33296,FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:33297,FRAMEBUFFER_ATTACHMENT_RED_SIZE:33298,FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:33299,FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:33300,FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:33301,FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:33302,FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:33303,FRAMEBUFFER_DEFAULT:33304,UNSIGNED_INT_24_8:34042,DEPTH24_STENCIL8:35056,UNSIGNED_NORMALIZED:35863,DRAW_FRAMEBUFFER_BINDING:36006,READ_FRAMEBUFFER:36008,DRAW_FRAMEBUFFER:36009,READ_FRAMEBUFFER_BINDING:36010,RENDERBUFFER_SAMPLES:36011,FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:36052,MAX_COLOR_ATTACHMENTS:36063,COLOR_ATTACHMENT1:36065,COLOR_ATTACHMENT2:36066,COLOR_ATTACHMENT3:36067,COLOR_ATTACHMENT4:36068,COLOR_ATTACHMENT5:36069,COLOR_ATTACHMENT6:36070,COLOR_ATTACHMENT7:36071,COLOR_ATTACHMENT8:36072,COLOR_ATTACHMENT9:36073,COLOR_ATTACHMENT10:36074,COLOR_ATTACHMENT11:36075,COLOR_ATTACHMENT12:36076,COLOR_ATTACHMENT13:36077,COLOR_ATTACHMENT14:36078,COLOR_ATTACHMENT15:36079,FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:36182,MAX_SAMPLES:36183,HALF_FLOAT:5131,RG:33319,RG_INTEGER:33320,R8:33321,RG8:33323,R16F:33325,R32F:33326,RG16F:33327,RG32F:33328,R8I:33329,R8UI:33330,R16I:33331,R16UI:33332,R32I:33333,R32UI:33334,RG8I:33335,RG8UI:33336,RG16I:33337,RG16UI:33338,RG32I:33339,RG32UI:33340,VERTEX_ARRAY_BINDING:34229,R8_SNORM:36756,RG8_SNORM:36757,RGB8_SNORM:36758,RGBA8_SNORM:36759,SIGNED_NORMALIZED:36764,COPY_READ_BUFFER:36662,COPY_WRITE_BUFFER:36663,COPY_READ_BUFFER_BINDING:36662,COPY_WRITE_BUFFER_BINDING:36663,UNIFORM_BUFFER:35345,UNIFORM_BUFFER_BINDING:35368,UNIFORM_BUFFER_START:35369,UNIFORM_BUFFER_SIZE:35370,MAX_VERTEX_UNIFORM_BLOCKS:35371,MAX_FRAGMENT_UNIFORM_BLOCKS:35373,MAX_COMBINED_UNIFORM_BLOCKS:35374,MAX_UNIFORM_BUFFER_BINDINGS:35375,MAX_UNIFORM_BLOCK_SIZE:35376,MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:35377,MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:35379,UNIFORM_BUFFER_OFFSET_ALIGNMENT:35380,ACTIVE_UNIFORM_BLOCKS:35382,UNIFORM_TYPE:35383,UNIFORM_SIZE:35384,UNIFORM_BLOCK_INDEX:35386,UNIFORM_OFFSET:35387,UNIFORM_ARRAY_STRIDE:35388,UNIFORM_MATRIX_STRIDE:35389,UNIFORM_IS_ROW_MAJOR:35390,UNIFORM_BLOCK_BINDING:35391,UNIFORM_BLOCK_DATA_SIZE:35392,UNIFORM_BLOCK_ACTIVE_UNIFORMS:35394,UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:35395,UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:35396,UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:35398,INVALID_INDEX:4294967295,MAX_VERTEX_OUTPUT_COMPONENTS:37154,MAX_FRAGMENT_INPUT_COMPONENTS:37157,MAX_SERVER_WAIT_TIMEOUT:37137,OBJECT_TYPE:37138,SYNC_CONDITION:37139,SYNC_STATUS:37140,SYNC_FLAGS:37141,SYNC_FENCE:37142,SYNC_GPU_COMMANDS_COMPLETE:37143,UNSIGNALED:37144,SIGNALED:37145,ALREADY_SIGNALED:37146,TIMEOUT_EXPIRED:37147,CONDITION_SATISFIED:37148,WAIT_FAILED:37149,SYNC_FLUSH_COMMANDS_BIT:1,VERTEX_ATTRIB_ARRAY_DIVISOR:35070,ANY_SAMPLES_PASSED:35887,ANY_SAMPLES_PASSED_CONSERVATIVE:36202,SAMPLER_BINDING:35097,RGB10_A2UI:36975,INT_2_10_10_10_REV:36255,TRANSFORM_FEEDBACK:36386,TRANSFORM_FEEDBACK_PAUSED:36387,TRANSFORM_FEEDBACK_ACTIVE:36388,TRANSFORM_FEEDBACK_BINDING:36389,COMPRESSED_R11_EAC:37488,COMPRESSED_SIGNED_R11_EAC:37489,COMPRESSED_RG11_EAC:37490,COMPRESSED_SIGNED_RG11_EAC:37491,COMPRESSED_RGB8_ETC2:37492,COMPRESSED_SRGB8_ETC2:37493,COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:37494,COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:37495,COMPRESSED_RGBA8_ETC2_EAC:37496,COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:37497,TEXTURE_IMMUTABLE_FORMAT:37167,MAX_ELEMENT_INDEX:36203,TEXTURE_IMMUTABLE_LEVELS:33503,MAX_TEXTURE_MAX_ANISOTROPY_EXT:34047});E.WebGLConstants=_}); diff --git a/web/assets/Cesium/Workers/WebMercatorProjection-df58d479.js b/web/assets/Cesium/Workers/WebMercatorProjection-df58d479.js new file mode 100644 index 00000000..c0a44dcb --- /dev/null +++ b/web/assets/Cesium/Workers/WebMercatorProjection-df58d479.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162"],function(e,n,t,i,u){"use strict";function d(e){this._ellipsoid=n.defaultValue(e,u.Ellipsoid.WGS84),this._semimajorAxis=this._ellipsoid.maximumRadius,this._oneOverSemimajorAxis=1/this._semimajorAxis}Object.defineProperties(d.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}}),d.mercatorAngleToGeodeticLatitude=function(e){return i.CesiumMath.PI_OVER_TWO-2*Math.atan(Math.exp(-e))},d.geodeticLatitudeToMercatorAngle=function(e){d.MaximumLatitude<e?e=d.MaximumLatitude:e<-d.MaximumLatitude&&(e=-d.MaximumLatitude);var t=Math.sin(e);return.5*Math.log((1+t)/(1-t))},d.MaximumLatitude=d.mercatorAngleToGeodeticLatitude(Math.PI),d.prototype.project=function(e,t){var i=this._semimajorAxis,o=e.longitude*i,a=d.geodeticLatitudeToMercatorAngle(e.latitude)*i,r=e.height;return n.defined(t)?(t.x=o,t.y=a,t.z=r,t):new u.Cartesian3(o,a,r)},d.prototype.unproject=function(e,t){var i=this._oneOverSemimajorAxis,o=e.x*i,a=d.mercatorAngleToGeodeticLatitude(e.y*i),r=e.z;return n.defined(t)?(t.longitude=o,t.latitude=a,t.height=r,t):new u.Cartographic(o,a,r)},e.WebMercatorProjection=d}); diff --git a/web/assets/Cesium/Workers/arrayRemoveDuplicates-ebc732b0.js b/web/assets/Cesium/Workers/arrayRemoveDuplicates-ebc732b0.js new file mode 100644 index 00000000..adf86d93 --- /dev/null +++ b/web/assets/Cesium/Workers/arrayRemoveDuplicates-ebc732b0.js @@ -0,0 +1 @@ +define(["exports","./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5"],function(e,a,t,r){"use strict";var h=r.CesiumMath.EPSILON10;e.arrayRemoveDuplicates=function(e,t,r){if(a.defined(e)){r=a.defaultValue(r,!1);var c,n,f,i=e.length;if(i<2)return e;for(c=1;c<i&&!t(n=e[c-1],f=e[c],h);++c);if(c===i)return r&&t(e[0],e[e.length-1],h)?e.slice(1):e;for(var u=e.slice(0,c);c<i;++c)t(n,f=e[c],h)||(u.push(f),n=f);return r&&1<u.length&&t(u[0],u[u.length-1],h)&&u.shift(),u}}}); diff --git a/web/assets/Cesium/Workers/cesiumWorkerBootstrapper.js b/web/assets/Cesium/Workers/cesiumWorkerBootstrapper.js new file mode 100644 index 00000000..8e411d04 --- /dev/null +++ b/web/assets/Cesium/Workers/cesiumWorkerBootstrapper.js @@ -0,0 +1 @@ +function setTimeout(e){e()}var requirejs,require,define;"undefined"==typeof self&&(self={}),self.onmessage=function(e){var t=e.data;require(t.loaderConfig,[t.workerModule],function(e){self.onmessage=e,CESIUM_BASE_URL=t.loaderConfig.baseUrl})},function(global){var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.1.20",commentRegExp=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,ap=Array.prototype,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e)for(var i=0;i<e.length&&(!e[i]||!t(e[i],i,e));i+=1);}function eachReverse(e,t){if(e)for(var i=e.length-1;-1<i&&(!e[i]||!t(e[i],i,e));--i);}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(i,e,r,n){return e&&eachProp(e,function(e,t){!r&&hasProp(i,t)||(!n||"object"!=typeof e||!e||isArray(e)||isFunction(e)||e instanceof RegExp?i[t]=e:(i[t]||(i[t]={}),mixin(i[t],e,r,n)))}),i}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}if(void 0===define){if(void 0!==requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}void 0===require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),n=(n=getOwn(contexts,a))||(contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick=void 0!==setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require=require||req,req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(t){req[t]=function(){var e=contexts[defContextName];return e.require[t].apply(e,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(t,i,r){var e,n=t&&t.config||{};if(isBrowser)return e=req.createNode(n,i,r),n.onNodeCreated&&n.onNodeCreated(e,n,i,r),e.setAttribute("data-requirecontext",t.contextName),e.setAttribute("data-requiremodule",i),!e.attachEvent||e.attachEvent.toString&&e.attachEvent.toString().indexOf("[native code")<0||isOpera?(e.addEventListener("load",t.onScriptLoad,!1),e.addEventListener("error",t.onScriptError,!1)):(useInteractive=!0,e.attachEvent("onreadystatechange",t.onScriptLoad)),e.src=r,currentlyAddingScript=e,baseElement?head.insertBefore(e,baseElement):head.appendChild(e),currentlyAddingScript=null,e;if(isWebWorker)try{importScripts(r),t.completeLoad(i)}catch(e){t.onError(makeError("importscripts","importScripts failed for "+i+" at "+r,e,[i]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head=head||e.parentNode,dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||(mainScript=(src=mainScript.split("/")).pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,i,t){var r,n;"string"!=typeof e&&(t=i,i=e,e=null),isArray(i)||(t=i,i=null),!i&&isFunction(t)&&(i=[],t.length&&(t.toString().replace(commentRegExp,"").replace(cjsRequireRegExp,function(e,t){i.push(t)}),i=(1===t.length?["require"]:["require","exports","module"]).concat(i))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript())&&(e=e||r.getAttribute("data-requiremodule"),n=contexts[r.getAttribute("data-requirecontext")]),n?(n.defQueue.push([e,i,t]),n.defQueueMap[e]=!0):globalDefQueue.push([e,i,t])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}function newContext(u){var i,e,l,c,d,g={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},p={},f={},r={},h=[],m={},n={},v={},x=1,b=1;function q(e,t,i){var r,n,o,a,s,u,c,d,p,f,l=t&&t.split("/"),h=g.map,m=h&&h["*"];if(e&&(u=(e=e.split("/")).length-1,g.nodeIdCompat&&jsSuffixRegExp.test(e[u])&&(e[u]=e[u].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&l&&(e=l.slice(0,l.length-1).concat(e)),function(e){for(var t,i=0;i<e.length;i++)if("."===(t=e[i]))e.splice(i,1),--i;else if(".."===t){if(0===i||1===i&&".."===e[2]||".."===e[i-1])continue;0<i&&(e.splice(i-1,2),i-=2)}}(e),e=e.join("/")),i&&h&&(l||m)){e:for(o=(n=e.split("/")).length;0<o;--o){if(s=n.slice(0,o).join("/"),l)for(a=l.length;0<a;--a)if(r=(r=getOwn(h,l.slice(0,a).join("/")))&&getOwn(r,s)){c=r,d=o;break e}!p&&m&&getOwn(m,s)&&(p=getOwn(m,s),f=o)}!c&&p&&(c=p,d=f),c&&(n.splice(0,d,c),e=n.join("/"))}return getOwn(g.pkgs,e)||e}function E(t){isBrowser&&each(scripts(),function(e){if(e.getAttribute("data-requiremodule")===t&&e.getAttribute("data-requirecontext")===l.contextName)return e.parentNode.removeChild(e),!0})}function w(e){var t=getOwn(g.paths,e);return t&&isArray(t)&&1<t.length&&(t.shift(),l.require.undef(e),l.makeRequire(null,{skipMap:!0})([e]),1)}function y(e){var t,i=e?e.indexOf("!"):-1;return-1<i&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function S(e,t,i,r){var n,o,a,s,u=null,c=t?t.name:null,d=e,p=!0,f="";return e||(p=!1,e="_@r"+(x+=1)),u=(s=y(e))[0],e=s[1],u&&(u=q(u,c,r),o=getOwn(m,u)),e&&(u?f=o&&o.normalize?o.normalize(e,function(e){return q(e,c,r)}):-1===e.indexOf("!")?q(e,c,r):e:(u=(s=y(f=q(e,c,r)))[0],f=s[1],i=!0,n=l.nameToUrl(f))),{prefix:u,name:f,parentMap:t,unnormalized:!!(a=!u||o||i?"":"_unnormalized"+(b+=1)),url:n,originalName:d,isDefine:p,id:(u?u+"!"+f:f)+a}}function k(e){var t=e.id;return getOwn(p,t)||(p[t]=new l.Module(e))}function M(e,t,i){var r=e.id,n=getOwn(p,r);!hasProp(m,r)||n&&!n.defineEmitComplete?(n=k(e)).error&&"error"===t?i(n.error):n.on(t,i):"defined"===t&&i(m[r])}function O(i,e){var t=i.requireModules,r=!1;e?e(i):(each(t,function(e){var t=getOwn(p,e);t&&(t.error=i,t.events.error&&(r=!0,t.emit("error",i)))}),r||req.onError(i))}function j(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(l.defQueueMap[t]=!0),h.push(e)}),globalDefQueue=[])}function P(e){delete p[e],delete f[e]}function R(){var e,r,t=1e3*g.waitSeconds,n=t&&l.startTime+t<(new Date).getTime(),o=[],a=[],s=!1,u=!0;if(!i){if(i=!0,eachProp(f,function(e){var t=e.map,i=t.id;if(e.enabled&&(t.isDefine||a.push(e),!e.error))if(!e.inited&&n)w(i)?s=r=!0:(o.push(i),E(i));else if(!e.inited&&e.fetched&&t.isDefine&&(s=!0,!t.prefix))return u=!1}),n&&o.length)return(e=makeError("timeout","Load timeout for modules: "+o,null,o)).contextName=l.contextName,O(e),0;u&&each(a,function(e){!function n(o,a,s){var e=o.map.id;o.error?o.emit("error",o.error):(a[e]=!0,each(o.depMaps,function(e,t){var i=e.id,r=getOwn(p,i);!r||o.depMatched[t]||s[i]||(getOwn(a,i)?(o.defineDep(t,m[i]),o.check()):n(r,a,s))}),s[e]=!0)}(e,{},{})}),n&&!r||!s||!isBrowser&&!isWebWorker||d||(d=setTimeout(function(){d=0,R()},50)),i=!1}}function a(e){hasProp(m,e[0])||k(S(e[0],null,!0)).init(e[1],e[2])}function o(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function s(e){var t=e.currentTarget||e.srcElement;return o(t,l.onScriptLoad,"load","onreadystatechange"),o(t,l.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function A(){var e;for(j();h.length;){if(null===(e=h.shift())[0])return O(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1])),0;a(e)}l.defQueueMap={}}return c={require:function(e){return e.require?e.require:e.require=l.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?m[e.map.id]=e.exports:e.exports=m[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(g.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},(e=function(e){this.events=getOwn(r,e.id)||{},this.map=e,this.shim=getOwn(g.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0}).prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,--this.depCount,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,l.startTime=(new Date).getTime();var e=this.map;if(!this.shim)return e.prefix?this.callPlugin():this.load();l.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()}))}},load:function(){var e=this.map.url;n[e]||(n[e]=!0,l.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var t,e,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=l.execCb(i,o,r,n)}catch(e){t=e}else n=l.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&((e=this.module)?n=e.exports:this.usingExports&&(n=this.exports)),t)return t.requireMap=this.map,t.requireModules=this.map.isDefine?[this.map.id]:null,t.requireType=this.map.isDefine?"define":"require",O(this.error=t)}else n=o;this.exports=n,this.map.isDefine&&!this.ignore&&(m[i]=n,req.onResourceLoad&&req.onResourceLoad(l,this.map,this.depMaps)),P(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(l.defQueueMap,i)||this.fetch()}},callPlugin:function(){var u=this.map,c=u.id,e=S(u.prefix);this.depMaps.push(e),M(e,"defined",bind(this,function(e){var o,t,i,r=getOwn(v,this.map.id),n=this.map.name,a=this.map.parentMap?this.map.parentMap.name:null,s=l.makeRequire(u.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(e.normalize&&(n=e.normalize(n,function(e){return q(e,a,!0)})||""),M(t=S(u.prefix+"!"+n,this.map.parentMap),"defined",bind(this,function(e){this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),void((i=getOwn(p,t.id))&&(this.depMaps.push(t),this.events.error&&i.on("error",bind(this,function(e){this.emit("error",e)})),i.enable()))):r?(this.map.url=l.nameToUrl(r),void this.load()):((o=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})})).error=bind(this,function(e){this.inited=!0,(this.error=e).requireModules=[c],eachProp(p,function(e){0===e.map.id.indexOf(c+"_unnormalized")&&P(e.map.id)}),O(e)}),o.fromText=bind(this,function(e,t){var i=u.name,r=S(i),n=useInteractive;t&&(e=t),n&&(useInteractive=!1),k(r),hasProp(g.config,c)&&(g.config[i]=g.config[c]);try{req.exec(e)}catch(e){return O(makeError("fromtexteval","fromText eval for "+c+" failed: "+e,e,[c]))}n&&(useInteractive=!0),this.depMaps.push(r),l.completeLoad(i),s([i],o)}),void e.load(u.name,s,o,g))})),l.enable(e,this),this.pluginMaps[e.id]=e},enable:function(){(f[this.map.id]=this).enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=S(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(c,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,M(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?M(e,"error",bind(this,this.errback)):this.events.error&&M(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=p[i],hasProp(c,i)||!r||r.enabled||l.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(p,e.id);t&&!t.enabled&&l.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){(this.events[e]||(this.events[e]=[])).push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},(l={config:g,contextName:u,registry:p,defined:m,urlFetched:n,defQueue:h,defQueueMap:{},Module:e,makeModuleMap:S,nextTick:req.nextTick,onError:O,configure:function(e){e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/");var i=g.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]?(g[t]||(g[t]={}),mixin(g[t],e,!0,!0)):g[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(v[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=l.makeShimExports(e)),i[t]=e}),g.shim=i),e.packages&&each(e.packages,function(e){var t=(e="string"==typeof e?{name:e}:e).name;e.location&&(g.paths[t]=e.location),g.pkgs[t]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(p,function(e,t){e.inited||e.map.unnormalized||(e.map=S(t,null,!0))}),(e.deps||e.callback)&&l.require(e.deps||[],e.callback)},makeShimExports:function(t){return function(){var e;return t.init&&(e=t.init.apply(global,arguments)),e||t.exports&&getGlobal(t.exports)}},makeRequire:function(o,a){function s(e,t,i){var r,n;return a.enableBuildCallback&&t&&isFunction(t)&&(t.__requireJsBuild=!0),"string"==typeof e?isFunction(t)?O(makeError("requireargs","Invalid require call"),i):o&&hasProp(c,e)?c[e](p[o.id]):req.get?req.get(l,e,o,s):(r=S(e,o,!1,!0).id,hasProp(m,r)?m[r]:O(makeError("notloaded",'Module name "'+r+'" has not been loaded yet for context: '+u+(o?"":". Use require([])")))):(A(),l.nextTick(function(){A(),(n=k(S(null,o))).skipMap=a.skipMap,n.init(e,t,i,{enabled:!0}),R()}),s)}return a=a||{},mixin(s,{isBrowser:isBrowser,toUrl:function(e){var t,i=e.lastIndexOf("."),r=e.split("/")[0];return-1!==i&&(!("."===r||".."===r)||1<i)&&(t=e.substring(i,e.length),e=e.substring(0,i)),l.nameToUrl(q(e,o&&o.id,!0),t,!0)},defined:function(e){return hasProp(m,S(e,o,!1,!0).id)},specified:function(e){return e=S(e,o,!1,!0).id,hasProp(m,e)||hasProp(p,e)}}),o||(s.undef=function(i){j();var e=S(i,o,!0),t=getOwn(p,i);t.undefed=!0,E(i),delete m[i],delete n[e.url],delete r[i],eachReverse(h,function(e,t){e[0]===i&&h.splice(t,1)}),delete l.defQueueMap[i],t&&(t.events.defined&&(r[i]=t.events),P(i))}),s},enable:function(e){getOwn(p,e.id)&&k(e).enable()},completeLoad:function(e){var t,i,r,n=getOwn(g.shim,e)||{},o=n.exports;for(j();h.length;){if(null===(i=h.shift())[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);a(i)}if(l.defQueueMap={},r=getOwn(p,e),!t&&!hasProp(m,e)&&r&&!r.inited){if(!(!g.enforceDefine||o&&getGlobal(o)))return w(e)?void 0:O(makeError("nodefine","No define call for "+e,null,[e]));a([e,n.deps||[],n.exportsFn])}R()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c=getOwn(g.pkgs,e);if(c&&(e=c),u=getOwn(v,e))return l.nameToUrl(u,t,i);if(req.jsExtRegExp.test(e))a=e+(t||"");else{for(r=g.paths,o=(n=e.split("/")).length;0<o;--o)if(s=getOwn(r,n.slice(0,o).join("/"))){isArray(s)&&(s=s[0]),n.splice(0,o,s);break}a=n.join("/"),a=("/"===(a+=t||(/^data\:|\?/.test(a)||i?"":".js")).charAt(0)||a.match(/^[\w\+\.\-]+:/)?"":g.baseUrl)+a}return g.urlArgs?a+((-1===a.indexOf("?")?"?":"&")+g.urlArgs):a},load:function(e,t){req.load(l,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){var t;"load"!==e.type&&!readyRegExp.test((e.currentTarget||e.srcElement).readyState)||(interactiveScript=null,t=s(e),l.completeLoad(t.id))},onScriptError:function(e){var t=s(e);if(!w(t.id))return O(makeError("scripterror","Script error for: "+t.id,e,[t.id]))}}).require=l.makeRequire(),l}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState||eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript}}(this); \ No newline at end of file diff --git a/web/assets/Cesium/Workers/combineGeometry.js b/web/assets/Cesium/Workers/combineGeometry.js new file mode 100644 index 00000000..39a986f3 --- /dev/null +++ b/web/assets/Cesium/Workers/combineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./PrimitivePipeline-bde6ab6f","./WebMercatorProjection-df58d479","./createTaskProcessorWorker"],function(e,t,i,r,n,c,o,a,s,f,m,b,P,d,p,u,y,C,l){"use strict";return l(function(e,t){var i=y.PrimitivePipeline.unpackCombineGeometryParameters(e),r=y.PrimitivePipeline.combineGeometry(i);return y.PrimitivePipeline.packCombineGeometryResults(r,t)})}); diff --git a/web/assets/Cesium/Workers/createBoxGeometry.js b/web/assets/Cesium/Workers/createBoxGeometry.js new file mode 100644 index 00000000..0f87810f --- /dev/null +++ b/web/assets/Cesium/Workers/createBoxGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./BoxGeometry-ee1413aa"],function(r,e,t,c,o,n,f,a,m,i,u,b,d){"use strict";return function(e,t){return r.defined(t)&&(e=d.BoxGeometry.unpack(e,t)),d.BoxGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createBoxOutlineGeometry.js b/web/assets/Cesium/Workers/createBoxOutlineGeometry.js new file mode 100644 index 00000000..a17041f0 --- /dev/null +++ b/web/assets/Cesium/Workers/createBoxOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./GeometryOffsetAttribute-7350d9af"],function(c,e,t,d,p,a,n,y,C,l,b){"use strict";var A=new d.Cartesian3;function u(e){var t=(e=c.defaultValue(e,c.defaultValue.EMPTY_OBJECT)).minimum,a=e.maximum;this._min=d.Cartesian3.clone(t),this._max=d.Cartesian3.clone(a),this._offsetAttribute=e.offsetAttribute,this._workerName="createBoxOutlineGeometry"}u.fromDimensions=function(e){var t=(e=c.defaultValue(e,c.defaultValue.EMPTY_OBJECT)).dimensions,a=d.Cartesian3.multiplyByScalar(t,.5,new d.Cartesian3);return new u({minimum:d.Cartesian3.negate(a,new d.Cartesian3),maximum:a,offsetAttribute:e.offsetAttribute})},u.fromAxisAlignedBoundingBox=function(e){return new u({minimum:e.minimum,maximum:e.maximum})},u.packedLength=2*d.Cartesian3.packedLength+1,u.pack=function(e,t,a){return a=c.defaultValue(a,0),d.Cartesian3.pack(e._min,t,a),d.Cartesian3.pack(e._max,t,a+d.Cartesian3.packedLength),t[a+2*d.Cartesian3.packedLength]=c.defaultValue(e._offsetAttribute,-1),t};var m=new d.Cartesian3,o=new d.Cartesian3,s={minimum:m,maximum:o,offsetAttribute:void 0};return u.unpack=function(e,t,a){t=c.defaultValue(t,0);var n=d.Cartesian3.unpack(e,t,m),i=d.Cartesian3.unpack(e,t+d.Cartesian3.packedLength,o),r=e[t+2*d.Cartesian3.packedLength];return c.defined(a)?(a._min=d.Cartesian3.clone(n,a._min),a._max=d.Cartesian3.clone(i,a._max),a._offsetAttribute=-1===r?void 0:r,a):(s.offsetAttribute=-1===r?void 0:r,new u(s))},u.createGeometry=function(e){var t=e._min,a=e._max;if(!d.Cartesian3.equals(t,a)){var n=new l.GeometryAttributes,i=new Uint16Array(24),r=new Float64Array(24);r[0]=t.x,r[1]=t.y,r[2]=t.z,r[3]=a.x,r[4]=t.y,r[5]=t.z,r[6]=a.x,r[7]=a.y,r[8]=t.z,r[9]=t.x,r[10]=a.y,r[11]=t.z,r[12]=t.x,r[13]=t.y,r[14]=a.z,r[15]=a.x,r[16]=t.y,r[17]=a.z,r[18]=a.x,r[19]=a.y,r[20]=a.z,r[21]=t.x,r[22]=a.y,r[23]=a.z,n.position=new C.GeometryAttribute({componentDatatype:y.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:r}),i[0]=4,i[1]=5,i[2]=5,i[3]=6,i[4]=6,i[5]=7,i[6]=7,i[7]=4,i[8]=0,i[9]=1,i[10]=1,i[11]=2,i[12]=2,i[13]=3,i[14]=3,i[15]=0,i[16]=0,i[17]=4,i[18]=1,i[19]=5,i[20]=2,i[21]=6,i[22]=3,i[23]=7;var u,m,o,s=d.Cartesian3.subtract(a,t,A),f=.5*d.Cartesian3.magnitude(s);return c.defined(e._offsetAttribute)&&(u=r.length,m=new Uint8Array(u/3),o=e._offsetAttribute===b.GeometryOffsetAttribute.NONE?0:1,b.arrayFill(m,o),n.applyOffset=new C.GeometryAttribute({componentDatatype:y.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:m})),new C.Geometry({attributes:n,indices:i,primitiveType:C.PrimitiveType.LINES,boundingSphere:new p.BoundingSphere(d.Cartesian3.ZERO,f),offsetAttribute:e._offsetAttribute})}},function(e,t){return c.defined(t)&&(e=u.unpack(e,t)),u.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCircleGeometry.js b/web/assets/Cesium/Workers/createCircleGeometry.js new file mode 100644 index 00000000..9e53633d --- /dev/null +++ b/web/assets/Cesium/Workers/createCircleGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./EllipseGeometryLibrary-c9c767e4","./GeometryInstance-11f9a3bd","./EllipseGeometry-b2472656"],function(o,e,t,n,i,r,s,l,a,m,d,c,u,p,y,_,h,G,f,x,g){"use strict";function v(e){var t=(e=o.defaultValue(e,o.defaultValue.EMPTY_OBJECT)).radius,i={center:e.center,semiMajorAxis:t,semiMinorAxis:t,ellipsoid:e.ellipsoid,height:e.height,extrudedHeight:e.extrudedHeight,granularity:e.granularity,vertexFormat:e.vertexFormat,stRotation:e.stRotation,shadowVolume:e.shadowVolume};this._ellipseGeometry=new g.EllipseGeometry(i),this._workerName="createCircleGeometry"}v.packedLength=g.EllipseGeometry.packedLength,v.pack=function(e,t,i){return g.EllipseGeometry.pack(e._ellipseGeometry,t,i)};var E=new g.EllipseGeometry({center:new n.Cartesian3,semiMajorAxis:1,semiMinorAxis:1}),w={center:new n.Cartesian3,radius:void 0,ellipsoid:n.Ellipsoid.clone(n.Ellipsoid.UNIT_SPHERE),height:void 0,extrudedHeight:void 0,granularity:void 0,vertexFormat:new G.VertexFormat,stRotation:void 0,semiMajorAxis:void 0,semiMinorAxis:void 0,shadowVolume:void 0};return v.unpack=function(e,t,i){var r=g.EllipseGeometry.unpack(e,t,E);return w.center=n.Cartesian3.clone(r._center,w.center),w.ellipsoid=n.Ellipsoid.clone(r._ellipsoid,w.ellipsoid),w.height=r._height,w.extrudedHeight=r._extrudedHeight,w.granularity=r._granularity,w.vertexFormat=G.VertexFormat.clone(r._vertexFormat,w.vertexFormat),w.stRotation=r._stRotation,w.shadowVolume=r._shadowVolume,o.defined(i)?(w.semiMajorAxis=r._semiMajorAxis,w.semiMinorAxis=r._semiMinorAxis,i._ellipseGeometry=new g.EllipseGeometry(w),i):(w.radius=r._semiMajorAxis,new v(w))},v.createGeometry=function(e){return g.EllipseGeometry.createGeometry(e._ellipseGeometry)},v.createShadowVolume=function(e,t,i){var r=e._ellipseGeometry._granularity,o=e._ellipseGeometry._ellipsoid,n=t(r,o),s=i(r,o);return new v({center:e._ellipseGeometry._center,radius:e._ellipseGeometry._semiMajorAxis,ellipsoid:o,stRotation:e._ellipseGeometry._stRotation,granularity:r,extrudedHeight:n,height:s,vertexFormat:G.VertexFormat.POSITION_ONLY,shadowVolume:!0})},Object.defineProperties(v.prototype,{rectangle:{get:function(){return this._ellipseGeometry.rectangle}},textureCoordinateRotationPoints:{get:function(){return this._ellipseGeometry.textureCoordinateRotationPoints}}}),function(e,t){return o.defined(t)&&(e=v.unpack(e,t)),e._ellipseGeometry._center=n.Cartesian3.clone(e._ellipseGeometry._center),e._ellipseGeometry._ellipsoid=n.Ellipsoid.clone(e._ellipseGeometry._ellipsoid),v.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCircleOutlineGeometry.js b/web/assets/Cesium/Workers/createCircleOutlineGeometry.js new file mode 100644 index 00000000..38a259f8 --- /dev/null +++ b/web/assets/Cesium/Workers/createCircleOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./EllipseGeometryLibrary-c9c767e4","./EllipseOutlineGeometry-2cffcd24"],function(l,e,i,n,t,r,s,o,a,c,u,d,m,p){"use strict";function y(e){var i=(e=l.defaultValue(e,l.defaultValue.EMPTY_OBJECT)).radius,t={center:e.center,semiMajorAxis:i,semiMinorAxis:i,ellipsoid:e.ellipsoid,height:e.height,extrudedHeight:e.extrudedHeight,granularity:e.granularity,numberOfVerticalLines:e.numberOfVerticalLines};this._ellipseGeometry=new p.EllipseOutlineGeometry(t),this._workerName="createCircleOutlineGeometry"}y.packedLength=p.EllipseOutlineGeometry.packedLength,y.pack=function(e,i,t){return p.EllipseOutlineGeometry.pack(e._ellipseGeometry,i,t)};var f=new p.EllipseOutlineGeometry({center:new n.Cartesian3,semiMajorAxis:1,semiMinorAxis:1}),G={center:new n.Cartesian3,radius:void 0,ellipsoid:n.Ellipsoid.clone(n.Ellipsoid.UNIT_SPHERE),height:void 0,extrudedHeight:void 0,granularity:void 0,numberOfVerticalLines:void 0,semiMajorAxis:void 0,semiMinorAxis:void 0};return y.unpack=function(e,i,t){var r=p.EllipseOutlineGeometry.unpack(e,i,f);return G.center=n.Cartesian3.clone(r._center,G.center),G.ellipsoid=n.Ellipsoid.clone(r._ellipsoid,G.ellipsoid),G.height=r._height,G.extrudedHeight=r._extrudedHeight,G.granularity=r._granularity,G.numberOfVerticalLines=r._numberOfVerticalLines,l.defined(t)?(G.semiMajorAxis=r._semiMajorAxis,G.semiMinorAxis=r._semiMinorAxis,t._ellipseGeometry=new p.EllipseOutlineGeometry(G),t):(G.radius=r._semiMajorAxis,new y(G))},y.createGeometry=function(e){return p.EllipseOutlineGeometry.createGeometry(e._ellipseGeometry)},function(e,i){return l.defined(i)&&(e=y.unpack(e,i)),e._ellipseGeometry._center=n.Cartesian3.clone(e._ellipseGeometry._center),e._ellipseGeometry._ellipsoid=n.Ellipsoid.clone(e._ellipseGeometry._ellipsoid),y.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCoplanarPolygonGeometry.js b/web/assets/Cesium/Workers/createCoplanarPolygonGeometry.js new file mode 100644 index 00000000..fddbd6d6 --- /dev/null +++ b/web/assets/Cesium/Workers/createCoplanarPolygonGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./VertexFormat-7572c785","./GeometryInstance-11f9a3bd","./arrayRemoveDuplicates-ebc732b0","./BoundingRectangle-8de79d83","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./CoplanarPolygonGeometryLibrary-dc8e954f","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolygonGeometryLibrary-29b9a52e"],function(s,e,V,R,I,t,n,M,H,B,a,w,r,O,o,i,c,A,F,l,p,y,G,m,u,z,L){"use strict";var S=new R.Cartesian3,E=new l.BoundingRectangle,N=new R.Cartesian2,Q=new R.Cartesian2,T=new R.Cartesian3,D=new R.Cartesian3,_=new R.Cartesian3,k=new R.Cartesian3,j=new R.Cartesian3,U=new R.Cartesian3,Y=new I.Quaternion,q=new I.Matrix3,J=new I.Matrix3,W=new R.Cartesian3;function d(e){var t=(e=s.defaultValue(e,s.defaultValue.EMPTY_OBJECT)).polygonHierarchy,n=s.defaultValue(e.vertexFormat,c.VertexFormat.DEFAULT);this._vertexFormat=c.VertexFormat.clone(n),this._polygonHierarchy=t,this._stRotation=s.defaultValue(e.stRotation,0),this._ellipsoid=R.Ellipsoid.clone(s.defaultValue(e.ellipsoid,R.Ellipsoid.WGS84)),this._workerName="createCoplanarPolygonGeometry",this.packedLength=L.PolygonGeometryLibrary.computeHierarchyPackedLength(t)+c.VertexFormat.packedLength+R.Ellipsoid.packedLength+2}d.fromPositions=function(e){return new d({polygonHierarchy:{positions:(e=s.defaultValue(e,s.defaultValue.EMPTY_OBJECT)).positions},vertexFormat:e.vertexFormat,stRotation:e.stRotation,ellipsoid:e.ellipsoid})},d.pack=function(e,t,n){return n=s.defaultValue(n,0),n=L.PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,n),R.Ellipsoid.pack(e._ellipsoid,t,n),n+=R.Ellipsoid.packedLength,c.VertexFormat.pack(e._vertexFormat,t,n),n+=c.VertexFormat.packedLength,t[n++]=e._stRotation,t[n]=e.packedLength,t};var g=R.Ellipsoid.clone(R.Ellipsoid.UNIT_SPHERE),b=new c.VertexFormat,h={polygonHierarchy:{}};return d.unpack=function(e,t,n){t=s.defaultValue(t,0);var a=L.PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=a.startingIndex,delete a.startingIndex;var r=R.Ellipsoid.unpack(e,t,g);t+=R.Ellipsoid.packedLength;var o=c.VertexFormat.unpack(e,t,b);t+=c.VertexFormat.packedLength;var i=e[t++],l=e[t];return s.defined(n)||(n=new d(h)),n._polygonHierarchy=a,n._ellipsoid=R.Ellipsoid.clone(r,n._ellipsoid),n._vertexFormat=c.VertexFormat.clone(o,n._vertexFormat),n._stRotation=i,n.packedLength=l,n},d.createGeometry=function(e){var t=e._vertexFormat,n=e._polygonHierarchy,a=e._stRotation,r=n.positions;if(!((r=F.arrayRemoveDuplicates(r,R.Cartesian3.equalsEpsilon,!0)).length<3)){var o=T,i=D,l=_,s=j,c=U;if(G.CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments(r,k,s,c)){var p,o=R.Cartesian3.cross(s,c,o);o=R.Cartesian3.normalize(o,o),R.Cartesian3.equalsEpsilon(k,R.Cartesian3.ZERO,V.CesiumMath.EPSILON6)||(p=e._ellipsoid.geodeticSurfaceNormal(k,W),R.Cartesian3.dot(o,p)<0&&(o=R.Cartesian3.negate(o,o),s=R.Cartesian3.negate(s,s)));var y=G.CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction(k,s,c),m=G.CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction(k,s,c);t.tangent&&(i=R.Cartesian3.clone(s,i)),t.bitangent&&(l=R.Cartesian3.clone(c,l));var u=L.PolygonGeometryLibrary.polygonsFromHierarchy(n,y,!1),d=u.hierarchy,g=u.polygons;if(0!==d.length){r=d[0].outerRing;for(var b=I.BoundingSphere.fromPoints(r),h=L.PolygonGeometryLibrary.computeBoundingRectangle(o,m,r,a,E),f=[],v=0;v<g.length;v++){var C=new A.GeometryInstance({geometry:function(e,t,n,a,r,o,i,l){var s=e.positions,c=z.PolygonPipeline.triangulate(e.positions2D,e.holes);c.length<3&&(c=[0,1,2]);var p=O.IndexDatatype.createTypedArray(s.length,c.length);p.set(c);var y,m,u=q;0!==a?(y=I.Quaternion.fromAxisAngle(o,a,Y),u=I.Matrix3.fromQuaternion(y,u),(t.tangent||t.bitangent)&&(y=I.Quaternion.fromAxisAngle(o,-a,Y),m=I.Matrix3.fromQuaternion(y,J),i=R.Cartesian3.normalize(I.Matrix3.multiplyByVector(m,i,i),i),t.bitangent&&(l=R.Cartesian3.normalize(R.Cartesian3.cross(o,i,l),l)))):u=I.Matrix3.clone(I.Matrix3.IDENTITY,u);var d=Q;t.st&&(d.x=n.x,d.y=n.y);for(var g=s.length,b=3*g,h=new Float64Array(b),f=t.normal?new Float32Array(b):void 0,v=t.tangent?new Float32Array(b):void 0,C=t.bitangent?new Float32Array(b):void 0,x=t.st?new Float32Array(2*g):void 0,P=0,w=0,A=0,F=0,G=0,L=0;L<g;L++){var E,T,D,_=s[L];h[P++]=_.x,h[P++]=_.y,h[P++]=_.z,t.st&&(E=r(I.Matrix3.multiplyByVector(u,_,S),N),R.Cartesian2.subtract(E,d,E),T=V.CesiumMath.clamp(E.x/n.width,0,1),D=V.CesiumMath.clamp(E.y/n.height,0,1),x[G++]=T,x[G++]=D),t.normal&&(f[w++]=o.x,f[w++]=o.y,f[w++]=o.z),t.tangent&&(v[F++]=i.x,v[F++]=i.y,v[F++]=i.z),t.bitangent&&(C[A++]=l.x,C[A++]=l.y,C[A++]=l.z)}var k=new B.GeometryAttributes;return t.position&&(k.position=new H.GeometryAttribute({componentDatatype:M.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:h})),t.normal&&(k.normal=new H.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:f})),t.tangent&&(k.tangent=new H.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:v})),t.bitangent&&(k.bitangent=new H.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:C})),t.st&&(k.st=new H.GeometryAttribute({componentDatatype:M.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:x})),new H.Geometry({attributes:k,indices:p,primitiveType:H.PrimitiveType.TRIANGLES})}(g[v],t,h,a,m,o,i,l)});f.push(C)}var x=w.GeometryPipeline.combineInstances(f)[0];x.attributes.position.values=new Float64Array(x.attributes.position.values),x.indices=O.IndexDatatype.createTypedArray(x.attributes.position.values.length/3,x.indices);var P=x.attributes;return t.position||delete P.position,new H.Geometry({attributes:P,indices:x.indices,primitiveType:x.primitiveType,boundingSphere:b})}}}},function(e,t){return s.defined(t)&&(e=d.unpack(e,t)),d.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js b/web/assets/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js new file mode 100644 index 00000000..9b72ea22 --- /dev/null +++ b/web/assets/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryInstance-11f9a3bd","./arrayRemoveDuplicates-ebc732b0","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./CoplanarPolygonGeometryLibrary-dc8e954f","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolygonGeometryLibrary-29b9a52e"],function(i,e,t,l,p,r,n,s,u,d,o,f,a,m,y,c,g,b,h,P,G,v,L,C,T){"use strict";function E(e){var t=(e=i.defaultValue(e,i.defaultValue.EMPTY_OBJECT)).polygonHierarchy;this._polygonHierarchy=t,this._workerName="createCoplanarPolygonOutlineGeometry",this.packedLength=T.PolygonGeometryLibrary.computeHierarchyPackedLength(t)+1}E.fromPositions=function(e){return new E({polygonHierarchy:{positions:(e=i.defaultValue(e,i.defaultValue.EMPTY_OBJECT)).positions}})},E.pack=function(e,t,r){return r=i.defaultValue(r,0),t[r=T.PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,r)]=e.packedLength,t};var k={polygonHierarchy:{}};return E.unpack=function(e,t,r){t=i.defaultValue(t,0);var n=T.PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=n.startingIndex,delete n.startingIndex;var o=e[t];return i.defined(r)||(r=new E(k)),r._polygonHierarchy=n,r.packedLength=o,r},E.createGeometry=function(e){var t=e._polygonHierarchy,r=t.positions;if(!((r=b.arrayRemoveDuplicates(r,l.Cartesian3.equalsEpsilon,!0)).length<3)&&G.CoplanarPolygonGeometryLibrary.validOutline(r)){var n=T.PolygonGeometryLibrary.polygonOutlinesFromHierarchy(t,!1);if(0!==n.length){for(var o=[],i=0;i<n.length;i++){var a=new g.GeometryInstance({geometry:function(e){for(var t=e.length,r=new Float64Array(3*t),n=m.IndexDatatype.createTypedArray(t,2*t),o=0,i=0,a=0;a<t;a++){var y=e[a];r[o++]=y.x,r[o++]=y.y,r[o++]=y.z,n[i++]=a,n[i++]=(a+1)%t}var c=new d.GeometryAttributes({position:new u.GeometryAttribute({componentDatatype:s.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:r})});return new u.Geometry({attributes:c,indices:n,primitiveType:u.PrimitiveType.LINES})}(n[i])});o.push(a)}var y=f.GeometryPipeline.combineInstances(o)[0],c=p.BoundingSphere.fromPoints(t.positions);return new u.Geometry({attributes:y.attributes,indices:y.indices,primitiveType:y.primitiveType,boundingSphere:c})}}},function(e,t){return i.defined(t)&&(e=E.unpack(e,t)),e._ellipsoid=l.Ellipsoid.clone(e._ellipsoid),E.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCorridorGeometry.js b/web/assets/Cesium/Workers/createCorridorGeometry.js new file mode 100644 index 00000000..8dd7f7c0 --- /dev/null +++ b/web/assets/Cesium/Workers/createCorridorGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./arrayRemoveDuplicates-ebc732b0","./EllipsoidTangentPlane-ed172748","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolylineVolumeGeometryLibrary-ec7dce94","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f","./CorridorGeometryLibrary-38c8d28f"],function(at,t,it,ot,h,e,r,nt,st,lt,dt,a,i,x,N,g,o,n,D,c,s,l,ut){"use strict";var mt=new ot.Cartesian3,yt=new ot.Cartesian3,ft=new ot.Cartesian3,ct=new ot.Cartesian3,M=new ot.Cartesian3,pt=new ot.Cartesian3,ht=new ot.Cartesian3,gt=new ot.Cartesian3;function C(t,e){for(var r=0;r<t.length;r++)t[r]=e.scaleToGeodeticSurface(t[r],t[r]);return t}function Ct(t,e,r,a,i,o){var n=t.normals,s=t.tangents,l=t.bitangents,d=ot.Cartesian3.normalize(ot.Cartesian3.cross(r,e,ht),ht);o.normal&&ut.CorridorGeometryLibrary.addAttribute(n,e,a,i),o.tangent&&ut.CorridorGeometryLibrary.addAttribute(s,d,a,i),o.bitangent&&ut.CorridorGeometryLibrary.addAttribute(l,r,a,i)}function O(t,e,r){var a,i=t.positions,o=t.corners,n=t.endPositions,s=t.lefts,l=t.normals,d=new lt.GeometryAttributes,u=0,m=0,y=0;for(D=0;D<i.length;D+=2)u+=a=i[D].length-3,y+=2*a,m+=i[D+1].length-3;for(u+=3,m+=3,D=0;D<o.length;D++){z=o[D];var f=o[D].leftPositions;at.defined(f)?u+=a=f.length:m+=a=o[D].rightPositions.length,y+=a}var c,p=at.defined(n);p&&(u+=c=n[0].length-3,m+=c,y+=6*(c/=3));var h,g,C,b,v,A,_=u+m,w=new Float64Array(_),T={normals:e.normal?new Float32Array(_):void 0,tangents:e.tangent?new Float32Array(_):void 0,bitangents:e.bitangent?new Float32Array(_):void 0},G=0,E=_-1,V=mt,F=yt,L=c/2,P=dt.IndexDatatype.createTypedArray(_/3,y),x=0;if(p){A=ft,v=ct;for(var N=n[0],V=ot.Cartesian3.fromArray(l,0,V),F=ot.Cartesian3.fromArray(s,0,F),D=0;D<L;D++)A=ot.Cartesian3.fromArray(N,3*(L-1-D),A),v=ot.Cartesian3.fromArray(N,3*(L+D),v),ut.CorridorGeometryLibrary.addAttribute(w,v,G),ut.CorridorGeometryLibrary.addAttribute(w,A,void 0,E),Ct(T,V,F,G,E,e),b=(g=G/3)+1,C=(h=(E-2)/3)-1,P[x++]=h,P[x++]=g,P[x++]=C,P[x++]=C,P[x++]=g,P[x++]=b,G+=3,E-=3}var M,O,I=0,S=0,R=i[I++],k=i[I++];for(w.set(R,G),w.set(k,E-k.length+1),F=ot.Cartesian3.fromArray(s,S,F),a=k.length-3,D=0;D<a;D+=3)M=r.geodeticSurfaceNormal(ot.Cartesian3.fromArray(R,D,ht),ht),O=r.geodeticSurfaceNormal(ot.Cartesian3.fromArray(k,a-D,gt),gt),Ct(T,V=ot.Cartesian3.normalize(ot.Cartesian3.add(M,O,V),V),F,G,E,e),b=(g=G/3)+1,C=(h=(E-2)/3)-1,P[x++]=h,P[x++]=g,P[x++]=C,P[x++]=C,P[x++]=g,P[x++]=b,G+=3,E-=3;for(M=r.geodeticSurfaceNormal(ot.Cartesian3.fromArray(R,a,ht),ht),O=r.geodeticSurfaceNormal(ot.Cartesian3.fromArray(k,a,gt),gt),V=ot.Cartesian3.normalize(ot.Cartesian3.add(M,O,V),V),S+=3,D=0;D<o.length;D++){var H,z,U,B,Y=(z=o[D]).leftPositions,W=z.rightPositions,q=pt,J=ft,j=ct;if(V=ot.Cartesian3.fromArray(l,S,V),at.defined(Y)){for(Ct(T,V,F,void 0,E,e),E-=3,U=b,B=C,H=0;H<Y.length/3;H++)q=ot.Cartesian3.fromArray(Y,3*H,q),P[x++]=U,P[x++]=B-H-1,P[x++]=B-H,ut.CorridorGeometryLibrary.addAttribute(w,q,void 0,E),J=ot.Cartesian3.fromArray(w,3*(B-H-1),J),j=ot.Cartesian3.fromArray(w,3*U,j),Ct(T,V,F=ot.Cartesian3.normalize(ot.Cartesian3.subtract(J,j,F),F),void 0,E,e),E-=3;q=ot.Cartesian3.fromArray(w,3*U,q),J=ot.Cartesian3.subtract(ot.Cartesian3.fromArray(w,3*B,J),q,J),j=ot.Cartesian3.subtract(ot.Cartesian3.fromArray(w,3*(B-H),j),q,j),Ct(T,V,F=ot.Cartesian3.normalize(ot.Cartesian3.add(J,j,F),F),G,void 0,e),G+=3}else{for(Ct(T,V,F,G,void 0,e),G+=3,U=C,B=b,H=0;H<W.length/3;H++)q=ot.Cartesian3.fromArray(W,3*H,q),P[x++]=U,P[x++]=B+H,P[x++]=B+H+1,ut.CorridorGeometryLibrary.addAttribute(w,q,G),J=ot.Cartesian3.fromArray(w,3*U,J),j=ot.Cartesian3.fromArray(w,3*(B+H),j),Ct(T,V,F=ot.Cartesian3.normalize(ot.Cartesian3.subtract(J,j,F),F),G,void 0,e),G+=3;q=ot.Cartesian3.fromArray(w,3*U,q),J=ot.Cartesian3.subtract(ot.Cartesian3.fromArray(w,3*(B+H),J),q,J),j=ot.Cartesian3.subtract(ot.Cartesian3.fromArray(w,3*B,j),q,j),Ct(T,V,F=ot.Cartesian3.normalize(ot.Cartesian3.negate(ot.Cartesian3.add(j,J,F),F),F),void 0,E,e),E-=3}for(R=i[I++],k=i[I++],R.splice(0,3),k.splice(k.length-3,3),w.set(R,G),w.set(k,E-k.length+1),a=k.length-3,S+=3,F=ot.Cartesian3.fromArray(s,S,F),H=0;H<k.length;H+=3)M=r.geodeticSurfaceNormal(ot.Cartesian3.fromArray(R,H,ht),ht),O=r.geodeticSurfaceNormal(ot.Cartesian3.fromArray(k,a-H,gt),gt),Ct(T,V=ot.Cartesian3.normalize(ot.Cartesian3.add(M,O,V),V),F,G,E,e),g=(b=G/3)-1,h=(C=(E-2)/3)+1,P[x++]=h,P[x++]=g,P[x++]=C,P[x++]=C,P[x++]=g,P[x++]=b,G+=3,E-=3;G-=3,E+=3}if(Ct(T,V=ot.Cartesian3.fromArray(l,l.length-3,V),F,G,E,e),p){G+=3,E-=3,A=ft,v=ct;var K=n[1];for(D=0;D<L;D++)A=ot.Cartesian3.fromArray(K,3*(c-D-1),A),v=ot.Cartesian3.fromArray(K,3*D,v),ut.CorridorGeometryLibrary.addAttribute(w,A,void 0,E),ut.CorridorGeometryLibrary.addAttribute(w,v,G),Ct(T,V,F,G,E,e),g=(b=G/3)-1,h=(C=(E-2)/3)+1,P[x++]=h,P[x++]=g,P[x++]=C,P[x++]=C,P[x++]=g,P[x++]=b,G+=3,E-=3}if(d.position=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:w}),e.st){var Q=new Float32Array(_/3*2),X=0;if(p){u/=3,m/=3;var Z,$=Math.PI/(c+1),tt=1/(u-c+1),et=1/(m-c+1),rt=c/2;for(D=1+rt;D<c+1;D++)Z=it.CesiumMath.PI_OVER_TWO+$*D,Q[X++]=et*(1+Math.cos(Z)),Q[X++]=.5*(1+Math.sin(Z));for(D=1;D<m-c+1;D++)Q[X++]=D*et,Q[X++]=0;for(D=c;rt<D;D--)Z=it.CesiumMath.PI_OVER_TWO-D*$,Q[X++]=1-et*(1+Math.cos(Z)),Q[X++]=.5*(1+Math.sin(Z));for(D=rt;0<D;D--)Z=it.CesiumMath.PI_OVER_TWO-$*D,Q[X++]=1-tt*(1+Math.cos(Z)),Q[X++]=.5*(1+Math.sin(Z));for(D=u-c;0<D;D--)Q[X++]=D*tt,Q[X++]=1;for(D=1;D<1+rt;D++)Z=it.CesiumMath.PI_OVER_TWO+$*D,Q[X++]=tt*(1+Math.cos(Z)),Q[X++]=.5*(1+Math.sin(Z))}else{for(tt=1/((u/=3)-1),et=1/((m/=3)-1),D=0;D<m;D++)Q[X++]=D*et,Q[X++]=0;for(D=u;0<D;D--)Q[X++]=(D-1)*tt,Q[X++]=1}d.st=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:Q})}return e.normal&&(d.normal=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:T.normals})),e.tangent&&(d.tangent=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:T.tangents})),e.bitangent&&(d.bitangent=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:T.bitangents})),{attributes:d,indices:P}}function I(t,e,r){r[e++]=t[0],r[e++]=t[1],r[e++]=t[2];for(var a=3;a<t.length;a+=3){var i=t[a],o=t[a+1],n=t[a+2];r[e++]=i,r[e++]=o,r[e++]=n,r[e++]=i,r[e++]=o,r[e++]=n}return r[e++]=t[0],r[e++]=t[1],r[e++]=t[2],r}function b(t,e){var r=new N.VertexFormat({position:e.position,normal:e.normal||e.bitangent||t.shadowVolume,tangent:e.tangent,bitangent:e.normal||e.bitangent,st:e.st}),a=t.ellipsoid,i=O(ut.CorridorGeometryLibrary.computePositions(t),r,a),o=t.height,n=t.extrudedHeight,s=i.attributes,l=i.indices,d=s.position.values,u=d.length,m=new Float64Array(6*u),y=new Float64Array(u);y.set(d);var f=new Float64Array(4*u),f=I(d=D.PolygonPipeline.scaleToGeodeticHeight(d,o,a),0,f);f=I(y=D.PolygonPipeline.scaleToGeodeticHeight(y,n,a),2*u,f),m.set(d),m.set(y,u),m.set(f,2*u),s.position.values=m,s=function(t,e){if(!(e.normal||e.tangent||e.bitangent||e.st))return t;var r,a,i=t.position.values;(e.normal||e.bitangent)&&(r=t.normal.values,a=t.bitangent.values);var o=t.position.values.length/18,n=3*o,s=2*o,l=2*n;if(e.normal||e.bitangent||e.tangent){for(var d,u=e.normal?new Float32Array(6*n):void 0,m=e.tangent?new Float32Array(6*n):void 0,y=e.bitangent?new Float32Array(6*n):void 0,f=mt,c=yt,p=ft,h=ct,g=M,C=pt,b=l,v=0;v<n;v+=3){var A=b+l,f=ot.Cartesian3.fromArray(i,v,f),c=ot.Cartesian3.fromArray(i,v+n,c),p=ot.Cartesian3.fromArray(i,(v+3)%n,p);c=ot.Cartesian3.subtract(c,f,c),p=ot.Cartesian3.subtract(p,f,p),h=ot.Cartesian3.normalize(ot.Cartesian3.cross(c,p,h),h),e.normal&&(ut.CorridorGeometryLibrary.addAttribute(u,h,A),ut.CorridorGeometryLibrary.addAttribute(u,h,A+3),ut.CorridorGeometryLibrary.addAttribute(u,h,b),ut.CorridorGeometryLibrary.addAttribute(u,h,b+3)),(e.tangent||e.bitangent)&&(C=ot.Cartesian3.fromArray(r,v,C),e.bitangent&&(ut.CorridorGeometryLibrary.addAttribute(y,C,A),ut.CorridorGeometryLibrary.addAttribute(y,C,A+3),ut.CorridorGeometryLibrary.addAttribute(y,C,b),ut.CorridorGeometryLibrary.addAttribute(y,C,b+3)),e.tangent&&(g=ot.Cartesian3.normalize(ot.Cartesian3.cross(C,h,g),g),ut.CorridorGeometryLibrary.addAttribute(m,g,A),ut.CorridorGeometryLibrary.addAttribute(m,g,A+3),ut.CorridorGeometryLibrary.addAttribute(m,g,b),ut.CorridorGeometryLibrary.addAttribute(m,g,b+3))),b+=6}if(e.normal){for(u.set(r),v=0;v<n;v+=3)u[v+n]=-r[v],u[v+n+1]=-r[v+1],u[v+n+2]=-r[v+2];t.normal.values=u}else t.normal=void 0;e.bitangent?(y.set(a),y.set(a,n),t.bitangent.values=y):t.bitangent=void 0,e.tangent&&(d=t.tangent.values,m.set(d),m.set(d,n),t.tangent.values=m)}if(e.st){var _=t.st.values,w=new Float32Array(6*s);w.set(_),w.set(_,s);for(var T=2*s,G=0;G<2;G++){for(w[T++]=_[0],w[T++]=_[1],v=2;v<s;v+=2){var E=_[v],V=_[v+1];w[T++]=E,w[T++]=V,w[T++]=E,w[T++]=V}w[T++]=_[0],w[T++]=_[1]}t.st.values=w}return t}(s,e);var c,p,h=u/3;if(t.shadowVolume){for(var g=s.normal.values,u=g.length,C=new Float32Array(6*u),b=0;b<u;b++)g[b]=-g[b];C.set(g,u),C=I(g,4*u,C),s.extrudeDirection=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:C}),e.normal||(s.normal=void 0)}at.defined(t.offsetAttribute)&&(p=new Uint8Array(6*h),p=t.offsetAttribute===x.GeometryOffsetAttribute.TOP?(p=x.arrayFill(p,1,0,h),x.arrayFill(p,1,2*h,4*h)):(c=t.offsetAttribute===x.GeometryOffsetAttribute.NONE?0:1,x.arrayFill(p,c)),s.applyOffset=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:p}));var v=l.length,A=h+h,_=dt.IndexDatatype.createTypedArray(m.length/3,2*v+3*A);_.set(l);var w,T,G,E,V=v;for(b=0;b<v;b+=3){var F=l[b],L=l[b+1],P=l[b+2];_[V++]=P+h,_[V++]=L+h,_[V++]=F+h}for(b=0;b<A;b+=2)G=(w=b+A)+1,E=(T=w+A)+1,_[V++]=w,_[V++]=T,_[V++]=G,_[V++]=G,_[V++]=T,_[V++]=E;return{attributes:s,indices:_}}var p=new ot.Cartesian3,v=new ot.Cartesian3,A=new ot.Cartographic;function _(t,e,r,a,i,o){var n=ot.Cartesian3.subtract(e,t,p);ot.Cartesian3.normalize(n,n);var s=r.geodeticSurfaceNormal(t,v),l=ot.Cartesian3.cross(n,s,p);ot.Cartesian3.multiplyByScalar(l,a,l);var d=i.latitude,u=i.longitude,m=o.latitude,y=o.longitude;ot.Cartesian3.add(t,l,v),r.cartesianToCartographic(v,A);var f=A.latitude,c=A.longitude,d=Math.min(d,f),u=Math.min(u,c),m=Math.max(m,f),y=Math.max(y,c);ot.Cartesian3.subtract(t,l,v),r.cartesianToCartographic(v,A),f=A.latitude,c=A.longitude,d=Math.min(d,f),u=Math.min(u,c),m=Math.max(m,f),y=Math.max(y,c),i.latitude=d,i.longitude=u,o.latitude=m,o.longitude=y}var w=new ot.Cartesian3,T=new ot.Cartesian3,G=new ot.Cartographic,E=new ot.Cartographic;function d(t,e,r,a,i){t=C(t,e);var o=g.arrayRemoveDuplicates(t,ot.Cartesian3.equalsEpsilon),n=o.length;if(n<2||r<=0)return new ot.Rectangle;var s,l,d,u=.5*r;G.latitude=Number.POSITIVE_INFINITY,G.longitude=Number.POSITIVE_INFINITY,E.latitude=Number.NEGATIVE_INFINITY,E.longitude=Number.NEGATIVE_INFINITY,a===c.CornerType.ROUNDED&&(d=o[0],ot.Cartesian3.subtract(d,o[1],w),ot.Cartesian3.normalize(w,w),ot.Cartesian3.multiplyByScalar(w,u,w),ot.Cartesian3.add(d,w,T),e.cartesianToCartographic(T,A),s=A.latitude,l=A.longitude,G.latitude=Math.min(G.latitude,s),G.longitude=Math.min(G.longitude,l),E.latitude=Math.max(E.latitude,s),E.longitude=Math.max(E.longitude,l));for(var m=0;m<n-1;++m)_(o[m],o[m+1],e,u,G,E);var y=o[n-1];ot.Cartesian3.subtract(y,o[n-2],w),ot.Cartesian3.normalize(w,w),ot.Cartesian3.multiplyByScalar(w,u,w),ot.Cartesian3.add(y,w,T),_(y,T,e,u,G,E),a===c.CornerType.ROUNDED&&(e.cartesianToCartographic(T,A),s=A.latitude,l=A.longitude,G.latitude=Math.min(G.latitude,s),G.longitude=Math.min(G.longitude,l),E.latitude=Math.max(E.latitude,s),E.longitude=Math.max(E.longitude,l));var f=at.defined(i)?i:new ot.Rectangle;return f.north=E.latitude,f.south=G.latitude,f.east=E.longitude,f.west=G.longitude,f}function V(t){var e=(t=at.defaultValue(t,at.defaultValue.EMPTY_OBJECT)).positions,r=t.width,a=at.defaultValue(t.height,0),i=at.defaultValue(t.extrudedHeight,a);this._positions=e,this._ellipsoid=ot.Ellipsoid.clone(at.defaultValue(t.ellipsoid,ot.Ellipsoid.WGS84)),this._vertexFormat=N.VertexFormat.clone(at.defaultValue(t.vertexFormat,N.VertexFormat.DEFAULT)),this._width=r,this._height=Math.max(a,i),this._extrudedHeight=Math.min(a,i),this._cornerType=at.defaultValue(t.cornerType,c.CornerType.ROUNDED),this._granularity=at.defaultValue(t.granularity,it.CesiumMath.RADIANS_PER_DEGREE),this._shadowVolume=at.defaultValue(t.shadowVolume,!1),this._workerName="createCorridorGeometry",this._offsetAttribute=t.offsetAttribute,this._rectangle=void 0,this.packedLength=1+e.length*ot.Cartesian3.packedLength+ot.Ellipsoid.packedLength+N.VertexFormat.packedLength+7}V.pack=function(t,e,r){r=at.defaultValue(r,0);var a=t._positions,i=a.length;e[r++]=i;for(var o=0;o<i;++o,r+=ot.Cartesian3.packedLength)ot.Cartesian3.pack(a[o],e,r);return ot.Ellipsoid.pack(t._ellipsoid,e,r),r+=ot.Ellipsoid.packedLength,N.VertexFormat.pack(t._vertexFormat,e,r),r+=N.VertexFormat.packedLength,e[r++]=t._width,e[r++]=t._height,e[r++]=t._extrudedHeight,e[r++]=t._cornerType,e[r++]=t._granularity,e[r++]=t._shadowVolume?1:0,e[r]=at.defaultValue(t._offsetAttribute,-1),e};var F=ot.Ellipsoid.clone(ot.Ellipsoid.UNIT_SPHERE),L=new N.VertexFormat,P={positions:void 0,ellipsoid:F,vertexFormat:L,width:void 0,height:void 0,extrudedHeight:void 0,cornerType:void 0,granularity:void 0,shadowVolume:void 0,offsetAttribute:void 0};return V.unpack=function(t,e,r){e=at.defaultValue(e,0);for(var a=t[e++],i=new Array(a),o=0;o<a;++o,e+=ot.Cartesian3.packedLength)i[o]=ot.Cartesian3.unpack(t,e);var n=ot.Ellipsoid.unpack(t,e,F);e+=ot.Ellipsoid.packedLength;var s=N.VertexFormat.unpack(t,e,L);e+=N.VertexFormat.packedLength;var l=t[e++],d=t[e++],u=t[e++],m=t[e++],y=t[e++],f=1===t[e++],c=t[e];return at.defined(r)?(r._positions=i,r._ellipsoid=ot.Ellipsoid.clone(n,r._ellipsoid),r._vertexFormat=N.VertexFormat.clone(s,r._vertexFormat),r._width=l,r._height=d,r._extrudedHeight=u,r._cornerType=m,r._granularity=y,r._shadowVolume=f,r._offsetAttribute=-1===c?void 0:c,r):(P.positions=i,P.width=l,P.height=d,P.extrudedHeight=u,P.cornerType=m,P.granularity=y,P.shadowVolume=f,P.offsetAttribute=-1===c?void 0:c,new V(P))},V.computeRectangle=function(t,e){var r=(t=at.defaultValue(t,at.defaultValue.EMPTY_OBJECT)).positions,a=t.width;return d(r,at.defaultValue(t.ellipsoid,ot.Ellipsoid.WGS84),a,at.defaultValue(t.cornerType,c.CornerType.ROUNDED),e)},V.createGeometry=function(t){var e=t._positions,r=t._width,a=t._ellipsoid,e=C(e,a),i=g.arrayRemoveDuplicates(e,ot.Cartesian3.equalsEpsilon);if(!(i.length<2||r<=0)){var o,n,s,l,d=t._height,u=t._extrudedHeight,m=!it.CesiumMath.equalsEpsilon(d,u,0,it.CesiumMath.EPSILON2),y=t._vertexFormat,f={ellipsoid:a,positions:i,width:r,cornerType:t._cornerType,granularity:t._granularity,saveAttributes:!0};m?(f.height=d,f.extrudedHeight=u,f.shadowVolume=t._shadowVolume,f.offsetAttribute=t._offsetAttribute,l=b(f,y)):((l=O(ut.CorridorGeometryLibrary.computePositions(f),y,a)).attributes.position.values=D.PolygonPipeline.scaleToGeodeticHeight(l.attributes.position.values,d,a),at.defined(t._offsetAttribute)&&(o=t._offsetAttribute===x.GeometryOffsetAttribute.NONE?0:1,n=l.attributes.position.values.length,s=new Uint8Array(n/3),x.arrayFill(s,o),l.attributes.applyOffset=new st.GeometryAttribute({componentDatatype:nt.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:s})));var c=l.attributes,p=h.BoundingSphere.fromVertices(c.position.values,void 0,3);return y.position||(l.attributes.position.values=void 0),new st.Geometry({attributes:c,indices:l.indices,primitiveType:st.PrimitiveType.TRIANGLES,boundingSphere:p,offsetAttribute:t._offsetAttribute})}},V.createShadowVolume=function(t,e,r){var a=t._granularity,i=t._ellipsoid,o=e(a,i),n=r(a,i);return new V({positions:t._positions,width:t._width,cornerType:t._cornerType,ellipsoid:i,granularity:a,extrudedHeight:o,height:n,vertexFormat:N.VertexFormat.POSITION_ONLY,shadowVolume:!0})},Object.defineProperties(V.prototype,{rectangle:{get:function(){return at.defined(this._rectangle)||(this._rectangle=d(this._positions,this._ellipsoid,this._width,this._cornerType)),this._rectangle}},textureCoordinateRotationPoints:{get:function(){return[0,0,0,1,1,0]}}}),function(t,e){return at.defined(e)&&(t=V.unpack(t,e)),t._ellipsoid=ot.Ellipsoid.clone(t._ellipsoid),V.createGeometry(t)}}); diff --git a/web/assets/Cesium/Workers/createCorridorOutlineGeometry.js b/web/assets/Cesium/Workers/createCorridorOutlineGeometry.js new file mode 100644 index 00000000..56b501d8 --- /dev/null +++ b/web/assets/Cesium/Workers/createCorridorOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./arrayRemoveDuplicates-ebc732b0","./EllipsoidTangentPlane-ed172748","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolylineVolumeGeometryLibrary-ec7dce94","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f","./CorridorGeometryLibrary-38c8d28f"],function(R,e,c,B,g,t,i,U,F,Y,q,r,o,E,b,a,n,C,W,s,l,J){"use strict";var j=new B.Cartesian3,z=new B.Cartesian3,K=new B.Cartesian3;function G(e,t){var i,r=[],o=e.positions,a=e.corners,n=e.endPositions,s=new Y.GeometryAttributes,l=0,d=0,u=0;for(L=0;L<o.length;L+=2)l+=i=o[L].length-3,u+=i/3*4,d+=o[L+1].length-3;for(l+=3,d+=3,L=0;L<a.length;L++){V=a[L];var p=a[L].leftPositions;R.defined(p)?l+=i=p.length:d+=i=a[L].rightPositions.length,u+=i/3*2}var f,h=R.defined(n);h&&(l+=f=n[0].length-3,d+=f,u+=4*(f/=3));var y,c,g,b,m,v,A=l+d,_=new Float64Array(A),E=0,C=A-1,G=f/2,T=q.IndexDatatype.createTypedArray(A/3,u+4),P=0;if(T[P++]=E/3,T[P++]=(C-2)/3,h){r.push(E/3),v=j,m=z;for(var w=n[0],L=0;L<G;L++)v=B.Cartesian3.fromArray(w,3*(G-1-L),v),m=B.Cartesian3.fromArray(w,3*(G+L),m),J.CorridorGeometryLibrary.addAttribute(_,m,E),J.CorridorGeometryLibrary.addAttribute(_,v,void 0,C),b=(c=E/3)+1,g=(y=(C-2)/3)-1,T[P++]=y,T[P++]=g,T[P++]=c,T[P++]=b,E+=3,C-=3}var D=0,k=o[D++],N=o[D++];for(_.set(k,E),_.set(N,C-N.length+1),i=N.length-3,r.push(E/3,(C-2)/3),L=0;L<i;L+=3)b=(c=E/3)+1,g=(y=(C-2)/3)-1,T[P++]=y,T[P++]=g,T[P++]=c,T[P++]=b,E+=3,C-=3;for(L=0;L<a.length;L++){var O,V,x,H=(V=a[L]).leftPositions,I=V.rightPositions,S=K;if(R.defined(H)){for(C-=3,x=g,r.push(b),O=0;O<H.length/3;O++)S=B.Cartesian3.fromArray(H,3*O,S),T[P++]=x-O-1,T[P++]=x-O,J.CorridorGeometryLibrary.addAttribute(_,S,void 0,C),C-=3;r.push(x-Math.floor(H.length/6)),t===W.CornerType.BEVELED&&r.push((C-2)/3+1),E+=3}else{for(E+=3,x=b,r.push(g),O=0;O<I.length/3;O++)S=B.Cartesian3.fromArray(I,3*O,S),T[P++]=x+O,T[P++]=x+O+1,J.CorridorGeometryLibrary.addAttribute(_,S,E),E+=3;r.push(x+Math.floor(I.length/6)),t===W.CornerType.BEVELED&&r.push(E/3-1),C-=3}for(k=o[D++],N=o[D++],k.splice(0,3),N.splice(N.length-3,3),_.set(k,E),_.set(N,C-N.length+1),i=N.length-3,O=0;O<N.length;O+=3)c=(b=E/3)-1,y=(g=(C-2)/3)+1,T[P++]=y,T[P++]=g,T[P++]=c,T[P++]=b,E+=3,C-=3;E-=3,C+=3,r.push(E/3,(C-2)/3)}if(h){E+=3,C-=3,v=j,m=z;var M=n[1];for(L=0;L<G;L++)v=B.Cartesian3.fromArray(M,3*(f-L-1),v),m=B.Cartesian3.fromArray(M,3*L,m),J.CorridorGeometryLibrary.addAttribute(_,v,void 0,C),J.CorridorGeometryLibrary.addAttribute(_,m,E),c=(b=E/3)-1,y=(g=(C-2)/3)+1,T[P++]=y,T[P++]=g,T[P++]=c,T[P++]=b,E+=3,C-=3;r.push(E/3)}else r.push(E/3,(C-2)/3);return T[P++]=E/3,T[P++]=(C-2)/3,s.position=new F.GeometryAttribute({componentDatatype:U.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:_}),{attributes:s,indices:T,wallIndices:r}}function h(e){var t=(e=R.defaultValue(e,R.defaultValue.EMPTY_OBJECT)).positions,i=e.width,r=R.defaultValue(e.height,0),o=R.defaultValue(e.extrudedHeight,r);this._positions=t,this._ellipsoid=B.Ellipsoid.clone(R.defaultValue(e.ellipsoid,B.Ellipsoid.WGS84)),this._width=i,this._height=Math.max(r,o),this._extrudedHeight=Math.min(r,o),this._cornerType=R.defaultValue(e.cornerType,W.CornerType.ROUNDED),this._granularity=R.defaultValue(e.granularity,c.CesiumMath.RADIANS_PER_DEGREE),this._offsetAttribute=e.offsetAttribute,this._workerName="createCorridorOutlineGeometry",this.packedLength=1+t.length*B.Cartesian3.packedLength+B.Ellipsoid.packedLength+6}h.pack=function(e,t,i){i=R.defaultValue(i,0);var r=e._positions,o=r.length;t[i++]=o;for(var a=0;a<o;++a,i+=B.Cartesian3.packedLength)B.Cartesian3.pack(r[a],t,i);return B.Ellipsoid.pack(e._ellipsoid,t,i),i+=B.Ellipsoid.packedLength,t[i++]=e._width,t[i++]=e._height,t[i++]=e._extrudedHeight,t[i++]=e._cornerType,t[i++]=e._granularity,t[i]=R.defaultValue(e._offsetAttribute,-1),t};var y=B.Ellipsoid.clone(B.Ellipsoid.UNIT_SPHERE),m={positions:void 0,ellipsoid:y,width:void 0,height:void 0,extrudedHeight:void 0,cornerType:void 0,granularity:void 0,offsetAttribute:void 0};return h.unpack=function(e,t,i){t=R.defaultValue(t,0);for(var r=e[t++],o=new Array(r),a=0;a<r;++a,t+=B.Cartesian3.packedLength)o[a]=B.Cartesian3.unpack(e,t);var n=B.Ellipsoid.unpack(e,t,y);t+=B.Ellipsoid.packedLength;var s=e[t++],l=e[t++],d=e[t++],u=e[t++],p=e[t++],f=e[t];return R.defined(i)?(i._positions=o,i._ellipsoid=B.Ellipsoid.clone(n,i._ellipsoid),i._width=s,i._height=l,i._extrudedHeight=d,i._cornerType=u,i._granularity=p,i._offsetAttribute=-1===f?void 0:f,i):(m.positions=o,m.width=s,m.height=l,m.extrudedHeight=d,m.cornerType=u,m.granularity=p,m.offsetAttribute=-1===f?void 0:f,new h(m))},h.createGeometry=function(e){var t=e._positions,i=e._width,r=e._ellipsoid,t=function(e,t){for(var i=0;i<e.length;i++)e[i]=t.scaleToGeodeticSurface(e[i],e[i]);return e}(t,r),o=b.arrayRemoveDuplicates(t,B.Cartesian3.equalsEpsilon);if(!(o.length<2||i<=0)){var a,n,s,l,d=e._height,u=e._extrudedHeight,p=!c.CesiumMath.equalsEpsilon(d,u,0,c.CesiumMath.EPSILON2),f={ellipsoid:r,positions:o,width:i,cornerType:e._cornerType,granularity:e._granularity,saveAttributes:!1};p?(f.height=d,f.extrudedHeight=u,f.offsetAttribute=e._offsetAttribute,l=function(e){var t=e.ellipsoid,i=G(J.CorridorGeometryLibrary.computePositions(e),e.cornerType),r=i.wallIndices,o=e.height,a=e.extrudedHeight,n=i.attributes,s=i.indices,l=(f=n.position.values).length;(h=new Float64Array(l)).set(f);var d,u,p=new Float64Array(2*l),f=C.PolygonPipeline.scaleToGeodeticHeight(f,o,t),h=C.PolygonPipeline.scaleToGeodeticHeight(h,a,t);p.set(f),p.set(h,l),n.position.values=p,l/=3,R.defined(e.offsetAttribute)&&(u=new Uint8Array(2*l),u=e.offsetAttribute===E.GeometryOffsetAttribute.TOP?E.arrayFill(u,1,0,l):(d=e.offsetAttribute===E.GeometryOffsetAttribute.NONE?0:1,E.arrayFill(u,d)),n.applyOffset=new F.GeometryAttribute({componentDatatype:U.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:u}));var y=s.length,c=q.IndexDatatype.createTypedArray(p.length/3,2*(y+r.length));c.set(s);for(var g,b,m=y,v=0;v<y;v+=2){var A=s[v],_=s[v+1];c[m++]=A+l,c[m++]=_+l}for(v=0;v<r.length;v++)b=(g=r[v])+l,c[m++]=g,c[m++]=b;return{attributes:n,indices:c}}(f)):((l=G(J.CorridorGeometryLibrary.computePositions(f),f.cornerType)).attributes.position.values=C.PolygonPipeline.scaleToGeodeticHeight(l.attributes.position.values,d,r),R.defined(e._offsetAttribute)&&(a=l.attributes.position.values.length,n=new Uint8Array(a/3),s=e._offsetAttribute===E.GeometryOffsetAttribute.NONE?0:1,E.arrayFill(n,s),l.attributes.applyOffset=new F.GeometryAttribute({componentDatatype:U.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:n})));var h=l.attributes,y=g.BoundingSphere.fromVertices(h.position.values,void 0,3);return new F.Geometry({attributes:h,indices:l.indices,primitiveType:F.PrimitiveType.LINES,boundingSphere:y,offsetAttribute:e._offsetAttribute})}},function(e,t){return R.defined(t)&&(e=h.unpack(e,t)),e._ellipsoid=B.Ellipsoid.clone(e._ellipsoid),h.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCylinderGeometry.js b/web/assets/Cesium/Workers/createCylinderGeometry.js new file mode 100644 index 00000000..c44e10a9 --- /dev/null +++ b/web/assets/Cesium/Workers/createCylinderGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./CylinderGeometryLibrary-b0214ab1","./CylinderGeometry-01400a36"],function(r,e,t,n,a,c,f,o,i,y,d,b,m,u,s){"use strict";return function(e,t){return r.defined(t)&&(e=s.CylinderGeometry.unpack(e,t)),s.CylinderGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createCylinderOutlineGeometry.js b/web/assets/Cesium/Workers/createCylinderOutlineGeometry.js new file mode 100644 index 00000000..f60fdddc --- /dev/null +++ b/web/assets/Cesium/Workers/createCylinderOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./CylinderGeometryLibrary-b0214ab1"],function(h,t,e,v,A,i,r,R,G,O,V,C,L){"use strict";var g=new v.Cartesian2;function f(t){var e=(t=h.defaultValue(t,h.defaultValue.EMPTY_OBJECT)).length,i=t.topRadius,r=t.bottomRadius,a=h.defaultValue(t.slices,128),n=Math.max(h.defaultValue(t.numberOfVerticalLines,16),0);this._length=e,this._topRadius=i,this._bottomRadius=r,this._slices=a,this._numberOfVerticalLines=n,this._offsetAttribute=t.offsetAttribute,this._workerName="createCylinderOutlineGeometry"}f.packedLength=6,f.pack=function(t,e,i){return i=h.defaultValue(i,0),e[i++]=t._length,e[i++]=t._topRadius,e[i++]=t._bottomRadius,e[i++]=t._slices,e[i++]=t._numberOfVerticalLines,e[i]=h.defaultValue(t._offsetAttribute,-1),e};var d={length:void 0,topRadius:void 0,bottomRadius:void 0,slices:void 0,numberOfVerticalLines:void 0,offsetAttribute:void 0};return f.unpack=function(t,e,i){e=h.defaultValue(e,0);var r=t[e++],a=t[e++],n=t[e++],o=t[e++],u=t[e++],s=t[e];return h.defined(i)?(i._length=r,i._topRadius=a,i._bottomRadius=n,i._slices=o,i._numberOfVerticalLines=u,i._offsetAttribute=-1===s?void 0:s,i):(d.length=r,d.topRadius=a,d.bottomRadius=n,d.slices=o,d.numberOfVerticalLines=u,d.offsetAttribute=-1===s?void 0:s,new f(d))},f.createGeometry=function(t){var e=t._length,i=t._topRadius,r=t._bottomRadius,a=t._slices,n=t._numberOfVerticalLines;if(!(e<=0||i<0||r<0||0===i&&0===r)){var o,u,s=2*a,f=L.CylinderGeometryLibrary.computePositions(e,i,r,a,!1),d=2*a;0<n&&(o=Math.min(n,a),u=Math.round(a/o),d+=o);for(var c=V.IndexDatatype.createTypedArray(s,2*d),b=0,l=0;l<a-1;l++)c[b++]=l,c[b++]=l+1,c[b++]=l+a,c[b++]=l+1+a;if(c[b++]=a-1,c[b++]=0,c[b++]=a+a-1,c[b++]=a,0<n)for(l=0;l<a;l+=u)c[b++]=l,c[b++]=l+a;var m=new O.GeometryAttributes;m.position=new G.GeometryAttribute({componentDatatype:R.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:f}),g.x=.5*e,g.y=Math.max(r,i);var p,y,_=new A.BoundingSphere(v.Cartesian3.ZERO,v.Cartesian2.magnitude(g));return h.defined(t._offsetAttribute)&&(e=f.length,p=new Uint8Array(e/3),y=t._offsetAttribute===C.GeometryOffsetAttribute.NONE?0:1,C.arrayFill(p,y),m.applyOffset=new G.GeometryAttribute({componentDatatype:R.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:p})),new G.Geometry({attributes:m,indices:c,primitiveType:G.PrimitiveType.LINES,boundingSphere:_,offsetAttribute:t._offsetAttribute})}},function(t,e){return h.defined(e)&&(t=f.unpack(t,e)),f.createGeometry(t)}}); diff --git a/web/assets/Cesium/Workers/createEllipseGeometry.js b/web/assets/Cesium/Workers/createEllipseGeometry.js new file mode 100644 index 00000000..fc7002ae --- /dev/null +++ b/web/assets/Cesium/Workers/createEllipseGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./EllipseGeometryLibrary-c9c767e4","./GeometryInstance-11f9a3bd","./EllipseGeometry-b2472656"],function(r,e,t,n,c,i,o,s,a,f,l,d,b,m,p,y,u,G,C,E,A){"use strict";return function(e,t){return r.defined(t)&&(e=A.EllipseGeometry.unpack(e,t)),e._center=n.Cartesian3.clone(e._center),e._ellipsoid=n.Ellipsoid.clone(e._ellipsoid),A.EllipseGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createEllipseOutlineGeometry.js b/web/assets/Cesium/Workers/createEllipseOutlineGeometry.js new file mode 100644 index 00000000..769486d1 --- /dev/null +++ b/web/assets/Cesium/Workers/createEllipseOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./EllipseGeometryLibrary-c9c767e4","./EllipseOutlineGeometry-2cffcd24"],function(r,e,t,n,c,i,o,f,l,a,s,d,u,m){"use strict";return function(e,t){return r.defined(t)&&(e=m.EllipseOutlineGeometry.unpack(e,t)),e._center=n.Cartesian3.clone(e._center),e._ellipsoid=n.Ellipsoid.clone(e._ellipsoid),m.EllipseOutlineGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createEllipsoidGeometry.js b/web/assets/Cesium/Workers/createEllipsoidGeometry.js new file mode 100644 index 00000000..bf03e1fb --- /dev/null +++ b/web/assets/Cesium/Workers/createEllipsoidGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./EllipsoidGeometry-ceb731dc"],function(r,e,t,c,n,o,f,i,a,d,s,m,b,u){"use strict";return function(e,t){return r.defined(t)&&(e=u.EllipsoidGeometry.unpack(e,t)),u.EllipsoidGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createEllipsoidOutlineGeometry.js b/web/assets/Cesium/Workers/createEllipsoidOutlineGeometry.js new file mode 100644 index 00000000..7ec02f56 --- /dev/null +++ b/web/assets/Cesium/Workers/createEllipsoidOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./EllipsoidOutlineGeometry-5b7b6e19"],function(r,e,t,n,f,i,c,o,a,u,d,b,s){"use strict";return function(e,t){return r.defined(e.buffer)&&(e=s.EllipsoidOutlineGeometry.unpack(e,t)),s.EllipsoidOutlineGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createFrustumGeometry.js b/web/assets/Cesium/Workers/createFrustumGeometry.js new file mode 100644 index 00000000..5037f67d --- /dev/null +++ b/web/assets/Cesium/Workers/createFrustumGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./Plane-231f1723","./VertexFormat-7572c785","./FrustumGeometry-d632cb92"],function(r,e,t,c,n,u,f,o,a,m,s,b,d){"use strict";return function(e,t){return r.defined(t)&&(e=d.FrustumGeometry.unpack(e,t)),d.FrustumGeometry.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createFrustumOutlineGeometry.js b/web/assets/Cesium/Workers/createFrustumOutlineGeometry.js new file mode 100644 index 00000000..2e145cd4 --- /dev/null +++ b/web/assets/Cesium/Workers/createFrustumOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./Plane-231f1723","./VertexFormat-7572c785","./FrustumGeometry-d632cb92"],function(s,e,t,p,h,r,n,d,g,_,a,u,k){"use strict";var m=0,o=1;function f(e){var t,r,n=e.frustum,a=e.orientation,u=e.origin,i=s.defaultValue(e._drawNearPlane,!0);n instanceof k.PerspectiveFrustum?(t=m,r=k.PerspectiveFrustum.packedLength):n instanceof k.OrthographicFrustum&&(t=o,r=k.OrthographicFrustum.packedLength),this._frustumType=t,this._frustum=n.clone(),this._origin=p.Cartesian3.clone(u),this._orientation=h.Quaternion.clone(a),this._drawNearPlane=i,this._workerName="createFrustumOutlineGeometry",this.packedLength=2+r+p.Cartesian3.packedLength+h.Quaternion.packedLength}f.pack=function(e,t,r){r=s.defaultValue(r,0);var n=e._frustumType,a=e._frustum;return(t[r++]=n)===m?(k.PerspectiveFrustum.pack(a,t,r),r+=k.PerspectiveFrustum.packedLength):(k.OrthographicFrustum.pack(a,t,r),r+=k.OrthographicFrustum.packedLength),p.Cartesian3.pack(e._origin,t,r),r+=p.Cartesian3.packedLength,h.Quaternion.pack(e._orientation,t,r),t[r+=h.Quaternion.packedLength]=e._drawNearPlane?1:0,t};var l=new k.PerspectiveFrustum,y=new k.OrthographicFrustum,v=new h.Quaternion,F=new p.Cartesian3;return f.unpack=function(e,t,r){t=s.defaultValue(t,0);var n,a=e[t++];a===m?(n=k.PerspectiveFrustum.unpack(e,t,l),t+=k.PerspectiveFrustum.packedLength):(n=k.OrthographicFrustum.unpack(e,t,y),t+=k.OrthographicFrustum.packedLength);var u=p.Cartesian3.unpack(e,t,F);t+=p.Cartesian3.packedLength;var i=h.Quaternion.unpack(e,t,v),o=1===e[t+=h.Quaternion.packedLength];if(!s.defined(r))return new f({frustum:n,origin:u,orientation:i,_drawNearPlane:o});var c=a===r._frustumType?r._frustum:void 0;return r._frustum=n.clone(c),r._frustumType=a,r._origin=p.Cartesian3.clone(u,r._origin),r._orientation=h.Quaternion.clone(i,r._orientation),r._drawNearPlane=o,r},f.createGeometry=function(e){var t=e._frustumType,r=e._frustum,n=e._origin,a=e._orientation,u=e._drawNearPlane,i=new Float64Array(24);k.FrustumGeometry._computeNearFarPlanes(n,a,t,r,i);for(var o,c,s=new _.GeometryAttributes({position:new g.GeometryAttribute({componentDatatype:d.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:i})}),p=u?2:1,m=new Uint16Array(8*(1+p)),f=u?0:1;f<2;++f)c=4*f,m[o=u?8*f:0]=c,m[o+1]=c+1,m[o+2]=c+1,m[o+3]=c+2,m[o+4]=c+2,m[o+5]=c+3,m[o+6]=c+3,m[o+7]=c;for(f=0;f<2;++f)c=4*f,m[o=8*(p+f)]=c,m[o+1]=c+4,m[o+2]=c+1,m[o+3]=c+5,m[o+4]=c+2,m[o+5]=c+6,m[o+6]=c+3,m[o+7]=c+7;return new g.Geometry({attributes:s,indices:m,primitiveType:g.PrimitiveType.LINES,boundingSphere:h.BoundingSphere.fromVertices(i)})},function(e,t){return s.defined(t)&&(e=f.unpack(e,t)),f.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createGeometry.js b/web/assets/Cesium/Workers/createGeometry.js new file mode 100644 index 00000000..98e1f8b3 --- /dev/null +++ b/web/assets/Cesium/Workers/createGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./PrimitivePipeline-bde6ab6f","./WebMercatorProjection-df58d479","./createTaskProcessorWorker"],function(u,e,r,t,n,o,i,c,a,f,s,d,b,m,p,l,y,P,k){"use strict";var C={};return k(function(e,r){for(var t=e.subTasks,n=t.length,o=new Array(n),i=0;i<n;i++){var c,a=t[i],f=a.geometry,s=a.moduleName;u.defined(s)?(c=function(e){var r=C[e];return u.defined(r)||("object"==typeof exports?C[r]=r=require("Workers/"+e):require(["Workers/"+e],function(e){C[r=e]=e})),r}(s),o[i]=c(f,a.offset)):o[i]=f}return u.when.all(o,function(e){return y.PrimitivePipeline.packCreateGeometryResults(e,r)})})}); diff --git a/web/assets/Cesium/Workers/createGroundPolylineGeometry.js b/web/assets/Cesium/Workers/createGroundPolylineGeometry.js new file mode 100644 index 00000000..5ff9928c --- /dev/null +++ b/web/assets/Cesium/Workers/createGroundPolylineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./EncodedCartesian3-e9c71cf0","./IntersectionTests-2626c9e9","./Plane-231f1723","./WebMercatorProjection-df58d479","./arrayRemoveDuplicates-ebc732b0","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./EllipsoidGeodesic-30fae80b"],function(j,e,He,Be,je,a,t,Ge,Ve,Ye,G,i,n,V,Y,F,E){"use strict";function r(e){e=j.defaultValue(e,j.defaultValue.EMPTY_OBJECT),this._ellipsoid=j.defaultValue(e.ellipsoid,Be.Ellipsoid.WGS84),this._rectangle=j.defaultValue(e.rectangle,Be.Rectangle.MAX_VALUE),this._projection=new je.GeographicProjection(this._ellipsoid),this._numberOfLevelZeroTilesX=j.defaultValue(e.numberOfLevelZeroTilesX,2),this._numberOfLevelZeroTilesY=j.defaultValue(e.numberOfLevelZeroTilesY,1)}Object.defineProperties(r.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},rectangle:{get:function(){return this._rectangle}},projection:{get:function(){return this._projection}}}),r.prototype.getNumberOfXTilesAtLevel=function(e){return this._numberOfLevelZeroTilesX<<e},r.prototype.getNumberOfYTilesAtLevel=function(e){return this._numberOfLevelZeroTilesY<<e},r.prototype.rectangleToNativeRectangle=function(e,a){var t=He.CesiumMath.toDegrees(e.west),n=He.CesiumMath.toDegrees(e.south),r=He.CesiumMath.toDegrees(e.east),i=He.CesiumMath.toDegrees(e.north);return j.defined(a)?(a.west=t,a.south=n,a.east=r,a.north=i,a):new Be.Rectangle(t,n,r,i)},r.prototype.tileXYToNativeRectangle=function(e,a,t,n){var r=this.tileXYToRectangle(e,a,t,n);return r.west=He.CesiumMath.toDegrees(r.west),r.south=He.CesiumMath.toDegrees(r.south),r.east=He.CesiumMath.toDegrees(r.east),r.north=He.CesiumMath.toDegrees(r.north),r},r.prototype.tileXYToRectangle=function(e,a,t,n){var r=this._rectangle,i=this.getNumberOfXTilesAtLevel(t),s=this.getNumberOfYTilesAtLevel(t),o=r.width/i,l=e*o+r.west,u=(e+1)*o+r.west,c=r.height/s,C=r.north-a*c,p=r.north-(a+1)*c;return j.defined(n)||(n=new Be.Rectangle(l,p,u,C)),n.west=l,n.south=p,n.east=u,n.north=C,n},r.prototype.positionToTileXY=function(e,a,t){var n=this._rectangle;if(Be.Rectangle.contains(n,e)){var r=this.getNumberOfXTilesAtLevel(a),i=this.getNumberOfYTilesAtLevel(a),s=n.width/r,o=n.height/i,l=e.longitude;n.east<n.west&&(l+=He.CesiumMath.TWO_PI);var u=(l-n.west)/s|0;r<=u&&(u=r-1);var c=(n.north-e.latitude)/o|0;return(i<=c&&(c=i-1),j.defined(t))?(t.x=u,t.y=c,t):new Be.Cartesian2(u,c)}};var u=new Be.Cartesian3,c=new Be.Cartesian3,C=new Be.Cartographic,p=new Be.Cartesian3,d=new Be.Cartesian3,o=new je.BoundingSphere,h=new r,g=[new Be.Cartographic,new Be.Cartographic,new Be.Cartographic,new Be.Cartographic],f=new Be.Cartesian2,Fe={};function m(e){Be.Cartographic.fromRadians(e.east,e.north,0,g[0]),Be.Cartographic.fromRadians(e.west,e.north,0,g[1]),Be.Cartographic.fromRadians(e.east,e.south,0,g[2]),Be.Cartographic.fromRadians(e.west,e.south,0,g[3]);for(var a=0,t=0,n=0,r=0,i=Fe._terrainHeightsMaxLevel,s=0;s<=i;++s){for(var o=!1,l=0;l<4;++l){var u=g[l];if(h.positionToTileXY(u,s,f),0===l)n=f.x,r=f.y;else if(n!==f.x||r!==f.y){o=!0;break}}if(o)break;a=n,t=r}if(0!==s)return{x:a,y:t,level:i<s?i:s-1}}Fe.initialize=function(){var e=Fe._initPromise;return j.defined(e)?e:(e=je.Resource.fetchJson(je.buildModuleUrl("Assets/approximateTerrainHeights.json")).then(function(e){Fe._terrainHeights=e}),Fe._initPromise=e)},Fe.getMinimumMaximumHeights=function(e,a){a=j.defaultValue(a,Be.Ellipsoid.WGS84);var t,n,r,i,s=m(e),o=Fe._defaultMinTerrainHeight,l=Fe._defaultMaxTerrainHeight;return j.defined(s)&&(t=s.level+"-"+s.x+"-"+s.y,n=Fe._terrainHeights[t],j.defined(n)&&(o=n[0],l=n[1]),a.cartographicToCartesian(Be.Rectangle.northeast(e,C),u),a.cartographicToCartesian(Be.Rectangle.southwest(e,C),c),Be.Cartesian3.midpoint(c,u,p),r=a.scaleToGeodeticSurface(p,d),o=j.defined(r)?(i=Be.Cartesian3.distance(p,r),Math.min(o,-i)):Fe._defaultMinTerrainHeight),{minimumTerrainHeight:o=Math.max(Fe._defaultMinTerrainHeight,o),maximumTerrainHeight:l}},Fe.getBoundingSphere=function(e,a){a=j.defaultValue(a,Be.Ellipsoid.WGS84);var t,n,r=m(e),i=Fe._defaultMaxTerrainHeight;j.defined(r)&&(t=r.level+"-"+r.x+"-"+r.y,n=Fe._terrainHeights[t],j.defined(n)&&(i=n[1]));var s=je.BoundingSphere.fromRectangle3D(e,a,0);return je.BoundingSphere.fromRectangle3D(e,a,i,o),je.BoundingSphere.union(s,o,s)},Fe._terrainHeightsMaxLevel=6,Fe._defaultMaxTerrainHeight=9e3,Fe._defaultMinTerrainHeight=-1e5,Fe._terrainHeights=void 0,Fe._initPromise=void 0,Object.defineProperties(Fe,{initialized:{get:function(){return j.defined(Fe._terrainHeights)}}});var q=[je.GeographicProjection,n.WebMercatorProjection],s=q.length,qe=Math.cos(He.CesiumMath.toRadians(30)),w=Math.cos(He.CesiumMath.toRadians(150)),X=0,W=1e3;function v(e){var a=(e=j.defaultValue(e,j.defaultValue.EMPTY_OBJECT)).positions;this.width=j.defaultValue(e.width,1),this._positions=a,this.granularity=j.defaultValue(e.granularity,9999),this.loop=j.defaultValue(e.loop,!1),this.arcType=j.defaultValue(e.arcType,Y.ArcType.GEODESIC),this._ellipsoid=Be.Ellipsoid.WGS84,this._projectionIndex=0,this._workerName="createGroundPolylineGeometry",this._scene3DOnly=!1}Object.defineProperties(v.prototype,{packedLength:{get:function(){return 1+3*this._positions.length+1+1+1+Be.Ellipsoid.packedLength+1+1}}}),v.setProjectionAndEllipsoid=function(e,a){for(var t=0,n=0;n<s;n++)if(a instanceof q[n]){t=n;break}e._projectionIndex=t,e._ellipsoid=a.ellipsoid};var y=new Be.Cartesian3,M=new Be.Cartesian3,T=new Be.Cartesian3;function U(e,a,t,n,r){var i=J(n,e,0,y),s=J(n,e,t,M),o=J(n,a,0,T),l=Xe(s,i,M),u=Xe(o,i,T);return Be.Cartesian3.cross(u,l,r),Be.Cartesian3.normalize(r,r)}var _=new Be.Cartographic,O=new Be.Cartesian3,b=new Be.Cartesian3,P=new Be.Cartesian3;function Z(e,a,t,n,r,i,s,o,l,u,c){if(0!==r){var C;i===Y.ArcType.GEODESIC?C=new E.EllipsoidGeodesic(e,a,s):i===Y.ArcType.RHUMB&&(C=new F.EllipsoidRhumbLine(e,a,s));var p=C.surfaceDistance;if(!(p<r))for(var d=U(e,a,n,s,P),h=Math.ceil(p/r),g=p/h,f=g,m=h-1,w=o.length,v=0;v<m;v++){var y=C.interpolateUsingSurfaceDistance(f,_),M=J(s,y,t,O),T=J(s,y,n,b);Be.Cartesian3.pack(d,o,w),Be.Cartesian3.pack(M,l,w),Be.Cartesian3.pack(T,u,w),c.push(y.latitude),c.push(y.longitude),w+=3,f+=g}}}var l=new Be.Cartographic;function J(e,a,t,n){return Be.Cartographic.clone(a,l),l.height=t,Be.Cartographic.toCartesian(l,e,n)}function Xe(e,a,t){return Be.Cartesian3.subtract(e,a,t),Be.Cartesian3.normalize(t,t),t}function k(e,a,t,n){return n=Xe(e,a,n),n=Be.Cartesian3.cross(n,t,n),n=Be.Cartesian3.normalize(n,n),n=Be.Cartesian3.cross(t,n,n)}v.pack=function(e,a,t){var n=j.defaultValue(t,0),r=e._positions,i=r.length;a[n++]=i;for(var s=0;s<i;++s){var o=r[s];Be.Cartesian3.pack(o,a,n),n+=3}return a[n++]=e.granularity,a[n++]=e.loop?1:0,a[n++]=e.arcType,Be.Ellipsoid.pack(e._ellipsoid,a,n),n+=Be.Ellipsoid.packedLength,a[n++]=e._projectionIndex,a[n++]=e._scene3DOnly?1:0,a},v.unpack=function(e,a,t){for(var n=j.defaultValue(a,0),r=e[n++],i=new Array(r),s=0;s<r;s++)i[s]=Be.Cartesian3.unpack(e,n),n+=3;var o=e[n++],l=1===e[n++],u=e[n++],c=Be.Ellipsoid.unpack(e,n);n+=Be.Ellipsoid.packedLength;var C=e[n++],p=1===e[n++];return j.defined(t)||(t=new v({positions:i})),t._positions=i,t.granularity=o,t.loop=l,t.arcType=u,t._ellipsoid=c,t._projectionIndex=C,t._scene3DOnly=p,t};var A=new Be.Cartesian3,L=new Be.Cartesian3,S=new Be.Cartesian3,I=new Be.Cartesian3;function Q(e,a,t,n,r){var i=Xe(t,a,I),s=k(e,a,i,A),o=k(n,a,i,L);if(He.CesiumMath.equalsEpsilon(Be.Cartesian3.dot(s,o),-1,He.CesiumMath.EPSILON5))return r=Be.Cartesian3.cross(i,s,r),r=Be.Cartesian3.normalize(r,r);r=Be.Cartesian3.add(o,s,r),r=Be.Cartesian3.normalize(r,r);var l=Be.Cartesian3.cross(i,r,S);return Be.Cartesian3.dot(o,l)<0&&(r=Be.Cartesian3.negate(r,r)),r}var K=i.Plane.fromPointNormal(Be.Cartesian3.ZERO,Be.Cartesian3.UNIT_Y),$=new Be.Cartesian3,ee=new Be.Cartesian3,ae=new Be.Cartesian3,te=new Be.Cartesian3,ne=new Be.Cartesian3,re=new Be.Cartesian3,ie=new Be.Cartographic,se=new Be.Cartographic,oe=new Be.Cartographic;v.createGeometry=function(e){var a,t,n,r,i,s=!e._scene3DOnly,o=e.loop,l=e._ellipsoid,u=e.granularity,c=e.arcType,C=new q[e._projectionIndex](l),p=X,d=W,h=e._positions,g=h.length;2===g&&(o=!1);for(var f,m,w,v=new F.EllipsoidRhumbLine(void 0,void 0,l),y=[h[0]],M=0;M<g-1;M++)t=h[M],n=h[M+1],f=G.IntersectionTests.lineSegmentPlane(t,n,K,re),!j.defined(f)||Be.Cartesian3.equalsEpsilon(f,t,He.CesiumMath.EPSILON7)||Be.Cartesian3.equalsEpsilon(f,n,He.CesiumMath.EPSILON7)||(e.arcType===Y.ArcType.GEODESIC?y.push(Be.Cartesian3.clone(f)):e.arcType===Y.ArcType.RHUMB&&(w=l.cartesianToCartographic(f,ie).longitude,r=l.cartesianToCartographic(t,ie),i=l.cartesianToCartographic(n,se),v.setEndPoints(r,i),m=v.findIntersectionWithLongitude(w,oe),f=l.cartographicToCartesian(m,re),!j.defined(f)||Be.Cartesian3.equalsEpsilon(f,t,He.CesiumMath.EPSILON7)||Be.Cartesian3.equalsEpsilon(f,n,He.CesiumMath.EPSILON7)||y.push(Be.Cartesian3.clone(f)))),y.push(n);o&&(t=h[g-1],n=h[0],f=G.IntersectionTests.lineSegmentPlane(t,n,K,re),!j.defined(f)||Be.Cartesian3.equalsEpsilon(f,t,He.CesiumMath.EPSILON7)||Be.Cartesian3.equalsEpsilon(f,n,He.CesiumMath.EPSILON7)||(e.arcType===Y.ArcType.GEODESIC?y.push(Be.Cartesian3.clone(f)):e.arcType===Y.ArcType.RHUMB&&(w=l.cartesianToCartographic(f,ie).longitude,r=l.cartesianToCartographic(t,ie),i=l.cartesianToCartographic(n,se),v.setEndPoints(r,i),m=v.findIntersectionWithLongitude(w,oe),f=l.cartographicToCartesian(m,re),!j.defined(f)||Be.Cartesian3.equalsEpsilon(f,t,He.CesiumMath.EPSILON7)||Be.Cartesian3.equalsEpsilon(f,n,He.CesiumMath.EPSILON7)||y.push(Be.Cartesian3.clone(f)))));var T=y.length,E=new Array(T);for(M=0;M<T;M++){var _=Be.Cartographic.fromCartesian(y[M],l);_.height=0,E[M]=_}if(!((T=(E=V.arrayRemoveDuplicates(E,Be.Cartographic.equalsEpsilon)).length)<2)){var O=[],b=[],P=[],k=[],A=$,L=ee,S=ae,I=te,x=ne,N=E[0],R=E[1];for(A=J(l,E[T-1],p,A),I=J(l,R,p,I),L=J(l,N,p,L),S=J(l,N,d,S),x=o?Q(A,L,S,I,x):U(N,R,d,l,x),Be.Cartesian3.pack(x,b,0),Be.Cartesian3.pack(L,P,0),Be.Cartesian3.pack(S,k,0),O.push(N.latitude),O.push(N.longitude),Z(N,R,p,d,u,c,l,b,P,k,O),M=1;M<T-1;++M){A=Be.Cartesian3.clone(L,A),L=Be.Cartesian3.clone(I,L);var D=E[M];J(l,D,d,S),J(l,E[M+1],p,I),Q(A,L,S,I,x),a=b.length,Be.Cartesian3.pack(x,b,a),Be.Cartesian3.pack(L,P,a),Be.Cartesian3.pack(S,k,a),O.push(D.latitude),O.push(D.longitude),Z(E[M],E[M+1],p,d,u,c,l,b,P,k,O)}var z,H=E[T-1],B=E[T-2],L=J(l,H,p,L),S=J(l,H,d,S);if(x=o?(z=E[0],Q(A=J(l,B,p,A),L,S,I=J(l,z,p,I),x)):U(B,H,d,l,x),a=b.length,Be.Cartesian3.pack(x,b,a),Be.Cartesian3.pack(L,P,a),Be.Cartesian3.pack(S,k,a),O.push(H.latitude),O.push(H.longitude),o){for(Z(H,N,p,d,u,c,l,b,P,k,O),a=b.length,M=0;M<3;++M)b[a+M]=b[M],P[a+M]=P[M],k[a+M]=k[M];O.push(N.latitude),O.push(N.longitude)}return function(e,a,t,n,r,i,s){var o,l,u,c,C,p,d=a._ellipsoid,h=t.length/3-1,g=8*h,f=4*g,m=36*h,w=new(65535<g?Uint32Array:Uint16Array)(m),v=new Float64Array(3*g),y=new Float32Array(f),M=new Float32Array(f),T=new Float32Array(f),E=new Float32Array(f),_=new Float32Array(f);s&&(u=new Float32Array(f),c=new Float32Array(f),C=new Float32Array(f),p=new Float32Array(2*g));var O=i.length/2,b=0,P=Qe;P.height=0;var k=Ke;k.height=0;var A=$e,L=ea;if(s)for(l=0,o=1;o<O;o++)P.latitude=i[l],P.longitude=i[l+1],k.latitude=i[l+2],k.longitude=i[l+3],A=a.project(P,A),L=a.project(k,L),b+=Be.Cartesian3.distance(A,L),l+=2;var S=n.length/3;L=Be.Cartesian3.unpack(n,0,L);var I,x=0;for(l=3,o=1;o<S;o++)A=Be.Cartesian3.clone(L,A),L=Be.Cartesian3.unpack(n,l,L),x+=Be.Cartesian3.distance(A,L),l+=3;l=3;var N=0,R=0,D=0,z=0,H=!1,B=Be.Cartesian3.unpack(t,0,ta),j=Be.Cartesian3.unpack(n,0,ea),G=Be.Cartesian3.unpack(r,0,ra);{var V;e&&(V=Be.Cartesian3.unpack(t,t.length-6,aa),We(G,V,B,j)&&(G=Be.Cartesian3.negate(G,G)))}var Y,F,q,X,W,U,Z,J=0,Q=0,K=0;for(o=0;o<h;o++){var $,ee,ae=Be.Cartesian3.clone(B,aa),te=Be.Cartesian3.clone(j,$e),ne=Be.Cartesian3.clone(G,na);H&&(ne=Be.Cartesian3.negate(ne,ne)),B=Be.Cartesian3.unpack(t,l,ta),j=Be.Cartesian3.unpack(n,l,ea),G=Be.Cartesian3.unpack(r,l,ra),H=We(G,ae,B,j),P.latitude=i[N],P.longitude=i[N+1],k.latitude=i[N+2],k.longitude=i[N+3],s&&($=function(e,a){var t=Math.abs(e.longitude),n=Math.abs(a.longitude);{if(He.CesiumMath.equalsEpsilon(t,He.CesiumMath.PI,He.CesiumMath.EPSILON11)){var r=He.CesiumMath.sign(a.longitude);return e.longitude=r*(t-He.CesiumMath.EPSILON11),1}if(He.CesiumMath.equalsEpsilon(n,He.CesiumMath.PI,He.CesiumMath.EPSILON11)){var i=He.CesiumMath.sign(e.longitude);return a.longitude=i*(n-He.CesiumMath.EPSILON11),2}}return 0}(P,k),Y=a.project(P,Ca),(ee=Xe(F=a.project(k,pa),Y,Ea)).y=Math.abs(ee.y),q=da,X=ha,0===$||Be.Cartesian3.dot(ee,Be.Cartesian3.UNIT_Y)>qe?(q=Ue(a,P,ne,Y,da),X=Ue(a,k,G,F,ha)):1===$?(X=Ue(a,k,G,F,ha),q.x=0,q.y=He.CesiumMath.sign(P.longitude-Math.abs(k.longitude)),q.z=0):(q=Ue(a,P,ne,Y,da),X.x=0,X.y=He.CesiumMath.sign(P.longitude-k.longitude),X.z=0));var re=Be.Cartesian3.distance(te,j),ie=Ye.EncodedCartesian3.fromCartesian(ae,Ma),se=Be.Cartesian3.subtract(B,ae,ga),oe=Be.Cartesian3.normalize(se,wa),le=Be.Cartesian3.subtract(te,ae,fa);le=Be.Cartesian3.normalize(le,le);var ue=Be.Cartesian3.cross(oe,le,wa);ue=Be.Cartesian3.normalize(ue,ue);var ce=Be.Cartesian3.cross(le,ne,va);ce=Be.Cartesian3.normalize(ce,ce);var Ce=Be.Cartesian3.subtract(j,B,ma);Ce=Be.Cartesian3.normalize(Ce,Ce);var pe=Be.Cartesian3.cross(G,Ce,ya);pe=Be.Cartesian3.normalize(pe,pe);var de,he=re/x,ge=J/x,fe=0,me=0,we=0;for(s&&(fe=Be.Cartesian3.distance(Y,F),W=Ye.EncodedCartesian3.fromCartesian(Y,Ta),U=Be.Cartesian3.subtract(F,Y,Ea),de=(Z=Be.Cartesian3.normalize(U,_a)).x,Z.x=Z.y,Z.y=-de,me=fe/b,we=Q/b),I=0;I<8;I++){var ve=z+4*I,ye=R+2*I,Me=ve+3,Te=I<4?1:-1,Ee=2===I||3===I||6===I||7===I?1:-1;Be.Cartesian3.pack(ie.high,y,ve),y[Me]=se.x,Be.Cartesian3.pack(ie.low,M,ve),M[Me]=se.y,Be.Cartesian3.pack(ce,T,ve),T[Me]=se.z,Be.Cartesian3.pack(pe,E,ve),E[Me]=he*Te,Be.Cartesian3.pack(ue,_,ve);var _e=ge*Ee;0===_e&&Ee<0&&(_e=9),_[Me]=_e,s&&(u[ve]=W.high.x,u[ve+1]=W.high.y,u[ve+2]=W.low.x,u[ve+3]=W.low.y,C[ve]=-q.y,C[ve+1]=q.x,C[ve+2]=X.y,C[ve+3]=-X.x,c[ve]=U.x,c[ve+1]=U.y,c[ve+2]=Z.x,c[ve+3]=Z.y,p[ye]=me*Te,0===(_e=we*Ee)&&Ee<0&&(_e=9),p[ye+1]=_e)}var Oe=ua,be=ca,Pe=oa,ke=la,Ae=Be.Rectangle.fromCartographicArray(ia,sa),Le=Fe.getMinimumMaximumHeights(Ae,d),Se=Le.minimumTerrainHeight,Ie=Le.maximumTerrainHeight;K+=Se,K+=Ie,Ze(ae,te,Se,Ie,Oe,Pe),Ze(B,j,Se,Ie,be,ke);var xe=Be.Cartesian3.multiplyByScalar(ue,He.CesiumMath.EPSILON5,Oa);Be.Cartesian3.add(Oe,xe,Oe),Be.Cartesian3.add(be,xe,be),Be.Cartesian3.add(Pe,xe,Pe),Be.Cartesian3.add(ke,xe,ke),Je(Oe,be),Je(Pe,ke),Be.Cartesian3.pack(Oe,v,D),Be.Cartesian3.pack(be,v,D+3),Be.Cartesian3.pack(ke,v,D+6),Be.Cartesian3.pack(Pe,v,D+9),xe=Be.Cartesian3.multiplyByScalar(ue,-2*He.CesiumMath.EPSILON5,Oa),Be.Cartesian3.add(Oe,xe,Oe),Be.Cartesian3.add(be,xe,be),Be.Cartesian3.add(Pe,xe,Pe),Be.Cartesian3.add(ke,xe,ke),Je(Oe,be),Je(Pe,ke),Be.Cartesian3.pack(Oe,v,D+12),Be.Cartesian3.pack(be,v,D+15),Be.Cartesian3.pack(ke,v,D+18),Be.Cartesian3.pack(Pe,v,D+21),N+=2,l+=3,R+=16,D+=24,z+=32,J+=re,Q+=fe}var Ne=l=0;for(o=0;o<h;o++){for(I=0;I<ka;I++)w[l+I]=Pa[I]+Ne;Ne+=8,l+=ka}var Re=ba;je.BoundingSphere.fromVertices(t,Be.Cartesian3.ZERO,3,Re[0]),je.BoundingSphere.fromVertices(n,Be.Cartesian3.ZERO,3,Re[1]);var De=je.BoundingSphere.fromBoundingSpheres(Re);De.radius+=K/(2*h);var ze={position:new Ve.GeometryAttribute({componentDatatype:Ge.ComponentDatatype.DOUBLE,componentsPerAttribute:3,normalize:!1,values:v}),startHiAndForwardOffsetX:Aa(y),startLoAndForwardOffsetY:Aa(M),startNormalAndForwardOffsetZ:Aa(T),endNormalAndTextureCoordinateNormalizationX:Aa(E),rightNormalAndTextureCoordinateNormalizationY:Aa(_)};s&&(ze.startHiLo2D=Aa(u),ze.offsetAndRight2D=Aa(c),ze.startEndNormals2D=Aa(C),ze.texcoordNormalization2D=new Ve.GeometryAttribute({componentDatatype:Ge.ComponentDatatype.FLOAT,componentsPerAttribute:2,normalize:!1,values:p}));return new Ve.Geometry({attributes:ze,indices:w,boundingSphere:De})}(o,C,P,k,b,O,s)}};var x=new Be.Cartesian3,N=new je.Matrix3,R=new je.Quaternion;function We(e,a,t,n){var r=Xe(t,a,x),i=Be.Cartesian3.dot(r,e);if(qe<i||i<w){var s=Xe(n,t,I),o=i<w?He.CesiumMath.PI_OVER_TWO:-He.CesiumMath.PI_OVER_TWO,l=je.Quaternion.fromAxisAngle(s,o,R),u=je.Matrix3.fromQuaternion(l,N);return je.Matrix3.multiplyByVector(u,e,e),!0}return!1}var D=new Be.Cartographic,z=new Be.Cartesian3,H=new Be.Cartesian3;function Ue(e,a,t,n,r){var i=Be.Cartographic.toCartesian(a,e._ellipsoid,z),s=Be.Cartesian3.add(i,t,H),o=!1,l=e._ellipsoid,u=l.cartesianToCartographic(s,D);Math.abs(a.longitude-u.longitude)>He.CesiumMath.PI_OVER_TWO&&(o=!0,s=Be.Cartesian3.subtract(i,t,H),u=l.cartesianToCartographic(s,D)),u.height=0;var c=e.project(u,r);return(r=Be.Cartesian3.subtract(c,n,r)).z=0,r=Be.Cartesian3.normalize(r,r),o&&Be.Cartesian3.negate(r,r),r}var B=new Be.Cartesian3,le=new Be.Cartesian3;function Ze(e,a,t,n,r,i){var s=Be.Cartesian3.subtract(a,e,B);Be.Cartesian3.normalize(s,s);var o=t-X,l=Be.Cartesian3.multiplyByScalar(s,o,le);Be.Cartesian3.add(e,l,r);var u=n-W,l=Be.Cartesian3.multiplyByScalar(s,u,le);Be.Cartesian3.add(a,l,i)}var ue=new Be.Cartesian3;function Je(e,a){var t=i.Plane.getPointDistance(K,e),n=i.Plane.getPointDistance(K,a),r=ue;He.CesiumMath.equalsEpsilon(t,0,He.CesiumMath.EPSILON2)?(r=Xe(a,e,r),Be.Cartesian3.multiplyByScalar(r,He.CesiumMath.EPSILON2,r),Be.Cartesian3.add(e,r,e)):He.CesiumMath.equalsEpsilon(n,0,He.CesiumMath.EPSILON2)&&(r=Xe(e,a,r),Be.Cartesian3.multiplyByScalar(r,He.CesiumMath.EPSILON2,r),Be.Cartesian3.add(a,r,a))}var Qe=new Be.Cartographic,Ke=new Be.Cartographic,$e=new Be.Cartesian3,ea=new Be.Cartesian3,aa=new Be.Cartesian3,ta=new Be.Cartesian3,na=new Be.Cartesian3,ra=new Be.Cartesian3,ia=[Qe,Ke],sa=new Be.Rectangle,oa=new Be.Cartesian3,la=new Be.Cartesian3,ua=new Be.Cartesian3,ca=new Be.Cartesian3,Ca=new Be.Cartesian3,pa=new Be.Cartesian3,da=new Be.Cartesian3,ha=new Be.Cartesian3,ga=new Be.Cartesian3,fa=new Be.Cartesian3,ma=new Be.Cartesian3,wa=new Be.Cartesian3,va=new Be.Cartesian3,ya=new Be.Cartesian3,Ma=new Ye.EncodedCartesian3,Ta=new Ye.EncodedCartesian3,Ea=new Be.Cartesian3,_a=new Be.Cartesian3,Oa=new Be.Cartesian3,ba=[new je.BoundingSphere,new je.BoundingSphere],Pa=[0,2,1,0,3,2,0,7,3,0,4,7,0,5,4,0,1,5,5,7,4,5,6,7,5,2,6,5,1,2,3,6,2,3,7,6],ka=Pa.length;function Aa(e){return new Ve.GeometryAttribute({componentDatatype:Ge.ComponentDatatype.FLOAT,componentsPerAttribute:4,normalize:!1,values:e})}return v._projectNormal=Ue,function(e,a){return Fe.initialize().then(function(){return j.defined(a)&&(e=v.unpack(e,a)),v.createGeometry(e)})}}); diff --git a/web/assets/Cesium/Workers/createPlaneGeometry.js b/web/assets/Cesium/Workers/createPlaneGeometry.js new file mode 100644 index 00000000..340d48ab --- /dev/null +++ b/web/assets/Cesium/Workers/createPlaneGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./VertexFormat-7572c785"],function(a,e,t,c,p,r,n,y,s,A,o){"use strict";function m(e){e=a.defaultValue(e,a.defaultValue.EMPTY_OBJECT);var t=a.defaultValue(e.vertexFormat,o.VertexFormat.DEFAULT);this._vertexFormat=t,this._workerName="createPlaneGeometry"}m.packedLength=o.VertexFormat.packedLength,m.pack=function(e,t,r){return r=a.defaultValue(r,0),o.VertexFormat.pack(e._vertexFormat,t,r),t};var i=new o.VertexFormat,u={vertexFormat:i};m.unpack=function(e,t,r){t=a.defaultValue(t,0);var n=o.VertexFormat.unpack(e,t,i);return a.defined(r)?(r._vertexFormat=o.VertexFormat.clone(n,r._vertexFormat),r):new m(u)};var l=new c.Cartesian3(-.5,-.5,0),F=new c.Cartesian3(.5,.5,0);return m.createGeometry=function(e){var t,r,n,a,o,m,i=e._vertexFormat,u=new A.GeometryAttributes;return i.position&&((m=new Float64Array(12))[0]=l.x,m[1]=l.y,m[2]=0,m[3]=F.x,m[4]=l.y,m[5]=0,m[6]=F.x,m[7]=F.y,m[8]=0,m[9]=l.x,m[10]=F.y,m[11]=0,u.position=new s.GeometryAttribute({componentDatatype:y.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:m}),i.normal&&((r=new Float32Array(12))[0]=0,r[1]=0,r[2]=1,r[3]=0,r[4]=0,r[5]=1,r[6]=0,r[7]=0,r[8]=1,r[9]=0,r[10]=0,r[11]=1,u.normal=new s.GeometryAttribute({componentDatatype:y.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:r})),i.st&&((n=new Float32Array(8))[0]=0,n[1]=0,n[2]=1,n[3]=0,n[4]=1,n[5]=1,n[6]=0,n[7]=1,u.st=new s.GeometryAttribute({componentDatatype:y.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:n})),i.tangent&&((a=new Float32Array(12))[0]=1,a[1]=0,a[2]=0,a[3]=1,a[4]=0,a[5]=0,a[6]=1,a[7]=0,a[8]=0,a[9]=1,a[10]=0,a[11]=0,u.tangent=new s.GeometryAttribute({componentDatatype:y.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:a})),i.bitangent&&((o=new Float32Array(12))[0]=0,o[1]=1,o[2]=0,o[3]=0,o[4]=1,o[5]=0,o[6]=0,o[7]=1,o[8]=0,o[9]=0,o[10]=1,o[11]=0,u.bitangent=new s.GeometryAttribute({componentDatatype:y.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:o})),(t=new Uint16Array(6))[0]=0,t[1]=1,t[2]=2,t[3]=0,t[4]=2,t[5]=3),new s.Geometry({attributes:u,indices:t,primitiveType:s.PrimitiveType.TRIANGLES,boundingSphere:new p.BoundingSphere(c.Cartesian3.ZERO,Math.sqrt(2))})},function(e,t){return a.defined(t)&&(e=m.unpack(e,t)),m.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createPlaneOutlineGeometry.js b/web/assets/Cesium/Workers/createPlaneOutlineGeometry.js new file mode 100644 index 00000000..81e23c7a --- /dev/null +++ b/web/assets/Cesium/Workers/createPlaneOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40"],function(r,e,t,a,i,n,o,c,u,s){"use strict";function y(){this._workerName="createPlaneOutlineGeometry"}y.packedLength=0,y.pack=function(e,t){return t},y.unpack=function(e,t,n){return r.defined(n)?n:new y};var f=new a.Cartesian3(-.5,-.5,0),m=new a.Cartesian3(.5,.5,0);return y.createGeometry=function(){var e=new s.GeometryAttributes,t=new Uint16Array(8),n=new Float64Array(12);return n[0]=f.x,n[1]=f.y,n[2]=f.z,n[3]=m.x,n[4]=f.y,n[5]=f.z,n[6]=m.x,n[7]=m.y,n[8]=f.z,n[9]=f.x,n[10]=m.y,n[11]=f.z,e.position=new u.GeometryAttribute({componentDatatype:c.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:n}),t[0]=0,t[1]=1,t[2]=1,t[3]=2,t[4]=2,t[5]=3,t[6]=3,t[7]=0,new u.Geometry({attributes:e,indices:t,primitiveType:u.PrimitiveType.LINES,boundingSphere:new i.BoundingSphere(a.Cartesian3.ZERO,Math.sqrt(2))})},function(e,t){return r.defined(t)&&(e=y.unpack(e,t)),y.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createPolygonGeometry.js b/web/assets/Cesium/Workers/createPolygonGeometry.js new file mode 100644 index 00000000..863563ab --- /dev/null +++ b/web/assets/Cesium/Workers/createPolygonGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./GeometryInstance-11f9a3bd","./arrayRemoveDuplicates-ebc732b0","./BoundingRectangle-8de79d83","./EllipsoidTangentPlane-ed172748","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolygonGeometryLibrary-29b9a52e","./EllipsoidGeodesic-30fae80b"],function(Y,e,U,j,Q,t,r,q,K,o,a,D,i,L,n,s,Z,b,N,l,u,H,p,c,R,M,y){"use strict";var J=new j.Cartographic,X=new j.Cartographic;var S=new u.BoundingRectangle,$=new j.Cartesian3,ee=new j.Cartesian3,te=new j.Cartesian3,re=new j.Cartesian3,oe=new j.Cartesian3,ae=new j.Cartesian3,ie=new j.Cartesian3,ne=new j.Cartesian3,se=new j.Cartesian3,le=new j.Cartesian2,ue=new j.Cartesian2,ce=new j.Cartesian3,pe=new Q.Quaternion,ye=new Q.Matrix3,me=new Q.Matrix3;function B(e){var t,r,o,a=e.vertexFormat,i=e.geometry,n=e.shadowVolume,s=i.attributes.position.values,l=s.length,u=e.wall,c=e.top||u,p=e.bottom||u;if(a.st||a.normal||a.tangent||a.bitangent||n){var y=e.boundingRectangle,m=e.tangentPlane,g=e.ellipsoid,d=e.stRotation,h=e.perPositionHeight,f=le;f.x=y.x,f.y=y.y;var b,v=a.st?new Float32Array(l/3*2):void 0;a.normal&&(b=h&&c&&!u?i.attributes.normal.values:new Float32Array(l));var _,P=a.tangent?new Float32Array(l):void 0,C=a.bitangent?new Float32Array(l):void 0,w=n?new Float32Array(l):void 0,x=0,T=0,I=ee,A=te,E=re,G=!0,O=ye,V=me;V=0!==d?(_=Q.Quaternion.fromAxisAngle(m._plane.normal,d,pe),O=Q.Matrix3.fromQuaternion(_,O),_=Q.Quaternion.fromAxisAngle(m._plane.normal,-d,pe),Q.Matrix3.fromQuaternion(_,V)):(O=Q.Matrix3.clone(Q.Matrix3.IDENTITY,O),Q.Matrix3.clone(Q.Matrix3.IDENTITY,V));var F=0,D=0;c&&p&&(F=l/2,D=l/3,l/=2);for(var L=0;L<l;L+=3){var N,H,R,M,S,B,k,z,W=j.Cartesian3.fromArray(s,L,ce);a.st&&(N=Q.Matrix3.multiplyByVector(O,W,$),N=g.scaleToGeodeticSurface(N,N),H=m.projectPointOntoPlane(N,ue),j.Cartesian2.subtract(H,f,H),R=U.CesiumMath.clamp(H.x/y.width,0,1),M=U.CesiumMath.clamp(H.y/y.height,0,1),p&&(v[x+D]=R,v[x+1+D]=M),c&&(v[x]=R,v[x+1]=M),x+=2),(a.normal||a.tangent||a.bitangent||n)&&(S=T+1,B=T+2,u?(L+3<l&&(k=j.Cartesian3.fromArray(s,L+3,oe),G&&(z=j.Cartesian3.fromArray(s,L+l,ae),h&&function(e,t,r,o){var a=o.cartesianToCartographic(e,J).height,i=o.cartesianToCartographic(t,X);i.height=a,o.cartographicToCartesian(i,t);var n=o.cartesianToCartographic(r,X);n.height=a-100,o.cartographicToCartesian(n,r)}(W,k,z,g),j.Cartesian3.subtract(k,W,k),j.Cartesian3.subtract(z,W,z),I=j.Cartesian3.normalize(j.Cartesian3.cross(z,k,I),I),G=!1),j.Cartesian3.equalsEpsilon(k,W,U.CesiumMath.EPSILON10)&&(G=!0)),(a.tangent||a.bitangent)&&(E=g.geodeticSurfaceNormal(W,E),a.tangent&&(A=j.Cartesian3.normalize(j.Cartesian3.cross(E,I,A),A)))):(I=g.geodeticSurfaceNormal(W,I),(a.tangent||a.bitangent)&&(h&&(ie=j.Cartesian3.fromArray(b,T,ie),ne=j.Cartesian3.cross(j.Cartesian3.UNIT_Z,ie,ne),ne=j.Cartesian3.normalize(Q.Matrix3.multiplyByVector(V,ne,ne),ne),a.bitangent&&(se=j.Cartesian3.normalize(j.Cartesian3.cross(ie,ne,se),se))),A=j.Cartesian3.cross(j.Cartesian3.UNIT_Z,I,A),A=j.Cartesian3.normalize(Q.Matrix3.multiplyByVector(V,A,A),A),a.bitangent&&(E=j.Cartesian3.normalize(j.Cartesian3.cross(I,A,E),E)))),a.normal&&(e.wall?(b[T+F]=I.x,b[S+F]=I.y,b[B+F]=I.z):p&&(b[T+F]=-I.x,b[S+F]=-I.y,b[B+F]=-I.z),(c&&!h||u)&&(b[T]=I.x,b[S]=I.y,b[B]=I.z)),n&&(u&&(I=g.geodeticSurfaceNormal(W,I)),w[T+F]=-I.x,w[S+F]=-I.y,w[B+F]=-I.z),a.tangent&&(e.wall?(P[T+F]=A.x,P[S+F]=A.y,P[B+F]=A.z):p&&(P[T+F]=-A.x,P[S+F]=-A.y,P[B+F]=-A.z),c&&(h?(P[T]=ne.x,P[S]=ne.y,P[B]=ne.z):(P[T]=A.x,P[S]=A.y,P[B]=A.z))),a.bitangent&&(p&&(C[T+F]=E.x,C[S+F]=E.y,C[B+F]=E.z),c&&(h?(C[T]=se.x,C[S]=se.y,C[B]=se.z):(C[T]=E.x,C[S]=E.y,C[B]=E.z))),T+=3)}a.st&&(i.attributes.st=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:v})),a.normal&&(i.attributes.normal=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:b})),a.tangent&&(i.attributes.tangent=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:P})),a.bitangent&&(i.attributes.bitangent=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:C})),n&&(i.attributes.extrudeDirection=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:w}))}return e.extrude&&Y.defined(e.offsetAttribute)&&(t=s.length/3,o=new Uint8Array(t),e.offsetAttribute===Z.GeometryOffsetAttribute.TOP?c&&p||u?o=Z.arrayFill(o,1,0,t/2):c&&(o=Z.arrayFill(o,1)):(r=e.offsetAttribute===Z.GeometryOffsetAttribute.NONE?0:1,o=Z.arrayFill(o,r)),i.attributes.applyOffset=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:o})),i}var m=new j.Cartographic,g=new j.Cartographic,d={westOverIDL:0,eastOverIDL:0},h=new y.EllipsoidGeodesic;function f(e,t,r,o,a){if(a=Y.defaultValue(a,new j.Rectangle),!Y.defined(e)||e.length<3)return a.west=0,a.north=0,a.south=0,a.east=0,a;if(r===p.ArcType.RHUMB)return j.Rectangle.fromCartesianArray(e,t,a);h.ellipsoid.equals(t)||(h=new y.EllipsoidGeodesic(void 0,void 0,t)),a.west=Number.POSITIVE_INFINITY,a.east=Number.NEGATIVE_INFINITY,a.south=Number.POSITIVE_INFINITY,a.north=Number.NEGATIVE_INFINITY,d.westOverIDL=Number.POSITIVE_INFINITY,d.eastOverIDL=Number.NEGATIVE_INFINITY;for(var i,n=1/U.CesiumMath.chordLength(o,t.maximumRadius),s=e.length,l=t.cartesianToCartographic(e[0],g),u=m,c=1;c<s;c++)i=u,u=l,l=t.cartesianToCartographic(e[c],i),h.setEndPoints(u,l),_(h,n,a,d);return i=u,u=l,l=t.cartesianToCartographic(e[0],i),h.setEndPoints(u,l),_(h,n,a,d),a.east-a.west>d.eastOverIDL-d.westOverIDL&&(a.west=d.westOverIDL,a.east=d.eastOverIDL,a.east>U.CesiumMath.PI&&(a.east=a.east-U.CesiumMath.TWO_PI),a.west>U.CesiumMath.PI&&(a.west=a.west-U.CesiumMath.TWO_PI)),a}var v=new j.Cartographic;function _(e,t,r,o){for(var a=e.surfaceDistance,i=Math.ceil(a*t),n=0<i?a/(i-1):Number.POSITIVE_INFINITY,s=0,l=0;l<i;l++){var u=e.interpolateUsingSurfaceDistance(s,v);s+=n;var c=u.longitude,p=u.latitude;r.west=Math.min(r.west,c),r.east=Math.max(r.east,c),r.south=Math.min(r.south,p),r.north=Math.max(r.north,p);var y=0<=c?c:c+U.CesiumMath.TWO_PI;o.westOverIDL=Math.min(o.westOverIDL,y),o.eastOverIDL=Math.max(o.eastOverIDL,y)}}var k=[];function P(e){var t,r=e.polygonHierarchy,o=Y.defaultValue(e.vertexFormat,b.VertexFormat.DEFAULT),a=Y.defaultValue(e.ellipsoid,j.Ellipsoid.WGS84),i=Y.defaultValue(e.granularity,U.CesiumMath.RADIANS_PER_DEGREE),n=Y.defaultValue(e.stRotation,0),s=Y.defaultValue(e.perPositionHeight,!1),l=s&&Y.defined(e.extrudedHeight),u=Y.defaultValue(e.height,0),c=Y.defaultValue(e.extrudedHeight,u);l||(t=Math.max(u,c),c=Math.min(u,c),u=t),this._vertexFormat=b.VertexFormat.clone(o),this._ellipsoid=j.Ellipsoid.clone(a),this._granularity=i,this._stRotation=n,this._height=u,this._extrudedHeight=c,this._closeTop=Y.defaultValue(e.closeTop,!0),this._closeBottom=Y.defaultValue(e.closeBottom,!0),this._polygonHierarchy=r,this._perPositionHeight=s,this._perPositionHeightExtrude=l,this._shadowVolume=Y.defaultValue(e.shadowVolume,!1),this._workerName="createPolygonGeometry",this._offsetAttribute=e.offsetAttribute,this._arcType=Y.defaultValue(e.arcType,p.ArcType.GEODESIC),this._rectangle=void 0,this._textureCoordinateRotationPoints=void 0,this.packedLength=M.PolygonGeometryLibrary.computeHierarchyPackedLength(r)+j.Ellipsoid.packedLength+b.VertexFormat.packedLength+12}P.fromPositions=function(e){return new P({polygonHierarchy:{positions:(e=Y.defaultValue(e,Y.defaultValue.EMPTY_OBJECT)).positions},height:e.height,extrudedHeight:e.extrudedHeight,vertexFormat:e.vertexFormat,stRotation:e.stRotation,ellipsoid:e.ellipsoid,granularity:e.granularity,perPositionHeight:e.perPositionHeight,closeTop:e.closeTop,closeBottom:e.closeBottom,offsetAttribute:e.offsetAttribute,arcType:e.arcType})},P.pack=function(e,t,r){return r=Y.defaultValue(r,0),r=M.PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,r),j.Ellipsoid.pack(e._ellipsoid,t,r),r+=j.Ellipsoid.packedLength,b.VertexFormat.pack(e._vertexFormat,t,r),r+=b.VertexFormat.packedLength,t[r++]=e._height,t[r++]=e._extrudedHeight,t[r++]=e._granularity,t[r++]=e._stRotation,t[r++]=e._perPositionHeightExtrude?1:0,t[r++]=e._perPositionHeight?1:0,t[r++]=e._closeTop?1:0,t[r++]=e._closeBottom?1:0,t[r++]=e._shadowVolume?1:0,t[r++]=Y.defaultValue(e._offsetAttribute,-1),t[r++]=e._arcType,t[r]=e.packedLength,t};var C=j.Ellipsoid.clone(j.Ellipsoid.UNIT_SPHERE),w=new b.VertexFormat,x={polygonHierarchy:{}};return P.unpack=function(e,t,r){t=Y.defaultValue(t,0);var o=M.PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=o.startingIndex,delete o.startingIndex;var a=j.Ellipsoid.unpack(e,t,C);t+=j.Ellipsoid.packedLength;var i=b.VertexFormat.unpack(e,t,w);t+=b.VertexFormat.packedLength;var n=e[t++],s=e[t++],l=e[t++],u=e[t++],c=1===e[t++],p=1===e[t++],y=1===e[t++],m=1===e[t++],g=1===e[t++],d=e[t++],h=e[t++],f=e[t];return Y.defined(r)||(r=new P(x)),r._polygonHierarchy=o,r._ellipsoid=j.Ellipsoid.clone(a,r._ellipsoid),r._vertexFormat=b.VertexFormat.clone(i,r._vertexFormat),r._height=n,r._extrudedHeight=s,r._granularity=l,r._stRotation=u,r._perPositionHeightExtrude=c,r._perPositionHeight=p,r._closeTop=y,r._closeBottom=m,r._shadowVolume=g,r._offsetAttribute=-1===d?void 0:d,r._arcType=h,r.packedLength=f,r},P.computeRectangle=function(e,t){var r=Y.defaultValue(e.granularity,U.CesiumMath.RADIANS_PER_DEGREE),o=Y.defaultValue(e.arcType,p.ArcType.GEODESIC),a=e.polygonHierarchy,i=Y.defaultValue(e.ellipsoid,j.Ellipsoid.WGS84);return f(a.positions,i,o,r,t)},P.createGeometry=function(e){var t=e._vertexFormat,r=e._ellipsoid,o=e._granularity,a=e._stRotation,i=e._polygonHierarchy,n=e._perPositionHeight,s=e._closeTop,l=e._closeBottom,u=e._arcType,c=i.positions;if(!(c.length<3)){var p=H.EllipsoidTangentPlane.fromPoints(c,r),y=M.PolygonGeometryLibrary.polygonsFromHierarchy(i,p.projectPointsOntoPlane.bind(p),!n,r),m=y.hierarchy,g=y.polygons;if(0!==m.length){c=m[0].outerRing;var d,h=M.PolygonGeometryLibrary.computeBoundingRectangle(p.plane.normal,p.projectPointOntoPlane.bind(p),c,a,S),f=[],b=e._height,v=e._extrudedHeight,_={perPositionHeight:n,vertexFormat:t,geometry:void 0,tangentPlane:p,boundingRectangle:h,ellipsoid:r,stRotation:a,bottom:!1,top:!0,wall:!1,extrude:!1,arcType:u};if(e._perPositionHeightExtrude||!U.CesiumMath.equalsEpsilon(b,v,0,U.CesiumMath.EPSILON2))for(_.extrude=!0,_.top=s,_.bottom=l,_.shadowVolume=e._shadowVolume,_.offsetAttribute=e._offsetAttribute,d=0;d<g.length;d++){var P,C=function(e,t,r,o,a,i,n,s,l){var u={walls:[]};if(i||n){var c=M.PolygonGeometryLibrary.createGeometryFromPositions(e,t,r,a,s,l),p=c.attributes.position.values,y=c.indices;if(i&&n){var m,g=p.concat(p),d=g.length/3;(m=L.IndexDatatype.createTypedArray(d,2*y.length)).set(y);for(var h,f=y.length,b=d/2,v=0;v<f;v+=3){var _=m[v]+b,P=m[v+1]+b,C=m[v+2]+b;m[v+f]=C,m[v+1+f]=P,m[v+2+f]=_}c.attributes.position.values=g,a&&s.normal&&(h=c.attributes.normal.values,c.attributes.normal.values=new Float32Array(g.length),c.attributes.normal.values.set(h)),c.indices=m}else if(n){for(d=p.length/3,m=L.IndexDatatype.createTypedArray(d,y.length),v=0;v<y.length;v+=3)m[v]=y[v+2],m[v+1]=y[v+1],m[v+2]=y[v];c.indices=m}u.topAndBottom=new N.GeometryInstance({geometry:c})}var w=o.outerRing,x=H.EllipsoidTangentPlane.fromPoints(w,e).projectPointsOntoPlane(w,k);R.PolygonPipeline.computeWindingOrder2D(x)===R.WindingOrder.CLOCKWISE&&(w=w.slice().reverse());var T=M.PolygonGeometryLibrary.computeWallGeometry(w,e,r,a,l);u.walls.push(new N.GeometryInstance({geometry:T}));var I=o.holes;for(v=0;v<I.length;v++){var A=I[v],x=H.EllipsoidTangentPlane.fromPoints(A,e).projectPointsOntoPlane(A,k);R.PolygonPipeline.computeWindingOrder2D(x)===R.WindingOrder.COUNTER_CLOCKWISE&&(A=A.slice().reverse()),T=M.PolygonGeometryLibrary.computeWallGeometry(A,e,r,a,l),u.walls.push(new N.GeometryInstance({geometry:T}))}return u}(r,g[d],o,m[d],n,s,l,t,u);s&&l?(P=C.topAndBottom,_.geometry=M.PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(P.geometry,b,v,r,n)):s?((P=C.topAndBottom).geometry.attributes.position.values=R.PolygonPipeline.scaleToGeodeticHeight(P.geometry.attributes.position.values,b,r,!n),_.geometry=P.geometry):l&&((P=C.topAndBottom).geometry.attributes.position.values=R.PolygonPipeline.scaleToGeodeticHeight(P.geometry.attributes.position.values,v,r,!0),_.geometry=P.geometry),(s||l)&&(_.wall=!1,P.geometry=B(_),f.push(P));var w=C.walls;_.wall=!0;for(var x=0;x<w.length;x++){var T=w[x];_.geometry=M.PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(T.geometry,b,v,r,n),T.geometry=B(_),f.push(T)}}else for(d=0;d<g.length;d++){var I,A,E,G=new N.GeometryInstance({geometry:M.PolygonGeometryLibrary.createGeometryFromPositions(r,g[d],o,n,t,u)});G.geometry.attributes.position.values=R.PolygonPipeline.scaleToGeodeticHeight(G.geometry.attributes.position.values,b,r,!n),_.geometry=G.geometry,G.geometry=B(_),Y.defined(e._offsetAttribute)&&(I=G.geometry.attributes.position.values.length,A=new Uint8Array(I/3),E=e._offsetAttribute===Z.GeometryOffsetAttribute.NONE?0:1,Z.arrayFill(A,E),G.geometry.attributes.applyOffset=new K.GeometryAttribute({componentDatatype:q.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:A})),f.push(G)}var O=D.GeometryPipeline.combineInstances(f)[0];O.attributes.position.values=new Float64Array(O.attributes.position.values),O.indices=L.IndexDatatype.createTypedArray(O.attributes.position.values.length/3,O.indices);var V=O.attributes,F=Q.BoundingSphere.fromVertices(V.position.values);return t.position||delete V.position,new K.Geometry({attributes:V,indices:O.indices,primitiveType:O.primitiveType,boundingSphere:F,offsetAttribute:e._offsetAttribute})}}},P.createShadowVolume=function(e,t,r){var o=e._granularity,a=e._ellipsoid,i=t(o,a),n=r(o,a);return new P({polygonHierarchy:e._polygonHierarchy,ellipsoid:a,stRotation:e._stRotation,granularity:o,perPositionHeight:!1,extrudedHeight:i,height:n,vertexFormat:b.VertexFormat.POSITION_ONLY,shadowVolume:!0,arcType:e._arcType})},Object.defineProperties(P.prototype,{rectangle:{get:function(){var e;return Y.defined(this._rectangle)||(e=this._polygonHierarchy.positions,this._rectangle=f(e,this._ellipsoid,this._arcType,this._granularity)),this._rectangle}},textureCoordinateRotationPoints:{get:function(){return Y.defined(this._textureCoordinateRotationPoints)||(this._textureCoordinateRotationPoints=function(e){var t=-e._stRotation;if(0==t)return[0,0,0,1,1,0];var r=e._ellipsoid,o=e._polygonHierarchy.positions,a=e.rectangle;return K.Geometry._textureCoordinateRotationPoints(o,t,r,a)}(this)),this._textureCoordinateRotationPoints}}}),function(e,t){return Y.defined(t)&&(e=P.unpack(e,t)),e._ellipsoid=j.Ellipsoid.clone(e._ellipsoid),P.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createPolygonOutlineGeometry.js b/web/assets/Cesium/Workers/createPolygonOutlineGeometry.js new file mode 100644 index 00000000..e8caa88d --- /dev/null +++ b/web/assets/Cesium/Workers/createPolygonOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./GeometryInstance-11f9a3bd","./arrayRemoveDuplicates-ebc732b0","./EllipsoidTangentPlane-ed172748","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolygonGeometryLibrary-29b9a52e"],function(E,e,v,c,A,t,i,_,G,L,r,T,o,H,n,a,C,O,l,D,x,s,I,w){"use strict";var S=[],k=[];function f(e){var t,i=e.polygonHierarchy,r=E.defaultValue(e.ellipsoid,c.Ellipsoid.WGS84),o=E.defaultValue(e.granularity,v.CesiumMath.RADIANS_PER_DEGREE),n=E.defaultValue(e.perPositionHeight,!1),a=n&&E.defined(e.extrudedHeight),l=E.defaultValue(e.arcType,x.ArcType.GEODESIC),s=E.defaultValue(e.height,0),y=E.defaultValue(e.extrudedHeight,s);a||(t=Math.max(s,y),y=Math.min(s,y),s=t),this._ellipsoid=c.Ellipsoid.clone(r),this._granularity=o,this._height=s,this._extrudedHeight=y,this._arcType=l,this._polygonHierarchy=i,this._perPositionHeight=n,this._perPositionHeightExtrude=a,this._offsetAttribute=e.offsetAttribute,this._workerName="createPolygonOutlineGeometry",this.packedLength=w.PolygonGeometryLibrary.computeHierarchyPackedLength(i)+c.Ellipsoid.packedLength+8}f.pack=function(e,t,i){return i=E.defaultValue(i,0),i=w.PolygonGeometryLibrary.packPolygonHierarchy(e._polygonHierarchy,t,i),c.Ellipsoid.pack(e._ellipsoid,t,i),i+=c.Ellipsoid.packedLength,t[i++]=e._height,t[i++]=e._extrudedHeight,t[i++]=e._granularity,t[i++]=e._perPositionHeightExtrude?1:0,t[i++]=e._perPositionHeight?1:0,t[i++]=e._arcType,t[i++]=E.defaultValue(e._offsetAttribute,-1),t[i]=e.packedLength,t};var g=c.Ellipsoid.clone(c.Ellipsoid.UNIT_SPHERE),h={polygonHierarchy:{}};return f.unpack=function(e,t,i){t=E.defaultValue(t,0);var r=w.PolygonGeometryLibrary.unpackPolygonHierarchy(e,t);t=r.startingIndex,delete r.startingIndex;var o=c.Ellipsoid.unpack(e,t,g);t+=c.Ellipsoid.packedLength;var n=e[t++],a=e[t++],l=e[t++],s=1===e[t++],y=1===e[t++],u=e[t++],p=e[t++],d=e[t];return E.defined(i)||(i=new f(h)),i._polygonHierarchy=r,i._ellipsoid=c.Ellipsoid.clone(o,i._ellipsoid),i._height=n,i._extrudedHeight=a,i._granularity=l,i._perPositionHeight=y,i._perPositionHeightExtrude=s,i._arcType=u,i._offsetAttribute=-1===p?void 0:p,i.packedLength=d,i},f.fromPositions=function(e){return new f({polygonHierarchy:{positions:(e=E.defaultValue(e,E.defaultValue.EMPTY_OBJECT)).positions},height:e.height,extrudedHeight:e.extrudedHeight,ellipsoid:e.ellipsoid,granularity:e.granularity,perPositionHeight:e.perPositionHeight,arcType:e.arcType,offsetAttribute:e.offsetAttribute})},f.createGeometry=function(e){var t=e._ellipsoid,i=e._granularity,r=e._polygonHierarchy,o=e._perPositionHeight,n=e._arcType,a=w.PolygonGeometryLibrary.polygonOutlinesFromHierarchy(r,!o,t);if(0!==a.length){var l,s,y,u,p,d,c,f=[],g=v.CesiumMath.chordLength(i,t.maximumRadius),h=e._height,m=e._extrudedHeight;if(e._perPositionHeightExtrude||!v.CesiumMath.equalsEpsilon(h,m,0,v.CesiumMath.EPSILON2))for(l=0;l<a.length;l++){(u=function(e,t,i,r,o){var n,a=D.EllipsoidTangentPlane.fromPoints(t,e).projectPointsOntoPlane(t,S);I.PolygonPipeline.computeWindingOrder2D(a)===I.WindingOrder.CLOCKWISE&&(a.reverse(),t=t.slice().reverse());var l=t.length,s=new Array(l),y=0;if(r)for(n=new Float64Array(2*l*3*2),P=0;P<l;++P){s[P]=y/3;var u=t[P],p=t[(P+1)%l];n[y++]=u.x,n[y++]=u.y,n[y++]=u.z,n[y++]=p.x,n[y++]=p.y,n[y++]=p.z}else{var d,c=0;if(o===x.ArcType.GEODESIC)for(P=0;P<l;P++)c+=w.PolygonGeometryLibrary.subdivideLineCount(t[P],t[(P+1)%l],i);else if(o===x.ArcType.RHUMB)for(P=0;P<l;P++)c+=w.PolygonGeometryLibrary.subdivideRhumbLineCount(e,t[P],t[(P+1)%l],i);for(n=new Float64Array(3*c*2),P=0;P<l;++P){s[P]=y/3,o===x.ArcType.GEODESIC?d=w.PolygonGeometryLibrary.subdivideLine(t[P],t[(P+1)%l],i,k):o===x.ArcType.RHUMB&&(d=w.PolygonGeometryLibrary.subdivideRhumbLine(e,t[P],t[(P+1)%l],i,k));for(var f=d.length,g=0;g<f;++g)n[y++]=d[g]}}l=n.length/6;for(var h=s.length,m=2*(2*l+h),b=H.IndexDatatype.createTypedArray(l+h,m),y=0,P=0;P<l;++P)b[y++]=P,b[y++]=(P+1)%l,b[y++]=P+l,b[y++]=(P+1)%l+l;for(P=0;P<h;P++){var E=s[P];b[y++]=E,b[y++]=E+l}return new O.GeometryInstance({geometry:new G.Geometry({attributes:new L.GeometryAttributes({position:new G.GeometryAttribute({componentDatatype:_.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:n})}),indices:b,primitiveType:G.PrimitiveType.LINES})})}(t,a[l],g,o,n)).geometry=w.PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(u.geometry,h,m,t,o),E.defined(e._offsetAttribute)&&(s=u.geometry.attributes.position.values.length/3,y=new Uint8Array(s),y=e._offsetAttribute===C.GeometryOffsetAttribute.TOP?C.arrayFill(y,1,0,s/2):(c=e._offsetAttribute===C.GeometryOffsetAttribute.NONE?0:1,C.arrayFill(y,c)),u.geometry.attributes.applyOffset=new G.GeometryAttribute({componentDatatype:_.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:y})),f.push(u)}else for(l=0;l<a.length;l++){(u=function(e,t,i,r,o){var n,a=D.EllipsoidTangentPlane.fromPoints(t,e).projectPointsOntoPlane(t,S);I.PolygonPipeline.computeWindingOrder2D(a)===I.WindingOrder.CLOCKWISE&&(a.reverse(),t=t.slice().reverse());var l=t.length,s=0;if(r)for(n=new Float64Array(2*l*3),m=0;m<l;m++){var y=t[m],u=t[(m+1)%l];n[s++]=y.x,n[s++]=y.y,n[s++]=y.z,n[s++]=u.x,n[s++]=u.y,n[s++]=u.z}else{var p,d=0;if(o===x.ArcType.GEODESIC)for(m=0;m<l;m++)d+=w.PolygonGeometryLibrary.subdivideLineCount(t[m],t[(m+1)%l],i);else if(o===x.ArcType.RHUMB)for(m=0;m<l;m++)d+=w.PolygonGeometryLibrary.subdivideRhumbLineCount(e,t[m],t[(m+1)%l],i);for(n=new Float64Array(3*d),m=0;m<l;m++){o===x.ArcType.GEODESIC?p=w.PolygonGeometryLibrary.subdivideLine(t[m],t[(m+1)%l],i,k):o===x.ArcType.RHUMB&&(p=w.PolygonGeometryLibrary.subdivideRhumbLine(e,t[m],t[(m+1)%l],i,k));for(var c=p.length,f=0;f<c;++f)n[s++]=p[f]}}for(var g=2*(l=n.length/3),h=H.IndexDatatype.createTypedArray(l,g),s=0,m=0;m<l-1;m++)h[s++]=m,h[s++]=m+1;return h[s++]=l-1,h[s++]=0,new O.GeometryInstance({geometry:new G.Geometry({attributes:new L.GeometryAttributes({position:new G.GeometryAttribute({componentDatatype:_.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:n})}),indices:h,primitiveType:G.PrimitiveType.LINES})})}(t,a[l],g,o,n)).geometry.attributes.position.values=I.PolygonPipeline.scaleToGeodeticHeight(u.geometry.attributes.position.values,h,t,!o),E.defined(e._offsetAttribute)&&(p=u.geometry.attributes.position.values.length,d=new Uint8Array(p/3),c=e._offsetAttribute===C.GeometryOffsetAttribute.NONE?0:1,C.arrayFill(d,c),u.geometry.attributes.applyOffset=new G.GeometryAttribute({componentDatatype:_.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:d})),f.push(u)}var b=T.GeometryPipeline.combineInstances(f)[0],P=A.BoundingSphere.fromVertices(b.attributes.position.values);return new G.Geometry({attributes:b.attributes,indices:b.indices,primitiveType:b.primitiveType,boundingSphere:P,offsetAttribute:e._offsetAttribute})}},function(e,t){return E.defined(t)&&(e=f.unpack(e,t)),e._ellipsoid=c.Ellipsoid.clone(e._ellipsoid),f.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createPolylineGeometry.js b/web/assets/Cesium/Workers/createPolylineGeometry.js new file mode 100644 index 00000000..f69abf4e --- /dev/null +++ b/web/assets/Cesium/Workers/createPolylineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./VertexFormat-7572c785","./arrayRemoveDuplicates-ebc732b0","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f","./Color-bc1ab1f9"],function(J,e,j,K,Q,t,r,X,Z,$,ee,a,o,y,te,re,n,i,ae,oe){"use strict";var ne=[];function m(e){var t=(e=J.defaultValue(e,J.defaultValue.EMPTY_OBJECT)).positions,r=e.colors,a=J.defaultValue(e.width,1),o=J.defaultValue(e.colorsPerVertex,!1);this._positions=t,this._colors=r,this._width=a,this._colorsPerVertex=o,this._vertexFormat=y.VertexFormat.clone(J.defaultValue(e.vertexFormat,y.VertexFormat.DEFAULT)),this._arcType=J.defaultValue(e.arcType,re.ArcType.GEODESIC),this._granularity=J.defaultValue(e.granularity,j.CesiumMath.RADIANS_PER_DEGREE),this._ellipsoid=K.Ellipsoid.clone(J.defaultValue(e.ellipsoid,K.Ellipsoid.WGS84)),this._workerName="createPolylineGeometry";var n=1+t.length*K.Cartesian3.packedLength;n+=J.defined(r)?1+r.length*oe.Color.packedLength:1,this.packedLength=n+K.Ellipsoid.packedLength+y.VertexFormat.packedLength+4}m.pack=function(e,t,r){var a;r=J.defaultValue(r,0);var o=e._positions,n=o.length;for(t[r++]=n,a=0;a<n;++a,r+=K.Cartesian3.packedLength)K.Cartesian3.pack(o[a],t,r);var i=e._colors,n=J.defined(i)?i.length:0;for(t[r++]=n,a=0;a<n;++a,r+=oe.Color.packedLength)oe.Color.pack(i[a],t,r);return K.Ellipsoid.pack(e._ellipsoid,t,r),r+=K.Ellipsoid.packedLength,y.VertexFormat.pack(e._vertexFormat,t,r),r+=y.VertexFormat.packedLength,t[r++]=e._width,t[r++]=e._colorsPerVertex?1:0,t[r++]=e._arcType,t[r]=e._granularity,t};var f=K.Ellipsoid.clone(K.Ellipsoid.UNIT_SPHERE),h=new y.VertexFormat,v={positions:void 0,colors:void 0,ellipsoid:f,vertexFormat:h,width:void 0,colorsPerVertex:void 0,arcType:void 0,granularity:void 0};m.unpack=function(e,t,r){t=J.defaultValue(t,0);for(var a=e[t++],o=new Array(a),n=0;n<a;++n,t+=K.Cartesian3.packedLength)o[n]=K.Cartesian3.unpack(e,t);var i=0<(a=e[t++])?new Array(a):void 0;for(n=0;n<a;++n,t+=oe.Color.packedLength)i[n]=oe.Color.unpack(e,t);var l=K.Ellipsoid.unpack(e,t,f);t+=K.Ellipsoid.packedLength;var s=y.VertexFormat.unpack(e,t,h);t+=y.VertexFormat.packedLength;var p=e[t++],c=1===e[t++],d=e[t++],u=e[t];return J.defined(r)?(r._positions=o,r._colors=i,r._ellipsoid=K.Ellipsoid.clone(l,r._ellipsoid),r._vertexFormat=y.VertexFormat.clone(s,r._vertexFormat),r._width=p,r._colorsPerVertex=c,r._arcType=d,r._granularity=u,r):(v.positions=o,v.colors=i,v.width=p,v.colorsPerVertex=c,v.arcType=d,v.granularity=u,new m(v))};var ie=new K.Cartesian3,le=new K.Cartesian3,se=new K.Cartesian3,pe=new K.Cartesian3;return m.createGeometry=function(e){var t=e._width,r=e._vertexFormat,a=e._colors,o=e._colorsPerVertex,n=e._arcType,i=e._granularity,l=e._ellipsoid,s=te.arrayRemoveDuplicates(e._positions,K.Cartesian3.equalsEpsilon),p=s.length;if(!(p<2||t<=0)){if(n===re.ArcType.GEODESIC||n===re.ArcType.RHUMB){var c,d=n===re.ArcType.GEODESIC?(c=j.CesiumMath.chordLength(i,l.maximumRadius),ae.PolylinePipeline.numberOfPoints):(c=i,ae.PolylinePipeline.numberOfPointsRhumbLine),u=ae.PolylinePipeline.extractHeights(s,l);if(J.defined(a)){for(var y=1,m=0;m<p-1;++m)y+=d(s[m],s[m+1],c);var f=new Array(y),h=0;for(m=0;m<p-1;++m){var v=s[m],C=s[m+1],g=a[m],_=d(v,C,c);if(o&&m<y)for(var A=function(e,t,r){var a=ne;a.length=r;var o=e.red,n=e.green,i=e.blue,l=e.alpha,s=t.red,p=t.green,c=t.blue,d=t.alpha;if(oe.Color.equals(e,t)){for(h=0;h<r;h++)a[h]=oe.Color.clone(e);return a}for(var u=(s-o)/r,y=(p-n)/r,m=(c-i)/r,f=(d-l)/r,h=0;h<r;h++)a[h]=new oe.Color(o+h*u,n+h*y,i+h*m,l+h*f);return a}(g,a[m+1],_),b=A.length,E=0;E<b;++E)f[h++]=A[E];else for(E=0;E<_;++E)f[h++]=oe.Color.clone(g)}f[h]=oe.Color.clone(a[a.length-1]),a=f,ne.length=0}s=n===re.ArcType.GEODESIC?ae.PolylinePipeline.generateCartesianArc({positions:s,minDistance:c,ellipsoid:l,height:u}):ae.PolylinePipeline.generateCartesianRhumbArc({positions:s,granularity:c,ellipsoid:l,height:u})}var P,w,T,x=4*(p=s.length)-4,k=new Float64Array(3*x),D=new Float64Array(3*x),V=new Float64Array(3*x),L=new Float32Array(2*x),F=r.st?new Float32Array(2*x):void 0,G=J.defined(a)?new Uint8Array(4*x):void 0,O=0,R=0,I=0,S=0;for(E=0;E<p;++E){0===E?(P=ie,K.Cartesian3.subtract(s[0],s[1],P),K.Cartesian3.add(s[0],P,P)):P=s[E-1],K.Cartesian3.clone(P,se),K.Cartesian3.clone(s[E],le),E===p-1?(P=ie,K.Cartesian3.subtract(s[p-1],s[p-2],P),K.Cartesian3.add(s[p-1],P,P)):P=s[E+1],K.Cartesian3.clone(P,pe),J.defined(G)&&(w=0===E||o?a[E]:a[E-1],E!==p-1&&(T=a[E]));for(var B=E===p-1?2:4,U=0===E?2:0;U<B;++U){K.Cartesian3.pack(le,k,O),K.Cartesian3.pack(se,D,O),K.Cartesian3.pack(pe,V,O),O+=3;var N,M=U-2<0?-1:1;L[R++]=U%2*2-1,L[R++]=M*t,r.st&&(F[I++]=E/(p-1),F[I++]=Math.max(L[R-2],0)),J.defined(G)&&(N=U<2?w:T,G[S++]=oe.Color.floatToByte(N.red),G[S++]=oe.Color.floatToByte(N.green),G[S++]=oe.Color.floatToByte(N.blue),G[S++]=oe.Color.floatToByte(N.alpha))}}var H=new $.GeometryAttributes;H.position=new Z.GeometryAttribute({componentDatatype:X.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:k}),H.prevPosition=new Z.GeometryAttribute({componentDatatype:X.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:D}),H.nextPosition=new Z.GeometryAttribute({componentDatatype:X.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:V}),H.expandAndWidth=new Z.GeometryAttribute({componentDatatype:X.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:L}),r.st&&(H.st=new Z.GeometryAttribute({componentDatatype:X.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:F})),J.defined(G)&&(H.color=new Z.GeometryAttribute({componentDatatype:X.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:4,values:G,normalize:!0}));var W=ee.IndexDatatype.createTypedArray(x,6*p-6),Y=0,q=0,z=p-1;for(E=0;E<z;++E)W[q++]=Y,W[q++]=Y+2,W[q++]=Y+1,W[q++]=Y+1,W[q++]=Y+2,W[q++]=Y+3,Y+=4;return new Z.Geometry({attributes:H,indices:W,primitiveType:Z.PrimitiveType.TRIANGLES,boundingSphere:Q.BoundingSphere.fromPoints(s),geometryType:Z.GeometryType.POLYLINES})}},function(e,t){return J.defined(t)&&(e=m.unpack(e,t)),e._ellipsoid=K.Ellipsoid.clone(e._ellipsoid),m.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createPolylineVolumeGeometry.js b/web/assets/Cesium/Workers/createPolylineVolumeGeometry.js new file mode 100644 index 00000000..3020a93b --- /dev/null +++ b/web/assets/Cesium/Workers/createPolylineVolumeGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./VertexFormat-7572c785","./arrayRemoveDuplicates-ebc732b0","./BoundingRectangle-8de79d83","./EllipsoidTangentPlane-ed172748","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolylineVolumeGeometryLibrary-ec7dce94","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f"],function(c,e,i,u,G,t,n,A,R,D,r,I,a,O,o,l,g,s,p,d,y,S,m,h,f){"use strict";var v={};function B(e,t){c.defined(v[e])||(v[e]=!0,console.warn(c.defaultValue(t,e)))}function b(e){var t=(e=c.defaultValue(e,c.defaultValue.EMPTY_OBJECT)).polylinePositions,n=e.shapePositions;this._positions=t,this._shape=n,this._ellipsoid=u.Ellipsoid.clone(c.defaultValue(e.ellipsoid,u.Ellipsoid.WGS84)),this._cornerType=c.defaultValue(e.cornerType,m.CornerType.ROUNDED),this._vertexFormat=g.VertexFormat.clone(c.defaultValue(e.vertexFormat,g.VertexFormat.DEFAULT)),this._granularity=c.defaultValue(e.granularity,i.CesiumMath.RADIANS_PER_DEGREE),this._workerName="createPolylineVolumeGeometry";var r=1+t.length*u.Cartesian3.packedLength;r+=1+n.length*u.Cartesian2.packedLength,this.packedLength=r+u.Ellipsoid.packedLength+g.VertexFormat.packedLength+2}B.geometryOutlines="Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0.",B.geometryZIndex="Entity geometry with zIndex are unsupported when height or extrudedHeight are defined. zIndex will be ignored",B.geometryHeightReference="Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height. heightReference will be ignored",B.geometryExtrudedHeightReference="Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight. extrudedHeightReference will be ignored",b.pack=function(e,t,n){var r;n=c.defaultValue(n,0);var i=e._positions,a=i.length;for(t[n++]=a,r=0;r<a;++r,n+=u.Cartesian3.packedLength)u.Cartesian3.pack(i[r],t,n);var o=e._shape,a=o.length;for(t[n++]=a,r=0;r<a;++r,n+=u.Cartesian2.packedLength)u.Cartesian2.pack(o[r],t,n);return u.Ellipsoid.pack(e._ellipsoid,t,n),n+=u.Ellipsoid.packedLength,g.VertexFormat.pack(e._vertexFormat,t,n),n+=g.VertexFormat.packedLength,t[n++]=e._cornerType,t[n]=e._granularity,t};var E=u.Ellipsoid.clone(u.Ellipsoid.UNIT_SPHERE),P=new g.VertexFormat,_={polylinePositions:void 0,shapePositions:void 0,ellipsoid:E,vertexFormat:P,cornerType:void 0,granularity:void 0};b.unpack=function(e,t,n){t=c.defaultValue(t,0);for(var r=e[t++],i=new Array(r),a=0;a<r;++a,t+=u.Cartesian3.packedLength)i[a]=u.Cartesian3.unpack(e,t);r=e[t++];var o=new Array(r);for(a=0;a<r;++a,t+=u.Cartesian2.packedLength)o[a]=u.Cartesian2.unpack(e,t);var l=u.Ellipsoid.unpack(e,t,E);t+=u.Ellipsoid.packedLength;var s=g.VertexFormat.unpack(e,t,P);t+=g.VertexFormat.packedLength;var p=e[t++],d=e[t];return c.defined(n)?(n._positions=i,n._shape=o,n._ellipsoid=u.Ellipsoid.clone(l,n._ellipsoid),n._vertexFormat=g.VertexFormat.clone(s,n._vertexFormat),n._cornerType=p,n._granularity=d,n):(_.polylinePositions=i,_.shapePositions=o,_.cornerType=p,_.granularity=d,new b(_))};var x=new p.BoundingRectangle;return b.createGeometry=function(e){var t=e._positions,n=s.arrayRemoveDuplicates(t,u.Cartesian3.equalsEpsilon),r=e._shape,r=m.PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(r);if(!(n.length<2||r.length<3)){S.PolygonPipeline.computeWindingOrder2D(r)===S.WindingOrder.CLOCKWISE&&r.reverse();var i=p.BoundingRectangle.fromPoints(r,x);return function(e,t,n,r){var i=new D.GeometryAttributes;r.position&&(i.position=new R.GeometryAttribute({componentDatatype:A.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:e}));var a,o,l,s,p,d=t.length,c=e.length/3,u=(c-2*d)/(2*d),g=S.PolygonPipeline.triangulate(t),y=(u-1)*d*6+2*g.length,m=O.IndexDatatype.createTypedArray(c,y),h=2*d,f=0;for(C=0;C<u-1;C++){for(a=0;a<d-1;a++)p=(o=2*a+C*d*2)+h,s=(l=o+1)+h,m[f++]=l,m[f++]=o,m[f++]=s,m[f++]=s,m[f++]=o,m[f++]=p;s=(l=(o=2*d-2+C*d*2)+1)+h,p=o+h,m[f++]=l,m[f++]=o,m[f++]=s,m[f++]=s,m[f++]=o,m[f++]=p}if(r.st||r.tangent||r.bitangent){for(var v,b,E=new Float32Array(2*c),P=1/(u-1),_=1/n.height,x=n.height/2,k=0,C=0;C<u;C++){for(v=C*P,b=_*(t[0].y+x),E[k++]=v,E[k++]=b,a=1;a<d;a++)b=_*(t[a].y+x),E[k++]=v,E[k++]=b,E[k++]=v,E[k++]=b;b=_*(t[0].y+x),E[k++]=v,E[k++]=b}for(a=0;a<d;a++)v=0,b=_*(t[a].y+x),E[k++]=v,E[k++]=b;for(a=0;a<d;a++)v=(u-1)*P,b=_*(t[a].y+x),E[k++]=v,E[k++]=b;i.st=new R.GeometryAttribute({componentDatatype:A.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:new Float32Array(E)})}var V=c-2*d;for(C=0;C<g.length;C+=3){var L=g[C]+V,w=g[C+1]+V,F=g[C+2]+V;m[f++]=L,m[f++]=w,m[f++]=F,m[f++]=F+d,m[f++]=w+d,m[f++]=L+d}var T=new R.Geometry({attributes:i,indices:m,boundingSphere:G.BoundingSphere.fromVertices(e),primitiveType:R.PrimitiveType.TRIANGLES});if(r.normal&&(T=I.GeometryPipeline.computeNormal(T)),r.tangent||r.bitangent){try{T=I.GeometryPipeline.computeTangentAndBitangent(T)}catch(e){B("polyline-volume-tangent-bitangent","Unable to compute tangents and bitangents for polyline volume geometry")}r.tangent||(T.attributes.tangent=void 0),r.bitangent||(T.attributes.bitangent=void 0),r.st||(T.attributes.st=void 0)}return T}(m.PolylineVolumeGeometryLibrary.computePositions(n,r,i,e,!0),r,i,e._vertexFormat)}},function(e,t){return c.defined(t)&&(e=b.unpack(e,t)),e._ellipsoid=u.Ellipsoid.clone(e._ellipsoid),b.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createPolylineVolumeOutlineGeometry.js b/web/assets/Cesium/Workers/createPolylineVolumeOutlineGeometry.js new file mode 100644 index 00000000..eb9a04f1 --- /dev/null +++ b/web/assets/Cesium/Workers/createPolylineVolumeOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./arrayRemoveDuplicates-ebc732b0","./BoundingRectangle-8de79d83","./EllipsoidTangentPlane-ed172748","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./PolylineVolumeGeometryLibrary-ec7dce94","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f"],function(c,e,a,d,y,i,n,f,h,g,m,t,r,o,l,s,p,u,v,E,P){"use strict";function _(e){var i=(e=c.defaultValue(e,c.defaultValue.EMPTY_OBJECT)).polylinePositions,n=e.shapePositions;this._positions=i,this._shape=n,this._ellipsoid=d.Ellipsoid.clone(c.defaultValue(e.ellipsoid,d.Ellipsoid.WGS84)),this._cornerType=c.defaultValue(e.cornerType,v.CornerType.ROUNDED),this._granularity=c.defaultValue(e.granularity,a.CesiumMath.RADIANS_PER_DEGREE),this._workerName="createPolylineVolumeOutlineGeometry";var t=1+i.length*d.Cartesian3.packedLength;t+=1+n.length*d.Cartesian2.packedLength,this.packedLength=t+d.Ellipsoid.packedLength+2}_.pack=function(e,i,n){var t;n=c.defaultValue(n,0);var a=e._positions,r=a.length;for(i[n++]=r,t=0;t<r;++t,n+=d.Cartesian3.packedLength)d.Cartesian3.pack(a[t],i,n);var o=e._shape,r=o.length;for(i[n++]=r,t=0;t<r;++t,n+=d.Cartesian2.packedLength)d.Cartesian2.pack(o[t],i,n);return d.Ellipsoid.pack(e._ellipsoid,i,n),n+=d.Ellipsoid.packedLength,i[n++]=e._cornerType,i[n]=e._granularity,i};var b=d.Ellipsoid.clone(d.Ellipsoid.UNIT_SPHERE),k={polylinePositions:void 0,shapePositions:void 0,ellipsoid:b,height:void 0,cornerType:void 0,granularity:void 0};_.unpack=function(e,i,n){i=c.defaultValue(i,0);for(var t=e[i++],a=new Array(t),r=0;r<t;++r,i+=d.Cartesian3.packedLength)a[r]=d.Cartesian3.unpack(e,i);t=e[i++];var o=new Array(t);for(r=0;r<t;++r,i+=d.Cartesian2.packedLength)o[r]=d.Cartesian2.unpack(e,i);var l=d.Ellipsoid.unpack(e,i,b);i+=d.Ellipsoid.packedLength;var s=e[i++],p=e[i];return c.defined(n)?(n._positions=a,n._shape=o,n._ellipsoid=d.Ellipsoid.clone(l,n._ellipsoid),n._cornerType=s,n._granularity=p,n):(k.polylinePositions=a,k.shapePositions=o,k.cornerType=s,k.granularity=p,new _(k))};var C=new l.BoundingRectangle;return _.createGeometry=function(e){var i=e._positions,n=o.arrayRemoveDuplicates(i,d.Cartesian3.equalsEpsilon),t=e._shape,t=v.PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(t);if(!(n.length<2||t.length<3)){u.PolygonPipeline.computeWindingOrder2D(t)===u.WindingOrder.CLOCKWISE&&t.reverse();var a=l.BoundingRectangle.fromPoints(t,C);return function(e,i){var n=new g.GeometryAttributes;n.position=new h.GeometryAttribute({componentDatatype:f.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:e});var t=i.length,a=n.position.values.length/3,r=e.length/3/t,o=m.IndexDatatype.createTypedArray(a,2*t*(1+r)),l=0,s=0,p=s*t;for(u=0;u<t-1;u++)o[l++]=u+p,o[l++]=u+p+1;for(o[l++]=t-1+p,o[l++]=p,p=(s=r-1)*t,u=0;u<t-1;u++)o[l++]=u+p,o[l++]=u+p+1;for(o[l++]=t-1+p,o[l++]=p,s=0;s<r-1;s++)for(var c=t*s,d=c+t,u=0;u<t;u++)o[l++]=u+c,o[l++]=u+d;return new h.Geometry({attributes:n,indices:m.IndexDatatype.createTypedArray(a,o),boundingSphere:y.BoundingSphere.fromVertices(e),primitiveType:h.PrimitiveType.LINES})}(v.PolylineVolumeGeometryLibrary.computePositions(n,t,a,e,!1),t)}},function(e,i){return c.defined(i)&&(e=_.unpack(e,i)),e._ellipsoid=d.Ellipsoid.clone(e._ellipsoid),_.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createRectangleGeometry.js b/web/assets/Cesium/Workers/createRectangleGeometry.js new file mode 100644 index 00000000..8eef3a61 --- /dev/null +++ b/web/assets/Cesium/Workers/createRectangleGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./AttributeCompression-9fc99391","./GeometryPipeline-b49b2e59","./EncodedCartesian3-e9c71cf0","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./GeometryInstance-11f9a3bd","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./RectangleGeometryLibrary-341b00f2"],function(mt,t,pt,dt,k,e,a,gt,yt,r,n,ft,i,ht,o,s,bt,vt,_t,l,At,H){"use strict";var xt=new dt.Cartesian3,wt=new dt.Cartesian3,Ct=new dt.Cartesian3,Rt=new dt.Cartesian3,_=new dt.Rectangle,z=new dt.Cartesian2,A=new k.BoundingSphere,x=new k.BoundingSphere;function Et(t,e){var a=new yt.Geometry({attributes:new r.GeometryAttributes,primitiveType:yt.PrimitiveType.TRIANGLES});return a.attributes.position=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:e.positions}),t.normal&&(a.attributes.normal=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:e.normals})),t.tangent&&(a.attributes.tangent=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:e.tangents})),t.bitangent&&(a.attributes.bitangent=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:e.bitangents})),a}var Ft=new dt.Cartesian3,Gt=new dt.Cartesian3;function Pt(t,e){var a=t._vertexFormat,r=t._ellipsoid,n=e.height,i=e.width,o=e.northCap,s=e.southCap,l=0,u=n,c=n,m=0;o&&(--c,m+=l=1),s&&(--u,--c,m+=1),m+=i*c;for(var p=a.position?new Float64Array(3*m):void 0,d=a.st?new Float32Array(2*m):void 0,g=0,y=0,f=xt,h=z,b=Number.MAX_VALUE,v=Number.MAX_VALUE,_=-Number.MAX_VALUE,A=-Number.MAX_VALUE,x=l;x<u;++x)for(var w=0;w<i;++w)H.RectangleGeometryLibrary.computePosition(e,r,a.st,x,w,f,h),p[g++]=f.x,p[g++]=f.y,p[g++]=f.z,a.st&&(d[y++]=h.x,d[y++]=h.y,b=Math.min(b,h.x),v=Math.min(v,h.y),_=Math.max(_,h.x),A=Math.max(A,h.y));if(o&&(H.RectangleGeometryLibrary.computePosition(e,r,a.st,0,0,f,h),p[g++]=f.x,p[g++]=f.y,p[g++]=f.z,a.st&&(d[y++]=h.x,d[y++]=h.y,b=h.x,v=h.y,_=h.x,A=h.y)),s&&(H.RectangleGeometryLibrary.computePosition(e,r,a.st,n-1,0,f,h),p[g++]=f.x,p[g++]=f.y,p[g]=f.z,a.st&&(d[y++]=h.x,d[y]=h.y,b=Math.min(b,h.x),v=Math.min(v,h.y),_=Math.max(_,h.x),A=Math.max(A,h.y))),a.st&&(b<0||v<0||1<_||1<A))for(var C=0;C<d.length;C+=2)d[C]=(d[C]-b)/(_-b),d[C+1]=(d[C+1]-v)/(A-v);var R=function(t,e,a,r){var n=t.length,i=e.normal?new Float32Array(n):void 0,o=e.tangent?new Float32Array(n):void 0,s=e.bitangent?new Float32Array(n):void 0,l=0,u=Rt,c=Ct,m=wt;if(e.normal||e.tangent||e.bitangent)for(var p=0;p<n;p+=3){var d=dt.Cartesian3.fromArray(t,p,xt),g=l+1,y=l+2,m=a.geodeticSurfaceNormal(d,m);(e.tangent||e.bitangent)&&(dt.Cartesian3.cross(dt.Cartesian3.UNIT_Z,m,c),k.Matrix3.multiplyByVector(r,c,c),dt.Cartesian3.normalize(c,c),e.bitangent&&dt.Cartesian3.normalize(dt.Cartesian3.cross(m,c,u),u)),e.normal&&(i[l]=m.x,i[g]=m.y,i[y]=m.z),e.tangent&&(o[l]=c.x,o[g]=c.y,o[y]=c.z),e.bitangent&&(s[l]=u.x,s[g]=u.y,s[y]=u.z),l+=3}return Et(e,{positions:t,normals:i,tangents:o,bitangents:s})}(p,a,r,e.tangentRotationMatrix),E=6*(i-1)*(c-1);o&&(E+=3*(i-1)),s&&(E+=3*(i-1));for(var F=ht.IndexDatatype.createTypedArray(m,E),G=0,P=0,V=0;V<c-1;++V){for(var L=0;L<i-1;++L){var D=G+i,M=D+1,T=G+1;F[P++]=G,F[P++]=D,F[P++]=T,F[P++]=T,F[P++]=D,F[P++]=M,++G}++G}if(o||s){var O,N,S=m-1,I=m-1;if(o&&s&&(S=m-2),G=0,o)for(V=0;V<i-1;V++)N=(O=G)+1,F[P++]=S,F[P++]=O,F[P++]=N,++G;if(s)for(G=(c-1)*i,V=0;V<i-1;V++)N=(O=G)+1,F[P++]=O,F[P++]=I,F[P++]=N,++G}return R.indices=F,a.st&&(R.attributes.st=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:d})),R}function Vt(t,e,a,r,n){return t[e++]=r[a],t[e++]=r[a+1],t[e++]=r[a+2],t[e++]=n[a],t[e++]=n[a+1],t[e]=n[a+2],t}function Lt(t,e,a,r){return t[e++]=r[a],t[e++]=r[a+1],t[e++]=r[a],t[e]=r[a+1],t}var Dt=new vt.VertexFormat;function w(t,e){var a,r=t._shadowVolume,n=t._offsetAttribute,i=t._vertexFormat,o=t._extrudedHeight,s=t._surfaceHeight,l=t._ellipsoid,u=e.height,c=e.width;r&&((a=vt.VertexFormat.clone(i,Dt)).normal=!0,t._vertexFormat=a);var m=Pt(t,e);r&&(t._vertexFormat=i);var p=At.PolygonPipeline.scaleToGeodeticHeight(m.attributes.position.values,s,l,!1),d=2*(st=(p=new Float64Array(p)).length),g=new Float64Array(d);g.set(p);var y=At.PolygonPipeline.scaleToGeodeticHeight(m.attributes.position.values,o,l);g.set(y,st),m.attributes.position.values=g;var f,h,b,v=i.normal?new Float32Array(d):void 0,_=i.tangent?new Float32Array(d):void 0,A=i.bitangent?new Float32Array(d):void 0,x=i.st?new Float32Array(d/3*2):void 0;if(i.normal){for(h=m.attributes.normal.values,v.set(h),C=0;C<st;C++)h[C]=-h[C];v.set(h,st),m.attributes.normal.values=v}if(r){h=m.attributes.normal.values,i.normal||(m.attributes.normal=void 0);for(var w=new Float32Array(d),C=0;C<st;C++)h[C]=-h[C];w.set(h,st),m.attributes.extrudeDirection=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:w})}var R,E,F,G=mt.defined(n);if(G&&(R=st/3*2,E=new Uint8Array(R),E=n===bt.GeometryOffsetAttribute.TOP?bt.arrayFill(E,1,0,R/2):(b=n===bt.GeometryOffsetAttribute.NONE?0:1,bt.arrayFill(E,b)),m.attributes.applyOffset=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:E})),i.tangent){var P=m.attributes.tangent.values;for(_.set(P),C=0;C<st;C++)P[C]=-P[C];_.set(P,st),m.attributes.tangent.values=_}i.bitangent&&(F=m.attributes.bitangent.values,A.set(F),A.set(F,st),m.attributes.bitangent.values=A),i.st&&(f=m.attributes.st.values,x.set(f),x.set(f,st/3*2),m.attributes.st.values=x);var V=m.indices,L=V.length,D=st/3,M=ht.IndexDatatype.createTypedArray(d/3,2*L);for(M.set(V),C=0;C<L;C+=3)M[C+L]=V[C+2]+D,M[C+1+L]=V[C+1]+D,M[C+2+L]=V[C]+D;m.indices=M;var T=e.northCap,O=e.southCap,N=u,S=2,I=0,k=4,H=4;T&&(--S,--N,I+=1,k-=2,--H),O&&(--S,--N,I+=1,k-=2,--H);var z=2*((I+=S*c+2*N-k)+H),B=new Float64Array(3*z),U=r?new Float32Array(3*z):void 0,Y=G?new Uint8Array(z):void 0,q=i.st?new Float32Array(2*z):void 0,X=n===bt.GeometryOffsetAttribute.TOP;G&&!X&&(b=n===bt.GeometryOffsetAttribute.ALL?1:0,Y=bt.arrayFill(Y,b));var Q=0,W=0,J=0,j=0,Z=c*N;for(C=0;C<Z;C+=c)B=Vt(B,Q,$=3*C,p,y),Q+=6,i.st&&(q=Lt(q,W,2*C,f),W+=4),r&&(J+=3,U[J++]=h[$],U[J++]=h[$+1],U[J++]=h[$+2]),X&&(Y[j++]=1,j+=1);if(O){var K=T?1+Z:Z,$=3*K;for(C=0;C<2;C++)B=Vt(B,Q,$,p,y),Q+=6,i.st&&(q=Lt(q,W,2*K,f),W+=4),r&&(J+=3,U[J++]=h[$],U[J++]=h[$+1],U[J++]=h[$+2]),X&&(Y[j++]=1,j+=1)}else for(C=Z-c;C<Z;C++)B=Vt(B,Q,$=3*C,p,y),Q+=6,i.st&&(q=Lt(q,W,2*C,f),W+=4),r&&(J+=3,U[J++]=h[$],U[J++]=h[$+1],U[J++]=h[$+2]),X&&(Y[j++]=1,j+=1);for(C=Z-1;0<C;C-=c)B=Vt(B,Q,$=3*C,p,y),Q+=6,i.st&&(q=Lt(q,W,2*C,f),W+=4),r&&(J+=3,U[J++]=h[$],U[J++]=h[$+1],U[J++]=h[$+2]),X&&(Y[j++]=1,j+=1);if(T){var tt=Z;for($=3*tt,C=0;C<2;C++)B=Vt(B,Q,$,p,y),Q+=6,i.st&&(q=Lt(q,W,2*tt,f),W+=4),r&&(J+=3,U[J++]=h[$],U[J++]=h[$+1],U[J++]=h[$+2]),X&&(Y[j++]=1,j+=1)}else for(C=c-1;0<=C;C--)B=Vt(B,Q,$=3*C,p,y),Q+=6,i.st&&(q=Lt(q,W,2*C,f),W+=4),r&&(J+=3,U[J++]=h[$],U[J++]=h[$+1],U[J++]=h[$+2]),X&&(Y[j++]=1,j+=1);var et=function(t,e,a){var r=t.length,n=e.normal?new Float32Array(r):void 0,i=e.tangent?new Float32Array(r):void 0,o=e.bitangent?new Float32Array(r):void 0,s=0,l=0,u=0,c=!0,m=Rt,p=Ct,d=wt;if(e.normal||e.tangent||e.bitangent)for(var g=0;g<r;g+=6){var y,f=dt.Cartesian3.fromArray(t,g,xt),h=dt.Cartesian3.fromArray(t,(g+6)%r,Ft);c&&(y=dt.Cartesian3.fromArray(t,(g+3)%r,Gt),dt.Cartesian3.subtract(h,f,h),dt.Cartesian3.subtract(y,f,y),d=dt.Cartesian3.normalize(dt.Cartesian3.cross(y,h,d),d),c=!1),dt.Cartesian3.equalsEpsilon(h,f,pt.CesiumMath.EPSILON10)&&(c=!0),(e.tangent||e.bitangent)&&(m=a.geodeticSurfaceNormal(f,m),e.tangent&&(p=dt.Cartesian3.normalize(dt.Cartesian3.cross(m,d,p),p))),e.normal&&(n[s++]=d.x,n[s++]=d.y,n[s++]=d.z,n[s++]=d.x,n[s++]=d.y,n[s++]=d.z),e.tangent&&(i[l++]=p.x,i[l++]=p.y,i[l++]=p.z,i[l++]=p.x,i[l++]=p.y,i[l++]=p.z),e.bitangent&&(o[u++]=m.x,o[u++]=m.y,o[u++]=m.z,o[u++]=m.x,o[u++]=m.y,o[u++]=m.z)}return Et(e,{positions:t,normals:n,tangents:i,bitangents:o})}(B,i,l);i.st&&(et.attributes.st=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:q})),r&&(et.attributes.extrudeDirection=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:U})),G&&(et.attributes.applyOffset=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:Y}));var at,rt,nt,it,ot=ht.IndexDatatype.createTypedArray(z,6*I),st=B.length/3,lt=0;for(C=0;C<st-1;C+=2){it=((at=C)+2)%st;var ut=dt.Cartesian3.fromArray(B,3*at,Ft),ct=dt.Cartesian3.fromArray(B,3*it,Gt);dt.Cartesian3.equalsEpsilon(ut,ct,pt.CesiumMath.EPSILON10)||(nt=(2+(rt=(at+1)%st))%st,ot[lt++]=at,ot[lt++]=rt,ot[lt++]=it,ot[lt++]=it,ot[lt++]=rt,ot[lt++]=nt)}return et.indices=ot,(et=ft.GeometryPipeline.combineInstances([new _t.GeometryInstance({geometry:m}),new _t.GeometryInstance({geometry:et})]))[0]}var u=[new dt.Cartesian3,new dt.Cartesian3,new dt.Cartesian3,new dt.Cartesian3],C=new dt.Cartographic,R=new dt.Cartographic;function y(t,e,a,r,n){if(0===a)return dt.Rectangle.clone(t,n);var i=H.RectangleGeometryLibrary.computeOptions(t,e,a,0,_,C),o=i.height,s=i.width,l=u;return H.RectangleGeometryLibrary.computePosition(i,r,!1,0,0,l[0]),H.RectangleGeometryLibrary.computePosition(i,r,!1,0,s-1,l[1]),H.RectangleGeometryLibrary.computePosition(i,r,!1,o-1,0,l[2]),H.RectangleGeometryLibrary.computePosition(i,r,!1,o-1,s-1,l[3]),dt.Rectangle.fromCartesianArray(l,r,n)}function d(t){var e=(t=mt.defaultValue(t,mt.defaultValue.EMPTY_OBJECT)).rectangle,a=mt.defaultValue(t.height,0),r=mt.defaultValue(t.extrudedHeight,a);this._rectangle=dt.Rectangle.clone(e),this._granularity=mt.defaultValue(t.granularity,pt.CesiumMath.RADIANS_PER_DEGREE),this._ellipsoid=dt.Ellipsoid.clone(mt.defaultValue(t.ellipsoid,dt.Ellipsoid.WGS84)),this._surfaceHeight=Math.max(a,r),this._rotation=mt.defaultValue(t.rotation,0),this._stRotation=mt.defaultValue(t.stRotation,0),this._vertexFormat=vt.VertexFormat.clone(mt.defaultValue(t.vertexFormat,vt.VertexFormat.DEFAULT)),this._extrudedHeight=Math.min(a,r),this._shadowVolume=mt.defaultValue(t.shadowVolume,!1),this._workerName="createRectangleGeometry",this._offsetAttribute=t.offsetAttribute,this._rotatedRectangle=void 0,this._textureCoordinateRotationPoints=void 0}d.packedLength=dt.Rectangle.packedLength+dt.Ellipsoid.packedLength+vt.VertexFormat.packedLength+7,d.pack=function(t,e,a){return a=mt.defaultValue(a,0),dt.Rectangle.pack(t._rectangle,e,a),a+=dt.Rectangle.packedLength,dt.Ellipsoid.pack(t._ellipsoid,e,a),a+=dt.Ellipsoid.packedLength,vt.VertexFormat.pack(t._vertexFormat,e,a),a+=vt.VertexFormat.packedLength,e[a++]=t._granularity,e[a++]=t._surfaceHeight,e[a++]=t._rotation,e[a++]=t._stRotation,e[a++]=t._extrudedHeight,e[a++]=t._shadowVolume?1:0,e[a]=mt.defaultValue(t._offsetAttribute,-1),e};var g=new dt.Rectangle,f=dt.Ellipsoid.clone(dt.Ellipsoid.UNIT_SPHERE),h={rectangle:g,ellipsoid:f,vertexFormat:Dt,granularity:void 0,height:void 0,rotation:void 0,stRotation:void 0,extrudedHeight:void 0,shadowVolume:void 0,offsetAttribute:void 0};d.unpack=function(t,e,a){e=mt.defaultValue(e,0);var r=dt.Rectangle.unpack(t,e,g);e+=dt.Rectangle.packedLength;var n=dt.Ellipsoid.unpack(t,e,f);e+=dt.Ellipsoid.packedLength;var i=vt.VertexFormat.unpack(t,e,Dt);e+=vt.VertexFormat.packedLength;var o=t[e++],s=t[e++],l=t[e++],u=t[e++],c=t[e++],m=1===t[e++],p=t[e];return mt.defined(a)?(a._rectangle=dt.Rectangle.clone(r,a._rectangle),a._ellipsoid=dt.Ellipsoid.clone(n,a._ellipsoid),a._vertexFormat=vt.VertexFormat.clone(i,a._vertexFormat),a._granularity=o,a._surfaceHeight=s,a._rotation=l,a._stRotation=u,a._extrudedHeight=c,a._shadowVolume=m,a._offsetAttribute=-1===p?void 0:p,a):(h.granularity=o,h.height=s,h.rotation=l,h.stRotation=u,h.extrudedHeight=c,h.shadowVolume=m,h.offsetAttribute=-1===p?void 0:p,new d(h))},d.computeRectangle=function(t,e){var a=(t=mt.defaultValue(t,mt.defaultValue.EMPTY_OBJECT)).rectangle,r=mt.defaultValue(t.granularity,pt.CesiumMath.RADIANS_PER_DEGREE),n=mt.defaultValue(t.ellipsoid,dt.Ellipsoid.WGS84);return y(a,r,mt.defaultValue(t.rotation,0),n,e)};var E=new k.Matrix3,F=new k.Quaternion,G=new dt.Cartographic;d.createGeometry=function(t){if(!pt.CesiumMath.equalsEpsilon(t._rectangle.north,t._rectangle.south,pt.CesiumMath.EPSILON10)&&!pt.CesiumMath.equalsEpsilon(t._rectangle.east,t._rectangle.west,pt.CesiumMath.EPSILON10)){var e,a,r=t._rectangle,n=t._ellipsoid,i=t._rotation,o=t._stRotation,s=t._vertexFormat,l=H.RectangleGeometryLibrary.computeOptions(r,t._granularity,i,o,_,C,R),u=E;0!==o||0!==i?(e=dt.Rectangle.center(r,G),a=n.geodeticSurfaceNormalCartographic(e,Ft),k.Quaternion.fromAxisAngle(a,-o,F),k.Matrix3.fromQuaternion(F,u)):k.Matrix3.clone(k.Matrix3.IDENTITY,u);var c,m,p,d,g,y,f,h=t._surfaceHeight,b=t._extrudedHeight,v=!pt.CesiumMath.equalsEpsilon(h,b,0,pt.CesiumMath.EPSILON2);return l.lonScalar=1/t._rectangle.width,l.latScalar=1/t._rectangle.height,l.tangentRotationMatrix=u,r=t._rectangle,p=v?(f=w(t,l),c=k.BoundingSphere.fromRectangle3D(r,n,h,x),m=k.BoundingSphere.fromRectangle3D(r,n,b,A),k.BoundingSphere.union(c,m)):((f=Pt(t,l)).attributes.position.values=At.PolygonPipeline.scaleToGeodeticHeight(f.attributes.position.values,h,n,!1),mt.defined(t._offsetAttribute)&&(d=f.attributes.position.values.length,g=new Uint8Array(d/3),y=t._offsetAttribute===bt.GeometryOffsetAttribute.NONE?0:1,bt.arrayFill(g,y),f.attributes.applyOffset=new yt.GeometryAttribute({componentDatatype:gt.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:g})),k.BoundingSphere.fromRectangle3D(r,n,h)),s.position||delete f.attributes.position,new yt.Geometry({attributes:f.attributes,indices:f.indices,primitiveType:f.primitiveType,boundingSphere:p,offsetAttribute:t._offsetAttribute})}},d.createShadowVolume=function(t,e,a){var r=t._granularity,n=t._ellipsoid,i=e(r,n),o=a(r,n);return new d({rectangle:t._rectangle,rotation:t._rotation,ellipsoid:n,stRotation:t._stRotation,granularity:r,extrudedHeight:o,height:i,vertexFormat:vt.VertexFormat.POSITION_ONLY,shadowVolume:!0})};var b=new dt.Rectangle,v=[new dt.Cartesian2,new dt.Cartesian2,new dt.Cartesian2],P=new yt.Matrix2,V=new dt.Cartographic;return Object.defineProperties(d.prototype,{rectangle:{get:function(){return mt.defined(this._rotatedRectangle)||(this._rotatedRectangle=y(this._rectangle,this._granularity,this._rotation,this._ellipsoid)),this._rotatedRectangle}},textureCoordinateRotationPoints:{get:function(){return mt.defined(this._textureCoordinateRotationPoints)||(this._textureCoordinateRotationPoints=function(t){if(0===t._stRotation)return[0,0,0,1,1,0];var e=dt.Rectangle.clone(t._rectangle,b),a=t._granularity,r=t._ellipsoid,n=y(e,a,t._rotation-t._stRotation,r,b),i=v;i[0].x=n.west,i[0].y=n.south,i[1].x=n.west,i[1].y=n.north,i[2].x=n.east,i[2].y=n.south;for(var o=t.rectangle,s=yt.Matrix2.fromRotation(t._stRotation,P),l=dt.Rectangle.center(o,V),u=0;u<3;++u){var c=i[u];c.x-=l.longitude,c.y-=l.latitude,yt.Matrix2.multiplyByVector(s,c,c),c.x+=l.longitude,c.y+=l.latitude,c.x=(c.x-o.west)/o.width,c.y=(c.y-o.south)/o.height}var m=i[0],p=i[1],d=i[2],g=new Array(6);return dt.Cartesian2.pack(m,g),dt.Cartesian2.pack(p,g,2),dt.Cartesian2.pack(d,g,4),g}(this)),this._textureCoordinateRotationPoints}}}),function(t,e){return mt.defined(e)&&(t=d.unpack(t,e)),t._ellipsoid=dt.Ellipsoid.clone(t._ellipsoid),t._rectangle=dt.Rectangle.clone(t._rectangle),d.createGeometry(t)}}); diff --git a/web/assets/Cesium/Workers/createRectangleOutlineGeometry.js b/web/assets/Cesium/Workers/createRectangleOutlineGeometry.js new file mode 100644 index 00000000..d14c3892 --- /dev/null +++ b/web/assets/Cesium/Workers/createRectangleOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./EllipsoidRhumbLine-c704bf4c","./PolygonPipeline-ff364b47","./RectangleGeometryLibrary-341b00f2"],function(h,e,y,c,m,t,i,E,A,G,R,b,a,P,w){"use strict";var _=new m.BoundingSphere,v=new m.BoundingSphere,L=new c.Cartesian3,C=new c.Rectangle;function D(e,t){var i=e._ellipsoid,a=t.height,r=t.width,n=t.northCap,o=t.southCap,l=a,u=2,s=0,c=4;n&&(--u,--l,s+=1,c-=2),o&&(--u,--l,s+=1,c-=2),s+=u*r+2*l-c;var p,d=new Float64Array(3*s),f=0,g=0,h=L;if(n)w.RectangleGeometryLibrary.computePosition(t,i,!1,g,0,h),d[f++]=h.x,d[f++]=h.y,d[f++]=h.z;else for(p=0;p<r;p++)w.RectangleGeometryLibrary.computePosition(t,i,!1,g,p,h),d[f++]=h.x,d[f++]=h.y,d[f++]=h.z;for(p=r-1,g=1;g<a;g++)w.RectangleGeometryLibrary.computePosition(t,i,!1,g,p,h),d[f++]=h.x,d[f++]=h.y,d[f++]=h.z;if(g=a-1,!o)for(p=r-2;0<=p;p--)w.RectangleGeometryLibrary.computePosition(t,i,!1,g,p,h),d[f++]=h.x,d[f++]=h.y,d[f++]=h.z;for(p=0,g=a-2;0<g;g--)w.RectangleGeometryLibrary.computePosition(t,i,!1,g,p,h),d[f++]=h.x,d[f++]=h.y,d[f++]=h.z;for(var y=d.length/3*2,m=R.IndexDatatype.createTypedArray(d.length/3,y),b=0,_=0;_<d.length/3-1;_++)m[b++]=_,m[b++]=_+1;m[b++]=d.length/3-1,m[b++]=0;var v=new A.Geometry({attributes:new G.GeometryAttributes,primitiveType:A.PrimitiveType.LINES});return v.attributes.position=new A.GeometryAttribute({componentDatatype:E.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:d}),v.indices=m,v}function p(e){var t=(e=h.defaultValue(e,h.defaultValue.EMPTY_OBJECT)).rectangle,i=h.defaultValue(e.granularity,y.CesiumMath.RADIANS_PER_DEGREE),a=h.defaultValue(e.ellipsoid,c.Ellipsoid.WGS84),r=h.defaultValue(e.rotation,0),n=h.defaultValue(e.height,0),o=h.defaultValue(e.extrudedHeight,n);this._rectangle=c.Rectangle.clone(t),this._granularity=i,this._ellipsoid=a,this._surfaceHeight=Math.max(n,o),this._rotation=r,this._extrudedHeight=Math.min(n,o),this._offsetAttribute=e.offsetAttribute,this._workerName="createRectangleOutlineGeometry"}p.packedLength=c.Rectangle.packedLength+c.Ellipsoid.packedLength+5,p.pack=function(e,t,i){return i=h.defaultValue(i,0),c.Rectangle.pack(e._rectangle,t,i),i+=c.Rectangle.packedLength,c.Ellipsoid.pack(e._ellipsoid,t,i),i+=c.Ellipsoid.packedLength,t[i++]=e._granularity,t[i++]=e._surfaceHeight,t[i++]=e._rotation,t[i++]=e._extrudedHeight,t[i]=h.defaultValue(e._offsetAttribute,-1),t};var d=new c.Rectangle,f=c.Ellipsoid.clone(c.Ellipsoid.UNIT_SPHERE),g={rectangle:d,ellipsoid:f,granularity:void 0,height:void 0,rotation:void 0,extrudedHeight:void 0,offsetAttribute:void 0};p.unpack=function(e,t,i){t=h.defaultValue(t,0);var a=c.Rectangle.unpack(e,t,d);t+=c.Rectangle.packedLength;var r=c.Ellipsoid.unpack(e,t,f);t+=c.Ellipsoid.packedLength;var n=e[t++],o=e[t++],l=e[t++],u=e[t++],s=e[t];return h.defined(i)?(i._rectangle=c.Rectangle.clone(a,i._rectangle),i._ellipsoid=c.Ellipsoid.clone(r,i._ellipsoid),i._surfaceHeight=o,i._rotation=l,i._extrudedHeight=u,i._offsetAttribute=-1===s?void 0:s,i):(g.granularity=n,g.height=o,g.rotation=l,g.extrudedHeight=u,g.offsetAttribute=-1===s?void 0:s,new p(g))};var x=new c.Cartographic;return p.createGeometry=function(e){var t=e._rectangle,i=e._ellipsoid,a=w.RectangleGeometryLibrary.computeOptions(t,e._granularity,e._rotation,0,C,x);if(!y.CesiumMath.equalsEpsilon(t.north,t.south,y.CesiumMath.EPSILON10)&&!y.CesiumMath.equalsEpsilon(t.east,t.west,y.CesiumMath.EPSILON10)){var r,n,o,l,u,s,c,p,d,f=e._surfaceHeight,g=e._extrudedHeight;return s=!y.CesiumMath.equalsEpsilon(f,g,0,y.CesiumMath.EPSILON2)?(o=function(e,t){var i=e._surfaceHeight,a=e._extrudedHeight,r=e._ellipsoid,n=a,o=i,l=D(e,t),u=t.height,s=t.width,c=P.PolygonPipeline.scaleToGeodeticHeight(l.attributes.position.values,o,r,!1),p=c.length,d=new Float64Array(2*p);d.set(c);var f=P.PolygonPipeline.scaleToGeodeticHeight(l.attributes.position.values,n,r);d.set(f,p),l.attributes.position.values=d;var g=t.northCap,h=t.southCap,y=4;g&&--y,h&&--y;for(var m,b,_,v=2*(d.length/3+y),E=R.IndexDatatype.createTypedArray(d.length/3,v),p=d.length/6,A=0,G=0;G<p-1;G++)E[A++]=G,E[A++]=G+1,E[A++]=G+p,E[A++]=G+p+1;return E[A++]=p-1,E[A++]=0,E[A++]=p+p-1,E[A++]=p,E[A++]=0,E[A++]=p,m=g?u-1:(b=s-1,E[A++]=b,E[A++]=b+p,s+u-2),E[A++]=m,E[A++]=m+p,h||(_=s+m-1,E[A++]=_,E[A]=_+p),l.indices=E,l}(e,a),h.defined(e._offsetAttribute)&&(r=o.attributes.position.values.length/3,n=new Uint8Array(r),n=e._offsetAttribute===b.GeometryOffsetAttribute.TOP?b.arrayFill(n,1,0,r/2):(d=e._offsetAttribute===b.GeometryOffsetAttribute.NONE?0:1,b.arrayFill(n,d)),o.attributes.applyOffset=new A.GeometryAttribute({componentDatatype:E.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:n})),l=m.BoundingSphere.fromRectangle3D(t,i,f,v),u=m.BoundingSphere.fromRectangle3D(t,i,g,_),m.BoundingSphere.union(l,u)):((o=D(e,a)).attributes.position.values=P.PolygonPipeline.scaleToGeodeticHeight(o.attributes.position.values,f,i,!1),h.defined(e._offsetAttribute)&&(c=o.attributes.position.values.length,p=new Uint8Array(c/3),d=e._offsetAttribute===b.GeometryOffsetAttribute.NONE?0:1,b.arrayFill(p,d),o.attributes.applyOffset=new A.GeometryAttribute({componentDatatype:E.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:1,values:p})),m.BoundingSphere.fromRectangle3D(t,i,f)),new A.Geometry({attributes:o.attributes,indices:o.indices,primitiveType:A.PrimitiveType.LINES,boundingSphere:s,offsetAttribute:e._offsetAttribute})}},function(e,t){return h.defined(t)&&(e=p.unpack(e,t)),e._ellipsoid=c.Ellipsoid.clone(e._ellipsoid),e._rectangle=c.Rectangle.clone(e._rectangle),p.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createSimplePolylineGeometry.js b/web/assets/Cesium/Workers/createSimplePolylineGeometry.js new file mode 100644 index 00000000..581a3de3 --- /dev/null +++ b/web/assets/Cesium/Workers/createSimplePolylineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./ArcType-dc1c5aee","./EllipsoidRhumbLine-c704bf4c","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f","./Color-bc1ab1f9"],function(S,e,I,R,O,o,r,M,U,N,F,t,a,H,l,i,W,Y){"use strict";function f(e){var o=(e=S.defaultValue(e,S.defaultValue.EMPTY_OBJECT)).positions,r=e.colors,t=S.defaultValue(e.colorsPerVertex,!1);this._positions=o,this._colors=r,this._colorsPerVertex=t,this._arcType=S.defaultValue(e.arcType,H.ArcType.GEODESIC),this._granularity=S.defaultValue(e.granularity,I.CesiumMath.RADIANS_PER_DEGREE),this._ellipsoid=S.defaultValue(e.ellipsoid,R.Ellipsoid.WGS84),this._workerName="createSimplePolylineGeometry";var a=1+o.length*R.Cartesian3.packedLength;a+=S.defined(r)?1+r.length*Y.Color.packedLength:1,this.packedLength=a+R.Ellipsoid.packedLength+3}f.pack=function(e,o,r){var t;r=S.defaultValue(r,0);var a=e._positions,l=a.length;for(o[r++]=l,t=0;t<l;++t,r+=R.Cartesian3.packedLength)R.Cartesian3.pack(a[t],o,r);var i=e._colors,l=S.defined(i)?i.length:0;for(o[r++]=l,t=0;t<l;++t,r+=Y.Color.packedLength)Y.Color.pack(i[t],o,r);return R.Ellipsoid.pack(e._ellipsoid,o,r),r+=R.Ellipsoid.packedLength,o[r++]=e._colorsPerVertex?1:0,o[r++]=e._arcType,o[r]=e._granularity,o},f.unpack=function(e,o,r){o=S.defaultValue(o,0);for(var t=e[o++],a=new Array(t),l=0;l<t;++l,o+=R.Cartesian3.packedLength)a[l]=R.Cartesian3.unpack(e,o);var i=0<(t=e[o++])?new Array(t):void 0;for(l=0;l<t;++l,o+=Y.Color.packedLength)i[l]=Y.Color.unpack(e,o);var n=R.Ellipsoid.unpack(e,o);o+=R.Ellipsoid.packedLength;var s=1===e[o++],p=e[o++],c=e[o];return S.defined(r)?(r._positions=a,r._colors=i,r._ellipsoid=n,r._colorsPerVertex=s,r._arcType=p,r._granularity=c,r):new f({positions:a,colors:i,ellipsoid:n,colorsPerVertex:s,arcType:p,granularity:c})};var q=new Array(2),z=new Array(2),J={positions:q,height:z,ellipsoid:void 0,minDistance:void 0,granularity:void 0};return f.createGeometry=function(e){var o,r,t,a=e._positions,l=e._colors,i=e._colorsPerVertex,n=e._arcType,s=e._granularity,p=e._ellipsoid,c=I.CesiumMath.chordLength(s,p.maximumRadius),f=S.defined(l)&&!i,d=a.length,y=0;if(n===H.ArcType.GEODESIC||n===H.ArcType.RHUMB){var u,h,C=n===H.ArcType.GEODESIC?(u=I.CesiumMath.chordLength(s,p.maximumRadius),h=W.PolylinePipeline.numberOfPoints,W.PolylinePipeline.generateArc):(u=s,h=W.PolylinePipeline.numberOfPointsRhumbLine,W.PolylinePipeline.generateRhumbArc),T=W.PolylinePipeline.extractHeights(a,p),g=J;if(n===H.ArcType.GEODESIC?g.minDistance=c:g.granularity=s,g.ellipsoid=p,f){for(var m=0,b=0;b<d-1;b++)m+=h(a[b],a[b+1],u)+1;o=new Float64Array(3*m),t=new Uint8Array(4*m),g.positions=q,g.height=z;var v=0;for(b=0;b<d-1;++b){q[0]=a[b],q[1]=a[b+1],z[0]=T[b],z[1]=T[b+1];var P=C(g);if(S.defined(l))for(var _=P.length/3,B=l[b],A=0;A<_;++A)t[v++]=Y.Color.floatToByte(B.red),t[v++]=Y.Color.floatToByte(B.green),t[v++]=Y.Color.floatToByte(B.blue),t[v++]=Y.Color.floatToByte(B.alpha);o.set(P,y),y+=P.length}}else if(g.positions=a,g.height=T,o=new Float64Array(C(g)),S.defined(l)){for(t=new Uint8Array(o.length/3*4),b=0;b<d-1;++b)y=function(e,o,r,t,a,l,i){var n=W.PolylinePipeline.numberOfPoints(e,o,a),s=r.red,p=r.green,c=r.blue,f=r.alpha,d=t.red,y=t.green,u=t.blue,h=t.alpha;if(Y.Color.equals(r,t)){for(v=0;v<n;v++)l[i++]=Y.Color.floatToByte(s),l[i++]=Y.Color.floatToByte(p),l[i++]=Y.Color.floatToByte(c),l[i++]=Y.Color.floatToByte(f);return i}for(var C=(d-s)/n,T=(y-p)/n,g=(u-c)/n,m=(h-f)/n,b=i,v=0;v<n;v++)l[b++]=Y.Color.floatToByte(s+v*C),l[b++]=Y.Color.floatToByte(p+v*T),l[b++]=Y.Color.floatToByte(c+v*g),l[b++]=Y.Color.floatToByte(f+v*m);return b}(a[b],a[b+1],l[b],l[b+1],c,t,y);var E=l[d-1];t[y++]=Y.Color.floatToByte(E.red),t[y++]=Y.Color.floatToByte(E.green),t[y++]=Y.Color.floatToByte(E.blue),t[y++]=Y.Color.floatToByte(E.alpha)}}else{r=f?2*d-2:d,o=new Float64Array(3*r),t=S.defined(l)?new Uint8Array(4*r):void 0;var k=0,G=0;for(b=0;b<d;++b){var w=a[b];if(f&&0<b&&(R.Cartesian3.pack(w,o,k),k+=3,B=l[b-1],t[G++]=Y.Color.floatToByte(B.red),t[G++]=Y.Color.floatToByte(B.green),t[G++]=Y.Color.floatToByte(B.blue),t[G++]=Y.Color.floatToByte(B.alpha)),f&&b===d-1)break;R.Cartesian3.pack(w,o,k),k+=3,S.defined(l)&&(B=l[b],t[G++]=Y.Color.floatToByte(B.red),t[G++]=Y.Color.floatToByte(B.green),t[G++]=Y.Color.floatToByte(B.blue),t[G++]=Y.Color.floatToByte(B.alpha))}}var D=new N.GeometryAttributes;D.position=new U.GeometryAttribute({componentDatatype:M.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:o}),S.defined(l)&&(D.color=new U.GeometryAttribute({componentDatatype:M.ComponentDatatype.UNSIGNED_BYTE,componentsPerAttribute:4,values:t,normalize:!0}));var L=2*((r=o.length/3)-1),V=F.IndexDatatype.createTypedArray(r,L),x=0;for(b=0;b<r-1;++b)V[x++]=b,V[x++]=b+1;return new U.Geometry({attributes:D,indices:V,primitiveType:U.PrimitiveType.LINES,boundingSphere:O.BoundingSphere.fromPoints(a)})},function(e,o){return S.defined(o)&&(e=f.unpack(e,o)),e._ellipsoid=R.Ellipsoid.clone(e._ellipsoid),f.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createSphereGeometry.js b/web/assets/Cesium/Workers/createSphereGeometry.js new file mode 100644 index 00000000..6ea4b40f --- /dev/null +++ b/web/assets/Cesium/Workers/createSphereGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./EllipsoidGeometry-ceb731dc"],function(a,e,t,o,r,i,n,s,c,d,l,m,u,f){"use strict";function p(e){var t=a.defaultValue(e.radius,1),r={radii:new o.Cartesian3(t,t,t),stackPartitions:e.stackPartitions,slicePartitions:e.slicePartitions,vertexFormat:e.vertexFormat};this._ellipsoidGeometry=new f.EllipsoidGeometry(r),this._workerName="createSphereGeometry"}p.packedLength=f.EllipsoidGeometry.packedLength,p.pack=function(e,t,r){return f.EllipsoidGeometry.pack(e._ellipsoidGeometry,t,r)};var y=new f.EllipsoidGeometry,G={radius:void 0,radii:new o.Cartesian3,vertexFormat:new u.VertexFormat,stackPartitions:void 0,slicePartitions:void 0};return p.unpack=function(e,t,r){var i=f.EllipsoidGeometry.unpack(e,t,y);return G.vertexFormat=u.VertexFormat.clone(i._vertexFormat,G.vertexFormat),G.stackPartitions=i._stackPartitions,G.slicePartitions=i._slicePartitions,a.defined(r)?(o.Cartesian3.clone(i._radii,G.radii),r._ellipsoidGeometry=new f.EllipsoidGeometry(G),r):(G.radius=i._radii.x,new p(G))},p.createGeometry=function(e){return f.EllipsoidGeometry.createGeometry(e._ellipsoidGeometry)},function(e,t){return a.defined(t)&&(e=p.unpack(e,t)),p.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createSphereOutlineGeometry.js b/web/assets/Cesium/Workers/createSphereOutlineGeometry.js new file mode 100644 index 00000000..d089f238 --- /dev/null +++ b/web/assets/Cesium/Workers/createSphereOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./GeometryOffsetAttribute-7350d9af","./EllipsoidOutlineGeometry-5b7b6e19"],function(n,e,i,s,t,r,o,a,d,c,l,u,f){"use strict";function m(e){var i=n.defaultValue(e.radius,1),t={radii:new s.Cartesian3(i,i,i),stackPartitions:e.stackPartitions,slicePartitions:e.slicePartitions,subdivisions:e.subdivisions};this._ellipsoidGeometry=new f.EllipsoidOutlineGeometry(t),this._workerName="createSphereOutlineGeometry"}m.packedLength=f.EllipsoidOutlineGeometry.packedLength,m.pack=function(e,i,t){return f.EllipsoidOutlineGeometry.pack(e._ellipsoidGeometry,i,t)};var p=new f.EllipsoidOutlineGeometry,y={radius:void 0,radii:new s.Cartesian3,stackPartitions:void 0,slicePartitions:void 0,subdivisions:void 0};return m.unpack=function(e,i,t){var r=f.EllipsoidOutlineGeometry.unpack(e,i,p);return y.stackPartitions=r._stackPartitions,y.slicePartitions=r._slicePartitions,y.subdivisions=r._subdivisions,n.defined(t)?(s.Cartesian3.clone(r._radii,y.radii),t._ellipsoidGeometry=new f.EllipsoidOutlineGeometry(y),t):(y.radius=r._radii.x,new m(y))},m.createGeometry=function(e){return f.EllipsoidOutlineGeometry.createGeometry(e._ellipsoidGeometry)},function(e,i){return n.defined(i)&&(e=m.unpack(e,i)),m.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createTaskProcessorWorker.js b/web/assets/Cesium/Workers/createTaskProcessorWorker.js new file mode 100644 index 00000000..21334133 --- /dev/null +++ b/web/assets/Cesium/Workers/createTaskProcessorWorker.js @@ -0,0 +1 @@ +define(["./when-54c2dc71"],function(i){"use strict";return function(s){var a;return function(e){var r=e.data,n=[],t={id:r.id,result:void 0,error:void 0};return i.when(function(e,r,n){try{return e(r,n)}catch(e){return i.when.reject(e)}}(s,r.parameters,n)).then(function(e){t.result=e}).otherwise(function(e){e instanceof Error?t.error={name:e.name,message:e.message,stack:e.stack}:t.error=e}).always(function(){i.defined(a)||(a=i.defaultValue(self.webkitPostMessage,self.postMessage)),r.canTransferArrayBuffer||(n.length=0);try{a(t,n)}catch(e){t.result=void 0,t.error="postMessage failed with error: "+function(e){var r=e.name,n=e.message,t=i.defined(r)&&i.defined(n)?r+": "+n:e.toString(),s=e.stack;return i.defined(s)&&(t+="\n"+s),t}(e)+"\n with responseMessage: "+JSON.stringify(t),a(t)}})}}}); diff --git a/web/assets/Cesium/Workers/createVectorTileGeometries.js b/web/assets/Cesium/Workers/createVectorTileGeometries.js new file mode 100644 index 00000000..bf4b11b5 --- /dev/null +++ b/web/assets/Cesium/Workers/createVectorTileGeometries.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./createTaskProcessorWorker","./GeometryOffsetAttribute-7350d9af","./VertexFormat-7572c785","./BoxGeometry-ee1413aa","./CylinderGeometryLibrary-b0214ab1","./CylinderGeometry-01400a36","./EllipsoidGeometry-ceb731dc","./Color-bc1ab1f9"],function(D,e,t,P,q,n,r,a,i,o,W,s,d,c,_,f,N,Y,S){"use strict";function T(e){this.offset=e.offset,this.count=e.count,this.color=e.color,this.batchIds=e.batchIds}var l=new P.Cartesian3,u=q.Matrix4.packedLength+P.Cartesian3.packedLength,h=q.Matrix4.packedLength+2,b=q.Matrix4.packedLength+P.Cartesian3.packedLength,p=P.Cartesian3.packedLength+1,y={modelMatrix:new q.Matrix4,boundingVolume:new q.BoundingSphere};function j(e,t){var n=t*u,r=P.Cartesian3.unpack(e,n,l);n+=P.Cartesian3.packedLength;var a=q.Matrix4.unpack(e,n,y.modelMatrix);q.Matrix4.multiplyByScale(a,r,a);var i=y.boundingVolume;return P.Cartesian3.clone(P.Cartesian3.ZERO,i.center),i.radius=Math.sqrt(3),y}function z(e,t){var n=t*h,r=e[n++],a=e[n++],i=P.Cartesian3.fromElements(r,r,a,l),o=q.Matrix4.unpack(e,n,y.modelMatrix);q.Matrix4.multiplyByScale(o,i,o);var s=y.boundingVolume;return P.Cartesian3.clone(P.Cartesian3.ZERO,s.center),s.radius=Math.sqrt(2),y}function H(e,t){var n=t*b,r=P.Cartesian3.unpack(e,n,l);n+=P.Cartesian3.packedLength;var a=q.Matrix4.unpack(e,n,y.modelMatrix);q.Matrix4.multiplyByScale(a,r,a);var i=y.boundingVolume;return P.Cartesian3.clone(P.Cartesian3.ZERO,i.center),i.radius=1,y}function J(e,t){var n=t*p,r=e[n++],a=P.Cartesian3.unpack(e,n,l),i=q.Matrix4.fromTranslation(a,y.modelMatrix);q.Matrix4.multiplyByUniformScale(i,r,i);var o=y.boundingVolume;return P.Cartesian3.clone(P.Cartesian3.ZERO,o.center),o.radius=1,y}var V=new P.Cartesian3;function K(e,t,n,r,a){if(D.defined(t)){for(var i=n.length,o=r.attributes.position.values,s=r.indices,d=e.positions,c=e.vertexBatchIds,f=e.indices,l=e.batchIds,u=e.batchTableColors,h=e.batchedIndices,b=e.indexOffsets,p=e.indexCounts,y=e.boundingVolumes,x=e.modelMatrix,g=e.center,v=e.positionOffset,C=e.batchIdIndex,m=e.indexOffset,I=e.batchedIndicesOffset,k=0;k<i;++k){var M=a(t,k),B=M.modelMatrix;q.Matrix4.multiply(x,B,B);for(var w=n[k],A=o.length,O=0;O<A;O+=3){var L=P.Cartesian3.unpack(o,O,V);q.Matrix4.multiplyByPoint(B,L,L),P.Cartesian3.subtract(L,g,L),P.Cartesian3.pack(L,d,3*v+O),c[C++]=w}for(var E=s.length,U=0;U<E;++U)f[m+U]=s[U]+v;var G=k+I;h[G]=new T({offset:m,count:E,color:S.Color.fromRgba(u[w]),batchIds:[w]}),l[G]=w,b[G]=m,p[G]=E,y[G]=q.BoundingSphere.transform(M.boundingVolume,B),v+=A/3,m+=E}e.positionOffset=v,e.batchIdIndex=C,e.indexOffset=m,e.batchedIndicesOffset+=i}}var Q=new P.Cartesian3,X=new q.Matrix4;function $(e,t,n){var r=n.length,a=2+r*q.BoundingSphere.packedLength+1+function(e){for(var t=e.length,n=0,r=0;r<t;++r)n+=S.Color.packedLength+3+e[r].batchIds.length;return n}(t),i=new Float64Array(a),o=0;i[o++]=e,i[o++]=r;for(var s=0;s<r;++s)q.BoundingSphere.pack(n[s],i,o),o+=q.BoundingSphere.packedLength;var d=t.length;i[o++]=d;for(var c=0;c<d;++c){var f=t[c];S.Color.pack(f.color,i,o),o+=S.Color.packedLength,i[o++]=f.offset,i[o++]=f.count;var l=f.batchIds,u=l.length;i[o++]=u;for(var h=0;h<u;++h)i[o++]=l[h]}return i}return s(function(e,t){var n=D.defined(e.boxes)?new Float32Array(e.boxes):void 0,r=D.defined(e.boxBatchIds)?new Uint16Array(e.boxBatchIds):void 0,a=D.defined(e.cylinders)?new Float32Array(e.cylinders):void 0,i=D.defined(e.cylinderBatchIds)?new Uint16Array(e.cylinderBatchIds):void 0,o=D.defined(e.ellipsoids)?new Float32Array(e.ellipsoids):void 0,s=D.defined(e.ellipsoidBatchIds)?new Uint16Array(e.ellipsoidBatchIds):void 0,d=D.defined(e.spheres)?new Float32Array(e.spheres):void 0,c=D.defined(e.sphereBatchIds)?new Uint16Array(e.sphereBatchIds):void 0,f=D.defined(n)?r.length:0,l=D.defined(a)?i.length:0,u=D.defined(o)?s.length:0,h=D.defined(d)?c.length:0,b=_.BoxGeometry.getUnitBox(),p=N.CylinderGeometry.getUnitCylinder(),y=Y.EllipsoidGeometry.getUnitEllipsoid(),x=b.attributes.position.values,g=p.attributes.position.values,v=y.attributes.position.values,C=x.length*f;C+=g.length*l,C+=v.length*(u+h);var m=b.indices,I=p.indices,k=y.indices,M=m.length*f;M+=I.length*l,M+=k.length*(u+h);var B,w,A,O=new Float32Array(C),L=new Uint16Array(C/3),E=W.IndexDatatype.createTypedArray(C/3,M),U=f+l+u+h,G=new Uint16Array(U),S=new Array(U),T=new Uint32Array(U),V=new Uint32Array(U),F=new Array(U);B=e.packedBuffer,w=new Float64Array(B),A=0,P.Cartesian3.unpack(w,0,Q),A+=P.Cartesian3.packedLength,q.Matrix4.unpack(w,A,X);var R={batchTableColors:new Uint32Array(e.batchTableColors),positions:O,vertexBatchIds:L,indices:E,batchIds:G,batchedIndices:S,indexOffsets:T,indexCounts:V,boundingVolumes:F,positionOffset:0,batchIdIndex:0,indexOffset:0,batchedIndicesOffset:0,modelMatrix:X,center:Q};K(R,n,r,b,j),K(R,a,i,p,z),K(R,o,s,y,H),K(R,d,c,y,J);var Z=$(E.BYTES_PER_ELEMENT,S,F);return t.push(O.buffer,L.buffer,E.buffer),t.push(G.buffer,T.buffer,V.buffer),t.push(Z.buffer),{positions:O.buffer,vertexBatchIds:L.buffer,indices:E.buffer,indexOffsets:T.buffer,indexCounts:V.buffer,batchIds:G.buffer,packedBuffer:Z.buffer}})}); diff --git a/web/assets/Cesium/Workers/createVectorTilePoints.js b/web/assets/Cesium/Workers/createVectorTilePoints.js new file mode 100644 index 00000000..4fecfe49 --- /dev/null +++ b/web/assets/Cesium/Workers/createVectorTilePoints.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./AttributeCompression-9fc99391","./createTaskProcessorWorker"],function(a,e,v,y,A,r){"use strict";var M=32767,R=new y.Cartographic,x=new y.Cartesian3,D=new y.Rectangle,E=new y.Ellipsoid,F={min:void 0,max:void 0};return r(function(a,e){var r=new Uint16Array(a.positions);!function(a){a=new Float64Array(a);var e=0;F.min=a[e++],F.max=a[e++],y.Rectangle.unpack(a,2,D),e+=y.Rectangle.packedLength,y.Ellipsoid.unpack(a,e,E)}(a.packedBuffer);var t=D,n=E,i=F.min,s=F.max,c=r.length/3,o=r.subarray(0,c),u=r.subarray(c,2*c),p=r.subarray(2*c,3*c);A.AttributeCompression.zigZagDeltaDecode(o,u,p);for(var f=new Float64Array(r.length),h=0;h<c;++h){var l=o[h],d=u[h],m=p[h],C=v.CesiumMath.lerp(t.west,t.east,l/M),g=v.CesiumMath.lerp(t.south,t.north,d/M),b=v.CesiumMath.lerp(i,s,m/M),w=y.Cartographic.fromRadians(C,g,b,R),k=n.cartographicToCartesian(w,x);y.Cartesian3.pack(k,f,3*h)}return e.push(f.buffer),{positions:f.buffer}})}); diff --git a/web/assets/Cesium/Workers/createVectorTilePolygons.js b/web/assets/Cesium/Workers/createVectorTilePolygons.js new file mode 100644 index 00000000..b94c2b35 --- /dev/null +++ b/web/assets/Cesium/Workers/createVectorTilePolygons.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./AttributeCompression-9fc99391","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./createTaskProcessorWorker","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./Color-bc1ab1f9"],function(Be,e,Le,Oe,a,r,n,Ue,Pe,t,i,o,s,Fe,Se){"use strict";var Re=new Oe.Cartesian3,De=new Oe.Ellipsoid,Me=new Oe.Rectangle,_e={min:void 0,max:void 0,indexBytesPerElement:void 0};function Ge(e,a,r){var n=a.length,t=2+n*Fe.OrientedBoundingBox.packedLength+1+function(e){for(var a=e.length,r=0,n=0;n<a;++n)r+=Se.Color.packedLength+3+e[n].batchIds.length;return r}(r),i=new Float64Array(t),o=0;i[o++]=e,i[o++]=n;for(var s=0;s<n;++s)Fe.OrientedBoundingBox.pack(a[s],i,o),o+=Fe.OrientedBoundingBox.packedLength;var f=r.length;i[o++]=f;for(var d=0;d<f;++d){var c=r[d];Se.Color.pack(c.color,i,o),o+=Se.Color.packedLength,i[o++]=c.offset,i[o++]=c.count;var u=c.batchIds,h=u.length;i[o++]=h;for(var l=0;l<h;++l)i[o++]=u[l]}return i}var Ye=new Oe.Cartesian3,Ve=new Oe.Cartesian3,He=new Oe.Cartesian3,We=new Oe.Cartesian3,ze=new Oe.Cartesian3,Ze=new Oe.Cartographic,je=new Oe.Rectangle;return o(function(e,a){var r,n,t;r=e.packedBuffer,n=new Float64Array(r),t=0,_e.indexBytesPerElement=n[t++],_e.min=n[t++],_e.max=n[t++],Oe.Cartesian3.unpack(n,3,Re),t+=Oe.Cartesian3.packedLength,Oe.Ellipsoid.unpack(n,t,De),t+=Oe.Ellipsoid.packedLength,Oe.Rectangle.unpack(n,t,Me);var i,o=new(2===_e.indexBytesPerElement?Uint16Array:Uint32Array)(e.indices),s=new Uint16Array(e.positions),f=new Uint32Array(e.counts),d=new Uint32Array(e.indexCounts),c=new Uint32Array(e.batchIds),u=new Uint32Array(e.batchTableColors),h=new Array(f.length),l=Re,g=De,p=Me,b=_e.min,C=_e.max,y=e.minimumHeights,I=e.maximumHeights;Be.defined(y)&&Be.defined(I)&&(y=new Float32Array(y),I=new Float32Array(I));var m=s.length/2,w=s.subarray(0,m),v=s.subarray(m,2*m);Ue.AttributeCompression.zigZagDeltaDecode(w,v);for(var x=new Float64Array(3*m),A=0;A<m;++A){var E=w[A],N=v[A],T=Le.CesiumMath.lerp(p.west,p.east,E/32767),k=Le.CesiumMath.lerp(p.south,p.north,N/32767),B=Oe.Cartographic.fromRadians(T,k,0,Ze),L=g.cartographicToCartesian(B,Ye);Oe.Cartesian3.pack(L,x,3*A)}var O=f.length,U=new Array(O),P=new Array(O),F=0,S=0;for(A=0;A<O;++A)U[A]=F,P[A]=S,F+=f[A],S+=d[A];var R,D=new Float32Array(3*m*2),M=new Uint16Array(2*m),_=new Uint32Array(P.length),G=new Uint32Array(d.length),Y=[],V={};for(A=0;A<O;++A)i=u[A],Be.defined(V[i])?(V[i].positionLength+=f[A],V[i].indexLength+=d[A],V[i].batchIds.push(A)):V[i]={positionLength:f[A],indexLength:d[A],offset:0,indexOffset:0,batchIds:[A]};var H,W=0,z=0;for(i in V){V.hasOwnProperty(i)&&((R=V[i]).offset=W,R.indexOffset=z,W+=2*R.positionLength,z+=H=2*R.indexLength+6*R.positionLength,R.indexLength=H)}var Z=[];for(i in V)V.hasOwnProperty(i)&&(R=V[i],Z.push({color:Se.Color.fromRgba(parseInt(i)),offset:R.indexOffset,count:R.indexLength,batchIds:R.batchIds}));for(A=0;A<O;++A){var j=(R=V[i=u[A]]).offset,q=3*j,J=j,K=U[A],Q=f[A],X=c[A],$=b,ee=C;Be.defined(y)&&Be.defined(I)&&($=y[A],ee=I[A]);for(var ae=Number.POSITIVE_INFINITY,re=Number.NEGATIVE_INFINITY,ne=Number.POSITIVE_INFINITY,te=Number.NEGATIVE_INFINITY,ie=0;ie<Q;++ie){var oe=Oe.Cartesian3.unpack(x,3*K+3*ie,Ye);g.scaleToGeodeticSurface(oe,oe);var se=g.cartesianToCartographic(oe,Ze),fe=se.latitude,de=se.longitude,ae=Math.min(fe,ae),re=Math.max(fe,re),ne=Math.min(de,ne),te=Math.max(de,te),ce=g.geodeticSurfaceNormal(oe,Ve),ue=Oe.Cartesian3.multiplyByScalar(ce,$,He),he=Oe.Cartesian3.add(oe,ue,We),ue=Oe.Cartesian3.multiplyByScalar(ce,ee,ue),le=Oe.Cartesian3.add(oe,ue,ze);Oe.Cartesian3.subtract(le,l,le),Oe.Cartesian3.subtract(he,l,he),Oe.Cartesian3.pack(le,D,q),Oe.Cartesian3.pack(he,D,q+3),M[J]=X,M[J+1]=X,q+=6,J+=2}(p=je).west=ne,p.east=te,p.south=ae,p.north=re,h[A]=Fe.OrientedBoundingBox.fromRectangle(p,b,C,g);var ge=R.indexOffset,pe=P[A],be=d[A];for(_[A]=ge,ie=0;ie<be;ie+=3){var Ce=o[pe+ie]-K,ye=o[pe+ie+1]-K,Ie=o[pe+ie+2]-K;Y[ge++]=2*Ce+j,Y[ge++]=2*ye+j,Y[ge++]=2*Ie+j,Y[ge++]=2*Ie+1+j,Y[ge++]=2*ye+1+j,Y[ge++]=2*Ce+1+j}for(ie=0;ie<Q;++ie){var me=ie,we=(ie+1)%Q;Y[ge++]=2*me+1+j,Y[ge++]=2*we+j,Y[ge++]=2*me+j,Y[ge++]=2*me+1+j,Y[ge++]=2*we+1+j,Y[ge++]=2*we+j}R.offset+=2*Q,R.indexOffset=ge,G[A]=ge-_[A]}Y=Pe.IndexDatatype.createTypedArray(D.length/3,Y);for(var ve=Z.length,xe=0;xe<ve;++xe){for(var Ae=Z[xe].batchIds,Ee=0,Ne=Ae.length,Te=0;Te<Ne;++Te)Ee+=G[Ae[Te]];Z[xe].count=Ee}var ke=Ge(2===Y.BYTES_PER_ELEMENT?Pe.IndexDatatype.UNSIGNED_SHORT:Pe.IndexDatatype.UNSIGNED_INT,h,Z);return a.push(D.buffer,Y.buffer,_.buffer,G.buffer,M.buffer,ke.buffer),{positions:D.buffer,indices:Y.buffer,indexOffsets:_.buffer,indexCounts:G.buffer,batchIds:M.buffer,packedBuffer:ke.buffer}})}); diff --git a/web/assets/Cesium/Workers/createVectorTilePolylines.js b/web/assets/Cesium/Workers/createVectorTilePolylines.js new file mode 100644 index 00000000..0af245df --- /dev/null +++ b/web/assets/Cesium/Workers/createVectorTilePolylines.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./WebGLConstants-76bb35d1","./AttributeCompression-9fc99391","./IndexDatatype-53503fee","./createTaskProcessorWorker"],function(a,e,G,W,r,B,z,n){"use strict";var H=32767,O=new W.Cartographic,Y=new W.Cartesian3;var Z=new W.Rectangle,j=new W.Ellipsoid,q=new W.Cartesian3,J={min:void 0,max:void 0};var K=new W.Cartesian3,Q=new W.Cartesian3,V=new W.Cartesian3,X=new W.Cartesian3,$=new W.Cartesian3;return n(function(a,e){var r=new Uint16Array(a.positions),n=new Uint16Array(a.widths),t=new Uint32Array(a.counts),i=new Uint16Array(a.batchIds);!function(a){a=new Float64Array(a);var e=0;J.min=a[e++],J.max=a[e++],W.Rectangle.unpack(a,2,Z),e+=W.Rectangle.packedLength,W.Ellipsoid.unpack(a,e,j),e+=W.Ellipsoid.packedLength,W.Cartesian3.unpack(a,e,q)}(a.packedBuffer);for(var s=q,c=function(a,e,r,n,t){var i=a.length/3,s=a.subarray(0,i),c=a.subarray(i,2*i),u=a.subarray(2*i,3*i);B.AttributeCompression.zigZagDeltaDecode(s,c,u);for(var o=new Float64Array(a.length),f=0;f<i;++f){var p=s[f],C=c[f],d=u[f],b=G.CesiumMath.lerp(e.west,e.east,p/H),w=G.CesiumMath.lerp(e.south,e.north,C/H),h=G.CesiumMath.lerp(r,n,d/H),l=W.Cartographic.fromRadians(b,w,h,O),y=t.cartographicToCartesian(l,Y);W.Cartesian3.pack(y,o,3*f)}return o}(r,Z,J.min,J.max,j),u=c.length/3,o=4*u-4,f=new Float32Array(3*o),p=new Float32Array(3*o),C=new Float32Array(3*o),d=new Float32Array(2*o),b=new Uint16Array(o),w=0,h=0,l=0,y=0,k=t.length,v=0;v<k;++v){for(var A,g,m,x=t[v],E=n[v],D=i[v],I=0;I<x;++I){0===I?(A=W.Cartesian3.unpack(c,3*y,K),g=W.Cartesian3.unpack(c,3*(y+1),Q),m=W.Cartesian3.subtract(A,g,V),W.Cartesian3.add(A,m,m)):m=W.Cartesian3.unpack(c,3*(y+I-1),V);var T,U,F,N=W.Cartesian3.unpack(c,3*(y+I),X);I===x-1?(T=W.Cartesian3.unpack(c,3*(y+x-1),K),U=W.Cartesian3.unpack(c,3*(y+x-2),Q),F=W.Cartesian3.subtract(T,U,$),W.Cartesian3.add(T,F,F)):F=W.Cartesian3.unpack(c,3*(y+I+1),$),W.Cartesian3.subtract(m,s,m),W.Cartesian3.subtract(N,s,N),W.Cartesian3.subtract(F,s,F);for(var R=I===x-1?2:4,M=0===I?2:0;M<R;++M){W.Cartesian3.pack(N,f,w),W.Cartesian3.pack(m,p,w),W.Cartesian3.pack(F,C,w),w+=3;var P=M-2<0?-1:1;d[h++]=M%2*2-1,d[h++]=P*E,b[l++]=D}}y+=x}var L=z.IndexDatatype.createTypedArray(o,6*u-6),S=0,_=0,k=u-1;for(v=0;v<k;++v)L[_++]=S,L[_++]=S+2,L[_++]=S+1,L[_++]=S+1,L[_++]=S+2,L[_++]=S+3,S+=4;return e.push(f.buffer,p.buffer,C.buffer),e.push(d.buffer,b.buffer,L.buffer),{indexDatatype:2===L.BYTES_PER_ELEMENT?z.IndexDatatype.UNSIGNED_SHORT:z.IndexDatatype.UNSIGNED_INT,currentPositions:f.buffer,previousPositions:p.buffer,nextPositions:C.buffer,expandAndWidth:d.buffer,batchIds:b.buffer,indices:L.buffer}})}); diff --git a/web/assets/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js b/web/assets/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js new file mode 100644 index 00000000..cf6e9e93 --- /dev/null +++ b/web/assets/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./AttributeCompression-9fc99391","./IntersectionTests-2626c9e9","./Plane-231f1723","./WebMercatorProjection-df58d479","./createTaskProcessorWorker","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./TerrainEncoding-b34235ca"],function(Wt,t,Ft,Ot,Yt,kt,e,i,n,r,a,Ut,o,Vt,Ht,Lt){"use strict";var Dt=Uint16Array.BYTES_PER_ELEMENT,Gt=Int32Array.BYTES_PER_ELEMENT,jt=Uint32Array.BYTES_PER_ELEMENT,zt=Float32Array.BYTES_PER_ELEMENT,qt=Float64Array.BYTES_PER_ELEMENT;function Jt(t,e,i){i=Wt.defaultValue(i,Ft.CesiumMath);for(var n=t.length,r=0;r<n;++r)if(i.equalsEpsilon(t[r],e,Ft.CesiumMath.EPSILON12))return r;return-1}var Kt=new Ot.Cartographic,Qt=new Ot.Cartesian3,Xt=new Ot.Cartesian3,Zt=new Ot.Cartesian3,$t=new Yt.Matrix4;function te(t,e,i,n,r,a,o,s,u,h){for(var c=o.length,d=0;d<c;++d){var g=o[d],l=g.cartographic,m=g.index,p=t.length,I=l.longitude,v=l.latitude,v=Ft.CesiumMath.clamp(v,-Ft.CesiumMath.PI_OVER_TWO,Ft.CesiumMath.PI_OVER_TWO),E=l.height-a.skirtHeight;a.hMin=Math.min(a.hMin,E),Ot.Cartographic.fromRadians(I,v,E,Kt),u&&(Kt.longitude+=s),u?d===c-1?Kt.latitude+=h:0===d&&(Kt.latitude-=h):Kt.latitude+=s;var T=a.ellipsoid.cartographicToCartesian(Kt);t.push(T),e.push(E),i.push(Ot.Cartesian2.clone(i[m])),0<n.length&&n.push(n[m]),Yt.Matrix4.multiplyByPoint(a.toENU,T,Qt);var C=a.minimum,f=a.maximum;Ot.Cartesian3.minimumByComponent(Qt,C,C),Ot.Cartesian3.maximumByComponent(Qt,f,f);var M,N=a.lastBorderPoint;Wt.defined(N)&&(M=N.index,r.push(M,p-1,p,p,m,M)),a.lastBorderPoint=g}}return o(function(t,e){t.ellipsoid=Ot.Ellipsoid.clone(t.ellipsoid),t.rectangle=Ot.Rectangle.clone(t.rectangle);var i=function(t,e,i,n,r,a,o,s,u,h){var c,d,g,l,m,p;p=Wt.defined(n)?(c=n.west,d=n.south,g=n.east,l=n.north,m=n.width,n.height):(c=Ft.CesiumMath.toRadians(r.west),d=Ft.CesiumMath.toRadians(r.south),g=Ft.CesiumMath.toRadians(r.east),l=Ft.CesiumMath.toRadians(r.north),m=Ft.CesiumMath.toRadians(n.width),Ft.CesiumMath.toRadians(n.height));var I,v,E=[d,l],T=[c,g],C=Yt.Transforms.eastNorthUpToFixedFrame(e,i),f=Yt.Matrix4.inverseTransformation(C,$t);s&&(I=Ut.WebMercatorProjection.geodeticLatitudeToMercatorAngle(d),v=1/(Ut.WebMercatorProjection.geodeticLatitudeToMercatorAngle(l)-I));var M=new DataView(t),N=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY,b=Xt;b.x=Number.POSITIVE_INFINITY,b.y=Number.POSITIVE_INFINITY,b.z=Number.POSITIVE_INFINITY;var S=Zt;S.x=Number.NEGATIVE_INFINITY,S.y=Number.NEGATIVE_INFINITY,S.z=Number.NEGATIVE_INFINITY;var w,P,B=0,y=0,A=0;for(P=0;P<4;++P){var R=B;w=M.getUint32(R,!0),R+=jt;var _=Ft.CesiumMath.toRadians(180*M.getFloat64(R,!0));R+=qt,-1===Jt(T,_)&&T.push(_);var W=Ft.CesiumMath.toRadians(180*M.getFloat64(R,!0));R+=qt,-1===Jt(E,W)&&E.push(W),R+=2*qt;var F=M.getInt32(R,!0);R+=Gt,y+=F,F=M.getInt32(R,!0),A+=3*F,B+=w+jt}var O=[],Y=[],k=new Array(y),U=new Array(y),V=new Array(y),H=s?new Array(y):[],L=new Array(A),D=[],G=[],j=[],z=[],q=0,J=0;for(P=B=0;P<4;++P){w=M.getUint32(B,!0);var K=B+=jt,Q=Ft.CesiumMath.toRadians(180*M.getFloat64(B,!0));B+=qt;var X=Ft.CesiumMath.toRadians(180*M.getFloat64(B,!0));B+=qt;var Z=Ft.CesiumMath.toRadians(180*M.getFloat64(B,!0)),$=.5*Z;B+=qt;var tt=Ft.CesiumMath.toRadians(180*M.getFloat64(B,!0)),et=.5*tt;B+=qt;var it=M.getInt32(B,!0);B+=Gt;var nt=M.getInt32(B,!0);B+=Gt,B+=Gt;for(var rt=new Array(it),at=0;at<it;++at){var ot=Q+M.getUint8(B++)*Z;Kt.longitude=ot;var st=X+M.getUint8(B++)*tt;Kt.latitude=st;var ut=M.getFloat32(B,!0);if(B+=zt,0!==ut&&ut<h&&(ut*=-Math.pow(2,u)),ut*=6371010*a,Kt.height=ut,-1!==Jt(T,ot)||-1!==Jt(E,st)){var ht=Jt(O,Kt,Ot.Cartographic);if(-1!==ht){rt[at]=Y[ht];continue}O.push(Ot.Cartographic.clone(Kt)),Y.push(q)}rt[at]=q,Math.abs(ot-c)<$?D.push({index:q,cartographic:Ot.Cartographic.clone(Kt)}):Math.abs(ot-g)<$?j.push({index:q,cartographic:Ot.Cartographic.clone(Kt)}):Math.abs(st-d)<et?G.push({index:q,cartographic:Ot.Cartographic.clone(Kt)}):Math.abs(st-l)<et&&z.push({index:q,cartographic:Ot.Cartographic.clone(Kt)}),N=Math.min(ut,N),x=Math.max(ut,x),V[q]=ut;var ct=i.cartographicToCartesian(Kt);k[q]=ct,s&&(H[q]=(Ut.WebMercatorProjection.geodeticLatitudeToMercatorAngle(st)-I)*v),Yt.Matrix4.multiplyByPoint(f,ct,Qt),Ot.Cartesian3.minimumByComponent(Qt,b,b),Ot.Cartesian3.maximumByComponent(Qt,S,S);var dt=(ot-c)/(g-c);dt=Ft.CesiumMath.clamp(dt,0,1);var gt=(st-d)/(l-d);gt=Ft.CesiumMath.clamp(gt,0,1),U[q]=new Ot.Cartesian2(dt,gt),++q}for(var lt=3*nt,mt=0;mt<lt;++mt,++J)L[J]=rt[M.getUint16(B,!0)],B+=Dt;if(w!==B-K)throw new kt.RuntimeError("Invalid terrain tile.")}k.length=q,U.length=q,V.length=q,s&&(H.length=q);var pt=q,It=J,vt={hMin:N,lastBorderPoint:void 0,skirtHeight:o,toENU:f,ellipsoid:i,minimum:b,maximum:S};D.sort(function(t,e){return e.cartographic.latitude-t.cartographic.latitude}),G.sort(function(t,e){return t.cartographic.longitude-e.cartographic.longitude}),j.sort(function(t,e){return t.cartographic.latitude-e.cartographic.latitude}),z.sort(function(t,e){return e.cartographic.longitude-t.cartographic.longitude});var Et=1e-5;{var Tt,Ct,ft;te(k,V,U,H,L,vt,D,-Et*m,!0,-Et*p),te(k,V,U,H,L,vt,G,-Et*p,!1),te(k,V,U,H,L,vt,j,Et*m,!0,Et*p),te(k,V,U,H,L,vt,z,Et*p,!1),0<D.length&&0<z.length&&(Tt=D[0].index,Ct=z[z.length-1].index,ft=k.length-1,L.push(Ct,ft,pt,pt,Tt,Ct))}y=k.length;var Mt,Nt=Yt.BoundingSphere.fromPoints(k);Wt.defined(n)&&(Mt=Ht.OrientedBoundingBox.fromRectangle(n,N,x,i));for(var xt=new Lt.EllipsoidalOccluder(i).computeHorizonCullingPointPossiblyUnderEllipsoid(e,k,N),bt=new Vt.AxisAlignedBoundingBox(b,S,e),St=new Lt.TerrainEncoding(bt,vt.hMin,x,C,!1,s),wt=new Float32Array(y*St.getStride()),Pt=0,Bt=0;Bt<y;++Bt)Pt=St.encode(wt,Pt,k[Bt],U[Bt],V[Bt],void 0,H[Bt]);var yt=D.map(function(t){return t.index}).reverse(),At=G.map(function(t){return t.index}).reverse(),Rt=j.map(function(t){return t.index}).reverse(),_t=z.map(function(t){return t.index}).reverse();return At.unshift(Rt[Rt.length-1]),At.push(yt[0]),_t.unshift(yt[yt.length-1]),_t.push(Rt[0]),{vertices:wt,indices:new Uint16Array(L),maximumHeight:x,minimumHeight:N,encoding:St,boundingSphere3D:Nt,orientedBoundingBox:Mt,occludeePointInScaledSpace:xt,vertexCountWithoutSkirts:pt,indexCountWithoutSkirts:It,westIndicesSouthToNorth:yt,southIndicesEastToWest:At,eastIndicesNorthToSouth:Rt,northIndicesWestToEast:_t}}(t.buffer,t.relativeToCenter,t.ellipsoid,t.rectangle,t.nativeRectangle,t.exaggeration,t.skirtHeight,t.includeWebMercatorT,t.negativeAltitudeExponentBias,t.negativeElevationThreshold),n=i.vertices;e.push(n.buffer);var r=i.indices;return e.push(r.buffer),{vertices:n.buffer,indices:r.buffer,numberOfAttributes:i.encoding.getStride(),minimumHeight:i.minimumHeight,maximumHeight:i.maximumHeight,boundingSphere3D:i.boundingSphere3D,orientedBoundingBox:i.orientedBoundingBox,occludeePointInScaledSpace:i.occludeePointInScaledSpace,encoding:i.encoding,vertexCountWithoutSkirts:i.vertexCountWithoutSkirts,indexCountWithoutSkirts:i.indexCountWithoutSkirts,westIndicesSouthToNorth:i.westIndicesSouthToNorth,southIndicesEastToWest:i.southIndicesEastToWest,eastIndicesNorthToSouth:i.eastIndicesNorthToSouth,northIndicesWestToEast:i.northIndicesWestToEast}})}); diff --git a/web/assets/Cesium/Workers/createVerticesFromHeightmap.js b/web/assets/Cesium/Workers/createVerticesFromHeightmap.js new file mode 100644 index 00000000..303378ec --- /dev/null +++ b/web/assets/Cesium/Workers/createVerticesFromHeightmap.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./AttributeCompression-9fc99391","./IntersectionTests-2626c9e9","./Plane-231f1723","./WebMercatorProjection-df58d479","./createTaskProcessorWorker","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./TerrainEncoding-b34235ca"],function(Ye,e,We,Xe,Ze,n,t,a,i,r,s,je,l,Ge,qe,Qe){"use strict";var o=Object.freeze({NONE:0,LERC:1}),Je={};Je.DEFAULT_STRUCTURE=Object.freeze({heightScale:1,heightOffset:0,elementsPerHeight:1,stride:1,elementMultiplier:256,isBigEndian:!1});var Ke=new Xe.Cartesian3,$e=new Ze.Matrix4,et=new Xe.Cartesian3,tt=new Xe.Cartesian3;Je.computeVertices=function(e){var t,a,i,r=Math.cos,n=Math.sin,s=Math.sqrt,l=Math.atan,o=Math.exp,f=We.CesiumMath.PI_OVER_TWO,u=We.CesiumMath.toRadians,c=e.heightmap,d=e.width,h=e.height,m=e.skirtHeight,g=Ye.defaultValue(e.isGeographic,!0),p=Ye.defaultValue(e.ellipsoid,Xe.Ellipsoid.WGS84),w=1/p.maximumRadius,x=e.nativeRectangle,k=e.rectangle,y=Ye.defined(k)?(t=k.west,a=k.south,i=k.east,k.north):g?(t=u(x.west),a=u(x.south),i=u(x.east),u(x.north)):(t=x.west*w,a=f-2*l(o(-x.south*w)),i=x.east*w,f-2*l(o(-x.north*w))),I=e.relativeToCenter,b=Ye.defined(I),I=b?I:Xe.Cartesian3.ZERO,U=Ye.defaultValue(e.exaggeration,1),v=Ye.defaultValue(e.includeWebMercatorT,!1),T=Ye.defaultValue(e.structure,Je.DEFAULT_STRUCTURE),M=Ye.defaultValue(T.heightScale,Je.DEFAULT_STRUCTURE.heightScale),V=Ye.defaultValue(T.heightOffset,Je.DEFAULT_STRUCTURE.heightOffset),A=Ye.defaultValue(T.elementsPerHeight,Je.DEFAULT_STRUCTURE.elementsPerHeight),B=Ye.defaultValue(T.stride,Je.DEFAULT_STRUCTURE.stride),D=Ye.defaultValue(T.elementMultiplier,Je.DEFAULT_STRUCTURE.elementMultiplier),S=Ye.defaultValue(T.isBigEndian,Je.DEFAULT_STRUCTURE.isBigEndian),P=Xe.Rectangle.computeWidth(x),E=Xe.Rectangle.computeHeight(x),C=P/(d-1),F=E/(h-1);g||(P*=w,E*=w);var L,O,N=p.radiiSquared,z=N.x,R=N.y,_=N.z,H=65536,Y=-65536,W=Ze.Transforms.eastNorthUpToFixedFrame(I,p),X=Ze.Matrix4.inverseTransformation(W,$e);v&&(L=je.WebMercatorProjection.geodeticLatitudeToMercatorAngle(a),O=1/(je.WebMercatorProjection.geodeticLatitudeToMercatorAngle(y)-L));var Z=et;Z.x=Number.POSITIVE_INFINITY,Z.y=Number.POSITIVE_INFINITY,Z.z=Number.POSITIVE_INFINITY;var j=tt;j.x=Number.NEGATIVE_INFINITY,j.y=Number.NEGATIVE_INFINITY,j.z=Number.NEGATIVE_INFINITY;var G=Number.POSITIVE_INFINITY,q=d*h,Q=q+(0<m?2*d+2*h:0),J=new Array(Q),K=new Array(Q),$=new Array(Q),ee=v?new Array(Q):[],te=0,ae=h,ie=0,re=d;0<m&&(--te,++ae,--ie,++re);for(var ne=te;ne<ae;++ne){var se=ne;se<0&&(se=0),h<=se&&(se=h-1);var le=x.north-F*se,oe=((le=g?u(le):f-2*l(o(-le*w)))-a)/(y-a),oe=We.CesiumMath.clamp(oe,0,1),fe=ne===te,ue=ne===ae-1;0<m&&(fe?le+=1e-5*E:ue&&(le-=1e-5*E));var ce,de=r(le),he=n(le),me=_*he;v&&(ce=(je.WebMercatorProjection.geodeticLatitudeToMercatorAngle(le)-L)*O);for(var ge=ie;ge<re;++ge){var pe=ge;pe<0&&(pe=0),d<=pe&&(pe=d-1);var we=se*(d*B)+pe*B;if(1===A)ke=c[we];else{var xe,ke=0;if(S)for(xe=0;xe<A;++xe)ke=ke*D+c[we+xe];else for(xe=A-1;0<=xe;--xe)ke=ke*D+c[we+xe]}ke=(ke*M+V)*U,Y=Math.max(Y,ke),H=Math.min(H,ke);var ye=x.west+C*pe;g?ye=u(ye):ye*=w;var Ie=(ye-t)/(i-t),Ie=We.CesiumMath.clamp(Ie,0,1),be=se*d+pe;if(0<m){var Ue=ge===ie,ve=ge===re-1,Te=fe||ue||Ue||ve;if((fe||ue)&&(Ue||ve))continue;Te&&(ke-=m,Ue?(be=h-se-1+q,ye-=1e-5*P):ue?be=q+h+(d-pe-1):ve?(be=q+h+d+se,ye+=1e-5*P):fe&&(be=q+h+d+h+pe))}var Me=de*r(ye),Ve=de*n(ye),Ae=z*Me,Be=R*Ve,De=1/s(Ae*Me+Be*Ve+me*he),Se=Ae*De,Pe=Be*De,Ee=me*De,Ce=new Xe.Cartesian3;Ce.x=Se+Me*ke,Ce.y=Pe+Ve*ke,Ce.z=Ee+he*ke,J[be]=Ce,K[be]=ke,$[be]=new Xe.Cartesian2(Ie,oe),v&&(ee[be]=ce),Ze.Matrix4.multiplyByPoint(X,Ce,Ke),Xe.Cartesian3.minimumByComponent(Ke,Z,Z),Xe.Cartesian3.maximumByComponent(Ke,j,j),G=Math.min(G,ke)}}var Fe,Le,Oe=Ze.BoundingSphere.fromPoints(J);Ye.defined(k)&&(Fe=qe.OrientedBoundingBox.fromRectangle(k,H,Y,p)),b&&(Le=new Qe.EllipsoidalOccluder(p).computeHorizonCullingPointPossiblyUnderEllipsoid(I,J,H));for(var Ne=new Ge.AxisAlignedBoundingBox(Z,j,I),ze=new Qe.TerrainEncoding(Ne,G,Y,W,!1,v),Re=new Float32Array(Q*ze.getStride()),_e=0,He=0;He<Q;++He)_e=ze.encode(Re,_e,J[He],$[He],K[He],void 0,ee[He]);return{vertices:Re,maximumHeight:Y,minimumHeight:H,encoding:ze,boundingSphere3D:Oe,orientedBoundingBox:Fe,occludeePointInScaledSpace:Le}};var f,u,c,d,h,B,V,A,D,S,P,E,R,C,m,g,x,k,y,p,w={};f={defaultNoDataValue:-34027999387901484e22,decode:function(e,t){var a=(t=t||{}).encodedMaskData||null===t.encodedMaskData,i=h(e,t.inputOffset||0,a),r=null!==t.noDataValue?t.noDataValue:f.defaultNoDataValue,n=u(i,t.pixelType||Float32Array,t.encodedMaskData,r,t.returnMask),s={width:i.width,height:i.height,pixelData:n.resultPixels,minValue:n.minValue,maxValue:i.pixels.maxValue,noDataValue:r};return n.resultMask&&(s.maskData=n.resultMask),t.returnEncodedMask&&i.mask&&(s.encodedMaskData=i.mask.bitset?i.mask.bitset:null),t.returnFileInfo&&(s.fileInfo=c(i),t.computeUsedBitDepths&&(s.fileInfo.bitDepths=d(i))),s}},u=function(e,t,a,i,r){var n,s,l,o=0,f=e.pixels.numBlocksX,u=e.pixels.numBlocksY,c=Math.floor(e.width/f),d=Math.floor(e.height/u),h=2*e.maxZError,m=Number.MAX_VALUE;a=a||(e.mask?e.mask.bitset:null),s=new t(e.width*e.height),r&&a&&(l=new Uint8Array(e.width*e.height));for(var g,p,w=new Float32Array(c*d),x=0;x<=u;x++){var k=x!==u?d:e.height%u;if(0!==k)for(var y=0;y<=f;y++){var I=y!==f?c:e.width%f;if(0!==I){var b,U,v,T,M=x*e.width*d+y*c,V=e.width-I,A=e.pixels.blocks[o];if(A.encoding<2?(b=0===A.encoding?A.rawData:(B(A.stuffedData,A.bitsPerPixel,A.numValidPixels,A.offset,h,w,e.pixels.maxValue),w),U=0):v=2===A.encoding?0:A.offset,a)for(p=0;p<k;p++){for(7&M&&(T=a[M>>3],T<<=7&M),g=0;g<I;g++)7&M||(T=a[M>>3]),128&T?(l&&(l[M]=1),m=(n=A.encoding<2?b[U++]:v)<m?n:m,s[M++]=n):(l&&(l[M]=0),s[M++]=i),T<<=1;M+=V}else if(A.encoding<2)for(p=0;p<k;p++){for(g=0;g<I;g++)m=(n=b[U++])<m?n:m,s[M++]=n;M+=V}else for(m=v<m?v:m,p=0;p<k;p++){for(g=0;g<I;g++)s[M++]=v;M+=V}if(1===A.encoding&&U!==A.numValidPixels)throw"Block and Mask do not match";o++}}}return{resultPixels:s,resultMask:l,minValue:m}},c=function(e){return{fileIdentifierString:e.fileIdentifierString,fileVersion:e.fileVersion,imageType:e.imageType,height:e.height,width:e.width,maxZError:e.maxZError,eofOffset:e.eofOffset,mask:e.mask?{numBlocksX:e.mask.numBlocksX,numBlocksY:e.mask.numBlocksY,numBytes:e.mask.numBytes,maxValue:e.mask.maxValue}:null,pixels:{numBlocksX:e.pixels.numBlocksX,numBlocksY:e.pixels.numBlocksY,numBytes:e.pixels.numBytes,maxValue:e.pixels.maxValue,noDataValue:e.noDataValue}}},d=function(e){for(var t=e.pixels.numBlocksX*e.pixels.numBlocksY,a={},i=0;i<t;i++){var r=e.pixels.blocks[i];0===r.encoding?a.float32=!0:1===r.encoding?a[r.bitsPerPixel]=!0:a[0]=!0}return Object.keys(a)},h=function(e,t,a){var i={},r=new Uint8Array(e,t,10);if(i.fileIdentifierString=String.fromCharCode.apply(null,r),"CntZImage"!==i.fileIdentifierString.trim())throw"Unexpected file identifier string: "+i.fileIdentifierString;t+=10;var n=new DataView(e,t,24);if(i.fileVersion=n.getInt32(0,!0),i.imageType=n.getInt32(4,!0),i.height=n.getUint32(8,!0),i.width=n.getUint32(12,!0),i.maxZError=n.getFloat64(16,!0),t+=24,!a)if(n=new DataView(e,t,16),i.mask={},i.mask.numBlocksY=n.getUint32(0,!0),i.mask.numBlocksX=n.getUint32(4,!0),i.mask.numBytes=n.getUint32(8,!0),i.mask.maxValue=n.getFloat32(12,!0),t+=16,0<i.mask.numBytes){var s=new Uint8Array(Math.ceil(i.width*i.height/8)),l=(n=new DataView(e,t,i.mask.numBytes)).getInt16(0,!0),o=2,f=0;do{if(0<l)for(;l--;)s[f++]=n.getUint8(o++);else for(var u=n.getUint8(o++),l=-l;l--;)s[f++]=u;l=n.getInt16(o,!0),o+=2}while(o<i.mask.numBytes);if(-32768!==l||f<s.length)throw"Unexpected end of mask RLE encoding";i.mask.bitset=s,t+=i.mask.numBytes}else 0==(i.mask.numBytes|i.mask.numBlocksY|i.mask.maxValue)&&(i.mask.bitset=new Uint8Array(Math.ceil(i.width*i.height/8)));n=new DataView(e,t,16),i.pixels={},i.pixels.numBlocksY=n.getUint32(0,!0),i.pixels.numBlocksX=n.getUint32(4,!0),i.pixels.numBytes=n.getUint32(8,!0),i.pixels.maxValue=n.getFloat32(12,!0),t+=16;var c=i.pixels.numBlocksX,d=i.pixels.numBlocksY,h=c+(0<i.width%c?1:0),m=d+(0<i.height%d?1:0);i.pixels.blocks=new Array(h*m);for(var g=0,p=0;p<m;p++)for(var w=0;w<h;w++){var x=0,k=e.byteLength-t;n=new DataView(e,t,Math.min(10,k));var y={};i.pixels.blocks[g++]=y;var I,b,U,v=n.getUint8(0);if(x++,y.encoding=63&v,3<y.encoding)throw"Invalid block encoding ("+y.encoding+")";if(2!==y.encoding){if(0!==v&&2!==v){if(v>>=6,2===(y.offsetType=v))y.offset=n.getInt8(1),x++;else if(1===v)y.offset=n.getInt16(1,!0),x+=2;else{if(0!==v)throw"Invalid block offset type";y.offset=n.getFloat32(1,!0),x+=4}if(1===y.encoding)if(v=n.getUint8(x),x++,y.bitsPerPixel=63&v,v>>=6,2===(y.numValidPixelsType=v))y.numValidPixels=n.getUint8(x),x++;else if(1===v)y.numValidPixels=n.getUint16(x,!0),x+=2;else{if(0!==v)throw"Invalid valid pixel count type";y.numValidPixels=n.getUint32(x,!0),x+=4}}if(t+=x,3!==y.encoding)if(0===y.encoding){var T=(i.pixels.numBytes-1)/4;if(T!==Math.floor(T))throw"uncompressed block has invalid length";U=new ArrayBuffer(4*T),new Uint8Array(U).set(new Uint8Array(e,t,4*T));var M=new Float32Array(U);y.rawData=M,t+=4*T}else{1===y.encoding&&(I=Math.ceil(y.numValidPixels*y.bitsPerPixel/8),b=Math.ceil(I/4),U=new ArrayBuffer(4*b),new Uint8Array(U).set(new Uint8Array(e,t,I)),y.stuffedData=new Uint32Array(U),t+=I)}}else t++}return i.eofOffset=t,i},B=function(e,t,a,i,r,n,s){var l,o,f,u,c=(1<<t)-1,d=0,h=0,m=Math.ceil((s-i)/r),g=4*e.length-Math.ceil(t*a/8);for(e[e.length-1]<<=8*g,l=0;l<a;l++){0===h&&(u=e[d++],h=32),t<=h?(f=u>>>h-t&c,h-=t):(f=(u&c)<<(o=t-h)&c,f+=(u=e[d++])>>>(h=32-o)),n[l]=f<m?i+f*r:s}return n},x=f,V=function(e,t,a,i,r,n,s,l){var o,f,u,c,d,h=(1<<a)-1,m=0,g=0,p=4*e.length-Math.ceil(a*i/8);if(e[e.length-1]<<=8*p,r)for(o=0;o<i;o++)0===g&&(u=e[m++],g=32),a<=g?(f=u>>>g-a&h,g-=a):(f=(u&h)<<(c=a-g)&h,f+=(u=e[m++])>>>(g=32-c)),t[o]=r[f];else for(d=Math.ceil((l-n)/s),o=0;o<i;o++)0===g&&(u=e[m++],g=32),a<=g?(f=u>>>g-a&h,g-=a):(f=(u&h)<<(c=a-g)&h,f+=(u=e[m++])>>>(g=32-c)),t[o]=f<d?n+f*s:l},A=function(e,t,a,i,r,n){var s,l,o=(1<<t)-1,f=0,u=0,c=0,d=0,h=[],m=4*e.length-Math.ceil(t*a/8);e[e.length-1]<<=8*m;for(var g=Math.ceil((n-i)/r),u=0;u<a;u++)0===c&&(l=e[f++],c=32),t<=c?(d=l>>>c-t&o,c-=t):(d=(l&o)<<(s=t-c)&o,d+=(l=e[f++])>>>(c=32-s)),h[u]=d<g?i+d*r:n;return h.unshift(i),h},D=function(e,t,a,i,r,n,s,l){var o,f,u,c=(1<<a)-1,d=0,h=0,m=0;if(r)for(p=0;p<i;p++)0===h&&(f=e[d++],h=32,m=0),a<=h?(o=f>>>m&c,h-=a,m+=a):(o=f>>>m&c,h=32-(u=a-h),o|=((f=e[d++])&(1<<u)-1)<<a-u,m=u),t[p]=r[o];else for(var g=Math.ceil((l-n)/s),p=0;p<i;p++)0===h&&(f=e[d++],h=32,m=0),a<=h?(o=f>>>m&c,h-=a,m+=a):(o=f>>>m&c,h=32-(u=a-h),o|=((f=e[d++])&(1<<u)-1)<<a-u,m=u),t[p]=o<g?n+o*s:l;return t},S=function(e,t,a,i,r,n){for(var s,l,o=(1<<t)-1,f=0,u=0,c=0,d=0,h=0,m=[],g=Math.ceil((n-i)/r),u=0;u<a;u++)0===c&&(l=e[f++],c=32,h=0),t<=c?(d=l>>>h&o,c-=t,h+=t):(d=l>>>h&o,c=32-(s=t-c),d|=((l=e[f++])&(1<<s)-1)<<t-s,h=s),m[u]=d<g?i+d*r:n;return m.unshift(i),m},P=function(e,t,a,i){var r,n,s,l,o=(1<<a)-1,f=0,u=0,c=4*e.length-Math.ceil(a*i/8);for(e[e.length-1]<<=8*c,r=0;r<i;r++)0===u&&(s=e[f++],u=32),a<=u?(n=s>>>u-a&o,u-=a):(n=(s&o)<<(l=a-u)&o,n+=(s=e[f++])>>>(u=32-l)),t[r]=n;return t},E=function(e,t,a,i){for(var r,n,s,l=(1<<a)-1,o=0,f=0,u=0,c=0;c<i;c++)0===f&&(n=e[o++],f=32,u=0),a<=f?(r=n>>>u&l,f-=a,u+=a):(r=n>>>u&l,f=32-(s=a-f),r|=((n=e[o++])&(1<<s)-1)<<a-s,u=s),t[c]=r;return t},R={HUFFMAN_LUT_BITS_MAX:12,computeChecksumFletcher32:function(e){for(var t=65535,a=65535,i=e.length,r=Math.floor(i/2),n=0;r;){var s=359<=r?359:r;for(r-=s;t+=e[n++]<<8,a+=t+=e[n++],--s;);t=(65535&t)+(t>>>16),a=(65535&a)+(a>>>16)}return 1&i&&(a+=t+=e[n]<<8),((a=(65535&a)+(a>>>16))<<16|(t=(65535&t)+(t>>>16)))>>>0},readHeaderInfo:function(e,t){var a=t.ptr,i=new Uint8Array(e,a,6),r={};if(r.fileIdentifierString=String.fromCharCode.apply(null,i),0!==r.fileIdentifierString.lastIndexOf("Lerc2",0))throw"Unexpected file identifier string (expect Lerc2 ): "+r.fileIdentifierString;a+=6;var n,s=new DataView(e,a,8),l=s.getInt32(0,!0);if(a+=4,3<=(r.fileVersion=l)&&(r.checksum=s.getUint32(4,!0),a+=4),s=new DataView(e,a,12),r.height=s.getUint32(0,!0),r.width=s.getUint32(4,!0),a+=8,4<=l?(r.numDims=s.getUint32(8,!0),a+=4):r.numDims=1,s=new DataView(e,a,40),r.numValidPixel=s.getUint32(0,!0),r.microBlockSize=s.getInt32(4,!0),r.blobSize=s.getInt32(8,!0),r.imageType=s.getInt32(12,!0),r.maxZError=s.getFloat64(16,!0),r.zMin=s.getFloat64(24,!0),r.zMax=s.getFloat64(32,!0),a+=40,t.headerInfo=r,t.ptr=a,3<=l&&(n=4<=l?52:48,this.computeChecksumFletcher32(new Uint8Array(e,a-n,r.blobSize-14))!==r.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(e,t){var a=t.headerInfo,i=this.getDataTypeArray(a.imageType),r=a.numDims*this.getDataTypeSize(a.imageType),n=this.readSubArray(e,t.ptr,i,r),s=this.readSubArray(e,t.ptr+r,i,r);t.ptr+=2*r;for(var l=!0,o=0;o<a.numDims;o++)if(n[o]!==s[o]){l=!1;break}return a.minValues=n,a.maxValues=s,l},readSubArray:function(e,t,a,i){var r,n=a===Uint8Array?new Uint8Array(e,t,i):(r=new ArrayBuffer(i),new Uint8Array(r).set(new Uint8Array(e,t,i)),new a(r));return n},readMask:function(e,t){var a,i,r=t.ptr,n=t.headerInfo,s=n.width*n.height,l=n.numValidPixel,o=new DataView(e,r,4),f={};if(f.numBytes=o.getUint32(0,!0),r+=4,(0===l||s===l)&&0!==f.numBytes)throw"invalid mask";if(0===l)a=new Uint8Array(Math.ceil(s/8)),f.bitset=a,i=new Uint8Array(s),t.pixels.resultMask=i,r+=f.numBytes;else if(0<f.numBytes){a=new Uint8Array(Math.ceil(s/8));var u,c=(o=new DataView(e,r,f.numBytes)).getInt16(0,!0),d=2,h=0;do{if(0<c)for(;c--;)a[h++]=o.getUint8(d++);else for(u=o.getUint8(d++),c=-c;c--;)a[h++]=u;c=o.getInt16(d,!0),d+=2}while(d<f.numBytes);if(-32768!==c||h<a.length)throw"Unexpected end of mask RLE encoding";i=new Uint8Array(s);for(var m=0,g=0,g=0;g<s;g++)7&g?(m=a[g>>3],m<<=7&g):m=a[g>>3],128&m&&(i[g]=1);t.pixels.resultMask=i,f.bitset=a,r+=f.numBytes}return t.ptr=r,t.mask=f,!0},readDataOneSweep:function(e,t,a){var i,r=t.ptr,n=t.headerInfo,s=n.numDims,l=n.width*n.height,o=n.imageType,f=n.numValidPixel*R.getDataTypeSize(o)*s,u=t.pixels.resultMask,c=a===Uint8Array?new Uint8Array(e,r,f):(i=new ArrayBuffer(f),new Uint8Array(i).set(new Uint8Array(e,r,f)),new a(i));if(c.length===l*s)t.pixels.resultPixels=c;else{t.pixels.resultPixels=new a(l*s);var d,h=0,m=0,g=0;if(1<s)for(g=0;g<s;g++)for(d=g*l,m=0;m<l;m++)u[m]&&(t.pixels.resultPixels[d+m]=c[h++]);else for(m=0;m<l;m++)u[m]&&(t.pixels.resultPixels[m]=c[h++])}return r+=f,t.ptr=r,!0},readHuffmanTree:function(e,t){var a=this.HUFFMAN_LUT_BITS_MAX,i=new DataView(e,t.ptr,16);if(t.ptr+=16,i.getInt32(0,!0)<2)throw"unsupported Huffman version";var r=i.getInt32(4,!0),n=i.getInt32(8,!0),s=i.getInt32(12,!0);if(s<=n)return!1;var l=new Uint32Array(s-n);R.decodeBits(e,t,l);for(var o,f,u,c=[],d=n;d<s;d++)c[o=d-(d<r?0:r)]={first:l[d-n],second:null};var h=e.byteLength-t.ptr,m=Math.ceil(h/4),g=new ArrayBuffer(4*m);new Uint8Array(g).set(new Uint8Array(e,t.ptr,h));var p=new Uint32Array(g),w=0,x=0,k=p[0];for(d=n;d<s;d++)0<(u=c[o=d-(d<r?0:r)].first)&&(c[o].second=k<<w>>>32-u,u<=32-w?32===(w+=u)&&(w=0,k=p[++x]):(w+=u-32,k=p[++x],c[o].second|=k>>>32-w));var y=0,I=0,b=new C;for(d=0;d<c.length;d++)void 0!==c[d]&&(y=Math.max(y,c[d].first));I=a<=y?a:y,30<=y&&console.log("WARning, large NUM LUT BITS IS "+y);var U,v,T,M,V,A=[];for(d=n;d<s;d++)if(0<(u=c[o=d-(d<r?0:r)].first))if(U=[u,o],u<=I)for(v=c[o].second<<I-u,T=1<<I-u,f=0;f<T;f++)A[v|f]=U;else for(v=c[o].second,V=b,M=u-1;0<=M;M--)V=v>>>M&1?(V.right||(V.right=new C),V.right):(V.left||(V.left=new C),V.left),0!==M||V.val||(V.val=U[1]);return{decodeLut:A,numBitsLUTQick:I,numBitsLUT:y,tree:b,stuffedData:p,srcPtr:x,bitPos:w}},readHuffman:function(e,t,a){var i,r,n,s,l,o,f,u,c,d=t.headerInfo,h=d.numDims,m=t.headerInfo.height,g=t.headerInfo.width,p=g*m,w=this.readHuffmanTree(e,t),x=w.decodeLut,k=w.tree,y=w.stuffedData,I=w.srcPtr,b=w.bitPos,U=w.numBitsLUTQick,v=w.numBitsLUT,T=0===t.headerInfo.imageType?128:0,M=t.pixels.resultMask,V=0;0<b&&(I++,b=0);for(var A=y[I],B=1===t.encodeMode,D=new a(p*h),S=D,P=0;P<d.numDims;P++){if(1<h&&(S=new a(D.buffer,p*P,p),V=0),t.headerInfo.numValidPixel===g*m)for(o=u=0;o<m;o++)for(f=0;f<g;f++,u++){if(r=0,l=s=A<<b>>>32-U,32-b<U&&(l=s|=y[I+1]>>>64-b-U),x[l])r=x[l][1],b+=x[l][0];else for(l=s=A<<b>>>32-v,32-b<v&&(l=s|=y[I+1]>>>64-b-v),i=k,c=0;c<v;c++)if(!(i=s>>>v-c-1&1?i.right:i.left).left&&!i.right){r=i.val,b=b+c+1;break}32<=b&&(b-=32,A=y[++I]),n=r-T,B?(n+=!(0<f)&&0<o?S[u-g]:V,n&=255,V=S[u]=n):S[u]=n}else for(o=u=0;o<m;o++)for(f=0;f<g;f++,u++)if(M[u]){if(r=0,l=s=A<<b>>>32-U,32-b<U&&(l=s|=y[I+1]>>>64-b-U),x[l])r=x[l][1],b+=x[l][0];else for(l=s=A<<b>>>32-v,32-b<v&&(l=s|=y[I+1]>>>64-b-v),i=k,c=0;c<v;c++)if(!(i=s>>>v-c-1&1?i.right:i.left).left&&!i.right){r=i.val,b=b+c+1;break}32<=b&&(b-=32,A=y[++I]),n=r-T,B?(!(0<f&&M[u-1])&&0<o&&M[u-g]?n+=S[u-g]:n+=V,n&=255,V=S[u]=n):S[u]=n}t.ptr=t.ptr+4*(I+1)+(0<b?4:0)}t.pixels.resultPixels=D},decodeBits:function(e,t,a,i,r){var n=t.headerInfo,s=n.fileVersion,l=0,o=5<=e.byteLength-t.ptr?5:e.byteLength-t.ptr,f=new DataView(e,t.ptr,o),u=f.getUint8(0);l++;var c=u>>6,d=0==c?4:3-c,h=0<(32&u),m=31&u,g=0;if(1==d)g=f.getUint8(l),l++;else if(2==d)g=f.getUint16(l,!0),l+=2;else{if(4!=d)throw"Invalid valid pixel count type";g=f.getUint32(l,!0),l+=4}var p,w,x,k,y,I,b,U,v,T=2*n.maxZError,M=1<n.numDims?n.maxValues[r]:n.zMax;if(h){for(t.counter.lut++,U=f.getUint8(l),l++,k=Math.ceil((U-1)*m/8),y=Math.ceil(k/4),w=new ArrayBuffer(4*y),x=new Uint8Array(w),t.ptr+=l,x.set(new Uint8Array(e,t.ptr,k)),b=new Uint32Array(w),t.ptr+=k,v=0;U-1>>>v;)v++;k=Math.ceil(g*v/8),y=Math.ceil(k/4),w=new ArrayBuffer(4*y),(x=new Uint8Array(w)).set(new Uint8Array(e,t.ptr,k)),p=new Uint32Array(w),t.ptr+=k,I=(3<=s?S:A)(b,m,U-1,i,T,M),(3<=s?D:V)(p,a,v,g,I)}else t.counter.bitstuffer++,v=m,t.ptr+=l,0<v&&(k=Math.ceil(g*v/8),y=Math.ceil(k/4),w=new ArrayBuffer(4*y),(x=new Uint8Array(w)).set(new Uint8Array(e,t.ptr,k)),p=new Uint32Array(w),t.ptr+=k,3<=s?null===i?E(p,a,v,g):D(p,a,v,g,!1,i,T,M):null===i?P(p,a,v,g):V(p,a,v,g,!1,i,T,M))},readTiles:function(e,t,a){var i=t.headerInfo,r=i.width,n=i.height,s=i.microBlockSize,l=i.imageType,o=R.getDataTypeSize(l),f=Math.ceil(r/s),u=Math.ceil(n/s);t.pixels.numBlocksY=u,t.pixels.numBlocksX=f;for(var c,d,h,m,g,p,w,x,k,y,I,b,U,v,T,M=t.pixels.ptr=0,V=0,A=0,B=0,D=0,S=0,P=0,E=0,C=new a(s*s),F=n%s||s,L=r%s||s,O=i.numDims,N=t.pixels.resultMask,z=t.pixels.resultPixels,A=0;A<u;A++)for(c=A!==u-1?s:F,B=0;B<f;B++)for(D=A*r*s+B*s,p=r-(d=B!==f-1?s:L),T=0;T<O;T++){if(1<O&&(z=new a(t.pixels.resultPixels.buffer,r*n*T*o,r*n)),h=e.byteLength-t.ptr,k={},E=0,E++,g=(m=(x=new DataView(e,t.ptr,Math.min(10,h))).getUint8(0))>>6&255,(m>>2&15)!=(B*s>>3&15))throw"integrity issue";if(3<(b=3&m))throw t.ptr+=E,"Invalid block encoding ("+b+")";if(2!=b)if(0==b){if(t.counter.uncompressed++,t.ptr+=E,S=(S=c*d*o)<(w=e.byteLength-t.ptr)?S:w,y=new ArrayBuffer(S%o==0?S:S+o-S%o),new Uint8Array(y).set(new Uint8Array(e,t.ptr,S)),I=new a(y),P=0,N)for(M=0;M<c;M++){for(V=0;V<d;V++)N[D]&&(z[D]=I[P++]),D++;D+=p}else for(M=0;M<c;M++){for(V=0;V<d;V++)z[D++]=I[P++];D+=p}t.ptr+=P*o}else if(U=R.getDataTypeUsed(l,g),v=R.getOnePixel(k,E,U,x),E+=R.getDataTypeSize(U),3==b)if(t.ptr+=E,t.counter.constantoffset++,N)for(M=0;M<c;M++){for(V=0;V<d;V++)N[D]&&(z[D]=v),D++;D+=p}else for(M=0;M<c;M++){for(V=0;V<d;V++)z[D++]=v;D+=p}else if(t.ptr+=E,R.decodeBits(e,t,C,v,T),E=0,N)for(M=0;M<c;M++){for(V=0;V<d;V++)N[D]&&(z[D]=C[E++]),D++;D+=p}else for(M=0;M<c;M++){for(V=0;V<d;V++)z[D++]=C[E++];D+=p}else t.counter.constant++,t.ptr+=E}},formatFileInfo:function(e){return{fileIdentifierString:e.headerInfo.fileIdentifierString,fileVersion:e.headerInfo.fileVersion,imageType:e.headerInfo.imageType,height:e.headerInfo.height,width:e.headerInfo.width,numValidPixel:e.headerInfo.numValidPixel,microBlockSize:e.headerInfo.microBlockSize,blobSize:e.headerInfo.blobSize,maxZError:e.headerInfo.maxZError,pixelType:R.getPixelType(e.headerInfo.imageType),eofOffset:e.eofOffset,mask:e.mask?{numBytes:e.mask.numBytes}:null,pixels:{numBlocksX:e.pixels.numBlocksX,numBlocksY:e.pixels.numBlocksY,maxValue:e.headerInfo.zMax,minValue:e.headerInfo.zMin,noDataValue:e.noDataValue}}},constructConstantSurface:function(e){var t,a=e.headerInfo.zMax,i=e.headerInfo.numDims,r=e.headerInfo.height*e.headerInfo.width,n=r*i,s=0,l=0,o=e.pixels.resultMask;if(o)if(1<i)for(s=0;s<i;s++)for(t=s*r,l=0;l<r;l++)o[l]&&(e.pixels.resultPixels[t+l]=a);else for(l=0;l<r;l++)o[l]&&(e.pixels.resultPixels[l]=a);else if(e.pixels.resultPixels.fill)e.pixels.resultPixels.fill(a);else for(l=0;l<n;l++)e.pixels.resultPixels[l]=a},getDataTypeArray:function(e){var t;switch(e){case 0:t=Int8Array;break;case 1:t=Uint8Array;break;case 2:t=Int16Array;break;case 3:t=Uint16Array;break;case 4:t=Int32Array;break;case 5:t=Uint32Array;break;case 6:t=Float32Array;break;case 7:t=Float64Array;break;default:t=Float32Array}return t},getPixelType:function(e){var t;switch(e){case 0:t="S8";break;case 1:t="U8";break;case 2:t="S16";break;case 3:t="U16";break;case 4:t="S32";break;case 5:t="U32";break;case 6:t="F32";break;case 7:t="F64";break;default:t="F32"}return t},isValidPixelValue:function(e,t){if(null===t)return!1;var a;switch(e){case 0:a=-128<=t&&t<=127;break;case 1:a=0<=t&&t<=255;break;case 2:a=-32768<=t&&t<=32767;break;case 3:a=0<=t&&t<=65536;break;case 4:a=-2147483648<=t&&t<=2147483647;break;case 5:a=0<=t&&t<=4294967296;break;case 6:a=-34027999387901484e22<=t&&t<=34027999387901484e22;break;case 7:a=5e-324<=t&&t<=17976931348623157e292;break;default:a=!1}return a},getDataTypeSize:function(e){var t=0;switch(e){case 0:case 1:t=1;break;case 2:case 3:t=2;break;case 4:case 5:case 6:t=4;break;case 7:t=8;break;default:t=e}return t},getDataTypeUsed:function(e,t){var a=e;switch(e){case 2:case 4:a=e-t;break;case 3:case 5:a=e-2*t;break;case 6:a=0===t?e:1===t?2:1;break;case 7:a=0===t?e:e-2*t+1;break;default:a=e}return a},getOnePixel:function(e,t,a,i){var r=0;switch(a){case 0:r=i.getInt8(t);break;case 1:r=i.getUint8(t);break;case 2:r=i.getInt16(t,!0);break;case 3:r=i.getUint16(t,!0);break;case 4:r=i.getInt32(t,!0);break;case 5:r=i.getUInt32(t,!0);break;case 6:r=i.getFloat32(t,!0);break;case 7:r=i.getFloat64(t,!0);break;default:throw"the decoder does not understand this pixel type"}return r}},C=function(e,t,a){this.val=e,this.left=t,this.right=a},k={decode:function(e,t){var a=(t=t||{}).noDataValue,i=0,r={};if(r.ptr=t.inputOffset||0,r.pixels={},R.readHeaderInfo(e,r)){var n=r.headerInfo,s=n.fileVersion,l=R.getDataTypeArray(n.imageType);R.readMask(e,r),n.numValidPixel===n.width*n.height||r.pixels.resultMask||(r.pixels.resultMask=t.maskData);var o,f=n.width*n.height;if(r.pixels.resultPixels=new l(f*n.numDims),r.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0},0!==n.numValidPixel)if(n.zMax===n.zMin)R.constructConstantSurface(r);else if(4<=s&&R.checkMinMaxRanges(e,r))R.constructConstantSurface(r);else{var u=new DataView(e,r.ptr,2),c=u.getUint8(0);if(r.ptr++,c)R.readDataOneSweep(e,r,l);else if(1<s&&n.imageType<=1&&Math.abs(n.maxZError-.5)<1e-5){var d=u.getUint8(1);if(r.ptr++,2<(r.encodeMode=d)||s<4&&1<d)throw"Invalid Huffman flag "+d;d?R.readHuffman(e,r,l):R.readTiles(e,r,l)}else R.readTiles(e,r,l)}r.eofOffset=r.ptr,t.inputOffset?(o=r.headerInfo.blobSize+t.inputOffset-r.ptr,1<=Math.abs(o)&&(r.eofOffset=t.inputOffset+r.headerInfo.blobSize)):(o=r.headerInfo.blobSize-r.ptr,1<=Math.abs(o)&&(r.eofOffset=r.headerInfo.blobSize));var h={width:n.width,height:n.height,pixelData:r.pixels.resultPixels,minValue:n.zMin,maxValue:n.zMax,validPixelCount:n.numValidPixel,dimCount:n.numDims,dimStats:{minValues:n.minValues,maxValues:n.maxValues},maskData:r.pixels.resultMask};if(r.pixels.resultMask&&R.isValidPixelValue(n.imageType,a)){for(var m=r.pixels.resultMask,i=0;i<f;i++)m[i]||(h.pixelData[i]=a);h.noDataValue=a}return r.noDataValue=a,t.returnFileInfo&&(h.fileInfo=R.formatFileInfo(r)),h}},getBandCount:function(e){for(var t=0,a=0,i={ptr:0,pixels:{}};a<e.byteLength-58;)R.readHeaderInfo(e,i),a+=i.headerInfo.blobSize,t++,i.ptr=a;return t}},m=new ArrayBuffer(4),g=new Uint8Array(m),y=(new Uint32Array(m)[0]=1)===g[0],p={decode:function(e,t){if(!y)throw"Big endian system is not supported.";var a,i,r=(t=t||{}).inputOffset||0,n=new Uint8Array(e,r,10),s=String.fromCharCode.apply(null,n);if("CntZImage"===s.trim())a=x,i=1;else{if("Lerc2"!==s.substring(0,5))throw"Unexpected file identifier string: "+s;a=k,i=2}for(var l,o,f,u,c,d,h=0,m=e.byteLength-10,g=[],p={width:0,height:0,pixels:[],pixelType:t.pixelType,mask:null,statistics:[]};r<m;){var w=a.decode(e,{inputOffset:r,encodedMaskData:l,maskData:f,returnMask:0===h,returnEncodedMask:0===h,returnFileInfo:!0,pixelType:t.pixelType||null,noDataValue:t.noDataValue||null}),r=w.fileInfo.eofOffset;0===h&&(l=w.encodedMaskData,f=w.maskData,p.width=w.width,p.height=w.height,p.dimCount=w.dimCount||1,p.pixelType=w.pixelType||w.fileInfo.pixelType,p.mask=w.maskData),1<i&&w.fileInfo.mask&&0<w.fileInfo.mask.numBytes&&g.push(w.maskData),h++,p.pixels.push(w.pixelData),p.statistics.push({minValue:w.minValue,maxValue:w.maxValue,noDataValue:w.noDataValue,dimStats:w.dimStats})}if(1<i&&1<g.length){for(d=p.width*p.height,p.bandMasks=g,(f=new Uint8Array(d)).set(g[0]),u=1;u<g.length;u++)for(o=g[u],c=0;c<d;c++)f[c]=f[c]&o[c];p.maskData=f}return p}},w.Lerc=p;var I=w.Lerc;return l(function(e,t){if(e.encoding===o.LERC){var a;try{a=I.decode(e.heightmap)}catch(e){throw new n.RuntimeError(e)}if(a.statistics[0].minValue===Number.MAX_VALUE)throw new n.RuntimeError("Invalid tile data");e.heightmap=a.pixels[0],e.width=a.width,e.height=a.height}e.ellipsoid=Xe.Ellipsoid.clone(e.ellipsoid),e.rectangle=Xe.Rectangle.clone(e.rectangle);var i=Je.computeVertices(e),r=i.vertices;return t.push(r.buffer),{vertices:r.buffer,numberOfAttributes:i.encoding.getStride(),minimumHeight:i.minimumHeight,maximumHeight:i.maximumHeight,gridWidth:e.width,gridHeight:e.height,boundingSphere3D:i.boundingSphere3D,orientedBoundingBox:i.orientedBoundingBox,occludeePointInScaledSpace:i.occludeePointInScaledSpace,encoding:i.encoding,westIndicesSouthToNorth:i.westIndicesSouthToNorth,southIndicesEastToWest:i.southIndicesEastToWest,eastIndicesNorthToSouth:i.eastIndicesNorthToSouth,northIndicesWestToEast:i.northIndicesWestToEast}})}); diff --git a/web/assets/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js b/web/assets/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js new file mode 100644 index 00000000..d375868d --- /dev/null +++ b/web/assets/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./AttributeCompression-9fc99391","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./WebMercatorProjection-df58d479","./createTaskProcessorWorker","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./TerrainEncoding-b34235ca"],function(Te,e,pe,Ee,ye,t,r,n,fe,ve,i,o,Ne,a,we,xe,Me){"use strict";function Ce(){e.DeveloperError.throwInstantiationError()}Object.defineProperties(Ce.prototype,{errorEvent:{get:e.DeveloperError.throwInstantiationError},credit:{get:e.DeveloperError.throwInstantiationError},tilingScheme:{get:e.DeveloperError.throwInstantiationError},ready:{get:e.DeveloperError.throwInstantiationError},readyPromise:{get:e.DeveloperError.throwInstantiationError},hasWaterMask:{get:e.DeveloperError.throwInstantiationError},hasVertexNormals:{get:e.DeveloperError.throwInstantiationError},availability:{get:e.DeveloperError.throwInstantiationError}});var s=[];Ce.getRegularGridIndices=function(e,t){var r=s[e];Te.defined(r)||(s[e]=r=[]);var n=r[t];return Te.defined(n)||p(e,t,n=e*t<pe.CesiumMath.SIXTY_FOUR_KILOBYTES?r[t]=new Uint16Array((e-1)*(t-1)*6):r[t]=new Uint32Array((e-1)*(t-1)*6),0),n};var u=[];Ce.getRegularGridIndicesAndEdgeIndices=function(e,t){var r=u[e];Te.defined(r)||(u[e]=r=[]);var n,i,o,a,s,d,c=r[t];return Te.defined(c)||(n=Ce.getRegularGridIndices(e,t),o=(i=T(e,t)).westIndicesSouthToNorth,a=i.southIndicesEastToWest,s=i.eastIndicesNorthToSouth,d=i.northIndicesWestToEast,c=r[t]={indices:n,westIndicesSouthToNorth:o,southIndicesEastToWest:a,eastIndicesNorthToSouth:s,northIndicesWestToEast:d}),c};var g=[];function T(e,t){for(var r=new Array(t),n=new Array(e),i=new Array(t),o=new Array(e),a=0;a<e;++a)n[o[a]=a]=e*t-1-a;for(a=0;a<t;++a)i[a]=(a+1)*e-1,r[a]=(t-a-1)*e;return{westIndicesSouthToNorth:r,southIndicesEastToWest:n,eastIndicesNorthToSouth:i,northIndicesWestToEast:o}}function p(e,t,r,n){for(var i=0,o=0;o<t-1;++o){for(var a=0;a<e-1;++a){var s=i+e,d=s+1,c=i+1;r[n++]=i,r[n++]=s,r[n++]=c,r[n++]=c,r[n++]=s,r[n++]=d,++i}++i}}function d(e,t,r,n){for(var i=e[0],o=e.length,a=1;a<o;++a){var s=e[a];r[n++]=i,r[n++]=s,r[n++]=t,r[n++]=t,r[n++]=s,r[n++]=t+1,i=s,++t}return n}Ce.getRegularGridAndSkirtIndicesAndEdgeIndices=function(e,t){var r=g[e];Te.defined(r)||(g[e]=r=[]);var n,i,o,a,s,d,c,u,h,l,I,m=r[t];return Te.defined(m)||(a=(n=e*t)+(o=2*e+2*t),s=(i=(e-1)*(t-1)*6)+6*Math.max(0,o-4),c=(d=T(e,t)).westIndicesSouthToNorth,u=d.southIndicesEastToWest,h=d.eastIndicesNorthToSouth,l=d.northIndicesWestToEast,p(e,t,I=ve.IndexDatatype.createTypedArray(a,s),0),Ce.addSkirtIndices(c,u,h,l,n,I,i),m=r[t]={indices:I,westIndicesSouthToNorth:c,southIndicesEastToWest:u,eastIndicesNorthToSouth:h,northIndicesWestToEast:l,indexCountWithoutSkirts:i}),m},Ce.addSkirtIndices=function(e,t,r,n,i,o,a){var s=i;a=d(e,s,o,a),a=d(t,s+=e.length,o,a),a=d(r,s+=t.length,o,a),d(n,s+=r.length,o,a)},Ce.heightmapTerrainQuality=.25,Ce.getEstimatedLevelZeroGeometricErrorForAHeightmap=function(e,t,r){return 2*e.maximumRadius*Math.PI*Ce.heightmapTerrainQuality/(t*r)},Ce.prototype.requestTileGeometry=e.DeveloperError.throwInstantiationError,Ce.prototype.getLevelMaximumGeometricError=e.DeveloperError.throwInstantiationError,Ce.prototype.getTileDataAvailable=e.DeveloperError.throwInstantiationError,Ce.prototype.loadTileDataAvailability=e.DeveloperError.throwInstantiationError;var be=32767,Se=new Ee.Cartesian3,Ae=new Ee.Cartesian3,Pe=new Ee.Cartesian3,We=new Ee.Cartographic,De=new Ee.Cartesian2,Be=new Ee.Cartesian3,Fe=new ye.Matrix4,ke=new ye.Matrix4;function Ve(e,t,r,n,i,o,a,s,d){var c=Number.POSITIVE_INFINITY,u=i.north,h=i.south,l=i.east,I=i.west;l<I&&(l+=pe.CesiumMath.TWO_PI);for(var m=e.length,g=0;g<m;++g){var T=e[g],p=r[T],E=n[T];We.longitude=pe.CesiumMath.lerp(I,l,E.x),We.latitude=pe.CesiumMath.lerp(h,u,E.y),We.height=p-t;var y=o.cartographicToCartesian(We,Se);ye.Matrix4.multiplyByPoint(a,y,y),Ee.Cartesian3.minimumByComponent(y,s,s),Ee.Cartesian3.maximumByComponent(y,d,d),c=Math.min(c,We.height)}return c}function _e(e,t,r,n,i,o,a,s,d,c,u,h,l,I,m){var g=Te.defined(a),T=d.north,p=d.south,E=d.east,y=d.west;E<y&&(E+=pe.CesiumMath.TWO_PI);for(var f=r.length,v=0;v<f;++v){var N=r[v],w=i[N],x=o[N];We.longitude=pe.CesiumMath.lerp(y,E,x.x)+I,We.latitude=pe.CesiumMath.lerp(p,T,x.y)+m,We.height=w-c;var M,C,b,S,A,P=s.cartographicToCartesian(We,Se);g&&(M=2*N,De.x=a[M],De.y=a[1+M],1!==u&&(C=fe.AttributeCompression.octDecode(De.x,De.y,Be),b=ye.Transforms.eastNorthUpToFixedFrame(Se,s,ke),S=ye.Matrix4.inverseTransformation(b,Fe),ye.Matrix4.multiplyByPointAsVector(S,C,C),C.z*=u,Ee.Cartesian3.normalize(C,C),ye.Matrix4.multiplyByPointAsVector(b,C,C),Ee.Cartesian3.normalize(C,C),fe.AttributeCompression.octEncode(C,De))),n.hasWebMercatorT&&(A=(Ne.WebMercatorProjection.geodeticLatitudeToMercatorAngle(We.latitude)-h)*l),t=n.encode(e,t,P,x,We.height,De,A)}}function He(e,t){var r;return"function"==typeof e.slice&&"function"!=typeof(r=e.slice()).sort&&(r=void 0),Te.defined(r)||(r=Array.prototype.slice.call(e)),r.sort(t),r}return a(function(e,t){var r,n,i=e.quantizedVertices,o=i.length/3,a=e.octEncodedNormals,s=e.westIndices.length+e.eastIndices.length+e.southIndices.length+e.northIndices.length,d=e.includeWebMercatorT,c=Ee.Rectangle.clone(e.rectangle),u=c.west,h=c.south,l=c.east,I=c.north,m=Ee.Ellipsoid.clone(e.ellipsoid),g=e.exaggeration,T=e.minimumHeight*g,p=e.maximumHeight*g,E=e.relativeToCenter,y=ye.Transforms.eastNorthUpToFixedFrame(E,m),f=ye.Matrix4.inverseTransformation(y,new ye.Matrix4);d&&(r=Ne.WebMercatorProjection.geodeticLatitudeToMercatorAngle(h),n=1/(Ne.WebMercatorProjection.geodeticLatitudeToMercatorAngle(I)-r));var v=i.subarray(0,o),N=i.subarray(o,2*o),w=i.subarray(2*o,3*o),x=Te.defined(a),M=new Array(o),C=new Array(o),b=new Array(o),S=d?new Array(o):[],A=Ae;A.x=Number.POSITIVE_INFINITY,A.y=Number.POSITIVE_INFINITY,A.z=Number.POSITIVE_INFINITY;var P=Pe;P.x=Number.NEGATIVE_INFINITY,P.y=Number.NEGATIVE_INFINITY,P.z=Number.NEGATIVE_INFINITY;for(var W=Number.POSITIVE_INFINITY,D=Number.NEGATIVE_INFINITY,B=Number.POSITIVE_INFINITY,F=Number.NEGATIVE_INFINITY,k=0;k<o;++k){var V=v[k],_=N[k],H=V/be,O=_/be,G=pe.CesiumMath.lerp(T,p,w[k]/be);We.longitude=pe.CesiumMath.lerp(u,l,H),We.latitude=pe.CesiumMath.lerp(h,I,O),We.height=G,W=Math.min(We.longitude,W),D=Math.max(We.longitude,D),B=Math.min(We.latitude,B),F=Math.max(We.latitude,F);var Y=m.cartographicToCartesian(We);M[k]=new Ee.Cartesian2(H,O),C[k]=G,b[k]=Y,d&&(S[k]=(Ne.WebMercatorProjection.geodeticLatitudeToMercatorAngle(We.latitude)-r)*n),ye.Matrix4.multiplyByPoint(f,Y,Se),Ee.Cartesian3.minimumByComponent(Se,A,A),Ee.Cartesian3.maximumByComponent(Se,P,P)}var z,R,L,U=He(e.westIndices,function(e,t){return M[e].y-M[t].y}),j=He(e.eastIndices,function(e,t){return M[t].y-M[e].y}),q=He(e.southIndices,function(e,t){return M[t].x-M[e].x}),Q=He(e.northIndices,function(e,t){return M[e].x-M[t].x});1!==g&&(R=ye.BoundingSphere.fromPoints(b),z=xe.OrientedBoundingBox.fromRectangle(c,T,p,m)),(1!==g||T<0)&&(L=new Me.EllipsoidalOccluder(m).computeHorizonCullingPointPossiblyUnderEllipsoid(E,b,T));var K=T,K=Math.min(K,Ve(e.westIndices,e.westSkirtHeight,C,M,c,m,f,A,P));K=Math.min(K,Ve(e.southIndices,e.southSkirtHeight,C,M,c,m,f,A,P)),K=Math.min(K,Ve(e.eastIndices,e.eastSkirtHeight,C,M,c,m,f,A,P)),K=Math.min(K,Ve(e.northIndices,e.northSkirtHeight,C,M,c,m,f,A,P));for(var X,Z,J,$,ee=new we.AxisAlignedBoundingBox(A,P,E),te=new Me.TerrainEncoding(ee,K,p,y,x,d),re=te.getStride(),ne=new Float32Array(o*re+s*re),ie=0,oe=0;oe<o;++oe){x&&(X=2*oe,De.x=a[X],De.y=a[1+X],1!==g&&(Z=fe.AttributeCompression.octDecode(De.x,De.y,Be),J=ye.Transforms.eastNorthUpToFixedFrame(b[oe],m,ke),$=ye.Matrix4.inverseTransformation(J,Fe),ye.Matrix4.multiplyByPointAsVector($,Z,Z),Z.z*=g,Ee.Cartesian3.normalize(Z,Z),ye.Matrix4.multiplyByPointAsVector(J,Z,Z),Ee.Cartesian3.normalize(Z,Z),fe.AttributeCompression.octEncode(Z,De))),ie=te.encode(ne,ie,b[oe],M[oe],C[oe],De,S[oe])}var ae=Math.max(0,2*(s-4)),se=e.indices.length+3*ae,de=ve.IndexDatatype.createTypedArray(o+s,se);de.set(e.indices,0);var ce=1e-4*(D-W),ue=1e-4*(F-B),he=-ce,le=ce,Ie=ue,me=-ue,ge=o*re;return _e(ne,ge,U,te,C,M,a,m,c,e.westSkirtHeight,g,r,n,he,0),_e(ne,ge+=e.westIndices.length*re,q,te,C,M,a,m,c,e.southSkirtHeight,g,r,n,0,me),_e(ne,ge+=e.southIndices.length*re,j,te,C,M,a,m,c,e.eastSkirtHeight,g,r,n,le,0),_e(ne,ge+=e.eastIndices.length*re,Q,te,C,M,a,m,c,e.northSkirtHeight,g,r,n,0,Ie),Ce.addSkirtIndices(U,q,j,Q,o,de,e.indices.length),t.push(ne.buffer,de.buffer),{vertices:ne.buffer,indices:de.buffer,westIndicesSouthToNorth:U,southIndicesEastToWest:q,eastIndicesNorthToSouth:j,northIndicesWestToEast:Q,vertexStride:re,center:E,minimumHeight:T,maximumHeight:p,boundingSphere:R,orientedBoundingBox:z,occludeePointInScaledSpace:L,encoding:te,indexCountWithoutSkirts:e.indices.length}})}); diff --git a/web/assets/Cesium/Workers/createWallGeometry.js b/web/assets/Cesium/Workers/createWallGeometry.js new file mode 100644 index 00000000..02b1c44e --- /dev/null +++ b/web/assets/Cesium/Workers/createWallGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./VertexFormat-7572c785","./arrayRemoveDuplicates-ebc732b0","./EllipsoidRhumbLine-c704bf4c","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f","./WallGeometryLibrary-cfdc73e3"],function(Y,e,Z,j,K,t,a,Q,X,$,ee,i,n,p,r,o,s,m,te){"use strict";var ae=new j.Cartesian3,ie=new j.Cartesian3,ne=new j.Cartesian3,re=new j.Cartesian3,oe=new j.Cartesian3,se=new j.Cartesian3,me=new j.Cartesian3;function d(e){var t=(e=Y.defaultValue(e,Y.defaultValue.EMPTY_OBJECT)).positions,a=e.maximumHeights,i=e.minimumHeights,n=Y.defaultValue(e.vertexFormat,p.VertexFormat.DEFAULT),r=Y.defaultValue(e.granularity,Z.CesiumMath.RADIANS_PER_DEGREE),o=Y.defaultValue(e.ellipsoid,j.Ellipsoid.WGS84);this._positions=t,this._minimumHeights=i,this._maximumHeights=a,this._vertexFormat=p.VertexFormat.clone(n),this._granularity=r,this._ellipsoid=j.Ellipsoid.clone(o),this._workerName="createWallGeometry";var s=1+t.length*j.Cartesian3.packedLength+2;Y.defined(i)&&(s+=i.length),Y.defined(a)&&(s+=a.length),this.packedLength=s+j.Ellipsoid.packedLength+p.VertexFormat.packedLength+1}d.pack=function(e,t,a){var i;a=Y.defaultValue(a,0);var n=e._positions,r=n.length;for(t[a++]=r,i=0;i<r;++i,a+=j.Cartesian3.packedLength)j.Cartesian3.pack(n[i],t,a);var o=e._minimumHeights,r=Y.defined(o)?o.length:0;if(t[a++]=r,Y.defined(o))for(i=0;i<r;++i)t[a++]=o[i];var s=e._maximumHeights;if(r=Y.defined(s)?s.length:0,t[a++]=r,Y.defined(s))for(i=0;i<r;++i)t[a++]=s[i];return j.Ellipsoid.pack(e._ellipsoid,t,a),a+=j.Ellipsoid.packedLength,p.VertexFormat.pack(e._vertexFormat,t,a),t[a+=p.VertexFormat.packedLength]=e._granularity,t};var c=j.Ellipsoid.clone(j.Ellipsoid.UNIT_SPHERE),f=new p.VertexFormat,y={positions:void 0,minimumHeights:void 0,maximumHeights:void 0,ellipsoid:c,vertexFormat:f,granularity:void 0};return d.unpack=function(e,t,a){t=Y.defaultValue(t,0);for(var i,n,r=e[t++],o=new Array(r),s=0;s<r;++s,t+=j.Cartesian3.packedLength)o[s]=j.Cartesian3.unpack(e,t);if(0<(r=e[t++]))for(i=new Array(r),s=0;s<r;++s)i[s]=e[t++];if(0<(r=e[t++]))for(n=new Array(r),s=0;s<r;++s)n[s]=e[t++];var m=j.Ellipsoid.unpack(e,t,c);t+=j.Ellipsoid.packedLength;var l=p.VertexFormat.unpack(e,t,f),u=e[t+=p.VertexFormat.packedLength];return Y.defined(a)?(a._positions=o,a._minimumHeights=i,a._maximumHeights=n,a._ellipsoid=j.Ellipsoid.clone(m,a._ellipsoid),a._vertexFormat=p.VertexFormat.clone(l,a._vertexFormat),a._granularity=u,a):(y.positions=o,y.minimumHeights=i,y.maximumHeights=n,y.granularity=u,new d(y))},d.fromConstantHeights=function(e){var t=(e=Y.defaultValue(e,Y.defaultValue.EMPTY_OBJECT)).positions,a=e.minimumHeight,i=e.maximumHeight,n=Y.defined(a),r=Y.defined(i);if(n||r)for(var o=t.length,s=n?new Array(o):void 0,m=r?new Array(o):void 0,l=0;l<o;++l)n&&(s[l]=a),r&&(m[l]=i);return new d({positions:t,maximumHeights:m,minimumHeights:s,ellipsoid:e.ellipsoid,vertexFormat:e.vertexFormat})},d.createGeometry=function(e){var t=e._positions,a=e._minimumHeights,i=e._maximumHeights,n=e._vertexFormat,r=e._granularity,o=e._ellipsoid,s=te.WallGeometryLibrary.computePositions(o,t,i,a,r,!0);if(Y.defined(s)){for(var m=s.bottomPositions,l=s.topPositions,u=s.numCorners,p=l.length,d=2*p,c=n.position?new Float64Array(d):void 0,f=n.normal?new Float32Array(d):void 0,y=n.tangent?new Float32Array(d):void 0,g=n.bitangent?new Float32Array(d):void 0,h=n.st?new Float32Array(d/3*2):void 0,v=0,C=0,b=0,x=0,A=0,_=me,E=se,w=oe,F=!0,L=0,k=1/((p/=3)-u-1),H=0;H<p;++H){var V,G,D,P,T=3*H,z=j.Cartesian3.fromArray(l,T,ae),O=j.Cartesian3.fromArray(m,T,ie);n.position&&(c[v++]=O.x,c[v++]=O.y,c[v++]=O.z,c[v++]=z.x,c[v++]=z.y,c[v++]=z.z),n.st&&(h[A++]=L,h[A++]=0,h[A++]=L,h[A++]=1),(n.normal||n.tangent||n.bitangent)&&(V=j.Cartesian3.clone(j.Cartesian3.ZERO,re),G=j.Cartesian3.subtract(z,o.geodeticSurfaceNormal(z,ie),ie),H+1<p&&(V=j.Cartesian3.fromArray(l,3+T,re)),F&&(D=j.Cartesian3.subtract(V,z,ne),P=j.Cartesian3.subtract(G,z,ae),_=j.Cartesian3.normalize(j.Cartesian3.cross(P,D,_),_),F=!1),j.Cartesian3.equalsEpsilon(z,V,Z.CesiumMath.EPSILON10)?F=!0:(L+=k,n.tangent&&(E=j.Cartesian3.normalize(j.Cartesian3.subtract(V,z,E),E)),n.bitangent&&(w=j.Cartesian3.normalize(j.Cartesian3.cross(_,E,w),w))),n.normal&&(f[C++]=_.x,f[C++]=_.y,f[C++]=_.z,f[C++]=_.x,f[C++]=_.y,f[C++]=_.z),n.tangent&&(y[x++]=E.x,y[x++]=E.y,y[x++]=E.z,y[x++]=E.x,y[x++]=E.y,y[x++]=E.z),n.bitangent&&(g[b++]=w.x,g[b++]=w.y,g[b++]=w.z,g[b++]=w.x,g[b++]=w.y,g[b++]=w.z))}var R=new $.GeometryAttributes;n.position&&(R.position=new X.GeometryAttribute({componentDatatype:Q.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:c})),n.normal&&(R.normal=new X.GeometryAttribute({componentDatatype:Q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:f})),n.tangent&&(R.tangent=new X.GeometryAttribute({componentDatatype:Q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:y})),n.bitangent&&(R.bitangent=new X.GeometryAttribute({componentDatatype:Q.ComponentDatatype.FLOAT,componentsPerAttribute:3,values:g})),n.st&&(R.st=new X.GeometryAttribute({componentDatatype:Q.ComponentDatatype.FLOAT,componentsPerAttribute:2,values:h}));var S=d/3;d-=6*(u+1);var I=ee.IndexDatatype.createTypedArray(S,d),N=0;for(H=0;H<S-2;H+=2){var M,W,B=H,U=H+2,q=j.Cartesian3.fromArray(c,3*B,ae),J=j.Cartesian3.fromArray(c,3*U,ie);j.Cartesian3.equalsEpsilon(q,J,Z.CesiumMath.EPSILON10)||(M=H+1,W=H+3,I[N++]=M,I[N++]=B,I[N++]=W,I[N++]=W,I[N++]=B,I[N++]=U)}return new X.Geometry({attributes:R,indices:I,primitiveType:X.PrimitiveType.TRIANGLES,boundingSphere:new K.BoundingSphere.fromVertices(c)})}},function(e,t){return Y.defined(t)&&(e=d.unpack(e,t)),e._ellipsoid=j.Ellipsoid.clone(e._ellipsoid),d.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/createWallOutlineGeometry.js b/web/assets/Cesium/Workers/createWallOutlineGeometry.js new file mode 100644 index 00000000..8735e015 --- /dev/null +++ b/web/assets/Cesium/Workers/createWallOutlineGeometry.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./GeometryAttribute-44fb48f1","./GeometryAttributes-4fcfcf40","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./arrayRemoveDuplicates-ebc732b0","./EllipsoidRhumbLine-c704bf4c","./EllipsoidGeodesic-30fae80b","./PolylinePipeline-8a1a1e4f","./WallGeometryLibrary-cfdc73e3"],function(G,e,L,x,P,i,t,T,D,V,I,a,n,r,o,s,l,R){"use strict";var S=new x.Cartesian3,M=new x.Cartesian3;function d(e){var i=(e=G.defaultValue(e,G.defaultValue.EMPTY_OBJECT)).positions,t=e.maximumHeights,a=e.minimumHeights,n=G.defaultValue(e.granularity,L.CesiumMath.RADIANS_PER_DEGREE),r=G.defaultValue(e.ellipsoid,x.Ellipsoid.WGS84);this._positions=i,this._minimumHeights=a,this._maximumHeights=t,this._granularity=n,this._ellipsoid=x.Ellipsoid.clone(r),this._workerName="createWallOutlineGeometry";var o=1+i.length*x.Cartesian3.packedLength+2;G.defined(a)&&(o+=a.length),G.defined(t)&&(o+=t.length),this.packedLength=o+x.Ellipsoid.packedLength+1}d.pack=function(e,i,t){var a;t=G.defaultValue(t,0);var n=e._positions,r=n.length;for(i[t++]=r,a=0;a<r;++a,t+=x.Cartesian3.packedLength)x.Cartesian3.pack(n[a],i,t);var o=e._minimumHeights,r=G.defined(o)?o.length:0;if(i[t++]=r,G.defined(o))for(a=0;a<r;++a)i[t++]=o[a];var s=e._maximumHeights;if(r=G.defined(s)?s.length:0,i[t++]=r,G.defined(s))for(a=0;a<r;++a)i[t++]=s[a];return x.Ellipsoid.pack(e._ellipsoid,i,t),i[t+=x.Ellipsoid.packedLength]=e._granularity,i};var u=x.Ellipsoid.clone(x.Ellipsoid.UNIT_SPHERE),p={positions:void 0,minimumHeights:void 0,maximumHeights:void 0,ellipsoid:u,granularity:void 0};return d.unpack=function(e,i,t){i=G.defaultValue(i,0);for(var a,n,r=e[i++],o=new Array(r),s=0;s<r;++s,i+=x.Cartesian3.packedLength)o[s]=x.Cartesian3.unpack(e,i);if(0<(r=e[i++]))for(a=new Array(r),s=0;s<r;++s)a[s]=e[i++];if(0<(r=e[i++]))for(n=new Array(r),s=0;s<r;++s)n[s]=e[i++];var l=x.Ellipsoid.unpack(e,i,u),m=e[i+=x.Ellipsoid.packedLength];return G.defined(t)?(t._positions=o,t._minimumHeights=a,t._maximumHeights=n,t._ellipsoid=x.Ellipsoid.clone(l,t._ellipsoid),t._granularity=m,t):(p.positions=o,p.minimumHeights=a,p.maximumHeights=n,p.granularity=m,new d(p))},d.fromConstantHeights=function(e){var i=(e=G.defaultValue(e,G.defaultValue.EMPTY_OBJECT)).positions,t=e.minimumHeight,a=e.maximumHeight,n=G.defined(t),r=G.defined(a);if(n||r)for(var o=i.length,s=n?new Array(o):void 0,l=r?new Array(o):void 0,m=0;m<o;++m)n&&(s[m]=t),r&&(l[m]=a);return new d({positions:i,maximumHeights:l,minimumHeights:s,ellipsoid:e.ellipsoid})},d.createGeometry=function(e){var i=e._positions,t=e._minimumHeights,a=e._maximumHeights,n=e._granularity,r=e._ellipsoid,o=R.WallGeometryLibrary.computePositions(r,i,a,t,n,!1);if(G.defined(o)){var s=o.bottomPositions,l=o.topPositions,m=l.length,d=2*m,u=new Float64Array(d),p=0;for(m/=3,v=0;v<m;++v){var f=3*v,c=x.Cartesian3.fromArray(l,f,S),h=x.Cartesian3.fromArray(s,f,M);u[p++]=h.x,u[p++]=h.y,u[p++]=h.z,u[p++]=c.x,u[p++]=c.y,u[p++]=c.z}for(var g=new V.GeometryAttributes({position:new D.GeometryAttribute({componentDatatype:T.ComponentDatatype.DOUBLE,componentsPerAttribute:3,values:u})}),y=d/3,d=2*y-4+y,_=I.IndexDatatype.createTypedArray(y,d),E=0,v=0;v<y-2;v+=2){var C,b,H=v,A=v+2,k=x.Cartesian3.fromArray(u,3*H,S),w=x.Cartesian3.fromArray(u,3*A,M);x.Cartesian3.equalsEpsilon(k,w,L.CesiumMath.EPSILON10)||(C=v+1,b=v+3,_[E++]=C,_[E++]=H,_[E++]=C,_[E++]=b,_[E++]=H,_[E++]=A)}return _[E++]=y-2,_[E++]=y-1,new D.Geometry({attributes:g,indices:_,primitiveType:D.PrimitiveType.LINES,boundingSphere:new P.BoundingSphere.fromVertices(u)})}},function(e,i){return G.defined(i)&&(e=d.unpack(e,i)),e._ellipsoid=x.Ellipsoid.clone(e._ellipsoid),d.createGeometry(e)}}); diff --git a/web/assets/Cesium/Workers/decodeDraco.js b/web/assets/Cesium/Workers/decodeDraco.js new file mode 100644 index 00000000..1ccda6f3 --- /dev/null +++ b/web/assets/Cesium/Workers/decodeDraco.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./IndexDatatype-53503fee","./createTaskProcessorWorker"],function(f,e,t,m,r,A,b,n){"use strict";var w;function l(e,t,r){var n,a=e.num_points(),o=r.num_components(),i=new w.AttributeQuantizationTransform;if(i.InitFromAttribute(r)){for(var u=new Array(o),s=0;s<o;++s)u[s]=i.min_value(s);n={quantizationBits:i.quantization_bits(),minValues:u,range:i.range(),octEncoded:!1}}w.destroy(i),(i=new w.AttributeOctahedronTransform).InitFromAttribute(r)&&(n={quantizationBits:i.quantization_bits(),octEncoded:!0}),w.destroy(i);var c=a*o,d=f.defined(n)?function(e,t,r,n,a){var o,i;n.quantizationBits<=8?(i=new w.DracoUInt8Array,o=new Uint8Array(a),t.GetAttributeUInt8ForAllPoints(e,r,i)):(i=new w.DracoUInt16Array,o=new Uint16Array(a),t.GetAttributeUInt16ForAllPoints(e,r,i));for(var u=0;u<a;++u)o[u]=i.GetValue(u);return w.destroy(i),o}(e,t,r,n,c):function(e,t,r,n){var a,o;switch(r.data_type()){case 1:case 11:o=new w.DracoInt8Array,a=new Int8Array(n),t.GetAttributeInt8ForAllPoints(e,r,o);break;case 2:o=new w.DracoUInt8Array,a=new Uint8Array(n),t.GetAttributeUInt8ForAllPoints(e,r,o);break;case 3:o=new w.DracoInt16Array,a=new Int16Array(n),t.GetAttributeInt16ForAllPoints(e,r,o);break;case 4:o=new w.DracoUInt16Array,a=new Uint16Array(n),t.GetAttributeUInt16ForAllPoints(e,r,o);break;case 5:case 7:o=new w.DracoInt32Array,a=new Int32Array(n),t.GetAttributeInt32ForAllPoints(e,r,o);break;case 6:case 8:o=new w.DracoUInt32Array,a=new Uint32Array(n),t.GetAttributeUInt32ForAllPoints(e,r,o);break;case 9:case 10:o=new w.DracoFloat32Array,a=new Float32Array(n),t.GetAttributeFloatForAllPoints(e,r,o)}for(var i=0;i<n;++i)a[i]=o.GetValue(i);return w.destroy(o),a}(e,t,r,c),y=A.ComponentDatatype.fromTypedArray(d);return{array:d,data:{componentsPerAttribute:o,componentDatatype:y,byteOffset:r.byte_offset(),byteStride:A.ComponentDatatype.getSizeInBytes(y)*o,normalized:r.normalized(),quantization:n}}}function a(e){var t=new w.Decoder,r=["POSITION","NORMAL","COLOR","TEX_COORD"];if(e.dequantizeInShader)for(var n=0;n<r.length;++n)t.SkipAttributeTransform(w[r[n]]);var a=e.bufferView,o=new w.DecoderBuffer;if(o.Init(e.array,a.byteLength),t.GetEncodedGeometryType(o)!==w.TRIANGULAR_MESH)throw new m.RuntimeError("Unsupported draco mesh geometry type.");var i=new w.Mesh,u=t.DecodeBufferToMesh(o,i);if(!u.ok()||0===i.ptr)throw new m.RuntimeError("Error decoding draco mesh geometry: "+u.error_msg());w.destroy(o);var s,c,d={},y=e.compressedAttributes;for(var f in y){y.hasOwnProperty(f)&&(s=y[f],c=t.GetAttributeByUniqueId(i,s),d[f]=l(i,t,c))}var A={indexArray:function(e,t){for(var r=e.num_points(),n=e.num_faces(),a=new w.DracoInt32Array,o=3*n,i=b.IndexDatatype.createTypedArray(r,o),u=0,s=0;s<n;++s)t.GetFaceFromMesh(e,s,a),i[u+0]=a.GetValue(0),i[u+1]=a.GetValue(1),i[u+2]=a.GetValue(2),u+=3;return w.destroy(a),{typedArray:i,numberOfIndices:o}}(i,t),attributeData:d};return w.destroy(i),w.destroy(t),A}function o(e){return(f.defined(e.primitive)?a:function(e){var t=new w.Decoder;e.dequantizeInShader&&(t.SkipAttributeTransform(w.POSITION),t.SkipAttributeTransform(w.NORMAL));var r=new w.DecoderBuffer;if(r.Init(e.buffer,e.buffer.length),t.GetEncodedGeometryType(r)!==w.POINT_CLOUD)throw new m.RuntimeError("Draco geometry type must be POINT_CLOUD.");var n=new w.PointCloud,a=t.DecodeBufferToPointCloud(r,n);if(!a.ok()||0===n.ptr)throw new m.RuntimeError("Error decoding draco point cloud: "+a.error_msg());w.destroy(r);var o,i,u={},s=e.properties;for(var c in s){s.hasOwnProperty(c)&&(o=s[c],i=t.GetAttributeByUniqueId(n,o),u[c]=l(n,t,i))}return w.destroy(n),w.destroy(t),u})(e)}function i(e){w=e,self.onmessage=n(o),self.postMessage(!0)}return function(e){var t=e.data.webAssemblyConfig;if(f.defined(t))return require([t.modulePath],function(e){f.defined(t.wasmBinaryFile)?(f.defined(e)||(e=self.DracoDecoderModule),e(t).then(function(e){i(e)})):i(e())})}}); diff --git a/web/assets/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js b/web/assets/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js new file mode 100644 index 00000000..a3df98bc --- /dev/null +++ b/web/assets/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./RuntimeError-2109023a","./createTaskProcessorWorker"],function(i,e,S,t){"use strict";var h=1953029805,c=2917034100;function b(e,t){if(b.passThroughDataForTesting)return t;var i=e.byteLength;if(0===i||i%4!=0)throw new S.RuntimeError("The length of key must be greater than 0 and a multiple of 4.");var n=new DataView(t),r=n.getUint32(0,!0);if(r===h||r===c)return t;for(var a,o=new DataView(e),s=0,f=t.byteLength,l=f-f%8,u=i,d=8;s<l;)for(a=d=(d+8)%24;s<l&&a<u;)n.setUint32(s,n.getUint32(s,!0)^o.getUint32(a,!0),!0),n.setUint32(s+4,n.getUint32(s+4,!0)^o.getUint32(a+4,!0),!0),s+=8,a+=24;if(s<f)for(u<=a&&(a=d=(d+8)%24);s<f;)n.setUint8(s,n.getUint8(s)^o.getUint8(a)),s++,a++}function n(e,t){return 0!=(e&t)}b.passThroughDataForTesting=!1;var r=[1,2,4,8];function T(e,t,i,n,r,a){this._bits=e,this.cnodeVersion=t,this.imageryVersion=i,this.terrainVersion=n,this.imageryProvider=r,this.terrainProvider=a,this.ancestorHasTerrain=!1,this.terrainState=void 0}T.clone=function(e,t){return i.defined(t)?(t._bits=e._bits,t.cnodeVersion=e.cnodeVersion,t.imageryVersion=e.imageryVersion,t.terrainVersion=e.terrainVersion,t.imageryProvider=e.imageryProvider,t.terrainProvider=e.terrainProvider):t=new T(e._bits,e.cnodeVersion,e.imageryVersion,e.terrainVersion,e.imageryProvider,e.terrainProvider),t.ancestorHasTerrain=e.ancestorHasTerrain,t.terrainState=e.terrainState,t},T.prototype.setParent=function(e){this.ancestorHasTerrain=e.ancestorHasTerrain||this.hasTerrain()},T.prototype.hasSubtree=function(){return n(this._bits,16)},T.prototype.hasImagery=function(){return n(this._bits,64)},T.prototype.hasTerrain=function(){return n(this._bits,128)},T.prototype.hasChildren=function(){return n(this._bits,15)},T.prototype.hasChild=function(e){return n(this._bits,r[e])},T.prototype.getChildBitmask=function(){return 15&this._bits};var s=function a(o,s,f){function l(i,e){if(!s[i]){if(!o[i]){var t="function"==typeof require&&require;if(!e&&t)return t(i,!0);if(u)return u(i,!0);var n=new Error("Cannot find module '"+i+"'");throw n.code="MODULE_NOT_FOUND",n}var r=s[i]={exports:{}};o[i][0].call(r.exports,function(e){var t=o[i][1][e];return l(t||e)},r,r.exports,a,o,s,f)}return s[i].exports}for(var u="function"==typeof require&&require,e=0;e<f.length;e++)l(f[e]);return l}({1:[function(e,t,i){var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;i.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(var n in i)i.hasOwnProperty(n)&&(e[n]=i[n])}}return e},i.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var r={arraySet:function(e,t,i,n,r){if(t.subarray&&e.subarray)e.set(t.subarray(i,i+n),r);else for(var a=0;a<n;a++)e[r+a]=t[i+a]},flattenChunks:function(e){var t,i,n,r,a,o;for(t=n=0,i=e.length;t<i;t++)n+=e[t].length;for(o=new Uint8Array(n),t=r=0,i=e.length;t<i;t++)a=e[t],o.set(a,r),r+=a.length;return o}},a={arraySet:function(e,t,i,n,r){for(var a=0;a<n;a++)e[r+a]=t[i+a]},flattenChunks:function(e){return[].concat.apply([],e)}};i.setTyped=function(e){e?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,r)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,a))},i.setTyped(n)},{}],2:[function(e,t,i){var f=e("./common"),r=!0,a=!0;try{String.fromCharCode.apply(null,[0])}catch(e){r=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){a=!1}for(var l=new f.Buf8(256),n=0;n<256;n++)l[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function u(e,t){if(t<65537&&(e.subarray&&a||!e.subarray&&r))return String.fromCharCode.apply(null,f.shrinkBuf(e,t));for(var i="",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}l[254]=l[254]=1,i.string2buf=function(e){var t,i,n,r,a,o=e.length,s=0;for(r=0;r<o;r++)55296==(64512&(i=e.charCodeAt(r)))&&r+1<o&&56320==(64512&(n=e.charCodeAt(r+1)))&&(i=65536+(i-55296<<10)+(n-56320),r++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new f.Buf8(s),r=a=0;a<s;r++)55296==(64512&(i=e.charCodeAt(r)))&&r+1<o&&56320==(64512&(n=e.charCodeAt(r+1)))&&(i=65536+(i-55296<<10)+(n-56320),r++),i<128?t[a++]=i:(i<2048?t[a++]=192|i>>>6:(i<65536?t[a++]=224|i>>>12:(t[a++]=240|i>>>18,t[a++]=128|i>>>12&63),t[a++]=128|i>>>6&63),t[a++]=128|63&i);return t},i.buf2binstring=function(e){return u(e,e.length)},i.binstring2buf=function(e){for(var t=new f.Buf8(e.length),i=0,n=t.length;i<n;i++)t[i]=e.charCodeAt(i);return t},i.buf2string=function(e,t){var i,n,r,a,o=t||e.length,s=new Array(2*o);for(i=n=0;i<o;)if((r=e[i++])<128)s[n++]=r;else if(4<(a=l[r]))s[n++]=65533,i+=a-1;else{for(r&=2===a?31:3===a?15:7;1<a&&i<o;)r=r<<6|63&e[i++],a--;1<a?s[n++]=65533:r<65536?s[n++]=r:(r-=65536,s[n++]=55296|r>>10&1023,s[n++]=56320|1023&r)}return u(s,n)},i.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;0<=i&&128==(192&e[i]);)i--;return!(i<0)&&0!==i&&i+l[e[i]]>t?i:t}},{"./common":1}],3:[function(e,t,i){t.exports=function(e,t,i,n){var r=65535&e|0,a=e>>>16&65535|0,o=0;for(;0!==i;){for(i-=o=2e3<i?2e3:i;r=r+t[n++]|0,a=a+r|0,--o;);r%=65521,a%=65521}return r|a<<16|0}},{}],4:[function(e,t,i){t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],5:[function(e,t,i){var s=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();t.exports=function(e,t,i,n){var r=s,a=n+i;e^=-1;for(var o=n;o<a;o++)e=e>>>8^r[255&(e^t[o])];return-1^e}},{}],6:[function(e,t,i){t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],7:[function(e,t,i){t.exports=function(e,t){var i,n,r,a,o,s,f,l,u,d,h,c,b,m,w,g,v,k,_,p,y,x,E,S,T;i=e.state,n=e.next_in,S=e.input,r=n+(e.avail_in-5),a=e.next_out,T=e.output,o=a-(t-e.avail_out),s=a+(e.avail_out-257),f=i.dmax,l=i.wsize,u=i.whave,d=i.wnext,h=i.window,c=i.hold,b=i.bits,m=i.lencode,w=i.distcode,g=(1<<i.lenbits)-1,v=(1<<i.distbits)-1;e:do{b<15&&(c+=S[n++]<<b,b+=8,c+=S[n++]<<b,b+=8),k=m[c&g];t:for(;;){if(c>>>=_=k>>>24,b-=_,0===(_=k>>>16&255))T[a++]=65535&k;else{if(!(16&_)){if(0==(64&_)){k=m[(65535&k)+(c&(1<<_)-1)];continue t}if(32&_){i.mode=12;break e}e.msg="invalid literal/length code",i.mode=30;break e}p=65535&k,(_&=15)&&(b<_&&(c+=S[n++]<<b,b+=8),p+=c&(1<<_)-1,c>>>=_,b-=_),b<15&&(c+=S[n++]<<b,b+=8,c+=S[n++]<<b,b+=8),k=w[c&v];i:for(;;){if(c>>>=_=k>>>24,b-=_,!(16&(_=k>>>16&255))){if(0==(64&_)){k=w[(65535&k)+(c&(1<<_)-1)];continue i}e.msg="invalid distance code",i.mode=30;break e}if(y=65535&k,b<(_&=15)&&(c+=S[n++]<<b,(b+=8)<_&&(c+=S[n++]<<b,b+=8)),f<(y+=c&(1<<_)-1)){e.msg="invalid distance too far back",i.mode=30;break e}if(c>>>=_,b-=_,(_=a-o)<y){if(u<(_=y-_)&&i.sane){e.msg="invalid distance too far back",i.mode=30;break e}if(E=h,(x=0)===d){if(x+=l-_,_<p){for(p-=_;T[a++]=h[x++],--_;);x=a-y,E=T}}else if(d<_){if(x+=l+d-_,(_-=d)<p){for(p-=_;T[a++]=h[x++],--_;);if(x=0,d<p){for(p-=_=d;T[a++]=h[x++],--_;);x=a-y,E=T}}}else if(x+=d-_,_<p){for(p-=_;T[a++]=h[x++],--_;);x=a-y,E=T}for(;2<p;)T[a++]=E[x++],T[a++]=E[x++],T[a++]=E[x++],p-=3;p&&(T[a++]=E[x++],1<p&&(T[a++]=E[x++]))}else{for(x=a-y;T[a++]=T[x++],T[a++]=T[x++],T[a++]=T[x++],2<(p-=3););p&&(T[a++]=T[x++],1<p&&(T[a++]=T[x++]))}break}}break}}while(n<r&&a<s);n-=p=b>>3,c&=(1<<(b-=p<<3))-1,e.next_in=n,e.next_out=a,e.avail_in=n<r?r-n+5:5-(n-r),e.avail_out=a<s?s-a+257:257-(a-s),i.hold=c,i.bits=b}},{}],8:[function(e,t,i){var B=e("../utils/common"),U=e("./adler32"),Z=e("./crc32"),I=e("./inffast"),D=e("./inftrees"),N=1,O=2,z=0,C=-2,F=1,n=852,r=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function a(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new B.Buf16(320),this.work=new B.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=F,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new B.Buf32(n),t.distcode=t.distdyn=new B.Buf32(r),t.sane=1,t.back=-1,z):C}function s(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,o(e)):C}function f(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?C:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,s(e))):C}function l(e,t){var i,n;return e?(n=new a,(e.state=n).window=null,(i=f(e,t))!==z&&(e.state=null),i):C}var u,d,h=!0;function H(e){if(h){var t;for(u=new B.Buf32(512),d=new B.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(D(N,e.lens,0,288,u,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;D(O,e.lens,0,32,d,0,e.work,{bits:5}),h=!1}e.lencode=u,e.lenbits=9,e.distcode=d,e.distbits=5}function P(e,t,i,n){var r,a=e.state;return null===a.window&&(a.wsize=1<<a.wbits,a.wnext=0,a.whave=0,a.window=new B.Buf8(a.wsize)),n>=a.wsize?(B.arraySet(a.window,t,i-a.wsize,a.wsize,0),a.wnext=0,a.whave=a.wsize):(r=a.wsize-a.wnext,n<r&&(r=n),B.arraySet(a.window,t,i-n,r,a.wnext),(n-=r)?(B.arraySet(a.window,t,i-n,n,0),a.wnext=n,a.whave=a.wsize):(a.wnext+=r,a.wnext===a.wsize&&(a.wnext=0),a.whave<a.wsize&&(a.whave+=r))),0}i.inflateReset=s,i.inflateReset2=f,i.inflateResetKeep=o,i.inflateInit=function(e){return l(e,15)},i.inflateInit2=l,i.inflate=function(e,t){var i,n,r,a,o,s,f,l,u,d,h,c,b,m,w,g,v,k,_,p,y,x,E,S,T=0,R=new B.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return C;12===(i=e.state).mode&&(i.mode=13);o=e.next_out,r=e.output,f=e.avail_out,a=e.next_in,n=e.input,s=e.avail_in,l=i.hold,u=i.bits,d=s,h=f,x=z;e:for(;;)switch(i.mode){case F:if(0===i.wrap){i.mode=13;break}for(;u<16;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(2&i.wrap&&35615===l){i.check=0,R[0]=255&l,R[1]=l>>>8&255,i.check=Z(i.check,R,2,0),u=l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg="incorrect header check",i.mode=30;break}if(8!=(15&l)){e.msg="unknown compression method",i.mode=30;break}if(u-=4,y=8+(15&(l>>>=4)),0===i.wbits)i.wbits=y;else if(y>i.wbits){e.msg="invalid window size",i.mode=30;break}i.dmax=1<<y,e.adler=i.check=1,i.mode=512&l?10:12,u=l=0;break;case 2:for(;u<16;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(i.flags=l,8!=(255&i.flags)){e.msg="unknown compression method",i.mode=30;break}if(57344&i.flags){e.msg="unknown header flags set",i.mode=30;break}i.head&&(i.head.text=l>>8&1),512&i.flags&&(R[0]=255&l,R[1]=l>>>8&255,i.check=Z(i.check,R,2,0)),u=l=0,i.mode=3;case 3:for(;u<32;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}i.head&&(i.head.time=l),512&i.flags&&(R[0]=255&l,R[1]=l>>>8&255,R[2]=l>>>16&255,R[3]=l>>>24&255,i.check=Z(i.check,R,4,0)),u=l=0,i.mode=4;case 4:for(;u<16;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}i.head&&(i.head.xflags=255&l,i.head.os=l>>8),512&i.flags&&(R[0]=255&l,R[1]=l>>>8&255,i.check=Z(i.check,R,2,0)),u=l=0,i.mode=5;case 5:if(1024&i.flags){for(;u<16;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}i.length=l,i.head&&(i.head.extra_len=l),512&i.flags&&(R[0]=255&l,R[1]=l>>>8&255,i.check=Z(i.check,R,2,0)),u=l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(c=i.length,s<c&&(c=s),c&&(i.head&&(y=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),B.arraySet(i.head.extra,n,a,c,y)),512&i.flags&&(i.check=Z(i.check,n,c,a)),s-=c,a+=c,i.length-=c),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===s)break e;for(c=0;y=n[a+c++],i.head&&y&&i.length<65536&&(i.head.name+=String.fromCharCode(y)),y&&c<s;);if(512&i.flags&&(i.check=Z(i.check,n,c,a)),s-=c,a+=c,y)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===s)break e;for(c=0;y=n[a+c++],i.head&&y&&i.length<65536&&(i.head.comment+=String.fromCharCode(y)),y&&c<s;);if(512&i.flags&&(i.check=Z(i.check,n,c,a)),s-=c,a+=c,y)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;u<16;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(l!==(65535&i.check)){e.msg="header crc mismatch",i.mode=30;break}u=l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=12;break;case 10:for(;u<32;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}e.adler=i.check=L(l),u=l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=o,e.avail_out=f,e.next_in=a,e.avail_in=s,i.hold=l,i.bits=u,2;e.adler=i.check=1,i.mode=12;case 12:if(5===t||6===t)break e;case 13:if(i.last){l>>>=7&u,u-=7&u,i.mode=27;break}for(;u<3;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}switch(i.last=1&l,--u,3&(l>>>=1)){case 0:i.mode=14;break;case 1:if(H(i),i.mode=20,6!==t)break;l>>>=2,u-=2;break e;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=30}l>>>=2,u-=2;break;case 14:for(l>>>=7&u,u-=7&u;u<32;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if((65535&l)!=(l>>>16^65535)){e.msg="invalid stored block lengths",i.mode=30;break}if(i.length=65535&l,u=l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(c=i.length){if(s<c&&(c=s),f<c&&(c=f),0===c)break e;B.arraySet(r,n,a,c,o),s-=c,a+=c,f-=c,o+=c,i.length-=c;break}i.mode=12;break;case 17:for(;u<14;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(i.nlen=257+(31&l),l>>>=5,u-=5,i.ndist=1+(31&l),l>>>=5,u-=5,i.ncode=4+(15&l),l>>>=4,u-=4,286<i.nlen||30<i.ndist){e.msg="too many length or distance symbols",i.mode=30;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;u<3;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}i.lens[A[i.have++]]=7&l,l>>>=3,u-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,E={bits:i.lenbits},x=D(0,i.lens,0,19,i.lencode,0,i.work,E),i.lenbits=E.bits,x){e.msg="invalid code lengths set",i.mode=30;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;T=i.lencode[l&(1<<i.lenbits)-1],g=T>>>16&255,v=65535&T,!((w=T>>>24)<=u);){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(v<16)l>>>=w,u-=w,i.lens[i.have++]=v;else{if(16===v){for(S=w+2;u<S;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(l>>>=w,u-=w,0===i.have){e.msg="invalid bit length repeat",i.mode=30;break}y=i.lens[i.have-1],c=3+(3&l),l>>>=2,u-=2}else if(17===v){for(S=w+3;u<S;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}u-=w,y=0,c=3+(7&(l>>>=w)),l>>>=3,u-=3}else{for(S=w+7;u<S;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}u-=w,y=0,c=11+(127&(l>>>=w)),l>>>=7,u-=7}if(i.have+c>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=30;break}for(;c--;)i.lens[i.have++]=y}}if(30===i.mode)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=30;break}if(i.lenbits=9,E={bits:i.lenbits},x=D(N,i.lens,0,i.nlen,i.lencode,0,i.work,E),i.lenbits=E.bits,x){e.msg="invalid literal/lengths set",i.mode=30;break}if(i.distbits=6,i.distcode=i.distdyn,E={bits:i.distbits},x=D(O,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,E),i.distbits=E.bits,x){e.msg="invalid distances set",i.mode=30;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(6<=s&&258<=f){e.next_out=o,e.avail_out=f,e.next_in=a,e.avail_in=s,i.hold=l,i.bits=u,I(e,h),o=e.next_out,r=e.output,f=e.avail_out,a=e.next_in,n=e.input,s=e.avail_in,l=i.hold,u=i.bits,12===i.mode&&(i.back=-1);break}for(i.back=0;T=i.lencode[l&(1<<i.lenbits)-1],g=T>>>16&255,v=65535&T,!((w=T>>>24)<=u);){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(g&&0==(240&g)){for(k=w,_=g,p=v;T=i.lencode[p+((l&(1<<k+_)-1)>>k)],g=T>>>16&255,v=65535&T,!(k+(w=T>>>24)<=u);){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}l>>>=k,u-=k,i.back+=k}if(l>>>=w,u-=w,i.back+=w,i.length=v,0===g){i.mode=26;break}if(32&g){i.back=-1,i.mode=12;break}if(64&g){e.msg="invalid literal/length code",i.mode=30;break}i.extra=15&g,i.mode=22;case 22:if(i.extra){for(S=i.extra;u<S;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}i.length+=l&(1<<i.extra)-1,l>>>=i.extra,u-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;T=i.distcode[l&(1<<i.distbits)-1],g=T>>>16&255,v=65535&T,!((w=T>>>24)<=u);){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(0==(240&g)){for(k=w,_=g,p=v;T=i.distcode[p+((l&(1<<k+_)-1)>>k)],g=T>>>16&255,v=65535&T,!(k+(w=T>>>24)<=u);){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}l>>>=k,u-=k,i.back+=k}if(l>>>=w,u-=w,i.back+=w,64&g){e.msg="invalid distance code",i.mode=30;break}i.offset=v,i.extra=15&g,i.mode=24;case 24:if(i.extra){for(S=i.extra;u<S;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}i.offset+=l&(1<<i.extra)-1,l>>>=i.extra,u-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=30;break}i.mode=25;case 25:if(0===f)break e;if(c=h-f,i.offset>c){if((c=i.offset-c)>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=30;break}b=c>i.wnext?(c-=i.wnext,i.wsize-c):i.wnext-c,c>i.length&&(c=i.length),m=i.window}else m=r,b=o-i.offset,c=i.length;for(f<c&&(c=f),f-=c,i.length-=c;r[o++]=m[b++],--c;);0===i.length&&(i.mode=21);break;case 26:if(0===f)break e;r[o++]=i.length,f--,i.mode=21;break;case 27:if(i.wrap){for(;u<32;){if(0===s)break e;s--,l|=n[a++]<<u,u+=8}if(h-=f,e.total_out+=h,i.total+=h,h&&(e.adler=i.check=(i.flags?Z:U)(i.check,r,h,o-h)),h=f,(i.flags?l:L(l))!==i.check){e.msg="incorrect data check",i.mode=30;break}u=l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;u<32;){if(0===s)break e;s--,l+=n[a++]<<u,u+=8}if(l!==(4294967295&i.total)){e.msg="incorrect length check",i.mode=30;break}u=l=0}i.mode=29;case 29:x=1;break e;case 30:x=-3;break e;case 31:return-4;case 32:default:return C}e.next_out=o,e.avail_out=f,e.next_in=a,e.avail_in=s,i.hold=l,i.bits=u,(i.wsize||h!==e.avail_out&&i.mode<30&&(i.mode<27||4!==t))&&P(e,e.output,e.next_out,h-e.avail_out);d-=e.avail_in,h-=e.avail_out,e.total_in+=d,e.total_out+=h,i.total+=h,i.wrap&&h&&(e.adler=i.check=(i.flags?Z:U)(i.check,r,h,e.next_out-h));e.data_type=i.bits+(i.last?64:0)+(12===i.mode?128:0)+(20===i.mode||15===i.mode?256:0),(0==d&&0===h||4===t)&&x===z&&(x=-5);return x},i.inflateEnd=function(e){if(!e||!e.state)return C;var t=e.state;t.window&&(t.window=null);return e.state=null,z},i.inflateGetHeader=function(e,t){var i;return e&&e.state&&0!=(2&(i=e.state).wrap)?((i.head=t).done=!1,z):C},i.inflateSetDictionary=function(e,t){var i,n=t.length;if(!e||!e.state)return C;if(0!==(i=e.state).wrap&&11!==i.mode)return C;if(11===i.mode&&U(1,t,n,0)!==i.check)return-3;if(P(e,t,n,n))return i.mode=31,-4;return i.havedict=1,z},i.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":1,"./adler32":3,"./crc32":5,"./inffast":7,"./inftrees":9}],9:[function(e,t,i){var N=e("../utils/common"),O=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],z=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],C=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],F=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,i,n,r,a,o,s){var f,l,u,d,h,c,b,m,w,g=s.bits,v=0,k=0,_=0,p=0,y=0,x=0,E=0,S=0,T=0,R=0,A=null,B=0,U=new N.Buf16(16),Z=new N.Buf16(16),I=null,D=0;for(v=0;v<=15;v++)U[v]=0;for(k=0;k<n;k++)U[t[i+k]]++;for(y=g,p=15;1<=p&&0===U[p];p--);if(p<y&&(y=p),0===p)return r[a++]=20971520,r[a++]=20971520,s.bits=1,0;for(_=1;_<p&&0===U[_];_++);for(y<_&&(y=_),v=S=1;v<=15;v++)if(S<<=1,(S-=U[v])<0)return-1;if(0<S&&(0===e||1!==p))return-1;for(Z[1]=0,v=1;v<15;v++)Z[v+1]=Z[v]+U[v];for(k=0;k<n;k++)0!==t[i+k]&&(o[Z[t[i+k]]++]=k);if(c=0===e?(A=I=o,19):1===e?(A=O,B-=257,I=z,D-=257,256):(A=C,I=F,-1),v=_,h=a,E=k=R=0,u=-1,d=(T=1<<(x=y))-1,1===e&&852<T||2===e&&592<T)return 1;for(;;){for(b=v-E,w=o[k]<c?(m=0,o[k]):o[k]>c?(m=I[D+o[k]],A[B+o[k]]):(m=96,0),f=1<<v-E,_=l=1<<x;r[h+(R>>E)+(l-=f)]=b<<24|m<<16|w|0,0!==l;);for(f=1<<v-1;R&f;)f>>=1;if(0!==f?(R&=f-1,R+=f):R=0,k++,0==--U[v]){if(v===p)break;v=t[i+o[k]]}if(y<v&&(R&d)!==u){for(0===E&&(E=y),h+=_,S=1<<(x=v-E);x+E<p&&!((S-=U[x+E])<=0);)x++,S<<=1;if(T+=1<<x,1===e&&852<T||2===e&&592<T)return 1;r[u=R&d]=y<<24|x<<16|h-a|0}}return 0!==R&&(r[h+R]=v-E<<24|64<<16|0),s.bits=y,0}},{"../utils/common":1}],10:[function(e,t,i){t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],11:[function(e,t,i){t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],"/lib/inflate.js":[function(e,t,i){var h=e("./zlib/inflate"),c=e("./utils/common"),b=e("./utils/strings"),m=e("./zlib/constants"),n=e("./zlib/messages"),r=e("./zlib/zstream"),a=e("./zlib/gzheader"),w=Object.prototype.toString;function o(e){if(!(this instanceof o))return new o(e);this.options=c.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new r,this.strm.avail_out=0;var i=h.inflateInit2(this.strm,t.windowBits);if(i!==m.Z_OK)throw new Error(n[i]);this.header=new a,h.inflateGetHeader(this.strm,this.header)}function s(e,t){var i=new o(t);if(i.push(e,!0),i.err)throw i.msg||n[i.err];return i.result}o.prototype.push=function(e,t){var i,n,r,a,o,s,f=this.strm,l=this.options.chunkSize,u=this.options.dictionary,d=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?m.Z_FINISH:m.Z_NO_FLUSH,"string"==typeof e?f.input=b.binstring2buf(e):"[object ArrayBuffer]"===w.call(e)?f.input=new Uint8Array(e):f.input=e,f.next_in=0,f.avail_in=f.input.length;do{if(0===f.avail_out&&(f.output=new c.Buf8(l),f.next_out=0,f.avail_out=l),(i=h.inflate(f,m.Z_NO_FLUSH))===m.Z_NEED_DICT&&u&&(s="string"==typeof u?b.string2buf(u):"[object ArrayBuffer]"===w.call(u)?new Uint8Array(u):u,i=h.inflateSetDictionary(this.strm,s)),i===m.Z_BUF_ERROR&&!0===d&&(i=m.Z_OK,d=!1),i!==m.Z_STREAM_END&&i!==m.Z_OK)return this.onEnd(i),!(this.ended=!0);f.next_out&&(0!==f.avail_out&&i!==m.Z_STREAM_END&&(0!==f.avail_in||n!==m.Z_FINISH&&n!==m.Z_SYNC_FLUSH)||("string"===this.options.to?(r=b.utf8border(f.output,f.next_out),a=f.next_out-r,o=b.buf2string(f.output,r),f.next_out=a,f.avail_out=l-a,a&&c.arraySet(f.output,f.output,r,a,0),this.onData(o)):this.onData(c.shrinkBuf(f.output,f.next_out)))),0===f.avail_in&&0===f.avail_out&&(d=!0)}while((0<f.avail_in||0===f.avail_out)&&i!==m.Z_STREAM_END);return i===m.Z_STREAM_END&&(n=m.Z_FINISH),n===m.Z_FINISH?(i=h.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===m.Z_OK):n!==m.Z_SYNC_FLUSH||(this.onEnd(m.Z_OK),!(f.avail_out=0))},o.prototype.onData=function(e){this.chunks.push(e)},o.prototype.onEnd=function(e){e===m.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=c.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},i.Inflate=o,i.inflate=s,i.inflateRaw=function(e,t){return(t=t||{}).raw=!0,s(e,t)},i.ungzip=s},{"./utils/common":1,"./utils/strings":2,"./zlib/constants":4,"./zlib/gzheader":6,"./zlib/inflate":8,"./zlib/messages":10,"./zlib/zstream":11}]},{},[])("/lib/inflate.js"),R=Uint16Array.BYTES_PER_ELEMENT,A=Int32Array.BYTES_PER_ELEMENT,B=Uint32Array.BYTES_PER_ELEMENT,o={METADATA:0,TERRAIN:1,DBROOT:2};o.fromString=function(e){return"Metadata"===e?o.METADATA:"Terrain"===e?o.TERRAIN:"DbRoot"===e?o.DBROOT:void 0};var U=32301;var f=1953029805,l=2917034100;return t(function(e,t){var i=o.fromString(e.type),n=e.buffer;b(e.key,n);var r=function(e){var t=new DataView(e),i=0,n=t.getUint32(0,!0);if(i+=B,n!==f&&n!==l)throw new S.RuntimeError("Invalid magic");var r=t.getUint32(i,n===f);i+=B;var a=new Uint8Array(e,i),o=s.inflate(a);if(o.length===r)return o;throw new S.RuntimeError("Size of packet doesn't match header")}(n),n=r.buffer,a=r.length;switch(i){case o.METADATA:return function(e,t,i){var n=new DataView(e),r=0,a=n.getUint32(r,!0);if(r+=B,a!==U)throw new S.RuntimeError("Invalid magic");var o=n.getUint32(r,!0);if(r+=B,1!==o)throw new S.RuntimeError("Invalid data type. Must be 1 for QuadTreePacket");var s=n.getUint32(r,!0);if(r+=B,2!==s)throw new S.RuntimeError("Invalid QuadTreePacket version. Only version 2 is supported.");var f=n.getInt32(r,!0);r+=A;var l=n.getInt32(r,!0);if(r+=A,32!==l)throw new S.RuntimeError("Invalid instance size.");var u=n.getInt32(r,!0);r+=A;var d=n.getInt32(r,!0);r+=A;var h=n.getInt32(r,!0);if(u!==f*l+(r+=A))throw new S.RuntimeError("Invalid dataBufferOffset");if(u+d+h!==t)throw new S.RuntimeError("Invalid packet offsets");for(var c=[],b=0;b<f;++b){var m=n.getUint8(r);++r,++r;var w=n.getUint16(r,!0);r+=R;var g=n.getUint16(r,!0);r+=R;var v=n.getUint16(r,!0);r+=R,r+=R,r+=R,r+=A,r+=A,r+=8;var k=n.getUint8(r++),_=n.getUint8(r++);r+=R,c.push(new T(m,w,g,v,k,_))}var p=[],y=0;var x=0,E=c[y++];""===i?++x:p[i]=E;return function e(t,i,n){var r=!1;if(4===n){if(i.hasSubtree())return;r=!0}for(var a=0;a<4;++a){var o=t+a.toString();if(r)p[o]=null;else if(n<4)if(i.hasChild(a)){if(y===f)return void console.log("Incorrect number of instances");var s=c[y++];p[o]=s,e(o,s,n+1)}else p[o]=null}}(i,E,x),p}(n,a,e.quadKey);case o.TERRAIN:return function(e,t,i){var n=new DataView(e),r=0,a=[];for(;r<t;){for(var o=r,s=0;s<4;++s){var f=n.getUint32(r,!0);r+=B,r+=f}var l=e.slice(o,r);i.push(l),a.push(l)}return a}(n,a,t);case o.DBROOT:return t.push(n),{buffer:n}}})}); diff --git a/web/assets/Cesium/Workers/transcodeCRNToDXT.js b/web/assets/Cesium/Workers/transcodeCRNToDXT.js new file mode 100644 index 00000000..64b2b8cd --- /dev/null +++ b/web/assets/Cesium/Workers/transcodeCRNToDXT.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./createTaskProcessorWorker"],function(when,RuntimeError,WebGLConstants,createTaskProcessorWorker){"use strict";function CompressedTextureBuffer(e,r,t,n){this._format=e,this._width=r,this._height=t,this._buffer=n}Object.defineProperties(CompressedTextureBuffer.prototype,{internalFormat:{get:function(){return this._format}},width:{get:function(){return this._width}},height:{get:function(){return this._height}},bufferView:{get:function(){return this._buffer}}}),CompressedTextureBuffer.clone=function(e){if(when.defined(e))return new CompressedTextureBuffer(e._format,e._width,e._height,e._buffer)},CompressedTextureBuffer.prototype.clone=function(){return CompressedTextureBuffer.clone(this)};var PixelDatatype={UNSIGNED_BYTE:WebGLConstants.WebGLConstants.UNSIGNED_BYTE,UNSIGNED_SHORT:WebGLConstants.WebGLConstants.UNSIGNED_SHORT,UNSIGNED_INT:WebGLConstants.WebGLConstants.UNSIGNED_INT,FLOAT:WebGLConstants.WebGLConstants.FLOAT,HALF_FLOAT:WebGLConstants.WebGLConstants.HALF_FLOAT_OES,UNSIGNED_INT_24_8:WebGLConstants.WebGLConstants.UNSIGNED_INT_24_8,UNSIGNED_SHORT_4_4_4_4:WebGLConstants.WebGLConstants.UNSIGNED_SHORT_4_4_4_4,UNSIGNED_SHORT_5_5_5_1:WebGLConstants.WebGLConstants.UNSIGNED_SHORT_5_5_5_1,UNSIGNED_SHORT_5_6_5:WebGLConstants.WebGLConstants.UNSIGNED_SHORT_5_6_5,toWebGLConstant:function(e,r){switch(e){case PixelDatatype.UNSIGNED_BYTE:return WebGLConstants.WebGLConstants.UNSIGNED_BYTE;case PixelDatatype.UNSIGNED_SHORT:return WebGLConstants.WebGLConstants.UNSIGNED_SHORT;case PixelDatatype.UNSIGNED_INT:return WebGLConstants.WebGLConstants.UNSIGNED_INT;case PixelDatatype.FLOAT:return WebGLConstants.WebGLConstants.FLOAT;case PixelDatatype.HALF_FLOAT:return r.webgl2?WebGLConstants.WebGLConstants.HALF_FLOAT:WebGLConstants.WebGLConstants.HALF_FLOAT_OES;case PixelDatatype.UNSIGNED_INT_24_8:return WebGLConstants.WebGLConstants.UNSIGNED_INT_24_8;case PixelDatatype.UNSIGNED_SHORT_4_4_4_4:return WebGLConstants.WebGLConstants.UNSIGNED_SHORT_4_4_4_4;case PixelDatatype.UNSIGNED_SHORT_5_5_5_1:return WebGLConstants.WebGLConstants.UNSIGNED_SHORT_5_5_5_1;case PixelDatatype.UNSIGNED_SHORT_5_6_5:return PixelDatatype.UNSIGNED_SHORT_5_6_5}},isPacked:function(e){return e===PixelDatatype.UNSIGNED_INT_24_8||e===PixelDatatype.UNSIGNED_SHORT_4_4_4_4||e===PixelDatatype.UNSIGNED_SHORT_5_5_5_1||e===PixelDatatype.UNSIGNED_SHORT_5_6_5},sizeInBytes:function(e){switch(e){case PixelDatatype.UNSIGNED_BYTE:return 1;case PixelDatatype.UNSIGNED_SHORT:case PixelDatatype.UNSIGNED_SHORT_4_4_4_4:case PixelDatatype.UNSIGNED_SHORT_5_5_5_1:case PixelDatatype.UNSIGNED_SHORT_5_6_5:case PixelDatatype.HALF_FLOAT:return 2;case PixelDatatype.UNSIGNED_INT:case PixelDatatype.FLOAT:case PixelDatatype.UNSIGNED_INT_24_8:return 4}},validate:function(e){return e===PixelDatatype.UNSIGNED_BYTE||e===PixelDatatype.UNSIGNED_SHORT||e===PixelDatatype.UNSIGNED_INT||e===PixelDatatype.FLOAT||e===PixelDatatype.HALF_FLOAT||e===PixelDatatype.UNSIGNED_INT_24_8||e===PixelDatatype.UNSIGNED_SHORT_4_4_4_4||e===PixelDatatype.UNSIGNED_SHORT_5_5_5_1||e===PixelDatatype.UNSIGNED_SHORT_5_6_5}},PixelDatatype$1=Object.freeze(PixelDatatype),PixelFormat={DEPTH_COMPONENT:WebGLConstants.WebGLConstants.DEPTH_COMPONENT,DEPTH_STENCIL:WebGLConstants.WebGLConstants.DEPTH_STENCIL,ALPHA:WebGLConstants.WebGLConstants.ALPHA,RGB:WebGLConstants.WebGLConstants.RGB,RGBA:WebGLConstants.WebGLConstants.RGBA,LUMINANCE:WebGLConstants.WebGLConstants.LUMINANCE,LUMINANCE_ALPHA:WebGLConstants.WebGLConstants.LUMINANCE_ALPHA,RGB_DXT1:WebGLConstants.WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT,RGBA_DXT1:WebGLConstants.WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT,RGBA_DXT3:WebGLConstants.WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT,RGBA_DXT5:WebGLConstants.WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT,RGB_PVRTC_4BPPV1:WebGLConstants.WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG,RGB_PVRTC_2BPPV1:WebGLConstants.WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG,RGBA_PVRTC_4BPPV1:WebGLConstants.WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,RGBA_PVRTC_2BPPV1:WebGLConstants.WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,RGB_ETC1:WebGLConstants.WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL,componentsLength:function(e){switch(e){case PixelFormat.RGB:return 3;case PixelFormat.RGBA:return 4;case PixelFormat.LUMINANCE_ALPHA:return 2;case PixelFormat.ALPHA:case PixelFormat.LUMINANCE:default:return 1}},validate:function(e){return e===PixelFormat.DEPTH_COMPONENT||e===PixelFormat.DEPTH_STENCIL||e===PixelFormat.ALPHA||e===PixelFormat.RGB||e===PixelFormat.RGBA||e===PixelFormat.LUMINANCE||e===PixelFormat.LUMINANCE_ALPHA||e===PixelFormat.RGB_DXT1||e===PixelFormat.RGBA_DXT1||e===PixelFormat.RGBA_DXT3||e===PixelFormat.RGBA_DXT5||e===PixelFormat.RGB_PVRTC_4BPPV1||e===PixelFormat.RGB_PVRTC_2BPPV1||e===PixelFormat.RGBA_PVRTC_4BPPV1||e===PixelFormat.RGBA_PVRTC_2BPPV1||e===PixelFormat.RGB_ETC1},isColorFormat:function(e){return e===PixelFormat.ALPHA||e===PixelFormat.RGB||e===PixelFormat.RGBA||e===PixelFormat.LUMINANCE||e===PixelFormat.LUMINANCE_ALPHA},isDepthFormat:function(e){return e===PixelFormat.DEPTH_COMPONENT||e===PixelFormat.DEPTH_STENCIL},isCompressedFormat:function(e){return e===PixelFormat.RGB_DXT1||e===PixelFormat.RGBA_DXT1||e===PixelFormat.RGBA_DXT3||e===PixelFormat.RGBA_DXT5||e===PixelFormat.RGB_PVRTC_4BPPV1||e===PixelFormat.RGB_PVRTC_2BPPV1||e===PixelFormat.RGBA_PVRTC_4BPPV1||e===PixelFormat.RGBA_PVRTC_2BPPV1||e===PixelFormat.RGB_ETC1},isDXTFormat:function(e){return e===PixelFormat.RGB_DXT1||e===PixelFormat.RGBA_DXT1||e===PixelFormat.RGBA_DXT3||e===PixelFormat.RGBA_DXT5},isPVRTCFormat:function(e){return e===PixelFormat.RGB_PVRTC_4BPPV1||e===PixelFormat.RGB_PVRTC_2BPPV1||e===PixelFormat.RGBA_PVRTC_4BPPV1||e===PixelFormat.RGBA_PVRTC_2BPPV1},isETC1Format:function(e){return e===PixelFormat.RGB_ETC1},compressedTextureSizeInBytes:function(e,r,t){switch(e){case PixelFormat.RGB_DXT1:case PixelFormat.RGBA_DXT1:case PixelFormat.RGB_ETC1:return Math.floor((r+3)/4)*Math.floor((t+3)/4)*8;case PixelFormat.RGBA_DXT3:case PixelFormat.RGBA_DXT5:return Math.floor((r+3)/4)*Math.floor((t+3)/4)*16;case PixelFormat.RGB_PVRTC_4BPPV1:case PixelFormat.RGBA_PVRTC_4BPPV1:return Math.floor((Math.max(r,8)*Math.max(t,8)*4+7)/8);case PixelFormat.RGB_PVRTC_2BPPV1:case PixelFormat.RGBA_PVRTC_2BPPV1:return Math.floor((Math.max(r,16)*Math.max(t,8)*2+7)/8);default:return 0}},textureSizeInBytes:function(e,r,t,n){var i=PixelFormat.componentsLength(e);return PixelDatatype$1.isPacked(r)&&(i=1),i*PixelDatatype$1.sizeInBytes(r)*t*n},alignmentInBytes:function(e,r,t){var n=PixelFormat.textureSizeInBytes(e,r,t,1)%4;return 0==n?4:2==n?2:1},createTypedArray:function(e,r,t,n){var i=PixelDatatype$1.sizeInBytes(r),a=i===Uint8Array.BYTES_PER_ELEMENT?Uint8Array:i===Uint16Array.BYTES_PER_ELEMENT?Uint16Array:i===Float32Array.BYTES_PER_ELEMENT&&r===PixelDatatype$1.FLOAT?Float32Array:Uint32Array;return new a(PixelFormat.componentsLength(e)*t*n)},flipY:function(e,r,t,n,i){if(1===i)return e;for(var a=PixelFormat.createTypedArray(r,t,n,i),o=PixelFormat.componentsLength(r),u=n*o,f=0;f<i;++f)for(var l=f*n*o,s=(i-f-1)*n*o,c=0;c<u;++c)a[s+c]=e[l+c];return a},toInternalFormat:function(e,r,t){if(!t.webgl2)return e;if(e===PixelFormat.DEPTH_STENCIL)return WebGLConstants.WebGLConstants.DEPTH24_STENCIL8;if(e===PixelFormat.DEPTH_COMPONENT){if(r===PixelDatatype$1.UNSIGNED_SHORT)return WebGLConstants.WebGLConstants.DEPTH_COMPONENT16;if(r===PixelDatatype$1.UNSIGNED_INT)return WebGLConstants.WebGLConstants.DEPTH_COMPONENT24}if(r===PixelDatatype$1.FLOAT)switch(e){case PixelFormat.RGBA:return WebGLConstants.WebGLConstants.RGBA32F;case PixelFormat.RGB:return WebGLConstants.WebGLConstants.RGB32F;case PixelFormat.RG:return WebGLConstants.WebGLConstants.RG32F;case PixelFormat.R:return WebGLConstants.WebGLConstants.R32F}if(r===PixelDatatype$1.HALF_FLOAT)switch(e){case PixelFormat.RGBA:return WebGLConstants.WebGLConstants.RGBA16F;case PixelFormat.RGB:return WebGLConstants.WebGLConstants.RGB16F;case PixelFormat.RG:return WebGLConstants.WebGLConstants.RG16F;case PixelFormat.R:return WebGLConstants.WebGLConstants.R16F}return e}},PixelFormat$1=Object.freeze(PixelFormat),Module,Module=Module||((void 0!==Module?Module:null)||{}),moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1,nodeFS,nodePath,TRY_USE_DUMP;if(Module.ENVIRONMENT)if("WEB"===Module.ENVIRONMENT)ENVIRONMENT_IS_WEB=!0;else if("WORKER"===Module.ENVIRONMENT)ENVIRONMENT_IS_WORKER=!0;else if("NODE"===Module.ENVIRONMENT)ENVIRONMENT_IS_NODE=!0;else{if("SHELL"!==Module.ENVIRONMENT)throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");ENVIRONMENT_IS_SHELL=!0}else ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&"function"==typeof require&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE)Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn),Module.read=function(e,r){nodeFS=nodeFS||require("fs"),e=(nodePath=nodePath||require("path")).normalize(e);var t=nodeFS.readFileSync(e);return r?t:t.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(1<process.argv.length?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),"undefined"!=typeof module&&(module.exports=Module),process.on("uncaughtException",function(e){if(!(e instanceof ExitStatus))throw e}),Module.inspect=function(){return"[Emscripten Module object]"};else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),"undefined"!=typeof printErr&&(Module.printErr=printErr),"undefined"!=typeof read?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert("object"==typeof r),r},"undefined"!=typeof scriptArgs?Module.arguments=scriptArgs:void 0!==arguments&&(Module.arguments=arguments),"function"==typeof quit&&(Module.quit=function(e,r){quit(e)});else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw"Unknown runtime environment. Where are we?";Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?r(n.response):t()},n.onerror=t,n.send(null)},void 0!==arguments&&(Module.arguments=arguments),"undefined"!=typeof console?(Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)})):(TRY_USE_DUMP=!1,Module.print||(Module.print=TRY_USE_DUMP&&"undefined"!=typeof dump?function(e){dump(e)}:function(e){})),ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),void 0===Module.setWindowTitle&&(Module.setWindowTitle=function(e){document.title=e})}function globalEval(e){eval.call(null,e)}for(var key in!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(e,r){throw r}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[],moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(e){return tempRet0=e},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(e){STACKTOP=e},getNativeTypeSize:function(e){switch(e){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:if("*"===e[e.length-1])return Runtime.QUANTUM_SIZE;if("i"!==e[0])return 0;var r=parseInt(e.substr(1));return assert(r%8==0),r/8}},getNativeFieldSize:function(e){return Math.max(Runtime.getNativeTypeSize(e),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(e,r){return"double"===r||"i64"===r?7&e&&(assert(4==(7&e)),e+=4):assert(0==(3&e)),e},getAlignSize:function(e,r,t){return t||"i64"!=e&&"double"!=e?e?Math.min(r||(e?Runtime.getNativeFieldSize(e):0),Runtime.QUANTUM_SIZE):Math.min(r,8):8},dynCall:function(e,r,t){return t&&t.length?Module["dynCall_"+e].apply(null,[r].concat(t)):Module["dynCall_"+e].call(null,r)},functionPointers:[],addFunction:function(e){for(var r=0;r<Runtime.functionPointers.length;r++)if(!Runtime.functionPointers[r])return Runtime.functionPointers[r]=e,2*(1+r);throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."},removeFunction:function(e){Runtime.functionPointers[(e-2)/2]=null},warnOnce:function(e){Runtime.warnOnce.shown||(Runtime.warnOnce.shown={}),Runtime.warnOnce.shown[e]||(Runtime.warnOnce.shown[e]=1,Module.printErr(e))},funcWrappers:{},getFuncWrapper:function(r,t){assert(t),Runtime.funcWrappers[t]||(Runtime.funcWrappers[t]={});var e=Runtime.funcWrappers[t];return e[r]||(1===t.length?e[r]=function(){return Runtime.dynCall(t,r)}:2===t.length?e[r]=function(e){return Runtime.dynCall(t,r,[e])}:e[r]=function(){return Runtime.dynCall(t,r,Array.prototype.slice.call(arguments))}),e[r]},getCompilerSetting:function(e){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"},stackAlloc:function(e){var r=STACKTOP;return STACKTOP=(STACKTOP=STACKTOP+e|0)+15&-16,r},staticAlloc:function(e){var r=STATICTOP;return STATICTOP=(STATICTOP=STATICTOP+e|0)+15&-16,r},dynamicAlloc:function(e){var r=HEAP32[DYNAMICTOP_PTR>>2],t=-16&(r+e+15|0);if((HEAP32[DYNAMICTOP_PTR>>2]=t,TOTAL_MEMORY<=t)&&!enlargeMemory())return HEAP32[DYNAMICTOP_PTR>>2]=r,0;return r},alignMemory:function(e,r){return e=Math.ceil(e/(r||16))*(r||16)},makeBigInt:function(e,r,t){return t?+(e>>>0)+4294967296*(r>>>0):+(e>>>0)+4294967296*(0|r)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,cwrap,ccall;function assert(e,r){e||abort("Assertion failed: "+r)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}function setValue(e,r,t,n){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":HEAP8[e>>0]=r;break;case"i16":HEAP16[e>>1]=r;break;case"i32":HEAP32[e>>2]=r;break;case"i64":tempI64=[r>>>0,(tempDouble=r,1<=+Math_abs(tempDouble)?0<tempDouble?(0|Math_min(+Math_floor(tempDouble/4294967296),4294967295))>>>0:~~+Math_ceil((tempDouble-(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=r;break;case"double":HEAPF64[e>>3]=r;break;default:abort("invalid type for setValue: "+t)}}function getValue(e,r,t){switch("*"===(r=r||"i8").charAt(r.length-1)&&(r="i32"),r){case"i1":case"i8":return HEAP8[e>>0];case"i16":return HEAP16[e>>1];case"i32":case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];default:abort("invalid type for setValue: "+r)}return null}!function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(e){var r=Runtime.stackAlloc(e.length);return writeArrayToMemory(e,r),r},stringToC:function(e){var r,t=0;return null!=e&&0!==e&&(r=1+(e.length<<2),stringToUTF8(e,t=Runtime.stackAlloc(r),r)),t}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,t,n,i){var a=getCFunc(e),o=[],u=0;if(n)for(var f=0;f<n.length;f++){var l=toC[t[f]];l?(0===u&&(u=Runtime.stackSave()),o[f]=l(n[f])):o[f]=n[f]}var s=a.apply(null,o);if("string"===r&&(s=Pointer_stringify(s)),0!==u){if(i&&i.async)return void EmterpreterAsync.asyncFinalizers.push(function(){Runtime.stackRestore(u)});Runtime.stackRestore(u)}return s};var sourceRegex=/^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(e){var r=e.toString().match(sourceRegex).slice(1);return{arguments:r[0],body:r[1],returnValue:r[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource)for(var e in JSsource={},JSfuncs)JSfuncs.hasOwnProperty(e)&&(JSsource[e]=parseJSFunc(JSfuncs[e]))}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident),numericArgs=argTypes.every(function(e){return"number"===e}),numericRet="string"!==returnType;if(numericRet&&numericArgs)return cfunc;var argNames=argTypes.map(function(e,r){return"$"+r}),funcstr="(function("+argNames.join(",")+") {",nargs=argTypes.length;if(!numericArgs){ensureJSsource(),funcstr+="var stack = "+JSsource.stackSave.body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i],convertCode;"number"!==type&&(convertCode=JSsource[type+"ToC"],funcstr+="var "+convertCode.arguments+" = "+arg+";",funcstr+=convertCode.body+";",funcstr+=arg+"=("+convertCode.returnValue+");")}}var cfuncname=parseJSFunc(function(){return cfunc}).returnValue,strgfy;return funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");",numericRet||(strgfy=parseJSFunc(function(){return Pointer_stringify}).returnValue,funcstr+="ret = "+strgfy+"(ret);"),numericArgs||(ensureJSsource(),funcstr+=JSsource.stackRestore.body.replace("()","(stack)")+";"),funcstr+="return ret})",eval(funcstr)}}(),Module.ccall=ccall,Module.cwrap=cwrap,Module.setValue=setValue,Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;function allocate(e,r,t,n){var i,a="number"==typeof e?(i=!0,e):(i=!1,e.length),o="string"==typeof r?r:null,u=t==ALLOC_NONE?n:["function"==typeof _malloc?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][void 0===t?ALLOC_STATIC:t](Math.max(a,o?1:r.length));if(i){var f,n=u;for(assert(0==(3&u)),f=u+(-4&a);n<f;n+=4)HEAP32[n>>2]=0;for(f=u+a;n<f;)HEAP8[n++>>0]=0;return u}if("i8"===o)return e.subarray||e.slice?HEAPU8.set(e,u):HEAPU8.set(new Uint8Array(e),u),u;for(var l,s,c,_=0;_<a;){var d=e[_];"function"==typeof d&&(d=Runtime.getFunctionIndex(d)),0!==(l=o||r[_])?("i64"==l&&(l="i32"),setValue(u+_,d,l),c!==l&&(s=Runtime.getNativeTypeSize(l),c=l),_+=s):_++}return u}function getMemory(e){return staticSealed?runtimeInitialized?_malloc(e):Runtime.dynamicAlloc(e):Runtime.staticAlloc(e)}function Pointer_stringify(e,r){if(0===r||!e)return"";for(var t,n=0,i=0;n|=t=HEAPU8[e+i>>0],(0!=t||r)&&(i++,!r||i!=r););r=r||i;var a="";if(n<128){for(var o;0<r;)o=String.fromCharCode.apply(String,HEAPU8.subarray(e,e+Math.min(r,1024))),a=a?a+o:o,e+=1024,r-=1024;return a}return Module.UTF8ToString(e)}function AsciiToString(e){for(var r="";;){var t=HEAP8[e++>>0];if(!t)return r;r+=String.fromCharCode(t)}}function stringToAscii(e,r){return writeAsciiToMemory(e,r,!1)}Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE,Module.allocate=allocate,Module.getMemory=getMemory,Module.Pointer_stringify=Pointer_stringify,Module.AsciiToString=AsciiToString,Module.stringToAscii=stringToAscii;var UTF8Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(e,r){for(var t=r;e[t];)++t;if(16<t-r&&e.subarray&&UTF8Decoder)return UTF8Decoder.decode(e.subarray(r,t));for(var n,i,a,o,u,f,l="";;){if(!(u=e[r++]))return l;128&u?(f=63&e[r++],192!=(224&u)?(o=63&e[r++],(u=224==(240&u)?(15&u)<<12|f<<6|o:(n=63&e[r++],240==(248&u)?(7&u)<<18|f<<12|o<<6|n:(i=63&e[r++],248==(252&u)?(3&u)<<24|f<<18|o<<12|n<<6|i:(1&u)<<30|f<<24|o<<18|n<<12|i<<6|63&e[r++])))<65536?l+=String.fromCharCode(u):(a=u-65536,l+=String.fromCharCode(55296|a>>10,56320|1023&a))):l+=String.fromCharCode((31&u)<<6|f)):l+=String.fromCharCode(u)}}function UTF8ToString(e){return UTF8ArrayToString(HEAPU8,e)}function stringToUTF8Array(e,r,t,n){if(!(0<n))return 0;for(var i=t,a=t+n-1,o=0;o<e.length;++o){var u=e.charCodeAt(o);if(55296<=u&&u<=57343&&(u=65536+((1023&u)<<10)|1023&e.charCodeAt(++o)),u<=127){if(a<=t)break;r[t++]=u}else if(u<=2047){if(a<=t+1)break;r[t++]=192|u>>6,r[t++]=128|63&u}else if(u<=65535){if(a<=t+2)break;r[t++]=224|u>>12,r[t++]=128|u>>6&63,r[t++]=128|63&u}else if(u<=2097151){if(a<=t+3)break;r[t++]=240|u>>18,r[t++]=128|u>>12&63,r[t++]=128|u>>6&63,r[t++]=128|63&u}else if(u<=67108863){if(a<=t+4)break;r[t++]=248|u>>24,r[t++]=128|u>>18&63,r[t++]=128|u>>12&63,r[t++]=128|u>>6&63,r[t++]=128|63&u}else{if(a<=t+5)break;r[t++]=252|u>>30,r[t++]=128|u>>24&63,r[t++]=128|u>>18&63,r[t++]=128|u>>12&63,r[t++]=128|u>>6&63,r[t++]=128|63&u}}return r[t]=0,t-i}function stringToUTF8(e,r,t){return stringToUTF8Array(e,HEAPU8,r,t)}function lengthBytesUTF8(e){for(var r=0,t=0;t<e.length;++t){var n=e.charCodeAt(t);55296<=n&&n<=57343&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++t)),n<=127?++r:r+=n<=2047?2:n<=65535?3:n<=2097151?4:n<=67108863?5:6}return r}Module.UTF8ArrayToString=UTF8ArrayToString,Module.UTF8ToString=UTF8ToString,Module.stringToUTF8Array=stringToUTF8Array,Module.stringToUTF8=stringToUTF8,Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function demangle(e){var r=Module.___cxa_demangle||Module.__cxa_demangle;if(r){try{var t=e.substr(1),n=lengthBytesUTF8(t)+1,i=_malloc(n);stringToUTF8(t,i,n);var a=_malloc(4),o=r(i,0,0,a);if(0===getValue(a,"i32")&&o)return Pointer_stringify(o)}catch(e){}finally{i&&_free(i),a&&_free(a),o&&_free(o)}return e}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),e}function demangleAll(e){return e.replace(/__Z[\w\d_]+/g,function(e){var r=demangle(e);return e===r?e:e+" ["+r+"]"})}function jsStackTrace(){var r=new Error;if(!r.stack){try{throw new Error(0)}catch(e){r=e}if(!r.stack)return"(no stack trace available)"}return r.stack.toString()}function stackTrace(){var e=jsStackTrace();return Module.extraStackTrace&&(e+="\n"+Module.extraStackTrace()),demangleAll(e)}Module.stackTrace=stackTrace;var WASM_PAGE_SIZE=65536,ASMJS_PAGE_SIZE=16777216,MIN_TOTAL_MEMORY=16777216,HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64,STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR,byteLength;function alignUp(e,r){return 0<e%r&&(e+=r-e%r),e}function updateGlobalBuffer(e){Module.buffer=buffer=e}function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){var e=Module.usingWasm?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE,r=2147483648-e;if(HEAP32[DYNAMICTOP_PTR>>2]>r)return!1;var t=TOTAL_MEMORY;for(TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2];)TOTAL_MEMORY=TOTAL_MEMORY<=536870912?alignUp(2*TOTAL_MEMORY,e):Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,e),r);var n=Module.reallocBuffer(TOTAL_MEMORY);return n&&n.byteLength==TOTAL_MEMORY?(updateGlobalBuffer(n),updateGlobalBufferViews(),!0):(TOTAL_MEMORY=t,!1)}STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1,Module.reallocBuffer||(Module.reallocBuffer=function(e){var r,t;try{ArrayBuffer.transfer?t=ArrayBuffer.transfer(buffer,e):(r=HEAP8,t=new ArrayBuffer(e),new Int8Array(t).set(r))}catch(e){return!1}return!!_emscripten_replace_memory(t)&&t});try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get),byteLength(new ArrayBuffer(4))}catch(e){byteLength=function(e){return e.byteLength}}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||16777216;function getTotalMemory(){return TOTAL_MEMORY}if(TOTAL_MEMORY<TOTAL_STACK&&Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")"),buffer=Module.buffer?Module.buffer:new ArrayBuffer(TOTAL_MEMORY),updateGlobalBufferViews(),HEAP32[0]=1668509029,HEAP16[1]=25459,115!==HEAPU8[2]||99!==HEAPU8[3])throw"Runtime error: expected the system to be little-endian!";function callRuntimeCallbacks(e){for(;0<e.length;){var r,t=e.shift();"function"!=typeof t?"number"==typeof(r=t.func)?void 0===t.arg?Module.dynCall_v(r):Module.dynCall_vi(r,t.arg):r(void 0===t.arg?null:t.arg):t()}}Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1;function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__)}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}function addOnInit(e){__ATINIT__.unshift(e)}function addOnPreMain(e){__ATMAIN__.unshift(e)}function addOnExit(e){__ATEXIT__.unshift(e)}function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}function intArrayFromString(e,r,t){var n=0<t?t:lengthBytesUTF8(e)+1,i=new Array(n),a=stringToUTF8Array(e,i,0,i.length);return r&&(i.length=a),i}function intArrayToString(e){for(var r=[],t=0;t<e.length;t++){var n=e[t];255<n&&(n&=255),r.push(String.fromCharCode(n))}return r.join("")}function writeStringToMemory(e,r,t){var n,i;Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!"),t&&(i=r+lengthBytesUTF8(e),n=HEAP8[i]),stringToUTF8(e,r,1/0),t&&(HEAP8[i]=n)}function writeArrayToMemory(e,r){HEAP8.set(e,r)}function writeAsciiToMemory(e,r,t){for(var n=0;n<e.length;++n)HEAP8[r++>>0]=e.charCodeAt(n);t||(HEAP8[r>>0]=0)}Module.addOnPreRun=addOnPreRun,Module.addOnInit=addOnInit,Module.addOnPreMain=addOnPreMain,Module.addOnExit=addOnExit,Module.addOnPostRun=addOnPostRun,Module.intArrayFromString=intArrayFromString,Module.intArrayToString=intArrayToString,Module.writeStringToMemory=writeStringToMemory,Module.writeArrayToMemory=writeArrayToMemory,Module.writeAsciiToMemory=writeAsciiToMemory,Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(e,r){var t=65535&e,n=65535&r;return t*n+((e>>>16)*n+t*(r>>>16)<<16)|0}),Math.imul=Math.imul,Math.clz32||(Math.clz32=function(e){e>>>=0;for(var r=0;r<32;r++)if(e&1<<31-r)return r;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_min=Math.min,runDependencies=0,dependenciesFulfilled=null;function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(e){var r;runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&dependenciesFulfilled&&(r=dependenciesFulfilled,dependenciesFulfilled=null,r())}Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={},STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+6192,__ATINIT__.push(),allocate([228,2,0,0,81,16,0,0,12,3,0,0,177,16,0,0,32,0,0,0,0,0,0,0,12,3,0,0,94,16,0,0,48,0,0,0,0,0,0,0,228,2,0,0,127,16,0,0,12,3,0,0,140,16,0,0,16,0,0,0,0,0,0,0,12,3,0,0,183,17,0,0,32,0,0,0,0,0,0,0,12,3,0,0,147,17,0,0,72,0,0,0,0,0,0,0,108,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,32,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,1,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,40,20,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,16,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,56,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,37,115,40,37,117,41,58,32,65,115,115,101,114,116,105,111,110,32,102,97,105,108,117,114,101,58,32,34,37,115,34,10,0,109,95,115,105,122,101,32,60,61,32,109,95,99,97,112,97,99,105,116,121,0,46,47,105,110,99,92,99,114,110,95,100,101,99,111,109,112,46,104,0,109,105,110,95,110,101,119,95,99,97,112,97,99,105,116,121,32,60,32,40,48,120,55,70,70,70,48,48,48,48,85,32,47,32,101,108,101,109,101,110,116,95,115,105,122,101,41,0,110,101,119,95,99,97,112,97,99,105,116,121,32,38,38,32,40,110,101,119,95,99,97,112,97,99,105,116,121,32,62,32,109,95,99,97,112,97,99,105,116,121,41,0,110,117,109,95,99,111,100,101,115,91,99,93,0,115,111,114,116,101,100,95,112,111,115,32,60,32,116,111,116,97,108,95,117,115,101,100,95,115,121,109,115,0,112,67,111,100,101,115,105,122,101,115,91,115,121,109,95,105,110,100,101,120,93,32,61,61,32,99,111,100,101,115,105,122,101,0,116,32,60,32,40,49,85,32,60,60,32,116,97,98,108,101,95,98,105,116,115,41,0,109,95,108,111,111,107,117,112,91,116,93,32,61,61,32,99,85,73,78,84,51,50,95,77,65,88,0,99,114,110,100,95,109,97,108,108,111,99,58,32,115,105,122,101,32,116,111,111,32,98,105,103,0,99,114,110,100,95,109,97,108,108,111,99,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,0,40,40,117,105,110,116,51,50,41,112,95,110,101,119,32,38,32,40,67,82,78,68,95,77,73,78,95,65,76,76,79,67,95,65,76,73,71,78,77,69,78,84,32,45,32,49,41,41,32,61,61,32,48,0,99,114,110,100,95,114,101,97,108,108,111,99,58,32,98,97,100,32,112,116,114,0,99,114,110,100,95,102,114,101,101,58,32,98,97,100,32,112,116,114,0,102,97,108,115,101,0,40,116,111,116,97,108,95,115,121,109,115,32,62,61,32,49,41,32,38,38,32,40,116,111,116,97,108,95,115,121,109,115,32,60,61,32,112,114,101,102,105,120,95,99,111,100,105,110,103,58,58,99,77,97,120,83,117,112,112,111,114,116,101,100,83,121,109,115,41,0,17,18,19,20,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,16,48,0,110,117,109,95,98,105,116,115,32,60,61,32,51,50,85,0,109,95,98,105,116,95,99,111,117,110,116,32,60,61,32,99,66,105,116,66,117,102,83,105,122,101,0,116,32,33,61,32,99,85,73,78,84,51,50,95,77,65,88,0,109,111,100,101,108,46,109,95,99,111,100,101,95,115,105,122,101,115,91,115,121,109,93,32,61,61,32,108,101,110,0,0,2,3,1,0,2,3,4,5,6,7,1,40,108,101,110,32,62,61,32,49,41,32,38,38,32,40,108,101,110,32,60,61,32,99,77,97,120,69,120,112,101,99,116,101,100,67,111,100,101,83,105,122,101,41,0,105,32,60,32,109,95,115,105,122,101,0,110,101,120,116,95,108,101,118,101,108,95,111,102,115,32,62,32,99,117,114,95,108,101,118,101,108,95,111,102,115,0,1,2,2,3,3,3,3,4,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,2,1,2,0,0,0,1,0,2,1,0,2,0,0,1,2,3,110,117,109,32,38,38,32,40,110,117,109,32,61,61,32,126,110,117,109,95,99,104,101,99,107,41,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,83,116,57,101,120,99,101,112,116,105,111,110,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;function _abort(){Module.abort()}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}STATICTOP+=16;var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function(e){if(!e||EXCEPTIONS.infos[e])return e;for(var r in EXCEPTIONS.infos){if(EXCEPTIONS.infos[r].adjusted===e)return r}return e},addRef:function(e){e&&EXCEPTIONS.infos[e].refcount++},decRef:function(e){var r;e&&(assert(0<(r=EXCEPTIONS.infos[e]).refcount),r.refcount--,0!==r.refcount||r.rethrown||(r.destructor&&Module.dynCall_vi(r.destructor,e),delete EXCEPTIONS.infos[e],___cxa_free_exception(e)))},clearRef:function(e){e&&(EXCEPTIONS.infos[e].refcount=0)}};function ___cxa_begin_catch(e){var r=EXCEPTIONS.infos[e];return r&&!r.caught&&(r.caught=!0,__ZSt18uncaught_exceptionv.uncaught_exception--),r&&(r.rethrown=!1),EXCEPTIONS.caught.push(e),EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(e)),e}function _pthread_once(e,r){_pthread_once.seen||(_pthread_once.seen={}),e in _pthread_once.seen||(Module.dynCall_v(r),_pthread_once.seen[e]=1)}function _emscripten_memcpy_big(e,r,t){return HEAPU8.set(HEAPU8.subarray(r,r+t),e),e}var SYSCALLS={varargs:0,get:function(e){return SYSCALLS.varargs+=4,HEAP32[SYSCALLS.varargs-4>>2]},getStr:function(){return Pointer_stringify(SYSCALLS.get())},get64:function(){var e=SYSCALLS.get(),r=SYSCALLS.get();return assert(0<=e?0===r:-1===r),e},getZero:function(){assert(0===SYSCALLS.get())}};function ___syscall6(e,r){SYSCALLS.varargs=r;try{var t=SYSCALLS.getStreamFromFD();return FS.close(t),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_STATIC),PTHREAD_SPECIFIC={};function _pthread_getspecific(e){return PTHREAD_SPECIFIC[e]||0}function ___setErrNo(e){return Module.___errno_location&&(HEAP32[Module.___errno_location()>>2]=e),e}var PTHREAD_SPECIFIC_NEXT_KEY=1,ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(e,r){return 0==e?ERRNO_CODES.EINVAL:(HEAP32[e>>2]=PTHREAD_SPECIFIC_NEXT_KEY,PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0,PTHREAD_SPECIFIC_NEXT_KEY++,0)}function ___resumeException(e){throw EXCEPTIONS.last||(EXCEPTIONS.last=e),e+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var e=EXCEPTIONS.last;if(!e)return 0|(Runtime.setTempRet0(0),0);var r=EXCEPTIONS.infos[e],t=r.type;if(!t)return 0|(Runtime.setTempRet0(0),e);var n=Array.prototype.slice.call(arguments);Module.___cxa_is_pointer_type(t);___cxa_find_matching_catch.buffer||(___cxa_find_matching_catch.buffer=_malloc(4)),HEAP32[___cxa_find_matching_catch.buffer>>2]=e,e=___cxa_find_matching_catch.buffer;for(var i=0;i<n.length;i++)if(n[i]&&Module.___cxa_can_catch(n[i],t,e))return e=HEAP32[e>>2],r.adjusted=e,0|(Runtime.setTempRet0(n[i]),e);return e=HEAP32[e>>2],0|(Runtime.setTempRet0(t),e)}function ___gxx_personality_v0(){}function _pthread_setspecific(e,r){return e in PTHREAD_SPECIFIC?(PTHREAD_SPECIFIC[e]=r,0):ERRNO_CODES.EINVAL}function ___syscall140(e,r){SYSCALLS.varargs=r;try{var t=SYSCALLS.getStreamFromFD(),n=(SYSCALLS.get(),SYSCALLS.get()),i=SYSCALLS.get(),a=SYSCALLS.get(),o=n;return FS.llseek(t,o,a),HEAP32[i>>2]=t.position,t.getdents&&0===o&&0===a&&(t.getdents=null),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall146(e,r){SYSCALLS.varargs=r;try{var t=SYSCALLS.get(),n=SYSCALLS.get(),i=SYSCALLS.get(),a=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(e,r){var t=___syscall146.buffers[e];assert(t),0===r||10===r?((1===e?Module.print:Module.printErr)(UTF8ArrayToString(t,0)),t.length=0):t.push(r)});for(var o=0;o<i;o++){for(var u=HEAP32[n+8*o>>2],f=HEAP32[n+(8*o+4)>>2],l=0;l<f;l++)___syscall146.printChar(t,HEAPU8[u+l]);a+=f}return a}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall54(e,r){SYSCALLS.varargs=r;try{return 0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function invoke_iiii(e,r,t,n){try{return Module.dynCall_iiii(e,r,t,n)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_viiiii(e,r,t,n,i,a){try{Module.dynCall_viiiii(e,r,t,n,i,a)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_vi(e,r){try{Module.dynCall_vi(e,r)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_ii(e,r){try{return Module.dynCall_ii(e,r)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_viii(e,r,t,n){try{Module.dynCall_viii(e,r,t,n)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_v(e){try{Module.dynCall_v(e)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_viiiiii(e,r,t,n,i,a,o){try{Module.dynCall_viiiiii(e,r,t,n,i,a,o)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}function invoke_viiii(e,r,t,n,i){try{Module.dynCall_viiii(e,r,t,n,i)}catch(e){if("number"!=typeof e&&"longjmp"!==e)throw e;Module.setThrew(1,0)}}__ATEXIT__.push(function(){var e=Module._fflush;e&&e(0);var r,t=___syscall146.printChar;t&&((r=___syscall146.buffers)[1].length&&t(1,10),r[2].length&&t(2,10))}),DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC),STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP),STACK_MAX=STACK_BASE+TOTAL_STACK,DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX),HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE,staticSealed=!0,Module.asmGlobalArg={Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,NaN:NaN,Infinity:1/0,byteLength:byteLength},Module.asmLibraryArg={abort:abort,assert:assert,enlargeMemory:enlargeMemory,getTotalMemory:getTotalMemory,abortOnCannotGrowMemory:abortOnCannotGrowMemory,invoke_iiii:invoke_iiii,invoke_viiiii:invoke_viiiii,invoke_vi:invoke_vi,invoke_ii:invoke_ii,invoke_viii:invoke_viii,invoke_v:invoke_v,invoke_viiiiii:invoke_viiiiii,invoke_viiii:invoke_viiii,_pthread_getspecific:_pthread_getspecific,___syscall54:___syscall54,_pthread_setspecific:_pthread_setspecific,___gxx_personality_v0:___gxx_personality_v0,___syscall6:___syscall6,___setErrNo:___setErrNo,_abort:_abort,___cxa_begin_catch:___cxa_begin_catch,_pthread_once:_pthread_once,_emscripten_memcpy_big:_emscripten_memcpy_big,_pthread_key_create:_pthread_key_create,___syscall140:___syscall140,___resumeException:___resumeException,___cxa_find_matching_catch:___cxa_find_matching_catch,___syscall146:___syscall146,__ZSt18uncaught_exceptionv:__ZSt18uncaught_exceptionv,DYNAMICTOP_PTR:DYNAMICTOP_PTR,tempDoublePtr:tempDoublePtr,ABORT:ABORT,STACKTOP:STACKTOP,STACK_MAX:STACK_MAX,cttz_i8:cttz_i8};var asm=function(e,r,t){var n=e.Int8Array,ce=new n(t),i=e.Int16Array,W=new i(t),a=e.Int32Array,_e=new a(t),o=e.Uint8Array,de=new o(t),u=e.Uint16Array,Ee=new u(t),f=e.Uint32Array,l=(new f(t),e.Float32Array),s=(new l(t),e.Float64Array),k=new s(t),c=e.byteLength,_=0|r.DYNAMICTOP_PTR,g=0|r.tempDoublePtr,Te=(r.ABORT,0|r.STACKTOP),d=(r.STACK_MAX,0|r.cttz_i8),L=(e.NaN,e.Infinity,0),ie=(e.Math.floor,e.Math.abs,e.Math.sqrt,e.Math.pow,e.Math.cos,e.Math.sin,e.Math.tan,e.Math.acos,e.Math.asin,e.Math.atan,e.Math.atan2,e.Math.exp,e.Math.log,e.Math.ceil,e.Math.imul),T=(e.Math.min,e.Math.max,e.Math.clz32),E=r.abort,A=(r.assert,r.enlargeMemory),b=r.getTotalMemory,M=r.abortOnCannotGrowMemory,m=(r.invoke_iiii,r.invoke_viiiii,r.invoke_vi,r.invoke_ii,r.invoke_viii,r.invoke_v,r.invoke_viiiiii,r.invoke_viiii,r._pthread_getspecific),S=r.___syscall54,h=r._pthread_setspecific,R=(r.___gxx_personality_v0,r.___syscall6),P=r.___setErrNo,p=r._abort,C=(r.___cxa_begin_catch,r._pthread_once),N=r._emscripten_memcpy_big,y=r._pthread_key_create,O=r.___syscall140,v=(r.___resumeException,r.___cxa_find_matching_catch,r.___syscall146);r.__ZSt18uncaught_exceptionv;function I(e){e|=0;var r=0,t=0,n=0,i=0,a=0,o=0,u=0,f=0,l=0,s=0,c=0,_=0,d=0,E=0,T=0,A=0,b=0,M=0,m=0,S=0,h=Te;Te=Te+16|0,_=h;do{if(e>>>0<245){if(e=(l=e>>>0<11?16:e+11&-8)>>>3,3&(t=(c=0|_e[1144])>>>e)|0)return n=0|_e[(t=(e=4616+((r=(1&t^1)+e|0)<<1<<2)|0)+8|0)>>2],(0|e)==(0|(a=0|_e[(i=n+8|0)>>2]))?_e[1144]=c&~(1<<r):(_e[a+12>>2]=e,_e[t>>2]=a),S=r<<3,_e[n+4>>2]=3|S,_e[(S=n+S+4|0)>>2]=1|_e[S>>2],Te=h,0|(S=i);if((s=0|_e[1146])>>>0<l>>>0){if(0|t)return r=((r=t<<e&((r=2<<e)|0-r))&0-r)-1|0,i=0|_e[(e=(r=4616+((n=((t=(r>>>=o=r>>>12&16)>>>5&8)|o|(i=(r>>>=t)>>>2&4)|(e=(r>>>=i)>>>1&2)|(n=(r>>>=e)>>>1&1))+(r>>>n)|0)<<1<<2)|0)+8|0)>>2],(0|r)==(0|(t=0|_e[(o=i+8|0)>>2]))?(e=c&~(1<<n),_e[1144]=e):(_e[t+12>>2]=r,_e[e>>2]=t,e=c),a=(n<<3)-l|0,_e[i+4>>2]=3|l,_e[(n=i+l|0)+4>>2]=1|a,_e[n+a>>2]=a,0|s&&(i=0|_e[1149],t=4616+((r=s>>>3)<<1<<2)|0,e&(r=1<<r)?r=0|_e[(e=t+8|0)>>2]:(_e[1144]=e|r,e=(r=t)+8|0),_e[e>>2]=i,_e[r+12>>2]=i,_e[i+8>>2]=r,_e[i+12>>2]=t),_e[1146]=a,_e[1149]=n,Te=h,0|(S=o);if(u=0|_e[1145]){if(t=(u&0-u)-1|0,e=0|_e[4880+(((a=(t>>>=o=t>>>12&16)>>>5&8)|o|(f=(t>>>=a)>>>2&4)|(n=(t>>>=f)>>>1&2)|(e=(t>>>=n)>>>1&1))+(t>>>e)<<2)>>2],t=(-8&_e[e+4>>2])-l|0,n=0|_e[e+16+((0==(0|_e[e+16>>2])&1)<<2)>>2]){for(;t=(f=(o=(-8&_e[n+4>>2])-l|0)>>>0<t>>>0)?o:t,e=f?n:e,0!=(0|(n=0|_e[n+16+((0==(0|_e[n+16>>2])&1)<<2)>>2])););f=e,a=t}else f=e,a=t;if(f>>>0<(o=f+l|0)>>>0){i=0|_e[f+24>>2],r=0|_e[f+12>>2];do{if((0|r)==(0|f)){if(!(r=0|_e[(e=f+20|0)>>2])&&!(r=0|_e[(e=f+16|0)>>2])){t=0;break}for(;;)if(0|(n=0|_e[(t=r+20|0)>>2]))r=n,e=t;else{if(!(n=0|_e[(t=r+16|0)>>2]))break;r=n,e=t}_e[e>>2]=0,t=r}else t=0|_e[f+8>>2],_e[t+12>>2]=r,_e[r+8>>2]=t,t=r}while(0);do{if(0|i){if(r=0|_e[f+28>>2],(0|f)==(0|_e[(e=4880+(r<<2)|0)>>2])){if(!(_e[e>>2]=t)){_e[1145]=u&~(1<<r);break}}else if(!(_e[i+16+(((0|_e[i+16>>2])!=(0|f)&1)<<2)>>2]=t))break;_e[t+24>>2]=i,0|(r=0|_e[f+16>>2])&&(_e[t+16>>2]=r,_e[r+24>>2]=t),0|(r=0|_e[f+20>>2])&&(_e[t+20>>2]=r,_e[r+24>>2]=t)}}while(0);return a>>>0<16?(S=a+l|0,_e[f+4>>2]=3|S,_e[(S=f+S+4|0)>>2]=1|_e[S>>2]):(_e[f+4>>2]=3|l,_e[o+4>>2]=1|a,_e[o+a>>2]=a,0|s&&(n=0|_e[1149],t=4616+((r=s>>>3)<<1<<2)|0,c&(r=1<<r)?r=0|_e[(e=t+8|0)>>2]:(_e[1144]=c|r,e=(r=t)+8|0),_e[e>>2]=n,_e[r+12>>2]=n,_e[n+8>>2]=r,_e[n+12>>2]=t),_e[1146]=a,_e[1149]=o),Te=h,0|(S=f+8|0)}c=l}else c=l}else c=l}else if(e>>>0<=4294967231)if(l=-8&(e=e+11|0),f=0|_e[1145]){n=0-l|0,u=(e>>>=8)?16777215<l>>>0?31:l>>>((u=14-((s=((m=e<<(c=(e+1048320|0)>>>16&8))+520192|0)>>>16&4)|c|(u=((m<<=s)+245760|0)>>>16&2))+(m<<u>>>15)|0)+7|0)&1|u<<1:0,t=0|_e[4880+(u<<2)>>2];e:do{if(t)for(o=l<<(31==((e=0)|u)?0:25-(u>>>1)|0),a=0;;){if((i=(-8&_e[t+4>>2])-l|0)>>>0<n>>>0){if(!i){n=0,i=e=t,m=61;break e}e=t,n=i}if(a=0==(0|(i=0|_e[t+20>>2]))|(0|i)==(0|(t=0|_e[t+16+(o>>>31<<2)>>2]))?a:i,i=0==(0|t)){t=a,m=57;break}o<<=1&(1^i)}else e=t=0,m=57}while(0);if(57==(0|m)){if(0==(0|t)&0==(0|e)){if(!(e=f&((e=2<<u)|0-e))){c=l;break}c=(e&0-e)-1|0,t=(e=0)|_e[4880+(((a=(c>>>=o=c>>>12&16)>>>5&8)|o|(u=(c>>>=a)>>>2&4)|(s=(c>>>=u)>>>1&2)|(t=(c>>>=s)>>>1&1))+(c>>>t)<<2)>>2]}t?(i=t,m=61):(u=e,o=n)}if(61==(0|m))for(;;){if(m=0,t=(c=(t=(-8&_e[i+4>>2])-l|0)>>>0<n>>>0)?t:n,e=c?i:e,!(i=0|_e[i+16+((0==(0|_e[i+16>>2])&1)<<2)>>2])){u=e,o=t;break}n=t,m=61}if(0!=(0|u)&&o>>>0<((0|_e[1146])-l|0)>>>0){if((a=u+l|0)>>>0<=u>>>0)return Te=h,(S=0)|S;i=0|_e[u+24>>2],r=0|_e[u+12>>2];do{if((0|r)==(0|u)){if(!(r=0|_e[(e=u+20|0)>>2])&&!(r=0|_e[(e=u+16|0)>>2])){r=0;break}for(;;)if(0|(n=0|_e[(t=r+20|0)>>2]))r=n,e=t;else{if(!(n=0|_e[(t=r+16|0)>>2]))break;r=n,e=t}_e[e>>2]=0}else S=0|_e[u+8>>2],_e[S+12>>2]=r,_e[r+8>>2]=S}while(0);do{if(i){if(e=0|_e[u+28>>2],(0|u)==(0|_e[(t=4880+(e<<2)|0)>>2])){if(!(_e[t>>2]=r)){n=f&~(1<<e),_e[1145]=n;break}}else if(!(_e[i+16+(((0|_e[i+16>>2])!=(0|u)&1)<<2)>>2]=r)){n=f;break}_e[r+24>>2]=i,0|(e=0|_e[u+16>>2])&&(_e[r+16>>2]=e,_e[e+24>>2]=r),n=((e=0|_e[u+20>>2])&&(_e[r+20>>2]=e,_e[e+24>>2]=r),f)}else n=f}while(0);do{if(16<=o>>>0){if(_e[u+4>>2]=3|l,_e[a+4>>2]=1|o,r=(_e[a+o>>2]=o)>>>3,o>>>0<256){t=4616+(r<<1<<2)|0,(e=0|_e[1144])&(r=1<<r)?r=0|_e[(e=t+8|0)>>2]:(_e[1144]=e|r,e=(r=t)+8|0),_e[e>>2]=a,_e[r+12>>2]=a,_e[a+8>>2]=r,_e[a+12>>2]=t;break}if(t=4880+((r=(r=o>>>8)?16777215<o>>>0?31:o>>>((r=14-((M=((S=r<<(m=(r+1048320|0)>>>16&8))+520192|0)>>>16&4)|m|(r=((S<<=M)+245760|0)>>>16&2))+(S<<r>>>15)|0)+7|0)&1|r<<1:0)<<2)|0,_e[a+28>>2]=r,_e[(e=a+16|0)+4>>2]=0,_e[e>>2]=0,!(n&(e=1<<r))){_e[1145]=n|e,_e[t>>2]=a,_e[a+24>>2]=t,_e[a+12>>2]=a,_e[a+8>>2]=a;break}for(e=o<<(31==(0|r)?0:25-(r>>>1)|0),t=0|_e[t>>2];;){if((-8&_e[t+4>>2]|0)==(0|o)){m=97;break}if(!(r=0|_e[(n=t+16+(e>>>31<<2)|0)>>2])){m=96;break}e<<=1,t=r}if(96==(0|m)){_e[n>>2]=a,_e[a+24>>2]=t,_e[a+12>>2]=a,_e[a+8>>2]=a;break}if(97==(0|m)){S=0|_e[(m=t+8|0)>>2],_e[S+12>>2]=a,_e[m>>2]=a,_e[a+8>>2]=S,_e[a+12>>2]=t,_e[a+24>>2]=0;break}}else S=o+l|0,_e[u+4>>2]=3|S,_e[(S=u+S+4|0)>>2]=1|_e[S>>2]}while(0);return Te=h,0|(S=u+8|0)}c=l}else c=l;else c=-1}while(0);if(c>>>0<=(t=0|_e[1146])>>>0)return r=t-c|0,e=0|_e[1149],15<r>>>0?(S=e+c|0,_e[1149]=S,_e[1146]=r,_e[S+4>>2]=1|r,_e[S+r>>2]=r,_e[e+4>>2]=3|c):(_e[1146]=0,_e[1149]=0,_e[e+4>>2]=3|t,_e[(S=e+t+4|0)>>2]=1|_e[S>>2]),Te=h,0|(S=e+8|0);if(c>>>0<(o=0|_e[1147])>>>0)return M=o-c|0,_e[1147]=M,m=(S=0|_e[1150])+c|0,_e[1150]=m,_e[m+4>>2]=1|M,_e[S+4>>2]=3|c,Te=h,0|(S=S+8|0);if(u=c+48|0,(l=(a=(e=0|_e[1262]?0|_e[1264]:(_e[1264]=4096,_e[1263]=4096,_e[1265]=-1,_e[1266]=-1,_e[1267]=0,_e[1255]=0,e=-16&_^1431655768,_e[_>>2]=e,_e[1262]=e,4096))+(f=c+47|0)|0)&(i=0-e|0))>>>0<=c>>>0)return Te=h,(S=0)|S;if(0|(e=0|_e[1254])&&(_=(s=0|_e[1252])+l|0)>>>0<=s>>>0|e>>>0<_>>>0)return Te=h,(S=0)|S;e:do{if(4&_e[1255])r=0,m=133;else{t=0|_e[1150];r:do{if(t){for(n=5024;!((e=0|_e[n>>2])>>>0<=t>>>0&&(e+(0|_e[(T=n+4|0)>>2])|0)>>>0>t>>>0);){if(!(e=0|_e[n+8>>2])){m=118;break r}n=e}if((r=a-o&i)>>>0<2147483647)if((0|(e=0|me(0|r)))==((0|_e[n>>2])+(0|_e[T>>2])|0)){if(-1!=(0|e)){o=r,a=e,m=135;break e}}else n=e,m=126;else r=0}else m=118}while(0);do{if(118==(0|m))if(-1!=(0|(t=0|me(0)))&&(r=t,E=(r=(0==((E=(d=0|_e[1263])+-1|0)&r|0)?0:(E+r&0-d)-r|0)+l|0)+(d=0|_e[1252])|0,c>>>0<r>>>0&r>>>0<2147483647)){if(0|(T=0|_e[1254])&&E>>>0<=d>>>0|T>>>0<E>>>0){r=0;break}if((0|(e=0|me(0|r)))==(0|t)){o=r,a=t,m=135;break e}n=e,m=126}else r=0}while(0);do{if(126==(0|m)){if(t=0-r|0,!(r>>>0<u>>>0&r>>>0<2147483647&-1!=(0|n))){if(-1==(0|n)){r=0;break}o=r,a=n,m=135;break e}if(2147483647<=(e=f-r+(e=0|_e[1264])&0-e)>>>0){o=r,a=n,m=135;break e}if(-1==(0|me(0|e))){me(0|t),r=0;break}o=e+r|0,a=n,m=135;break e}}while(0);_e[1255]=4|_e[1255],m=133}}while(0);if(133==(0|m)&&l>>>0<2147483647&&!(-1==(0|(M=0|me(0|l)))|1^(b=(c+40|0)>>>0<(A=(T=0|me(0))-M|0)>>>0)|M>>>0<T>>>0&-1!=(0|M)&-1!=(0|T)^1)&&(o=b?A:r,a=M,m=135),135==(0|m)){r=(0|_e[1252])+o|0,(_e[1252]=r)>>>0>(0|_e[1253])>>>0&&(_e[1253]=r),f=0|_e[1150];do{if(f){for(r=5024;;){if((0|a)==((e=0|_e[r>>2])+(n=0|_e[(t=r+4|0)>>2])|0)){m=145;break}if(!(i=0|_e[r+8>>2]))break;r=i}if(145==(0|m)&&0==(8&_e[r+12>>2]|0)&&f>>>0<a>>>0&e>>>0<=f>>>0){_e[t>>2]=n+o,m=f+(S=0==(7&(S=f+8|0)|0)?0:0-S&7)|0,S=(0|_e[1147])+(o-S)|0,_e[1150]=m,_e[1147]=S,_e[m+4>>2]=1|S,_e[m+S+4>>2]=40,_e[1151]=_e[1266];break}for(a>>>0<(0|_e[1148])>>>0&&(_e[1148]=a),t=a+o|0,r=5024;;){if((0|_e[r>>2])==(0|t)){m=153;break}if(!(e=0|_e[r+8>>2]))break;r=e}if(153==(0|m)&&0==(8&_e[r+12>>2]|0)){_e[r>>2]=a,_e[(s=r+4|0)>>2]=(0|_e[s>>2])+o,l=(s=a+(0==(7&(s=a+8|0)|0)?0:0-s&7)|0)+c|0,u=(r=t+(0==(7&(r=t+8|0)|0)?0:0-r&7)|0)-s-c|0,_e[s+4>>2]=3|c;do{if((0|r)!=(0|f)){if((0|r)==(0|_e[1149])){S=(0|_e[1146])+u|0,_e[1146]=S,_e[1149]=l,_e[l+4>>2]=1|S,_e[l+S>>2]=S;break}if(1==(3&(e=0|_e[r+4>>2])|0)){o=-8&e,n=e>>>3;e:do{if(e>>>0<256){if(e=0|_e[r+8>>2],(0|(t=0|_e[r+12>>2]))==(0|e)){_e[1144]=_e[1144]&~(1<<n);break}_e[e+12>>2]=t,_e[t+8>>2]=e;break}a=0|_e[r+24>>2],e=0|_e[r+12>>2];do{if((0|e)==(0|r)){if(!(e=0|_e[(t=(n=r+16|0)+4|0)>>2])){if(!(e=0|_e[n>>2])){e=0;break}t=n}for(;;)if(0|(i=0|_e[(n=e+20|0)>>2]))e=i,t=n;else{if(!(i=0|_e[(n=e+16|0)>>2]))break;e=i,t=n}_e[t>>2]=0}else S=0|_e[r+8>>2],_e[S+12>>2]=e,_e[e+8>>2]=S}while(0);if(!a)break;n=4880+((t=0|_e[r+28>>2])<<2)|0;do{if((0|r)==(0|_e[n>>2])){if(0|(_e[n>>2]=e))break;_e[1145]=_e[1145]&~(1<<t);break e}if(!(_e[a+16+(((0|_e[a+16>>2])!=(0|r)&1)<<2)>>2]=e))break e}while(0);if(_e[e+24>>2]=a,0|(n=0|_e[(t=r+16|0)>>2])&&(_e[e+16>>2]=n,_e[n+24>>2]=e),!(t=0|_e[t+4>>2]))break;_e[e+20>>2]=t,_e[t+24>>2]=e}while(0);r=r+o|0,i=o+u|0}else i=u;if(_e[(r=r+4|0)>>2]=-2&_e[r>>2],_e[l+4>>2]=1|i,r=(_e[l+i>>2]=i)>>>3,i>>>0<256){t=4616+(r<<1<<2)|0,(e=0|_e[1144])&(r=1<<r)?r=0|_e[(e=t+8|0)>>2]:(_e[1144]=e|r,e=(r=t)+8|0),_e[e>>2]=l,_e[r+12>>2]=l,_e[l+8>>2]=r,_e[l+12>>2]=t;break}r=i>>>8;do{if(r){if(16777215<i>>>0){r=31;break}r=i>>>((r=14-((M=((S=r<<(m=(r+1048320|0)>>>16&8))+520192|0)>>>16&4)|m|(r=((S<<=M)+245760|0)>>>16&2))+(S<<r>>>15)|0)+7|0)&1|r<<1}else r=0}while(0);if(n=4880+(r<<2)|0,_e[l+28>>2]=r,_e[(e=l+16|0)+4>>2]=0,!((e=(_e[e>>2]=0)|_e[1145])&(t=1<<r))){_e[1145]=e|t,_e[n>>2]=l,_e[l+24>>2]=n,_e[l+12>>2]=l,_e[l+8>>2]=l;break}for(e=i<<(31==(0|r)?0:25-(r>>>1)|0),t=0|_e[n>>2];;){if((-8&_e[t+4>>2]|0)==(0|i)){m=194;break}if(!(r=0|_e[(n=t+16+(e>>>31<<2)|0)>>2])){m=193;break}e<<=1,t=r}if(193==(0|m)){_e[n>>2]=l,_e[l+24>>2]=t,_e[l+12>>2]=l,_e[l+8>>2]=l;break}if(194==(0|m)){S=0|_e[(m=t+8|0)>>2],_e[S+12>>2]=l,_e[m>>2]=l,_e[l+8>>2]=S,_e[l+12>>2]=t,_e[l+24>>2]=0;break}}else S=(0|_e[1147])+u|0,_e[1147]=S,_e[1150]=l,_e[l+4>>2]=1|S}while(0);return Te=h,0|(S=s+8|0)}for(r=5024;!((e=0|_e[r>>2])>>>0<=f>>>0&&f>>>0<(S=e+(0|_e[r+4>>2])|0)>>>0);)r=0|_e[r+8>>2];for(r=(e=(e=(i=S+-47|0)+(0==(7&(e=i+8|0)|0)?0:0-e&7)|0)>>>0<(i=f+16|0)>>>0?f:e)+8|0,m=a+(t=0==(7&(t=a+8|0)|0)?0:0-t&7)|0,t=o+-40-t|0,_e[1150]=m,_e[1147]=t,_e[m+4>>2]=1|t,_e[m+t+4>>2]=40,_e[1151]=_e[1266],_e[(t=e+4|0)>>2]=27,_e[r>>2]=_e[1256],_e[r+4>>2]=_e[1257],_e[r+8>>2]=_e[1258],_e[r+12>>2]=_e[1259],_e[1256]=a,_e[1257]=o,_e[1259]=0,_e[1258]=r,r=e+24|0;_e[(r=(m=r)+4|0)>>2]=7,(m+8|0)>>>0<S>>>0;);if((0|e)!=(0|f)){if(a=e-f|0,_e[t>>2]=-2&_e[t>>2],_e[f+4>>2]=1|a,r=(_e[e>>2]=a)>>>3,a>>>0<256){t=4616+(r<<1<<2)|0,(e=0|_e[1144])&(r=1<<r)?r=0|_e[(e=t+8|0)>>2]:(_e[1144]=e|r,e=(r=t)+8|0),_e[e>>2]=f,_e[r+12>>2]=f,_e[f+8>>2]=r,_e[f+12>>2]=t;break}if(n=4880+((t=(r=a>>>8)?16777215<a>>>0?31:a>>>((t=14-((M=((S=r<<(m=(r+1048320|0)>>>16&8))+520192|0)>>>16&4)|m|(t=((S<<=M)+245760|0)>>>16&2))+(S<<t>>>15)|0)+7|0)&1|t<<1:0)<<2)|0,_e[f+28>>2]=t,_e[f+20>>2]=0,!((r=(_e[i>>2]=0)|_e[1145])&(e=1<<t))){_e[1145]=r|e,_e[n>>2]=f,_e[f+24>>2]=n,_e[f+12>>2]=f,_e[f+8>>2]=f;break}for(e=a<<(31==(0|t)?0:25-(t>>>1)|0),t=0|_e[n>>2];;){if((-8&_e[t+4>>2]|0)==(0|a)){m=216;break}if(!(r=0|_e[(n=t+16+(e>>>31<<2)|0)>>2])){m=215;break}e<<=1,t=r}if(215==(0|m)){_e[n>>2]=f,_e[f+24>>2]=t,_e[f+12>>2]=f,_e[f+8>>2]=f;break}if(216==(0|m)){S=0|_e[(m=t+8|0)>>2],_e[S+12>>2]=f,_e[m>>2]=f,_e[f+8>>2]=S,_e[f+12>>2]=t,_e[f+24>>2]=0;break}}}else{for(0==(0|(S=0|_e[1148]))|a>>>0<S>>>0&&(_e[1148]=a),_e[1256]=a,_e[1257]=o,_e[1259]=0,_e[1153]=_e[1262],_e[1152]=-1,r=0;_e[(S=4616+(r<<1<<2)|0)+12>>2]=S,_e[S+8>>2]=S,32!=(0|(r=r+1|0)););m=a+(S=0==(7&(S=a+8|0)|0)?0:0-S&7)|0,S=o+-40-S|0,_e[1150]=m,_e[1147]=S,_e[m+4>>2]=1|S,_e[m+S+4>>2]=40,_e[1151]=_e[1266]}}while(0);if(c>>>0<(r=0|_e[1147])>>>0)return M=r-c|0,_e[1147]=M,m=(S=0|_e[1150])+c|0,_e[1150]=m,_e[m+4>>2]=1|M,_e[S+4>>2]=3|c,Te=h,0|(S=S+8|0)}return _e[(S=296)>>2]=12,Te=h,(S=0)|S}function w(e,r,t,n,i,a){e|=0,r=+r,t|=0,n|=0,i|=0,a|=0;var o,u=0,f=0,l=0,s=0,c=0,_=0,d=0,E=0,T=0,A=0,b=0,M=0,m=0,S=0,h=0,R=0,P=0,p=0,C=0,N=0,y=0,O=0,v=Te;Te=Te+560|0,l=v+8|0,y=O=(b=v)+524|0,N=(s=v+512|0)+12|(_e[b>>2]=0),ke(r),P=(0|L)<0?(r=-r,p=1,2087):(p=0!=(2049&i|0)&1,0==(2048&i|0)?0==(1&i|0)?2088:2093:2090),ke(r),C=2146435072&L;do{if(C>>>0<2146435072|2146435072==(0|C)&!1){if((u=0!=(E=2*(o=b,+ + +function e(r,t){r=+r,t|=0;var n=0,i=0,a=0;switch(k[g>>3]=r,n=0|_e[g>>2],i=0|_e[g+4>>2],2047&(a=0|ye(0|n,0|i,52))){case 0:n=0!=r?(r=+e(0x10000000000000000*r,t),(0|_e[t>>2])-64|0):0,_e[t>>2]=n;break;case 2047:break;default:_e[t>>2]=(2047&a)-1022,_e[g>>2]=n,_e[g+4>>2]=-2146435073&i|1071644672,r=+k[g>>3]}return+r}(+r,o|=0))))&&(_e[b>>2]=(0|_e[b>>2])-1),97==(0|(m=32|a))){d=0==(0|(T=32&a))?P:P+9|0,_=2|p,u=12-n|0;do{if(!(11<n>>>0|0==(0|u))){for(r=8;r*=16,0!=(0|(u=u+-1|0)););if(45==(0|ce[d>>0])){r=-(r+(-E-r));break}r=E+r-r;break}r=E}while(0);for((0|(u=0|fe(u=(0|(f=0|_e[b>>2]))<0?0-f|0:f,((0|u)<0)<<31>>31,N)))==(0|N)&&(ce[(u=s+11|0)>>0]=48),ce[u+-1>>0]=43+(f>>31&2),ce[(c=u+-2|0)>>0]=a+15,s=(0|n)<1,l=0==(8&i|0),u=O;C=~~r,f=u+1|0,ce[u>>0]=de[2122+C>>0]|T,r=16*(r-(0|C)),u=1!=(f-y|0)||l&s&0==r?f:(ce[f>>0]=46,u+2|0),0!=r;);C=u-y|0,se(e,32,t,u=(y=N-c|0)+_+(N=0!=(0|n)&(C+-2|0)<(0|n)?n+2|0:C)|0,i),Ie(e,d,_),se(e,48,t,u,65536^i),Ie(e,O,C),se(e,48,N-C|0,0,0),Ie(e,c,y),se(e,32,t,u,8192^i);break}for(f=(0|n)<0?6:n,u?(u=(0|_e[b>>2])-28|0,_e[b>>2]=u,r=268435456*E):(r=E,u=0|_e[b>>2]),l=C=(0|u)<0?l:l+288|0;h=~~r>>>0,_e[l>>2]=h,l=l+4|0,0!=(r=1e9*(r-(h>>>0))););if(0<(0|u))for(s=C,_=l;;){if(c=(0|u)<29?u:29,s>>>0<=(u=_+-4|0)>>>0){for(l=0;M=0|Pe(0|(S=0|ge(0|(S=0|Ne(0|_e[u>>2],0,0|c)),0|L,0|l,0)),0|(h=L),1e9,0),_e[u>>2]=M,l=0|Fe(0|S,0|h,1e9,0),s>>>0<=(u=u+-4|0)>>>0;);l&&(_e[(s=s+-4|0)>>2]=l)}for(l=_;!(l>>>0<=s>>>0||0|_e[(u=l+-4|0)>>2]);)l=u;if(u=(0|_e[b>>2])-c|0,!(0<(0|(_e[b>>2]=u))))break;_=l}else s=C;if((0|u)<0){n=1+((f+25|0)/9|0)|0,A=102==(0|m);do{if(T=(0|(T=0-u|0))<9?T:9,s>>>0<l>>>0){for(c=(1<<T)-1|0,_=1e9>>>T,d=0,u=s;h=0|_e[u>>2],_e[u>>2]=(h>>>T)+d,d=0|ie(h&c,_),(u=u+4|0)>>>0<l>>>0;);u=0==(0|_e[s>>2])?s+4|0:s,u=d?(_e[l>>2]=d,s=u,l+4|0):(s=u,l)}else s=0==(0|_e[s>>2])?s+4|0:s,u=l;l=(0|n)<(u-(l=A?C:s)>>2|0)?l+(n<<2)|0:u,u=(0|_e[b>>2])+T|0,_e[b>>2]=u}while((0|u)<0);u=s,n=l}else u=s,n=l;if(h=C,u>>>0<n>>>0){if(l=9*(h-u>>2)|0,10<=(c=0|_e[u>>2])>>>0)for(s=10;l=l+1|0,(s=10*s|0)>>>0<=c>>>0;);}else l=0;if((0|(s=f-(102!=(0|m)?l:0)+(((M=0!=(0|f))&(A=103==(0|m)))<<31>>31)|0))<((9*(n-h>>2)|0)-9|0)){if(T=C+4+(((0|(s=s+9216|0))/9|0)-1024<<2)|0,(0|(s=1+((0|s)%9|0)|0))<9)for(c=10;c=10*c|0,9!=(0|(s=s+1|0)););else c=10;if((s=(T+4|0)==(0|n))&0==(0|(d=((_=0|_e[T>>2])>>>0)%(c>>>0)|0)))s=T;else if(E=0==(1&((_>>>0)/(c>>>0)|0)|0)?9007199254740992:9007199254740994,r=d>>>0<(S=(0|c)/2|0)>>>0?.5:s&(0|d)==(0|S)?1:1.5,p&&(r=(S=45==(0|ce[P>>0]))?-r:r,E=S?-E:E),s=_-d|0,_e[T>>2]=s,E+r!=E){if(S=s+c|0,999999999<(_e[T>>2]=S)>>>0)for(l=T;(s=l+-4|0)>>>(_e[l>>2]=0)<u>>>0&&(_e[(u=u+-4|0)>>2]=0),S=1+(0|_e[s>>2])|0,999999999<(_e[s>>2]=S)>>>0;)l=s;else s=T;if(l=9*(h-u>>2)|0,10<=(_=0|_e[u>>2])>>>0)for(c=10;l=l+1|0,(c=10*c|0)>>>0<=_>>>0;);}else s=T;s=(s=s+4|0)>>>0<n>>>0?s:n,S=u}else s=n,S=u;for(m=s;;){if(m>>>0<=S>>>0){b=0;break}if(0|_e[(u=m+-4|0)>>2]){b=1;break}m=u}n=0-l|0;do{if(A){if(f=(0|l)<(0|(u=(1&(1^M))+f|0))&-5<(0|l)?(c=a+-1|0,u+-1-l|0):(c=a+-2|0,u+-1|0),!(u=8&i)){if(b&&0!=(0|(R=0|_e[m+-4>>2])))if((R>>>0)%10|0)s=0;else for(s=0,u=10;s=s+1|0,!((R>>>0)%((u=10*u|0)>>>0)|0););else s=9;if(u=(9*(m-h>>2)|0)-9|0,102==(32|c)){f=(0|f)<(0|(T=0<(0|(T=u-s|0))?T:0))?f:T,T=0;break}f=(0|f)<(0|(T=0<(0|(T=u+l-s|0))?T:0))?f:T,T=0;break}T=u}else c=a,T=8&i}while(0);if(_=0!=(0|(A=f|T))&1,d=102==(32|c))u=(M=0)<(0|l)?l:0;else{if(((s=N)-(u=0|fe(u=(0|l)<0?n:l,((0|u)<0)<<31>>31,N))|0)<2)for(;ce[(u=u+-1|0)>>0]=48,(s-u|0)<2;);ce[u+-1>>0]=43+(l>>31&2),ce[(u=u+-2|0)>>0]=c,u=s-(M=u)|0}if(se(e,32,t,u=p+1+f+_+u|0,i),Ie(e,P,p),se(e,48,t,u,65536^i),d){_=T=O+9|0,d=O+8|0,s=c=C>>>0<S>>>0?C:S;do{if(l=0|fe(0|_e[s>>2],0,T),(0|s)==(0|c))(0|l)==(0|T)&&(ce[d>>0]=48,l=d);else if(O>>>0<l>>>0)for(ne(0|O,48,l-y|0);O>>>0<(l=l+-1|0)>>>0;);Ie(e,l,_-l|0),s=s+4|0}while(s>>>0<=C>>>0);if(0|A&&Ie(e,2138,1),s>>>0<m>>>0&0<(0|f))for(;;){if(O>>>0<(l=0|fe(0|_e[s>>2],0,T))>>>0)for(ne(0|O,48,l-y|0);O>>>0<(l=l+-1|0)>>>0;);if(Ie(e,l,(0|f)<9?f:9),l=f+-9|0,!((s=s+4|0)>>>0<m>>>0&9<(0|f))){f=l;break}f=l}se(e,48,f+9|0,9,0)}else{if(A=b?m:S+4|0,-1<(0|f)){T=0==(0|T),n=b=O+9|0,_=0-y|0,d=O+8|0,c=S;do{(0|(l=0|fe(0|_e[c>>2],0,b)))==(0|b)&&(ce[d>>0]=48,l=d);do{if((0|c)==(0|S)){if(s=l+1|0,Ie(e,l,1),T&(0|f)<1){l=s;break}Ie(e,2138,1),l=s}else{if(l>>>0<=O>>>0)break;for(ne(0|O,48,l+_|0);O>>>0<(l=l+-1|0)>>>0;);}}while(0);Ie(e,l,(0|(y=n-l|0))<(0|f)?y:f),f=f-y|0,c=c+4|0}while(c>>>0<A>>>0&-1<(0|f))}se(e,48,f+18|0,18,0),Ie(e,M,N-M|0)}se(e,32,t,u,8192^i)}else O=0!=(32&a|0),se(e,32,t,u=p+3|0,-65537&i),Ie(e,P,p),Ie(e,r!=r|!1?O?2114:2118:O?2106:2110,3),se(e,32,t,u,8192^i)}while(0);return Te=v,0|((0|u)<(0|t)?t:u)}function D(e,r,t,n,i){e|=0,r|=0,t|=0,n|=0,i|=0;var a,o,u,f,l,s,c,_,d,E,T=0,A=0,b=0,M=0,m=0,S=0,h=0,R=0,P=0,p=0,C=0,N=0,y=0,O=Te;Te=Te+64|0,f=(c=O)+24|0,_=O+8|0,d=O+20|0,_e[(s=O+16|0)>>2]=r,a=0!=(0|e),u=o=40+f|0,f=39+f|0,l=4+_|0,S=T=A=0;e:for(;;){do{if(-1<(0|T)){if((2147483647-T|0)<(0|A)){_e[(T=296)>>2]=75,T=-1;break}T=A+T|0;break}}while(0);if(!((A=0|ce[r>>0])<<24>>24)){y=87;break}b=r;r:for(;;){switch(A<<24>>24){case 37:A=b,y=9;break r;case 0:A=b;break r}N=b+1|0,_e[s>>2]=N,A=0|ce[N>>0],b=N}r:do{if(9==(0|y))for(;;){if(37!=((y=0)|ce[b+1>>0]))break r;if(A=A+1|0,b=b+2|0,_e[s>>2]=b,37!=(0|ce[b>>0]))break;y=9}}while(0);if(A=A-r|0,a&&Ie(e,r,A),0|A)r=b;else{(A=(0|ce[(M=b+1|0)>>0])-48|0)>>>0<10?(C=(N=36==(0|ce[b+2>>0]))?A:-1,S=N?1:S,M=N?b+3|0:M):C=-1,_e[s>>2]=M,b=((A=0|ce[M>>0])<<24>>24)-32|0;r:do{if(b>>>0<32)for(m=0,h=A;;){if(!(75913&(A=1<<b))){A=h;break r}if(m|=A,M=M+1|0,_e[s>>2]=M,32<=(b=((A=0|ce[M>>0])<<24>>24)-32|0)>>>0)break;h=A}else m=0}while(0);if(A<<24>>24==42){if((A=(0|ce[(b=M+1|0)>>0])-48|0)>>>0<10&&36==(0|ce[M+2>>0]))_e[i+(A<<2)>>2]=10,A=0|_e[n+((0|ce[b>>0])-48<<3)>>2],S=1,M=M+3|0;else{if(0|S){T=-1;break}M=(S=a?(S=3+(0|_e[t>>2])&-4,A=0|_e[S>>2],_e[t>>2]=S+4,0):A=0,b)}_e[s>>2]=M,A=(N=(0|A)<0)?0-A|0:A,m=N?8192|m:m}else{if((0|(A=0|Se(s)))<0){T=-1;break}M=0|_e[s>>2]}do{if(46==(0|ce[M>>0])){if(42!=(0|ce[M+1>>0])){_e[s>>2]=M+1,b=0|Se(s),M=0|_e[s>>2];break}if((b=(0|ce[(h=M+2|0)>>0])-48|0)>>>0<10&&36==(0|ce[M+3>>0])){_e[i+(b<<2)>>2]=10,b=0|_e[n+((0|ce[h>>0])-48<<3)>>2],M=M+4|0,_e[s>>2]=M;break}if(0|S){T=-1;break e}a?(N=3+(0|_e[t>>2])&-4,b=0|_e[N>>2],_e[t>>2]=N+4):b=0,M=_e[s>>2]=h}else b=-1}while(0);for(p=0;;){if(57<((0|ce[M>>0])-65|0)>>>0){T=-1;break e}if(N=M+1|0,_e[s>>2]=N,!(((R=255&(h=0|ce[(0|ce[M>>0])-65+(1606+(58*p|0))>>0]))+-1|0)>>>0<8))break;p=R,M=N}if(!(h<<24>>24)){T=-1;break}P=-1<(0|C);do{if(h<<24>>24==19){if(P){T=-1;break e}y=49}else{if(P){_e[i+(C<<2)>>2]=R,C=0|_e[(P=n+(C<<3)|0)+4>>2],_e[(y=c)>>2]=_e[P>>2],_e[y+4>>2]=C,y=49;break}if(!a){T=0;break e}H(c,R,t)}}while(0);if(49!=(0|y)||(y=0,a)){M=0!=(0|p)&3==(15&(M=0|ce[M>>0])|0)?-33&M:M,P=-65537&m,C=0==(8192&m|0)?m:P;r:do{switch(0|M){case 110:switch((255&p)<<24>>24){case 0:case 1:_e[_e[c>>2]>>2]=T,A=0,r=N;continue e;case 2:A=0|_e[c>>2],_e[A>>2]=T,_e[A+4>>2]=((0|T)<0)<<31>>31,A=0,r=N;continue e;case 3:W[_e[c>>2]>>1]=T,A=0,r=N;continue e;case 4:ce[_e[c>>2]>>0]=T,A=0,r=N;continue e;case 6:_e[_e[c>>2]>>2]=T,A=0,r=N;continue e;case 7:A=0|_e[c>>2],_e[A>>2]=T,_e[A+4>>2]=((0|T)<0)<<31>>31,A=0,r=N;continue e;default:A=0,r=N;continue e}case 112:M=120,b=8<b>>>0?b:8,r=8|C,y=61;break;case 88:case 120:r=C,y=61;break;case 111:h=2070,b=(m=0)==(8&C|0)|(0|(P=u-(R=0|function(e,r,t){if(t|=0,!(0==(0|(e|=0))&0==(0|(r|=0))))for(;ce[(t=t+-1|0)>>0]=7&e|48,e=0|ye(0|e,0|r,3),r=L,!(0==(0|e)&0==(0|r)););return 0|t}(r=0|_e[(M=c)>>2],M=0|_e[M+4>>2],o))|0))<(0|b)?b:P+1|0,P=C,y=67;break;case 105:case 100:if(r=0|_e[(M=c)>>2],(0|(M=0|_e[M+4>>2]))<0){r=0|ve(0,0,0|r,0|M),M=L,_e[(m=c)>>2]=r,_e[m+4>>2]=M,m=1,h=2070,y=66;break r}m=0!=(2049&C|0)&1,h=0==(2048&C|0)?0==(1&C|0)?2070:2072:2071,y=66;break r;case 117:h=2070,r=(m=0)|_e[(M=c)>>2],M=0|_e[M+4>>2],y=66;break;case 99:ce[f>>0]=_e[c>>2],r=f,m=0,h=2070,R=o,M=1,b=P;break;case 109:M=0|(E=0|_e[(M=296)>>2],0|function(e,r){e|=0,r|=0;var t=0,n=0;for(n=0;;){if((0|de[2140+n>>0])==(0|e)){e=2;break}if(87==(0|(t=n+1|0))){t=2228,n=87,e=5;break}n=t}if(2==(0|e)&&(n?(t=2228,e=5):t=2228),5==(0|e))for(;;){for(;t=(e=t)+1|0,0!=(0|ce[e>>0]););if(!(n=n+-1|0))break;e=5}return 0|function(e,r){return 0|function(e,r){return e|=0,0|(0|(r=(r|=0)?0|function(e,r,t){r|=0,t|=0;var n=0,i=0,a=0,o=0,u=0,f=0,l=0,s=0,c=0,_=0;_=1794895138+(0|_e[(e|=0)>>2])|0,a=0|Ge(0|_e[e+8>>2],_),n=0|Ge(0|_e[e+12>>2],_),i=0|Ge(0|_e[e+16>>2],_);t:do{if(a>>>0<r>>>2>>>0&&(c=r-(a<<2)|0,n>>>0<c>>>0&i>>>0<c>>>0)&&0==(3&(i|n)|0)){for(c=n>>>2,s=i>>>2,l=0;;){if(n=0|Ge(0|_e[e+((i=(o=(f=l+(u=a>>>1)|0)<<1)+c|0)<<2)>>2],_),!((i=0|Ge(0|_e[e+(i+1<<2)>>2],_))>>>0<r>>>0&n>>>0<(r-i|0)>>>0)){n=0;break t}if(0|ce[e+(i+n)>>0]){n=0;break t}if(!(n=0|function(e,r){r|=0;var t=0,n=0;if(t=0|ce[(e|=0)>>0],n=0|ce[r>>0],t<<24>>24==0||t<<24>>24!=n<<24>>24)e=n;else{for(;r=r+1|0,t=0|ce[(e=e+1|0)>>0],n=0|ce[r>>0],t<<24>>24!=0&&t<<24>>24==n<<24>>24;);e=n}return(255&t)-(255&e)|0}(t,e+i|0)))break;if(n=(0|n)<0,1==(0|a)){n=0;break t}l=n?l:f,a=n?u:a-u|0}i=0|Ge(0|_e[e+((n=o+s|0)<<2)>>2],_),n=(n=0|Ge(0|_e[e+(n+1<<2)>>2],_))>>>0<r>>>0&i>>>0<(r-n|0)>>>0&&0==(0|ce[e+(n+i)>>0])?e+n|0:0}else n=0}while(0);return 0|n}(0|_e[r>>2],0|_e[r+4>>2],e):0)?r:e)}(e|=0,r|=0)}(t,0|_e[r+20>>2])}(E|=0,0|_e[105])),y=71;break;case 115:M=0|(M=0|_e[c>>2])?M:2080,y=71;break;case 67:_e[_>>2]=_e[c>>2],_e[l>>2]=0,R=-1,M=_e[c>>2]=_,y=75;break;case 83:r=0|_e[c>>2],y=b?(R=b,M=r,75):(se(e,32,A,0,C),r=0,84);break;case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:A=0|w(e,+k[c>>3],A,b,C,M),r=N;continue e;default:m=0,h=2070,R=o,M=b,b=C}}while(0);r:do{if(61==(0|y))R=0|function(e,r,t,n){if(t|=0,n|=0,!(0==(0|(e|=0))&0==(0|(r|=0))))for(;ce[(t=t+-1|0)>>0]=0|de[2122+(15&e)>>0]|n,e=0|ye(0|e,0|r,4),r=L,!(0==(0|e)&0==(0|r)););return 0|t}(p=0|_e[(C=c)>>2],C=0|_e[C+4>>2],o,32&M),m=(h=0==(8&r|0)|0==(0|p)&0==(0|C))?0:2,h=h?2070:2070+(M>>4)|0,P=r,r=p,M=C,y=67;else if(66==(0|y))R=0|fe(r,M,o),P=C,y=67;else if(71==(0|y))h=2070,R=(p=(m=y=0)==(0|(C=0|function(e,r,t){e|=0;var n=0,i=0,a=0,o=0;a=255&(r|=0),n=0!=(0|(t|=0));t:do{if(n&0!=(3&e|0))for(i=255&r;;){if((0|ce[e>>0])==i<<24>>24){o=6;break t}if(!((n=0!=(0|(t=t+-1|0)))&0!=(3&(e=e+1|0)|0))){o=5;break}}else o=5}while(0);5==(0|o)&&(n?o=6:t=0);t:do{if(6==(0|o)&&(i=255&r,(0|ce[e>>0])!=i<<24>>24)){n=0|ie(a,16843009);n:do{if(3<t>>>0){for(;!((-2139062144&(a=_e[e>>2]^n)^-2139062144)&a+-16843009|0);)if(e=e+4|0,(t=t+-4|0)>>>0<=3){o=11;break n}}else o=11}while(0);if(11==(0|o)&&!t){t=0;break}for(;;){if((0|ce[e>>0])==i<<24>>24)break t;if(e=e+1|0,!(t=t+-1|0)){t=0;break}}}}while(0);return 0|(0|t?e:0)}(r=M,0,b))))?M+b|0:C,M=p?b:C-M|0,b=P;else if(75==(0|y)){for(h=M,b=r=y=0;(m=0|_e[h>>2])&&!((0|(b=0|we(d,m)))<0|(R-r|0)>>>0<b>>>0)&&(r=b+r|0)>>>0<R>>>0;)h=h+4|0;if((0|b)<0){T=-1;break e}if(se(e,32,A,r,C),r)for(m=0;;){if(!(b=0|_e[M>>2])){y=84;break r}if((0|r)<(0|(m=(b=0|we(d,b))+m|0))){y=84;break r}if(Ie(e,d,b),r>>>0<=m>>>0){y=84;break}M=M+4|0}else r=0,y=84}}while(0);if(67==(0|y))C=(y=0)!=(0|b)|(M=0!=(0|r)|0!=(0|M)),M=u-R+(1&(1^M))|0,r=C?R:o,R=o,M=!C||(0|M)<(0|b)?b:M,b=-1<(0|b)?-65537&P:P;else if(84==(0|y)){y=0,se(e,32,A,r,8192^C),A=(0|r)<(0|A)?A:r,r=N;continue}se(e,32,A=(0|A)<(0|(C=(P=(0|M)<(0|(p=R-r|0))?p:M)+m|0))?C:A,C,b),Ie(e,h,m),se(e,48,A,C,65536^b),se(e,48,P,p,0),Ie(e,r,p),se(e,32,A,C,8192^b),r=N}else A=0,r=N}}e:do{if(87==(0|y)&&!e)if(S){for(T=1;r=0|_e[i+(T<<2)>>2];)if(H(n+(T<<3)|0,r,t),10<=(0|(T=T+1|0))){T=1;break e}for(;;){if(0|_e[i+(T<<2)>>2]){T=-1;break e}if(10<=(0|(T=T+1|0))){T=1;break}}}else T=0}while(0);return Te=O,0|T}function V(e,r){r|=0;var t,n,i,a,o,u,f,l,s,c,_,d,E,T,A=0,b=0,M=0,m=0,S=0,h=0,R=0,P=0,p=0,C=0,N=Te;if(Te=Te+704|0,E=N+144|0,d=N+128|0,_=N+112|0,c=N+96|0,s=N+80|0,l=N+64|0,f=N+48|0,T=N+32|0,t=N+16|0,i=(h=N)+184|0,C=N+160|0,!(a=0|function(e,r){e|=0;var t=0,n=0,i=0,a=0,o=0,u=0,f=0,l=0;if(Te=(l=Te)+528|0,a=(o=l)+16|0,!(r|=0))return Te=l,(f=0)|f;if(r>>>0<=16)return f=0|Q(e,r),Te=l,0|f;if(u=0|Q(e,r+-16|0),(0|(r=0|_e[(f=e+20|0)>>2]))<16)for(n=e+4|0,i=e+8|0,t=e+16|0;e=(0|(e=0|_e[n>>2]))==(0|_e[i>>2])?0:(_e[n>>2]=e+1,0|de[e>>0]),r=r+8|0,33<=(0|(_e[f>>2]=r))&&(_e[o>>2]=866,_e[o+4>>2]=3208,_e[o+8>>2]=1366,Ce(a,812,o),be(a),r=0|_e[f>>2]),e=e<<32-r|_e[t>>2],_e[t>>2]=e,(0|r)<16;);else e=0|_e[(t=e=e+16|0)>>2];return _e[t>>2]=e<<16,_e[f>>2]=r+-16,Te=l,0|(f=e>>>16|u<<16)}(e|=0,14)))return function(e){var r=0,t=0,n=0,i=0,a=0,o=0;Te=(o=Te)+544|0,a=o+16|0,i=(n=o)+32|0,(_e[(e|=0)>>2]=0)|(t=0|_e[(r=e+4|0)>>2])&&(7&t?(_e[n>>2]=866,_e[n+4>>2]=2506,_e[n+8>>2]=1232,Ce(i,812,n),be(i)):ue(t,0,0,1,0),_e[r>>2]=0,_e[e+8>>2]=0,_e[e+12>>2]=0);if(ce[e+16>>0]=0,!(r=0|_e[(e=e+20|0)>>2]))return Te=o;Z(r),7&r?(_e[a>>2]=866,_e[4+a>>2]=2506,_e[8+a>>2]=1232,Ce(i,812,a),be(i)):ue(r,0,0,1,0);_e[e>>2]=0,Te=o}(r),Te=N,0|(C=1);if(o=r+4|0,(0|(A=0|_e[(u=r+8|0)>>2]))!=(0|a)){if(A>>>0<=a>>>0){do{if((0|_e[r+12>>2])>>>0<a>>>0){if(0|X(o,a,(A+1|0)==(0|a),1,0)){A=0|_e[u>>2];break}return ce[r+16>>0]=1,Te=N,(C=0)|C}}while(0);ne((0|_e[o>>2])+A|0,0,a-A|0)}_e[u>>2]=a}if(ne(0|_e[o>>2],0,0|a),(0|(A=0|_e[(n=e+20|0)>>2]))<5)for(m=e+4|0,S=e+8|0,M=e+16|0;b=(0|(b=0|_e[m>>2]))==(0|_e[S>>2])?0:(_e[m>>2]=b+1,0|de[b>>0]),A=A+8|0,33<=(0|(_e[n>>2]=A))&&(_e[h>>2]=866,_e[h+4>>2]=3208,_e[h+8>>2]=1366,Ce(i,812,h),be(i),A=0|_e[n>>2]),b=b<<32-A|_e[M>>2],_e[M>>2]=b,(0|A)<5;);else b=0|_e[(M=b=e+16|0)>>2];if(P=b>>>27,_e[M>>2]=b<<5,_e[n>>2]=A+-5,20<(P+-1|0)>>>0)return Te=N,(C=0)|C;_e[C+20>>2]=0,_e[C>>2]=0,_e[C+4>>2]=0,_e[C+8>>2]=0,_e[C+12>>2]=0,A=C+4|(ce[C+16>>0]=0),b=C+8|0;e:do{if(0|X(A,21,0,1,0)){m=0|_e[b>>2],ne((R=0|_e[A>>2])+m|0,0,21-m|0),_e[b>>2]=21,m=e+4|0,S=e+8|0,h=e+16|0,M=0;do{if((0|(A=0|_e[n>>2]))<3)for(;b=(0|(b=0|_e[m>>2]))==(0|_e[S>>2])?0:(_e[m>>2]=b+1,0|de[b>>0]),A=A+8|0,33<=(0|(_e[n>>2]=A))&&(_e[t>>2]=866,_e[4+t>>2]=3208,_e[8+t>>2]=1366,Ce(i,812,t),be(i),A=0|_e[n>>2]),b=b<<32-A|_e[h>>2],_e[h>>2]=b,(0|A)<3;);else b=0|_e[h>>2];_e[h>>2]=b<<3,_e[n>>2]=A+-3,ce[R+(0|de[1327+M>>0])>>0]=b>>>29,M=M+1|0}while((0|M)!=(0|P));if(0|$(C)){h=e+4|0,R=e+8|0,P=e+16|0,A=0;r:do{S=a-A|0,M=0|Ae(e,C);t:do{if(M>>>0<17)(0|_e[u>>2])>>>0<=A>>>0&&(_e[T>>2]=866,_e[4+T>>2]=910,_e[8+T>>2]=1497,Ce(i,812,T),be(i)),ce[(0|_e[o>>2])+A>>0]=M,A=A+1|0;else switch(0|M){case 17:if((0|(b=0|_e[n>>2]))<3)for(;M=(0|(M=0|_e[h>>2]))==(0|_e[R>>2])?0:(_e[h>>2]=M+1,0|de[M>>0]),b=b+8|0,33<=(0|(_e[n>>2]=b))&&(_e[f>>2]=866,_e[4+f>>2]=3208,_e[8+f>>2]=1366,Ce(i,812,f),be(i),b=0|_e[n>>2]),M=M<<32-b|_e[P>>2],_e[P>>2]=M,(0|b)<3;);else M=0|_e[P>>2];if(_e[P>>2]=M<<3,_e[n>>2]=b+-3,b=S>>>0<(M=3+(M>>>29)|0)>>>0){A=0;break e}A=(b?0:M)+A|0;break t;case 18:if((0|(b=0|_e[n>>2]))<7)for(;M=(0|(M=0|_e[h>>2]))==(0|_e[R>>2])?0:(_e[h>>2]=M+1,0|de[M>>0]),b=b+8|0,33<=(0|(_e[n>>2]=b))&&(_e[l>>2]=866,_e[4+l>>2]=3208,_e[8+l>>2]=1366,Ce(i,812,l),be(i),b=0|_e[n>>2]),M=M<<32-b|_e[P>>2],_e[P>>2]=M,(0|b)<7;);else M=0|_e[P>>2];if(_e[P>>2]=M<<7,_e[n>>2]=b+-7,b=S>>>0<(M=11+(M>>>25)|0)>>>0){A=0;break e}A=(b?0:M)+A|0;break t;default:if(2<=(M+-19|0)>>>0){p=81;break r}if(b=0|_e[n>>2],19==(0|M)){if((0|b)<2)for(M=b;m=(0|(b=0|_e[h>>2]))==(0|_e[R>>2])?0:(_e[h>>2]=b+1,0|de[b>>0]),b=M+8|0,33<=(0|(_e[n>>2]=b))&&(_e[s>>2]=866,_e[4+s>>2]=3208,_e[8+s>>2]=1366,Ce(i,812,s),be(i),b=0|_e[n>>2]),M=m<<32-b|_e[P>>2],_e[P>>2]=M,(0|b)<2;)M=b;else M=0|_e[P>>2];_e[P>>2]=M<<2,M>>>=30,m=3,b=b+-2|0}else{if((0|b)<6)for(;M=(0|(M=0|_e[h>>2]))==(0|_e[R>>2])?0:(_e[h>>2]=M+1,0|de[M>>0]),b=b+8|0,33<=(0|(_e[n>>2]=b))&&(_e[c>>2]=866,_e[4+c>>2]=3208,_e[8+c>>2]=1366,Ce(i,812,c),be(i),b=0|_e[n>>2]),M=M<<32-b|_e[P>>2],_e[P>>2]=M,(0|b)<6;);else M=0|_e[P>>2];_e[P>>2]=M<<6,M>>>=26,m=7,b=b+-6|0}if(_e[n>>2]=b,0==(0|A)|S>>>0<(M=M+m|0)>>>0){A=0;break e}if(b=A+-1|0,(0|_e[u>>2])>>>0<=b>>>0&&(_e[_>>2]=866,_e[4+_>>2]=910,_e[8+_>>2]=1497,Ce(i,812,_),be(i)),!((m=0|ce[(0|_e[o>>2])+b>>0])<<24>>24)){A=0;break e}if((b=M+A|0)>>>0<=A>>>0)break t;for(;(0|_e[u>>2])>>>0<=A>>>0&&(_e[d>>2]=866,_e[4+d>>2]=910,_e[8+d>>2]=1497,Ce(i,812,d),be(i)),ce[(0|_e[o>>2])+A>>0]=m,(0|(A=A+1|0))!=(0|b););A=b}}while(0)}while(A>>>0<a>>>0);if(81==(0|p)){_e[E>>2]=866,_e[4+E>>2]=3149,_e[8+E>>2]=1348,Ce(i,812,E),be(i),A=0;break}A=(0|a)==(0|A)?0|$(r):0}else A=0}else ce[C+16>>0]=1,A=0}while(0);return re(C),Te=N,0|(C=A)}function G(e,r,t,n){t|=0;var i,a,o,u,f,l,s,c,_=0,d=0,E=0,T=0,A=0,b=0,M=0,m=0,S=0,h=0,R=0,P=0,p=0,C=0,N=0,y=0,O=0,v=0,k=0,g=Te;if(Te=Te+880|0,v=g+144|0,c=g+128|0,s=g+112|0,l=g+96|0,y=g+80|0,C=g+64|0,P=g+48|0,p=g+32|0,m=g+16|0,u=(M=g)+360|0,f=g+296|0,k=g+224|0,R=g+156|0,0==(0|(r|=0))|11<(n|=0)>>>0)return Te=g,(k=0)|k;for(_e[(e|=0)>>2]=r,d=(_=k)+68|0;(0|(_=_+4|(_e[_>>2]=0)))<(0|d););for(_=0;d=k+((255&(O=0|ce[t+_>>0]))<<2)|0,O<<24>>24&&(_e[d>>2]=1+(0|_e[d>>2])),(0|(_=_+1|0))!=(0|r););for(T=E=d=0,A=-1,b=1;(_=0|_e[k+(b<<2)>>2])?(d=_+(_e[f+((S=b+-1|0)<<2)>>2]=d)|0,O=16-b|0,_e[e+28+(S<<2)>>2]=1+(d+-1<<O|(1<<O)-1),_e[e+96+(S<<2)>>2]=E,S=_+(_e[R+(b<<2)>>2]=E)|0,T=b>>>0<T>>>0?T:b,A=A>>>0<b>>>0?A:b):(_e[e+28+(b+-1<<2)>>2]=0,S=E),17!=(0|(b=b+1|0));)d<<=1,E=S;_e[e+4>>2]=S,d=e+172|0;do{if(S>>>0>(0|_e[d>>2])>>>0){_=(_=S+-1|0)&S?(_|=_>>>16,_|=_>>>8,_|=_>>>4,r>>>0<(_=1+((_|=_>>>2)>>>1|_)|0)>>>0?r:_):S,_e[d>>2]=_,_=0|_e[(E=e+176|0)>>2];do{if(0|_){if(O=0|_e[_+-4>>2],_=_+-8|0,0!=(0|O)&&(0|O)==(0|~_e[_>>2])||(_e[M>>2]=866,_e[M+4>>2]=651,_e[M+8>>2]=1579,Ce(u,812,M),be(u)),7&_){_e[m>>2]=866,_e[m+4>>2]=2506,_e[m+8>>2]=1232,Ce(u,812,m),be(u);break}ue(_,0,0,1,0);break}}while(0);if(d=0|te(8+((_=0|(_=0|_e[d>>2])?_:1)<<1)|0,0)){_e[d+4>>2]=_,_e[d>>2]=~_,_e[E>>2]=d+8,h=24;break}n=_e[E>>2]=0;break}h=24}while(0);e:do{if(24==(0|h)){for(ce[(O=e+24|0)>>0]=A,ce[e+25>>0]=T,E=e+176|0,d=0;_=255&(N=0|ce[t+d>>0]),N<<24>>24&&(0|_e[k+(_<<2)>>2]||(_e[p>>2]=866,_e[p+4>>2]=2276,_e[p+8>>2]=977,Ce(u,812,p),be(u)),_=0|_e[(N=R+(_<<2)|0)>>2],_e[N>>2]=_+1,S>>>0<=_>>>0&&(_e[P>>2]=866,_e[P+4>>2]=2280,_e[P+8>>2]=990,Ce(u,812,P),be(u)),W[(0|_e[E>>2])+(_<<1)>>1]=d),(0|(d=d+1|0))!=(0|r););if(o=(0|de[O>>0])>>>0<n>>>0?n:0,a=0!=(0|(_e[(N=e+8|0)>>2]=o))){i=1<<o,_=e+164|0;do{if(i>>>0>(0|_e[_>>2])>>>0){_e[_>>2]=i,_=0|_e[(E=e+168|0)>>2];do{if(0|_){if(p=0|_e[_+-4>>2],_=_+-8|0,0!=(0|p)&&(0|p)==(0|~_e[_>>2])||(_e[C>>2]=866,_e[C+4>>2]=651,_e[C+8>>2]=1579,Ce(u,812,C),be(u)),7&_){_e[y>>2]=866,_e[y+4>>2]=2506,_e[y+8>>2]=1232,Ce(u,812,y),be(u);break}ue(_,0,0,1,0);break}}while(0);if(d=0|te((_=i<<2)+8|0,0)){y=d+8|0,_e[d+4>>2]=i,_e[d>>2]=~i,d=_e[E>>2]=y;break}n=_e[E>>2]=0;break e}_=i<<2,d=0|_e[(E=d=e+168|0)>>2]}while(0);ne(0|d,-1,0|_),P=e+176|0,R=1;do{if(0|_e[k+(R<<2)>>2]&&(C=1<<(p=o-R|0),d=0|_e[f+((_=R+-1|0)<<2)>>2],16<=_>>>0&&(_e[l>>2]=866,_e[4+l>>2]=1960,_e[8+l>>2]=1453,Ce(u,812,l),be(u)),d>>>0<=(r=0==(0|(r=0|_e[e+28+(_<<2)>>2]))?-1:(r+-1|0)>>>(16-R|0))>>>0)){S=(0|_e[e+96+(_<<2)>>2])-d|0,h=R<<16;do{for(_=0|Ee[(0|_e[P>>2])+(S+d<<1)>>1],(0|de[t+_>>0])!=(0|R)&&(_e[s>>2]=866,_e[4+s>>2]=2322,_e[8+s>>2]=1019,Ce(u,812,s),be(u)),m=d<<p,b=_|h,A=0;i>>>0<=(M=A+m|0)>>>0&&(_e[c>>2]=866,_e[4+c>>2]=2328,_e[8+c>>2]=1053,Ce(u,812,c),be(u)),_=0|_e[E>>2],-1!=(0|_e[_+(M<<2)>>2])&&(_e[v>>2]=866,_e[v+4>>2]=2330,_e[v+8>>2]=1076,Ce(u,812,v),be(u),_=0|_e[E>>2]),_e[_+(M<<2)>>2]=b,(A=A+1|0)>>>0<C>>>0;);d=d+1|0}while(d>>>0<=r>>>0)}R=R+1|0}while(R>>>0<=o>>>0)}_e[(_=e+96|0)>>2]=(0|_e[_>>2])-(0|_e[f>>2]),_e[(_=e+100|0)>>2]=(0|_e[_>>2])-(0|_e[4+f>>2]),_e[(_=e+104|0)>>2]=(0|_e[_>>2])-(0|_e[8+f>>2]),_e[(_=e+108|0)>>2]=(0|_e[_>>2])-(0|_e[12+f>>2]),_e[(_=e+112|0)>>2]=(0|_e[_>>2])-(0|_e[16+f>>2]),_e[(_=e+116|0)>>2]=(0|_e[_>>2])-(0|_e[20+f>>2]),_e[(_=e+120|0)>>2]=(0|_e[_>>2])-(0|_e[24+f>>2]),_e[(_=e+124|0)>>2]=(0|_e[_>>2])-(0|_e[28+f>>2]),_e[(_=e+128|0)>>2]=(0|_e[_>>2])-(0|_e[32+f>>2]),_e[(_=e+132|0)>>2]=(0|_e[_>>2])-(0|_e[36+f>>2]),_e[(_=e+136|0)>>2]=(0|_e[_>>2])-(0|_e[40+f>>2]),_e[(_=e+140|0)>>2]=(0|_e[_>>2])-(0|_e[44+f>>2]),_e[(_=e+144|0)>>2]=(0|_e[_>>2])-(0|_e[48+f>>2]),_e[(_=e+148|0)>>2]=(0|_e[_>>2])-(0|_e[52+f>>2]),_e[(_=e+152|0)>>2]=(0|_e[_>>2])-(0|_e[56+f>>2]),_e[(_=e+156|0)>>2]=(0|_e[_>>2])-(0|_e[60+f>>2]),_e[(_=e+16|0)>>2]=0,_e[(d=e+20|0)>>2]=de[O>>0];r:do{if(a){do{if(!n)break r;n=(v=n)+-1|0}while(!(0|_e[k+(v<<2)>>2]));if(_e[_>>2]=_e[e+28+(n<<2)>>2],n=o+1|0,(_e[d>>2]=n)>>>0<=T>>>0){for(;!(0|_e[k+(n<<2)>>2]);)if(T>>>0<(n=n+1|0)>>>0)break r;_e[d>>2]=n}}}while(0);_e[e+92>>2]=-1,_e[e+160>>2]=1048575,_e[e+12>>2]=32-(0|_e[N>>2]),n=1}}while(0);return Te=g,0|(k=n)}function F(e){var r=0,t=0,n=0,i=0,a=0,o=0,u=0,f=0;if(e|=0){t=e+-8|0,i=0|_e[1148],f=t+(r=-8&(e=0|_e[e+-4>>2]))|0;do{if(1&e)o=u=t;else{if(n=0|_e[t>>2],!(3&e))return;if(a=n+r|0,(o=t+(0-n)|0)>>>0<i>>>0)return;if((0|o)==(0|_e[1149])){if(3==(3&(r=0|_e[(e=f+4|0)>>2])|0))return _e[1146]=a,_e[e>>2]=-2&r,_e[o+4>>2]=1|a,void(_e[o+a>>2]=a);u=o,r=a;break}if(t=n>>>3,n>>>0<256){if(e=0|_e[o+8>>2],(0|(r=0|_e[o+12>>2]))==(0|e)){_e[1144]=_e[1144]&~(1<<t),u=o,r=a;break}_e[e+12>>2]=r,_e[r+8>>2]=e,u=o,r=a;break}i=0|_e[o+24>>2],e=0|_e[o+12>>2];do{if((0|e)==(0|o)){if(!(e=0|_e[(r=(t=o+16|0)+4|0)>>2])){if(!(e=0|_e[t>>2])){e=0;break}r=t}for(;;)if(0|(n=0|_e[(t=e+20|0)>>2]))e=n,r=t;else{if(!(n=0|_e[(t=e+16|0)>>2]))break;e=n,r=t}_e[r>>2]=0}else u=0|_e[o+8>>2],_e[u+12>>2]=e,_e[e+8>>2]=u}while(0);if(i){if(r=0|_e[o+28>>2],(0|o)==(0|_e[(t=4880+(r<<2)|0)>>2])){if(!(_e[t>>2]=e)){_e[1145]=_e[1145]&~(1<<r),u=o,r=a;break}}else if(!(_e[i+16+(((0|_e[i+16>>2])!=(0|o)&1)<<2)>>2]=e)){u=o,r=a;break}_e[e+24>>2]=i,0|(t=0|_e[(r=o+16|0)>>2])&&(_e[e+16>>2]=t,_e[t+24>>2]=e),r=(u=((r=0|_e[r+4>>2])&&(_e[e+20>>2]=r,_e[r+24>>2]=e),o),a)}else u=o,r=a}}while(0);if(!(f>>>0<=o>>>0)&&1&(n=0|_e[(e=f+4|0)>>2])){if(2&n)_e[e>>2]=-2&n,_e[u+4>>2]=1|r,i=_e[o+r>>2]=r;else{if(e=0|_e[1149],(0|f)==(0|_e[1150])){if(f=(0|_e[1147])+r|0,_e[1147]=f,_e[1150]=u,_e[u+4>>2]=1|f,(0|u)!=(0|e))return;return _e[1149]=0,void(_e[1146]=0)}if((0|f)==(0|e))return f=(0|_e[1146])+r|0,_e[1146]=f,_e[1149]=o,_e[u+4>>2]=1|f,void(_e[o+f>>2]=f);i=(-8&n)+r|0,t=n>>>3;do{if(n>>>0<256){if(r=0|_e[f+8>>2],(0|(e=0|_e[f+12>>2]))==(0|r)){_e[1144]=_e[1144]&~(1<<t);break}_e[r+12>>2]=e,_e[e+8>>2]=r;break}a=0|_e[f+24>>2],e=0|_e[f+12>>2];do{if((0|e)==(0|f)){if(!(e=0|_e[(r=(t=f+16|0)+4|0)>>2])){if(!(e=0|_e[t>>2])){t=0;break}r=t}for(;;)if(0|(n=0|_e[(t=e+20|0)>>2]))e=n,r=t;else{if(!(n=0|_e[(t=e+16|0)>>2]))break;e=n,r=t}_e[r>>2]=0,t=e}else t=0|_e[f+8>>2],_e[t+12>>2]=e,_e[e+8>>2]=t,t=e}while(0);if(0|a){if(e=0|_e[f+28>>2],(0|f)==(0|_e[(r=4880+(e<<2)|0)>>2])){if(!(_e[r>>2]=t)){_e[1145]=_e[1145]&~(1<<e);break}}else if(!(_e[a+16+(((0|_e[a+16>>2])!=(0|f)&1)<<2)>>2]=t))break;_e[t+24>>2]=a,0|(r=0|_e[(e=f+16|0)>>2])&&(_e[t+16>>2]=r,_e[r+24>>2]=t),0|(e=0|_e[e+4>>2])&&(_e[t+20>>2]=e,_e[e+24>>2]=t)}}while(0);if(_e[u+4>>2]=1|i,_e[o+i>>2]=i,(0|u)==(0|_e[1149]))return void(_e[1146]=i)}if(e=i>>>3,i>>>0<256)return t=4616+(e<<1<<2)|0,(r=0|_e[1144])&(e=1<<e)?e=0|_e[(r=t+8|0)>>2]:(_e[1144]=r|e,r=(e=t)+8|0),_e[r>>2]=u,_e[e+12>>2]=u,_e[u+8>>2]=e,void(_e[u+12>>2]=t);n=4880+((e=(e=i>>>8)?16777215<i>>>0?31:i>>>((e=14-((a=((f=e<<(o=(e+1048320|0)>>>16&8))+520192|0)>>>16&4)|o|(e=((f<<=a)+245760|0)>>>16&2))+(f<<e>>>15)|0)+7|0)&1|e<<1:0)<<2)|0,_e[u+28>>2]=e,_e[u+20>>2]=0,r=(_e[u+16>>2]=0)|_e[1145],t=1<<e;do{if(r&t){for(r=i<<(31==(0|e)?0:25-(e>>>1)|0),t=0|_e[n>>2];;){if((-8&_e[t+4>>2]|0)==(0|i)){e=73;break}if(!(e=0|_e[(n=t+16+(r>>>31<<2)|0)>>2])){e=72;break}r<<=1,t=e}if(72==(0|e)){_e[n>>2]=u,_e[u+24>>2]=t,_e[u+12>>2]=u,_e[u+8>>2]=u;break}if(73==(0|e)){f=0|_e[(o=t+8|0)>>2],_e[f+12>>2]=u,_e[o>>2]=u,_e[u+8>>2]=f,_e[u+12>>2]=t,_e[u+24>>2]=0;break}}else _e[1145]=r|t,_e[n>>2]=u,_e[u+24>>2]=n,_e[u+12>>2]=u,_e[u+8>>2]=u}while(0);if(f=(0|_e[1152])-1|0,!(_e[1152]=f)){for(e=5032;e=0|_e[e>>2];)e=e+8|0;_e[1152]=-1}}}}function x(e,r){var t=0,n=0,i=0,a=0,o=0,u=0,f=0,f=(e|=0)+(r|=0)|0,t=0|_e[e+4>>2];do{if(1&t)u=e,t=r;else{if(n=0|_e[e>>2],!(3&t))return;if(o=n+r|0,(0|(a=e+(0-n)|0))==(0|_e[1149])){if(3==(3&(t=0|_e[(e=f+4|0)>>2])|0))return _e[1146]=o,_e[e>>2]=-2&t,_e[a+4>>2]=1|o,void(_e[a+o>>2]=o);u=a,t=o;break}if(r=n>>>3,n>>>0<256){if(e=0|_e[a+8>>2],(0|(t=0|_e[a+12>>2]))==(0|e)){_e[1144]=_e[1144]&~(1<<r),u=a,t=o;break}_e[e+12>>2]=t,_e[t+8>>2]=e,u=a,t=o;break}i=0|_e[a+24>>2],e=0|_e[a+12>>2];do{if((0|e)==(0|a)){if(!(e=0|_e[(t=(r=a+16|0)+4|0)>>2])){if(!(e=0|_e[r>>2])){e=0;break}t=r}for(;;)if(0|(n=0|_e[(r=e+20|0)>>2]))e=n,t=r;else{if(!(n=0|_e[(r=e+16|0)>>2]))break;e=n,t=r}_e[t>>2]=0}else u=0|_e[a+8>>2],_e[u+12>>2]=e,_e[e+8>>2]=u}while(0);if(i){if(t=0|_e[a+28>>2],(0|a)==(0|_e[(r=4880+(t<<2)|0)>>2])){if(!(_e[r>>2]=e)){_e[1145]=_e[1145]&~(1<<t),u=a,t=o;break}}else if(!(_e[i+16+(((0|_e[i+16>>2])!=(0|a)&1)<<2)>>2]=e)){u=a,t=o;break}_e[e+24>>2]=i,0|(r=0|_e[(t=a+16|0)>>2])&&(_e[e+16>>2]=r,_e[r+24>>2]=e),t=(u=((t=0|_e[t+4>>2])&&(_e[e+20>>2]=t,_e[t+24>>2]=e),a),o)}else u=a,t=o}}while(0);if(2&(n=0|_e[(e=f+4|0)>>2]))_e[e>>2]=-2&n,_e[u+4>>2]=1|t,_e[u+t>>2]=t;else{if(e=0|_e[1149],(0|f)==(0|_e[1150]))return f=(0|_e[1147])+t|0,_e[1147]=f,_e[1150]=u,_e[u+4>>2]=1|f,(0|u)==(0|e)&&(_e[1149]=0,void(_e[1146]=0));if((0|f)==(0|e))return f=(0|_e[1146])+t|0,_e[1146]=f,_e[1149]=u,_e[u+4>>2]=1|f,void(_e[u+f>>2]=f);a=(-8&n)+t|0,r=n>>>3;do{if(n>>>0<256){if(t=0|_e[f+8>>2],(0|(e=0|_e[f+12>>2]))==(0|t)){_e[1144]=_e[1144]&~(1<<r);break}_e[t+12>>2]=e,_e[e+8>>2]=t;break}i=0|_e[f+24>>2],e=0|_e[f+12>>2];do{if((0|e)==(0|f)){if(!(e=0|_e[(t=(r=f+16|0)+4|0)>>2])){if(!(e=0|_e[r>>2])){r=0;break}t=r}for(;;)if(0|(n=0|_e[(r=e+20|0)>>2]))e=n,t=r;else{if(!(n=0|_e[(r=e+16|0)>>2]))break;e=n,t=r}_e[t>>2]=0,r=e}else r=0|_e[f+8>>2],_e[r+12>>2]=e,_e[e+8>>2]=r,r=e}while(0);if(0|i){if(e=0|_e[f+28>>2],(0|f)==(0|_e[(t=4880+(e<<2)|0)>>2])){if(!(_e[t>>2]=r)){_e[1145]=_e[1145]&~(1<<e);break}}else if(!(_e[i+16+(((0|_e[i+16>>2])!=(0|f)&1)<<2)>>2]=r))break;_e[r+24>>2]=i,0|(t=0|_e[(e=f+16|0)>>2])&&(_e[r+16>>2]=t,_e[t+24>>2]=r),0|(e=0|_e[e+4>>2])&&(_e[r+20>>2]=e,_e[e+24>>2]=r)}}while(0);if(_e[u+4>>2]=1|a,_e[u+a>>2]=a,(0|u)==(0|_e[1149]))return void(_e[1146]=a);t=a}if(e=t>>>3,t>>>0<256)return r=4616+(e<<1<<2)|0,(t=0|_e[1144])&(e=1<<e)?e=0|_e[(t=r+8|0)>>2]:(_e[1144]=t|e,t=(e=r)+8|0),_e[t>>2]=u,_e[e+12>>2]=u,_e[u+8>>2]=e,void(_e[u+12>>2]=r);if(i=4880+((e=(e=t>>>8)?16777215<t>>>0?31:t>>>((e=14-((a=((f=e<<(o=(e+1048320|0)>>>16&8))+520192|0)>>>16&4)|o|(e=((f<<=a)+245760|0)>>>16&2))+(f<<e>>>15)|0)+7|0)&1|e<<1:0)<<2)|0,_e[u+28>>2]=e,_e[u+20>>2]=0,!((r=(_e[u+16>>2]=0)|_e[1145])&(n=1<<e)))return _e[1145]=r|n,_e[i>>2]=u,_e[u+24>>2]=i,_e[u+12>>2]=u,void(_e[u+8>>2]=u);for(r=t<<(31==(0|e)?0:25-(e>>>1)|0),n=0|_e[i>>2];;){if((-8&_e[n+4>>2]|0)==(0|t)){e=69;break}if(!(e=0|_e[(i=n+16+(r>>>31<<2)|0)>>2])){e=68;break}r<<=1,n=e}return 68==(0|e)?(_e[i>>2]=u,_e[u+24>>2]=n,_e[u+12>>2]=u,void(_e[u+8>>2]=u)):69==(0|e)&&(f=0|_e[(o=n+8|0)>>2],_e[f+12>>2]=u,_e[o>>2]=u,_e[u+8>>2]=f,_e[u+12>>2]=n,void(_e[u+24>>2]=0))}function B(e,r,t,n,i){i|=0;var a=0,o=0,u=0,f=0,l=0,s=0,c=0,_=0,d=0,E=0,s=e|=0,o=t|=0,u=_=n|=0;if(!(l=f=r|=0))return a=0!=(0|i),u?(a&&(_e[i>>2]=0|e,_e[i+4>>2]=0&r),(i=_=0)|(L=_,i)):(a&&(_e[i>>2]=(s>>>0)%(o>>>0),_e[i+4>>2]=0),(_=0)|(L=_,i=(s>>>0)/(o>>>0)>>>0));a=0==(0|u);do{if(o){if(!a){if((a=(0|T(0|u))-(0|T(0|l))|0)>>>0<=31){e=s>>>((o=c=a+1|0)>>>0)&(r=a-31>>31)|l<<(u=31-a|0),r&=l>>>(c>>>0),a=0,u=s<<u;break}return i?(_e[i>>2]=0|e,_e[i+4>>2]=f|0&r,(i=_=0)|(L=_,i)):(i=_=0)|(L=_,i)}if((a=o-1|0)&o|0){e=(c=32-(u=33+(0|T(0|o))-(0|T(0|l))|0)|0)-1>>31&l>>>((d=u-32|0)>>>0)|(l<<c|s>>>((o=u)>>>0))&(r=d>>31),r&=l>>>(u>>>0),a=s<<(E=64-u|0)&(f=c>>31),u=(l<<E|s>>>(d>>>0))&f|s<<c&u-33>>31;break}return 0|i&&(_e[i>>2]=a&s,_e[i+4>>2]=0),1==(0|o)?0|(L=d=f|0&r,E=0|e):(E=0|he(0|o),0|(L=d=l>>>(E>>>0)|0,E=l<<32-E|s>>>(E>>>0)|0))}if(a)return 0|i&&(_e[i>>2]=(l>>>0)%(o>>>0),_e[i+4>>2]=0),(d=0)|(L=d,E=(l>>>0)/(o>>>0)>>>0);if(!s)return 0|i&&(_e[i>>2]=0,_e[i+4>>2]=(l>>>0)%(u>>>0)),(d=0)|(L=d,E=(l>>>0)/(u>>>0)>>>0);if(!((a=u-1|0)&u))return 0|i&&(_e[i>>2]=0|e,_e[i+4>>2]=a&l|0&r),E=l>>>(((d=0)|he(0|u))>>>0),0|(L=d,E);if((a=(0|T(0|u))-(0|T(0|l))|0)>>>0<=30){e=l<<(u=31-a|0)|s>>>((o=r=a+1|0)>>>0),r=l>>>(r>>>0),a=0,u=s<<u;break}return i&&(_e[i>>2]=0|e,_e[i+4>>2]=f|0&r),(E=d=0)|(L=d,E)}while(0);if(o){for(l=0|ge(0|(c=0|t),0|(s=_|0&n),-1,-1),t=L,f=u,u=0;f=a>>>31|(n=f)<<1,a=u|a<<1,ve(0|l,0|t,0|(n=e<<1|n>>>31|0),0|(_=e>>>31|r<<1|0)),u=1&(d=(E=L)>>31|((0|E)<0?-1:0)<<1),e=0|ve(0|n,0|_,d&c|0,(((0|E)<0?-1:0)>>31|((0|E)<0?-1:0)<<1)&s|0),r=L,0!=(0|(o=o-1|0)););l=f,f=0}else l=u,u=f=0;return(o=0)|i&&(_e[i>>2]=e,_e[i+4>>2]=r),0|(L=d=(0|a)>>>31|(l|o)<<1|0&(o<<1|a>>>31)|f,E=-2&(a<<1|0)|u)}function Ae(e,r){e|=0;var t,n,i,a,o,u,f,l=0,s=0,c=0,_=0,d=0,E=0,T=Te;Te=Te+576|0,i=T+48|0,o=T+32|0,a=T+16|0,f=(n=T)+64|0,u=0|_e[(r|=0)+20>>2],(0|(t=0|_e[(E=e+20|0)>>2]))<24?(s=(l=0|_e[(d=e+4|0)>>2])>>>0<(c=0|_e[e+8>>2])>>>0,(0|t)<16?(s?(_=(0|de[l>>0])<<8,l=l+1|0):_=0,l>>>0<c>>>0?(c=0|de[l>>0],l=l+1|0):c=0,_e[d>>2]=l,_e[E>>2]=16+t,s=16,l=c|_):(l=s?(_e[d>>2]=l+1,0|de[l>>0]):0,_e[E>>2]=8+t,s=24),c=_e[(d=e+16|0)>>2]|l<<s-t,_e[d>>2]=c):c=0|_e[(d=c=e+16|0)>>2],_=1+(c>>>16)|0;do{if(!(_>>>0<=(0|_e[16+u>>2])>>>0)){for(s=0|_e[20+u>>2];_>>>0>(0|_e[28+u+((l=s+-1|0)<<2)>>2])>>>0;)s=s+1|0;if((l=(c>>>(32-s|0))+(0|_e[96+u+(l<<2)>>2])|0)>>>0<(0|_e[r>>2])>>>0){l=0|Ee[(0|_e[176+u>>2])+(l<<1)>>1];break}return _e[i>>2]=866,_e[4+i>>2]=3275,_e[8+i>>2]=1348,Ce(f,812,i),be(f),Te=T,(E=0)|E}-1==(0|(s=0|_e[(0|_e[168+u>>2])+(c>>>(32-(0|_e[8+u>>2])|0)<<2)>>2]))&&(_e[n>>2]=866,_e[n+4>>2]=3253,_e[n+8>>2]=1393,Ce(f,812,n),be(f)),l=65535&s,s>>>=16,(0|_e[r+8>>2])>>>0<=l>>>0&&(_e[a>>2]=866,_e[4+a>>2]=909,_e[8+a>>2]=1497,Ce(f,812,a),be(f)),(0|de[(0|_e[r+4>>2])+l>>0])!=(0|s)&&(_e[o>>2]=866,_e[4+o>>2]=3257,_e[8+o>>2]=1410,Ce(f,812,o),be(f))}while(0);return _e[d>>2]=_e[d>>2]<<s,_e[E>>2]=(0|_e[E>>2])-s,Te=T,0|(E=l)}function U(e){var r,t,n,i,a=0,o=0,u=0,f=Te;if(Te=Te+576|0,u=f+48|0,n=f+32|0,t=f+16|0,i=(r=f)+64|0,(_e[(e|=0)>>2]=0)|(o=0|_e[(a=e+284|0)>>2])&&(7&o?(_e[r>>2]=866,_e[r+4>>2]=2506,_e[r+8>>2]=1232,Ce(i,812,r),be(i)):ue(o,0,0,1,0),_e[a>>2]=0,_e[e+288>>2]=0,_e[e+292>>2]=0),(ce[e+296>>0]=0)|(o=0|_e[(a=e+268|0)>>2])&&(7&o?(_e[t>>2]=866,_e[4+t>>2]=2506,_e[8+t>>2]=1232,Ce(i,812,t),be(i)):ue(o,0,0,1,0),_e[a>>2]=0,_e[e+272>>2]=0,_e[e+276>>2]=0),(ce[e+280>>0]=0)|(o=0|_e[(a=e+252|0)>>2])&&(7&o?(_e[n>>2]=866,_e[4+n>>2]=2506,_e[8+n>>2]=1232,Ce(i,812,n),be(i)):ue(o,0,0,1,0),_e[a>>2]=0,_e[e+256>>2]=0,_e[e+260>>2]=0),!(o=(ce[e+264>>0]=0)|_e[(a=e+236|0)>>2]))return re(u=e+212|(ce[(u=e+248|0)>>0]=0)),re(u=e+188|0),re(u=e+164|0),re(u=e+140|0),re(u=e+116|0),void(Te=f);7&o?(_e[u>>2]=866,_e[u+4>>2]=2506,_e[u+8>>2]=1232,Ce(i,812,u),be(i)):ue(o,0,0,1,0),_e[a>>2]=0,_e[e+240>>2]=0,_e[e+244>>2]=0,re(u=e+212|(ce[(u=e+248|0)>>0]=0)),re(u=e+188|0),re(u=e+164|0),re(u=e+140|0),re(u=e+116|0),Te=f}function H(e,r,t){e|=0,r|=0,t|=0;var n=0,i=0,a=0;e:do{if(r>>>0<=20){switch(0|r){case 9:n=3+(0|_e[t>>2])&-4,r=0|_e[n>>2],_e[t>>2]=n+4,_e[e>>2]=r;break e;case 10:n=3+(0|_e[t>>2])&-4,r=0|_e[n>>2],_e[t>>2]=n+4,_e[(n=e)>>2]=r,_e[n+4>>2]=((0|r)<0)<<31>>31;break e;case 11:n=3+(0|_e[t>>2])&-4,r=0|_e[n>>2],_e[t>>2]=n+4,_e[(n=e)>>2]=r,_e[n+4>>2]=0;break e;case 12:n=7+(0|_e[t>>2])&-8,i=0|_e[(r=n)>>2],r=0|_e[r+4>>2],_e[t>>2]=n+8,_e[(n=e)>>2]=i,_e[n+4>>2]=r;break e;case 13:i=3+(0|_e[t>>2])&-4,n=0|_e[i>>2],_e[t>>2]=i+4,n=(65535&n)<<16>>16,_e[(i=e)>>2]=n,_e[i+4>>2]=((0|n)<0)<<31>>31;break e;case 14:i=3+(0|_e[t>>2])&-4,n=0|_e[i>>2],_e[t>>2]=i+4,_e[(i=e)>>2]=65535&n,_e[i+4>>2]=0;break e;case 15:i=3+(0|_e[t>>2])&-4,n=0|_e[i>>2],_e[t>>2]=i+4,n=(255&n)<<24>>24,_e[(i=e)>>2]=n,_e[i+4>>2]=((0|n)<0)<<31>>31;break e;case 16:i=3+(0|_e[t>>2])&-4,n=0|_e[i>>2],_e[t>>2]=i+4,_e[(i=e)>>2]=255&n,_e[i+4>>2]=0;break e;case 17:case 18:i=7+(0|_e[t>>2])&-8,a=+k[i>>3],_e[t>>2]=i+8,k[e>>3]=a;break e;default:break e}}}while(0)}function X(e,r,t,n,i){r|=0,t|=0,n|=0,i|=0;var a,o,u,f,l,s=0,c=0,_=0,d=0,E=Te;if(Te=Te+576|0,f=E+48|0,a=E+32|0,c=E+16|0,u=(s=E)+64|0,l=E+60|0,d=(e|=0)+8|0,(0|_e[(o=e+4|0)>>2])>>>0>(0|_e[d>>2])>>>0&&(_e[s>>2]=866,_e[s+4>>2]=2123,_e[s+8>>2]=845,Ce(u,812,s),be(u)),(2147418112/(n>>>0)|0)>>>0<=r>>>0&&(_e[c>>2]=866,_e[c+4>>2]=2124,_e[c+8>>2]=885,Ce(u,812,c),be(u)),r>>>0<=(s=0|_e[d>>2])>>>0)return Te=E,0|(d=1);if(9==(0|(t=t&&0!=((_=r+-1|0)&r|0)?(r=_>>>16|_,r|=r>>>8,r|=r>>>4,(r=1+((r|=r>>>2)>>>1|r)|0)?9:(r=0,10)):9))&&r>>>0<=s>>>0&&(t=10),10==(0|t)&&(_e[a>>2]=866,_e[4+a>>2]=2133,_e[8+a>>2]=933,Ce(u,812,a),be(u)),_=0|ie(r,n),i)if(c=0|te(_,l)){Ze[0&i](c,0|_e[e>>2],0|_e[o>>2]),s=0|_e[e>>2];do{if(0|s){if(7&s){_e[f>>2]=866,_e[4+f>>2]=2506,_e[8+f>>2]=1232,Ce(u,812,f),be(u);break}ue(s,0,0,1,0);break}}while(0);_e[e>>2]=c,t=20}else r=0;else(s=0|function(e,r,t,n){r|=0,t|=0,n|=0;var i=0,a=0,o=0,u=0,f=0,l=0;if(Te=(l=Te)+560|0,f=l+32|0,a=l+16|0,o=(i=l)+48|0,u=l+44|0,7&(e|=0)|0)return _e[i>>2]=866,_e[i+4>>2]=2506,_e[i+8>>2]=1210,Ce(o,812,i),be(o),Te=l,(f=0)|f;if(2147418112<r>>>0)return _e[a>>2]=866,_e[4+a>>2]=2506,_e[8+a>>2]=1103,Ce(o,812,a),be(o),Te=l,(f=0)|f;_e[u>>2]=r,e=0|ue(e,r,u,n,0),0|t&&(_e[t>>2]=_e[u>>2]);7&e|0&&(_e[f>>2]=866,_e[f+4>>2]=2558,_e[f+8>>2]=1156,Ce(o,812,f),be(o));return Te=l,0|(f=e)}(0|_e[e>>2],_,l,1))?(_e[e>>2]=s,t=20):r=0;return 20==(0|t)&&(_>>>0<(s=0|_e[l>>2])>>>0&&(r=(s>>>0)/(n>>>0)|0),_e[d>>2]=r,r=1),Te=E,0|(d=r)}function Y(e,r,t,n,i,a,o){r|=0,t|=0,n|=0,i|=0,a|=0,o|=0;var u,f=0,l=0,s=0|_e[(e|=0)+88>>2];if(f=((1<(f=(de[12+s>>0]<<8|de[13+s>>0])>>>o)>>>0?f:1)+3|0)>>>2,l=((1<(l=(de[14+s>>0]<<8|de[15+s>>0])>>>o)>>>0?l:1)+3|0)>>>2,o=0|ce[(s=18+s|0)>>0],o=0|ie(f,o<<24>>24==0|o<<24>>24==9?8:16),a){if(!(0==(3&a|0)&o>>>0<=a>>>0))return(i=0)|i;o=a}if((0|ie(o,l))>>>0>i>>>0)return(i=0)|i;if(a=(f+1|0)>>>1,u=(l+1|0)>>>1,!t)return(i=0)|i;switch(_e[e+92>>2]=r,_e[e+96>>2]=r,_e[e+104>>2]=t,_e[e+100>>2]=r+t,_e[e+108>>2]=0,(_e[e+112>>2]=0)|ce[s>>0]){case 0:if(!(0|function(e,r,t,n,i,a,o,u){r|=0,t|=0,n|=0,i|=0,a|=0,o|=0,u|=0;var f,l,s,c,_,d,E,T,A,b,M,m,S,h,R,P,p,C,N,y,O,v,k,g,L,I,w,D,G,F,x,B,U,H,W,V,X,Y,K=0,z=0,j=0,J=0,$=0,Z=0,q=0,Q=0,ee=0,re=0,te=0,ne=Te;if(Te=Te+656|0,X=ne+112|0,W=ne+96|0,H=ne+80|0,U=ne+64|0,B=ne+48|0,Y=ne+32|0,V=ne+16|0,G=(x=ne)+144|0,F=ne+128|0,y=0|_e[(N=(e|=0)+240|0)>>2],v=0|_e[(O=e+256|0)>>2],k=255&(D=0|ce[17+(0|_e[e+88>>2])>>0]),!(D<<24>>24))return Te=ne,1;L=0==(0|u),w=(I=o+-1|0)<<4,D=u+-1|0,S=0!=(1&a|0),h=n<<1,R=e+92|0,P=e+116|0,p=e+140|0,C=e+236|0,m=0!=(1&i|0),M=e+188|0,E=e+252|0,T=1+(g=n>>>2)|0,A=2+g|0,b=3+g|0,t=a=ee=0,i=1;do{if(!L)for(q=0|_e[r+(ee<<2)>>2],Q=0;;){if(z=0==(0|(_=1&Q)),c=(_<<5^32)-16|0,_=(_<<1^2)-1|0,d=S&(e=(0|Q)==(0|D)),(0|(K=z?0:I))!=(0|(s=z?o:-1)))for(l=S&e^1,Z=z?q:q+w|0;;){for(1==(0|i)&&(i=512|Ae(R,P)),f=7&i,i>>>=3,z=0|de[1539+f>>0],e=0;t=($=(J=(j=(0|Ae(R,p))+t|0)-y|0)>>31)&j|J&~$,(0|_e[N>>2])>>>0<=t>>>0&&(_e[x>>2]=866,_e[x+4>>2]=910,_e[x+8>>2]=1497,Ce(G,812,x),be(G)),_e[F+(e<<2)>>2]=_e[(0|_e[C>>2])+(t<<2)>>2],(e=e+1|0)>>>0<z>>>0;);if(d|($=m&(0|K)==(0|I))){J=0;do{e=Z+(0|ie(J,n))|0,j=0==(0|J)|l,z=J<<1,a=(a=(re=(te=(0|Ae(R,M))+a|0)-v|0)>>31)&te|re&~a;do{if($){if(!j){a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a;break}_e[e>>2]=_e[F+((0|de[1547+(f<<2)+z>>0])<<2)>>2],(0|_e[O>>2])>>>0<=a>>>0&&(_e[W>>2]=866,_e[4+W>>2]=910,_e[8+W>>2]=1497,Ce(G,812,W),be(G)),_e[e+4>>2]=_e[(0|_e[E>>2])+(a<<2)>>2],a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a}else j&&(_e[e>>2]=_e[F+((0|de[1547+(f<<2)+z>>0])<<2)>>2],(0|_e[O>>2])>>>0<=a>>>0&&(_e[H>>2]=866,_e[4+H>>2]=910,_e[8+H>>2]=1497,Ce(G,812,H),be(G)),_e[e+4>>2]=_e[(0|_e[E>>2])+(a<<2)>>2]),e=e+8|0,a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a,j&&(_e[e>>2]=_e[F+((0|de[1547+(f<<2)+(1|z)>>0])<<2)>>2],(0|_e[O>>2])>>>0<=a>>>0&&(_e[X>>2]=866,_e[4+X>>2]=910,_e[8+X>>2]=1497,Ce(G,812,X),be(G)),_e[e+4>>2]=_e[(0|_e[E>>2])+(a<<2)>>2])}while(0);J=J+1|0}while(2!=(0|J))}else _e[Z>>2]=_e[F+((0|de[1547+(f<<2)>>0])<<2)>>2],a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a,(0|_e[O>>2])>>>0<=a>>>0&&(_e[V>>2]=866,_e[4+V>>2]=910,_e[8+V>>2]=1497,Ce(G,812,V),be(G)),_e[Z+4>>2]=_e[(0|_e[E>>2])+(a<<2)>>2],_e[Z+8>>2]=_e[F+((0|de[1547+(f<<2)+1>>0])<<2)>>2],a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a,(0|_e[O>>2])>>>0<=a>>>0&&(_e[Y>>2]=866,_e[4+Y>>2]=910,_e[8+Y>>2]=1497,Ce(G,812,Y),be(G)),_e[Z+12>>2]=_e[(0|_e[E>>2])+(a<<2)>>2],_e[Z+(g<<2)>>2]=_e[F+((0|de[1547+(f<<2)+2>>0])<<2)>>2],a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a,(0|_e[O>>2])>>>0<=a>>>0&&(_e[B>>2]=866,_e[4+B>>2]=910,_e[8+B>>2]=1497,Ce(G,812,B),be(G)),_e[Z+(T<<2)>>2]=_e[(0|_e[E>>2])+(a<<2)>>2],_e[Z+(A<<2)>>2]=_e[F+((0|de[1547+(f<<2)+3>>0])<<2)>>2],a=(a=(te=(re=(0|Ae(R,M))+a|0)-v|0)>>31)&re|te&~a,(0|_e[O>>2])>>>0<=a>>>0&&(_e[U>>2]=866,_e[4+U>>2]=910,_e[8+U>>2]=1497,Ce(G,812,U),be(G)),_e[Z+(b<<2)>>2]=_e[(0|_e[E>>2])+(a<<2)>>2];if((0|(K=_+K|0))==(0|s))break;Z=Z+c|0}if((0|(Q=Q+1|0))==(0|u))break;q=q+h|0}ee=ee+1|0}while((0|ee)!=(0|k));return Te=ne,1}(e,n,i,o,f,l,a,u)))return(i=0)|i;break;case 4:case 6:case 5:case 3:case 2:if(!(0|function(e,r,t,n,i,a,o,u){r|=0,t|=0,n|=0,i|=0,a|=0,o|=0,u|=0;var f,l,s,c,_,d,E,T,A,b,M,m,S,h,R,P,p,C,N,y,O,v,k,g,L,I,w,D,G,F,x,B,U,H,W,V,X,Y,K,z,j=0,J=0,$=0,Z=0,q=0,Q=0,ee=0,re=0,te=0,ne=0,ie=0,ae=0,oe=0,ue=0,fe=0,le=0,se=Te;if(Te=Te+640|0,Y=se+80|0,X=se+64|0,V=se+48|0,z=se+32|0,K=se+16|0,U=(W=se)+128|0,H=se+112|0,M=se+96|0,S=0|_e[(m=(e|=0)+240|0)>>2],R=0|_e[(h=e+256|0)>>2],p=0|_e[(P=e+272|0)>>2],B=0|_e[e+88>>2],C=(0|de[63+B>>0])<<8|0|de[64+B>>0],N=255&(B=0|ce[17+B>>0]),!(B<<24>>24))return Te=se,1;y=0==(0|u),v=(O=o+-1|0)<<5,k=u+-1|0,g=n<<1,L=e+92|0,I=e+116|0,w=e+164|0,D=e+268|0,G=e+140|0,F=e+236|0,x=e+212|0,B=e+188|0,b=0==(1&i|0),A=0==(1&a|0),E=e+288|0,T=e+284|0,d=e+252|0,t=i=a=e=le=0,j=1;do{if(!y)for(ue=0|_e[r+(le<<2)>>2],fe=0;;){if($=0==(0|(_=1&fe)),c=(_<<6^64)-32|0,_=(_<<1^2)-1|0,(0|(J=$?0:O))!=(0|(l=$?o:-1)))for(s=A|(0|fe)!=(0|k),oe=$?ue:ue+v|0;;){for(1==(0|j)&&(j=512|Ae(L,I)),f=7&j,j>>>=3,Z=0|de[1539+f>>0],$=0;a=(ae=(ie=(ne=(0|Ae(L,w))+a|0)-p|0)>>31)&ne|ie&~ae,(0|_e[P>>2])>>>0<=a>>>0&&(_e[W>>2]=866,_e[W+4>>2]=910,_e[W+8>>2]=1497,Ce(U,812,W),be(U)),_e[M+($<<2)>>2]=Ee[(0|_e[D>>2])+(a<<1)>>1],($=$+1|0)>>>0<Z>>>0;);for($=0;t=(ae=(ie=(ne=(0|Ae(L,G))+t|0)-S|0)>>31)&ne|ie&~ae,(0|_e[m>>2])>>>0<=t>>>0&&(_e[K>>2]=866,_e[4+K>>2]=910,_e[8+K>>2]=1497,Ce(U,812,K),be(U)),_e[H+($<<2)>>2]=_e[(0|_e[F>>2])+(t<<2)>>2],($=$+1|0)>>>0<Z>>>0;);for(ae=b|(0|J)!=(0|O),ne=0,ie=oe;;){if(ee=s|0==(0|ne),re=ne<<1,ae)for(q=0,Q=ie;e=(e=(Z=(te=(0|Ae(L,x))+e|0)-C|0)>>31)&te|Z&~e,i=(i=(te=(Z=(0|Ae(L,B))+i|0)-R|0)>>31)&Z|te&~i,ee&&($=0|de[q+re+(1547+(f<<2))>>0],Z=3*e|0,(0|_e[E>>2])>>>0<=Z>>>0&&(_e[z>>2]=866,_e[4+z>>2]=910,_e[8+z>>2]=1497,Ce(U,812,z),be(U)),te=(0|_e[T>>2])+(Z<<1)|0,_e[Q>>2]=(0|Ee[te>>1])<<16|_e[M+($<<2)>>2],_e[Q+4>>2]=(0|Ee[te+4>>1])<<16|0|Ee[te+2>>1],_e[Q+8>>2]=_e[H+($<<2)>>2],(0|_e[h>>2])>>>0<=i>>>0&&(_e[V>>2]=866,_e[4+V>>2]=910,_e[8+V>>2]=1497,Ce(U,812,V),be(U)),_e[Q+12>>2]=_e[(0|_e[d>>2])+(i<<2)>>2]),2!=(0|(q=q+1|0));)Q=Q+16|0;else for(te=1^ee,ee=1547+(f<<2)+re|0,q=0,Q=ie;e=(e=(Z=(re=(0|Ae(L,x))+e|0)-C|0)>>31)&re|Z&~e,i=(i=(re=(Z=(0|Ae(L,B))+i|0)-R|0)>>31)&Z|re&~i,0!=(0|q)|te||($=0|de[ee>>0],Z=3*e|0,(0|_e[E>>2])>>>0<=Z>>>0&&(_e[X>>2]=866,_e[4+X>>2]=910,_e[8+X>>2]=1497,Ce(U,812,X),be(U)),re=(0|_e[T>>2])+(Z<<1)|0,_e[Q>>2]=(0|Ee[re>>1])<<16|_e[M+($<<2)>>2],_e[Q+4>>2]=(0|Ee[re+4>>1])<<16|0|Ee[re+2>>1],_e[Q+8>>2]=_e[H+($<<2)>>2],(0|_e[h>>2])>>>0<=i>>>0&&(_e[Y>>2]=866,_e[4+Y>>2]=910,_e[8+Y>>2]=1497,Ce(U,812,Y),be(U)),_e[Q+12>>2]=_e[(0|_e[d>>2])+(i<<2)>>2]),2!=(0|(q=q+1|0));)Q=Q+16|0;if(2==(0|(ne=ne+1|0)))break;ie=ie+n|0}if((0|(J=_+J|0))==(0|l))break;oe=oe+c|0}if((0|(fe=fe+1|0))==(0|u))break;ue=ue+g|0}le=le+1|0}while((0|le)!=(0|N));return Te=se,1}(e,n,i,o,f,l,a,u)))return(i=0)|i;break;case 9:if(!(0|function(e,r,t,n,i,a,o,u){r|=0,t|=0,n|=0,i|=0,a|=0,o|=0,u|=0;var f,l,s,c,_,d,E,T,A,b,M,m,S,h,R,P,p,C,N,y,O,v,k,g,L,I,w,D,G,F=0,x=0,B=0,U=0,H=0,W=0,V=0,X=0,Y=0,K=0,z=0,j=0,J=Te;if(Te=Te+592|0,w=J+48|0,G=J+32|0,D=J+16|0,g=(I=J)+80|0,L=J+64|0,M=0|_e[(b=(e|=0)+272|0)>>2],k=0|_e[e+88>>2],m=(0|de[63+k>>0])<<8|0|de[64+k>>0],S=255&(k=0|ce[17+k>>0]),!(k<<24>>24))return Te=J,1;h=0==(0|u),P=(R=o+-1|0)<<4,p=u+-1|0,C=n<<1,N=e+92|0,y=e+116|0,O=e+164|0,v=e+268|0,k=e+212|0,A=0==(1&i|0),T=0==(1&a|0),E=e+288|0,d=e+284|0,t=i=j=0,a=1;do{if(!h)for(K=0|_e[r+(j<<2)>>2],z=0;;){if(F=0==(0|(_=1&z)),c=(_<<5^32)-16|0,_=(_<<1^2)-1|0,(0|(e=F?0:R))!=(0|(l=F?o:-1)))for(s=T|(0|z)!=(0|p),Y=F?K:K+P|0;;){for(1==(0|a)&&(a=512|Ae(N,y)),f=7&a,a>>>=3,x=0|de[1539+f>>0],F=0;t=(X=(V=(W=(0|Ae(N,O))+t|0)-M|0)>>31)&W|V&~X,(0|_e[b>>2])>>>0<=t>>>0&&(_e[I>>2]=866,_e[I+4>>2]=910,_e[I+8>>2]=1497,Ce(g,812,I),be(g)),_e[L+(F<<2)>>2]=Ee[(0|_e[v>>2])+(t<<1)>>1],(F=F+1|0)>>>0<x>>>0;);for(X=A|(0|e)!=(0|R),W=0,V=Y;H=s|0==(0|W),x=W<<1,U=(U=(B=(F=(0|Ae(N,k))+i|0)-m|0)>>31)&F|B&~U,X?(H&&(i=0|de[1547+(f<<2)+x>>0],F=3*U|0,(0|_e[E>>2])>>>0<=F>>>0&&(_e[D>>2]=866,_e[4+D>>2]=910,_e[8+D>>2]=1497,Ce(g,812,D),be(g)),B=(0|_e[d>>2])+(F<<1)|0,_e[V>>2]=(0|Ee[B>>1])<<16|_e[L+(i<<2)>>2],_e[V+4>>2]=(0|Ee[B+4>>1])<<16|0|Ee[B+2>>1]),B=V+8|0,i=(i=(U=(F=(0|Ae(N,k))+U|0)-m|0)>>31)&F|U&~i,H&&(F=0|de[1547+(f<<2)+(1|x)>>0],x=3*i|0,(0|_e[E>>2])>>>0<=x>>>0&&(_e[w>>2]=866,_e[4+w>>2]=910,_e[8+w>>2]=1497,Ce(g,812,w),be(g)),H=(0|_e[d>>2])+(x<<1)|0,_e[B>>2]=(0|Ee[H>>1])<<16|_e[L+(F<<2)>>2],_e[V+12>>2]=(0|Ee[H+4>>1])<<16|0|Ee[H+2>>1])):(H&&(i=0|de[1547+(f<<2)+x>>0],F=3*U|0,(0|_e[E>>2])>>>0<=F>>>0&&(_e[G>>2]=866,_e[4+G>>2]=910,_e[8+G>>2]=1497,Ce(g,812,G),be(g)),H=(0|_e[d>>2])+(F<<1)|0,_e[V>>2]=(0|Ee[H>>1])<<16|_e[L+(i<<2)>>2],_e[V+4>>2]=(0|Ee[H+4>>1])<<16|0|Ee[H+2>>1]),i=(i=(H=(U=(0|Ae(N,k))+U|0)-m|0)>>31)&U|H&~i),2!=(0|(W=W+1|0));)V=V+n|0;if((0|(e=_+e|0))==(0|l))break;Y=Y+c|0}if((0|(z=z+1|0))==(0|u))break;K=K+C|0}j=j+1|0}while((0|j)!=(0|S));return Te=J,1}(e,n,i,o,f,l,a,u)))return(i=0)|i;break;case 8:case 7:if(!(0|function(e,r,t,n,i,a,o,u){r|=0,t|=0,n|=0,i|=0,a|=0,o|=0,u|=0;var f,l,s,c,_,d,E,T,A,b,M,m,S,h,R,P,p,C,N,y,O,v,k,g,L,I,w,D,G,F,x,B,U=0,H=0,W=0,V=0,X=0,Y=0,K=0,z=0,j=0,J=0,$=0,Z=0,q=0,Q=0,ee=0,re=0,te=0,ne=0,ie=0,ae=Te;if(Te=Te+640|0,F=ae+80|0,G=ae+64|0,D=ae+48|0,B=ae+32|0,x=ae+16|0,L=(w=ae)+128|0,I=ae+112|0,b=ae+96|0,m=0|_e[(M=(e|=0)+272|0)>>2],g=0|_e[e+88>>2],S=(0|de[63+g>>0])<<8|0|de[64+g>>0],h=255&(g=0|ce[17+g>>0]),!(g<<24>>24))return Te=ae,1;R=0==(0|u),p=(P=o+-1|0)<<5,C=u+-1|0,N=n<<1,y=e+92|0,O=e+116|0,v=e+164|0,k=e+268|0,g=e+212|0,A=0==(1&i|0),T=0==(1&a|0),E=e+288|0,d=e+284|0,t=i=a=e=ie=0,U=1;do{if(!R)for(te=0|_e[r+(ie<<2)>>2],ne=0;;){if(W=0==(0|(_=1&ne)),c=(_<<6^64)-32|0,_=(_<<1^2)-1|0,(0|(H=W?0:P))!=(0|(l=W?o:-1)))for(s=T|(0|ne)!=(0|C),re=W?te:te+p|0;;){for(1==(0|U)&&(U=512|Ae(y,O)),f=7&U,U>>>=3,V=0|de[1539+f>>0],W=0;t=(ee=(Q=(q=(0|Ae(y,v))+t|0)-m|0)>>31)&q|Q&~ee,(0|_e[M>>2])>>>0<=t>>>0&&(_e[w>>2]=866,_e[w+4>>2]=910,_e[w+8>>2]=1497,Ce(L,812,w),be(L)),_e[I+(W<<2)>>2]=Ee[(0|_e[k>>2])+(t<<1)>>1],(W=W+1|0)>>>0<V>>>0;);for(W=0;a=(ee=(Q=(q=(0|Ae(y,v))+a|0)-m|0)>>31)&q|Q&~ee,(0|_e[M>>2])>>>0<=a>>>0&&(_e[x>>2]=866,_e[4+x>>2]=910,_e[8+x>>2]=1497,Ce(L,812,x),be(L)),_e[b+(W<<2)>>2]=Ee[(0|_e[k>>2])+(a<<1)>>1],(W=W+1|0)>>>0<V>>>0;);for(ee=A|(0|H)!=(0|P),q=0,Q=re;;){if(J=s|0==(0|q),$=q<<1,ee)for(z=0,j=Q;i=(i=(K=(Z=(0|Ae(y,g))+i|0)-S|0)>>31)&Z|K&~i,e=(e=(Z=(K=(0|Ae(y,g))+e|0)-S|0)>>31)&K|Z&~e,J&&(K=0|de[z+$+(1547+(f<<2))>>0],V=3*i|0,(W=0|_e[E>>2])>>>0<=V>>>0&&(_e[B>>2]=866,_e[4+B>>2]=910,_e[8+B>>2]=1497,Ce(L,812,B),be(L),W=0|_e[E>>2]),V=(X=0|_e[d>>2])+(V<<1)|0,Z=(W=(Y=3*e|0)>>>0<W>>>0?X:(_e[D>>2]=866,_e[4+D>>2]=910,_e[8+D>>2]=1497,Ce(L,812,D),be(L),0|_e[d>>2]))+(Y<<1)|0,_e[j>>2]=(0|Ee[V>>1])<<16|_e[I+(K<<2)>>2],_e[j+4>>2]=(0|Ee[V+4>>1])<<16|0|Ee[V+2>>1],_e[j+8>>2]=(0|Ee[Z>>1])<<16|_e[b+(K<<2)>>2],_e[j+12>>2]=(0|Ee[Z+4>>1])<<16|0|Ee[Z+2>>1]),2!=(0|(z=z+1|0));)j=j+16|0;else for(Z=1^J,J=1547+(f<<2)+$|0,z=0,j=Q;i=(i=(K=($=(0|Ae(y,g))+i|0)-S|0)>>31)&$|K&~i,e=(e=($=(K=(0|Ae(y,g))+e|0)-S|0)>>31)&K|$&~e,0!=(0|z)|Z||(K=0|de[J>>0],V=3*i|0,(W=0|_e[E>>2])>>>0<=V>>>0&&(_e[G>>2]=866,_e[4+G>>2]=910,_e[8+G>>2]=1497,Ce(L,812,G),be(L),W=0|_e[E>>2]),V=(X=0|_e[d>>2])+(V<<1)|0,$=(W=(Y=3*e|0)>>>0<W>>>0?X:(_e[F>>2]=866,_e[4+F>>2]=910,_e[8+F>>2]=1497,Ce(L,812,F),be(L),0|_e[d>>2]))+(Y<<1)|0,_e[j>>2]=(0|Ee[V>>1])<<16|_e[I+(K<<2)>>2],_e[j+4>>2]=(0|Ee[V+4>>1])<<16|0|Ee[V+2>>1],_e[j+8>>2]=(0|Ee[$>>1])<<16|_e[b+(K<<2)>>2],_e[j+12>>2]=(0|Ee[$+4>>1])<<16|0|Ee[$+2>>1]),2!=(0|(z=z+1|0));)j=j+16|0;if(2==(0|(q=q+1|0)))break;Q=Q+n|0}if((0|(H=_+H|0))==(0|l))break;re=re+c|0}if((0|(ne=ne+1|0))==(0|u))break;te=te+N|0}ie=ie+1|0}while((0|ie)!=(0|h));return Te=ae,1}(e,n,i,o,f,l,a,u)))return(i=0)|i;break;default:return(i=0)|i}return 0|(i=1)}function K(e,r,t){e|=0,r|=0;var n,i,a;if(8192<=(0|(t|=0)))return 0|N(0|e,0|r,0|t);if(a=0|e,i=e+t|0,(3&e)==(3&r)){for(;3&e;){if(!t)return 0|a;ce[e>>0]=0|ce[r>>0],e=e+1|0,r=r+1|0,t=t-1|0}for(n=(t=-4&i|0)-64|0;(0|e)<=(0|n);)_e[e>>2]=_e[r>>2],_e[e+4>>2]=_e[r+4>>2],_e[e+8>>2]=_e[r+8>>2],_e[e+12>>2]=_e[r+12>>2],_e[e+16>>2]=_e[r+16>>2],_e[e+20>>2]=_e[r+20>>2],_e[e+24>>2]=_e[r+24>>2],_e[e+28>>2]=_e[r+28>>2],_e[e+32>>2]=_e[r+32>>2],_e[e+36>>2]=_e[r+36>>2],_e[e+40>>2]=_e[r+40>>2],_e[e+44>>2]=_e[r+44>>2],_e[e+48>>2]=_e[r+48>>2],_e[e+52>>2]=_e[r+52>>2],_e[e+56>>2]=_e[r+56>>2],_e[e+60>>2]=_e[r+60>>2],e=e+64|0,r=r+64|0;for(;(0|e)<(0|t);)_e[e>>2]=_e[r>>2],e=e+4|0,r=r+4|0}else for(t=i-4|0;(0|e)<(0|t);)ce[e>>0]=0|ce[r>>0],ce[e+1>>0]=0|ce[r+1>>0],ce[e+2>>0]=0|ce[r+2>>0],ce[e+3>>0]=0|ce[r+3>>0],e=e+4|0,r=r+4|0;for(;(0|e)<(0|i);)ce[e>>0]=0|ce[r>>0],e=e+1|0,r=r+1|0;return 0|a}function z(e,r,t){r|=0,t|=0;var n,i,a,o,u,f=0,l=0,s=0,c=0,_=0,d=Te;Te=Te+48|0,o=d+16|0,l=(s=d)+32|0,f=0|_e[(i=(e|=0)+28|0)>>2],_e[l>>2]=f,f=(0|_e[(a=e+20|0)>>2])-f|0,_e[l+4>>2]=f,_e[l+8>>2]=r,f=f+(_e[l+12>>2]=t)|0,n=e+60|0,_e[s>>2]=_e[n>>2],_e[s+4>>2]=l,_e[s+8>>2]=2,s=0|Le(0|v(146,0|s));e:do{if((0|f)!=(0|s)){for(r=2;!((0|s)<0);)if(f=f-s|0,r=((u=(_=0|_e[l+4>>2])>>>0<s>>>0)<<31>>31)+r|0,_=s-(u?_:0)|0,_e[(l=u?l+8|0:l)>>2]=(0|_e[l>>2])+_,_e[(u=l+4|0)>>2]=(0|_e[u>>2])-_,_e[o>>2]=_e[n>>2],_e[4+o>>2]=l,_e[8+o>>2]=r,(0|f)==(0|(s=0|Le(0|v(146,0|o))))){c=3;break e}_e[e+16>>2]=0,_e[i>>2]=0,_e[a>>2]=0,_e[e>>2]=32|_e[e>>2],t=2==(0|r)?0:t-(0|_e[l+4>>2])|0}else c=3}while(0);return 3==(0|c)&&(_=0|_e[e+44>>2],_e[e+16>>2]=_+(0|_e[e+48>>2]),_e[i>>2]=_,_e[a>>2]=_),Te=d,0|t}function j(e,r,t){e|=0,r|=0,t|=0;var n,i,a,o,u,f,l,s,c,_=0,d=0,E=Te;for(Te=Te+224|0,f=E+120|0,c=(s=E)+136|0,d=(_=l=E+80|0)+40|0;(0|(_=_+4|(_e[_>>2]=0)))<(0|d););return _e[f>>2]=_e[t>>2],t=(0|D(0,r,f,s,l))<0?-1:(_e[e+76>>2],u=32&(t=0|_e[e>>2]),(0|ce[e+74>>0])<1&&(_e[e>>2]=-33&t),0|_e[(_=e+48|0)>>2]?t=0|D(e,r,f,s,l):(n=0|_e[(d=e+44|0)>>2],_e[d>>2]=c,_e[(i=e+28|0)>>2]=c,_e[(a=e+20|0)>>2]=c,_e[_>>2]=80,_e[(o=e+16|0)>>2]=80+c,t=0|D(e,r,f,s,l),n&&(ze[7&_e[e+36>>2]](e,0,0),t=0==(0|_e[a>>2])?-1:t,_e[d>>2]=n,_e[_>>2]=0,_e[o>>2]=0,_e[i>>2]=0,_e[a>>2]=0)),_=0|_e[e>>2],_e[e>>2]=_|u,0==(32&_|0)?t:-1),Te=E,0|t}function J(e,r,t,n){r|=0,t|=0,n|=0;var i,a,o,u,f,l,s,c=0,_=Te;for(Te=Te+64|0,l=_,f=0|_e[(e|=0)>>2],s=e+(0|_e[f-8>>2])|0,f=0|_e[f-4>>2],_e[l>>2]=t,_e[l+4>>2]=e,_e[l+8>>2]=r,_e[l+12>>2]=n,r=l+20|0,n=l+24|0,i=l+28|0,a=l+32|0,o=l+40|0,u=(c=e=l+16|0)+36|0;(0|(c=c+4|(_e[c>>2]=0)))<(0|u););W[e+36>>1]=0,ce[e+38>>0]=0;e:do{if(0|De(f,t))_e[l+48>>2]=1,Qe[3&_e[20+(0|_e[f>>2])>>2]](f,l,s,s,1,0),e=1==(0|_e[n>>2])?s:0;else{switch(je[3&_e[24+(0|_e[f>>2])>>2]](f,l,s,1,0),0|_e[l+36>>2]){case 0:e=1==(0|_e[o>>2])&1==(0|_e[i>>2])&1==(0|_e[a>>2])?0|_e[r>>2]:0;break e;case 1:break;default:e=0;break e}if(1!=(0|_e[n>>2])&&!(0==(0|_e[o>>2])&1==(0|_e[i>>2])&1==(0|_e[a>>2]))){e=0;break}e=0|_e[e>>2]}}while(0);return Te=_,0|e}function $(e){var r=0,t=0,n=0,i=0,a=0,o=0,u=0,f=Te;if(Te=Te+544|0,o=f+16|0,i=(r=f)+32|0,8192<=((t=0|_e[(a=(e|=0)+8|0)>>2])+-1|0)>>>0&&(_e[r>>2]=866,_e[r+4>>2]=3006,_e[r+8>>2]=1257,Ce(i,812,r),be(i)),_e[e>>2]=t,u=(r=0|_e[(n=e+20|0)>>2])?t:((r=0|te(180,0))?(_e[(u=r+164|0)>>2]=0,_e[u+4>>2]=0,_e[u+8>>2]=0,_e[u+12>>2]=0):r=0,_e[n>>2]=r,0|_e[e>>2]),o=0|_e[a>>2]?u:(_e[o>>2]=866,_e[o+4>>2]=910,_e[o+8>>2]=1497,Ce(i,812,o),be(i),0|_e[e>>2]),i=0|_e[e+4>>2],!(16<o>>>0))return e=(e=0)|G(r,u,i,e),Te=f,0|e;for(t=o,n=0;a=n+1|0,3<t>>>0;)t>>>=1,n=a;return e=0|G(r,u,i,e=255&((e=n+2+(32!=(0|a)&1<<a>>>0<o>>>0&1)|0)>>>0<11?e:11)),Te=f,0|e}function Z(e){var r,t,n,i,a,o=0,u=0,f=Te;Te=Te+576|0,i=f+48|0,a=f+32|0,t=f+16|0,n=(r=f)+64|0,o=0|_e[(e|=0)+168>>2];do{if(0|o){if(u=0|_e[o+-4>>2],o=o+-8|0,0!=(0|u)&&(0|u)==(0|~_e[o>>2])||(_e[r>>2]=866,_e[r+4>>2]=651,_e[r+8>>2]=1579,Ce(n,812,r),be(n)),7&o){_e[t>>2]=866,_e[4+t>>2]=2506,_e[8+t>>2]=1232,Ce(n,812,t),be(n);break}ue(o,0,0,1,0);break}}while(0);if(o=0|_e[e+176>>2])return u=0|_e[o+-4>>2],o=o+-8|0,0!=(0|u)&&(0|u)==(0|~_e[o>>2])||(_e[a>>2]=866,_e[4+a>>2]=651,_e[8+a>>2]=1579,Ce(n,812,a),be(n)),7&o?(_e[i>>2]=866,_e[4+i>>2]=2506,_e[8+i>>2]=1232,Ce(n,812,i),be(n)):ue(o,0,0,1,0),void(Te=f);Te=f}function q(e,r,t){var n;return!(0!=(0|(e|=0))&73<(r|=0)>>>0&0!=(0|(t|=0)))||40!=(0|_e[t>>2])||18552!=((0|de[e>>0])<<8|0|de[e+1>>0]|0)||((0|de[e+2>>0])<<8|0|de[e+3>>0])>>>0<74||((0|de[e+7>>0])<<16|(0|de[e+6>>0])<<24|(0|de[e+8>>0])<<8|0|de[e+9>>0])>>>0>r>>>0?(t=0)|t:(_e[t+4>>2]=(0|de[e+12>>0])<<8|0|de[e+13>>0],_e[t+8>>2]=(0|de[e+14>>0])<<8|0|de[e+15>>0],_e[t+12>>2]=de[e+16>>0],_e[t+16>>2]=de[e+17>>0],r=e+18|0,_e[(n=t+32|0)>>2]=de[r>>0],r=(_e[4+n>>2]=0)|ce[r>>0],_e[t+20>>2]=r<<24>>24==0|r<<24>>24==9?8:16,_e[t+24>>2]=(0|de[e+26>>0])<<16|(0|de[e+25>>0])<<24|(0|de[e+27>>0])<<8|0|de[e+28>>0],_e[t+28>>2]=(0|de[e+30>>0])<<16|(0|de[e+29>>0])<<24|(0|de[e+31>>0])<<8|0|de[e+32>>0],0|(t=1))}function Q(e,r){e|=0;var t,n,i=0,a=0,o=0,u=0,f=0,l=Te;if(Te=Te+544|0,f=l+16|0,u=(i=l)+32|0,33<=(r|=0)>>>0&&(_e[i>>2]=866,_e[i+4>>2]=3199,_e[i+8>>2]=1350,Ce(u,812,i),be(u)),(0|r)<=(0|(i=0|_e[(n=e+20|0)>>2])))return u=i,f=(a=0|_e[(o=a=e+16|0)>>2])>>>(f=32-r|0),a<<=r,_e[o>>2]=a,r=u-r|0,_e[n>>2]=r,Te=l,0|f;for(a=e+4|0,o=e+8|0,t=e+16|0;e=(0|(e=0|_e[a>>2]))==(0|_e[o>>2])?0:(_e[a>>2]=e+1,0|de[e>>0]),i=i+8|0,33<=(0|(_e[n>>2]=i))&&(_e[f>>2]=866,_e[f+4>>2]=3208,_e[f+8>>2]=1366,Ce(u,812,f),be(u),i=0|_e[n>>2]),e=e<<32-i|_e[t>>2],_e[t>>2]=e,(0|i)<(0|r););return f=e>>>(f=32-r|0),u=e<<r,_e[t>>2]=u,r=i-r|0,_e[n>>2]=r,Te=l,0|f}function ee(e,r,t){e|=0,r|=0;var n,i=0,a=0,o=0,u=0;(a=0|_e[(i=(t|=0)+16|0)>>2])?o=5:0|Me(t)?i=0:(a=0|_e[i>>2],o=5);e:do{if(5==(0|o)){if((a-(i=u=0|_e[(n=t+20|0)>>2])|0)>>>0<r>>>0){i=0|ze[7&_e[t+36>>2]](t,e,r);break}r:do{if(-1<(0|ce[t+75>>0])){for(u=r;;){if(!u){o=0,a=e;break r}if(10==(0|ce[e+(a=u+-1|0)>>0]))break;u=a}if((i=0|ze[7&_e[t+36>>2]](t,e,u))>>>0<u>>>0)break e;a=e+(o=u)|0,r=r-u|0,i=0|_e[n>>2]}else o=0,a=e}while(0);K(0|i,0|a,0|r),_e[n>>2]=(0|_e[n>>2])+r,i=o+r|0}}while(0);return 0|i}function re(e){var r,t=0,n=0,i=0,a=Te;Te=Te+544|0,i=a+16|0,r=(n=a)+32|0,t=0|_e[(e|=0)+20>>2];do{if(0|t){if(Z(t),7&t){_e[n>>2]=866,_e[n+4>>2]=2506,_e[n+8>>2]=1232,Ce(r,812,n),be(r);break}ue(t,0,0,1,0);break}}while(0);if(!(n=0|_e[(t=e+4|0)>>2]))return ce[(i=e+16|0)>>0]=0,void(Te=a);7&n?(_e[i>>2]=866,_e[i+4>>2]=2506,_e[i+8>>2]=1232,Ce(r,812,i),be(r)):ue(n,0,0,1,0),_e[t>>2]=0,_e[e+8>>2]=0,_e[e+12>>2]=0,ce[(i=e+16|0)>>0]=0,Te=a}function te(e,r){r|=0;var t,n,i,a=0,o=0,u=0,f=Te;return Te=Te+560|0,u=f+32|0,i=f+16|0,n=(a=f)+48|0,t=f+44|0,2147418112<(o=0|(o=(e|=0)+3&-4)?o:4)>>>0?(_e[a>>2]=866,_e[a+4>>2]=2506,_e[a+8>>2]=1103,Ce(n,812,a),be(n),Te=f,(u=0)|u):(e=0|ue(0,_e[t>>2]=o,t,1,0),a=0|_e[t>>2],0|r&&(_e[r>>2]=a),0==(0|e)|a>>>0<o>>>0?(_e[i>>2]=866,_e[4+i>>2]=2506,_e[8+i>>2]=1129,Ce(n,812,i),be(n),e=0):7&e&&(_e[u>>2]=866,_e[u+4>>2]=2533,_e[u+8>>2]=1156,Ce(n,812,u),be(n)),Te=f,0|(u=e))}function ne(e,r,t){r|=0;var n,i,a,o=(e|=0)+(t|=0)|0;if(r&=255,67<=(0|t)){for(;3&e;)ce[e>>0]=r,e=e+1|0;for(i=(n=-4&o|0)-64|0,a=r|r<<8|r<<16|r<<24;(0|e)<=(0|i);)_e[e>>2]=a,_e[e+4>>2]=a,_e[e+8>>2]=a,_e[e+12>>2]=a,_e[e+16>>2]=a,_e[e+20>>2]=a,_e[e+24>>2]=a,_e[e+28>>2]=a,_e[e+32>>2]=a,_e[e+36>>2]=a,_e[e+40>>2]=a,_e[e+44>>2]=a,_e[e+48>>2]=a,_e[e+52>>2]=a,_e[e+56>>2]=a,_e[e+60>>2]=a,e=e+64|0;for(;(0|e)<(0|n);)_e[e>>2]=a,e=e+4|0}for(;(0|e)<(0|o);)ce[e>>0]=r,e=e+1|0;return o-t|0}function ae(e,r,t,n,i){e|=0,t|=0,n|=0,i|=0;var a,o,u,f;ce[(r|=0)+53>>0]=1;do{if((0|_e[r+4>>2])==(0|n)){if(ce[r+52>>0]=1,u=r+54|0,f=r+48|0,o=r+24|0,e=r+36|0,!(a=0|_e[(n=r+16|0)>>2])){if(_e[n>>2]=t,_e[o>>2]=i,!((_e[e>>2]=1)==(0|_e[f>>2])&1==(0|i)))break;ce[u>>0]=1;break}if((0|a)!=(0|t)){_e[e>>2]=1+(0|_e[e>>2]),ce[u>>0]=1;break}2==(0|(e=0|_e[o>>2]))&&(e=_e[o>>2]=i),1==(0|_e[f>>2])&1==(0|e)&&(ce[u>>0]=1)}}while(0)}function oe(e,r){e|=0;var t,n,i=0,a=0,o=0,u=0,f=Te;Te=Te+16|0,n=255&(r|=0),ce[(t=f)>>0]=n,(o=0|_e[(a=e+16|0)>>2])?u=4:0|Me(e)?i=-1:(o=0|_e[a>>2],u=4);do{if(4==(0|u)){if((a=0|_e[(u=e+20|0)>>2])>>>0<o>>>0&&(0|(i=255&r))!=(0|ce[e+75>>0])){_e[u>>2]=a+1,ce[a>>0]=n;break}i=1==(0|ze[7&_e[e+36>>2]](e,t,1))?0|de[t>>0]:-1}}while(0);return Te=f,0|i}function ue(e,r,t,n,i){e|=0,r|=0,t|=0,n|=0,i|=0;do{if(e){if(!r){if(F(e),!t){r=0;break}r=_e[t>>2]=0;break}n?e=0==(0|(r=0|function(e,r){r|=0;var t=0,n=0;if(!(e|=0))return 0|(r=0|I(r));if(4294967231<r>>>0)return _e[(r=296)>>2]=12,(r=0)|r;if(0|(t=0|function(e,r){r|=0;var t,n,i=0,a=0,o=0,u=0,f=0,l=0,s=0,c=(e|=0)+(i=-8&(l=0|_e[(s=e+4|0)>>2]))|0;if(!(3&l))return!(r>>>0<256)&&(r+4|0)>>>0<=i>>>0&&(i-r|0)>>>0<=_e[1264]<<1>>>0?0|e:(e=0)|e;if(r>>>0<=i>>>0)return(i=i-r|0)>>>0<=15||(f=e+r|0,_e[s>>2]=1&l|r|2,_e[f+4>>2]=3|i,_e[(s=f+i+4|0)>>2]=1|_e[s>>2],x(f,i)),0|e;if((0|c)==(0|_e[1150]))return i=(f=(0|_e[1147])+i|0)-r|0,a=e+r|0,f>>>0<=r>>>0?(e=0)|e:(_e[s>>2]=1&l|r|2,_e[a+4>>2]=1|i,_e[1150]=a,_e[1147]=i,0|e);if((0|c)==(0|_e[1149]))return(o=(0|_e[1146])+i|0)>>>0<r>>>0?(e=0)|e:(a=1&l,15<(i=o-r|0)>>>0?(f=(l=e+r|0)+i|0,_e[s>>2]=a|r|2,_e[l+4>>2]=1|i,_e[f>>2]=i,_e[(a=f+4|0)>>2]=-2&_e[a>>2],a=l):(_e[s>>2]=a|o|2,_e[(a=e+o+4|0)>>2]=1|_e[a>>2],i=a=0),_e[1146]=i,_e[1149]=a,0|e);if(2&(a=0|_e[4+c>>2])|0)return(e=0)|e;if((n=(-8&a)+i|0)>>>0<r>>>0)return(e=0)|e;f=n-r|0,o=a>>>3;do{if(a>>>0<256){if(a=0|_e[8+c>>2],(0|(i=0|_e[12+c>>2]))==(0|a)){_e[1144]=_e[1144]&~(1<<o);break}_e[a+12>>2]=i,_e[i+8>>2]=a;break}t=0|_e[24+c>>2],i=0|_e[12+c>>2];do{if((0|i)==(0|c)){if(i=0|_e[(a=(o=16+c|0)+4|0)>>2])u=a;else{if(!(i=0|_e[o>>2])){o=0;break}u=o}for(;;)if(0|(a=0|_e[(o=i+20|0)>>2]))i=a,u=o;else{if(!(o=0|_e[(a=i+16|0)>>2]))break;i=o,u=a}_e[u>>2]=0,o=i}else o=0|_e[8+c>>2],_e[o+12>>2]=i,_e[i+8>>2]=o,o=i}while(0);if(0|t){if(i=0|_e[28+c>>2],(0|c)==(0|_e[(a=4880+(i<<2)|0)>>2])){if(!(_e[a>>2]=o)){_e[1145]=_e[1145]&~(1<<i);break}}else if(!(_e[16+t+(((0|_e[16+t>>2])!=(0|c)&1)<<2)>>2]=o))break;_e[o+24>>2]=t,0|(a=0|_e[(i=16+c|0)>>2])&&(_e[o+16>>2]=a,_e[a+24>>2]=o),0|(i=0|_e[i+4>>2])&&(_e[o+20>>2]=i,_e[i+24>>2]=o)}}while(0);return i=1&l,f>>>0<16?(_e[s>>2]=n|i|2,_e[(s=e+n+4|0)>>2]=1|_e[s>>2]):(l=e+r|0,_e[s>>2]=i|r|2,_e[l+4>>2]=3|f,_e[(s=l+f+4|0)>>2]=1|_e[s>>2],x(l,f)),0|e}(e+-8|0,r>>>0<11?16:r+11&-8)))return 0|(r=t+8|0);return(t=0|I(r))?(n=0|_e[e+-4>>2],K(0|t,0|e,0|((n=(-8&n)-(0==(3&n|0)?8:4)|0)>>>0<r>>>0?n:r)),F(e),0|(r=t)):(r=0)|r}(e,r)))?e:r:r=0,t&&(i=0|pe(e),_e[t>>2]=i)}else r=0|I(r),t&&(e=r?0|pe(r):0,_e[t>>2]=e)}while(0);return 0|r}function fe(e,r,t){t|=0;var n;if(0<(r|=0)>>>0|0==(0|r)&4294967295<(e|=0)>>>0){for(;n=0|Pe(0|e,0|r,10,0),ce[(t=t+-1|0)>>0]=255&n|48,e=0|Fe(0|(n=e),0|r,10,0),9<r>>>0|9==(0|r)&4294967295<n>>>0;)r=L;r=e}else r=e;if(r)for(;ce[(t=t+-1|0)>>0]=(r>>>0)%10|48,!(r>>>0<10);)r=(r>>>0)/10|0;return 0|t}function le(e,r,t,n){e|=0,t|=0,n|=0;var i=0|_e[(e=(r|=0)+16|0)>>2],a=r+36|0,o=r+24|0;do{if(i){if((0|i)!=(0|t)){_e[a>>2]=1+(0|_e[a>>2]),_e[o>>2]=2,ce[r+54>>0]=1;break}2==(0|_e[o>>2])&&(_e[o>>2]=n)}else _e[e>>2]=t,_e[o>>2]=n,_e[a>>2]=1}while(0)}function be(e){e|=0;var r=0,t=0,n=0|_e[119];_e[76+n>>2];do{if((0|function(e,r){r|=0;var t=0;return t=0|function(e){var r=0,t=0,n=0,n=e|=0;e:do{if(3&n)for(r=n;;){if(!(0|ce[e>>0])){e=r;break e}if(!(3&(r=e=e+1|0))){t=4;break}}else t=4}while(0);if(4==(0|t)){for(;!((-2139062144&(r=0|_e[e>>2])^-2139062144)&r+-16843009);)e=e+4|0;if((255&r)<<24>>24)for(;0!=(0|ce[(e=e+1|0)>>0]););}return e-n|0}(e=e|0),((0|function(e,r,t,n){e|=0,n|=0;var i=0;i=0|ie(t|=0,r|=0),t=0==(0|r)?0:t,e=(_e[n+76>>2],0|ee(e,i,n));(0|e)!=(0|i)&&(t=(e>>>0)/(r>>>0)|0);return 0|t}(e,1,t,r))!=(0|t))<<31>>31|0}(e,n))<0)e=1;else{if(10!=(0|ce[75+n>>0])&&(t=0|_e[(r=20+n|0)>>2])>>>0<(0|_e[16+n>>2])>>>0){_e[r>>2]=t+1,ce[t>>0]=10,e=0;break}e=(0|oe(n,10))<0}}while(0);return e<<31>>31|0}function se(e,r,t,n,i){e|=0,r|=0;var a,o=Te;if(Te=Te+256|0,a=o,(0|(n|=0))<(0|(t|=0))&0==(73728&(i|=0)|0)){if(ne(0|a,0|r,0|((i=t-n|0)>>>0<256?i:256)),255<i>>>0){for(r=t-n|0;Ie(e,a,256),255<(i=i+-256|0)>>>0;);i=255&r}Ie(e,a,i)}Te=o}function Me(e){var r=0,t=0|ce[(r=(e|=0)+74|0)>>0];return ce[r>>0]=255+t|t,0|(e=8&(r=0|_e[e>>2])?(_e[e>>2]=32|r,-1):(_e[e+8>>2]=0,t=(_e[e+4>>2]=0)|_e[e+44>>2],_e[e+28>>2]=t,_e[e+20>>2]=t,_e[e+16>>2]=t+(0|_e[e+48>>2]),0))}function me(e){var r=0,t=0;return 0<(0|(t=(e|=0)+15&-16|0))&(0|(e=(r=0|_e[_>>2])+t|0))<(0|r)|(0|e)<0?(M(),P(12),-1):(0|(_e[_>>2]=e))>(0|b())&&0==(0|A())?(_e[_>>2]=r,P(12),-1):0|r}function Se(e){var r=0,t=0,n=0,t=0|_e[(e|=0)>>2];if((n=(0|ce[t>>0])-48|0)>>>0<10)for(r=0;r=n+(10*r|0)|0,t=t+1|0,_e[e>>2]=t,(n=(0|ce[t>>0])-48|0)>>>0<10;);else r=0;return 0|r}function he(e){var r=0;return(0|(r=0|ce[d+(255&(e|=0))>>0]))<8?0|r:(0|(r=0|ce[d+(e>>8&255)>>0]))<8?r+8|0:(0|(r=0|ce[d+(e>>16&255)>>0]))<8?r+16|0:24+(0|ce[d+(e>>>24)>>0])|0}function Re(e,r,t,n){t|=0,n|=0;var i=0;(0|_e[(r|=0)+4>>2])==(0|t)&&1!=(0|_e[(i=r+28|0)>>2])&&(_e[i>>2]=n)}function Pe(e,r,t,n){var i,a=Te;return Te=Te+16|0,B(e|=0,r|=0,t|=0,n|=0,i=0|a),Te=a,0|(L=0|_e[4+i>>2],0|_e[i>>2])}function pe(e){var r;return(e|=0)?0|(1==(0|(e=3&(r=0|_e[e+-4>>2])))?0:(-8&r)-(0==(0|e)?8:4)|0):0}function Ce(e,r,t){e|=0,r|=0,t|=0;var n,i,a,o,u=Te;return Te=Te+16|0,_e[(n=u)>>2]=t,t=0|(i=e,a=r,o=n,0|function(e,r,t,n){e|=0,r|=0,t|=0,n|=0;var i,a=0,o=0,u=0,f=0,l=0,s=Te;for(Te=Te+128|0,a=s+124|0,u=604,i=(o=l=s)+124|0;_e[o>>2]=_e[u>>2],u=u+4|0,(0|(o=o+4|0))<(0|i););return 2147483646<(r+-1|0)>>>0?r?(_e[(r=296)>>2]=75,r=-1):(e=a,r=1,f=4):f=4,4==(0|f)&&(f=(f=-2-e|0)>>>0<r>>>0?f:r,_e[l+48>>2]=f,_e[(a=l+20|0)>>2]=e,r=(_e[l+44>>2]=e)+f|0,_e[(e=l+16|0)>>2]=r,_e[l+28>>2]=r,r=0|j(l,t,n),f&&(l=0|_e[a>>2],ce[l+(((0|l)==(0|_e[e>>2]))<<31>>31)>>0]=0)),Te=s,0|r}(i|=0,2147483647,a|=0,o|=0)),Te=u,0|t}function Ne(e,r,t){return e|=0,r|=0,(0|(t|=0))<32?(L=r<<t|(e&(1<<t)-1<<32-t)>>>32-t,e<<t):(L=e<<t-32,0)}function ye(e,r,t){return e|=0,r|=0,(0|(t|=0))<32?(L=r>>>t,e>>>t|(r&(1<<t)-1)<<32-t):r>>>t-32|(L=0)}function Oe(e,r){e|=0,r|=0;var t=Te;Te=Te+16|0,_e[t>>2]=r,j(r=0|_e[26],e,t),function(e,r){var t=0,n=0,i=0,a=0,o=255&(e|=0),t=255&e;_e[(r|=0)+76>>2],a=3;do{if(3==(0|a)){if((0|t)!=(0|ce[r+75>>0])&&(i=0|_e[(n=r+20|0)>>2])>>>0<(0|_e[r+16>>2])>>>0){_e[n>>2]=i+1,ce[i>>0]=o;break}t=0|oe(r,e)}}while(0)}(10,r),p()}function ve(e,r,t,n){return 0|(L=n=(r|=0)-(n|=0)-((e|=0)>>>0<(t|=0)>>>0|0)>>>0,e-t>>>0|0)}function ke(e){e=+e;var r;return k[g>>3]=e,r=0|_e[g>>2],L=0|_e[g+4>>2],0|r}function ge(e,r,t,n){return 0|(L=(r|=0)+(n|=0)+((t=(e|=0)+(t|=0)>>>0)>>>0<e>>>0|0)>>>0,0|t)}function Le(e){return 4294963200<(e|=0)>>>0&&(_e[74]=0-e,e=-1),0|e}function Ie(e,r,t){r|=0,t|=0,32&_e[(e|=0)>>2]||ee(r,t,e)}function we(e,r){return r|=0,0|(e=(e|=0)?0|function(e,r){e|=0,r|=0;do{if(e){if(r>>>0<128){ce[e>>0]=r,e=1;break}if(!(0|_e[_e[420>>2]>>2])){if(57216==(-128&r|0)){ce[e>>0]=r,e=1;break}_e[(e=296)>>2]=84,e=-1;break}if(r>>>0<2048){ce[e>>0]=r>>>6|192,ce[e+1>>0]=63&r|128,e=2;break}if(r>>>0<55296|57344==(-8192&r|0)){ce[e>>0]=r>>>12|224,ce[e+1>>0]=r>>>6&63|128,ce[e+2>>0]=63&r|128,e=3;break}if((r+-65536|0)>>>0<1048576){ce[e>>0]=r>>>18|240,ce[e+1>>0]=r>>>12&63|128,ce[e+2>>0]=r>>>6&63|128,ce[e+3>>0]=63&r|128,e=4;break}_e[(e=296)>>2]=84,e=-1;break}e=1}while(0);return 0|e}(e,r):0)}function De(e,r){return(0|(e|=0))==(0|(r|=0))|0}function Ge(e,r){var t=0|xe(0|(e|=0));return 0|(0==(0|(r|=0))?e:t)}function Fe(e,r,t,n){return 0|B(e|=0,r|=0,t|=0,n|=0,0)}function xe(e){return(255&(e|=0))<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function Be(e,r,t,n,i,a){E(6)}function Ue(e,r,t,n,i){E(1)}function He(e){var r;r=e|=0,F(r|=0)}function We(e,r,t,n){E(7)}function Ve(e,r,t){return E(0),0}function Xe(e){}function Ye(e){E(2)}function Ke(){E(5)}var ze=[Ve,z,function(e,r,t){e|=0,r|=0,t|=0;var n,i,a=Te;return Te=Te+32|0,n=(i=a)+20|0,_e[i>>2]=_e[e+60>>2],_e[i+4>>2]=0,_e[i+8>>2]=r,_e[i+12>>2]=n,_e[i+16>>2]=t,e=(0|Le(0|O(140,0|i)))<0?_e[n>>2]=-1:0|_e[n>>2],Te=a,0|e},function(e,r,t){r|=0,t|=0;var n=0,i=Te;return Te=Te+32|0,n=i,_e[(e|=0)+36>>2]=1,0==(64&_e[e>>2]|0)&&(_e[n>>2]=_e[e+60>>2],_e[n+4>>2]=21523,_e[n+8>>2]=i+16,0|S(54,0|n))&&(ce[e+75>>0]=-1),n=0|z(e,r,t),Te=i,0|n},function(e,r,t){r|=0,t|=0;var n=0,i=0;return K(0|(i=0|_e[(n=(e|=0)+20|0)>>2]),0|r,0|(e=t>>>0<(e=(0|_e[e+16>>2])-i|0)>>>0?t:e)),_e[n>>2]=(0|_e[n>>2])+e,0|t},function(e,r,t){t|=0;var n,i,a=0,o=Te;if(Te=Te+64|0,i=o,0|De(e|=0,r|=0))r=1;else if(0!=(0|r)&&0!=(0|(a=0|J(r,32,16,0)))){for(n=(r=i+4|0)+52|0;(0|(r=r+4|(_e[r>>2]=0)))<(0|n););_e[i>>2]=a,_e[i+8>>2]=e,_e[i+12>>2]=-1,_e[i+48>>2]=1,er[3&_e[28+(0|_e[a>>2])>>2]](a,i,0|_e[t>>2],1),r=1==(0|_e[i+24>>2])?(_e[t>>2]=_e[i+16>>2],1):0}else r=0;return Te=o,0|r},Ve,Ve],je=[Ue,function(e,r,t,n,i){e|=0,r|=0,t|=0,n|=0;var a=0;do{if(0|De(e,0|_e[r+8>>2]))Re(0,r,t,n);else if(0|De(e,0|_e[r>>2])){if(e=r+32|0,(0|_e[r+16>>2])!=(0|t)&&(0|_e[(a=r+20|0)>>2])!=(0|t)){_e[e>>2]=n,_e[a>>2]=t,_e[(n=r+40|0)>>2]=1+(0|_e[n>>2]),1==(0|_e[r+36>>2])&&2==(0|_e[r+24>>2])&&(ce[r+54>>0]=1),_e[r+44>>2]=4;break}1==(0|n)&&(_e[e>>2]=1)}}while(0)},function(e,r,t,n,i){e|=0,r|=0,t|=0,n|=0,i|=0;var a,o=0,u=0,f=0;do{if(0|De(e,0|_e[r+8>>2]))Re(0,r,t,n);else{if(o=e+8|0,!(0|De(e,0|_e[r>>2]))){f=0|_e[o>>2],je[3&_e[24+(0|_e[f>>2])>>2]](f,r,t,n,i);break}if(e=r+32|0,(0|_e[r+16>>2])!=(0|t)&&(0|_e[(u=r+20|0)>>2])!=(0|t)){if(_e[e>>2]=n,4==(0|_e[(n=r+44|0)>>2]))break;ce[(e=r+52|0)>>0]=0,o=(ce[(a=r+53|0)>>0]=0)|_e[o>>2],Qe[3&_e[20+(0|_e[o>>2])>>2]](o,r,t,t,1,i),0|ce[a>>0]?0|ce[e>>0]?e=3:(e=3,f=11):(e=4,f=11),11==(0|f)&&(_e[u>>2]=t,_e[(a=r+40|0)>>2]=1+(0|_e[a>>2]),1==(0|_e[r+36>>2])&&2==(0|_e[r+24>>2])&&(ce[r+54>>0]=1)),_e[n>>2]=e;break}1==(0|n)&&(_e[e>>2]=1)}}while(0)},Ue],Je=[Ye,Xe,He,Xe,Xe,He,function(e){var r=Te;Te=Te+16|0,F(e|=0),0|h(0|_e[1285],0)?Oe(4406,r):Te=r},Ye],$e=[function(e){return E(3),0},function(e){var r,t,n=Te;return Te=Te+16|0,r=n,e=0|(t=0|_e[(e|=0)+60>>2],0|(t|=0)),_e[r>>2]=e,e=0|Le(0|R(6,0|r)),Te=n,0|e}],Ze=[function(e,r,t){E(4)}],qe=[Ke,function(){var e,r,t,n,i=0,a=0,o=0,u=Te;Te=Te+48|0,n=u+32|0,r=u+24|0,o=u+16|0,u=(t=u)+36|0,0|(i=0|function(){var e=0,r=0;{if(Te=(e=Te)+16|0,!(0|C(5136,2)))return r=0|m(0|_e[1285]),Te=e,0|r;Oe(4307,e)}return 0}())&&0|(a=0|_e[i>>2])&&(1126902528==(-256&(e=0|_e[(i=a+48|0)>>2])|0)&1129074247==(0|(i=0|_e[i+4>>2]))||(_e[r>>2]=4168,Oe(4118,r)),i=1126902529==(0|e)&1129074247==(0|i)?0|_e[a+44>>2]:a+80|0,_e[u>>2]=i,a=0|_e[a>>2],i=0|_e[a+4>>2],0|ze[7&_e[16+(0|_e[2])>>2]](8,a,u)?(o=0|_e[u>>2],o=0|$e[1&_e[8+(0|_e[o>>2])>>2]](o),_e[t>>2]=4168,_e[t+4>>2]=i,_e[t+8>>2]=o,Oe(4032,t)):(_e[o>>2]=4168,_e[o+4>>2]=i,Oe(4077,o))),Oe(4156,n)},function(){var e=Te;Te=Te+16|0,0|y(5140,6)?Oe(4356,e):Te=e},Ke],Qe=[Be,function(e,r,t,n,i,a){t|=0,n|=0,i|=0,0|De(e|=0,0|_e[(r|=0)+8>>2])&&ae(0,r,t,n,i)},function(e,r,t,n,i,a){t|=0,n|=0,i|=0,a|=0,0|De(e|=0,0|_e[(r|=0)+8>>2])?ae(0,r,t,n,i):(e=0|_e[e+8>>2],Qe[3&_e[20+(0|_e[e>>2])>>2]](e,r,t,n,i,a))},Be],er=[We,function(e,r,t,n){t|=0,n|=0,0|De(e|=0,0|_e[(r|=0)+8>>2])&&le(0,r,t,n)},function(e,r,t,n){t|=0,n|=0,0|De(e|=0,0|_e[(r|=0)+8>>2])?le(0,r,t,n):(e=0|_e[e+8>>2],er[3&_e[28+(0|_e[e>>2])>>2]](e,r,t,n))},We];return{stackSave:function(){return 0|Te},_i64Subtract:ve,_crn_get_bytes_per_block:function(e,r){e|=0,r|=0;var t,n,i=0,a=Te;switch(Te=Te+576|0,n=a+40|0,t=a+56|0,_e[(i=a)>>2]=40,q(e,r,i),e=0|_e[(r=i+32|0)+4>>2],0|_e[r>>2]){case 0:if(!e)return Te=a,0|(i=8);e=14;break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:e=e?14:13;break;case 9:case 10:if(!e)return Te=a,0|(i=8);e=14;break;default:e=14}return 13==(0|e)?(Te=a,0|(i=16)):14==(0|e)?(_e[n>>2]=866,_e[4+n>>2]=2672,_e[8+n>>2]=1251,Ce(t,812,n),be(t),Te=a,(i=0)|i):0},setThrew:function(e,r){},dynCall_viii:function(e,r,t,n){r|=0,t|=0,n|=0,Ze[0&(e|=0)](0|r,0|t,0|n)},_bitshift64Lshr:ye,_bitshift64Shl:Ne,dynCall_viiii:function(e,r,t,n,i){r|=0,t|=0,n|=0,i|=0,er[3&(e|=0)](0|r,0|t,0|n,0|i)},setTempRet0:function(e){L=e|=0},_crn_decompress:function(e,r,t,n,i,a){e|=0,r|=0,t|=0,n|=0,i|=0,a|=0;var o,u,f,l=0,s=0,c=0,_=0,d=0,E=Te;switch(Te=Te+592|0,f=E+56|0,c=E+40|0,o=E+72|0,u=(d=E)+68|0,_e[d>>2]=40,q(e,r,d),l=(0|_e[d+4>>2])>>>i,s=(0|_e[d+8>>2])>>>i,n=0|_e[(d=d+32|0)+4>>2],0|_e[d>>2]){case 0:n?_=14:d=8;break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:_=n?14:13;break;case 9:case 10:n?_=14:d=8;break;default:_=14}13==(0|_)?d=16:14==(0|_)&&(_e[c>>2]=866,_e[c+4>>2]=2672,_e[c+8>>2]=1251,Ce(o,812,c),be(o),d=0),_e[u>>2]=t,_=0|function(e,r){var t=0,n=0,i=0,a=0,o=0,u=0,f=0,l=0,s=0,c=0,_=0,d=0;if(Te=(_=Te)+528|0,u=(s=_)+16|0,0==(0|(e|=0))|(r|=0)>>>0<62)return Te=_,(d=0)|d;if(!(f=0|te(300,0)))return Te=_,(d=0)|d;_e[f>>2]=519686845,_e[4+f>>2]=0,_e[8+f>>2]=0,l=88+f|0,t=136+f|0,n=160+f|0,i=184+f|0,a=208+f|0,o=232+f|0,_e[(c=252+f|0)>>2]=0,_e[c+4>>2]=0,_e[c+8>>2]=0,ce[c+12>>0]=0,_e[(c=268+f|0)>>2]=0,_e[c+4>>2]=0,_e[c+8>>2]=0,ce[c+12>>0]=0,_e[(c=284+f|0)>>2]=0,_e[c+4>>2]=0,_e[c+8>>2]=0,ce[c+12>>0]=0,d=44+(c=l)|0;for(;_e[c>>2]=0,c=c+4|0,(0|c)<(0|d););if(ce[44+l>>0]=0,_e[t>>2]=0,_e[4+t>>2]=0,_e[8+t>>2]=0,_e[12+t>>2]=0,_e[16+t>>2]=0,ce[20+t>>0]=0,_e[n>>2]=0,_e[4+n>>2]=0,_e[8+n>>2]=0,_e[12+n>>2]=0,_e[16+n>>2]=0,ce[20+n>>0]=0,_e[i>>2]=0,_e[4+i>>2]=0,_e[8+i>>2]=0,_e[12+i>>2]=0,_e[16+i>>2]=0,ce[20+i>>0]=0,_e[a>>2]=0,_e[4+a>>2]=0,_e[8+a>>2]=0,_e[12+a>>2]=0,_e[16+a>>2]=0,ce[20+a>>0]=0,_e[o>>2]=0,_e[4+o>>2]=0,_e[8+o>>2]=0,_e[12+o>>2]=0,ce[16+o>>0]=0,0|function(e,r,t){e|=0;var n=0,i=0;if(!(0==(0|(r|=0))|(t|=0)>>>0<74||18552!=((0|de[r>>0])<<8|0|de[r+1>>0]|0))&&74<=((0|de[r+2>>0])<<8|0|de[r+3>>0])>>>0&&((0|de[r+7>>0])<<16|(0|de[r+6>>0])<<24|(0|de[r+8>>0])<<8|0|de[r+9>>0])>>>0<=t>>>0){if(_e[(n=e+88|0)>>2]=r,_e[e+4>>2]=r,_e[e+8>>2]=t,!(0|function(e){var r=0,t=0,n=0,i=0;if(i=92+(e|=0)|0,t=0|_e[(n=e+88|0)>>2],r=(0|_e[e+4>>2])+((0|de[68+t>>0])<<8|(0|de[67+t>>0])<<16|0|de[69+t>>0])|0,!(t=(0|de[65+t>>0])<<8|0|de[66+t>>0]))return(i=0)|i;if(_e[i>>2]=r,_e[e+96>>2]=r,_e[e+104>>2]=t,_e[e+100>>2]=r+t,_e[e+108>>2]=0,_e[e+112>>2]=0,!(0|V(i,e+116|0)))return(i=0)|i;r=0|_e[n>>2];do{if((0|de[r+39>>0])<<8|0|de[r+40>>0]){if(!(0|V(i,e+140|0)))return(i=0)|i;if(0|V(i,e+188|0)){r=0|_e[n>>2];break}return(i=0)|i}if(!((0|de[r+55>>0])<<8|0|de[r+56>>0]))return(i=0)|i}while(0);if((0|de[r+55>>0])<<8|0|de[r+56>>0]|0){if(!(0|V(i,e+164|0)))return(i=0)|i;if(!(0|V(i,e+212|0)))return(i=0)|i}return 0|(i=1)}(e)))return(i=0)|i;if(r=0|_e[n>>2],(0|de[r+39>>0])<<8|0|de[r+40>>0]?0|function(e){var r=0,t=0,n=0,i=0,a=0,o=0,u=0,f=0,l=0,s=0,c=0,_=0,d=0;if(Te=(d=Te)+576|0,i=(o=d)+64|0,_=d+16|0,r=0|_e[(n=88+(e|=0)|0)>>2],c=(0|de[r+39>>0])<<8|0|de[r+40>>0],l=e+236|0,(0|(t=0|_e[(a=e+240|0)>>2]))!=(0|c)){if(t>>>0<=c>>>0){do{if((0|_e[e+244>>2])>>>0<c>>>0){if(0|X(l,c,(t+1|0)==(0|c),4,0)){r=0|_e[a>>2];break}return ce[e+248>>0]=1,Te=d,(_=0)|_}r=t}while(0);ne((0|_e[l>>2])+(r<<2)|0,0,c-r<<2|0),r=0|_e[n>>2]}_e[a>>2]=c}if(s=e+92|0,t=(0|_e[e+4>>2])+((0|de[r+34>>0])<<8|(0|de[r+33>>0])<<16|0|de[r+35>>0])|0,!(r=(0|de[r+37>>0])<<8|(0|de[r+36>>0])<<16|0|de[r+38>>0]))return Te=d,(_=0)|_;if(_e[s>>2]=t,_e[e+96>>2]=t,_e[e+104>>2]=r,_e[e+100>>2]=t+r,_e[e+108>>2]=0,_e[e+112>>2]=0,u=_+20|0,_e[_>>2]=0,_e[_+4>>2]=0,_e[_+8>>2]=0,_e[_+12>>2]=0,ce[_+16>>0]=0,f=_+24|0,_e[_+44>>2]=0,_e[u>>2]=0,_e[u+4>>2]=0,_e[u+8>>2]=0,_e[u+12>>2]=0,_e[u+16>>2]=0,ce[u+20>>0]=0,0|V(s,_)&&0|V(s,f))if(0|_e[a>>2]||(_e[o>>2]=866,_e[o+4>>2]=910,_e[o+8>>2]=1497,Ce(i,812,o),be(i)),c)for(t=(u=o=0)|_e[l>>2],a=i=r=e=n=0;;){if(o=(0|Ae(s,_))+o&31,a=(0|Ae(s,f))+a&63,i=(0|Ae(s,_))+i&31,r=(0|Ae(s,_))+r|0,e=(0|Ae(s,f))+e&63,n=(0|Ae(s,_))+n&31,_e[t>>2]=a<<5|o<<11|i|r<<27|e<<21|n<<16,c>>>0<=(u=u+1|0)>>>0){r=1;break}t=t+4|0,r&=31}else r=1;else r=0;return re(_+24|0),re(_),Te=d,0|(_=r)}(e)&&0|function(e){var r,t,n,i,a,o,u,f,l,s,c,_,d,E,T,A,b,M,m,S,h,R,P,p,C,N,y,O,v,k=0,g=0,L=0,I=0,w=0,D=0,G=0,F=0,x=0,B=Te;if(Te=Te+1008|0,w=(D=B)+496|0,F=B+472|0,E=B+276|0,T=B+80|0,A=B+16|0,g=0|_e[(e|=0)+88>>2],_=(0|de[g+47>>0])<<8|0|de[g+48>>0],d=e+92|0,k=(0|_e[e+4>>2])+((0|de[g+42>>0])<<8|(0|de[g+41>>0])<<16|0|de[g+43>>0])|0,!(g=(0|de[g+45>>0])<<8|(0|de[g+44>>0])<<16|0|de[g+46>>0]))return Te=B,(F=0)|F;if(_e[d>>2]=k,_e[e+96>>2]=k,_e[e+104>>2]=g,_e[e+100>>2]=k+g,_e[e+108>>2]=0,_e[e+112>>2]=0,_e[F+20>>2]=0,_e[F>>2]=0,_e[F+4>>2]=0,_e[F+8>>2]=0,_e[F+12>>2]=0,(ce[F+16>>0]=0)|V(d,F)){for(k=0,L=g=-3;_e[E+(k<<2)>>2]=L,_e[T+(k<<2)>>2]=g,I=2<(0|L),49!=(0|(k=k+1|0));)g=(1&I)+g|0,L=I?-3:L+1|0;for(g=(k=A)+64|0;(0|(k=k+4|(_e[k>>2]=0)))<(0|g););L=e+252|0,k=0|_e[(g=e+256|0)>>2];e:do{if((0|k)==(0|_))G=13;else{if(k>>>0<=_>>>0){do{if((0|_e[e+260>>2])>>>0<_>>>0){if(0|X(L,_,(k+1|0)==(0|_),4,0)){k=0|_e[g>>2];break}ce[e+264>>0]=1,k=0;break e}}while(0);ne((0|_e[L>>2])+(k<<2)|0,0,_-k<<2|0)}_e[g>>2]=_,G=13}}while(0);do{if(13==(0|G)){if(!_){_e[D>>2]=866,_e[D+4>>2]=910,_e[D+8>>2]=1497,Ce(w,812,D),be(w),k=1;break}for(e=4+A|0,w=8+A|0,D=12+A|0,G=16+A|0,r=20+A|0,t=24+A|0,n=28+A|0,i=32+A|0,a=36+A|0,o=40+A|0,u=44+A|0,f=48+A|0,l=52+A|0,s=56+A|0,c=60+A|0,k=(I=0)|_e[L>>2],g=0|_e[e>>2],L=0|_e[A>>2];v=0|Ae(d,F),L=L+(0|_e[E+(v<<2)>>2])&3,g=g+(0|_e[T+(v<<2)>>2])&3,v=0|Ae(d,F),x=(0|_e[w>>2])+(0|_e[E+(v<<2)>>2])&3,_e[w>>2]=x,v=(0|_e[D>>2])+(0|_e[T+(v<<2)>>2])&3,_e[D>>2]=v,y=0|Ae(d,F),O=(0|_e[G>>2])+(0|_e[E+(y<<2)>>2])&3,_e[G>>2]=O,y=(0|_e[r>>2])+(0|_e[T+(y<<2)>>2])&3,_e[r>>2]=y,C=0|Ae(d,F),N=(0|_e[t>>2])+(0|_e[E+(C<<2)>>2])&3,_e[t>>2]=N,C=(0|_e[n>>2])+(0|_e[T+(C<<2)>>2])&3,_e[n>>2]=C,P=0|Ae(d,F),p=(0|_e[i>>2])+(0|_e[E+(P<<2)>>2])&3,_e[i>>2]=p,P=(0|_e[a>>2])+(0|_e[T+(P<<2)>>2])&3,_e[a>>2]=P,h=0|Ae(d,F),R=(0|_e[o>>2])+(0|_e[E+(h<<2)>>2])&3,_e[o>>2]=R,h=(0|_e[u>>2])+(0|_e[T+(h<<2)>>2])&3,_e[u>>2]=h,m=0|Ae(d,F),S=(0|_e[f>>2])+(0|_e[E+(m<<2)>>2])&3,_e[f>>2]=S,m=(0|_e[l>>2])+(0|_e[T+(m<<2)>>2])&3,_e[l>>2]=m,b=0|Ae(d,F),M=(0|_e[s>>2])+(0|_e[E+(b<<2)>>2])&3,_e[s>>2]=M,b=(0|_e[c>>2])+(0|_e[T+(b<<2)>>2])&3,_e[c>>2]=b,_e[k>>2]=(0|de[1441+g>>0])<<2|0|de[1441+L>>0]|(0|de[1441+x>>0])<<4|(0|de[1441+v>>0])<<6|(0|de[1441+O>>0])<<8|(0|de[1441+y>>0])<<10|(0|de[1441+N>>0])<<12|(0|de[1441+C>>0])<<14|(0|de[1441+p>>0])<<16|(0|de[1441+P>>0])<<18|(0|de[1441+R>>0])<<20|(0|de[1441+h>>0])<<22|(0|de[1441+S>>0])<<24|(0|de[1441+m>>0])<<26|(0|de[1441+M>>0])<<28|(0|de[1441+b>>0])<<30,!(_>>>0<=(I=I+1|0)>>>0);)k=k+4|0;_e[A>>2]=L,_e[e>>2]=g,k=1}}while(0)}else k=0;return re(F),Te=B,0|(x=k)}(e)&&(r=0|_e[n>>2],i=11):i=11,11==(0|i)){if(!((0|de[r+55>>0])<<8|0|de[r+56>>0]))return 0|(i=1);if(0|function(e){var r=0,t=0,n=0,i=0,a=0,o=0,u=0,f=0,l=0;if(Te=(l=Te)+560|0,n=(i=l)+40|0,f=l+16|0,t=0|_e[88+(e|=0)>>2],o=(0|de[t+55>>0])<<8|0|de[t+56>>0],u=e+92|0,r=(0|_e[e+4>>2])+((0|de[t+50>>0])<<8|(0|de[t+49>>0])<<16|0|de[t+51>>0])|0,!(t=(0|de[t+53>>0])<<8|(0|de[t+52>>0])<<16|0|de[t+54>>0]))return Te=l,(f=0)|f;_e[u>>2]=r,_e[e+96>>2]=r,_e[e+104>>2]=t,_e[e+100>>2]=r+t,_e[e+108>>2]=0,_e[e+112>>2]=0,_e[f+20>>2]=0,_e[f>>2]=0,_e[f+4>>2]=0,_e[f+8>>2]=0,_e[f+12>>2]=0,ce[f+16>>0]=0;e:do{if(0|V(u,f)){if(a=e+268|0,(0|(r=0|_e[(t=e+272|0)>>2]))!=(0|o)){if(r>>>0<=o>>>0){do{if((0|_e[e+276>>2])>>>0<o>>>0){if(0|X(a,o,(r+1|0)==(0|o),2,0)){r=0|_e[t>>2];break}ce[e+280>>0]=1,r=0;break e}}while(0);ne((0|_e[a>>2])+(r<<1)|0,0,o-r<<1|0)}_e[t>>2]=o}if(!o){_e[i>>2]=866,_e[i+4>>2]=910,_e[i+8>>2]=1497,Ce(n,812,i),be(n),r=1;break}for(r=(n=e=t=0)|_e[a>>2];;){if(a=0|Ae(u,f),n=a+n&255,e=(0|Ae(u,f))+e&255,W[r>>1]=e<<8|n,o>>>0<=(t=t+1|0)>>>0){r=1;break}r=r+2|0}}else r=0}while(0);return re(f),Te=l,0|(f=r)}(e)&&0|function(e){var r,t,n,i,a,o,u,f,l,s,c,_,d,E,T,A,b,M,m,S,h,R=0,P=0,p=0,C=0,N=0,y=0,O=0,v=0,k=0,g=0,L=0,I=0,w=0,D=0,G=0,F=0,x=0,B=0,U=0,H=Te;if(Te=Te+2416|0,N=(y=H)+1904|0,B=H+1880|0,M=H+980|0,m=H+80|0,S=H+16|0,P=0|_e[(e|=0)+88>>2],A=(0|de[P+63>>0])<<8|0|de[P+64>>0],b=e+92|0,R=(0|_e[e+4>>2])+((0|de[P+58>>0])<<8|(0|de[P+57>>0])<<16|0|de[P+59>>0])|0,!(P=(0|de[P+61>>0])<<8|(0|de[P+60>>0])<<16|0|de[P+62>>0]))return Te=H,(B=0)|B;if(_e[b>>2]=R,_e[e+96>>2]=R,_e[e+104>>2]=P,_e[e+100>>2]=R+P,_e[e+108>>2]=0,_e[e+112>>2]=0,_e[B+20>>2]=0,_e[B>>2]=0,_e[B+4>>2]=0,_e[B+8>>2]=0,_e[B+12>>2]=0,(ce[B+16>>0]=0)|V(b,B)){for(R=0,p=P=-7;_e[M+(R<<2)>>2]=p,_e[m+(R<<2)>>2]=P,C=6<(0|p),225!=(0|(R=R+1|0));)P=(1&C)+P|0,p=C?-7:p+1|0;for(P=(R=S)+64|0;(0|(R=R+4|(_e[R>>2]=0)))<(0|P););C=e+284|0,P=3*A|0,R=0|_e[(p=e+288|0)>>2];e:do{if((0|R)==(0|P))O=13;else{if(R>>>0<=P>>>0){do{if((0|_e[e+292>>2])>>>0<P>>>0){if(0|X(C,P,(R+1|0)==(0|P),2,0)){R=0|_e[p>>2];break}ce[e+296>>0]=1,R=0;break e}}while(0);ne((0|_e[C>>2])+(R<<1)|0,0,P-R<<1|0)}_e[p>>2]=P,O=13}}while(0);do{if(13==(0|O)){if(!A){_e[y>>2]=866,_e[y+4>>2]=910,_e[y+8>>2]=1497,Ce(N,812,y),be(N),R=1;break}for(r=4+S|0,t=8+S|0,n=12+S|0,i=16+S|0,a=20+S|0,o=24+S|0,u=28+S|0,f=32+S|0,l=36+S|0,s=40+S|0,c=44+S|0,_=48+S|0,d=52+S|0,E=56+S|0,T=60+S|0,R=(x=0)|_e[C>>2],P=0|_e[S>>2],p=0|_e[r>>2],C=0|_e[t>>2],e=0|_e[n>>2],N=0|_e[i>>2],y=0|_e[a>>2],O=0|_e[o>>2],v=0|_e[u>>2],k=0|_e[f>>2],g=0|_e[l>>2],L=0|_e[s>>2],I=0|_e[c>>2],F=G=D=w=0;U=0|Ae(b,B),P=P+(0|_e[M+(U<<2)>>2])&7,p=p+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),C=C+(0|_e[M+(U<<2)>>2])&7,e=e+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),N=N+(0|_e[M+(U<<2)>>2])&7,y=y+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),O=O+(0|_e[M+(U<<2)>>2])&7,v=v+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),k=k+(0|_e[M+(U<<2)>>2])&7,g=g+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),L=L+(0|_e[M+(U<<2)>>2])&7,I=I+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),w=w+(0|_e[M+(U<<2)>>2])&7,D=D+(0|_e[m+(U<<2)>>2])&7,U=0|Ae(b,B),G=G+(0|_e[M+(U<<2)>>2])&7,F=F+(0|_e[m+(U<<2)>>2])&7,U=0|de[1445+y>>0],W[R>>1]=(0|de[1445+p>>0])<<3|0|de[1445+P>>0]|(0|de[1445+C>>0])<<6|(0|de[1445+e>>0])<<9|(0|de[1445+N>>0])<<12|U<<15,h=0|de[1445+L>>0],W[R+2>>1]=(0|de[1445+O>>0])<<2|U>>>1|(0|de[1445+v>>0])<<5|(0|de[1445+k>>0])<<8|(0|de[1445+g>>0])<<11|h<<14,W[R+4>>1]=(0|de[1445+I>>0])<<1|h>>>2|(0|de[1445+w>>0])<<4|(0|de[1445+D>>0])<<7|(0|de[1445+G>>0])<<10|(0|de[1445+F>>0])<<13,!(A>>>0<=(x=x+1|0)>>>0);)R=R+6|0;_e[S>>2]=P,_e[r>>2]=p,_e[t>>2]=C,_e[n>>2]=e,_e[i>>2]=N,_e[a>>2]=y,_e[o>>2]=O,_e[u>>2]=v,_e[f>>2]=k,_e[l>>2]=g,_e[s>>2]=L,_e[c>>2]=I,_e[_>>2]=w,_e[d>>2]=D,_e[E>>2]=G,_e[T>>2]=F,R=1}}while(0)}else R=0;return re(B),Te=H,0|(U=R)}(e))return 0|(i=1)}return(i=0)|i}return _e[e+88>>2]=0,(i=0)|i}(f,e,r))return Te=_,0|(d=f);return U(f),Te=(7&f?(_e[s>>2]=866,_e[s+4>>2]=2506,_e[s+8>>2]=1232,Ce(u,812,s),be(u)):ue(f,0,0,1,0),_),(d=0)|d}(e,r),r=a+i|0;do{if(i>>>0<r>>>0){if(!_){for(n=t;n=n+(0|ie(0|ie((l+3|0)>>>2,d),(s+3|0)>>>2))|0,(0|(i=i+1|0))!=(0|r);)s>>>=1,l>>>=1;_e[u>>2]=n;break}for(e=s,n=t;s=0|ie((l+3|0)>>>2,d),15<i>>>0|(c=0|ie(s,(e+3|0)>>>2))>>>0<8||519686845!=(0|_e[_>>2])||(function(e,r,t,n,i){r|=0,t|=0,n|=0,i|=0;var a=0,o=0,u=0,f=0,l=0,s=0;Te=(s=Te)+528|0,f=(l=s)+16|0,o=0|_e[88+(e|=0)>>2],u=(0|de[70+o+(i<<2)+1>>0])<<16|(0|de[70+o+(i<<2)>>0])<<24|(0|de[70+o+(i<<2)+2>>0])<<8|0|de[70+o+(i<<2)+3>>0],a=(a=i+1|0)>>>0<(0|de[16+o>>0])>>>0?(0|de[70+o+(a<<2)+1>>0])<<16|(0|de[70+o+(a<<2)>>0])<<24|(0|de[70+o+(a<<2)+2>>0])<<8|0|de[70+o+(a<<2)+3>>0]:0|_e[e+8>>2];if(u>>>0<a>>>0)return f=0|_e[(f=e+4|0)>>2],l=0|Y(e,f=f+u|0,l=a-u|0,r,t,n,i),Te=s;_e[l>>2]=866,_e[l+4>>2]=3694,_e[l+8>>2]=1508,Ce(f,812,l),be(f),f=0|_e[(f=e+4|0)>>2],l=0|Y(e,f=f+u|0,l=a-u|0,r,t,n,i),Te=s}(_,u,c,s,i),n=0|_e[u>>2]),n=n+c|0,_e[u>>2]=n,(0|(i=i+1|0))!=(0|r);)e>>>=1,l>>>=1}}while(0);if(_){if(519686845==(0|_e[_>>2]))return U(_),7&_?(_e[f>>2]=866,_e[4+f>>2]=2506,_e[8+f>>2]=1232,Ce(o,812,f),be(o)):ue(_,0,0,1,0),void(Te=E);Te=E}else Te=E},_memset:ne,_sbrk:me,_memcpy:K,stackAlloc:function(e){var r=Te;return Te=(Te=Te+(e|=0)|0)+15&-16,0|r},_crn_get_height:function(e,r){e|=0,r|=0;var t,n=Te;return Te=Te+48|0,_e[(t=n)>>2]=40,q(e,r,t),Te=n,0|_e[t+8>>2]},dynCall_vi:function(e,r){r|=0,Je[7&(e|=0)](0|r)},getTempRet0:function(){return 0|L},_crn_get_levels:function(e,r){e|=0,r|=0;var t,n=Te;return Te=Te+48|0,_e[(t=n)>>2]=40,q(e,r,t),Te=n,0|_e[t+12>>2]},_crn_get_uncompressed_size:function(e,r,t){e|=0,r|=0,t|=0;var n,i,a,o,u=0,f=Te;switch(Te=Te+576|0,a=f+40|0,i=f+56|0,_e[(o=f)>>2]=40,q(e,r,o),n=(3+((0|_e[o+4>>2])>>>t)|0)>>>2,r=(3+((0|_e[o+8>>2])>>>t)|0)>>>2,e=0|_e[(t=o+32|0)+4>>2],0|_e[t>>2]){case 0:e?u=14:e=8;break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:u=e?14:13;break;case 9:case 10:e?u=14:e=8;break;default:u=14}return 13==(0|u)?e=16:14==(0|u)&&(_e[a>>2]=866,_e[4+a>>2]=2672,_e[8+a>>2]=1251,Ce(i,812,a),be(i),e=0),o=0|ie(0|ie(r,n),e),Te=f,0|o},_i64Add:ge,dynCall_iiii:function(e,r,t,n){return r|=0,t|=0,n|=0,0|ze[7&(e|=0)](0|r,0|t,0|n)},_emscripten_get_global_libc:function(){return 5072},dynCall_ii:function(e,r){return r|=0,0|$e[1&(e|=0)](0|r)},___udivdi3:Fe,_llvm_bswap_i32:xe,dynCall_viiiii:function(e,r,t,n,i,a){r|=0,t|=0,n|=0,i|=0,a|=0,je[3&(e|=0)](0|r,0|t,0|n,0|i,0|a)},___cxa_can_catch:function(e,r,t){e|=0,r|=0,t|=0;var n,i=Te;return Te=Te+16|0,_e[(n=i)>>2]=_e[t>>2],(e=0|ze[7&_e[16+(0|_e[e>>2])>>2]](e,r,n))&&(_e[t>>2]=_e[n>>2]),Te=i,1&e|0},_free:F,runPostSets:function(){},dynCall_viiiiii:function(e,r,t,n,i,a,o){r|=0,t|=0,n|=0,i|=0,a|=0,o|=0,Qe[3&(e|=0)](0|r,0|t,0|n,0|i,0|a,0|o)},establishStackSpace:function(e,r){Te=e|=0,r|=0},___uremdi3:Pe,___cxa_is_pointer_type:function(e){return 1&(e=(e|=0)?0!=(0|J(e,32,88,0)):0)|0},stackRestore:function(e){Te=e|=0},_malloc:I,_emscripten_replace_memory:function(e){return!(16777215&c(e)||c(e)<=16777215||2147483648<c(e))&&(ce=new n(e),W=new i(e),_e=new a(e),de=new o(e),Ee=new u(e),new f(e),new l(e),k=new s(e),!0)},dynCall_v:function(e){qe[3&(e|=0)]()},_crn_get_width:function(e,r){e|=0,r|=0;var t,n=Te;return Te=Te+48|0,_e[(t=n)>>2]=40,q(e,r,t),Te=n,0|_e[t+4>>2]},_crn_get_dxt_format:function(e,r){e|=0,r|=0;var t,n=Te;return Te=Te+48|0,_e[(t=n)>>2]=40,q(e,r,t),Te=n,0|_e[t+32>>2]}}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),stackSave=Module.stackSave=asm.stackSave,getTempRet0=Module.getTempRet0=asm.getTempRet0,_memset=Module._memset=asm._memset,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,setTempRet0=Module.setTempRet0=asm.setTempRet0,_crn_decompress=Module._crn_decompress=asm._crn_decompress,_crn_get_bytes_per_block=Module._crn_get_bytes_per_block=asm._crn_get_bytes_per_block,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,_crn_get_height=Module._crn_get_height=asm._crn_get_height,_i64Subtract=Module._i64Subtract=asm._i64Subtract,_crn_get_levels=Module._crn_get_levels=asm._crn_get_levels,_crn_get_uncompressed_size=Module._crn_get_uncompressed_size=asm._crn_get_uncompressed_size,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,___udivdi3=Module.___udivdi3=asm.___udivdi3,_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,___cxa_can_catch=Module.___cxa_can_catch=asm.___cxa_can_catch,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,___uremdi3=Module.___uremdi3=asm.___uremdi3,___cxa_is_pointer_type=Module.___cxa_is_pointer_type=asm.___cxa_is_pointer_type,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,_emscripten_replace_memory=Module._emscripten_replace_memory=asm._emscripten_replace_memory,_crn_get_width=Module._crn_get_width=asm._crn_get_width,_crn_get_dxt_format=Module._crn_get_dxt_format=asm._crn_get_dxt_format,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii,initialStackTop;function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function run(e){function r(){Module.calledRun||(Module.calledRun=!0,ABORT||(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(e),postRun()))}e=e||Module.arguments,0<runDependencies||(preRun(),0<runDependencies||Module.calledRun||(Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),r()},1)):r()))}function exit(e,r){r&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(e)),ENVIRONMENT_IS_NODE&&process.exit(e),Module.quit(e,new ExitStatus(e)))}Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm,ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus,dependenciesFulfilled=function e(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=e)},Module.callMain=Module.callMain=function(e){e=e||[],ensureInitRuntime();var r=e.length+1;function t(){for(var e=0;e<3;e++)n.push(0)}var n=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];t();for(var i=0;i<r-1;i+=1)n.push(allocate(intArrayFromString(e[i]),"i8",ALLOC_NORMAL)),t();n.push(0),n=allocate(n,"i32",ALLOC_NORMAL);try{exit(Module._main(r,n,0),!0)}catch(e){if(e instanceof ExitStatus)return;if("SimulateInfiniteLoop"==e)return void(Module.noExitRuntime=!0);var a=e;e&&"object"==typeof e&&e.stack&&(a=[e,e.stack]),Module.printErr("exception thrown: "+a),Module.quit(1,e)}},Module.run=Module.run=run,Module.exit=Module.exit=exit;var abortDecorators=[];function abort(r){Module.onAbort&&Module.onAbort(r),r=void 0!==r?(Module.print(r),Module.printErr(r),JSON.stringify(r)):"",ABORT=!0;var t="abort("+r+") at "+stackTrace()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";throw abortDecorators&&abortDecorators.forEach(function(e){t=e(t,r)}),t}if(Module.abort=Module.abort=abort,Module.preInit)for("function"==typeof Module.preInit&&(Module.preInit=[Module.preInit]);0<Module.preInit.length;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),Module.noExitRuntime=!0,run();var crunch=Module,CRN_FORMAT={cCRNFmtInvalid:-1,cCRNFmtDXT1:0,cCRNFmtDXT3:1,cCRNFmtDXT5:2},DXT_FORMAT_MAP={},dst,dxtData;DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1]=PixelFormat$1.RGB_DXT1,DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3]=PixelFormat$1.RGBA_DXT3,DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5]=PixelFormat$1.RGBA_DXT5;var cachedDstSize=0;function arrayBufferCopy(e,r,t,n){for(var i=t/4,a=n%4,o=new Uint32Array(e.buffer,0,(n-a)/4),u=new Uint32Array(r.buffer),f=0;f<o.length;f++)u[i+f]=o[f];for(f=n-a;f<n;f++)r[t+f]=e[f]}function transcodeCRNToDXT(e,r){var t=e.byteLength,n=new Uint8Array(e),i=crunch._malloc(t);arrayBufferCopy(n,crunch.HEAPU8,i,t);var a=crunch._crn_get_dxt_format(i,t),o=DXT_FORMAT_MAP[a];if(!when.defined(o))throw new RuntimeError.RuntimeError("Unsupported compressed format.");for(var u=crunch._crn_get_levels(i,t),f=crunch._crn_get_width(i,t),l=crunch._crn_get_height(i,t),s=0,c=0;c<u;++c)s+=PixelFormat$1.compressedTextureSizeInBytes(o,f>>c,l>>c);cachedDstSize<s&&(when.defined(dst)&&crunch._free(dst),dst=crunch._malloc(s),dxtData=new Uint8Array(crunch.HEAPU8.buffer,dst,s),cachedDstSize=s),crunch._crn_decompress(i,t,dst,s,0,u),crunch._free(i);var _=PixelFormat$1.compressedTextureSizeInBytes(o,f,l),d=dxtData.subarray(0,_),E=new Uint8Array(_);return E.set(d,0),r.push(E.buffer),new CompressedTextureBuffer(o,f,l,E)}var transcodeCRNToDXT$1=createTaskProcessorWorker(transcodeCRNToDXT);return transcodeCRNToDXT$1}); diff --git a/web/assets/Cesium/Workers/transferTypedArrayTest.js b/web/assets/Cesium/Workers/transferTypedArrayTest.js new file mode 100644 index 00000000..453adf28 --- /dev/null +++ b/web/assets/Cesium/Workers/transferTypedArrayTest.js @@ -0,0 +1 @@ +"undefined"==typeof self&&(self={}),self.onmessage=function(e){"use strict";var s=e.data.array,a=self.webkitPostMessage||self.postMessage;try{a({array:s},[s.buffer])}catch(e){a({})}}; \ No newline at end of file diff --git a/web/assets/Cesium/Workers/upsampleQuantizedTerrainMesh.js b/web/assets/Cesium/Workers/upsampleQuantizedTerrainMesh.js new file mode 100644 index 00000000..a14be6f4 --- /dev/null +++ b/web/assets/Cesium/Workers/upsampleQuantizedTerrainMesh.js @@ -0,0 +1 @@ +define(["./when-54c2dc71","./Check-6c0211bc","./Math-fc8cecf5","./Cartesian2-bddc1162","./Transforms-ec27f304","./RuntimeError-2109023a","./WebGLConstants-76bb35d1","./ComponentDatatype-6d99a1ee","./AttributeCompression-9fc99391","./IndexDatatype-53503fee","./IntersectionTests-2626c9e9","./Plane-231f1723","./createTaskProcessorWorker","./EllipsoidTangentPlane-ed172748","./OrientedBoundingBox-c9ad91c4","./TerrainEncoding-b34235ca"],function(w,e,ce,ge,me,t,i,n,s,xe,r,h,u,o,ve,we){"use strict";var Ce={clipTriangleAtAxisAlignedThreshold:function(e,t,i,n,s,r){var h,u,o;w.defined(r)?r.length=0:r=[],o=t?(h=i<e,u=n<e,s<e):(h=e<i,u=e<n,e<s);var a,p,d,f,l,c,g=h+u+o;return 1===g?h?(a=(e-i)/(n-i),p=(e-i)/(s-i),r.push(1),r.push(2),1!==p&&(r.push(-1),r.push(0),r.push(2),r.push(p)),1!==a&&(r.push(-1),r.push(0),r.push(1),r.push(a))):u?(d=(e-n)/(s-n),f=(e-n)/(i-n),r.push(2),r.push(0),1!==f&&(r.push(-1),r.push(1),r.push(0),r.push(f)),1!==d&&(r.push(-1),r.push(1),r.push(2),r.push(d))):o&&(l=(e-s)/(i-s),c=(e-s)/(n-s),r.push(0),r.push(1),1!==c&&(r.push(-1),r.push(2),r.push(1),r.push(c)),1!==l&&(r.push(-1),r.push(2),r.push(0),r.push(l))):2===g?h||i===e?u||n===e?o||s===e||(p=(e-i)/(s-i),d=(e-n)/(s-n),r.push(2),r.push(-1),r.push(0),r.push(2),r.push(p),r.push(-1),r.push(1),r.push(2),r.push(d)):(c=(e-s)/(n-s),a=(e-i)/(n-i),r.push(1),r.push(-1),r.push(2),r.push(1),r.push(c),r.push(-1),r.push(0),r.push(1),r.push(a)):(f=(e-n)/(i-n),l=(e-s)/(i-s),r.push(0),r.push(-1),r.push(1),r.push(0),r.push(f),r.push(-1),r.push(2),r.push(0),r.push(l)):3!==g&&(r.push(0),r.push(1),r.push(2)),r},computeBarycentricCoordinates:function(e,t,i,n,s,r,h,u,o){var a=i-h,p=h-s,d=r-u,f=n-u,l=1/(d*a+p*f),c=t-u,g=e-h,m=(d*g+p*c)*l,x=(-f*g+a*c)*l,v=1-m-x;return w.defined(o)?(o.x=m,o.y=x,o.z=v,o):new ge.Cartesian3(m,x,v)},computeLineSegmentLineSegmentIntersection:function(e,t,i,n,s,r,h,u,o){var a=(u-r)*(i-e)-(h-s)*(n-t);if(0!=a){var p=((h-s)*(t-r)-(u-r)*(e-s))/a,d=((i-e)*(t-r)-(n-t)*(e-s))/a;return 0<=p&&p<=1&&0<=d&&d<=1?(w.defined(o)||(o=new ge.Cartesian2),o.x=e+p*(i-e),o.y=t+p*(n-t),o):void 0}}},ye=32767,Be=16383,Ie=[],Ae=[],be=[],Te=new ge.Cartographic,ze=new ge.Cartesian3,Me=[],Ne=[],Ve=[],Ee=[],Re=[],He=new ge.Cartesian3,Oe=new me.BoundingSphere,Se=new ve.OrientedBoundingBox,Ue=new ge.Cartesian2,Fe=new ge.Cartesian3;function Pe(){this.vertexBuffer=void 0,this.index=void 0,this.first=void 0,this.second=void 0,this.ratio=void 0}Pe.prototype.clone=function(e){return w.defined(e)||(e=new Pe),e.uBuffer=this.uBuffer,e.vBuffer=this.vBuffer,e.heightBuffer=this.heightBuffer,e.normalBuffer=this.normalBuffer,e.index=this.index,e.first=this.first,e.second=this.second,e.ratio=this.ratio,e},Pe.prototype.initializeIndexed=function(e,t,i,n,s){this.uBuffer=e,this.vBuffer=t,this.heightBuffer=i,this.normalBuffer=n,this.index=s,this.first=void 0,this.second=void 0,this.ratio=void 0},Pe.prototype.initializeFromClipResult=function(e,t,i){var n=t+1;return-1!==e[t]?i[e[t]].clone(this):(this.vertexBuffer=void 0,this.index=void 0,this.first=i[e[n]],++n,this.second=i[e[n]],++n,this.ratio=e[n],++n),n},Pe.prototype.getKey=function(){return this.isIndexed()?this.index:JSON.stringify({first:this.first.getKey(),second:this.second.getKey(),ratio:this.ratio})},Pe.prototype.isIndexed=function(){return w.defined(this.index)},Pe.prototype.getH=function(){return w.defined(this.index)?this.heightBuffer[this.index]:ce.CesiumMath.lerp(this.first.getH(),this.second.getH(),this.ratio)},Pe.prototype.getU=function(){return w.defined(this.index)?this.uBuffer[this.index]:ce.CesiumMath.lerp(this.first.getU(),this.second.getU(),this.ratio)},Pe.prototype.getV=function(){return w.defined(this.index)?this.vBuffer[this.index]:ce.CesiumMath.lerp(this.first.getV(),this.second.getV(),this.ratio)};var a=new ge.Cartesian2,p=-1,d=[new ge.Cartesian3,new ge.Cartesian3],f=[new ge.Cartesian3,new ge.Cartesian3];function l(e,t){var i=d[++p],n=f[p],i=s.AttributeCompression.octDecode(e.first.getNormalX(),e.first.getNormalY(),i),n=s.AttributeCompression.octDecode(e.second.getNormalX(),e.second.getNormalY(),n);return ze=ge.Cartesian3.lerp(i,n,e.ratio,ze),ge.Cartesian3.normalize(ze,ze),s.AttributeCompression.octEncode(ze,t),--p,t}Pe.prototype.getNormalX=function(){return w.defined(this.index)?this.normalBuffer[2*this.index]:(a=l(this,a)).x},Pe.prototype.getNormalY=function(){return w.defined(this.index)?this.normalBuffer[2*this.index+1]:(a=l(this,a)).y};var g=[];function ke(e,t,i,n,s,r,h,u,o){if(0!==h.length){for(var a=0,p=0;p<h.length;)p=g[a++].initializeFromClipResult(h,p,u);for(var d=0;d<a;++d){var f,l,c=g[d];c.isIndexed()?(c.newIndex=r[c.index],c.uBuffer=e,c.vBuffer=t,c.heightBuffer=i,o&&(c.normalBuffer=n)):(f=c.getKey(),w.defined(r[f])?c.newIndex=r[f]:(l=e.length,e.push(c.getU()),t.push(c.getV()),i.push(c.getH()),o&&(n.push(c.getNormalX()),n.push(c.getNormalY())),c.newIndex=l,r[f]=l))}3===a?(s.push(g[0].newIndex),s.push(g[1].newIndex),s.push(g[2].newIndex)):4===a&&(s.push(g[0].newIndex),s.push(g[1].newIndex),s.push(g[2].newIndex),s.push(g[0].newIndex),s.push(g[2].newIndex),s.push(g[3].newIndex))}}return g.push(new Pe),g.push(new Pe),g.push(new Pe),g.push(new Pe),u(function(e,t){var i=e.isEastChild,n=e.isNorthChild,s=i?Be:0,r=i?ye:Be,h=n?Be:0,u=n?ye:Be,o=Me,a=Ne,p=Ve,d=Re;o.length=0,a.length=0,p.length=0,d.length=0;var f=Ee;f.length=0;for(var l={},c=e.vertices,g=(g=e.indices).subarray(0,e.indexCountWithoutSkirts),m=we.TerrainEncoding.clone(e.encoding),x=m.hasVertexNormals,v=e.exaggeration,w=0,C=e.vertexCountWithoutSkirts,y=e.minimumHeight,B=e.maximumHeight,I=new Array(C),A=new Array(C),b=new Array(C),T=x?new Array(2*C):void 0,z=0,M=0;z<C;++z,M+=2){var N,V=m.decodeTextureCoordinates(c,z,Ue),E=m.decodeHeight(c,z)/v,R=ce.CesiumMath.clamp(V.x*ye|0,0,ye),H=ce.CesiumMath.clamp(V.y*ye|0,0,ye);b[z]=ce.CesiumMath.clamp((E-y)/(B-y)*ye|0,0,ye),R<20&&(R=0),H<20&&(H=0),ye-R<20&&(R=ye),ye-H<20&&(H=ye),I[z]=R,A[z]=H,x&&(N=m.getOctEncodedNormal(c,z,Fe),T[M]=N.x,T[M+1]=N.y),(i&&Be<=R||!i&&R<=Be)&&(n&&Be<=H||!n&&H<=Be)&&(l[z]=w,o.push(R),a.push(H),p.push(b[z]),x&&(d.push(T[M]),d.push(T[M+1])),++w)}var O=[];O.push(new Pe),O.push(new Pe),O.push(new Pe);var S=[];for(S.push(new Pe),S.push(new Pe),S.push(new Pe),z=0;z<g.length;z+=3){var U=g[z],F=g[z+1],P=g[z+2],k=I[U],D=I[F],W=I[P];O[0].initializeIndexed(I,A,b,T,U),O[1].initializeIndexed(I,A,b,T,F),O[2].initializeIndexed(I,A,b,T,P);var X,K=Ce.clipTriangleAtAxisAlignedThreshold(Be,i,k,D,W,Ie);K.length<=0||(X=S[0].initializeFromClipResult(K,0,O))>=K.length||(X=S[1].initializeFromClipResult(K,X,O))>=K.length||(X=S[2].initializeFromClipResult(K,X,O),ke(o,a,p,d,f,l,Ce.clipTriangleAtAxisAlignedThreshold(Be,n,S[0].getV(),S[1].getV(),S[2].getV(),Ae),S,x),X<K.length&&(S[2].clone(S[1]),S[2].initializeFromClipResult(K,X,O),ke(o,a,p,d,f,l,Ce.clipTriangleAtAxisAlignedThreshold(Be,n,S[0].getV(),S[1].getV(),S[2].getV(),Ae),S,x)))}var L=i?-ye:0,Y=n?-ye:0,_=[],G=[],J=[],Z=[],j=Number.MAX_VALUE,q=-j,Q=be;Q.length=0;var $=ge.Ellipsoid.clone(e.ellipsoid),ee=ge.Rectangle.clone(e.childRectangle),te=ee.north,ie=ee.south,ne=ee.east,se=ee.west;for(ne<se&&(ne+=ce.CesiumMath.TWO_PI),z=0;z<o.length;++z)R=(R=Math.round(o[z]))<=s?(_.push(z),0):r<=R?(J.push(z),ye):2*R+L,o[z]=R,H=(H=Math.round(a[z]))<=h?(G.push(z),0):u<=H?(Z.push(z),ye):2*H+Y,a[z]=H,(E=ce.CesiumMath.lerp(y,B,p[z]/ye))<j&&(j=E),q<E&&(q=E),p[z]=E,Te.longitude=ce.CesiumMath.lerp(se,ne,R/ye),Te.latitude=ce.CesiumMath.lerp(ie,te,H/ye),Te.height=E,$.cartographicToCartesian(Te,ze),Q.push(ze.x),Q.push(ze.y),Q.push(ze.z);var re=me.BoundingSphere.fromVertices(Q,ge.Cartesian3.ZERO,3,Oe),he=ve.OrientedBoundingBox.fromRectangle(ee,j,q,$,Se),ue=new we.EllipsoidalOccluder($).computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid(re.center,Q,3,re.center,j,He),oe=q-j,ae=new Uint16Array(o.length+a.length+p.length);for(z=0;z<o.length;++z)ae[z]=o[z];var pe=o.length;for(z=0;z<a.length;++z)ae[pe+z]=a[z];for(pe+=a.length,z=0;z<p.length;++z)ae[pe+z]=ye*(p[z]-j)/oe;var de,fe,le=xe.IndexDatatype.createTypedArray(o.length,f);return x?(fe=new Uint8Array(d),t.push(ae.buffer,le.buffer,fe.buffer),de=fe.buffer):t.push(ae.buffer,le.buffer),{vertices:ae.buffer,encodedNormals:de,indices:le.buffer,minimumHeight:j,maximumHeight:q,westIndices:_,southIndices:G,eastIndices:J,northIndices:Z,boundingSphere:re,orientedBoundingBox:he,horizonOcclusionPoint:ue}})}); diff --git a/web/assets/Cesium/Workers/when-54c2dc71.js b/web/assets/Cesium/Workers/when-54c2dc71.js new file mode 100644 index 00000000..a9233c34 --- /dev/null +++ b/web/assets/Cesium/Workers/when-54c2dc71.js @@ -0,0 +1 @@ +define(["exports"],function(n){"use strict";function r(n,r){return null!=n?n:r}var t,e,h;function j(n,r,t,e){return l(n).then(r,t,e)}function l(n){var r,t,e=n instanceof a?n:u(n)?(r=m(),n.then(function(n){r.resolve(n)},function(n){r.reject(n)},function(n){r.progress(n)}),r.promise):(t=n,new a(function(n){try{return l(n?n(t):t)}catch(n){return p(n)}}));return e}function a(n){this.then=n}function p(t){return new a(function(n,r){try{return r?l(r(t)):p(t)}catch(n){return p(n)}})}function m(){var n=new a(u),i=[],c=[],e=function(r,t,e){var u=m(),o="function"==typeof e?function(n){try{u.progress(e(n))}catch(n){u.progress(n)}}:function(n){u.progress(n)};return i.push(function(n){n.then(r,t).then(u.resolve,u.reject,o)}),c.push(o),u.promise},r=function(n){return v(c,n),n},t=function(n){return n=l(n),e=n.then,t=l,r=w,v(i,n),c=i=h,n};return{then:u,resolve:o,reject:f,progress:s,promise:n,resolver:{resolve:o,reject:f,progress:s}};function u(n,r,t){return e(n,r,t)}function o(n){return t(n)}function f(n){return t(p(n))}function s(n){return r(n)}}function u(n){return n&&"function"==typeof n.then}function o(n,p,v,g,y){return f(2,arguments),j(n,function(n){var r,t,e,u,o=n.length>>>0,i=Math.max(0,Math.min(p,o)),c=[],f=o-i+1,s=[],h=m();if(i)for(e=h.progress,t=function(n){s.push(n),--f||(r=t=w,h.reject(s))},r=function(n){c.push(n),--i||(r=t=w,h.resolve(c))},u=0;u<o;++u)u in n&&j(n[u],a,l,e);else h.resolve(c);return h.then(v,g,y);function l(n){t(n)}function a(n){r(n)}})}function i(n,r,t,e){return f(1,arguments),c(n,s).then(r,t,e)}function c(n,c){return j(n,function(n){var r,t,e,u=r=n.length>>>0,o=[],i=m();if(u)for(t=function(n,r){j(n,c).then(function(n){o[r]=n,--u||i.resolve(o)},i.reject)},e=0;e<r;e++)e in n?t(n[e],e):--u;else i.resolve(o);return i.promise})}function v(n,r){for(var t,e=0;t=n[e++];)t(r)}function f(n,r){for(var t,e=r.length;n<e;)if(null!=(t=r[--e])&&"function"!=typeof t)throw new Error("arg "+e+" must be a function")}function w(){}function s(n){return n}r.EMPTY_OBJECT=Object.freeze({}),j.defer=m,j.resolve=l,j.reject=function(n){return j(n,p)},j.join=function(){return c(arguments,s)},j.all=i,j.map=c,j.reduce=function(n,o){var r=e.call(arguments,1);return j(n,function(n){var u=n.length;return r[0]=function(n,t,e){return j(n,function(r){return j(t,function(n){return o(r,n,e,u)})})},t.apply(n,r)})},j.any=function(n,r,t,e){return o(n,1,function(n){return r?r(n[0]):n[0]},t,e)},j.some=o,j.chain=function(n,r,t){var e=2<arguments.length;return j(n,function(n){return n=e?t:n,r.resolve(n),n},function(n){return r.reject(n),p(n)},r.progress)},j.isPromise=u,a.prototype={always:function(n,r){return this.then(n,n,r)},otherwise:function(n){return this.then(h,n)},yield:function(n){return this.then(function(){return n})},spread:function(r){return this.then(function(n){return i(n,function(n){return r.apply(h,n)})})}},e=[].slice,t=[].reduce||function(n){var r,t=0,e=Object(this),u=e.length>>>0,o=arguments;if(o.length<=1)for(;;){if(t in e){r=e[t++];break}if(++t>=u)throw new TypeError}else r=o[1];for(;t<u;++t)t in e&&(r=n(r,e[t],t,e));return r},n.defaultValue=r,n.defined=function(n){return null!=n},n.when=j}); diff --git a/web/index.html b/web/index.html index f287933f..c25ef1f0 100644 --- a/web/index.html +++ b/web/index.html @@ -9,6 +9,7 @@ <link rel="shortcut icon" href="favicon.ico"> <link rel="manifest" href="manifest.json"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> + <link href="assets/Cesium/Widgets/widgets.css" rel="stylesheet" /> <link href="build/ShadowEditor.css" rel="stylesheet" /> </head> @@ -28,6 +29,7 @@ <script src="assets/js/libs/SPE.js"></script> <script src="assets/js/libs/VolumetricFire.js"></script> + <script src="assets/Cesium/Cesium.js"></script> <script src="build/ShadowEditor.js"></script> <script> let app = null; diff --git a/web/src/editor/menu/SceneMenu.jsx b/web/src/editor/menu/SceneMenu.jsx index 03444ed0..d8d95d19 100644 --- a/web/src/editor/menu/SceneMenu.jsx +++ b/web/src/editor/menu/SceneMenu.jsx @@ -16,7 +16,6 @@ import SaveSceneWindow from './window/SaveSceneWindow.jsx'; import EmptySceneTemplate from './scene/EmptySceneTemplate'; // import DistrictSceneTemplate from './scene/DistrictSceneTemplate'; // import GISSceneTemplate from './scene/GISSceneTemplate'; -import WorldWind from '../../gis/WorldWind'; import global from '../../global'; /** @@ -187,19 +186,18 @@ class SceneMenu extends React.Component { if (global.app.editor.gis) { global.app.editor.gis.stop(); } - - let context = global.app.editor.renderer.getContext(); - context.activeTexture(context.TEXTURE0); - let map = new WorldWind.WorldWindow(context); - map.addLayer(new WorldWind.StarFieldLayer()); - map.addLayer(new WorldWind.AtmosphereLayer()); - map.addLayer(new WorldWind.XYZLayer()); - window.map = map; - global.app.options.sceneType = 'GIS'; global.app.editor.camera.userData.control = ''; - + global.app.call(`optionChange`, this, 'sceneType', 'GIS'); global.app.call(`sceneGraphChanged`, this); + + setTimeout(() => { + var viewer = new Cesium.Viewer(global.app.cesiumRef); + var terrainProvider = new Cesium.ArcGISTiledElevationTerrainProvider({ + url: 'https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer' + }); + viewer.terrainProvider = terrainProvider; + }); } // --------------------------- 保存场景 ---------------------------------------- diff --git a/web/src/editor/viewport/Viewport.jsx b/web/src/editor/viewport/Viewport.jsx index f9904ccc..83ac0efa 100644 --- a/web/src/editor/viewport/Viewport.jsx +++ b/web/src/editor/viewport/Viewport.jsx @@ -23,8 +23,11 @@ class Viewport extends React.Component { this.viewportRef = React.createRef(); this.editorRef = React.createRef(); + this.cesiumRef = React.createRef(); this.svgRef = React.createRef(); this.playerRef = React.createRef(); + + this.handleOptionChanged = this.handleOptionChanged.bind(this); } render() { @@ -35,6 +38,10 @@ class Viewport extends React.Component { ref={this.editorRef} tabIndex={0} /> + <div className={'cesium'} + ref={this.cesiumRef} + tabIndex={10} + /> <VisualDOM className={'svg'} ref={this.svgRef} /> @@ -48,6 +55,7 @@ class Viewport extends React.Component { componentDidMount() { global.app.viewportRef = this.viewportRef.current; global.app.editorRef = this.editorRef.current; + global.app.cesiumRef = this.cesiumRef.current; global.app.svgRef = this.svgRef.current; global.app.visual = this.svgRef.current; global.app.playerRef = this.playerRef.current; @@ -78,6 +86,21 @@ class Viewport extends React.Component { enableThrowBall: false, showStats: false }); + + global.app.on(`optionChange.Viewport`, this.handleOptionChanged); + } + + handleOptionChanged(key, value) { + if (key !== 'sceneType') { + return; + } + if (value === 'GIS') { // GIS + this.editorRef.current.style.display = 'none'; + this.cesiumRef.current.style.display = 'block'; + } else { // Empty + this.cesiumRef.current.style.display = 'none'; + this.editorRef.current.style.display = 'block'; + } } } diff --git a/web/src/editor/viewport/css/Viewport.css b/web/src/editor/viewport/css/Viewport.css index dd15bf81..73d5e77c 100644 --- a/web/src/editor/viewport/css/Viewport.css +++ b/web/src/editor/viewport/css/Viewport.css @@ -13,13 +13,22 @@ height: 100%; } +.Viewport>.cesium { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + display: none; +} + .Viewport>.svg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; - pointer-events: none; + display: none; } .Viewport>.player { diff --git a/web/src/gis/BasicWorldWindowController.js b/web/src/gis/BasicWorldWindowController.js deleted file mode 100644 index 660ea1dc..00000000 --- a/web/src/gis/BasicWorldWindowController.js +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports BasicWorldWindowController - */ -import Angle from './geom/Angle'; -import DragRecognizer from './gesture/DragRecognizer'; -import GestureRecognizer from './gesture/GestureRecognizer'; -import Matrix from './geom/Matrix'; -import PanRecognizer from './gesture/PanRecognizer'; -import PinchRecognizer from './gesture/PinchRecognizer'; -import RotationRecognizer from './gesture/RotationRecognizer'; -import TiltRecognizer from './gesture/TiltRecognizer'; -import Vec2 from './geom/Vec2'; -import Vec3 from './geom/Vec3'; -import WorldWindowController from './WorldWindowController'; -import WWMath from './util/WWMath'; - - -/** - * Constructs a window controller with basic capabilities. - * @alias BasicWorldWindowController - * @constructor - * @augments WorldWindowController - * @classDesc This class provides the default window controller for WorldWind for controlling the globe via user interaction. - * @param {WorldWindow} worldWindow The WorldWindow associated with this layer. - */ -function BasicWorldWindowController(worldWindow) { - WorldWindowController.call(this, worldWindow); // base class checks for a valid worldWindow - - // Intentionally not documented. - this.primaryDragRecognizer = new DragRecognizer(this.wwd, null); - this.primaryDragRecognizer.addListener(this); - - // Intentionally not documented. - this.secondaryDragRecognizer = new DragRecognizer(this.wwd, null); - this.secondaryDragRecognizer.addListener(this); - this.secondaryDragRecognizer.button = 2; // secondary mouse button - - // Intentionally not documented. - this.panRecognizer = new PanRecognizer(this.wwd, null); - this.panRecognizer.addListener(this); - - // Intentionally not documented. - this.pinchRecognizer = new PinchRecognizer(this.wwd, null); - this.pinchRecognizer.addListener(this); - - // Intentionally not documented. - this.rotationRecognizer = new RotationRecognizer(this.wwd, null); - this.rotationRecognizer.addListener(this); - - // Intentionally not documented. - this.tiltRecognizer = new TiltRecognizer(this.wwd, null); - this.tiltRecognizer.addListener(this); - - // Establish the dependencies between gesture recognizers. The pan, pinch and rotate gesture may recognize - // simultaneously with each other. - this.panRecognizer.recognizeSimultaneouslyWith(this.pinchRecognizer); - this.panRecognizer.recognizeSimultaneouslyWith(this.rotationRecognizer); - this.pinchRecognizer.recognizeSimultaneouslyWith(this.rotationRecognizer); - - // Since the tilt gesture is a subset of the pan gesture, pan will typically recognize before tilt, - // effectively suppressing tilt. Establish a dependency between the other touch gestures and tilt to provide - // tilt an opportunity to recognize. - this.panRecognizer.requireRecognizerToFail(this.tiltRecognizer); - this.pinchRecognizer.requireRecognizerToFail(this.tiltRecognizer); - this.rotationRecognizer.requireRecognizerToFail(this.tiltRecognizer); - - // Intentionally not documented. - // this.tapRecognizer = new TapRecognizer(this.wwd, null); - // this.tapRecognizer.addListener(this); - - // Intentionally not documented. - // this.clickRecognizer = new ClickRecognizer(this.wwd, null); - // this.clickRecognizer.addListener(this); - - // Intentionally not documented. - this.beginPoint = new Vec2(0, 0); - this.lastPoint = new Vec2(0, 0); - this.beginHeading = 0; - this.beginTilt = 0; - this.beginRange = 0; - this.lastRotation = 0; -} - -BasicWorldWindowController.prototype = Object.create(WorldWindowController.prototype); - -// Intentionally not documented. -BasicWorldWindowController.prototype.onGestureEvent = function (e) { - var handled = WorldWindowController.prototype.onGestureEvent.call(this, e); - - if (!handled) { - if (e.type === "wheel") { - handled = true; - this.handleWheelEvent(e); - } - else { - for (var i = 0, len = GestureRecognizer.allRecognizers.length; i < len; i++) { - var recognizer = GestureRecognizer.allRecognizers[i]; - if (recognizer.target === this.wwd) { - handled |= recognizer.onGestureEvent(e); // use or-assignment to indicate if any recognizer handled the event - } - } - } - } - - return handled; -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.gestureStateChanged = function (recognizer) { - if (recognizer === this.primaryDragRecognizer || recognizer === this.panRecognizer) { - this.handlePanOrDrag(recognizer); - } - else if (recognizer === this.secondaryDragRecognizer) { - this.handleSecondaryDrag(recognizer); - } - else if (recognizer === this.pinchRecognizer) { - this.handlePinch(recognizer); - } - else if (recognizer === this.rotationRecognizer) { - this.handleRotation(recognizer); - } - else if (recognizer === this.tiltRecognizer) { - this.handleTilt(recognizer); - } - // else if (recognizer === this.clickRecognizer || recognizer === this.tapRecognizer) { - // this.handleClickOrTap(recognizer); - // } -}; - -// Intentionally not documented. -// BasicWorldWindowController.prototype.handleClickOrTap = function (recognizer) { -// if (recognizer.state === WorldWind.RECOGNIZED) { -// var pickPoint = this.wwd.canvasCoordinates(recognizer.clientX, recognizer.clientY); -// -// // Identify if the top picked object contains a URL for hyperlinking -// var pickList = this.wwd.pick(pickPoint); -// var topObject = pickList.topPickedObject(); -// // If the url object was appended, open the hyperlink -// if (topObject && -// topObject.userObject && -// topObject.userObject.userProperties && -// topObject.userObject.userProperties.url) { -// window.open(topObject.userObject.userProperties.url, "_blank"); -// } -// } -// }; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handlePanOrDrag = function (recognizer) { - if (this.wwd.globe.is2D()) { - this.handlePanOrDrag2D(recognizer); - } else { - this.handlePanOrDrag3D(recognizer); - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handlePanOrDrag3D = function (recognizer) { - var state = recognizer.state, - tx = recognizer.translationX, - ty = recognizer.translationY; - - var navigator = this.wwd.navigator; - if (state === WorldWind.BEGAN) { - this.lastPoint.set(0, 0); - } else if (state === WorldWind.CHANGED) { - // Convert the translation from screen coordinates to arc degrees. Use this navigator's range as a - // metric for converting screen pixels to meters, and use the globe's radius for converting from meters - // to arc degrees. - var canvas = this.wwd.canvas, - globe = this.wwd.globe, - globeRadius = WWMath.max(globe.equatorialRadius, globe.polarRadius), - distance = WWMath.max(1, navigator.range), - metersPerPixel = WWMath.perspectivePixelSize(canvas.clientWidth, canvas.clientHeight, distance), - forwardMeters = (ty - this.lastPoint[1]) * metersPerPixel, - sideMeters = -(tx - this.lastPoint[0]) * metersPerPixel, - forwardDegrees = forwardMeters / globeRadius * Angle.RADIANS_TO_DEGREES, - sideDegrees = sideMeters / globeRadius * Angle.RADIANS_TO_DEGREES; - - // Apply the change in latitude and longitude to this navigator, relative to the current heading. - var sinHeading = Math.sin(navigator.heading * Angle.DEGREES_TO_RADIANS), - cosHeading = Math.cos(navigator.heading * Angle.DEGREES_TO_RADIANS); - - navigator.lookAtLocation.latitude += forwardDegrees * cosHeading - sideDegrees * sinHeading; - navigator.lookAtLocation.longitude += forwardDegrees * sinHeading + sideDegrees * cosHeading; - this.lastPoint.set(tx, ty); - this.applyLimits(); - this.wwd.redraw(); - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handlePanOrDrag2D = function (recognizer) { - var state = recognizer.state, - x = recognizer.clientX, - y = recognizer.clientY, - tx = recognizer.translationX, - ty = recognizer.translationY; - - var navigator = this.wwd.navigator; - if (state === WorldWind.BEGAN) { - this.beginPoint.set(x, y); - this.lastPoint.set(x, y); - } else if (state === WorldWind.CHANGED) { - var x1 = this.lastPoint[0], - y1 = this.lastPoint[1], - x2 = this.beginPoint[0] + tx, - y2 = this.beginPoint[1] + ty; - - this.lastPoint.set(x2, y2); - - var globe = this.wwd.globe, - ray = this.wwd.rayThroughScreenPoint(this.wwd.canvasCoordinates(x1, y1)), - point1 = new Vec3(0, 0, 0), - point2 = new Vec3(0, 0, 0), - origin = new Vec3(0, 0, 0); - - if (!globe.intersectsLine(ray, point1)) { - return; - } - - ray = this.wwd.rayThroughScreenPoint(this.wwd.canvasCoordinates(x2, y2)); - if (!globe.intersectsLine(ray, point2)) { - return; - } - - // Transform the original navigator state's modelview matrix to account for the gesture's change. - var modelview = Matrix.fromIdentity(); - this.wwd.computeViewingTransform(null, modelview); - modelview.multiplyByTranslation(point2[0] - point1[0], point2[1] - point1[1], point2[2] - point1[2]); - - // Compute the globe point at the screen center from the perspective of the transformed navigator state. - modelview.extractEyePoint(ray.origin); - modelview.extractForwardVector(ray.direction); - if (!globe.intersectsLine(ray, origin)) { - return; - } - - // Convert the transformed modelview matrix to a set of navigator properties, then apply those - // properties to this navigator. - var params = modelview.extractViewingParameters(origin, navigator.roll, globe, {}); - navigator.lookAtLocation.copy(params.origin); - navigator.range = params.range; - navigator.heading = params.heading; - navigator.tilt = params.tilt; - navigator.roll = params.roll; - this.applyLimits(); - this.wwd.redraw(); - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handleSecondaryDrag = function (recognizer) { - var state = recognizer.state, - tx = recognizer.translationX, - ty = recognizer.translationY; - - var navigator = this.wwd.navigator; - if (state === WorldWind.BEGAN) { - this.beginHeading = navigator.heading; - this.beginTilt = navigator.tilt; - } else if (state === WorldWind.CHANGED) { - // Compute the current translation from screen coordinates to degrees. Use the canvas dimensions as a - // metric for converting the gesture translation to a fraction of an angle. - var headingDegrees = 180 * tx / this.wwd.canvas.clientWidth, - tiltDegrees = 90 * ty / this.wwd.canvas.clientHeight; - - // Apply the change in heading and tilt to this navigator's corresponding properties. - navigator.heading = this.beginHeading + headingDegrees; - navigator.tilt = this.beginTilt - tiltDegrees; - this.applyLimits(); - this.wwd.redraw(); - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handlePinch = function (recognizer) { - var navigator = this.wwd.navigator; - var state = recognizer.state, - scale = recognizer.scale; - - if (state === WorldWind.BEGAN) { - this.beginRange = navigator.range; - } else if (state === WorldWind.CHANGED) { - if (scale !== 0) { - // Apply the change in pinch scale to this navigator's range, relative to the range when the gesture - // began. - navigator.range = this.beginRange / scale; - this.applyLimits(); - this.wwd.redraw(); - } - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handleRotation = function (recognizer) { - var navigator = this.wwd.navigator; - var state = recognizer.state, - rotation = recognizer.rotation; - - if (state === WorldWind.BEGAN) { - this.lastRotation = 0; - } else if (state === WorldWind.CHANGED) { - // Apply the change in gesture rotation to this navigator's current heading. We apply relative to the - // current heading rather than the heading when the gesture began in order to work simultaneously with - // pan operations that also modify the current heading. - navigator.heading -= rotation - this.lastRotation; - this.lastRotation = rotation; - this.applyLimits(); - this.wwd.redraw(); - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handleTilt = function (recognizer) { - var navigator = this.wwd.navigator; - var state = recognizer.state, - ty = recognizer.translationY; - - if (state === WorldWind.BEGAN) { - this.beginTilt = navigator.tilt; - } else if (state === WorldWind.CHANGED) { - // Compute the gesture translation from screen coordinates to degrees. Use the canvas dimensions as a - // metric for converting the translation to a fraction of an angle. - var tiltDegrees = -90 * ty / this.wwd.canvas.clientHeight; - // Apply the change in heading and tilt to this navigator's corresponding properties. - navigator.tilt = this.beginTilt + tiltDegrees; - this.applyLimits(); - this.wwd.redraw(); - } -}; - -// Intentionally not documented. -BasicWorldWindowController.prototype.handleWheelEvent = function (event) { - var navigator = this.wwd.navigator; - // Normalize the wheel delta based on the wheel delta mode. This produces a roughly consistent delta across - // browsers and input devices. - var normalizedDelta; - if (event.deltaMode === WheelEvent.DOM_DELTA_PIXEL) { - normalizedDelta = event.deltaY; - } else if (event.deltaMode === WheelEvent.DOM_DELTA_LINE) { - normalizedDelta = event.deltaY * 40; - } else if (event.deltaMode === WheelEvent.DOM_DELTA_PAGE) { - normalizedDelta = event.deltaY * 400; - } - - // Compute a zoom scale factor by adding a fraction of the normalized delta to 1. When multiplied by the - // navigator's range, this has the effect of zooming out or zooming in depending on whether the delta is - // positive or negative, respectfully. - var scale = 1 + normalizedDelta / 1000; - - // Apply the scale to this navigator's properties. - navigator.range *= scale; - this.applyLimits(); - this.wwd.redraw(); -}; - -// Documented in super-class. -BasicWorldWindowController.prototype.applyLimits = function () { - var navigator = this.wwd.navigator; - - // Clamp latitude to between -90 and +90, and normalize longitude to between -180 and +180. - navigator.lookAtLocation.latitude = WWMath.clamp(navigator.lookAtLocation.latitude, -90, 90); - navigator.lookAtLocation.longitude = Angle.normalizedDegreesLongitude(navigator.lookAtLocation.longitude); - - // Clamp range to values greater than 1 in order to prevent degenerating to a first-person navigator when - // range is zero. - navigator.range = WWMath.clamp(navigator.range, 1, Number.MAX_VALUE); - - // Normalize heading to between -180 and +180. - navigator.heading = Angle.normalizedDegrees(navigator.heading); - - // Clamp tilt to between 0 and +90 to prevent the viewer from going upside down. - navigator.tilt = WWMath.clamp(navigator.tilt, 0, 90); - - // Normalize heading to between -180 and +180. - navigator.roll = Angle.normalizedDegrees(navigator.roll); - - // Apply 2D limits when the globe is 2D. - if (this.wwd.globe.is2D() && navigator.enable2DLimits) { - // Clamp range to prevent more than 360 degrees of visible longitude. Assumes a 45 degree horizontal - // field of view. - var maxRange = 2 * Math.PI * this.wwd.globe.equatorialRadius; - navigator.range = WWMath.clamp(navigator.range, 1, maxRange); - - // Force tilt to 0 when in 2D mode to keep the viewer looking straight down. - navigator.tilt = 0; - } -}; - -export default BasicWorldWindowController; - diff --git a/web/src/gis/README.md b/web/src/gis/README.md deleted file mode 100644 index 7208f1d4..00000000 --- a/web/src/gis/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# WebWorldWind - -This is a project from: https://github.com/NASAWorldWind/WebWorldWind - -# License - -Apache \ No newline at end of file diff --git a/web/src/gis/WorldWind.js b/web/src/gis/WorldWind.js deleted file mode 100644 index 6eef4997..00000000 --- a/web/src/gis/WorldWind.js +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import AbstractError from './error/AbstractError'; -import Annotation from './shapes/Annotation'; -import AnnotationAttributes from './shapes/AnnotationAttributes'; -import ArgumentError from './error/ArgumentError'; -import AsterV2ElevationCoverage from './globe/AsterV2ElevationCoverage'; -import AtmosphereLayer from './layer/AtmosphereLayer'; -import AtmosphereProgram from './shaders/AtmosphereProgram'; -import BasicProgram from './shaders/BasicProgram'; -import BasicTextureProgram from './shaders/BasicTextureProgram'; -import BasicWorldWindowController from './BasicWorldWindowController'; -import BoundingBox from './geom/BoundingBox'; -import ClickRecognizer from './gesture/ClickRecognizer'; -import Color from './util/Color'; -import Compass from './shapes/Compass'; -import DragRecognizer from './gesture/DragRecognizer'; -import DrawContext from './render/DrawContext'; -import EarthElevationModel from './globe/EarthElevationModel'; -import ElevationCoverage from './globe/ElevationCoverage'; -import ElevationModel from './globe/ElevationModel'; -import Font from './util/Font'; -import FrameStatistics from './util/FrameStatistics'; -import FramebufferTexture from './render/FramebufferTexture'; -import FramebufferTile from './render/FramebufferTile'; -import FramebufferTileController from './render/FramebufferTileController'; -import Frustum from './geom/Frustum'; -import GebcoElevationCoverage from './globe/GebcoElevationCoverage'; -import GeographicMesh from './shapes/GeographicMesh'; -import GeographicProjection from './projections/GeographicProjection'; -import GeographicText from './shapes/GeographicText'; -import GestureRecognizer from './gesture/GestureRecognizer'; -import Globe from './globe/Globe'; -import GpuProgram from './shaders/GpuProgram'; -import GpuResourceCache from './cache/GpuResourceCache'; -import GpuShader from './shaders/GpuShader'; -import GroundProgram from './shaders/GroundProgram'; -import HashMap from './util/HashMap'; -import ImageSource from './util/ImageSource'; -import ImageTile from './render/ImageTile'; -import Insets from './util/Insets'; -import Layer from './layer/Layer'; -import Level from './util/Level'; -import LevelSet from './util/LevelSet'; -import Line from './geom/Line'; -import Location from './geom/Location'; -import LookAtNavigator from './navigate/LookAtNavigator'; -import Matrix from './geom/Matrix'; -import MemoryCache from './cache/MemoryCache'; -import MemoryCacheListener from './cache/MemoryCacheListener'; -import MercatorTiledImageLayer from './layer/MercatorTiledImageLayer'; -import Navigator from './navigate/Navigator'; -import NotYetImplementedError from './error/NotYetImplementedError'; -import Offset from './util/Offset'; -import PanRecognizer from './gesture/PanRecognizer'; -import Path from './shapes/Path'; -import PickedObject from './pick/PickedObject'; -import PickedObjectList from './pick/PickedObjectList'; -import PinchRecognizer from './gesture/PinchRecognizer'; -import Placemark from './shapes/Placemark'; -import PlacemarkAttributes from './shapes/PlacemarkAttributes'; -import Plane from './geom/Plane'; -import Polygon from './shapes/Polygon'; -import Position from './geom/Position'; -import ProjectionWgs84 from './projections/ProjectionWgs84'; -import Rectangle from './geom/Rectangle'; -import Renderable from './render/Renderable'; -import RotationRecognizer from './gesture/RotationRecognizer'; -import ScreenImage from './shapes/ScreenImage'; -import ScreenText from './shapes/ScreenText'; -import Sector from './geom/Sector'; -import ShapeAttributes from './shapes/ShapeAttributes'; -import SkyProgram from './shaders/SkyProgram'; -import StarFieldLayer from './layer/StarFieldLayer'; -import StarFieldProgram from './shaders/StarFieldProgram'; -import SurfaceImage from './shapes/SurfaceImage'; -import SurfaceCircle from './shapes/SurfaceCircle'; -import SurfaceEllipse from './shapes/SurfaceEllipse'; -import SurfacePolygon from './shapes/SurfacePolygon'; -import SurfacePolyline from './shapes/SurfacePolyline'; -import SurfaceRectangle from './shapes/SurfaceRectangle'; -import SurfaceRenderable from './render/SurfaceRenderable'; -import SurfaceSector from './shapes/SurfaceSector'; -import SurfaceShape from './shapes/SurfaceShape'; -import SurfaceShapeTile from './shapes/SurfaceShapeTile'; -import SurfaceShapeTileBuilder from './shapes/SurfaceShapeTileBuilder'; -import SurfaceTile from './render/SurfaceTile'; -import SurfaceTileRenderer from './render/SurfaceTileRenderer'; -import SurfaceTileRendererProgram from './shaders/SurfaceTileRendererProgram'; -import TapRecognizer from './gesture/TapRecognizer'; -import Terrain from './globe/Terrain'; -import TerrainTile from './globe/TerrainTile'; -import TerrainTileList from './globe/TerrainTileList'; -import Tessellator from './globe/Tessellator'; -import Text from './shapes/Text'; -import TextAttributes from './shapes/TextAttributes'; -import TextRenderer from './render/TextRenderer'; -import Texture from './render/Texture'; -import TextureTile from './render/TextureTile'; -import Tile from './util/Tile'; -import TiledElevationCoverage from './globe/TiledElevationCoverage'; -import TiledImageLayer from './layer/TiledImageLayer'; -import TileFactory from './util/TileFactory'; -import TiltRecognizer from './gesture/TiltRecognizer'; -import Touch from './gesture/Touch'; -import TriangleMesh from './shapes/TriangleMesh'; -import UsgsNedElevationCoverage from './error/UnsupportedOperationError'; -import UsgsNedHiElevationCoverage from './globe/UsgsNedElevationCoverage'; -import UnsupportedOperationError from './globe/UsgsNedHiElevationCoverage'; -import UrlBuilder from './util/UrlBuilder'; -import Vec2 from './geom/Vec2'; -import Vec3 from './geom/Vec3'; -import WmsUrlBuilder from './util/WmsUrlBuilder'; -import WorldWindow from './WorldWindow'; -import WorldWindowController from './WorldWindowController'; -import WWUtil from './util/WWUtil'; -import XYZLayer from './layer/XYZLayer'; -import WWMath from './util/WWMath'; - -/** - * This is the top-level WorldWind module. It is global. - * @exports WorldWind - * @global - */ -var WorldWind = { - /** - * The WorldWind version number. - * @default "0.9.0" - * @constant - */ - VERSION: "0.9.0", - - // PLEASE KEEP THE ENTRIES BELOW IN ALPHABETICAL ORDER - /** - * Indicates an altitude mode relative to the globe's ellipsoid. - * @constant - */ - ABSOLUTE: "absolute", - - /** - * Indicates that a redraw callback has been called immediately after a redraw. - * @constant - */ - AFTER_REDRAW: "afterRedraw", - - /** - * Indicates that a redraw callback has been called immediately before a redraw. - * @constant - */ - BEFORE_REDRAW: "beforeRedraw", - - /** - * The BEGAN gesture recognizer state. Continuous gesture recognizers transition to this state from the - * POSSIBLE state when the gesture is first recognized. - * @constant - */ - BEGAN: "began", - - /** - * The CANCELLED gesture recognizer state. Continuous gesture recognizers may transition to this state from - * the BEGAN state or the CHANGED state when the touch events are cancelled. - * @constant - */ - CANCELLED: "cancelled", - - /** - * The CHANGED gesture recognizer state. Continuous gesture recognizers transition to this state from the - * BEGAN state or the CHANGED state, whenever an input event indicates a change in the gesture. - * @constant - */ - CHANGED: "changed", - - /** - * Indicates an altitude mode always on the terrain. - * @constant - */ - CLAMP_TO_GROUND: "clampToGround", - - /** - * The radius of Earth. - * @constant - * @deprecated Use WGS84_SEMI_MAJOR_AXIS instead. - */ - EARTH_RADIUS: 6371e3, - - /** - * Indicates the cardinal direction east. - * @constant - */ - EAST: "east", - - /** - * The ENDED gesture recognizer state. Continuous gesture recognizers transition to this state from either - * the BEGAN state or the CHANGED state when the current input no longer represents the gesture. - * @constant - */ - ENDED: "ended", - - /** - * The FAILED gesture recognizer state. Gesture recognizers transition to this state from the POSSIBLE state - * when the gesture cannot be recognized given the current input. - * @constant - */ - FAILED: "failed", - - /** - * Indicates a linear filter. - * @constant - */ - FILTER_LINEAR: "filter_linear", - - /** - * Indicates a nearest neighbor filter. - * @constant - */ - FILTER_NEAREST: "filter_nearest", - - /** - * Indicates a great circle path. - * @constant - */ - GREAT_CIRCLE: "greatCircle", - - /** - * Indicates a linear, straight line path. - * @constant - */ - LINEAR: "linear", - - /** - * Indicates a multi-point shape, typically within a shapefile. - */ - MULTI_POINT: "multiPoint", - - /** - * Indicates the cardinal direction north. - * @constant - */ - NORTH: "north", - - /** - * Indicates a null shape, typically within a shapefile. - * @constant - */ - NULL: "null", - - /** - * Indicates that the associated parameters are fractional values of the virtual rectangle's width or - * height in the range [0, 1], where 0 indicates the rectangle's origin and 1 indicates the corner - * opposite its origin. - * @constant - */ - OFFSET_FRACTION: "fraction", - - /** - * Indicates that the associated parameters are in units of pixels relative to the virtual rectangle's - * corner opposite its origin corner. - * @constant - */ - OFFSET_INSET_PIXELS: "insetPixels", - - /** - * Indicates that the associated parameters are in units of pixels relative to the virtual rectangle's - * origin. - * @constant - */ - OFFSET_PIXELS: "pixels", - - /** - * Indicates a point shape, typically within a shapefile. - */ - POINT: "point", - - /** - * Indicates a polyline shape, typically within a shapefile. - */ - POLYLINE: "polyline", - - /** - * Indicates a polygon shape, typically within a shapefile. - */ - POLYGON: "polygon", - - /** - * The POSSIBLE gesture recognizer state. Gesture recognizers in this state are idle when there is no input - * event to evaluate, or are evaluating input events to determine whether or not to transition into another - * state. - * @constant - */ - POSSIBLE: "possible", - - /** - * The RECOGNIZED gesture recognizer state. Discrete gesture recognizers transition to this state from the - * POSSIBLE state when the gesture is recognized. - * @constant - */ - RECOGNIZED: "recognized", - - /** - * The event name of WorldWind redraw events. - */ - REDRAW_EVENT_TYPE: "WorldWindRedraw", - - /** - * Indicates that the related value is specified relative to the globe. - * @constant - */ - RELATIVE_TO_GLOBE: "relativeToGlobe", - - /** - * Indicates an altitude mode relative to the terrain. - * @constant - */ - RELATIVE_TO_GROUND: "relativeToGround", - - /** - * Indicates that the related value is specified relative to the plane of the screen. - * @constant - */ - RELATIVE_TO_SCREEN: "relativeToScreen", - - /** - * Indicates a rhumb path -- a path of constant bearing. - * @constant - */ - RHUMB_LINE: "rhumbLine", - - /** - * Indicates the cardinal direction south. - * @constant - */ - SOUTH: "south", - - /** - * Indicates the cardinal direction west. - * @constant - */ - WEST: "west", - - /** - * WGS 84 reference value for Earth's semi-major axis: 6378137.0. Taken from NGA.STND.0036_1.0.0_WGS84, - * section 3.4.1. - * @constant - */ - WGS84_SEMI_MAJOR_AXIS: 6378137.0, - - /** - * WGS 84 reference value for Earth's inverse flattening: 298.257223563. Taken from - * NGA.STND.0036_1.0.0_WGS84, section 3.4.2. - * @constant - */ - WGS84_INVERSE_FLATTENING: 298.257223563 -}; - -WorldWind['AbstractError'] = AbstractError; -WorldWind['Annotation'] = Annotation; -WorldWind['AnnotationAttributes'] = AnnotationAttributes; -WorldWind['ArgumentError'] = ArgumentError; -WorldWind['AsterV2ElevationCoverage'] = AsterV2ElevationCoverage; -WorldWind['AtmosphereLayer'] = AtmosphereLayer; -WorldWind['AtmosphereProgram'] = AtmosphereProgram; -WorldWind['BasicProgram'] = BasicProgram; -WorldWind['BasicTextureProgram'] = BasicTextureProgram; -WorldWind['BasicWorldWindowController'] = BasicWorldWindowController; -WorldWind['BoundingBox'] = BoundingBox; -WorldWind['ClickRecognizer'] = ClickRecognizer; -WorldWind['Color'] = Color; -WorldWind['Compass'] = Compass; -WorldWind['DragRecognizer'] = DragRecognizer; -WorldWind['DrawContext'] = DrawContext; -WorldWind['EarthElevationModel'] = EarthElevationModel; -WorldWind['ElevationCoverage'] = ElevationCoverage; -WorldWind['ElevationModel'] = ElevationModel; -WorldWind['Font'] = Font; -WorldWind['FrameStatistics'] = FrameStatistics; -WorldWind['FramebufferTexture'] = FramebufferTexture; -WorldWind['FramebufferTile'] = FramebufferTile; -WorldWind['FramebufferTileController'] = FramebufferTileController; -WorldWind['Frustum'] = Frustum; -WorldWind['GebcoElevationCoverage'] = GebcoElevationCoverage; -WorldWind['GeographicMesh'] = GeographicMesh; -WorldWind['GeographicProjection'] = GeographicProjection; -WorldWind['GeographicText'] = GeographicText; -WorldWind['GestureRecognizer'] = GestureRecognizer; -WorldWind['Globe'] = Globe; -WorldWind['GpuProgram'] = GpuProgram; -WorldWind['GpuResourceCache'] = GpuResourceCache; -WorldWind['GpuShader'] = GpuShader; -WorldWind['GroundProgram'] = GroundProgram; -WorldWind['HashMap'] = HashMap; -WorldWind['ImageSource'] = ImageSource; -WorldWind['ImageTile'] = ImageTile; -WorldWind['Insets'] = Insets; -WorldWind['Layer'] = Layer; -WorldWind['Level'] = Level; -WorldWind['LevelSet'] = LevelSet; -WorldWind['Line'] = Line; -WorldWind['Location'] = Location; -WorldWind['LookAtNavigator'] = LookAtNavigator; -WorldWind['Matrix'] = Matrix; -WorldWind['MemoryCache'] = MemoryCache; -WorldWind['MemoryCacheListener'] = MemoryCacheListener; -WorldWind['MercatorTiledImageLayer'] = MercatorTiledImageLayer; -WorldWind['Navigator'] = Navigator; -WorldWind['NotYetImplementedError'] = NotYetImplementedError; -WorldWind['Offset'] = Offset; -WorldWind['PanRecognizer'] = PanRecognizer; -WorldWind['Path'] = Path; -WorldWind['PickedObject'] = PickedObject; -WorldWind['PickedObjectList'] = PickedObjectList; -WorldWind['PinchRecognizer'] = PinchRecognizer; -WorldWind['Placemark'] = Placemark; -WorldWind['PlacemarkAttributes'] = PlacemarkAttributes; -WorldWind['Plane'] = Plane; -WorldWind['Polygon'] = Polygon; -WorldWind['Position'] = Position; -WorldWind['ProjectionWgs84'] = ProjectionWgs84; -WorldWind['Rectangle'] = Rectangle; -WorldWind['Renderable'] = Renderable; -WorldWind['RotationRecognizer'] = RotationRecognizer; -WorldWind['ScreenText'] = ScreenText; -WorldWind['ScreenImage'] = ScreenImage; -WorldWind['Sector'] = Sector; -WorldWind['ShapeAttributes'] = ShapeAttributes; -WorldWind['SkyProgram'] = SkyProgram; -WorldWind['StarFieldLayer'] = StarFieldLayer; -WorldWind['StarFieldProgram'] = StarFieldProgram; -WorldWind['SurfaceImage'] = SurfaceImage; -WorldWind['SurfaceCircle'] = SurfaceCircle; -WorldWind['SurfaceEllipse'] = SurfaceEllipse; -WorldWind['SurfacePolygon'] = SurfacePolygon; -WorldWind['SurfacePolyline'] = SurfacePolyline; -WorldWind['SurfaceRectangle'] = SurfaceRectangle; -WorldWind['SurfaceRenderable'] = SurfaceRenderable; -WorldWind['SurfaceSector'] = SurfaceSector; -WorldWind['SurfaceShape'] = SurfaceShape; -WorldWind['SurfaceShapeTile'] = SurfaceShapeTile; -WorldWind['SurfaceShapeTileBuilder'] = SurfaceShapeTileBuilder; -WorldWind['SurfaceTile'] = SurfaceTile; -WorldWind['SurfaceTileRenderer'] = SurfaceTileRenderer; -WorldWind['SurfaceTileRendererProgram'] = SurfaceTileRendererProgram; -WorldWind['TapRecognizer'] = TapRecognizer; -WorldWind['Terrain'] = Terrain; -WorldWind['TerrainTile'] = TerrainTile; -WorldWind['TerrainTileList'] = TerrainTileList; -WorldWind['Tessellator'] = Tessellator; -WorldWind['Text'] = Text; -WorldWind['TextAttributes'] = TextAttributes; -WorldWind['TextRenderer'] = TextRenderer; -WorldWind['Texture'] = Texture; -WorldWind['TextureTile'] = TextureTile; -WorldWind['Tile'] = Tile; -WorldWind['TiledElevationCoverage'] = TiledElevationCoverage; -WorldWind['TiledImageLayer'] = TiledImageLayer; -WorldWind['TileFactory'] = TileFactory; -WorldWind['TiltRecognizer'] = TiltRecognizer; -WorldWind['Touch'] = Touch; -WorldWind['TriangleMesh'] = TriangleMesh; -WorldWind['UsgsNedElevationCoverage'] = UsgsNedElevationCoverage; -WorldWind['UsgsNedHiElevationCoverage'] = UsgsNedHiElevationCoverage; -WorldWind['UnsupportedOperationError'] = UnsupportedOperationError; -WorldWind['UrlBuilder'] = UrlBuilder; -WorldWind['Vec2'] = Vec2; -WorldWind['Vec3'] = Vec3; -WorldWind['WmsUrlBuilder'] = WmsUrlBuilder; -WorldWind['WorldWindow'] = WorldWindow; -WorldWind['WorldWindowController'] = WorldWindowController; -WorldWind['XYZLayer'] = XYZLayer; -WorldWind['WWMath'] = WWMath; - -/** - * Holds configuration parameters for WorldWind. Applications may modify these parameters prior to creating - * their first WorldWind objects. Configuration properties are: - * <ul> - * <li><code>gpuCacheSize</code>: A Number indicating the size in bytes to allocate from GPU memory for - * resources such as textures, GLSL programs and buffer objects. Default is 250e6 (250 MB).</li> - * <li><code>baseUrl</code>: The URL of the directory containing the WorldWind Library and its resources.</li> - * <li><code>layerRetrievalQueueSize</code>: The number of concurrent tile requests allowed per layer. The default is 16.</li> - * <li><code>coverageRetrievalQueueSize</code>: The number of concurrent tile requests allowed per elevation coverage. The default is 16.</li> - * <li><code>bingLogoPlacement</code>: An {@link Offset} to place a Bing logo attribution. The default is a 7px margin inset from the lower right corner of the screen.</li> - * <li><code>bingLogoAlignment</code>: An {@link Offset} to align the Bing logo relative to its placement position. The default is the lower right corner of the logo.</li> - * </ul> - * @type {{gpuCacheSize: number}} - */ -WorldWind.configuration = { - gpuCacheSize: 250e6, - baseUrl: WWUtil.worldwindlibLocation() || WWUtil.currentUrlSansFilePart() + '/', - layerRetrievalQueueSize: 16, - coverageRetrievalQueueSize: 16, - bingLogoPlacement: new Offset(WorldWind.OFFSET_INSET_PIXELS, 7, WorldWind.OFFSET_PIXELS, 7), - bingLogoAlignment: new Offset(WorldWind.OFFSET_FRACTION, 1, WorldWind.OFFSET_FRACTION, 0) -}; - -/** - * Indicates the Bing Maps key to use when requesting Bing Maps resources. - * @type {String} - * @default null - */ -WorldWind.BingMapsKey = null; - -window.WorldWind = WorldWind; - -export default WorldWind; diff --git a/web/src/gis/WorldWindow.js b/web/src/gis/WorldWindow.js deleted file mode 100644 index 0bd06312..00000000 --- a/web/src/gis/WorldWindow.js +++ /dev/null @@ -1,1491 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports WorldWindow - */ -import ArgumentError from './error/ArgumentError'; -import BasicWorldWindowController from './BasicWorldWindowController'; -import DrawContext from './render/DrawContext'; -import EarthElevationModel from './globe/EarthElevationModel'; -import FrameStatistics from './util/FrameStatistics'; -import Frustum from './geom/Frustum'; -import Globe from './globe/Globe'; -import GoToAnimator from './util/GoToAnimator'; -import Line from './geom/Line'; -import Logger from './util/Logger'; -import LookAtNavigator from './navigate/LookAtNavigator'; -import Matrix from './geom/Matrix'; -import PickedObjectList from './pick/PickedObjectList'; -import Position from './geom/Position'; -import Rectangle from './geom/Rectangle'; -import SurfaceShape from './shapes/SurfaceShape'; -import Vec2 from './geom/Vec2'; -import Vec3 from './geom/Vec3'; -import WWMath from './util/WWMath'; - - -/** - * Constructs a WorldWind window for an HTML canvas. - * @alias WorldWindow - * @constructor - * @classdesc Represents a WorldWind window for an HTML canvas. - * @param {WebGLRenderingContext} gl The ID assigned to the HTML canvas in the document or the canvas - * element itself. - */ -function WorldWindow(gl) { - var canvas = gl.canvas; - - // Internal. Intentionally not documented. - this.drawContext = new DrawContext(gl); - - // Internal. Intentionally not documented. Must be initialized before the navigator is created. - this.eventListeners = {}; - - // Internal. Intentionally not documented. Initially true in order to redraw at least once. - this.redrawRequested = true; - - // Internal. Intentionally not documented. - this.redrawRequestId = null; - - // Internal. Intentionally not documented. - this.scratchModelview = Matrix.fromIdentity(); - - // Internal. Intentionally not documented. - this.scratchProjection = Matrix.fromIdentity(); - - // Internal. Intentionally not documented. - this.hasStencilBuffer = gl.getContextAttributes().stencil; - - /** - * The HTML canvas associated with this WorldWindow. - * @type {HTMLElement} - * @readonly - */ - this.canvas = canvas; - - /** - * The number of bits in the depth buffer associated with this WorldWindow. - * @type {number} - * @readonly - */ - this.depthBits = gl.getParameter(gl.DEPTH_BITS); - - /** - * The current viewport of this WorldWindow. - * @type {Rectangle} - * @readonly - */ - this.viewport = new Rectangle(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - - /** - * The globe displayed. - * @type {Globe} - */ - this.globe = new Globe(new EarthElevationModel()); - - /** - * The layers to display in this WorldWindow. - * This property is read-only. Use [addLayer]{@link WorldWindow#addLayer} or - * [insertLayer]{@link WorldWindow#insertLayer} to add layers to this WorldWindow. - * Use [removeLayer]{@link WorldWindow#removeLayer} to remove layers from this WorldWindow. - * @type {Layer[]} - * @readonly - */ - this.layers = []; - - /** - * The navigator used to manipulate the globe. - * @type {LookAtNavigator} - * @default [LookAtNavigator]{@link LookAtNavigator} - */ - this.navigator = new LookAtNavigator(); - - /** - * The controller used to manipulate the globe. - * @type {WorldWindowController} - * @default [BasicWorldWindowController]{@link BasicWorldWindowController} - */ - this.worldWindowController = new BasicWorldWindowController(this); - - /** - * The vertical exaggeration to apply to the terrain. - * @type {Number} - */ - this.verticalExaggeration = 1; - - /** - * Indicates that picking will return all objects at the pick point, if any. The top-most object will have - * its isOnTop flag set to true. - * If deep picking is false, the default, only the top-most object is returned, plus - * the picked-terrain object if the pick point is over the terrain. - * @type {boolean} - * @default false - */ - this.deepPicking = false; - - /** - * Indicates whether this WorldWindow should be configured for sub-surface rendering. If true, shapes - * below the terrain can be seen when the terrain is made transparent. If false, sub-surface shapes are - * not visible, however, performance is slightly increased. - * @type {boolean} - * @default false - */ - this.subsurfaceMode = false; - - /** - * The opacity to apply to terrain and surface shapes. This property is typically used when viewing - * the sub-surface. It modifies the opacity of the terrain and surface shapes as a whole. It should be - * a number between 0 and 1. It is compounded with the individual opacities of the image layers and - * surface shapes on the terrain. - * @type {Number} - * @default 1 - */ - this.surfaceOpacity = 1; - - /** - * Performance statistics for this WorldWindow. - * @type {FrameStatistics} - */ - this.frameStatistics = new FrameStatistics(); - - /** - * The {@link GoToAnimator} used by this WorldWindow to respond to its goTo method. - * @type {GoToAnimator} - */ - this.goToAnimator = new GoToAnimator(this); - - // Documented with its property accessor below. - this._redrawCallbacks = []; - - // Documented with its property accessor below. - this._orderedRenderingFilters = [ - function (dc) { - thisWindow.declutter(dc, 1); - }, - function (dc) { - thisWindow.declutter(dc, 2); - } - ]; - - // Intentionally not documented. - this.pixelScale = 1; - - // Prevent the browser's default actions in response to mouse and touch events, which interfere with - // navigation. Register these event listeners before any others to ensure that they're called last. - function preventDefaultListener(event) { - event.preventDefault(); - } - - this.addEventListener("mousedown", preventDefaultListener); - this.addEventListener("touchstart", preventDefaultListener); - this.addEventListener("contextmenu", preventDefaultListener); - this.addEventListener("wheel", preventDefaultListener); - - var thisWindow = this; - - // Redirect various UI interactions to the appropriate handler. - function onGestureEvent(event) { - thisWindow.onGestureEvent(event); - } - - if (window.PointerEvent) { - // Prevent the browser's default actions in response to pointer events which interfere with navigation. - // This CSS style property is configured here to ensure that it's set for all applications. - this.canvas.style.setProperty("touch-action", "none"); - - this.addEventListener("pointerdown", onGestureEvent, false); - window.addEventListener("pointermove", onGestureEvent, false); // get pointermove events outside event target - window.addEventListener("pointercancel", onGestureEvent, false); // get pointercancel events outside event target - window.addEventListener("pointerup", onGestureEvent, false); // get pointerup events outside event target - } else { - this.addEventListener("mousedown", onGestureEvent, false); - window.addEventListener("mousemove", onGestureEvent, false); // get mousemove events outside event target - window.addEventListener("mouseup", onGestureEvent, false); // get mouseup events outside event target - this.addEventListener("touchstart", onGestureEvent, false); - this.addEventListener("touchmove", onGestureEvent, false); - this.addEventListener("touchend", onGestureEvent, false); - this.addEventListener("touchcancel", onGestureEvent, false); - } - - // Register wheel event listeners on the WorldWindow's canvas. - this.addEventListener("wheel", function (event) { - onGestureEvent(event); - }); - - // Set up to handle WebGL context lost events. - function handleContextLost(event) { - thisWindow.handleContextLost(event); - } - - this.canvas.addEventListener("webglcontextlost", handleContextLost, false); - - // Set up to handle WebGL context restored events. - function handleContextRestored(event) { - thisWindow.handleContextRestored(event); - } - - this.canvas.addEventListener("webglcontextrestored", handleContextRestored, false); - - // Set up to handle WebGL context events and WorldWind redraw request events. Imagery uses the canvas - // redraw events because images are generally specific to the WebGL context associated with the canvas. - // Elevation models use the global window redraw events because they can be shared among WorldWindows. - function handleRedrawEvent(event) { - thisWindow.handleRedrawEvent(event); - } - - this.canvas.addEventListener(WorldWind.REDRAW_EVENT_TYPE, handleRedrawEvent, false); - window.addEventListener(WorldWind.REDRAW_EVENT_TYPE, handleRedrawEvent, false); - - // Render to the WebGL context in an animation frame loop until the WebGL context is lost. - this.animationFrameLoop(); -} - -Object.defineProperties(WorldWindow.prototype, { - /** - * An array of functions to call during ordered rendering prior to rendering the ordered renderables. - * Each function is passed one argument, the current draw context. The function may modify the - * ordered renderables in the draw context's ordered renderable list, which has been sorted from front - * to back when the filter function is called. Ordered rendering filters are typically used to apply - * decluttering. The default set of filter functions contains one function that declutters shapes with - * declutter group ID of 1 ({@link GeographicText} by default) and one function that declutters shapes - * with declutter group ID 2 ({@link Placemark} by default). Applications can add functions to this - * array or remove them. - * @type {Function[]} - * @default [WorldWindow.declutter]{@link WorldWindow#declutter} with a group ID of 1 - * @readonly - * @memberof WorldWindow.prototype - */ - orderedRenderingFilters: { - get: function () { - return this._orderedRenderingFilters; - } - }, - /** - * The list of callbacks to call immediately before and immediately after performing a redraw. The callbacks - * have two arguments: this WorldWindow and the redraw stage, e.g., <code style='white-space:nowrap'>redrawCallback(worldWindow, stage);</code>. - * The stage will be either WorldWind.BEFORE_REDRAW or WorldWind.AFTER_REDRAW indicating whether the - * callback has been called either immediately before or immediately after a redraw, respectively. - * Applications may add functions to this array or remove them. - * @type {Function[]} - * @readonly - * @memberof WorldWindow.prototype - */ - redrawCallbacks: { - get: function () { - return this._redrawCallbacks; - } - } -}); - -/** - * Converts window coordinates to coordinates relative to this WorldWindow's canvas. - * @param {Number} x The X coordinate to convert. - * @param {Number} y The Y coordinate to convert. - * @returns {Vec2} The converted coordinates. - */ -WorldWindow.prototype.canvasCoordinates = function (x, y) { - var bbox = this.canvas.getBoundingClientRect(), - xc = x - (bbox.left + this.canvas.clientLeft),// * (this.canvas.width / bbox.width), - yc = y - (bbox.top + this.canvas.clientTop);// * (this.canvas.height / bbox.height); - - return new Vec2(xc, yc); -}; - -WorldWindow.prototype.onGestureEvent = function (event) { - this.worldWindowController.onGestureEvent(event); -}; - -/** - * Registers an event listener for the specified event type on this WorldWindow's canvas. This function - * delegates the processing of events to the WorldWindow's canvas. For details on this function and its - * arguments, see the W3C [EventTarget]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget} - * documentation. - * - * Registering event listeners using this function enables applications to prevent the WorldWindow's default - * navigation behavior. To prevent default navigation behavior, call the [Event]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event}'s - * preventDefault method from within an event listener for any events the navigator should not respond to. - * - * When an event occurs, this calls the registered event listeners in order of reverse registration. Since the - * WorldWindow registers its navigator event listeners first, application event listeners are called before - * navigator event listeners. - * - * @param type The event type to listen for. - * @param listener The function to call when the event occurs. - * @throws {ArgumentError} If any argument is null or undefined. - */ -WorldWindow.prototype.addEventListener = function (type, listener) { - if (!type) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "addEventListener", "missingType")); - } - - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "addEventListener", "missingListener")); - } - - var thisWorldWindow = this; - var entry = this.eventListeners[type]; - if (!entry) { - entry = { - listeners: [], - callback: function (event) { // calls listeners in reverse registration order - event.worldWindow = thisWorldWindow; - for (var i = 0, len = entry.listeners.length; i < len; i++) { - entry.listeners[i](event); - } - } - }; - this.eventListeners[type] = entry; - } - - var index = entry.listeners.indexOf(listener); - if (index == -1) { // suppress duplicate listeners - entry.listeners.splice(0, 0, listener); // insert the listener at the beginning of the list - - if (entry.listeners.length == 1) { // first listener added, add the event listener callback - this.canvas.addEventListener(type, entry.callback, false); - } - } -}; - -/** - * Removes an event listener for the specified event type from this WorldWindow's canvas. The listener must be - * the same object passed to addEventListener. Calling removeEventListener with arguments that do not identify a - * currently registered listener has no effect. - * - * @param type Indicates the event type the listener registered for. - * @param listener The listener to remove. Must be the same function object passed to addEventListener. - * @throws {ArgumentError} If any argument is null or undefined. - */ -WorldWindow.prototype.removeEventListener = function (type, listener) { - if (!type) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "removeEventListener", "missingType")); - } - - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "removeEventListener", "missingListener")); - } - - var entry = this.eventListeners[type]; - if (!entry) { - return; // no entry for the specified type - } - - var index = entry.listeners.indexOf(listener); - if (index != -1) { - entry.listeners.splice(index, 1); // remove the listener from the list - - if (entry.listeners.length == 0) { // last listener removed, remove the event listener callback - this.canvas.removeEventListener(type, entry.callback, false); - } - } -}; - -/** - * Causes this WorldWindow to redraw itself at the next available opportunity. The redraw occurs on the main - * thread at a time of the browser's discretion. Applications should call redraw after changing the World - * Window's state, but should not expect that change to be reflected on screen immediately after this function - * returns. This is the preferred method for requesting a redraw of the WorldWindow. - */ -WorldWindow.prototype.redraw = function () { - this.redrawRequested = true; // redraw during the next animation frame -}; - -/** - * Requests the WorldWind objects displayed at a specified screen-coordinate point. - * - * If the point intersects the terrain, the returned list contains an object identifying the associated geographic - * position. This returns an empty list when nothing in the WorldWind scene intersects the specified point. - * - * @param pickPoint The point to examine in this WorldWindow's screen coordinates. - * @returns {PickedObjectList} A list of picked WorldWind objects at the specified pick point. - * @throws {ArgumentError} If the specified pick point is null or undefined. - */ -WorldWindow.prototype.pick = function (pickPoint) { - if (!pickPoint) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "pick", "missingPoint")); - } - - // Suppress the picking operation and return an empty list when the WebGL context has been lost. - if (this.drawContext.currentGlContext.isContextLost()) { - return new PickedObjectList(); - } - - this.resize(); - this.resetDrawContext(); - this.drawContext.pickingMode = true; - this.drawContext.pickPoint = pickPoint; - this.drawContext.pickRay = this.rayThroughScreenPoint(pickPoint); - this.drawFrame(); - - return this.drawContext.objectsAtPickPoint; -}; - -/** - * Requests the position of the WorldWind terrain at a specified screen-coordinate point. If the point - * intersects the terrain, the returned list contains a single object identifying the associated geographic - * position. Otherwise this returns an empty list. - * @param pickPoint The point to examine in this WorldWindow's screen coordinates. - * @returns {PickedObjectList} A list containing the picked WorldWind terrain position at the specified point, - * or an empty list if the point does not intersect the terrain. - * @throws {ArgumentError} If the specified pick point is null or undefined. - */ -WorldWindow.prototype.pickTerrain = function (pickPoint) { - if (!pickPoint) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "pickTerrain", "missingPoint")); - } - - // Suppress the picking operation and return an empty list when the WebGL context has been lost. - if (this.drawContext.currentGlContext.isContextLost()) { - return new PickedObjectList(); - } - - this.resize(); - this.resetDrawContext(); - this.drawContext.pickingMode = true; - this.drawContext.pickTerrainOnly = true; - this.drawContext.pickPoint = pickPoint; - this.drawContext.pickRay = this.rayThroughScreenPoint(pickPoint); - this.drawFrame(); - - return this.drawContext.objectsAtPickPoint; -}; - -/** - * Requests the WorldWind objects displayed within a specified screen-coordinate region. This returns all - * objects that intersect the specified region, regardless of whether or not an object is actually visible, and - * marks objects that are visible as on top. - * @param {Rectangle} rectangle The screen coordinate rectangle identifying the region to search. - * @returns {PickedObjectList} A list of visible WorldWind objects within the specified region. - * @throws {ArgumentError} If the specified rectangle is null or undefined. - */ -WorldWindow.prototype.pickShapesInRegion = function (rectangle) { - if (!rectangle) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "pickShapesInRegion", "missingRectangle")); - } - - // Suppress the picking operation and return an empty list when the WebGL context has been lost. - if (this.drawContext.currentGlContext.isContextLost()) { - return new PickedObjectList(); - } - - this.resize(); - this.resetDrawContext(); - this.drawContext.pickingMode = true; - this.drawContext.regionPicking = true; - this.drawContext.pickRectangle = - new Rectangle(rectangle.x, this.canvas.height - rectangle.y, rectangle.width, rectangle.height); - this.drawFrame(); - - return this.drawContext.objectsAtPickPoint; -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.createContext = function (canvas) { - // Request a WebGL context with antialiasing is disabled. Antialiasing causes gaps to appear at the edges of - // terrain tiles. - var glAttrs = { antialias: false, stencil: true }, - gl = canvas.getContext("webgl", glAttrs); - if (!gl) { - gl = canvas.getContext("experimental-webgl", glAttrs); - } - - // uncomment to debug WebGL - //var gl = WebGLDebugUtils.makeDebugContext(this.canvas.getContext("webgl"), - // this.throwOnGLError, - // this.logAndValidate - //); - - return gl; -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.handleContextLost = function (event) { - Logger.log(Logger.LEVEL_INFO, "WebGL context event: " + event.statusMessage); - // Inform WebGL that we handle context restoration, enabling the context restored event to be delivered. - event.preventDefault(); - // Notify the draw context that the WebGL rendering context has been lost. - this.drawContext.contextLost(); - // Stop the rendering animation frame loop, resuming only if the WebGL context is restored. - window.cancelAnimationFrame(this.redrawRequestId); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.handleContextRestored = function (event) { - Logger.log(Logger.LEVEL_INFO, "WebGL context event: " + event.statusMessage); - // Notify the draw context that the WebGL rendering context has been restored. - this.drawContext.contextRestored(); - // Resume the rendering animation frame loop until the WebGL context is lost. - this.redraw(); - this.animationFrameLoop(); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.handleRedrawEvent = function (event) { - this.redraw(); // redraw in the next animation frame -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.animationFrameLoop = function () { - // Render to the WebGL context as needed. - this.redrawIfNeeded(); - - // Continue the animation frame loop until the WebGL context is lost. - var thisWindow = this; - - function animationFrameCallback() { - thisWindow.animationFrameLoop(); - } - - this.redrawRequestId = window.requestAnimationFrame(animationFrameCallback); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.redrawIfNeeded = function () { - // Check if the drawing buffer needs to resize to match its screen size, which requires a redraw. - this.resize(); - - // Redraw the WebGL drawing buffer only when necessary. - if (!this.redrawRequested) { - return; - } - - try { - // Prepare to redraw and notify the redraw callbacks that a redraw is about to occur. - this.redrawRequested = false; - this.drawContext.previousRedrawTimestamp = this.drawContext.timestamp; - this.callRedrawCallbacks(WorldWind.BEFORE_REDRAW); - // Redraw the WebGL drawing buffer. - this.resetDrawContext(); - this.drawFrame(); - } catch (e) { - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "redrawIfNeeded", - "Exception occurred during redrawing.\n" + e.toString()); - } finally { - // Notify the redraw callbacks that a redraw has completed. - this.callRedrawCallbacks(WorldWind.AFTER_REDRAW); - // Handle rendering code redraw requests. - if (this.drawContext.redrawRequested) { - this.redrawRequested = true; - } - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.resize = function () { - var gl = this.drawContext.currentGlContext, - width = gl.canvas.clientWidth * this.pixelScale, - height = gl.canvas.clientHeight * this.pixelScale; - - if (gl.canvas.width != width || - gl.canvas.height != height) { - - // Make the canvas drawing buffer size match its screen size. - gl.canvas.width = width; - gl.canvas.height = height; - - // Set the WebGL viewport to match the canvas drawing buffer size. - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - this.viewport = new Rectangle(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - - // Cause this WorldWindow to redraw with the new size. - this.redrawRequested = true; - } -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.computeViewingTransform = function (projection, modelview) { - if (!modelview) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "computeViewingTransform", "missingModelview")); - } - - modelview.setToIdentity(); - this.worldWindowController.applyLimits(); - var globe = this.globe; - var navigator = this.navigator; - var lookAtPosition = new Position(navigator.lookAtLocation.latitude, navigator.lookAtLocation.longitude, 0); - modelview.multiplyByLookAtModelview(lookAtPosition, navigator.range, navigator.heading, navigator.tilt, navigator.roll, globe); - - if (projection) { - projection.setToIdentity(); - var globeRadius = WWMath.max(globe.equatorialRadius, globe.polarRadius), - eyePoint = modelview.extractEyePoint(new Vec3(0, 0, 0)), - eyePos = globe.computePositionFromPoint(eyePoint[0], eyePoint[1], eyePoint[2], new Position(0, 0, 0)), - eyeHorizon = WWMath.horizonDistanceForGlobeRadius(globeRadius, eyePos.altitude), - atmosphereHorizon = WWMath.horizonDistanceForGlobeRadius(globeRadius, 160000), - viewport = this.viewport; - - // Set the far clip distance to the smallest value that does not clip the atmosphere. - // TODO adjust the clip plane distances based on the navigator's orientation - shorter distances when the - // TODO horizon is not in view - // TODO parameterize the object altitude for horizon distance - var farDistance = eyeHorizon + atmosphereHorizon; - if (farDistance < 1e3) - farDistance = 1e3; - - // Compute the near clip distance in order to achieve a desired depth resolution at the far clip distance. - // This computed distance is limited such that it does not intersect the terrain when possible and is never - // less than a predetermined minimum (usually one). The computed near distance automatically scales with the - // resolution of the WebGL depth buffer. - var nearDistance = WWMath.perspectiveNearDistanceForFarDistance(farDistance, 10, this.depthBits); - - // Prevent the near clip plane from intersecting the terrain. - var distanceToSurface = eyePos.altitude - globe.elevationAtLocation(eyePos.latitude, eyePos.longitude); - if (distanceToSurface > 0) { - var maxNearDistance = WWMath.perspectiveNearDistance(viewport.width, viewport.height, distanceToSurface); - if (nearDistance > maxNearDistance) { - nearDistance = maxNearDistance; - } - } - - if (nearDistance < 1) { - nearDistance = 1; - } - - // Compute the current projection matrix based on this navigator's perspective properties and the current - // WebGL viewport. - projection.setToPerspectiveProjection(viewport.width, viewport.height, nearDistance, farDistance); - } -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.computePixelMetrics = function (projection) { - var projectionInv = Matrix.fromIdentity(); - projectionInv.invertMatrix(projection); - - // Compute the eye coordinate rectangles carved out of the frustum by the near and far clipping planes, and - // the distance between those planes and the eye point along the -Z axis. The rectangles are determined by - // transforming the bottom-left and top-right points of the frustum from clip coordinates to eye - // coordinates. - var nbl = new Vec3(-1, -1, -1), - ntr = new Vec3(+1, +1, -1), - fbl = new Vec3(-1, -1, +1), - ftr = new Vec3(+1, +1, +1); - // Convert each frustum corner from clip coordinates to eye coordinates by multiplying by the inverse - // projection matrix. - nbl.multiplyByMatrix(projectionInv); - ntr.multiplyByMatrix(projectionInv); - fbl.multiplyByMatrix(projectionInv); - ftr.multiplyByMatrix(projectionInv); - - var nrRectWidth = WWMath.fabs(ntr[0] - nbl[0]), - frRectWidth = WWMath.fabs(ftr[0] - fbl[0]), - nrDistance = -nbl[2], - frDistance = -fbl[2]; - - // Compute the scale and offset used to determine the width of a pixel on a rectangle carved out of the - // frustum at a distance along the -Z axis in eye coordinates. These values are found by computing the scale - // and offset of a frustum rectangle at a given distance, then dividing each by the viewport width. - var frustumWidthScale = (frRectWidth - nrRectWidth) / (frDistance - nrDistance), - frustumWidthOffset = nrRectWidth - frustumWidthScale * nrDistance; - - return { - pixelSizeFactor: frustumWidthScale / this.viewport.width, - pixelSizeOffset: frustumWidthOffset / this.viewport.height - }; -}; - -/** - * Computes the approximate size of a pixel at a specified distance from the eye point. - * <p> - * This method assumes rectangular pixels, where pixel coordinates denote - * infinitely thin spaces between pixels. The units of the returned size are in model coordinates per pixel - * (usually meters per pixel). This returns 0 if the specified distance is zero. The returned size is undefined - * if the distance is less than zero. - * - * @param {Number} distance The distance from the eye point at which to determine pixel size, in model - * coordinates. - * @returns {Number} The approximate pixel size at the specified distance from the eye point, in model - * coordinates per pixel. - */ -WorldWindow.prototype.pixelSizeAtDistance = function (distance) { - this.computeViewingTransform(this.scratchProjection, this.scratchModelview); - var pixelMetrics = this.computePixelMetrics(this.scratchProjection); - return pixelMetrics.pixelSizeFactor * distance + pixelMetrics.pixelSizeOffset; -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.computeDrawContext = function () { - var dc = this.drawContext; - - this.computeViewingTransform(dc.projection, dc.modelview); - dc.viewport = this.viewport; - dc.eyePoint = dc.modelview.extractEyePoint(new Vec3(0, 0, 0)); - - dc.modelviewProjection.setToIdentity(); - dc.modelviewProjection.setToMultiply(dc.projection, dc.modelview); - - var pixelMetrics = this.computePixelMetrics(dc.projection); - dc.pixelSizeFactor = pixelMetrics.pixelSizeFactor; - dc.pixelSizeOffset = pixelMetrics.pixelSizeOffset; - - // Compute the inverse of the modelview, projection, and modelview-projection matrices. The inverse matrices - // are used to support operations on navigator state. - var modelviewInv = Matrix.fromIdentity(); - modelviewInv.invertOrthonormalMatrix(dc.modelview); - - dc.modelviewNormalTransform = Matrix.fromIdentity().setToTransposeOfMatrix(modelviewInv.upper3By3()); - - // Compute the frustum in model coordinates. Start by computing the frustum in eye coordinates from the - // projection matrix, then transform this frustum to model coordinates by multiplying its planes by the - // transpose of the modelview matrix. We use the transpose of the modelview matrix because planes are - // transformed by the inverse transpose of a matrix, and we want to transform from eye coordinates to model - // coordinates. - var modelviewTranspose = Matrix.fromIdentity(); - modelviewTranspose.setToTransposeOfMatrix(dc.modelview); - dc.frustumInModelCoordinates = Frustum.fromProjectionMatrix(dc.projection); - dc.frustumInModelCoordinates.transformByMatrix(modelviewTranspose); - dc.frustumInModelCoordinates.normalize(); -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.resetDrawContext = function () { - this.globe.offset = 0; - - var dc = this.drawContext; - dc.reset(); - dc.globe = this.globe; - dc.navigator = this.navigator; - dc.layers = this.layers.slice(); - dc.layers.push(dc.screenCreditController); - this.computeDrawContext(); - dc.verticalExaggeration = this.verticalExaggeration; - dc.surfaceOpacity = this.surfaceOpacity; - dc.deepPicking = this.deepPicking; - dc.frameStatistics = this.frameStatistics; - dc.pixelScale = this.pixelScale; - dc.update(); -}; - -/* useful stuff to debug WebGL */ -/* - function logGLCall(functionName, args) { - console.log("gl." + functionName + "(" + - WebGLDebugUtils.glFunctionArgsToString(functionName, args) + ")"); - }; - - function validateNoneOfTheArgsAreUndefined(functionName, args) { - for (var ii = 0; ii < args.length; ++ii) { - if (args[ii] === undefined) { - console.error("undefined passed to gl." + functionName + "(" + - WebGLDebugUtils.glFunctionArgsToString(functionName, args) + ")"); - } - } - }; - - WorldWindow.prototype.logAndValidate = function logAndValidate(functionName, args) { - logGLCall(functionName, args); - validateNoneOfTheArgsAreUndefined (functionName, args); - }; - - WorldWindow.prototype.throwOnGLError = function throwOnGLError(err, funcName, args) { - throw WebGLDebugUtils.glEnumToString(err) + " was caused by call to: " + funcName; - }; - */ - -// Internal function. Intentionally not documented. -WorldWindow.prototype.drawFrame = function () { - try { - this.drawContext.frameStatistics.beginFrame(); - this.beginFrame(); - - if (this.drawContext.globe.is2D() && this.drawContext.globe.continuous) { - this.do2DContiguousRepaint(); - } else { - this.doNormalRepaint(); - } - - } finally { - this.endFrame(); - this.drawContext.frameStatistics.endFrame(); - //console.log(this.drawContext.frameStatistics.frameTime); - } -}; - -WorldWindow.prototype.doNormalRepaint = function () { - this.createTerrain(); - this.clearFrame(); - this.deferOrderedRendering = false; - if (this.drawContext.pickingMode) { - if (this.drawContext.makePickFrustum()) { - this.doPick(); - this.resolvePick(); - } - } else { - this.doDraw(); - if (this.subsurfaceMode && this.hasStencilBuffer) { - this.redrawSurface(); - this.drawScreenRenderables(); - } - } -}; - -WorldWindow.prototype.do2DContiguousRepaint = function () { - this.createTerrain2DContiguous(); - this.clearFrame(); - if (this.drawContext.pickingMode) { - if (this.drawContext.makePickFrustum()) { - this.pick2DContiguous(); - this.resolvePick(); - } - } else { - this.draw2DContiguous(); - } -}; - -WorldWindow.prototype.resolvePick = function () { - if (this.drawContext.pickTerrainOnly) { - this.resolveTerrainPick(); - } else if (this.drawContext.regionPicking) { - this.resolveRegionPick(); - } else { - this.resolveTopPick(); - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.beginFrame = function () { - var gl = this.drawContext.currentGlContext; - gl.enable(gl.BLEND); - gl.enable(gl.CULL_FACE); - gl.enable(gl.DEPTH_TEST); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.depthFunc(gl.LEQUAL); - - if (this.drawContext.pickingMode) { - this.drawContext.makePickFramebuffer(); - this.drawContext.bindFramebuffer(this.drawContext.pickFramebuffer); - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.endFrame = function () { - var gl = this.drawContext.currentGlContext; - gl.disable(gl.BLEND); - gl.disable(gl.CULL_FACE); - gl.disable(gl.DEPTH_TEST); - gl.blendFunc(gl.ONE, gl.ZERO); - gl.depthFunc(gl.LESS); - gl.clearColor(0, 0, 0, 1); - - this.drawContext.bindFramebuffer(null); - this.drawContext.bindProgram(null); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.clearFrame = function () { - var dc = this.drawContext, - gl = dc.currentGlContext; - - gl.clearColor(dc.clearColor.red, dc.clearColor.green, dc.clearColor.blue, dc.clearColor.alpha); - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.doDraw = function () { - this.drawContext.renderShapes = true; - - if (this.subsurfaceMode && this.hasStencilBuffer) { - // Draw the surface and collect the ordered renderables. - this.drawContext.currentGlContext.disable(this.drawContext.currentGlContext.STENCIL_TEST); - this.drawContext.surfaceShapeTileBuilder.clear(); - this.drawLayers(true); - this.drawSurfaceRenderables(); - this.drawContext.surfaceShapeTileBuilder.doRender(this.drawContext); - - if (!this.deferOrderedRendering) { - // Clear the depth and stencil buffers prior to rendering the ordered renderables. This allows - // sub-surface renderables to be drawn beneath the terrain. Turn on stenciling to capture the - // fragments that ordered renderables draw. The terrain and surface shapes will be subsequently - // drawn again, and the stencil buffer will ensure that they are drawn only where they overlap - // the fragments drawn by the ordered renderables. - this.drawContext.currentGlContext.clear( - this.drawContext.currentGlContext.DEPTH_BUFFER_BIT | this.drawContext.currentGlContext.STENCIL_BUFFER_BIT); - this.drawContext.currentGlContext.enable(this.drawContext.currentGlContext.STENCIL_TEST); - this.drawContext.currentGlContext.stencilFunc(this.drawContext.currentGlContext.ALWAYS, 1, 1); - this.drawContext.currentGlContext.stencilOp( - this.drawContext.currentGlContext.REPLACE, this.drawContext.currentGlContext.REPLACE, this.drawContext.currentGlContext.REPLACE); - this.drawOrderedRenderables(); - } - } else { - this.drawContext.surfaceShapeTileBuilder.clear(); - this.drawLayers(true); - this.drawSurfaceRenderables(); - this.drawContext.surfaceShapeTileBuilder.doRender(this.drawContext); - - if (!this.deferOrderedRendering) { - this.drawOrderedRenderables(); - this.drawScreenRenderables(); - } - } -}; - -WorldWindow.prototype.redrawSurface = function () { - // Draw the terrain and surface shapes but only where the current stencil buffer is non-zero. - // The non-zero fragments are from drawing the ordered renderables previously. - this.drawContext.currentGlContext.enable(this.drawContext.currentGlContext.STENCIL_TEST); - this.drawContext.currentGlContext.stencilFunc(this.drawContext.currentGlContext.EQUAL, 1, 1); - this.drawContext.currentGlContext.stencilOp( - this.drawContext.currentGlContext.KEEP, this.drawContext.currentGlContext.KEEP, this.drawContext.currentGlContext.KEEP); - this.drawContext.surfaceShapeTileBuilder.clear(); - this.drawLayers(false); - this.drawSurfaceRenderables(); - this.drawContext.surfaceShapeTileBuilder.doRender(this.drawContext); - this.drawContext.currentGlContext.disable(this.drawContext.currentGlContext.STENCIL_TEST); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.doPick = function () { - if (this.drawContext.terrain) { - this.drawContext.terrain.pick(this.drawContext); - } - - if (!this.drawContext.pickTerrainOnly) { - if (this.subsurfaceMode && this.hasStencilBuffer) { - // Draw the surface and collect the ordered renderables. - this.drawContext.currentGlContext.disable(this.drawContext.currentGlContext.STENCIL_TEST); - this.drawContext.surfaceShapeTileBuilder.clear(); - this.drawLayers(true); - this.drawSurfaceRenderables(); - this.drawContext.surfaceShapeTileBuilder.doRender(this.drawContext); - - if (!this.deferOrderedRendering) { - // Clear the depth and stencil buffers prior to rendering the ordered renderables. This allows - // sub-surface renderables to be drawn beneath the terrain. Turn on stenciling to capture the - // fragments that ordered renderables draw. The terrain and surface shapes will be subsequently - // drawn again, and the stencil buffer will ensure that they are drawn only where they overlap - // the fragments drawn by the ordered renderables. - this.drawContext.currentGlContext.clear( - this.drawContext.currentGlContext.DEPTH_BUFFER_BIT | this.drawContext.currentGlContext.STENCIL_BUFFER_BIT); - this.drawContext.currentGlContext.enable(this.drawContext.currentGlContext.STENCIL_TEST); - this.drawContext.currentGlContext.stencilFunc(this.drawContext.currentGlContext.ALWAYS, 1, 1); - this.drawContext.currentGlContext.stencilOp( - this.drawContext.currentGlContext.REPLACE, this.drawContext.currentGlContext.REPLACE, this.drawContext.currentGlContext.REPLACE); - this.drawOrderedRenderables(); - this.drawContext.terrain.pick(this.drawContext); - this.drawScreenRenderables(); - } - } else { - this.drawContext.surfaceShapeTileBuilder.clear(); - - this.drawLayers(true); - this.drawSurfaceRenderables(); - - this.drawContext.surfaceShapeTileBuilder.doRender(this.drawContext); - - if (!this.deferOrderedRendering) { - this.drawOrderedRenderables(); - this.drawScreenRenderables(); - } - } - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.createTerrain = function () { - var dc = this.drawContext; - dc.terrain = this.globe.tessellator.tessellate(dc); - dc.frameStatistics.setTerrainTileCount(dc.terrain ? dc.terrain.surfaceGeometry.length : 0); -}; - -WorldWindow.prototype.makeCurrent = function (offset) { - var dc = this.drawContext; - dc.globe.offset = offset; - dc.globeStateKey = dc.globe.stateKey; - - switch (offset) { - case -1: - dc.terrain = this.terrainLeft; - break; - - case 0: - dc.terrain = this.terrainCenter; - break; - - case 1: - dc.terrain = this.terrainRight; - break; - } -}; - -WorldWindow.prototype.createTerrain2DContiguous = function () { - var dc = this.drawContext; - - this.terrainCenter = null; - dc.globe.offset = 0; - dc.globeStateKey = dc.globe.stateKey; - if (dc.globe.intersectsFrustum(dc.frustumInModelCoordinates)) { - this.terrainCenter = dc.globe.tessellator.tessellate(dc); - } - - this.terrainRight = null; - dc.globe.offset = 1; - dc.globeStateKey = dc.globe.stateKey; - if (dc.globe.intersectsFrustum(dc.frustumInModelCoordinates)) { - this.terrainRight = dc.globe.tessellator.tessellate(dc); - } - - this.terrainLeft = null; - dc.globe.offset = -1; - dc.globeStateKey = dc.globe.stateKey; - if (dc.globe.intersectsFrustum(dc.frustumInModelCoordinates)) { - this.terrainLeft = dc.globe.tessellator.tessellate(dc); - } -}; - -WorldWindow.prototype.draw2DContiguous = function () { - var drawing = ""; - - if (this.terrainCenter) { - drawing += " 0 "; - this.makeCurrent(0); - this.deferOrderedRendering = this.terrainLeft || this.terrainRight; - this.doDraw(); - } - - if (this.terrainRight) { - drawing += " 1 "; - this.makeCurrent(1); - this.deferOrderedRendering = this.terrainLeft || this.terrainLeft; - this.doDraw(); - } - - this.deferOrderedRendering = false; - - if (this.terrainLeft) { - drawing += " -1 "; - this.makeCurrent(-1); - this.doDraw(); - } - // - //console.log(drawing); - - if (this.subsurfaceMode && this.hasStencilBuffer) { - this.deferOrderedRendering = true; - - if (this.terrainCenter) { - drawing += " 0 "; - this.makeCurrent(0); - this.redrawSurface(); - } - - if (this.terrainRight) { - drawing += " 1 "; - this.makeCurrent(1); - this.redrawSurface(); - } - - if (this.terrainLeft) { - drawing += " -1 "; - this.makeCurrent(-1); - this.redrawSurface(); - } - } - - this.drawScreenRenderables(); -}; - -WorldWindow.prototype.pick2DContiguous = function () { - if (this.terrainCenter) { - this.makeCurrent(0); - this.deferOrderedRendering = this.terrainLeft || this.terrainRight; - this.doPick(); - } - - if (this.terrainRight) { - this.makeCurrent(1); - this.deferOrderedRendering = this.terrainLeft || this.terrainLeft; - this.doPick(); - } - - this.deferOrderedRendering = false; - - if (this.terrainLeft) { - this.makeCurrent(-1); - this.doPick(); - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.drawLayers = function (accumulateOrderedRenderables) { - // Draw all the layers attached to this WorldWindow. - - var beginTime = Date.now(), - dc = this.drawContext, - layers = dc.layers, - layer; - - dc.accumulateOrderedRenderables = accumulateOrderedRenderables; - - for (var i = 0, len = layers.length; i < len; i++) { - layer = layers[i]; - if (layer) { - dc.currentLayer = layer; - try { - layer.render(dc); - } catch (e) { - Logger.log(Logger.LEVEL_SEVERE, "Error while rendering layer " + layer.displayName + ".\n" - + e.toString()); - // Keep going. Render the rest of the layers. - } - } - } - dc.currentLayer = null; - var now = Date.now(); - dc.frameStatistics.layerRenderingTime = now - beginTime; -}; - -/** - * Adds a specified layer to the end of this WorldWindow. - * @param {Layer} layer The layer to add. May be null or undefined, in which case this WorldWindow is not - * modified. - */ -WorldWindow.prototype.addLayer = function (layer) { - if (layer) { - this.layers.push(layer); - } -}; - -/** - * Removes the first instance of a specified layer from this WorldWindow. - * @param {Layer} layer The layer to remove. May be null or undefined, in which case this WorldWindow is not - * modified. This WorldWindow is also not modified if the specified layer does not exist in this WorldWindow's - * layer list. - */ -WorldWindow.prototype.removeLayer = function (layer) { - var index = this.indexOfLayer(layer); - if (index >= 0) { - this.layers.splice(index, 1); - } -}; - -/** - * Inserts a specified layer at a specified position in this WorldWindow. - * @param {Number} index The index at which to insert the layer. May be negative to specify the position - * from the end of the array. - * @param {Layer} layer The layer to insert. May be null or undefined, in which case this WorldWindow is not - * modified. - */ -WorldWindow.prototype.insertLayer = function (index, layer) { - if (layer) { - this.layers.splice(index, 0, layer); - } -}; - -/** - * Returns the index of a specified layer in this WorldWindow. - * @param {Layer} layer The layer to search for. - * @returns {Number} The index of the specified layer or -1 if it doesn't exist in this WorldWindow. - */ -WorldWindow.prototype.indexOfLayer = function (layer) { - return this.layers.indexOf(layer); -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.drawSurfaceRenderables = function () { - var dc = this.drawContext, - sr; - - dc.reverseSurfaceRenderables(); - - while (sr = dc.popSurfaceRenderable()) { - try { - sr.renderSurface(dc); - } catch (e) { - Logger.logMessage(Logger.LEVEL_WARNING, "WorldWindow", "drawSurfaceRenderables", - "Error while rendering a surface renderable.\n" + e.message); - // Keep going. Render the rest of the surface renderables. - } - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.drawOrderedRenderables = function () { - var beginTime = Date.now(), - dc = this.drawContext, - or; - - dc.sortOrderedRenderables(); - - if (this._orderedRenderingFilters) { - for (var f = 0; f < this._orderedRenderingFilters.length; f++) { - this._orderedRenderingFilters[f](this.drawContext); - } - } - - dc.orderedRenderingMode = true; - - while (or = dc.popOrderedRenderable()) { - try { - or.renderOrdered(dc); - } catch (e) { - Logger.logMessage(Logger.LEVEL_WARNING, "WorldWindow", "drawOrderedRenderables", - "Error while rendering an ordered renderable.\n" + e.message); - // Keep going. Render the rest of the ordered renderables. - } - } - - dc.orderedRenderingMode = false; - dc.frameStatistics.orderedRenderingTime = Date.now() - beginTime; -}; - -WorldWindow.prototype.drawScreenRenderables = function () { - var dc = this.drawContext, - or; - - while (or = dc.nextScreenRenderable()) { - try { - or.renderOrdered(dc); - } catch (e) { - Logger.logMessage(Logger.LEVEL_WARNING, "WorldWindow", "drawOrderedRenderables", - "Error while rendering a screen renderable.\n" + e.message); - // Keep going. Render the rest of the screen renderables. - } - } -}; - -// Internal function. Intentionally not documented. -WorldWindow.prototype.resolveTopPick = function () { - if (this.drawContext.objectsAtPickPoint.objects.length == 0) { - return; // nothing picked; avoid calling readPickColor unnecessarily - } - - // Make a last reading to determine what's on top. - - var pickedObjects = this.drawContext.objectsAtPickPoint, - pickColor = this.drawContext.readPickColor(this.drawContext.pickPoint), - topObject = null, - terrainObject = null; - - if (pickColor) { - // Find the picked object with the top color code and set its isOnTop flag. - for (var i = 0, len = pickedObjects.objects.length; i < len; i++) { - var po = pickedObjects.objects[i]; - - if (po.isTerrain) { - terrainObject = po; - } - - if (po.color.equals(pickColor)) { - po.isOnTop = true; - topObject = po; - - if (terrainObject) { - break; // no need to search for more than the top object and the terrain object - } - } - } - - // In single-pick mode provide only the top-most object and the terrain object, if any. - if (!this.drawContext.deepPicking) { - pickedObjects.clear(); - if (topObject) { - pickedObjects.add(topObject); - } - if (terrainObject && terrainObject != topObject) { - pickedObjects.add(terrainObject); - } - } - } else { - pickedObjects.clear(); // nothing drawn at the pick point - } -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.resolveTerrainPick = function () { - var pickedObjects = this.drawContext.objectsAtPickPoint, - po; - - // Mark the first picked terrain object as "on top". The picked object list should contain only one entry - // indicating the picked terrain object, but we iterate over the list contents anyway. - for (var i = 0, len = pickedObjects.objects.length; i < len; i++) { - po = pickedObjects.objects[i]; - if (po.isTerrain) { - po.isOnTop = true; - break; - } - } -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.resolveRegionPick = function () { - if (this.drawContext.objectsAtPickPoint.objects.length == 0) { - return; // nothing picked; avoid calling readPickColors unnecessarily - } - - // Mark every picked object with a color in the pick buffer as "on top". - - var pickedObjects = this.drawContext.objectsAtPickPoint, - uniquePickColors = this.drawContext.readPickColors(this.drawContext.pickRectangle), - po, - color; - - for (var i = 0, len = pickedObjects.objects.length; i < len; i++) { - po = pickedObjects.objects[i]; - if (!po) continue; - var poColor = po.color.toByteString(); - color = uniquePickColors[poColor]; - if (color) { - po.isOnTop = true; - } else if (po.userObject instanceof SurfaceShape) { - // SurfaceShapes ALWAYS get added to the pick list, since their rendering is deferred - // until the tile they are cached by is rendered. So a SurfaceShape may be in the pick list - // but is not seen in the pick rectangle. - // - // Remove the SurfaceShape that was not visible to the pick rectangle. - pickedObjects.objects.splice(i, 1); - i -= 1; - } - } -}; - -// Internal. Intentionally not documented. -WorldWindow.prototype.callRedrawCallbacks = function (stage) { - for (var i = 0, len = this._redrawCallbacks.length; i < len; i++) { - try { - this._redrawCallbacks[i](this, stage); - } catch (e) { - Logger.log(Logger.LEVEL_SEVERE, "Exception calling redraw callback.\n" + e.toString()); - // Keep going. Execute the rest of the callbacks. - } - } -}; - -/** - * Moves this WorldWindow's navigator to a specified location or position. - * @param {Location | Position} position The location or position to move the navigator to. If this - * argument contains an "altitude" property, as {@link Position} does, the end point of the navigation is - * at the specified altitude. Otherwise the end point is at the current altitude of the navigator. - * - * This function uses this WorldWindow's {@link GoToAnimator} property to perform the move. That object's - * properties can be specified by the application to modify its behavior during calls to this function. - * It's cancel method can also be used to cancel the move initiated by this function. - * @param {Function} completionCallback If not null or undefined, specifies a function to call when the - * animation completes. The completion callback is called with a single argument, this animator. - * @throws {ArgumentError} If the specified location or position is null or undefined. - */ -WorldWindow.prototype.goTo = function (position, completionCallback) { - this.goToAnimator.goTo(position, completionCallback); -}; - -/** - * Declutters the current ordered renderables with a specified group ID. This function is not called by - * applications directly. It's meant to be invoked as an ordered rendering filter in this WorldWindow's - * [orderedRenderingFilters]{@link WorldWindow#orderedRenderingFilters} property. - * <p> - * The function operates by setting the target visibility of occluded shapes to 0 and unoccluded shapes to 1. - * @param {DrawContext} dc The current draw context. - * @param {Number} groupId The ID of the group to declutter. Must not be null, undefined or 0. - * @throws {ArgumentError} If the specified group ID is null, undefined or 0. - */ -WorldWindow.prototype.declutter = function (dc, groupId) { - if (!groupId) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "declutter", - "Group ID is null, undefined or 0.")); - } - - // Collect all the declutterables in the specified group. - var declutterables = []; - for (var i = 0; i < dc.orderedRenderables.length; i++) { - var orderedRenderable = dc.orderedRenderables[i].orderedRenderable; - if (orderedRenderable.declutterGroup === groupId) { - declutterables.push(orderedRenderable); - } - } - - // Filter the declutterables by determining which are partially occluded. Since the ordered renderable - // list was already sorted from front to back, the front-most will represent an entire occluded group. - var rects = []; - for (var j = 0; j < declutterables.length; j++) { - var declutterable = declutterables[j], - screenBounds = declutterable.screenBounds; - - if (screenBounds && screenBounds.intersectsRectangles(rects)) { - declutterable.targetVisibility = 0; - } else { - declutterable.targetVisibility = 1; - if (screenBounds) { - rects.push(screenBounds); - } - } - } -}; - -/** - * Computes a ray originating at the eyePoint and extending through the specified point in window - * coordinates. - * <p> - * The specified point is understood to be in the window coordinate system of the WorldWindow, with the origin - * in the top-left corner and axes that extend down and to the right from the origin point. - * <p> - * The results of this method are undefined if the specified point is outside of the WorldWindow's - * bounds. - * - * @param {Vec2} point The window coordinates point to compute a ray for. - * @returns {Line} A new Line initialized to the origin and direction of the computed ray, or null if the - * ray could not be computed. - */ -WorldWindow.prototype.rayThroughScreenPoint = function (point) { - if (!point) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindow", "rayThroughScreenPoint", - "missingPoint")); - } - - // Convert the point's xy coordinates from window coordinates to WebGL screen coordinates. - var screenPoint = new Vec3(point[0], this.viewport.height - point[1], 0), - nearPoint = new Vec3(0, 0, 0), - farPoint = new Vec3(0, 0, 0); - - this.computeViewingTransform(this.scratchProjection, this.scratchModelview); - var modelviewProjection = Matrix.fromIdentity(); - modelviewProjection.setToMultiply(this.scratchProjection, this.scratchModelview); - var modelviewProjectionInv = Matrix.fromIdentity(); - modelviewProjectionInv.invertMatrix(modelviewProjection); - - // Compute the model coordinate point on the near clip plane with the xy coordinates and depth 0. - if (!modelviewProjectionInv.unProject(screenPoint, this.viewport, nearPoint)) { - return null; - } - - // Compute the model coordinate point on the far clip plane with the xy coordinates and depth 1. - screenPoint[2] = 1; - if (!modelviewProjectionInv.unProject(screenPoint, this.viewport, farPoint)) { - return null; - } - - var eyePoint = this.scratchModelview.extractEyePoint(new Vec3(0, 0, 0)); - - // Compute a ray originating at the eye point and with direction pointing from the xy coordinate on the near - // plane to the same xy coordinate on the far plane. - var origin = new Vec3(eyePoint[0], eyePoint[1], eyePoint[2]), - direction = new Vec3(farPoint[0], farPoint[1], farPoint[2]); - - direction.subtract(nearPoint); - direction.normalize(); - - return new Line(origin, direction); -}; - -export default WorldWindow; diff --git a/web/src/gis/WorldWindowController.js b/web/src/gis/WorldWindowController.js deleted file mode 100644 index f49b2bd7..00000000 --- a/web/src/gis/WorldWindowController.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports WorldWindowController - */ -import ArgumentError from './error/ArgumentError'; -import Logger from './util/Logger'; -import UnsupportedOperationError from './error/UnsupportedOperationError'; - - -/** - * Constructs a root window controller. - * @alias WorldWindowController - * @constructor - * @abstract - * @classDesc This class provides a base window controller with required properties and methods which sub-classes may - * inherit from to create custom window controllers for controlling the globe via user interaction. - * @param {WorldWindow} worldWindow The WorldWindow associated with this layer. - * @throws {ArgumentError} If the specified WorldWindow is null or undefined. - */ -function WorldWindowController(worldWindow) { - if (!worldWindow) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindowController", "constructor", "missingWorldWindow")); - } - - /** - * The WorldWindow associated with this controller. - * @type {WorldWindow} - * @readonly - */ - this.wwd = worldWindow; - - // Intentionally not documented. - this.allGestureListeners = []; -} - -// Intentionally not documented. -WorldWindowController.prototype.onGestureEvent = function (event) { - var handled = false; - - for (var i = 0; i < this.allGestureListeners.length && !handled; i++) { - handled |= this.allGestureListeners[i].onGestureEvent(event); - } - - return handled; -}; - -// Intentionally not documented. -WorldWindowController.prototype.gestureStateChanged = function (recognizer) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindowController", "gestureStateChanged", "abstractInvocation")); -}; - -/** - * Registers a gesture event listener on this controller. Registering event listeners using this function - * enables applications to prevent the controller's default behavior. - * - * Listeners must implement an onGestureEvent method to receive event notifications. The onGestureEvent method will - * receive one parameter containing the information about the gesture event. Returning true from onGestureEvent - * indicates that the event was processed and will prevent any further handling of the event. - * - * When an event occurs, application event listeners are called before WorldWindowController event listeners. - * - * @param listener The function to call when the event occurs. - * @throws {ArgumentError} If any argument is null or undefined. - */ -WorldWindowController.prototype.addGestureListener = function (listener) { - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindowController", "addGestureListener", "missingListener")); - } - - this.allGestureListeners.push(listener); -}; - -/** - * Removes a gesture event listener from this controller. The listener must be the same object passed to - * addGestureListener. Calling removeGestureListener with arguments that do not identify a currently registered - * listener has no effect. - * - * @param listener The listener to remove. Must be the same object passed to addGestureListener. - * @throws {ArgumentError} If any argument is null or undefined. - */ -WorldWindowController.prototype.removeGestureListener = function (listener) { - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WorldWindowController", "removeGestureListener", "missingListener")); - } - - var index = this.allGestureListeners.indexOf(listener); - if (index !== -1) { - this.allGestureListeners.splice(index, 1); // remove the listener from the list - } -}; - -/** - * Called by WorldWindow to allow the controller to enforce navigation limits. Implementation is not required by - * sub-classes. - */ -WorldWindowController.prototype.applyLimits = function () { - -}; - -export default WorldWindowController; - diff --git a/web/src/gis/cache/GpuResourceCache.js b/web/src/gis/cache/GpuResourceCache.js deleted file mode 100644 index e664e4cf..00000000 --- a/web/src/gis/cache/GpuResourceCache.js +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GpuResourceCache - */ -import AbsentResourceList from '../util/AbsentResourceList'; -import ArgumentError from '../error/ArgumentError'; -import ImageSource from '../util/ImageSource'; -import Logger from '../util/Logger'; -import MemoryCache from '../cache/MemoryCache'; -import Texture from '../render/Texture'; - - -/** - * Constructs a GPU resource cache for a specified size and low-water value. - * @alias GpuResourceCache - * @constructor - * @classdesc Maintains a cache of GPU resources such as textures and GLSL programs. - * Applications typically do not interact with this class unless they create their own shapes. - * @param {Number} capacity The cache capacity, in bytes. - * @param {Number} lowWater The number of bytes to clear the cache to when it exceeds its capacity. - * @throws {ArgumentError} If the specified capacity is undefined, 0 or negative or the low-water value is - * undefined, negative or not less than the capacity. - */ -function GpuResourceCache(capacity, lowWater) { - if (!capacity || capacity < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GpuResourceCache", "constructor", - "Specified cache capacity is undefined, 0 or negative.")); - } - - if (!lowWater || lowWater < 0 || lowWater >= capacity) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GpuResourceCache", "constructor", - "Specified cache low-water value is undefined, negative or not less than the capacity.")); - } - - // Private. Holds the actual cache entries. - this.entries = new MemoryCache(capacity, lowWater); - - // Private. Counter for generating cache keys. - this.cacheKeyPool = 0; - - // Private. List of retrievals currently in progress. - this.currentRetrievals = {}; - - // Private. Identifies requested resources that whose retrieval failed. - this.absentResourceList = new AbsentResourceList(3, 60e3); -} - -Object.defineProperties(GpuResourceCache.prototype, { - /** - * Indicates the capacity of this cache in bytes. - * @type {Number} - * @readonly - * @memberof GpuResourceCache.prototype - */ - capacity: { - get: function () { - return this.entries.capacity; - } - }, - - /** - * Indicates the low-water value for this cache in bytes, the size this cache is cleared to when it - * exceeds its capacity. - * @type {Number} - * @readonly - * @memberof GpuResourceCache.prototype - */ - lowWater: { - get: function () { - return this.entries.lowWater; - } - }, - - /** - * Indicates the number of bytes currently used by this cache. - * @type {Number} - * @readonly - * @memberof GpuResourceCache.prototype - */ - usedCapacity: { - get: function () { - return this.entries.usedCapacity; - } - }, - - /** - * Indicates the number of free bytes in this cache. - * @type {Number} - * @readonly - * @memberof GpuResourceCache.prototype - */ - freeCapacity: { - get: function () { - return this.entries.freeCapacity; - } - } -}); - -/** - * Creates a cache key unique to this cache, typically for a resource about to be added to this cache. - * @returns {String} The generated cache key. - */ -GpuResourceCache.prototype.generateCacheKey = function () { - return "GpuResourceCache " + ++this.cacheKeyPool; -}; - -/** - * Adds a specified resource to this cache. Replaces the existing resource for the specified key if the - * cache currently contains a resource for that key. - * @param {String|ImageSource} key The key or image source of the resource to add. - * @param {Object} resource The resource to add to the cache. - * @param {Number} size The resource's size in bytes. Must be greater than 0. - * @throws {ArgumentError} If either the key or resource arguments is null or undefined - * or if the specified size is less than 1. - */ -GpuResourceCache.prototype.putResource = function (key, resource, size) { - if (!key) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GpuResourceCache", "putResource", "missingKey.")); - } - - if (!resource) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GpuResourceCache", "putResource", "missingResource.")); - } - - if (!size || size < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GpuResourceCache", "putResource", - "The specified resource size is undefined or less than 1.")); - } - - var entry = { - resource: resource - }; - - this.entries.putEntry(key instanceof ImageSource ? key.key : key, entry, size); -}; - -/** - * Returns the resource associated with a specified key. - * @param {String|ImageSource} key The key or image source of the resource to find. - * @returns {Object} The resource associated with the specified key, or null if the resource is not in - * this cache or the specified key is null or undefined. - */ -GpuResourceCache.prototype.resourceForKey = function (key) { - var entry = key instanceof ImageSource - ? this.entries.entryForKey(key.key) : this.entries.entryForKey(key); - - var resource = entry ? entry.resource : null; - - // This is faster than checking if the resource is a texture using instanceof. - if (resource !== null && typeof resource.clearTexParameters === "function") { - resource.clearTexParameters(); - } - - return resource; -}; - -/** - * Sets a resource's aging factor (multiplier). - * @param {String} key The key of the resource to modify. If null or undefined, the resource's cache entry is not modified. - * @param {Number} agingFactor A multiplier applied to the age of the resource. - */ -GpuResourceCache.prototype.setResourceAgingFactor = function (key, agingFactor) { - this.entries.setEntryAgingFactor(key, agingFactor); -}; - -/** - * Indicates whether a specified resource is in this cache. - * @param {String|ImageSource} key The key or image source of the resource to find. - * @returns {Boolean} true If the resource is in this cache, false if the resource - * is not in this cache or the specified key is null or undefined. - */ -GpuResourceCache.prototype.containsResource = function (key) { - return this.entries.containsKey(key instanceof ImageSource ? key.key : key); -}; - -/** - * Removes the specified resource from this cache. The cache is not modified if the specified key is null or - * undefined or does not correspond to an entry in the cache. - * @param {String|ImageSource} key The key or image source of the resource to remove. - */ -GpuResourceCache.prototype.removeResource = function (key) { - this.entries.removeEntry(key instanceof ImageSource ? key.key : key); -}; - -/** - * Removes all resources from this cache. - */ -GpuResourceCache.prototype.clear = function () { - this.entries.clear(false); -}; - -/** - * Retrieves an image and adds it to this cache when it arrives. If the specified image source is a URL, a - * retrieval request for the image is made and this method returns immediately with a value of null. A redraw - * event is generated when the image subsequently arrives and is added to this cache. If the image source is an - * {@link ImageSource}, the image is used immediately and this method returns the {@link Texture} created and - * cached for the image. No redraw event is generated in this case. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {String|ImageSource} imageSource The image source, either a {@link ImageSource} or a String - * giving the URL of the image. - * @param {GLenum} wrapMode Optional. Specifies the wrap mode of the texture. Defaults to gl.CLAMP_TO_EDGE - * @returns {Texture} The {@link Texture} created for the image if the specified image source is an - * {@link ImageSource}, otherwise null. - */ -GpuResourceCache.prototype.retrieveTexture = function (gl, imageSource, wrapMode) { - if (!imageSource) { - return null; - } - - if (imageSource instanceof ImageSource) { - var t = new Texture(gl, imageSource.image, wrapMode); - this.putResource(imageSource.key, t, t.size); - return t; - } - - if (this.currentRetrievals[imageSource] || this.absentResourceList.isResourceAbsent(imageSource)) { - return null; - } - - var cache = this, - image = new Image(); - - image.onload = function () { - Logger.log(Logger.LEVEL_INFO, "Image retrieval succeeded: " + imageSource); - - var texture = new Texture(gl, image, wrapMode); - - cache.putResource(imageSource, texture, texture.size); - - delete cache.currentRetrievals[imageSource]; - cache.absentResourceList.unmarkResourceAbsent(imageSource); - - // Send an event to request a redraw. - var e = document.createEvent('Event'); - e.initEvent(WorldWind.REDRAW_EVENT_TYPE, true, true); - window.dispatchEvent(e); - }; - - image.onerror = function () { - delete cache.currentRetrievals[imageSource]; - cache.absentResourceList.markResourceAbsent(imageSource); - Logger.log(Logger.LEVEL_WARNING, "Image retrieval failed: " + imageSource); - }; - - this.currentRetrievals[imageSource] = imageSource; - image.crossOrigin = 'anonymous'; - image.src = imageSource; - - return null; -}; - -export default GpuResourceCache; diff --git a/web/src/gis/cache/MemoryCache.js b/web/src/gis/cache/MemoryCache.js deleted file mode 100644 index b9fff367..00000000 --- a/web/src/gis/cache/MemoryCache.js +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports MemoryCache - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs a memory cache of a specified size. - * @alias MemoryCache - * @constructor - * @classdesc Provides a limited-size memory cache of key-value pairs. The meaning of size depends on usage. - * Some instances of this class work in bytes while others work in counts. See the documentation for the - * specific use to determine the size units. - * @param {Number} capacity The cache's capacity. - * @param {Number} lowWater The size to clear the cache to when its capacity is exceeded. - * @throws {ArgumentError} If either the capacity is 0 or negative or the low-water value is greater than - * or equal to the capacity or less than 1. - */ -function MemoryCache(capacity, lowWater) { - if (!capacity || capacity < 1) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "constructor", - "The specified capacity is undefined, zero or negative")); - } - - if (!lowWater || lowWater >= capacity || lowWater < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "constructor", - "The specified low-water value is undefined, greater than or equal to the capacity, or less than 1")); - } - - // Documented with its property accessor below. - this._capacity = capacity; - - // Documented with its property accessor below. - this._lowWater = lowWater; - - /** - * The size currently used by this cache. - * @type {Number} - * @readonly - */ - this.usedCapacity = 0; - - /** - * The size currently unused by this cache. - * @type {Number} - * @readonly - */ - this.freeCapacity = capacity; - - // Private. The cache entries. - this.entries = {}; - - // Private. The cache listeners. - this.listeners = []; -} - -Object.defineProperties(MemoryCache.prototype, { - /** - * The maximum this cache may hold. When the capacity is explicitly set via this property, and the current - * low-water value is greater than the specified capacity, the low-water value is adjusted to be 85% of - * the specified capacity. The specified capacity may not be less than or equal to 0. - * @type {Number} - * @memberof MemoryCache.prototype - */ - capacity: { - get: function () { - return this._capacity; - }, - set: function (value) { - if (!value || value < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "capacity", - "Specified cache capacity is undefined, 0 or negative.")); - } - - var oldCapacity = this._capacity; - - this._capacity = value; - - if (this._capacity <= this.lowWater) { - this._lowWater = 0.85 * this._capacity; - } - - // Trim the cache to the low-water mark if it's less than the old capacity - if (this._capacity < oldCapacity) { - this.makeSpace(0); - } - } - }, - - /** - * The size to clear this cache to when its capacity is exceeded. It must be less than the current - * capacity and not negative. - * @type {Number} - * @memberof MemoryCache.prototype - */ - lowWater: { - get: function () { - return this._lowWater; - }, - set: function (value) { - if (!value || value >= this._capacity || value < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "lowWater", - "Specified cache low-water value is undefined, negative or not less than the current capacity.")); - } - - this._lowWater = value; - } - } -}); - -/** - * Returns the entry for a specified key. - * @param {String} key The key of the entry to return. - * @returns {Object} The entry associated with the specified key, or null if the key is not in the cache or - * is null or undefined. - */ -MemoryCache.prototype.entryForKey = function (key) { - if (!key) - return null; - - var cacheEntry = this.entries[key]; - if (!cacheEntry) - return null; - - cacheEntry.lastUsed = Date.now(); - - return cacheEntry.entry; -}; - -/** - * Adds a specified entry to this cache. - * @param {String} key The entry's key. - * @param {Object} entry The entry. - * @param {Number} size The entry's size. - * @throws {ArgumentError} If the specified key or entry is null or undefined or the specified size is less - * than 1. - */ -MemoryCache.prototype.putEntry = function (key, entry, size) { - if (!key) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "putEntry", "missingKey.")); - } - - if (!entry) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "putEntry", "missingEntry.")); - } - - if (size < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "putEntry", - "The specified entry size is less than 1.")); - } - - var existing = this.entries[key], - cacheEntry; - - if (existing) { - this.removeEntry(key); - } - - if (this.usedCapacity + size > this._capacity) { - this.makeSpace(size); - } - - this.usedCapacity += size; - this.freeCapacity = this._capacity - this.usedCapacity; - - cacheEntry = { - key: key, - entry: entry, - size: size, - lastUsed: Date.now(), - agingFactor: 1 // 1x = normal aging - }; - - this.entries[key] = cacheEntry; -}; - -/** - * Removes all resources from this cache. - * @param {Boolean} callListeners If true, the current cache listeners are called for each entry removed. - * If false, the cache listeners are not called. - */ -MemoryCache.prototype.clear = function (callListeners) { - if (callListeners) { - // Remove each entry individually so that the listeners can be called for each entry. - for (var key in this.entries) { - if (this.entries.hasOwnProperty(key)) { - this.removeCacheEntry(key); - } - } - } - - this.entries = {}; - this.freeCapacity = this._capacity; - this.usedCapacity = 0; -}; - -/** - * Remove an entry from this cache. - * @param {String} key The key of the entry to remove. If null or undefined, this cache is not modified. - */ -MemoryCache.prototype.removeEntry = function (key) { - if (!key) - return; - - var cacheEntry = this.entries[key]; - if (cacheEntry) { - this.removeCacheEntry(cacheEntry); - } -}; - -/** - * Sets an entry's aging factor (multiplier) used to sort the entries for eviction. - * A value of one is normal aging; a value of two invokes 2x aging, causing - * the entry to become twice as old as a normal sibling with the same - * 'last used' timestamp. Setting a value of zero would be a "fountain - * of youth" for an entry as it wouldn't age and thus would sort to the - * bottom of the eviction queue. - * @param {String} key The key of the entry to modify. If null or undefined, the cache entry is not modified. - * @param {Number} agingFactor A multiplier applied to the age of the entry when sorting candidates for eviction. - * - */ -MemoryCache.prototype.setEntryAgingFactor = function (key, agingFactor) { - if (!key) - return; - - var cacheEntry = this.entries[key]; - if (cacheEntry) { - cacheEntry.agingFactor = agingFactor; - } -}; - -// Private. Removes a specified entry from this cache. -MemoryCache.prototype.removeCacheEntry = function (cacheEntry) { - // All removal passes through this function. - - delete this.entries[cacheEntry.key]; - - this.usedCapacity -= cacheEntry.size; - this.freeCapacity = this._capacity - this.usedCapacity; - - for (var i = 0, len = this.listeners.length; i < len; i++) { - try { - this.listeners[i].entryRemoved(cacheEntry.key, cacheEntry.entry); - } catch (e) { - this.listeners[i].removalError(e, cacheEntry.key, cacheEntry.entry); - } - } -}; - -/** - * Indicates whether a specified entry is in this cache. - * @param {String} key The key of the entry to search for. - * @returns {Boolean} true if the entry exists, otherwise false. - */ -MemoryCache.prototype.containsKey = function (key) { - return key && this.entries[key]; -}; - -/** - * Adds a cache listener to this cache. - * @param {MemoryCacheListener} listener The listener to add. - * @throws {ArgumentError} If the specified listener is null or undefined or does not implement both the - * entryRemoved and removalError functions. - */ -MemoryCache.prototype.addCacheListener = function (listener) { - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "addCacheListener", "missingListener")); - } - - if (typeof listener.entryRemoved !== "function" || typeof listener.removalError !== "function") { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "addCacheListener", - "The specified listener does not implement the required functions.")); - } - - this.listeners.push(listener); -}; - -/** - * Removes a cache listener from this cache. - * @param {MemoryCacheListener} listener The listener to remove. - * @throws {ArgumentError} If the specified listener is null or undefined. - */ -MemoryCache.prototype.removeCacheListener = function (listener) { - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCache", "removeCacheListener", "missingListener")); - } - - var index = this.listeners.indexOf(listener); - if (index > -1) { - this.listeners.splice(index, 1); - } -}; - -// Private. Clears this cache to that necessary to contain a specified amount of free space. -MemoryCache.prototype.makeSpace = function (spaceRequired) { - var sortedEntries = [], - now = Date.now(); - - // Sort the entries from least recently used to most recently used, then remove the least recently used entries - // until the cache capacity reaches the low water and the cache has enough free capacity for the required - // space. - for (var key in this.entries) { - if (this.entries.hasOwnProperty(key)) { - sortedEntries.push(this.entries[key]); - } - } - sortedEntries.sort(function (a, b) { - var aAge = (now - a.lastUsed) * a.agingFactor, - bAge = (now - b.lastUsed) * b.agingFactor; - return bAge - aAge; - }); - - for (var i = 0, len = sortedEntries.length; i < len; i++) { - if (this.usedCapacity > this._lowWater || this.freeCapacity < spaceRequired) { - this.removeCacheEntry(sortedEntries[i]); - } else { - break; - } - } -}; - -export default MemoryCache; diff --git a/web/src/gis/cache/MemoryCacheListener.js b/web/src/gis/cache/MemoryCacheListener.js deleted file mode 100644 index 8e1c7c1b..00000000 --- a/web/src/gis/cache/MemoryCacheListener.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Defines an interface for {@link MemoryCache} listeners. - * @exports MemoryCacheListener - * @interface MemoryCacheListener - */ -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * @alias MemoryCacheListener - * @constructor - */ -function MemoryCacheListener() { -} - -/** - * Called when an entry is removed from the cache. - * Implementers of this interface must implement this function. - * @param {String} key The key of the entry removed. - * @param {Object} entry The entry removed. - */ -MemoryCacheListener.prototype.entryRemoved = function (key, entry) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCacheListener", "entryRemoved", "abstractInvocation")); -}; - -/** - * Called when an error occurs during entry removal. - * Implementers of this interface must implement this function. - * @param {Object} error The error object describing the error that occurred. - * @param {String} key The key of the entry being removed. - * @param {Object} entry The entry being removed. - */ -MemoryCacheListener.prototype.removalError = function (error, key, entry) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "MemoryCacheListener", "removalError", "abstractInvocation")); -}; - -export default MemoryCacheListener; diff --git a/web/src/gis/error/AbstractError.js b/web/src/gis/error/AbstractError.js deleted file mode 100644 index 6bdb028a..00000000 --- a/web/src/gis/error/AbstractError.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AbstractError - */ - - - -/** - * Constructs an error with a specified name and message. - * @alias AbstractError - * @constructor - * @abstract - * @classdesc Provides an abstract base class for error classes. This class is not meant to be instantiated - * directly but used only by subclasses. - * @param {String} name The error's name. - * @param {String} message The message. - */ -function AbstractError(name, message) { - this.name = name; - this.message = message; -} - -/** - * Returns the message and stack trace associated with this error. - * @returns {String} The message and stack trace associated with this error. - */ -AbstractError.prototype.toString = function () { - var str = this.name + ': ' + this.message; - - if (this.stack) { - str += '\n' + this.stack.toString(); - } - - return str; -}; - -export default AbstractError; - diff --git a/web/src/gis/error/ArgumentError.js b/web/src/gis/error/ArgumentError.js deleted file mode 100644 index 3929b8f7..00000000 --- a/web/src/gis/error/ArgumentError.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ArgumentError - */ -import AbstractError from '../error/AbstractError'; - - -/** - * Constructs an argument error with a specified message. - * @alias ArgumentError - * @constructor - * @classdesc Represents an error associated with invalid function arguments. - * @augments AbstractError - * @param {String} message The message. - */ -function ArgumentError(message) { - AbstractError.call(this, "ArgumentError", message); - - var stack; - try { - //noinspection ExceptionCaughtLocallyJS - throw new Error(); - } catch (e) { - stack = e.stack; - } - this.stack = stack; -} - -ArgumentError.prototype = Object.create(AbstractError.prototype); - -export default ArgumentError; diff --git a/web/src/gis/error/NotYetImplementedError.js b/web/src/gis/error/NotYetImplementedError.js deleted file mode 100644 index 16e6b456..00000000 --- a/web/src/gis/error/NotYetImplementedError.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports NotYetImplementedError - */ -import AbstractError from '../error/AbstractError'; - - -/** - * Constructs a not-yet-implemented error with a specified message. - * @alias NotYetImplementedError - * @constructor - * @classdesc Represents an error associated with an operation that is not yet implemented. - * @augments AbstractError - * @param {String} message The message. - */ -function NotYetImplementedError(message) { - AbstractError.call(this, "NotYetImplementedError", message); - - var stack; - try { - //noinspection ExceptionCaughtLocallyJS - throw new Error(); - } catch (e) { - stack = e.stack; - } - this.stack = stack; -} - -NotYetImplementedError.prototype = Object.create(AbstractError.prototype); - -export default NotYetImplementedError; diff --git a/web/src/gis/error/UnsupportedOperationError.js b/web/src/gis/error/UnsupportedOperationError.js deleted file mode 100644 index 1cd17d3a..00000000 --- a/web/src/gis/error/UnsupportedOperationError.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports UnsupportedOperationError - */ -import AbstractError from '../error/AbstractError'; - - -/** - * Constructs an unsupported-operation error with a specified message. - * @alias UnsupportedOperationError - * @constructor - * @classdesc Represents an error associated with an operation that is not available or should not be invoked. - * Typically raised when an abstract function of an abstract base class is called because a subclass has not - * implemented the function. - * @augments AbstractError - * @param {String} message The message. - */ -function UnsupportedOperationError(message) { - AbstractError.call(this, "UnsupportedOperationError", message); - - var stack; - try { - //noinspection ExceptionCaughtLocallyJS - throw new Error(); - } catch (e) { - stack = e.stack; - } - this.stack = stack; -} - -UnsupportedOperationError.prototype = Object.create(AbstractError.prototype); - -export default UnsupportedOperationError; diff --git a/web/src/gis/geom/Angle.js b/web/src/gis/geom/Angle.js deleted file mode 100644 index 8d0f7962..00000000 --- a/web/src/gis/geom/Angle.js +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/** - * Provides constants and functions for working with angles. - * @exports Angle - */ - -var Angle = { - /** - * Conversion factor for degrees to radians. - * @constant - */ - DEGREES_TO_RADIANS: Math.PI / 180.0, - /** - * Conversion factor for radians to degrees. - * @constant - */ - RADIANS_TO_DEGREES: 180.0 / Math.PI, - /** - * 2 pi. - * @constant - */ - TWO_PI: 2 * Math.PI, - /** - * pi / 2 - * @constant - */ - HALF_PI: Math.PI / 2, - - /** - * Normalizes a specified value to be within the range of [-180, 180] degrees. - * @param {Number} degrees The value to normalize, in degrees. - * @returns {Number} The specified value normalized to [-180, 180] degrees. - */ - normalizedDegrees: function (degrees) { - var angle = degrees % 360; - - return angle > 180 ? angle - 360 : angle < -180 ? 360 + angle : angle; - }, - - /** - * Normalizes a specified value to be within the range of [-90, 90] degrees. - * @param {Number} degrees The value to normalize, in degrees. - * @returns {Number} The specified value normalized to the normal range of latitude. - */ - normalizedDegreesLatitude: function (degrees) { - var lat = degrees % 180; - - return lat > 90 ? 180 - lat : lat < -90 ? -180 - lat : lat; - }, - - /** - * Normalizes a specified value to be within the range of [-180, 180] degrees. - * @param {Number} degrees The value to normalize, in degrees. - * @returns {Number} The specified value normalized to the normal range of longitude. - */ - normalizedDegreesLongitude: function (degrees) { - var lon = degrees % 360; - - return lon > 180 ? lon - 360 : lon < -180 ? 360 + lon : lon; - }, - - /** - * Normalizes a specified value to be within the range of [-Pi, Pi] radians. - * @param {Number} radians The value to normalize, in radians. - * @returns {Number} The specified value normalized to [-Pi, Pi] radians. - */ - normalizedRadians: function (radians) { - var angle = radians % this.TWO_PI; - - return angle > Math.PI ? angle - this.TWO_PI : angle < -Math.PI ? this.TWO_PI + angle : angle; - }, - - /** - * Normalizes a specified value to be within the range of [-Pi/2, Pi/2] radians. - * @param {Number} radians The value to normalize, in radians. - * @returns {Number} The specified value normalized to the normal range of latitude. - */ - normalizedRadiansLatitude: function (radians) { - var lat = radians % Math.PI; - - return lat > this.HALF_PI ? Math.PI - lat : lat < -this.HALF_PI ? -Math.PI - lat : lat; - }, - - /** - * Normalizes a specified value to be within the range of [-Pi, Pi] radians. - * @param {Number} radians The value to normalize, in radians. - * @returns {Number} The specified value normalized to the normal range of longitude. - */ - normalizedRadiansLongitude: function (radians) { - var lon = radians % this.TWO_PI; - - return lon > Math.PI ? lon - this.TWO_PI : lon < -Math.PI ? this.TWO_PI + lon : lon; - }, - - /** - * Indicates whether a specified value is within the normal range of latitude, [-90, 90]. - * @param {Number} degrees The value to test, in degrees. - * @returns {Boolean} true if the value is within the normal range of latitude, otherwise false. - */ - isValidLatitude: function (degrees) { - return degrees >= -90 && degrees <= 90; - }, - - /** - * Indicates whether a specified value is within the normal range of longitude, [-180, 180]. - * @param {Number} degrees The value to test, in degrees. - * @returns {boolean} true if the value is within the normal range of longitude, otherwise false. - */ - isValidLongitude: function (degrees) { - return degrees >= -180 && degrees <= 180; - }, - - /** - * Returns a string representation of a specified value in degrees. - * @param {Number} degrees The value for which to compute the string. - * @returns {String} The computed string, which is a decimal degrees value followed by the degree symbol. - */ - toString: function (degrees) { - return degrees.toString() + '\u00B0'; - }, - - /** - * Returns a decimal degrees string representation of a specified value in degrees. - * @param {Number} degrees The value for which to compute the string. - * @returns {String} The computed string, which is a decimal degrees value followed by the degree symbol. - */ - toDecimalDegreesString: function (degrees) { - return degrees.toString() + '\u00B0'; - }, - - /** - * Returns a degrees-minutes-seconds string representation of a specified value in degrees. - * @param {Number} degrees The value for which to compute the string. - * @returns {String} The computed string in degrees, minutes and decimal seconds. - */ - toDMSString: function (degrees) { - var sign, - temp, - d, - m, - s; - - sign = degrees < 0 ? -1 : 1; - temp = sign * degrees; - d = Math.floor(temp); - temp = (temp - d) * 60; - m = Math.floor(temp); - temp = (temp - m) * 60; - s = Math.round(temp); - - if (s == 60) { - m++; - s = 0; - } - if (m == 60) { - d++; - m = 0; - } - - return (sign == -1 ? "-" : "") + d + "\u00B0" + " " + m + "\u2019" + " " + s + "\u201D"; - }, - - /** - * Returns a degrees-minutes string representation of a specified value in degrees. - * @param {Number} degrees The value for which to compute the string. - * @returns {String} The computed string in degrees and decimal minutes. - */ - toDMString: function (degrees) { - var sign, - temp, - d, - m, - s, - mf; - - sign = degrees < 0 ? -1 : 1; - temp = sign * degrees; - d = Math.floor(temp); - temp = (temp - d) * 60; - m = Math.floor(temp); - temp = (temp - m) * 60; - s = Math.round(temp); - - if (s == 60) { - m++; - s = 0; - } - if (m == 60) { - d++; - m = 0; - } - - mf = s == 0 ? m : m + s / 60; - - return (sign == -1 ? "-" : "") + d + "\u00B0" + " " + mf + "\u2019"; - } -}; - -export default Angle; diff --git a/web/src/gis/geom/BoundingBox.js b/web/src/gis/geom/BoundingBox.js deleted file mode 100644 index 1ee0d674..00000000 --- a/web/src/gis/geom/BoundingBox.js +++ /dev/null @@ -1,579 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports BoundingBox - */ -import ArgumentError from '../error/ArgumentError'; -import BasicProgram from '../shaders/BasicProgram'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; -import WWUtil from '../util/WWUtil'; - - -/** - * Constructs a unit bounding box. - * The unit box has its R, S and T axes aligned with the X, Y and Z axes, respectively, and has its length, - * width and height set to 1. - * @alias BoundingBox - * @constructor - * @classdesc Represents a bounding box in Cartesian coordinates. Typically used as a bounding volume. - */ -function BoundingBox() { - - /** - * The box's center point. - * @type {Vec3} - * @default (0, 0, 0) - */ - this.center = new Vec3(0, 0, 0); - - /** - * The center point of the box's bottom. (The origin of the R axis.) - * @type {Vec3} - * @default (-0.5, 0, 0) - */ - this.bottomCenter = new Vec3(-0.5, 0, 0); - - /** - * The center point of the box's top. (The end of the R axis.) - * @type {Vec3} - * @default (0.5, 0, 0) - */ - this.topCenter = new Vec3(0.5, 0, 0); - - /** - * The box's R axis, its longest axis. - * @type {Vec3} - * @default (1, 0, 0) - */ - this.r = new Vec3(1, 0, 0); - - /** - * The box's S axis, its mid-length axis. - * @type {Vec3} - * @default (0, 1, 0) - */ - this.s = new Vec3(0, 1, 0); - - /** - * The box's T axis, its shortest axis. - * @type {Vec3} - * @default (0, 0, 1) - */ - this.t = new Vec3(0, 0, 1); - - /** - * The box's radius. (The half-length of its diagonal.) - * @type {number} - * @default sqrt(3) - */ - this.radius = Math.sqrt(3); - - // Internal use only. Intentionally not documented. - this.tmp1 = new Vec3(0, 0, 0); - this.tmp2 = new Vec3(0, 0, 0); - this.tmp3 = new Vec3(0, 0, 0); - - // Internal use only. Intentionally not documented. - this.scratchElevations = new Float64Array(9); - this.scratchPoints = new Float64Array(3 * this.scratchElevations.length); -} - -// Internal use only. Intentionally not documented. -BoundingBox.scratchMatrix = Matrix.fromIdentity(); - -/** - * Returns the eight {@link Vec3} corners of the box. - * - * @returns {Array} the eight box corners in the order bottom-lower-left, bottom-lower-right, bottom-upper-right, - * bottom-upper-left, top-lower-left, top-lower-right, top-upper-right, top-upper-left. - */ -BoundingBox.prototype.getCorners = function () { - var ll = new Vec3(this.s[0], this.s[1], this.s[2]); - var lr = new Vec3(this.t[0], this.t[1], this.t[2]); - var ur = new Vec3(this.s[0], this.s[1], this.s[2]); - var ul = new Vec3(this.s[0], this.s[1], this.s[2]); - - ll.add(this.t).multiply(-0.5); // Lower left. - lr.subtract(this.s).multiply(0.5); // Lower right. - ur.add(this.t).multiply(0.5); // Upper right. - ul.subtract(this.t).multiply(0.5); // Upper left. - - var corners = []; - for (var i = 0; i < 4; i++) { - corners.push(new Vec3(this.bottomCenter[0], this.bottomCenter[1], this.bottomCenter[2])); - } - - for (i = 0; i < 4; i++) { - corners.push(new Vec3(this.topCenter[0], this.topCenter[1], this.topCenter[2])); - } - - corners[0].add(ll); - corners[1].add(lr); - corners[2].add(ur); - corners[3].add(ul); - corners[4].add(ll); - corners[5].add(lr); - corners[6].add(ur); - corners[7].add(ul); - - return corners; -}; - -/** - * Sets this bounding box such that it minimally encloses a specified collection of points. - * @param {Float32Array} points The points to contain. - * @returns {BoundingBox} This bounding box set to contain the specified points. - * @throws {ArgumentError} If the specified list of points is null, undefined or empty. - */ -BoundingBox.prototype.setToPoints = function (points) { - if (!points || points.length < 3) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "setToPoints", "missingArray")); - } - - var rMin = +Number.MAX_VALUE, - rMax = -Number.MAX_VALUE, - sMin = +Number.MAX_VALUE, - sMax = -Number.MAX_VALUE, - tMin = +Number.MAX_VALUE, - tMax = -Number.MAX_VALUE, - r = this.r, s = this.s, t = this.t, - p = new Vec3(0, 0, 0), - pdr, pds, pdt, rLen, sLen, tLen, rSum, sSum, tSum, - rx_2, ry_2, rz_2, cx, cy, cz; - - Matrix.principalAxesFromPoints(points, r, s, t); - - for (var i = 0, len = points.length / 3; i < len; i++) { - p[0] = points[i * 3]; - p[1] = points[i * 3 + 1]; - p[2] = points[i * 3 + 2]; - - pdr = p.dot(r); - if (rMin > pdr) - rMin = pdr; - if (rMax < pdr) - rMax = pdr; - - pds = p.dot(s); - if (sMin > pds) - sMin = pds; - if (sMax < pds) - sMax = pds; - - pdt = p.dot(t); - if (tMin > pdt) - tMin = pdt; - if (tMax < pdt) - tMax = pdt; - } - - if (rMax === rMin) - rMax = rMin + 1; - if (sMax === sMin) - sMax = sMin + 1; - if (tMax === tMin) - tMax = tMin + 1; - - rLen = rMax - rMin; - sLen = sMax - sMin; - tLen = tMax - tMin; - rSum = rMax + rMin; - sSum = sMax + sMin; - tSum = tMax + tMin; - - rx_2 = 0.5 * r[0] * rLen; - ry_2 = 0.5 * r[1] * rLen; - rz_2 = 0.5 * r[2] * rLen; - - cx = 0.5 * (r[0] * rSum + s[0] * sSum + t[0] * tSum); - cy = 0.5 * (r[1] * rSum + s[1] * sSum + t[1] * tSum); - cz = 0.5 * (r[2] * rSum + s[2] * sSum + t[2] * tSum); - - this.center[0] = cx; - this.center[1] = cy; - this.center[2] = cz; - - this.topCenter[0] = cx + rx_2; - this.topCenter[1] = cy + ry_2; - this.topCenter[2] = cz + rz_2; - - this.bottomCenter[0] = cx - rx_2; - this.bottomCenter[1] = cy - ry_2; - this.bottomCenter[2] = cz - rz_2; - - r.multiply(rLen); - s.multiply(sLen); - t.multiply(tLen); - - this.radius = 0.5 * Math.sqrt(rLen * rLen + sLen * sLen + tLen * tLen); - - return this; -}; - -/** - * Sets this bounding box such that it minimally encloses a specified collection of points. - * @param {Vec3} points The points to contain. - * @returns {BoundingBox} This bounding box set to contain the specified points. - * @throws {ArgumentError} If the specified list of points is null, undefined or empty. - */ -BoundingBox.prototype.setToVec3Points = function (points) { - if (!points || points.length === 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "setToVec3Points", "missingArray")); - } - - var pointList = new Float32Array(points.length * 3); - for (var i = 0; i < points.length; i++) { - var point = points[i]; - for (var j = 0; j < 3; j++) { - pointList[i * 3 + j] = point[j]; - } - } - - return this.setToPoints(pointList); -}; - -/** - * Sets this bounding box such that it contains a specified sector on a specified globe with min and max elevation. - * <p> - * To create a bounding box that contains the sector at mean sea level, specify zero for the minimum and maximum - * elevations. - * To create a bounding box that contains the terrain surface in this sector, specify the actual minimum and maximum - * elevation values associated with the sector, multiplied by the model's vertical exaggeration. - * @param {Sector} sector The sector for which to create the bounding box. - * @param {Globe} globe The globe associated with the sector. - * @param {Number} minElevation The minimum elevation within the sector. - * @param {Number} maxElevation The maximum elevation within the sector. - * @returns {BoundingBox} This bounding box set to contain the specified sector. - * @throws {ArgumentError} If either the specified sector or globe is null or undefined. - */ -BoundingBox.prototype.setToSector = function (sector, globe, minElevation, maxElevation) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "setToSector", "missingSector")); - } - - if (!globe) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "setToSector", "missingGlobe")); - } - - // Compute the cartesian points for a 3x3 geographic grid. This grid captures enough detail to bound the - // sector. Use minimum elevation at the corners and max elevation everywhere else. - var elevations = this.scratchElevations, - points = this.scratchPoints; - - WWUtil.fillArray(elevations, maxElevation); - elevations[0] = elevations[2] = elevations[6] = elevations[8] = minElevation; - globe.computePointsForGrid(sector, 3, 3, elevations, Vec3.ZERO, points); - - // Compute the local coordinate axes. Since we know this box is bounding a geographic sector, we use the - // local coordinate axes at its centroid as the box axes. Using these axes results in a box that has +-10% - // the volume of a box with axes derived from a principal component analysis, but is faster to compute. - var index = 12; // index to the center point's X coordinate - this.tmp1.set(points[index], points[index + 1], points[index + 2]); - WWMath.localCoordinateAxesAtPoint(this.tmp1, globe, this.r, this.s, this.t); - - // Find the extremes along each axis. - var rExtremes = [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY], - sExtremes = [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY], - tExtremes = [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]; - - for (var i = 0, len = points.length; i < len; i += 3) { - this.tmp1.set(points[i], points[i + 1], points[i + 2]); - this.adjustExtremes(this.r, rExtremes, this.s, sExtremes, this.t, tExtremes, this.tmp1); - } - - // If the sector encompasses more than one hemisphere, the 3x3 grid does not capture enough detail to bound - // the sector. The antipodal points along the parallel through the sector's centroid represent its extremes - // in longitude. Incorporate those antipodal points into the extremes along each axis. - if (sector.deltaLongitude() > 180) { - globe.computePointFromPosition(WWMath.mercatorLat(sector.centroidLatitude()), sector.centroidLongitude() + 90, maxElevation, this.tmp1); - globe.computePointFromPosition(WWMath.mercatorLat(sector.centroidLatitude()), sector.centroidLongitude() - 90, maxElevation, this.tmp2); - this.adjustExtremes(this.r, rExtremes, this.s, sExtremes, this.t, tExtremes, this.tmp1); - this.adjustExtremes(this.r, rExtremes, this.s, sExtremes, this.t, tExtremes, this.tmp2); - } - - // Sort the axes from most prominent to least prominent. The frustum intersection methods in WWBoundingBox assume - // that the axes are defined in this way. - if (rExtremes[1] - rExtremes[0] < sExtremes[1] - sExtremes[0]) { - this.swapAxes(this.r, rExtremes, this.s, sExtremes); - } - if (sExtremes[1] - sExtremes[0] < tExtremes[1] - tExtremes[0]) { - this.swapAxes(this.s, sExtremes, this.t, tExtremes); - } - if (rExtremes[1] - rExtremes[0] < sExtremes[1] - sExtremes[0]) { - this.swapAxes(this.r, rExtremes, this.s, sExtremes); - } - - // Compute the box properties from its unit axes and the extremes along each axis. - var rLen = rExtremes[1] - rExtremes[0], - sLen = sExtremes[1] - sExtremes[0], - tLen = tExtremes[1] - tExtremes[0], - rSum = rExtremes[1] + rExtremes[0], - sSum = sExtremes[1] + sExtremes[0], - tSum = tExtremes[1] + tExtremes[0], - - cx = 0.5 * (this.r[0] * rSum + this.s[0] * sSum + this.t[0] * tSum), - cy = 0.5 * (this.r[1] * rSum + this.s[1] * sSum + this.t[1] * tSum), - cz = 0.5 * (this.r[2] * rSum + this.s[2] * sSum + this.t[2] * tSum), - rx_2 = 0.5 * this.r[0] * rLen, - ry_2 = 0.5 * this.r[1] * rLen, - rz_2 = 0.5 * this.r[2] * rLen; - - this.center.set(cx, cy, cz); - this.topCenter.set(cx + rx_2, cy + ry_2, cz + rz_2); - this.bottomCenter.set(cx - rx_2, cy - ry_2, cz - rz_2); - - this.r.multiply(rLen); - this.s.multiply(sLen); - this.t.multiply(tLen); - - this.radius = 0.5 * Math.sqrt(rLen * rLen + sLen * sLen + tLen * tLen); - - return this; -}; - -/** - * Translates this bounding box by a specified translation vector. - * @param {Vec3} translation The translation vector. - * @returns {BoundingBox} This bounding box translated by the specified translation vector. - * @throws {ArgumentError} If the specified translation vector is null or undefined. - */ -BoundingBox.prototype.translate = function (translation) { - if (!translation) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "translate", "missingVector")); - } - - this.bottomCenter.add(translation); - this.topCenter.add(translation); - this.center.add(translation); - - return this; -}; - -/** - * Computes the approximate distance between this bounding box and a specified point. - * <p> - * This calculation treats the bounding box as a sphere with the same radius as the box. - * @param {Vec3} point The point to compute the distance to. - * @returns {Number} The distance from the edge of this bounding box to the specified point. - * @throws {ArgumentError} If the specified point is null or undefined. - */ -BoundingBox.prototype.distanceTo = function (point) { - if (!point) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "distanceTo", "missingPoint")); - } - - var d = this.center.distanceTo(point) - this.radius; - - return d >= 0 ? d : -d; -}; - -/** - * Computes the effective radius of this bounding box relative to a specified plane. - * @param {Plane} plane The plane of interest. - * @returns {Number} The effective radius of this bounding box to the specified plane. - * @throws {ArgumentError} If the specified plane is null or undefined. - */ -BoundingBox.prototype.effectiveRadius = function (plane) { - if (!plane) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "effectiveRadius", "missingPlane")); - } - - var n = plane.normal; - - return 0.5 * (WWMath.fabs(this.r.dot(n)) + WWMath.fabs(this.s.dot(n)) + WWMath.fabs(this.t.dot(n))); -}; - -/** - * Indicates whether this bounding box intersects a specified frustum. - * @param {Frustum} frustum The frustum of interest. - * @returns {boolean} true if the specified frustum intersects this bounding box, otherwise false. - * @throws {ArgumentError} If the specified frustum is null or undefined. - */ -BoundingBox.prototype.intersectsFrustum = function (frustum) { - if (!frustum) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BoundingBox", "intersectsFrustum", "missingFrustum")); - } - - this.tmp1.copy(this.bottomCenter); - this.tmp2.copy(this.topCenter); - - if (this.intersectionPoint(frustum.near) < 0) { - return false; - } - if (this.intersectionPoint(frustum.far) < 0) { - return false; - } - if (this.intersectionPoint(frustum.left) < 0) { - return false; - } - if (this.intersectionPoint(frustum.right) < 0) { - return false; - } - if (this.intersectionPoint(frustum.top) < 0) { - return false; - } - if (this.intersectionPoint(frustum.bottom) < 0) { - return false; - } - - return true; -}; - -// Internal. Intentionally not documented. -BoundingBox.prototype.intersectionPoint = function (plane) { - var n = plane.normal, - effectiveRadius = 0.5 * (Math.abs(this.s.dot(n)) + Math.abs(this.t.dot(n))); - - return this.intersectsAt(plane, effectiveRadius, this.tmp1, this.tmp2); -}; - -// Internal. Intentionally not documented. -BoundingBox.prototype.intersectsAt = function (plane, effRadius, endPoint1, endPoint2) { - // Test the distance from the first end-point. - var dq1 = plane.dot(endPoint1); - var bq1 = dq1 <= -effRadius; - - // Test the distance from the second end-point. - var dq2 = plane.dot(endPoint2); - var bq2 = dq2 <= -effRadius; - - if (bq1 && bq2) { // endpoints more distant from plane than effective radius; box is on neg. side of plane - return -1; - } - - if (bq1 == bq2) { // endpoints less distant from plane than effective radius; can't draw any conclusions - return 0; - } - - // Compute and return the endpoints of the box on the positive side of the plane - this.tmp3.copy(endPoint1); - this.tmp3.subtract(endPoint2); - var t = (effRadius + dq1) / plane.normal.dot(this.tmp3); - - this.tmp3.copy(endPoint2); - this.tmp3.subtract(endPoint1); - this.tmp3.multiply(t); - this.tmp3.add(endPoint1); - - // Truncate the line to only that in the positive halfspace, e.g., inside the frustum. - if (bq1) { - endPoint1.copy(this.tmp3); - } - else { - endPoint2.copy(this.tmp3); - } - - return t; -}; - -// Internal. Intentionally not documented. -BoundingBox.prototype.adjustExtremes = function (r, rExtremes, s, sExtremes, t, tExtremes, p) { - var pdr = p.dot(r); - if (rExtremes[0] > pdr) { - rExtremes[0] = pdr; - } - if (rExtremes[1] < pdr) { - rExtremes[1] = pdr; - } - - var pds = p.dot(s); - if (sExtremes[0] > pds) { - sExtremes[0] = pds; - } - if (sExtremes[1] < pds) { - sExtremes[1] = pds; - } - - var pdt = p.dot(t); - if (tExtremes[0] > pdt) { - tExtremes[0] = pdt; - } - if (tExtremes[1] < pdt) { - tExtremes[1] = pdt; - } -}; - -// Internal. Intentionally not documented. -BoundingBox.prototype.swapAxes = function (a, aExtremes, b, bExtremes) { - a.swap(b); - - var tmp = aExtremes[0]; - aExtremes[0] = bExtremes[0]; - bExtremes[0] = tmp; - - tmp = aExtremes[1]; - aExtremes[1] = bExtremes[1]; - bExtremes[1] = tmp; -}; - -/** - * Renders this bounding box in a semi-transparent color with a highlighted outline. This function is intended - * for diagnostic use only. - * @param dc {DrawContext} dc The current draw context. - */ -BoundingBox.prototype.render = function (dc) { - var gl = dc.currentGlContext, - matrix = BoundingBox.scratchMatrix, - program = dc.findAndBindProgram(BasicProgram); - - try { - // Setup to transform unit cube coordinates to this bounding box's local coordinates, as viewed by the - // current navigator state. - matrix.copy(dc.modelviewProjection); - matrix.multiply( - this.r[0], this.s[0], this.t[0], this.center[0], - this.r[1], this.s[1], this.t[1], this.center[1], - this.r[2], this.s[2], this.t[2], this.center[2], - 0, 0, 0, 1); - matrix.multiplyByTranslation(-0.5, -0.5, -0.5); - program.loadModelviewProjection(gl, matrix); - - // Setup to draw the geometry when the eye point is inside or outside the box. - gl.disable(gl.CULL_FACE); - - // Bind the shared unit cube vertex buffer and element buffer. - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitCubeBuffer()); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, dc.unitCubeElements()); - gl.enableVertexAttribArray(program.vertexPointLocation); - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - - // Draw bounding box fragments that are below the terrain. - program.loadColorComponents(gl, 0, 1, 0, 0.6); - gl.drawElements(gl.LINES, 24, gl.UNSIGNED_SHORT, 72); - program.loadColorComponents(gl, 1, 1, 1, 0.3); - gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0); - - } finally { - // Restore WorldWind's default WebGL state. - gl.enable(gl.CULL_FACE); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); - } -}; - -export default BoundingBox; diff --git a/web/src/gis/geom/Frustum.js b/web/src/gis/geom/Frustum.js deleted file mode 100644 index 17e43434..00000000 --- a/web/src/gis/geom/Frustum.js +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Frustum - */ -import ArgumentError from '../error/ArgumentError'; -import Plane from '../geom/Plane'; -import Logger from '../util/Logger'; - - -/** - * Constructs a frustum. - * @alias Frustum - * @constructor - * @classdesc Represents a six-sided view frustum in Cartesian coordinates. - * @param {Plane} left The frustum's left plane. - * @param {Plane} right The frustum's right plane. - * @param {Plane} bottom The frustum's bottom plane. - * @param {Plane} top The frustum's top plane. - * @param {Plane} near The frustum's near plane. - * @param {Plane} far The frustum's far plane. - * @throws {ArgumentError} If any specified plane is null or undefined. - */ -function Frustum(left, right, bottom, top, near, far) { - if (!left || !right || !bottom || !top || !near || !far) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Frustum", "constructor", "missingPlane")); - } - - // Internal. Intentionally not documented. See property accessors below for public interface. - this._left = left; - this._right = right; - this._bottom = bottom; - this._top = top; - this._near = near; - this._far = far; - - // Internal. Intentionally not documented. - this._planes = [this._left, this._right, this._top, this._bottom, this._near, this._far]; -} - -// These accessors are defined in order to prevent changes that would make the properties inconsistent with the -// planes array. -Object.defineProperties(Frustum.prototype, { - /** - * This frustum's left plane. - * @memberof Frustum.prototype - * @type {Plane} - * @readonly - */ - left: { - get: function () { - return this._left; - } - }, - /** - * This frustum's right plane. - * @memberof Frustum.prototype - * @type {Plane} - * @readonly - */ - right: { - get: function () { - return this._right; - } - }, - /** - * This frustum's bottom plane. - * @memberof Frustum.prototype - * @type {Plane} - * @readonly - */ - bottom: { - get: function () { - return this._bottom; - } - }, - /** - * This frustum's top plane. - * @memberof Frustum.prototype - * @type {Plane} - * @readonly - */ - top: { - get: function () { - return this._top; - } - }, - /** - * This frustum's near plane. - * @memberof Frustum.prototype - * @type {Plane} - * @readonly - */ - near: { - get: function () { - return this._near; - } - }, - /** - * This frustum's far plane. - * @memberof Frustum.prototype - * @type {Plane} - * @readonly - */ - far: { - get: function () { - return this._far; - } - } -}); - -/** - * Transforms this frustum by a specified matrix. - * @param {Matrix} matrix The matrix to apply to this frustum. - * @returns {Frustum} This frustum set to its original value multiplied by the specified matrix. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -Frustum.prototype.transformByMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Frustum", "transformByMatrix", "missingMatrix")); - } - - this._left.transformByMatrix(matrix); - this._right.transformByMatrix(matrix); - this._bottom.transformByMatrix(matrix); - this._top.transformByMatrix(matrix); - this._near.transformByMatrix(matrix); - this._far.transformByMatrix(matrix); - - return this; -}; - -/** - * Normalizes the plane vectors of the planes composing this frustum. - * @returns {Frustum} This frustum with its planes normalized. - */ -Frustum.prototype.normalize = function () { - this._left.normalize(); - this._right.normalize(); - this._bottom.normalize(); - this._top.normalize(); - this._near.normalize(); - this._far.normalize(); - - return this; -}; - -/** - * Returns a new frustum with each of its planes 1 meter from the center. - * @returns {Frustum} The new frustum. - */ -Frustum.unitFrustum = function () { - return new Frustum( - new Plane(1, 0, 0, 1), // left - new Plane(-1, 0, 0, 1), // right - new Plane(0, 1, 1, 1), // bottom - new Plane(0, -1, 0, 1), // top - new Plane(0, 0, -1, 1), // near - new Plane(0, 0, 1, 1) // far - ); -}; - -/** - * Extracts a frustum from a projection matrix. - * <p> - * This method assumes that the specified matrix represents a projection matrix. If it does not represent a projection matrix - * the results are undefined. - * <p> - * A projection matrix's view frustum is a Cartesian volume that contains everything visible in a scene displayed - * using that projection matrix. - * - * @param {Matrix} matrix The projection matrix to extract the frustum from. - * @return {Frustum} A new frustum containing the projection matrix's view frustum, in eye coordinates. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -Frustum.fromProjectionMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Frustum", "fromProjectionMatrix", "missingMatrix")); - } - - var x, y, z, w, d, left, right, top, bottom, near, far; - - // Left Plane = row 4 + row 1: - x = matrix[12] + matrix[0]; - y = matrix[13] + matrix[1]; - z = matrix[14] + matrix[2]; - w = matrix[15] + matrix[3]; - d = Math.sqrt(x * x + y * y + z * z); // for normalizing the coordinates - left = new Plane(x / d, y / d, z / d, w / d); - - // Right Plane = row 4 - row 1: - x = matrix[12] - matrix[0]; - y = matrix[13] - matrix[1]; - z = matrix[14] - matrix[2]; - w = matrix[15] - matrix[3]; - d = Math.sqrt(x * x + y * y + z * z); // for normalizing the coordinates - right = new Plane(x / d, y / d, z / d, w / d); - - // Bottom Plane = row 4 + row 2: - x = matrix[12] + matrix[4]; - y = matrix[13] + matrix[5]; - z = matrix[14] + matrix[6]; - w = matrix[15] + matrix[7]; - d = Math.sqrt(x * x + y * y + z * z); // for normalizing the coordinates - bottom = new Plane(x / d, y / d, z / d, w / d); - - // Top Plane = row 4 - row 2: - x = matrix[12] - matrix[4]; - y = matrix[13] - matrix[5]; - z = matrix[14] - matrix[6]; - w = matrix[15] - matrix[7]; - d = Math.sqrt(x * x + y * y + z * z); // for normalizing the coordinates - top = new Plane(x / d, y / d, z / d, w / d); - - // Near Plane = row 4 + row 3: - x = matrix[12] + matrix[8]; - y = matrix[13] + matrix[9]; - z = matrix[14] + matrix[10]; - w = matrix[15] + matrix[11]; - d = Math.sqrt(x * x + y * y + z * z); // for normalizing the coordinates - near = new Plane(x / d, y / d, z / d, w / d); - - // Far Plane = row 4 - row 3: - x = matrix[12] - matrix[8]; - y = matrix[13] - matrix[9]; - z = matrix[14] - matrix[10]; - w = matrix[15] - matrix[11]; - d = Math.sqrt(x * x + y * y + z * z); // for normalizing the coordinates - far = new Plane(x / d, y / d, z / d, w / d); - - return new Frustum(left, right, bottom, top, near, far); -}; - -Frustum.prototype.containsPoint = function (point) { - if (!point) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Frustum", "containsPoint", "missingPoint")); - } - - // See if the point is entirely within the frustum. The dot product of the point with each plane's vector - // provides a distance to each plane. If this distance is less than 0, the point is clipped by that plane and - // neither intersects nor is contained by the space enclosed by this Frustum. - - if (this._far.dot(point) <= 0) - return false; - if (this._left.dot(point) <= 0) - return false; - if (this._right.dot(point) <= 0) - return false; - if (this._top.dot(point) <= 0) - return false; - if (this._bottom.dot(point) <= 0) - return false; - if (this._near.dot(point) <= 0) - return false; - - return true; -}; - -/** - * Determines whether a line segment intersects this frustum. - * - * @param {Vec3} pointA One end of the segment. - * @param {Vec3} pointB The other end of the segment. - * - * @return {boolean} <code>true</code> if the segment intersects or is contained in this frustum, - * otherwise <code>false</code>. - * - * @throws {ArgumentError} If either point is null or undefined. - */ -Frustum.prototype.intersectsSegment = function (pointA, pointB) { - if (!pointA || !pointB) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Frustum", "containsPoint", "missingPoint")); - } - - // First do a trivial accept test. - if (this.containsPoint(pointA) || this.containsPoint(pointB)) - return true; - - if (pointA.equals(pointB)) - return false; - - for (var i = 0, len = this._planes.length; i < len; i++) { - - // See if both points are behind the plane and therefore not in the frustum. - if (this._planes[i].onSameSide(pointA, pointB) < 0) - return false; - - // See if the segment intersects the plane. - if (this._planes[i].clip(pointA, pointB) != null) - return true; - } - - return false; // segment does not intersect frustum -}; - -export default Frustum; diff --git a/web/src/gis/geom/Line.js b/web/src/gis/geom/Line.js deleted file mode 100644 index d1ad2250..00000000 --- a/web/src/gis/geom/Line.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Line - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a line from a specified origin and direction. - * @alias Line - * @constructor - * @classdesc Represents a line in Cartesian coordinates. - * @param {Vec3} origin The line's origin. - * @param {Vec3} direction The line's direction. - * @throws {ArgumentError} If either the origin or the direction are null or undefined. - */ -function Line(origin, direction) { - if (!origin) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Line", "constructor", - "Origin is null or undefined.")); - } - - if (!direction) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Line", "constructor", - "Direction is null or undefined.")); - } - - /** - * This line's origin. - * @type {Vec3} - */ - this.origin = origin; - - /** - * This line's direction. - * @type {Vec3} - */ - this.direction = direction; -} - -/** - * Creates a line given two specified endpoints. - * @param {Vec3} pointA The first endpoint. - * @param {Vec3} pointB The second endpoint. - * @return {Line} The new line. - * @throws {ArgumentError} If either endpoint is null or undefined. - */ -Line.fromSegment = function (pointA, pointB) { - if (!pointA || !pointB) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Line", "fromSegment", "missingPoint")); - } - - var origin = new Vec3(pointA[0], pointA[1], pointA[2]), - direction = new Vec3(pointB[0] - pointA[0], pointB[1] - pointA[1], pointB[2] - pointA[2]); - - return new Line(origin, direction); -}; - -/** - * Computes a Cartesian point a specified distance along this line. - * @param {Number} distance The distance from this line's origin at which to compute the point. - * @param {Vec3} result A pre-allocated {@Link Vec3} instance in which to return the computed point. - * @return {Vec3} The specified result argument containing the computed point. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Line.prototype.pointAt = function (distance, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Line", "pointAt", "missingResult.")); - } - - result[0] = this.origin[0] + this.direction[0] * distance; - result[1] = this.origin[1] + this.direction[1] * distance; - result[2] = this.origin[2] + this.direction[2] * distance; - - return result; -}; - -/** - * Indicates whether the components of this line are equal to those of a specified line. - * @param {Line} otherLine The line to test equality with. May be null or undefined, in which case this - * function returns false. - * @returns {boolean} true if all components of this line are equal to the corresponding - * components of the specified line, otherwise false. - */ -Line.prototype.equals = function (otherLine) { - if (otherLine) { - return this.origin.equals(otherLine.origin) && this.direction.equals(otherLine.direction); - } - - return false; -}; - -/** - * Creates a new line that is a copy of this line. - * @returns {Line} The new line. - */ -Line.prototype.clone = function () { - var clone = new Line(new Vec3(0, 0, 0), new Vec3(0, 0, 0)); - clone.copy(this); - - return clone; -}; - -/** - * Copies the components of a specified line to this line. - * @param {Line} copyLine The line to copy. - * @returns {Line} A copy of this line equal to otherLine. - * @throws {ArgumentError} If the specified line is null or undefined. - */ -Line.prototype.copy = function (copyLine) { - if (!copyLine) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Line", "copy", "missingLine")); - } - - this.origin.copy(copyLine.origin); - this.direction.copy(copyLine.direction); - - return this; -}; - -export default Line; diff --git a/web/src/gis/geom/Location.js b/web/src/gis/geom/Location.js deleted file mode 100644 index cdb41bdd..00000000 --- a/web/src/gis/geom/Location.js +++ /dev/null @@ -1,961 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Location - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Plane from '../geom/Plane'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a location from a specified latitude and longitude in degrees. - * @alias Location - * @constructor - * @classdesc Represents a latitude, longitude pair in degrees. - * @param {Number} latitude The latitude in degrees. - * @param {Number} longitude The longitude in degrees. - */ -function Location(latitude, longitude) { - /** - * The latitude in degrees. - * @type {Number} - */ - this.latitude = latitude; - /** - * The longitude in degrees. - * @type {Number} - */ - this.longitude = longitude; -} - -/** - * A location with latitude and longitude both 0. - * @constant - * @type {Location} - */ -Location.ZERO = new Location(0, 0); - -/** - * Creates a location from angles specified in radians. - * @param {Number} latitudeRadians The latitude in radians. - * @param {Number} longitudeRadians The longitude in radians. - * @returns {Location} The new location with latitude and longitude in degrees. - */ -Location.fromRadians = function (latitudeRadians, longitudeRadians) { - return new Location(latitudeRadians * Angle.RADIANS_TO_DEGREES, longitudeRadians * Angle.RADIANS_TO_DEGREES); -}; - -/** - * Copies this location to the latitude and longitude of a specified location. - * @param {Location} location The location to copy. - * @returns {Location} This location, set to the values of the specified location. - * @throws {ArgumentError} If the specified location is null or undefined. - */ -Location.prototype.copy = function (location) { - if (!location) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "copy", "missingLocation")); - } - - this.latitude = location.latitude; - this.longitude = location.longitude; - - return this; -}; - -/** - * Sets this location to the latitude and longitude. - * @param {Number} latitude The latitude to set. - * @param {Number} longitude The longitude to set. - * @returns {Location} This location, set to the values of the specified latitude and longitude. - */ -Location.prototype.set = function (latitude, longitude) { - this.latitude = latitude; - this.longitude = longitude; - - return this; -}; - -/** - * Indicates whether this location is equal to a specified location. - * @param {Location} location The location to compare this one to. - * @returns {Boolean} <code>true</code> if this location is equal to the specified location, otherwise - * <code>false</code>. - */ -Location.prototype.equals = function (location) { - return location - && location.latitude === this.latitude && location.longitude === this.longitude; -}; - -/** - * Compute a location along a path at a specified distance between two specified locations. - * @param {String} pathType The type of path to assume. Recognized values are - * [WorldWind.GREAT_CIRCLE]{@link WorldWind#GREAT_CIRCLE}, - * [WorldWind.RHUMB_LINE]{@link WorldWind#RHUMB_LINE} and - * [WorldWind.LINEAR]{@link WorldWind#LINEAR}. - * If the path type is not recognized then WorldWind.LINEAR is used. - * @param {Number} amount The fraction of the path between the two locations at which to compute the new - * location. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If either specified location or the result argument is null or undefined. - */ -Location.interpolateAlongPath = function (pathType, amount, location1, location2, result) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateAlongPath", "missingLocation")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateAlongPath", "missingResult")); - } - - if (pathType === WorldWind.GREAT_CIRCLE) { - return this.interpolateGreatCircle(amount, location1, location2, result); - } else if (pathType && pathType === WorldWind.RHUMB_LINE) { - return this.interpolateRhumb(amount, location1, location2, result); - } else { - return this.interpolateLinear(amount, location1, location2, result); - } -}; - -/** - * Compute a location along a great circle path at a specified distance between two specified locations. - * @param {Number} amount The fraction of the path between the two locations at which to compute the new - * location. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * This function uses a spherical model, not elliptical. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If either specified location or the result argument is null or undefined. - */ -Location.interpolateGreatCircle = function (amount, location1, location2, result) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateGreatCircle", "missingLocation")); - } - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateGreatCircle", "missingResult")); - } - - if (location1.equals(location2)) { - result.latitude = location1.latitude; - result.longitude = location1.longitude; - return result; - } - - var t = WWMath.clamp(amount, 0, 1), - azimuthDegrees = this.greatCircleAzimuth(location1, location2), - distanceRadians = this.greatCircleDistance(location1, location2); - - return this.greatCircleLocation(location1, azimuthDegrees, t * distanceRadians, result); -}; - -/** - * Computes the azimuth angle (clockwise from North) that points from the first location to the second location. - * This angle can be used as the starting azimuth for a great circle arc that begins at the first location, and - * passes through the second location. - * This function uses a spherical model, not elliptical. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @returns {Number} The computed azimuth, in degrees. - * @throws {ArgumentError} If either specified location is null or undefined. - */ -Location.greatCircleAzimuth = function (location1, location2) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleAzimuth", "missingLocation")); - } - - var lat1 = location1.latitude * Angle.DEGREES_TO_RADIANS, - lat2 = location2.latitude * Angle.DEGREES_TO_RADIANS, - lon1 = location1.longitude * Angle.DEGREES_TO_RADIANS, - lon2 = location2.longitude * Angle.DEGREES_TO_RADIANS, - x, - y, - azimuthRadians; - - if (lat1 == lat2 && lon1 == lon2) { - return 0; - } - - if (lon1 == lon2) { - return lat1 > lat2 ? 180 : 0; - } - - // Taken from "Map Projections - A Working Manual", page 30, equation 5-4b. - // The atan2() function is used in place of the traditional atan(y/x) to simplify the case when x == 0. - y = Math.cos(lat2) * Math.sin(lon2 - lon1); - x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1); - azimuthRadians = Math.atan2(y, x); - - return isNaN(azimuthRadians) ? 0 : azimuthRadians * Angle.RADIANS_TO_DEGREES; -}; - -/** - * Computes the great circle angular distance between two locations. The return value gives the distance as the - * angle between the two positions. In radians, this angle is the arc length of the segment between the two - * positions. To compute a distance in meters from this value, multiply the return value by the radius of the - * globe. - * This function uses a spherical model, not elliptical. - * - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @returns {Number} The computed distance, in radians. - * @throws {ArgumentError} If either specified location is null or undefined. - */ -Location.greatCircleDistance = function (location1, location2) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleDistance", "missingLocation")); - } - - var lat1Radians = location1.latitude * Angle.DEGREES_TO_RADIANS, - lat2Radians = location2.latitude * Angle.DEGREES_TO_RADIANS, - lon1Radians = location1.longitude * Angle.DEGREES_TO_RADIANS, - lon2Radians = location2.longitude * Angle.DEGREES_TO_RADIANS, - a, - b, - c, - distanceRadians; - - if (lat1Radians == lat2Radians && lon1Radians == lon2Radians) { - return 0; - } - - // "Haversine formula," taken from https://en.wikipedia.org/wiki/Great-circle_distance#Formul.C3.A6 - a = Math.sin((lat2Radians - lat1Radians) / 2.0); - b = Math.sin((lon2Radians - lon1Radians) / 2.0); - c = a * a + Math.cos(lat1Radians) * Math.cos(lat2Radians) * b * b; - distanceRadians = 2.0 * Math.asin(Math.sqrt(c)); - - return isNaN(distanceRadians) ? 0 : distanceRadians; -}; - -/** - * Computes the location on a great circle path corresponding to a given starting location, azimuth, and - * arc distance. - * This function uses a spherical model, not elliptical. - * - * @param {Location} location The starting location. - * @param {Number} greatCircleAzimuthDegrees The azimuth in degrees. - * @param {Number} pathLengthRadians The radian distance along the path at which to compute the end location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If the specified location or the result argument is null or undefined. - */ -Location.greatCircleLocation = function (location, greatCircleAzimuthDegrees, pathLengthRadians, result) { - if (!location) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleLocation", "missingLocation")); - } - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleLocation", "missingResult")); - } - - if (pathLengthRadians == 0) { - result.latitude = location.latitude; - result.longitude = location.longitude; - return result; - } - - var latRadians = location.latitude * Angle.DEGREES_TO_RADIANS, - lonRadians = location.longitude * Angle.DEGREES_TO_RADIANS, - azimuthRadians = greatCircleAzimuthDegrees * Angle.DEGREES_TO_RADIANS, - endLatRadians, - endLonRadians; - - // Taken from "Map Projections - A Working Manual", page 31, equation 5-5 and 5-6. - endLatRadians = Math.asin(Math.sin(latRadians) * Math.cos(pathLengthRadians) + - Math.cos(latRadians) * Math.sin(pathLengthRadians) * Math.cos(azimuthRadians)); - endLonRadians = lonRadians + Math.atan2( - Math.sin(pathLengthRadians) * Math.sin(azimuthRadians), - Math.cos(latRadians) * Math.cos(pathLengthRadians) - - Math.sin(latRadians) * Math.sin(pathLengthRadians) * Math.cos(azimuthRadians)); - - if (isNaN(endLatRadians) || isNaN(endLonRadians)) { - result.latitude = location.latitude; - result.longitude = location.longitude; - } else { - result.latitude = Angle.normalizedDegreesLatitude(endLatRadians * Angle.RADIANS_TO_DEGREES); - result.longitude = Angle.normalizedDegreesLongitude(endLonRadians * Angle.RADIANS_TO_DEGREES); - } - - return result; -}; - -/** - * Compute a location along a rhumb path at a specified distance between two specified locations. - * This function uses a spherical model, not elliptical. - * @param {Number} amount The fraction of the path between the two locations at which to compute the new - * location. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If either specified location or the result argument is null or undefined. - */ -Location.interpolateRhumb = function (amount, location1, location2, result) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateRhumb", "missingLocation")); - } - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateRhumb", "missingResult")); - } - - if (location1.equals(location2)) { - result.latitude = location1.latitude; - result.longitude = location1.longitude; - return result; - } - - var t = WWMath.clamp(amount, 0, 1), - azimuthDegrees = this.rhumbAzimuth(location1, location2), - distanceRadians = this.rhumbDistance(location1, location2); - - return this.rhumbLocation(location1, azimuthDegrees, t * distanceRadians, result); -}; - -/** - * Computes the azimuth angle (clockwise from North) that points from the first location to the second location. - * This angle can be used as the azimuth for a rhumb arc that begins at the first location, and - * passes through the second location. - * This function uses a spherical model, not elliptical. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @returns {Number} The computed azimuth, in degrees. - * @throws {ArgumentError} If either specified location is null or undefined. - */ -Location.rhumbAzimuth = function (location1, location2) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "rhumbAzimuth", "missingLocation")); - } - - var lat1 = location1.latitude * Angle.DEGREES_TO_RADIANS, - lat2 = location2.latitude * Angle.DEGREES_TO_RADIANS, - lon1 = location1.longitude * Angle.DEGREES_TO_RADIANS, - lon2 = location2.longitude * Angle.DEGREES_TO_RADIANS, - dLon, - dPhi, - azimuthRadians; - - if (lat1 == lat2 && lon1 == lon2) { - return 0; - } - - dLon = lon2 - lon1; - dPhi = Math.log(Math.tan(lat2 / 2.0 + Math.PI / 4) / Math.tan(lat1 / 2.0 + Math.PI / 4)); - - // If lonChange over 180 take shorter rhumb across 180 meridian. - if (WWMath.fabs(dLon) > Math.PI) { - dLon = dLon > 0 ? -(2 * Math.PI - dLon) : 2 * Math.PI + dLon; - } - - azimuthRadians = Math.atan2(dLon, dPhi); - - return isNaN(azimuthRadians) ? 0 : azimuthRadians * Angle.RADIANS_TO_DEGREES; -}; - -/** - * Computes the rhumb angular distance between two locations. The return value gives the distance as the - * angle between the two positions in radians. This angle is the arc length of the segment between the two - * positions. To compute a distance in meters from this value, multiply the return value by the radius of the - * globe. - * This function uses a spherical model, not elliptical. - * - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @returns {Number} The computed distance, in radians. - * @throws {ArgumentError} If either specified location is null or undefined. - */ -Location.rhumbDistance = function (location1, location2) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "rhumbDistance", "missingLocation")); - } - - var lat1 = location1.latitude * Angle.DEGREES_TO_RADIANS, - lat2 = location2.latitude * Angle.DEGREES_TO_RADIANS, - lon1 = location1.longitude * Angle.DEGREES_TO_RADIANS, - lon2 = location2.longitude * Angle.DEGREES_TO_RADIANS, - dLat, - dLon, - dPhi, - q, - distanceRadians; - - if (lat1 == lat2 && lon1 == lon2) { - return 0; - } - - dLat = lat2 - lat1; - dLon = lon2 - lon1; - dPhi = Math.log(Math.tan(lat2 / 2.0 + Math.PI / 4) / Math.tan(lat1 / 2.0 + Math.PI / 4)); - q = dLat / dPhi; - - if (isNaN(dPhi) || isNaN(q)) { - q = Math.cos(lat1); - } - - // If lonChange over 180 take shorter rhumb across 180 meridian. - if (WWMath.fabs(dLon) > Math.PI) { - dLon = dLon > 0 ? -(2 * Math.PI - dLon) : 2 * Math.PI + dLon; - } - - distanceRadians = Math.sqrt(dLat * dLat + q * q * dLon * dLon); - - return isNaN(distanceRadians) ? 0 : distanceRadians; -}; - -/** - * Computes the location on a rhumb arc with the given starting location, azimuth, and arc distance. - * This function uses a spherical model, not elliptical. - * - * @param {Location} location The starting location. - * @param {Number} azimuthDegrees The azimuth in degrees. - * @param {Number} pathLengthRadians The radian distance along the path at which to compute the location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If the specified location or the result argument is null or undefined. - */ -Location.rhumbLocation = function (location, azimuthDegrees, pathLengthRadians, result) { - if (!location) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "rhumbLocation", "missingLocation")); - } - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "rhumbLocation", "missingResult")); - } - - if (pathLengthRadians == 0) { - result.latitude = location.latitude; - result.longitude = location.longitude; - return result; - } - - var latRadians = location.latitude * Angle.DEGREES_TO_RADIANS, - lonRadians = location.longitude * Angle.DEGREES_TO_RADIANS, - azimuthRadians = azimuthDegrees * Angle.DEGREES_TO_RADIANS, - endLatRadians = latRadians + pathLengthRadians * Math.cos(azimuthRadians), - dPhi = Math.log(Math.tan(endLatRadians / 2 + Math.PI / 4) / Math.tan(latRadians / 2 + Math.PI / 4)), - q = (endLatRadians - latRadians) / dPhi, - dLon, - endLonRadians; - - if (isNaN(dPhi) || isNaN(q) || !isFinite(q)) { - q = Math.cos(latRadians); - } - - dLon = pathLengthRadians * Math.sin(azimuthRadians) / q; - - // Handle latitude passing over either pole. - if (WWMath.fabs(endLatRadians) > Math.PI / 2) { - endLatRadians = endLatRadians > 0 ? Math.PI - endLatRadians : -Math.PI - endLatRadians; - } - - endLonRadians = WWMath.fmod(lonRadians + dLon + Math.PI, 2 * Math.PI) - Math.PI; - - if (isNaN(endLatRadians) || isNaN(endLonRadians)) { - result.latitude = location.latitude; - result.longitude = location.longitude; - } else { - result.latitude = Angle.normalizedDegreesLatitude(endLatRadians * Angle.RADIANS_TO_DEGREES); - result.longitude = Angle.normalizedDegreesLongitude(endLonRadians * Angle.RADIANS_TO_DEGREES); - } - - return result; -}; - -/** - * Compute a location along a linear path at a specified distance between two specified locations. - * @param {Number} amount The fraction of the path between the two locations at which to compute the new - * location. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If either specified location or the result argument is null or undefined. - */ -Location.interpolateLinear = function (amount, location1, location2, result) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateLinear", "missingLocation")); - } - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "interpolateLinear", "missingResult")); - } - - if (location1.equals(location2)) { - result.latitude = location1.latitude; - result.longitude = location1.longitude; - return result; - } - - var t = WWMath.clamp(amount, 0, 1), - azimuthDegrees = this.linearAzimuth(location1, location2), - distanceRadians = this.linearDistance(location1, location2); - - return this.linearLocation(location1, azimuthDegrees, t * distanceRadians, result); -}; - -/** - * Computes the azimuth angle (clockwise from North) that points from the first location to the second location. - * This angle can be used as the azimuth for a linear arc that begins at the first location, and - * passes through the second location. - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @returns {Number} The computed azimuth, in degrees. - * @throws {ArgumentError} If either specified location is null or undefined. - */ -Location.linearAzimuth = function (location1, location2) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "linearAzimuth", "missingLocation")); - } - - var lat1 = location1.latitude * Angle.DEGREES_TO_RADIANS, - lat2 = location2.latitude * Angle.DEGREES_TO_RADIANS, - lon1 = location1.longitude * Angle.DEGREES_TO_RADIANS, - lon2 = location2.longitude * Angle.DEGREES_TO_RADIANS, - dLon, - dPhi, - azimuthRadians; - - if (lat1 == lat2 && lon1 == lon2) { - return 0; - } - - dLon = lon2 - lon1; - dPhi = lat2 - lat1; - - // If longitude change is over 180 take shorter path across 180 meridian. - if (WWMath.fabs(dLon) > Math.PI) { - dLon = dLon > 0 ? -(2 * Math.PI - dLon) : 2 * Math.PI + dLon; - } - - azimuthRadians = Math.atan2(dLon, dPhi); - - return isNaN(azimuthRadians) ? 0 : azimuthRadians * Angle.RADIANS_TO_DEGREES; -}; - -/** - * Computes the linear angular distance between two locations. The return value gives the distance as the - * angle between the two positions in radians. This angle is the arc length of the segment between the two - * positions. To compute a distance in meters from this value, multiply the return value by the radius of the - * globe. - * - * @param {Location} location1 The starting location. - * @param {Location} location2 The ending location. - * @returns {Number} The computed distance, in radians. - * @throws {ArgumentError} If either specified location is null or undefined. - */ -Location.linearDistance = function (location1, location2) { - if (!location1 || !location2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "linearDistance", "missingLocation")); - } - - var lat1 = location1.latitude * Angle.DEGREES_TO_RADIANS, - lat2 = location2.latitude * Angle.DEGREES_TO_RADIANS, - lon1 = location1.longitude * Angle.DEGREES_TO_RADIANS, - lon2 = location2.longitude * Angle.DEGREES_TO_RADIANS, - dLat, - dLon, - distanceRadians; - - if (lat1 == lat2 && lon1 == lon2) { - return 0; - } - - dLat = lat2 - lat1; - dLon = lon2 - lon1; - - // If lonChange over 180 take shorter path across 180 meridian. - if (WWMath.fabs(dLon) > Math.PI) { - dLon = dLon > 0 ? -(2 * Math.PI - dLon) : 2 * Math.PI + dLon; - } - - distanceRadians = Math.sqrt(dLat * dLat + dLon * dLon); - - return isNaN(distanceRadians) ? 0 : distanceRadians; -}; - -/** - * Computes the location on a linear path with the given starting location, azimuth, and arc distance. - * - * @param {Location} location The starting location. - * @param {Number} azimuthDegrees The azimuth in degrees. - * @param {Number} pathLengthRadians The radian distance along the path at which to compute the location. - * @param {Location} result A Location in which to return the result. - * @returns {Location} The specified result location. - * @throws {ArgumentError} If the specified location or the result argument is null or undefined. - */ -Location.linearLocation = function (location, azimuthDegrees, pathLengthRadians, result) { - if (!location) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "linearLocation", "missingLocation")); - } - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "linearLocation", "missingResult")); - } - - if (pathLengthRadians == 0) { - result.latitude = location.latitude; - result.longitude = location.longitude; - return result; - } - - var latRadians = location.latitude * Angle.DEGREES_TO_RADIANS, - lonRadians = location.longitude * Angle.DEGREES_TO_RADIANS, - azimuthRadians = azimuthDegrees * Angle.DEGREES_TO_RADIANS, - endLatRadians = latRadians + pathLengthRadians * Math.cos(azimuthRadians), - endLonRadians; - - // Handle latitude passing over either pole. - if (WWMath.fabs(endLatRadians) > Math.PI / 2) { - endLatRadians = endLatRadians > 0 ? Math.PI - endLatRadians : -Math.PI - endLatRadians; - } - - endLonRadians = - WWMath.fmod(lonRadians + pathLengthRadians * Math.sin(azimuthRadians) + Math.PI, 2 * Math.PI) - Math.PI; - - if (isNaN(endLatRadians) || isNaN(endLonRadians)) { - result.latitude = location.latitude; - result.longitude = location.longitude; - } else { - result.latitude = Angle.normalizedDegreesLatitude(endLatRadians * Angle.RADIANS_TO_DEGREES); - result.longitude = Angle.normalizedDegreesLongitude(endLonRadians * Angle.RADIANS_TO_DEGREES); - } - - return result; -}; - -/** - * Determine whether a list of locations crosses the dateline. - * @param {Location[]} locations The locations to test. - * @returns {boolean} True if the dateline is crossed, else false. - * @throws {ArgumentError} If the locations list is null. - */ -Location.locationsCrossDateLine = function (locations) { - if (!locations) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "locationsCrossDateline", "missingLocation")); - } - - var pos = null; - for (var idx = 0, len = locations.length; idx < len; idx += 1) { - var posNext = locations[idx]; - - if (pos != null) { - // A segment cross the line if end pos have different longitude signs - // and are more than 180 degrees longitude apart - if (WWMath.signum(pos.longitude) != WWMath.signum(posNext.longitude)) { - var delta = Math.abs(pos.longitude - posNext.longitude); - if (delta > 180 && delta < 360) - return true; - } - } - pos = posNext; - } - - return false; -}; - -/** - * Returns two locations with the most extreme latitudes on the sequence of great circle arcs defined by each pair - * of locations in the specified iterable. - * - * @param {Location[]} locations The pairs of locations defining a sequence of great circle arcs. - * - * @return {Location[]} Two locations with the most extreme latitudes on the great circle arcs. - * - * @throws IllegalArgumentException if locations is null. - */ -Location.greatCircleArcExtremeLocations = function (locations) { - if (!locations) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleArcExtremeLocations", "missingLocation")); - } - - var minLatLocation = null; - var maxLatLocation = null; - - var lastLocation = null; - - for (var idx = 0, len = locations.length; idx < len; idx += 1) { - var location = locations[idx]; - - if (lastLocation != null) { - var extremes = Location.greatCircleArcExtremeForTwoLocations(lastLocation, location); - if (extremes == null) { - continue; - } - - if (minLatLocation == null || minLatLocation.latitude > extremes[0].latitude) { - minLatLocation = extremes[0]; - } - if (maxLatLocation == null || maxLatLocation.latitude < extremes[1].latitude) { - maxLatLocation = extremes[1]; - } - } - - lastLocation = location; - } - - return [minLatLocation, maxLatLocation]; -}; - -/** - * Returns two locations with the most extreme latitudes on the great circle arc defined by, and limited to, the two - * locations. - * - * @param {Location} begin Beginning location on the great circle arc. - * @param {Location} end Ending location on the great circle arc. - * - * @return {Location[]} Two locations with the most extreme latitudes on the great circle arc. - * - * @throws {ArgumentError} If either begin or end are null. - */ -Location.greatCircleArcExtremeForTwoLocations = function (begin, end) { - if (!begin || !end) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleArcExtremeForTwoLocations", "missingLocation")); - } - - var idx, len, location; // Iteration variables. - var minLatLocation = null; - var maxLatLocation = null; - var minLat = 90; - var maxLat = -90; - - // Compute the min and max latitude and associated locations from the arc endpoints. - var locations = [begin, end]; - for (idx = 0, len = locations.length; idx < len; idx += 1) { - location = locations[idx]; - - if (minLat >= location.latitude) { - minLat = location.latitude; - minLatLocation = location; - } - if (maxLat <= location.latitude) { - maxLat = location.latitude; - maxLatLocation = location; - } - } - // The above could be written for greater clarity, simplicity, and speed: - // minLat = Math.min(begin.latitude, end.latitude); - // maxLat = Math.max(begin.latitude, end.latitude); - // minLatLocation = minLat == begin.latitude ? begin : end; - // maxLatLocation = maxLat == begin.latitude ? begin : end; - - // Compute parameters for the great circle arc defined by begin and end. Then compute the locations of extreme - // latitude on entire the great circle which that arc is part of. - var greatArcAzimuth = Location.greatCircleAzimuth(begin, end); - var greatArcDistance = Location.greatCircleDistance(begin, end); - var greatCircleExtremes = Location.greatCircleExtremeLocationsUsingAzimuth(begin, greatArcAzimuth); - - // Determine whether either of the extreme locations are inside the arc defined by begin and end. If so, - // adjust the min and max latitude accordingly. - for (idx = 0, len = greatCircleExtremes.length; idx < len; idx += 1) { - location = greatCircleExtremes[idx]; - - var az = Location.greatCircleAzimuth(begin, location); - var d = Location.greatCircleDistance(begin, location); - - // The extreme location must be between the begin and end locations. Therefore its azimuth relative to - // the begin location should have the same signum, and its distance relative to the begin location should - // be between 0 and greatArcDistance, inclusive. - if (WWMath.signum(az) == WWMath.signum(greatArcAzimuth)) { - if (d >= 0 && d <= greatArcDistance) { - if (minLat >= location.latitude) { - minLat = location.latitude; - minLatLocation = location; - } - if (maxLat <= location.latitude) { - maxLat = location.latitude; - maxLatLocation = location; - } - } - } - } - - return [minLatLocation, maxLatLocation]; -}; - -/** - * Returns two locations with the most extreme latitudes on the great circle with the given starting location and - * azimuth. - * - * @param {Location} location Location on the great circle. - * @param {number} azimuth Great circle azimuth angle (clockwise from North). - * - * @return {Location[]} Two locations where the great circle has its extreme latitudes. - * - * @throws {ArgumentError} If location is null. - */ -Location.greatCircleExtremeLocationsUsingAzimuth = function (location, azimuth) { - if (!location) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Location", "greatCircleArcExtremeLocationsUsingAzimuth", "missingLocation")); - } - - var lat0 = location.latitude; - var az = azimuth * Angle.DEGREES_TO_RADIANS; - - // Derived by solving the function for longitude on a great circle against the desired longitude. We start - // with the equation in "Map Projections - A Working Manual", page 31, equation 5-5: - // - // lat = asin( sin(lat0) * cos(C) + cos(lat0) * sin(C) * cos(Az) ) - // - // Where (lat0, lon) are the starting coordinates, c is the angular distance along the great circle from the - // starting coordinate, and Az is the azimuth. All values are in radians. Solving for angular distance gives - // distance to the equator: - // - // tan(C) = -tan(lat0) / cos(Az) - // - // The great circle is by definition centered about the Globe's origin. Therefore intersections with the - // equator will be antipodal (exactly 180 degrees opposite each other), as will be the extreme latitudes. - // By observing the symmetry of a great circle, it is also apparent that the extreme latitudes will be 90 - // degrees from either intersection with the equator. - // - // d1 = c + 90 - // d2 = c - 90 - - var tanDistance = -Math.tan(lat0) / Math.cos(az); - var distance = Math.atan(tanDistance); - - var extremeDistance1 = distance + Math.PI / 2.0; - var extremeDistance2 = distance - Math.PI / 2.0; - - return [ - Location.greatCircleLocation(location, azimuth, extremeDistance1, new Location(0, 0)), - Location.greatCircleLocation(location, azimuth, extremeDistance2, new Location(0, 0)) - ]; -}; - -/** - * Determine where a line between two positions crosses a given meridian. The intersection test is performed by - * intersecting a line in Cartesian space between the two positions with a plane through the meridian. Thus, it is - * most suitable for working with positions that are fairly close together as the calculation does not take into - * account great circle or rhumb paths. - * - * @param {Location} p1 First position. - * @param {Location} p2 Second position. - * @param {number} meridian Longitude line to intersect with. - * @param {Globe} globe Globe used to compute intersection. - * - * @return {number} latitude The intersection latitude along the meridian - * - * TODO: this code allocates 4 new Vec3 and 1 new Position; use scratch variables??? - * TODO: Why not? Every location created would then allocated those variables as well, even if they aren't needed :(. - */ -Location.intersectionWithMeridian = function (p1, p2, meridian, globe) { - // TODO: add support for 2D - //if (globe instanceof Globe2D) - //{ - // // y = mx + b case after normalizing negative angles. - // double lon1 = p1.getLongitude().degrees < 0 ? p1.getLongitude().degrees + 360 : p1.getLongitude().degrees; - // double lon2 = p2.getLongitude().degrees < 0 ? p2.getLongitude().degrees + 360 : p2.getLongitude().degrees; - // if (lon1 == lon2) - // return null; - // - // double med = meridian.degrees < 0 ? meridian.degrees + 360 : meridian.degrees; - // double slope = (p2.latitude.degrees - p1.latitude.degrees) / (lon2 - lon1); - // double lat = p1.latitude.degrees + slope * (med - lon1); - // - // return LatLon.fromDegrees(lat, meridian.degrees); - //} - - var pt1 = globe.computePointFromLocation(p1.latitude, p1.longitude, new Vec3(0, 0, 0)); - var pt2 = globe.computePointFromLocation(p2.latitude, p2.longitude, new Vec3(0, 0, 0)); - - // Compute a plane through the origin, North Pole, and the desired meridian. - var northPole = globe.computePointFromLocation(90, meridian, new Vec3(0, 0, 0)); - var pointOnEquator = globe.computePointFromLocation(0, meridian, new Vec3(0, 0, 0)); - - var plane = Plane.fromPoints(northPole, pointOnEquator, Vec3.ZERO); - - var intersectionPoint = new Vec3(0, 0, 0); - if (!plane.intersectsSegmentAt(pt1, pt2, intersectionPoint)) { - return null; - } - - // TODO: unable to simply create a new Position(0, 0, 0) - var pos = new WorldWind.Position(0, 0, 0); - globe.computePositionFromPoint(intersectionPoint[0], intersectionPoint[1], intersectionPoint[2], pos); - - return pos.latitude; -}; - -/** - * Determine where a line between two positions crosses a given meridian. The intersection test is performed by - * intersecting a line in Cartesian space. Thus, it is most suitable for working with positions that are fairly - * close together as the calculation does not take into account great circle or rhumb paths. - * - * @param {Location | Position} p1 First position. - * @param {Location | Position} p2 Second position. - * @param {number} meridian Longitude line to intersect with. - * - * @return {number | null} latitude The intersection latitude along the meridian - * or null if the line is collinear with the meridian - */ -Location.meridianIntersection = function (p1, p2, meridian) { - // y = mx + b case after normalizing negative angles. - var lon1 = p1.longitude < 0 ? p1.longitude + 360 : p1.longitude; - var lon2 = p2.longitude < 0 ? p2.longitude + 360 : p2.longitude; - if (lon1 === lon2) { - //infinite solutions, the line is collinear with the anti-meridian - return null; - } - - var med = meridian < 0 ? meridian + 360 : meridian; - var slope = (p2.latitude - p1.latitude) / (lon2 - lon1); - var lat = p1.latitude + slope * (med - lon1); - - return lat; -}; - -/** - * A bit mask indicating which if any pole is being referenced. - * This corresponds to Java WW's AVKey.NORTH and AVKey.SOUTH, - * although this encoding can capture both poles simultaneously, which was - * a 'to do' item in the Java implementation. - * @type {{NONE: number, NORTH: number, SOUTH: number}} - */ -Location.poles = { - 'NONE': 0, - 'NORTH': 1, - 'SOUTH': 2 -}; - -export default Location; diff --git a/web/src/gis/geom/Matrix.js b/web/src/gis/geom/Matrix.js deleted file mode 100644 index b2f29e2a..00000000 --- a/web/src/gis/geom/Matrix.js +++ /dev/null @@ -1,1908 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Matrix - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Position from '../geom/Position'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a matrix. - * @alias Matrix - * @constructor - * @classdesc Represents a 4 x 4 double precision matrix stored in a Float64Array in row-major order. - * @param {Number} m11 matrix element at row 1, column 1. - * @param {Number} m12 matrix element at row 1, column 2. - * @param {Number} m13 matrix element at row 1, column 3. - * @param {Number} m14 matrix element at row 1, column 4. - * @param {Number} m21 matrix element at row 2, column 1. - * @param {Number} m22 matrix element at row 2, column 2. - * @param {Number} m23 matrix element at row 2, column 3. - * @param {Number} m24 matrix element at row 2, column 4. - * @param {Number} m31 matrix element at row 3, column 1. - * @param {Number} m32 matrix element at row 3, column 2. - * @param {Number} m33 matrix element at row 3, column 3. - * @param {Number} m34 matrix element at row 3, column 4. - * @param {Number} m41 matrix element at row 4, column 1. - * @param {Number} m42 matrix element at row 4, column 2. - * @param {Number} m43 matrix element at row 4, column 3. - * @param {Number} m44 matrix element at row 4, column 4. - */ -function Matrix(m11, m12, m13, m14, - m21, m22, m23, m24, - m31, m32, m33, m34, - m41, m42, m43, m44) { - this[0] = m11; - this[1] = m12; - this[2] = m13; - this[3] = m14; - this[4] = m21; - this[5] = m22; - this[6] = m23; - this[7] = m24; - this[8] = m31; - this[9] = m32; - this[10] = m33; - this[11] = m34; - this[12] = m41; - this[13] = m42; - this[14] = m43; - this[15] = m44; -} - -// Derives from Float64Array. -Matrix.prototype = new Float64Array(16); - -/** - * Creates an identity matrix. - * @returns {Matrix} A new identity matrix. - */ -Matrix.fromIdentity = function () { - return new Matrix( - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - ); -}; - -/** - * Computes the principal axes of a point collection expressed in a typed array. - * @param {Float32Array} points The points for which to compute the axes, - * expressed as X0, Y0, Z0, X1, Y1, Z1, ... - * @param {Vec3} axis1 A vector in which to return the first (longest) principal axis. - * @param {Vec3} axis2 A vector in which to return the second (mid-length) principal axis. - * @param {Vec3} axis3 A vector in which to return the third (shortest) principal axis. - * @throws {ArgumentError} If the specified points array is null, undefined or empty, or one of the - * specified axes arguments is null or undefined. - */ -Matrix.principalAxesFromPoints = function (points, axis1, axis2, axis3) { - if (!points || points.length < 1) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "principalAxesFromPoints", - "missingPoints")); - } - - if (!axis1 || !axis2 || !axis3) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "principalAxesFromPoints", - "An axis argument is null or undefined.")); - } - - // Compute the covariance matrix. - var covariance = Matrix.fromIdentity(); - covariance.setToCovarianceOfPoints(points); - - // Compute the eigenvectors from the covariance matrix. Since the covariance matrix is symmetric by - // definition, we can safely use the "symmetric" method below. - covariance.eigensystemFromSymmetricMatrix(axis1, axis2, axis3); - - // Normalize the eigenvectors, which are already sorted in order from most prominent to least prominent. - axis1.normalize(); - axis2.normalize(); - axis3.normalize(); -}; - -/** - * Sets the components of this matrix to specified values. - * @param {Number} m11 matrix element at row 1, column 1. - * @param {Number} m12 matrix element at row 1, column 2. - * @param {Number} m13 matrix element at row 1, column 3. - * @param {Number} m14 matrix element at row 1, column 4. - * @param {Number} m21 matrix element at row 2, column 1. - * @param {Number} m22 matrix element at row 2, column 2. - * @param {Number} m23 matrix element at row 2, column 3. - * @param {Number} m24 matrix element at row 2, column 4. - * @param {Number} m31 matrix element at row 3, column 1. - * @param {Number} m32 matrix element at row 3, column 2. - * @param {Number} m33 matrix element at row 3, column 3. - * @param {Number} m34 matrix element at row 3, column 4. - * @param {Number} m41 matrix element at row 4, column 1. - * @param {Number} m42 matrix element at row 4, column 2. - * @param {Number} m43 matrix element at row 4, column 3. - * @param {Number} m44 matrix element at row 4, column 4. - * @returns {Matrix} This matrix with its components set to the specified values. - */ -Matrix.prototype.set = function (m11, m12, m13, m14, - m21, m22, m23, m24, - m31, m32, m33, m34, - m41, m42, m43, m44) { - this[0] = m11; - this[1] = m12; - this[2] = m13; - this[3] = m14; - this[4] = m21; - this[5] = m22; - this[6] = m23; - this[7] = m24; - this[8] = m31; - this[9] = m32; - this[10] = m33; - this[11] = m34; - this[12] = m41; - this[13] = m42; - this[14] = m43; - this[15] = m44; - - return this; -}; - -/** - * Sets this matrix to the identity matrix. - * @returns {Matrix} This matrix set to the identity matrix. - */ -Matrix.prototype.setToIdentity = function () { - this[0] = 1; - this[1] = 0; - this[2] = 0; - this[3] = 0; - this[4] = 0; - this[5] = 1; - this[6] = 0; - this[7] = 0; - this[8] = 0; - this[9] = 0; - this[10] = 1; - this[11] = 0; - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 1; -}; - -/** - * Copies the components of a specified matrix to this matrix. - * @param {Matrix} matrix The matrix to copy. - * @returns {Matrix} This matrix set to the values of the specified matrix. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -Matrix.prototype.copy = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "copy", "missingMatrix")); - } - - this[0] = matrix[0]; - this[1] = matrix[1]; - this[2] = matrix[2]; - this[3] = matrix[3]; - this[4] = matrix[4]; - this[5] = matrix[5]; - this[6] = matrix[6]; - this[7] = matrix[7]; - this[8] = matrix[8]; - this[9] = matrix[9]; - this[10] = matrix[10]; - this[11] = matrix[11]; - this[12] = matrix[12]; - this[13] = matrix[13]; - this[14] = matrix[14]; - this[15] = matrix[15]; -}; - -/** - * Creates a new matrix that is a copy of this matrix. - * @returns {Matrix} The new matrix. - */ -Matrix.prototype.clone = function () { - var clone = Matrix.fromIdentity(); - clone.copy(this); - - return clone; -}; - -/** - * Indicates whether the components of this matrix are equal to those of a specified matrix. - * @param {Matrix} matrix The matrix to test equality with. May be null or undefined, in which case this - * function returns false. - * @returns {boolean} true if all components of this matrix are equal to the corresponding - * components of the specified matrix, otherwise false. - */ -Matrix.prototype.equals = function (matrix) { - return matrix - && this[0] == matrix[0] - && this[1] == matrix[1] - && this[2] == matrix[2] - && this[3] == matrix[3] - && this[4] == matrix[4] - && this[5] == matrix[5] - && this[6] == matrix[6] - && this[7] == matrix[7] - && this[8] == matrix[8] - && this[9] == matrix[9] - && this[10] == matrix[10] - && this[11] == matrix[11] - && this[12] == matrix[12] - && this[13] == matrix[13] - && this[14] == matrix[14] - && this[15] == matrix[15]; -}; - -/** - * Stores this matrix's components in column-major order in a specified array. - * <p> - * The array must have space for at least 16 elements. This matrix's components are stored in the array - * starting with row 0 column 0 in index 0, row 1 column 0 in index 1, row 2 column 0 in index 2, and so on. - * - * @param {Float32Array | Float64Array | Number[]} result An array of at least 16 elements. Upon return, - * contains this matrix's components in column-major. - * @returns {Float32Array} The specified result array. - * @throws {ArgumentError} If the specified result array in null or undefined. - */ -Matrix.prototype.columnMajorComponents = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "columnMajorComponents", "missingResult")); - } - - // Column 1 - result[0] = this[0]; - result[1] = this[4]; - result[2] = this[8]; - result[3] = this[12]; - // Column 2 - result[4] = this[1]; - result[5] = this[5]; - result[6] = this[9]; - result[7] = this[13]; - // Column 3 - result[8] = this[2]; - result[9] = this[6]; - result[10] = this[10]; - result[11] = this[14]; - // Column 4 - result[12] = this[3]; - result[13] = this[7]; - result[14] = this[11]; - result[15] = this[15]; - - return result; -}; - -/** - * Sets this matrix to a translation matrix with specified translation components. - * @param {Number} x The X translation component. - * @param {Number} y The Y translation component. - * @param {Number} z The Z translation component. - * @returns {Matrix} This matrix with its translation components set to those specified and all other - * components set to that of an identity matrix. - */ -Matrix.prototype.setToTranslation = function (x, y, z) { - this[0] = 1; - this[1] = 0; - this[2] = 0; - this[3] = x; - this[4] = 0; - this[5] = 1; - this[6] = 0; - this[7] = y; - this[8] = 0; - this[9] = 0; - this[10] = 1; - this[11] = z; - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 1; - - return this; -}; - -/** - * Sets the translation components of this matrix to specified values. - * @param {Number} x The X translation component. - * @param {Number} y The Y translation component. - * @param {Number} z The Z translation component. - * @returns {Matrix} This matrix with its translation components set to the specified values and all other - * components unmodified. - */ -Matrix.prototype.setTranslation = function (x, y, z) { - this[3] = x; - this[7] = y; - this[11] = z; - - return this; -}; - -/** - * Sets this matrix to a scale matrix with specified scale components. - * @param {Number} xScale The X scale component. - * @param {Number} yScale The Y scale component. - * @param {Number} zScale The Z scale component. - * @returns {Matrix} This matrix with its scale components set to those specified and all other - * components set to that of an identity matrix. - */ -Matrix.prototype.setToScale = function (xScale, yScale, zScale) { - this[0] = xScale; - this[1] = 0; - this[2] = 0; - this[3] = 0; - this[4] = 0; - this[5] = yScale; - this[6] = 0; - this[7] = 0; - this[8] = 0; - this[9] = 0; - this[10] = zScale; - this[11] = 0; - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 1; - - return this; -}; - -/** - * Sets the scale components of this matrix to specified values. - * @param {Number} xScale The X scale component. - * @param {Number} yScale The Y scale component. - * @param {Number} zScale The Z scale component. - * @returns {Matrix} This matrix with its scale components set to the specified values and all other - * components unmodified. - */ -Matrix.prototype.setScale = function (xScale, yScale, zScale) { - this[0] = xScale; - this[5] = yScale; - this[10] = zScale; - - return this; -}; - -/** - * Sets this matrix to the transpose of a specified matrix. - * @param {Matrix} matrix The matrix whose transpose is to be copied. - * @returns {Matrix} This matrix, with its values set to the transpose of the specified matrix. - * @throws {ArgumentError} If the specified matrix in null or undefined. - */ -Matrix.prototype.setToTransposeOfMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToTransposeOfMatrix", "missingMatrix")); - } - - this[0] = matrix[0]; - this[1] = matrix[4]; - this[2] = matrix[8]; - this[3] = matrix[12]; - this[4] = matrix[1]; - this[5] = matrix[5]; - this[6] = matrix[9]; - this[7] = matrix[13]; - this[8] = matrix[2]; - this[9] = matrix[6]; - this[10] = matrix[10]; - this[11] = matrix[14]; - this[12] = matrix[3]; - this[13] = matrix[7]; - this[14] = matrix[11]; - this[15] = matrix[15]; - - return this; -}; - -/** - * Sets this matrix to the matrix product of two specified matrices. - * @param {Matrix} matrixA The first matrix multiplicand. - * @param {Matrix} matrixB The second matrix multiplicand. - * @returns {Matrix} This matrix set to the product of matrixA x matrixB. - * @throws {ArgumentError} If either specified matrix is null or undefined. - */ -Matrix.prototype.setToMultiply = function (matrixA, matrixB) { - if (!matrixA || !matrixB) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToMultiply", "missingMatrix")); - } - - var ma = matrixA, - mb = matrixB; - - this[0] = ma[0] * mb[0] + ma[1] * mb[4] + ma[2] * mb[8] + ma[3] * mb[12]; - this[1] = ma[0] * mb[1] + ma[1] * mb[5] + ma[2] * mb[9] + ma[3] * mb[13]; - this[2] = ma[0] * mb[2] + ma[1] * mb[6] + ma[2] * mb[10] + ma[3] * mb[14]; - this[3] = ma[0] * mb[3] + ma[1] * mb[7] + ma[2] * mb[11] + ma[3] * mb[15]; - - this[4] = ma[4] * mb[0] + ma[5] * mb[4] + ma[6] * mb[8] + ma[7] * mb[12]; - this[5] = ma[4] * mb[1] + ma[5] * mb[5] + ma[6] * mb[9] + ma[7] * mb[13]; - this[6] = ma[4] * mb[2] + ma[5] * mb[6] + ma[6] * mb[10] + ma[7] * mb[14]; - this[7] = ma[4] * mb[3] + ma[5] * mb[7] + ma[6] * mb[11] + ma[7] * mb[15]; - - this[8] = ma[8] * mb[0] + ma[9] * mb[4] + ma[10] * mb[8] + ma[11] * mb[12]; - this[9] = ma[8] * mb[1] + ma[9] * mb[5] + ma[10] * mb[9] + ma[11] * mb[13]; - this[10] = ma[8] * mb[2] + ma[9] * mb[6] + ma[10] * mb[10] + ma[11] * mb[14]; - this[11] = ma[8] * mb[3] + ma[9] * mb[7] + ma[10] * mb[11] + ma[11] * mb[15]; - - this[12] = ma[12] * mb[0] + ma[13] * mb[4] + ma[14] * mb[8] + ma[15] * mb[12]; - this[13] = ma[12] * mb[1] + ma[13] * mb[5] + ma[14] * mb[9] + ma[15] * mb[13]; - this[14] = ma[12] * mb[2] + ma[13] * mb[6] + ma[14] * mb[10] + ma[15] * mb[14]; - this[15] = ma[12] * mb[3] + ma[13] * mb[7] + ma[14] * mb[11] + ma[15] * mb[15]; - - return this; -}; - -/** - * Sets this matrix to the symmetric covariance Matrix computed from the x, y, z coordinates of a specified - * points array. - * <p/> - * The computed covariance matrix represents the correlation between each pair of x-, y-, and z-coordinates as - * they're distributed about the point array's arithmetic mean. Its layout is as follows: - * <p/> - * <code> C(x, x) C(x, y) C(x, z) <br/> C(x, y) C(y, y) C(y, z) <br/> C(x, z) C(y, z) C(z, z) </code> - * <p/> - * C(i, j) is the covariance of coordinates i and j, where i or j are a coordinate's dispersion about its mean - * value. If any entry is zero, then there's no correlation between the two coordinates defining that entry. If the - * returned matrix is diagonal, then all three coordinates are uncorrelated, and the specified point is - * distributed evenly about its mean point. - * @param {Float32Array | Float64Array | Number[]} points The points to consider. - * @returns {Matrix} This matrix set to the covariance matrix for the specified list of points. - * @throws {ArgumentError} If the specified array of points is null, undefined or empty. - */ -Matrix.prototype.setToCovarianceOfPoints = function (points) { - if (!points || points.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToCovarianceOfPoints", "missingArray")); - } - - var mean, - dx, - dy, - dz, - count = 0, - c11 = 0, - c22 = 0, - c33 = 0, - c12 = 0, - c13 = 0, - c23 = 0, - vec = new Vec3(0, 0, 0); - - mean = Vec3.averageOfBuffer(points, new Vec3(0, 0, 0)); - - for (var i = 0, len = points.length / 3; i < len; i++) { - vec[0] = points[i * 3]; - vec[1] = points[i * 3 + 1]; - vec[2] = points[i * 3 + 2]; - - dx = vec[0] - mean[0]; - dy = vec[1] - mean[1]; - dz = vec[2] - mean[2]; - - ++count; - c11 += dx * dx; - c22 += dy * dy; - c33 += dz * dz; - c12 += dx * dy; // c12 = c21 - c13 += dx * dz; // c13 = c31 - c23 += dy * dz; // c23 = c32 - } - - // Row 1 - this[0] = c11 / count; - this[1] = c12 / count; - this[2] = c13 / count; - this[3] = 0; - - // Row 2 - this[4] = c12 / count; - this[5] = c22 / count; - this[6] = c23 / count; - this[7] = 0; - - // Row 3 - this[8] = c13 / count; - this[9] = c23 / count; - this[10] = c33 / count; - this[11] = 0; - - // Row 4 - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 0; - - return this; -}; - -/** - * Multiplies this matrix by a translation matrix with specified translation values. - * @param {Number} x The X translation component. - * @param {Number} y The Y translation component. - * @param {Number} z The Z translation component. - * @returns {Matrix} This matrix multiplied by the translation matrix implied by the specified values. - */ -Matrix.prototype.multiplyByTranslation = function (x, y, z) { - - this.multiply( - 1, 0, 0, x, - 0, 1, 0, y, - 0, 0, 1, z, - 0, 0, 0, 1); - - return this; -}; - -/** - * Multiplies this matrix by a rotation matrix about a specified axis and angle. - * @param {Number} x The X component of the rotation axis. - * @param {Number} y The Y component of the rotation axis. - * @param {Number} z The Z component of the rotation axis. - * @param {Number} angleDegrees The angle to rotate, in degrees. - * @returns {Matrix} This matrix multiplied by the rotation matrix implied by the specified values. - */ -Matrix.prototype.multiplyByRotation = function (x, y, z, angleDegrees) { - - var c = Math.cos(angleDegrees * Angle.DEGREES_TO_RADIANS), - s = Math.sin(angleDegrees * Angle.DEGREES_TO_RADIANS); - - this.multiply( - c + (1 - c) * x * x, (1 - c) * x * y - s * z, (1 - c) * x * z + s * y, 0, - (1 - c) * x * y + s * z, c + (1 - c) * y * y, (1 - c) * y * z - s * x, 0, - (1 - c) * x * z - s * y, (1 - c) * y * z + s * x, c + (1 - c) * z * z, 0, - 0, 0, 0, 1); - - return this; -}; - -/** - * Multiplies this matrix by a scale matrix with specified values. - * @param {Number} xScale The X scale component. - * @param {Number} yScale The Y scale component. - * @param {Number} zScale The Z scale component. - * @returns {Matrix} This matrix multiplied by the scale matrix implied by the specified values. - */ -Matrix.prototype.multiplyByScale = function (xScale, yScale, zScale) { - - this.multiply( - xScale, 0, 0, 0, - 0, yScale, 0, 0, - 0, 0, zScale, 0, - 0, 0, 0, 1); - - return this; -}; - -/** - * Sets this matrix to one that flips and shifts the y-axis. - * <p> - * The resultant matrix maps Y=0 to Y=1 and Y=1 to Y=0. All existing values are overwritten. This matrix is - * usually used to change the coordinate origin from an upper left coordinate origin to a lower left coordinate - * origin. This is typically necessary to align the coordinate system of images (top-left origin) with that of - * OpenGL (bottom-left origin). - * @returns {Matrix} This matrix set to values described above. - */ -Matrix.prototype.setToUnitYFlip = function () { - - this[0] = 1; - this[1] = 0; - this[2] = 0; - this[3] = 0; - this[4] = 0; - this[5] = -1; - this[6] = 0; - this[7] = 1; - this[8] = 0; - this[9] = 0; - this[10] = 1; - this[11] = 0; - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 1; - - return this; -}; - -/** - * Multiplies this matrix by a local coordinate system transform for the specified globe. - * <p> - * The local coordinate system is defined such that the local origin (0, 0, 0) maps to the specified origin - * point, the z axis maps to the globe's surface normal at the point, the y-axis maps to the north pointing - * tangent, and the x-axis maps to the east pointing tangent. - * - * @param {Vec3} origin The local coordinate system origin, in model coordinates. - * @param {Globe} globe The globe the coordinate system is relative to. - * - * @throws {ArgumentError} If either argument is null or undefined. - */ -Matrix.prototype.multiplyByLocalCoordinateTransform = function (origin, globe) { - if (!origin) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByLocalCoordinateTransform", - "Origin vector is null or undefined")); - } - - if (!globe) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByLocalCoordinateTransform", - "missingGlobe")); - } - - var xAxis = new Vec3(0, 0, 0), - yAxis = new Vec3(0, 0, 0), - zAxis = new Vec3(0, 0, 0); - - WWMath.localCoordinateAxesAtPoint(origin, globe, xAxis, yAxis, zAxis); - - this.multiply( - xAxis[0], yAxis[0], zAxis[0], origin[0], - xAxis[1], yAxis[1], zAxis[1], origin[1], - xAxis[2], yAxis[2], zAxis[2], origin[2], - 0, 0, 0, 1); - - return this; -}; - -/** - * Multiplies this matrix by a texture transform for the specified texture. - * <p> - * A texture image transform maps the bottom-left corner of the texture's image data to coordinate [0,0] and maps the - * top-right of the texture's image data to coordinate [1,1]. This correctly handles textures whose image data has - * non-power-of-two dimensions, and correctly orients textures whose image data has its origin in the upper-left corner. - * - * @param {Texture} texture The texture to multiply a transform for. - * - * @throws {ArgumentError} If the texture is null or undefined. - */ -Matrix.prototype.multiplyByTextureTransform = function (texture) { - if (!texture) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByTextureTransform", - "missingTexture")); - } - - // Compute the scale necessary to map the edge of the image data to the range [0,1]. When the texture contains - // power-of-two image data the scale is 1 and has no effect. Otherwise, the scale is computed such that the portion - // of the texture containing image data maps to the range [0,1]. - var sx = texture.originalImageWidth / texture.imageWidth, - sy = texture.originalImageHeight / texture.imageHeight; - - // Multiply this by a scaling matrix that maps the texture's image data to the range [0,1] and inverts the y axis. - // We have precomputed the result here in order to avoid an unnecessary matrix multiplication. - this.multiply( - sx, 0, 0, 0, - 0, -sy, 0, sy, - 0, 0, 1, 0, - 0, 0, 0, 1); - - return this; -}; - -/** - * Returns the translation components of this matrix. - * @param {Vec3} result A pre-allocated {@link Vec3} in which to return the translation components. - * @returns {Vec3} The specified result argument set to the translation components of this matrix. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Matrix.prototype.extractTranslation = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractTranslation", "missingResult")); - } - - result[0] = this[3]; - result[1] = this[7]; - result[2] = this[11]; - - return result; -}; - -/** - * Returns the rotation angles of this matrix. - * @param {Vec3} result A pre-allocated {@link Vec3} in which to return the rotation angles. - * @returns {Vec3} The specified result argument set to the rotation angles of this matrix. The angles are in - * degrees. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Matrix.prototype.extractRotationAngles = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractRotationAngles", "missingResult")); - } - - // Taken from Extracting Euler Angles from a Rotation Matrix by Mike Day, Insomniac Games. - // http://www.insomniacgames.com/mike-day-extracting-euler-angles-from-a-rotation-matrix/ - - var x = Math.atan2(this[6], this[10]), - y = Math.atan2(-this[2], Math.sqrt(this[0] * this[0] + this[1] * this[1])), - cx = Math.cos(x), - sx = Math.sin(x), - z = Math.atan2(sx * this[8] - cx * this[4], cx * this[5] - sx * this[9]); - - result[0] = x * Angle.RADIANS_TO_DEGREES; - result[1] = y * Angle.RADIANS_TO_DEGREES; - result[2] = z * Angle.RADIANS_TO_DEGREES; - - return result; -}; - -/** - * Multiplies this matrix by a first person viewing matrix for the specified globe. - * <p> - * A first person viewing matrix places the viewer's eye at the specified eyePosition. By default the viewer is looking - * straight down at the globe's surface from the eye position, with the globe's normal vector coming out of the screen - * and north pointing toward the top of the screen. - * <p> - * Heading specifies the viewer's azimuth, or its angle relative to North. Heading values range from -180 degrees to 180 - * degrees. A heading of 0 degrees looks North, 90 degrees looks East, +-180 degrees looks South, and -90 degrees looks - * West. - * <p> - * Tilt specifies the viewer's angle relative to the surface. Tilt values range from -180 degrees to 180 degrees. A tilt - * of 0 degrees looks straight down at the globe's surface, 90 degrees looks at the horizon, and 180 degrees looks - * straight up. Tilt values greater than 180 degrees cause the viewer to turn upside down, and are therefore rarely used. - * <p> - * Roll specifies the viewer's angle relative to the horizon. Roll values range from -180 degrees to 180 degrees. A roll - * of 0 degrees orients the viewer so that up is pointing to the top of the screen, at 90 degrees up is pointing to the - * right, at +-180 degrees up is pointing to the bottom, and at -90 up is pointing to the left. - * - * @param {Position} eyePosition The viewer's geographic eye position relative to the specified globe. - * @param {Number} heading The viewer's angle relative to north, in degrees. - * @param {Number} tilt The viewer's angle relative to the surface, in degrees. - * @param {Number} roll The viewer's angle relative to the horizon, in degrees. - * @param {Globe} globe The globe the viewer is looking at. - * - * @throws {ArgumentError} If the specified position or globe is null or undefined. - */ -Matrix.prototype.multiplyByFirstPersonModelview = function (eyePosition, heading, tilt, roll, globe) { - if (!eyePosition) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByFirstPersonModelview", "missingPosition")); - } - - if (!globe) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByFirstPersonModelview", "missingGlobe")); - } - - var c, - s, - ex, ey, ez, - xx, xy, xz, - yx, yy, yz, - zx, zy, zz, - eyePoint = new Vec3(0, 0, 0), - xAxis = new Vec3(0, 0, 0), - yAxis = new Vec3(0, 0, 0), - zAxis = new Vec3(0, 0, 0); - - // Roll. Rotate the eye point in a counter-clockwise direction about the z axis. Note that we invert the sines used - // in the rotation matrix in order to produce the counter-clockwise rotation. We invert only the cosines since - // sin(-a) = -sin(a) and cos(-a) = cos(a). - c = Math.cos(roll * Angle.DEGREES_TO_RADIANS); - s = Math.sin(roll * Angle.DEGREES_TO_RADIANS); - this.multiply( - c, s, 0, 0, - -s, c, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); - - // Tilt. Rotate the eye point in a counter-clockwise direction about the x axis. Note that we invert the sines used - // in the rotation matrix in order to produce the counter-clockwise rotation. We invert only the cosines since - // sin(-a) = -sin(a) and cos(-a) = cos(a). - c = Math.cos(tilt * Angle.DEGREES_TO_RADIANS); - s = Math.sin(tilt * Angle.DEGREES_TO_RADIANS); - this.multiply(1, 0, 0, 0, - 0, c, s, 0, - 0, -s, c, 0, - 0, 0, 0, 1); - - // Heading. Rotate the eye point in a clockwise direction about the z axis again. This has a different effect than - // roll when tilt is non-zero because the viewer is no longer looking down the z axis. - c = Math.cos(heading * Angle.DEGREES_TO_RADIANS); - s = Math.sin(heading * Angle.DEGREES_TO_RADIANS); - this.multiply(c, -s, 0, 0, - s, c, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); - - // Compute the eye point in model coordinates. This point is mapped to the origin in the look at transform below. - globe.computePointFromPosition(eyePosition.latitude, eyePosition.longitude, eyePosition.altitude, eyePoint); - ex = eyePoint[0]; - ey = eyePoint[1]; - ez = eyePoint[2]; - - // Transform the origin to the local coordinate system at the eye point. - WWMath.localCoordinateAxesAtPoint(eyePoint, globe, xAxis, yAxis, zAxis); - xx = xAxis[0]; - xy = xAxis[1]; - xz = xAxis[2]; - yx = yAxis[0]; - yy = yAxis[1]; - yz = yAxis[2]; - zx = zAxis[0]; - zy = zAxis[1]; - zz = zAxis[2]; - - this.multiply(xx, xy, xz, -xx * ex - xy * ey - xz * ez, - yx, yy, yz, -yx * ex - yy * ey - yz * ez, - zx, zy, zz, -zx * ex - zy * ey - zz * ez, - 0, 0, 0, 1); - - return this; -}; - -/** - * Multiplies this matrix by a look at viewing matrix for the specified globe. - * <p> - * A look at viewing matrix places the center of the screen at the specified lookAtPosition. By default the viewer is - * looking straight down at the look at position from the specified range, with the globe's normal vector coming out of - * the screen and north pointing toward the top of the screen. - * <p> - * Range specifies the distance between the look at position and the viewer's eye point. Range values may be any positive - * real number. A range of 0 places the eye point at the look at point, while a positive range moves the eye point away - * from but still looking at the look at point. - * <p> - * Heading specifies the viewer's azimuth, or its angle relative to North. Heading values range from -180 degrees to 180 - * degrees. A heading of 0 degrees looks North, 90 degrees looks East, +-180 degrees looks South, and -90 degrees looks - * West. - * <p> - * Tilt specifies the viewer's angle relative to the surface. Tilt values range from -180 degrees to 180 degrees. A tilt - * of 0 degrees looks straight down at the globe's surface, 90 degrees looks at the horizon, and 180 degrees looks - * straight up. Tilt values greater than 180 degrees cause the viewer to turn upside down, and are therefore rarely used. - * <p> - * Roll specifies the viewer's angle relative to the horizon. Roll values range from -180 degrees to 180 degrees. A roll - * of 0 degrees orients the viewer so that up is pointing to the top of the screen, at 90 degrees up is pointing to the - * right, at +-180 degrees up is pointing to the bottom, and at -90 up is pointing to the left. - * - * @param {Position} lookAtPosition The viewer's geographic look at position relative to the specified globe. - * @param {Number} range The distance between the eye point and the look at point, in model coordinates. - * @param {Number} heading The viewer's angle relative to north, in degrees. - * @param {Number} tilt The viewer's angle relative to the surface, in degrees. - * @param {Number} roll The viewer's angle relative to the horizon, in degrees. - * @param {Globe} globe The globe the viewer is looking at. - * - * @throws {ArgumentError} If either the specified look-at position or globe is null or undefined, or the - * specified range is less than zero. - */ -Matrix.prototype.multiplyByLookAtModelview = function (lookAtPosition, range, heading, tilt, roll, globe) { - if (!lookAtPosition) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByLookAtModelview", "missingPosition")); - } - - if (range < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByLookAtModelview", - "Range is less than zero")); - } - - if (!globe) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyByLookAtModelview", "missingGlobe")); - } - - // Translate the eye point along the positive z axis while keeping the look at point in the center of the viewport. - this.multiplyByTranslation(0, 0, -range); - - // Transform the origin to the local coordinate system at the look at position, and rotate the viewer by the - // specified heading, tilt and roll. - this.multiplyByFirstPersonModelview(lookAtPosition, heading, tilt, roll, globe); - - return this; -}; - -/** - * Sets this matrix to a perspective projection matrix for the specified viewport dimensions and clip distances. - * <p> - * A perspective projection matrix maps points in eye coordinates into clip coordinates in a way that causes - * distant objects to appear smaller, and preserves the appropriate depth information for each point. In model - * coordinates, a perspective projection is defined by frustum originating at the eye position and extending - * outward in the viewer's direction. The near distance and the far distance identify the minimum and maximum - * distance, respectively, at which an object in the scene is visible. Near and far distances must be positive - * and may not be equal. - * - * @param {Number} viewportWidth The viewport width, in screen coordinates. - * @param {Number} viewportHeight The viewport height, in screen coordinates. - * @param {Number} nearDistance The near clip plane distance, in model coordinates. - * @param {Number} farDistance The far clip plane distance, in model coordinates. - * @throws {ArgumentError} If the specified width or height is less than or equal to zero, if the near and far - * distances are equal, or if either the near or far distance are less than or equal to zero. - */ -Matrix.prototype.setToPerspectiveProjection = function (viewportWidth, viewportHeight, nearDistance, farDistance) { - if (viewportWidth <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToPerspectiveProjection", - "invalidWidth")); - } - - if (viewportHeight <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToPerspectiveProjection", - "invalidHeight")); - } - - if (nearDistance === farDistance) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToPerspectiveProjection", - "Near and far distance are the same.")); - } - - if (nearDistance <= 0 || farDistance <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToPerspectiveProjection", - "Near or far distance is less than or equal to zero.")); - } - - // Compute the dimensions of the viewport rectangle at the near distance. - var nearRect = WWMath.perspectiveFrustumRectangle(viewportWidth, viewportHeight, nearDistance), - left = nearRect.getMinX(), - right = nearRect.getMaxX(), - bottom = nearRect.getMinY(), - top = nearRect.getMaxY(); - - // Taken from Mathematics for 3D Game Programming and Computer Graphics, Second Edition, equation 4.52. - - // Row 1 - this[0] = 2 * nearDistance / (right - left); - this[1] = 0; - this[2] = (right + left) / (right - left); - this[3] = 0; - // Row 2 - this[4] = 0; - this[5] = 2 * nearDistance / (top - bottom); - this[6] = (top + bottom) / (top - bottom); - this[7] = 0; - // Row 3 - this[8] = 0; - this[9] = 0; - this[10] = -(farDistance + nearDistance) / (farDistance - nearDistance); - this[11] = -2 * nearDistance * farDistance / (farDistance - nearDistance); - // Row 4 - this[12] = 0; - this[13] = 0; - this[14] = -1; - this[15] = 0; - - return this; -}; - -/** - * Sets this matrix to a screen projection matrix for the specified viewport dimensions. - * <p> - * A screen projection matrix is an orthographic projection that assumes that points in model coordinates - * represent a screen point and a depth. Screen projection matrices therefore map model coordinates directly - * into screen coordinates without modification. A point's xy coordinates are interpreted as literal screen - * coordinates and must be in the viewport to be visible. A point's z coordinate is interpreted as a depth value - * that ranges from 0 to 1. Additionally, the screen projection matrix preserves the depth value returned by - * [DrawContext.project]{@link DrawContext#project}. - * - * @param {Number} viewportWidth The viewport width, in screen coordinates. - * @param {Number} viewportHeight The viewport height, in screen coordinates. - * @throws {ArgumentError} If the specified width or height is less than or equal to zero. - */ -Matrix.prototype.setToScreenProjection = function (viewportWidth, viewportHeight) { - if (viewportWidth <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToScreenProjection", - "invalidWidth")); - } - - if (viewportHeight <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "setToScreenProjection", - "invalidHeight")); - } - - // Taken from Mathematics for 3D Game Programming and Computer Graphics, Second Edition, equation 4.57. - // Simplified to assume that the viewport origin is (0, 0). - // - // The third row of this projection matrix is configured so that points with z coordinates representing - // depth values ranging from 0 to 1 are not modified after transformation into window coordinates. This - // projection matrix maps z values in the range [0, 1] to the range [-1, 1] by applying the following - // function to incoming z coordinates: - // - // zp = z0 * 2 - 1 - // - // Where 'z0' is the point's z coordinate and 'zp' is the projected z coordinate. The GPU then maps the - // projected z coordinate into window coordinates in the range [0, 1] by applying the following function: - // - // zw = zp * 0.5 + 0.5 - // - // The result is that a point's z coordinate is effectively passed to the GPU without modification. - - // Row 1 - this[0] = 2 / viewportWidth; - this[1] = 0; - this[2] = 0; - this[3] = -1; - // Row 2 - this[4] = 0; - this[5] = 2 / viewportHeight; - this[6] = 0; - this[7] = -1; - // Row 3 - this[8] = 0; - this[9] = 0; - this[10] = 2; - this[11] = -1; - // Row 4 - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 1; - - return this; -}; - -/** - * Returns this viewing matrix's eye point. - * <p> - * This method assumes that this matrix represents a viewing matrix. If this does not represent a viewing matrix the - * results are undefined. - * <p> - * In model coordinates, a viewing matrix's eye point is the point the viewer is looking from and maps to the center of - * the screen. - * - * @param {Vec3} result A pre-allocated {@link Vec3} in which to return the extracted values. - * @return {Vec3} The specified result argument containing the viewing matrix's eye point, in model coordinates. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Matrix.prototype.extractEyePoint = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractEyePoint", "missingResult")); - } - - // The eye point of a modelview matrix is computed by transforming the origin (0, 0, 0, 1) by the matrix's inverse. - // This is equivalent to transforming the inverse of this matrix's translation components in the rightmost column by - // the transpose of its upper 3x3 components. - result[0] = -(this[0] * this[3]) - this[4] * this[7] - this[8] * this[11]; - result[1] = -(this[1] * this[3]) - this[5] * this[7] - this[9] * this[11]; - result[2] = -(this[2] * this[3]) - this[6] * this[7] - this[10] * this[11]; - - return result; -}; - -/** - * Returns this viewing matrix's forward vector. - * <p> - * This method assumes that this matrix represents a viewing matrix. If this does not represent a viewing matrix the - * results are undefined. - * - * @param {Vec3} result A pre-allocated {@link Vec3} in which to return the extracted values. - * @return {Vec3} The specified result argument containing the viewing matrix's forward vector, in model coordinates. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Matrix.prototype.extractForwardVector = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractForwardVector", "missingResult")); - } - - // The forward vector of a modelview matrix is computed by transforming the negative Z axis (0, 0, -1, 0) by the - // matrix's inverse. We have pre-computed the result inline here to simplify this computation. - result[0] = -this[8]; - result[1] = -this[9]; - result[2] = -this[10]; - - return result; -}; - -/** - * Extracts this viewing matrix's parameters given a viewing origin and a globe. - * <p> - * This method assumes that this matrix represents a viewing matrix. If this does not represent a viewing matrix the - * results are undefined. - * <p> - * This returns a parameterization of this viewing matrix based on the specified origin and globe. The origin indicates - * the model coordinate point that the view's orientation is relative to, while the globe provides the necessary model - * coordinate context for the origin and the orientation. The origin should be either the view's eye point or a point on - * the view's forward vector. The view's roll must be specified in order to disambiguate heading and roll when the view's - * tilt is zero. - * <p> - * The following list outlines the returned key-value pairs and their meanings: - * <ul> - * <li> 'origin' - The geographic position corresponding to the origin point.</li> - * <li> 'range' - The distance between the specified origin point and the view's eye point, in model coordinates.</li> - * <li> 'heading' - The view's heading angle relative to the globe's north pointing tangent at the origin point, in degrees.</li> - * <li> 'tilt' - The view's tilt angle relative to the globe's normal vector at the origin point, in degrees.</li> - * <li> 'roll' - The view's roll relative to the globe's normal vector at the origin point, in degrees.</li> - * </ul> - * @param {Vec3} origin The origin of the viewing parameters, in model coordinates. - * @param {Number} roll The view's roll, in degrees. - * @param {Globe} globe The globe the viewer is looking at. - * @param {Object} result A pre-allocated object in which to return the viewing parameters. - * - * @return {Object} The specified result argument containing a parameterization of this viewing matrix. - * - * @throws {ArgumentError} If either the specified origin or globe are null or undefined or the specified - * result argument is null or undefined. - */ -Matrix.prototype.extractViewingParameters = function (origin, roll, globe, result) { - if (!origin) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractViewingParameters", - "The specified origin is null or undefined.")); - } - - if (!globe) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractViewingParameters", "missingGlobe")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "extractViewingParameters", "missingResult")); - } - - var originPos = new Position(0, 0, 0), - modelviewLocal = Matrix.fromIdentity(), - range, - ct, - st, - tilt, - cr, sr, - ch, sh, - heading; - - globe.computePositionFromPoint(origin[0], origin[1], origin[2], originPos); - - // Transform the modelview matrix to a local coordinate system at the origin. This eliminates the geographic - // transform contained in the modelview matrix while maintaining rotation and translation relative to the origin. - modelviewLocal.copy(this); - modelviewLocal.multiplyByLocalCoordinateTransform(origin, globe); - - range = -modelviewLocal[11]; - ct = modelviewLocal[10]; - st = Math.sqrt(modelviewLocal[2] * modelviewLocal[2] + modelviewLocal[6] * modelviewLocal[6]); - tilt = Math.atan2(st, ct) * Angle.RADIANS_TO_DEGREES; - - cr = Math.cos(roll * Angle.DEGREES_TO_RADIANS); - sr = Math.sin(roll * Angle.DEGREES_TO_RADIANS); - ch = cr * modelviewLocal[0] - sr * modelviewLocal[4]; - sh = sr * modelviewLocal[5] - cr * modelviewLocal[1]; - heading = Math.atan2(sh, ch) * Angle.RADIANS_TO_DEGREES; - - result['origin'] = originPos; - result['range'] = range; - result['heading'] = heading; - result['tilt'] = tilt; - result['roll'] = roll; - - return result; -}; - -/** - * Applies a specified depth offset to this projection matrix. - * <p> - * This method assumes that this matrix represents a projection matrix. If this does not represent a projection - * matrix the results are undefined. Projection matrices can be created by calling - * [setToPerspectiveProjection]{@link Matrix#setToPerspectiveProjection} or [setToScreenProjection]{@link Matrix#setToScreenProjection}. - * <p> - * The depth offset may be any real number and is typically used to draw geometry slightly closer to the user's - * eye in order to give those shapes visual priority over nearby or geometry. An offset of zero has no effect. - * An offset less than zero brings depth values closer to the eye, while an offset greater than zero pushes - * depth values away from the eye. - * <p> - * Depth offset may be applied to both perspective and orthographic projection matrices. The effect on each - * projection type is outlined here: - * <p> - * <strong>Perspective Projection</strong> - * <p> - * The effect of depth offset on a perspective projection increases exponentially with distance from the eye. - * This has the effect of adjusting the offset for the loss in depth precision with geometry drawn further from - * the eye. Distant geometry requires a greater offset to differentiate itself from nearby geometry, while close - * geometry does not. - * <p> - * <strong>Orthographic Projection</strong> - * <p> - * The effect of depth offset on an orthographic projection increases linearly with distance from the eye. While - * it is reasonable to apply a depth offset to an orthographic projection, the effect is most appropriate when - * applied to the projection used to draw the scene. For example, when an object's coordinates are projected by - * a perspective projection into screen coordinates then drawn using an orthographic projection, it is best to - * apply the offset to the original perspective projection. The method [DrawContext.project]{@link DrawContext#project} performs the - * correct behavior for the projection type used to draw the scene. - * - * @param {Number} depthOffset The amount of offset to apply. - * @returns {Matrix} This matrix with it's depth offset set to the specified offset. - */ -Matrix.prototype.offsetProjectionDepth = function (depthOffset) { - - this[10] *= 1 + depthOffset; - - return this; -}; - -/** - * Multiplies this matrix by a specified matrix. - * - * @param {Matrix} matrix The matrix to multiply with this matrix. - * @returns {Matrix} This matrix after multiplying it by the specified matrix. - * @throws {ArgumentError} if the specified matrix is null or undefined. - */ -Matrix.prototype.multiplyMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "multiplyMatrix", "missingMatrix")); - } - - var ma = this, - mb = matrix, - ma0, ma1, ma2, ma3; - - // Row 1 - ma0 = ma[0]; - ma1 = ma[1]; - ma2 = ma[2]; - ma3 = ma[3]; - ma[0] = ma0 * mb[0] + ma1 * mb[4] + ma2 * mb[8] + ma3 * mb[12]; - ma[1] = ma0 * mb[1] + ma1 * mb[5] + ma2 * mb[9] + ma3 * mb[13]; - ma[2] = ma0 * mb[2] + ma1 * mb[6] + ma2 * mb[10] + ma3 * mb[14]; - ma[3] = ma0 * mb[3] + ma1 * mb[7] + ma2 * mb[11] + ma3 * mb[15]; - - // Row 2 - ma0 = ma[4]; - ma1 = ma[5]; - ma2 = ma[6]; - ma3 = ma[7]; - ma[4] = ma0 * mb[0] + ma1 * mb[4] + ma2 * mb[8] + ma3 * mb[12]; - ma[5] = ma0 * mb[1] + ma1 * mb[5] + ma2 * mb[9] + ma3 * mb[13]; - ma[6] = ma0 * mb[2] + ma1 * mb[6] + ma2 * mb[10] + ma3 * mb[14]; - ma[7] = ma0 * mb[3] + ma1 * mb[7] + ma2 * mb[11] + ma3 * mb[15]; - - // Row 3 - ma0 = ma[8]; - ma1 = ma[9]; - ma2 = ma[10]; - ma3 = ma[11]; - ma[8] = ma0 * mb[0] + ma1 * mb[4] + ma2 * mb[8] + ma3 * mb[12]; - ma[9] = ma0 * mb[1] + ma1 * mb[5] + ma2 * mb[9] + ma3 * mb[13]; - ma[10] = ma0 * mb[2] + ma1 * mb[6] + ma2 * mb[10] + ma3 * mb[14]; - ma[11] = ma0 * mb[3] + ma1 * mb[7] + ma2 * mb[11] + ma3 * mb[15]; - - // Row 4 - ma0 = ma[12]; - ma1 = ma[13]; - ma2 = ma[14]; - ma3 = ma[15]; - ma[12] = ma0 * mb[0] + ma1 * mb[4] + ma2 * mb[8] + ma3 * mb[12]; - ma[13] = ma0 * mb[1] + ma1 * mb[5] + ma2 * mb[9] + ma3 * mb[13]; - ma[14] = ma0 * mb[2] + ma1 * mb[6] + ma2 * mb[10] + ma3 * mb[14]; - ma[15] = ma0 * mb[3] + ma1 * mb[7] + ma2 * mb[11] + ma3 * mb[15]; - - return this; -}; - -/** - * Multiplies this matrix by a matrix specified by individual components. - * - * @param {Number} m00 matrix element at row 1, column 1. - * @param {Number} m01 matrix element at row 1, column 2. - * @param {Number} m02 matrix element at row 1, column 3. - * @param {Number} m03 matrix element at row 1, column 4. - * @param {Number} m10 matrix element at row 2, column 1. - * @param {Number} m11 matrix element at row 2, column 2. - * @param {Number} m12 matrix element at row 2, column 3. - * @param {Number} m13 matrix element at row 2, column 4. - * @param {Number} m20 matrix element at row 3, column 1. - * @param {Number} m21 matrix element at row 3, column 2. - * @param {Number} m22 matrix element at row 3, column 3. - * @param {Number} m23 matrix element at row 3, column 4. - * @param {Number} m30 matrix element at row 4, column 1. - * @param {Number} m31 matrix element at row 4, column 2. - * @param {Number} m32 matrix element at row 4, column 3. - * @param {Number} m33 matrix element at row 4, column 4. - * @returns {Matrix} This matrix with its components multiplied by the specified values. - */ -Matrix.prototype.multiply = function (m00, m01, m02, m03, - m10, m11, m12, m13, - m20, m21, m22, m23, - m30, m31, m32, m33) { - - var ma = this, - ma0, ma1, ma2, ma3; - - // Row 1 - ma0 = ma[0]; - ma1 = ma[1]; - ma2 = ma[2]; - ma3 = ma[3]; - ma[0] = ma0 * m00 + ma1 * m10 + ma2 * m20 + ma3 * m30; - ma[1] = ma0 * m01 + ma1 * m11 + ma2 * m21 + ma3 * m31; - ma[2] = ma0 * m02 + ma1 * m12 + ma2 * m22 + ma3 * m32; - ma[3] = ma0 * m03 + ma1 * m13 + ma2 * m23 + ma3 * m33; - - // Row 2 - ma0 = ma[4]; - ma1 = ma[5]; - ma2 = ma[6]; - ma3 = ma[7]; - ma[4] = ma0 * m00 + ma1 * m10 + ma2 * m20 + ma3 * m30; - ma[5] = ma0 * m01 + ma1 * m11 + ma2 * m21 + ma3 * m31; - ma[6] = ma0 * m02 + ma1 * m12 + ma2 * m22 + ma3 * m32; - ma[7] = ma0 * m03 + ma1 * m13 + ma2 * m23 + ma3 * m33; - - // Row 3 - ma0 = ma[8]; - ma1 = ma[9]; - ma2 = ma[10]; - ma3 = ma[11]; - ma[8] = ma0 * m00 + ma1 * m10 + ma2 * m20 + ma3 * m30; - ma[9] = ma0 * m01 + ma1 * m11 + ma2 * m21 + ma3 * m31; - ma[10] = ma0 * m02 + ma1 * m12 + ma2 * m22 + ma3 * m32; - ma[11] = ma0 * m03 + ma1 * m13 + ma2 * m23 + ma3 * m33; - - // Row 4 - ma0 = ma[12]; - ma1 = ma[13]; - ma2 = ma[14]; - ma3 = ma[15]; - ma[12] = ma0 * m00 + ma1 * m10 + ma2 * m20 + ma3 * m30; - ma[13] = ma0 * m01 + ma1 * m11 + ma2 * m21 + ma3 * m31; - ma[14] = ma0 * m02 + ma1 * m12 + ma2 * m22 + ma3 * m32; - ma[15] = ma0 * m03 + ma1 * m13 + ma2 * m23 + ma3 * m33; - - return this; -}; - -/** - * Inverts the specified matrix and stores the result in this matrix. - * <p> - * This throws an exception if the specified matrix is singular. - * <p> - * The result of this method is undefined if this matrix is passed in as the matrix to invert. - * - * @param {Matrix} matrix The matrix whose inverse is computed. - * @returns {Matrix} This matrix set to the inverse of the specified matrix. - * - * @throws {ArgumentError} If the specified matrix is null, undefined or cannot be inverted. - */ -Matrix.prototype.invertMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "invertMatrix", "missingMatrix")); - } - - // Copy the specified matrix into a mutable two-dimensional array. - var A = [[], [], [], []]; - A[0][0] = matrix[0]; - A[0][1] = matrix[1]; - A[0][2] = matrix[2]; - A[0][3] = matrix[3]; - A[1][0] = matrix[4]; - A[1][1] = matrix[5]; - A[1][2] = matrix[6]; - A[1][3] = matrix[7]; - A[2][0] = matrix[8]; - A[2][1] = matrix[9]; - A[2][2] = matrix[10]; - A[2][3] = matrix[11]; - A[3][0] = matrix[12]; - A[3][1] = matrix[13]; - A[3][2] = matrix[14]; - A[3][3] = matrix[15]; - - var index = [], - d = Matrix.ludcmp(A, index), - i, - j; - - // Compute the matrix's determinant. - for (i = 0; i < 4; i += 1) { - d *= A[i][i]; - } - - // The matrix is singular if its determinant is zero or very close to zero. - if (Math.abs(d) < 1.0e-8) - return null; - - var Y = [[], [], [], []], - col = []; - for (j = 0; j < 4; j += 1) { - for (i = 0; i < 4; i += 1) { - col[i] = 0.0; - } - - col[j] = 1.0; - Matrix.lubksb(A, index, col); - - for (i = 0; i < 4; i += 1) { - Y[i][j] = col[i]; - } - } - - this[0] = Y[0][0]; - this[1] = Y[0][1]; - this[2] = Y[0][2]; - this[3] = Y[0][3]; - this[4] = Y[1][0]; - this[5] = Y[1][1]; - this[6] = Y[1][2]; - this[7] = Y[1][3]; - this[8] = Y[2][0]; - this[9] = Y[2][1]; - this[10] = Y[2][2]; - this[11] = Y[2][3]; - this[12] = Y[3][0]; - this[13] = Y[3][1]; - this[14] = Y[3][2]; - this[15] = Y[3][3]; - - return this; -}; - -/* Internal. Intentionally not documented. - * Utility method to solve a linear system with an LU factorization of a matrix. - * Solves Ax=b, where A is in LU factorized form. - * Algorithm derived from "Numerical Recipes in C", Press et al., 1988. - * - * @param {Number[]} A An LU factorization of a matrix. - * @param {Number[]} index Permutation vector of that LU factorization. - * @param {Number[]} b Vector to be solved. - */ -// Method "lubksb" derived from "Numerical Recipes in C", Press et al., 1988 -Matrix.lubksb = function (A, index, b) { - var ii = -1, - i, - j, - sum; - for (i = 0; i < 4; i += 1) { - var ip = index[i]; - sum = b[ip]; - b[ip] = b[i]; - - if (ii != -1) { - for (j = ii; j <= i - 1; j += 1) { - sum -= A[i][j] * b[j]; - } - } - else if (sum != 0.0) { - ii = i; - } - - b[i] = sum; - } - - for (i = 3; i >= 0; i -= 1) { - sum = b[i]; - for (j = i + 1; j < 4; j += 1) { - sum -= A[i][j] * b[j]; - } - - b[i] = sum / A[i][i]; - } -}; - -/* Internal. Intentionally not documented. - * Utility method to perform an LU factorization of a matrix. - * "ludcmp" is derived from "Numerical Recipes in C", Press et al., 1988. - * - * @param {Number[]} A matrix to be factored - * @param {Number[]} index permutation vector - * @returns {Number} Condition number of matrix. - */ -Matrix.ludcmp = function (A, index) { - var TINY = 1.0e-20, - vv = [], /* new double[4]; */ - d = 1.0, - temp, - i, - j, - k, - big, - sum, - imax, - dum; - for (i = 0; i < 4; i += 1) { - big = 0.0; - for (j = 0; j < 4; j += 1) { - if ((temp = Math.abs(A[i][j])) > big) { - big = temp; - } - } - - if (big == 0.0) { - return 0.0; // Matrix is singular if the entire row contains zero. - } - else { - vv[i] = 1.0 / big; - } - } - - for (j = 0; j < 4; j += 1) { - for (i = 0; i < j; i += 1) { - sum = A[i][j]; - for (k = 0; k < i; k += 1) { - sum -= A[i][k] * A[k][j]; - } - - A[i][j] = sum; - } - - big = 0.0; - imax = -1; - for (i = j; i < 4; i += 1) { - sum = A[i][j]; - for (k = 0; k < j; k++) { - sum -= A[i][k] * A[k][j]; - } - - A[i][j] = sum; - - if ((dum = vv[i] * Math.abs(sum)) >= big) { - big = dum; - imax = i; - } - } - - if (j != imax) { - for (k = 0; k < 4; k += 1) { - dum = A[imax][k]; - A[imax][k] = A[j][k]; - A[j][k] = dum; - } - - d = -d; - vv[imax] = vv[j]; - } - - index[j] = imax; - if (A[j][j] == 0.0) - A[j][j] = TINY; - - if (j != 3) { - dum = 1.0 / A[j][j]; - for (i = j + 1; i < 4; i += 1) { - A[i][j] *= dum; - } - } - } - - return d; -}; - -/** - * Inverts the specified matrix and stores the result in this matrix. - * <p> - * The specified matrix is assumed to represent an orthonormal transform matrix. This matrix's upper 3x3 is - * transposed, then its fourth column is transformed by the transposed upper 3x3 and negated. - * <p> - * The result of this method is undefined if this matrix is passed in as the matrix to invert. - * - * @param {Matrix} matrix The matrix whose inverse is computed. This matrix is assumed to represent an - * orthonormal transform matrix. - * @returns {Matrix} This matrix set to the inverse of the specified matrix. - * - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -Matrix.prototype.invertOrthonormalMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "invertOrthonormalMatrix", "missingMatrix")); - } - - // 'a' is assumed to contain a 3D transformation matrix. - // Upper-3x3 is inverted, translation is transformed by inverted-upper-3x3 and negated. - - var a = matrix; - - this[0] = a[0]; - this[1] = a[4]; - this[2] = a[8]; - this[3] = 0.0 - a[0] * a[3] - a[4] * a[7] - a[8] * a[11]; - - this[4] = a[1]; - this[5] = a[5]; - this[6] = a[9]; - this[7] = 0.0 - a[1] * a[3] - a[5] * a[7] - a[9] * a[11]; - - this[8] = a[2]; - this[9] = a[6]; - this[10] = a[10]; - this[11] = 0.0 - a[2] * a[3] - a[6] * a[7] - a[10] * a[11]; - - this[12] = 0; - this[13] = 0; - this[14] = 0; - this[15] = 1; - - return this; -}; - -/** - * Computes the eigenvectors of this matrix. - * <p> - * The eigenvectors are returned sorted from the most prominent vector to the least prominent vector. - * Each eigenvector has length equal to its corresponding eigenvalue. - * - * @param {Vec3} result1 A pre-allocated vector in which to return the most prominent eigenvector. - * @param {Vec3} result2 A pre-allocated vector in which to return the second most prominent eigenvector. - * @param {Vec3} result3 A pre-allocated vector in which to return the least prominent eigenvector. - * - * @throws {ArgumentError} if any argument is null or undefined or if this matrix is not symmetric. - */ -Matrix.prototype.eigensystemFromSymmetricMatrix = function (result1, result2, result3) { - if (!result1 || !result2 || !result3) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "eigensystemFromSymmetricMatrix", "missingResult")); - } - - if (this[1] != this[4] || this[2] != this[8] || this[6] != this[9]) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "eigensystemFromSymmetricMatrix", - "Matrix is not symmetric")); - } - - // Taken from Mathematics for 3D Game Programming and Computer Graphics, Second Edition, listing 14.6. - - var epsilon = 1.0e-10, - // Since the matrix is symmetric m12=m21, m13=m31 and m23=m32, therefore we can ignore the values m21, - // m32 and m32. - m11 = this[0], - m12 = this[1], - m13 = this[2], - m22 = this[5], - m23 = this[6], - m33 = this[10], - r = [ - [1, 0, 0], - [0, 1, 0], - [0, 0, 1] - ], - maxSweeps = 32, - u, u2, u2p1, t, c, s, temp, i, i1, i2, i3; - - for (var a = 0; a < maxSweeps; a++) { - // Exit if off-diagonal entries small enough - if (WWMath.fabs(m12) < epsilon && WWMath.fabs(m13) < epsilon && WWMath.fabs(m23) < epsilon) - break; - - // Annihilate (1,2) entry. - if (m12 != 0) { - u = (m22 - m11) * 0.5 / m12; - u2 = u * u; - u2p1 = u2 + 1; - t = u2p1 != u2 ? (u < 0 ? -1 : 1) * (Math.sqrt(u2p1) - WWMath.fabs(u)) : 0.5 / u; - c = 1 / Math.sqrt(t * t + 1); - s = c * t; - - m11 -= t * m12; - m22 += t * m12; - m12 = 0; - - temp = c * m13 - s * m23; - m23 = s * m13 + c * m23; - m13 = temp; - - for (i = 0; i < 3; i++) { - temp = c * r[i][0] - s * r[i][1]; - r[i][1] = s * r[i][0] + c * r[i][1]; - r[i][0] = temp; - } - } - - // Annihilate (1,3) entry. - if (m13 != 0) { - u = (m33 - m11) * 0.5 / m13; - u2 = u * u; - u2p1 = u2 + 1; - t = u2p1 != u2 ? (u < 0 ? -1 : 1) * (Math.sqrt(u2p1) - WWMath.fabs(u)) : 0.5 / u; - c = 1 / Math.sqrt(t * t + 1); - s = c * t; - - m11 -= t * m13; - m33 += t * m13; - m13 = 0; - - temp = c * m12 - s * m23; - m23 = s * m12 + c * m23; - m12 = temp; - - for (i = 0; i < 3; i++) { - temp = c * r[i][0] - s * r[i][2]; - r[i][2] = s * r[i][0] + c * r[i][2]; - r[i][0] = temp; - } - } - - // Annihilate (2,3) entry. - if (m23 != 0) { - u = (m33 - m22) * 0.5 / m23; - u2 = u * u; - u2p1 = u2 + 1; - t = u2p1 != u2 ? (u < 0 ? -1 : 1) * (Math.sqrt(u2p1) - WWMath.fabs(u)) : 0.5 / u; - c = 1 / Math.sqrt(t * t + 1); - s = c * t; - - m22 -= t * m23; - m33 += t * m23; - m23 = 0; - - temp = c * m12 - s * m13; - m13 = s * m12 + c * m13; - m12 = temp; - - for (i = 0; i < 3; i++) { - temp = c * r[i][1] - s * r[i][2]; - r[i][2] = s * r[i][1] + c * r[i][2]; - r[i][1] = temp; - } - } - } - - i1 = 0; - i2 = 1; - i3 = 2; - - if (m11 < m22) { - temp = m11; - m11 = m22; - m22 = temp; - - temp = i1; - i1 = i2; - i2 = temp; - } - - if (m22 < m33) { - temp = m22; - m22 = m33; - m33 = temp; - - temp = i2; - i2 = i3; - i3 = temp; - } - - if (m11 < m22) { - temp = m11; - m11 = m22; - m22 = temp; - - temp = i1; - i1 = i2; - i2 = temp; - } - - result1[0] = r[0][i1]; - result1[1] = r[1][i1]; - result1[2] = r[2][i1]; - - result2[0] = r[0][i2]; - result2[1] = r[1][i2]; - result2[2] = r[2][i2]; - - result3[0] = r[0][i3]; - result3[1] = r[1][i3]; - result3[2] = r[2][i3]; - - result1.normalize(); - result2.normalize(); - result3.normalize(); - - result1.multiply(m11); - result2.multiply(m22); - result3.multiply(m33); -}; - -/** - * Extracts and returns a new matrix whose upper 3x3 entries are identical to those of this matrix, - * and whose fourth row and column are 0 except for a 1 in the diagonal position. - * @returns {Matrix} The upper 3x3 matrix of this matrix. - */ -Matrix.prototype.upper3By3 = function () { - var result = Matrix.fromIdentity(); - - result[0] = this[0]; - result[1] = this[1]; - result[2] = this[2]; - - result[4] = this[4]; - result[5] = this[5]; - result[6] = this[6]; - - result[8] = this[8]; - result[9] = this[9]; - result[10] = this[10]; - - return result; -}; - - -/** - * Transforms the specified screen point from WebGL screen coordinates to model coordinates. This method assumes - * this matrix represents an inverse modelview-projection matrix. The result of this method is - * undefined if this matrix is not an inverse modelview-projection matrix. - * <p> - * The screen point is understood to be in WebGL screen coordinates, with the origin in the bottom-left corner - * and axes that extend up and to the right from the origin. - * <p> - * This function stores the transformed point in the result argument, and returns true or false to indicate whether the - * transformation is successful. It returns false if the modelview or projection matrices - * are malformed, or if the screenPoint is clipped by the near clipping plane or the far clipping plane. - * - * @param {Vec3} screenPoint The screen coordinate point to un-project. - * @param {Rectangle} viewport The viewport defining the screen point's coordinate system - * @param {Vec3} result A pre-allocated vector in which to return the unprojected point. - * @returns {boolean} true if the transformation is successful, otherwise false. - * @throws {ArgumentError} If either the specified point or result argument is null or undefined. - */ -Matrix.prototype.unProject = function (screenPoint, viewport, result) { - if (!screenPoint) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "unProject", - "missingPoint")); - } - - if (!viewport) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "unProject", - "missingViewport")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix", "unProject", - "missingResult")); - } - - var sx = screenPoint[0], - sy = screenPoint[1], - sz = screenPoint[2]; - - // Convert the XY screen coordinates to coordinates in the range [0, 1]. This enables the XY coordinates to - // be converted to clip coordinates. - sx = (sx - viewport.x) / viewport.width; - sy = (sy - viewport.y) / viewport.height; - - // Convert from coordinates in the range [0, 1] to clip coordinates in the range [-1, 1]. - sx = sx * 2 - 1; - sy = sy * 2 - 1; - sz = sz * 2 - 1; - - // Clip the point against the near and far clip planes. In clip coordinates the near and far clip planes are - // perpendicular to the Z axis and are located at -1 and 1, respectively. - if (sz < -1 || sz > 1) { - return false; - } - - // Transform the screen point from clip coordinates to model coordinates. This inverts the Z axis and stores - // the negative of the eye coordinate Z value in the W coordinate. - var - x = this[0] * sx + this[1] * sy + this[2] * sz + this[3], - y = this[4] * sx + this[5] * sy + this[6] * sz + this[7], - z = this[8] * sx + this[9] * sy + this[10] * sz + this[11], - w = this[12] * sx + this[13] * sy + this[14] * sz + this[15]; - - if (w === 0) { - return false; - } - - // Complete the conversion from model coordinates to clip coordinates by dividing by W. - result[0] = x / w; - result[1] = y / w; - result[2] = z / w; - - return true; -}; - -export default Matrix; - - diff --git a/web/src/gis/geom/Matrix3.js b/web/src/gis/geom/Matrix3.js deleted file mode 100644 index 8d23bf96..00000000 --- a/web/src/gis/geom/Matrix3.js +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Matrix3 - */ - -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs a 3 x 3 matrix. - * @alias Matrix3 - * @constructor - * @classdesc Represents a 3 x 3 double precision matrix stored in a Float64Array in row-major order. - * @param {Number} m11 matrix element at row 1, column 1. - * @param {Number} m12 matrix element at row 1, column 2. - * @param {Number} m13 matrix element at row 1, column 3. - * @param {Number} m21 matrix element at row 2, column 1. - * @param {Number} m22 matrix element at row 2, column 2. - * @param {Number} m23 matrix element at row 2, column 3. - * @param {Number} m31 matrix element at row 3, column 1. - * @param {Number} m32 matrix element at row 3, column 2. - * @param {Number} m33 matrix element at row 3, column 3. - */ -function Matrix3(m11, m12, m13, - m21, m22, m23, - m31, m32, m33) { - this[0] = m11; - this[1] = m12; - this[2] = m13; - this[3] = m21; - this[4] = m22; - this[5] = m23; - this[6] = m31; - this[7] = m32; - this[8] = m33; -} - -// Derives from Float64Array. -Matrix3.prototype = new Float64Array(9); - -/** - * Creates an identity matrix. - * @returns {Matrix3} A new identity matrix. - */ -Matrix3.fromIdentity = function () { - return new Matrix3( - 1, 0, 0, - 0, 1, 0, - 0, 0, 1 - ); -}; - -/** - * Sets this matrix to one that flips and shifts the y-axis. - * <p> - * The resultant matrix maps Y=0 to Y=1 and Y=1 to Y=0. All existing values are overwritten. This matrix is - * usually used to change the coordinate origin from an upper left coordinate origin to a lower left coordinate - * origin. This is typically necessary to align the coordinate system of images (top-left origin) with that of - * OpenGL (bottom-left origin). - * @returns {Matrix3} This matrix set to values described above. - */ -Matrix3.prototype.setToUnitYFlip = function () { - this[0] = 1; - this[1] = 0; - this[2] = 0; - this[3] = 0; - this[4] = -1; - this[5] = 1; - this[6] = 0; - this[7] = 0; - this[8] = 1; - return this; -}; - -/** - * Multiplies this matrix by a specified matrix. - * - * @param {Matrix3} matrix The matrix to multiply with this matrix. - * @returns {Matrix3} This matrix after multiplying it by the specified matrix. - * @throws {ArgumentError} if the specified matrix is null or undefined. - */ -Matrix3.prototype.multiplyMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix3", "multiplyMatrix", "missingMatrix")); - } - - var ma = this, - mb = matrix, - ma0, ma1, ma2; - - // Row 1 - ma0 = ma[0]; - ma1 = ma[1]; - ma2 = ma[2]; - ma[0] = ma0 * mb[0] + ma1 * mb[3] + ma2 * mb[6]; - ma[1] = ma0 * mb[1] + ma1 * mb[4] + ma2 * mb[7]; - ma[2] = ma0 * mb[2] + ma1 * mb[5] + ma2 * mb[8]; - - // Row 2 - ma0 = ma[3]; - ma1 = ma[4]; - ma2 = ma[5]; - ma[3] = ma0 * mb[0] + ma1 * mb[3] + ma2 * mb[6]; - ma[4] = ma0 * mb[1] + ma1 * mb[4] + ma2 * mb[7]; - ma[5] = ma0 * mb[2] + ma1 * mb[5] + ma2 * mb[8]; - - // Row 3 - ma0 = ma[6]; - ma1 = ma[7]; - ma2 = ma[8]; - ma[6] = ma0 * mb[0] + ma1 * mb[3] + ma2 * mb[6]; - ma[7] = ma0 * mb[1] + ma1 * mb[4] + ma2 * mb[7]; - ma[8] = ma0 * mb[2] + ma1 * mb[5] + ma2 * mb[8]; - - return this; - -}; - -/** - * Multiplies this matrix by a matrix that transforms normalized coordinates from a source sector to a destination - * sector. Normalized coordinates within a sector range from 0 to 1, with (0, 0) indicating the lower left corner - * and (1, 1) indicating the upper right. The resultant matrix maps a normalized source coordinate (X, Y) to its - * corresponding normalized destination coordinate (X', Y'). - * <p/> - * This matrix typically necessary to transform texture coordinates from one geographic region to another. For - * example, the texture coordinates for a terrain tile spanning one region must be transformed to coordinates - * appropriate for an image tile spanning a potentially different region. - * - * @param {Sector} src the source sector - * @param {Sector} dst the destination sector - * - * @returns {Matrix3} this matrix multiplied by the transform matrix implied by values described above - */ -Matrix3.prototype.multiplyByTileTransform = function (src, dst) { - - var srcDeltaLat = src.deltaLatitude(); - var srcDeltaLon = src.deltaLongitude(); - var dstDeltaLat = dst.deltaLatitude(); - var dstDeltaLon = dst.deltaLongitude(); - - var xs = srcDeltaLon / dstDeltaLon; - var ys = srcDeltaLat / dstDeltaLat; - var xt = (src.minLongitude - dst.minLongitude) / dstDeltaLon; - var yt = (src.minLatitude - dst.minLatitude) / dstDeltaLat; - - // This is equivalent to the following operation, but is potentially much faster: - /*var m = new Matrix3( - xs, 0, xt, - 0, ys, yt, - 0, 0, 1); - this.multiplyMatrix(m);*/ - - // This inline version eliminates unnecessary multiplication by 1 and 0 in the matrix's components, reducing - // the total number of primitive operations from 63 to 18. - - var m = this; - - // Must be done before modifying m0, m1, etc. below. - m[2] += m[0] * xt + m[1] * yt; - m[5] += m[3] * xt + m[4] * yt; - m[8] += m[6] * xt + m[6] * yt; - - m[0] *= xs; - m[1] *= ys; - - m[3] *= xs; - m[4] *= ys; - - m[6] *= xs; - m[7] *= ys; - - return this; -}; - -/** - * Stores this matrix's components in column-major order in a specified array. - * <p> - * The array must have space for at least 9 elements. This matrix's components are stored in the array - * starting with row 0 column 0 in index 0, row 1 column 0 in index 1, row 2 column 0 in index 2, and so on. - * - * @param {Float32Array | Float64Array | Number[]} result An array of at least 9 elements. Upon return, - * contains this matrix's components in column-major. - * @returns {Float32Array} The specified result array. - * @throws {ArgumentError} If the specified result array in null or undefined. - */ -Matrix3.prototype.columnMajorComponents = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Matrix3", "columnMajorComponents", "missingResult")); - } - - // Column 1 - result[0] = this[0]; - result[1] = this[3]; - result[2] = this[6]; - - // Column 2 - result[3] = this[1]; - result[4] = this[4]; - result[5] = this[7]; - - // Column 3 - result[6] = this[2]; - result[7] = this[5]; - result[8] = this[8]; - - return result; -}; - -export default Matrix3; - diff --git a/web/src/gis/geom/Plane.js b/web/src/gis/geom/Plane.js deleted file mode 100644 index 8358db46..00000000 --- a/web/src/gis/geom/Plane.js +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Plane - */ -import ArgumentError from '../error/ArgumentError'; -import Line from '../geom/Line'; -import Logger from '../util/Logger'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a plane. - * This constructor does not normalize the components. It assumes that a unit normal vector is provided. - * @alias Plane - * @constructor - * @classdesc Represents a plane in Cartesian coordinates. - * The plane's X, Y and Z components indicate the plane's normal vector. The distance component - * indicates the plane's distance from the origin relative to its unit normal. - * The components are expected to be normalized. - * @param {Number} x The X coordinate of the plane's unit normal vector. - * @param {Number} y The Y coordinate of the plane's unit normal vector. - * @param {Number} z The Z coordinate of the plane's unit normal vector. - * @param {Number} distance The plane's distance from the origin. - */ -function Plane(x, y, z, distance) { - /** - * The normal vector to the plane. - * @type {Vec3} - */ - this.normal = new Vec3(x, y, z); - - /** - * The plane's distance from the origin. - * @type {Number} - */ - this.distance = distance; -} - -/** - * Computes a plane that passes through the specified three points. - * The plane's normal is the cross product of the - * two vectors from pb to pa and pc to pa, respectively. The - * returned plane is undefined if any of the specified points are colinear. - * - * @param {Vec3} pa The first point. - * @param {Vec3} pb The second point. - * @param {Vec3} pc The third point. - * - * @return {Plane} A plane passing through the specified points. - * - * @throws {ArgumentError} if pa, pb, or pc is null or undefined. - */ -Plane.fromPoints = function (pa, pb, pc) { - if (!pa || !pb || !pc) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Plane", "fromPoints", "missingVector")); - } - - var vab = new Vec3(pb[0], pb[1], pb[2]); - vab.subtract(pa); - var vac = new Vec3(pc[0], pc[1], pc[2]); - vac.subtract(pa); - vab.cross(vac); - vab.normalize(); - var d = -vab.dot(pa); - - return new Plane(vab[0], vab[1], vab[2], d); -}; - -/** - * Computes the dot product of this plane's normal vector with a specified vector. - * Since the plane was defined with a unit normal vector, this function returns the distance of the vector from - * the plane. - * @param {Vec3} vector The vector to dot with this plane's normal vector. - * @returns {Number} The computed dot product. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Plane.prototype.dot = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Plane", "dot", "missingVector")); - } - - return this.normal.dot(vector) + this.distance; -}; - -/** - * Computes the distance between this plane and a point. - * @param {Vec3} point The point whose distance to compute. - * @returns {Number} The computed distance. - * @throws {ArgumentError} If the specified point is null or undefined. - */ -Plane.prototype.distanceToPoint = function (point) { - return this.dot(point); -}; - -/** - * Transforms this plane by a specified matrix. - * @param {Matrix} matrix The matrix to apply to this plane. - * @returns {Plane} This plane transformed by the specified matrix. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -Plane.prototype.transformByMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Plane", "transformByMatrix", "missingMatrix")); - } - - var x = matrix[0] * this.normal[0] + matrix[1] * this.normal[1] + matrix[2] * this.normal[2] + matrix[3] * this.distance, - y = matrix[4] * this.normal[0] + matrix[5] * this.normal[1] + matrix[6] * this.normal[2] + matrix[7] * this.distance, - z = matrix[8] * this.normal[0] + matrix[9] * this.normal[1] + matrix[10] * this.normal[2] + matrix[11] * this.distance, - distance = matrix[12] * this.normal[0] + matrix[13] * this.normal[1] + matrix[14] * this.normal[2] + matrix[15] * this.distance; - - this.normal[0] = x; - this.normal[1] = y; - this.normal[2] = z; - this.distance = distance; - - return this; -}; - -/** - * Normalizes the components of this plane. - * @returns {Plane} This plane with its components normalized. - */ -Plane.prototype.normalize = function () { - var magnitude = this.normal.magnitude(); - - if (magnitude === 0) - return this; - - this.normal.divide(magnitude); - this.distance /= magnitude; - - return this; -}; - -/** - * Determines whether a specified line segment intersects this plane. - * - * @param {Vec3} endPoint1 The first end point of the line segment. - * @param {Vec3} endPoint2 The second end point of the line segment. - * @returns {Boolean} true if the line segment intersects this plane, otherwise false. - */ -Plane.prototype.intersectsSegment = function (endPoint1, endPoint2) { - var distance1 = this.dot(endPoint1), - distance2 = this.dot(endPoint2); - - return distance1 * distance2 <= 0; -}; - -/** - * Computes the intersection point of this plane with a specified line segment. - * - * @param {Vec3} endPoint1 The first end point of the line segment. - * @param {Vec3} endPoint2 The second end point of the line segment. - * @param {Vec3} result A variable in which to return the intersection point of the line segment with this plane. - * @returns {Boolean} true If the line segment intersects this plane, otherwise false. - */ -Plane.prototype.intersectsSegmentAt = function (endPoint1, endPoint2, result) { - // Compute the distance from the end-points. - var distance1 = this.dot(endPoint1), - distance2 = this.dot(endPoint2); - - // If both points points lie on the plane, ... - if (distance1 === 0 && distance2 === 0) { - // Choose an arbitrary endpoint as the intersection. - result[0] = endPoint1[0]; - result[1] = endPoint1[1]; - result[2] = endPoint1[2]; - - return true; - } - else if (distance1 === distance2) { - // The intersection is undefined. - return false; - } - - var weight1 = -distance1 / (distance2 - distance1), - weight2 = 1 - weight1; - - result[0] = weight1 * endPoint1[0] + weight2 * endPoint2[0]; - result[1] = weight1 * endPoint1[1] + weight2 * endPoint2[1]; - result[2] = weight1 * endPoint1[2] + weight2 * endPoint2[2]; - - return distance1 * distance2 <= 0; -}; - -/** - * Determines whether two points are on the same side of this plane. - * - * @param {Vec3} pointA the first point. - * @param {Vec3} pointB the second point. - * - * @return {Number} -1 If both points are on the negative side of this plane, +1 if both points are on the - * positive side of this plane, 0 if the points are on opposite sides of this plane. - * - * @throws {ArgumentError} If either point is null or undefined. - */ -Plane.prototype.onSameSide = function (pointA, pointB) { - if (!pointA || !pointB) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Plane", "onSameSide", "missingPoint")); - } - - var da = this.distanceToPoint(pointA), - db = this.distanceToPoint(pointB); - - if (da < 0 && db < 0) - return -1; - - if (da > 0 && db > 0) - return 1; - - return 0; -}; - -/** - * Clips a line segment to this plane. - * @param {Vec3} pointA The first line segment endpoint. - * @param {Vec3} pointB The second line segment endpoint. - * - * @returns {Vec3[]} An array of two points both on the positive side of the plane. If the direction of the line formed by the - * two points is positive with respect to this plane's normal vector, the first point in the array will be - * the intersection point on the plane, and the second point will be the original segment end point. If the - * direction of the line is negative with respect to this plane's normal vector, the first point in the - * array will be the original segment's begin point, and the second point will be the intersection point on - * the plane. If the segment does not intersect the plane, null is returned. If the segment is coincident - * with the plane, the input points are returned, in their input order. - * - * @throws {ArgumentError} If either point is null or undefined. - */ -Plane.prototype.clip = function (pointA, pointB) { - if (!pointA || !pointB) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Plane", "clip", "missingPoint")); - } - - if (pointA.equals(pointB)) { - return null; - } - - // Get the projection of the segment onto the plane. - var line = Line.fromSegment(pointA, pointB), - lDotV = this.normal.dot(line.direction), - lDotS, t, p; - - // Are the line and plane parallel? - if (lDotV === 0) { // line and plane are parallel and may be coincident. - lDotS = this.dot(line.origin); - if (lDotS === 0) { - return [pointA, pointB]; // line is coincident with the plane - } else { - return null; // line is not coincident with the plane. - } - } - - // Not parallel so the line intersects. But does the segment intersect? - t = -this.dot(line.origin) / lDotV; // lDotS / lDotV - if (t < 0 || t > 1) { // segment does not intersect - return null; - } - - p = line.pointAt(t, new Vec3(0, 0, 0)); - if (lDotV > 0) { - return [p, pointB]; - } else { - return [pointA, p]; - } -}; - -export default Plane; diff --git a/web/src/gis/geom/Position.js b/web/src/gis/geom/Position.js deleted file mode 100644 index c59f1770..00000000 --- a/web/src/gis/geom/Position.js +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Position - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a position from a specified latitude and longitude in degrees and altitude in meters. - * @alias Position - * @constructor - * @classdesc Represents a latitude, longitude, altitude triple, with latitude and longitude in degrees and - * altitude in meters. - * @param {Number} latitude The latitude in degrees. - * @param {Number} longitude The longitude in degrees. - * @param {Number} altitude The altitude in meters. - */ -function Position(latitude, longitude, altitude) { - /** - * The latitude in degrees. - * @type {Number} - */ - this.latitude = latitude; - /** - * The longitude in degrees. - * @type {Number} - */ - this.longitude = longitude; - /** - * The altitude in meters. - * @type {Number} - */ - this.altitude = altitude; -} - -/** - * A Position with latitude, longitude and altitude all 0. - * @constant - * @type {Position} - */ -Position.ZERO = new Position(0, 0, 0); - -/** - * Creates a position from angles specified in radians. - * @param {Number} latitudeRadians The latitude in radians. - * @param {Number} longitudeRadians The longitude in radians. - * @param {Number} altitude The altitude in meters. - * @returns {Position} The new position with latitude and longitude in degrees. - */ -Position.fromRadians = function (latitudeRadians, longitudeRadians, altitude) { - return new Position( - latitudeRadians * Angle.RADIANS_TO_DEGREES, - longitudeRadians * Angle.RADIANS_TO_DEGREES, - altitude); -}; - -/** - * Sets this position to the latitude, longitude and altitude of a specified position. - * @param {Position} position The position to copy. - * @returns {Position} This position, set to the values of the specified position. - * @throws {ArgumentError} If the specified position is null or undefined. - */ -Position.prototype.copy = function (position) { - if (!position) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "copy", "missingPosition")); - } - - this.latitude = position.latitude; - this.longitude = position.longitude; - this.altitude = position.altitude; - - return this; -}; - -/** - * Indicates whether this position has the same latitude, longitude and altitude as a specified position. - * @param {Position} position The position to compare with this one. - * @returns {Boolean} true if this position is equal to the specified one, otherwise false. - */ -Position.prototype.equals = function (position) { - return position - && position.latitude === this.latitude - && position.longitude === this.longitude - && position.altitude === this.altitude; -}; - -/** - * Computes a position along a great circle path at a specified distance between two specified positions. - * @param {Number} amount The fraction of the path between the two positions at which to compute the new - * position. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * @param {Position} position1 The starting position. - * @param {Position} position2 The ending position. - * @param {Position} result A Position in which to return the result. - * @returns {Position} The specified result position. - * @throws {ArgumentError} If either specified position or the result argument is null or undefined. - */ -Position.interpolateGreatCircle = function (amount, position1, position2, result) { - if (!position1 || !position2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "interpolateGreatCircle", "missingPosition")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "interpolateGreatCircle", "missingResult")); - } - - var t = WWMath.clamp(amount, 0, 1); - result.altitude = WWMath.interpolate(t, position1.altitude, position2.altitude); - - //noinspection JSCheckFunctionSignatures - Location.interpolateGreatCircle(t, position1, position2, result); - - return result; -}; - -/** - * Computes a position along a rhumb path at a specified distance between two specified positions. - * @param {Number} amount The fraction of the path between the two positions at which to compute the new - * position. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * @param {Position} position1 The starting position. - * @param {Position} position2 The ending position. - * @param {Position} result A Position in which to return the result. - * @returns {Position} The specified result position. - * @throws {ArgumentError} If either specified position or the result argument is null or undefined. - */ -Position.interpolateRhumb = function (amount, position1, position2, result) { - if (!position1 || !position2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "interpolateRhumb", "missingPosition")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "interpolateRhumb", "missingResult")); - } - - var t = WWMath.clamp(amount, 0, 1); - result.altitude = WWMath.interpolate(t, position1.altitude, position2.altitude); - - //noinspection JSCheckFunctionSignatures - Location.interpolateRhumb(t, position1, position2, result); - - return result; -}; - -/** - * Computes a position along a linear path at a specified distance between two specified positions. - * @param {Number} amount The fraction of the path between the two positions at which to compute the new - * position. This number should be between 0 and 1. If not, it is clamped to the nearest of those values. - * @param {Position} position1 The starting position. - * @param {Position} position2 The ending position. - * @param {Position} result A Position in which to return the result. - * @returns {Position} The specified result position. - * @throws {ArgumentError} If either specified position or the result argument is null or undefined. - */ -Position.interpolateLinear = function (amount, position1, position2, result) { - if (!position1 || !position2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "interpolateLinear", "missingPosition")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Position", "interpolateLinear", "missingResult")); - } - - var t = WWMath.clamp(amount, 0, 1); - result.altitude = WWMath.interpolate(t, position1.altitude, position2.altitude); - - //noinspection JSCheckFunctionSignatures - Location.interpolateLinear(t, position1, position2, result); - - return result; -}; - -/** - * Returns a string representation of this position. - * @returns {String} - */ -Position.prototype.toString = function () { - return "(" + this.latitude.toString() + "\u00b0, " + this.longitude.toString() + "\u00b0, " - + this.altitude.toString() + ")"; -}; - -export default Position; - diff --git a/web/src/gis/geom/Rectangle.js b/web/src/gis/geom/Rectangle.js deleted file mode 100644 index 47108e49..00000000 --- a/web/src/gis/geom/Rectangle.js +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Rectangle - */ - -/** - * Constructs a rectangle with a specified origin and size. - * @alias Rectangle - * @constructor - * @classdesc Represents a rectangle in 2D Cartesian coordinates. - * @param {Number} x The X coordinate of the rectangle's origin. - * @param {Number} y The Y coordinate of the rectangle's origin. - * @param {Number} width The rectangle's width. - * @param {Number} height The rectangle's height. - */ -function Rectangle(x, y, width, height) { - - /** - * The X coordinate of this rectangle's origin. - * @type {Number} - */ - this.x = x; - - /** - * The Y coordinate of this rectangle's origin. - * @type {Number} - */ - this.y = y; - - /** - * This rectangle's width. - * @type {Number} - */ - this.width = width; - - /** - * This rectangle's height. - * @type {Number} - */ - this.height = height; -} - -/** - * Sets all this rectangle's properties. - * @param {Number} x The X coordinate of the rectangle's origin. - * @param {Number} y The Y coordinate of the rectangle's origin. - * @param {Number} width The rectangle's width. - * @param {Number} height The rectangle's height. - */ -Rectangle.prototype.set = function (x, y, width, height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; -}; - -/** - * Returns the minimum X value of this rectangle. - * @returns {Number} The rectangle's minimum X value. - */ -Rectangle.prototype.getMinX = function () { - return this.x; -}; - -/** - * Returns the minimum Y value of this rectangle. - * @returns {Number} The rectangle's minimum Y value. - */ -Rectangle.prototype.getMinY = function () { - return this.y; -}; - -/** - * Returns the maximum X value of this rectangle. - * @returns {Number} The rectangle's maximum X value. - */ -Rectangle.prototype.getMaxX = function () { - return this.x + this.width; -}; - -/** - * Returns the maximum Y value of this rectangle. - * @returns {Number} The rectangle's maximum Y value. - */ -Rectangle.prototype.getMaxY = function () { - return this.y + this.height; -}; - -/** - * Indicates whether this rectangle contains a specified point. - * @param {Vec2} point The point to test. - * @returns {Boolean} true if this rectangle contains the specified point, otherwise false. - */ -Rectangle.prototype.containsPoint = function (point) { - return point[0] >= this.x && point[0] <= this.x + this.width - && point[1] >= this.y && point[1] <= this.y + this.height; -}; -/** - * - * Indicates whether this rectangle intersects a specified one. - * @param {Rectangle} that The rectangle to test. - * @returns {Boolean} true if this triangle and the specified one intersect, otherwise false. - */ -Rectangle.prototype.intersects = function (that) { - if (that.x + that.width < this.x) - return false; - - if (that.x > this.x + this.width) - return false; - - if (that.y + that.height < this.y) - return false; - - //noinspection RedundantIfStatementJS - if (that.y > this.y + this.height) - return false; - - return true; -}; - -/** - * Indicates whether this rectangle intersects any rectangle in a specified array of rectangles. - * @param {Rectangle[]} rectangles The rectangles to test intersection with. - * @returns {Boolean} true if this rectangle intersects any rectangle in the array, otherwise false. - */ -Rectangle.prototype.intersectsRectangles = function (rectangles) { - if (rectangles) { - for (var i = 0; i < rectangles.length; i++) { - if (this.intersects(rectangles[i])) { - return true; - } - } - } - - return false; -}; - -/** - * Returns a string representation of this object. - * @returns {String} A string representation of this object. - */ -Rectangle.prototype.toString = function () { - return this.x + ", " + this.y + ", " + this.width + ", " + this.height; -}; - -export default Rectangle; diff --git a/web/src/gis/geom/Sector.js b/web/src/gis/geom/Sector.js deleted file mode 100644 index 85aa40f8..00000000 --- a/web/src/gis/geom/Sector.js +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Sector - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a Sector from specified minimum and maximum latitudes and longitudes in degrees. - * @alias Sector - * @constructor - * @classdesc Represents a rectangular region in geographic coordinates in degrees. - * @param {Number} minLatitude The sector's minimum latitude in degrees. - * @param {Number} maxLatitude The sector's maximum latitude in degrees. - * @param {Number} minLongitude The sector's minimum longitude in degrees. - * @param {Number} maxLongitude The sector's maximum longitude in degrees. - */ -function Sector(minLatitude, maxLatitude, minLongitude, maxLongitude) { - /** - * This sector's minimum latitude in degrees. - * @type {Number} - */ - this.minLatitude = minLatitude; - /** - * This sector's maximum latitude in degrees. - * @type {Number} - */ - this.maxLatitude = maxLatitude; - /** - * This sector's minimum longitude in degrees. - * @type {Number} - */ - this.minLongitude = minLongitude; - /** - * This sector's maximum longitude in degrees. - * @type {Number} - */ - this.maxLongitude = maxLongitude; -} - -/** - * A sector with minimum and maximum latitudes and minimum and maximum longitudes all zero. - * @constant - * @type {Sector} - */ -Sector.ZERO = new Sector(0, 0, 0, 0); - -/** - * A sector that encompasses the full range of latitude ([-90, 90]) and longitude ([-180, 180]). - * @constant - * @type {Sector} - */ -Sector.FULL_SPHERE = new Sector(-WWMath.MAX_LAT, WWMath.MAX_LAT, -180, 180); - -/** - * Sets this sector's latitudes and longitudes to those of a specified sector. - * @param {Sector} sector The sector to copy. - * @returns {Sector} This sector, set to the values of the specified sector. - * @throws {ArgumentError} If the specified sector is null or undefined. - */ -Sector.prototype.copy = function (sector) { - if (!sector) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "copy", "missingSector")); - } - - this.minLatitude = sector.minLatitude; - this.maxLatitude = sector.maxLatitude; - this.minLongitude = sector.minLongitude; - this.maxLongitude = sector.maxLongitude; - - return this; -}; - -/** - * Indicates whether this sector has width or height. - * @returns {Boolean} true if this sector's minimum and maximum latitudes or minimum and maximum - * longitudes do not differ, otherwise false. - */ -Sector.prototype.isEmpty = function () { - return this.minLatitude === this.maxLatitude && this.minLongitude === this.maxLongitude; -}; - -/** - * Returns the angle between this sector's minimum and maximum latitudes, in degrees. - * @returns {Number} The difference between this sector's minimum and maximum latitudes, in degrees. - */ -Sector.prototype.deltaLatitude = function () { - return this.maxLatitude - this.minLatitude; -}; - -/** - * Returns the angle between this sector's minimum and maximum longitudes, in degrees. - * @returns {Number} The difference between this sector's minimum and maximum longitudes, in degrees. - */ -Sector.prototype.deltaLongitude = function () { - return this.maxLongitude - this.minLongitude; -}; - -/** - * Returns the angle midway between this sector's minimum and maximum latitudes. - * @returns {Number} The mid-angle of this sector's minimum and maximum latitudes, in degrees. - */ -Sector.prototype.centroidLatitude = function () { - return 0.5 * (this.minLatitude + this.maxLatitude); -}; - -/** - * Returns the angle midway between this sector's minimum and maximum longitudes. - * @returns {Number} The mid-angle of this sector's minimum and maximum longitudes, in degrees. - */ -Sector.prototype.centroidLongitude = function () { - return 0.5 * (this.minLongitude + this.maxLongitude); -}; - -/** - * Computes the location of the angular center of this sector, which is the mid-angle of each of this sector's - * latitude and longitude dimensions. - * @param {Location} result A pre-allocated {@link Location} in which to return the computed centroid. - * @returns {Location} The specified result argument containing the computed centroid. - * @throws {ArgumentError} If the result argument is null or undefined. - */ -Sector.prototype.centroid = function (result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "centroid", "missingResult")); - } - - result.latitude = this.centroidLatitude(); - result.longitude = this.centroidLongitude(); - - return result; -}; - -/** - * Returns this sector's minimum latitude in radians. - * @returns {Number} This sector's minimum latitude in radians. - */ -Sector.prototype.minLatitudeRadians = function () { - return this.minLatitude * Angle.DEGREES_TO_RADIANS; -}; - -/** - * Returns this sector's maximum latitude in radians. - * @returns {Number} This sector's maximum latitude in radians. - */ -Sector.prototype.maxLatitudeRadians = function () { - return this.maxLatitude * Angle.DEGREES_TO_RADIANS; -}; - -/** - * Returns this sector's minimum longitude in radians. - * @returns {Number} This sector's minimum longitude in radians. - */ -Sector.prototype.minLongitudeRadians = function () { - return this.minLongitude * Angle.DEGREES_TO_RADIANS; -}; - -/** - * Returns this sector's maximum longitude in radians. - * @returns {Number} This sector's maximum longitude in radians. - */ -Sector.prototype.maxLongitudeRadians = function () { - return this.maxLongitude * Angle.DEGREES_TO_RADIANS; -}; - -/** - * Modifies this sector to encompass an array of specified locations. - * @param {Location[]} locations An array of locations. The array may be sparse. - * @returns {Sector} This sector, modified to encompass all locations in the specified array. - * @throws {ArgumentError} If the specified array is null, undefined or empty or has fewer than two locations. - */ -Sector.prototype.setToBoundingSector = function (locations) { - if (!locations || locations.length < 2) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "setToBoundingSector", - "missingArray")); - } - - var minLatitude = 90, - maxLatitude = -90, - minLongitude = 180, - maxLongitude = -180; - - for (var idx = 0, len = locations.length; idx < len; idx += 1) { - var location = locations[idx]; - - if (!location) { - continue; - } - - minLatitude = Math.min(minLatitude, location.latitude); - maxLatitude = Math.max(maxLatitude, location.latitude); - minLongitude = Math.min(minLongitude, location.longitude); - maxLongitude = Math.max(maxLongitude, location.longitude); - } - - this.minLatitude = minLatitude; - this.maxLatitude = maxLatitude; - this.minLongitude = minLongitude; - this.maxLongitude = maxLongitude; - - return this; -}; - -/** - * Computes bounding sectors from a list of locations that span the dateline. - * @param {Location[]} locations The locations to bound. - * @returns {Sector[]} Two sectors, one in the eastern hemisphere and one in the western hemisphere. - * Returns null if the computed bounding sector has zero width or height. - * @throws {ArgumentError} If the specified array is null, undefined or empty or the number of locations - * is less than 2. - */ -Sector.splitBoundingSectors = function (locations) { - if (!locations || locations.length < 2) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "splitBoundingSectors", - "missingArray")); - } - - var minLat = 90; - var minLon = 180; - var maxLat = -90; - var maxLon = -180; - - var lastLocation = null; - - for (var idx = 0, len = locations.length; idx < len; idx += 1) { - var location = locations[idx]; - - var lat = location.latitude; - if (lat < minLat) { - minLat = lat; - } - if (lat > maxLat) { - maxLat = lat; - } - - var lon = location.longitude; - if (lon >= 0 && lon < minLon) { - minLon = lon; - } - if (lon <= 0 && lon > maxLon) { - maxLon = lon; - } - - if (lastLocation != null) { - var lastLon = lastLocation.longitude; - if (WWMath.signum(lon) != WWMath.signum(lastLon)) { - if (Math.abs(lon - lastLon) < 180) { - // Crossing the zero longitude line too - maxLon = 0; - minLon = 0; - } - } - } - lastLocation = location; - } - - if (minLat === maxLat && minLon === maxLon) { - return null; - } - - return [ - new Sector(minLat, maxLat, minLon, 180), // Sector on eastern hemisphere. - new Sector(minLat, maxLat, -180, maxLon) // Sector on western hemisphere. - ]; -}; - -/** - * Indicates whether this sector intersects a specified sector. - * This sector intersects the specified sector when each sector's boundaries either overlap with the specified - * sector or are adjacent to the specified sector. - * The sectors are assumed to have normalized angles (angles within the range [-90, 90] latitude and - * [-180, 180] longitude). - * @param {Sector} sector The sector to test intersection with. May be null or undefined, in which case this - * function returns false. - * @returns {Boolean} true if the specifies sector intersections this sector, otherwise false. - */ -Sector.prototype.intersects = function (sector) { - // Assumes normalized angles: [-90, 90], [-180, 180]. - return sector - && this.minLongitude <= sector.maxLongitude - && this.maxLongitude >= sector.minLongitude - && this.minLatitude <= sector.maxLatitude - && this.maxLatitude >= sector.minLatitude; -}; - -/** - * Indicates whether this sector intersects a specified sector exclusive of the sector boundaries. - * This sector overlaps the specified sector when the union of the two sectors defines a non-empty sector. - * The sectors are assumed to have normalized angles (angles within the range [-90, 90] latitude and - * [-180, 180] longitude). - * @param {Sector} sector The sector to test overlap with. May be null or undefined, in which case this - * function returns false. - * @returns {Boolean} true if the specified sector overlaps this sector, otherwise false. - */ -Sector.prototype.overlaps = function (sector) { - // Assumes normalized angles: [-90, 90], [-180, 180]. - return sector - && this.minLongitude < sector.maxLongitude - && this.maxLongitude > sector.minLongitude - && this.minLatitude < sector.maxLatitude - && this.maxLatitude > sector.minLatitude; -}; - -/** - * Indicates whether this sector fully contains a specified sector. - * This sector contains the specified sector when the specified sector's boundaries are completely contained - * within this sector's boundaries, or are equal to this sector's boundaries. - * The sectors are assumed to have normalized angles (angles within the range [-90, 90] latitude and - * [-180, 180] longitude). - * @param {Sector} sector The sector to test containment with. May be null or undefined, in which case this - * function returns false. - * @returns {Boolean} true if the specified sector contains this sector, otherwise false. - */ -Sector.prototype.contains = function (sector) { - // Assumes normalized angles: [-90, 90], [-180, 180]. - return sector - && this.minLatitude <= sector.minLatitude - && this.maxLatitude >= sector.maxLatitude - && this.minLongitude <= sector.minLongitude - && this.maxLongitude >= sector.maxLongitude; -}; - -/** - * Indicates whether this sector contains a specified geographic location. - * @param {Number} latitude The location's latitude in degrees. - * @param {Number} longitude The location's longitude in degrees. - * @returns {Boolean} true if this sector contains the location, otherwise false. - */ -Sector.prototype.containsLocation = function (latitude, longitude) { - // Assumes normalized angles: [-90, 90], [-180, 180]. - return this.minLatitude <= latitude - && this.maxLatitude >= latitude - && this.minLongitude <= longitude - && this.maxLongitude >= longitude; -}; - -/** - * Sets this sector to the intersection of itself and a specified sector. - * @param {Sector} sector The sector to intersect with this one. - * @returns {Sector} This sector, set to its intersection with the specified sector. - * @throws {ArgumentError} If the specified sector is null or undefined. - */ -Sector.prototype.intersection = function (sector) { - if (!sector instanceof Sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "intersection", "missingSector")); - } - - // Assumes normalized angles: [-180, 180], [-90, 90]. - if (this.minLatitude < sector.minLatitude) - this.minLatitude = sector.minLatitude; - if (this.maxLatitude > sector.maxLatitude) - this.maxLatitude = sector.maxLatitude; - if (this.minLongitude < sector.minLongitude) - this.minLongitude = sector.minLongitude; - if (this.maxLongitude > sector.maxLongitude) - this.maxLongitude = sector.maxLongitude; - - // If the sectors do not overlap in either latitude or longitude, then the result of the above logic results in - // the max being greater than the min. In this case, set the max to indicate that the sector is empty in - // that dimension. - if (this.maxLatitude < this.minLatitude) - this.maxLatitude = this.minLatitude; - if (this.maxLongitude < this.minLongitude) - this.maxLongitude = this.minLongitude; - - return this; -}; - -/** - * Returns a list of the Lat/Lon coordinates of a Sector's corners. - * - * @returns {Array} an array of the four corner locations, in the order SW, SE, NE, NW - */ -Sector.prototype.getCorners = function () { - var corners = []; - - corners.push(new Location(this.minLatitude, this.minLongitude)); - corners.push(new Location(this.minLatitude, this.maxLongitude)); - corners.push(new Location(this.maxLatitude, this.maxLongitude)); - corners.push(new Location(this.maxLatitude, this.minLongitude)); - - return corners; -}; - -/** - * Returns an array of {@link Vec3} that bounds the specified sector on the surface of the specified - * {@link Globe}. The returned points enclose the globe's surface terrain in the sector, - * according to the specified vertical exaggeration, minimum elevation, and maximum elevation. If the minimum and - * maximum elevation are equal, this assumes a maximum elevation of 10 + the minimum. - * - * @param {Globe} globe the globe the extent relates to. - * @param {Number} verticalExaggeration the globe's vertical surface exaggeration. - * - * @returns {Vec3} a set of points that enclose the globe's surface on the specified sector. Can be turned into a {@link BoundingBox} - * with the setToVec3Points method. - * - * @throws {ArgumentError} if the globe is null. - */ -Sector.prototype.computeBoundingPoints = function (globe, verticalExaggeration) { - // TODO: Refactor this method back to computeBoundingBox. - // This method was originally computeBoundingBox and returned a BoundingBox. This created a circular dependency between - // Sector and BoundingBox that the Karma unit test suite doesn't appear to like. If we discover a way to make Karma handle this - // situation, we should refactor this method. - if (globe === null) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "computeBoundingBox", "missingGlobe")); - } - - var minAndMaxElevations = globe.minAndMaxElevationsForSector(this); - - // Compute the exaggerated minimum and maximum heights. - var minHeight = minAndMaxElevations[0] * verticalExaggeration; - var maxHeight = minAndMaxElevations[1] * verticalExaggeration; - - if (minHeight === maxHeight) - maxHeight = minHeight + 10; // Ensure the top and bottom heights are not equal. - - var points = []; - var corners = this.getCorners(); - for (var i = 0; i < corners.length; i++) { - points.push(globe.computePointFromPosition(corners[i].latitude, corners[i].longitude, minHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(corners[i].latitude, corners[i].longitude, maxHeight, new Vec3(0, 0, 0))); - } - - // A point at the centroid captures the maximum vertical dimension. - var centroid = this.centroid(new Location(0, 0)); - points.push(globe.computePointFromPosition(centroid.latitude, centroid.longitude, maxHeight, new Vec3(0, 0, 0))); - - // If the sector spans the equator, then the curvature of all four edges need to be taken into account. The - // extreme points along the top and bottom edges are located at their mid-points, and the extreme points along - // the left and right edges are on the equator. Add points with the longitude of the sector's centroid but with - // the sector's min and max latitude, and add points with the sector's min and max longitude but with latitude - // at the equator. See WWJINT-225. - if (this.minLatitude < 0 && this.maxLatitude > 0) { - points.push(globe.computePointFromPosition(this.minLatitude, centroid.longitude, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(this.maxLatitude, centroid.longitude, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(0, this.minLongitude, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(0, this.maxLongitude, maxHeight, new Vec3(0, 0, 0))); - } - // If the sector is located entirely in the southern hemisphere, then the curvature of its top edge needs to be - // taken into account. The extreme point along the top edge is located at its mid-point. Add a point with the - // longitude of the sector's centroid but with the sector's max latitude. See WWJINT-225. - else if (this.minLatitude < 0) { - points.push(globe.computePointFromPosition(this.maxLatitude, centroid.longitude, maxHeight, new Vec3(0, 0, 0))); - } - // If the sector is located entirely in the northern hemisphere, then the curvature of its bottom edge needs to - // be taken into account. The extreme point along the bottom edge is located at its mid-point. Add a point with - // the longitude of the sector's centroid but with the sector's min latitude. See WWJINT-225. - else { - points.push(globe.computePointFromPosition(this.minLatitude, centroid.longitude, maxHeight, new Vec3(0, 0, 0))); - } - - // If the sector spans 360 degrees of longitude then is a band around the entire globe. (If one edge is a pole - // then the sector looks like a circle around the pole.) Add points at the min and max latitudes and longitudes - // 0, 180, 90, and -90 to capture full extent of the band. - if (this.deltaLongitude() >= 360) { - var minLat = this.minLatitude; - points.push(globe.computePointFromPosition(minLat, 0, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(minLat, 90, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(minLat, -90, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(minLat, 180, maxHeight, new Vec3(0, 0, 0))); - - var maxLat = this.maxLatitude; - points.push(globe.computePointFromPosition(maxLat, 0, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(maxLat, 90, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(maxLat, -90, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(maxLat, 180, maxHeight, new Vec3(0, 0, 0))); - } - else if (this.deltaLongitude() > 180) { - // Need to compute more points to ensure the box encompasses the full sector. - var cLon = centroid.longitude; - var cLat = centroid.latitude; - - // centroid latitude, longitude midway between min longitude and centroid longitude - var lon = (this.minLongitude + cLon) / 2; - points.push(globe.computePointFromPosition(cLat, lon, maxHeight, new Vec3(0, 0, 0))); - - // centroid latitude, longitude midway between centroid longitude and max longitude - lon = (cLon + this.maxLongitude) / 2; - points.push(globe.computePointFromPosition(cLat, lon, maxHeight, new Vec3(0, 0, 0))); - - // centroid latitude, longitude at min longitude and max longitude - points.push(globe.computePointFromPosition(cLat, this.minLongitude, maxHeight, new Vec3(0, 0, 0))); - points.push(globe.computePointFromPosition(cLat, this.maxLongitude, maxHeight, new Vec3(0, 0, 0))); - } - - return points; -}; - -/** - * Sets this sector to the union of itself and a specified sector. - * @param {Sector} sector The sector to union with this one. - * @returns {Sector} This sector, set to its union with the specified sector. - * @throws {ArgumentError} if the specified sector is null or undefined. - */ -Sector.prototype.union = function (sector) { - if (!sector instanceof Sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Sector", "union", "missingSector")); - } - - // Assumes normalized angles: [-180, 180], [-90, 90]. - if (this.minLatitude > sector.minLatitude) - this.minLatitude = sector.minLatitude; - if (this.maxLatitude < sector.maxLatitude) - this.maxLatitude = sector.maxLatitude; - if (this.minLongitude > sector.minLongitude) - this.minLongitude = sector.minLongitude; - if (this.maxLongitude < sector.maxLongitude) - this.maxLongitude = sector.maxLongitude; - - return this; -}; - -export default Sector; diff --git a/web/src/gis/geom/Vec2.js b/web/src/gis/geom/Vec2.js deleted file mode 100644 index 3840ea2a..00000000 --- a/web/src/gis/geom/Vec2.js +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import Logger from '../util/Logger'; -import ArgumentError from '../error/ArgumentError'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a two-component vector. - * @alias Vec2 - * @classdesc Represents a two-component vector. Access the X component of the vector as v[0] and the Y - * component as v[1]. - * @augments Float64Array - * @param {Number} x X component of vector. - * @param {Number} y Y component of vector. - * @constructor - */ -function Vec2(x, y) { - this[0] = x; - this[1] = y; -} - -// Vec2 inherits from Float64Array. -Vec2.prototype = new Float64Array(2); - -/** - * Assigns the components of this vector. - * @param {Number} x The X component of the vector. - * @param {Number} y The Y component of the vector. - * @returns {Vec2} This vector with the specified components assigned. - */ -Vec2.prototype.set = function (x, y) { - this[0] = x; - this[1] = y; - - return this; -}; - -/** - * Copies the components of a specified vector to this vector. - * @param {Vec2} vector The vector to copy. - * @returns {Vec2} This vector set to the values of the specified vector. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec2.prototype.copy = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "copy", "missingVector")); - } - - this[0] = vector[0]; - this[1] = vector[1]; - - return this; -}; - -/** - * Indicates whether the X and Y components of this vector are identical to those of a specified vector. - * @param {Vec2} vector The vector to test. - * @returns {Boolean} true if this vector's components are equal to those of the specified vector, - * otherwise false. - */ -Vec2.prototype.equals = function (vector) { - return this[0] === vector[0] && this[1] === vector[1]; -}; - -/** - * Computes the average of a specified array of vectors. - * @param {Vec2[]} vectors The vectors whose average to compute. - * @param {Vec2} result A pre-allocated Vec2 in which to return the computed average. - * @returns {Vec2} The result argument set to the average of the specified lists of vectors. - * @throws {ArgumentError} If the specified array of vectors is null, undefined or empty, or the specified - * result argument is null or undefined. - */ -Vec2.average = function (vectors, result) { - if (!vectors || vectors.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "average", "missingArray")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "average", "missingResult")); - } - - var count = vectors.length, - vec; - - result[0] = 0; - result[1] = 0; - - for (var i = 0, len = vectors.length; i < len; i++) { - vec = vectors[i]; - - result[0] += vec[0] / count; - result[1] += vec[1] / count; - } - - return result; -}; - -/** - * Adds a vector to this vector. - * @param {Vec2} addend The vector to add to this one. - * @returns {Vec2} This vector after adding the specified vector to it. - * @throws {ArgumentError} If the specified addend is null or undefined. - */ -Vec2.prototype.add = function (addend) { - if (!addend) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "add", "missingVector")); - } - - this[0] += addend[0]; - this[1] += addend[1]; - - return this; -}; - -/** - * Subtracts a vector from this vector. - * @param {Vec2} subtrahend The vector to subtract from this one. - * @returns {Vec2} This vector after subtracting the specified vector from it. - * @throws {ArgumentError} If the subtrahend is null or undefined. - */ -Vec2.prototype.subtract = function (subtrahend) { - if (!subtrahend) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "subtract", "missingVector")); - } - - this[0] -= subtrahend[0]; - this[1] -= subtrahend[1]; - - return this; -}; - -/** - * Multiplies this vector by a scalar. - * @param {Number} scalar The scalar to multiply this vector by. - * @returns {Vec2} This vector multiplied by the specified scalar. - */ -Vec2.prototype.multiply = function (scalar) { - this[0] *= scalar; - this[1] *= scalar; - - return this; -}; - -/** - * Divide this vector by a scalar. - * @param {Number} divisor The scalar to divide this vector by. - * @returns {Vec2} This vector divided by the specified scalar. - */ -Vec2.prototype.divide = function (divisor) { - this[0] /= divisor; - this[1] /= divisor; - - return this; -}; - -/** - * Mixes (interpolates) a specified vector with this vector, modifying this vector. - * @param {Vec2} vector The vector to mix. - * @param {Number} weight The relative weight of this vector. - * @returns {Vec2} This vector modified to the mix of itself and the specified vector. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec2.prototype.mix = function (vector, weight) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "mix", "missingVector")); - } - - var w0 = 1 - weight, - w1 = weight; - - this[0] = this[0] * w0 + vector[0] * w1; - this[1] = this[1] * w0 + vector[1] * w1; - - return this; -}; - -/** - * Negates this vector. - * @returns {Vec2} This vector, negated. - */ -Vec2.prototype.negate = function () { - this[0] = -this[0]; - this[1] = -this[1]; - - return this; -}; - -/** - * Computes the scalar dot product of this vector and a specified vector. - * @param {Vec2} vector The vector to multiply. - * @returns {Number} The scalar dot product of the vectors. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec2.prototype.dot = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "dot", "missingVector")); - } - - return this[0] * vector[0] + this[1] * vector[1]; -}; - -/** - * Computes the squared magnitude of this vector. - * @returns {Number} The squared magnitude of this vector. - */ -Vec2.prototype.magnitudeSquared = function () { - return this.dot(this); -}; - -/** - * Computes the magnitude of this vector. - * @returns {Number} The magnitude of this vector. - */ -Vec2.prototype.magnitude = function () { - return Math.sqrt(this.magnitudeSquared()); -}; - -/** - * Normalizes this vector to a unit vector. - * @returns {Vec2} This vector, normalized. - */ -Vec2.prototype.normalize = function () { - var magnitude = this.magnitude(), - magnitudeInverse = 1 / magnitude; - - this[0] *= magnitudeInverse; - this[1] *= magnitudeInverse; - - return this; -}; - -/** - * Computes the squared distance from this vector to a specified vector. - * @param {Vec2} vector The vector to compute the distance to. - * @returns {Number} The squared distance between the vectors. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec2.prototype.distanceToSquared = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "distanceToSquared", "missingVector")); - } - - var dx = this[0] - vector[0], - dy = this[1] - vector[1]; - - return dx * dx + dy * dy; -}; - -/** - * Computes the distance from this vector to a specified vector. - * @param {Vec2} vector The vector to compute the distance to. - * @returns {Number} The distance between the vectors. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec2.prototype.distanceTo = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec2", "distanceTo", "missingVector")); - } - - return Math.sqrt(this.distanceToSquared(vector)); -}; - -/** - * Creates a {@link Vec3} using this vector's X and Y components and a Z component of 0. - * @returns {Vec3} A new vector whose X and Y components are those of this vector and whose Z component is 0. - */ -Vec2.prototype.toVec3 = function () { - return new Vec3(this[0], this[1], 0); -}; - -/** - * Swaps the components of this vector with those of another vector. This vector is set to the values of the - * specified vector, and the specified vector's components are set to the values of this vector. - * @param {Vec2} that The vector to swap. - * @returns {Vec2} This vector set to the values of the specified vector. - */ -Vec2.prototype.swap = function (that) { - var tmp = this[0]; - this[0] = that[0]; - that[0] = tmp; - - tmp = this[1]; - this[1] = that[1]; - that[1] = tmp; - - return this; -}; - -/** - * Returns a string representation of this vector. - * @returns {String} A string representation of this vector, in the form "(x, y)". - */ -Vec2.prototype.toString = function () { - return "(" + this[0] + ", " + this[1] + ")"; -}; - -export default Vec2; diff --git a/web/src/gis/geom/Vec3.js b/web/src/gis/geom/Vec3.js deleted file mode 100644 index 44c4091f..00000000 --- a/web/src/gis/geom/Vec3.js +++ /dev/null @@ -1,538 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import Logger from '../util/Logger'; -import ArgumentError from '../error/ArgumentError'; - - -/** - * Constructs a three-component vector. - * @alias Vec3 - * @classdesc Represents a three-component vector. Access the X component of the vector as v[0], the Y - * component as v[1] and the Z component as v[2]. - * @augments Float64Array - * @param {Number} x X component of vector. - * @param {Number} y Y component of vector. - * @param {Number} z Z component of vector. - * @constructor - */ -function Vec3(x, y, z) { - this[0] = x; - this[1] = y; - this[2] = z; -} - -// Vec3 extends Float64Array. -Vec3.prototype = new Float64Array(3); - -/** - * A vector corresponding to the origin. - * @type {Vec3} - */ -Vec3.ZERO = new Vec3(0, 0, 0); - -/** - * Computes the average of a specified array of vectors. - * @param {Vec3[]} vectors The vectors whose average to compute. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed average. - * @returns {Vec3} The result argument set to the average of the specified array of vectors. - * @throws {ArgumentError} If the specified array of vectors is null, undefined or empty or the specified - * result argument is null or undefined. - */ -Vec3.average = function (vectors, result) { - if (!vectors || vectors.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "average", "missingArray")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "average", "missingResult")); - } - - var count = vectors.length, - vec; - - result[0] = 0; - result[1] = 0; - result[2] = 0; - - for (var i = 0, len = vectors.length; i < len; i++) { - vec = vectors[i]; - - result[0] += vec[0] / count; - result[1] += vec[1] / count; - result[2] += vec[2] / count; - } - - return result; -}; - -/** - * Computes the average of a specified array of points packed into a single array. - * @param {Float32Array | Float64Array | Number[]} points The points whose average to compute. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed average. - * @returns {Vec3} The result argument set to the average of the specified array of points. - * @throws {ArgumentError} If the specified array of points is null, undefined or empty or the result argument - * is null or undefined. - */ -Vec3.averageOfBuffer = function (points, result) { - if (!points || points.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "averageBuffer", "missingArray")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "averageBuffer", "missingResult")); - } - - var count = points.length / 3; - - result[0] = 0; - result[1] = 0; - result[2] = 0; - - for (var i = 0; i < count; i++) { - result[0] += points[i * 3] / count; - result[1] += points[i * 3 + 1] / count; - result[2] += points[i * 3 + 2] / count; - } - - return result; -}; - -/** - * Indicates whether three vectors are colinear. - * @param {Vec3} a The first vector. - * @param {Vec3} b The second vector. - * @param {Vec3} c The third vector. - * @returns {Boolean} true if the vectors are colinear, otherwise false. - * @throws {ArgumentError} If any of the specified vectors are null or undefined. - */ -Vec3.areColinear = function (a, b, c) { - if (!a || !b || !c) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "areColinear", "missingVector")); - } - - var ab = new Vec3(a[0] - b[0], a[1] - b[1], a[2] - b[2]).normalize(), - bc = new Vec3(c[0] - b[0], c[1] - b[1], c[2] - b[2]).normalize(); - - // ab and bc are considered colinear if their dot product is near +/-1. - return Math.abs(ab.dot(bc)) > 0.999; -}; - -/** - * Computes the normal vector of a specified triangle. - * - * @param {Vec3} a The triangle's first vertex. - * @param {Vec3} b The triangle's second vertex. - * @param {Vec3} c The triangle's third vertex. - * @returns {Vec3} The triangle's unit-normal vector. - * @throws {ArgumentError} If any of the specified vectors are null or undefined. - */ -Vec3.computeTriangleNormal = function (a, b, c) { - if (!a || !b || !c) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "areColinear", "missingVector")); - } - - var x = (b[1] - a[1]) * (c[2] - a[2]) - (b[2] - a[2]) * (c[1] - a[1]), - y = (b[2] - a[2]) * (c[0] - a[0]) - (b[0] - a[0]) * (c[2] - a[2]), - z = (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]), - length = x * x + y * y + z * z; - - if (length === 0) { - return new Vec3(x, y, z); - } - - length = Math.sqrt(length); - - return new Vec3(x / length, y / length, z / length); -}; - -/** - * Finds three non-colinear points in an array of coordinates. - * - * @param {Number[]} coords The coordinates, in the order x0, y0, z0, x1, y1, z1, ... - * @param {Number} stride The number of numbers between successive points. 0 indicates that the points - * are arranged one immediately after the other, as would the value 3. - * @returns {Vec3[]} Three non-colinear points from the input array of coordinates, or null if three - * non-colinear points could not be found or the specified coordinates array is null, undefined or - * contains fewer than three points. - */ -Vec3.findThreeIndependentVertices = function (coords, stride) { - var xstride = stride && stride > 0 ? stride : 3; - - if (!coords || coords.length < 3 * xstride) { - return null; - } - - var a = new Vec3(coords[0], coords[1], coords[2]), - b = null, - c = null, - k = xstride; - - for (; k < coords.length; k += xstride) { - b = new Vec3(coords[k], coords[k + 1], coords[k + 2]); - if (!(b[0] === a[0] && b[1] === a[1] && b[2] === a[2])) { - break; - } - b = null; - } - - if (!b) { - return null; - } - - for (k += xstride; k < coords.length; k += xstride) { - c = new Vec3(coords[k], coords[k + 1], coords[k + 2]); - - // if c is not coincident with a or b, and the vectors ab and bc are not colinear, break and - // return a, b, c. - if (!(c[0] === a[0] && c[1] === a[1] && c[2] === a[2] - || c[0] === b[0] && c[1] === b[1] && c[2] === b[2])) { - if (!Vec3.areColinear(a, b, c)) - break; - } - - c = null; - } - - return c ? [a, b, c] : null; -}; - -/** - * Computes a unit-normal vector for a buffer of coordinate triples. The normal vector is computed from the - * first three non-colinear points in the buffer. - * - * @param {Number[]} coords The coordinates, in the order x0, y0, z0, x1, y1, z1, ... - * @param {Number} stride The number of numbers between successive points. 0 indicates that the points - * are arranged one immediately after the other, as would the value 3. - * @returns {Vec3} The computed unit-length normal vector. - */ -Vec3.computeBufferNormal = function (coords, stride) { - var vertices = Vec3.findThreeIndependentVertices(coords, stride); - - return vertices ? Vec3.computeTriangleNormal(vertices[0], vertices[1], vertices[2]) : null; -}; - -/** - * Assigns the components of this vector. - * @param {Number} x The X component of the vector. - * @param {Number} y The Y component of the vector. - * @param {Number} z The Z component of the vector. - * @returns {Vec3} This vector with the specified components assigned. - */ -Vec3.prototype.set = function (x, y, z) { - this[0] = x; - this[1] = y; - this[2] = z; - - return this; -}; - -/** - * Copies the components of a specified vector to this vector. - * @param {Vec3} vector The vector to copy. - * @returns {Vec3} This vector set to the X, Y and Z values of the specified vector. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec3.prototype.copy = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "copy", "missingVector")); - } - - this[0] = vector[0]; - this[1] = vector[1]; - this[2] = vector[2]; - - return this; -}; - -/** - * Indicates whether the components of this vector are identical to those of a specified vector. - * @param {Vec3} vector The vector to test. - * @returns {Boolean} true if the components of this vector are equal to those of the specified one, - * otherwise false. - */ -Vec3.prototype.equals = function (vector) { - return this[0] === vector[0] && this[1] === vector[1] && this[2] === vector[2]; -}; - -/** - * Adds a specified vector to this vector. - * @param {Vec3} addend The vector to add. - * @returns {Vec3} This vector after adding the specified vector to it. - * @throws {ArgumentError} If the addend is null or undefined. - */ -Vec3.prototype.add = function (addend) { - if (!addend) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "add", "missingVector")); - } - - this[0] += addend[0]; - this[1] += addend[1]; - this[2] += addend[2]; - - return this; -}; - -/** - * Subtracts a specified vector from this vector. - * @param {Vec3} subtrahend The vector to subtract - * @returns {Vec3} This vector after subtracting the specified vector from it. - * @throws {ArgumentError} If the subtrahend is null or undefined. - */ -Vec3.prototype.subtract = function (subtrahend) { - if (!subtrahend) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "subtract", "missingVector")); - } - - this[0] -= subtrahend[0]; - this[1] -= subtrahend[1]; - this[2] -= subtrahend[2]; - - return this; -}; - -/** - * Multiplies this vector by a scalar. - * @param {Number} scalar The scalar to multiply this vector by. - * @returns {Vec3} This vector multiplied by the specified scalar. - */ -Vec3.prototype.multiply = function (scalar) { - this[0] *= scalar; - this[1] *= scalar; - this[2] *= scalar; - - return this; -}; - -/** - * Divides this vector by a scalar. - * @param {Number} divisor The scalar to divide this vector by. - * @returns {Vec3} This vector divided by the specified scalar. - */ -Vec3.prototype.divide = function (divisor) { - this[0] /= divisor; - this[1] /= divisor; - this[2] /= divisor; - - return this; -}; - -/** - * Multiplies this vector by a 4x4 matrix. The multiplication is performed with an implicit W component of 1. - * The resultant W component of the product is then divided through the X, Y, and Z components. - * - * @param {Matrix} matrix The matrix to multiply this vector by. - * @returns {Vec3} This vector multiplied by the specified matrix. - * @throws ArgumentError If the specified matrix is null or undefined. - */ -Vec3.prototype.multiplyByMatrix = function (matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "multiplyByMatrix", "missingMatrix")); - } - - var x = matrix[0] * this[0] + matrix[1] * this[1] + matrix[2] * this[2] + matrix[3], - y = matrix[4] * this[0] + matrix[5] * this[1] + matrix[6] * this[2] + matrix[7], - z = matrix[8] * this[0] + matrix[9] * this[1] + matrix[10] * this[2] + matrix[11], - w = matrix[12] * this[0] + matrix[13] * this[1] + matrix[14] * this[2] + matrix[15]; - - this[0] = x / w; - this[1] = y / w; - this[2] = z / w; - - return this; -}; - -/** - * Mixes (interpolates) a specified vector with this vector, modifying this vector. - * @param {Vec3} vector The vector to mix with this one. - * @param {Number} weight The relative weight of this vector. - * @returns {Vec3} This vector modified to the mix of itself and the specified vector. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec3.prototype.mix = function (vector, weight) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "mix", "missingVector")); - } - - var w0 = 1 - weight, - w1 = weight; - - this[0] = this[0] * w0 + vector[0] * w1; - this[1] = this[1] * w0 + vector[1] * w1; - this[2] = this[2] * w0 + vector[2] * w1; - - return this; -}; - -/** - * Negates the components of this vector. - * @returns {Vec3} This vector, negated. - */ -Vec3.prototype.negate = function () { - this[0] = -this[0]; - this[1] = -this[1]; - this[2] = -this[2]; - - return this; -}; - -/** - * Computes the scalar dot product of this vector and a specified vector. - * @param {Vec3} vector The vector to multiply. - * @returns {Number} The dot product of the two vectors. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec3.prototype.dot = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "dot", "missingVector")); - } - - return this[0] * vector[0] + - this[1] * vector[1] + - this[2] * vector[2]; -}; - -/** - * Computes the cross product of this vector and a specified vector, modifying this vector. - * @param {Vec3} vector The vector to cross with this vector. - * @returns {Vec3} This vector set to the cross product of itself and the specified vector. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec3.prototype.cross = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "cross", "missingVector")); - } - - var x = this[1] * vector[2] - this[2] * vector[1], - y = this[2] * vector[0] - this[0] * vector[2], - z = this[0] * vector[1] - this[1] * vector[0]; - - this[0] = x; - this[1] = y; - this[2] = z; - - return this; -}; - -/** - * Computes the squared magnitude of this vector. - * @returns {Number} The squared magnitude of this vector. - */ -Vec3.prototype.magnitudeSquared = function () { - return this.dot(this); -}; - -/** - * Computes the magnitude of this vector. - * @returns {Number} The magnitude of this vector. - */ -Vec3.prototype.magnitude = function () { - return Math.sqrt(this.magnitudeSquared()); -}; - -/** - * Normalizes this vector to a unit vector. - * @returns {Vec3} This vector, normalized. - */ -Vec3.prototype.normalize = function () { - var magnitude = this.magnitude(), - magnitudeInverse = 1 / magnitude; - - this[0] *= magnitudeInverse; - this[1] *= magnitudeInverse; - this[2] *= magnitudeInverse; - - return this; -}; - -/** - * Computes the squared distance from this vector to a specified vector. - * @param {Vec3} vector The vector to compute the distance to. - * @returns {Number} The squared distance between the vectors. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec3.prototype.distanceToSquared = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "distanceToSquared", "missingVector")); - } - - var dx = this[0] - vector[0], - dy = this[1] - vector[1], - dz = this[2] - vector[2]; - - return dx * dx + dy * dy + dz * dz; -}; - -/** - * Computes the distance from this vector to another vector. - * @param {Vec3} vector The vector to compute the distance to. - * @returns {number} The distance between the vectors. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Vec3.prototype.distanceTo = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Vec3", "distanceTo", "missingVector")); - } - - return Math.sqrt(this.distanceToSquared(vector)); -}; - -/** - * Swaps this vector with that vector. This vector's components are set to the values of the specified - * vector's components, and the specified vector's components are set to the values of this vector's components. - * @param {Vec3} that The vector to swap. - * @returns {Vec3} This vector set to the values of the specified vector. - */ -Vec3.prototype.swap = function (that) { - var tmp = this[0]; - this[0] = that[0]; - that[0] = tmp; - - tmp = this[1]; - this[1] = that[1]; - that[1] = tmp; - - tmp = this[2]; - this[2] = that[2]; - that[2] = tmp; - - return this; -}; - -/** - * Returns a string representation of this vector. - * @returns {String} A string representation of this vector, in the form "(x, y, z)". - */ -Vec3.prototype.toString = function () { - return "(" + this[0] + ", " + this[1] + ", " + this[2] + ")"; -}; - -export default Vec3; diff --git a/web/src/gis/gesture/ClickRecognizer.js b/web/src/gis/gesture/ClickRecognizer.js deleted file mode 100644 index c9b0a348..00000000 --- a/web/src/gis/gesture/ClickRecognizer.js +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ClickRecognizer - */ -import GestureRecognizer from '../gesture/GestureRecognizer'; - - -/** - * Constructs a mouse click gesture recognizer. - * @alias ClickRecognizer - * @constructor - * @augments GestureRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for single or multiple mouse clicks. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function ClickRecognizer(target, callback) { - GestureRecognizer.call(this, target, callback); - - /** - * - * @type {Number} - */ - this.numberOfClicks = 1; - - /** - * - * @type {Number} - */ - this.button = 0; - - // Intentionally not documented. - this.maxMouseMovement = 5; - - // Intentionally not documented. - this.maxClickDuration = 500; - - // Intentionally not documented. - this.maxClickInterval = 400; - - // Intentionally not documented. - this.clicks = []; - - // Intentionally not documented. - this.timeout = null; -} - -ClickRecognizer.prototype = Object.create(GestureRecognizer.prototype); - -// Documented in superclass. -ClickRecognizer.prototype.reset = function () { - GestureRecognizer.prototype.reset.call(this); - - this.clicks = []; - this.cancelFailAfterDelay(); -}; - -// Documented in superclass. -ClickRecognizer.prototype.mouseDown = function (event) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - if (this.button != event.button) { - this.state = WorldWind.FAILED; - } else { - var click = { - clientX: this.clientX, - clientY: this.clientY - }; - this.clicks.push(click); - this.failAfterDelay(this.maxClickDuration); // fail if the click is down too long - } -}; - -// Documented in superclass. -ClickRecognizer.prototype.mouseMove = function (event) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - var dx = this.translationX, - dy = this.translationY, - distance = Math.sqrt(dx * dx + dy * dy); - if (distance > this.maxMouseMovement) { - this.state = WorldWind.FAILED; - } -}; - -// Documented in superclass. -ClickRecognizer.prototype.mouseUp = function (event) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - if (this.mouseButtonMask != 0) { - return; // wait until the last button is up - } - - var clickCount = this.clicks.length; - if (clickCount == this.numberOfClicks) { - this.clientX = this.clicks[0].clientX; - this.clientY = this.clicks[0].clientY; - this.state = WorldWind.RECOGNIZED; - } else { - this.failAfterDelay(this.maxClickInterval); // fail if the interval between clicks is too long - } -}; - -// Documented in superclass. -ClickRecognizer.prototype.touchStart = function (touch) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - this.state = WorldWind.FAILED; // mouse gestures fail upon receiving a touch event -}; - -// Intentionally not documented. -ClickRecognizer.prototype.failAfterDelay = function (delay) { - var self = this; - if (self.timeout) { - window.clearTimeout(self.timeout); - } - - self.timeout = window.setTimeout(function () { - self.timeout = null; - if (self.state == WorldWind.POSSIBLE) { - self.state = WorldWind.FAILED; // fail if we haven't already reached a terminal state - } - }, delay); -}; - -// Intentionally not documented. -ClickRecognizer.prototype.cancelFailAfterDelay = function () { - var self = this; - if (self.timeout) { - window.clearTimeout(self.timeout); - self.timeout = null; - } -}; - -export default ClickRecognizer; - diff --git a/web/src/gis/gesture/DragRecognizer.js b/web/src/gis/gesture/DragRecognizer.js deleted file mode 100644 index 621642bd..00000000 --- a/web/src/gis/gesture/DragRecognizer.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports DragRecognizer - */ -import GestureRecognizer from '../gesture/GestureRecognizer'; - - -/** - * Constructs a mouse drag gesture recognizer. - * @alias DragRecognizer - * @constructor - * @augments GestureRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for mouse drag gestures. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function DragRecognizer(target, callback) { - GestureRecognizer.call(this, target, callback); - - /** - * - * @type {Number} - */ - this.button = 0; - - // Intentionally not documented. - this.interpretDistance = 5; -} - -DragRecognizer.prototype = Object.create(GestureRecognizer.prototype); - -// Documented in superclass. -DragRecognizer.prototype.mouseMove = function (event) { - if (this.state == WorldWind.POSSIBLE) { - if (this.shouldInterpret()) { - if (this.shouldRecognize()) { - this.translationX = 0; // set translation to zero when the drag begins - this.translationY = 0; - this.state = WorldWind.BEGAN; - } else { - this.state = WorldWind.FAILED; - } - } - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.CHANGED; - } -}; - -// Documented in superclass. -DragRecognizer.prototype.mouseUp = function (event) { - if (this.mouseButtonMask == 0) { // last button up - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.ENDED; - } - } -}; - -// Documented in superclass. -DragRecognizer.prototype.touchStart = function (touch) { - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; // mouse gestures fail upon receiving a touch event - } -}; - -/** - * - * @returns {Boolean} - * @protected - */ -DragRecognizer.prototype.shouldInterpret = function () { - var dx = this.translationX, - dy = this.translationY, - distance = Math.sqrt(dx * dx + dy * dy); - return distance > this.interpretDistance; // interpret mouse movement when the cursor moves far enough -}; - -/** - * - * @returns {Boolean} - * @protected - */ -DragRecognizer.prototype.shouldRecognize = function () { - var buttonBit = 1 << this.button; - return buttonBit == this.mouseButtonMask; // true when the specified button is the only button down -}; - -export default DragRecognizer; - diff --git a/web/src/gis/gesture/GestureRecognizer.js b/web/src/gis/gesture/GestureRecognizer.js deleted file mode 100644 index 6e9ea35e..00000000 --- a/web/src/gis/gesture/GestureRecognizer.js +++ /dev/null @@ -1,793 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GestureRecognizer - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Touch from '../gesture/Touch'; - - -/** - * Constructs a base gesture recognizer. This is an abstract base class and not intended to be instantiated - * directly. - * @alias GestureRecognizer - * @constructor - * @classdesc Gesture recognizers translate user input event streams into higher level actions. A gesture - * recognizer is associated with an event target, which dispatches mouse and keyboard events to the gesture - * recognizer. When a gesture recognizer has received enough information from the event stream to interpret the - * action, it calls its callback functions. Callback functions may be specified at construction or added to the - * [gestureCallbacks]{@link GestureRecognizer#gestureCallbacks} list after construction. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -// TODO: evaluate target usage -function GestureRecognizer(target, callback) { - if (!target) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "constructor", "missingTarget")); - } - - /** - * Indicates the document element this gesture recognizer observes for UI events. - * @type {EventTarget} - * @readonly - */ - this.target = target; - - /** - * Indicates whether or not this gesture recognizer is enabled. When false, this gesture recognizer will - * ignore any events dispatched by its target. - * @type {Boolean} - * @default true - */ - this.enabled = true; - - // Documented with its property accessor below. - this._state = WorldWind.POSSIBLE; - - // Intentionally not documented. - this._nextState = null; - - // Documented with its property accessor below. - this._clientX = 0; - - // Documented with its property accessor below. - this._clientY = 0; - - // Intentionally not documented. - this._clientStartX = 0; - - // Intentionally not documented. - this._clientStartY = 0; - - // Documented with its property accessor below. - this._translationX = 0; - - // Documented with its property accessor below. - this._translationY = 0; - - // Intentionally not documented. - this._translationWeight = 0.4; - - // Documented with its property accessor below. - this._mouseButtonMask = 0; - - // Intentionally not documented. - this._touches = []; - - // Intentionally not documented. - this._touchCentroidShiftX = 0; - - // Intentionally not documented. - this._touchCentroidShiftY = 0; - - // Documented with its property accessor below. - this._gestureCallbacks = []; - - // Intentionally not documented. - this._canRecognizeWith = []; - - // Intentionally not documented. - this._requiresFailureOf = []; - - // Intentionally not documented. - this._requiredToFailBy = []; - - // Add the optional gesture callback. - if (callback) { - this._gestureCallbacks.push(callback); - } - - // Intentionally not documented. - this.listenerList = []; - - // Add this recognizer to the list of all recognizers. - GestureRecognizer.allRecognizers.push(this); -} - -// Intentionally not documented. -GestureRecognizer.allRecognizers = []; - -Object.defineProperties(GestureRecognizer.prototype, { - /** - * Indicates this gesture's current state. Possible values are WorldWind.POSSIBLE, WorldWind.FAILED, - * WorldWind.RECOGNIZED, WorldWind.BEGAN, WorldWind.CHANGED, WorldWind.CANCELLED and WorldWind.ENDED. - * @type {String} - * @default WorldWind.POSSIBLE - * @memberof GestureRecognizer.prototype - */ - state: { - get: function () { - return this._state; - }, - set: function (value) { - this.transitionToState(value); - } - }, - - /** - * Indicates the X coordinate of this gesture. - * @type {Number} - * @memberof GestureRecognizer.prototype - */ - clientX: { - get: function () { - return this._clientX; - }, - set: function (value) { - this._clientX = value; - } - }, - - /** - * Returns the Y coordinate of this gesture. - * @type {Number} - * @memberof GestureRecognizer.prototype - */ - clientY: { - get: function () { - return this._clientY; - }, - set: function (value) { - this._clientY = value; - } - }, - - /** - * Indicates this gesture's translation along the X axis since the gesture started. - * @type {Number} - * @memberof GestureRecognizer.prototype - */ - translationX: { - get: function () { - return this._translationX; - }, - set: function (value) { - this._translationX = value; - this._clientStartX = this._clientX; - this._touchCentroidShiftX = 0; - } - }, - - /** - * Indicates this gesture's translation along the Y axis since the gesture started. - * @type {Number} - * @memberof GestureRecognizer.prototype - */ - translationY: { - get: function () { - return this._translationY; - }, - set: function (value) { - this._translationY = value; - this._clientStartY = this._clientY; - this._touchCentroidShiftY = 0; - } - }, - - /** - * Indicates the currently pressed mouse buttons as a bitmask. A value of 0 indicates that no buttons are - * pressed. A nonzero value indicates that one or more buttons are pressed as follows: bit 1 indicates the - * primary button, bit 2 indicates the the auxiliary button, bit 3 indicates the secondary button. - * @type {Number} - * @readonly - * @memberof GestureRecognizer.prototype - */ - mouseButtonMask: { - get: function () { - return this._mouseButtonMask; - } - }, - - /** - * Indicates the number of active touches. - * @type {Number} - * @readonly - * @memberof GestureRecognizer.prototype - */ - touchCount: { - get: function () { - return this._touches.length; - } - }, - - /** - * The list of functions to call when this gesture is recognized. The functions have a single argument: - * this gesture recognizer, e.g., <code>gestureCallback(recognizer)</code>. Applications may - * add functions to this array or remove them. - * @type {Function[]} - * @readonly - * @memberof GestureRecognizer.prototype - */ - gestureCallbacks: { - get: function () { - return this._gestureCallbacks; - } - } -}); - -/** - * - * @param index - * @returns {Touch} - * @throws {ArgumentError} If the index is out of range. - */ -GestureRecognizer.prototype.touch = function (index) { - if (index < 0 || index >= this._touches.length) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "touch", "indexOutOfRange")); - } - - return this._touches[index]; -}; - -/** - * - * @param recognizer - */ -GestureRecognizer.prototype.recognizeSimultaneouslyWith = function (recognizer) { - if (!recognizer) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "recognizeSimultaneouslyWith", - "The specified gesture recognizer is null or undefined.")); - } - - var index = this._canRecognizeWith.indexOf(recognizer); - if (index == -1) { - this._canRecognizeWith.push(recognizer); - recognizer._canRecognizeWith.push(this); - } -}; - -/** - * - * @param recognizer - * @returns {Boolean} - */ -GestureRecognizer.prototype.canRecognizeSimultaneouslyWith = function (recognizer) { - var index = this._canRecognizeWith.indexOf(recognizer); - return index != -1; -}; - -/** - * - * @param recognizer - */ -GestureRecognizer.prototype.requireRecognizerToFail = function (recognizer) { - if (!recognizer) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "requireRecognizerToFail", - "The specified gesture recognizer is null or undefined")); - } - - var index = this._requiresFailureOf.indexOf(recognizer); - if (index == -1) { - this._requiresFailureOf.push(recognizer); - recognizer._requiredToFailBy.push(this); - } -}; - -/** - * - * @param recognizer - * @returns {Boolean} - */ -GestureRecognizer.prototype.requiresRecognizerToFail = function (recognizer) { - var index = this._requiresFailureOf.indexOf(recognizer); - return index != -1; -}; - -/** - * - * @param recognizer - * @returns {Boolean} - */ -GestureRecognizer.prototype.requiredToFailByRecognizer = function (recognizer) { - var index = this._requiredToFailBy.indexOf(recognizer); - return index != -1; -}; - -/** - * @protected - */ -GestureRecognizer.prototype.reset = function () { - this._state = WorldWind.POSSIBLE; - this._nextState = null; - this._clientX = 0; - this._clientY = 0; - this._clientStartX = 0; - this._clientStartY = 0; - this._translationX = 0; - this._translationY = 0; - this._mouseButtonMask = 0; - this._touches = []; - this._touchCentroidShiftX = 0; - this._touchCentroidShiftY = 0; -}; - -/** - * @protected - */ -GestureRecognizer.prototype.prepareToRecognize = function () { -}; - -/** - * - * @param event - * @protected - */ -GestureRecognizer.prototype.mouseDown = function (event) { -}; - -/** - * - * @param event - * @protected - */ -GestureRecognizer.prototype.mouseMove = function (event) { -}; - -/** - * - * @param event - * @protected - */ -GestureRecognizer.prototype.mouseUp = function (event) { -}; - -/** - * - * @param touch - * @protected - */ -GestureRecognizer.prototype.touchStart = function (touch) { -}; - -/** - * - * @param touch - * @protected - */ -GestureRecognizer.prototype.touchMove = function (touch) { -}; - -/** - * - * @param touch - * @protected - */ -GestureRecognizer.prototype.touchCancel = function (touch) { -}; - -/** - * - * @param touch - * @protected - */ -GestureRecognizer.prototype.touchEnd = function (touch) { -}; - -// Intentionally not documented. -GestureRecognizer.prototype.transitionToState = function (newState) { - this._nextState = null; // clear any pending state transition - - if (newState === WorldWind.FAILED) { - this._state = newState; - this.updateRecognizersWaitingForFailure(); - this.resetIfEventsEnded(); - } else if (newState === WorldWind.RECOGNIZED) { - this.tryToRecognize(newState); // may prevent the transition to Recognized - if (this._state === newState) { - this.prepareToRecognize(); - this.notifyListeners(); - this.callGestureCallbacks(); - this.resetIfEventsEnded(); - } - } else if (newState === WorldWind.BEGAN) { - this.tryToRecognize(newState); // may prevent the transition to Began - if (this._state === newState) { - this.prepareToRecognize(); - this.notifyListeners(); - this.callGestureCallbacks(); - } - } else if (newState === WorldWind.CHANGED) { - this._state = newState; - this.notifyListeners(); - this.callGestureCallbacks(); - } else if (newState === WorldWind.CANCELLED) { - this._state = newState; - this.notifyListeners(); - this.callGestureCallbacks(); - this.resetIfEventsEnded(); - } else if (newState === WorldWind.ENDED) { - this._state = newState; - this.notifyListeners(); - this.callGestureCallbacks(); - this.resetIfEventsEnded(); - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.updateRecognizersWaitingForFailure = function () { - // Transition gestures that are waiting for this gesture to transition to Failed. - for (var i = 0, len = this._requiredToFailBy.length; i < len; i++) { - var recognizer = this._requiredToFailBy[i]; - if (recognizer._nextState != null) { - recognizer.transitionToState(recognizer._nextState); - } - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.tryToRecognize = function (newState) { - // Transition to Failed if another gesture can prevent this gesture from recognizing. - if (GestureRecognizer.allRecognizers.some(this.canBePreventedByRecognizer, this)) { - this.transitionToState(WorldWind.FAILED); - return; - } - - // Delay the transition to Recognized/Began if this gesture is waiting for a gesture in the Possible state. - if (GestureRecognizer.allRecognizers.some(this.isWaitingForRecognizerToFail, this)) { - this._nextState = newState; - return; - } - - // Transition to Failed all other gestures that can be prevented from recognizing by this gesture. - var prevented = GestureRecognizer.allRecognizers.filter(this.canPreventRecognizer, this); - for (var i = 0, len = prevented.length; i < len; i++) { - prevented[i].transitionToState(WorldWind.FAILED); - } - - this._state = newState; -}; - -// Intentionally not documented. -GestureRecognizer.prototype.canPreventRecognizer = function (that) { - return this != that && this.target == that.target && that.state == WorldWind.POSSIBLE && - (this.requiredToFailByRecognizer(that) || !this.canRecognizeSimultaneouslyWith(that)); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.canBePreventedByRecognizer = function (that) { - return this != that && this.target == that.target && that.state == WorldWind.RECOGNIZED && - (this.requiresRecognizerToFail(that) || !this.canRecognizeSimultaneouslyWith(that)); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.isWaitingForRecognizerToFail = function (that) { - return this != that && this.target == that.target && that.state == WorldWind.POSSIBLE && - this.requiresRecognizerToFail(that); -}; - -/** - * Registers a gesture state listener on this GestureRecognizer. Registering state listeners using this function - * enables applications to receive notifications of gesture recognition. - * - * Listeners must implement a gestureStateChanged method to receive notifications. The gestureStateChanged method will - * receive one parameter containing a reference to the recognizer that changed state. - * - * @param listener The function to call when the event occurs. - * @throws {ArgumentError} If any argument is null or undefined. - */ -GestureRecognizer.prototype.addListener = function (listener) { - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "addListener", "missingListener")); - } - this.listenerList.push(listener); -}; - -/** - * Removes a gesture state listener from this GestureRecognizer. The listener must be the same object passed to - * addListener. Calling removeListener with arguments that do not identify a currently registered - * listener has no effect. - * - * @param listener The listener to remove. Must be the same object passed to addListener. - * @throws {ArgumentError} If any argument is null or undefined. - */ -GestureRecognizer.prototype.removeListener = function (listener) { - if (!listener) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "removeListener", "missingListener")); - } - - var index = this.listenerList.indexOf(listener); - if (index !== -1) { - this.listenerList.splice(index, 1); // remove the listener from the list - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.notifyListeners = function () { - for (var i = 0; i < this.listenerList.length; i++) { - this.listenerList[i].gestureStateChanged(this); - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.callGestureCallbacks = function () { - for (var i = 0, len = this._gestureCallbacks.length; i < len; i++) { - this._gestureCallbacks[i](this); - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.onGestureEvent = function (event) { - if (!this.enabled) { - return; - } - - if (event.defaultPrevented && this.state === WorldWind.POSSIBLE) { - return; // ignore cancelled events while in the Possible state - } - - var i, len; - - try { - if (event.type === "mousedown") { - this.handleMouseDown(event); - } else if (event.type === "mousemove") { - this.handleMouseMove(event); - } else if (event.type === "mouseup") { - this.handleMouseUp(event); - } else if (event.type === "touchstart") { - for (i = 0, len = event.changedTouches.length; i < len; i++) { - this.handleTouchStart(event.changedTouches.item(i)); - } - } else if (event.type === "touchmove") { - for (i = 0, len = event.changedTouches.length; i < len; i++) { - this.handleTouchMove(event.changedTouches.item(i)); - } - } else if (event.type === "touchcancel") { - for (i = 0, len = event.changedTouches.length; i < len; i++) { - this.handleTouchCancel(event.changedTouches.item(i)); - } - } else if (event.type === "touchend") { - for (i = 0, len = event.changedTouches.length; i < len; i++) { - this.handleTouchEnd(event.changedTouches.item(i)); - } - } else if (event.type === "pointerdown" && event.pointerType === "mouse") { - this.handleMouseDown(event); - } else if (event.type === "pointermove" && event.pointerType === "mouse") { - this.handleMouseMove(event); - } else if (event.type === "pointercancel" && event.pointerType === "mouse") { - // Intentionally left blank. The W3C Pointer Events specification is ambiguous on what cancel means - // for mouse input, and there is no evidence that this event is actually generated (6/19/2015). - } else if (event.type === "pointerup" && event.pointerType === "mouse") { - this.handleMouseUp(event); - } else if (event.type === "pointerdown" && event.pointerType === "touch") { - this.handleTouchStart(event); - } else if (event.type === "pointermove" && event.pointerType === "touch") { - this.handleTouchMove(event); - } else if (event.type === "pointercancel" && event.pointerType === "touch") { - this.handleTouchCancel(event); - } else if (event.type === "pointerup" && event.pointerType === "touch") { - this.handleTouchEnd(event); - } else { - Logger.logMessage(Logger.LEVEL_INFO, "GestureRecognizer", "handleEvent", - "Unrecognized event type: " + event.type); - } - } catch (e) { - Logger.logMessage(Logger.LEVEL_SEVERE, "GestureRecognizer", "handleEvent", - "Error handling event.\n" + e.toString()); - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleMouseDown = function (event) { - if (event.type == "mousedown" && this._touches.length > 0) { - return; // ignore synthesized mouse down events on Android Chrome - } - - var buttonBit = 1 << event.button; - if (buttonBit & this._mouseButtonMask != 0) { - return; // ignore redundant mouse down events - } - - if (this._mouseButtonMask == 0) { // first button down - this._clientX = event.clientX; - this._clientY = event.clientY; - this._clientStartX = event.clientX; - this._clientStartY = event.clientY; - this._translationX = 0; - this._translationY = 0; - } - - this._mouseButtonMask |= buttonBit; - this.mouseDown(event); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleMouseMove = function (event) { - if (this._mouseButtonMask == 0) { - return; // ignore mouse move events when this recognizer does not consider any button to be down - } - - if (this._clientX == event.clientX && this._clientY == event._clientY) { - return; // ignore redundant mouse move events - } - - var dx = event.clientX - this._clientStartX, - dy = event.clientY - this._clientStartY, - w = this._translationWeight; - this._clientX = event.clientX; - this._clientY = event.clientY; - this._translationX = this._translationX * (1 - w) + dx * w; - this._translationY = this._translationY * (1 - w) + dy * w; - this.mouseMove(event); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleMouseUp = function (event) { - var buttonBit = 1 << event.button; - if (buttonBit & this._mouseButtonMask == 0) { - return; // ignore mouse up events for buttons this recognizer does not consider to be down - } - - this._mouseButtonMask &= ~buttonBit; - this.mouseUp(event); - - if (this._mouseButtonMask == 0) { - this.resetIfEventsEnded(); // last button up - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleTouchStart = function (event) { - var touch = new Touch(event.identifier || event.pointerId, event.clientX, event.clientY); // touch events or pointer events - this._touches.push(touch); - - if (this._touches.length == 1) { // first touch - this._clientX = event.clientX; - this._clientY = event.clientY; - this._clientStartX = event.clientX; - this._clientStartY = event.clientY; - this._translationX = 0; - this._translationY = 0; - this._touchCentroidShiftX = 0; - this._touchCentroidShiftY = 0; - } else { - this.touchesAddedOrRemoved(); - } - - this.touchStart(touch); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleTouchMove = function (event) { - var index = this.indexOfTouchWithId(event.identifier || event.pointerId); // touch events or pointer events - if (index == -1) { - return; // ignore events for touches that did not start in this recognizer's target - } - - var touch = this._touches[index]; - if (touch.clientX == event.clientX && touch.clientY == event.clientY) { - return; // ignore redundant touch move events, which we've encountered on Android Chrome - } - - touch.clientX = event.clientX; - touch.clientY = event.clientY; - - var centroid = this.touchCentroid(), - dx = centroid.clientX - this._clientStartX + this._touchCentroidShiftX, - dy = centroid.clientY - this._clientStartY + this._touchCentroidShiftY, - w = this._translationWeight; - this._clientX = centroid.clientX; - this._clientY = centroid.clientY; - this._translationX = this._translationX * (1 - w) + dx * w; - this._translationY = this._translationY * (1 - w) + dy * w; - - this.touchMove(touch); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleTouchCancel = function (event) { - var index = this.indexOfTouchWithId(event.identifier || event.pointerId); // touch events or pointer events - if (index == -1) { - return; // ignore events for touches that did not start in this recognizer's target - } - - var touch = this._touches[index]; - this._touches.splice(index, 1); - this.touchesAddedOrRemoved(); - this.touchCancel(touch); - this.resetIfEventsEnded(); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.handleTouchEnd = function (event) { - var index = this.indexOfTouchWithId(event.identifier || event.pointerId); // touch events or pointer events - if (index == -1) { - return; // ignore events for touches that did not start in this recognizer's target - } - - var touch = this._touches[index]; - this._touches.splice(index, 1); - this.touchesAddedOrRemoved(); - this.touchEnd(touch); - this.resetIfEventsEnded(); -}; - -// Intentionally not documented. -GestureRecognizer.prototype.resetIfEventsEnded = function () { - if (this._state != WorldWind.POSSIBLE && this._mouseButtonMask == 0 && this._touches.length == 0) { - this.reset(); - } -}; - -// Intentionally not documented. -GestureRecognizer.prototype.touchesAddedOrRemoved = function () { - this._touchCentroidShiftX += this._clientX; - this._touchCentroidShiftY += this._clientY; - var centroid = this.touchCentroid(); - this._clientX = centroid.clientX; - this._clientY = centroid.clientY; - this._touchCentroidShiftX -= this._clientX; - this._touchCentroidShiftY -= this._clientY; -}; - -// Intentionally not documented. -GestureRecognizer.prototype.touchCentroid = function () { - var x = 0, - y = 0; - - for (var i = 0, len = this._touches.length; i < len; i++) { - var touch = this._touches[i]; - x += touch.clientX / len; - y += touch.clientY / len; - } - - return { clientX: x, clientY: y }; -}; - -// Intentionally not documented. -GestureRecognizer.prototype.indexOfTouchWithId = function (identifier) { - for (var i = 0, len = this._touches.length; i < len; i++) { - if (this._touches[i].identifier == identifier) { - return i; - } - } - - return -1; -}; - -export default GestureRecognizer; - diff --git a/web/src/gis/gesture/PanRecognizer.js b/web/src/gis/gesture/PanRecognizer.js deleted file mode 100644 index e3ee8455..00000000 --- a/web/src/gis/gesture/PanRecognizer.js +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports PanRecognizer - */ -import GestureRecognizer from '../gesture/GestureRecognizer'; - - -/** - * Constructs a pan gesture recognizer. - * @alias PanRecognizer - * @constructor - * @augments GestureRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for touch panning gestures. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function PanRecognizer(target, callback) { - GestureRecognizer.call(this, target, callback); - - /** - * - * @type {Number} - */ - this.minNumberOfTouches = 1; - - /** - * - * @type {Number} - */ - this.maxNumberOfTouches = Number.MAX_VALUE; - - // Intentionally not documented. - this.interpretDistance = 20; -} - -PanRecognizer.prototype = Object.create(GestureRecognizer.prototype); - -// Documented in superclass. -PanRecognizer.prototype.mouseDown = function (event) { - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; // touch gestures fail upon receiving a mouse event - } -}; - -// Documented in superclass. -PanRecognizer.prototype.touchMove = function (touch) { - if (this.state == WorldWind.POSSIBLE) { - if (this.shouldInterpret()) { - if (this.shouldRecognize()) { - this.state = WorldWind.BEGAN; - } else { - this.state = WorldWind.FAILED; - } - } - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.CHANGED; - } -}; - -// Documented in superclass. -PanRecognizer.prototype.touchEnd = function (touch) { - if (this.touchCount == 0) { // last touch ended - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.ENDED; - } - } -}; - -// Documented in superclass. -PanRecognizer.prototype.touchCancel = function (touch) { - if (this.touchCount == 0) { // last touch cancelled - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.CANCELLED; - } - } -}; - -// Documented in superclass. -PanRecognizer.prototype.prepareToRecognize = function () { - // set translation to zero when the pan begins - this.translationX = 0; - this.translationY = 0; -}; - -/** - * - * @returns {boolean} - * @protected - */ -PanRecognizer.prototype.shouldInterpret = function () { - var dx = this.translationX, - dy = this.translationY, - distance = Math.sqrt(dx * dx + dy * dy); - return distance > this.interpretDistance; // interpret touches when the touch centroid moves far enough -}; - -/** - * - * @returns {boolean} - * @protected - */ -PanRecognizer.prototype.shouldRecognize = function () { - var touchCount = this.touchCount; - return touchCount != 0 - && touchCount >= this.minNumberOfTouches - && touchCount <= this.maxNumberOfTouches; -}; - -export default PanRecognizer; - diff --git a/web/src/gis/gesture/PinchRecognizer.js b/web/src/gis/gesture/PinchRecognizer.js deleted file mode 100644 index 346707b9..00000000 --- a/web/src/gis/gesture/PinchRecognizer.js +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports PinchRecognizer - */ -import GestureRecognizer from '../gesture/GestureRecognizer'; - - -/** - * Constructs a pinch gesture recognizer. - * @alias PinchRecognizer - * @constructor - * @augments GestureRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for two finger pinch gestures. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function PinchRecognizer(target, callback) { - GestureRecognizer.call(this, target, callback); - - // Intentionally not documented. - this._scale = 1; - - // Intentionally not documented. - this._offsetScale = 1; - - // Intentionally not documented. - this.referenceDistance = 0; - - // Intentionally not documented. - this.interpretThreshold = 20; - - // Intentionally not documented. - this.weight = 0.4; - - // Intentionally not documented. - this.pinchTouches = []; -} - -PinchRecognizer.prototype = Object.create(GestureRecognizer.prototype); - -Object.defineProperties(PinchRecognizer.prototype, { - scale: { - get: function () { - return this._scale * this._offsetScale; - } - } -}); - -// Documented in superclass. -PinchRecognizer.prototype.reset = function () { - GestureRecognizer.prototype.reset.call(this); - - this._scale = 1; - this._offsetScale = 1; - this.referenceDistance = 0; - this.pinchTouches = []; -}; - -// Documented in superclass. -PinchRecognizer.prototype.mouseDown = function (event) { - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; // touch gestures fail upon receiving a mouse event - } -}; - -// Documented in superclass. -PinchRecognizer.prototype.touchStart = function (touch) { - if (this.pinchTouches.length < 2) { - if (this.pinchTouches.push(touch) == 2) { - this.referenceDistance = this.currentPinchDistance(); - this._offsetScale *= this._scale; - this._scale = 1; - } - } -}; - -// Documented in superclass. -PinchRecognizer.prototype.touchMove = function (touch) { - if (this.pinchTouches.length == 2) { - if (this.state == WorldWind.POSSIBLE) { - if (this.shouldRecognize()) { - this.state = WorldWind.BEGAN; - } - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - var distance = this.currentPinchDistance(), - newScale = Math.abs(distance / this.referenceDistance), - w = this.weight; - this._scale = this._scale * (1 - w) + newScale * w; - this.state = WorldWind.CHANGED; - } - } -}; - -// Documented in superclass. -PinchRecognizer.prototype.touchEnd = function (touch) { - var index = this.pinchTouches.indexOf(touch); - if (index != -1) { - this.pinchTouches.splice(index, 1); - } - - // Transition to the ended state if this was the last touch. - if (this.touchCount == 0) { // last touch ended - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.ENDED; - } - } -}; - -// Documented in superclass. -PinchRecognizer.prototype.touchCancel = function (touch) { - var index = this.pinchTouches.indexOf(touch); - if (index != -1) { - this.pinchTouches.splice(index, 1); - } - - // Transition to the cancelled state if this was the last touch. - if (this.touchCount == 0) { - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.CANCELLED; - } - } -}; - -// Documented in superclass. -PinchRecognizer.prototype.prepareToRecognize = function () { - this.referenceDistance = this.currentPinchDistance(); - this._scale = 1; -}; - -// Intentionally not documented. -PinchRecognizer.prototype.shouldRecognize = function () { - var distance = this.currentPinchDistance(); - - return Math.abs(distance - this.referenceDistance) > this.interpretThreshold; -}; - -// Intentionally not documented. -PinchRecognizer.prototype.currentPinchDistance = function () { - var touch0 = this.pinchTouches[0], - touch1 = this.pinchTouches[1], - dx = touch0.clientX - touch1.clientX, - dy = touch0.clientY - touch1.clientY; - - return Math.sqrt(dx * dx + dy * dy); -}; - -export default PinchRecognizer; diff --git a/web/src/gis/gesture/RotationRecognizer.js b/web/src/gis/gesture/RotationRecognizer.js deleted file mode 100644 index 6417fff3..00000000 --- a/web/src/gis/gesture/RotationRecognizer.js +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports RotationRecognizer - */ -import Angle from '../geom/Angle'; -import GestureRecognizer from '../gesture/GestureRecognizer'; - - -/** - * Constructs a rotation gesture recognizer. - * @alias RotationRecognizer - * @constructor - * @augments GestureRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for two finger rotation gestures. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function RotationRecognizer(target, callback) { - GestureRecognizer.call(this, target, callback); - - // Intentionally not documented. - this._rotation = 0; - - // Intentionally not documented. - this._offsetRotation = 0; - - // Intentionally not documented. - this.referenceAngle = 0; - - // Intentionally not documented. - this.interpretThreshold = 20; - - // Intentionally not documented. - this.weight = 0.4; - - // Intentionally not documented. - this.rotationTouches = []; -} - -RotationRecognizer.prototype = Object.create(GestureRecognizer.prototype); - -Object.defineProperties(RotationRecognizer.prototype, { - rotation: { - get: function () { - return this._rotation + this._offsetRotation; - } - } -}); - -// Documented in superclass. -RotationRecognizer.prototype.reset = function () { - GestureRecognizer.prototype.reset.call(this); - - this._rotation = 0; - this._offsetRotation = 0; - this.referenceAngle = 0; - this.rotationTouches = []; -}; - -// Documented in superclass. -RotationRecognizer.prototype.mouseDown = function (event) { - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; // touch gestures fail upon receiving a mouse event - } -}; - -// Documented in superclass. -RotationRecognizer.prototype.touchStart = function (touch) { - if (this.rotationTouches.length < 2) { - if (this.rotationTouches.push(touch) == 2) { - this.referenceAngle = this.currentTouchAngle(); - this._offsetRotation += this._rotation; - this._rotation = 0; - } - } -}; - -// Documented in superclass. -RotationRecognizer.prototype.touchMove = function (touch) { - if (this.rotationTouches.length == 2) { - if (this.state == WorldWind.POSSIBLE) { - if (this.shouldRecognize()) { - this.state = WorldWind.BEGAN; - } - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - var angle = this.currentTouchAngle(), - newRotation = Angle.normalizedDegrees(angle - this.referenceAngle), - w = this.weight; - this._rotation = this._rotation * (1 - w) + newRotation * w; - this.state = WorldWind.CHANGED; - } - } -}; - -// Documented in superclass. -RotationRecognizer.prototype.touchEnd = function (touch) { - var index = this.rotationTouches.indexOf(touch); - if (index != -1) { - this.rotationTouches.splice(index, 1); - } - - // Transition to the ended state if this was the last touch. - if (this.touchCount == 0) { // last touch ended - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.ENDED; - } - } -}; - -// Documented in superclass. -RotationRecognizer.prototype.touchCancel = function (touch) { - var index = this.rotationTouches.indexOf(touch); - if (index != -1) { - this.rotationTouches.splice(index, 1); - - // Transition to the cancelled state if this was the last touch. - if (this.touchCount == 0) { - if (this.state == WorldWind.POSSIBLE) { - this.state = WorldWind.FAILED; - } else if (this.state == WorldWind.BEGAN || this.state == WorldWind.CHANGED) { - this.state = WorldWind.CANCELLED; - } - } - } -}; - -// Documented in superclass. -RotationRecognizer.prototype.prepareToRecognize = function () { - this.referenceAngle = this.currentTouchAngle(); - this._rotation = 0; -}; - -// Intentionally not documented. -RotationRecognizer.prototype.shouldRecognize = function () { - var angle = this.currentTouchAngle(), - rotation = Angle.normalizedDegrees(angle - this.referenceAngle); - - return Math.abs(rotation) > this.interpretThreshold; -}; - -// Intentionally not documented. -RotationRecognizer.prototype.currentTouchAngle = function () { - var touch0 = this.rotationTouches[0], - touch1 = this.rotationTouches[1], - dx = touch0.clientX - touch1.clientX, - dy = touch0.clientY - touch1.clientY; - - return Math.atan2(dy, dx) * Angle.RADIANS_TO_DEGREES; -}; - -export default RotationRecognizer; - diff --git a/web/src/gis/gesture/TapRecognizer.js b/web/src/gis/gesture/TapRecognizer.js deleted file mode 100644 index d01c2979..00000000 --- a/web/src/gis/gesture/TapRecognizer.js +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TapRecognizer - */ -import GestureRecognizer from '../gesture/GestureRecognizer'; - - -/** - * Constructs a tap gesture recognizer. - * @alias TapRecognizer - * @constructor - * @augments GestureRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for single or multiple taps. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function TapRecognizer(target, callback) { - GestureRecognizer.call(this, target, callback); - - /** - * - * @type {Number} - */ - this.numberOfTaps = 1; - - /** - * - * @type {Number} - */ - this.numberOfTouches = 1; - - // Intentionally not documented. - this.maxTouchMovement = 20; - - // Intentionally not documented. - this.maxTapDuration = 500; - - // Intentionally not documented. - this.maxTapInterval = 400; - - // Intentionally not documented. - this.taps = []; - - // Intentionally not documented. - this.timeout = null; -} - -TapRecognizer.prototype = Object.create(GestureRecognizer.prototype); - -// Documented in superclass. -TapRecognizer.prototype.reset = function () { - GestureRecognizer.prototype.reset.call(this); - - this.taps = []; - this.cancelFailAfterDelay(); -}; - -// Documented in superclass. -TapRecognizer.prototype.mouseDown = function (event) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - this.state = WorldWind.FAILED; // touch gestures fail upon receiving a mouse event -}; - -// Documented in superclass. -TapRecognizer.prototype.touchStart = function (touch) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - var tap; - - if (this.touchCount > this.numberOfTouches) { - this.state = WorldWind.FAILED; - } else if (this.touchCount == 1) { // first touch started - tap = { - touchCount: this.touchCount, - clientX: this.clientX, - clientY: this.clientY - }; - this.taps.push(tap); - this.failAfterDelay(this.maxTapDuration); // fail if the tap is down too long - } else { - tap = this.taps[this.taps.length - 1]; - tap.touchCount = this.touchCount; // max number of simultaneous touches - tap.clientX = this.clientX; // touch centroid - tap.clientY = this.clientY; - } -}; - -// Documented in superclass. -TapRecognizer.prototype.touchMove = function (touch) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - var dx = this.translationX, - dy = this.translationY, - distance = Math.sqrt(dx * dx + dy * dy); - if (distance > this.maxTouchMovement) { - this.state = WorldWind.FAILED; - } -}; - -// Documented in superclass. -TapRecognizer.prototype.touchEnd = function (touch) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - if (this.touchCount != 0) { - return; // wait until the last touch ends - } - - var tapCount = this.taps.length, - tap = this.taps[tapCount - 1]; - if (tap.touchCount != this.numberOfTouches) { - this.state = WorldWind.FAILED; // wrong number of touches - } else if (tapCount == this.numberOfTaps) { - this.clientX = this.taps[0].clientX; - this.clientY = this.taps[0].clientY; - this.state = WorldWind.RECOGNIZED; - } else { - this.failAfterDelay(this.maxTapInterval); // fail if the interval between taps is too long - } -}; - -// Documented in superclass. -TapRecognizer.prototype.touchCancel = function (touch) { - if (this.state != WorldWind.POSSIBLE) { - return; - } - - this.state = WorldWind.FAILED; -}; - -// Intentionally not documented. -TapRecognizer.prototype.failAfterDelay = function (delay) { - var self = this; - if (self.timeout) { - window.clearTimeout(self.timeout); - } - - self.timeout = window.setTimeout(function () { - self.timeout = null; - if (self.state == WorldWind.POSSIBLE) { - self.state = WorldWind.FAILED; // fail if we haven't already reached a terminal state - } - }, delay); -}; - -// Intentionally not documented. -TapRecognizer.prototype.cancelFailAfterDelay = function () { - var self = this; - if (self.timeout) { - window.clearTimeout(self.timeout); - self.timeout = null; - } -}; - -export default TapRecognizer; - diff --git a/web/src/gis/gesture/TiltRecognizer.js b/web/src/gis/gesture/TiltRecognizer.js deleted file mode 100644 index 8ff01aff..00000000 --- a/web/src/gis/gesture/TiltRecognizer.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TiltRecognizer - */ -import PanRecognizer from '../gesture/PanRecognizer'; - - -/** - * Constructs a tilt gesture recognizer. - * @alias TiltRecognizer - * @constructor - * @augments PanRecognizer - * @classdesc A concrete gesture recognizer subclass that looks for two finger tilt gestures. - * @param {EventTarget} target The document element this gesture recognizer observes for mouse and touch events. - * @param {Function} callback An optional function to call when this gesture is recognized. If non-null, the - * function is called when this gesture is recognized, and is passed a single argument: this gesture recognizer, - * e.g., <code>gestureCallback(recognizer)</code>. - * @throws {ArgumentError} If the specified target is null or undefined. - */ -function TiltRecognizer(target, callback) { - PanRecognizer.call(this, target, callback); - - // Intentionally not documented. - this.maxTouchDistance = 250; - - // Intentionally not documented. - this.maxTouchDivergence = 50; -} - -// Intentionally not documented. -TiltRecognizer.LEFT = 1 << 0; - -// Intentionally not documented. -TiltRecognizer.RIGHT = 1 << 1; - -// Intentionally not documented. -TiltRecognizer.UP = 1 << 2; - -// Intentionally not documented. -TiltRecognizer.DOWN = 1 << 3; - -TiltRecognizer.prototype = Object.create(PanRecognizer.prototype); - -// Documented in superclass. -TiltRecognizer.prototype.shouldInterpret = function () { - for (var i = 0, count = this.touchCount; i < count; i++) { - var touch = this.touch(i), - dx = touch.translationX, - dy = touch.translationY, - distance = Math.sqrt(dx * dx + dy * dy); - if (distance > this.interpretDistance) { - return true; // interpret touches when any touch moves far enough - } - } - - return false; -}; - -// Documented in superclass. -TiltRecognizer.prototype.shouldRecognize = function () { - var touchCount = this.touchCount; - if (touchCount < 2) { - return false; - } - - var touch0 = this.touch(0), - touch1 = this.touch(1), - dx = touch0.clientX - touch1.clientX, - dy = touch0.clientY - touch1.clientY, - distance = Math.sqrt(dx * dx + dy * dy); - if (distance > this.maxTouchDistance) { - return false; // touches must be close together - } - - var tx = touch0.translationX - touch1.translationX, - ty = touch0.translationY - touch1.translationY, - divergence = Math.sqrt(tx * tx + ty * ty); - if (divergence > this.maxTouchDivergence) { - return false; // touches must be moving in a mostly parallel direction - } - - var verticalMask = TiltRecognizer.UP | TiltRecognizer.DOWN, - dirMask0 = this.touchDirection(touch0) & verticalMask, - dirMask1 = this.touchDirection(touch1) & verticalMask; - return (dirMask0 & dirMask1) != 0; // touches must move in the same vertical direction -}; - -// Intentionally not documented. -TiltRecognizer.prototype.touchDirection = function (touch) { - var dx = touch.translationX, - dy = touch.translationY, - dirMask = 0; - - if (Math.abs(dx) > Math.abs(dy)) { - dirMask |= dx < 0 ? TiltRecognizer.LEFT : 0; - dirMask |= dx > 0 ? TiltRecognizer.RIGHT : 0; - } else { - dirMask |= dy < 0 ? TiltRecognizer.UP : 0; - dirMask |= dy > 0 ? TiltRecognizer.DOWN : 0; - } - - return dirMask; -}; - -export default TiltRecognizer; diff --git a/web/src/gis/gesture/Touch.js b/web/src/gis/gesture/Touch.js deleted file mode 100644 index 572d7084..00000000 --- a/web/src/gis/gesture/Touch.js +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Touch - */ - - - -/** - * Constructs a touch point. - * @alias Touch - * @constructor - * @classdesc Represents a touch point. - * @param {Color} identifier A number uniquely identifying the touch point - * @param {Number} clientX The X coordinate of the touch point's location. - * @param {Number} clientY The Y coordinate of the touch point's location. - */ -function Touch(identifier, clientX, clientY) { - - /** - * A number uniquely identifying this touch point. - * @type {Number} - * @readonly - */ - this.identifier = identifier; - - // Intentionally not documented. - this._clientX = clientX; - - // Intentionally not documented. - this._clientY = clientY; - - // Intentionally not documented. - this._clientStartX = clientX; - - // Intentionally not documented. - this._clientStartY = clientY; -} - -Object.defineProperties(Touch.prototype, { - /** - * Indicates the X coordinate of this touch point's location. - * @type {Number} - * @memberof Touch.prototype - */ - clientX: { - get: function () { - return this._clientX; - }, - set: function (value) { - this._clientX = value; - } - }, - - /** - * Indicates the Y coordinate of this touch point's location. - * @type {Number} - * @memberof Touch.prototype - */ - clientY: { - get: function () { - return this._clientY; - }, - set: function (value) { - this._clientY = value; - } - }, - - /** - * Indicates this touch point's translation along the X axis since the touch started. - * @type {Number} - * @memberof Touch.prototype - */ - translationX: { - get: function () { - return this._clientX - this._clientStartX; - }, - set: function (value) { - this._clientStartX = this._clientX - value; - } - }, - - /** - * Indicates this touch point's translation along the Y axis since the touch started. - * @type {Number} - * @memberof Touch.prototype - */ - translationY: { - get: function () { - return this._clientY - this._clientStartY; - }, - set: function (value) { - this._clientStartY = this._clientY - value; - } - } -}); - -export default Touch; diff --git a/web/src/gis/globe/ArcgisElevationCoverage.js b/web/src/gis/globe/ArcgisElevationCoverage.js deleted file mode 100644 index 4e1cfbda..00000000 --- a/web/src/gis/globe/ArcgisElevationCoverage.js +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ArcgisElevationCoverage - */ -import Sector from '../geom/Sector'; -import TiledElevationCoverage from '../globe/TiledElevationCoverage'; -import WmsUrlBuilder from '../util/WmsUrlBuilder'; -import ElevationImage from './ElevationImage'; -import Logger from '../util/Logger'; -import WWMath from '../util/WWMath'; -import ArcgisElevationWorker from 'worker!./ArcgisElevationWorker.js'; - -/** - * Constructs an Earth elevation coverage using Arcgis data. - * @alias ArcgisElevationCoverage - * @constructor - * @augments TiledElevationCoverage - * @classdesc Provides elevations for Earth. Elevations are drawn from the NASA WorldWind elevation service. - */ -function ArcgisElevationCoverage() { - // see: http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer - TiledElevationCoverage.call(this, { - coverageSector: new Sector(-WWMath.MAX_LAT, WWMath.MAX_LAT, -180, 180), - resolution: 360 / 2 ** 16 / 256, - retrievalImageFormat: "application/bil16", - minElevation: -450, - maxElevation: 8700, - urlBuilder: new WmsUrlBuilder("http://localhost:2020/api/Map/Elev", "WorldElevation3D", "", "1.3.0") - }); - - this.displayName = "Arcgis Elevation Coverage"; - - this.worker = new ArcgisElevationWorker(); - this.worker.onmessage = this.handleMessage.bind(this); -} - -ArcgisElevationCoverage.prototype = Object.create(TiledElevationCoverage.prototype); - -ArcgisElevationCoverage.prototype.retrieveTileImage = function (tile) { - if (this.currentRetrievals.indexOf(tile.tileKey) < 0) { - if (this.currentRetrievals.length > this.retrievalQueueSize) { - return; - } - - this.worker.postMessage({ - tileKey: tile.tileKey, - x: tile.column, - y: tile.row, - z: tile.level.levelNumber - }); - - this.currentRetrievals.push(tile.tileKey); - } -}; - -ArcgisElevationCoverage.prototype.handleMessage = function (evt) { - let { result, tileKey, url, data, msg } = evt.data; - this.removeFromCurrentRetrievals(tileKey); - let tile = this.tileCache.entryForKey(tileKey); - if (!tile) { - // tile has been released - return; - } - if (result === 'success') { - Logger.log(Logger.LEVEL_INFO, "Elevations retrieval succeeded: " + url); - this.loadElevationImage(tile, data); - this.absentResourceList.unmarkResourceAbsent(tileKey); - - // Send an event to request a redraw. - var e = document.createEvent('Event'); - e.initEvent(WorldWind.REDRAW_EVENT_TYPE, true, true); - window.dispatchEvent(e); - } else if (result === 'fail') { - this.absentResourceList.markResourceAbsent(tileKey); - Logger.log(Logger.LEVEL_WARNING, - "Elevations retrieval failed (" + msg + "): " + url); - } else if (result === 'error') { - this.absentResourceList.markResourceAbsent(tileKey); - Logger.log(Logger.LEVEL_WARNING, "Elevations retrieval failed: " + url); - } else if (result === 'timeout') { - this.absentResourceList.markResourceAbsent(tileKey); - Logger.log(Logger.LEVEL_WARNING, "Elevations retrieval timed out: " + url); - } -}; - -// Intentionally not documented. -ArcgisElevationCoverage.prototype.loadElevationImage = function (tile, data) { - var elevationImage = new ElevationImage(tile.sector, data.width, data.height); - - elevationImage.imageData = data.pixelData; - elevationImage.size = elevationImage.imageData.length * 4; - - if (elevationImage.imageData) { - elevationImage.findMinAndMaxElevation(); - this.imageCache.putEntry(tile.tileKey, elevationImage, elevationImage.size); - this.timestamp = Date.now(); - } -}; - -export default ArcgisElevationCoverage; diff --git a/web/src/gis/globe/ArcgisElevationWorker.js b/web/src/gis/globe/ArcgisElevationWorker.js deleted file mode 100644 index 30e596b2..00000000 --- a/web/src/gis/globe/ArcgisElevationWorker.js +++ /dev/null @@ -1,2219 +0,0 @@ -/* jshint forin: false, bitwise: false */ -/* -Copyright 2015-2019 Esri - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -A copy of the license and additional notices are located with the -source distribution at: - -http://github.com/Esri/lerc/ - -Contributors: Johannes Schmid, (LERC v1) - Chayanika Khatua, (LERC v1) - Wenxue Ju (LERC v1, v2.x) -*/ - -/* Copyright 2015-2019 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */ - -/** - * a module for decoding LERC blobs - * @module Lerc - */ -//the original LercDecode for Version 1 -var LercDecode = (function () { - - // WARNING: This decoder version can only read old version 1 Lerc blobs. Use with caution. - - // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of - // the class was chosen to be future proof. - - var CntZImage = {}; - - CntZImage.defaultNoDataValue = -3.4027999387901484e+38; // smallest Float32 value - - /** - * Decode a LERC byte stream and return an object containing the pixel data and some required and optional - * information about it, such as the image's width and height. - * - * @param {ArrayBuffer} input The LERC input byte stream - * @param {object} [options] Decoding options, containing any of the following properties: - * @config {number} [inputOffset = 0] - * Skip the first inputOffset bytes of the input byte stream. A valid LERC file is expected at that position. - * @config {Uint8Array} [encodedMask = null] - * If specified, the decoder will not read mask information from the input and use the specified encoded - * mask data instead. Mask header/data must not be present in the LERC byte stream in this case. - * @config {number} [noDataValue = LercCode.defaultNoDataValue] - * Pixel value to use for masked pixels. - * @config {ArrayBufferView|Array} [pixelType = Float32Array] - * The desired type of the pixelData array in the return value. Note that it is the caller's responsibility to - * provide an appropriate noDataValue if the default pixelType is overridden. - * @config {boolean} [returnMask = false] - * If true, the return value will contain a maskData property of type Uint8Array which has one element per - * pixel, the value of which is 1 or 0 depending on whether that pixel's data is present or masked. If the - * input LERC data does not contain a mask, maskData will not be returned. - * @config {boolean} [returnEncodedMask = false] - * If true, the return value will contain a encodedMaskData property, which can be passed into encode() as - * encodedMask. - * @config {boolean} [returnFileInfo = false] - * If true, the return value will have a fileInfo property that contains metadata obtained from the - * LERC headers and the decoding process. - * @config {boolean} [computeUsedBitDepths = false] - * If true, the fileInfo property in the return value will contain the set of all block bit depths - * encountered during decoding. Will only have an effect if returnFileInfo option is true. - * @returns {{width, height, pixelData, minValue, maxValue, noDataValue, maskData, encodedMaskData, fileInfo}} - */ - CntZImage.decode = function (input, options) { - options = options || {}; - - var skipMask = options.encodedMaskData || options.encodedMaskData === null; - var parsedData = parse(input, options.inputOffset || 0, skipMask); - - var noDataValue = options.noDataValue !== null ? options.noDataValue : CntZImage.defaultNoDataValue; - - var uncompressedData = uncompressPixelValues(parsedData, options.pixelType || Float32Array, - options.encodedMaskData, noDataValue, options.returnMask); - - var result = { - width: parsedData.width, - height: parsedData.height, - pixelData: uncompressedData.resultPixels, - minValue: uncompressedData.minValue, - maxValue: parsedData.pixels.maxValue, - noDataValue: noDataValue - }; - - if (uncompressedData.resultMask) { - result.maskData = uncompressedData.resultMask; - } - - if (options.returnEncodedMask && parsedData.mask) { - result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null; - } - - if (options.returnFileInfo) { - result.fileInfo = formatFileInfo(parsedData); - if (options.computeUsedBitDepths) { - result.fileInfo.bitDepths = computeUsedBitDepths(parsedData); - } - } - - return result; - }; - - var uncompressPixelValues = function (data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) { - var blockIdx = 0; - var numX = data.pixels.numBlocksX; - var numY = data.pixels.numBlocksY; - var blockWidth = Math.floor(data.width / numX); - var blockHeight = Math.floor(data.height / numY); - var scale = 2 * data.maxZError; - var minValue = Number.MAX_VALUE, currentValue; - maskBitset = maskBitset || (data.mask ? data.mask.bitset : null); - - var resultPixels, resultMask; - resultPixels = new TypedArrayClass(data.width * data.height); - if (storeDecodedMask && maskBitset) { - resultMask = new Uint8Array(data.width * data.height); - } - var blockDataBuffer = new Float32Array(blockWidth * blockHeight); - - var xx, yy; - for (var y = 0; y <= numY; y++) { - var thisBlockHeight = y !== numY ? blockHeight : data.height % numY; - if (thisBlockHeight === 0) { - continue; - } - for (var x = 0; x <= numX; x++) { - var thisBlockWidth = x !== numX ? blockWidth : data.width % numX; - if (thisBlockWidth === 0) { - continue; - } - - var outPtr = y * data.width * blockHeight + x * blockWidth; - var outStride = data.width - thisBlockWidth; - - var block = data.pixels.blocks[blockIdx]; - - var blockData, blockPtr, constValue; - if (block.encoding < 2) { - // block is either uncompressed or bit-stuffed (encodings 0 and 1) - if (block.encoding === 0) { - // block is uncompressed - blockData = block.rawData; - } else { - // block is bit-stuffed - unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue); - blockData = blockDataBuffer; - } - blockPtr = 0; - } - else if (block.encoding === 2) { - // block is all 0 - constValue = 0; - } - else { - // block has constant value (encoding === 3) - constValue = block.offset; - } - - var maskByte; - if (maskBitset) { - for (yy = 0; yy < thisBlockHeight; yy++) { - if (outPtr & 7) { - // - maskByte = maskBitset[outPtr >> 3]; - maskByte <<= outPtr & 7; - } - for (xx = 0; xx < thisBlockWidth; xx++) { - if (!(outPtr & 7)) { - // read next byte from mask - maskByte = maskBitset[outPtr >> 3]; - } - if (maskByte & 128) { - // pixel data present - if (resultMask) { - resultMask[outPtr] = 1; - } - currentValue = block.encoding < 2 ? blockData[blockPtr++] : constValue; - minValue = minValue > currentValue ? currentValue : minValue; - resultPixels[outPtr++] = currentValue; - } else { - // pixel data not present - if (resultMask) { - resultMask[outPtr] = 0; - } - resultPixels[outPtr++] = noDataValue; - } - maskByte <<= 1; - } - outPtr += outStride; - } - } else { - // mask not present, simply copy block over - if (block.encoding < 2) { - // duplicating this code block for performance reasons - // blockData case: - for (yy = 0; yy < thisBlockHeight; yy++) { - for (xx = 0; xx < thisBlockWidth; xx++) { - currentValue = blockData[blockPtr++]; - minValue = minValue > currentValue ? currentValue : minValue; - resultPixels[outPtr++] = currentValue; - } - outPtr += outStride; - } - } - else { - // constValue case: - minValue = minValue > constValue ? constValue : minValue; - for (yy = 0; yy < thisBlockHeight; yy++) { - for (xx = 0; xx < thisBlockWidth; xx++) { - resultPixels[outPtr++] = constValue; - } - outPtr += outStride; - } - } - } - if (block.encoding === 1 && blockPtr !== block.numValidPixels) { - throw "Block and Mask do not match"; - } - blockIdx++; - } - } - - return { - resultPixels: resultPixels, - resultMask: resultMask, - minValue: minValue - }; - }; - - var formatFileInfo = function (data) { - return { - "fileIdentifierString": data.fileIdentifierString, - "fileVersion": data.fileVersion, - "imageType": data.imageType, - "height": data.height, - "width": data.width, - "maxZError": data.maxZError, - "eofOffset": data.eofOffset, - "mask": data.mask ? { - "numBlocksX": data.mask.numBlocksX, - "numBlocksY": data.mask.numBlocksY, - "numBytes": data.mask.numBytes, - "maxValue": data.mask.maxValue - } : null, - "pixels": { - "numBlocksX": data.pixels.numBlocksX, - "numBlocksY": data.pixels.numBlocksY, - "numBytes": data.pixels.numBytes, - "maxValue": data.pixels.maxValue, - "noDataValue": data.noDataValue - } - }; - }; - - var computeUsedBitDepths = function (data) { - var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY; - var bitDepths = {}; - for (var i = 0; i < numBlocks; i++) { - var block = data.pixels.blocks[i]; - if (block.encoding === 0) { - bitDepths.float32 = true; - } else if (block.encoding === 1) { - bitDepths[block.bitsPerPixel] = true; - } else { - bitDepths[0] = true; - } - } - - return Object.keys(bitDepths); - }; - - var parse = function (input, fp, skipMask) { - var data = {}; - - // File header - var fileIdView = new Uint8Array(input, fp, 10); - data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView); - if (data.fileIdentifierString.trim() !== "CntZImage") { - throw "Unexpected file identifier string: " + data.fileIdentifierString; - } - fp += 10; - var view = new DataView(input, fp, 24); - data.fileVersion = view.getInt32(0, true); - data.imageType = view.getInt32(4, true); - data.height = view.getUint32(8, true); - data.width = view.getUint32(12, true); - data.maxZError = view.getFloat64(16, true); - fp += 24; - - // Mask Header - if (!skipMask) { - view = new DataView(input, fp, 16); - data.mask = {}; - data.mask.numBlocksY = view.getUint32(0, true); - data.mask.numBlocksX = view.getUint32(4, true); - data.mask.numBytes = view.getUint32(8, true); - data.mask.maxValue = view.getFloat32(12, true); - fp += 16; - - // Mask Data - if (data.mask.numBytes > 0) { - var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8)); - view = new DataView(input, fp, data.mask.numBytes); - var cnt = view.getInt16(0, true); - var ip = 2, op = 0; - do { - if (cnt > 0) { - while (cnt--) { bitset[op++] = view.getUint8(ip++); } - } else { - var val = view.getUint8(ip++); - cnt = -cnt; - while (cnt--) { bitset[op++] = val; } - } - cnt = view.getInt16(ip, true); - ip += 2; - } while (ip < data.mask.numBytes); - if (cnt !== -32768 || op < bitset.length) { - throw "Unexpected end of mask RLE encoding"; - } - data.mask.bitset = bitset; - fp += data.mask.numBytes; - } - else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) { // Special case, all nodata - data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8)); - } - } - - // Pixel Header - view = new DataView(input, fp, 16); - data.pixels = {}; - data.pixels.numBlocksY = view.getUint32(0, true); - data.pixels.numBlocksX = view.getUint32(4, true); - data.pixels.numBytes = view.getUint32(8, true); - data.pixels.maxValue = view.getFloat32(12, true); - fp += 16; - - var numBlocksX = data.pixels.numBlocksX; - var numBlocksY = data.pixels.numBlocksY; - // the number of blocks specified in the header does not take into account the blocks at the end of - // each row/column with a special width/height that make the image complete in case the width is not - // evenly divisible by the number of blocks. - var actualNumBlocksX = numBlocksX + (data.width % numBlocksX > 0 ? 1 : 0); - var actualNumBlocksY = numBlocksY + (data.height % numBlocksY > 0 ? 1 : 0); - data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY); - var blockI = 0; - for (var blockY = 0; blockY < actualNumBlocksY; blockY++) { - for (var blockX = 0; blockX < actualNumBlocksX; blockX++) { - - // Block - var size = 0; - var bytesLeft = input.byteLength - fp; - view = new DataView(input, fp, Math.min(10, bytesLeft)); - var block = {}; - data.pixels.blocks[blockI++] = block; - var headerByte = view.getUint8(0); size++; - block.encoding = headerByte & 63; - if (block.encoding > 3) { - throw "Invalid block encoding (" + block.encoding + ")"; - } - if (block.encoding === 2) { - fp++; - continue; - } - if (headerByte !== 0 && headerByte !== 2) { - headerByte >>= 6; - block.offsetType = headerByte; - if (headerByte === 2) { - block.offset = view.getInt8(1); size++; - } else if (headerByte === 1) { - block.offset = view.getInt16(1, true); size += 2; - } else if (headerByte === 0) { - block.offset = view.getFloat32(1, true); size += 4; - } else { - throw "Invalid block offset type"; - } - - if (block.encoding === 1) { - headerByte = view.getUint8(size); size++; - block.bitsPerPixel = headerByte & 63; - headerByte >>= 6; - block.numValidPixelsType = headerByte; - if (headerByte === 2) { - block.numValidPixels = view.getUint8(size); size++; - } else if (headerByte === 1) { - block.numValidPixels = view.getUint16(size, true); size += 2; - } else if (headerByte === 0) { - block.numValidPixels = view.getUint32(size, true); size += 4; - } else { - throw "Invalid valid pixel count type"; - } - } - } - fp += size; - - if (block.encoding === 3) { - continue; - } - - var arrayBuf, store8; - if (block.encoding === 0) { - var numPixels = (data.pixels.numBytes - 1) / 4; - if (numPixels !== Math.floor(numPixels)) { - throw "uncompressed block has invalid length"; - } - arrayBuf = new ArrayBuffer(numPixels * 4); - store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, fp, numPixels * 4)); - var rawData = new Float32Array(arrayBuf); - block.rawData = rawData; - fp += numPixels * 4; - } else if (block.encoding === 1) { - var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8); - var dataWords = Math.ceil(dataBytes / 4); - arrayBuf = new ArrayBuffer(dataWords * 4); - store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, fp, dataBytes)); - block.stuffedData = new Uint32Array(arrayBuf); - fp += dataBytes; - } - } - } - data.eofOffset = fp; - return data; - }; - - var unstuff = function (src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o; - var bitsLeft = 0; - var n, buffer; - var nmax = Math.ceil((maxValue - offset) / scale); - // get rid of trailing bytes that are already part of next block - var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); - src[src.length - 1] <<= 8 * numInvalidTailBytes; - - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - } - if (bitsLeft >= bitsPerPixel) { - n = buffer >>> bitsLeft - bitsPerPixel & bitMask; - bitsLeft -= bitsPerPixel; - } else { - var missingBits = bitsPerPixel - bitsLeft; - n = (buffer & bitMask) << missingBits & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n += buffer >>> bitsLeft; - } - //pixel values may exceed max due to quantization - dest[o] = n < nmax ? offset + n * scale : maxValue; - } - return dest; - }; - - return CntZImage; -})(); - -//version 2. Supports 2.1, 2.2, 2.3 -var Lerc2Decode = (function () { - "use strict"; - // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of - // the class was chosen to be future proof, following LercDecode. - - /***************************************** - * private static class bitsutffer used by Lerc2Decode - *******************************************/ - var BitStuffer = { - //methods ending with 2 are for the new byte order used by Lerc2.3 and above. - //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons. - unstuff: function (src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o; - var bitsLeft = 0; - var n, buffer, missingBits, nmax; - - // get rid of trailing bytes that are already part of next block - var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); - src[src.length - 1] <<= 8 * numInvalidTailBytes; - if (lutArr) { - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - } - if (bitsLeft >= bitsPerPixel) { - n = buffer >>> bitsLeft - bitsPerPixel & bitMask; - bitsLeft -= bitsPerPixel; - } - else { - missingBits = bitsPerPixel - bitsLeft; - n = (buffer & bitMask) << missingBits & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n += buffer >>> bitsLeft; - } - dest[o] = lutArr[n];//offset + lutArr[n] * scale; - } - } - else { - nmax = Math.ceil((maxValue - offset) / scale); - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - } - if (bitsLeft >= bitsPerPixel) { - n = buffer >>> bitsLeft - bitsPerPixel & bitMask; - bitsLeft -= bitsPerPixel; - } - else { - missingBits = bitsPerPixel - bitsLeft; - n = (buffer & bitMask) << missingBits & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n += buffer >>> bitsLeft; - } - //pixel values may exceed max due to quantization - dest[o] = n < nmax ? offset + n * scale : maxValue; - } - } - }, - - unstuffLUT: function (src, bitsPerPixel, numPixels, offset, scale, maxValue) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0; - var buffer; - var dest = []; - - // get rid of trailing bytes that are already part of next block - var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); - src[src.length - 1] <<= 8 * numInvalidTailBytes; - - var nmax = Math.ceil((maxValue - offset) / scale); - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - } - if (bitsLeft >= bitsPerPixel) { - n = buffer >>> bitsLeft - bitsPerPixel & bitMask; - bitsLeft -= bitsPerPixel; - } else { - missingBits = bitsPerPixel - bitsLeft; - n = (buffer & bitMask) << missingBits & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n += buffer >>> bitsLeft; - } - //dest.push(n); - dest[o] = n < nmax ? offset + n * scale : maxValue; - } - dest.unshift(offset);//1st one - return dest; - }, - - unstuff2: function (src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o; - var bitsLeft = 0, bitPos = 0; - var n, buffer, missingBits; - if (lutArr) { - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - bitPos = 0; - } - if (bitsLeft >= bitsPerPixel) { - n = buffer >>> bitPos & bitMask; - bitsLeft -= bitsPerPixel; - bitPos += bitsPerPixel; - } else { - missingBits = bitsPerPixel - bitsLeft; - n = buffer >>> bitPos & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; - bitPos = missingBits; - } - dest[o] = lutArr[n]; - } - } - else { - var nmax = Math.ceil((maxValue - offset) / scale); - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - bitPos = 0; - } - if (bitsLeft >= bitsPerPixel) { - //no unsigned left shift - n = buffer >>> bitPos & bitMask; - bitsLeft -= bitsPerPixel; - bitPos += bitsPerPixel; - } else { - missingBits = bitsPerPixel - bitsLeft; - n = buffer >>> bitPos & bitMask;//((buffer & bitMask) << missingBits) & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; - bitPos = missingBits; - } - //pixel values may exceed max due to quantization - dest[o] = n < nmax ? offset + n * scale : maxValue; - } - } - return dest; - }, - - unstuffLUT2: function (src, bitsPerPixel, numPixels, offset, scale, maxValue) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0; - var buffer; - var dest = []; - var nmax = Math.ceil((maxValue - offset) / scale); - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - bitPos = 0; - } - if (bitsLeft >= bitsPerPixel) { - //no unsigned left shift - n = buffer >>> bitPos & bitMask; - bitsLeft -= bitsPerPixel; - bitPos += bitsPerPixel; - } else { - missingBits = bitsPerPixel - bitsLeft; - n = buffer >>> bitPos & bitMask;//((buffer & bitMask) << missingBits) & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; - bitPos = missingBits; - } - //dest.push(n); - dest[o] = n < nmax ? offset + n * scale : maxValue; - } - dest.unshift(offset); - return dest; - }, - - originalUnstuff: function (src, dest, bitsPerPixel, numPixels) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o; - var bitsLeft = 0; - var n, buffer, missingBits; - - // get rid of trailing bytes that are already part of next block - var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8); - src[src.length - 1] <<= 8 * numInvalidTailBytes; - - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - } - if (bitsLeft >= bitsPerPixel) { - n = buffer >>> bitsLeft - bitsPerPixel & bitMask; - bitsLeft -= bitsPerPixel; - } - else { - missingBits = bitsPerPixel - bitsLeft; - n = (buffer & bitMask) << missingBits & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n += buffer >>> bitsLeft; - } - dest[o] = n; - } - return dest; - }, - - originalUnstuff2: function (src, dest, bitsPerPixel, numPixels) { - var bitMask = (1 << bitsPerPixel) - 1; - var i = 0, o; - var bitsLeft = 0, bitPos = 0; - var n, buffer, missingBits; - //micro-optimizations - for (o = 0; o < numPixels; o++) { - if (bitsLeft === 0) { - buffer = src[i++]; - bitsLeft = 32; - bitPos = 0; - } - if (bitsLeft >= bitsPerPixel) { - //no unsigned left shift - n = buffer >>> bitPos & bitMask; - bitsLeft -= bitsPerPixel; - bitPos += bitsPerPixel; - } else { - missingBits = bitsPerPixel - bitsLeft; - n = buffer >>> bitPos & bitMask;//((buffer & bitMask) << missingBits) & bitMask; - buffer = src[i++]; - bitsLeft = 32 - missingBits; - n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits; - bitPos = missingBits; - } - dest[o] = n; - } - return dest; - } - }; - - /***************************************** - *private static class used by Lerc2Decode - ******************************************/ - var Lerc2Helpers = { - HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, treat it like constant - computeChecksumFletcher32: function (input) { - - var sum1 = 0xffff, sum2 = 0xffff; - var len = input.length; - var words = Math.floor(len / 2); - var i = 0; - while (words) { - var tlen = words >= 359 ? 359 : words; - words -= tlen; - do { - sum1 += input[i++] << 8; - sum2 += sum1 += input[i++]; - } while (--tlen); - - sum1 = (sum1 & 0xffff) + (sum1 >>> 16); - sum2 = (sum2 & 0xffff) + (sum2 >>> 16); - } - - // add the straggler byte if it exists - if (len & 1) { - sum2 += sum1 += input[i] << 8; - } - // second reduction step to reduce sums to 16 bits - sum1 = (sum1 & 0xffff) + (sum1 >>> 16); - sum2 = (sum2 & 0xffff) + (sum2 >>> 16); - - return (sum2 << 16 | sum1) >>> 0; - }, - - readHeaderInfo: function (input, data) { - var ptr = data.ptr; - var fileIdView = new Uint8Array(input, ptr, 6); - var headerInfo = {}; - headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView); - if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) { - throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString; - } - ptr += 6; - var view = new DataView(input, ptr, 8); - var fileVersion = view.getInt32(0, true); - headerInfo.fileVersion = fileVersion; - ptr += 4; - if (fileVersion >= 3) { - headerInfo.checksum = view.getUint32(4, true); //nrows - ptr += 4; - } - - //keys start from here - view = new DataView(input, ptr, 12); - headerInfo.height = view.getUint32(0, true); //nrows - headerInfo.width = view.getUint32(4, true); //ncols - ptr += 8; - if (fileVersion >= 4) { - headerInfo.numDims = view.getUint32(8, true); - ptr += 4; - } - else { - headerInfo.numDims = 1; - } - - view = new DataView(input, ptr, 40); - headerInfo.numValidPixel = view.getUint32(0, true); - headerInfo.microBlockSize = view.getInt32(4, true); - headerInfo.blobSize = view.getInt32(8, true); - headerInfo.imageType = view.getInt32(12, true); - - headerInfo.maxZError = view.getFloat64(16, true); - headerInfo.zMin = view.getFloat64(24, true); - headerInfo.zMax = view.getFloat64(32, true); - ptr += 40; - data.headerInfo = headerInfo; - data.ptr = ptr; - - var checksum, keyLength; - if (fileVersion >= 3) { - keyLength = fileVersion >= 4 ? 52 : 48; - checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14)); - if (checksum !== headerInfo.checksum) { - throw "Checksum failed."; - } - } - return true; - }, - - checkMinMaxRanges: function (input, data) { - var headerInfo = data.headerInfo; - var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType); - var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType); - var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes); - var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes); - data.ptr += 2 * rangeBytes; - var i, equal = true; - for (i = 0; i < headerInfo.numDims; i++) { - if (minValues[i] !== maxValues[i]) { - equal = false; - break; - } - } - headerInfo.minValues = minValues; - headerInfo.maxValues = maxValues; - return equal; - }, - - readSubArray: function (input, ptr, OutPixelTypeArray, numBytes) { - var rawData; - if (OutPixelTypeArray === Uint8Array) { - rawData = new Uint8Array(input, ptr, numBytes); - } - else { - var arrayBuf = new ArrayBuffer(numBytes); - var store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, ptr, numBytes)); - rawData = new OutPixelTypeArray(arrayBuf); - } - return rawData; - }, - - readMask: function (input, data) { - var ptr = data.ptr; - var headerInfo = data.headerInfo; - var numPixels = headerInfo.width * headerInfo.height; - var numValidPixel = headerInfo.numValidPixel; - - var view = new DataView(input, ptr, 4); - var mask = {}; - mask.numBytes = view.getUint32(0, true); - ptr += 4; - - // Mask Data - if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) { - throw "invalid mask"; - } - var bitset, resultMask; - if (numValidPixel === 0) { - bitset = new Uint8Array(Math.ceil(numPixels / 8)); - mask.bitset = bitset; - resultMask = new Uint8Array(numPixels); - data.pixels.resultMask = resultMask; - ptr += mask.numBytes; - }// ????? else if (data.mask.numBytes > 0 && data.mask.numBytes< data.numValidPixel) { - else if (mask.numBytes > 0) { - bitset = new Uint8Array(Math.ceil(numPixels / 8)); - view = new DataView(input, ptr, mask.numBytes); - var cnt = view.getInt16(0, true); - var ip = 2, op = 0, val = 0; - do { - if (cnt > 0) { - while (cnt--) { bitset[op++] = view.getUint8(ip++); } - } else { - val = view.getUint8(ip++); - cnt = -cnt; - while (cnt--) { bitset[op++] = val; } - } - cnt = view.getInt16(ip, true); - ip += 2; - } while (ip < mask.numBytes); - if (cnt !== -32768 || op < bitset.length) { - throw "Unexpected end of mask RLE encoding"; - } - - resultMask = new Uint8Array(numPixels); - var mb = 0, k = 0; - - for (k = 0; k < numPixels; k++) { - if (k & 7) { - mb = bitset[k >> 3]; - mb <<= k & 7; - } - else { - mb = bitset[k >> 3]; - } - if (mb & 128) { - resultMask[k] = 1; - } - } - data.pixels.resultMask = resultMask; - - mask.bitset = bitset; - ptr += mask.numBytes; - } - data.ptr = ptr; - data.mask = mask; - return true; - }, - - readDataOneSweep: function (input, data, OutPixelTypeArray) { - var ptr = data.ptr; - var headerInfo = data.headerInfo; - var numDims = headerInfo.numDims; - var numPixels = headerInfo.width * headerInfo.height; - var imageType = headerInfo.imageType; - var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims; - //data.pixels.numBytes = numBytes; - var rawData; - var mask = data.pixels.resultMask; - if (OutPixelTypeArray === Uint8Array) { - rawData = new Uint8Array(input, ptr, numBytes); - } - else { - var arrayBuf = new ArrayBuffer(numBytes); - var store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, ptr, numBytes)); - rawData = new OutPixelTypeArray(arrayBuf); - } - if (rawData.length === numPixels * numDims) { - data.pixels.resultPixels = rawData; - } - else //mask - { - data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims); - var z = 0, k = 0, i = 0, nStart = 0; - if (numDims > 1) { - for (i = 0; i < numDims; i++) { - nStart = i * numPixels; - for (k = 0; k < numPixels; k++) { - if (mask[k]) { - data.pixels.resultPixels[nStart + k] = rawData[z++]; - } - } - } - } - else { - for (k = 0; k < numPixels; k++) { - if (mask[k]) { - data.pixels.resultPixels[k] = rawData[z++]; - } - } - } - } - ptr += numBytes; - data.ptr = ptr; //return data; - return true; - }, - - readHuffmanTree: function (input, data) { - var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX; //8 is slow for the large test image - //var size_max = 1 << BITS_MAX; - /* ************************ - * reading code table - *************************/ - var view = new DataView(input, data.ptr, 16); - data.ptr += 16; - var version = view.getInt32(0, true); - if (version < 2) { - throw "unsupported Huffman version"; - } - var size = view.getInt32(4, true); - var i0 = view.getInt32(8, true); - var i1 = view.getInt32(12, true); - if (i0 >= i1) { - return false; - } - var blockDataBuffer = new Uint32Array(i1 - i0); - Lerc2Helpers.decodeBits(input, data, blockDataBuffer); - var codeTable = []; //size - var i, j, k, len; - - for (i = i0; i < i1; i++) { - j = i - (i < size ? 0 : size);//wrap around - codeTable[j] = { first: blockDataBuffer[i - i0], second: null }; - } - - var dataBytes = input.byteLength - data.ptr; - var dataWords = Math.ceil(dataBytes / 4); - var arrayBuf = new ArrayBuffer(dataWords * 4); - var store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, data.ptr, dataBytes)); - var stuffedData = new Uint32Array(arrayBuf); //must start from x*4 - var bitPos = 0, word, srcPtr = 0; - word = stuffedData[0]; - for (i = i0; i < i1; i++) { - j = i - (i < size ? 0 : size);//wrap around - len = codeTable[j].first; - if (len > 0) { - codeTable[j].second = word << bitPos >>> 32 - len; - - if (32 - bitPos >= len) { - bitPos += len; - if (bitPos === 32) { - bitPos = 0; - srcPtr++; - word = stuffedData[srcPtr]; - } - } - else { - bitPos += len - 32; - srcPtr++; - word = stuffedData[srcPtr]; - codeTable[j].second |= word >>> 32 - bitPos; - } - } - } - - //finished reading code table - - /* ************************ - * building lut - *************************/ - var numBitsLUT = 0, numBitsLUTQick = 0; - var tree = new TreeNode(); - for (i = 0; i < codeTable.length; i++) { - if (codeTable[i] !== undefined) { - numBitsLUT = Math.max(numBitsLUT, codeTable[i].first); - } - } - if (numBitsLUT >= BITS_MAX) { - numBitsLUTQick = BITS_MAX; - } - else { - numBitsLUTQick = numBitsLUT; - } - // for debugging purpose - // if (numBitsLUT >= 30) { - // console.log("WARning, large NUM LUT BITS IS " + numBitsLUT); - // } - var decodeLut = [], entry, code, numEntries, jj, currentBit, node; - for (i = i0; i < i1; i++) { - j = i - (i < size ? 0 : size);//wrap around - len = codeTable[j].first; - if (len > 0) { - entry = [len, j]; - if (len <= numBitsLUTQick) { - code = codeTable[j].second << numBitsLUTQick - len; - numEntries = 1 << numBitsLUTQick - len; - for (k = 0; k < numEntries; k++) { - decodeLut[code | k] = entry; - } - } - else { - //build tree - code = codeTable[j].second; - node = tree; - for (jj = len - 1; jj >= 0; jj--) { - currentBit = code >>> jj & 1; //no left shift as length could be 30,31 - if (currentBit) { - if (!node.right) { - node.right = new TreeNode(); - } - node = node.right; - } - else { - if (!node.left) { - node.left = new TreeNode(); - } - node = node.left; - } - if (jj === 0 && !node.val) { - node.val = entry[1]; - } - } - } - } - } - return { - decodeLut: decodeLut, - numBitsLUTQick: numBitsLUTQick, - numBitsLUT: numBitsLUT, - tree: tree, - stuffedData: stuffedData, - srcPtr: srcPtr, - bitPos: bitPos - }; - }, - - readHuffman: function (input, data, OutPixelTypeArray) { - var headerInfo = data.headerInfo; - var numDims = headerInfo.numDims; - var height = data.headerInfo.height; - var width = data.headerInfo.width; - var numPixels = width * height; - //var size_max = 1 << BITS_MAX; - /* ************************ - * reading huffman structure info - *************************/ - var huffmanInfo = this.readHuffmanTree(input, data); - var decodeLut = huffmanInfo.decodeLut; - var tree = huffmanInfo.tree; - //stuffedData includes huffman headers - var stuffedData = huffmanInfo.stuffedData; - var srcPtr = huffmanInfo.srcPtr; - var bitPos = huffmanInfo.bitPos; - var numBitsLUTQick = huffmanInfo.numBitsLUTQick; - var numBitsLUT = huffmanInfo.numBitsLUT; - var offset = data.headerInfo.imageType === 0 ? 128 : 0; - /************************* - * decode - ***************************/ - var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit; - var i, j, k, ii; - var prevVal = 0; - if (bitPos > 0) { - srcPtr++; - bitPos = 0; - } - var word = stuffedData[srcPtr]; - var deltaEncode = data.encodeMode === 1; - var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims); - var resultPixels = resultPixelsAllDim; - var iDim; - for (iDim = 0; iDim < headerInfo.numDims; iDim++) { - if (numDims > 1) { - //get the mem block of current dimension - resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels); - prevVal = 0; - } - if (data.headerInfo.numValidPixel === width * height) { //all valid - for (k = 0, i = 0; i < height; i++) { - for (j = 0; j < width; j++, k++) { - val = 0; - valTmp = word << bitPos >>> 32 - numBitsLUTQick; - valTmpQuick = valTmp;// >>> deltaBits; - if (32 - bitPos < numBitsLUTQick) { - valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick; - valTmpQuick = valTmp;// >>> deltaBits; - } - if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done - { - val = decodeLut[valTmpQuick][1]; - bitPos += decodeLut[valTmpQuick][0]; - } - else { - valTmp = word << bitPos >>> 32 - numBitsLUT; - valTmpQuick = valTmp;// >>> deltaBits; - if (32 - bitPos < numBitsLUT) { - valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT; - valTmpQuick = valTmp;// >>> deltaBits; - } - node = tree; - for (ii = 0; ii < numBitsLUT; ii++) { - currentBit = valTmp >>> numBitsLUT - ii - 1 & 1; - node = currentBit ? node.right : node.left; - if (!(node.left || node.right)) { - val = node.val; - bitPos = bitPos + ii + 1; - break; - } - } - } - - if (bitPos >= 32) { - bitPos -= 32; - srcPtr++; - word = stuffedData[srcPtr]; - } - - delta = val - offset; - if (deltaEncode) { - if (j > 0) { - delta += prevVal; // use overflow - } - else if (i > 0) { - delta += resultPixels[k - width]; - } - else { - delta += prevVal; - } - delta &= 0xFF; //overflow - resultPixels[k] = delta;//overflow - prevVal = delta; - } - else { - resultPixels[k] = delta; - } - } - } - } - else { //not all valid, use mask - for (k = 0, i = 0; i < height; i++) { - for (j = 0; j < width; j++, k++) { - if (mask[k]) { - val = 0; - valTmp = word << bitPos >>> 32 - numBitsLUTQick; - valTmpQuick = valTmp;// >>> deltaBits; - if (32 - bitPos < numBitsLUTQick) { - valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick; - valTmpQuick = valTmp;// >>> deltaBits; - } - if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done - { - val = decodeLut[valTmpQuick][1]; - bitPos += decodeLut[valTmpQuick][0]; - } - else { - valTmp = word << bitPos >>> 32 - numBitsLUT; - valTmpQuick = valTmp;// >>> deltaBits; - if (32 - bitPos < numBitsLUT) { - valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT; - valTmpQuick = valTmp;// >>> deltaBits; - } - node = tree; - for (ii = 0; ii < numBitsLUT; ii++) { - currentBit = valTmp >>> numBitsLUT - ii - 1 & 1; - node = currentBit ? node.right : node.left; - if (!(node.left || node.right)) { - val = node.val; - bitPos = bitPos + ii + 1; - break; - } - } - } - - if (bitPos >= 32) { - bitPos -= 32; - srcPtr++; - word = stuffedData[srcPtr]; - } - - delta = val - offset; - if (deltaEncode) { - if (j > 0 && mask[k - 1]) { - delta += prevVal; // use overflow - } - else if (i > 0 && mask[k - width]) { - delta += resultPixels[k - width]; - } - else { - delta += prevVal; - } - - delta &= 0xFF; //overflow - resultPixels[k] = delta;//overflow - prevVal = delta; - } - else { - resultPixels[k] = delta; - } - } - } - } - } - data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0); - } - data.pixels.resultPixels = resultPixelsAllDim; - }, - - decodeBits: function (input, data, blockDataBuffer, offset, iDim) { - { - //bitstuff encoding is 3 - var headerInfo = data.headerInfo; - var fileVersion = headerInfo.fileVersion; - //var block = {}; - var blockPtr = 0; - var viewByteLength = input.byteLength - data.ptr >= 5 ? 5 : input.byteLength - data.ptr; - var view = new DataView(input, data.ptr, viewByteLength); - var headerByte = view.getUint8(0); - blockPtr++; - var bits67 = headerByte >> 6; - var n = bits67 === 0 ? 4 : 3 - bits67; - var doLut = (headerByte & 32) > 0 ? true : false;//5th bit - var numBits = headerByte & 31; - var numElements = 0; - if (n === 1) { - numElements = view.getUint8(blockPtr); blockPtr++; - } else if (n === 2) { - numElements = view.getUint16(blockPtr, true); blockPtr += 2; - } else if (n === 4) { - numElements = view.getUint32(blockPtr, true); blockPtr += 4; - } else { - throw "Invalid valid pixel count type"; - } - //fix: huffman codes are bit stuffed, but not bound by data's max value, so need to use originalUnstuff - //offset = offset || 0; - var scale = 2 * headerInfo.maxZError; - var stuffedData, arrayBuf, store8, dataBytes, dataWords; - var lutArr, lutData, lutBytes, lutBitsPerElement, bitsPerPixel; - var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax; - if (doLut) { - data.counter.lut++; - lutBytes = view.getUint8(blockPtr); - lutBitsPerElement = numBits; - blockPtr++; - dataBytes = Math.ceil((lutBytes - 1) * numBits / 8); - dataWords = Math.ceil(dataBytes / 4); - arrayBuf = new ArrayBuffer(dataWords * 4); - store8 = new Uint8Array(arrayBuf); - - data.ptr += blockPtr; - store8.set(new Uint8Array(input, data.ptr, dataBytes)); - - lutData = new Uint32Array(arrayBuf); - data.ptr += dataBytes; - - bitsPerPixel = 0; - while (lutBytes - 1 >>> bitsPerPixel) { - bitsPerPixel++; - } - dataBytes = Math.ceil(numElements * bitsPerPixel / 8); - dataWords = Math.ceil(dataBytes / 4); - arrayBuf = new ArrayBuffer(dataWords * 4); - store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, data.ptr, dataBytes)); - stuffedData = new Uint32Array(arrayBuf); - data.ptr += dataBytes; - if (fileVersion >= 3) { - lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax); - } - else { - lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax); - } - //lutArr.unshift(0); - if (fileVersion >= 3) { - //BitStuffer.unstuff2(block, blockDataBuffer, headerInfo.zMax); - BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr); - } - else { - BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr); - } - } - else { - //console.debug("bitstuffer"); - data.counter.bitstuffer++; - bitsPerPixel = numBits; - data.ptr += blockPtr; - if (bitsPerPixel > 0) { - dataBytes = Math.ceil(numElements * bitsPerPixel / 8); - dataWords = Math.ceil(dataBytes / 4); - arrayBuf = new ArrayBuffer(dataWords * 4); - store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, data.ptr, dataBytes)); - stuffedData = new Uint32Array(arrayBuf); - data.ptr += dataBytes; - if (fileVersion >= 3) { - if (offset == null) { - BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements); - } - else { - BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax); - } - } - else { - if (offset == null) { - BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements); - } - else { - BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax); - } - } - } - } - } - - }, - - readTiles: function (input, data, OutPixelTypeArray) { - var headerInfo = data.headerInfo; - var width = headerInfo.width; - var height = headerInfo.height; - var microBlockSize = headerInfo.microBlockSize; - var imageType = headerInfo.imageType; - var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType); - var numBlocksX = Math.ceil(width / microBlockSize); - var numBlocksY = Math.ceil(height / microBlockSize); - data.pixels.numBlocksY = numBlocksY; - data.pixels.numBlocksX = numBlocksX; - data.pixels.ptr = 0; - var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0; - var view, block, arrayBuf, store8, rawData; - var blockEncoding; - var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize); - var lastBlockHeight = height % microBlockSize || microBlockSize; - var lastBlockWidth = width % microBlockSize || microBlockSize; - var offsetType, offset; - var numDims = headerInfo.numDims, iDim; - var mask = data.pixels.resultMask; - var resultPixels = data.pixels.resultPixels; - var fileVersion = headerInfo.fileVersion; - var fileVersionCheckNum = fileVersion >= 5 ? 14 : 15; - var isDiffEncoding; - var zMax = headerInfo.zMax; - //var resultPixelsAllDim = resultPixels; - var resultPixelsPrevDim; - for (blockY = 0; blockY < numBlocksY; blockY++) { - thisBlockHeight = blockY !== numBlocksY - 1 ? microBlockSize : lastBlockHeight; - for (blockX = 0; blockX < numBlocksX; blockX++) { - //console.debug("y" + blockY + " x" + blockX); - thisBlockWidth = blockX !== numBlocksX - 1 ? microBlockSize : lastBlockWidth; - - outPtr = blockY * width * microBlockSize + blockX * microBlockSize; - outStride = width - thisBlockWidth; - - for (iDim = 0; iDim < numDims; iDim++) { - if (numDims > 1) { - resultPixelsPrevDim = resultPixels; - outPtr = blockY * width * microBlockSize + blockX * microBlockSize; - resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, width * height * iDim * dataTypeSize, width * height); - zMax = headerInfo.maxValues[iDim]; - } else { - resultPixelsPrevDim = null; - } - bytesLeft = input.byteLength - data.ptr; - view = new DataView(input, data.ptr, Math.min(10, bytesLeft)); - block = {}; - blockPtr = 0; - headerByte = view.getUint8(0); - blockPtr++; - isDiffEncoding = headerInfo.fileVersion >= 5 ? headerByte & 4 : 0; - bits67 = headerByte >> 6 & 0xFF; - testCode = headerByte >> 2 & fileVersionCheckNum; // use bits 2345 for integrity check - if (testCode !== (blockX * microBlockSize >> 3 & fileVersionCheckNum)) { - throw "integrity issue"; - } - - if (isDiffEncoding && iDim === 0) { - throw "integrity issue"; - } - - blockEncoding = headerByte & 3; - if (blockEncoding > 3) { - data.ptr += blockPtr; - throw "Invalid block encoding (" + blockEncoding + ")"; - } - else if (blockEncoding === 2) { //constant 0 - if (isDiffEncoding) { - if (mask) { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - if (mask[outPtr]) { - resultPixels[outPtr] = resultPixelsPrevDim[outPtr]; - } - outPtr++; - } - } - } - else { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - resultPixels[outPtr] = resultPixelsPrevDim[outPtr]; - outPtr++; - } - } - } - } - data.counter.constant++; - data.ptr += blockPtr; - continue; - } - else if (blockEncoding === 0) { //uncompressed - if (isDiffEncoding) { - // doesn't make sense, should not happen - throw "integrity issue"; - } - data.counter.uncompressed++; - data.ptr += blockPtr; - numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize; - bytesleft = input.byteLength - data.ptr; - numBytes = numBytes < bytesleft ? numBytes : bytesleft; - //bit alignment - arrayBuf = new ArrayBuffer(numBytes % dataTypeSize === 0 ? numBytes : numBytes + dataTypeSize - numBytes % dataTypeSize); - store8 = new Uint8Array(arrayBuf); - store8.set(new Uint8Array(input, data.ptr, numBytes)); - rawData = new OutPixelTypeArray(arrayBuf); - z = 0; - if (mask) { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - if (mask[outPtr]) { - resultPixels[outPtr] = rawData[z++]; - } - outPtr++; - } - outPtr += outStride; - } - } - else {//all valid - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - resultPixels[outPtr++] = rawData[z++]; - } - outPtr += outStride; - } - } - data.ptr += z * dataTypeSize; - } - else { //1 or 3 - offsetType = Lerc2Helpers.getDataTypeUsed(isDiffEncoding && imageType < 6 ? 4 : imageType, bits67); - offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view); - blockPtr += Lerc2Helpers.getDataTypeSize(offsetType); - if (blockEncoding === 3) //constant offset value - { - data.ptr += blockPtr; - data.counter.constantoffset++; - //you can delete the following resultMask case in favor of performance because val is constant and users use nodata mask, otherwise nodatavalue post processing handles it too. - //while the above statement is true, we're not doing it as we want to keep invalid pixel value at 0 rather than arbitrary values - if (mask) { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - if (mask[outPtr]) { - resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset; - } - outPtr++; - } - outPtr += outStride; - } - } - else { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset; - outPtr++; - } - outPtr += outStride; - } - } - } - else { //bitstuff encoding is 3 - data.ptr += blockPtr; - //heavy lifting - Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim); - blockPtr = 0; - // duplicate code to favor performance, diff encoding is for multidimension only - if (isDiffEncoding) { - if (mask) { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - if (mask[outPtr]) { - resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr]; - } - outPtr++; - } - outPtr += outStride; - } - } - else { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr]; - outPtr++; - } - outPtr += outStride; - } - } - } - else if (mask) { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - if (mask[outPtr]) { - resultPixels[outPtr] = blockDataBuffer[blockPtr++]; - } - outPtr++; - } - outPtr += outStride; - } - } - else { - for (row = 0; row < thisBlockHeight; row++) { - for (col = 0; col < thisBlockWidth; col++) { - resultPixels[outPtr++] = blockDataBuffer[blockPtr++]; - } - outPtr += outStride; - } - } - } - } - } - } - } - }, - - /***************** - * private methods (helper methods) - *****************/ - - formatFileInfo: function (data) { - return { - "fileIdentifierString": data.headerInfo.fileIdentifierString, - "fileVersion": data.headerInfo.fileVersion, - "imageType": data.headerInfo.imageType, - "height": data.headerInfo.height, - "width": data.headerInfo.width, - "numValidPixel": data.headerInfo.numValidPixel, - "microBlockSize": data.headerInfo.microBlockSize, - "blobSize": data.headerInfo.blobSize, - "maxZError": data.headerInfo.maxZError, - "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType), - "eofOffset": data.eofOffset, - "mask": data.mask ? { - "numBytes": data.mask.numBytes - } : null, - "pixels": { - "numBlocksX": data.pixels.numBlocksX, - "numBlocksY": data.pixels.numBlocksY, - //"numBytes": data.pixels.numBytes, - "maxValue": data.headerInfo.zMax, - "minValue": data.headerInfo.zMin, - "noDataValue": data.noDataValue - } - }; - }, - - constructConstantSurface: function (data) { - var val = data.headerInfo.zMax; - var numDims = data.headerInfo.numDims; - var numPixels = data.headerInfo.height * data.headerInfo.width; - var i = 0, k = 0, nStart = 0; - var mask = data.pixels.resultMask; - var resultPixels = data.pixels.resultPixels; - if (mask) { - if (numDims > 1) { - for (i = 0; i < numDims; i++) { - nStart = i * numPixels; - val = data.headerInfo.maxValues[i]; - for (k = 0; k < numPixels; k++) { - if (mask[k]) { - resultPixels[nStart + k] = val; - } - } - } - } - else { - for (k = 0; k < numPixels; k++) { - if (mask[k]) { - resultPixels[k] = val; - } - } - } - } - else { - if (numDims > 1) { - for (i = 0; i < numDims; i++) { - nStart = i * numPixels; - val = data.headerInfo.maxValues[i]; - for (k = 0; k < numPixels; k++) { - resultPixels[nStart + k] = val; - } - } - } - else { - for (k = 0; k < numPixels; k++) { - resultPixels[k] = val; - } - } - } - return; - }, - - getDataTypeArray: function (t) { - var tp; - switch (t) { - case 0: //char - tp = Int8Array; - break; - case 1: //byte - tp = Uint8Array; - break; - case 2: //short - tp = Int16Array; - break; - case 3: //ushort - tp = Uint16Array; - break; - case 4: - tp = Int32Array; - break; - case 5: - tp = Uint32Array; - break; - case 6: - tp = Float32Array; - break; - case 7: - tp = Float64Array; - break; - default: - tp = Float32Array; - } - return tp; - }, - - getPixelType: function (t) { - var tp; - switch (t) { - case 0: //char - tp = "S8"; - break; - case 1: //byte - tp = "U8"; - break; - case 2: //short - tp = "S16"; - break; - case 3: //ushort - tp = "U16"; - break; - case 4: - tp = "S32"; - break; - case 5: - tp = "U32"; - break; - case 6: - tp = "F32"; - break; - case 7: - tp = "F64"; //not supported - break; - default: - tp = "F32"; - } - return tp; - }, - - isValidPixelValue: function (t, val) { - if (val == null) { - return false; - } - var isValid; - switch (t) { - case 0: //char - isValid = val >= -128 && val <= 127; - break; - case 1: //byte (unsigned char) - isValid = val >= 0 && val <= 255; - break; - case 2: //short - isValid = val >= -32768 && val <= 32767; - break; - case 3: //ushort - isValid = val >= 0 && val <= 65536; - break; - case 4: //int 32 - isValid = val >= -2147483648 && val <= 2147483647; - break; - case 5: //uinit 32 - isValid = val >= 0 && val <= 4294967296; - break; - case 6: - isValid = val >= -3.4027999387901484e+38 && val <= 3.4027999387901484e+38; - break; - case 7: - isValid = val >= 5e-324 && val <= 1.7976931348623157e+308; - break; - default: - isValid = false; - } - return isValid; - }, - - getDataTypeSize: function (t) { - var s = 0; - switch (t) { - case 0: //ubyte - case 1: //byte - s = 1; - break; - case 2: //short - case 3: //ushort - s = 2; - break; - case 4: - case 5: - case 6: - s = 4; - break; - case 7: - s = 8; - break; - default: - s = t; - } - return s; - }, - - getDataTypeUsed: function (dt, tc) { - var t = dt; - switch (dt) { - case 2: //short - case 4: //long - t = dt - tc; - break; - case 3: //ushort - case 5: //ulong - t = dt - 2 * tc; - break; - case 6: //float - if (0 === tc) { - t = dt; - } - else if (1 === tc) { - t = 2; - } - else { - t = 1;//byte - } - break; - case 7: //double - if (0 === tc) { - t = dt; - } - else { - t = dt - 2 * tc + 1; - } - break; - default: - t = dt; - break; - } - return t; - }, - - getOnePixel: function (block, blockPtr, offsetType, view) { - var temp = 0; - switch (offsetType) { - case 0: //char - temp = view.getInt8(blockPtr); - break; - case 1: //byte - temp = view.getUint8(blockPtr); - break; - case 2: - temp = view.getInt16(blockPtr, true); - break; - case 3: - temp = view.getUint16(blockPtr, true); - break; - case 4: - temp = view.getInt32(blockPtr, true); - break; - case 5: - temp = view.getUInt32(blockPtr, true); - break; - case 6: - temp = view.getFloat32(blockPtr, true); - break; - case 7: - //temp = view.getFloat64(blockPtr, true); - //blockPtr += 8; - //lerc2 encoding doesnt handle float 64, force to float32??? - temp = view.getFloat64(blockPtr, true); - break; - default: - throw "the decoder does not understand this pixel type"; - } - return temp; - } - }; - - /*************************************************** - *private class for a tree node. Huffman code is in Lerc2Helpers - ****************************************************/ - var TreeNode = function (val, left, right) { - this.val = val; - this.left = left; - this.right = right; - }; - - var Lerc2Decode = { - /* - * ********removed options compared to LERC1. We can bring some of them back if needed. - * removed pixel type. LERC2 is typed and doesn't require user to give pixel type - * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly. - * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost. - * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc, - * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now. - * We can add it back later if their's a clear requirement. - * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient) - * removed computeUsedBitDepths. - * - * - * response changes compared to LERC1 - * 1. encodedMaskData is not available - * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range) - * 3. maskData is always available - */ - /***************** - * public properties - ******************/ - //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable - - /***************** - * public methods - *****************/ - - /** - * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata. - * - * @param {ArrayBuffer} input The LERC input byte stream - * @param {object} [options] options Decoding options - * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position - * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process - */ - decode: function (/*byte array*/ input, /*object*/ options) { - //currently there's a bug in the sparse array, so please do not set to false - options = options || {}; - var noDataValue = options.noDataValue; - - //initialize - var i = 0, data = {}; - data.ptr = options.inputOffset || 0; - data.pixels = {}; - - // File header - if (!Lerc2Helpers.readHeaderInfo(input, data)) { - return; - } - - var headerInfo = data.headerInfo; - var fileVersion = headerInfo.fileVersion; - var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType); - - // version check - if (fileVersion > 5) { - throw "unsupported lerc version 2." + fileVersion; - } - - // Mask Header - Lerc2Helpers.readMask(input, data); - if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) { - data.pixels.resultMask = options.maskData; - } - - var numPixels = headerInfo.width * headerInfo.height; - data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims); - - data.counter = { - onesweep: 0, - uncompressed: 0, - lut: 0, - bitstuffer: 0, - constant: 0, - constantoffset: 0 - }; - if (headerInfo.numValidPixel !== 0) { - //not tested - if (headerInfo.zMax === headerInfo.zMin) //constant surface - { - Lerc2Helpers.constructConstantSurface(data); - } - else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) { - Lerc2Helpers.constructConstantSurface(data); - } - else { - var view = new DataView(input, data.ptr, 2); - var bReadDataOneSweep = view.getUint8(0); - data.ptr++; - if (bReadDataOneSweep) { - //console.debug("OneSweep"); - Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray); - } - else { - //lerc2.1: //bitstuffing + lut - //lerc2.2: //bitstuffing + lut + huffman - //lerc2.3: new bitstuffer - if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 0.00001) { - //this is 2.x plus 8 bit (unsigned and signed) data, possiblity of Huffman - var flagHuffman = view.getUint8(1); - data.ptr++; - data.encodeMode = flagHuffman; - if (flagHuffman > 2 || fileVersion < 4 && flagHuffman > 1) { - throw "Invalid Huffman flag " + flagHuffman; - } - if (flagHuffman) {//1 - delta Huffman, 2 - Huffman - //console.log("Huffman"); - Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray); - } - else { - //console.log("Tiles"); - Lerc2Helpers.readTiles(input, data, OutPixelTypeArray); - } - } - else { //lerc2.x non-8 bit data - //console.log("Tiles"); - Lerc2Helpers.readTiles(input, data, OutPixelTypeArray); - } - } - } - } - - data.eofOffset = data.ptr; - var diff; - if (options.inputOffset) { - diff = data.headerInfo.blobSize + options.inputOffset - data.ptr; - if (Math.abs(diff) >= 1) { - //console.debug("incorrect eof: dataptr " + data.ptr + " offset " + options.inputOffset + " blobsize " + data.headerInfo.blobSize + " diff: " + diff); - data.eofOffset = options.inputOffset + data.headerInfo.blobSize; - } - } - else { - diff = data.headerInfo.blobSize - data.ptr; - if (Math.abs(diff) >= 1) { - //console.debug("incorrect first band eof: dataptr " + data.ptr + " blobsize " + data.headerInfo.blobSize + " diff: " + diff); - data.eofOffset = data.headerInfo.blobSize; - } - } - - var result = { - width: headerInfo.width, - height: headerInfo.height, - pixelData: data.pixels.resultPixels, - minValue: headerInfo.zMin, - maxValue: headerInfo.zMax, - validPixelCount: headerInfo.numValidPixel, - dimCount: headerInfo.numDims, - dimStats: { - minValues: headerInfo.minValues, - maxValues: headerInfo.maxValues - }, - maskData: data.pixels.resultMask - //noDataValue: noDataValue - }; - - //we should remove this if there's no existing client - //optional noDataValue processing, it's user's responsiblity - if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) { - var mask = data.pixels.resultMask; - for (i = 0; i < numPixels; i++) { - if (!mask[i]) { - result.pixelData[i] = noDataValue; - } - } - result.noDataValue = noDataValue; - } - data.noDataValue = noDataValue; - if (options.returnFileInfo) { - result.fileInfo = Lerc2Helpers.formatFileInfo(data); - } - return result; - }, - - getBandCount: function (/*byte array*/ input) { - var count = 0; - var i = 0; - var temp = {}; - temp.ptr = 0; - temp.pixels = {}; - while (i < input.byteLength - 58) { - Lerc2Helpers.readHeaderInfo(input, temp); - i += temp.headerInfo.blobSize; - count++; - temp.ptr = i; - } - return count; - } - }; - - return Lerc2Decode; -})(); - -var isPlatformLittleEndian = (function () { - var a = new ArrayBuffer(4); - var b = new Uint8Array(a); - var c = new Uint32Array(a); - c[0] = 1; - return b[0] === 1; -})(); - -var Lerc = { - /************wrapper**********************************************/ - /** - * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types. - * - * @alias module:Lerc - * @param {ArrayBuffer} input The LERC input byte stream - * @param {object} [options] The decoding options below are optional. - * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position. - * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32. - * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value. - * @returns {{width, height, pixels, pixelType, mask, statistics}} - * @property {number} width Width of decoded image. - * @property {number} height Height of decoded image. - * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height. - * @property {string} pixelType The type of pixels represented in the output. - * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid. - * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values - **/ - decode: function (encodedData, options) { - if (!isPlatformLittleEndian) { - throw "Big endian system is not supported."; - } - options = options || {}; - var inputOffset = options.inputOffset || 0; - var fileIdView = new Uint8Array(encodedData, inputOffset, 10); - var fileIdentifierString = String.fromCharCode.apply(null, fileIdView); - var lerc, majorVersion; - if (fileIdentifierString.trim() === "CntZImage") { - lerc = LercDecode; - majorVersion = 1; - } - else if (fileIdentifierString.substring(0, 5) === "Lerc2") { - lerc = Lerc2Decode; - majorVersion = 2; - } - else { - throw "Unexpected file identifier string: " + fileIdentifierString; - } - - var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData; - var decodedPixelBlock = { - width: 0, - height: 0, - pixels: [], - pixelType: options.pixelType, - mask: null, - statistics: [] - }; - - while (inputOffset < eof) { - var result = lerc.decode(encodedData, { - inputOffset: inputOffset,//for both lerc1 and lerc2 - encodedMaskData: encodedMaskData,//lerc1 only - maskData: maskData,//lerc2 only - returnMask: iPlane === 0 ? true : false,//lerc1 only - returnEncodedMask: iPlane === 0 ? true : false,//lerc1 only - returnFileInfo: true,//for both lerc1 and lerc2 - pixelType: options.pixelType || null,//lerc1 only - noDataValue: options.noDataValue || null//lerc1 only - }); - - inputOffset = result.fileInfo.eofOffset; - if (iPlane === 0) { - encodedMaskData = result.encodedMaskData;//lerc1 - maskData = result.maskData;//lerc2 - decodedPixelBlock.width = result.width; - decodedPixelBlock.height = result.height; - decodedPixelBlock.dimCount = result.dimCount || 1; - //decodedPixelBlock.dimStats = decodedPixelBlock.dimStats; - decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType; - decodedPixelBlock.mask = result.maskData; - } - if (majorVersion > 1 && result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) { - bandMasks.push(result.maskData); - } - - iPlane++; - decodedPixelBlock.pixels.push(result.pixelData); - decodedPixelBlock.statistics.push({ - minValue: result.minValue, - maxValue: result.maxValue, - noDataValue: result.noDataValue, - dimStats: result.dimStats - }); - } - var i, j, numPixels; - if (majorVersion > 1 && bandMasks.length > 1) { - numPixels = decodedPixelBlock.width * decodedPixelBlock.height; - decodedPixelBlock.bandMasks = bandMasks; - maskData = new Uint8Array(numPixels); - maskData.set(bandMasks[0]); - for (i = 1; i < bandMasks.length; i++) { - bandMask = bandMasks[i]; - for (j = 0; j < numPixels; j++) { - maskData[j] = maskData[j] & bandMask[j]; - } - } - decodedPixelBlock.maskData = maskData; - } - - return decodedPixelBlock; - } -}; - -// Download and translate arcgis terrain data. -self.onmessage = e => { - let { tileKey, x, y, z } = e.data; - - let xhr = new XMLHttpRequest(); - let url = `http://localhost:2020/api/Map/Elevation?x=${x}&y=${y}&z=${z}`; - - xhr.open("GET", url, true); - xhr.responseType = 'arraybuffer'; - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - if (xhr.status === 200) { - self.postMessage({ - result: 'success', - tileKey, - url, - data: LercDecode.decode(xhr.response) - }); - } else { - self.postMessage({ - result: 'fail', - msg: xhr.statusText, - tileKey, - url - }); - } - } - }; - - xhr.onerror = function () { - self.postMessage({ - result: 'error', - tileKey, - url - }); - }; - - xhr.ontimeout = function () { - self.postMessage({ - result: 'timeout', - tileKey, - url - }); - }; - - xhr.send(null); -}; \ No newline at end of file diff --git a/web/src/gis/globe/AsterV2ElevationCoverage.js b/web/src/gis/globe/AsterV2ElevationCoverage.js deleted file mode 100644 index 0082bd98..00000000 --- a/web/src/gis/globe/AsterV2ElevationCoverage.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AsterV2ElevationCoverage - */ -import Sector from '../geom/Sector'; -import TiledElevationCoverage from '../globe/TiledElevationCoverage'; -import WmsUrlBuilder from '../util/WmsUrlBuilder'; - - -/** - * Constructs an Earth elevation coverage using ASTER V2 data. - * @alias AsterV2ElevationCoverage - * @constructor - * @augments TiledElevationCoverage - * @classdesc Provides elevations for Earth. Elevations are drawn from the NASA WorldWind elevation service. - */ -function AsterV2ElevationCoverage() { - TiledElevationCoverage.call(this, { - coverageSector: new Sector(-83.0001, 83.0001, -180, 180), - resolution: 0.000277777777778, - retrievalImageFormat: "application/bil16", - minElevation: -11000, - maxElevation: 8850, - urlBuilder: new WmsUrlBuilder("https://worldwind26.arc.nasa.gov/elev", "aster_v2", "", "1.3.0") - }); - - this.displayName = "ASTER V2 Earth Elevation Coverage"; -} - -AsterV2ElevationCoverage.prototype = Object.create(TiledElevationCoverage.prototype); - -export default AsterV2ElevationCoverage; diff --git a/web/src/gis/globe/EarthElevationModel.js b/web/src/gis/globe/EarthElevationModel.js deleted file mode 100644 index ebc5378d..00000000 --- a/web/src/gis/globe/EarthElevationModel.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports EarthElevationModel - */ -import AsterV2ElevationCoverage from '../globe/AsterV2ElevationCoverage'; -import ElevationModel from '../globe/ElevationModel'; -import GebcoElevationCoverage from '../globe/GebcoElevationCoverage'; -import UsgsNedElevationCoverage from '../globe/UsgsNedElevationCoverage'; -import UsgsNedHiElevationCoverage from '../globe/UsgsNedHiElevationCoverage'; -import ArcgisElevationCoverage from './ArcgisElevationCoverage'; - -/** - * Constructs an EarthElevationModel consisting of three elevation coverages GEBCO, Aster V2, and USGS NED. - * @alias EarthElevationModel - * @constructor - */ -function EarthElevationModel() { - ElevationModel.call(this); - - this.addCoverage(new ArcgisElevationCoverage()); - // this.addCoverage(new GebcoElevationCoverage()); - // this.addCoverage(new AsterV2ElevationCoverage()); - // this.addCoverage(new UsgsNedElevationCoverage()); - // this.addCoverage(new UsgsNedHiElevationCoverage()); -} - -EarthElevationModel.prototype = Object.create(ElevationModel.prototype); - -export default EarthElevationModel; diff --git a/web/src/gis/globe/ElevationCoverage.js b/web/src/gis/globe/ElevationCoverage.js deleted file mode 100644 index c0e93464..00000000 --- a/web/src/gis/globe/ElevationCoverage.js +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ElevationCoverage - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Sector from '../geom/Sector'; - - -/** - * Constructs an ElevationCoverage - * @alias ElevationCoverage - * @constructor - * @classdesc When used directly and not through a subclass, this class represents an elevation coverage - * whose elevations are zero at all locations. - * @param {Number} resolution The resolution of the coverage, in degrees. (To compute degrees from - * meters, divide the number of meters by the globe's radius to obtain radians and convert the result to degrees.) - * @throws {ArgumentError} If the resolution argument is null, undefined, or zero. - */ -function ElevationCoverage(resolution) { - if (!resolution) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationCoverage", "constructor", - "missingResolution")); - } - - /** - * Indicates the last time this coverage changed, in milliseconds since midnight Jan 1, 1970. - * @type {Number} - * @readonly - * @default Date.now() at construction - */ - this.timestamp = Date.now(); - - /** - * Indicates this coverage's display name. - * @type {String} - * @default "Coverage" - */ - this.displayName = "Coverage"; - - /** - * Indicates whether or not to use this coverage. - * @type {Boolean} - * @default true - */ - this._enabled = true; - - /** - * The resolution of this coverage in degrees. - * @type {Number} - */ - this.resolution = resolution; - - /** - * The sector this coverage spans. - * @type {Sector} - * @readonly - */ - this.coverageSector = Sector.FULL_SPHERE; -} - -Object.defineProperties(ElevationCoverage.prototype, { - /** - * Indicates whether or not to use this coverage. - * @type {Boolean} - * @default true - */ - enabled: { - get: function () { - return this._enabled; - }, - set: function (value) { - this._enabled = value; - this.timestamp = Date.now(); - } - } -}); - -/** - * Returns the minimum and maximum elevations within a specified sector. - * @param {Sector} sector The sector for which to determine extreme elevations. - * @param {Number[]} result An array in which to return the requested minimum and maximum elevations. - * @returns {Boolean} true if the coverage completely fills the sector with data, false otherwise. - * @throws {ArgumentError} If any argument is null or undefined - */ -ElevationCoverage.prototype.minAndMaxElevationsForSector = function (sector, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationCoverage", "minAndMaxElevationsForSector", "missingSector")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationCoverage", "minAndMaxElevationsForSector", "missingResult")); - } - - if (result[0] > 0) { // min elevation - result[0] = 0; - } - - if (result[1] < 0) { // max elevation - result[1] = 0; - } - - return true; -}; - -/** - * Returns the elevation at a specified location. - * @param {Number} latitude The location's latitude in degrees. - * @param {Number} longitude The location's longitude in degrees. - * @returns {Number} The elevation at the specified location, in meters. Returns null if the location is - * outside the coverage area of this coverage. - */ -ElevationCoverage.prototype.elevationAtLocation = function (latitude, longitude) { - return 0; -}; - -/** - * Returns the elevations at locations within a specified sector. - * @param {Sector} sector The sector for which to determine the elevations. - * @param {Number} numLat The number of latitudinal sample locations within the sector. - * @param {Number} numLon The number of longitudinal sample locations within the sector. - * @param {Number[]} result An array in which to return the requested elevations. - * @returns {Boolean} true if the result array was completely filled with elevation data, false otherwise. - * @throws {ArgumentError} If the specified sector or result array is null or undefined, or if either of the - * specified numLat or numLon values is less than one. - */ -ElevationCoverage.prototype.elevationsForGrid = function (sector, numLat, numLon, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationCoverage", "elevationsForGrid", "missingSector")); - } - - if (numLat <= 0 || numLon <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationCoverage", - "elevationsForGrid", "numLat or numLon is less than 1")); - } - - if (!result || result.length < numLat * numLon) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationCoverage", - "elevationsForGrid", "missingArray")); - } - - for (var i = 0, len = result.length; i < len; i++) { - result[i] = 0; - } - - return true; -}; - -export default ElevationCoverage; diff --git a/web/src/gis/globe/ElevationImage.js b/web/src/gis/globe/ElevationImage.js deleted file mode 100644 index 3c22eadf..00000000 --- a/web/src/gis/globe/ElevationImage.js +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ElevationImage - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs an elevation image. - * @alias ElevationImage - * @constructor - * @classdesc Holds elevation values for an elevation tile. - * This class is typically not used directly by applications. - * @param {Sector} sector The sector spanned by this elevation image. - * @param {Number} imageWidth The number of longitudinal sample points in this elevation image. - * @param {Number} imageHeight The number of latitudinal sample points in this elevation image. - * @throws {ArgumentError} If the sector is null or undefined - */ -function ElevationImage(sector, imageWidth, imageHeight) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationImage", "constructor", "missingSector")); - } - - /** - * The sector spanned by this elevation image. - * @type {Sector} - * @readonly - */ - this.sector = sector; - - /** - * The number of longitudinal sample points in this elevation image. - * @type {Number} - * @readonly - */ - this.imageWidth = imageWidth; - - /** - * The number of latitudinal sample points in this elevation image. - * @type {Number} - * @readonly - */ - this.imageHeight = imageHeight; - - /** - * The size in bytes of this elevation image. - * @type {number} - * @readonly - */ - this.size = this.imageWidth * this.imageHeight; - - /** - * Internal use only - * false if the entire image consists of NO_DATA values, true otherwise. - * @ignore - */ - this.hasData = true; -} - -/** - * Internal use only - * The value that indicates a pixel contains no data. - * TODO: This will eventually need to become an instance property - * @ignore - */ -ElevationImage.NO_DATA = 0; - -/** - * Internal use only - * Returns true if a set of elevation pixels represents the NO_DATA value. - * @ignore - */ -ElevationImage.isNoData = function (x0y0, x1y0, x0y1, x1y1) { - // TODO: Change this logic once proper NO_DATA value handling is in place. - var v = ElevationImage.NO_DATA; - return x0y0 === v && - x1y0 === v && - x0y1 === v && - x1y1 === v; -}; - -/** - * Returns the pixel value at a specified coordinate in this elevation image. The coordinate origin is the - * image's lower left corner, so (0, 0) indicates the lower left pixel and (imageWidth-1, imageHeight-1) - * indicates the upper right pixel. This returns 0 if the coordinate indicates a pixel outside of this elevation - * image. - * @param x The pixel's X coordinate. - * @param y The pixel's Y coordinate. - * @returns {Number} The pixel value at the specified coordinate in this elevation image. - * Returns 0 if the coordinate indicates a pixel outside of this elevation image. - */ -ElevationImage.prototype.pixel = function (x, y) { - debugger; - if (x < 0 || x >= this.imageWidth) { - return 0; - } - - if (y < 0 || y >= this.imageHeight) { - return 0; - } - - y = this.imageHeight - y - 1; // flip the y coordinate origin to the lower left corner - return this.imageData[x + y * this.imageWidth]; -}; - -/** - * Returns the elevation at a specified geographic location. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @returns {Number} The elevation at the specified location. - */ -ElevationImage.prototype.elevationAtLocation = function (latitude, longitude) { - var maxLat = this.sector.maxLatitude, - minLon = this.sector.minLongitude, - deltaLat = this.sector.deltaLatitude(), - deltaLon = this.sector.deltaLongitude(), - x = (this.imageWidth - 1) * (longitude - minLon) / deltaLon, - y = (this.imageHeight - 1) * (maxLat - latitude) / deltaLat, - x0 = Math.floor(WWMath.clamp(x, 0, this.imageWidth - 1)), - x1 = Math.floor(WWMath.clamp(x0 + 1, 0, this.imageWidth - 1)), - y0 = Math.floor(WWMath.clamp(y, 0, this.imageHeight - 1)), - y1 = Math.floor(WWMath.clamp(y0 + 1, 0, this.imageHeight - 1)), - pixels = this.imageData, - x0y0 = pixels[x0 + y0 * this.imageWidth], - x1y0 = pixels[x1 + y0 * this.imageWidth], - x0y1 = pixels[x0 + y1 * this.imageWidth], - x1y1 = pixels[x1 + y1 * this.imageWidth], - xf = x - x0, - yf = y - y0; - - if (ElevationImage.isNoData(x0y0, x1y0, x0y1, x1y1)) { - return NaN; - } - - return (1 - xf) * (1 - yf) * x0y0 + - xf * (1 - yf) * x1y0 + - (1 - xf) * yf * x0y1 + - xf * yf * x1y1; -}; - -/** - * Returns elevations for a specified sector. - * @param {Sector} sector The sector for which to return the elevations. - * @param {Number} numLat The number of sample points in the longitudinal direction. - * @param {Number} numLon The number of sample points in the latitudinal direction. - * @param {Number[]} result An array in which to return the computed elevations. - * @throws {ArgumentError} If either the specified sector or result argument is null or undefined, or if the - * specified number of sample points in either direction is less than 1. - */ -ElevationImage.prototype.elevationsForGrid = function (sector, numLat, numLon, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationImage", "elevationsForGrid", "missingSector")); - } - - if (numLat < 1 || numLon < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationImage", "elevationsForGrid", - "The specified number of sample points is less than 1.")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationImage", "elevationsForGrid", "missingResult")); - } - - var minLatSelf = this.sector.minLatitude, - maxLatSelf = this.sector.maxLatitude, - minLonSelf = this.sector.minLongitude, - maxLonSelf = this.sector.maxLongitude, - deltaLatSelf = maxLatSelf - minLatSelf, - deltaLonSelf = maxLonSelf - minLonSelf, - minLat = sector.minLatitude, - maxLat = sector.maxLatitude, - minLon = sector.minLongitude, - maxLon = sector.maxLongitude, - deltaLat = (maxLat - minLat) / (numLat > 1 ? numLat - 1 : 1), - deltaLon = (maxLon - minLon) / (numLon > 1 ? numLon - 1 : 1), - lat, lon, - i, j, index = 0, - pixels = this.imageData; - - for (j = 0, lat = minLat; j < numLat; j += 1, lat += deltaLat) { - if (j === numLat - 1) { - lat = maxLat; // explicitly set the last lat to the max latitude to ensure alignment - } - - if (lat >= minLatSelf && lat <= maxLatSelf) { - // Image y-coordinate of the specified location, given an image origin in the top-left corner. - var y = (this.imageHeight - 1) * (maxLatSelf - lat) / deltaLatSelf, - y0 = Math.floor(WWMath.clamp(y, 0, this.imageHeight - 1)), - y1 = Math.floor(WWMath.clamp(y0 + 1, 0, this.imageHeight - 1)), - yf = y - y0; - - for (i = 0, lon = minLon; i < numLon; i += 1, lon += deltaLon) { - if (i === numLon - 1) { - lon = maxLon; // explicitly set the last lon to the max longitude to ensure alignment - } - - if (lon >= minLonSelf && lon <= maxLonSelf && isNaN(result[index])) { - // Image x-coordinate of the specified location, given an image origin in the top-left corner. - var x = (this.imageWidth - 1) * (lon - minLonSelf) / deltaLonSelf, - x0 = Math.floor(WWMath.clamp(x, 0, this.imageWidth - 1)), - x1 = Math.floor(WWMath.clamp(x0 + 1, 0, this.imageWidth - 1)), - xf = x - x0; - - var x0y0 = pixels[x0 + y0 * this.imageWidth], - x1y0 = pixels[x1 + y0 * this.imageWidth], - x0y1 = pixels[x0 + y1 * this.imageWidth], - x1y1 = pixels[x1 + y1 * this.imageWidth]; - - if (ElevationImage.isNoData(x0y0, x1y0, x0y1, x1y1)) { - result[index] = NaN; - } - else { - result[index] = (1 - xf) * (1 - yf) * x0y0 + - xf * (1 - yf) * x1y0 + - (1 - xf) * yf * x0y1 + - xf * yf * x1y1; - } - } - - index++; - } - } else { - index += numLon; // skip this row - } - } -}; - -/** - * Returns the minimum and maximum elevations within a specified sector. - * @param {Sector} sector The sector of interest. If null or undefined, the minimum and maximum elevations - * for the sector associated with this tile are returned. - * @returns {Number[]} An array containing the minimum and maximum elevations within the specified sector, - * or null if the specified sector does not include this elevation image's coverage sector or the image is filled with - * NO_DATA values. - */ -ElevationImage.prototype.minAndMaxElevationsForSector = function (sector) { - debugger; - if (!this.hasData) { - return null; - } - - var result = []; - if (!sector) { // the sector is this sector - result[0] = this.minElevation; - result[1] = this.maxElevation; - } else if (sector.contains(this.sector)) { // The specified sector completely contains this image; return the image min and max. - if (result[0] > this.minElevation) { - result[0] = this.minElevation; - } - - if (result[1] < this.maxElevation) { - result[1] = this.maxElevation; - } - } else { // The specified sector intersects a portion of this image; compute the min and max from intersecting pixels. - var maxLatSelf = this.sector.maxLatitude, - minLonSelf = this.sector.minLongitude, - deltaLatSelf = this.sector.deltaLatitude(), - deltaLonSelf = this.sector.deltaLongitude(), - minLatOther = sector.minLatitude, - maxLatOther = sector.maxLatitude, - minLonOther = sector.minLongitude, - maxLonOther = sector.maxLongitude; - - // Image coordinates of the specified sector, given an image origin in the top-left corner. We take the floor and - // ceiling of the min and max coordinates, respectively, in order to capture all pixels that would contribute to - // elevations computed for the specified sector in a call to elevationsForSector. - var minY = Math.floor((this.imageHeight - 1) * (maxLatSelf - maxLatOther) / deltaLatSelf), - maxY = Math.ceil((this.imageHeight - 1) * (maxLatSelf - minLatOther) / deltaLatSelf), - minX = Math.floor((this.imageWidth - 1) * (minLonOther - minLonSelf) / deltaLonSelf), - maxX = Math.ceil((this.imageWidth - 1) * (maxLonOther - minLonSelf) / deltaLonSelf); - - minY = WWMath.clamp(minY, 0, this.imageHeight - 1); - maxY = WWMath.clamp(maxY, 0, this.imageHeight - 1); - minX = WWMath.clamp(minX, 0, this.imageWidth - 1); - maxX = WWMath.clamp(maxX, 0, this.imageWidth - 1); - - var pixels = this.imageData, - min = Number.MAX_VALUE, - max = -min; - - for (var y = minY; y <= maxY; y++) { - for (var x = minX; x <= maxX; x++) { - var p = pixels[Math.floor(x + y * this.imageWidth)]; - if (min > p) { - min = p; - } - - if (max < p) { - max = p; - } - } - } - - if (result[0] > min) { - result[0] = min; - } - - if (result[1] < max) { - result[1] = max; - } - } - - return result; -}; - -/** - * Determines the minimum and maximum elevations within this elevation image and stores those values within - * this object. See [minAndMaxElevationsForSector]{@link ElevationImage#minAndMaxElevationsForSector} - */ -ElevationImage.prototype.findMinAndMaxElevation = function () { - this.hasData = false; - - if (this.imageData && this.imageData.length > 0) { - this.hasData = true; - this.minElevation = Number.MAX_VALUE; - this.maxElevation = -Number.MAX_VALUE; - - var pixels = this.imageData, - pixelCount = this.imageWidth * this.imageHeight; - - for (var i = 0; i < pixelCount; i++) { - var p = pixels[i]; - if (this.minElevation > p) { - this.minElevation = p; - } - if (this.maxElevation < p) { - this.maxElevation = p; - } - } - } -}; - -export default ElevationImage; diff --git a/web/src/gis/globe/ElevationModel.js b/web/src/gis/globe/ElevationModel.js deleted file mode 100644 index ba938d03..00000000 --- a/web/src/gis/globe/ElevationModel.js +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ElevationModel - */ -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; - - -/** - * Constructs an elevation model. - * @alias ElevationModel - * @constructor - * @classdesc Represents the elevations for an area, often but not necessarily the whole globe. - */ -function ElevationModel() { - - /** - * Internal use only - * The unique ID of this model. - * @type {Array} - * @ignore - */ - this.id = 0; - - /** - * A string identifying this elevation model's current state. Used to compare states during rendering to - * determine whether globe-state dependent cached values must be updated. Applications typically do not - * interact with this property. It is primarily used by shapes and terrain generators. - * @memberof ElevationModel.prototype - * @readonly - * @type {String} - */ - this.stateKey = ""; - - /** - * The list of all elevation coverages usable by this model. - * @type {Array} - */ - this.coverages = []; - - this.scratchLocation = new Location(0, 0); - - this.computeStateKey(); - -} - -Object.defineProperties(ElevationModel.prototype, { - /** - * Indicates the last time the coverages changed, in milliseconds since midnight Jan 1, 1970. - * @type {Number} - * @readonly - */ - timestamp: { - get: function () { - var maxTimestamp = 0; - - var i, len; - for (i = 0, len = this.coverages.length; i < len; i++) { - var coverage = this.coverages[i]; - if (maxTimestamp < coverage.timestamp) { - maxTimestamp = coverage.timestamp; - } - } - - return maxTimestamp; - } - }, - - /** - * This model's minimum elevation in meters across all enabled coverages. - * @type {Number} - * @readonly - */ - minElevation: { - get: function () { - var minElevation = Number.MAX_VALUE; - - for (var i = 0, len = this.coverages.length; i < len; i++) { - var coverage = this.coverages[i]; - if (coverage.enabled && coverage.minElevation < minElevation) { - minElevation = coverage.minElevation; - } - } - - return minElevation !== Number.MAX_VALUE ? minElevation : 0; // no coverages or all coverages disabled - } - }, - - /** - * This model's maximum elevation in meters across all enabled coverages. - * @type {Number} - * @readonly - */ - maxElevation: { - get: function () { - var maxElevation = -Number.MAX_VALUE; - - for (var i = 0, len = this.coverages.length; i < len; i++) { - var coverage = this.coverages[i]; - if (coverage.enabled && coverage.maxElevation > maxElevation) { - maxElevation = coverage.maxElevation; - } - } - - return maxElevation !== -Number.MAX_VALUE ? maxElevation : 0; // no coverages or all coverages disabled - } - } -}); - -/** - * Internal use only - * Used to assign unique IDs to elevation models for use in their state key. - * @type {Number} - * @ignore - */ -ElevationModel.idPool = 0; - -/** - * Internal use only - * Sets the state key to a new unique value. - * @ignore - */ -ElevationModel.prototype.computeStateKey = function () { - this.id = ++ElevationModel.idPool; - this.stateKey = "elevationModel " + this.id.toString() + " "; -}; - -/** - * Internal use only - * The comparison function used for sorting elevation coverages. - * @ignore - */ -ElevationModel.prototype.coverageComparator = function (coverage1, coverage2) { - var res1 = coverage1.resolution; - var res2 = coverage2.resolution; - // sort from lowest resolution to highest - return res1 > res2 ? -1 : res1 === res2 ? 0 : 1; -}; - -/** - * Internal use only - * Perform common actions required when the list of available coverages changes. - * @ignore - */ -ElevationModel.prototype.performCoverageListChangedActions = function () { - if (this.coverages.length > 1) { - this.coverages.sort(this.coverageComparator); - } - - this.computeStateKey(); -}; - -/** - * Adds an elevation coverage to this elevation model and sorts the list. Duplicate coverages will be ignored. - * - * @param coverage The elevation coverage to add. - * @return {Boolean} true if the ElevationCoverage as added; false if the coverage was a duplicate. - * @throws ArgumentError if the specified elevation coverage is null. - */ -ElevationModel.prototype.addCoverage = function (coverage) { - if (!coverage) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "addCoverage", "missingCoverage")); - } - - if (!this.containsCoverage(coverage)) { - this.coverages.push(coverage); - this.performCoverageListChangedActions(); - return true; - } - - return false; -}; - -/** - * Removes all elevation coverages from this elevation model. - */ -ElevationModel.prototype.removeAllCoverages = function () { - if (this.coverages.length > 0) { - this.coverages = []; - this.performCoverageListChangedActions(); - } -}; - -/** - * Removes a specific elevation coverage from this elevation model. - * - * @param coverage The elevation model to remove. - * - * @throws ArgumentError if the specified elevation coverage is null. - */ -ElevationModel.prototype.removeCoverage = function (coverage) { - if (!coverage) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "removeCoverage", "missingCoverage")); - } - - var index = this.coverages.indexOf(coverage); - if (index >= 0) { - this.coverages.splice(index, 1); - this.performCoverageListChangedActions(); - } -}; - -/** - * Returns true if this ElevationModel contains the specified ElevationCoverage, and false otherwise. - * - * @param coverage the ElevationCoverage to test. - * @return {Boolean} true if the ElevationCoverage is in this ElevationModel; false otherwise. - * @throws ArgumentError if the ElevationCoverage is null. - */ -ElevationModel.prototype.containsCoverage = function (coverage) { - if (!coverage) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "containsCoverage", "missingCoverage")); - } - var index = this.coverages.indexOf(coverage); - return index >= 0; -}; - -/** - * Returns the minimum and maximum elevations within a specified sector. - * @param {Sector} sector The sector for which to determine extreme elevations. - * @returns {Number[]} An array containing the minimum and maximum elevations within the specified sector. If no coverage - * can satisfy the request, a min and max of zero is returned. - * @throws {ArgumentError} If the specified sector is null or undefined. - */ -ElevationModel.prototype.minAndMaxElevationsForSector = function (sector) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "minAndMaxElevationsForSector", "missingSector")); - } - - // Initialize the min and max elevations to the largest and smallest numbers, respectively. This has the - // effect of moving the extremes with each subsequent coverage as needed, without unintentionally capturing - // zero elevation. If we initialized this array with zeros the result would always contain zero, even when - // elevations in the sector are all above or below zero. This is critical for tile bounding boxes. - - var result = [Number.MAX_VALUE, -Number.MAX_VALUE]; - - for (var i = this.coverages.length - 1; i >= 0; i--) { - var coverage = this.coverages[i]; - if (coverage.enabled && coverage.coverageSector.intersects(sector)) { - if (coverage.minAndMaxElevationsForSector(sector, result)) { - break; // coverage completely fills the sector, ignore the remaining coverages - } - } - } - - return result[0] !== Number.MAX_VALUE ? result : [0, 0]; // no coverages, all coverages disabled, or no coverages intersect the sector -}; - -/** - * Returns the elevation at a specified location. - * @param {Number} latitude The location's latitude in degrees. - * @param {Number} longitude The location's longitude in degrees. - * @returns {Number} The elevation at the specified location, in meters. Returns zero if the location is - * outside the coverage area of this model. - */ -ElevationModel.prototype.elevationAtLocation = function (latitude, longitude) { - var i, n = this.coverages.length; - for (i = n - 1; i >= 0; i--) { - var coverage = this.coverages[i]; - if (coverage.enabled && coverage.coverageSector.containsLocation(latitude, longitude)) { - var elevation = coverage.elevationAtLocation(latitude, longitude); - if (elevation !== null) { - return elevation; - } - } - } - - return 0; -}; - -/** - * Internal use only - * Returns the index of the coverage most closely matching the supplied resolution and overlapping the supplied - * sector or point area of interest. At least one area of interest parameter must be non-null. - * @param {Sector} sector An optional sector area of interest. Setting this parameter to null will cause it to be ignored. - * @param {Location} location An optional point area of interest. Setting this parameter to null will cause it to be ignored. - * @param {Number} targetResolution The desired elevation resolution, in degrees. (To compute degrees from - * meters, divide the number of meters by the globe's radius to obtain radians and convert the result to degrees.) - * @returns {Number} The index of the coverage most closely matching the requested resolution. - * @ignore - */ -ElevationModel.prototype.preferredCoverageIndex = function (sector, location, targetResolution) { - - var i, - n = this.coverages.length, - minResDiff = Number.MAX_VALUE, - minDiffIdx = -1; - - for (i = 0; i < n; i++) { - var coverage = this.coverages[i], - validCoverage = coverage.enabled && (sector !== null && coverage.coverageSector.intersects(sector) || - location !== null && coverage.coverageSector.containsLocation(location.latitude, location.longitude)); - if (validCoverage) { - var resDiff = Math.abs(coverage.resolution - targetResolution); - if (resDiff > minResDiff) { - return minDiffIdx; - } - minResDiff = resDiff; - minDiffIdx = i; - } - } - - return minDiffIdx; -}; - -/** - * Returns the best coverage available for a particular resolution, - * @param {Number} latitude The location's latitude in degrees. - * @param {Number} longitude The location's longitude in degrees. - * @param {Number} targetResolution The desired elevation resolution, in degrees. (To compute degrees from - * meters, divide the number of meters by the globe's radius to obtain radians and convert the result to degrees.) - * @returns {ElevationCoverage} The coverage most closely matching the requested resolution. Returns null if no coverage is available at this - * location. - * @throws {ArgumentError} If the specified resolution is not positive. - */ -ElevationModel.prototype.bestCoverageAtLocation = function (latitude, longitude, targetResolution) { - - if (!targetResolution || targetResolution < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "bestCoverageAtLocation", "invalidResolution")); - } - - this.scratchLocation.set(latitude, longitude); - var preferredIndex = this.preferredCoverageIndex(null, this.scratchLocation, targetResolution); - if (preferredIndex >= 0) { - return this.coverages[preferredIndex]; - } - - return null; -}; - -/** - * Returns the elevations at locations within a specified sector. - * @param {Sector} sector The sector for which to determine the elevations. - * @param {Number} numLat The number of latitudinal sample locations within the sector. - * @param {Number} numLon The number of longitudinal sample locations within the sector. - * @param {Number} targetResolution The desired elevation resolution, in degrees. (To compute degrees from - * meters, divide the number of meters by the globe's radius to obtain radians and convert the result to degrees.) - * @param {Number[]} result An array in which to return the requested elevations. - * @returns {Number} The resolution actually achieved, which may be greater than that requested if the - * elevation data for the requested resolution is not currently available. - * @throws {ArgumentError} If the specified sector, targetResolution, or result array is null or undefined, or if either of the - * specified numLat or numLon values is less than one. - */ -ElevationModel.prototype.elevationsForGrid = function (sector, numLat, numLon, targetResolution, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "elevationsForGrid", "missingSector")); - } - - if (!numLat || !numLon || numLat < 1 || numLon < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "elevationsForGrid", - "The specified number of latitudinal or longitudinal positions is less than one.")); - } - - if (!targetResolution) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "elevationsForGrid", "missingTargetResolution")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ElevationModel", "elevationsForGrid", "missingResult")); - } - - result.fill(NaN); - var resolution = Number.MAX_VALUE, - resultFilled = false, - preferredIndex = this.preferredCoverageIndex(sector, null, targetResolution); - - if (preferredIndex >= 0) { - for (var i = preferredIndex; !resultFilled && i >= 0; i--) { - var coverage = this.coverages[i]; - if (coverage.enabled && coverage.coverageSector.intersects(sector)) { - resultFilled = coverage.elevationsForGrid(sector, numLat, numLon, result); - if (resultFilled) { - resolution = coverage.resolution; - } - } - } - } - - if (!resultFilled) { - var n = result.length; - for (i = 0; i < n; i++) { - if (isNaN(result[i])) { - result[i] = 0; - } - } - } - - return resolution; -}; - -export default ElevationModel; - diff --git a/web/src/gis/globe/GebcoElevationCoverage.js b/web/src/gis/globe/GebcoElevationCoverage.js deleted file mode 100644 index 211d36c8..00000000 --- a/web/src/gis/globe/GebcoElevationCoverage.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GebcoElevationCoverage - */ -import Sector from '../geom/Sector'; -import TiledElevationCoverage from '../globe/TiledElevationCoverage'; -import WmsUrlBuilder from '../util/WmsUrlBuilder'; - - -/** - * Constructs an Earth elevation coverage using GEBCO data. - * @alias GebcoElevationCoverage - * @constructor - * @augments TiledElevationCoverage - * @classdesc Provides elevations for Earth. Elevations are drawn from the NASA WorldWind elevation service. - */ -function GebcoElevationCoverage() { - TiledElevationCoverage.call(this, { - coverageSector: Sector.FULL_SPHERE, - resolution: 0.008333333333333, - retrievalImageFormat: "application/bil16", - minElevation: -11000, - maxElevation: 8850, - urlBuilder: new WmsUrlBuilder("https://worldwind26.arc.nasa.gov/elev", "GEBCO", "", "1.3.0") - }); - - this.displayName = "GEBCO Earth Elevation Coverage"; -} - -GebcoElevationCoverage.prototype = Object.create(TiledElevationCoverage.prototype); - -export default GebcoElevationCoverage; diff --git a/web/src/gis/globe/Globe.js b/web/src/gis/globe/Globe.js deleted file mode 100644 index 1e30482a..00000000 --- a/web/src/gis/globe/Globe.js +++ /dev/null @@ -1,651 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Globe - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import BoundingBox from '../geom/BoundingBox'; -import Logger from '../util/Logger'; -import ProjectionWgs84 from '../projections/ProjectionWgs84'; -import Sector from '../geom/Sector'; -import Tessellator from '../globe/Tessellator'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs an ellipsoidal Globe with default radii for Earth (WGS84). - * @alias Globe - * @constructor - * @classdesc Represents an ellipsoidal globe. The default configuration represents Earth but may be changed. - * To configure for another planet, set the globe's equatorial and polar radii properties and its - * eccentricity-squared property. - * <p> - * A globe uses a Cartesian coordinate system whose origin is at the globe's center. It's Y axis points to the - * north pole, the Z axis points to the intersection of the prime meridian and the equator, - * and the X axis completes a right-handed coordinate system, is in the equatorial plane and 90 degrees east - * of the Z axis. - * <p> - * All Cartesian coordinates and elevations are in meters. - - * @param {ElevationModel} elevationModel The elevation model to use for this globe. - * @param {GeographicProjection} projection The projection to apply to the globe. May be null or undefined, - * in which case no projection is applied and the globe is a WGS84 ellipsoid. - * @throws {ArgumentError} If the specified elevation model is null or undefined. - */ -function Globe(elevationModel, projection) { - if (!elevationModel) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", - "constructor", "Elevation model is null or undefined.")); - } - /** - * This globe's elevation model. - * @type {ElevationModel} - */ - this.elevationModel = elevationModel; - - /** - * This globe's equatorial radius in meters. - * - * @type {Number} - * @default WGS 84 semi-major axis (6378137.0 meters) - */ - this.equatorialRadius = WorldWind.WGS84_SEMI_MAJOR_AXIS; - var f = 1 / WorldWind.WGS84_INVERSE_FLATTENING; - - /** - * This globe's polar radius in meters. - * @type {Number} - * @default WGS 84 semi-minor axis (6356752.3142 meters). Taken from NGA.STND.0036_1.0.0_WGS84, section 3.2. - */ - this.polarRadius = this.equatorialRadius * (1 - f); - - /** - * This globe's eccentricity squared. - * @type {Number} - * @default WGS 84 first eccentricity squared (6.694379990141e-3). Taken from NGA.STND.0036_1.0.0_WGS84, section 3.3. - */ - this.eccentricitySquared = 2 * f - f * f; - - /** - * The tessellator used to create this globe's terrain. - * @type {Tessellator} - */ - this.tessellator = new Tessellator(); - - // Internal. Intentionally not documented. - this._projection = projection || new ProjectionWgs84(); - - // Internal. Intentionally not documented. - this._offset = 0; - - // Internal. Intentionally not documented. - this.offsetVector = new Vec3(0, 0, 0); - - // A unique ID for this globe. Intentionally not documented. - this.id = ++Globe.idPool; - - this._stateKey = "globe " + this.id.toString() + " "; -} - -Globe.idPool = 0; // Used to assign unique IDs to globes for use in their state keys. - -Object.defineProperties(Globe.prototype, { - /** - * A string identifying this globe's current state. Used to compare states during rendering to - * determine whether globe-state dependent cached values must be updated. Applications typically do not - * interact with this property. - * @memberof Globe.prototype - * @readonly - * @type {String} - */ - stateKey: { - get: function () { - return this._stateKey + this.elevationModel.stateKey + "offset " + this.offset.toString() + " " - + this.projection.stateKey; - } - }, - - /** - * Indicates whether this globe is 2D and continuous with itself -- that it should scroll continuously - * horizontally. - * @memberof Globe.prototype - * @readonly - * @type {Boolean} - */ - continuous: { - get: function () { - return this.projection.continuous; - } - }, - - /** - * The projection used by this globe. - * @memberof Globe.prototype - * @default {@link ProjectionWgs84} - * @type {GeographicProjection} - */ - projection: { - get: function () { - return this._projection; - }, - set: function (projection) { - if (!projection) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", - "projection", "missingProjection")); - } - - if (this.projection != projection) { - this.tessellator = new Tessellator(); - } - this._projection = projection; - } - }, - - /** - * The projection limits of the associated projection. - * @memberof Globe.prototype - * @type {Sector} - */ - projectionLimits: { - get: function () { - return this._projection.projectionLimits; - } - }, - - /** - * An offset to apply to this globe when translating between Geographic positions and Cartesian points. - * Used during scrolling to position points appropriately. - * Applications typically do not access this property. It is used by the associated globe. - * @memberof Globe.prototype - * @type {Number} - */ - offset: { - get: function () { - return this._offset; - }, - set: function (offset) { - this._offset = offset; - this.offsetVector[0] = offset * 2 * Math.PI * this.equatorialRadius; - } - } -}); - -/** - * Indicates whether this is a 2D globe. - * @returns {Boolean} true if this is a 2D globe, otherwise false. - */ -Globe.prototype.is2D = function () { - return this.projection.is2D; -}; - -/** - * Computes a Cartesian point from a specified position. - * See this class' Overview section for a description of the Cartesian coordinate system used. - * @param {Number} latitude The position's latitude. - * @param {Number} longitude The position's longitude. - * @param {Number} altitude The position's altitude. - * @param {Vec3} result A reference to a pre-allocated {@link Vec3} in which to return the computed X, - * Y and Z Cartesian coordinates. - * @returns {Vec3} The result argument. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.computePointFromPosition = function (latitude, longitude, altitude, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "computePointFromPosition", - "missingResult")); - } - - return this.projection.geographicToCartesian(this, latitude, longitude, altitude, this.offsetVector, result); -}; - -/** - * Computes a Cartesian point from a specified location. - * See this class' Overview section for a description of the Cartesian coordinate system used. - * @param {Number} latitude The position's latitude. - * @param {Number} longitude The position's longitude. - * @param {Vec3} result A reference to a pre-allocated {@link Vec3} in which to return the computed X, - * Y and Z Cartesian coordinates. - * @returns {Vec3} The result argument. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.computePointFromLocation = function (latitude, longitude, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "computePointFromLocation", - "missingResult")); - } - - return this.computePointFromPosition(latitude, longitude, 0, result); -}; - -/** - * Computes a grid of Cartesian points within a specified sector and relative to a specified Cartesian - * reference point. - * <p> - * This method is used to compute a collection of points within a sector. It is used by tessellators to - * efficiently generate a tile's interior points. The number of points to generate is indicated by the numLon - * and numLat parameters. - * <p> - * For each implied position within the sector, an elevation value is specified via an array of elevations. The - * calculation at each position incorporates the associated elevation. There must be numLat x numLon elevations - * in the array. - * - * @param {Sector} sector The sector for which to compute the points. - * @param {Number} numLat The number of latitudinal points in the grid. - * @param {Number} numLon The number of longitudinal points in the grid. - * @param {Number[]} elevations An array of elevations to incorporate in the point calculations. There must be - * one elevation value in the array for each generated point. Elevations are in meters. There must be - * numLat x numLon elevations in the array. - * @param {Vec3} referencePoint The X, Y and Z Cartesian coordinates to subtract from the computed coordinates. - * This makes the computed coordinates relative to the specified point. - * @param {Float32Array} result A typed array to hold the computed coordinates. It must be at least of - * size numLat x numLon. The points are returned in row major order, beginning with the row of minimum latitude. - * @returns {Float32Array} The specified result argument. - * @throws {ArgumentError} if the specified sector, elevations array or results arrays are null or undefined, or - * if the lengths of any of the arrays are insufficient. - */ -Globe.prototype.computePointsForGrid = function (sector, numLat, numLon, elevations, referencePoint, result) { - if (!sector) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", - "computePointsFromPositions", "missingSector")); - } - - if (numLat < 1 || numLon < 1) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "computePointsFromPositions", - "Number of latitude or longitude locations is less than one.")); - } - - var numPoints = numLat * numLon; - if (!elevations || elevations.length < numPoints) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "computePointsFromPositions", - "Elevations array is null, undefined or insufficient length.")); - } - - if (!result || result.length < numPoints) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "computePointsFromPositions", - "Result array is null, undefined or insufficient length.")); - } - - return this.projection.geographicToCartesianGrid(this, sector, numLat, numLon, elevations, referencePoint, - this.offsetVector, result); -}; - -/** - * Computes a geographic position from a specified Cartesian point. - * - * See this class' Overview section for a description of the Cartesian coordinate system used. - * - * @param {Number} x The X coordinate. - * @param {Number} y The Y coordinate. - * @param {Number} z The Z coordinate. - * @param {Position} result A pre-allocated {@link Position} instance in which to return the computed position. - * @returns {Position} The specified result position. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.computePositionFromPoint = function (x, y, z, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "computePositionFromPoint", - "missingResult")); - } - - this.projection.cartesianToGeographic(this, x, y, z, this.offsetVector, result); - - // Wrap if the globe is continuous. - if (this.continuous) { - if (result.longitude < -180) { - result.longitude += 360; - } else if (result.longitude > 180) { - result.longitude -= 360; - } - } - - return result; -}; - -/** - * Computes the radius of this globe at a specified location. - * @param {Number} latitude The locations' latitude. - * @param {Number} longitude The locations' longitude. - * @returns {Number} The radius at the specified location. - */ -Globe.prototype.radiusAt = function (latitude, longitude) { - var sinLat = Math.sin(latitude * Angle.DEGREES_TO_RADIANS), - rpm = this.equatorialRadius / Math.sqrt(1.0 - this.eccentricitySquared * sinLat * sinLat); - - return rpm * Math.sqrt(1.0 + (this.eccentricitySquared * this.eccentricitySquared - 2.0 * this.eccentricitySquared) * sinLat * sinLat); -}; - -/** - * Computes the normal vector to this globe's surface at a specified location. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @param {Vec3} result A pre-allocated {@Link Vec3} instance in which to return the computed vector. The returned - * normal vector is unit length. - * @returns {Vec3} The specified result vector. The returned normal vector is unit length. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.surfaceNormalAtLocation = function (latitude, longitude, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "surfaceNormalAtLocation", - "missingResult")); - } - - // For backwards compatibility, check whether the projection defines a surfaceNormalAtLocation function - // before calling it. If it's not available, use the old code to compute the normal. - if (this.projection.surfaceNormalAtLocation) { - return this.projection.surfaceNormalAtLocation(this, latitude, longitude, result); - } - - if (this.is2D()) { - result[0] = 0; - result[1] = 0; - result[2] = 1; - - return result; - } - - var cosLat = Math.cos(latitude * Angle.DEGREES_TO_RADIANS), - cosLon = Math.cos(longitude * Angle.DEGREES_TO_RADIANS), - sinLat = Math.sin(latitude * Angle.DEGREES_TO_RADIANS), - sinLon = Math.sin(longitude * Angle.DEGREES_TO_RADIANS); - - result[0] = cosLat * sinLon; - result[1] = sinLat; - result[2] = cosLat * cosLon; - - return result.normalize(); -}; - -/** - * Computes the normal vector to this globe's surface at a specified Cartesian point. - * @param {Number} x The point's X coordinate. - * @param {Number} y The point's Y coordinate. - * @param {Number} z The point's Z coordinate. - * @param {Vec3} result A pre-allocated {@Link Vec3} instance in which to return the computed vector. The returned - * normal vector is unit length. - * @returns {Vec3} The specified result vector. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.surfaceNormalAtPoint = function (x, y, z, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "surfaceNormalAtPoint", - "missingResult")); - } - - // For backwards compatibility, check whether the projection defines a surfaceNormalAtPoint function - // before calling it. If it's not available, use the old code to compute the normal. - if (this.projection.surfaceNormalAtPoint) { - return this.projection.surfaceNormalAtPoint(this, x, y, z, result); - } - - if (this.is2D()) { - result[0] = 0; - result[1] = 0; - result[2] = 1; - - return result; - } - - var eSquared = this.equatorialRadius * this.equatorialRadius, - polSquared = this.polarRadius * this.polarRadius; - - result[0] = x / eSquared; - result[1] = y / polSquared; - result[2] = z / eSquared; - - return result.normalize(); -}; - -/** - * Computes the north-pointing tangent vector to this globe's surface at a specified location. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @param {Vec3} result A pre-allocated {@Link Vec3} instance in which to return the computed vector. The returned - * tangent vector is unit length. - * @returns {Vec3} The specified result vector. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.northTangentAtLocation = function (latitude, longitude, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "northTangentAtLocation", - "missingResult")); - } - - return this.projection.northTangentAtLocation(this, latitude, longitude, result); -}; - -/** - * Computes the north-pointing tangent vector to this globe's surface at a specified Cartesian point. - * @param {Number} x The point's X coordinate. - * @param {Number} y The point's Y coordinate. - * @param {Number} z The point's Z coordinate. - * @param {Vec3} result A pre-allocated {@Link Vec3} instance in which to return the computed vector. The returned - * tangent vector is unit length. - * @returns {Vec3} The specified result vector. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Globe.prototype.northTangentAtPoint = function (x, y, z, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "northTangentAtPoint", - "missingResult")); - } - - return this.projection.northTangentAtPoint(this, x, y, z, this.offsetVector, result); -}; - -/** - * Indicates whether this globe intersects a specified frustum. - * @param {Frustum} frustum The frustum to test. - * @returns {Boolean} true if this globe intersects the frustum, otherwise false. - * @throws {ArgumentError} If the specified frustum is null or undefined. - */ -Globe.prototype.intersectsFrustum = function (frustum) { - if (!frustum) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "intersectsFrustum", "missingFrustum")); - } - - if (this.is2D()) { - var bbox = new BoundingBox(); - bbox.setToSector(Sector.FULL_SPHERE, this, this.elevationModel.minElevation, - this.elevationModel.maxElevation); - - return bbox.intersectsFrustum(frustum); - } - - if (frustum.far.distance <= this.equatorialRadius) - return false; - if (frustum.left.distance <= this.equatorialRadius) - return false; - if (frustum.right.distance <= this.equatorialRadius) - return false; - if (frustum.top.distance <= this.equatorialRadius) - return false; - if (frustum.bottom.distance <= this.equatorialRadius) - return false; - if (frustum.near.distance <= this.equatorialRadius) - return false; - - return true; -}; - -/** - * Computes the first intersection of this globe with a specified line. The line is interpreted as a ray; - * intersection points behind the line's origin are ignored. - * @param {Line} line The line to intersect with this globe. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed point. - * @returns {boolean} true If the ray intersects the globe, otherwise false. - * @throws {ArgumentError} If the specified line or result argument is null or undefined. - */ -Globe.prototype.intersectsLine = function (line, result) { - if (!line) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "intersectWithRay", "missingLine")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "intersectsLine", "missingResult")); - } - - // Taken from "Mathematics for 3D Game Programming and Computer Graphics, Third Edition", Section 6.2.3. - // - // Note that the parameter n from equations 6.70 and 6.71 is omitted here. For an ellipsoidal globe this - // parameter is always 1, so its square and its product with any other value simplifies to the identity. - - var vx = line.direction[0], - vy = line.direction[1], - vz = line.direction[2], - sx = line.origin[0], - sy = line.origin[1], - sz = line.origin[2], - t; - - if (this.is2D()) { - if (vz == 0 && sz != 0) { // ray is parallel to and not coincident with the XY plane - return false; - } - - t = -sz / vz; // intersection distance, simplified for the XY plane - if (t < 0) { // intersection is behind the ray's origin - return false; - } - - result[0] = sx + vx * t; - result[1] = sy + vy * t; - result[2] = sz + vz * t; - - return true; - } else { - var eqr = this.equatorialRadius, eqr2 = eqr * eqr, m = eqr / this.polarRadius, m2 = m * m, a, b, c, d; - - a = vx * vx + m2 * vy * vy + vz * vz; - b = 2 * (sx * vx + m2 * sy * vy + sz * vz); - c = sx * sx + m2 * sy * sy + sz * sz - eqr2; - d = b * b - 4 * a * c; // discriminant - - if (d < 0) { - return false; - } - - t = (-b - Math.sqrt(d)) / (2 * a); - // check if the nearest intersection point is in front of the origin of the ray - if (t > 0) { - result[0] = sx + vx * t; - result[1] = sy + vy * t; - result[2] = sz + vz * t; - return true; - } - - t = (-b + Math.sqrt(d)) / (2 * a); - // check if the second intersection point is in the front of the origin of the ray - if (t > 0) { - result[0] = sx + vx * t; - result[1] = sy + vy * t; - result[2] = sz + vz * t; - return true; - } - - // the intersection points were behind the origin of the provided line - return false; - } -}; - -/** - * Returns the time at which any elevations associated with this globe last changed. - * @returns {Number} The time in milliseconds relative to the Epoch of the most recent elevation change. - */ -Globe.prototype.elevationTimestamp = function () { - return this.elevationModel.timestamp; -}; - -/** - * Returns this globe's minimum elevation. - * @returns {Number} This globe's minimum elevation. - */ -Globe.prototype.minElevation = function () { - return this.elevationModel.minElevation; -}; - -/** - * Returns this globe's maximum elevation. - * @returns {Number} This globe's maximum elevation. - */ -Globe.prototype.maxElevation = function () { - return this.elevationModel.maxElevation; -}; - -/** - * Returns the minimum and maximum elevations within a specified sector of this globe. - * @param {Sector} sector The sector for which to determine extreme elevations. - * @returns {Number[]} The An array containing the minimum and maximum elevations. - * @throws {ArgumentError} If the specified sector is null or undefined. - */ -Globe.prototype.minAndMaxElevationsForSector = function (sector) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "minAndMaxElevationsForSector", - "missingSector")); - } - - return this.elevationModel.minAndMaxElevationsForSector(sector); -}; - -/** - * Returns the elevation at a specified location. - * @param {Number} latitude The location's latitude in degrees. - * @param {Number} longitude The location's longitude in degrees. - * @returns {Number} The elevation at the specified location, in meters. Returns zero if the location is - * outside the coverage area of this elevation model. - */ -Globe.prototype.elevationAtLocation = function (latitude, longitude) { - return this.elevationModel.elevationAtLocation(latitude, longitude); -}; - -/** - * Returns the elevations at locations within a specified sector. - * @param {Sector} sector The sector for which to determine the elevations. - * @param {Number} numLat The number of latitudinal sample locations within the sector. - * @param {Number} numLon The number of longitudinal sample locations within the sector. - * @param {Number} targetResolution The desired elevation resolution, in degrees. (To compute degrees from - * meters, divide the number of meters by the globe's radius to obtain radians and convert the result to degrees.) - * @param {Number[]} result An array in which to return the requested elevations. - * @returns {Number} The resolution actually achieved, which may be greater than that requested if the - * elevation data for the requested resolution is not currently available. - * @throws {ArgumentError} If the specified sector or result array is null or undefined, or if either of the - * specified numLat or numLon values is less than one. - */ -Globe.prototype.elevationsForGrid = function (sector, numLat, numLon, targetResolution, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", "elevationsForSector", "missingSector")); - } - - if (numLat <= 0 || numLon <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", - "elevationsForSector", "numLat or numLon is less than 1")); - } - - if (!result || result.length < numLat * numLon) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Globe", - "elevationsForSector", "missingArray")); - } - - return this.elevationModel.elevationsForGrid(sector, numLat, numLon, targetResolution, result); -}; - -export default Globe; - diff --git a/web/src/gis/globe/Terrain.js b/web/src/gis/globe/Terrain.js deleted file mode 100644 index f3053ad4..00000000 --- a/web/src/gis/globe/Terrain.js +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Terrain - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a Terrain object. - * @alias Terrain - * @constructor - * @classdesc Represents terrain and provides functions for computing points on or relative to the terrain. - * Applications do not typically interact directly with this class. - */ -function Terrain(globe, tessellator, terrainTiles, verticalExaggeration) { - - /** - * The globe associated with this terrain. - * @type {Globe} - */ - this.globe = globe; - - /** - * The vertical exaggeration of this terrain. - * @type {Number} - */ - this.verticalExaggeration = verticalExaggeration; - - /** - * The sector spanned by this terrain. - * @type {Sector} - */ - this.sector = terrainTiles.sector; - - /** - * The tessellator used to generate this terrain. - * @type {Tessellator} - */ - this.tessellator = tessellator; - - /** - * The surface geometry for this terrain - * @type {TerrainTile[]} - */ - this.surfaceGeometry = terrainTiles.tileArray; - - /** - * A string identifying this terrain's current state. Used to compare states during rendering to - * determine whether state dependent cached values must be updated. Applications typically do not - * interact with this property. - * @readonly - * @type {String} - */ - this.stateKey = globe.stateKey + " ve " + verticalExaggeration.toString(); -} - -Terrain.scratchPoint = new Vec3(0, 0, 0); - -/** - * Computes a Cartesian point at a location on the surface of this terrain. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @param {Number} offset Distance above the terrain, in meters, at which to compute the point. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed point. - * @returns {Vec3} The specified result parameter, set to the coordinates of the computed point. If the - * specfied location is not within this terrain, the associated globe is used to compute the point. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Terrain.prototype.surfacePoint = function (latitude, longitude, offset, result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Terrain", "surfacePoint", "missingResult")); - } - - for (var i = 0, len = this.surfaceGeometry.length; i < len; i++) { - if (this.surfaceGeometry[i].sector.containsLocation(latitude, longitude)) { - this.surfaceGeometry[i].surfacePoint(latitude, longitude, result); - - if (offset) { - var normal = this.globe.surfaceNormalAtPoint(result[0], result[1], result[2], Terrain.scratchPoint); - result[0] += normal[0] * offset; - result[1] += normal[1] * offset; - result[2] += normal[2] * offset; - } - - return result; - } - } - - // No tile was found that contains the location, so approximate one using the globe. - var h = offset + this.globe.elevationAtLocation(latitude, longitude) * this.verticalExaggeration; - this.globe.computePointFromPosition(latitude, longitude, h, result); - - return result; -}; - -/** - * Computes a Cartesian point at a location on the surface of this terrain according to a specified - * altitude mode. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @param {Number} offset Distance above the terrain, in meters relative to the specified altitude mode, at - * which to compute the point. - * @param {String} altitudeMode The altitude mode to use to compute the point. Recognized values are - * WorldWind.ABSOLUTE, WorldWind.CLAMP_TO_GROUND and - * WorldWind.RELATIVE_TO_GROUND. The mode WorldWind.ABSOLUTE is used if the - * specified mode is null, undefined or unrecognized, or if the specified location is outside this terrain. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed point. - * @returns {Vec3} The specified result parameter, set to the coordinates of the computed point. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -Terrain.prototype.surfacePointForMode = function (latitude, longitude, offset, altitudeMode, result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Terrain", "surfacePointForMode", "missingResult")); - } - - if (!altitudeMode) - altitudeMode = WorldWind.ABSOLUTE; - - if (altitudeMode === WorldWind.CLAMP_TO_GROUND) { - return this.surfacePoint(latitude, longitude, 0, result); - } else if (altitudeMode === WorldWind.RELATIVE_TO_GROUND) { - return this.surfacePoint(latitude, longitude, offset, result); - } else { - var height = offset * this.verticalExaggeration; - this.globe.computePointFromPosition(latitude, longitude, height, result); - return result; - } -}; - -/** - * Initializes rendering state to draw a succession of terrain tiles. - * @param {DrawContext} dc The current draw context. - */ -Terrain.prototype.beginRendering = function (dc) { - if (this.globe && this.globe.tessellator) { - this.globe.tessellator.beginRendering(dc); - } -}; - -/** - * Restores rendering state after drawing a succession of terrain tiles. - * @param {DrawContext} dc The current draw context. - */ -Terrain.prototype.endRendering = function (dc) { - if (this.globe && this.globe.tessellator) { - this.globe.tessellator.endRendering(dc); - } -}; - -/** - * Initializes rendering state for drawing a specified terrain tile. - * @param {DrawContext} dc The current draw context. - * @param {TerrainTile} terrainTile The terrain tile subsequently drawn via this tessellator's render function. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Terrain.prototype.beginRenderingTile = function (dc, terrainTile) { - if (!terrainTile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Terrain", "beginRenderingTile", "missingTile")); - } - - if (this.globe && this.globe.tessellator) { - this.globe.tessellator.beginRenderingTile(dc, terrainTile); - } -}; - -/** - * Restores rendering state after drawing the most recent tile specified to - * [beginRenderingTile]{@link Terrain#beginRenderingTile}. - * @param {DrawContext} dc The current draw context. - * @param {TerrainTile} terrainTile The terrain tile most recently rendered. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Terrain.prototype.endRenderingTile = function (dc, terrainTile) { - // Intentionally empty. -}; - -/** - * Renders a specified terrain tile. - * @param {DrawContext} dc The current draw context. - * @param {TerrainTile} terrainTile The terrain tile to render. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Terrain.prototype.renderTile = function (dc, terrainTile) { - if (!terrainTile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Terrain", "renderTile", "missingTile")); - } - - if (this.globe && this.globe.tessellator) { - this.globe.tessellator.renderTile(dc, terrainTile); - } -}; - -/** - * Causes this terrain to perform the picking operations appropriate for the draw context's pick settings. - * Normally, this draws the terrain in a unique pick color and computes the picked terrain position. When the - * draw context is set to region picking mode this omits the computation of a picked terrain position. - * @param {DrawContext} dc The current draw context. - */ -Terrain.prototype.pick = function (dc) { - if (this.globe && this.globe.tessellator) { - this.globe.tessellator.pick(dc, this.surfaceGeometry, this); // use this terrain as the userObject - } -}; - -export default Terrain; diff --git a/web/src/gis/globe/TerrainTile.js b/web/src/gis/globe/TerrainTile.js deleted file mode 100644 index b1a319fc..00000000 --- a/web/src/gis/globe/TerrainTile.js +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TerrainTile - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Tile from '../util/Tile'; - - -/** - * Constructs a terrain tile. - * @alias TerrainTile - * @constructor - * @augments Tile - * @classdesc Represents a portion of a globe's terrain. Applications typically do not interact directly with - * this class. - * @param {Sector} sector The sector this tile covers. - * @param {Level} level The level this tile is associated with. - * @param {Number} row This tile's row in the associated level. - * @param {Number} column This tile's column in the associated level. - * @throws {ArgumentError} If the specified sector or level is null or undefined or the row or column arguments - * are less than zero. - */ -function TerrainTile(sector, level, row, column) { - Tile.call(this, sector, level, row, column); // args are checked in the superclass' constructor - - /** - * The transformation matrix that maps tile local coordinates to model coordinates. - * @type {Matrix} - */ - this.transformationMatrix = Matrix.fromIdentity(); - - /** - * The tile's model coordinate points. - * @type {Float32Array} - */ - this.points = null; - - /** - * Indicates the state of this tile when the model coordinate points were last updated. This is used to - * invalidate the points when this tile's state changes. - * @type {String} - */ - this.pointsStateKey = null; - - /** - * Indicates the state of this tile when the model coordinate VBO was last uploaded to GL. This is used to - * invalidate the VBO when the tile's state changes. - * @type {String} - */ - this.pointsVboStateKey = null; - - // Internal use. Intentionally not documented. - this.neighborMap = {}; - this.neighborMap[WorldWind.NORTH] = null; - this.neighborMap[WorldWind.SOUTH] = null; - this.neighborMap[WorldWind.EAST] = null; - this.neighborMap[WorldWind.WEST] = null; - - // Internal use. Intentionally not documented. - this._stateKey = null; - - // Internal use. Intentionally not documented. - this._elevationTimestamp = null; - - // Internal use. Intentionally not documented. - this.scratchArray = []; -} - -TerrainTile.prototype = Object.create(Tile.prototype); - -Object.defineProperties(TerrainTile.prototype, { - /** - * A string identifying the state of this tile as a function of the elevation model's timestamp and this - * tile's neighbors. Used to compare states during rendering to determine whether cached values must be - * updated. Applications typically do not interact with this property. - * @type {String} - * @memberof TerrainTile.prototype - * @readonly - */ - stateKey: { - get: function () { - if (!this._stateKey) { - this._stateKey = this.computeStateKey(); - } - - return this._stateKey; - } - } -}); - -/** - * Indicates the level of the tile adjacent to this tile in a specified direction. This returns null when this - * tile has no neighbor in that direction. - * @param {String} direction The cardinal direction. Must be one of WorldWind.NORTH, WorldWind.SOUTH, - * WorldWind.EAST or WorldWind.WEST. - * @returns {Level} The neighbor tile's level in the specified direction, or null if there is no neighbor. - */ -TerrainTile.prototype.neighborLevel = function (direction) { - return this.neighborMap[direction]; -}; - -/** - * Specifies the level of the tile adjacent to this tile in a specified direction. - * @param {String} direction The cardinal direction. Must be one of WorldWind.NORTH, WorldWind.SOUTH, - * WorldWind.EAST or WorldWind.WEST. - * @param {Level} level The neighbor tile's level in the specified direction, or null to indicate that there is - * no neighbor in that direction. - */ -TerrainTile.prototype.setNeighborLevel = function (direction, level) { - this.neighborMap[direction] = level; - this._stateKey = null; // cause updates to any neighbor-dependent cached state -}; - -/** - * Computes a point on the terrain at a specified location. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed point. - * @returns {Vec3} The result argument set to the computed point. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -TerrainTile.prototype.surfacePoint = function (latitude, longitude, result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TerrainTile", "surfacePoint", "missingResult")); - } - - var tileSector = this.sector, - minLat = tileSector.minLatitude, - maxLat = tileSector.maxLatitude, - minLon = tileSector.minLongitude, - maxLon = tileSector.maxLongitude, - tileWidth = this.tileWidth, - tileHeight = this.tileHeight, - s, t, si, ti, rowStride, vertices, points, k, sf, tf, x, y, z; - - // Compute the location's horizontal (s) and vertical (t) parameterized coordinates within the tiles 2D grid of - // points as a floating-point value in the range [0, tileWidth] and [0, tileHeight]. These coordinates indicate - // which cell contains the location, as well as the location's placement within the cell. Note that this method - // assumes that the caller has tested whether the location is contained within the tile's sector. - s = (longitude - minLon) / (maxLon - minLon) * tileWidth; - t = (latitude - minLat) / (maxLat - minLat) * tileHeight; - - // Get the coordinates for the four vertices defining the cell this point is in. Tile vertices start in the lower - // left corner and proceed in row major order across the tile. The tile contains one more vertex per row or - // column than the tile width or height. Vertices in the points array are organized in the - // following order: lower-left, lower-right, upper-left, upper-right. The cell's diagonal starts at the - // lower-left vertex and ends at the upper-right vertex. - si = s < tileWidth ? Math.floor(s) : tileWidth - 1; - ti = t < tileHeight ? Math.floor(t) : tileHeight - 1; - rowStride = tileWidth + 1; - - vertices = this.points; - points = this.scratchArray; // temporary working buffer - k = 3 * (si + ti * rowStride); // lower-left and lower-right vertices - for (var i = 0; i < 6; i++) { - points[i] = vertices[k + i]; - } - - k = 3 * (si + (ti + 1) * rowStride); // upper-left and upper-right vertices - for (var j = 6; j < 12; j++) { - points[j] = vertices[k + (j - 6)]; - } - - // Compute the location's corresponding point on the cell in tile local coordinates, - // given the fractional portion of the parameterized s and t coordinates. These values indicate the location's - // relative placement within the cell. The cell's vertices are defined in the following order: lower-left, - // lower-right, upper-left, upper-right. The cell's diagonal starts at the lower-right vertex and ends at the - // upper-left vertex. - sf = s < tileWidth ? s - Math.floor(s) : 1; - tf = t < tileHeight ? t - Math.floor(t) : 1; - - if (sf > tf) { - result[0] = points[0] + sf * (points[3] - points[0]) + tf * (points[6] - points[0]); - result[1] = points[1] + sf * (points[4] - points[1]) + tf * (points[7] - points[1]); - result[2] = points[2] + sf * (points[5] - points[2]) + tf * (points[8] - points[2]); - } - else { - result[0] = points[9] + (1 - sf) * (points[6] - points[9]) + (1 - tf) * (points[3] - points[9]); - result[1] = points[10] + (1 - sf) * (points[7] - points[10]) + (1 - tf) * (points[4] - points[10]); - result[2] = points[11] + (1 - sf) * (points[8] - points[11]) + (1 - tf) * (points[5] - points[11]); - } - - result[0] += this.referencePoint[0]; - result[1] += this.referencePoint[1]; - result[2] += this.referencePoint[2]; - - return result; -}; - -TerrainTile.prototype.update = function (dc) { - Tile.prototype.update.call(this, dc); - - var elevationTimestamp = dc.globe.elevationTimestamp(); - if (this._elevationTimestamp != elevationTimestamp) { - this._elevationTimestamp = elevationTimestamp; - this._stateKey = null; // cause updates to any elevation-dependent cached state - } -}; - -// Intentionally not documented. -TerrainTile.prototype.computeStateKey = function () { - var array = []; - array.push(this._elevationTimestamp); - array.push(this.neighborMap[WorldWind.NORTH] ? this.neighborMap[WorldWind.NORTH].compare(this.level) : 0); - array.push(this.neighborMap[WorldWind.SOUTH] ? this.neighborMap[WorldWind.SOUTH].compare(this.level) : 0); - array.push(this.neighborMap[WorldWind.EAST] ? this.neighborMap[WorldWind.EAST].compare(this.level) : 0); - array.push(this.neighborMap[WorldWind.WEST] ? this.neighborMap[WorldWind.WEST].compare(this.level) : 0); - - return array.join("."); -}; - -export default TerrainTile; diff --git a/web/src/gis/globe/TerrainTileList.js b/web/src/gis/globe/TerrainTileList.js deleted file mode 100644 index 4ced1357..00000000 --- a/web/src/gis/globe/TerrainTileList.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TerrainTileList - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Sector from '../geom/Sector'; - - -/** - * Constructs a terrain tile list, a container for terrain tiles that also has a tessellator and a sector - * associated with it. - * @alias TerrainTileList - * @constructor - * @classdesc Represents a portion of a globe's terrain. - * @param {Tessellator} tessellator The tessellator that created this terrain tile list. - * - */ -function TerrainTileList(tessellator) { - if (!tessellator) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TerrainTileList", "TerrainTileList", "missingTessellator")); - } - this.tessellator = tessellator; - this.sector = null; - this.tileArray = []; -} - -Object.defineProperties(TerrainTileList.prototype, { - /** - * The number of terrain tiles in this terrain tile list. - * @memberof TerrainTileList.prototype - * @readonly - * @type {Number} - */ - length: { - get: function () { - return this.tileArray.length; - } - } -}); - -TerrainTileList.prototype.addTile = function (tile) { - if (!tile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TerrainTileList", "addTile", "missingTile")); - } - - if (this.tileArray.indexOf(tile) == -1) { - this.tileArray.push(tile); - - if (!this.sector) { - this.sector = new Sector(0, 0, 0, 0); - this.sector.copy(tile.sector); - } else { - this.sector.union(tile.sector); - } - } -}; - -TerrainTileList.prototype.removeAllTiles = function () { - this.tileArray = []; - this.sector = null; -}; - -export default TerrainTileList; diff --git a/web/src/gis/globe/Tessellator.js b/web/src/gis/globe/Tessellator.js deleted file mode 100644 index 3b9a740b..00000000 --- a/web/src/gis/globe/Tessellator.js +++ /dev/null @@ -1,1528 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Tessellator - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import BasicProgram from '../shaders/BasicProgram'; -import LevelSet from '../util/LevelSet'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import MemoryCache from '../cache/MemoryCache'; -import PickedObject from '../pick/PickedObject'; -import Position from '../geom/Position'; -import Sector from '../geom/Sector'; -import Terrain from '../globe/Terrain'; -import TerrainTile from '../globe/TerrainTile'; -import TerrainTileList from '../globe/TerrainTileList'; -import Tile from '../util/Tile'; -import WWMath from '../util/WWMath'; -import WWUtil from '../util/WWUtil'; - - -/** - * Constructs a Tessellator. - * @alias Tessellator - * @constructor - * @classdesc Provides terrain tessellation for a globe. - */ -function Tessellator() { - // Parameterize top level subdivision in one place. - - // TilesInTopLevel describes the most coarse tile structure. - this.numRowsTilesInTopLevel = 1; // baseline: 4 - this.numColumnsTilesInTopLevel = 1; // baseline: 8 - - // The maximum number of levels that will ever be tessellated. - this.maximumSubdivisionDepth = 16; // baseline: 15 - - // tileWidth, tileHeight - the number of subdivisions a single tile has; this determines the sampling grid. - this.tileWidth = 256; // baseline: 32 - this.tileHeight = 256; // baseline: 32 - - /** - * Controls the level of detail switching for this layer. The next highest resolution level is - * used when an elevation tile's cell size is greater than this number of pixels, up to the maximum - * resolution of the elevation model. - * @type {Number} - * @default 1.75 - */ - this.detailControl = 40; - - this.levels = new LevelSet( - Sector.FULL_SPHERE, - new Location( - 360 / this.numRowsTilesInTopLevel, - 360 / this.numColumnsTilesInTopLevel), - this.maximumSubdivisionDepth, - this.tileWidth, - this.tileHeight); - - this.topLevelTiles = {}; - this.currentTiles = new TerrainTileList(this); - - this.tileCache = new MemoryCache(5000000, 4000000); // Holds 316 32x32 tiles. - - this.elevationTimestamp = undefined; - this.lastModelViewProjection = Matrix.fromIdentity(); - - this.vertexPointLocation = -1; - this.vertexTexCoordLocation = -1; - - this.texCoords = null; - this.texCoordVboCacheKey = 'global_tex_coords'; - - this.indices = null; - this.indicesVboCacheKey = 'global_indices'; - - this.baseIndices = null; - this.baseIndicesOffset = null; - this.numBaseIndices = null; - - this.indicesNorth = null; - this.indicesNorthOffset = null; - this.numIndicesNorth = null; - - this.indicesSouth = null; - this.indicesSouthOffset = null; - this.numIndicesSouth = null; - - this.indicesWest = null; - this.indicesWestOffset = null; - this.numIndicesWest = null; - - this.indicesEast = null; - this.indicesEastOffset = null; - this.numIndicesEast = null; - - this.indicesLoresNorth = null; - this.indicesLoresNorthOffset = null; - this.numIndicesLoresNorth = null; - - this.indicesLoresSouth = null; - this.indicesLoresSouthOffset = null; - this.numIndicesLoresSouth = null; - - this.indicesLoresWest = null; - this.indicesLoresWestOffset = null; - this.numIndicesLoresWest = null; - - this.indicesLoresEast = null; - this.indicesLoresEastOffset = null; - this.numIndicesLoresEast = null; - - this.outlineIndicesOffset = null; - this.numOutlineIndices = null; - - this.wireframeIndicesOffset = null; - this.numWireframeIndices = null; - - this.scratchMatrix = Matrix.fromIdentity(); - this.scratchElevations = null; - this.scratchPrevElevations = null; - - this.corners = {}; - this.tiles = []; -} - -/** - * Creates the visible terrain of the globe associated with the current draw context. - * @param {DrawContext} dc The draw context. - * @returns {Terrain} The computed terrain, or null if terrain could not be computed. - * @throws {ArgumentError} If the dc is null or undefined. - */ -Tessellator.prototype.tessellate = function (dc) { - if (!dc) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "tessellate", "missingDC")); - } - - var lastElevationsChange = dc.globe.elevationTimestamp(); - if (this.lastGlobeStateKey === dc.globeStateKey - && this.lastVerticalExaggeration === dc.verticalExaggeration - && this.elevationTimestamp === lastElevationsChange - && dc.modelviewProjection.equals(this.lastModelViewProjection)) { - - return this.lastTerrain; - } - - this.lastModelViewProjection.copy(dc.modelviewProjection); - this.lastGlobeStateKey = dc.globeStateKey; - this.elevationTimestamp = lastElevationsChange; - this.lastVerticalExaggeration = dc.verticalExaggeration; - - this.currentTiles.removeAllTiles(); - - if (!this.topLevelTiles[dc.globeStateKey] || this.topLevelTiles[dc.globeStateKey].length == 0) { - this.createTopLevelTiles(dc); - } - - this.corners = {}; - this.tiles = []; - - for (var index = 0, len = this.topLevelTiles[dc.globeStateKey].length; index < len; index += 1) { - var tile = this.topLevelTiles[dc.globeStateKey][index]; - - tile.update(dc); - - if (this.isTileVisible(dc, tile)) { - this.addTileOrDescendants(dc, tile); - } - } - - this.refineNeighbors(dc); - this.finishTessellating(dc); - - this.lastTerrain = this.currentTiles.length === 0 ? null - : new Terrain(dc.globe, this, this.currentTiles, dc.verticalExaggeration); - - return this.lastTerrain; -}; - -Tessellator.prototype.createTile = function (tileSector, level, row, column) { - if (!tileSector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "constructor", "missingSector")); - } - - if (!level) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "constructor", - "The specified level is null or undefined.")); - } - - if (row < 0 || column < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "constructor", - "The specified row or column is less than zero.")); - } - - return new TerrainTile(tileSector, level, row, column); -}; - -/** - * Initializes rendering state to draw a succession of terrain tiles. - * @param {DrawContext} dc The draw context. - */ -Tessellator.prototype.beginRendering = function (dc) { - var program = dc.currentProgram; // use the current program; the caller configures other program state - if (!program) { - Logger.logMessage(Logger.LEVEL_INFO, "Tessellator", "beginRendering", "Current Program is empty"); - return; - } - - this.buildSharedGeometry(); - this.cacheSharedGeometryVBOs(dc); - - var gl = dc.currentGlContext, - gpuResourceCache = dc.gpuResourceCache; - - // Keep track of the program's attribute locations. The tessellator does not know which program the caller has - // bound, and therefore must look up the location of attributes by name. - this.vertexPointLocation = program.attributeLocation(gl, "vertexPoint"); - this.vertexTexCoordLocation = program.attributeLocation(gl, "vertexTexCoord"); - gl.enableVertexAttribArray(this.vertexPointLocation); - - if (this.vertexTexCoordLocation >= 0) { // location of vertexTexCoord attribute is -1 when the basic program is bound - var texCoordVbo = gpuResourceCache.resourceForKey(this.texCoordVboCacheKey); - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordVbo); - gl.vertexAttribPointer(this.vertexTexCoordLocation, 2, gl.FLOAT, false, 0, 0); - gl.enableVertexAttribArray(this.vertexTexCoordLocation); - } - - var indicesVbo = gpuResourceCache.resourceForKey(this.indicesVboCacheKey); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indicesVbo); - -}; - -/** - * Restores rendering state after drawing a succession of terrain tiles. - * @param {DrawContext} dc The draw context. - */ -Tessellator.prototype.endRendering = function (dc) { - var gl = dc.currentGlContext; - - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); - - // Restore the global OpenGL vertex attribute array state. - if (this.vertexPointLocation >= 0) { - gl.disableVertexAttribArray(this.vertexPointLocation); - } - - if (this.vertexTexCoordLocation >= 0) { // location of vertexTexCoord attribute is -1 when the basic program is bound - gl.disableVertexAttribArray(this.vertexTexCoordLocation); - } -}; - -/** - * Initializes rendering state for drawing a specified terrain tile. - * @param {DrawContext} dc The draw context. - * @param {TerrainTile} terrainTile The terrain tile subsequently drawn via this tessellator's render function. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Tessellator.prototype.beginRenderingTile = function (dc, terrainTile) { - if (!terrainTile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "beginRenderingTile", "missingTile")); - } - - var gl = dc.currentGlContext, - gpuResourceCache = dc.gpuResourceCache; - - this.scratchMatrix.setToMultiply(dc.modelviewProjection, terrainTile.transformationMatrix); - dc.currentProgram.loadModelviewProjection(gl, this.scratchMatrix); - - var vboCacheKey = dc.globeStateKey + terrainTile.tileKey, - vbo = gpuResourceCache.resourceForKey(vboCacheKey); - if (!vbo) { - vbo = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, vbo); - gl.bufferData(gl.ARRAY_BUFFER, terrainTile.points, gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - gpuResourceCache.putResource(vboCacheKey, vbo, terrainTile.points.length * 4); - terrainTile.pointsVboStateKey = terrainTile.pointsStateKey; - } - else if (terrainTile.pointsVboStateKey != terrainTile.pointsStateKey) { - gl.bindBuffer(gl.ARRAY_BUFFER, vbo); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, terrainTile.points); - terrainTile.pointsVboStateKey = terrainTile.pointsStateKey; - } - else { - dc.currentGlContext.bindBuffer(gl.ARRAY_BUFFER, vbo); - } - - gl.vertexAttribPointer(this.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); -}; - -/** - * Restores rendering state after drawing the most recent tile specified to - * [beginRenderingTile]{@link Tessellator#beginRenderingTile}. - * @param {DrawContext} dc The draw context. - * @param {TerrainTile} terrainTile The terrain tile most recently rendered. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Tessellator.prototype.endRenderingTile = function (dc, terrainTile) { - // Intentionally empty until there's some reason to add code here. -}; - -/** - * Renders a specified terrain tile. - * @param {DrawContext} dc The draw context. - * @param {TerrainTile} terrainTile The terrain tile to render. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Tessellator.prototype.renderTile = function (dc, terrainTile) { - if (!terrainTile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "renderTile", "missingTile")); - } - - var gl = dc.currentGlContext, - prim = gl.TRIANGLE_STRIP; // replace TRIANGLE_STRIP with LINE_STRIP to debug borders - - /* - * Indices order in the buffer: - * - * base indices - * - * north border - * south border - * west border - * east border - * - * north lores - * south lores - * west lores - * east lores - * - * wireframe - * outline - */ - - gl.drawElements( - prim, - this.numBaseIndices, - gl.UNSIGNED_SHORT, - this.baseIndicesOffset * 2); - - var level = terrainTile.level, - neighborLevel; - - neighborLevel = terrainTile.neighborLevel(WorldWind.NORTH); - if (neighborLevel && neighborLevel.compare(level) < 0) { - gl.drawElements( - prim, - this.numIndicesLoresNorth, - gl.UNSIGNED_SHORT, - this.indicesLoresNorthOffset * 2); - } - else { - gl.drawElements( - prim, - this.numIndicesNorth, - gl.UNSIGNED_SHORT, - this.indicesNorthOffset * 2); - } - - neighborLevel = terrainTile.neighborLevel(WorldWind.SOUTH); - if (neighborLevel && neighborLevel.compare(level) < 0) { - gl.drawElements( - prim, - this.numIndicesLoresSouth, - gl.UNSIGNED_SHORT, - this.indicesLoresSouthOffset * 2); - } - else { - gl.drawElements( - prim, - this.numIndicesSouth, - gl.UNSIGNED_SHORT, - this.indicesSouthOffset * 2); - } - - neighborLevel = terrainTile.neighborLevel(WorldWind.WEST); - if (neighborLevel && neighborLevel.compare(level) < 0) { - gl.drawElements( - prim, - this.numIndicesLoresWest, - gl.UNSIGNED_SHORT, - this.indicesLoresWestOffset * 2); - } - else { - gl.drawElements( - prim, - this.numIndicesWest, - gl.UNSIGNED_SHORT, - this.indicesWestOffset * 2); - } - - neighborLevel = terrainTile.neighborLevel(WorldWind.EAST); - if (neighborLevel && neighborLevel.compare(level) < 0) { - gl.drawElements( - prim, - this.numIndicesLoresEast, - gl.UNSIGNED_SHORT, - this.indicesLoresEastOffset * 2); - } - else { - gl.drawElements( - prim, - this.numIndicesEast, - gl.UNSIGNED_SHORT, - this.indicesEastOffset * 2); - } -}; - -/** - * Draws outlines of the triangles composing the tile. - * @param {DrawContext} dc The current draw context. - * @param {TerrainTile} terrainTile The tile to draw. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Tessellator.prototype.renderWireframeTile = function (dc, terrainTile) { - if (!terrainTile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "renderWireframeTile", "missingTile")); - } - - var gl = dc.currentGlContext; - - // Must turn off texture coordinates, which were turned on in beginRendering. - if (this.vertexTexCoordLocation >= 0) { - gl.disableVertexAttribArray(this.vertexTexCoordLocation); - } - - gl.drawElements( - gl.LINES, - this.numWireframeIndices, - gl.UNSIGNED_SHORT, - this.wireframeIndicesOffset * 2); -}; - -/** - * Draws the outer boundary of a specified terrain tile. - * @param {DrawContext} dc The current draw context. - * @param {TerrainTile} terrainTile The tile whose outer boundary to draw. - * @throws {ArgumentError} If the specified tile is null or undefined. - */ -Tessellator.prototype.renderTileOutline = function (dc, terrainTile) { - if (!terrainTile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "renderTileOutline", "missingTile")); - } - - var gl = dc.currentGlContext; - - // Must turn off texture coordinates, which were turned on in beginRendering. - if (this.vertexTexCoordLocation >= 0) { - gl.disableVertexAttribArray(this.vertexTexCoordLocation); - } - - gl.drawElements( - gl.LINE_LOOP, - this.numOutlineIndices, - gl.UNSIGNED_SHORT, - this.outlineIndicesOffset * 2); -}; - -/** - * Causes this terrain to perform the picking operations on the specified tiles, as appropriate for the draw - * context's pick settings. Normally, this draws the terrain in a unique pick color and computes the picked - * terrain position. When the draw context is set to region picking mode, this omits the computation of a picked - * terrain position. - * @param {DrawContext} dc The current draw context. - * @param {Array} tileList The list of tiles to pick. - * @param {Object} pickDelegate Indicates the object to use as the picked object's <code>userObject</code>. - * If null, then this tessellator is used as the <code>userObject</code>. - * @throws {ArgumentError} If either the draw context or the tile list are null or undefined. - */ -Tessellator.prototype.pick = function (dc, tileList, pickDelegate) { - if (!dc) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "pick", "missingDc")); - } - - if (!tileList) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tessellator", "pick", "missingList")); - } - - var color = null, - userObject = pickDelegate || this, - position = new Position(0, 0, 0), - pickableTiles = []; - - // Assemble a list of tiles that intersect the pick frustum. This eliminates unnecessary work for tiles that - // do not contribute to the pick result. - for (var i = 0, len = tileList.length; i < len; i++) { - var tile = tileList[i]; - if (tile.extent.intersectsFrustum(dc.pickFrustum)) { - pickableTiles.push(tile); - } - } - - // Draw the pickable tiles in a unique pick color. Suppress this step when picking the terrain only. In this - // case drawing to the pick framebuffer is unnecessary. - if (!dc.pickTerrainOnly) { - color = dc.uniquePickColor(); - this.drawPickTiles(dc, pickableTiles, color); - } - - // Determine the terrain position at the pick point. If the terrain is picked, add a corresponding picked - // object to the draw context. Suppress this step in region picking mode. - if (!dc.regionPicking) { - var ray = dc.pickRay.clone(), // Cloning the pick ray is necessary here due to the fact that Tesselator.computeIntersections modifies ray - point = this.computeNearestIntersection(ray, pickableTiles); - - if (point) { - dc.globe.computePositionFromPoint(point[0], point[1], point[2], position); - position.altitude = dc.globe.elevationAtLocation(position.latitude, position.longitude); - dc.addPickedObject(new PickedObject(color, userObject, position, null, true)); - } - } -}; - -// Internal function. Intentionally not documented. -Tessellator.prototype.drawPickTiles = function (dc, tileList, color) { - var gl = dc.currentGlContext; - - try { - dc.findAndBindProgram(BasicProgram); - dc.currentProgram.loadColor(gl, color); - this.beginRendering(dc); - - for (var i = 0, len = tileList.length; i < len; i++) { - var tile = tileList[i]; - this.beginRenderingTile(dc, tile); - this.renderTile(dc, tile); - this.endRenderingTile(dc, tile); - } - } finally { - this.endRendering(dc); - } -}; - -// Internal function. Intentionally not documented. -Tessellator.prototype.computeNearestIntersection = function (line, tileList) { - // Compute all intersections between the specified line and tile list. - var results = []; - for (var i = 0, len = tileList.length; i < len; i++) { - this.computeIntersections(line, tileList[i], results); - } - - if (results.length == 0) { - return null; // no intersection - } else { - // Find and return the intersection nearest to the line's origin. - var minDistance = Number.POSITIVE_INFINITY, - minIndex; - for (i = 0, len = results.length; i < len; i++) { - var distance = line.origin.distanceToSquared(results[i]); - if (minDistance > distance) { - minDistance = distance; - minIndex = i; - } - } - - return results[minIndex]; - } -}; - -// Internal function. Intentionally not documented. -Tessellator.prototype.computeIntersections = function (line, tile, results) { - var level = tile.level, - neighborLevel, - points = tile.points, - elements, - firstResult = results.length; - - // Translate the line from model coordinates to tile local coordinates. - line.origin.subtract(tile.referencePoint); - - // Assemble the shared tile index geometry. This initializes the index properties used below. - this.buildSharedGeometry(tile); - - // Compute any intersections with the tile's interior triangles.. - elements = this.baseIndices; - WWMath.computeTriStripIntersections(line, points, elements, results); - - // Compute any intersections with the tile's south border triangles. - neighborLevel = tile.neighborLevel(WorldWind.SOUTH); - elements = neighborLevel && neighborLevel.compare(level) < 0 ? this.indicesLoresSouth : this.indicesSouth; - WWMath.computeTriStripIntersections(line, points, elements, results); - - // Compute any intersections with the tile's west border triangles. - neighborLevel = tile.neighborLevel(WorldWind.WEST); - elements = neighborLevel && neighborLevel.compare(level) < 0 ? this.indicesLoresWest : this.indicesWest; - WWMath.computeTriStripIntersections(line, points, elements, results); - - // Compute any intersections with the tile's east border triangles. - neighborLevel = tile.neighborLevel(WorldWind.EAST); - elements = neighborLevel && neighborLevel.compare(level) < 0 ? this.indicesLoresEast : this.indicesEast; - WWMath.computeTriStripIntersections(line, points, elements, results); - - // Compute any intersections with the tile's north border triangles. - neighborLevel = tile.neighborLevel(WorldWind.NORTH); - elements = neighborLevel && neighborLevel.compare(level) < 0 ? this.indicesLoresNorth : this.indicesNorth; - WWMath.computeTriStripIntersections(line, points, elements, results); - - // Translate the line and the intersection results from tile local coordinates to model coordinates. - line.origin.add(tile.referencePoint); - for (var i = firstResult, len = results.length; i < len; i++) { - results[i].add(tile.referencePoint); - } -}; - -/*********************************************************************** - * Internal methods - assume that arguments have been validated already. - ***********************************************************************/ - -Tessellator.prototype.createTopLevelTiles = function (dc) { - this.topLevelTiles[dc.globeStateKey] = []; - Tile.createTilesForLevel(this.levels.firstLevel(), this, this.topLevelTiles[dc.globeStateKey]); -}; - -Tessellator.prototype.addTileOrDescendants = function (dc, tile) { - if (this.tileMeetsRenderCriteria(dc, tile)) { - this.addTile(dc, tile); - return; - } - - this.addTileDescendants(dc, tile); -}; - -Tessellator.prototype.addTileDescendants = function (dc, tile) { - var nextLevel = tile.level.nextLevel(); - var subTiles = tile.subdivideToCache(nextLevel, this, this.tileCache); - for (var index = 0; index < subTiles.length; index += 1) { - var child = subTiles[index]; - - child.update(dc); - - if (this.levels.sector.intersects(child.sector) && this.isTileVisible(dc, child)) { - this.addTileOrDescendants(dc, child); - } - } -}; - -Tessellator.prototype.addTile = function (dc, tile) { - // Insert tile at index idx. - var idx = this.tiles.length; - this.tiles.push(tile); - - // Insert tile into corner data collection for later LOD neighbor analysis. - var sector = tile.sector; - - // Corners of the tile. - var neTileCorner = [sector.maxLatitude, sector.maxLongitude].toString(), - seTileCorner = [sector.minLatitude, sector.maxLongitude].toString(), - nwTileCorner = [sector.maxLatitude, sector.minLongitude].toString(), - swTileCorner = [sector.minLatitude, sector.minLongitude].toString(), - corner; - - corner = this.corners[swTileCorner]; - if (!corner) { - this.corners[swTileCorner] = { 'sw': idx }; //corner; - } - else { - // assert(!corner.sw, "sw already defined"); - corner.sw = idx; - } - - corner = this.corners[nwTileCorner]; - if (!corner) { - this.corners[nwTileCorner] = { 'nw': idx }; - } - else { - // assert(!corner.nw, "nw already defined"); - corner.nw = idx; - } - - corner = this.corners[seTileCorner]; - if (!corner) { - this.corners[seTileCorner] = { 'se': idx }; - } - else { - // assert(!corver.se, "se already defined"); - corner.se = idx; - } - - corner = this.corners[neTileCorner]; - if (!corner) { - this.corners[neTileCorner] = { 'ne': idx }; - } - else { - //assert(!corner.ne, "ne already defined"); - corner.ne = idx; - } -}; - -Tessellator.prototype.refineNeighbors = function (dc) { - var tileRefinementSet = {}; - - for (var idx = 0, len = this.tiles.length; idx < len; idx += 1) { - var tile = this.tiles[idx], - levelNumber = tile.level.levelNumber, - sector = tile.sector, - corner, - neighbor, - idx, - len; - - // Corners of the tile. - var neTileCorner = [sector.maxLatitude, sector.maxLongitude].toString(), - seTileCorner = [sector.minLatitude, sector.maxLongitude].toString(), - nwTileCorner = [sector.maxLatitude, sector.minLongitude].toString(), - swTileCorner = [sector.minLatitude, sector.minLongitude].toString(); - - corner = this.corners[neTileCorner]; - // assert(corner, "northeast corner not found"); - if (corner.hasOwnProperty('se')) { - neighbor = corner.se; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - if (corner.hasOwnProperty('nw')) { - neighbor = corner.nw; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - - corner = this.corners[seTileCorner]; - // assert(corner, "southeast corner not found"); - if (corner.hasOwnProperty('ne')) { - neighbor = corner.ne; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - if (corner.hasOwnProperty('sw')) { - neighbor = corner.sw; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - - corner = this.corners[nwTileCorner]; - // assert(corner, "northwest corner not found"); - if (corner.hasOwnProperty('ne')) { - neighbor = corner.ne; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - if (corner.hasOwnProperty('sw')) { - neighbor = corner.sw; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - - corner = this.corners[swTileCorner]; - // assert(corner, "southwest corner not found"); - if (corner.hasOwnProperty('se')) { - neighbor = corner.se; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - if (corner.hasOwnProperty('nw')) { - neighbor = corner.nw; - if (this.tiles[neighbor].level.levelNumber < levelNumber - 1) { - if (!tileRefinementSet[neighbor]) { - tileRefinementSet[neighbor] = true; - } - } - } - } - - // Partition tiles into those requiring refinement and those that don't need refinement. - var tilesNeedingRefinement = [], - tilesNotNeedingRefinement = []; - for (idx = 0, len = this.tiles.length; idx < len; idx += 1) { - tile = this.tiles[idx]; - if (tileRefinementSet[idx]) { - tilesNeedingRefinement.push(tile); - } - else { - tilesNotNeedingRefinement.push(tile); - } - } - - // When tiles need refinement, recur. - if (tilesNeedingRefinement.length > 0) { - // Reset refinement state. - this.tiles = []; - this.corners = {}; - - // For tiles that don't need refinement, simply add the tile. - for (idx = 0, len = tilesNotNeedingRefinement.length; idx < len; idx += 1) { - tile = tilesNotNeedingRefinement[idx]; - - this.addTile(dc, tile); - } - - // For tiles that do need refinement, subdivide the tile and add its descendants. - for (idx = 0, len = tilesNeedingRefinement.length; idx < len; idx += 1) { - var tile = tilesNeedingRefinement[idx]; - - this.addTileDescendants(dc, tile); - } - - // Recur. - this.refineNeighbors(dc); - } -}; - -Tessellator.prototype.finishTessellating = function (dc) { - for (var idx = 0, len = this.tiles.length; idx < len; idx += 1) { - var tile = this.tiles[idx]; - this.setNeighbors(tile); - this.regenerateTileGeometryIfNeeded(dc, tile); - this.currentTiles.addTile(tile); - } -}; - -Tessellator.prototype.setNeighbors = function (tile) { - var sector = tile.sector; - - // Corners of the tile. - var neTileCorner = [sector.maxLatitude, sector.maxLongitude].toString(), - seTileCorner = [sector.minLatitude, sector.maxLongitude].toString(), - nwTileCorner = [sector.maxLatitude, sector.minLongitude].toString(), - swTileCorner = [sector.minLatitude, sector.minLongitude].toString(); - - var neCorner = this.corners[neTileCorner], - seCorner = this.corners[seTileCorner], - nwCorner = this.corners[nwTileCorner], - swCorner = this.corners[swTileCorner]; - - var northIdx = -1, // neCorner.hasOwnProperty('se') ? neCorner.se : nwCorner.hasOwnProperty('sw') ? nwCorner.sw : -1, - southIdx = -1, // seCorner.hasOwnProperty('ne') ? seCorner.ne : swCorner.hasOwnProperty('nw') ? swCorner.nw : -1, - eastIdx = -1, // neCorner.hasOwnProperty('nw') ? neCorner.nw : seCorner.hasOwnProperty('sw') ? seCorner.sw : -1, - westIdx = -1; //nwCorner.hasOwnProperty('ne') ? nwCorner.ne : swCorner.hasOwnProperty('se') ? swCorner.se : -1; - - if (neCorner.hasOwnProperty('se')) { - northIdx = neCorner.se; - } - else if (nwCorner.hasOwnProperty('sw')) { - northIdx = nwCorner.sw; - } - - if (seCorner.hasOwnProperty('ne')) { - southIdx = seCorner.ne; - } - else if (swCorner.hasOwnProperty('nw')) { - southIdx = swCorner.nw; - } - - if (neCorner.hasOwnProperty('nw')) { - eastIdx = neCorner.nw; - } - else if (seCorner.hasOwnProperty('sw')) { - eastIdx = seCorner.sw; - } - - if (nwCorner.hasOwnProperty('ne')) { - westIdx = nwCorner.ne; - } - else if (swCorner.hasOwnProperty('se')) { - westIdx = swCorner.se; - } - - tile.setNeighborLevel(WorldWind.NORTH, northIdx >= 0 ? this.tiles[northIdx].level : null); - tile.setNeighborLevel(WorldWind.SOUTH, southIdx >= 0 ? this.tiles[southIdx].level : null); - tile.setNeighborLevel(WorldWind.EAST, eastIdx >= 0 ? this.tiles[eastIdx].level : null); - tile.setNeighborLevel(WorldWind.WEST, westIdx >= 0 ? this.tiles[westIdx].level : null); -}; - -Tessellator.prototype.isTileVisible = function (dc, tile) { - if (dc.globe.projectionLimits && !tile.sector.overlaps(dc.globe.projectionLimits)) { - return false; - } - - return tile.extent.intersectsFrustum(dc.frustumInModelCoordinates); -}; - -Tessellator.prototype.tileMeetsRenderCriteria = function (dc, tile) { - var s = this.detailControl; - var lat = WWMath.mercatorLat(75); - if (tile.sector.minLatitude >= lat || tile.sector.maxLatitude <= -lat) { - s *= 2; - } - return tile.level.isLastLevel() || !tile.mustSubdivide(dc, s); -}; - -Tessellator.prototype.regenerateTileGeometryIfNeeded = function (dc, tile) { - var stateKey = dc.globeStateKey + tile.stateKey + dc.verticalExaggeration; - - if (!tile.points || tile.pointsStateKey != stateKey) { - this.regenerateTileGeometry(dc, tile); - tile.pointsStateKey = stateKey; - } -}; - -/** - * Internal use only. - * TODO: Remove this function when Tessellator and ElevationModel are refactored - * Artificially calculates an adjusted target resolution for the given texel size to more - * optimally select elevation coverages until later refactoring. - * @returns {Number} An adjusted target resolution in degrees. - * @ignore - */ -Tessellator.prototype.coverageTargetResolution = function (texelSize) { - return texelSize * Angle.RADIANS_TO_DEGREES; -}; - -Tessellator.prototype.regenerateTileGeometry = function (dc, tile) { - var numLat = tile.tileHeight + 1, // num points in each dimension is 1 more than the number of tile cells - numLon = tile.tileWidth + 1, - refPoint = tile.referencePoint, - elevations = this.scratchElevations; - - // Allocate space for the tile's elevations. - if (!elevations) { - elevations = new Float64Array(numLat * numLon); - this.scratchElevations = elevations; - } - - // Allocate space for the tile's Cartesian coordinates. - if (!tile.points) { - tile.points = new Float32Array(numLat * numLon * 3); - } - - // Retrieve the elevations for all points in the tile. - WWUtil.fillArray(elevations, 0); - - dc.globe.elevationsForGrid(tile.sector, numLat, numLon, this.coverageTargetResolution(tile.texelSize), elevations); - - // Modify the elevations around the tile's border to match neighbors of lower resolution, if any. - if (this.mustAlignNeighborElevations(dc, tile)) { - this.alignNeighborElevations(dc, tile, elevations); - } - - // Compute the tile's Cartesian coordinates relative to a local origin, called the reference point. - WWUtil.multiplyArray(elevations, dc.verticalExaggeration); - dc.globe.computePointsForGrid(tile.sector, numLat, numLon, elevations, refPoint, tile.points); - - // Establish a transform that is used later to move the tile coordinates into place relative to the globe. - tile.transformationMatrix.setTranslation(refPoint[0], refPoint[1], refPoint[2]); -}; - -Tessellator.prototype.mustAlignNeighborElevations = function (dc, tile) { - var level = tile.level, - northLevel = tile.neighborLevel(WorldWind.NORTH), - southLevel = tile.neighborLevel(WorldWind.SOUTH), - eastLevel = tile.neighborLevel(WorldWind.EAST), - westLevel = tile.neighborLevel(WorldWind.WEST); - - return northLevel && northLevel.compare(level) < 0 || - southLevel && southLevel.compare(level) < 0 || - eastLevel && eastLevel.compare(level) < 0 || - westLevel && westLevel.compare(level) < 0; -}; - -Tessellator.prototype.alignNeighborElevations = function (dc, tile, elevations) { - var numLat = tile.tileHeight + 1, // num points in each dimension is 1 more than the number of tile cells - numLon = tile.tileWidth + 1, - level = tile.level, - prevNumLat = Math.floor(numLat / 2) + 1, // num prev level points is 1 more than 1/2 the number of cells - prevNumLon = Math.floor(numLon / 2) + 1, - prevLevel = level.previousLevel(), - prevElevations = this.scratchPrevElevations, - neighborLevel, - i, index, prevIndex; - - // Allocate space for the previous level elevations. - if (!prevElevations) { - prevElevations = new Float64Array(prevNumLat * prevNumLon); - this.scratchPrevElevations = prevElevations; - } - - // Retrieve the previous level elevations, using 1/2 the number of tile cells. - WWUtil.fillArray(prevElevations, 0); - - dc.globe.elevationsForGrid(tile.sector, prevNumLat, prevNumLon, this.coverageTargetResolution(prevLevel.texelSize), prevElevations); - - // Use previous level elevations along the north edge when the northern neighbor is lower resolution. - neighborLevel = tile.neighborLevel(WorldWind.NORTH); - if (neighborLevel && neighborLevel.compare(level) < 0) { - index = (numLat - 1) * numLon; - prevIndex = (prevNumLat - 1) * prevNumLon; - for (i = 0; i < prevNumLon; i++, index += 2, prevIndex += 1) { - elevations[index] = prevElevations[prevIndex]; - if (i < prevNumLon - 1) { - elevations[index + 1] = 0.5 * (prevElevations[prevIndex] + prevElevations[prevIndex + 1]); - } - } - } - - // Use previous level elevations along the south edge when the southern neighbor is lower resolution. - neighborLevel = tile.neighborLevel(WorldWind.SOUTH); - if (neighborLevel && neighborLevel.compare(level) < 0) { - index = 0; - prevIndex = 0; - for (i = 0; i < prevNumLon; i++, index += 2, prevIndex += 1) { - elevations[index] = prevElevations[prevIndex]; - if (i < prevNumLon - 1) { - elevations[index + 1] = 0.5 * (prevElevations[prevIndex] + prevElevations[prevIndex + 1]); - } - } - } - - // Use previous level elevations along the east edge when the eastern neighbor is lower resolution. - neighborLevel = tile.neighborLevel(WorldWind.EAST); - if (neighborLevel && neighborLevel.compare(level) < 0) { - index = numLon - 1; - prevIndex = prevNumLon - 1; - for (i = 0; i < prevNumLat; i++, index += 2 * numLon, prevIndex += prevNumLon) { - elevations[index] = prevElevations[prevIndex]; - if (i < prevNumLat - 1) { - elevations[index + numLon] = 0.5 * (prevElevations[prevIndex] + prevElevations[prevIndex + prevNumLon]); - } - } - } - - // Use previous level elevations along the west edge when the western neighbor is lower resolution. - neighborLevel = tile.neighborLevel(WorldWind.WEST); - if (neighborLevel && neighborLevel.compare(level) < 0) { - index = 0; - prevIndex = 0; - for (i = 0; i < prevNumLat; i++, index += 2 * numLon, prevIndex += prevNumLon) { - elevations[index] = prevElevations[prevIndex]; - if (i < prevNumLat - 1) { - elevations[index + numLon] = 0.5 * (prevElevations[prevIndex] + prevElevations[prevIndex + prevNumLon]); - } - } - } -}; - -Tessellator.prototype.buildSharedGeometry = function () { - // TODO: put all indices into a single buffer - var tileWidth = this.levels.tileWidth, - tileHeight = this.levels.tileHeight; - - if (!this.texCoords) { - this.buildTexCoords(tileWidth, tileHeight); - } - - if (!this.indices) { - this.buildIndices(tileWidth, tileHeight); - } -}; - -Tessellator.prototype.buildTexCoords = function (tileWidth, tileHeight) { - var numCols = tileWidth + 1, - numRows = tileHeight + 1, - colDelta = 1 / tileWidth, - rowDelta = 1 / tileHeight, - buffer = new Float32Array(numCols * numRows * 2), - index = 0; - - for (var row = 0, t = 0; row < numRows; row++, t += rowDelta) { - if (row == numRows - 1) { - t = 1; // explicitly set the last row coordinate to ensure alignment - } - - for (var col = 0, s = 0; col < numCols; col++, s += colDelta) { - if (col == numCols - 1) { - s = 1; // explicitly set the last column coordinate to ensure alignment - } - - buffer[index++] = s; - buffer[index++] = t; - } - } - - this.texCoords = buffer; -}; - -Tessellator.prototype.buildIndices = function (tileWidth, tileHeight) { - var vertexIndex; // The index of the vertex in the sample grid. - - // The number of vertices in each dimension is 1 more than the number of cells. - var numLatVertices = tileHeight + 1, - numLonVertices = tileWidth + 1, - latIndexMid = tileHeight / 2, // Assumption: tileHeight is even, so that there is a midpoint! - lonIndexMid = tileWidth / 2; // Assumption: tileWidth is even, so that there is a midpoint! - - // Each vertex has two indices associated with it: the current vertex index and the index of the row. - // There are tileHeight rows. - // There are tileHeight + 2 columns - var numIndices = 2 * (numLatVertices - 3) * (numLonVertices - 2) + 2 * (numLatVertices - 3); - var indices = []; - - // Inset core by one round of sub-tiles. Full grid is numLatVertices x numLonVertices. This must be used - // to address vertices in the core as well. - var index = 0; - for (var lonIndex = 1; lonIndex < numLonVertices - 2; lonIndex += 1) { - for (var latIndex = 1; latIndex < numLatVertices - 1; latIndex += 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - - // Create a triangle strip joining each adjacent column of vertices, starting in the top left corner and - // proceeding to the right. The first vertex starts with the left row of vertices and moves right to create a - // counterclockwise winding order. - indices[index++] = vertexIndex; - indices[index++] = vertexIndex + 1; - } - - // Insert indices to create 2 degenerate triangles: - // one for the end of the current row, and - // one for the beginning of the next row. - indices[index++] = vertexIndex + 1; - vertexIndex = lonIndex + 1 + 1 * numLonVertices; - indices[index++] = vertexIndex; - } - - this.baseIndicesOffset = indices.length - numIndices; - this.baseIndices = new Uint16Array(indices.slice(this.baseIndicesOffset)); - this.numBaseIndices = numIndices; - - // TODO: parameterize and refactor!!!!! - // Software engineering notes: There are patterns being used in the following code that should be abstracted. - // However, I suspect that the process of abstracting the patterns will result in as much code created - // as gets removed. YMMV. If JavaScript had a meta-programming (a.k.a., macro) facility, that code would be - // processed at "compile" time rather than "runtime". But it doesn't have such a facility that I know of. - // - // Patterns used: - // 0) Each tile has four borders: north, south, east, and west. - // 1) Counter-clockwise traversal around the outside results in clockwise meshes amendable to back-face elimination. - // 2) For each vertex on the exterior, there corresponds a vertex on the interior that creates a diagonal. - // 3) Each border construction is broken into three phases: - // a) The starting phase to generate the first half of the border, - // b) The middle phase, where a single vertex reference gets created, and - // c) The ending phase to complete the generation of the border. - // 4) Each border is generated in two variants: - // a) one variant that mates with a tile at the same level of detail, and - // b) another variant that mates with a tile at the next lower level of detail. - // 5) Borders that mate with the next lower level of detail are constrained to lie on even indices. - // 6) Evenness is generated by ANDing the index with a mask that has 1's in all bits except for the LSB, - // which results in clearing the LSB os the index, making it even. - // 7) The section that generates lower level LOD borders gives up any attempt to be optimal because of the - // complexity. Instead, correctness was preferred. That said, any performance lost is in the noise, - // since this code only gets run once. - - /* - * The following section of code generates full resolution boundary meshes. These are used to mate - * with neighboring tiles that are at the same level of detail. - */ - // North border. - numIndices = 2 * numLonVertices - 2; - latIndex = numLatVertices - 1; - - // Corner vertex. - lonIndex = numLonVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (lonIndex = numLonVertices - 2; lonIndex > 0; lonIndex -= 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - indices[index++] = vertexIndex - numLonVertices; - } - - // Corner vertex. - lonIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesNorthOffset = indices.length - numIndices; - this.indicesNorth = new Uint16Array(indices.slice(this.indicesNorthOffset)); - this.numIndicesNorth = numIndices; - - // South border. - numIndices = 2 * numLonVertices - 2; - latIndex = 0; - - // Corner vertex. - lonIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (lonIndex = 1; lonIndex < numLonVertices - 1; lonIndex += 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - indices[index++] = vertexIndex + numLonVertices; - } - - // Corner vertex. - lonIndex = numLonVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesSouthOffset = indices.length - numIndices; - this.indicesSouth = new Uint16Array(indices.slice(this.indicesSouthOffset)); - this.numIndicesSouth = numIndices; - - // West border. - numIndices = 2 * numLatVertices - 2; - lonIndex = 0; - - // Corner vertex. - latIndex = numLatVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (latIndex = numLatVertices - 2; latIndex > 0; latIndex -= 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - indices[index++] = vertexIndex + 1; - } - - // Corner vertex. - latIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesWestOffset = indices.length - numIndices; - this.indicesWest = new Uint16Array(indices.slice(this.indicesWestOffset)); - this.numIndicesWest = numIndices; - - // East border. - numIndices = 2 * numLatVertices - 2; - lonIndex = numLonVertices - 1; - - // Corner vertex. - latIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (latIndex = 1; latIndex < numLatVertices - 1; latIndex += 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - indices[index++] = vertexIndex - 1; - } - - // Corner vertex. - latIndex = numLatVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesEastOffset = indices.length - numIndices; - this.indicesEast = new Uint16Array(indices.slice(this.indicesEastOffset)); - this.numIndicesEast = numIndices; - - /* - * The following section of code generates "lores" low resolution boundary meshes. These are used to mate - * with neighboring tiles that are at a lower level of detail. The property of these lower level meshes is that - * they have half the number of vertices. - * - * To generate the boundary meshes, force the use of only even boundary vertex indices. - */ - // North border. - numIndices = 2 * numLonVertices - 2; - latIndex = numLatVertices - 1; - - // Corner vertex. - lonIndex = numLonVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (lonIndex = numLonVertices - 2; lonIndex > 0; lonIndex -= 1) { - // Exterior vertex rounded up to even index. - vertexIndex = (lonIndex + 1 & ~1) + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - // Interior vertex. - vertexIndex = lonIndex + (latIndex - 1) * numLonVertices; - indices[index++] = vertexIndex; - } - - // Corner vertex. - lonIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesLoresNorthOffset = indices.length - numIndices; - this.indicesLoresNorth = new Uint16Array(indices.slice(this.indicesLoresNorthOffset)); - this.numIndicesLoresNorth = numIndices; - - // South border. - numIndices = 2 * numLonVertices - 2; - latIndex = 0; - - // Corner vertex. - lonIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (lonIndex = 1; lonIndex < numLonVertices - 1; lonIndex += 1) { - // Exterior Vertex rounded down to even index. - vertexIndex = (lonIndex & ~1) + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - // Interior vertex. - vertexIndex = lonIndex + (latIndex + 1) * numLonVertices; - indices[index++] = vertexIndex; - } - - // Corner vertex. - lonIndex = numLonVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesLoresSouthOffset = indices.length - numIndices; - this.indicesLoresSouth = new Uint16Array(indices.slice(this.indicesLoresSouthOffset)); - this.numIndicesLoresSouth = numIndices; - - // West border. - numIndices = 2 * numLatVertices - 2; - lonIndex = 0; - - // Corner vertex. - latIndex = numLatVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (latIndex = numLatVertices - 2; latIndex > 0; latIndex -= 1) { - // Exterior Vertex rounded up to even index. - vertexIndex = lonIndex + (latIndex + 1 & ~1) * numLonVertices; - indices[index++] = vertexIndex; - - // Interior vertex. - vertexIndex = lonIndex + 1 + latIndex * numLonVertices; - indices[index++] = vertexIndex; - } - - // Corner vertex. - latIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesLoresWestOffset = indices.length - numIndices; - this.indicesLoresWest = new Uint16Array(indices.slice(this.indicesLoresWestOffset)); - this.numIndicesLoresWest = numIndices; - - // East border. - numIndices = 2 * numLatVertices - 2; - lonIndex = numLonVertices - 1; - - // Corner vertex. - latIndex = 0; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - for (latIndex = 1; latIndex < numLatVertices - 1; latIndex += 1) { - // Exterior vertex rounded down to even index. - vertexIndex = lonIndex + (latIndex & ~1) * numLonVertices; - indices[index++] = vertexIndex; - - // Interior vertex. - vertexIndex = lonIndex - 1 + latIndex * numLonVertices; - indices[index++] = vertexIndex; - } - - // Corner vertex. - latIndex = numLatVertices - 1; - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index++] = vertexIndex; - - this.indicesLoresEastOffset = indices.length - numIndices; - this.indicesLoresEast = new Uint16Array(indices.slice(this.indicesLoresEastOffset)); - this.numIndicesLoresEast = numIndices; - - var wireframeIndices = this.buildWireframeIndices(tileWidth, tileHeight); - var outlineIndices = this.buildOutlineIndices(tileWidth, tileHeight); - - indices = indices.concat(wireframeIndices); - this.wireframeIndicesOffset = indices.length - this.numWireframeIndices; - - indices = indices.concat(outlineIndices); - this.outlineIndicesOffset = indices.length - this.numOutlineIndices; - - this.indices = new Uint16Array(indices); -}; - -Tessellator.prototype.buildWireframeIndices = function (tileWidth, tileHeight) { - // The wireframe representation draws the vertices that appear on the surface. - - // The number of vertices in each dimension is 1 more than the number of cells. - var numLatVertices = tileHeight + 1; - var numLonVertices = tileWidth + 1; - - // Allocate an array to hold the computed indices. - var numIndices = 2 * tileWidth * numLatVertices + 2 * tileHeight * numLonVertices; - var indices = []; - - var rowStride = numLonVertices; - - var index = 0, - lonIndex, - latIndex, - vertexIndex; - - // Add a line between each row to define the horizontal cell outlines. - for (latIndex = 0; latIndex < numLatVertices; latIndex += 1) { - for (lonIndex = 0; lonIndex < tileWidth; lonIndex += 1) { - vertexIndex = lonIndex + latIndex * rowStride; - indices[index] = vertexIndex; - indices[index + 1] = vertexIndex + 1; - index += 2; - } - } - - // Add a line between each column to define the vertical cell outlines. - for (lonIndex = 0; lonIndex < numLonVertices; lonIndex += 1) { - for (latIndex = 0; latIndex < tileHeight; latIndex += 1) { - vertexIndex = lonIndex + latIndex * rowStride; - indices[index] = vertexIndex; - indices[index + 1] = vertexIndex + rowStride; - index += 2; - } - } - - this.numWireframeIndices = numIndices; - return indices; -}; - -Tessellator.prototype.buildOutlineIndices = function (tileWidth, tileHeight) { - // The outline representation traces the tile's outer edge on the surface. - - // The number of vertices in each dimension is 1 more than the number of cells. - var numLatVertices = tileHeight + 1; - var numLonVertices = tileWidth + 1; - - // Allocate an array to hold the computed indices. - var numIndices = 2 * (numLatVertices - 2) + 2 * numLonVertices + 1; - var indices = []; - - var rowStride = numLatVertices; - - var index = 0, - lonIndex, - latIndex, - vertexIndex; - - // Bottom row, starting at the left and going right. - latIndex = 0; - for (lonIndex = 0; lonIndex < numLonVertices; lonIndex += 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index] = vertexIndex; - index += 1; - } - - // Right column, starting at the bottom and going up. - lonIndex = numLonVertices - 1; - for (latIndex = 1; latIndex < numLatVertices; latIndex += 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index] = vertexIndex; - index += 1; - } - - // Top row, starting on the right and going to the left. - latIndex = numLatVertices - 1; - for (lonIndex = numLonVertices - 1; lonIndex >= 0; lonIndex -= 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index] = vertexIndex; - index += 1; - } - - // Leftmost column, starting at the top and going down. - lonIndex = 0; - for (latIndex = numLatVertices - 1; latIndex >= 0; latIndex -= 1) { - vertexIndex = lonIndex + latIndex * numLonVertices; - indices[index] = vertexIndex; - index += 1; - } - - this.numOutlineIndices = numIndices; - return indices; -}; - -Tessellator.prototype.cacheSharedGeometryVBOs = function (dc) { - var gl = dc.currentGlContext, - gpuResourceCache = dc.gpuResourceCache; - - var texCoordVbo = gpuResourceCache.resourceForKey(this.texCoordVboCacheKey); - if (!texCoordVbo) { - texCoordVbo = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordVbo); - gl.bufferData(gl.ARRAY_BUFFER, this.texCoords, gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - gpuResourceCache.putResource(this.texCoordVboCacheKey, texCoordVbo, this.texCoords.length * 4 / 2); - } - - var indicesVbo = gpuResourceCache.resourceForKey(this.indicesVboCacheKey); - if (!indicesVbo) { - indicesVbo = gl.createBuffer(); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indicesVbo); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - gpuResourceCache.putResource(this.indicesVboCacheKey, indicesVbo, this.indices.length * 2); - } -}; - -export default Tessellator; diff --git a/web/src/gis/globe/TiledElevationCoverage.js b/web/src/gis/globe/TiledElevationCoverage.js deleted file mode 100644 index 4c92158f..00000000 --- a/web/src/gis/globe/TiledElevationCoverage.js +++ /dev/null @@ -1,635 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TiledElevationCoverage - */ -import AbsentResourceList from '../util/AbsentResourceList'; -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import ElevationCoverage from '../globe/ElevationCoverage'; -import ElevationImage from '../globe/ElevationImage'; -import LevelSet from '../util/LevelSet'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import MemoryCache from '../cache/MemoryCache'; -import Sector from '../geom/Sector'; -import Tile from '../util/Tile'; -import WWMath from '../util/WWMath'; - -/** - * Constructs a TiledElevationCoverage - * @alias TiledElevationCoverage - * @constructor - * @classdesc Represents the elevations for an area, often but not necessarily the whole globe. - * @param {{}} config Configuration properties for the coverage: - * <ul> - * <li>coverageSector: {Sector} The sector this coverage spans.</li> - * <li>resolution: {Number} The resolution of the coverage, in degrees. (To compute degrees from meters, divide the number of meters by the globe's radius to obtain radians and convert the result to degrees.)</li> - * <li>retrievalImageFormat: {String} The mime type of the elevation data retrieved by this coverage.</li> - * <li>minElevation (optional): {Number} The coverage's minimum elevation in meters.</li> - * <li>maxElevation (optional): {Number} Te coverage's maximum elevation in meters.</li> - * <li>urlBuilder (optional): {UrlBuilder} The factory to create URLs for elevation data requests.</li> - * <ul> - * @throws {ArgumentError} If any required configuration parameter is null or undefined. - */ -function TiledElevationCoverage(config) { - if (!config) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "constructor", "missingConfig")); - } - - if (!config.coverageSector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "constructor", "missingSector")); - } - - if (!config.resolution) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "constructor", "missingResolution")); - } - - if (!config.retrievalImageFormat) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "constructor", "missingImageFormat")); - } - - ElevationCoverage.call(this, config.resolution); - - var firstLevelDelta = 360, - tileWidth = 256, - lastLevel = LevelSet.numLevelsForResolution(firstLevelDelta / tileWidth, config.resolution), - numLevels = Math.ceil(lastLevel); // match or exceed the specified resolution - - /** - * The sector this coverage spans. - * @type {Sector} - * @readonly - */ - this.coverageSector = config.coverageSector; - - /** - * The mime type to use when retrieving elevations. - * @type {String} - * @readonly - */ - this.retrievalImageFormat = config.retrievalImageFormat; - - /** - * This coverage's minimum elevation in meters. - * @type {Number} - * @default 0 - */ - this.minElevation = config.minElevation || 0; - - /** - * This coverage's maximum elevation in meters. - * @type {Number} - */ - this.maxElevation = config.maxElevation || 0; - - /** - * Indicates whether the data associated with this coverage is point data. A value of false - * indicates that the data is area data (pixel is area). - * @type {Boolean} - * @default true - */ - this.pixelIsPoint = true; - - /** - * The {@link LevelSet} dividing this coverage's geographic domain into a multi-resolution, hierarchical - * collection of tiles. - * @type {LevelSet} - * @readonly - */ - this.levels = new LevelSet(this.coverageSector, new Location(firstLevelDelta, firstLevelDelta), - numLevels, tileWidth, tileWidth); - - /** - * Internal use only - * The list of assembled tiles. - * @type {Array} - * @ignore - */ - this.currentTiles = []; - - /** - * Internal use only - * A scratch sector for use in computations. - * @type {Sector} - * @ignore - */ - this.currentSector = new Sector(0, 0, 0, 0); - - /** - * Internal use only - * A cache of elevation tiles. - * @type {MemoryCache} - * @ignore - */ - this.tileCache = new MemoryCache(1000000, 800000); - - /** - * Internal use only - * A cache of elevations. - * @type {MemoryCache} - * @ignore - */ - this.imageCache = new MemoryCache(10000000, 8000000); - - /** - * Controls how many concurrent tile requests are allowed for this coverage. - * @type {Number} - * @default WorldWind.configuration.coverageRetrievalQueueSize - */ - this.retrievalQueueSize = WorldWind.configuration.coverageRetrievalQueueSize; - - /** - * Internal use only - * The list of elevation retrievals in progress. - * @type {Array} - * @ignore - */ - this.currentRetrievals = []; - - /** - * Internal use only - * The list of resources pending acquisition. - * @type {Array} - * @ignore - */ - this.absentResourceList = new AbsentResourceList(3, 5e3); - - /** - * Internal use only - * The factory to create URLs for data requests. This property is typically set in the constructor of child - * classes. See {@link WcsUrlBuilder} for a concrete example. - * @type {UrlBuilder} - * @ignore - */ - // this.urlBuilder = new UrlBuilder() || null; - this.urlBuilder = config.urlBuilder || null; -} - -TiledElevationCoverage.prototype = Object.create(ElevationCoverage.prototype); - -// Documented in super class -TiledElevationCoverage.prototype.minAndMaxElevationsForSector = function (sector, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "minAndMaxElevationsForSector", "missingSector")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "minAndMaxElevationsForSector", "missingResult")); - } - - var levelNumber = Math.log2(360 / (sector.maxLongitude - sector.minLongitude)); - var tileSize = 360 / 2 ** levelNumber; - var column = (180 + sector.minLongitude) / tileSize; - var row = (180 - sector.maxLatitude) / tileSize; - var tileKey = Tile.computeTileKey(levelNumber, row, column); - - var image = this.imageCache.entryForKey(tileKey); - if (!image || !image.hasData) { - return false; - } - - result[0] = image.minElevation; - result[1] = image.maxElevation; - - return true; -}; - -// Documented in super class -TiledElevationCoverage.prototype.elevationAtLocation = function (latitude, longitude) { - latitude = WWMath.mercatorLat(latitude); - if (!this.coverageSector.containsLocation(latitude, longitude)) { - return null; // location is outside the coverage's coverage - } - - return this.pointElevationForLocation(latitude, longitude); -}; - -// Documented in super class -TiledElevationCoverage.prototype.elevationsForGrid = function (sector, numLat, numLon, result) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "elevationsForGrid", "missingSector")); - } - - if (!numLat || !numLon || numLat < 1 || numLon < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledElevationCoverage", "elevationsForGrid", - "The specified number of latitudinal or longitudinal positions is less than one.")); - } - - var gridResolution = sector.deltaLatitude() / (numLat - 1) * Angle.DEGREES_TO_RADIANS; - var level = this.levels.levelForTexelSize(gridResolution); - if (this.pixelIsPoint) { - return this.pointElevationsForGrid(sector, numLat, numLon, level, result); - } else { - return this.areaElevationsForGrid(sector, numLat, numLon, level, result); - } -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.pointElevationForLocation = function (latitude, longitude) { - var level = this.levels.lastLevel(), - deltaLat = level.tileDelta.latitude, - deltaLon = level.tileDelta.longitude, - r = Tile.computeRow(deltaLat, latitude), - c = Tile.computeColumn(deltaLon, longitude), - tileKey, - image = null; - - for (var i = level.levelNumber; i >= 0; i--) { - tileKey = Tile.computeTileKey(i, r, c); - image = this.imageCache.entryForKey(tileKey); - if (image) { - var elevation = image.elevationAtLocation(latitude, longitude); - return isNaN(elevation) ? null : elevation; - } - - r = Math.floor(r / 2); - c = Math.floor(c / 2); - } - - return null; // did not find a tile with an image -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.pointElevationsForGrid = function (sector, numLat, numLon, level, result) { - this.assembleTiles(level, sector, true); - if (this.currentTiles.length === 0) { - return false; // Sector is outside the coverage's coverage area. Do not modify the results array. - } - - // Sort from lowest resolution to highest so that higher resolutions override lower resolutions in the - // loop below. - this.currentTiles.sort(function (tileA, tileB) { - return tileA.level.levelNumber - tileB.level.levelNumber; - }); - - for (var i = 0, len = this.currentTiles.length; i < len; i++) { - var image = this.imageCache.entryForKey(this.currentTiles[i].tileKey); - if (image) { - image.elevationsForGrid(sector, numLat, numLon, result); - } - } - - return !result.includes(NaN); // true if the result array is fully populated. -}; - -// Internal. Returns elevations for a grid assuming pixel-is-area. -TiledElevationCoverage.prototype.areaElevationsForGrid = function (sector, numLat, numLon, level, result) { - var minLat = sector.minLatitude, - maxLat = sector.maxLatitude, - minLon = sector.minLongitude, - maxLon = sector.maxLongitude, - deltaLat = sector.deltaLatitude() / (numLat > 1 ? numLat - 1 : 1), - deltaLon = sector.deltaLongitude() / (numLon > 1 ? numLon - 1 : 1), - lat, lon, s, t, - latIndex, lonIndex, resultIndex = 0; - - for (latIndex = 0, lat = minLat; latIndex < numLat; latIndex += 1, lat += deltaLat) { - if (latIndex === numLat - 1) { - lat = maxLat; // explicitly set the last lat to the max latitude ensure alignment - } - - for (lonIndex = 0, lon = minLon; lonIndex < numLon; lonIndex += 1, lon += deltaLon) { - if (lonIndex === numLon - 1) { - lon = maxLon; // explicitly set the last lon to the max longitude ensure alignment - } - - if (isNaN(result[resultIndex])) { - if (this.coverageSector.containsLocation(lat, lon)) { // ignore locations outside of the model - s = (lon + 180) / 360; - t = (lat + 180) / 360; - this.areaElevationForCoord(s, t, level.levelNumber, result, resultIndex); - } - } - - resultIndex++; - } - } - - return !result.includes(NaN); // true if the result array is fully populated. -}; - -// Internal. Returns an elevation for a location assuming pixel-is-area. -TiledElevationCoverage.prototype.areaElevationForCoord = function (s, t, levelNumber, result, resultIndex) { - var level, levelWidth, levelHeight, - tMin, tMax, - vMin, vMax, - u, v, - x0, x1, y0, y1, - xf, yf, - retrieveTiles, - pixels = new Float64Array(4); - - for (var i = levelNumber; i >= 0; i--) { - level = this.levels.level(i); - levelWidth = Math.round(level.tileWidth * 360 / level.tileDelta.longitude); - levelHeight = Math.round(level.tileHeight * 360 / level.tileDelta.latitude); - tMin = 1 / (2 * levelHeight); - tMax = 1 - tMin; - vMin = 0; - vMax = levelHeight - 1; - u = levelWidth * WWMath.fract(s); // wrap the horizontal coordinate - v = levelHeight * WWMath.clamp(t, tMin, tMax); // clamp the vertical coordinate to the level edge - x0 = WWMath.mod(Math.floor(u - 0.5), levelWidth); - x1 = WWMath.mod(x0 + 1, levelWidth); - y0 = WWMath.clamp(Math.floor(v - 0.5), vMin, vMax); - y1 = WWMath.clamp(y0 + 1, vMin, vMax); - xf = WWMath.fract(u - 0.5); - yf = WWMath.fract(v - 0.5); - retrieveTiles = i == levelNumber || i == 0; - - if (this.lookupPixels(x0, x1, y0, y1, level, retrieveTiles, pixels)) { - if (ElevationImage.isNoData(pixels[0], pixels[1], pixels[2], pixels[3])) { - return false; - } - else { - result[resultIndex] = (1 - xf) * (1 - yf) * pixels[0] + - xf * (1 - yf) * pixels[1] + - (1 - xf) * yf * pixels[2] + - xf * yf * pixels[3]; - return true; - } - } - } - - return false; -}; - -// Internal. Bilinearly interpolates tile-image elevations. -TiledElevationCoverage.prototype.lookupPixels = function (x0, x1, y0, y1, level, retrieveTiles, result) { - var levelNumber = level.levelNumber, - tileWidth = level.tileWidth, - tileHeight = level.tileHeight, - row0 = Math.floor(y0 / tileHeight), - row1 = Math.floor(y1 / tileHeight), - col0 = Math.floor(x0 / tileWidth), - col1 = Math.floor(x1 / tileWidth), - r0c0, r0c1, r1c0, r1c1; - - if (row0 == row1 && row0 == this.cachedRow && col0 == col1 && col0 == this.cachedCol) { - r0c0 = r0c1 = r1c0 = r1c1 = this.cachedImage; // use results from previous lookup - } else if (row0 == row1 && col0 == col1) { - r0c0 = this.lookupImage(levelNumber, row0, col0, retrieveTiles); // only need to lookup one image - r0c1 = r1c0 = r1c1 = r0c0; // re-use the single image - this.cachedRow = row0; - this.cachedCol = col0; - this.cachedImage = r0c0; // note the results for subsequent lookups - } else { - r0c0 = this.lookupImage(levelNumber, row0, col0, retrieveTiles); - r0c1 = this.lookupImage(levelNumber, row0, col1, retrieveTiles); - r1c0 = this.lookupImage(levelNumber, row1, col0, retrieveTiles); - r1c1 = this.lookupImage(levelNumber, row1, col1, retrieveTiles); - } - - if (r0c0 && r0c1 && r1c0 && r1c1) { - result[0] = r0c0.pixel(x0 % tileWidth, y0 % tileHeight); - result[1] = r0c1.pixel(x1 % tileWidth, y0 % tileHeight); - result[2] = r1c0.pixel(x0 % tileWidth, y1 % tileHeight); - result[3] = r1c1.pixel(x1 % tileWidth, y1 % tileHeight); - return true; - } - - return false; -}; - -// Internal. Intentionally not documented. -TiledElevationCoverage.prototype.lookupImage = function (levelNumber, row, column, retrieveTiles) { - var tileKey = Tile.computeTileKey(levelNumber, row, column), - image = this.imageCache.entryForKey(tileKey); - - if (image == null && retrieveTiles) { - var tile = this.tileForLevel(levelNumber, row, column); - this.retrieveTileImage(tile); - } - - return image; -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.assembleTiles = function (level, sector, retrieveTiles) { - this.currentTiles = []; - - // Intersect the requested sector with the coverage's coverage area. This avoids attempting to assemble tiles - // that are outside the coverage area. - this.currentSector.copy(sector); - this.currentSector.intersection(this.coverageSector); - - if (this.currentSector.isEmpty()) - return; // sector is outside the coverage's coverage area - - var deltaLat = level.tileDelta.latitude, - deltaLon = level.tileDelta.longitude, - firstRow = Tile.computeRow(deltaLat, this.currentSector.minLatitude), - lastRow = Tile.computeLastRow(deltaLat, this.currentSector.maxLatitude), - firstCol = Tile.computeColumn(deltaLon, this.currentSector.minLongitude), - lastCol = Tile.computeLastColumn(deltaLon, this.currentSector.maxLongitude); - - for (var row = firstRow; row <= lastRow; row++) { - for (var col = firstCol; col <= lastCol; col++) { - this.addTileOrAncestor(level, row, col, retrieveTiles); - } - } -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.addTileOrAncestor = function (level, row, column, retrieveTiles) { - var tile = this.tileForLevel(level.levelNumber, row, column); - - if (this.isTileImageInMemory(tile)) { - this.addToCurrentTiles(tile); - } else { - if (retrieveTiles) { - this.retrieveTileImage(tile); - } - - if (level.isFirstLevel()) { - this.currentTiles.push(tile); // no ancestor tile to add - } else { - this.addAncestor(level, row, column, retrieveTiles); - } - } -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.addAncestor = function (level, row, column, retrieveTiles) { - var tile = null, - r = Math.floor(row / 2), - c = Math.floor(column / 2); - - for (var i = level.levelNumber - 1; i >= 0; i--) { - tile = this.tileForLevel(i, r, c); - if (this.isTileImageInMemory(tile)) { - this.addToCurrentTiles(tile); - return; - } - - r = Math.floor(r / 2); - c = Math.floor(c / 2); - } - - // No ancestor tiles have an in-memory image. Retrieve the ancestor tile corresponding for the first level, and - // add it. We add the necessary tiles to provide coverage over the requested sector in order to accurately return - // whether or not this coverage has data for the entire sector. - this.addToCurrentTiles(tile); - - if (retrieveTiles) { - this.retrieveTileImage(tile); - } -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.addToCurrentTiles = function (tile) { - this.currentTiles.push(tile); -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.tileForLevel = function (levelNumber, row, column) { - var tileKey = Tile.computeTileKey(levelNumber, row, column), - tile = this.tileCache.entryForKey(tileKey); - - if (tile) { - return tile; - } - - var level = this.levels.level(levelNumber), - sector = Tile.computeSector(level, row, column); - - tile = new Tile(sector, level, row, column); - this.tileCache.putEntry(tileKey, tile, tile.size()); - - return tile; -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.isTileImageInMemory = function (tile) { - return this.imageCache.containsKey(tile.tileKey); -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.resourceUrlForTile = function (tile) { - return this.urlBuilder.urlForTile(tile, this.retrievalImageFormat); -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.retrieveTileImage = function (tile) { - if (this.currentRetrievals.indexOf(tile.tileKey) < 0) { - - if (this.currentRetrievals.length > this.retrievalQueueSize) { - return; - } - - var url = this.resourceUrlForTile(tile, this.retrievalImageFormat), - xhr = new XMLHttpRequest(), - elevationCoverage = this; - - if (!url) - return; - - xhr.open("GET", url + `&x=${tile.column}&y=${tile.row}&z=${tile.level.levelNumber + 1}`, true); - xhr.responseType = 'arraybuffer'; - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - elevationCoverage.removeFromCurrentRetrievals(tile.tileKey); - - var contentType = xhr.getResponseHeader("content-type"); - - if (xhr.status === 200) { - if (contentType === elevationCoverage.retrievalImageFormat - || contentType === "text/plain" - || contentType === "application/octet-stream") { - Logger.log(Logger.LEVEL_INFO, "Elevations retrieval succeeded: " + url); - elevationCoverage.loadElevationImage(tile, xhr); - elevationCoverage.absentResourceList.unmarkResourceAbsent(tile.tileKey); - - // Send an event to request a redraw. - var e = document.createEvent('Event'); - e.initEvent(WorldWind.REDRAW_EVENT_TYPE, true, true); - window.dispatchEvent(e); - } else if (contentType === "text/xml") { - elevationCoverage.absentResourceList.markResourceAbsent(tile.tileKey); - Logger.log(Logger.LEVEL_WARNING, - "Elevations retrieval failed (" + xhr.statusText + "): " + url + ".\n " - + String.fromCharCode.apply(null, new Uint8Array(xhr.response))); - } else { - elevationCoverage.absentResourceList.markResourceAbsent(tile.tileKey); - Logger.log(Logger.LEVEL_WARNING, - "Elevations retrieval failed: " + url + ". " + "Unexpected content type " - + contentType); - } - } else { - elevationCoverage.absentResourceList.markResourceAbsent(tile.tileKey); - Logger.log(Logger.LEVEL_WARNING, - "Elevations retrieval failed (" + xhr.statusText + "): " + url); - } - } - }; - - xhr.onerror = function () { - elevationCoverage.removeFromCurrentRetrievals(tile.tileKey); - elevationCoverage.absentResourceList.markResourceAbsent(tile.tileKey); - Logger.log(Logger.LEVEL_WARNING, "Elevations retrieval failed: " + url); - }; - - xhr.ontimeout = function () { - elevationCoverage.removeFromCurrentRetrievals(tile.tileKey); - elevationCoverage.absentResourceList.markResourceAbsent(tile.tileKey); - Logger.log(Logger.LEVEL_WARNING, "Elevations retrieval timed out: " + url); - }; - - xhr.send(null); - - this.currentRetrievals.push(tile.tileKey); - } -}; - -// Intentionally not documented -TiledElevationCoverage.prototype.removeFromCurrentRetrievals = function (tileKey) { - var index = this.currentRetrievals.indexOf(tileKey); - if (index > -1) { - this.currentRetrievals.splice(index, 1); - } -}; - -// Intentionally not documented. -TiledElevationCoverage.prototype.loadElevationImage = function (tile, xhr) { - var elevationImage = new ElevationImage(tile.sector, tile.tileWidth, tile.tileHeight), - geoTiff; - - if (this.retrievalImageFormat === "application/bil16") { - elevationImage.imageData = new Int16Array(xhr.response); - elevationImage.size = elevationImage.imageData.length * 2; - } else if (this.retrievalImageFormat === "application/bil32") { - elevationImage.imageData = new Float32Array(xhr.response); - elevationImage.size = elevationImage.imageData.length * 4; - } - - if (elevationImage.imageData) { - elevationImage.findMinAndMaxElevation(); - this.imageCache.putEntry(tile.tileKey, elevationImage, elevationImage.size); - this.timestamp = Date.now(); - } -}; - -export default TiledElevationCoverage; diff --git a/web/src/gis/globe/UsgsNedElevationCoverage.js b/web/src/gis/globe/UsgsNedElevationCoverage.js deleted file mode 100644 index fd4ee5db..00000000 --- a/web/src/gis/globe/UsgsNedElevationCoverage.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports UsgsNedElevationCoverage - */ -import Sector from '../geom/Sector'; -import TiledElevationCoverage from '../globe/TiledElevationCoverage'; -import WmsUrlBuilder from '../util/WmsUrlBuilder'; - - -/** - * Constructs an Earth elevation coverage using USGS NED data. - * @alias UsgsNedElevationCoverage - * @constructor - * @augments TiledElevationCoverage - * @classdesc Provides elevations for Earth. Elevations are drawn from the NASA WorldWind elevation service. - */ -function UsgsNedElevationCoverage() { - // CONUS Extent: (-124.848974, 24.396308) - (-66.885444, 49.384358) - // TODO: Expand this extent to cover HI when the server NO_DATA value issue is resolved. - TiledElevationCoverage.call(this, { - coverageSector: new Sector(24.396308, 49.384358, -124.848974, -66.885444), - resolution: 0.000092592592593, - retrievalImageFormat: "application/bil16", - minElevation: -11000, - maxElevation: 8850, - urlBuilder: new WmsUrlBuilder("https://worldwind26.arc.nasa.gov/elev", "USGS-NED", "", "1.3.0") - }); - - this.displayName = "USGS NED Earth Elevation Coverage"; -} - -UsgsNedElevationCoverage.prototype = Object.create(TiledElevationCoverage.prototype); - -export default UsgsNedElevationCoverage; diff --git a/web/src/gis/globe/UsgsNedHiElevationCoverage.js b/web/src/gis/globe/UsgsNedHiElevationCoverage.js deleted file mode 100644 index 18c7c7bc..00000000 --- a/web/src/gis/globe/UsgsNedHiElevationCoverage.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports UsgsNedHiElevationCoverage - */ -import Sector from '../geom/Sector'; -import TiledElevationCoverage from '../globe/TiledElevationCoverage'; -import WmsUrlBuilder from '../util/WmsUrlBuilder'; - - -/** - * Constructs an Earth elevation coverage using USGS NED data. - * @alias UsgsNedHiElevationCoverage - * @constructor - * @augments TiledElevationCoverage - * @classdesc Provides elevations for Earth. Elevations are drawn from the NASA WorldWind elevation service. - */ -function UsgsNedHiElevationCoverage() { - // Hawaii Extent: (-178.443593, 18.865460) - (-154.755792, 28.517269) - // TODO: Remove this class when the server NO_DATA value issue is resolved. - TiledElevationCoverage.call(this, { - coverageSector: new Sector(18.865460, 28.517269, -178.443593, -154.755792), - resolution: 0.000092592592593, - retrievalImageFormat: "application/bil16", - minElevation: -11000, - maxElevation: 8850, - urlBuilder: new WmsUrlBuilder("https://worldwind26.arc.nasa.gov/elev", "USGS-NED", "", "1.3.0") - }); - - this.displayName = "USGS NED Hawaii Elevation Coverage"; -} - -UsgsNedHiElevationCoverage.prototype = Object.create(TiledElevationCoverage.prototype); - -export default UsgsNedHiElevationCoverage; diff --git a/web/src/gis/layer/AtmosphereLayer.js b/web/src/gis/layer/AtmosphereLayer.js deleted file mode 100644 index bdac39bd..00000000 --- a/web/src/gis/layer/AtmosphereLayer.js +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AtmosphereLayer - */ -import GroundProgram from '../shaders/GroundProgram'; -import Layer from '../layer/Layer'; -import Matrix3 from '../geom/Matrix3'; -import Sector from '../geom/Sector'; -import SkyProgram from '../shaders/SkyProgram'; -import SunPosition from '../util/SunPosition'; -import Vec3 from '../geom/Vec3'; -import WWUtil from '../util/WWUtil'; - - -/** - * Constructs a layer showing the Earth's atmosphere. - * @alias AtmosphereLayer - * @constructor - * @classdesc Provides a layer showing the Earth's atmosphere. - * @param {URL} nightImageSource optional url for the night texture. - * @augments Layer - */ -function AtmosphereLayer(nightImageSource) { - Layer.call(this, "Atmosphere"); - - // The atmosphere layer is not pickable. - this.pickEnabled = false; - - //Documented in defineProperties below. - this._nightImageSource = nightImageSource || - WorldWind.configuration.baseUrl + 'images/dnb_land_ocean_ice_2012.png'; - - //Internal use only. - //The light direction in cartesian space, computed from the layer time or defaults to the eyePoint. - this._activeLightDirection = new Vec3(0, 0, 0); - - this._fullSphereSector = Sector.FULL_SPHERE; - - //Internal use only. Intentionally not documented. - this._skyData = {}; - - //Internal use only. The number of longitudinal points in the grid for the sky geometry. - this._skyWidth = 128; - - //Internal use only. The number of latitudinal points in the grid for the sky geometry. - this._skyHeight = 128; - - //Internal use only. Number of indices for the sky geometry. - this._numIndices = 0; - - //Internal use only. Texture coordinate matrix used for the night texture. - this._texMatrix = Matrix3.fromIdentity(); - - //Internal use only. The night texture. - this._activeTexture = null; -} - -AtmosphereLayer.prototype = Object.create(Layer.prototype); - -Object.defineProperties(AtmosphereLayer.prototype, { - - /** - * Url for the night texture. - * @memberof AtmosphereLayer.prototype - * @type {URL} - */ - nightImageSource: { - get: function () { - return this._nightImageSource; - }, - set: function (value) { - this._nightImageSource = value; - } - } - -}); - -// Documented in superclass. -AtmosphereLayer.prototype.doRender = function (dc) { - if (dc.globe.is2D()) { - return; - } - - this.determineLightDirection(dc); - this.drawSky(dc); - this.drawGround(dc); -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.applySkyVertices = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - skyData = this._skyData, - skyPoints, vboId; - - if (!skyData.verticesVboCacheKey) { - skyData.verticesVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(skyData.verticesVboCacheKey); - - if (!vboId) { - skyPoints = this.assembleVertexPoints(dc, this._skyHeight, this._skyWidth, program.getAltitude()); - - vboId = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, skyPoints, gl.STATIC_DRAW); - gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0); - - dc.gpuResourceCache.putResource(skyData.verticesVboCacheKey, vboId, - skyPoints.length * 4); - dc.frameStatistics.incrementVboLoadCount(1); - } - else { - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0); - } - -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.applySkyIndices = function (dc) { - var gl = dc.currentGlContext, - skyData = this._skyData, - skyIndices, vboId; - - if (!skyData.indicesVboCacheKey) { - skyData.indicesVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(skyData.indicesVboCacheKey); - - if (!vboId) { - skyIndices = this.assembleTriStripIndices(this._skyWidth, this._skyHeight); - - vboId = gl.createBuffer(); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboId); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, skyIndices, gl.STATIC_DRAW); - - dc.frameStatistics.incrementVboLoadCount(1); - dc.gpuResourceCache.putResource(skyData.indicesVboCacheKey, vboId, skyIndices.length * 2); - } - else { - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboId); - } - -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.drawSky = function (dc) { - var gl = dc.currentGlContext, - program = dc.findAndBindProgram(SkyProgram); - - program.loadGlobeRadius(gl, dc.globe.equatorialRadius); - - program.loadEyePoint(gl, dc.eyePoint); - - program.loadVertexOrigin(gl, Vec3.ZERO); - - program.loadModelviewProjection(gl, dc.modelviewProjection); - - program.loadLightDirection(gl, this._activeLightDirection); - - program.setScale(gl); - - this.applySkyVertices(dc); - this.applySkyIndices(dc); - - gl.depthMask(false); - gl.frontFace(gl.CW); - gl.enableVertexAttribArray(0); - gl.drawElements(gl.TRIANGLE_STRIP, this._numIndices, gl.UNSIGNED_SHORT, 0); - - gl.depthMask(true); - gl.frontFace(gl.CCW); - gl.disableVertexAttribArray(0); -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.drawGround = function (dc) { - var gl = dc.currentGlContext, - program = dc.findAndBindProgram(GroundProgram), - terrain = dc.terrain, - textureBound; - - program.loadGlobeRadius(gl, dc.globe.equatorialRadius); - - program.loadEyePoint(gl, dc.eyePoint); - - program.loadLightDirection(gl, this._activeLightDirection); - - program.setScale(gl); - - // Use this layer's night image when the layer has time value defined - if (this.nightImageSource && this.time !== null) { - - this._activeTexture = dc.gpuResourceCache.resourceForKey(this.nightImageSource); - - if (!this._activeTexture) { - this._activeTexture = dc.gpuResourceCache.retrieveTexture(gl, this.nightImageSource); - } - - textureBound = this._activeTexture && this._activeTexture.bind(dc); - } - - terrain.beginRendering(dc); - - for (var idx = 0, len = terrain.surfaceGeometry.length; idx < len; idx++) { - var currentTile = terrain.surfaceGeometry[idx]; - - // Use the vertex origin for the terrain tile. - var terrainOrigin = currentTile.referencePoint; - program.loadVertexOrigin(gl, terrainOrigin); - - // Use a tex coord matrix that registers the night texture correctly on each terrain. - if (textureBound) { - this._texMatrix.setToUnitYFlip(); - this._texMatrix.multiplyByTileTransform(currentTile.sector, this._fullSphereSector); - program.loadTexMatrix(gl, this._texMatrix); - } - - terrain.beginRenderingTile(dc, currentTile); - - // Draw the tile, multiplying the current fragment color by the program's secondary color. - program.loadFragMode(gl, program.FRAGMODE_GROUND_SECONDARY); - gl.blendFunc(gl.DST_COLOR, gl.ZERO); - terrain.renderTile(dc, currentTile); - - // Draw the terrain as triangles, adding the current fragment color to the program's primary color. - var fragMode = textureBound ? - program.FRAGMODE_GROUND_PRIMARY_TEX_BLEND : program.FRAGMODE_GROUND_PRIMARY; - program.loadFragMode(gl, fragMode); - gl.blendFunc(gl.ONE, gl.ONE); - terrain.renderTile(dc, currentTile); - - terrain.endRenderingTile(dc, currentTile); - } - - // Restore the default WorldWind OpenGL state. - terrain.endRendering(dc); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - - // Clear references to Gpu resources. - this._activeTexture = null; -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.assembleVertexPoints = function (dc, numLat, numLon, altitude) { - var count = numLat * numLon; - var altitudes = new Array(count); - WWUtil.fillArray(altitudes, altitude); - var result = new Float32Array(count * 3); - - return dc.globe.computePointsForGrid(this._fullSphereSector, numLat, numLon, altitudes, Vec3.ZERO, result); -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.assembleTriStripIndices = function (numLat, numLon) { - var result = []; - var vertex = 0; - - for (var latIndex = 0; latIndex < numLat - 1; latIndex++) { - // Create a triangle strip joining each adjacent column of vertices, starting in the bottom left corner and - // proceeding to the right. The first vertex starts with the left row of vertices and moves right to create - // a counterclockwise winding order. - for (var lonIndex = 0; lonIndex < numLon; lonIndex++) { - vertex = lonIndex + latIndex * numLon; - result.push(vertex + numLon); - result.push(vertex); - } - - // Insert indices to create 2 degenerate triangles: - // - one for the end of the current row, and - // - one for the beginning of the next row - if (latIndex < numLat - 2) { - result.push(vertex); - result.push((latIndex + 2) * numLon); - } - } - - this._numIndices = result.length; - - return new Uint16Array(result); -}; - -// Internal. Intentionally not documented. -AtmosphereLayer.prototype.determineLightDirection = function (dc) { - if (this.time !== null) { - var sunLocation = SunPosition.getAsGeographicLocation(this.time); - dc.globe.computePointFromLocation(sunLocation.latitude, sunLocation.longitude, - this._activeLightDirection); - } else { - this._activeLightDirection.copy(dc.eyePoint); - } - this._activeLightDirection.normalize(); -}; - -export default AtmosphereLayer; diff --git a/web/src/gis/layer/Layer.js b/web/src/gis/layer/Layer.js deleted file mode 100644 index f6ae0290..00000000 --- a/web/src/gis/layer/Layer.js +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Layer - */ - -/** - * Constructs a layer. This constructor is meant to be called by subclasses and not directly by an application. - * @alias Layer - * @constructor - * @classdesc Provides an abstract base class for layer implementations. This class is not meant to be instantiated - * directly. - */ -function Layer(displayName) { - - /** - * This layer's display name. - * @type {String} - * @default "Layer" - */ - this.displayName = displayName ? displayName : "Layer"; - - /** - * Indicates whether to display this layer. - * @type {Boolean} - * @default true - */ - this.enabled = true; - - /** - * Indicates whether this layer is pickable. - * @type {Boolean} - * @default true - */ - this.pickEnabled = true; - - /** - * This layer's opacity, which is combined with the opacity of shapes within layers. - * Opacity is in the range [0, 1], with 1 indicating fully opaque. - * @type {Number} - * @default 1 - */ - this.opacity = 1; - - /** - * The eye altitude above which this layer is displayed, in meters. - * @type {Number} - * @default -Number.MAX_VALUE (always displayed) - */ - this.minActiveAltitude = -Number.MAX_VALUE; - - /** - * The eye altitude below which this layer is displayed, in meters. - * @type {Number} - * @default Number.MAX_VALUE (always displayed) - */ - this.maxActiveAltitude = Number.MAX_VALUE; - - /** - * Indicates whether elements of this layer were drawn in the most recently generated frame. - * @type {Boolean} - * @readonly - */ - this.inCurrentFrame = false; - - /** - * The time to display. This property selects the layer contents that represents the specified time. - * If null, layer-type dependent contents are displayed. - * @type {Date} - */ - this.time = null; -} - -/** - * Refreshes the data associated with this layer. The behavior of this function varies with the layer - * type. For image layers, it causes the images to be re-retrieved from their origin. - */ -Layer.prototype.refresh = function () { - // Default implementation does nothing. -}; - -/** - * Displays this layer. Subclasses should generally not override this method but should instead override the - * [doRender]{@link Layer#doRender} method. This method calls that method after verifying that the layer is - * enabled, the eye point is within this layer's active altitudes and the layer is in view. - * @param {DrawContext} dc The current draw context. - */ -Layer.prototype.render = function (dc) { - this.inCurrentFrame = false; - - if (!this.enabled) - return; - - if (dc.pickingMode && !this.pickEnabled) - return; - - if (!this.withinActiveAltitudes(dc)) - return; - - if (!this.isLayerInView(dc)) - return; - - this.doRender(dc); -}; - -/** - * Subclass method called to display this layer. Subclasses should implement this method rather than the - * [render]{@link Layer#render} method, which determines enable, pick and active altitude status and does not - * call this doRender method if the layer should not be displayed. - * @param {DrawContext} dc The current draw context. - * @protected - */ -Layer.prototype.doRender = function (dc) { - // Default implementation does nothing. -}; - -/* INTENTIONALLY NOT DOCUMENTED - * Indicates whether the current eye distance is within this layer's active-altitude range. - * @param {DrawContext} dc The current draw context. - * @returns {boolean} true If the eye distance is greater than or equal to this layer's minimum active - * altitude and less than or equal to this layer's maximum active altitude, otherwise false. - * @protected - */ -Layer.prototype.withinActiveAltitudes = function (dc) { - var eyePosition = dc.eyePosition; - if (!eyePosition) - return false; - - return eyePosition.altitude >= this.minActiveAltitude && eyePosition.altitude <= this.maxActiveAltitude; -}; - -/** - * Indicates whether this layer is within the current view. Subclasses may override this method and - * when called determine whether the layer contents are visible in the current view frustum. The default - * implementation always returns true. - * @param {DrawContext} dc The current draw context. - * @returns {boolean} true If this layer is within the current view, otherwise false. - * @protected - */ -Layer.prototype.isLayerInView = function (dc) { - return true; // default implementation always returns true -}; - -export default Layer; diff --git a/web/src/gis/layer/MercatorTiledImageLayer.js b/web/src/gis/layer/MercatorTiledImageLayer.js deleted file mode 100644 index 2e6c6e99..00000000 --- a/web/src/gis/layer/MercatorTiledImageLayer.js +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports MercatorTiledImageLayer - */ -import Sector from '../geom/Sector'; -import TiledImageLayer from '../layer/TiledImageLayer'; -import Vec2 from '../geom/Vec2'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a layer supporting Mercator imagery. - * @alias MercatorTiledImageLayer - * @constructor - * @augments TiledImageLayer - * @classdesc Provides an abstract layer to support Mercator layers. - * - * @param {Sector} sector The sector this layer covers. - * @param {Location} levelZeroDelta The size in latitude and longitude of level zero (lowest resolution) tiles. - * @param {Number} numLevels The number of levels to define for the layer. Each level is successively one power - * of two higher resolution than the next lower-numbered level. (0 is the lowest resolution level, 1 is twice - * that resolution, etc.) - * Each level contains four times as many tiles as the next lower-numbered level, each 1/4 the geographic size. - * @param {String} imageFormat The mime type of the image format for the layer's tiles, e.g., <em>image/png</em>. - * @param {String} cachePath A string uniquely identifying this layer relative to other layers. - * @param {Number} tileWidth The horizontal size of image tiles in pixels. - * @param {Number} tileHeight The vertical size of image tiles in pixels. - * @throws {ArgumentError} If any of the specified sector, level-zero delta, cache path or image format arguments are - * null or undefined, or if the specified number of levels, tile width or tile height is less than 1. - */ -function MercatorTiledImageLayer(sector, levelZeroDelta, numLevels, imageFormat, cachePath, - tileWidth, tileHeight) { - TiledImageLayer.call(this, - sector, levelZeroDelta, numLevels, imageFormat, cachePath, tileWidth, tileHeight); -} - -MercatorTiledImageLayer.prototype = Object.create(TiledImageLayer.prototype); - -// Overridden from TiledImageLayer. Computes a tile's sector and creates the tile. -// Unlike typical tiles, Tiles at the same level do not have the same sector size. -MercatorTiledImageLayer.prototype.createTile = function (sector, level, row, column) { - var degreePerTile = 360 / (1 << level.levelNumber); - var minLon = degreePerTile * column - 180; - var maxLon = minLon + degreePerTile; - var maxLat = 180 - degreePerTile * row; - var minLat = maxLat - degreePerTile; - - sector = new Sector(minLat, maxLat, minLon, maxLon); - return TiledImageLayer.prototype.createTile.call(this, sector, level, row, column); -}; - -export default MercatorTiledImageLayer; diff --git a/web/src/gis/layer/StarFieldLayer.js b/web/src/gis/layer/StarFieldLayer.js deleted file mode 100644 index 5a77f117..00000000 --- a/web/src/gis/layer/StarFieldLayer.js +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports StarFieldLayer - */ -import Layer from './Layer'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import StarFieldProgram from '../shaders/StarFieldProgram'; -import SunPosition from '../util/SunPosition'; - - -/** - * Constructs a layer showing stars and the Sun around the Earth. - * If used together with the AtmosphereLayer, the StarFieldLayer must be inserted before the AtmosphereLayer. - * - * If you want to use your own star data, the file provided must be .json - * and the fields 'ra', 'dec' and 'vmag' must be present in the metadata. - * ra and dec must be expressed in degrees. - * - * This layer uses J2000.0 as the ref epoch. - * - * If the star data .json file is too big, consider enabling gzip compression on your web server. - * For more info about enabling gzip compression consult the configuration for your web server. - * - * @alias StarFieldLayer - * @constructor - * @classdesc Provides a layer showing stars, and the Sun around the Earth - * @param {URL} starDataSource optional url for the stars data - * @augments Layer - */ -function StarFieldLayer(starDataSource) { - Layer.call(this, 'StarField'); - - // The StarField Layer is not pickable. - this.pickEnabled = false; - - /** - * The size of the Sun in pixels. - * This can not exceed the maximum allowed pointSize of the GPU. - * A warning will be given if the size is too big and the allowed max size will be used. - * @type {Number} - * @default 128 - */ - this.sunSize = 128; - - /** - * Indicates weather to show or hide the Sun - * @type {Boolean} - * @default true - */ - this.showSun = true; - - //Documented in defineProperties below. - this._starDataSource = starDataSource || WorldWind.configuration.baseUrl + 'images/stars.json'; - this._sunImageSource = WorldWind.configuration.baseUrl + 'images/sunTexture.png'; - - //Internal use only. - //The MVP matrix of this layer. - this._matrix = Matrix.fromIdentity(); - - //Internal use only. - //gpu cache key for the stars vbo. - this._starsPositionsVboCacheKey = null; - - //Internal use only. - this._numStars = 0; - - //Internal use only. - this._starData = null; - - //Internal use only. - this._minMagnitude = Number.MAX_VALUE; - this._maxMagnitude = Number.MIN_VALUE; - - //Internal use only. - //A flag to indicate the star data is currently being retrieved. - this._loadStarted = false; - - //Internal use only. - this._minScale = 10e6; - - //Internal use only. - this._sunPositionsCacheKey = ''; - this._sunBufferView = new Float32Array(4); - - //Internal use only. - this._MAX_GL_POINT_SIZE = 0; -} - -StarFieldLayer.prototype = Object.create(Layer.prototype); - -Object.defineProperties(StarFieldLayer.prototype, { - /** - * Url for the stars data. - * @memberof StarFieldLayer.prototype - * @type {URL} - */ - starDataSource: { - get: function () { - return this._starDataSource; - }, - set: function (value) { - this._starDataSource = value; - this.invalidateStarData(); - } - }, - - /** - * Url for the sun texture image. - * @memberof StarFieldLayer.prototype - * @type {URL} - */ - sunImageSource: { - get: function () { - return this._sunImageSource; - }, - set: function (value) { - this._sunImageSource = value; - } - } -}); - -// Documented in superclass. -StarFieldLayer.prototype.doRender = function (dc) { - if (dc.globe.is2D()) { - return; - } - - if (!this.haveResources(dc)) { - this.loadResources(dc); - return; - } - - this.beginRendering(dc); - try { - this.doDraw(dc); - } - finally { - this.endRendering(dc); - } -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.haveResources = function (dc) { - var sunTexture = dc.gpuResourceCache.resourceForKey(this._sunImageSource); - return ( - this._starData != null && - sunTexture != null - ); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.loadResources = function (dc) { - var gl = dc.currentGlContext; - var gpuResourceCache = dc.gpuResourceCache; - - if (!this._starData) { - this.fetchStarData(); - } - - var sunTexture = gpuResourceCache.resourceForKey(this._sunImageSource); - if (!sunTexture) { - gpuResourceCache.retrieveTexture(gl, this._sunImageSource); - } -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.beginRendering = function (dc) { - var gl = dc.currentGlContext; - dc.findAndBindProgram(StarFieldProgram); - gl.enableVertexAttribArray(0); - gl.depthMask(false); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.doDraw = function (dc) { - this.loadCommonUniforms(dc); - this.renderStars(dc); - if (this.showSun) { - this.renderSun(dc); - } -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.loadCommonUniforms = function (dc) { - var gl = dc.currentGlContext; - var program = dc.currentProgram; - - var eyePoint = dc.eyePoint; - var eyePosition = dc.globe.computePositionFromPoint(eyePoint[0], eyePoint[1], eyePoint[2], {}); - var scale = Math.max(eyePosition.altitude * 1.5, this._minScale); - this._matrix.copy(dc.modelviewProjection); - this._matrix.multiplyByScale(scale, scale, scale); - program.loadModelviewProjection(gl, this._matrix); - - //this subtraction does not work properly on the GPU, it must be done on the CPU - //possibly due to precision loss - //number of days (positive or negative) since Greenwich noon, Terrestrial Time, on 1 January 2000 (J2000.0) - var julianDate = SunPosition.computeJulianDate(this.time || new Date()); - program.loadNumDays(gl, julianDate - 2451545.0); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.renderStars = function (dc) { - var gl = dc.currentGlContext; - var gpuResourceCache = dc.gpuResourceCache; - var program = dc.currentProgram; - - if (!this._starsPositionsVboCacheKey) { - this._starsPositionsVboCacheKey = gpuResourceCache.generateCacheKey(); - } - var vboId = gpuResourceCache.resourceForKey(this._starsPositionsVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - var positions = this.createStarsGeometry(); - gpuResourceCache.putResource(this._starsPositionsVboCacheKey, vboId, positions.length * 4); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); - } - else { - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - } - dc.frameStatistics.incrementVboLoadCount(1); - - gl.vertexAttribPointer(0, 4, gl.FLOAT, false, 0, 0); - - program.loadMagnitudeRange(gl, this._minMagnitude, this._maxMagnitude); - program.loadTextureEnabled(gl, false); - - gl.drawArrays(gl.POINTS, 0, this._numStars); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.renderSun = function (dc) { - var gl = dc.currentGlContext; - var program = dc.currentProgram; - var gpuResourceCache = dc.gpuResourceCache; - - if (!this._MAX_GL_POINT_SIZE) { - this._MAX_GL_POINT_SIZE = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE)[1]; - } - if (this.sunSize > this._MAX_GL_POINT_SIZE) { - Logger.log(Logger.LEVEL_WARNING, 'StarFieldLayer - sunSize is to big, max size allowed is: ' + - this._MAX_GL_POINT_SIZE); - } - - var sunCelestialLocation = SunPosition.getAsCelestialLocation(this.time || new Date()); - - //.x = declination - //.y = right ascension - //.z = point size - //.w = magnitude - this._sunBufferView[0] = sunCelestialLocation.declination; - this._sunBufferView[1] = sunCelestialLocation.rightAscension; - this._sunBufferView[2] = Math.min(this.sunSize, this._MAX_GL_POINT_SIZE); - this._sunBufferView[3] = 1; - - if (!this._sunPositionsCacheKey) { - this._sunPositionsCacheKey = gpuResourceCache.generateCacheKey(); - } - var vboId = gpuResourceCache.resourceForKey(this._sunPositionsCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - gpuResourceCache.putResource(this._sunPositionsCacheKey, vboId, this._sunBufferView.length * 4); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, this._sunBufferView, gl.DYNAMIC_DRAW); - } - else { - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._sunBufferView); - } - dc.frameStatistics.incrementVboLoadCount(1); - gl.vertexAttribPointer(0, 4, gl.FLOAT, false, 0, 0); - - program.loadTextureEnabled(gl, true); - - var sunTexture = dc.gpuResourceCache.resourceForKey(this._sunImageSource); - sunTexture.bind(dc); - - gl.drawArrays(gl.POINTS, 0, 1); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.endRendering = function (dc) { - var gl = dc.currentGlContext; - gl.depthMask(true); - gl.disableVertexAttribArray(0); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.fetchStarData = function () { - if (this._loadStarted) { - return; - } - - this._loadStarted = true; - var self = this; - var xhr = new XMLHttpRequest(); - - xhr.onload = function () { - if (this.status >= 200 && this.status < 300) { - try { - self._starData = JSON.parse(this.response); - self.sendRedrawRequest(); - } - catch (e) { - Logger.log(Logger.LEVEL_SEVERE, 'StarFieldLayer unable to parse JSON for star data ' + - e.toString()); - } - } - else { - Logger.log(Logger.LEVEL_SEVERE, 'StarFieldLayer unable to fetch star data. Status: ' + - this.status + ' ' + this.statusText); - } - self._loadStarted = false; - }; - - xhr.onerror = function () { - Logger.log(Logger.LEVEL_SEVERE, 'StarFieldLayer unable to fetch star data'); - self._loadStarted = false; - }; - - xhr.ontimeout = function () { - Logger.log(Logger.LEVEL_SEVERE, 'StarFieldLayer fetch star data has timeout'); - self._loadStarted = false; - }; - - xhr.open('GET', this._starDataSource, true); - xhr.send(); -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.createStarsGeometry = function () { - var indexes = this.parseStarsMetadata(this._starData.metadata); - - if (indexes.raIndex === -1) { - throw new Error( - Logger.logMessage(Logger.LEVEL_SEVERE, 'StarFieldLayer', 'createStarsGeometry', - 'Missing ra field in star data.')); - } - if (indexes.decIndex === -1) { - throw new Error( - Logger.logMessage(Logger.LEVEL_SEVERE, 'StarFieldLayer', 'createStarsGeometry', - 'Missing dec field in star data.')); - } - if (indexes.magIndex === -1) { - throw new Error( - Logger.logMessage(Logger.LEVEL_SEVERE, 'StarFieldLayer', 'createStarsGeometry', - 'Missing vmag field in star data.')); - } - - var data = this._starData.data; - var positions = []; - - this._minMagnitude = Number.MAX_VALUE; - this._maxMagnitude = Number.MIN_VALUE; - - for (var i = 0, len = data.length; i < len; i++) { - var starInfo = data[i]; - var declination = starInfo[indexes.decIndex]; //for latitude - var rightAscension = starInfo[indexes.raIndex]; //for longitude - var magnitude = starInfo[indexes.magIndex]; - var pointSize = magnitude < 2 ? 2 : 1; - - positions.push(declination, rightAscension, pointSize, magnitude); - - this._minMagnitude = Math.min(this._minMagnitude, magnitude); - this._maxMagnitude = Math.max(this._maxMagnitude, magnitude); - } - this._numStars = Math.floor(positions.length / 4); - - return positions; -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.parseStarsMetadata = function (metadata) { - var raIndex = -1, - decIndex = -1, - magIndex = -1; - for (var i = 0, len = metadata.length; i < len; i++) { - var starMetaInfo = metadata[i]; - if (starMetaInfo.name === 'ra') { - raIndex = i; - } - if (starMetaInfo.name === 'dec') { - decIndex = i; - } - if (starMetaInfo.name === 'vmag') { - magIndex = i; - } - } - return { - raIndex: raIndex, - decIndex: decIndex, - magIndex: magIndex - }; -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.invalidateStarData = function () { - this._starData = null; - this._starsPositionsVboCacheKey = null; -}; - -// Internal. Intentionally not documented. -StarFieldLayer.prototype.sendRedrawRequest = function () { - var e = document.createEvent('Event'); - e.initEvent(WorldWind.REDRAW_EVENT_TYPE, true, true); - window.dispatchEvent(e); -}; - -export default StarFieldLayer; - diff --git a/web/src/gis/layer/TiledImageLayer.js b/web/src/gis/layer/TiledImageLayer.js deleted file mode 100644 index c9091e32..00000000 --- a/web/src/gis/layer/TiledImageLayer.js +++ /dev/null @@ -1,542 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TiledImageLayer - */ -import AbsentResourceList from '../util/AbsentResourceList'; -import ArgumentError from '../error/ArgumentError'; -import ImageTile from '../render/ImageTile'; -import Layer from '../layer/Layer'; -import LevelSet from '../util/LevelSet'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import MemoryCache from '../cache/MemoryCache'; -import Texture from '../render/Texture'; -import Tile from '../util/Tile'; -import WWUtil from '../util/WWUtil'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a tiled image layer. - * @alias TiledImageLayer - * @constructor - * @classdesc - * Provides a layer that displays multi-resolution imagery arranged as adjacent tiles in a pyramid. - * This is the primary WorldWind base class for displaying imagery of this type. While it may be used as a - * stand-alone class, it is typically subclassed by classes that identify the remote image server. - * <p> - * While the image tiles for this class are typically drawn from a remote server such as a WMS server. The actual - * retrieval protocol is independent of this class and encapsulated by a class implementing the {@link UrlBuilder} - * interface and associated with instances of this class as a property. - * <p> - * There is no requirement that image tiles of this class be remote, they may be local or procedurally generated. For - * such cases the subclass overrides this class' [retrieveTileImage]{@link TiledImageLayer#retrieveTileImage} method. - * <p> - * Layers of this type are by default not pickable. Their pick-enabled flag is initialized to false. - * - * @augments Layer - * @param {Sector} sector The sector this layer covers. - * @param {Location} levelZeroDelta The size in latitude and longitude of level zero (lowest resolution) tiles. - * @param {Number} numLevels The number of levels to define for the layer. Each level is successively one power - * of two higher resolution than the next lower-numbered level. (0 is the lowest resolution level, 1 is twice - * that resolution, etc.) - * Each level contains four times as many tiles as the next lower-numbered level, each 1/4 the geographic size. - * @param {String} imageFormat The mime type of the image format for the layer's tiles, e.g., <em>image/png</em>. - * @param {String} cachePath A string uniquely identifying this layer relative to other layers. - * @param {Number} tileWidth The horizontal size of image tiles in pixels. - * @param {Number} tileHeight The vertical size of image tiles in pixels. - * @throws {ArgumentError} If any of the specified sector, level-zero delta, cache path or image format arguments are - * null or undefined, or if the specified number of levels, tile width or tile height is less than 1. - * - */ -function TiledImageLayer(sector, levelZeroDelta, numLevels, imageFormat, cachePath, tileWidth, tileHeight) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "constructor", "missingSector")); - } - - if (!levelZeroDelta) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "constructor", - "The specified level-zero delta is null or undefined.")); - } - - if (!imageFormat) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "constructor", - "The specified image format is null or undefined.")); - } - - if (!cachePath) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "constructor", - "The specified cache path is null or undefined.")); - } - - if (!numLevels || numLevels < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "constructor", - "The specified number of levels is less than one.")); - } - - if (!tileWidth || !tileHeight || tileWidth < 1 || tileHeight < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "constructor", - "The specified tile width or height is less than one.")); - } - - Layer.call(this, "Tiled Image Layer"); - - this.retrievalImageFormat = imageFormat; - this.cachePath = cachePath; - - /** - * Controls how many concurrent tile requests are allowed for this layer. - * @type {Number} - * @default WorldWind.configuration.layerRetrievalQueueSize - */ - this.retrievalQueueSize = WorldWind.configuration.layerRetrievalQueueSize; - - this.levels = new LevelSet(sector, levelZeroDelta, numLevels, tileWidth, tileHeight); - - /** - * Controls the level of detail switching for this layer. The next highest resolution level is - * used when an image's texel size is greater than this number of pixels, up to the maximum resolution - * of this layer. - * @type {Number} - * @default 1.75 - */ - this.detailControl = 3.5; - - /** - * Indicates whether credentials are sent when requesting images from a different origin. - * - * Allowed values are anonymous and use-credentials. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-crossorigin - * @type {string} - * @default anonymous - */ - this.crossOrigin = 'anonymous'; - - /* Intentionally not documented. - * Indicates the time at which this layer's imagery expire. Expired images are re-retrieved - * when the current time exceeds the specified expiry time. If null, images do not expire. - * @type {Date} - */ - this.expiration = null; - - this.currentTiles = []; - this.currentTilesInvalid = true; - this.tileCache = new MemoryCache(500000, 400000); - this.currentRetrievals = []; - this.absentResourceList = new AbsentResourceList(3, 50e3); - - this.pickEnabled = false; - - // Internal. Intentionally not documented. - this.lasTtMVP = Matrix.fromIdentity(); -} - -TiledImageLayer.prototype = Object.create(Layer.prototype); - -// Inherited from Layer. -TiledImageLayer.prototype.refresh = function () { - this.expiration = new Date(); - this.currentTilesInvalid = true; -}; - -/** - * Initiates retrieval of this layer's level 0 images. Use - * [isPrePopulated]{@link TiledImageLayer#isPrePopulated} to determine when the images have been retrieved - * and associated with the level 0 tiles. - * Pre-populating is not required. It is used to eliminate the visual effect of loading tiles incrementally, - * but only for level 0 tiles. An application might pre-populate a layer in order to delay displaying it - * within a time series until all the level 0 images have been retrieved and added to memory. - * @param {WorldWindow} wwd The WorldWindow for which to pre-populate this layer. - * @throws {ArgumentError} If the specified WorldWindow is null or undefined. - */ -TiledImageLayer.prototype.prePopulate = function (wwd) { - if (!wwd) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "prePopulate", "missingWorldWindow")); - } - - var dc = wwd.drawContext; - - if (!this.topLevelTiles || this.topLevelTiles.length === 0) { - this.createTopLevelTiles(dc); - } - - for (var i = 0; i < this.topLevelTiles.length; i++) { - var tile = this.topLevelTiles[i]; - - if (!this.isTileTextureInMemory(dc, tile)) { - this.retrieveTileImage(dc, tile, true); // suppress redraw upon successful retrieval - } - } -}; - -/** - * Initiates retrieval of this layer's tiles that are visible in the specified WorldWindow. Pre-populating is - * not required. It is used to eliminate the visual effect of loading tiles incrementally. - * @param {WorldWindow} wwd The WorldWindow for which to pre-populate this layer. - * @throws {ArgumentError} If the specified WorldWindow is null or undefined. - */ -TiledImageLayer.prototype.prePopulateCurrentTiles = function (wwd) { - if (!wwd) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "prePopulate", "missingWorldWindow")); - } - - var dc = wwd.drawContext; - this.assembleTiles(dc); - - for (var i = 0, len = this.currentTiles.length; i < len; i++) { - var tile = this.currentTiles[i]; - - if (!this.isTileTextureInMemory(dc, tile)) { - this.retrieveTileImage(dc, tile, true); // suppress redraw upon successful retrieval - } - } -}; - -/** - * Indicates whether this layer's level 0 tile images have been retrieved and associated with the tiles. - * Use [prePopulate]{@link TiledImageLayer#prePopulate} to initiate retrieval of level 0 images. - * @param {WorldWindow} wwd The WorldWindow associated with this layer. - * @returns {Boolean} true if all level 0 images have been retrieved, otherwise false. - * @throws {ArgumentError} If the specified WorldWindow is null or undefined. - */ -TiledImageLayer.prototype.isPrePopulated = function (wwd) { - if (!wwd) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TiledImageLayer", "isPrePopulated", "missingWorldWindow")); - } - - for (var i = 0; i < this.topLevelTiles.length; i++) { - if (!this.isTileTextureInMemory(wwd.drawContext, this.topLevelTiles[i])) { - return false; - } - } - - return true; -}; - -// Intentionally not documented. -TiledImageLayer.prototype.createTile = function (sector, level, row, column) { - var path = this.cachePath + "-layer/" + level.levelNumber + "/" + row + "/" + column + "." - + WWUtil.suffixForMimeType(this.retrievalImageFormat); - - return new ImageTile(sector, level, row, column, path); -}; - -// Documented in superclass. -TiledImageLayer.prototype.doRender = function (dc) { - if (!dc.terrain) - return; - - if (this.currentTilesInvalid - || !dc.modelviewProjection.equals(this.lasTtMVP) - || dc.globeStateKey !== this.lastGlobeStateKey) { - this.currentTilesInvalid = false; - - // Tile fading works visually only when the surface tiles are opaque, otherwise the surface flashes - // when two tiles are drawn over the same area, even though one of them is semi-transparent. - // So do not provide fading when the surface opacity is less than 1; - if (dc.surfaceOpacity >= 1 && this.opacity >= 1) { - // Fading of outgoing tiles requires determination of the those tiles. Prepare an object with all of - // the preceding frame's tiles so that we can subsequently compare the list of newly selected tiles - // with the previously selected tiles. - this.previousTiles = {}; - for (var j = 0; j < this.currentTiles.length; j++) { - this.previousTiles[this.currentTiles[j].imagePath] = this.currentTiles[j]; - } - - this.assembleTiles(dc); - this.fadeOutgoingTiles(dc); - } else { - this.assembleTiles(dc); - } - - } - - this.lasTtMVP.copy(dc.modelviewProjection); - this.lastGlobeStateKey = dc.globeStateKey; - - if (this.currentTiles.length > 0) { - dc.surfaceTileRenderer.renderTiles(dc, this.currentTiles, this.opacity, dc.surfaceOpacity >= 1); - dc.frameStatistics.incrementImageTileCount(this.currentTiles.length); - this.inCurrentFrame = true; - } -}; - -TiledImageLayer.prototype.fadeOutgoingTiles = function (dc) { - // Determine which files are outgoing and fade their disappearance. Must be called after this frame's - // current tiles for this layer have been determined. - - var visibilityDelta = (dc.timestamp - dc.previousRedrawTimestamp) / dc.fadeTime; - - // Create a hash table of the current tiles so that we can check for tile inclusion below. - var current = {}; - for (var i = 0; i < this.currentTiles.length; i++) { - var tile = this.currentTiles[i]; - current[tile.imagePath] = tile; - } - - // Determine whether the tile was in the previous frame but is not in this one. If that's the case, - // then the tile is outgoing and its opacity needs to be reduced. - for (var tileImagePath in this.previousTiles) { - if (this.previousTiles.hasOwnProperty(tileImagePath)) { - tile = this.previousTiles[tileImagePath]; - - if (tile.opacity > 0 && !current[tile.imagePath]) { - // Compute the reduced. - tile.opacity = Math.max(0, tile.opacity - visibilityDelta); - - // If not fully faded, add the tile to the list of current tiles and request a redraw so that - // we'll be called continuously until all tiles have faded completely. Note that order in the - // current tiles list is important: the non-opaque tiles must be drawn after the opaque tiles. - if (tile.opacity > 0) { - this.currentTiles.push(tile); - this.currentTilesInvalid = true; - dc.redrawRequested = true; - } - } - } - } -}; - -// Documented in superclass. -TiledImageLayer.prototype.isLayerInView = function (dc) { - return dc.terrain && dc.terrain.sector && dc.terrain.sector.intersects(this.levels.sector); -}; - -// Documented in superclass. -TiledImageLayer.prototype.createTopLevelTiles = function (dc) { - this.topLevelTiles = []; - Tile.createTilesForLevel(this.levels.firstLevel(), this, this.topLevelTiles); -}; - -// Intentionally not documented. -TiledImageLayer.prototype.assembleTiles = function (dc) { - this.currentTiles = []; - - if (!this.topLevelTiles || this.topLevelTiles.length === 0) { - this.createTopLevelTiles(dc); - } - - for (var i = 0, len = this.topLevelTiles.length; i < len; i++) { - var tile = this.topLevelTiles[i]; - - tile.update(dc); - - this.currentAncestorTile = null; - - if (this.isTileVisible(dc, tile)) { - this.addTileOrDescendants(dc, tile); - } - } -}; - -// Intentionally not documented. -TiledImageLayer.prototype.addTileOrDescendants = function (dc, tile) { - if (this.tileMeetsRenderingCriteria(dc, tile)) { - this.addTile(dc, tile); - return; - } - - var ancestorTile = null; - - try { - if (this.isTileTextureInMemory(dc, tile) || tile.level.levelNumber === 0) { - ancestorTile = this.currentAncestorTile; - this.currentAncestorTile = tile; - } - - var nextLevel = this.levels.level(tile.level.levelNumber + 1), - subTiles = tile.subdivideToCache(nextLevel, this, this.tileCache); - - for (var i = 0, len = subTiles.length; i < len; i++) { - var child = subTiles[i]; - - child.update(dc); - - if (this.levels.sector.intersects(child.sector) && this.isTileVisible(dc, child)) { - this.addTileOrDescendants(dc, child); - } - } - } finally { - if (ancestorTile) { - this.currentAncestorTile = ancestorTile; - } - } -}; - -// Intentionally not documented. -TiledImageLayer.prototype.addTile = function (dc, tile) { - tile.fallbackTile = null; - - var texture = dc.gpuResourceCache.resourceForKey(tile.imagePath); - if (texture) { - tile.opacity = 1; - - this.currentTiles.push(tile); - - // If the tile's texture has expired, cause it to be re-retrieved. Note that the current, - // expired texture is still used until the updated one arrives. - if (this.expiration && this.isTextureExpired(texture)) { - this.retrieveTileImage(dc, tile); - } - - return; - } - - this.retrieveTileImage(dc, tile); - - if (this.currentAncestorTile) { - if (this.isTileTextureInMemory(dc, this.currentAncestorTile)) { - // Set up to map the ancestor tile into the current one. - tile.fallbackTile = this.currentAncestorTile; - tile.fallbackTile.opacity = 1; - this.currentTiles.push(tile); - } - } -}; - -// Intentionally not documented. -TiledImageLayer.prototype.isTileVisible = function (dc, tile) { - if (dc.globe.projectionLimits && !tile.sector.overlaps(dc.globe.projectionLimits)) { - return false; - } - - return tile.extent.intersectsFrustum(dc.frustumInModelCoordinates); -}; - -// Intentionally not documented. -TiledImageLayer.prototype.tileMeetsRenderingCriteria = function (dc, tile) { - var s = this.detailControl; - var highLatitude = WWMath.mercatorLat(75); - if (tile.sector.minLatitude >= highLatitude || tile.sector.maxLatitude <= -highLatitude) { - s *= 1.2; - } - return tile.level.isLastLevel() || !tile.mustSubdivide(dc, s); -}; - -// Intentionally not documented. -TiledImageLayer.prototype.isTileTextureInMemory = function (dc, tile) { - return dc.gpuResourceCache.containsResource(tile.imagePath); -}; - -// Intentionally not documented. -TiledImageLayer.prototype.isTextureExpired = function (texture) { - return this.expiration && texture.creationTime.getTime() <= this.expiration.getTime(); -}; - -/** - * Retrieves the image for the specified tile. Subclasses should override this method in order to retrieve, - * compute or otherwise create the image. - * @param {DrawContext} dc The current draw context. - * @param {ImageTile} tile The tile for which to retrieve the resource. - * @param {Boolean} suppressRedraw true to suppress generation of redraw events when an image is successfully - * retrieved, otherwise false. - * @protected - */ -TiledImageLayer.prototype.retrieveTileImage = function (dc, tile, suppressRedraw) { - if (this.currentRetrievals.indexOf(tile.imagePath) < 0) { - if (this.currentRetrievals.length > this.retrievalQueueSize) { - return; - } - - if (this.absentResourceList.isResourceAbsent(tile.imagePath)) { - return; - } - - var url = this.resourceUrlForTile(tile, this.retrievalImageFormat), - image = new Image(), - imagePath = tile.imagePath, - cache = dc.gpuResourceCache, - canvas = dc.currentGlContext.canvas, - layer = this; - - if (!url) { - this.currentTilesInvalid = true; - return; - } - - image.onload = function () { - Logger.log(Logger.LEVEL_INFO, "Image retrieval succeeded: " + url); - var texture = layer.createTexture(dc, tile, image); - layer.removeFromCurrentRetrievals(imagePath); - - if (texture) { - cache.putResource(imagePath, texture, texture.size); - - layer.currentTilesInvalid = true; - layer.absentResourceList.unmarkResourceAbsent(imagePath); - - if (!suppressRedraw) { - // Send an event to request a redraw. - var e = document.createEvent('Event'); - e.initEvent(WorldWind.REDRAW_EVENT_TYPE, true, true); - canvas.dispatchEvent(e); - } - } - }; - - image.onerror = function () { - layer.removeFromCurrentRetrievals(imagePath); - layer.absentResourceList.markResourceAbsent(imagePath); - Logger.log(Logger.LEVEL_WARNING, "Image retrieval failed: " + url); - }; - - this.currentRetrievals.push(imagePath); - image.crossOrigin = this.crossOrigin; - image.src = url; - } -}; - -// Intentionally not documented. -TiledImageLayer.prototype.createTexture = function (dc, tile, image) { - return new Texture(dc.currentGlContext, image); -}; - -// Intentionally not documented. -TiledImageLayer.prototype.removeFromCurrentRetrievals = function (imagePath) { - var index = this.currentRetrievals.indexOf(imagePath); - if (index > -1) { - this.currentRetrievals.splice(index, 1); - } -}; - -/** - * Returns the URL string for the resource. - * @param {ImageTile} tile The tile whose image is returned - * @param {String} imageFormat The mime type of the image format desired. - * @returns {String} The URL string, or null if the string can not be formed. - * @protected - */ -TiledImageLayer.prototype.resourceUrlForTile = function (tile, imageFormat) { - if (this.urlBuilder) { - return this.urlBuilder.urlForTile(tile, imageFormat); - } else { - return null; - } -}; - -export default TiledImageLayer; diff --git a/web/src/gis/layer/XYZLayer.js b/web/src/gis/layer/XYZLayer.js deleted file mode 100644 index 4dbba1cc..00000000 --- a/web/src/gis/layer/XYZLayer.js +++ /dev/null @@ -1,30 +0,0 @@ -import MercatorTiledImageLayer from './MercatorTiledImageLayer'; -import Sector from '../geom/Sector'; -import Location from '../geom/Location'; - -class URLBuilder { - urlForTile(tile, imageFormat) { - return `http://localhost:2020/api/Map/Tiles?x=${tile.column}&y=${tile.row}&z=${tile.level.levelNumber}`; - } -} - -class XYZLayer extends MercatorTiledImageLayer { - constructor() { - let imageSize = 256; - let displayName = 'Bing'; - super(new Sector(-180, 180, -180, 180), new Location(360, 360), 18, "image/jpeg", - displayName, imageSize, imageSize); - - this.imageSize = imageSize; - this.displayName = displayName; - this.urlBuilder = new URLBuilder(); - } - - createTopLevelTiles(dc) { - this.topLevelTiles = []; - - this.topLevelTiles.push(this.createTile(null, this.levels.firstLevel(), 0, 0)); - } -} - -export default XYZLayer; \ No newline at end of file diff --git a/web/src/gis/navigate/LookAtNavigator.js b/web/src/gis/navigate/LookAtNavigator.js deleted file mode 100644 index 192c66e6..00000000 --- a/web/src/gis/navigate/LookAtNavigator.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports LookAtNavigator - */ -import Location from '../geom/Location'; -import Navigator from '../navigate/Navigator'; - - -/** - * Constructs a look-at navigator. - * @alias LookAtNavigator - * @constructor - * @augments Navigator - * @classdesc Represents a navigator containing the required variables to enable the user to pan, zoom and tilt - * the globe. - */ -function LookAtNavigator() { - Navigator.call(this); - - /** - * The geographic location at the center of the viewport. - * @type {Location} - */ - this.lookAtLocation = new Location(36.4, 117); - - /** - * The distance from this navigator's eye point to its look-at location. - * @type {Number} - * @default 10,000 kilometers - */ - this.range = 10e6; // TODO: Compute initial range to fit globe in viewport. - - // Development testing only. Set this to false to suppress default navigator limits on 2D globes. - this.enable2DLimits = true; -} - -LookAtNavigator.prototype = Object.create(Navigator.prototype); - -export default LookAtNavigator; diff --git a/web/src/gis/navigate/Navigator.js b/web/src/gis/navigate/Navigator.js deleted file mode 100644 index 3b8a9eab..00000000 --- a/web/src/gis/navigate/Navigator.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Navigator - */ - - - -/** - * Constructs a base navigator. - * @alias Navigator - * @constructor - * @classdesc Provides an abstract base class for navigators. This class is not meant to be instantiated - * directly. See {@Link LookAtNavigator} for a concrete navigator. - */ -function Navigator() { - /** - * This navigator's heading, in degrees clockwise from north. - * @type {Number} - * @default 0 - */ - this.heading = 0; - - /** - * This navigator's tilt, in degrees. - * @type {Number} - * @default 0 - */ - this.tilt = 0; - - /** - * This navigator's roll, in degrees. - * @type {Number} - * @default 0 - */ - this.roll = 0; -} - -export default Navigator; diff --git a/web/src/gis/pick/PickedObject.js b/web/src/gis/pick/PickedObject.js deleted file mode 100644 index 83f4a8c3..00000000 --- a/web/src/gis/pick/PickedObject.js +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports PickedObject - */ - - - -/** - * Constructs a picked object. - * @alias PickedObject - * @constructor - * @classdesc Represents a picked object. - * @param {Color} color The pick color identifying the object. - * @param {Object} userObject An object to associate with this picked object, usually the picked shape. - * @param {Position} position The picked object's geographic position. May be null if unknown. - * @param {Layer} parentLayer The layer containing the picked object. - * @param {Boolean} isTerrain true if the picked object is terrain, otherwise false. - */ -function PickedObject(color, userObject, position, parentLayer, isTerrain) { - - /** - * This picked object's pick color. - * @type {Color} - * @readonly - */ - this.color = color; - - /** - * The picked shape. - * @type {Object} - * @readonly - */ - this.userObject = userObject; - - /** - * This picked object's geographic position. - * @type {Position} - * @readonly - */ - this.position = position; - - /** - * The layer containing this picked object. - * @type {Layer} - * @readonly - */ - this.parentLayer = parentLayer; - - /** - * Indicates whether this picked object is terrain. - * @type {Boolean} - * @readonly - */ - this.isTerrain = isTerrain; - - /** - * Indicates whether this picked object is the top object. - * @type {boolean} - */ - this.isOnTop = false; -} - -export default PickedObject; diff --git a/web/src/gis/pick/PickedObjectList.js b/web/src/gis/pick/PickedObjectList.js deleted file mode 100644 index 0cbcc7da..00000000 --- a/web/src/gis/pick/PickedObjectList.js +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports PickedObjectList - */ - - - -/** - * Constructs a picked-object list. - * @alias PickedObjectList - * @constructor - * @classdesc Holds a collection of picked objects. - */ -function PickedObjectList() { - /** - * The picked objects. - * @type {Array} - */ - this.objects = []; -} - -/** - * Indicates whether this list contains picked objects that are not terrain. - * @returns {Boolean} true if this list contains objects that are not terrain, - * otherwise false. - */ -PickedObjectList.prototype.hasNonTerrainObjects = function () { - return this.objects.length > 1 || this.objects.length === 1 && this.terrainObject() == null; -}; - -/** - * Returns the terrain object within this list, if this list contains a terrain object. - * @returns {PickedObject} The terrain object, or null if this list does not contain a terrain object. - */ -PickedObjectList.prototype.terrainObject = function () { - for (var i = 0, len = this.objects.length; i < len; i++) { - if (this.objects[i].isTerrain) { - return this.objects[i]; - } - } - - return null; -}; - -/** - * Adds a picked object to this list. - * If the picked object is a terrain object and the list already contains a terrain object, the terrain - * object in the list is replaced by the specified one. - * @param {PickedObject} pickedObject The picked object to add. If null, this list remains unchanged. - */ -PickedObjectList.prototype.add = function (pickedObject) { - if (pickedObject) { - if (pickedObject.isTerrain) { - var terrainObjectIndex = this.objects.length; - - for (var i = 0, len = this.objects.length; i < len; i++) { - if (this.objects[i].isTerrain) { - terrainObjectIndex = i; - break; - } - } - - this.objects[terrainObjectIndex] = pickedObject; - } else { - this.objects.push(pickedObject); - } - } -}; - -/** - * Removes all items from this list. - */ -PickedObjectList.prototype.clear = function () { - this.objects = []; -}; - -/** - * Returns the top-most picked object in this list. - * @returns {PickedObject} The top-most picked object in this list, or null if this list is empty. - */ -PickedObjectList.prototype.topPickedObject = function () { - var size = this.objects.length; - - if (size > 1) { - for (var i = 0; i < size; i++) { - if (this.objects[i].isOnTop) { - return this.objects[i]; - } - } - } - - if (size > 0) { - return this.objects[0]; - } - - return null; -}; - -export default PickedObjectList; diff --git a/web/src/gis/projections/GeographicProjection.js b/web/src/gis/projections/GeographicProjection.js deleted file mode 100644 index 760c80ca..00000000 --- a/web/src/gis/projections/GeographicProjection.js +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GeographicProjection - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Constructs a base geographic projection. - * @alias GeographicProjection - * @constructor - * @classdesc Represents a geographic projection. - * This is an abstract class and is meant to be instantiated only by subclasses. - * See the following projections: - * <ul> - * <li>{@link ProjectionWgs84}</li> - </ul> - * @param {String} displayName The projection's display name. - * @param {boolean} continuous Indicates whether this projection is continuous. - * @param {Sector} projectionLimits This projection's projection limits. May be null to indicate the full - * range of latitude and longitude, +/- 90 degrees latitude, +/- 180 degrees longitude. - */ -function GeographicProjection(displayName, continuous, projectionLimits) { - - /** - * This projection's display name. - * @type {string} - */ - this.displayName = displayName || "Geographic Projection"; - - /** - * Indicates whether this projection should be treated as continuous with itself. If true, the 2D map - * will appear to scroll continuously horizontally. - * @type {boolean} - * @readonly - */ - this.continuous = continuous; - - /** - * Indicates the geographic limits of this projection. - * @type {Sector} - * @readonly - */ - this.projectionLimits = projectionLimits; - - /** - * Indicates whether this projection is a 2D projection. - * @type {boolean} - * @readonly - */ - this.is2D = true; -} - -/** - * Converts a geographic position to Cartesian coordinates. - * - * @param {Globe} globe The globe this projection is applied to. - * @param {number} latitude The latitude of the position, in degrees. - * @param {number} longitude The longitude of the position, in degrees. - * @param {number} elevation The elevation of the position, in meters. - * @param {Vec3} offset An offset to apply to the Cartesian output. Typically only projections that are - * continuous (see [continuous]{@link GeographicProjection#continuous}) apply to this offset. Others ignore - * it. May be null to indicate no offset is applied. - * @param {Vec3} result A variable in which to store the computed Cartesian point. - * - * @returns {Vec3} The specified result argument containing the computed point. - * @throws {ArgumentError} If the specified globe or result is null or undefined. - */ -GeographicProjection.prototype.geographicToCartesian = function (globe, latitude, longitude, elevation, - offset, result) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", "geographicToCartesian", "abstractInvocation")); -}; - -/** - * Computes a grid of Cartesian points within a specified sector and relative to a specified Cartesian - * reference point. - * <p> - * This method is used to compute a collection of points within a sector. It is used by tessellators to - * efficiently generate a tile's interior points. The number of points to generate is indicated by the tileWidth - * and tileHeight parameters but is one more in each direction. Width refers to the longitudinal direction, - * height to the latitudinal. - * <p> - * For each implied position within the sector, an elevation value is specified via an array of elevations. The - * calculation at each position incorporates the associated elevation. - * There must be (tileWidth + 1) x (tileHeight + 1) elevations in the array. - * - * @param {Globe} globe The globe this projection applies to. - * @param {Sector} sector The sector in which to compute the points. - * @param {Number} numLat The number of latitudinal sections a tile is divided into. - * @param {Number} numLon The number of longitudinal sections a tile is divided into. - * @param {Number[]} elevations An array of elevations to incorporate in the point calculations. There must be - * one elevation value in the array for each generated point. Elevations are in meters. - * There must be (tileWidth + 1) x (tileHeight + 1) elevations in the array. - * @param {Vec3} referencePoint The X, Y and Z Cartesian coordinates to subtract from the computed coordinates. - * This makes the computed coordinates relative to the specified point. May be null. - * @param {Vec3} offset An offset to apply to the Cartesian output points. Typically only projections that - * are continuous (see [continuous]{@link GeographicProjection#continuous}) apply this offset. Others ignore it. - * May be null to indicate that no offset is applied. - * @param {Float32Array} result A typed array to hold the computed coordinates. It must be at least of - * size (tileWidth + 1) x (tileHeight + 1) * 3. - * The points are returned in row major order, beginning with the row of minimum latitude. - * @returns {Float32Array} The specified result argument, populated with the computed Cartesian coordinates. - * @throws {ArgumentError} if any of the specified globe, sector, elevations array or results arrays is null or - * undefined. - */ -GeographicProjection.prototype.geographicToCartesianGrid = function (globe, sector, numLat, numLon, elevations, - referencePoint, offset, result) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", "geographicToCartesianGrid", "abstractInvocation")); -}; - -/** - * Converts a Cartesian point to a geographic position. - * @param {Globe} globe The globe this projection is applied to. - * @param {number} x The X component of the Cartesian point. - * @param {number} y The Y component of the Cartesian point. - * @param {number} z The Z component of the Cartesian point. - * @param {Vec3} offset An offset to apply to the Cartesian output points. Typically only projections that - * are continuous (see [continuous]{@link GeographicProjection#continuous}) apply this offset. Others ignore it. - * May be null to indicate that no offset is applied. - * @param {Position} result A variable in which to return the computed position. - * - * @returns {Position} The specified result argument containing the computed position. - * @throws {ArgumentError} If either the specified globe or result argument is null or undefined. - */ -GeographicProjection.prototype.cartesianToGeographic = function (globe, x, y, z, offset, result) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", "cartesianToGeographic", "abstractInvocation")); -}; - -/** - * Computes a Cartesian vector that points north and is tangent to the meridian at a specified geographic - * location. - * - * @param {Globe} globe The globe this projection is applied to. - * @param {number} latitude The latitude of the location, in degrees. - * @param {number} longitude The longitude of the location, in degrees. - * @param {Vec3} result A variable in which to return the computed vector. - * - * @returns{Vec3} The specified result argument containing the computed vector. - * @throws {ArgumentError} If either the specified globe or result argument is null or undefined. - */ -GeographicProjection.prototype.northTangentAtLocation = function (globe, latitude, longitude, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", - "northTangentAtLocation", "missingResult")); - } - - result[0] = 0; - result[1] = 1; - result[2] = 0; - - return result; -}; - -/** - * Computes a Cartesian vector that points north and is tangent to the meridian at a specified Cartesian - * point. - * - * @param {Globe} globe The globe this projection is applied to. - * @param {number} x The X component of the Cartesian point. - * @param {number} y The Y component of the Cartesian point. - * @param {number} z The Z component of the Cartesian point. - * @param {Vec3} offset An offset to apply to the Cartesian point. Typically only projections that - * are continuous (see [continuous]{@link GeographicProjection#continuous}) apply this offset. Others ignore it. - * May be null to indicate that no offset is applied. - * @param {Vec3} result A variable in which to return the computed vector. - * - * @returns{Vec3} The specified result argument containing the computed vector. - * @throws {ArgumentError} If either the specified globe or result argument is null or undefined. - */ -GeographicProjection.prototype.northTangentAtPoint = function (globe, x, y, z, offset, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", - "northTangentAtPoint", "missingResult")); - } - - result[0] = 0; - result[1] = 1; - result[2] = 0; - - return result; -}; - -/** - * Computes the Cartesian surface normal vector at a specified geographic location. - * - * @param {Globe} globe The globe this projection is applied to. - * @param {number} latitude The latitude of the location, in degrees. - * @param {number} longitude The longitude of the location, in degrees. - * @param {Vec3} result A variable in which to return the computed vector. - * - * @returns{Vec3} The specified result argument containing the computed vector. - * @throws {ArgumentError} If either the specified globe or result argument is null or undefined. - */ -GeographicProjection.prototype.surfaceNormalAtLocation = function (globe, latitude, longitude, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", "surfaceNormalAtLocation", - "missingResult")); - } - - result[0] = 0; - result[1] = 0; - result[2] = 1; - - return result; -}; - -/** - * Computes the Cartesian surface normal vector at a specified Cartesian point. - * - * @param {Globe} globe The globe this projection is applied to. - * @param {number} x The X component of the Cartesian point. - * @param {number} y The Y component of the Cartesian point. - * @param {number} z The Z component of the Cartesian point. - * @param {Vec3} result A variable in which to return the computed vector. - * - * @returns{Vec3} The specified result argument containing the computed vector. - * @throws {ArgumentError} If either the specified globe or result argument is null or undefined. - */ -GeographicProjection.prototype.surfaceNormalAtPoint = function (globe, x, y, z, result) { - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicProjection", "surfaceNormalAtPoint", - "missingResult")); - } - - result[0] = 0; - result[1] = 0; - result[2] = 1; - - return result; -}; - -export default GeographicProjection; diff --git a/web/src/gis/projections/ProjectionWgs84.js b/web/src/gis/projections/ProjectionWgs84.js deleted file mode 100644 index fde291ba..00000000 --- a/web/src/gis/projections/ProjectionWgs84.js +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ProjectionWgs84 - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import GeographicProjection from '../projections/GeographicProjection'; -import Logger from '../util/Logger'; -import Position from '../geom/Position'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a WGS84 ellipsoid - * @alias ProjectionWgs84 - * @constructor - * @augments GeographicProjection - * @classdesc Represents a WGS84 ellipsoid. - */ -function ProjectionWgs84() { - - GeographicProjection.call(this, "WGS84", false, null); - - this.is2D = false; - - this.scratchPosition = new Position(0, 0, 0); -} - -ProjectionWgs84.prototype = Object.create(GeographicProjection.prototype); - -Object.defineProperties(ProjectionWgs84.prototype, { - /** - * A string identifying this projection's current state. Used to compare states during rendering to - * determine whether globe-state dependent cached values must be updated. Applications typically do not - * interact with this property. - * @memberof GeographicProjection.prototype - * @readonly - * @type {String} - */ - stateKey: { - get: function () { - return "projection wgs84 "; - } - } -}); - -// Documented in base class. -ProjectionWgs84.prototype.geographicToCartesian = function (globe, latitude, longitude, altitude, offset, - result) { - if (!globe) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ProjectionWgs84", - "geographicToCartesian", "missingGlobe")); - } - - // latitude = WWMath._mercatorLatInvert(latitude); // TODO - - var cosLat = Math.cos(latitude * Angle.DEGREES_TO_RADIANS), - sinLat = Math.sin(latitude * Angle.DEGREES_TO_RADIANS), - cosLon = Math.cos(longitude * Angle.DEGREES_TO_RADIANS), - sinLon = Math.sin(longitude * Angle.DEGREES_TO_RADIANS), - rpm = globe.equatorialRadius / Math.sqrt(1.0 - globe.eccentricitySquared * sinLat * sinLat); - - result[0] = (rpm + altitude) * cosLat * sinLon; - result[1] = (rpm * (1.0 - globe.eccentricitySquared) + altitude) * sinLat; - result[2] = (rpm + altitude) * cosLat * cosLon; - - return result; -}; - -// Documented in base class. -ProjectionWgs84.prototype.geographicToCartesianGrid = function (globe, sector, numLat, numLon, elevations, - referencePoint, offset, result) { - if (!globe) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ProjectionWgs84", - "geographicToCartesianGrid", "missingGlobe")); - } - - var minLat = sector.minLatitude * Angle.DEGREES_TO_RADIANS, - maxLat = sector.maxLatitude * Angle.DEGREES_TO_RADIANS, - minLon = sector.minLongitude * Angle.DEGREES_TO_RADIANS, - maxLon = sector.maxLongitude * Angle.DEGREES_TO_RADIANS, - deltaLat = (maxLat - minLat) / (numLat > 1 ? numLat - 1 : 1), - deltaLon = (maxLon - minLon) / (numLon > 1 ? numLon - 1 : 1), - refCenter = referencePoint ? referencePoint : new Vec3(0, 0, 0), - latIndex, lonIndex, - elevIndex = 0, resultIndex = 0, - lat, lon, rpm, elev, - cosLat, sinLat, - cosLon = new Float64Array(numLon), sinLon = new Float64Array(numLon); - - // Compute and save values that are a function of each unique longitude value in the specified sector. This - // eliminates the need to re-compute these values for each column of constant longitude. - for (lonIndex = 0, lon = minLon; lonIndex < numLon; lonIndex++, lon += deltaLon) { - if (lonIndex === numLon - 1) { - lon = maxLon; // explicitly set the last lon to the max longitude to ensure alignment - } - - cosLon[lonIndex] = Math.cos(lon); - sinLon[lonIndex] = Math.sin(lon); - } - - // Iterate over the latitude and longitude coordinates in the specified sector, computing the Cartesian - // point corresponding to each latitude and longitude. - for (latIndex = 0, lat = minLat; latIndex < numLat; latIndex++, lat += deltaLat) { - if (latIndex === numLat - 1) { - lat = maxLat; // explicitly set the last lat to the max longitude to ensure alignment - } - - var invertLat = WWMath._mercatorLatInvert(lat); // TODO - - // Latitude is constant for each row. Values that are a function of latitude can be computed once per row. - cosLat = Math.cos(invertLat); - sinLat = Math.sin(invertLat); - rpm = globe.equatorialRadius / Math.sqrt(1.0 - globe.eccentricitySquared * sinLat * sinLat); - - for (lonIndex = 0; lonIndex < numLon; lonIndex++) { - elev = elevations[elevIndex++]; - result[resultIndex++] = (rpm + elev) * cosLat * sinLon[lonIndex] - refCenter[0]; - result[resultIndex++] = (rpm * (1.0 - globe.eccentricitySquared) + elev) * sinLat - refCenter[1]; - result[resultIndex++] = (rpm + elev) * cosLat * cosLon[lonIndex] - refCenter[2]; - } - } - - return result; -}; - -// Documented in base class. -ProjectionWgs84.prototype.cartesianToGeographic = function (globe, x, y, z, offset, result) { - if (!globe) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ProjectionWgs84", - "cartesianToGeographic", "missingGlobe")); - } - - // According to H. Vermeille, "An analytical method to transform geocentric into geodetic coordinates" - // http://www.springerlink.com/content/3t6837t27t351227/fulltext.pdf - // Journal of Geodesy, accepted 10/2010, not yet published - var X = z, - Y = x, - Z = y, - XXpYY = X * X + Y * Y, - sqrtXXpYY = Math.sqrt(XXpYY), - a = globe.equatorialRadius, - ra2 = 1 / (a * a), - e2 = globe.eccentricitySquared, - e4 = e2 * e2, - p = XXpYY * ra2, - q = Z * Z * (1 - e2) * ra2, - r = (p + q - e4) / 6, - h, - phi, - u, - evoluteBorderTest = 8 * r * r * r + e4 * p * q, - rad1, - rad2, - rad3, - atan, - v, - w, - k, - D, - sqrtDDpZZ, - e, - lambda, - s2; - - if (evoluteBorderTest > 0 || q != 0) { - if (evoluteBorderTest > 0) { - // Step 2: general case - rad1 = Math.sqrt(evoluteBorderTest); - rad2 = Math.sqrt(e4 * p * q); - - // 10*e2 is my arbitrary decision of what Vermeille means by "near... the cusps of the evolute". - if (evoluteBorderTest > 10 * e2) { - rad3 = WWMath.cbrt((rad1 + rad2) * (rad1 + rad2)); - u = r + 0.5 * rad3 + 2 * r * r / rad3; - } - else { - u = r + 0.5 * WWMath.cbrt((rad1 + rad2) * (rad1 + rad2)) - + 0.5 * WWMath.cbrt((rad1 - rad2) * (rad1 - rad2)); - } - } - else { - // Step 3: near evolute - rad1 = Math.sqrt(-evoluteBorderTest); - rad2 = Math.sqrt(-8 * r * r * r); - rad3 = Math.sqrt(e4 * p * q); - atan = 2 * Math.atan2(rad3, rad1 + rad2) / 3; - - u = -4 * r * Math.sin(atan) * Math.cos(Math.PI / 6 + atan); - } - - v = Math.sqrt(u * u + e4 * q); - w = e2 * (u + v - q) / (2 * v); - k = (u + v) / (Math.sqrt(w * w + u + v) + w); - D = k * sqrtXXpYY / (k + e2); - sqrtDDpZZ = Math.sqrt(D * D + Z * Z); - - h = (k + e2 - 1) * sqrtDDpZZ / k; - phi = 2 * Math.atan2(Z, sqrtDDpZZ + D); - } - else { - // Step 4: singular disk - rad1 = Math.sqrt(1 - e2); - rad2 = Math.sqrt(e2 - p); - e = Math.sqrt(e2); - - h = -a * rad1 * rad2 / e; - phi = rad2 / (e * rad2 + rad1 * Math.sqrt(p)); - } - - // Compute lambda - s2 = Math.sqrt(2); - if ((s2 - 1) * Y < sqrtXXpYY + X) { - // case 1 - -135deg < lambda < 135deg - lambda = 2 * Math.atan2(Y, sqrtXXpYY + X); - } - else if (sqrtXXpYY + Y < (s2 + 1) * X) { - // case 2 - -225deg < lambda < 45deg - lambda = -Math.PI * 0.5 + 2 * Math.atan2(X, sqrtXXpYY - Y); - } - else { - // if (sqrtXXpYY-Y<(s2=1)*X) { // is the test, if needed, but it's not - // case 3: - -45deg < lambda < 225deg - lambda = Math.PI * 0.5 - 2 * Math.atan2(X, sqrtXXpYY + Y); - } - - result.latitude = Angle.RADIANS_TO_DEGREES * phi; - result.longitude = Angle.RADIANS_TO_DEGREES * lambda; - result.altitude = h; - - return result; -}; - -ProjectionWgs84.prototype.northTangentAtLocation = function (globe, latitude, longitude, result) { - // The north-pointing tangent is derived by rotating the vector (0, 1, 0) about the Y-axis by longitude degrees, - // then rotating it about the X-axis by -latitude degrees. The latitude angle must be inverted because latitude - // is a clockwise rotation about the X-axis, and standard rotation matrices assume counter-clockwise rotation. - // The combined rotation can be represented by a combining two rotation matrices Rlat, and Rlon, then - // transforming the vector (0, 1, 0) by the combined transform: - // - // NorthTangent = (Rlon * Rlat) * (0, 1, 0) - // - // This computation can be simplified and encoded inline by making two observations: - // - The vector's X and Z coordinates are always 0, and its Y coordinate is always 1. - // - Inverting the latitude rotation angle is equivalent to inverting sinLat. We know this by the - // trigonometric identities cos(-x) = cos(x), and sin(-x) = -sin(x). - - var cosLat = Math.cos(latitude * Angle.DEGREES_TO_RADIANS), - cosLon = Math.cos(longitude * Angle.DEGREES_TO_RADIANS), - sinLat = Math.sin(latitude * Angle.DEGREES_TO_RADIANS), - sinLon = Math.sin(longitude * Angle.DEGREES_TO_RADIANS); - - result[0] = -sinLat * sinLon; - result[1] = cosLat; - result[2] = -sinLat * cosLon; - - return result.normalize(); -}; - -ProjectionWgs84.prototype.northTangentAtPoint = function (globe, x, y, z, offset, result) { - this.cartesianToGeographic(globe, x, y, z, Vec3.ZERO, this.scratchPosition); - - return this.northTangentAtLocation(globe, this.scratchPosition.latitude, this.scratchPosition.longitude, result); -}; - -ProjectionWgs84.prototype.surfaceNormalAtLocation = function (globe, latitude, longitude, result) { - var cosLat = Math.cos(latitude * Angle.DEGREES_TO_RADIANS), - cosLon = Math.cos(longitude * Angle.DEGREES_TO_RADIANS), - sinLat = Math.sin(latitude * Angle.DEGREES_TO_RADIANS), - sinLon = Math.sin(longitude * Angle.DEGREES_TO_RADIANS); - - result[0] = cosLat * sinLon; - result[1] = sinLat; - result[2] = cosLat * cosLon; - - return result.normalize(); -}; - -ProjectionWgs84.prototype.surfaceNormalAtPoint = function (globe, x, y, z, result) { - if (!globe) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ProjectionWgs84", - "surfaceNormalAtPoint", "missingGlobe")); - } - - var a2 = globe.equatorialRadius * globe.equatorialRadius, - b2 = globe.polarRadius * globe.polarRadius; - - result[0] = x / a2; - result[1] = y / b2; - result[2] = z / a2; - - return result.normalize(); -}; - -export default ProjectionWgs84; diff --git a/web/src/gis/render/DrawContext.js b/web/src/gis/render/DrawContext.js deleted file mode 100644 index 88c3e336..00000000 --- a/web/src/gis/render/DrawContext.js +++ /dev/null @@ -1,1567 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports DrawContext - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import FramebufferTexture from '../render/FramebufferTexture'; -import FramebufferTileController from '../render/FramebufferTileController'; -import Frustum from '../geom/Frustum'; -import GpuResourceCache from '../cache/GpuResourceCache'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObjectList from '../pick/PickedObjectList'; -import Plane from '../geom/Plane'; -import Position from '../geom/Position'; -import Rectangle from '../geom/Rectangle'; -import ScreenCreditController from '../render/ScreenCreditController'; -import SurfaceShape from '../shapes/SurfaceShape'; -import SurfaceShapeTileBuilder from '../shapes/SurfaceShapeTileBuilder'; -import SurfaceTileRenderer from '../render/SurfaceTileRenderer'; -import TextRenderer from '../render/TextRenderer'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a DrawContext. Applications do not call this constructor. A draw context is created by a - * {@link WorldWindow} during its construction. - * @alias DrawContext - * @constructor - * @classdesc Provides current state during rendering. The current draw context is passed to most rendering - * methods in order to make those methods aware of current state. - * @param {WebGLRenderingContext} gl The WebGL rendering context this draw context is associated with. - * @throws {ArgumentError} If the specified WebGL rendering context is null or undefined. - */ -function DrawContext(gl) { - if (!gl) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Texture", "constructor", - "missingGlContext")); - } - - /** - * The current WebGL rendering context. - * @type {WebGLRenderingContext} - */ - this.currentGlContext = gl; - - /** - * A 2D canvas for creating texture maps. - * @type {HTMLElement} - */ - this.canvas2D = document.createElement("canvas"); - - /** - * A 2D context for this draw context's [canvas property]{@link DrawContext#canvas}. - */ - this.ctx2D = this.canvas2D.getContext("2d"); - - /** - * The current clear color. - * @type {Color} - * @default Color.TRANSPARENT (red = 0, green = 0, blue = 0, alpha = 0) - */ - this.clearColor = Color.TRANSPARENT; - - /** - * The GPU resource cache, which tracks WebGL resources. - * @type {GpuResourceCache} - */ - this.gpuResourceCache = new GpuResourceCache(WorldWind.configuration.gpuCacheSize, - 0.8 * WorldWind.configuration.gpuCacheSize); - - /** - * The surface-tile-renderer to use for drawing surface tiles. - * @type {SurfaceTileRenderer} - */ - this.surfaceTileRenderer = new SurfaceTileRenderer(); - - /** - * The surface shape tile builder used to create and draw surface shapes. - * @type {SurfaceShapeTileBuilder} - */ - this.surfaceShapeTileBuilder = new SurfaceShapeTileBuilder(); - - /** - * Provides access to a multi-resolution WebGL framebuffer arranged as adjacent tiles in a pyramid. Surface - * shapes use these tiles internally to draw on the terrain surface. - * @type {FramebufferTileController} - */ - this.surfaceShapeTileController = new FramebufferTileController(); - - /** - * The screen credit controller responsible for collecting and drawing screen credits. - * @type {ScreenCreditController} - */ - this.screenCreditController = new ScreenCreditController(); - - /** - * A shared TextRenderer instance. - * @type {TextRenderer} - */ - this.textRenderer = new TextRenderer(this); - - /** - * The current WebGL framebuffer. Null indicates that the default WebGL framebuffer is active. - * @type {FramebufferTexture} - */ - this.currentFramebuffer = null; - - /** - * The current WebGL program. Null indicates that no WebGL program is active. - * @type {GpuProgram} - */ - this.currentProgram = null; - - /** - * The list of surface renderables. - * @type {Array} - */ - this.surfaceRenderables = []; - - /** - * Indicates whether this draw context is in ordered rendering mode. - * @type {Boolean} - */ - this.orderedRenderingMode = false; - - /** - * The list of ordered renderables. - * @type {Array} - */ - this.orderedRenderables = []; - - // Internal. Intentionally not documented. Provides ordinal IDs to ordered renderables. - this.orderedRenderablesCounter = 0; // Number - - /** - * The starting time of the current frame, in milliseconds. The frame timestamp is updated immediately - * before the WorldWindow associated with this draw context is rendered, either as a result of redrawing or - * as a result of a picking operation. - * @type {Number} - * @readonly - */ - this.timestamp = Date.now(); - - /** - * The [time stamp]{@link DrawContext#timestamp} of the last visible frame, in milliseconds. This indicates - * the time stamp that was current during the WorldWindow's last frame, ignoring frames associated with a - * picking operation. The difference between the previous redraw time stamp and the current time stamp - * indicates the duration between visible frames, e.g. <code style='white-space:nowrap'>timeStamp - previousRedrawTimestamp</code>. - * @type {Number} - * @readonly - */ - this.previousRedrawTimestamp = this.timestamp; - - /** - * Indicates whether a redraw has been requested during the current frame. When true, this causes the World - * Window associated with this draw context to redraw after the current frame. - * @type {Boolean} - */ - this.redrawRequested = false; - - /** - * The globe being rendered. - * @type {Globe} - */ - this.globe = null; - - /** - * A copy of the current globe's state key. Provided here to avoid having to recompute it every time - * it's needed. - * @type {String} - */ - this.globeStateKey = null; - - /** - * The layers being rendered. - * @type {Layer[]} - */ - this.layers = null; - - /** - * The layer being rendered. - * @type {Layer} - */ - this.currentLayer = null; - - /** - * The current eye position. - * @type {Position} - */ - this.eyePosition = new Position(0, 0, 0); - - /** - * The eye point in model coordinates, relative to the globe's center. - * @type {Vec3} - * @readonly - */ - this.eyePoint = new Vec3(0, 0, 0); - - /** - * The current screen projection matrix. - * @type {Matrix} - */ - this.screenProjection = Matrix.fromIdentity(); - - /** - * The terrain for the current frame. - * @type {Terrain} - */ - this.terrain = null; - - /** - * The current vertical exaggeration. - * @type {Number} - */ - this.verticalExaggeration = 1; - - /** - * The number of milliseconds over which to fade shapes that support fading. Fading is most typically - * used during decluttering. - * @type {Number} - * @default 500 - */ - this.fadeTime = 500; - - /** - * The opacity to apply to terrain and surface shapes. Should be a number between 0 and 1. - * @type {Number} - * @default 1 - */ - this.surfaceOpacity = 1; - - /** - * Frame statistics. - * @type {FrameStatistics} - */ - this.frameStatistics = null; - - /** - * Indicates whether the frame is being drawn for picking. - * @type {Boolean} - */ - this.pickingMode = false; - - /** - * Indicates that picking will return only the terrain object, if the pick point is over the terrain. - * @type {Boolean} - * @default false - */ - this.pickTerrainOnly = false; - - /** - * Indicates that picking will return all objects at the pick point, if any. The top-most object will have - * its isOnTop flag set to true. If [deep picking]{@link WorldWindow#deepPicking} is false, the default, - * only the top-most object is returned, plus the picked-terrain object if the pick point is over the - * terrain. - * @type {Boolean} - * @default false - */ - this.deepPicking = false; - - /** - * Indicates that picking will return all objects that intersect the pick region, if any. Visible objects - * will have the isOnTop flag set to true. - * @type {Boolean} - * @default false - */ - this.regionPicking = false; - - /** - * The current pick point, in screen coordinates. - * @type {Vec2} - */ - this.pickPoint = null; - - /** - * The current pick ray originating at the eyePoint and extending through the pick point. - * @type {Line} - */ - this.pickRay = null; - - /** - * The current pick rectangle, in WebGL (lower-left origin) screen coordinates. - * @type {Rectangle} - */ - this.pickRectangle = null; - - /** - * The off-screen WebGL framebuffer used during picking. - * @type {FramebufferTexture} - * @readonly - */ - this.pickFramebuffer = null; - - /** - * The current pick frustum, created anew each picking frame. - * @type {Frustum} - * @readonly - */ - this.pickFrustum = null; - - // Internal. Keeps track of the current pick color. - this.pickColor = new Color(0, 0, 0, 1); - - /** - * The objects at the current pick point. - * @type {PickedObjectList} - * @readonly - */ - this.objectsAtPickPoint = new PickedObjectList(); - - // Intentionally not documented. - this.pixelScale = 1; - - // TODO: replace with camera in the next phase of navigator refactoring - this.navigator = null; - - /** - * The model-view matrix. The model-view matrix transforms points from model coordinates to eye - * coordinates. - * @type {Matrix} - * @readonly - */ - this.modelview = Matrix.fromIdentity(); - - /** - * The projection matrix. The projection matrix transforms points from eye coordinates to clip - * coordinates. - * @type {Matrix} - * @readonly - */ - this.projection = Matrix.fromIdentity(); - - /** - * The concatenation of the DrawContext's model-view and projection matrices. This matrix transforms points - * from model coordinates to clip coordinates. - * @type {Matrix} - * @readonly - */ - this.modelviewProjection = Matrix.fromIdentity(); - - /** - * The viewing frustum in model coordinates. The frustum originates at the eyePoint and extends - * outward along the forward vector. The near distance and far distance identify the minimum and - * maximum distance, respectively, at which an object in the scene is visible. - * @type {Frustum} - * @readonly - */ - this.frustumInModelCoordinates = null; - - /** - * The matrix that transforms normal vectors in model coordinates to normal vectors in eye coordinates. - * Typically used to transform a shape's normal vectors during lighting calculations. - * @type {Matrix} - * @readonly - */ - this.modelviewNormalTransform = Matrix.fromIdentity(); - - /** - * The current viewport. - * @type {Rectangle} - * @readonly - */ - this.viewport = new Rectangle(0, 0, 0, 0); - - // Intentionally not documented. - this.pixelSizeFactor = 0; - - // Intentionally not documented. - this.pixelSizeOffset = 0; - - // Intentionally not documented. - this.glExtensionsCache = {}; -} - -// Internal use. Intentionally not documented. -DrawContext.unitCubeKey = "DrawContextUnitCubeKey"; -DrawContext.unitCubeElementsKey = "DrawContextUnitCubeElementsKey"; -DrawContext.unitQuadKey = "DrawContextUnitQuadKey"; -DrawContext.unitQuadKey3 = "DrawContextUnitQuadKey3"; - -/** - * Prepare this draw context for the drawing of a new frame. - */ -DrawContext.prototype.reset = function () { - // Reset the draw context's internal properties. - this.screenCreditController.clear(); - this.surfaceRenderables = []; // clears the surface renderables array - this.orderedRenderingMode = false; - this.orderedRenderables = []; // clears the ordered renderables array - this.screenRenderables = []; - this.orderedRenderablesCounter = 0; - - // Advance the per-frame timestamp. - var previousTimestamp = this.timestamp; - this.timestamp = Date.now(); - if (this.timestamp === previousTimestamp) - ++this.timestamp; - - // Reset properties set by the WorldWindow every frame. - this.redrawRequested = false; - this.globe = null; - this.globeStateKey = null; - this.layers = null; - this.currentLayer = null; - this.terrain = null; - this.verticalExaggeration = 1; - this.frameStatistics = null; - this.accumulateOrderedRenderables = true; - - // Reset picking properties that may be set by the WorldWindow. - this.pickingMode = false; - this.pickTerrainOnly = false; - this.deepPicking = false; - this.regionPicking = false; - this.pickPoint = null; - this.pickRay = null; - this.pickRectangle = null; - this.pickFrustum = null; - this.pickColor = new Color(0, 0, 0, 1); - this.objectsAtPickPoint.clear(); - - this.eyePoint.set(0, 0, 0); - this.modelview.setToIdentity(); - this.projection.setToIdentity(); - this.modelviewProjection.setToIdentity(); - this.frustumInModelCoordinates = null; - this.modelviewNormalTransform.setToIdentity(); -}; - -/** - * Computes any values necessary to render the upcoming frame. Called after all draw context state for the - * frame has been set. - */ -DrawContext.prototype.update = function () { - var gl = this.currentGlContext, - eyePoint = this.eyePoint; - - this.globeStateKey = this.globe.stateKey; - this.globe.computePositionFromPoint(eyePoint[0], eyePoint[1], eyePoint[2], this.eyePosition); - this.screenProjection.setToScreenProjection(gl.drawingBufferWidth, gl.drawingBufferHeight); -}; - -/** - * Notifies this draw context that the current WebGL rendering context has been lost. This function removes all - * cached WebGL resources and resets all properties tracking the current WebGL state. - */ -DrawContext.prototype.contextLost = function () { - // Remove all cached WebGL resources, which are now invalid. - this.gpuResourceCache.clear(); - this.pickFramebuffer = null; - // Reset properties tracking the current WebGL state, which are now invalid. - this.currentFramebuffer = null; - this.currentProgram = null; - this.glExtensionsCache = {}; -}; - -/** - * Notifies this draw context that the current WebGL rendering context has been restored. This function prepares - * this draw context to resume rendering. - */ -DrawContext.prototype.contextRestored = function () { - // Remove all cached WebGL resources. This cache is already cleared when the context is lost, but - // asynchronous load operations that complete between context lost and context restored populate the cache - // with invalid entries. - this.gpuResourceCache.clear(); - this.glExtensionsCache = {}; -}; - -/** - * Binds a specified WebGL framebuffer. This function also makes the framebuffer the active framebuffer. - * @param {FramebufferTexture} framebuffer The framebuffer to bind. May be null or undefined, in which case the - * default WebGL framebuffer is made active. - */ -DrawContext.prototype.bindFramebuffer = function (framebuffer) { - if (this.currentFramebuffer != framebuffer) { - this.currentGlContext.bindFramebuffer(this.currentGlContext.FRAMEBUFFER, - framebuffer ? framebuffer.framebufferId : null); - this.currentFramebuffer = framebuffer; - } -}; - -/** - * Binds a specified WebGL program. This function also makes the program the current program. - * @param {GpuProgram} program The program to bind. May be null or undefined, in which case the currently - * bound program is unbound. - */ -DrawContext.prototype.bindProgram = function (program) { - if (this.currentProgram != program) { - this.currentGlContext.useProgram(program ? program.programId : null); - this.currentProgram = program; - } -}; - -/** - * Binds a potentially cached WebGL program, creating and caching it if it isn't already cached. - * This function also makes the program the current program. - * @param {function} programConstructor The constructor to use to create the program. - * @returns {GpuProgram} The bound program. - * @throws {ArgumentError} If the specified constructor is null or undefined. - */ -DrawContext.prototype.findAndBindProgram = function (programConstructor) { - if (!programConstructor) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "findAndBindProgram", - "The specified program constructor is null or undefined.")); - } - - var program = this.gpuResourceCache.resourceForKey(programConstructor.key); - if (program) { - this.bindProgram(program); - } else { - try { - program = new programConstructor(this.currentGlContext); - this.bindProgram(program); - this.gpuResourceCache.putResource(programConstructor.key, program, program.size); - } catch (e) { - Logger.log(Logger.LEVEL_SEVERE, "Error attempting to create GPU program."); - } - } - - return program; -}; - -/** - * Adds a surface renderable to this draw context's surface renderable list. - * @param {SurfaceRenderable} surfaceRenderable The surface renderable to add. May be null, in which case the - * current surface renderable list remains unchanged. - */ -DrawContext.prototype.addSurfaceRenderable = function (surfaceRenderable) { - if (surfaceRenderable) { - this.surfaceRenderables.push(surfaceRenderable); - } -}; - -/** - * Returns the surface renderable at the head of the surface renderable list without removing it from the list. - * @returns {SurfaceRenderable} The first surface renderable in this draw context's surface renderable list, or - * null if the surface renderable list is empty. - */ -DrawContext.prototype.peekSurfaceRenderable = function () { - if (this.surfaceRenderables.length > 0) { - return this.surfaceRenderables[this.surfaceRenderables.length - 1]; - } else { - return null; - } -}; - -/** - * Returns the surface renderable at the head of the surface renderable list and removes it from the list. - * @returns {SurfaceRenderable} The first surface renderable in this draw context's surface renderable list, or - * null if the surface renderable list is empty. - */ -DrawContext.prototype.popSurfaceRenderable = function () { - if (this.surfaceRenderables.length > 0) { - return this.surfaceRenderables.pop(); - } else { - return null; - } -}; - -/** - * Reverses the surface renderable list in place. After this function completes, the functions - * peekSurfaceRenderable and popSurfaceRenderable return renderables in the order in which they were added to - * the surface renderable list. - */ -DrawContext.prototype.reverseSurfaceRenderables = function () { - this.surfaceRenderables.reverse(); -}; - -/** - * Adds an ordered renderable to this draw context's ordered renderable list. - * @param {OrderedRenderable} orderedRenderable The ordered renderable to add. May be null, in which case the - * current ordered renderable list remains unchanged. - * @param {Number} eyeDistance An optional argument indicating the ordered renderable's eye distance. - * If this parameter is not specified then the ordered renderable must have an eyeDistance property. - */ -DrawContext.prototype.addOrderedRenderable = function (orderedRenderable, eyeDistance) { - if (orderedRenderable) { - var ore = { - orderedRenderable: orderedRenderable, - insertionOrder: this.orderedRenderablesCounter++, - eyeDistance: eyeDistance || orderedRenderable.eyeDistance, - globeStateKey: this.globeStateKey - }; - - if (this.globe.continuous) { - ore.globeOffset = this.globe.offset; - } - - if (ore.eyeDistance === 0) { - this.screenRenderables.push(ore); - } else { - this.orderedRenderables.push(ore); - } - } -}; - -/** - * Adds an ordered renderable to the end of this draw context's ordered renderable list, denoting it as the - * most distant from the eye point. - * @param {OrderedRenderable} orderedRenderable The ordered renderable to add. May be null, in which case the - * current ordered renderable list remains unchanged. - */ -DrawContext.prototype.addOrderedRenderableToBack = function (orderedRenderable) { - if (orderedRenderable) { - var ore = { - orderedRenderable: orderedRenderable, - insertionOrder: this.orderedRenderablesCounter++, - eyeDistance: Number.MAX_VALUE, - globeStateKey: this.globeStateKey - }; - - if (this.globe.continuous) { - ore.globeOffset = this.globe.offset; - } - - this.orderedRenderables.push(ore); - } -}; - -/** - * Returns the ordered renderable at the head of the ordered renderable list without removing it from the list. - * @returns {OrderedRenderable} The first ordered renderable in this draw context's ordered renderable list, or - * null if the ordered renderable list is empty. - */ -DrawContext.prototype.peekOrderedRenderable = function () { - if (this.orderedRenderables.length > 0) { - return this.orderedRenderables[this.orderedRenderables.length - 1].orderedRenderable; - } else { - return null; - } -}; - -/** - * Returns the ordered renderable at the head of the ordered renderable list and removes it from the list. - * @returns {OrderedRenderable} The first ordered renderable in this draw context's ordered renderable list, or - * null if the ordered renderable list is empty. - */ -DrawContext.prototype.popOrderedRenderable = function () { - if (this.orderedRenderables.length > 0) { - var ore = this.orderedRenderables.pop(); - this.globeStateKey = ore.globeStateKey; - - if (this.globe.continuous) { - // Restore the globe state to that when the ordered renderable was created. - this.globe.offset = ore.globeOffset; - } - - return ore.orderedRenderable; - } else { - return null; - } -}; - -/** - * Returns the ordered renderable at the head of the ordered renderable list and removes it from the list. - * @returns {OrderedRenderable} The first ordered renderable in this draw context's ordered renderable list, or - * null if the ordered renderable list is empty. - */ -DrawContext.prototype.nextScreenRenderable = function () { - if (this.screenRenderables.length > 0) { - var ore = this.screenRenderables.shift(); - this.globeStateKey = ore.globeStateKey; - - if (this.globe.continuous) { - // Restore the globe state to that when the ordered renderable was created. - this.globe.offset = ore.globeOffset; - } - - return ore.orderedRenderable; - } else { - return null; - } -}; - -/** - * Sorts the ordered renderable list from nearest to the eye point to farthest from the eye point. - */ -DrawContext.prototype.sortOrderedRenderables = function () { - // Sort the ordered renderables by eye distance from front to back and then by insertion time. The ordered - // renderable peek and pop access the back of the ordered renderable list, thereby causing ordered renderables to - // be processed from back to front. - - this.orderedRenderables.sort(function (oreA, oreB) { - var eA = oreA.eyeDistance, - eB = oreB.eyeDistance; - - if (eA < eB) { // orA is closer to the eye than orB; sort orA before orB - return -1; - } else if (eA > eB) { // orA is farther from the eye than orB; sort orB before orA - return 1; - } else { // orA and orB are the same distance from the eye; sort them based on insertion time - var tA = oreA.insertionOrder, - tB = oreB.insertionOrder; - - if (tA > tB) { - return -1; - } else if (tA < tB) { - return 1; - } else { - return 0; - } - } - }); -}; - -/** - * Reads the color from the current render buffer at a specified point. Used during picking to identify the item most - * recently affecting the pixel at the specified point. - * @param {Vec2} pickPoint The current pick point. - * @returns {Color} The color at the pick point. - */ -DrawContext.prototype.readPickColor = function (pickPoint) { - var glPickPoint = this.convertPointToViewport(pickPoint, new Vec2(0, 0)), - colorBytes = new Uint8Array(4); - - this.currentGlContext.readPixels(glPickPoint[0], glPickPoint[1], 1, 1, this.currentGlContext.RGBA, - this.currentGlContext.UNSIGNED_BYTE, colorBytes); - - if (this.clearColor.equalsBytes(colorBytes)) { - return null; - } - - return Color.colorFromByteArray(colorBytes); -}; - -/** - * Reads the current pick buffer colors in a specified rectangle. Used during region picking to identify - * the items not occluded. - * @param {Rectangle} pickRectangle The rectangle for which to read the colors. - * @returns {{}} An object containing the unique colors in the specified rectangle, excluding the current - * clear color. The colors are referenced by their byte string - * (see [Color.toByteString]{@link Color#toByteString}. - */ -DrawContext.prototype.readPickColors = function (pickRectangle) { - var gl = this.currentGlContext, - colorBytes = new Uint8Array(pickRectangle.width * pickRectangle.height * 4), - uniqueColors = {}, - color, - blankColor = new Color(0, 0, 0, 0), - packAlignment = gl.getParameter(gl.PACK_ALIGNMENT); - - gl.pixelStorei(gl.PACK_ALIGNMENT, 1); // read byte aligned - this.currentGlContext.readPixels(pickRectangle.x, pickRectangle.y, - pickRectangle.width, pickRectangle.height, - gl.RGBA, gl.UNSIGNED_BYTE, colorBytes); - gl.pixelStorei(gl.PACK_ALIGNMENT, packAlignment); // restore the pack alignment - - for (var i = 0, len = pickRectangle.width * pickRectangle.height; i < len; i++) { - var k = i * 4; - color = Color.colorFromBytes(colorBytes[k], colorBytes[k + 1], colorBytes[k + 2], colorBytes[k + 3]); - if (color.equals(this.clearColor) || color.equals(blankColor)) - continue; - uniqueColors[color.toByteString()] = color; - } - - return uniqueColors; -}; - -/** - * Determines whether a specified picked object is under the pick point, and if it is adds it to this draw - * context's list of picked objects. This method should be called by shapes during ordered rendering - * after the shape is drawn. If this draw context is in single-picking mode, the specified pickable object - * is added to the list of picked objects whether or not it is under the pick point. - * @param pickableObject - * @returns {null} - */ -DrawContext.prototype.resolvePick = function (pickableObject) { - if (!(pickableObject.userObject instanceof SurfaceShape) && this.deepPicking && !this.regionPicking) { - var color = this.readPickColor(this.pickPoint); - if (!color) { // getPickColor returns null if the pick point selects the clear color - return null; - } - - if (pickableObject.color.equals(color)) { - this.addPickedObject(pickableObject); - } - } else { - // Don't resolve. Just add the object to the pick list. It will be resolved later. - this.addPickedObject(pickableObject); - } -}; - -/** - * Adds an object to the current picked-object list. The list identifies objects that are at the pick point - * but not necessarily the top-most object. - * @param {PickedObject} pickedObject The object to add. - */ -DrawContext.prototype.addPickedObject = function (pickedObject) { - if (pickedObject) { - this.objectsAtPickPoint.add(pickedObject); - } -}; - -/** - * Computes a unique color to use as a pick color. - * @returns {Color} A unique color. - */ -DrawContext.prototype.uniquePickColor = function () { - var color = this.pickColor.nextColor().clone(); - - return color.equals(this.clearColor) ? color.nextColor() : color; -}; - -/** - * Creates an off-screen WebGL framebuffer for use during picking and stores it in this draw context. The - * framebuffer width and height match the WebGL rendering context's drawingBufferWidth and drawingBufferHeight. - */ -DrawContext.prototype.makePickFramebuffer = function () { - var gl = this.currentGlContext, - width = gl.drawingBufferWidth, - height = gl.drawingBufferHeight; - - if (!this.pickFramebuffer || - this.pickFramebuffer.width != width || - this.pickFramebuffer.height != height) { - - this.pickFramebuffer = new FramebufferTexture(gl, width, height, true); // enable depth buffering - } - - return this.pickFramebuffer; -}; - -/** - * Creates a pick frustum for the current pick point and stores it in this draw context. If this context's - * pick rectangle is null or undefined then a pick rectangle is also computed and assigned to this context. - * If the existing pick rectangle extends beyond the viewport then it is truncated by this method to fit - * within the viewport. - * This method assumes that this draw context's pick point or pick rectangle has been set. It returns - * false if neither one of these exists. - * - * @returns {Boolean} <code>true</code> if the pick frustum could be created, otherwise <code>false</code>. - */ -DrawContext.prototype.makePickFrustum = function () { - if (!this.pickPoint && !this.pickRectangle) { - return false; - } - - var lln, llf, lrn, lrf, uln, ulf, urn, urf, // corner points of frustum - nl, nr, nt, nb, nn, nf, // normal vectors of frustum planes - l, r, t, b, n, f, // frustum planes - va, vb = new Vec3(0, 0, 0), // vectors formed by the corner points - apertureRadius = 2, // radius of pick window in screen coordinates - screenPoint = new Vec3(0, 0, 0), - pickPoint, - pickRectangle = this.pickRectangle, - viewport = this.viewport; - - // Compute the pick rectangle if necessary. - if (!pickRectangle) { - pickPoint = this.convertPointToViewport(this.pickPoint, new Vec2(0, 0)); - pickRectangle = new Rectangle( - pickPoint[0] - apertureRadius, - pickPoint[1] - apertureRadius, - 2 * apertureRadius, - 2 * apertureRadius); - } - - // Clamp the pick rectangle to the viewport. - - var xl = pickRectangle.x, - xr = pickRectangle.x + pickRectangle.width, - yb = pickRectangle.y, - yt = pickRectangle.y + pickRectangle.height; - - if (xr < 0 || yt < 0 || xl > viewport.x + viewport.width || yb > viewport.y + viewport.height) { - return false; // pick rectangle is outside the viewport. - } - - pickRectangle.x = WWMath.clamp(xl, viewport.x, viewport.x + viewport.width); - pickRectangle.y = WWMath.clamp(yb, viewport.y, viewport.y + viewport.height); - pickRectangle.width = WWMath.clamp(xr, viewport.x, viewport.x + viewport.width) - pickRectangle.x; - pickRectangle.height = WWMath.clamp(yt, viewport.y, viewport.y + viewport.height) - pickRectangle.y; - this.pickRectangle = pickRectangle; - - // Compute the pick frustum. - var modelviewProjectionInv = Matrix.fromIdentity(); - modelviewProjectionInv.invertMatrix(this.modelviewProjection); - - screenPoint[0] = pickRectangle.x; - screenPoint[1] = pickRectangle.y; - screenPoint[2] = 0; - modelviewProjectionInv.unProject(screenPoint, viewport, lln = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x; - screenPoint[1] = pickRectangle.y; - screenPoint[2] = 1; - modelviewProjectionInv.unProject(screenPoint, viewport, llf = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x + pickRectangle.width; - screenPoint[1] = pickRectangle.y; - screenPoint[2] = 0; - modelviewProjectionInv.unProject(screenPoint, viewport, lrn = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x + pickRectangle.width; - screenPoint[1] = pickRectangle.y; - screenPoint[2] = 1; - modelviewProjectionInv.unProject(screenPoint, viewport, lrf = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x; - screenPoint[1] = pickRectangle.y + pickRectangle.height; - screenPoint[2] = 0; - modelviewProjectionInv.unProject(screenPoint, viewport, uln = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x; - screenPoint[1] = pickRectangle.y + pickRectangle.height; - screenPoint[2] = 1; - modelviewProjectionInv.unProject(screenPoint, viewport, ulf = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x + pickRectangle.width; - screenPoint[1] = pickRectangle.y + pickRectangle.height; - screenPoint[2] = 0; - modelviewProjectionInv.unProject(screenPoint, viewport, urn = new Vec3(0, 0, 0)); - - screenPoint[0] = pickRectangle.x + pickRectangle.width; - screenPoint[1] = pickRectangle.y + pickRectangle.height; - screenPoint[2] = 1; - modelviewProjectionInv.unProject(screenPoint, viewport, urf = new Vec3(0, 0, 0)); - - va = new Vec3(ulf[0] - lln[0], ulf[1] - lln[1], ulf[2] - lln[2]); - vb.set(uln[0] - llf[0], uln[1] - llf[1], uln[2] - llf[2]); - nl = va.cross(vb); - l = new Plane(nl[0], nl[1], nl[2], -nl.dot(lln)); - l.normalize(); - - va = new Vec3(urn[0] - lrf[0], urn[1] - lrf[1], urn[2] - lrf[2]); - vb.set(urf[0] - lrn[0], urf[1] - lrn[1], urf[2] - lrn[2]); - nr = va.cross(vb); - r = new Plane(nr[0], nr[1], nr[2], -nr.dot(lrn)); - r.normalize(); - - va = new Vec3(ulf[0] - urn[0], ulf[1] - urn[1], ulf[2] - urn[2]); - vb.set(urf[0] - uln[0], urf[1] - uln[1], urf[2] - uln[2]); - nt = va.cross(vb); - t = new Plane(nt[0], nt[1], nt[2], -nt.dot(uln)); - t.normalize(); - - va = new Vec3(lrf[0] - lln[0], lrf[1] - lln[1], lrf[2] - lln[2]); - vb.set(llf[0] - lrn[0], llf[1] - lrn[1], llf[2] - lrn[2]); - nb = va.cross(vb); - b = new Plane(nb[0], nb[1], nb[2], -nb.dot(lrn)); - b.normalize(); - - va = new Vec3(uln[0] - lrn[0], uln[1] - lrn[1], uln[2] - lrn[2]); - vb.set(urn[0] - lln[0], urn[1] - lln[1], urn[2] - lln[2]); - nn = va.cross(vb); - n = new Plane(nn[0], nn[1], nn[2], -nn.dot(lln)); - n.normalize(); - - va = new Vec3(urf[0] - llf[0], urf[1] - llf[1], urf[2] - llf[2]); - vb.set(ulf[0] - lrf[0], ulf[1] - lrf[1], ulf[2] - lrf[2]); - nf = va.cross(vb); - f = new Plane(nf[0], nf[1], nf[2], -nf.dot(llf)); - f.normalize(); - - this.pickFrustum = new Frustum(l, r, b, t, n, f); - - return true; -}; - -/** - * Indicates whether an extent is smaller than a specified number of pixels. - * @param {BoundingBox} extent The extent to test. - * @param {Number} numPixels The number of pixels below which the extent is considered small. - * @returns {Boolean} True if the extent is smaller than the specified number of pixels, otherwise false. - * Returns false if the extent is null or undefined. - */ -DrawContext.prototype.isSmall = function (extent, numPixels) { - if (!extent) { - return false; - } - - var distance = this.eyePoint.distanceTo(extent.center), - pixelSize = this.pixelSizeAtDistance(distance); - - return 2 * extent.radius < numPixels * pixelSize; // extent diameter less than size of num pixels -}; - -/** - * Returns the VBO ID of an array buffer containing a unit cube expressed as eight 3D vertices at (0, 1, 0), - * (0, 0, 0), (1, 1, 0), (1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 1) and (1, 0, 1). The buffer is created on - * first use and cached. Subsequent calls to this method return the cached buffer. - * @returns {Object} The VBO ID identifying the array buffer. - */ -DrawContext.prototype.unitCubeBuffer = function () { - var vboId = this.gpuResourceCache.resourceForKey(DrawContext.unitCubeKey); - - if (!vboId) { - var gl = this.currentGlContext, - points = new Float32Array(24), - i = 0; - - points[i++] = 0; // upper left corner, z = 0 - points[i++] = 1; - points[i++] = 0; - points[i++] = 0; // lower left corner, z = 0 - points[i++] = 0; - points[i++] = 0; - points[i++] = 1; // upper right corner, z = 0 - points[i++] = 1; - points[i++] = 0; - points[i++] = 1; // lower right corner, z = 0 - points[i++] = 0; - points[i++] = 0; - - points[i++] = 0; // upper left corner, z = 1 - points[i++] = 1; - points[i++] = 1; - points[i++] = 0; // lower left corner, z = 1 - points[i++] = 0; - points[i++] = 1; - points[i++] = 1; // upper right corner, z = 1 - points[i++] = 1; - points[i++] = 1; - points[i++] = 1; // lower right corner, z = 1 - points[i++] = 0; - points[i] = 1; - - vboId = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - this.frameStatistics.incrementVboLoadCount(1); - - this.gpuResourceCache.putResource(DrawContext.unitCubeKey, vboId, points.length * 4); - } - - return vboId; -}; - -/** - * Returns the VBO ID of a element array buffer containing the tessellation of a unit cube expressed as - * a single buffer containing both triangle indices and line indices. This is intended for use in conjunction - * with <code>unitCubeBuffer</code>. The unit cube's interior and outline may be rasterized as shown in the - * following WebGL pseudocode: - * <code><pre> - * // Assumes that the VBO returned by unitCubeBuffer is used as the source of vertex positions. - * bindBuffer(ELEMENT_ARRAY_BUFFER, drawContext.unitCubeElements()); - * drawElements(TRIANGLES, 36, UNSIGNED_SHORT, 0); // draw the unit cube interior - * drawElements(LINES, 24, UNSIGNED_SHORT, 72); // draw the unit cube outline - * </pre></code> - * The buffer is created on first use - * and cached. Subsequent calls to this method return the cached buffer. - * @returns {Object} The VBO ID identifying the element array buffer. - */ -DrawContext.prototype.unitCubeElements = function () { - var vboId = this.gpuResourceCache.resourceForKey(DrawContext.unitCubeElementsKey); - - if (!vboId) { - var gl = this.currentGlContext, - elems = new Int16Array(60), - i = 0; - - // interior - - elems[i++] = 1; // -z face - elems[i++] = 0; - elems[i++] = 3; - elems[i++] = 3; - elems[i++] = 0; - elems[i++] = 2; - - elems[i++] = 4; // +z face - elems[i++] = 5; - elems[i++] = 6; - elems[i++] = 6; - elems[i++] = 5; - elems[i++] = 7; - - elems[i++] = 5; // -y face - elems[i++] = 1; - elems[i++] = 7; - elems[i++] = 7; - elems[i++] = 1; - elems[i++] = 3; - - elems[i++] = 6; // +y face - elems[i++] = 2; - elems[i++] = 4; - elems[i++] = 4; - elems[i++] = 2; - elems[i++] = 0; - - elems[i++] = 4; // -x face - elems[i++] = 0; - elems[i++] = 5; - elems[i++] = 5; - elems[i++] = 0; - elems[i++] = 1; - - elems[i++] = 7; // +x face - elems[i++] = 3; - elems[i++] = 6; - elems[i++] = 6; - elems[i++] = 3; - elems[i++] = 2; - - // outline - - elems[i++] = 0; // left, -z - elems[i++] = 1; - elems[i++] = 1; // bottom, -z - elems[i++] = 3; - elems[i++] = 3; // right, -z - elems[i++] = 2; - elems[i++] = 2; // top, -z - elems[i++] = 0; - - elems[i++] = 4; // left, +z - elems[i++] = 5; - elems[i++] = 5; // bottom, +z - elems[i++] = 7; - elems[i++] = 7; // right, +z - elems[i++] = 6; - elems[i++] = 6; // top, +z - elems[i++] = 4; - - elems[i++] = 0; // upper left - elems[i++] = 4; - elems[i++] = 5; // lower left - elems[i++] = 1; - elems[i++] = 2; // upper right - elems[i++] = 6; - elems[i++] = 7; // lower right - elems[i] = 3; - - vboId = gl.createBuffer(); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboId); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, elems, gl.STATIC_DRAW); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); - this.frameStatistics.incrementVboLoadCount(1); - - this.gpuResourceCache.putResource(DrawContext.unitCubeElementsKey, vboId, elems.length * 2); - } - - return vboId; -}; - -/** - * Returns the VBO ID of a buffer containing a unit quadrilateral expressed as four 2D vertices at (0, 1), - * (0, 0), (1, 1) and (1, 0). The four vertices are in the order required by a triangle strip. The buffer is - * created on first use and cached. Subsequent calls to this method return the cached buffer. - * @returns {Object} The VBO ID identifying the vertex buffer. - */ -DrawContext.prototype.unitQuadBuffer = function () { - var vboId = this.gpuResourceCache.resourceForKey(DrawContext.unitQuadKey); - - if (!vboId) { - var gl = this.currentGlContext, - points = new Float32Array(8); - - points[0] = 0; // upper left corner - points[1] = 1; - points[2] = 0; // lower left corner - points[3] = 0; - points[4] = 1; // upper right corner - points[5] = 1; - points[6] = 1; // lower right corner - points[7] = 0; - - vboId = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - this.frameStatistics.incrementVboLoadCount(1); - - this.gpuResourceCache.putResource(DrawContext.unitQuadKey, vboId, points.length * 4); - } - - return vboId; -}; - -/** - * Returns the VBO ID of a buffer containing a unit quadrilateral expressed as four 3D vertices at (0, 1, 0), - * (0, 0, 0), (1, 1, 0) and (1, 0, 0). - * The four vertices are in the order required by a triangle strip. The buffer is created - * on first use and cached. Subsequent calls to this method return the cached buffer. - * @returns {Object} The VBO ID identifying the vertex buffer. - */ -DrawContext.prototype.unitQuadBuffer3 = function () { - var vboId = this.gpuResourceCache.resourceForKey(DrawContext.unitQuadKey3); - - if (!vboId) { - var gl = this.currentGlContext, - points = new Float32Array(12); - - points[0] = 0; // upper left corner - points[1] = 1; - points[2] = 0; - points[3] = 0; // lower left corner - points[4] = 0; - points[5] = 0; - points[6] = 1; // upper right corner - points[7] = 1; - points[8] = 0; - points[9] = 1; // lower right corner - points[10] = 0; - points[11] = 0; - - vboId = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - this.frameStatistics.incrementVboLoadCount(1); - - this.gpuResourceCache.putResource(DrawContext.unitQuadKey3, vboId, points.length * 4); - } - - return vboId; -}; - -/** - * Computes a Cartesian point at a location on the surface of this terrain according to a specified - * altitude mode. If there is no current terrain, this function approximates the returned point by assuming - * the terrain is the globe's ellipsoid. - * @param {Number} latitude The location's latitude. - * @param {Number} longitude The location's longitude. - * @param {Number} offset Distance above the terrain, in meters relative to the specified altitude mode, at - * which to compute the point. - * @param {String} altitudeMode The altitude mode to use to compute the point. Recognized values are - * WorldWind.ABSOLUTE, WorldWind.CLAMP_TO_GROUND and - * WorldWind.RELATIVE_TO_GROUND. The mode WorldWind.ABSOLUTE is used if the - * specified mode is null, undefined or unrecognized, or if the specified location is outside this terrain. - * @param {Vec3} result A pre-allocated Vec3 in which to return the computed point. - * @returns {Vec3} The specified result parameter, set to the coordinates of the computed point. - * @throws {ArgumentError} If the specified result argument is null or undefined. - */ -DrawContext.prototype.surfacePointForMode = function (latitude, longitude, offset, altitudeMode, result) { - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "surfacePointForMode", "missingResult")); - } - - if (this.terrain) { - this.terrain.surfacePointForMode(latitude, longitude, offset, altitudeMode, result); - } else { - var h = offset + this.globe.elevationAtLocation(latitude, longitude) * this.verticalExaggeration; - this.globe.computePointFromPosition(latitude, longitude, h, result); - } - - return result; -}; - -/** - * Transforms the specified model point from model coordinates to WebGL screen coordinates. - * <p> - * The resultant screen point is in WebGL screen coordinates, with the origin in the bottom-left corner and - * axes that extend up and to the right from the origin. - * <p> - * This function stores the transformed point in the result argument, and returns true or false to indicate - * whether or not the transformation is successful. It returns false if the modelview or - * projection matrices are malformed, or if the specified model point is clipped by the near clipping plane or - * the far clipping plane. - * - * @param {Vec3} modelPoint The model coordinate point to project. - * @param {Vec3} result A pre-allocated vector in which to return the projected point. - * @returns {boolean} true if the transformation is successful, otherwise false. - * @throws {ArgumentError} If either the specified point or result argument is null or undefined. - */ -DrawContext.prototype.project = function (modelPoint, result) { - if (!modelPoint) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "project", - "missingPoint")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "project", - "missingResult")); - } - - // Transform the model point from model coordinates to eye coordinates then to clip coordinates. This - // inverts the Z axis and stores the negative of the eye coordinate Z value in the W coordinate. - var mx = modelPoint[0], - my = modelPoint[1], - mz = modelPoint[2], - m = this.modelviewProjection, - x = m[0] * mx + m[1] * my + m[2] * mz + m[3], - y = m[4] * mx + m[5] * my + m[6] * mz + m[7], - z = m[8] * mx + m[9] * my + m[10] * mz + m[11], - w = m[12] * mx + m[13] * my + m[14] * mz + m[15]; - - if (w === 0) { - return false; - } - - // Complete the conversion from model coordinates to clip coordinates by dividing by W. The resultant X, Y - // and Z coordinates are in the range [-1,1]. - x /= w; - y /= w; - z /= w; - - // Clip the point against the near and far clip planes. - if (z < -1 || z > 1) { - return false; - } - - // Convert the point from clip coordinate to the range [0,1]. This enables the X and Y coordinates to be - // converted to screen coordinates, and the Z coordinate to represent a depth value in the range[0,1]. - x = x * 0.5 + 0.5; - y = y * 0.5 + 0.5; - z = z * 0.5 + 0.5; - - // Convert the X and Y coordinates from the range [0,1] to screen coordinates. - x = x * this.viewport.width + this.viewport.x; - y = y * this.viewport.height + this.viewport.y; - - result[0] = x; - result[1] = y; - result[2] = z; - - return true; -}; - -/** - * Transforms the specified model point from model coordinates to WebGL screen coordinates, applying an offset - * to the modelPoint's projected depth value. - * <p> - * The resultant screen point is in WebGL screen coordinates, with the origin in the bottom-left corner and axes - * that extend up and to the right from the origin. - * <p> - * This function stores the transformed point in the result argument, and returns true or false to indicate whether or - * not the transformation is successful. It returns false if the modelview or projection - * matrices are malformed, or if the modelPoint is clipped by the near clipping plane or the far clipping plane, - * ignoring the depth offset. - * <p> - * The depth offset may be any real number and is typically used to move the screenPoint slightly closer to the - * user's eye in order to give it visual priority over nearby objects or terrain. An offset of zero has no effect. - * An offset less than zero brings the screenPoint closer to the eye, while an offset greater than zero pushes the - * projected screen point away from the eye. - * <p> - * Applying a non-zero depth offset has no effect on whether the model point is clipped by this method or by - * WebGL. Clipping is performed on the original model point, ignoring the depth offset. The final depth value - * after applying the offset is clamped to the range [0,1]. - * - * @param {Vec3} modelPoint The model coordinate point to project. - * @param {Number} depthOffset The amount of offset to apply. - * @param {Vec3} result A pre-allocated vector in which to return the projected point. - * @returns {boolean} true if the transformation is successful, otherwise false. - * @throws {ArgumentError} If either the specified point or result argument is null or undefined. - */ -DrawContext.prototype.projectWithDepth = function (modelPoint, depthOffset, result) { - if (!modelPoint) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "projectWithDepth", - "missingPoint")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "projectWithDepth", - "missingResult")); - } - - // Transform the model point from model coordinates to eye coordinates. The eye coordinate and the clip - // coordinate are transformed separately in order to reuse the eye coordinate below. - var mx = modelPoint[0], - my = modelPoint[1], - mz = modelPoint[2], - m = this.modelview, - ex = m[0] * mx + m[1] * my + m[2] * mz + m[3], - ey = m[4] * mx + m[5] * my + m[6] * mz + m[7], - ez = m[8] * mx + m[9] * my + m[10] * mz + m[11], - ew = m[12] * mx + m[13] * my + m[14] * mz + m[15]; - - // Transform the point from eye coordinates to clip coordinates. - var p = this.projection, - x = p[0] * ex + p[1] * ey + p[2] * ez + p[3] * ew, - y = p[4] * ex + p[5] * ey + p[6] * ez + p[7] * ew, - z = p[8] * ex + p[9] * ey + p[10] * ez + p[11] * ew, - w = p[12] * ex + p[13] * ey + p[14] * ez + p[15] * ew; - - if (w === 0) { - return false; - } - - // Complete the conversion from model coordinates to clip coordinates by dividing by W. The resultant X, Y - // and Z coordinates are in the range [-1,1]. - x /= w; - y /= w; - z /= w; - - // Clip the point against the near and far clip planes. - if (z < -1 || z > 1) { - return false; - } - - // Transform the Z eye coordinate to clip coordinates again, this time applying a depth offset. The depth - // offset is applied only to the matrix element affecting the projected Z coordinate, so we inline the - // computation here instead of re-computing X, Y, Z and W in order to improve performance. See - // Matrix.offsetProjectionDepth for more information on the effect of this offset. - z = p[8] * ex + p[9] * ey + p[10] * ez * (1 + depthOffset) + p[11] * ew; - z /= w; - - // Clamp the point to the near and far clip planes. We know the point's original Z value is contained within - // the clip planes, so we limit its offset z value to the range [-1, 1] in order to ensure it is not clipped - // by WebGL. In clip coordinates the near and far clip planes are perpendicular to the Z axis and are - // located at -1 and 1, respectively. - z = WWMath.clamp(z, -1, 1); - - // Convert the point from clip coordinates to the range [0, 1]. This enables the XY coordinates to be - // converted to screen coordinates, and the Z coordinate to represent a depth value in the range [0, 1]. - x = x * 0.5 + 0.5; - y = y * 0.5 + 0.5; - z = z * 0.5 + 0.5; - - // Convert the X and Y coordinates from the range [0,1] to screen coordinates. - x = x * this.viewport.width + this.viewport.x; - y = y * this.viewport.height + this.viewport.y; - - result[0] = x; - result[1] = y; - result[2] = z; - - return true; -}; - -/** - * Converts a window-coordinate point to WebGL screen coordinates. - * <p> - * The specified point is understood to be in the window coordinate system of the WorldWindow, with the origin - * in the top-left corner and axes that extend down and to the right from the origin point. - * <p> - * The returned point is in WebGL screen coordinates, with the origin in the bottom-left corner and axes that - * extend up and to the right from the origin point. - * - * @param {Vec2} point The window-coordinate point to convert. - * @param {Vec2} result A pre-allocated {@link Vec2} in which to return the computed point. - * @returns {Vec2} The specified result argument set to the computed point. - * @throws {ArgumentError} If either argument is null or undefined. - */ -DrawContext.prototype.convertPointToViewport = function (point, result) { - if (!point) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "convertPointToViewport", - "missingPoint")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "convertPointToViewport", - "missingResult")); - } - - result[0] = point[0]; - result[1] = this.viewport.height - point[1]; - - return result; -}; - -/** - * Computes the approximate size of a pixel at a specified distance from the eye point. - * <p> - * This method assumes rectangular pixels, where pixel coordinates denote - * infinitely thin spaces between pixels. The units of the returned size are in model coordinates per pixel - * (usually meters per pixel). This returns 0 if the specified distance is zero. The returned size is undefined - * if the distance is less than zero. - * - * @param {Number} distance The distance from the eye point at which to determine pixel size, in model - * coordinates. - * @returns {Number} The approximate pixel size at the specified distance from the eye point, in model - * coordinates per pixel. - */ -DrawContext.prototype.pixelSizeAtDistance = function (distance) { - // Compute the pixel size from the width of a rectangle carved out of the frustum in model coordinates at - // the specified distance along the -Z axis and the viewport width in screen coordinates. The pixel size is - // expressed in model coordinates per screen coordinate (e.g. meters per pixel). - // - // The frustum width is determined by noticing that the frustum size is a linear function of distance from - // the eye point. The linear equation constants are determined during initialization, then solved for - // distance here. - // - // This considers only the frustum width by assuming that the frustum and viewport share the same aspect - // ratio, so that using either the frustum width or height results in the same pixel size. - - return this.pixelSizeFactor * distance + this.pixelSizeOffset; -}; - -/** - * Propagates the values contained in a TextAttributes object to the currently attached TextRenderer - * {@link TextRenderer} as to provide format to a string of text. It first checks if the 2D texture is not - * already cached according to the text string and its attached TextAttributes {@link TextAttributes} state key. - * The TextRenderer then produces a 2D Texture with the aforementioned text and format to be used as a label - * for a Text {@link Text} subclass (<i>e.g.</i> Annotation {@link Annotation} or Placemark {@link Placemark}). - * @param {String} text The string of text that will be given color, font, and outline - * from which the resulting texture will be based on. - * @param {TextAttributes} textAttributes Attributes that will be applied to the string. - * See TextAttributes {@link TextAttributes}. - * @returns {Texture} A texture {@link Texture} with the specified text string, font, colors, and outline. - */ -DrawContext.prototype.createTextTexture = function (text, textAttributes) { - if (!text || !textAttributes) { - return null; - } - - var textureKey = this.computeTextTextureStateKey(text, textAttributes); - var texture = this.gpuResourceCache.resourceForKey(textureKey); - - if (!texture) { - this.textRenderer.textColor = textAttributes.color; - this.textRenderer.typeFace = textAttributes.font; - this.textRenderer.enableOutline = textAttributes.enableOutline; - this.textRenderer.outlineColor = textAttributes.outlineColor; - this.textRenderer.outlineWidth = textAttributes.outlineWidth; - texture = this.textRenderer.renderText(text); - this.gpuResourceCache.putResource(textureKey, texture, texture.size); - this.gpuResourceCache.setResourceAgingFactor(textureKey, 100); // age this texture 100x faster than normal resources (e.g., tiles) - } - - return texture; -}; - -/** - * Computes a state key that relates to a text label, foregoing the TextAttributes {@link TextAttributes} - * properties that are not related to texture rendering (offset, scale, and depthTest). - * @param {String} text The label's string of text. - * @param {TextAttributes} attributes The TextAttributes object associated with the text label to render. - * @returns {String} A state key composed of the original string of text plus the TextAttributes associated - * with texture rendering. - */ -DrawContext.prototype.computeTextTextureStateKey = function (text, attributes) { - if (!text || !attributes) { - return null; - } - - return text + - "c " + attributes.color.toHexString(true) + - " f " + attributes.font.toString() + - " eo " + attributes.enableOutline + - " ow " + attributes.outlineWidth + - " oc " + attributes.outlineColor.toHexString(true); -}; - -/** - * Returns a WebGL extension and caches the result for subsequent calls. - * - * @param {String} extensionName The name of the WebGL extension. - * @returns {Object|null} A WebGL extension object, or null if the extension is not available. - * @throws {ArgumentError} If the argument is null or undefined. - */ -DrawContext.prototype.getExtension = function (extensionName) { - if (!extensionName) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "DrawContext", "getExtension", - "missingExtensionName")); - } - - if (!(extensionName in this.glExtensionsCache)) { - this.glExtensionsCache[extensionName] = this.currentGlContext.getExtension(extensionName) || null; - } - - return this.glExtensionsCache[extensionName]; -}; - -export default DrawContext; diff --git a/web/src/gis/render/FramebufferTexture.js b/web/src/gis/render/FramebufferTexture.js deleted file mode 100644 index b99655c6..00000000 --- a/web/src/gis/render/FramebufferTexture.js +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports FramebufferTexture - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import '../util/WWMath'; - - -/** - * Constructs a framebuffer texture with the specified dimensions and an optional depth buffer. Use the - * [DrawContext.bindFramebuffer]{@link DrawContext#bindFramebuffer} function to make the program current during rendering. - * - * @alias FramebufferTexture - * @constructor - * @classdesc Represents an off-screen WebGL framebuffer. The framebuffer has color buffer stored in a 32 - * bit RGBA texture, and has an optional depth buffer of at least 16 bits. Applications typically do not - * interact with this class. WebGL framebuffers are created by instances of this class and made current when the - * DrawContext.bindFramebuffer function is invoked. - * @param {WebGLRenderingContext} gl The current WebGL rendering context. - * @param {Number} width The width of the framebuffer, in pixels. - * @param {Number} height The height of the framebuffer, in pixels. - * @param {Boolean} depth true to configure the framebuffer with a depth buffer of at least 16 bits, false to - * disable depth buffering. - * @throws {ArgumentError} If the specified draw context is null or undefined, or if the width or height is less - * than zero. - */ -function FramebufferTexture(gl, width, height, depth) { - if (!gl) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "FramebufferTexture", "constructor", - "missingGlContext")); - } - - if (width < 0 || height < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "FramebufferTexture", "constructor", - "The framebuffer width or height is less than zero.")); - } - - /** - * The width of this framebuffer, in pixels. - * @type {Number} - * @readonly - */ - this.width = width; - - /** - * The height of this framebuffer, in pixels. - * @type {Number} - * @readonly - */ - this.height = height; - - /** - * Indicates whether or not this framebuffer has a depth buffer. - * @type {Boolean} - * @readonly - */ - this.depth = depth; - - /** - * Indicates the size of this framebuffer's WebGL resources, in bytes. - * @type {Number} - * @readonly - */ - this.size = width * height * 4 + (depth ? width * height * 2 : 0); - - /** - * Indicates the WebGL framebuffer object object associated with this framebuffer texture. - * @type {WebGLFramebuffer} - * @readonly - */ - this.framebufferId = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebufferId); - - // Internal. Intentionally not documented. Configure this framebuffer's color buffer. - this.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, - gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, - gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, - gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, - gl.CLAMP_TO_EDGE); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, - gl.RGBA, gl.UNSIGNED_BYTE, null); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, this.texture, 0); - - // Internal. Intentionally not documented. Configure this framebuffer's optional depth buffer. - this.depthBuffer = null; - if (depth) { - this.depthBuffer = gl.createRenderbuffer(); - gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, - width, height); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, - gl.RENDERBUFFER, this.depthBuffer); - } - - var e = gl.checkFramebufferStatus(gl.FRAMEBUFFER); - if (e != gl.FRAMEBUFFER_COMPLETE) { - Logger.logMessage(Logger.LEVEL_WARNING, "FramebufferTexture", "constructor", - "Error creating framebuffer: " + e); - this.framebufferId = null; - this.texture = null; - this.depthBuffer = null; - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindTexture(gl.TEXTURE_2D, null); -} - -/** - * Binds this off-screen framebuffer's texture in the current WebGL graphics context. This texture contains - * color fragments resulting from WebGL operations executed when this framebuffer is bound by a call to - * [FramebufferTexture.bindFramebuffer]{@link FramebufferTexture#bindFramebuffer}. - * - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if this framebuffer's texture was bound successfully, otherwise false. - */ -FramebufferTexture.prototype.bind = function (dc) { - if (this.texture) { - dc.currentGlContext.bindTexture(gl.TEXTURE_2D, this.texture); - } - - return !!this.texture; -}; - -export default FramebufferTexture; diff --git a/web/src/gis/render/FramebufferTile.js b/web/src/gis/render/FramebufferTile.js deleted file mode 100644 index cbc59c3b..00000000 --- a/web/src/gis/render/FramebufferTile.js +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports FramebufferTile - */ -import ArgumentError from '../error/ArgumentError'; -import FramebufferTexture from '../render/FramebufferTexture'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Rectangle from '../geom/Rectangle'; -import TextureTile from '../render/TextureTile'; - - -/** - * Constructs a framebuffer tile. - * @alias FramebufferTile - * @constructor - * @augments TextureTile - * @classdesc Represents a WebGL framebuffer applied to a portion of a globe's terrain. The framebuffer's width - * and height in pixels are equal to this tile's [tileWidth]{@link FramebufferTile#tileWidth} and - * [tileHeight]{@link FramebufferTile#tileHeight}, respectively. The framebuffer can be made active by calling - * [bindFramebuffer]{@link FramebufferTile#bindFramebuffer}. Color fragments written to this - * tile's framebuffer can then be drawn on the terrain surface using a - * [SurfaceTileRenderer]{@link SurfaceTileRenderer}. - * <p> - * This class is meant to be used internally. Applications typically do not interact with this class. - * @param {Sector} sector The sector this tile covers. - * @param {Level} level The level this tile is associated with. - * @param {Number} row This tile's row in the associated level. - * @param {Number} column This tile's column in the associated level. - * @param {String} cacheKey A string uniquely identifying this tile relative to other tiles. - * @throws {ArgumentError} If the specified sector or level is null or undefined, the row or column arguments - * are less than zero, or the cache name is null, undefined or empty. - */ -function FramebufferTile(sector, level, row, column, cacheKey) { - if (!cacheKey || cacheKey.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "FramebufferTile", "constructor", - "The specified cache name is null, undefined or zero length.")); - } - - TextureTile.call(this, sector, level, row, column); // args are checked in the superclass' constructor - - // Assign the cacheKey as the gpuCacheKey (inherited from TextureTile). - this.gpuCacheKey = cacheKey; - - // Internal. Intentionally not documented. - this.textureTransform = Matrix.fromIdentity().setToUnitYFlip(); - - // Internal. Intentionally not documented. - this.mustClear = true; -} - -FramebufferTile.prototype = Object.create(TextureTile.prototype); - -/** - * Causes this tile to clear any color fragments written to its off-screen framebuffer. - * @param dc The current draw context. - */ -FramebufferTile.prototype.clearFramebuffer = function (dc) { - this.mustClear = true; -}; - -/** - * Causes this tile's off-screen framebuffer as the current WebGL framebuffer. WebGL operations that affect the - * framebuffer now affect this tile's framebuffer, rather than the default WebGL framebuffer. - * Color fragments are written to this tile's WebGL texture, which can be made active by calling - * [SurfaceTile.bind]{@link SurfaceTile#bind}. - * - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if the framebuffer was bound successfully, otherwise false. - */ -FramebufferTile.prototype.bindFramebuffer = function (dc) { - var framebuffer = dc.gpuResourceCache.resourceForKey(this.gpuCacheKey); - - if (!framebuffer) { - framebuffer = this.createFramebuffer(dc); - } - - dc.bindFramebuffer(framebuffer); - - if (this.mustClear) { - this.doClearFramebuffer(dc); - this.mustClear = false; - } - - return true; -}; - -// Internal. Intentionally not documented. -FramebufferTile.prototype.createFramebuffer = function (dc) { - var framebuffer = new FramebufferTexture(dc.currentGlContext, this.tileWidth, this.tileHeight, false); - dc.gpuResourceCache.putResource(this.gpuCacheKey, framebuffer, framebuffer.size); - - return framebuffer; -}; - -// Internal. Intentionally not documented. -FramebufferTile.prototype.doClearFramebuffer = function (dc) { - var gl = dc.currentGlContext; - gl.clearColor(0, 0, 0, 0); - gl.clear(gl.COLOR_BUFFER_BIT); -}; - -/** - * Applies the appropriate texture transform to display this tile's WebGL texture. - * @param {DrawContext} dc The current draw context. - * @param {Matrix} matrix The matrix to apply the transform to. - */ -FramebufferTile.prototype.applyInternalTransform = function (dc, matrix) { - matrix.multiplyMatrix(this.textureTransform); -}; - -export default FramebufferTile; diff --git a/web/src/gis/render/FramebufferTileController.js b/web/src/gis/render/FramebufferTileController.js deleted file mode 100644 index 7862d6ae..00000000 --- a/web/src/gis/render/FramebufferTileController.js +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports FramebufferTileController - */ -import ArgumentError from '../error/ArgumentError'; -import FramebufferTile from '../render/FramebufferTile'; -import LevelSet from '../util/LevelSet'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import MemoryCache from '../cache/MemoryCache'; -import Sector from '../geom/Sector'; -import Tile from '../util/Tile'; - - -/** - * Constructs a framebuffer tile controller. - * @alias FramebufferTileController - * @constructor - * @classdesc Provides access to a multi-resolution WebGL framebuffer arranged as adjacent tiles in a pyramid. - * WorldWind shapes use this class internally to draw on the terrain surface. Applications typically do not - * interact with this class. - */ -function FramebufferTileController() { - - /** - * The width in pixels of framebuffers associated with this controller's tiles. - * @type {Number} - * @readonly - */ - this.tileWidth = 256; - - /** - * The height in pixels of framebuffers associated with this controller's tiles. - * @type {Number} - * @readonly - */ - this.tileHeight = 256; - - /** - * Controls the level of detail switching for this controller. The next highest resolution level is - * used when an image's texel size is greater than this number of pixels. - * @type {Number} - * @default 1.75 - */ - this.detailControl = 1.75; - - // Internal. Intentionally not documented. - this.levels = new LevelSet(Sector.FULL_SPHERE, new Location(360, 360), 18, this.tileWidth, this.tileHeight); - - // Internal. Intentionally not documented. - this.topLevelTiles = []; - - // Internal. Intentionally not documented. - this.currentTiles = []; - - // Internal. Intentionally not documented. - this.currentTimestamp = null; - - // Internal. Intentionally not documented. - this.currentGlobeStateKey = null; - - // Internal. Intentionally not documented. - this.tileCache = new MemoryCache(500000, 400000); - - // Internal. Intentionally not documented. - this.key = "FramebufferTileController " + ++FramebufferTileController.keyPool; -} - -// Internal. Intentionally not documented. -FramebufferTileController.keyPool = 0; // source of unique ids - -/** - * Returns a set of multi-resolution [FramebufferTile]{@link FramebufferTile} instances appropriate for the - * current draw context that overlap a specified sector. - * @param {DrawContext} dc The current draw context. - * @param {Sector} sector The geographic region of interest. - * @returns {Array} The set of multi-resolution framebuffer tiles that overlap the sector. - * @throws {ArgumentError} If the specified sector is null. - */ -FramebufferTileController.prototype.selectTiles = function (dc, sector) { - if (!sector) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "FramebufferTileController", - "selectTiles", "missingSector")); - } - - // Assemble a set of global tiles appropriate for the draw context. - this.assembleTiles(dc); - - // Collect the tiles that overlap the specified sector and mark them as selected. - var tiles = []; - for (var i = 0, len = this.currentTiles.length; i < len; i++) { - var tile = this.currentTiles[i]; - if (tile.sector.overlaps(sector)) { - tile.selected = true; - tiles.push(tile); - } - } - - return tiles; -}; - -/** - * Draws this multi-resolution framebuffer on the terrain surface then clears the framebuffer. This has no - * effect if the framebuffer is unchanged since the last call to render. - * @param {DrawContext} dc The current draw context. - */ -FramebufferTileController.prototype.render = function (dc) { - // Exit immediately if there are no framebuffer tiles. This can happen when there ar eno surface shapes in - // the scene, for example. - if (this.currentTiles.length == 0) { - return; - } - - // Collect the tiles that have changed since the last call to render. - var tiles = []; - for (var i = 0, len = this.currentTiles.length; i < len; i++) { - var tile = this.currentTiles[i]; - if (tile.selected) { - tiles.push(tile); - } - } - - // Draw the changed tiles on the terrain surface. - dc.surfaceTileRenderer.renderTiles(dc, tiles, 1); - - // Clear the changed tile's WebGL framebuffers. - var gl = dc.currentGlContext, - framebuffer = dc.currentFramebuffer; - try { - gl.clearColor(0, 0, 0, 0); - for (i = 0, len = tiles.length; i < len; i++) { - tile = tiles[i]; - tile.selected = false; - tile.bindFramebuffer(dc); - gl.clear(gl.COLOR_BUFFER_BIT); - } - } finally { - dc.bindFramebuffer(framebuffer); - } -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.assembleTiles = function (dc) { - var timestamp = dc.timestamp, - globeStateKey = dc.globeStateKey; - - if (this.currentTimestamp != timestamp || - this.currentGlobeStateKey != globeStateKey) { - - this.doAssembleTiles(dc); - - this.currentTimestamp = timestamp; - this.currentGlobeStateKey = globeStateKey; - } -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.doAssembleTiles = function (dc) { - this.currentTiles = []; - - if (!dc.terrain) { - return; - } - - if (this.topLevelTiles.length == 0) { - this.createTopLevelTiles(); - } - - for (var i = 0, len = this.topLevelTiles.length; i < len; i++) { - var tile = this.topLevelTiles[i]; - tile.update(dc); - - if (this.isTileVisible(dc, tile)) { - this.addTileOrDescendants(dc, tile); - } - } -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.createTile = function (sector, level, row, column) { - var tileKey = this.key + " " + level.levelNumber + "." + row + "." + column; - return new FramebufferTile(sector, level, row, column, tileKey); -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.createTopLevelTiles = function () { - Tile.createTilesForLevel(this.levels.firstLevel(), this, this.topLevelTiles); -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.addTileOrDescendants = function (dc, tile) { - if (this.tileMeetsRenderingCriteria(dc, tile)) { - this.addTile(tile); - return; - } - - var subTiles = tile.subdivideToCache(tile.level.nextLevel(), this, this.tileCache); - for (var i = 0, len = subTiles.length; i < len; i++) { - var child = subTiles[i]; - child.update(dc); - - if (this.isTileVisible(dc, child)) { - this.addTileOrDescendants(dc, child); - } - } -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.addTile = function (tile) { - this.currentTiles.push(tile); -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.isTileVisible = function (dc, tile) { - if (dc.globe.projectionLimits && !tile.sector.overlaps(dc.globe.projectionLimits)) { - return false; - } - - if (dc.pickingMode) { - return tile.extent.intersectsFrustum(dc.pickFrustum); - } - - return tile.extent.intersectsFrustum(dc.frustumInModelCoordinates); -}; - -// Internal. Intentionally not documented. -FramebufferTileController.prototype.tileMeetsRenderingCriteria = function (dc, tile) { - var s = this.detailControl; - if (tile.sector.minLatitude >= 75 || tile.sector.maxLatitude <= -75) { - s *= 1.2; - } - - return tile.level.isLastLevel() || !tile.mustSubdivide(dc, s); -}; - -export default FramebufferTileController; diff --git a/web/src/gis/render/ImageTile.js b/web/src/gis/render/ImageTile.js deleted file mode 100644 index b5587cdb..00000000 --- a/web/src/gis/render/ImageTile.js +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ImageTile - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import TextureTile from '../render/TextureTile'; -import Tile from '../util/Tile'; - - -/** - * Constructs an image tile. - * @alias ImageTile - * @constructor - * @classdesc Represents an image applied to a portion of a globe's terrain. Applications typically do not - * interact with this class. - * @augments TextureTile - * @param {Sector} sector The sector this tile covers. - * @param {Level} level The level this tile is associated with. - * @param {Number} row This tile's row in the associated level. - * @param {Number} column This tile's column in the associated level. - * @param {String} imagePath The full path to the image. - * @throws {ArgumentError} If the specified sector or level is null or undefined, the row or column arguments - * are less than zero, or the specified image path is null, undefined or empty. - * - */ -function ImageTile(sector, level, row, column, imagePath) { - if (!imagePath || imagePath.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ImageTile", "constructor", - "The specified image path is null, undefined or zero length.")); - } - - TextureTile.call(this, sector, level, row, column); // args are checked in the superclass' constructor - - /** - * This tile's image path. - * @type {String} - */ - this.imagePath = imagePath; - - /** - * The tile whose texture to use when this tile's texture is not available. - * @type {Matrix} - */ - this.fallbackTile = null; - - // Assign imagePath to gpuCacheKey (inherited from TextureTile). - this.gpuCacheKey = imagePath; -} - -ImageTile.prototype = Object.create(TextureTile.prototype); - -/** - * Returns the size of the this tile in bytes. - * @returns {Number} The size of this tile in bytes, not including the associated texture size. - */ -ImageTile.prototype.size = function () { - return this.__proto__.__proto__.size.call(this) + this.imagePath.length + 8; -}; - -/** - * Causes this tile's texture to be active. Implements [SurfaceTile.bind]{@link SurfaceTile#bind}. - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if the texture was bound successfully, otherwise false. - */ -ImageTile.prototype.bind = function (dc) { - // Attempt to bind in TextureTile first. - var isBound = this.__proto__.__proto__.bind.call(this, dc); - if (isBound) { - return true; - } - - if (this.fallbackTile) { - return this.fallbackTile.bind(dc); - } - - return false; -}; - -/** - * If this tile's fallback texture is used, applies the appropriate texture transform to a specified matrix. - * @param {DrawContext} dc The current draw context. - * @param {Matrix} matrix The matrix to apply the transform to. - */ -ImageTile.prototype.applyInternalTransform = function (dc, matrix) { - if (this.fallbackTile && !dc.gpuResourceCache.resourceForKey(this.imagePath)) { - // Must apply a texture transform to map the tile's sector into its fallback's image. - this.applyFallbackTransform(matrix); - } -}; - -// Intentionally not documented. -ImageTile.prototype.applyFallbackTransform = function (matrix) { - var deltaLevel = this.level.levelNumber - this.fallbackTile.level.levelNumber; - if (deltaLevel <= 0) - return; - - var fbTileDeltaLat = this.fallbackTile.sector.deltaLatitude(), - fbTileDeltaLon = this.fallbackTile.sector.deltaLongitude(), - sx = this.sector.deltaLongitude() / fbTileDeltaLon, - sy = this.sector.deltaLatitude() / fbTileDeltaLat, - tx = (this.sector.minLongitude - this.fallbackTile.sector.minLongitude) / fbTileDeltaLon, - ty = (this.sector.minLatitude - this.fallbackTile.sector.minLatitude) / fbTileDeltaLat; - - // Apply a transform to the matrix that maps texture coordinates for this tile to texture coordinates for the - // fallback tile. Rather than perform the full set of matrix operations, a single multiply is performed with the - // precomputed non-zero values: - // - // Matrix trans = Matrix.fromTranslation(tx, ty, 0); - // Matrix scale = Matrix.fromScale(sxy, sxy, 1); - // matrix.multiply(trans); - // matrix.multiply(scale); - - matrix.multiply( - sx, 0, 0, tx, - 0, sy, 0, ty, - 0, 0, 1, 0, - 0, 0, 0, 1); -}; - -export default ImageTile; diff --git a/web/src/gis/render/OrderedRenderable.js b/web/src/gis/render/OrderedRenderable.js deleted file mode 100644 index 44b60b3a..00000000 --- a/web/src/gis/render/OrderedRenderable.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports OrderedRenderable - */ -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Applications must not call this constructor. It is an interface class and is not meant to be instantiated - * directly. - * @alias OrderedRenderable - * @constructor - * @classdesc Represents an ordered renderable. - * This is an interface class and is not meant to be instantiated directly. - */ -function OrderedRenderable() { - - /** - * This ordered renderable's display name. - * @type {String} - * @default Renderable - */ - this.displayName = "Renderable"; - - /** - * Indicates whether this ordered renderable is enabled. - * @type {Boolean} - * @default true - */ - this.enabled = true; - - /** - * This ordered renderable's distance from the eye point in meters. - * @type {Number} - * @default Number.MAX_VALUE - */ - this.eyeDistance = Number.MAX_VALUE; - - /** - * The time at which this ordered renderable was inserted into the ordered rendering list. - * @type {Number} - * @default 0 - */ - this.insertionTime = 0; - - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "OrderedRenderable", "constructor", "abstractInvocation")); -} - -/** - * Renders this ordered renderable. - * @param {DrawContext} dc The current draw context. - */ -OrderedRenderable.prototype.renderOrdered = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "OrderedRenderable", "renderOrdered", "abstractInvocation")); -}; - -export default OrderedRenderable; diff --git a/web/src/gis/render/Renderable.js b/web/src/gis/render/Renderable.js deleted file mode 100644 index c54e8ec8..00000000 --- a/web/src/gis/render/Renderable.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Renderable - */ -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Constructs a base renderable. - * @alias Renderable - * @constructor - * @classdesc Represents a shape or other object that can be rendered. This is an abstract class and is not - * meant to be instantiated directly. - */ -function Renderable() { - - /** - * The display name of the renderable. - * @type {String} - * @default "Renderable" - */ - this.displayName = "Renderable"; - - /** - * Indicates whether to display this renderable. - * @type {Boolean} - * @default true - */ - this.enabled = true; - - /** - * Indicates the object to return as the userObject of this shape when picked. If null, - * then this shape is returned as the userObject. - * @type {Object} - * @default null - * @see [PickedObject.userObject]{@link PickedObject#userObject} - */ - this.pickDelegate = null; - - /** - * An application defined object associated with this renderable. A typical use case is to associate - * application defined data with a picked renderable. - * @type {Object} - * @default An empty object - */ - this.userProperties = {}; -} - -/** - * Render this renderable. Some shapes actually draw themselves during this call, others only add themselves - * to the draw context's ordered rendering list for subsequent drawing when their renderOrdered method is called. - * This method is intended to be called by layers such as {@link RenderableLayer} and not by applications. - * @param {DrawContext} dc The current draw context. - */ -Renderable.prototype.render = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Renderable", "render", "abstractInvocation")); -}; - -export default Renderable; diff --git a/web/src/gis/render/ScreenCreditController.js b/web/src/gis/render/ScreenCreditController.js deleted file mode 100644 index fbd81227..00000000 --- a/web/src/gis/render/ScreenCreditController.js +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ScreenCreditController - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import Font from '../util/Font'; -import Layer from '../layer/Layer'; -import Logger from '../util/Logger'; -import Offset from '../util/Offset'; -import ScreenText from '../shapes/ScreenText'; - - -/** - * Constructs a screen credit controller. - * @alias ScreenCreditController - * @constructor - * @augments Layer - * @classdesc Collects and displays screen credits. - */ -function ScreenCreditController() { - Layer.call(this, "ScreenCreditController"); - - /** - * An {@link Offset} indicating where to place the attributions on the screen. - * @type {Offset} - * @default The lower left corner of the window with an 11px left margin and a 2px bottom margin. - */ - this.creditPlacement = new Offset(WorldWind.OFFSET_PIXELS, 11, WorldWind.OFFSET_PIXELS, 2); - - /** - * The amount of horizontal spacing between adjacent attributions. - * @type {number} - * @default An 11px margin between attributions. - */ - this.creditMargin = 11; - - // Apply 50% opacity to all shapes rendered by this layer. - this.opacity = 0.5; - - // Internal. Intentionally not documented. - this.credits = []; -} - -ScreenCreditController.prototype = Object.create(Layer.prototype); - -/** - * Clears all credits from this controller. - */ -ScreenCreditController.prototype.clear = function () { - this.credits = []; -}; - -/** - * Adds a credit to this controller. - * @param {String} creditString The text to display in the credits area. - * @param {Color} color The color with which to draw the string. - * @param {String} hyperlinkUrl Optional argument if screen credit is intended to work as a hyperlink. - * @throws {ArgumentError} If either the specified string or color is null or undefined. - */ -ScreenCreditController.prototype.addCredit = function (creditString, color, hyperlinkUrl) { - if (!creditString) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenCreditController", "addCredit", "missingText")); - } - - if (!color) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenCreditController", "addCredit", "missingColor")); - } - - // Verify if text credit is not already in controller, if it is, don't add it. - for (var i = 0, len = this.credits.length; i < len; i++) { - if (this.credits[i].text === creditString) { - return; - } - } - - var credit = new ScreenText(new Offset(WorldWind.OFFSET_PIXELS, 0, WorldWind.OFFSET_PIXELS, 0), creditString); - credit.attributes.font = new Font(10); - credit.attributes.color = color; - credit.attributes.enableOutline = false; - credit.attributes.offset = new Offset(WorldWind.OFFSET_FRACTION, 0, WorldWind.OFFSET_FRACTION, 0); - - // Append new user property to store URL for hyperlinking. - // (See BasicWorldWindowController.handleClickOrTap). - if (hyperlinkUrl) { - credit.userProperties.url = hyperlinkUrl; - } - - this.credits.push(credit); -}; - -// Internal use only. Intentionally not documented. -ScreenCreditController.prototype.doRender = function (dc) { - var point = this.creditPlacement.offsetForSize(dc.viewport.width, dc.viewport.height); - - for (var i = 0, len = this.credits.length; i < len; i++) { - // Place the credit text on screen and render it. - this.credits[i].screenOffset.x = point[0]; - this.credits[i].screenOffset.y = point[1]; - this.credits[i].render(dc); - - // Advance the screen position for the next credit. - dc.textRenderer.typeFace = this.credits[i].attributes.font; - dc.textRenderer.outlineWidth = this.credits[i].attributes.outlineWidth; - dc.textRenderer.enableOutline = this.credits[i].attributes.enableOutline; - point[0] += dc.textRenderer.textSize(this.credits[i].text)[0]; - point[0] += this.creditMargin; - } -}; - -export default ScreenCreditController; diff --git a/web/src/gis/render/SurfaceRenderable.js b/web/src/gis/render/SurfaceRenderable.js deleted file mode 100644 index 084a5502..00000000 --- a/web/src/gis/render/SurfaceRenderable.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceRenderable - */ -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Applications must not call this constructor. It is an interface class and is not meant to be instantiated - * directly. - * @alias SurfaceRenderable - * @constructor - * @classdesc Represents a surface renderable. - * This is an interface class and is not meant to be instantiated directly. - */ -function SurfaceRenderable() { - - /** - * This surface renderable's display name. - * @type {String} - * @default Renderable - */ - this.displayName = "Renderable"; - - /** - * Indicates whether this surface renderable is enabled. - * @type {Boolean} - * @default true - */ - this.enabled = true; - - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceRenderable", "constructor", "abstractInvocation")); -} - -/** - * Renders this surface renderable. - * @param {DrawContext} dc The current draw context. - */ -SurfaceRenderable.prototype.renderSurface = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceRenderable", "renderSurface", "abstractInvocation")); -}; - -export default SurfaceRenderable; diff --git a/web/src/gis/render/SurfaceTile.js b/web/src/gis/render/SurfaceTile.js deleted file mode 100644 index fe8dc219..00000000 --- a/web/src/gis/render/SurfaceTile.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceTile - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Sector from '../geom/Sector'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Constructs a surface tile for a specified sector. - * @alias SurfaceTile - * @constructor - * @classdesc Defines an abstract base class for imagery to be rendered on terrain. Applications typically - * do not interact with this class. - * @param {Sector} sector The sector of this surface tile. - * @throws {ArgumentError} If the specified sector is null or undefined. - */ -function SurfaceTile(sector) { - if (!sector) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTile", "constructor", - "missingSector")); - } - - /** - * The sector spanned by this surface tile. - * @type {Sector} - */ - this.sector = sector; -} - -/** - * Causes this surface tile to be active, typically by binding the tile's texture in WebGL. - * Subclasses must override this function. - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if the resource was successfully bound, otherwise false. - */ -SurfaceTile.prototype.bind = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTile", "bind", "abstractInvocation")); -}; - -/** - * Applies this surface tile's internal transform, typically a texture transform to align the associated - * resource with the terrain. - * Subclasses must override this function. - * @param {DrawContext} dc The current draw context. - * @param {Matrix} matrix The transform to apply. - */ -SurfaceTile.prototype.applyInternalTransform = function (dc, matrix) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTile", "applyInternalTransform", "abstractInvocation")); -}; - -export default SurfaceTile; diff --git a/web/src/gis/render/SurfaceTileRenderer.js b/web/src/gis/render/SurfaceTileRenderer.js deleted file mode 100644 index 434736b5..00000000 --- a/web/src/gis/render/SurfaceTileRenderer.js +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceTileRenderer - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import SurfaceShapeTile from '../shapes/SurfaceShapeTile'; -import SurfaceTileRendererProgram from '../shaders/SurfaceTileRendererProgram'; - - -/** - * Constructs a new surface tile renderer. - * @alias SurfaceTileRenderer - * @constructor - * @classdesc This class is responsible for rendering imagery onto the terrain. - * It is meant to be used internally. Applications typically do not interact with this class. - */ -function SurfaceTileRenderer() { - - // Scratch values to avoid constantly recreating these matrices. - this.texMaskMatrix = Matrix.fromIdentity(); - this.texSamplerMatrix = Matrix.fromIdentity(); - - // Internal. Intentionally not documented. - this.isSurfaceShapeTileRendering = false; -} - -/** - * Render a specified collection of surface tiles. - * @param {DrawContext} dc The current draw context. - * @param {SurfaceTile[]} surfaceTiles The surface tiles to render. - * @param {Number} opacity The opacity at which to draw the surface tiles. - * @param {Boolean} tilesHaveOpacity If true, incoming tiles each have their own opacity property and - * it's value is applied when the tile is drawn. - * @throws {ArgumentError} If the specified surface tiles array is null or undefined. - */ -SurfaceTileRenderer.prototype.renderTiles = function (dc, surfaceTiles, opacity, tilesHaveOpacity) { - if (!surfaceTiles) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTileRenderer", "renderTiles", - "Specified surface tiles array is null or undefined.")); - } - - if (surfaceTiles.length < 1) - return; - - var terrain = dc.terrain, - gl = dc.currentGlContext, - tileCount = 0,// for frame statistics, - program, - terrainTile, - terrainTileSector, - surfaceTile, - currentTileOpacity = 1; - - if (!terrain) - return; - - this.isSurfaceShapeTileRendering = surfaceTiles[0] instanceof SurfaceShapeTile; - - opacity *= dc.surfaceOpacity; - - // For each terrain tile, render it for each overlapping surface tile. - program = this.beginRendering(dc, opacity); - terrain.beginRendering(dc); - try { - for (var i = 0, ttLen = terrain.surfaceGeometry.length; i < ttLen; i++) { - terrainTile = terrain.surfaceGeometry[i]; - terrainTileSector = terrainTile.sector; - - terrain.beginRenderingTile(dc, terrainTile); - try { - // Render the terrain tile for each overlapping surface tile. - for (var j = 0, stLen = surfaceTiles.length; j < stLen; j++) { - surfaceTile = surfaceTiles[j]; - if (surfaceTile.sector.overlaps(terrainTileSector)) { - if (surfaceTile.bind(dc)) { - if (dc.pickingMode) { - if (surfaceTile.pickColor) { - program.loadColor(gl, surfaceTile.pickColor); - } else { - // Surface shape tiles don't use a pick color. Pick colors are encoded into - // the colors of the individual shapes drawn into the tile. - } - } else { - if (tilesHaveOpacity && surfaceTile.opacity != currentTileOpacity) { - program.loadOpacity(gl, opacity * surfaceTile.opacity); - currentTileOpacity = surfaceTile.opacity; - } - } - - this.applyTileState(dc, terrainTile, surfaceTile); - terrain.renderTile(dc, terrainTile); - ++tileCount; - } - } - } - } - catch (e) { - console.log(e); - } - finally { - terrain.endRenderingTile(dc, terrainTile); - } - } - } - catch (e) { - console.log(e); - } - finally { - terrain.endRendering(dc); - this.endRendering(dc); - dc.frameStatistics.incrementRenderedTileCount(tileCount); - } -}; - -// Intentionally not documented. -SurfaceTileRenderer.prototype.beginRendering = function (dc, opacity) { - var gl = dc.currentGlContext, - program = dc.findAndBindProgram(SurfaceTileRendererProgram); - - program.loadTexSampler(gl, gl.TEXTURE0); - - if (dc.pickingMode && !this.isSurfaceShapeTileRendering) { - program.loadModulateColor(gl, true); - } else { - program.loadModulateColor(gl, false); - program.loadOpacity(gl, opacity); - } - - return program; -}; - -// Intentionally not documented. -SurfaceTileRenderer.prototype.endRendering = function (dc) { - var gl = dc.currentGlContext; - gl.bindTexture(gl.TEXTURE_2D, null); -}; - -// Intentionally not documented. -SurfaceTileRenderer.prototype.applyTileState = function (dc, terrainTile, surfaceTile) { - // Sets up the texture transform and mask that applies the texture tile to the terrain tile. - var gl = dc.currentGlContext, - program = dc.currentProgram, - terrainSector = terrainTile.sector, - terrainDeltaLat = terrainSector.deltaLatitude(), - terrainDeltaLon = terrainSector.deltaLongitude(), - surfaceSector = surfaceTile.sector, - rawSurfaceDeltaLat = surfaceSector.deltaLatitude(), - rawSurfaceDeltaLon = surfaceSector.deltaLongitude(), - surfaceDeltaLat = rawSurfaceDeltaLat > 0 ? rawSurfaceDeltaLat : 1, - surfaceDeltaLon = rawSurfaceDeltaLon > 0 ? rawSurfaceDeltaLon : 1, - sScale = terrainDeltaLon / surfaceDeltaLon, - tScale = terrainDeltaLat / surfaceDeltaLat, - sTrans = -(surfaceSector.minLongitude - terrainSector.minLongitude) / surfaceDeltaLon, - tTrans = -(surfaceSector.minLatitude - terrainSector.minLatitude) / surfaceDeltaLat; - - this.texMaskMatrix.set( - sScale, 0, 0, sTrans, - 0, tScale, 0, tTrans, - 0, 0, 1, 0, - 0, 0, 0, 1 - ); - - this.texSamplerMatrix.setToUnitYFlip(); - surfaceTile.applyInternalTransform(dc, this.texSamplerMatrix); - this.texSamplerMatrix.multiplyMatrix(this.texMaskMatrix); - - program.loadTexSamplerMatrix(gl, this.texSamplerMatrix); - program.loadTexMaskMatrix(gl, this.texMaskMatrix); -}; - -export default SurfaceTileRenderer; diff --git a/web/src/gis/render/TextRenderer.js b/web/src/gis/render/TextRenderer.js deleted file mode 100644 index 176c0182..00000000 --- a/web/src/gis/render/TextRenderer.js +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TextRenderer - */ -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import Color from '../util/Color'; -import Font from '../util/Font'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Texture from '../render/Texture'; -import Vec2 from '../geom/Vec2'; - - -/** - * Constructs a TextRenderer instance. - * @alias TextRenderer - * @constructor - * @classdesc Provides methods useful for displaying text. An instance of this class is attached to the - * WorldWindow {@link DrawContext} and is not intended to be used independently of that. Applications typically do - * not create instances of this class. - * @param {drawContext} drawContext The current draw context. Typically the same draw context that TextRenderer - * is attached to. - * @throws {ArgumentError} If the specified draw context is null or undefined. - */ -function TextRenderer(drawContext) { - if (!drawContext) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "TextRenderer", "constructor", - "missingDc")); - } - - // Internal use only. Intentionally not documented. - this.canvas2D = document.createElement("canvas"); - - // Internal use only. Intentionally not documented. - this.ctx2D = this.canvas2D.getContext("2d"); - - // Internal use only. Intentionally not documented. - this.dc = drawContext; - - /** - * Indicates if the text will feature an outline around its characters. - * @type {boolean} - */ - this.enableOutline = true; - - // Internal use only. Intentionally not documented. - this.lineSpacing = 0.15; // fraction of font size - - /** - * The color for the Text outline. - * Its default has half transparency to avoid visual artifacts that appear while fully opaque. - * @type {Color} - */ - this.outlineColor = new Color(0, 0, 0, 0.5); - - /** - * Indicates the text outline width (or thickness) in pixels. - * @type {number} - */ - this.outlineWidth = 4; - - /** - * The text color. - * @type {Color} - */ - this.textColor = new Color(1, 1, 1, 1); - - /** - * The text size, face and other characteristics, as described in [Font]{@link Font}. - * @type {Font} - */ - this.typeFace = new Font(14); -} - -/** - * Returns the width and height of a specified text string considering the current typeFace and outline usage. - * @param {string} text The text string. - * @returns {Vec2} A vector indicating the text's width and height, respectively, in pixels. - */ -TextRenderer.prototype.textSize = function (text) { - if (text.length === 0) { - return new Vec2(0, 0); - } - - this.ctx2D.font = this.typeFace.fontString; - - var lines = text.split("\n"), - height = lines.length * (this.typeFace.size * (1 + this.lineSpacing)), - maxWidth = 0; - - for (var i = 0; i < lines.length; i++) { - maxWidth = Math.max(maxWidth, this.ctx2D.measureText(lines[i]).width); - } - - if (this.enableOutline) { - maxWidth += this.outlineWidth; - height += this.outlineWidth; - } - - return new Vec2(maxWidth, height); -}; - -/** - * Creates a texture for a specified text string and current TextRenderer state. - * @param {String} text The text string. - * @returns {Texture} A texture for the specified text string. - */ -TextRenderer.prototype.renderText = function (text) { - if (text && text.length > 0) { - var canvas2D = this.drawText(text); - return new Texture(this.dc.currentGlContext, canvas2D); - } else { - return null; - } -}; - -/** - * Creates a 2D Canvas for a specified text string while considering current TextRenderer state in - * regards to outline usage and color, text color, typeface, and outline width. - * @param {String} text The text string. - * @returns {canvas2D} A 2D Canvas for the specified text string. - */ -TextRenderer.prototype.drawText = function (text) { - var ctx2D = this.ctx2D, - canvas2D = this.canvas2D, - textSize = this.textSize(text), - lines = text.split("\n"), - strokeOffset = this.enableOutline ? this.outlineWidth / 2 : 0, - pixelScale = this.dc.pixelScale; - - canvas2D.width = Math.ceil(textSize[0]) * pixelScale; - canvas2D.height = Math.ceil(textSize[1]) * pixelScale; - - ctx2D.scale(pixelScale, pixelScale); - ctx2D.font = this.typeFace.fontString; - ctx2D.textBaseline = "bottom"; - ctx2D.textAlign = this.typeFace.horizontalAlignment; - ctx2D.fillStyle = this.textColor.toCssColorString(); - ctx2D.strokeStyle = this.outlineColor.toCssColorString(); - ctx2D.lineWidth = this.outlineWidth; - ctx2D.lineCap = "round"; - ctx2D.lineJoin = "round"; - - if (this.typeFace.horizontalAlignment === "left") { - ctx2D.translate(strokeOffset, 0); - } else if (this.typeFace.horizontalAlignment === "right") { - ctx2D.translate(textSize[0] - strokeOffset, 0); - } else { - ctx2D.translate(textSize[0] / 2, 0); - } - - for (var i = 0; i < lines.length; i++) { - ctx2D.translate(0, this.typeFace.size * (1 + this.lineSpacing) + strokeOffset); - if (this.enableOutline) { - ctx2D.strokeText(lines[i], 0, 0); - } - ctx2D.fillText(lines[i], 0, 0); - } - - return canvas2D; -}; - -/** - * Calculates maximum line height based on the current typeFace and outline usage of TextRenderer. - * @returns {Vec2} A vector indicating the text's width and height, respectively, in pixels. - */ -TextRenderer.prototype.getMaxLineHeight = function () { - // Check underscore + capital E with acute accent - return this.textSize("_\u00c9")[1]; -}; - -/** - * Wraps the text based on width and height using new line delimiter - * @param {String} text The text to wrap. - * @param {Number} width The width in pixels. - * @param {Number} height The height in pixels. - * @returns {String} The wrapped text. - */ -TextRenderer.prototype.wrap = function (text, width, height) { - if (!text) { - throw new ArgumentError( - Logger.logMessage(Logger.WARNING, "TextRenderer", "wrap", "missing text")); - } - - var i; - - var lines = text.split("\n"); - var wrappedText = ""; - - // Wrap each line - for (i = 0; i < lines.length; i++) { - lines[i] = this.wrapLine(lines[i], width); - } - // Concatenate all lines in one string with new line separators - // between lines - not at the end - // Checks for height limit. - var currentHeight = 0; - var heightExceeded = false; - var maxLineHeight = this.getMaxLineHeight(); - for (i = 0; i < lines.length && !heightExceeded; i++) { - var subLines = lines[i].split("\n"); - for (var j = 0; j < subLines.length && !heightExceeded; j++) { - if (height <= 0 || currentHeight + maxLineHeight <= height) { - wrappedText += subLines[j]; - currentHeight += maxLineHeight + this.lineSpacing; - if (j < subLines.length - 1) { - wrappedText += '\n'; - } - } - else { - heightExceeded = true; - } - } - - if (i < lines.length - 1 && !heightExceeded) { - wrappedText += '\n'; - } - } - // Add continuation string if text truncated - if (heightExceeded) { - if (wrappedText.length > 0) { - wrappedText = wrappedText.substring(0, wrappedText.length - 1); - } - - wrappedText += "..."; - } - - return wrappedText; -}; - -/** - * Wraps a line of text based on width and height - * @param {String} text The text to wrap. - * @param {Number} width The width in pixels. - * @returns {String} The wrapped text. - */ -TextRenderer.prototype.wrapLine = function (text, width) { - var wrappedText = ""; - - // Single line - trim leading and trailing spaces - var source = text.trim(); - var lineBounds = this.textSize(source); - if (lineBounds[0] > width) { - // Split single line to fit preferred width - var line = ""; - var start = 0; - var end = source.indexOf(' ', start + 1); - while (start < source.length) { - if (end === -1) { - end = source.length; // last word - } - - // Extract a 'word' which is in fact a space and a word - var word = source.substring(start, end); - var linePlusWord = line + word; - if (this.textSize(linePlusWord)[0] <= width) { - // Keep adding to the current line - line += word; - } - else { - // Width exceeded - if (line.length !== 0) { - // Finish current line and start new one - wrappedText += line; - wrappedText += '\n'; - line = ""; - line += word.trim(); // get read of leading space(s) - } - else { - // Line is empty, force at least one word - line += word.trim(); - } - } - // Move forward in source string - start = end; - if (start < source.length - 1) { - end = source.indexOf(' ', start + 1); - } - } - // Gather last line - wrappedText += line; - } - else { - // Line doesn't need to be wrapped - wrappedText += source; - } - - return wrappedText; -}; - -export default TextRenderer; diff --git a/web/src/gis/render/Texture.js b/web/src/gis/render/Texture.js deleted file mode 100644 index 37ddeca2..00000000 --- a/web/src/gis/render/Texture.js +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Texture - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a texture for a specified image. - * @alias Texture - * @constructor - * @classdesc Represents a WebGL texture. Applications typically do not interact with this class. - * @param {WebGLRenderingContext} gl The current WebGL rendering context. - * @param {Image} image The texture's image. - * @param {GLenum} wrapMode Optional. Specifies the wrap mode of the texture. Defaults to gl.CLAMP_TO_EDGE - * @throws {ArgumentError} If the specified WebGL context or image is null or undefined. - */ -function Texture(gl, image, wrapMode) { - - if (!gl) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Texture", "constructor", - "missingGlContext")); - } - - if (!image) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Texture", "constructor", - "missingImage")); - } - - if (!wrapMode) { - wrapMode = gl.CLAMP_TO_EDGE; - } - - var textureId = gl.createTexture(), - isPowerOfTwo = WWMath.isPowerOfTwo(image.width) && WWMath.isPowerOfTwo(image.height); - - this.originalImageWidth = image.width; - this.originalImageHeight = image.height; - - if (wrapMode === gl.REPEAT && !isPowerOfTwo) { - image = this.resizeImage(image); - isPowerOfTwo = true; - } - - this.imageWidth = image.width; - this.imageHeight = image.height; - this.size = image.width * image.height * 4; - - gl.bindTexture(gl.TEXTURE_2D, textureId); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, - isPowerOfTwo ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR); - - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapMode); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapMode); - - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1); - gl.texImage2D(gl.TEXTURE_2D, 0, - gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); - - if (isPowerOfTwo) { - gl.generateMipmap(gl.TEXTURE_2D); - } - - this.textureId = textureId; - - /** - * The time at which this texture was created. - * @type {Date} - */ - this.creationTime = new Date(); - - // Internal use only. Intentionally not documented. - this.texParameters = {}; - - // Internal use only. Intentionally not documented. - // https://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotrop - this.anisotropicFilterExt = gl.getExtension("EXT_texture_filter_anisotropic") || - gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic"); -} - -/** - * Sets a texture parameter to apply when binding this texture. - * - * Currently only gl.TEXTURE_MAG_FILTER has an effect. - * - * @param {Glenum} name The name of the parameter - * @param {GLint} value The value for this parameter - */ -Texture.prototype.setTexParameter = function (name, value) { - this.texParameters[name] = value; -}; - -/** - * Returns the value of a texture parameter to be assigned to this texture. - * @param {Glenum} name The name of the parameter - * @returns {GLint} The value for this parameter - */ -Texture.prototype.getTexParameter = function (name) { - return this.texParameters[name]; -}; - -/** - * Clears the list of texture parameters to apply when binding this texture. - */ -Texture.prototype.clearTexParameters = function () { - this.texParameters = {}; -}; - -/** - * Disposes of the WebGL texture object associated with this texture. - * @param gl - */ -Texture.prototype.dispose = function (gl) { - gl.deleteTexture(this.textureId); - delete this.textureId; -}; - -/** - * Binds this texture in the current WebGL graphics context. - * @param {DrawContext} dc The current draw context. - */ -Texture.prototype.bind = function (dc) { - var gl = dc.currentGlContext; - - gl.bindTexture(gl.TEXTURE_2D, this.textureId); - - this.applyTexParameters(dc); - - dc.frameStatistics.incrementTextureLoadCount(1); - return true; -}; - -/** - * Applies the configured texture parameters to the OpenGL context. - * @param {DrawContext} dc The current draw context. - */ -Texture.prototype.applyTexParameters = function (dc) { - var gl = dc.currentGlContext; - - // Configure the OpenGL texture magnification function. Use linear by default. - var textureMagFilter = this.texParameters[gl.TEXTURE_MAG_FILTER] || gl.LINEAR; - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, textureMagFilter); - - // Try to enable the anisotropic texture filtering only if we have a linear magnification filter. - // This can't be enabled all the time because Windows seems to ignore the TEXTURE_MAG_FILTER parameter when - // this extension is enabled. - if (textureMagFilter === gl.LINEAR) { - // Setup 4x anisotropic texture filtering when this feature is available. - if (this.anisotropicFilterExt) { - gl.texParameteri(gl.TEXTURE_2D, this.anisotropicFilterExt.TEXTURE_MAX_ANISOTROPY_EXT, 4); - } - } -}; - -/** - * Resizes an image to a power of two. - * @param {Image} image The image to resize. - */ -Texture.prototype.resizeImage = function (image) { - var canvas = document.createElement("canvas"); - canvas.width = WWMath.powerOfTwoFloor(image.width); - canvas.height = WWMath.powerOfTwoFloor(image.height); - var ctx = canvas.getContext("2d"); - ctx.drawImage(image, 0, 0, canvas.width, canvas.height); - return canvas; -}; - - -export default Texture; diff --git a/web/src/gis/render/TextureTile.js b/web/src/gis/render/TextureTile.js deleted file mode 100644 index 42337867..00000000 --- a/web/src/gis/render/TextureTile.js +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TextureTile - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Tile from '../util/Tile'; - - -/** - * Constructs a texture tile. - * @alias TextureTile - * @constructor - * @augments Tile - * @classdesc Represents an image applied to a portion of a globe's terrain. Applications typically do not - * interact with this class. - * @param {Sector} sector The sector this tile covers. - * @param {Level} level The level this tile is associated with. - * @param {Number} row This tile's row in the associated level. - * @param {Number} column This tile's column in the associated level. - * @throws {ArgumentError} If the specified sector or level is null or undefined, the row or column arguments - * are less than zero, or the specified image path is null, undefined or empty. - * - */ -function TextureTile(sector, level, row, column) { - Tile.call(this, sector, level, row, column); // args are checked in the superclass' constructor - - /** - * GPU cache key - * @type {string} - */ - this.gpuCacheKey = null; -} - -TextureTile.prototype = Object.create(Tile.prototype); - -/** - * Returns the size of the this tile in bytes. - * @returns {Number} The size of this tile in bytes, not including the associated texture size. - */ -TextureTile.prototype.size = function () { - return Tile.prototype.size.call(this); -}; - -/** - * Causes this tile's texture to be active. Implements [SurfaceTile.bind]{@link SurfaceTile#bind}. - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if the texture was bound successfully, otherwise false. - */ -TextureTile.prototype.bind = function (dc) { - var texture = dc.gpuResourceCache.resourceForKey(this.gpuCacheKey); - if (texture) { - return texture.bind(dc); - } - - return false; -}; - -/** - * If this tile's fallback texture is used, applies the appropriate texture transform to a specified matrix. - * Otherwise, this is a no-op. - * @param {DrawContext} dc The current draw context. - * @param {Matrix} matrix The matrix to apply the transform to. - */ -TextureTile.prototype.applyInternalTransform = function (dc, matrix) { - // Override this method if the tile has a fallback texture. -}; - -export default TextureTile; diff --git a/web/src/gis/shaders/AtmosphereProgram.js b/web/src/gis/shaders/AtmosphereProgram.js deleted file mode 100644 index 080435d7..00000000 --- a/web/src/gis/shaders/AtmosphereProgram.js +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AtmosphereProgram - */ -import ArgumentError from '../error/ArgumentError'; -import GpuProgram from '../shaders/GpuProgram'; -import Logger from '../util/Logger'; - - -/** - * Constructs a new program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. - * This method then compiles the shaders and then links the program if compilation is successful. - * - * @alias AtmosphereProgram - * @constructor - * @augments GpuProgram - * @classdesc AtmosphereProgram is a GLSL program that draws the atmosphere. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @throws {ArgumentError} If the shaders cannot be compiled, or linking of - * the compiled shaders into a program fails. - */ -function AtmosphereProgram(gl, vertexShaderSource, fragmentShaderSource, attribute) { - - // Call to the superclass, which performs shader program compiling and linking. - GpuProgram.call(this, gl, vertexShaderSource, fragmentShaderSource, attribute); - - - // Frag color mode indicates the atmospheric scattering color components written to the fragment color. - this.FRAGMODE_SKY = 1; - this.FRAGMODE_GROUND_PRIMARY = 2; - this.FRAGMODE_GROUND_SECONDARY = 3; - this.FRAGMODE_GROUND_PRIMARY_TEX_BLEND = 4; - - /** - * The globe's atmosphere altitude. - * @type {Number} - * @default 160000.0 meters - */ - this.altitude = 160000; - - /** - * This atmosphere's Rayleigh scale depth. - * @type {Number} - * @default 0.25 - */ - this.rayleighScaleDepth = 0.25; - - /** - * The WebGL location for this program's 'fragMode' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.fragModeLocation = this.uniformLocation(gl, "fragMode"); - - /** - * The WebGL location for this program's 'mvpMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.mvpMatrixLocation = this.uniformLocation(gl, "mvpMatrix"); - - /** - * The WebGL location for this program's 'texCoordMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.texCoordMatrixLocation = this.uniformLocation(gl, "texCoordMatrix"); - - /** - * The WebGL location for this program's 'vertexOrigin' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.vertexOriginLocation = this.uniformLocation(gl, "vertexOrigin"); - - /** - * The WebGL location for this program's 'eyePoint' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.eyePointLocation = this.uniformLocation(gl, "eyePoint"); - - /** - * The WebGL location for this program's 'eyeMagnitude' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.eyeMagnitudeLocation = this.uniformLocation(gl, "eyeMagnitude"); - - /** - * The WebGL location for this program's 'eyeMagnitude2' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.eyeMagnitude2Location = this.uniformLocation(gl, "eyeMagnitude2"); - - /** - * The WebGL location for this program's 'lightDirection' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.lightDirectionLocation = this.uniformLocation(gl, "lightDirection"); - - /** - * The WebGL location for this program's 'atmosphereRadius' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.atmosphereRadiusLocation = this.uniformLocation(gl, "atmosphereRadius"); - - /** - * The WebGL location for this program's 'atmosphereRadius2' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.atmosphereRadius2Location = this.uniformLocation(gl, "atmosphereRadius2"); - - /** - * The WebGL location for this program's 'globeRadius' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.globeRadiusLocation = this.uniformLocation(gl, "globeRadius"); - - /** - * The WebGL location for this program's 'scale' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.scaleLocation = this.uniformLocation(gl, "scale"); - - /** - * The WebGL location for this program's 'scaleDepth' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.scaleDepthLocation = this.uniformLocation(gl, "scaleDepth"); - - /** - * The WebGL location for this program's 'scaleOverScaleDepth' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.scaleOverScaleDepthLocation = this.uniformLocation(gl, "scaleOverScaleDepth"); - - this.scratchArray9 = new Float32Array(9); -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -AtmosphereProgram.key = "WorldWindGpuAtmosphereProgram"; - -// Inherit from GpuProgram. -AtmosphereProgram.prototype = Object.create(GpuProgram.prototype); - -/** - * Returns the atmosphere's altitude. - * @returns {Number} The atmosphere's altitude in meters. - */ -AtmosphereProgram.prototype.getAltitude = function () { - return this.altitude; -}; - -/** - * Loads the specified number as the value of this program's 'fragMode' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} fragMode The frag mode value. - * @throws {ArgumentError} If the specified number is null or undefined. - */ -AtmosphereProgram.prototype.loadFragMode = function (gl, fragMode) { - if (!fragMode) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadFragMode", "missingFragMode")); - } - - gl.uniform1i(this.fragModeLocation, fragMode); -}; - -/** - * Loads the specified matrix as the value of this program's 'mvpMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -AtmosphereProgram.prototype.loadModelviewProjection = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadModelviewProjection", - "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.mvpMatrixLocation); -}; - -/** - * Loads the specified vector as the value of this program's 'vertexOrigin' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Vec3} vector The vector to load. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -AtmosphereProgram.prototype.loadVertexOrigin = function (gl, vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadVertexOrigin", "missingVector")); - } - - gl.uniform3f(this.vertexOriginLocation, vector[0], vector[1], vector[2]); -}; - -/** - * Loads the specified vector as the value of this program's 'lightDirection' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Vec3} vector The vector to load. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -AtmosphereProgram.prototype.loadLightDirection = function (gl, vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadLightDirection", "missingVector")); - } - - gl.uniform3f(this.lightDirectionLocation, vector[0], vector[1], vector[2]); -}; - -/** - * Loads the specified vector as the value of this program's 'lightDirection' uniform variable, - * the magnitude's specified vector as the value of this program's 'eyeMagnitude' uniform variable and - * the squared magnitude's specified vector as the value of this program's 'eyeMagnitude2' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Vec3} vector The vector to load. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -AtmosphereProgram.prototype.loadEyePoint = function (gl, vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadEyePoint", "missingVector")); - } - - gl.uniform3f(this.eyePointLocation, vector[0], vector[1], vector[2]); - gl.uniform1f(this.eyeMagnitudeLocation, vector.magnitude()); - gl.uniform1f(this.eyeMagnitude2Location, vector.magnitudeSquared()); -}; - -/** - * Loads the specified number as the value of this program's 'globeRadius' uniform variable and the specified - * number which add the altitude value as the value of this program's 'atmosphereRadius' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} globeRadius The globe radius value. - * @throws {ArgumentError} If the specified number is null or undefined. - */ -AtmosphereProgram.prototype.loadGlobeRadius = function (gl, globeRadius) { - if (!globeRadius) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadGlobeRadius", - "missingGlobeRadius")); - } - - var gr = globeRadius; - var ar = gr + this.altitude; - - gl.uniform1f(this.globeRadiusLocation, gr); - gl.uniform1f(this.atmosphereRadiusLocation, ar); - gl.uniform1f(this.atmosphereRadius2Location, ar * ar); -}; - -/** - * Sets the program's 'scale', 'scaleDepth' and 'scaleOverScaleDepth' uniform variables. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - */ -AtmosphereProgram.prototype.setScale = function (gl) { - gl.uniform1f(this.scaleLocation, 1 / this.getAltitude()); - gl.uniform1f(this.scaleDepthLocation, this.rayleighScaleDepth); - gl.uniform1f(this.scaleOverScaleDepthLocation, 1 / this.getAltitude() / this.rayleighScaleDepth); -}; - -/** - * Loads the specified matrix as the value of this program's 'texCoordMatrix' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix3} matrix The texture coordinate matrix. - */ -AtmosphereProgram.prototype.loadTexMatrix = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AtmosphereProgram", "loadTexMatrix", - "missingMatrix")); - } - - matrix.columnMajorComponents(this.scratchArray9); - gl.uniformMatrix3fv(this.texCoordMatrixLocation, false, this.scratchArray9); -}; - -export default AtmosphereProgram; diff --git a/web/src/gis/shaders/BasicProgram.js b/web/src/gis/shaders/BasicProgram.js deleted file mode 100644 index 98c8a83e..00000000 --- a/web/src/gis/shaders/BasicProgram.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports BasicProgram - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import GpuProgram from '../shaders/GpuProgram'; -import Logger from '../util/Logger'; -import BasicVertex from './glsl/basic_vertex.glsl'; -import BasicFragment from './glsl/basic_fragment.glsl'; - -/** - * Constructs a new program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. This - * method then compiles the shaders and then links the program if compilation is successful. Use the bind method to make the - * program current during rendering. - * - * @alias BasicProgram - * @constructor - * @augments GpuProgram - * @classdesc BasicProgram is a GLSL program that draws geometry in a solid color. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @throws {ArgumentError} If the shaders cannot be compiled, or linking of - * the compiled shaders into a program fails. - */ -function BasicProgram(gl) { - var vertexShaderSource = BasicVertex, - fragmentShaderSource = BasicFragment; - - // Call to the superclass, which performs shader program compiling and linking. - GpuProgram.call(this, gl, vertexShaderSource, fragmentShaderSource); - - /** - * The WebGL location for this program's 'vertexPoint' attribute. - * @type {Number} - * @readonly - */ - this.vertexPointLocation = this.attributeLocation(gl, "vertexPoint"); - - /** - * The WebGL location for this program's 'mvpMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.mvpMatrixLocation = this.uniformLocation(gl, "mvpMatrix"); - - /** - * The WebGL location for this program's 'color' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.colorLocation = this.uniformLocation(gl, "color"); -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -BasicProgram.key = "WorldWindGpuBasicProgram"; - -// Inherit from GpuProgram. -BasicProgram.prototype = Object.create(GpuProgram.prototype); - -/** - * Loads the specified matrix as the value of this program's 'mvpMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -BasicProgram.prototype.loadModelviewProjection = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BasicProgram", "loadModelviewProjection", "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.mvpMatrixLocation); -}; - -/** - * Loads the specified color as the value of this program's 'color' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Color} color The color to load. - * @throws {ArgumentError} If the specified color is null or undefined. - */ -BasicProgram.prototype.loadColor = function (gl, color) { - if (!color) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BasicProgram", "loadColor", "missingColor")); - } - - this.loadUniformColor(gl, color, this.colorLocation); -}; - -/** - * Loads the specified RGBA color components as the value of this program's 'color' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} red The red component, a number between 0 and 1. - * @param {Number} green The green component, a number between 0 and 1. - * @param {Number} blue The blue component, a number between 0 and 1. - * @param {Number} alpha The alpha component, a number between 0 and 1. - */ -BasicProgram.prototype.loadColorComponents = function (gl, red, green, blue, alpha) { - this.loadUniformColorComponents(gl, red, green, blue, alpha, this.colorLocation); -}; - -export default BasicProgram; diff --git a/web/src/gis/shaders/BasicTextureProgram.js b/web/src/gis/shaders/BasicTextureProgram.js deleted file mode 100644 index 1bb6bb67..00000000 --- a/web/src/gis/shaders/BasicTextureProgram.js +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports BasicTextureProgram - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import GpuProgram from '../shaders/GpuProgram'; -import Logger from '../util/Logger'; -import BasicTextureVertex from './glsl/basic_texture_vertex.glsl'; -import BasicTextureFragment from './glsl/basic_texture_fragment.glsl'; - -/** - * Constructs a new program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. This - * method then compiles the shaders and then links the program if compilation is successful. Use the bind method to make the - * program current during rendering. - * - * @alias BasicTextureProgram - * @constructor - * @augments GpuProgram - * @classdesc BasicTextureProgram is a GLSL program that draws textured or untextured geometry. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @throws {ArgumentError} If the shaders cannot be compiled, or if linking of - * the compiled shaders into a program fails. - */ -function BasicTextureProgram(gl) { - var vertexShaderSource = BasicTextureVertex, - fragmentShaderSource = BasicTextureFragment; - - // Specify bindings to avoid the WebGL performance warning that's generated when normalVector gets - // bound to location 0. - var bindings = ["vertexPoint", "normalVector", "vertexTexCoord"]; - - // Call to the superclass, which performs shader program compiling and linking. - GpuProgram.call(this, gl, vertexShaderSource, fragmentShaderSource, bindings); - - /** - * The WebGL location for this program's 'vertexPoint' attribute. - * @type {Number} - * @readonly - */ - this.vertexPointLocation = this.attributeLocation(gl, "vertexPoint"); - - /** - * The WebGL location for this program's 'normalVector' attribute. - * @type {Number} - * @readonly - */ - this.normalVectorLocation = this.attributeLocation(gl, "normalVector"); - - /** - * The WebGL location for this program's 'vertexTexCoord' attribute. - * @type {Number} - * @readonly - */ - this.vertexTexCoordLocation = this.attributeLocation(gl, "vertexTexCoord"); - - /** - * The WebGL location for this program's 'mvpMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.mvpMatrixLocation = this.uniformLocation(gl, "mvpMatrix"); - - /** - * The WebGL location for this program's 'mvInverseMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.mvInverseMatrixLocation = this.uniformLocation(gl, "mvInverseMatrix"); - - /** - * The WebGL location for this program's 'color' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.colorLocation = this.uniformLocation(gl, "color"); - - /** - * The WebGL location for this program's 'enableTexture' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.textureEnabledLocation = this.uniformLocation(gl, "enableTexture"); - - /** - * The WebGL location for this program's 'modulateColor' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.modulateColorLocation = this.uniformLocation(gl, "modulateColor"); - - /** - * The WebGL location for this program's 'textureSampler' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.textureUnitLocation = this.uniformLocation(gl, "textureSampler"); - - /** - * The WebGL location for this program's 'texCoordMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.textureMatrixLocation = this.uniformLocation(gl, "texCoordMatrix"); - - /** - * The WebGL location for this program's 'opacity' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.opacityLocation = this.uniformLocation(gl, "opacity"); - - /** - * The WegGL location for this program's 'enableLighting' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.applyLightingLocation = this.uniformLocation(gl, "applyLighting"); -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -BasicTextureProgram.key = "WorldWindGpuBasicTextureProgram"; - -// Inherit from GpuProgram. -BasicTextureProgram.prototype = Object.create(GpuProgram.prototype); - -/** - * Loads the specified matrix as the value of this program's 'mvInverseMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -BasicTextureProgram.prototype.loadModelviewInverse = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BasicTextureProgram", "loadModelviewInverse", "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.mvInverseMatrixLocation); -}; - -/** - * Loads the specified matrix as the value of this program's 'mvpMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -BasicTextureProgram.prototype.loadModelviewProjection = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BasicTextureProgram", "loadModelviewProjection", "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.mvpMatrixLocation); -}; - -/** - * Loads the specified color as the value of this program's 'color' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Color} color The color to load. - * @throws {ArgumentError} If the specified color is null or undefined. - */ -BasicTextureProgram.prototype.loadColor = function (gl, color) { - if (!color) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "BasicTextureProgram", "loadColor", "missingColor")); - } - - this.loadUniformColor(gl, color, this.colorLocation); -}; - -/** - * Loads the specified boolean as the value of this program's 'enableTexture' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Boolean} enable true to enable texturing, false to disable texturing. - */ -BasicTextureProgram.prototype.loadTextureEnabled = function (gl, enable) { - gl.uniform1i(this.textureEnabledLocation, enable ? 1 : 0); -}; - -/** - * Loads the specified boolean as the value of this program's 'modulateColor' uniform variable. When this - * value is true and the value of the textureEnabled variable is true, the color uniform of this shader is - * multiplied by the rounded alpha component of the texture color at each fragment. This causes the color - * to be either fully opaque or fully transparent depending on the value of the texture color's alpha value. - * This is used during picking to replace opaque or mostly opaque texture colors with the pick color, and - * to make all other texture colors transparent. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Boolean} enable true to enable modulation, false to disable modulation. - */ -BasicTextureProgram.prototype.loadModulateColor = function (gl, enable) { - gl.uniform1i(this.modulateColorLocation, enable ? 1 : 0); -}; - -/** - * Loads the specified number as the value of this program's 'textureSampler' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} unit The texture unit. - */ -BasicTextureProgram.prototype.loadTextureUnit = function (gl, unit) { - gl.uniform1i(this.textureUnitLocation, unit - gl.TEXTURE0); -}; - -/** - * Loads the specified matrix as the value of this program's 'texCoordMatrix' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The texture coordinate matrix. - */ -BasicTextureProgram.prototype.loadTextureMatrix = function (gl, matrix) { - this.loadUniformMatrix(gl, matrix, this.textureMatrixLocation); -}; - -/** - * Loads the specified number as the value of this program's 'opacity' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} opacity The opacity in the range [0, 1]. - */ -BasicTextureProgram.prototype.loadOpacity = function (gl, opacity) { - gl.uniform1f(this.opacityLocation, opacity); -}; - -/** - * Loads the specified boolean as the value of this program's 'applyLighting' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} applyLighting true to apply lighting, otherwise false. - */ -BasicTextureProgram.prototype.loadApplyLighting = function (gl, applyLighting) { - gl.uniform1i(this.applyLightingLocation, applyLighting); -}; - -export default BasicTextureProgram; diff --git a/web/src/gis/shaders/GpuProgram.js b/web/src/gis/shaders/GpuProgram.js deleted file mode 100644 index a149779b..00000000 --- a/web/src/gis/shaders/GpuProgram.js +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GpuProgram - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import GpuShader from '../shaders/GpuShader'; -import Logger from '../util/Logger'; - - -/** - * Constructs a GPU program with specified source code for vertex and fragment shaders. - * This constructor is intended to be called only by subclasses. - * <p> - * This constructor creates WebGL shaders for the specified shader sources and attaches them to a new GLSL - * program. The method compiles the shaders and then links the program if compilation is successful. Use the - * [DrawContext.bindProgram]{@link DrawContext#bindProgram} function to make the program current during rendering. - * - * @alias GpuProgram - * @constructor - * @classdesc - * Represents an OpenGL shading language (GLSL) shader program and provides methods for identifying and - * accessing shader variables. Shader programs are created by instances of this class and made current when the - * DrawContext.bindProgram function is invoked. - * <p> - * This is an abstract class and not intended to be created directly. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {String} vertexShaderSource The source code for the vertex shader. - * @param {String} fragmentShaderSource The source code for the fragment shader. - * @param {String[]} attributeBindings An array of attribute variable names whose bindings are to be explicitly - * specified. Each name is bound to its corresponding index in the array. May be null, in which case the - * linker determines all the bindings. - * @throws {ArgumentError} If either source is null or undefined, the shaders cannot be compiled, or linking of - * the compiled shaders into a program fails. - */ -function GpuProgram(gl, vertexShaderSource, fragmentShaderSource, attributeBindings) { - if (!vertexShaderSource || !fragmentShaderSource) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "constructor", - "The specified shader source is null or undefined.")); - } - - var program, vShader, fShader; - - try { - vShader = new GpuShader(gl, gl.VERTEX_SHADER, vertexShaderSource); - fShader = new GpuShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource); - } catch (e) { - if (vShader) - vShader.dispose(gl); - if (fShader) - fShader.dispose(gl); - - throw e; - } - - program = gl.createProgram(); - if (!program) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "constructor", - "Unable to create shader program.")); - } - - gl.attachShader(program, vShader.shaderId); - gl.attachShader(program, fShader.shaderId); - - if (attributeBindings) { - for (var i = 0, len = attributeBindings.length; i < len; i++) { - gl.bindAttribLocation(program, i, attributeBindings[i]); - } - } - - if (!this.link(gl, program)) { - // Get the info log before deleting the program. - var infoLog = gl.getProgramInfoLog(program); - - gl.detachShader(program, vShader.shaderId); - gl.detachShader(program, fShader.shaderId); - gl.deleteProgram(program); - vShader.dispose(gl); - fShader.dispose(gl); - - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "constructor", - "Unable to link shader program: " + infoLog)); - } - - /** - * Indicates the WebGL program object associated with this GPU program. - * @type {WebGLProgram} - * @readonly - */ - this.programId = program; - - // Internal. Intentionally not documented. These will be filled in as attribute locations are requested. - this.attributeLocations = {}; - this.uniformLocations = {}; - - // Internal. Intentionally not documented. - this.vertexShader = vShader; - - // Internal. Intentionally not documented. - this.fragmentShader = fShader; - - // Internal. Intentionally not documented. - this.size = vertexShaderSource.length + fragmentShaderSource.length; - - // Internal. Intentionally not documented. - this.scratchArray = new Float32Array(16); -} - -/** - * Releases this GPU program's WebGL program and associated shaders. Upon return this GPU program's WebGL - * program ID is 0 as is that of the associated shaders. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - */ -GpuProgram.prototype.dispose = function (gl) { - if (this.programId) { - if (this.vertexShader) { - gl.detachShader(this.programId, this.vertexShader.shaderId); - } - if (this.fragmentShader) { - gl.detachShader(this.programId, this.fragmentShader.shaderId); - } - - gl.deleteProgram(this.programId); - delete this.programId; - } - - if (this.vertexShader) { - this.vertexShader.dispose(gl); - delete this.vertexShader; - } - - if (this.fragmentShader) { - this.fragmentShader.dispose(gl); - delete this.fragmentShader; - } - - this.attributeLocations = {}; - this.uniformLocations = {}; -}; - -/** - * Returns the GLSL attribute location of a specified attribute name. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {String} attributeName The name of the attribute whose location is determined. - * @returns {Number} The WebGL attribute location of the specified attribute, or -1 if the attribute is not - * found. - * @throws {ArgumentError} If the specified attribute name is null, empty or undefined. - */ -GpuProgram.prototype.attributeLocation = function (gl, attributeName) { - if (!attributeName || attributeName.length == 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "attributeLocation", - "The specified attribute name is null, undefined or empty.")); - } - - var location = this.attributeLocations[attributeName]; - if (!location) { - location = gl.getAttribLocation(this.programId, attributeName); - this.attributeLocations[attributeName] = location; - } - - return location; -}; - -/** - * Returns the GLSL uniform location of a specified uniform name. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {String} uniformName The name of the uniform variable whose location is determined. - * @returns {WebGLUniformLocation} The WebGL uniform location of the specified uniform variable, - * or -1 if the uniform is not found. - * @throws {ArgumentError} If the specified uniform name is null, empty or undefined. - */ -GpuProgram.prototype.uniformLocation = function (gl, uniformName) { - if (!uniformName || uniformName.length == 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "uniformLocation", - "The specified uniform name is null, undefined or empty.")); - } - - var location = this.uniformLocations[uniformName]; - if (!location) { - location = gl.getUniformLocation(this.programId, uniformName); - this.uniformLocations[uniformName] = location; - } - - return location; -}; - -/** - * Links a specified GLSL program. This method is not meant to be called by applications. It is called - * internally as needed. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {WebGLProgram} program The WebGL program. - * @returns {Boolean} true if linking was successful, otherwise false. - * @protected - */ -GpuProgram.prototype.link = function (gl, program) { - gl.linkProgram(program); - - return gl.getProgramParameter(program, gl.LINK_STATUS); -}; - -/** - * Loads a specified matrix as the value of a GLSL 4x4 matrix uniform variable with the specified location. - * <p> - * This functions converts the matrix into column-major order prior to loading its components into the GLSL - * uniform variable, but does not modify the specified matrix. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @param {WebGLUniformLocation} location The location of the uniform variable in the currently bound GLSL program. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -GpuProgram.prototype.loadUniformMatrix = function (gl, matrix, location) { - if (!matrix) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "loadUniformMatrix", - "missingMatrix")); - } - - var columnMajorArray = matrix.columnMajorComponents(this.scratchArray); - gl.uniformMatrix4fv(location, false, columnMajorArray); -}; - -/** - * Loads a specified color as the value of a GLSL vec4 uniform variable with the specified location. - * <p> - * This function multiplies the red, green and blue components by the alpha component prior to loading the color - * in the GLSL uniform variable, but does not modify the specified color. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Color} color The color to load. - * @param {WebGLUniformLocation} location The location of the uniform variable in the currently bound GLSL program. - * @throws {ArgumentError} If the specified color is null or undefined. - */ -GpuProgram.prototype.loadUniformColor = function (gl, color, location) { - if (!color) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuProgram", "loadUniformColor", - "missingColor")); - } - - var premul = color.premultipliedComponents(this.scratchArray); - gl.uniform4f(location, premul[0], premul[1], premul[2], premul[3]); -}; - -/** - * Loads the specified RGBA color components as the value of a GLSL vec4 uniform variable with the specified - * location. - * <p> - * This function multiplies the red, green and blue components by the alpha component prior to loading the color - * in the GLSL uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} red The red component, a number between 0 and 1. - * @param {Number} green The green component, a number between 0 and 1. - * @param {Number} blue The blue component, a number between 0 and 1. - * @param {Number} alpha The alpha component, a number between 0 and 1. - * @param {WebGLUniformLocation} location The location of the uniform variable in the currently bound GLSL program. - */ -GpuProgram.prototype.loadUniformColorComponents = function (gl, red, green, blue, alpha, location) { - gl.uniform4f(location, red * alpha, green * alpha, blue * alpha, alpha); -}; - -export default GpuProgram; diff --git a/web/src/gis/shaders/GpuShader.js b/web/src/gis/shaders/GpuShader.js deleted file mode 100644 index 85a4b1eb..00000000 --- a/web/src/gis/shaders/GpuShader.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GpuShader - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs a GPU shader of a specified type with specified GLSL source code. - * - * @alias GpuShader - * @constructor - * @classdesc - * Represents an OpenGL shading language (GLSL) shader and provides methods for compiling and disposing - * of them. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} shaderType The type of shader, either WebGLRenderingContext.VERTEX_SHADER - * or WebGLRenderingContext.FRAGMENT_SHADER. - * @param {String} shaderSource The shader's source code. - * @throws {ArgumentError} If the shader type is unrecognized, the shader source is null or undefined or shader - * compilation fails. If the compilation fails the error thrown contains any compilation messages. - */ -function GpuShader(gl, shaderType, shaderSource) { - if (!(shaderType === gl.VERTEX_SHADER - || shaderType === gl.FRAGMENT_SHADER)) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuShader", "constructor", - "The specified shader type is unrecognized.")); - } - - if (!shaderSource) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuShader", "constructor", - "The specified shader source is null or undefined.")); - } - - var shader = gl.createShader(shaderType); - if (!shader) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuShader", "constructor", - "Unable to create shader of type " + - (shaderType == gl.VERTEX_SHADER ? "VERTEX_SHADER." : "FRAGMENT_SHADER."))); - } - - if (!this.compile(gl, shader, shaderType, shaderSource)) { - var infoLog = gl.getShaderInfoLog(shader); - - gl.deleteShader(shader); - - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GpuShader", "constructor", - "Unable to compile shader: " + infoLog)); - } - - this.shaderId = shader; -} - -/** - * Compiles the source code for this shader. This method is not meant to be invoked by applications. It is - * invoked internally as needed. - * @param {WebGLRenderingContext} gl The current WebGL rendering context. - * @param {WebGLShader} shaderId The shader ID. - * @param {Number} shaderType The type of shader, either WebGLRenderingContext.VERTEX_SHADER - * or WebGLRenderingContext.FRAGMENT_SHADER. - * @param {String} shaderSource The shader's source code. - * @returns {boolean} <code>true</code> if the shader compiled successfully, otherwise <code>false</code>. - */ -GpuShader.prototype.compile = function (gl, shaderId, shaderType, shaderSource) { - gl.shaderSource(shaderId, shaderSource); - gl.compileShader(shaderId); - - return gl.getShaderParameter(shaderId, gl.COMPILE_STATUS); -}; - -/** - * Releases this shader's WebGL shader. - * @param {WebGLRenderingContext} gl The current WebGL rendering context. - */ -GpuShader.prototype.dispose = function (gl) { - if (this.shaderId) { - gl.deleteShader(this.shaderId); - delete this.shaderId; - } -}; - -export default GpuShader; diff --git a/web/src/gis/shaders/GroundProgram.js b/web/src/gis/shaders/GroundProgram.js deleted file mode 100644 index dd765763..00000000 --- a/web/src/gis/shaders/GroundProgram.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GroundProgram - */ -import AtmosphereProgram from '../shaders/AtmosphereProgram'; -import GroundVertex from './glsl/ground_vertex.glsl'; -import GroundFragment from './glsl/ground_fragment.glsl'; - -/** - * Constructs a new program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. - * This method then compiles the shaders and then links the program if compilation is successful. Use the bind - * method to make the program current during rendering. - * - * @alias GroundProgram - * @constructor - * @augments AtmosphereProgram - * @classdesc GroundProgram is a GLSL program that draws the ground component of the atmosphere. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @throws {ArgumentError} If the shaders cannot be compiled, or linking of - * the compiled shaders into a program fails. - */ -function GroundProgram(gl) { - var vertexShaderSource = GroundVertex, - fragmentShaderSource = GroundFragment; - - // Call to the superclass, which performs shader program compiling and linking. - AtmosphereProgram.call(this, gl, vertexShaderSource, fragmentShaderSource, ["vertexPoint", "vertexTexCoord"]); -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -GroundProgram.key = "WorldWindGroundProgram"; - -// Inherit from AtmosphereProgram. -GroundProgram.prototype = Object.create(AtmosphereProgram.prototype); - -export default GroundProgram; - - - diff --git a/web/src/gis/shaders/SkyProgram.js b/web/src/gis/shaders/SkyProgram.js deleted file mode 100644 index 2be00430..00000000 --- a/web/src/gis/shaders/SkyProgram.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SkyProgram - */ -import AtmosphereProgram from '../shaders/AtmosphereProgram'; -import SkyVertex from './glsl/sky_vertex.glsl'; -import SkyFragment from './glsl/sky_fragment.glsl'; - -/** - * Constructs a new program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. - * This method then compiles the shaders and then links the program if compilation is successful. Use the bind - * method to make the program current during rendering. - * - * @alias SkyProgram - * @constructor - * @augments AtmosphereProgram - * @classdesc SkyProgram is a GLSL program that draws the sky component of the atmosphere. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @throws {ArgumentError} If the shaders cannot be compiled, or linking of - * the compiled shaders into a program fails. - */ -function SkyProgram(gl) { - var vertexShaderSource = SkyVertex, - fragmentShaderSource = SkyFragment; - - // Call to the superclass, which performs shader program compiling and linking. - AtmosphereProgram.call(this, gl, vertexShaderSource, fragmentShaderSource, ["vertexPoint"]); -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -SkyProgram.key = "WorldWindSkyProgram"; - -// Inherit from AtmosphereProgram. -SkyProgram.prototype = Object.create(AtmosphereProgram.prototype); - -export default SkyProgram; - - - - diff --git a/web/src/gis/shaders/StarFieldProgram.js b/web/src/gis/shaders/StarFieldProgram.js deleted file mode 100644 index cf95a6d9..00000000 --- a/web/src/gis/shaders/StarFieldProgram.js +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports StarFieldProgram - */ -import ArgumentError from '../error/ArgumentError'; -import GpuProgram from '../shaders/GpuProgram'; -import Logger from '../util/Logger'; -import StarFieldVertex from './glsl/star_field_vertex.glsl'; -import StarFieldFragment from './glsl/star_field_fragment.glsl'; - -/** - * Constructs a new program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. - * This method then compiles the shaders and then links the program if compilation is successful. - * Use the bind method to make the program current during rendering. - * - * @alias StarFieldProgram - * @constructor - * @augments GpuProgram - * @classdesc StarFieldProgram is a GLSL program that draws points representing stars. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @throws {ArgumentError} If the shaders cannot be compiled, or linking of the compiled shaders into a program - * fails. - */ -function StarFieldProgram(gl) { - var vertexShaderSource = StarFieldVertex, - fragmentShaderSource = StarFieldFragment; - - // Call to the superclass, which performs shader program compiling and linking. - GpuProgram.call(this, gl, vertexShaderSource, fragmentShaderSource, ["vertexPoint"]); - - /** - * The WebGL location for this program's 'vertexPoint' attribute. - * @type {Number} - * @readonly - */ - this.vertexPointLocation = this.attributeLocation(gl, "vertexPoint"); - - /** - * The WebGL location for this program's 'mvpMatrix' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.mvpMatrixLocation = this.uniformLocation(gl, "mvpMatrix"); - - /** - * The WebGL location for this program's 'numDays' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.numDaysLocation = this.uniformLocation(gl, "numDays"); - - /** - * The WebGL location for this program's 'magnitudeRangeLocation' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.magnitudeRangeLocation = this.uniformLocation(gl, "magnitudeRange"); - - /** - * The WebGL location for this program's 'textureSampler' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.textureUnitLocation = this.uniformLocation(gl, "textureSampler"); - - /** - * The WebGL location for this program's 'textureEnabled' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.textureEnabledLocation = this.uniformLocation(gl, "textureEnabled"); -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -StarFieldProgram.key = "WorldWindGpuStarFieldProgram"; - -// Inherit from GpuProgram. -StarFieldProgram.prototype = Object.create(GpuProgram.prototype); - -/** - * Loads the specified matrix as the value of this program's 'mvpMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -StarFieldProgram.prototype.loadModelviewProjection = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "StarFieldProgram", "loadModelviewProjection", "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.mvpMatrixLocation); -}; - -/** - * Loads the specified number as the value of this program's 'numDays' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} numDays The number of days (positive or negative) since Greenwich noon, Terrestrial Time, - * on 1 January 2000 (J2000.0) - * @throws {ArgumentError} If the specified number is null or undefined. - */ -StarFieldProgram.prototype.loadNumDays = function (gl, numDays) { - if (numDays == null) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "StarFieldProgram", "loadNumDays", "missingNumDays")); - } - gl.uniform1f(this.numDaysLocation, numDays); -}; - -/** - * Loads the specified numbers as the value of this program's 'magnitudeRange' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} minMag - * @param {Number} maxMag - * @throws {ArgumentError} If the specified numbers are null or undefined. - */ -StarFieldProgram.prototype.loadMagnitudeRange = function (gl, minMag, maxMag) { - if (minMag == null) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "StarFieldProgram", "loadMagRange", "missingMinMag")); - } - if (maxMag == null) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "StarFieldProgram", "loadMagRange", "missingMaxMag")); - } - gl.uniform2f(this.magnitudeRangeLocation, minMag, maxMag); -}; - -/** - * Loads the specified number as the value of this program's 'textureSampler' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} unit The texture unit. - */ -StarFieldProgram.prototype.loadTextureUnit = function (gl, unit) { - gl.uniform1i(this.textureUnitLocation, unit - gl.TEXTURE0); -}; - -/** - * Loads the specified boolean as the value of this program's 'textureEnabledLocation' uniform variable. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Boolean} value - */ -StarFieldProgram.prototype.loadTextureEnabled = function (gl, value) { - gl.uniform1i(this.textureEnabledLocation, value ? 1 : 0); -}; - -export default StarFieldProgram; diff --git a/web/src/gis/shaders/SurfaceTileRendererProgram.js b/web/src/gis/shaders/SurfaceTileRendererProgram.js deleted file mode 100644 index b1ffd315..00000000 --- a/web/src/gis/shaders/SurfaceTileRendererProgram.js +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceTileRendererProgram - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import GpuProgram from '../shaders/GpuProgram'; -import Logger from '../util/Logger'; -import SurfaceTileVertex from './glsl/surface_tile_vertex.glsl'; -import SurfaceTileFragment from './glsl/surface_tile_fragment.glsl'; - -/** - * Constructs a new surface-tile-renderer program. - * Initializes, compiles and links this GLSL program with the source code for its vertex and fragment shaders. - * <p> - * This method creates WebGL shaders for the program's shader sources and attaches them to a new GLSL program. This - * method then compiles the shaders and links the program if compilation is successful. Use the bind method to make the - * program current during rendering. - * - * @alias SurfaceTileRendererProgram - * @constructor - * @augments GpuProgram - * @classdesc A GLSL program that draws textured geometry on the globe's terrain. - * Application's typically do not interact with this class. - * @param {WebGLRenderingContext} gl The current WebGL context. - */ -function SurfaceTileRendererProgram(gl) { - var vertexShaderSource = SurfaceTileVertex, - fragmentShaderSource = SurfaceTileFragment; - - // Call to the superclass, which performs shader program compiling and linking. - GpuProgram.call(this, gl, vertexShaderSource, fragmentShaderSource); - - // Capture the attribute and uniform locations. - - /** - * This program's vertex point location. - * @type {Number} - * @readonly - */ - this.vertexPointLocation = this.attributeLocation(gl, "vertexPoint"); - - /** - * This program's texture coordinate location. - * @type {Number} - * @readonly - */ - this.vertexTexCoordLocation = this.attributeLocation(gl, "vertexTexCoord"); - - /** - * This program's modelview-projection matrix location. - * @type {WebGLUniformLocation} - * @readonly - */ - this.mvpMatrixLocation = this.uniformLocation(gl, "mvpMatrix"); - - /** - * The WebGL location for this program's 'color' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.colorLocation = this.uniformLocation(gl, "color"); - - /** - * The WebGL location for this program's 'modulateColor' uniform. - * @type {WebGLUniformLocation} - * @readonly - */ - this.modulateColorLocation = this.uniformLocation(gl, "modulateColor"); - - // The rest of these are strictly internal and intentionally not documented. - this.texSamplerMatrixLocation = this.uniformLocation(gl, "texSamplerMatrix"); - this.texMaskMatrixLocation = this.uniformLocation(gl, "texMaskMatrix"); - this.texSamplerLocation = this.uniformLocation(gl, "texSampler"); - this.opacityLocation = this.uniformLocation(gl, "opacity"); - - /** - * The WebGL location for this program's 'vertexTexCoord' attribute. - * @type {Number} - * @readonly - */ - this.vertexPointLocation = -1; -} - -/** - * A string that uniquely identifies this program. - * @type {string} - * @readonly - */ -SurfaceTileRendererProgram.key = "WorldWindGpuSurfaceTileRenderingProgram"; - -SurfaceTileRendererProgram.prototype = Object.create(GpuProgram.prototype); - -/** - * Loads the specified matrix as the value of this program's 'mvpMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -SurfaceTileRendererProgram.prototype.loadModelviewProjection = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTileRendererProgram", "loadModelviewProjection", - "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.mvpMatrixLocation); -}; - -/** - * Loads the specified matrix as the value of this program's 'texSamplerMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -SurfaceTileRendererProgram.prototype.loadTexSamplerMatrix = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTileRendererProgram", "loadTexSamplerMatrix", - "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.texSamplerMatrixLocation); -}; - -/** - * Loads the specified matrix as the value of this program's 'texMaskMatrix' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Matrix} matrix The matrix to load. - * @throws {ArgumentError} If the specified matrix is null or undefined. - */ -SurfaceTileRendererProgram.prototype.loadTexMaskMatrix = function (gl, matrix) { - if (!matrix) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTileRendererProgram", "loadTexMaskMatrix", - "missingMatrix")); - } - - this.loadUniformMatrix(gl, matrix, this.texMaskMatrixLocation); -}; - -/** - * Loads the specified texture unit ID as the value of this program's 'texSampler' uniform variable. - * The specified unit ID must be one of the GL_TEXTUREi WebGL enumerations, where i ranges from 0 to - * GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} unit The unit ID to load. - */ -SurfaceTileRendererProgram.prototype.loadTexSampler = function (gl, unit) { - gl.uniform1i(this.texSamplerLocation, unit - WebGLRenderingContext.TEXTURE0); -}; - -/** - * Loads the specified value as the value of this program's 'opacity' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Number} opacity The opacity to load. - */ -SurfaceTileRendererProgram.prototype.loadOpacity = function (gl, opacity) { - gl.uniform1f(this.opacityLocation, opacity); -}; - -/** - * Loads the specified color as the value of this program's 'color' uniform variable. - * - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Color} color The color to load. - * @throws {ArgumentError} If the specified color is null or undefined. - */ -SurfaceTileRendererProgram.prototype.loadColor = function (gl, color) { - if (!color) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceTileRendererProgram", "loadColor", "missingColor")); - } - - this.loadUniformColor(gl, color, this.colorLocation); -}; - -/** - * Loads the specified boolean as the value of this program's 'modulateColor' uniform variable. When this - * value is true the color uniform of this shader is - * multiplied by the rounded alpha component of the texture color at each fragment. This causes the color - * to be either fully opaque or fully transparent depending on the value of the texture color's alpha value. - * This is used during picking to replace opaque or mostly opaque texture colors with the pick color, and - * to make all other texture colors transparent. - * @param {WebGLRenderingContext} gl The current WebGL context. - * @param {Boolean} enable <code>true</code> to enable modulation, <code>false</code> to disable modulation. - */ -SurfaceTileRendererProgram.prototype.loadModulateColor = function (gl, enable) { - gl.uniform1i(this.modulateColorLocation, enable ? 1 : 0); -}; - -export default SurfaceTileRendererProgram; diff --git a/web/src/gis/shaders/glsl/basic_fragment.glsl b/web/src/gis/shaders/glsl/basic_fragment.glsl deleted file mode 100644 index 84856a26..00000000 --- a/web/src/gis/shaders/glsl/basic_fragment.glsl +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump float; - -uniform vec4 color; - -void main() { - gl_FragColor = color; -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/basic_texture_fragment.glsl b/web/src/gis/shaders/glsl/basic_texture_fragment.glsl deleted file mode 100644 index af9ae1c5..00000000 --- a/web/src/gis/shaders/glsl/basic_texture_fragment.glsl +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump float; - -uniform float opacity; -uniform vec4 color; -uniform bool enableTexture; -uniform bool modulateColor; -uniform sampler2D textureSampler; -uniform bool applyLighting; - -varying vec2 texCoord; -varying vec4 normal; - -void main() { - vec4 textureColor = texture2D(textureSampler, texCoord); - float ambient = 0.15; - vec4 lightDirection = vec4(0, 0, 1, 0); - - if (enableTexture && !modulateColor) - gl_FragColor = textureColor * color * opacity; - else if (enableTexture && modulateColor) - gl_FragColor = color * floor(textureColor.a + 0.5); - else - gl_FragColor = color * opacity; - if (gl_FragColor.a == 0.0) { - discard; - } - if (applyLighting) { - vec4 n = normal * (gl_FrontFacing ? 1.0 : -1.0); - gl_FragColor.rgb *= clamp(ambient + dot(lightDirection, n), 0.0, 1.0); - } -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/basic_texture_vertex.glsl b/web/src/gis/shaders/glsl/basic_texture_vertex.glsl deleted file mode 100644 index dc964bc6..00000000 --- a/web/src/gis/shaders/glsl/basic_texture_vertex.glsl +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -attribute vec4 vertexPoint; -attribute vec4 vertexTexCoord; -attribute vec4 normalVector; - -uniform mat4 mvpMatrix; -uniform mat4 mvInverseMatrix; -uniform mat4 texCoordMatrix; -uniform bool applyLighting; - -varying vec2 texCoord; -varying vec4 normal; - -void main() { - gl_Position = mvpMatrix * vertexPoint; - texCoord = (texCoordMatrix * vertexTexCoord).st; - if (applyLighting) { - normal = mvInverseMatrix * normalVector; - } -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/basic_vertex.glsl b/web/src/gis/shaders/glsl/basic_vertex.glsl deleted file mode 100644 index 2a741fac..00000000 --- a/web/src/gis/shaders/glsl/basic_vertex.glsl +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -attribute vec4 vertexPoint; - -uniform mat4 mvpMatrix; - -void main() { - gl_Position = mvpMatrix * vertexPoint; -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/ground_fragment.glsl b/web/src/gis/shaders/glsl/ground_fragment.glsl deleted file mode 100644 index d75a392a..00000000 --- a/web/src/gis/shaders/glsl/ground_fragment.glsl +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump float; -precision mediump int; - -const int FRAGMODE_GROUND_PRIMARY = 2; -const int FRAGMODE_GROUND_SECONDARY = 3; -const int FRAGMODE_GROUND_PRIMARY_TEX_BLEND = 4; - -uniform int fragMode; -uniform sampler2D texSampler; - -varying vec3 primaryColor; -varying vec3 secondaryColor; -varying vec2 texCoord; - -void main (void) { - if (fragMode == FRAGMODE_GROUND_PRIMARY) { - gl_FragColor = vec4(primaryColor, 1.0); - } else if (fragMode == FRAGMODE_GROUND_SECONDARY) { - gl_FragColor = vec4(secondaryColor, 1.0); - } else if (fragMode == FRAGMODE_GROUND_PRIMARY_TEX_BLEND) { - vec4 texColor = texture2D(texSampler, texCoord); - gl_FragColor = vec4(primaryColor + texColor.rgb * (1.0 - secondaryColor), 1.0); - } -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/ground_vertex.glsl b/web/src/gis/shaders/glsl/ground_vertex.glsl deleted file mode 100644 index f30299b9..00000000 --- a/web/src/gis/shaders/glsl/ground_vertex.glsl +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump int; - -const int FRAGMODE_GROUND_PRIMARY_TEX_BLEND = 4; -const int SAMPLE_COUNT = 2; -const float SAMPLES = 2.0; - -const float PI = 3.141592653589; -const float Kr = 0.0025; -const float Kr4PI = Kr * 4.0 * PI; -const float Km = 0.0015; -const float Km4PI = Km * 4.0 * PI; -const float ESun = 15.0; -const float KmESun = Km * ESun; -const float KrESun = Kr * ESun; -const vec3 invWavelength = vec3(5.60204474633241, 9.473284437923038, 19.643802610477206); -const float rayleighScaleDepth = 0.25; - -uniform int fragMode; -uniform mat4 mvpMatrix; -uniform mat3 texCoordMatrix; -uniform vec3 vertexOrigin; -uniform vec3 eyePoint; -uniform float eyeMagnitude; /* The eye point's magnitude */ -uniform float eyeMagnitude2; /* eyeMagnitude^2 */ -uniform vec3 lightDirection; /* The direction vector to the light source */ -uniform float atmosphereRadius; /* The outer (atmosphere) radius */ -uniform float atmosphereRadius2; /* atmosphereRadius^2 */ -uniform float globeRadius; /* The inner (planetary) radius */ -uniform float scale; /* 1 / (atmosphereRadius - globeRadius) */ -uniform float scaleDepth; /* The scale depth (i.e. the altitude at which - the atmosphere's average density is found) */ -uniform float scaleOverScaleDepth; /* fScale / fScaleDepth */ - -attribute vec4 vertexPoint; -attribute vec2 vertexTexCoord; - -varying vec3 primaryColor; -varying vec3 secondaryColor; -varying vec2 texCoord; - -float scaleFunc(float cos) { - float x = 1.0 - cos; - return scaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25)))); -} - -void sampleGround() { - /* Get the ray from the camera to the vertex and its length (which is the far point of the ray passing through the - atmosphere) */ - vec3 point = vertexPoint.xyz + vertexOrigin; - vec3 ray = point - eyePoint; - float far = length(ray); - ray /= far; - - vec3 start; - if (eyeMagnitude < atmosphereRadius) { - start = eyePoint; - } else { - /* Calculate the closest intersection of the ray with the outer atmosphere (which is the near point of the ray - passing through the atmosphere) */ - float B = 2.0 * dot(eyePoint, ray); - float C = eyeMagnitude2 - atmosphereRadius2; - float det = max(0.0, B*B - 4.0 * C); - float near = 0.5 * (-B - sqrt(det)); - - /* Calculate the ray's starting point, then calculate its scattering offset */ - start = eyePoint + ray * near; - far -= near; - } - float depth = exp((globeRadius - atmosphereRadius) / scaleDepth); - float eyeAngle = dot(-ray, point) / length(point); - float lightAngle = dot(lightDirection, point) / length(point); - float eyeScale = scaleFunc(eyeAngle); - float lightScale = scaleFunc(lightAngle); - float eyeOffset = depth*eyeScale; - float temp = (lightScale + eyeScale); - - /* Initialize the scattering loop variables */ - float sampleLength = far / SAMPLES; - float scaledLength = sampleLength * scale; - vec3 sampleRay = ray * sampleLength; - vec3 samplePoint = start + sampleRay * 0.5; - - /* Now loop through the sample rays */ - vec3 frontColor = vec3(0.0, 0.0, 0.0); - vec3 attenuate = vec3(0.0, 0.0, 0.0); - for(int i=0; i<SAMPLE_COUNT; i++) { - float height = length(samplePoint); - float depth = exp(scaleOverScaleDepth * (globeRadius - height)); - float scatter = depth*temp - eyeOffset; - attenuate = exp(-scatter * (invWavelength * Kr4PI + Km4PI)); - frontColor += attenuate * (depth * scaledLength); - samplePoint += sampleRay; - } - - primaryColor = frontColor * (invWavelength * KrESun + KmESun); - secondaryColor = attenuate; /* Calculate the attenuation factor for the ground */ -} - -void main() { - sampleGround(); - /* Transform the vertex point by the modelview-projection matrix */ - gl_Position = mvpMatrix * vertexPoint; - if (fragMode == FRAGMODE_GROUND_PRIMARY_TEX_BLEND) { - /* Transform the vertex texture coordinate by the tex coord matrix */ - texCoord = (texCoordMatrix * vec3(vertexTexCoord, 1.0)).st; - } -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/sky_fragment.glsl b/web/src/gis/shaders/glsl/sky_fragment.glsl deleted file mode 100644 index 5a517013..00000000 --- a/web/src/gis/shaders/glsl/sky_fragment.glsl +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifdef GL_FRAGMENT_PRECISION_HIGH -precision highp float; -#else -precision mediump float; -#endif - -const float g = -0.95; -const float g2 = g * g; - -uniform mediump vec3 lightDirection; - -varying vec3 primaryColor; -varying vec3 secondaryColor; -varying vec3 direction; - -void main (void) { - float cos = dot(lightDirection, direction) / length(direction); - float rayleighPhase = 0.75 * (1.0 + cos * cos); - float miePhase = 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + cos*cos) / - pow(1.0 + g2 - 2.0*g*cos, 1.5); - const float exposure = 2.0; - vec3 color = primaryColor * rayleighPhase + secondaryColor * miePhase; - color = vec3(1.0) - exp(-exposure * color); - gl_FragColor = vec4(color, color.b); -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/sky_vertex.glsl b/web/src/gis/shaders/glsl/sky_vertex.glsl deleted file mode 100644 index 55288d43..00000000 --- a/web/src/gis/shaders/glsl/sky_vertex.glsl +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump int; - -const int SAMPLE_COUNT = 2; -const float SAMPLES = 2.0; - -const float PI = 3.141592653589; -const float Kr = 0.0025; -const float Kr4PI = Kr * 4.0 * PI; -const float Km = 0.0015; -const float Km4PI = Km * 4.0 * PI; -const float ESun = 15.0; -const float KmESun = Km * ESun; -const float KrESun = Kr * ESun; -const vec3 invWavelength = vec3(5.60204474633241, 9.473284437923038, 19.643802610477206); -const float rayleighScaleDepth = 0.25; - -uniform mat4 mvpMatrix; -uniform vec3 vertexOrigin; -uniform vec3 eyePoint; -uniform float eyeMagnitude; /* The eye point's magnitude */ -uniform float eyeMagnitude2; /* eyeMagnitude^2 */ -uniform mediump vec3 lightDirection; /* The direction vector to the light source */ -uniform float atmosphereRadius; /* The outer (atmosphere) radius */ -uniform float atmosphereRadius2; /* atmosphereRadius^2 */ -uniform float globeRadius; /* The inner (planetary) radius */ -uniform float scale; /* 1 / (atmosphereRadius - globeRadius) */ -uniform float scaleDepth; /* The scale depth (i.e. the altitude at which the - atmosphere's average density is found) */ -uniform float scaleOverScaleDepth; /* fScale / fScaleDepth */ - -attribute vec4 vertexPoint; - -varying vec3 primaryColor; -varying vec3 secondaryColor; -varying vec3 direction; - -float scaleFunc(float cos) { - float x = 1.0 - cos; - return scaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25)))); -} - -void sampleSky() { - /* Get the ray from the camera to the vertex and its length (which is the far point of - the ray passing through the atmosphere) */ - vec3 point = vertexPoint.xyz + vertexOrigin; - vec3 ray = point - eyePoint; - float far = length(ray); - ray /= far; - - vec3 start; - float startOffset; - - if (eyeMagnitude < atmosphereRadius) { - /* Calculate the ray's starting point, then calculate its scattering offset */ - start = eyePoint; - float height = length(start); - float depth = exp(scaleOverScaleDepth * (globeRadius - eyeMagnitude)); - float startAngle = dot(ray, start) / height; - startOffset = depth*scaleFunc(startAngle); - } else { - /* Calculate the closest intersection of the ray with the outer atmosphere (which is the near - point of the ray passing through the atmosphere) */ - float B = 2.0 * dot(eyePoint, ray); - float C = eyeMagnitude2 - atmosphereRadius2; - float det = max(0.0, B*B - 4.0 * C); - float near = 0.5 * (-B - sqrt(det)); - - /* Calculate the ray's starting point, then calculate its scattering offset */ - start = eyePoint + ray * near; - far -= near; - float startAngle = dot(ray, start) / atmosphereRadius; - float startDepth = exp(-1.0 / scaleDepth); - startOffset = startDepth*scaleFunc(startAngle); - } - - /* Initialize the scattering loop variables */ - float sampleLength = far / SAMPLES; - float scaledLength = sampleLength * scale; - vec3 sampleRay = ray * sampleLength; - vec3 samplePoint = start + sampleRay * 0.5; - - /* Now loop through the sample rays */ - vec3 frontColor = vec3(0.0, 0.0, 0.0); - for(int i=0; i<SAMPLE_COUNT; i++) { - float height = length(samplePoint); - float depth = exp(scaleOverScaleDepth * (globeRadius - height)); - float lightAngle = dot(lightDirection, samplePoint) / height; - float cameraAngle = dot(ray, samplePoint) / height; - float scatter = (startOffset + depth*(scaleFunc(lightAngle) - scaleFunc(cameraAngle))); - vec3 attenuate = exp(-scatter * (invWavelength * Kr4PI + Km4PI)); - frontColor += attenuate * (depth * scaledLength); - samplePoint += sampleRay; - } - - /* Finally, scale the Mie and Rayleigh colors and set up the varying variables for the fragment - shader */ - primaryColor = frontColor * (invWavelength * KrESun); - secondaryColor = frontColor * KmESun; - direction = eyePoint - point; -} - -void main() { - sampleSky(); - - /* Transform the vertex point by the modelview-projection matrix */ - gl_Position = mvpMatrix * vertexPoint; -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/star_field_fragment.glsl b/web/src/gis/shaders/glsl/star_field_fragment.glsl deleted file mode 100644 index bae4abea..00000000 --- a/web/src/gis/shaders/glsl/star_field_fragment.glsl +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump float; - -uniform sampler2D textureSampler; -uniform int textureEnabled; - -varying float magnitudeWeight; - -const vec4 white = vec4(1.0, 1.0, 1.0, 1.0); -const vec4 grey = vec4(0.5, 0.5, 0.5, 1.0); - -void main() { - if (textureEnabled == 1) { - gl_FragColor = texture2D(textureSampler, gl_PointCoord); - } else { - // paint the starts in shades of grey, where the brightest star is white and the dimmest star is grey - gl_FragColor = mix(white, grey, magnitudeWeight); - } -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/star_field_vertex.glsl b/web/src/gis/shaders/glsl/star_field_vertex.glsl deleted file mode 100644 index ea8c3da4..00000000 --- a/web/src/gis/shaders/glsl/star_field_vertex.glsl +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//.x = declination -//.y = right ascension -//.z = point size -//.w = magnitude -attribute vec4 vertexPoint; - -uniform mat4 mvpMatrix; -// number of days (positive or negative) since Greenwich noon, Terrestrial Time, -// on 1 January 2000 (J2000.0) -uniform float numDays; -uniform vec2 magnitudeRange; - -varying float magnitudeWeight; - -// normalizes an angle between 0.0 and 359.0 -float normalizeAngle(float angle) { - float angleDivisions = angle / 360.0; - return 360.0 * (angleDivisions - floor(angleDivisions)); -} - -// transforms declination and right ascension in cartesian coordinates -vec3 computePosition(float dec, float ra) { - float GMST = normalizeAngle(280.46061837 + 360.98564736629 * numDays); - float GHA = normalizeAngle(GMST - ra); - float lon = -GHA + 360.0 * step(180.0, GHA); - float latRad = radians(dec); - float lonRad = radians(lon); - float radCosLat = cos(latRad); - return vec3(radCosLat * sin(lonRad), sin(latRad), radCosLat * cos(lonRad)); -} - -// normalizes a value between 0.0 and 1.0 -float normalizeScalar(float value, float minValue, float maxValue){ - return (value - minValue) / (maxValue - minValue); -} - -void main() { - vec3 vertexPosition = computePosition(vertexPoint.x, vertexPoint.y); - gl_Position = mvpMatrix * vec4(vertexPosition.xyz, 1.0); - gl_Position.z = gl_Position.w - 0.00001; - gl_PointSize = vertexPoint.z; - magnitudeWeight = normalizeScalar(vertexPoint.w, magnitudeRange.x, magnitudeRange.y); -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/surface_tile_fragment.glsl b/web/src/gis/shaders/glsl/surface_tile_fragment.glsl deleted file mode 100644 index 682ca83b..00000000 --- a/web/src/gis/shaders/glsl/surface_tile_fragment.glsl +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -precision mediump float; -/* Uniform sampler indicating the texture 2D unit (0, 1, 2, etc.) to use when sampling texture color. */ -uniform sampler2D texSampler; -uniform float opacity; -uniform vec4 color; -uniform bool modulateColor; - -varying vec2 texSamplerCoord; -varying vec2 texMaskCoord; - -/* - * Returns true when the texture coordinate samples texels outside the texture image. - */ -bool isInsideTextureImage(const vec2 coord) { - return coord.x >= 0.0 && coord.x <= 1.0 && coord.y >= 0.0 && coord.y <= 1.0; -} - -/* - * OpenGL ES Shading Language v1.00 fragment shader for SurfaceTileRendererProgram. Writes the value of the texture 2D - * object bound to texSampler at the current transformed texture coordinate, multiplied by the uniform opacity. Writes - * transparent black (0, 0, 0, 0) if the transformed texture coordinate indicates a texel outside of the texture data's - * standard range of [0,1]. - */ -void main(void) { - float mask = float(isInsideTextureImage(texMaskCoord)); - if (modulateColor) { - gl_FragColor = color * mask * floor(texture2D(texSampler, texSamplerCoord).a + 0.5); - } else { - /* Return either the sampled texture2D color multiplied by opacity or transparent black. */ - gl_FragColor = texture2D(texSampler, texSamplerCoord) * mask * opacity; - } -} \ No newline at end of file diff --git a/web/src/gis/shaders/glsl/surface_tile_vertex.glsl b/web/src/gis/shaders/glsl/surface_tile_vertex.glsl deleted file mode 100644 index b4ecd295..00000000 --- a/web/src/gis/shaders/glsl/surface_tile_vertex.glsl +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -attribute vec4 vertexPoint; -attribute vec4 vertexTexCoord; - -uniform mat4 mvpMatrix; -uniform mat4 texSamplerMatrix; -uniform mat4 texMaskMatrix; - -varying vec2 texSamplerCoord; -varying vec2 texMaskCoord; - -void main() { - gl_Position = mvpMatrix * vertexPoint; - /* Transform the vertex texture coordinate into sampler texture coordinates. */ - texSamplerCoord = (texSamplerMatrix * vertexTexCoord).st; - /* Transform the vertex texture coordinate into mask texture coordinates. */ - texMaskCoord = (texMaskMatrix * vertexTexCoord).st; -} \ No newline at end of file diff --git a/web/src/gis/shapes/AbstractMesh.js b/web/src/gis/shapes/AbstractMesh.js deleted file mode 100644 index ecd8f067..00000000 --- a/web/src/gis/shapes/AbstractMesh.js +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AbstractMesh - */ -import AbstractShape from '../shapes/AbstractShape'; -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import BoundingBox from '../geom/BoundingBox'; -import Color from '../util/Color'; -import ImageSource from '../util/ImageSource'; -import Line from '../geom/Line'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import Position from '../geom/Position'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs an abstract mesh. Applications do not call this constructor. It is called only by subclasses of - * this abstract class. - * @alias AbstractMesh - * @constructor - * @augments AbstractShape - * @classdesc Provides an abstract base class for mesh shapes. - * - * @param {ShapeAttributes} attributes The attributes to associate with this mesh. May be null, in which case - * default attributes are associated. - */ -function AbstractMesh(attributes) { - AbstractShape.call(this, attributes); - - /** - * Indicates whether this mesh is pickable when the pick point intersects transparent pixels of the - * image applied to this mesh. If no image is applied to this mesh, this property is ignored. If this - * property is true and an image with fully transparent pixels is applied to the mesh, the mesh is - * pickable at those transparent pixels, otherwise this mesh is not pickable at those transparent pixels. - * @type {Boolean} - * @default true - */ - this.pickTransparentImagePixels = true; - - // Private. Documentation is with the defined property below. - this._altitudeScale = 1; -} - -AbstractMesh.prototype = Object.create(AbstractShape.prototype); - -Object.defineProperties(AbstractMesh.prototype, { - /** - * Scales the altitudes of this mesh. - * @type {Number} - * @default 1 - * @memberof AbstractMesh.prototype - */ - altitudeScale: { - get: function () { - return this._altitudeScale; - }, - set: function (value) { - this._altitudeScale = value; - this.reset(); - } - } -}); - -// Internal. Determines whether this shape's geometry must be re-computed. -AbstractMesh.prototype.mustGenerateGeometry = function (dc) { - if (!this.currentData.meshPoints) { - return true; - } - - if (this.currentData.drawInterior !== this.activeAttributes.drawInterior) { - return true; - } - - if (this.activeAttributes.applyLighting && !this.currentData.normals) { - return true; - } - - if (this.altitudeMode === WorldWind.ABSOLUTE) { - return false; - } - - return this.currentData.isExpired; -}; - -// Overridden from AbstractShape base class. -AbstractMesh.prototype.doMakeOrderedRenderable = function (dc) { - if (!this.activeAttributes.drawInterior && !this.activeAttributes.drawOutline) { - return null; - } - - // See if the current shape data can be re-used. - if (!this.mustGenerateGeometry(dc)) { - return this; - } - - var currentData = this.currentData; - - // Set the transformation matrix to correspond to the reference position. - var refPt = currentData.referencePoint; - dc.surfacePointForMode(this.referencePosition.latitude, this.referencePosition.longitude, - this.referencePosition.altitude * this._altitudeScale, this._altitudeMode, refPt); - currentData.transformationMatrix.setToTranslation(refPt[0], refPt[1], refPt[2]); - - // Convert the geographic coordinates to the Cartesian coordinates that will be rendered. - currentData.meshPoints = this.computeMeshPoints(dc, currentData); - currentData.refreshVertexBuffer = true; - - // Capture texture coordinates in a parallel array to the mesh points. These are associated with this - // shape, itself, because they're independent of elevation or globe state. - if (this.activeAttributes.imageSource && !this.texCoords) { - this.texCoords = this.computeTexCoords(); - if (this.texCoords) { - currentData.refreshTexCoordBuffer = true; - } - } - - // Compute the mesh and outline indices. These are associated with this shape, itself, because they're - // independent of elevation and globe state. - if (!this.meshIndices) { - this.meshIndices = this.computeMeshIndices(); - currentData.refreshMeshIndices = true; - } - - if (!this.meshOutlineIndices) { - this.meshOutlineIndices = this.computeOutlineIndices(); - if (this.meshOutlineIndices) { - currentData.refreshOutlineIndices = true; - } - } - - if (this.activeAttributes.applyLighting) { - this.computeNormals(currentData); - } - - currentData.drawInterior = this.activeAttributes.drawInterior; // remember for validation - this.resetExpiration(currentData); - - // Create the extent from the Cartesian points. Those points are relative to this path's reference point, - // so translate the computed extent to the reference point. - if (!currentData.extent) { - currentData.extent = new BoundingBox(); - } - - currentData.extent.setToPoints(currentData.meshPoints); - currentData.extent.translate(currentData.referencePoint); - - return this; -}; - -// Private. Intentionally not documented. -/** - * Computes this mesh's Cartesian points. Called by this abstract class during rendering to compute - * Cartesian points from geographic positions. This method must be overridden by subclasses. An - * exception is thrown if it is not. - * - * This method must also assign currentData.eyeDistance to be the minimum distance from this mesh to the - * current eye point. - * - * @param {DrawContext} dc The current draw context. - * @param {{}} currentData The current data for this shape. - * @returns {Float32Array} The Cartesian mesh points. - * @protected - */ -AbstractMesh.prototype.computeMeshPoints = function (dc, currentData) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AbstractMesh", "computeMeshPoints", "abstractInvocation")); -}; - -// Intentionally not documented. -/** - * Computes the texture coordinates for this shape. Called by this abstract class during rendering to copy or - * compute texture coordinates into a typed array. Subclasses should implement this method if the shape they - * define has texture coordinates. The default implementation returns null. - * - * @returns {Float32Array} The texture coordinates. - * @protected - */ -AbstractMesh.prototype.computeTexCoords = function () { - // Default implementation does nothing. - return null; -}; - -/** - * Computes or copies the indices of this mesh into a Uint16Array. Subclasses must implement this method. - * An exception is thrown if it is not implemented. - * @param {{}} currentData This shape's current data. - * @protected - */ -AbstractMesh.prototype.computeMeshIndices = function (currentData) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AbstractMesh", "computeMeshIndices", "abstractInvocation")); -}; - -/** - * Computes or copies the outline indices of this mesh into a Uint16Array. Subclasses must implement this - * method if they have outlines. The default implementation returns null. - * @param {{}} currentData This shape's current data. - * @protected - */ -AbstractMesh.prototype.computeOutlineIndices = function (currentData) { - // Default implementation does nothing. -}; - -// Internal. Intentionally not documented. -AbstractMesh.prototype.computeNormals = function (currentData) { - var normalsBuffer = new Float32Array(currentData.meshPoints.length), - indices = this.meshIndices, - vertices = currentData.meshPoints, - normals = [], - triPoints = [new Vec3(0, 0, 0), new Vec3(0, 0, 0), new Vec3(0, 0, 0)], - k; - - // For each triangle, compute its normal assign it to each participating index. - for (var i = 0; i < indices.length; i += 3) { - for (var j = 0; j < 3; j++) { - k = indices[i + j]; - triPoints[j].set(vertices[3 * k], vertices[3 * k + 1], vertices[3 * k + 2]); - } - - var n = Vec3.computeTriangleNormal(triPoints[0], triPoints[1], triPoints[2]); - - for (j = 0; j < 3; j++) { - k = indices[i + j]; - if (!normals[k]) { - normals[k] = []; - } - - normals[k].push(n); - } - } - - // Average the normals associated with each index and add the result to the normals buffer. - n = new Vec3(0, 0, 0); - for (i = 0; i < normals.length; i++) { - if (normals[i]) { - Vec3.average(normals[i], n); - n.normalize(); - normalsBuffer[i * 3] = n[0]; - normalsBuffer[i * 3 + 1] = n[1]; - normalsBuffer[i * 3 + 2] = n[2]; - } else { - normalsBuffer[i * 3] = 0; - normalsBuffer[i * 3 + 1] = 0; - normalsBuffer[i * 3 + 2] = 0; - } - } - - currentData.normals = normalsBuffer; - currentData.refreshNormalsBuffer = true; -}; - -// Overridden from AbstractShape base class. -AbstractMesh.prototype.doRenderOrdered = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - currentData = this.currentData, - hasTexture = this.texCoords && !!this.activeAttributes.imageSource, - vboId, color, pickColor, textureBound; - - if (dc.pickingMode) { - pickColor = dc.uniquePickColor(); - } - - // Load the vertex data since both the interior and outline use it. - - if (!currentData.pointsVboCacheKey) { - currentData.pointsVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.pointsVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.pointsVboCacheKey, vboId, - currentData.meshPoints.length * 4); - currentData.refreshVertexBuffer = true; - } - - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - if (currentData.refreshVertexBuffer) { - gl.bufferData(gl.ARRAY_BUFFER, currentData.meshPoints, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - currentData.refreshVertexBuffer = false; - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - - program.loadTextureEnabled(gl, false); - - // Draw the mesh if the interior requested. - if (this.activeAttributes.drawInterior) { - var applyLighting = !dc.pickingMode && currentData.normals && this.activeAttributes.applyLighting; - - this.applyMvpMatrix(dc); - - if (!currentData.meshIndicesVboCacheKey) { - currentData.meshIndicesVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.meshIndicesVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.meshIndicesVboCacheKey, vboId, - this.meshIndices.length * 2); - currentData.refreshMeshIndices = true; - } - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboId); - if (currentData.refreshMeshIndices) { - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.meshIndices, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - currentData.refreshMeshIndices = false; - } - - color = this.activeAttributes.interiorColor; - // Disable writing the shape's fragments to the depth buffer when the interior is semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - if (hasTexture && (!dc.pickingMode || !this.pickTransparentImagePixels)) { - this.activeTexture = dc.gpuResourceCache.resourceForKey(this.activeAttributes.imageSource); - if (!this.activeTexture) { - this.activeTexture = - dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, this.activeAttributes.imageSource); - } - - textureBound = this.activeTexture && this.activeTexture.bind(dc); - if (textureBound) { - if (!currentData.texCoordsVboCacheKey) { - currentData.texCoordsVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.texCoordsVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.texCoordsVboCacheKey, vboId, - this.texCoords.length * 4); - currentData.refreshTexCoordBuffer = true; - } - - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - if (currentData.refreshTexCoordBuffer) { - gl.bufferData(gl.ARRAY_BUFFER, this.texCoords, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - currentData.refreshTexCoordBuffer = false; - } - - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, - false, 0, 0); - - this.scratchMatrix.setToIdentity(); - this.scratchMatrix.multiplyByTextureTransform(this.activeTexture); - - program.loadTextureEnabled(gl, true); - program.loadTextureUnit(gl, gl.TEXTURE0); - program.loadTextureMatrix(gl, this.scratchMatrix); - program.loadModulateColor(gl, dc.pickingMode); - } - } - - // Apply lighting. - if (applyLighting) { - program.loadApplyLighting(gl, true); - - if (!currentData.normalsVboCacheKey) { - currentData.normalsVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.normalsVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.normalsVboCacheKey, vboId, - currentData.normals.length * 4); - currentData.refreshNormalsBuffer = true; - } - - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - if (currentData.refreshNormalsBuffer) { - gl.bufferData(gl.ARRAY_BUFFER, currentData.normals, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - currentData.refreshNormalsBuffer = false; - } - - gl.enableVertexAttribArray(program.normalVectorLocation); - gl.vertexAttribPointer(program.normalVectorLocation, 3, gl.FLOAT, false, 0, 0); - } - - gl.drawElements(gl.TRIANGLES, this.meshIndices.length, - gl.UNSIGNED_SHORT, 0); - - if (hasTexture) { - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - } - - if (applyLighting) { - program.loadApplyLighting(gl, false); - gl.disableVertexAttribArray(program.normalVectorLocation); - } - } - - // Draw the outline. - if (this.activeAttributes.drawOutline && this.meshOutlineIndices) { - program.loadTextureEnabled(gl, false); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); // we're not texturing in this clause - - // Make the outline stand out from the interior. - this.applyMvpMatrixForOutline(dc); - - color = this.activeAttributes.outlineColor; - // Disable writing the shape's fragments to the depth buffer when the interior is - // semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - gl.lineWidth(this.activeAttributes.outlineWidth); - - if (!currentData.outlineIndicesVboCacheKey) { - currentData.outlineIndicesVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.outlineIndicesVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.outlineIndicesVboCacheKey, vboId, - this.meshOutlineIndices.length * 2); - currentData.refreshOutlineIndices = true; - } - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboId); - if (currentData.refreshOutlineIndices) { - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.meshOutlineIndices, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - currentData.refreshOutlineIndices = false; - } - - gl.drawElements(gl.LINE_STRIP, this.meshOutlineIndices.length, - gl.UNSIGNED_SHORT, 0); - } - - if (dc.pickingMode) { - var pickPosition = this.computePickPosition(dc); - var po = new PickedObject(pickColor, this.pickDelegate ? this.pickDelegate : this, pickPosition, - this.layer, false); - dc.resolvePick(po); - } -}; - -AbstractMesh.prototype.computePickPosition = function (dc) { - var currentData = this.currentData, - line = dc.pickRay, - localLineOrigin = new Vec3(line.origin[0], line.origin[1], line.origin[2]).subtract( - currentData.referencePoint), - localLine = new Line(localLineOrigin, line.direction), - intersectionPoints = []; - - if (WWMath.computeIndexedTrianglesIntersection(localLine, currentData.meshPoints, this.meshIndices, - intersectionPoints)) { - var iPoint = intersectionPoints[0]; - - if (intersectionPoints.length > 1) { - // Find the intersection nearest the eye point. - var distance2 = iPoint.distanceToSquared(dc.eyePoint); - - for (var i = 1; i < intersectionPoints.length; i++) { - var d2 = intersectionPoints[i].distanceToSquared(dc.eyePoint); - if (d2 < distance2) { - distance2 = d2; - iPoint = intersectionPoints[i]; - } - } - } - - var pos = new Position(0, 0, 0); - dc.globe.computePositionFromPoint( - iPoint[0] + currentData.referencePoint[0], - iPoint[1] + currentData.referencePoint[1], - iPoint[2] + currentData.referencePoint[2], - pos); - - pos.altitude /= this._altitudeScale; - - return pos; - } - - return null; -}; - -// Overridden from AbstractShape base class. -AbstractMesh.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext; - - if (this.activeAttributes.drawInterior) { - gl.disable(gl.CULL_FACE); - - dc.findAndBindProgram(BasicTextureProgram); - - var applyLighting = !dc.pickMode && this.currentData.normals && this.activeAttributes.applyLighting; - if (applyLighting) { - dc.currentProgram.loadModelviewInverse(gl, dc.modelviewNormalTransform); - } - } - - gl.enableVertexAttribArray(dc.currentProgram.vertexPointLocation); -}; - -// Overridden from AbstractShape base class. -AbstractMesh.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext; - - gl.disableVertexAttribArray(dc.currentProgram.vertexPointLocation); - gl.depthMask(true); - gl.lineWidth(1); - gl.enable(gl.CULL_FACE); -}; - -export default AbstractMesh; diff --git a/web/src/gis/shapes/AbstractShape.js b/web/src/gis/shapes/AbstractShape.js deleted file mode 100644 index 6ceaad4d..00000000 --- a/web/src/gis/shapes/AbstractShape.js +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AbstractShape - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import MemoryCache from '../cache/MemoryCache'; -import Renderable from '../render/Renderable'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs an abstract shape instance. Meant to be called only by subclasses. - * @alias AbstractShape - * @constructor - * @augments Renderable - * @protected - * @classdesc Provides a base class for shapes other than surface shapes. Implements common attribute handling - * and rendering flow. This is an abstract class and is meant to be instantiated only by subclasses. - * <p> - * In order to support simultaneous use of this shape by multiple windows and 2D globes, this shape - * maintains a cache of data computed relative to the globe displayed in each window. During rendering, - * the data for the currently active globe, as indicated in the draw context, is made current. - * Subsequently called methods rely on the existence of this data cache entry. - * - * @param {ShapeAttributes} attributes The attributes to associate with this shape. May be null, in which case - * default attributes are associated. - */ -function AbstractShape(attributes) { - - Renderable.call(this); - - // Documented with its property accessor below. - this._attributes = attributes ? attributes : new ShapeAttributes(null); - - // Documented with its property accessor below. - this._highlightAttributes = null; - - /** - * Indicates whether this shape uses its normal attributes or its highlight attributes when displayed. - * If true, the highlight attributes are used, otherwise the normal attributes are used. The normal - * attributes are also used if no highlight attributes have been specified. - * @type {Boolean} - * @default false - */ - this.highlighted = false; - - // Private. See defined property below for documentation. - this._altitudeMode = WorldWind.ABSOLUTE; - - // Internal use only. Intentionally not documented. - // A position used to compute relative coordinates for the shape. - this.referencePosition = null; - - // Internal use only. Intentionally not documented. - // Holds the per-globe data generated during makeOrderedRenderable. - this.shapeDataCache = new MemoryCache(3, 2); - - // Internal use only. Intentionally not documented. - // The shape-data-cache data that is for the currently active globe. This field is made current prior to - // calls to makeOrderedRenderable and doRenderOrdered. - this.currentData = null; - - // Internal use only. Intentionally not documented. - this.activeAttributes = null; - - /** - * Indicates how long to use terrain-specific shape data before regenerating it, in milliseconds. A value - * of zero specifies that shape data should be regenerated every frame. While this causes the shape to - * adapt more frequently to the terrain, it decreases performance. - * @type {Number} - * @default 2000 (milliseconds) - */ - this.expirationInterval = 2000; - - /** - * Indicates whether to use a surface shape to represent this shape when drawn on a 2D globe. - * @type {Boolean} - * @default false - */ - this.useSurfaceShapeFor2D = false; - - this.scratchMatrix = Matrix.fromIdentity(); // scratch variable -} - -AbstractShape.prototype = Object.create(Renderable.prototype); - -Object.defineProperties(AbstractShape.prototype, { - /** - * This shape's normal (non-highlight) attributes. - * @type {ShapeAttributes} - * @memberof AbstractShape.prototype - */ - attributes: { - get: function () { - return this._attributes; - }, - set: function (value) { - this._attributes = value; - - if (this.surfaceShape) { - this.surfaceShape.attributes = this._attributes; - } - } - }, - - /** - * This shape's highlight attributes. If null or undefined and this shape's highlight flag is true, this - * shape's normal attributes are used. If they in turn are null or undefined, this shape is not drawn. - * @type {ShapeAttributes} - * @default null - * @memberof AbstractShape.prototype - */ - highlightAttributes: { - get: function () { - return this._highlightAttributes; - }, - set: function (value) { - this._highlightAttributes = value; - - if (this.surfaceShape) { - this.surfaceShape.highlightAttributes = this._highlightAttributes; - } - } - }, - - /** - * The altitude mode to use when drawing this shape. Recognized values are: - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * @type {String} - * @default WorldWind.ABSOLUTE - * @memberof AbstractShape.prototype - */ - altitudeMode: { - get: function () { - return this._altitudeMode; - }, - set: function (altitudeMode) { - if (!altitudeMode) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "AbstractShape", - "altitudeMode", "missingAltitudeMode")); - } - - this._altitudeMode = altitudeMode; - this.reset(); - } - } -}); - -/** - * Clears this shape's data cache. Should be called by subclasses when state changes invalidate - * cached data. - * @protected - */ -AbstractShape.prototype.reset = function () { - this.shapeDataCache.clear(false); - this.surfaceShape = null; -}; - -AbstractShape.prototype.updateSurfaceShape = function () { - // Synchronize this AbstractShape's properties with its SurfaceShape's properties. Note that the attributes - // and the highlightAttributes are synchronized separately. - this.surfaceShape.displayName = this.displayName; - this.surfaceShape.highlighted = this.highlighted; - this.surfaceShape.enabled = this.enabled; - this.surfaceShape.pathType = this.pathType; - this.surfaceShape.pickDelegate = this.pickDelegate ? this.pickDelegate : this; -}; - -AbstractShape.prototype.createSurfaceShape = function () { - return null; -}; - -AbstractShape.prototype.render = function (dc) { - if (!this.enabled) { - return; - } - - if (!dc.accumulateOrderedRenderables) { - return; - } - - if (dc.globe.is2D() && this.useSurfaceShapeFor2D) { - if (!this.surfaceShape) { - this.surfaceShape = this.createSurfaceShape(); - if (this.surfaceShape) { - this.surfaceShape.attributes = this._attributes; - this.surfaceShape.highlightAttributes = this._highlightAttributes; - } - } - - if (this.surfaceShape) { - this.updateSurfaceShape(); - this.surfaceShape.render(dc); - return; - } - } - - if (!dc.terrain && this.altitudeMode != WorldWind.ABSOLUTE) { - return; - } - - this.establishCurrentData(dc); - - if (dc.globe.projectionLimits && !this.isWithinProjectionLimits(dc)) { - return; - } - - // Use the last computed extent to see if this shape is out of view. - if (this.currentData.extent && !this.intersectsFrustum(dc)) { - return; - } - - this.determineActiveAttributes(dc); - if (!this.activeAttributes) { - return; - } - - var orderedRenderable = this.makeOrderedRenderable(dc); - if (orderedRenderable) { - - // Use the updated extent to see if this shape is out of view. - if (!this.intersectsFrustum(dc)) { - return; - } - - if (dc.isSmall(this.currentData.extent, 1)) { - return; - } - - orderedRenderable.layer = dc.currentLayer; - dc.addOrderedRenderable(orderedRenderable, this.currentData.eyeDistance); - } -}; - -/** - * Draws this shape during ordered rendering. Implements the {@link OrderedRenderable} interface. - * This method is called by the WorldWindow and is not intended to be called by applications. - * @param {DrawContext} dc The current draw context. - */ -AbstractShape.prototype.renderOrdered = function (dc) { - this.currentData = this.shapeDataCache.entryForKey(dc.globeStateKey); - - this.beginDrawing(dc); - try { - this.doRenderOrdered(dc); - } finally { - this.endDrawing(dc); - } -}; - -// Internal. Intentionally not documented. -AbstractShape.prototype.makeOrderedRenderable = function (dc) { - var or = this.doMakeOrderedRenderable(dc); - this.currentData.verticalExaggeration = dc.verticalExaggeration; - - return or; -}; - -/** - * Called during rendering. Subclasses must override this method with one that creates and enques an - * ordered renderable for this shape if this shape is to be displayed. Applications do not call this method. - * @param {DrawContext} dc The current draw context. - * @protected - */ -AbstractShape.prototype.doMakeOrderedRenderable = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AbstractShape", "makeOrderedRenderable", "abstractInvocation")); -}; - -/** - * Called during ordered rendering. Subclasses must override this method to render the shape using the current - * shape data. - * @param {DrawContext} dc The current draw context. - * @protected - */ -AbstractShape.prototype.doRenderOrdered = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "AbstractShape", "doRenderOrdered", "abstractInvocation")); -}; - -/** - * Called during ordered rendering. Subclasses may override this method in order to perform operations prior - * to drawing the shape. Applications do not call this method. - * @param {DrawContext} dc The current draw context. - * @protected - */ -AbstractShape.prototype.beginDrawing = function (dc) { -}; - -/** - * Called during ordered rendering. Subclasses may override this method in order to perform operations after - * the shape is drawn. Applications do not call this method. - * @param {DrawContext} dc The current draw context. - * @protected - */ -AbstractShape.prototype.endDrawing = function (dc) { -}; - -// Internal. Intentionally not documented. -AbstractShape.prototype.intersectsFrustum = function (dc) { - if (this.currentData && this.currentData.extent) { - if (dc.pickingMode) { - return this.currentData.extent.intersectsFrustum(dc.pickFrustum); - } else { - return this.currentData.extent.intersectsFrustum(dc.frustumInModelCoordinates); - } - } else { - return true; - } -}; - -// Internal. Intentionally not documented. -AbstractShape.prototype.establishCurrentData = function (dc) { - this.currentData = this.shapeDataCache.entryForKey(dc.globeStateKey); - if (!this.currentData) { - this.currentData = this.createShapeDataObject(); - this.resetExpiration(this.currentData); - this.shapeDataCache.putEntry(dc.globeStateKey, this.currentData, 1); - } - - this.currentData.isExpired = !this.isShapeDataCurrent(dc, this.currentData); -}; - -/** - * Creates a new shape data object for the current globe state. Subclasses may override this method to - * modify the shape data object that this method creates, but must also call this method on this base class. - * Applications do not call this method. - * @returns {Object} The shape data object. - * @protected - */ -AbstractShape.prototype.createShapeDataObject = function () { - return { - transformationMatrix: Matrix.fromIdentity(), - referencePoint: new Vec3(0, 0, 0) - }; -}; - -// Intentionally not documented. -AbstractShape.prototype.resetExpiration = function (shapeData) { - // The random addition in the line below prevents all shapes from regenerating during the same frame. - shapeData.expiryTime = Date.now() + this.expirationInterval + 1e3 * Math.random(); -}; - -/** - * Indicates whether a specified shape data object is current. Subclasses may override this method to add - * criteria indicating whether the shape data object is current, but must also call this method on this base - * class. Applications do not call this method. - * @param {DrawContext} dc The current draw context. - * @param {Object} shapeData The object to validate. - * @returns {Boolean} true if the object is current, otherwise false. - * @protected - */ -AbstractShape.prototype.isShapeDataCurrent = function (dc, shapeData) { - return shapeData.verticalExaggeration === dc.verticalExaggeration - && shapeData.expiryTime > Date.now(); -}; - -// Internal. Intentionally not documented. -AbstractShape.prototype.determineActiveAttributes = function (dc) { - if (this.highlighted && this._highlightAttributes) { - this.activeAttributes = this.highlightAttributes; - } else { - this.activeAttributes = this._attributes; - } -}; - -/** - * Indicates whether this shape is within the current globe's projection limits. Subclasses may implement - * this method to perform the test. The default implementation returns true. Applications do not call this - * method. - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if this shape is is within or intersects the current globe's projection limits, - * otherwise false. - * @protected - */ -AbstractShape.prototype.isWithinProjectionLimits = function (dc) { - return true; -}; - -/** - * Apply the current navigator's model-view-projection matrix. - * @param {DrawContext} dc The current draw context. - * @protected - */ -AbstractShape.prototype.applyMvpMatrix = function (dc) { - this.scratchMatrix.copy(dc.modelviewProjection); - this.scratchMatrix.multiplyMatrix(this.currentData.transformationMatrix); - dc.currentProgram.loadModelviewProjection(dc.currentGlContext, this.scratchMatrix); -}; - -/** - * Apply the current navigator's model-view-projection matrix with an offset to make this shape's outline - * stand out. - * @param {DrawContext} dc The current draw context. - * @protected - */ -AbstractShape.prototype.applyMvpMatrixForOutline = function (dc) { - // Causes the outline to stand out from the interior. - this.scratchMatrix.copy(dc.projection); - this.scratchMatrix.offsetProjectionDepth(-0.001); - this.scratchMatrix.multiplyMatrix(dc.modelview); - this.scratchMatrix.multiplyMatrix(this.currentData.transformationMatrix); - dc.currentProgram.loadModelviewProjection(dc.currentGlContext, this.scratchMatrix); -}; - -export default AbstractShape; diff --git a/web/src/gis/shapes/Annotation.js b/web/src/gis/shapes/Annotation.js deleted file mode 100644 index 6b9a6b6d..00000000 --- a/web/src/gis/shapes/Annotation.js +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import AnnotationAttributes from '../shapes/AnnotationAttributes'; -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import Color from '../util/Color'; -import Font from '../util/Font'; -import Insets from '../util/Insets'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Offset from '../util/Offset'; -import PickedObject from '../pick/PickedObject'; -import Renderable from '../render/Renderable'; -import TextAttributes from '../shapes/TextAttributes'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs an annotation. - * @alias Annotation - * @constructor - * @augments Renderable - * @classdesc Represents an Annotation shape. An annotation displays a callout, a text and a leader pointing - * the annotation's geographic position to the ground. - * @param {Position} position The annotations's geographic position. - * @param {AnnotationAttributes} attributes The attributes to associate with this annotation. - * @throws {ArgumentError} If the specified position is null or undefined. - */ -function Annotation(position, attributes) { - - if (!position) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Annotation", "constructor", "missingPosition")); - } - - Renderable.call(this); - - /** - * This annotation's geographic position. - * @type {Position} - */ - this.position = position; - - /** - * The annotation's attributes. - * @type {AnnotationAttributes} - * @default see [AnnotationAttributes]{@link AnnotationAttributes} - */ - this.attributes = attributes ? attributes : new AnnotationAttributes(null); - - /** - * This annotation's altitude mode. May be one of - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * @default WorldWind.ABSOLUTE - */ - this.altitudeMode = WorldWind.ABSOLUTE; - - // Internal use only. Intentionally not documented. - this.layer = null; - - // Internal use only. Intentionally not documented. - this.lastStateKey = null; - - // Internal use only. Intentionally not documented. - this.calloutTransform = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.calloutOffset = new WorldWind.Offset( - WorldWind.OFFSET_FRACTION, 0.5, - WorldWind.OFFSET_FRACTION, 0); - - // Internal use only. Intentionally not documented. - this.label = ""; - - // Internal use only. Intentionally not documented. - this.labelTexture = null; - - // Internal use only. Intentionally not documented. - this.labelTransform = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.placePoint = new Vec3(0, 0, 0); - - // Internal use only. Intentionally not documented. - this.depthOffset = -2.05; - - // Internal use only. Intentionally not documented. - this.calloutPoints = null; -} - -Annotation.matrix = Matrix.fromIdentity(); -Annotation.screenPoint = new Vec3(0, 0, 0); -Annotation.scratchPoint = new Vec3(0, 0, 0); - -Annotation.prototype = Object.create(Renderable.prototype); - -Object.defineProperties(Annotation.prototype, { - - /** - * The text for this annotation. - * @type {String} - * @memberof Annotation.prototype - */ - text: { - get: function () { - return this.label; - }, - set: function (value) { - this.label = value; - this.lastStateKey = null; - } - } -}); - -/** - * Draws this shape as an ordered renderable. Applications do not call this function. It is called by - * [WorldWindow]{@link WorldWindow} during rendering. - * @param {DrawContext} dc The current draw context. - */ -Annotation.prototype.renderOrdered = function (dc) { - - this.drawOrderedAnnotation(dc); - - if (dc.pickingMode) { - - var po = new PickedObject(this.pickColor.clone(), this, - this.position, this.layer, false); - - if (dc.pickPoint) { - if (this.labelBounds.containsPoint( - dc.convertPointToViewport(dc.pickPoint, Annotation.scratchPoint))) { - po.labelPicked = true; - } - } - - dc.resolvePick(po); - } -}; - -/** - * Creates a new annotation that is a copy of this annotation. - * @returns {Annotation} The new annotation. - */ -Annotation.prototype.clone = function () { - var clone = new Annotation(this.position); - - clone.copy(this); - clone.pickDelegate = this.pickDelegate ? this.pickDelegate : this; - - return clone; -}; - -/** - * Copies the contents of a specified annotation to this annotation. - * @param {Annotation} that The Annotation to copy. - */ -Annotation.prototype.copy = function (that) { - this.position = that.position; - this.enabled = that.enabled; - this.attributes = that.attributes; - this.label = that.label; - this.altitudeMode = that.altitudeMode; - this.pickDelegate = that.pickDelegate; - this.depthOffset = that.depthOffset; - - return this; -}; - -/** - * Renders this annotation. This method is typically not called by applications but is called by - * {@link RenderableLayer} during rendering. For this shape this method creates and - * enques an ordered renderable with the draw context and does not actually draw the annotation. - * @param {DrawContext} dc The current draw context. - */ -Annotation.prototype.render = function (dc) { - - if (!this.enabled) { - return; - } - - if (!dc.accumulateOrderedRenderables) { - return; - } - - if (dc.globe.projectionLimits - && !dc.globe.projectionLimits.containsLocation(this.position.latitude, this.position.longitude)) { - return; - } - - var orderedAnnotation; - if (this.lastFrameTime !== dc.timestamp) { - orderedAnnotation = this.makeOrderedRenderable(dc); - } else { - var annotationCopy = this.clone(); - orderedAnnotation = annotationCopy.makeOrderedRenderable(dc); - } - - if (!orderedAnnotation) { - return; - } - - orderedAnnotation.layer = dc.currentLayer; - - this.lastFrameTime = dc.timestamp; - dc.addOrderedRenderable(orderedAnnotation); -}; - -// Internal. Intentionally not documented. -Annotation.prototype.drawOrderedAnnotation = function (dc) { - this.beginDrawing(dc); - - try { - this.doDrawOrderedAnnotation(dc); - } finally { - this.endDrawing(dc); - } -}; - -/* Intentionally not documented - * Creates an ordered renderable for this shape. - * @protected - * @param {DrawContext} dc The current draw context. - * @returns {OrderedRenderable} The ordered renderable. May be null, in which case an ordered renderable - * cannot be created or should not be created at the time this method is called. - */ -Annotation.prototype.makeOrderedRenderable = function (dc) { - - var w, h, s, iLeft, iRight, iTop, iBottom, - offset, leaderGapHeight; - - // Wraps the text based and the width and height that were set for the - // annotation - this.label = dc.textRenderer.wrap( - this.label, - this.attributes.width, this.attributes.height); - - // Compute the annotation's model point. - dc.surfacePointForMode(this.position.latitude, this.position.longitude, this.position.altitude, - this.altitudeMode, this.placePoint); - - this.eyeDistance = dc.eyePoint.distanceTo(this.placePoint); - - // Compute the annotation's screen point in the OpenGL coordinate system of the WorldWindow - // by projecting its model coordinate point onto the viewport. Apply a depth offset in order - // to cause the annotation to appear above nearby terrain. - if (!dc.projectWithDepth(this.placePoint, this.depthOffset, Annotation.screenPoint)) { - return null; - } - - this.labelTexture = dc.createTextTexture(this.label, this.attributes.textAttributes); - - w = this.labelTexture.imageWidth; - h = this.labelTexture.imageHeight; - s = this.attributes.scale; - iLeft = this.attributes.insets.left; - iRight = this.attributes.insets.right; - iTop = this.attributes.insets.top; - iBottom = this.attributes.insets.bottom; - leaderGapHeight = this.attributes.leaderGapHeight; - - offset = this.calloutOffset.offsetForSize((w + iLeft + iRight) * s, (h + iTop + iBottom) * s); - - this.calloutTransform.setTranslation( - Annotation.screenPoint[0] - offset[0], - Annotation.screenPoint[1] + leaderGapHeight, - Annotation.screenPoint[2]); - - this.labelTransform.setTranslation( - Annotation.screenPoint[0] - offset[0] + iLeft * s, - Annotation.screenPoint[1] + leaderGapHeight + iBottom * s, - Annotation.screenPoint[2]); - - this.labelTransform.setScale(w * s, h * s, 1); - - this.labelBounds = WWMath.boundingRectForUnitQuad(this.labelTransform); - - // Compute dimensions of the callout taking in consideration the insets - var width = (w + iLeft + iRight) * s; - var height = (h + iTop + iBottom) * s; - - var leaderOffsetX = width / 2; - - var leaderOffsetY = -leaderGapHeight; - - if (!this.attributes.drawLeader) { - leaderOffsetY = 0; - } - - if (this.attributes.stateKey !== this.lastStateKey) { - this.calloutPoints = this.createCallout( - width, height, - leaderOffsetX, leaderOffsetY, - this.attributes.leaderGapWidth, this.attributes.cornerRadius); - } - - return this; -}; - -// Internal. Intentionally not documented. -Annotation.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext, - program; - - dc.findAndBindProgram(BasicTextureProgram); - - program = dc.currentProgram; - - gl.enableVertexAttribArray(program.vertexPointLocation); - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - - program.loadModulateColor(gl, dc.pickingMode); -}; - -// Internal. Intentionally not documented. -Annotation.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram; - - // Clear the vertex attribute state. - gl.disableVertexAttribArray(program.vertexPointLocation); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - - // Clear GL bindings. - dc.bindProgram(null); -}; - -// Internal. Intentionally not documented. -Annotation.prototype.drawCorner = function (x0, y0, cornerRadius, start, end, steps, buffer, startIdx) { - if (cornerRadius < 1) { - return startIdx; - } - - var step = (end - start) / (steps - 1); - for (var i = 1; i < steps - 1; i++) { - var a = start + step * i; - var x = x0 + Math.cos(a) * cornerRadius; - var y = y0 + Math.sin(a) * cornerRadius; - buffer[startIdx++] = x; - buffer[startIdx++] = y; - } - - return startIdx; -}; - -// Internal. Intentionally not documented. -Annotation.prototype.createCallout = function (width, height, leaderOffsetX, leaderOffsetY, leaderGapWidth, - cornerRadius) { - - var cornerSteps = 16; - - var numVertices = 2 * (12 + (cornerRadius < 1 ? 0 : 4 * (cornerSteps - 2))); - - var buffer = new Float32Array(numVertices); - - var idx = 0; - - //Bottom right - buffer[idx++] = width / 2 + leaderGapWidth / 2; - buffer[idx++] = 0; - buffer[idx++] = width - cornerRadius; - buffer[idx++] = 0; - idx = this.drawCorner(width - cornerRadius, cornerRadius, cornerRadius, -Math.PI / 2, 0, - cornerSteps, buffer, idx); - - //Right - buffer[idx++] = width; - buffer[idx++] = cornerRadius; - buffer[idx++] = width; - buffer[idx++] = height - cornerRadius; - idx = this.drawCorner(width - cornerRadius, height - cornerRadius, cornerRadius, 0, Math.PI / 2, - cornerSteps, buffer, idx); - - //Top - buffer[idx++] = width - cornerRadius; - buffer[idx++] = height; - buffer[idx++] = cornerRadius; - buffer[idx++] = height; - idx = this.drawCorner(cornerRadius, height - cornerRadius, cornerRadius, Math.PI / 2, Math.PI, - cornerSteps, buffer, idx); - - //Left - buffer[idx++] = 0; - buffer[idx++] = height - cornerRadius; - buffer[idx++] = 0; - buffer[idx++] = cornerRadius; - idx = this.drawCorner(cornerRadius, cornerRadius, cornerRadius, Math.PI, Math.PI * 1.5, - cornerSteps, buffer, idx); - - //Bottom left - buffer[idx++] = cornerRadius; - buffer[idx++] = 0; - buffer[idx++] = width / 2 - leaderGapWidth / 2; - buffer[idx++] = 0; - - //Draw leader - buffer[idx++] = leaderOffsetX; - buffer[idx++] = leaderOffsetY; - - buffer[idx++] = width / 2 + leaderGapWidth / 2; - buffer[idx] = 0; - - return buffer; -}; - -// Internal. Intentionally not documented. -Annotation.prototype.doDrawOrderedAnnotation = function (dc) { - - var gl = dc.currentGlContext, - program = dc.currentProgram, - textureBound; - - var refreshBuffers = false; - - if (dc.pickingMode) { - this.pickColor = dc.uniquePickColor(); - } - - program.loadOpacity(gl, dc.pickingMode ? 1 : this.attributes.opacity * this.layer.opacity); - - // Attributes have changed. We need to track this because the callout vbo data may - // have changed if scaled or text wrapping changes callout dimensions - var calloutAttributesChanged = this.attributes.stateKey !== this.lastStateKey; - - // Create new cache key if callout drawing points have changed - if (!this.calloutCacheKey || calloutAttributesChanged) { - this.calloutCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - var calloutVboId = dc.gpuResourceCache.resourceForKey(this.calloutCacheKey); - - if (!calloutVboId) { - calloutVboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(this.calloutCacheKey, calloutVboId, - this.calloutPoints.length * 4); - - refreshBuffers = true; - } - - // Remove the last generated vbo data if attributes changed - if (calloutAttributesChanged && this.calloutCacheKey) { - dc.gpuResourceCache.removeResource(this.calloutCacheKey); - } - - // Store current statekey because we are no longer using it - // in this iteration - this.lastStateKey = this.attributes.stateKey; - - // Compute and specify the MVP matrix. - Annotation.matrix.copy(dc.screenProjection); - Annotation.matrix.multiplyMatrix(this.calloutTransform); - program.loadModelviewProjection(gl, Annotation.matrix); - - gl.bindBuffer(gl.ARRAY_BUFFER, calloutVboId); - - if (refreshBuffers) { - gl.bufferData(gl.ARRAY_BUFFER, - this.calloutPoints, gl.STATIC_DRAW); - - dc.frameStatistics.incrementVboLoadCount(1); - } - - program.loadColor(gl, dc.pickingMode ? this.pickColor : this.attributes.backgroundColor); - program.loadTextureEnabled(gl, false); - - gl.vertexAttribPointer(program.vertexPointLocation, 2, gl.FLOAT, false, 0, 0); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, 0, 0); - - gl.drawArrays(gl.TRIANGLE_FAN, 0, this.calloutPoints.length / 2); - - // Draw text - Annotation.matrix.copy(dc.screenProjection); - Annotation.matrix.multiplyMatrix(this.labelTransform); - program.loadModelviewProjection(gl, Annotation.matrix); - - Annotation.matrix.setToIdentity(); - Annotation.matrix.multiplyByTextureTransform(this.labelTexture); - program.loadTextureMatrix(gl, Annotation.matrix); - - program.loadColor(gl, dc.pickingMode ? this.pickColor : Color.WHITE); - textureBound = this.labelTexture.bind(dc); - program.loadTextureEnabled(gl, textureBound); - - // Configure GL to use the draw context's unit quad VBOs for both model coordinates and texture coordinates. - // Most browsers can share the same buffer for vertex and texture coordinates, but Internet Explorer requires - // that they be in separate buffers, so the code below uses the 3D buffer for vertex coords and the 2D - // buffer for texture coords. - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer3()); - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer()); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, 0, 0); - - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); -}; - -export default Annotation; diff --git a/web/src/gis/shapes/AnnotationAttributes.js b/web/src/gis/shapes/AnnotationAttributes.js deleted file mode 100644 index 87488644..00000000 --- a/web/src/gis/shapes/AnnotationAttributes.js +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import Color from '../util/Color'; -import Font from '../util/Font'; -import Insets from '../util/Insets'; -import TextAttributes from '../shapes/TextAttributes'; - - -/** - * Constructs an annotation attributes bundle. - * @alias AnnotationAttributes - * @constructor - * @classdesc Holds attributes applied to {@link Annotation} shapes. - * @param {AnnotationAttributes} attributes Attributes to initialize this attributes instance to. May be null, - * in which case the new instance contains default attributes. - */ -function AnnotationAttributes(attributes) { - - // These are all documented with their property accessors below. - this._cornerRadius = attributes ? attributes._cornerRadius : 0; - this._insets = attributes ? attributes._insets : new Insets(0, 0, 0, 0); - this._backgroundColor = attributes ? attributes._backgroundColor.clone() : Color.WHITE.clone(); - this._leaderGapWidth = attributes ? attributes._leaderGapWidth : 40; - this._leaderGapHeight = attributes ? attributes._leaderGapHeight : 30; - this._opacity = attributes ? attributes._opacity : 1; - this._scale = attributes ? attributes._scale : 1; - this._drawLeader = attributes ? attributes._drawLeader : true; - this._width = attributes ? attributes._width : 200; - this._height = attributes ? attributes._height : 100; - this._textAttributes = attributes ? attributes._textAttributes : this.createDefaultTextAttributes(); - - /** - * Indicates whether this object's state key is invalid. Subclasses must set this value to true when their - * attributes change. The state key will be automatically computed the next time it's requested. This flag - * will be set to false when that occurs. - * @type {Boolean} - * @protected - */ - this.stateKeyInvalid = true; -} - -/** - * Computes the state key for this attributes object. Subclasses that define additional attributes must - * override this method, call it from that method, and append the state of their attributes to its - * return value. - * @returns {String} The state key for this object. - * @protected - */ -AnnotationAttributes.prototype.computeStateKey = function () { - return "wi " + this._width - + " he " + this._height - + " cr " + this._cornerRadius - + " in " + this._insets.toString() - + " bg " + this.backgroundColor.toHexString(true) - + " dl " + this.drawLeader - + " lgw " + this.leaderGapWidth - + " lgh " + this.leaderGapHeight - + " op " + this.opacity - + " ta " + this._textAttributes.stateKey - + " sc " + this.scale; -}; - -// Internal use only. Intentionally not documented. -AnnotationAttributes.prototype.createDefaultTextAttributes = function () { - var attributes = new TextAttributes(null); - attributes.enableOutline = false; // Annotations display text without an outline by default - return attributes; -}; - -Object.defineProperties(AnnotationAttributes.prototype, { - - /** - * Indicates the width of the callout. - * @type {Number} - * @default 200 - * @memberof AnnotationAttributes.prototype - */ - width: { - get: function () { - return this._width; - }, - set: function (value) { - this._width = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates height of the callout. - * @type {Number} - * @default 100 - * @memberof AnnotationAttributes.prototype - */ - height: { - get: function () { - return this._height; - }, - set: function (value) { - this._height = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the radius for the corners. - * @type {Number} - * @default 0 - * @memberof AnnotationAttributes.prototype - */ - cornerRadius: { - get: function () { - return this._cornerRadius; - }, - set: function (value) { - this._cornerRadius = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the insets instance of this object. - * Insets adjusts top, bottom, left, right padding for the text. - * @type {Insets} - * @default 0, 0, 0, 0 - * @memberof AnnotationAttributes.prototype - */ - insets: { - get: function () { - return this._insets; - }, - set: function (value) { - this._insets = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the background color of the callout. - * @type {Color} - * @default White - * @memberof AnnotationAttributes.prototype - */ - backgroundColor: { - get: function () { - return this._backgroundColor; - }, - set: function (value) { - this._backgroundColor = value; - this.stateKeyInvalid = true; - } - }, - - - /** - * Indicates the attributes to apply to the annotation's text. - * @type {TextAttributes} - * @default The defaults of {@link TextAttributes}. - * @memberof AnnotationAttributes.prototype - */ - textAttributes: { - get: function () { - return this._textAttributes; - }, - set: function (value) { - this._textAttributes = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether to draw a leader pointing to the annotation's geographic position. - * @type {Boolean} - * @default true - * @memberof AnnotationAttributes.prototype - */ - drawLeader: { - get: function () { - return this._drawLeader; - }, - set: function (value) { - this._drawLeader = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the gap width of the leader in pixels. - * @type {Number} - * @default 40 - * @memberof AnnotationAttributes.prototype - */ - leaderGapWidth: { - get: function () { - return this._leaderGapWidth; - }, - set: function (value) { - this._leaderGapWidth = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the gap height of the leader in pixels. - * @type {Number} - * @default 30 - * @memberof AnnotationAttributes.prototype - */ - leaderGapHeight: { - get: function () { - return this._leaderGapHeight; - }, - set: function (value) { - this._leaderGapHeight = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the opacity of the annotation. - * The value ranges from 0 to 1. - * Opacity affects both callout and text. - * @type {Number} - * @default 1 - * @memberof AnnotationAttributes.prototype - */ - opacity: { - get: function () { - return this._opacity; - }, - set: function (value) { - this._opacity = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the scale multiplier. - * @type {Number} - * @default 1 - * @memberof AnnotationAttributes.prototype - */ - scale: { - get: function () { - return this._scale; - }, - set: function (value) { - this._scale = value; - this.stateKeyInvalid = true; - } - }, - - /** - * A string identifying the state of this attributes object. The string encodes the current values of all - * this object's properties. It's typically used to validate cached representations of shapes associated - * with this attributes object. - * @type {String} - * @readonly - * @memberof AnnotationAttributes.prototype - */ - stateKey: { - get: function () { - if (this.stateKeyInvalid) { - this._stateKey = this.computeStateKey(); - this.stateKeyInvalid = false; - } - return this._stateKey; - } - } -}); - -export default AnnotationAttributes; diff --git a/web/src/gis/shapes/Compass.js b/web/src/gis/shapes/Compass.js deleted file mode 100644 index 9afcde7d..00000000 --- a/web/src/gis/shapes/Compass.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Compass - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Offset from '../util/Offset'; -import ScreenImage from '../shapes/ScreenImage'; - - -/** - * Constructs a compass. - * @alias Compass - * @constructor - * @augments ScreenImage - * @classdesc Displays a compass image at a specified location in the WorldWindow. The compass image rotates - * and tilts to reflect the current navigator's heading and tilt. - * @param {Offset} screenOffset The offset indicating the image's placement on the screen. If null or undefined - * the compass is placed at the upper-right corner of the WorldWindow. - * Use [the image offset property]{@link ScreenImage#imageOffset} to position the image relative to the - * screen point. - * @param {String} imagePath The URL of the image to display. If null or undefined, a default compass image is used. - */ -function Compass(screenOffset, imagePath) { - - var sOffset = screenOffset ? screenOffset - : new Offset(WorldWind.OFFSET_FRACTION, 1, WorldWind.OFFSET_FRACTION, 1), // upper-right placement - iPath = imagePath ? imagePath : WorldWind.configuration.baseUrl + "images/notched-compass.png"; - - ScreenImage.call(this, sOffset, iPath); - - // Must set the default image offset after calling the constructor above. - - if (!screenOffset) { - // Align the upper right corner of the image with the screen point, and give the image some padding. - this.imageOffset = new Offset(WorldWind.OFFSET_FRACTION, 1.1, WorldWind.OFFSET_FRACTION, 1.1); - } - - /** - * Specifies the size of the compass as a fraction of the WorldWindow width. - * @type {number} - * @default 0.15 - */ - this.size = 0.15; -} - -Compass.prototype = Object.create(ScreenImage.prototype); - -/** - * Capture the navigator's heading and tilt and apply it to the compass' screen image. - * @param {DrawContext} dc The current draw context. - */ -Compass.prototype.render = function (dc) { - // Capture the navigator's heading and tilt and apply it to the compass' screen image. - this.imageRotation = dc.navigator.heading; - this.imageTilt = dc.navigator.tilt; - - var t = this.getActiveTexture(dc); - if (t) { - this.imageScale = this.size * dc.currentGlContext.drawingBufferWidth / t.imageWidth; - } - - ScreenImage.prototype.render.call(this, dc); -}; - -export default Compass; diff --git a/web/src/gis/shapes/GeographicMesh.js b/web/src/gis/shapes/GeographicMesh.js deleted file mode 100644 index d10046a3..00000000 --- a/web/src/gis/shapes/GeographicMesh.js +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GeographicMesh - */ -import AbstractMesh from '../shapes/AbstractMesh'; -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import BoundingBox from '../geom/BoundingBox'; -import Color from '../util/Color'; -import ImageSource from '../util/ImageSource'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import Position from '../geom/Position'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfacePolygon from '../shapes/SurfacePolygon'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a geographic mesh. - * @alias GeographicMesh - * @constructor - * @augments AbstractMesh - * @classdesc Represents a 3D geographic mesh. - * <p> - * Altitudes within the mesh's positions are interpreted according to the mesh's altitude mode, which - * can be one of the following: - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * If the latter, the mesh positions' altitudes are ignored. (If the mesh should be draped onto the - * terrain, you might want to use {@link SurfacePolygon} instead.) - * <p> - * Meshes have separate attributes for normal display and highlighted display. They use the interior and - * outline attributes of {@link ShapeAttributes}. If those attributes identify an image, that image is - * applied to the mesh. Texture coordinates for the image may be specified, but if not specified the full - * image is stretched over the full mesh. If texture coordinates are specified, there must be one texture - * coordinate for each vertex in the mesh. - * - * @param {Position[][]} positions A two-dimensional array containing the mesh vertices. - * Each entry of the array specifies the vertices of one row of the mesh. The arrays for all rows must - * have the same length. There must be at least two rows, and each row must have at least two vertices. - * There must be no more than 65536 positions. - * @param {ShapeAttributes} attributes The attributes to associate with this mesh. May be null, in which case - * default attributes are associated. - * - * @throws {ArgumentError} If the specified positions array is null or undefined, the number of rows or the - * number of vertices per row is less than 2, the array lengths are inconsistent, or too many positions are - * specified (limit is 65536). - */ -function GeographicMesh(positions, attributes) { - if (!positions) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "constructor", "missingPositions")); - } - - if (positions.length < 2 || positions[0].length < 2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "constructor", - "Number of positions is insufficient.")); - } - - // Check for size limit, which is the max number of available indices for a 16-bit unsigned int. - if (positions.length * positions[0].length > 65536) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "constructor", - "Too many positions. Must be fewer than 65536. Try using multiple meshes.")); - } - - var length = positions[0].length; - for (var i = 1; i < positions.length; i++) { - if (positions[i].length !== length) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "constructor", - "Array lengths are inconsistent.")); - } - } - - var numRows = positions.length, - numCols = positions[0].length; - - AbstractMesh.call(this, attributes); - - /** - * Indicates whether this mesh is pickable when the pick point intersects transparent pixels of the - * image applied to this mesh. If no image is applied to this mesh, this property is ignored. If this - * property is true and an image with fully transparent pixels is applied to the mesh, the mesh is - * pickable at those transparent pixels, otherwise this mesh is not pickable at those transparent pixels. - * @type {Boolean} - * @default true - */ - this.pickTransparentImagePixels = true; - - // Private. Documentation is with the defined property below and the constructor description above. - this._positions = positions; - - // Private. Documentation is with the defined property below. - this._altitudeScale = 1; - - // Internal. Intentionally not documented. - this.numRows = numRows; - this.numColumns = numCols; - - // Internal. Intentionally not documented. - this._textureCoordinates = null; - - // Internal. Intentionally not documented. - this.referencePosition = this.determineReferencePosition(this._positions); -} - -GeographicMesh.prototype = Object.create(AbstractMesh.prototype); - -Object.defineProperties(GeographicMesh.prototype, { - /** - * This mesh's positions. Each array in the positions array specifies the geographic positions of one - * row of the mesh. - * - * @type {Position[][]} - * @memberof GeographicMesh.prototype - */ - positions: { - get: function () { - return this._positions; - }, - set: function (positions) { - if (!positions) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "positions", "missingPositions")); - } - - if (positions.length < 2 || positions[0].length < 2) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "positions", - "Number of positions is insufficient.")); - } - - var length = positions[0].length; - for (var i = 1; i < positions.length; i++) { - if (positions[i].length !== length) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "positions", - "Array lengths are inconsistent.")); - } - } - - this.numRows = positions.length; - this.numColumns = positions[0].length; - - this._positions = positions; - this.referencePosition = this.determineReferencePosition(this._positions); - this.reset(); - - this.meshIndices = null; - this.outlineIndices = null; - } - }, - - /** - * This mesh's texture coordinates if this mesh is textured. A texture coordinate must be - * provided for each mesh position. The texture coordinates are specified as a two-dimensional array, - * each entry of which specifies the texture coordinates for one row of the mesh. Each texture coordinate - * is a {@link Vec2} containing the s and t coordinates. If no texture coordinates are specified and - * the attributes associated with this mesh indicate an image source, then texture coordinates are - * automatically generated for the mesh. - * @type {Vec2[][]} - * @default null - * @memberof GeographicMesh.prototype - */ - textureCoordinates: { - get: function () { - return this._textureCoordinates; - }, - set: function (coords) { - - if (coords && coords.length != this.numRows) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "textureCoordinates", - "Number of texture coordinate rows is inconsistent with the currently specified positions.")); - } - - for (var i = 0; i < this.numRows; i++) { - if (coords[i].length !== this.numColumns) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "GeographicMesh", "textureCoordinates", - "Texture coordinate row lengths are inconsistent with the currently specified positions.")); - } - } - - this._textureCoordinates = coords; - this.reset(); - this.texCoords = null; - } - } -}); - -GeographicMesh.makeGridIndices = function (nRows, nCols) { - // Compute indices for individual triangles. - - var gridIndices = [], - i = 0; - - for (var r = 0; r < nRows - 1; r++) { - for (var c = 0; c < nCols - 1; c++) { - var k = r * nCols + c; - - gridIndices[i++] = k; - gridIndices[i++] = k + 1; - gridIndices[i++] = k + nCols; - gridIndices[i++] = k + 1; - gridIndices[i++] = k + 1 + nCols; - gridIndices[i++] = k + nCols; - } - } - - return gridIndices; -}; - -// Intentionally not documented. -GeographicMesh.prototype.determineReferencePosition = function (positions) { - // Assign the first position as the reference position. - return positions[0][0]; -}; - -// Overridden from AbstractShape base class. -GeographicMesh.prototype.createSurfaceShape = function () { - var boundaries = []; - - for (var c = 0; c < this.numColumns; c++) { - boundaries.push(this._positions[0][c]); - } - - for (var r = 1; r < this.numRows; r++) { - boundaries.push(this._positions[r][this.numColumns - 1]); - } - - for (c = this.numColumns - 2; c >= 0; c--) { - boundaries.push(this._positions[this.numRows - 1][c]); - } - - for (r = this.numRows - 2; r > 0; r--) { - boundaries.push(this._positions[r][0]); - } - - return new SurfacePolygon(boundaries, null); -}; - -GeographicMesh.prototype.computeMeshPoints = function (dc, currentData) { - // Unwrap the mesh row arrays into one long array. - - var eyeDistSquared = Number.MAX_VALUE, - eyePoint = dc.eyePoint, - meshPoints = new Float32Array(this.numRows * this.numColumns * 3), - pt = new Vec3(0, 0, 0), - k = 0, - pos, dSquared; - - for (var r = 0; r < this._positions.length; r++) { - for (var c = 0, len = this._positions[r].length; c < len; c++) { - pos = this._positions[r][c]; - - dc.surfacePointForMode(pos.latitude, pos.longitude, pos.altitude * this._altitudeScale, - this.altitudeMode, pt); - - dSquared = pt.distanceToSquared(eyePoint); - if (dSquared < eyeDistSquared) { - eyeDistSquared = dSquared; - } - - pt.subtract(this.currentData.referencePoint); - - meshPoints[k++] = pt[0]; - meshPoints[k++] = pt[1]; - meshPoints[k++] = pt[2]; - } - } - - currentData.eyeDistance = Math.sqrt(eyeDistSquared); - - return meshPoints; -}; - -GeographicMesh.prototype.computeTexCoords = function () { - if (this._textureCoordinates) { - return this.computeExplicitTexCoords(); - } else { - return this.computeImplicitTexCoords(); - } -}; - -// Intentionally not documented. -GeographicMesh.prototype.computeExplicitTexCoords = function () { - // Capture the texture coordinates to a single array parallel to the mesh points array. - - var texCoords = new Float32Array(2 * this.numRows * this.numColumns), - k = 0; - - for (var r = 0; r < this._textureCoordinates.length; r++) { - for (var c = 0, len = this._textureCoordinates[r].length; c < len; c++) { - var texCoord = this._textureCoordinates[r][c]; - - texCoords[k++] = texCoord[0]; - texCoords[k++] = texCoord[1]; - } - } - - return texCoords; -}; - -// Intentionally not documented. -GeographicMesh.prototype.computeImplicitTexCoords = function () { - // Create texture coordinates that map the full image source into the full mesh. - - var texCoords = new Float32Array(2 * this.numRows * this.numColumns), - rowDelta = 1.0 / (this.numRows - 1), - columnDelta = 1.0 / (this.numColumns - 1), - k = 0; - - for (var r = 0; r < this._positions.length; r++) { - var t = r === this.numRows - 1 ? 1.0 : r * rowDelta; - - for (var c = 0, len = this._positions[r].length; c < len; c++) { - texCoords[k++] = c === this.numColumns - 1 ? 1.0 : c * columnDelta; - texCoords[k++] = t; - } - } - - return texCoords; -}; - -GeographicMesh.prototype.computeMeshIndices = function () { - // Compute indices for individual triangles. - - var meshIndices = new Uint16Array((this.numRows - 1) * (this.numColumns - 1) * 6), - i = 0; - - for (var r = 0; r < this.numRows - 1; r++) { - for (var c = 0; c < this.numColumns - 1; c++) { - var k = r * this.numColumns + c; - - meshIndices[i++] = k; - meshIndices[i++] = k + 1; - meshIndices[i++] = k + this.numColumns; - meshIndices[i++] = k + 1; - meshIndices[i++] = k + 1 + this.numColumns; - meshIndices[i++] = k + this.numColumns; - } - } - - return meshIndices; -}; - -GeographicMesh.prototype.computeOutlineIndices = function () { - // Walk the mesh boundary and capture those positions for the outline. - - var outlineIndices = new Uint16Array(2 * this.numRows + 2 * this.numColumns), - k = 0; - - for (var c = 0; c < this.numColumns; c++) { - outlineIndices[k++] = c; - } - - for (var r = 1; r < this.numRows; r++) { - outlineIndices[k++] = (r + 1) * this.numColumns - 1; - } - - for (c = this.numRows * this.numColumns - 2; c >= (this.numRows - 1) * this.numColumns; c--) { - outlineIndices[k++] = c; - } - - for (r = this.numRows - 2; r >= 0; r--) { - outlineIndices[k++] = r * this.numColumns; - } - - return outlineIndices; -}; - -export default GeographicMesh; diff --git a/web/src/gis/shapes/GeographicText.js b/web/src/gis/shapes/GeographicText.js deleted file mode 100644 index 5f485b2e..00000000 --- a/web/src/gis/shapes/GeographicText.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GeographicText - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Text from '../shapes/Text'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a geographic text shape at a specified position. - * @alias GeographicText - * @constructor - * @augments Text - * @classdesc Represents a string of text displayed at a geographic position. - * <p> - * See also {@link ScreenText}. - * - * @param {Position} position The text's geographic position. - * @param {String} text The text to display. - * @throws {ArgumentError} If either the specified position or text is null or undefined. - */ -function GeographicText(position, text) { - if (!position) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Text", "constructor", "missingPosition")); - } - - Text.call(this, text); - - /** - * This text's geographic position. - * The [TextAttributes.offset]{@link TextAttributes#offset} property indicates the relationship of the - * text string to this position. - * @type {Position} - */ - this.position = position; - - /** - * Indicates the group ID of the declutter group to include this Text shape. This shape - * is decluttered relative to all other shapes within its group by the default - * [declutter filter]{@link WorldWindow#declutter}. To prevent decluttering of this shape, set its - * declutter group to 0. - * @type {Number} - * @default 1 - */ - this.declutterGroup = 1; -} - -// Internal use only. Intentionally not documented. -GeographicText.placePoint = new Vec3(0, 0, 0); // Cartesian point corresponding to this placemark's geographic position - -GeographicText.prototype = Object.create(Text.prototype); - -/** - * Creates a new geographic text object that is a copy of this one. - * @returns {GeographicText} The new geographic text object. - */ -GeographicText.prototype.clone = function () { - var clone = new GeographicText(this.position, this.text); - - clone.copy(this); - clone.pickDelegate = this.pickDelegate ? this.pickDelegate : this; - - return clone; -}; - -// Documented in superclass. -GeographicText.prototype.render = function (dc) { - // Filter out instances outside any projection limits. - if (dc.globe.projectionLimits - && !dc.globe.projectionLimits.containsLocation(this.position.latitude, this.position.longitude)) { - return; - } - - Text.prototype.render.call(this, dc); -}; - -// Documented in superclass. -GeographicText.prototype.computeScreenPointAndEyeDistance = function (dc) { - // Compute the text's model point and corresponding distance to the eye point. - dc.surfacePointForMode(this.position.latitude, this.position.longitude, this.position.altitude, - this.altitudeMode, GeographicText.placePoint); - - if (!dc.frustumInModelCoordinates.containsPoint(GeographicText.placePoint)) { - return false; - } - - this.eyeDistance = this.alwaysOnTop ? 0 : dc.eyePoint.distanceTo(GeographicText.placePoint); - - // Compute the text's screen point in the OpenGL coordinate system of the WorldWindow by projecting its model - // coordinate point onto the viewport. Apply a depth offset in order to cause the text to appear above nearby - // terrain. When text is displayed near the terrain portions of its geometry are often behind the terrain, - // yet as a screen element the text is expected to be visible. We adjust its depth values rather than moving - // the text itself to avoid obscuring its actual position. - if (!dc.projectWithDepth(GeographicText.placePoint, this.depthOffset, this.screenPoint)) { - return false; - } - - return true; -}; - -export default GeographicText; diff --git a/web/src/gis/shapes/Path.js b/web/src/gis/shapes/Path.js deleted file mode 100644 index da48c04a..00000000 --- a/web/src/gis/shapes/Path.js +++ /dev/null @@ -1,624 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Path - */ -import AbstractShape from '../shapes/AbstractShape'; -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import BoundingBox from '../geom/BoundingBox'; -import Color from '../util/Color'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import Position from '../geom/Position'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfacePolyline from '../shapes/SurfacePolyline'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a path. - * @alias Path - * @constructor - * @augments AbstractShape - * @classdesc Represents a line, curve or curtain between specified positions. The path is drawn between input - * positions to achieve a specified path type, which can be one of the following: - * <ul> - * <li>[WorldWind.GREAT_CIRCLE]{@link WorldWind#GREAT_CIRCLE}</li> - * <li>[WorldWind.RHUMB_LINE]{@link WorldWind#RHUMB_LINE}</li> - * <li>[WorldWind.LINEAR]{@link WorldWind#LINEAR}</li> - * </ul> - * <p> - * Paths conform to the terrain if the path's [followTerrain]{@link Path#followTerrain} property is true. - * <p> - * Altitudes within the path's positions are interpreted according to the path's altitude mode, which - * can be one of the following: - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * If the latter, the path positions' altitudes are ignored. - * <p> - * Paths have separate attributes for normal display and highlighted display. They use the interior and - * outline attributes of {@link ShapeAttributes} but do not use the image attributes. - * <p> - * A path displays as a curtain if its [extrude]{@link Path#extrude} property is true. A curtain extends - * from the line formed by the path positions to the ground. - * <p> - * This shape uses a {@link SurfacePolyline} when drawing on 2D globes and this shape's - * [useSurfaceShapeFor2D]{@link AbstractShape#useSurfaceShapeFor2D} is true. - * - * @param {Position[]} positions An array containing the path positions. - * @param {ShapeAttributes} attributes The attributes to associate with this path. May be null, in which case - * default attributes are associated. - * @throws {ArgumentError} If the specified positions array is null or undefined. - */ -function Path(positions, attributes) { - if (!positions) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Path", "constructor", "missingPositions")); - } - - AbstractShape.call(this, attributes); - - // Private. Documentation is with the defined property below. - this._positions = positions; - - // Private. Documentation is with the defined property below. - this._pathType = WorldWind.GREAT_CIRCLE; - - // Private. Documentation is with the defined property below. - this._terrainConformance = 10; - - // Private. Documentation is with the defined property below. - this._numSubSegments = 10; - - this.referencePosition = this.determineReferencePosition(this._positions); - - this.scratchPoint = new Vec3(0, 0, 0); // scratch variable -} - -Path.prototype = Object.create(AbstractShape.prototype); - -Object.defineProperties(Path.prototype, { - /** - * This path's positions. - * @type {Position[]} - * @memberof Path.prototype - */ - positions: { - get: function () { - return this._positions; - }, - set: function (positions) { - if (!positions) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Path", "constructor", "missingPositions")); - } - - this._positions = positions; - this.referencePosition = this.determineReferencePosition(this._positions); - this.reset(); - } - }, - - /** - * Indicates whether this path should conform to the terrain. - * @type {Boolean} - * @default false - * @memberof Path.prototype - */ - followTerrain: { - get: function () { - return this._followTerrain; - }, - set: function (followTerrain) { - this._followTerrain = followTerrain; - this.reset(); - } - }, - - /** - * Specifies how accurately this path must adhere to the terrain when the path is terrain following. The value - * specifies the maximum number of pixels between tessellation points. Lower values increase accuracy but decrease - * performance. - * @type {Number} - * @default 10 - * @memberof Path.prototype - */ - terrainConformance: { - get: function () { - return this._terrainConformance; - }, - set: function (terrainConformance) { - this._terrainConformance = terrainConformance; - this.reset(); - } - }, - - /** - * Specifies the number of segments used between specified positions to achieve this path's path type. Higher values - * cause the path to conform more closely to the path type but decrease performance. - * <p/> - * Note: The sub-segments number is ignored when the path follows terrain or when the path type is - * WorldWind.LINEAR. - * @type {Number} - * @default 10 - * @memberof Path.prototype - */ - numSubSegments: { - get: function () { - return this._numSubSegments; - }, - set: function (numSubSegments) { - this._numSubSegments = numSubSegments >= 0 ? numSubSegments : 0; - this.reset(); - } - }, - - /** - * The type of path to follow when drawing the path. Recognized values are: - * <ul> - * <li>[WorldWind.GREAT_CIRCLE]{@link WorldWind#GREAT_CIRCLE}</li> - * <li>[WorldWind.RHUMB_LINE]{@link WorldWind#RHUMB_LINE}</li> - * <li>[WorldWind.LINEAR]{@link WorldWind#LINEAR}</li> - * </ul> - * @type {String} - * @default WorldWind.GREAT_CIRCLE - * @memberof Path.prototype - */ - pathType: { - get: function () { - return this._pathType; - }, - set: function (pathType) { - this._pathType = pathType; - this.reset(); - } - }, - - /** - * Specifies whether to extrude this path to the ground by drawing a filled interior from the path to the - * terrain. The filled interior uses this path's interior attributes. - * @type {Boolean} - * @default false - * @memberof Path.prototype - */ - extrude: { - get: function () { - return this._extrude; - }, - set: function (extrude) { - this._extrude = extrude; - this.reset(); - } - } -}); - -// Intentionally not documented. -Path.prototype.determineReferencePosition = function (positions) { - // Assign the first position as the reference position. - return positions.length > 0 ? positions[0] : null; -}; - -// Internal. Determines whether this shape's geometry must be re-computed. -Path.prototype.mustGenerateGeometry = function (dc) { - if (!this.currentData.tessellatedPoints) { - return true; - } - - if (this.currentData.drawInterior !== this.activeAttributes.drawInterior - || this.currentData.drawVerticals !== this.activeAttributes.drawVerticals) { - return true; - } - - if (!this.followTerrain && this.currentData.numSubSegments !== this.numSubSegments) { - return true; - } - - if (this.followTerrain && this.currentData.terrainConformance !== this.terrainConformance) { - return true; - } - - if (this.altitudeMode === WorldWind.ABSOLUTE) { - return false; - } - - return this.currentData.isExpired; -}; - -Path.prototype.createSurfaceShape = function () { - return new SurfacePolyline(this.positions, null); -}; - -// Overridden from AbstractShape base class. -Path.prototype.doMakeOrderedRenderable = function (dc) { - // A null reference position is a signal that there are no positions to render. - if (!this.referencePosition) { - return null; - } - - // See if the current shape data can be re-used. - if (!this.mustGenerateGeometry(dc)) { - return this; - } - - // Set the transformation matrix to correspond to the reference position. - var refPt = this.currentData.referencePoint; - dc.surfacePointForMode(this.referencePosition.latitude, this.referencePosition.longitude, - this.referencePosition.altitude, this._altitudeMode, refPt); - this.currentData.transformationMatrix.setToTranslation(refPt[0], refPt[1], refPt[2]); - - // Tessellate the path in geographic coordinates. - var tessellatedPositions = this.makeTessellatedPositions(dc); - if (tessellatedPositions.length < 2) { - return null; - } - - // Convert the tessellated geographic coordinates to the Cartesian coordinates that will be rendered. - var tessellatedPoints = this.computeRenderedPath(dc, tessellatedPositions); - - this.currentData.tessellatedPoints = tessellatedPoints; - this.currentData.drawInterior = this.activeAttributes.drawInterior; - this.currentData.drawVerticals = this.activeAttributes.drawVerticals; - this.currentData.numSubSegments = this.numSubSegments; - this.currentData.terrainConformance = this.terrainConformance; - this.resetExpiration(this.currentData); - this.currentData.fillVbo = true; - - // Create the extent from the Cartesian points. Those points are relative to this path's reference point, so - // translate the computed extent to the reference point. - if (!this.currentData.extent) { - this.currentData.extent = new BoundingBox(); - } - this.currentData.extent.setToPoints(tessellatedPoints); - this.currentData.extent.translate(this.currentData.referencePoint); - - return this; -}; - -// Private. Intentionally not documented. -Path.prototype.makeTessellatedPositions = function (dc) { - var tessellatedPositions = [], - eyePoint = dc.eyePoint, - showVerticals = this.mustDrawVerticals(dc), - ptA = new Vec3(0, 0, 0), - ptB = new Vec3(0, 0, 0), - posA = this._positions[0], - posB, eyeDistance, pixelSize; - - if (showVerticals) { - this.currentData.verticalIndices = new Int16Array(this.positions.length * 2); - this.currentData.verticalIndices[0] = 0; - this.currentData.verticalIndices[1] = 1; - } - - tessellatedPositions.push(posA); - - dc.surfacePointForMode(posA.latitude, posA.longitude, posA.altitude, this._altitudeMode, ptA); - - for (var i = 1, len = this._positions.length; i < len; i++) { - posB = this._positions[i]; - dc.surfacePointForMode(posB.latitude, posB.longitude, posB.altitude, this._altitudeMode, ptB); - eyeDistance = eyePoint.distanceTo(ptA); - pixelSize = dc.pixelSizeAtDistance(eyeDistance); - if (ptA.distanceTo(ptB) < pixelSize * 8 && this.altitudeMode !== WorldWind.ABSOLUTE) { - tessellatedPositions.push(posB); // distance is short so no need for sub-segments - } else { - this.makeSegment(dc, posA, posB, ptA, ptB, tessellatedPositions); - } - - posA = posB; - ptA.copy(ptB); - - if (showVerticals) { - var k = 2 * (tessellatedPositions.length - 1); - this.currentData.verticalIndices[i * 2] = k; - this.currentData.verticalIndices[i * 2 + 1] = k + 1; - } - } - - return tessellatedPositions; -}; - -// Private. Intentionally not documented. -Path.prototype.makeSegment = function (dc, posA, posB, ptA, ptB, tessellatedPositions) { - var eyePoint = dc.eyePoint, - pos = new Location(0, 0), - height = 0, - arcLength, segmentAzimuth, segmentDistance, s, p, distance; - - // If it's just a straight line and not terrain following, then the segment is just two points. - if (this._pathType === WorldWind.LINEAR && !this._followTerrain) { - if (!ptA.equals(ptB)) { - tessellatedPositions.push(posB); - } - return; - } - - // Compute the segment length. - - if (this._pathType === WorldWind.LINEAR) { - segmentDistance = Location.linearDistance(posA, posB); - } else if (this._pathType === WorldWind.RHUMB_LINE) { - segmentDistance = Location.rhumbDistance(posA, posB); - } else { - segmentDistance = Location.greatCircleDistance(posA, posB); - } - - if (this._altitudeMode !== WorldWind.CLAMP_TO_GROUND) { - height = 0.5 * (posA.altitude + posB.altitude); - } - - arcLength = segmentDistance * (dc.globe.equatorialRadius + height * dc.verticalExaggeration); - - if (arcLength <= 0) { // segment is 0 length - return; - } - - // Compute the azimuth to apply while tessellating the segment. - - if (this._pathType === WorldWind.LINEAR) { - segmentAzimuth = Location.linearAzimuth(posA, posB); - } else if (this._pathType === WorldWind.RHUMB_LINE) { - segmentAzimuth = Location.rhumbAzimuth(posA, posB); - } else { - segmentAzimuth = Location.greatCircleAzimuth(posA, posB); - } - - this.scratchPoint.copy(ptA); - for (s = 0, p = 0; s < 1;) { - if (this._followTerrain) { - p += this._terrainConformance * dc.pixelSizeAtDistance(this.scratchPoint.distanceTo(eyePoint)); - } else { - p += arcLength / this._numSubSegments; - } - - // Stop adding intermediate positions when we reach the arc length, or the remaining distance is in - // millimeters on Earth. - if (arcLength < p || arcLength - p < 1e-9) - break; - - s = p / arcLength; - distance = s * segmentDistance; - - if (this._pathType === WorldWind.LINEAR) { - Location.linearLocation(posA, segmentAzimuth, distance, pos); - } else if (this._pathType === WorldWind.RHUMB_LINE) { - Location.rhumbLocation(posA, segmentAzimuth, distance, pos); - } else { - Location.greatCircleLocation(posA, segmentAzimuth, distance, pos); - } - - pos.altitude = (1 - s) * posA.altitude + s * posB.altitude; - tessellatedPositions.push(new Position(pos.latitude, pos.longitude, pos.altitude)); - - if (this._followTerrain) { - // Compute a new reference point for eye distance. - dc.surfacePointForMode(pos.latitude, pos.longitude, pos.altitude, - WorldWind.CLAMP_TO_GROUND, this.scratchPoint); - } - } - - tessellatedPositions.push(posB); -}; - -// Private. Intentionally not documented. -Path.prototype.computeRenderedPath = function (dc, tessellatedPositions) { - var capturePoles = this.mustDrawInterior(dc) || this.mustDrawVerticals(dc), - eyeDistSquared = Number.MAX_VALUE, - eyePoint = dc.eyePoint, - numPoints = (capturePoles ? 2 : 1) * tessellatedPositions.length, - tessellatedPoints = new Float32Array(numPoints * 3), - stride = capturePoles ? 6 : 3, - pt = new Vec3(0, 0, 0), - altitudeMode, pos, k, dSquared; - - if (this._followTerrain && this.altitudeMode !== WorldWind.CLAMP_TO_GROUND) { - altitudeMode = WorldWind.RELATIVE_TO_GROUND; - } else { - altitudeMode = this.altitudeMode; - } - - for (var i = 0, len = tessellatedPositions.length; i < len; i++) { - pos = tessellatedPositions[i]; - - dc.surfacePointForMode(pos.latitude, pos.longitude, pos.altitude, altitudeMode, pt); - - dSquared = pt.distanceToSquared(eyePoint); - if (dSquared < eyeDistSquared) { - eyeDistSquared = dSquared; - } - - pt.subtract(this.currentData.referencePoint); - - k = stride * i; - tessellatedPoints[k] = pt[0]; - tessellatedPoints[k + 1] = pt[1]; - tessellatedPoints[k + 2] = pt[2]; - - if (capturePoles) { - dc.surfacePointForMode(pos.latitude, pos.longitude, 0, WorldWind.CLAMP_TO_GROUND, pt); - - dSquared = pt.distanceToSquared(eyePoint); - if (dSquared < eyeDistSquared) { - eyeDistSquared = dSquared; - } - - pt.subtract(this.currentData.referencePoint); - - tessellatedPoints[k + 3] = pt[0]; - tessellatedPoints[k + 4] = pt[1]; - tessellatedPoints[k + 5] = pt[2]; - } - } - - this.currentData.pointBufferHasExtrusionPoints = capturePoles; - this.currentData.eyeDistance = Math.sqrt(eyeDistSquared); - - return tessellatedPoints; -}; - -// Private. Intentionally not documented. -Path.prototype.mustDrawInterior = function (dc) { - return this.activeAttributes.drawInterior - && this._extrude - && this._altitudeMode !== WorldWind.CLAMP_TO_GROUND; -}; - -// Private. Intentionally not documented. -Path.prototype.mustDrawVerticals = function (dc) { - return this.activeAttributes.drawOutline && this.activeAttributes.drawVerticals - && this.altitudeMode !== WorldWind.CLAMP_TO_GROUND; -}; - -// Overridden from AbstractShape base class. -Path.prototype.doRenderOrdered = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - currentData = this.currentData, - numPoints = currentData.tessellatedPoints.length / 3, - vboId, color, pickColor, stride, nPts; - - this.applyMvpMatrix(dc); - - if (!currentData.vboCacheKey) { - currentData.vboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.vboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(this.currentData.vboCacheKey, vboId, - currentData.tessellatedPoints.length * 4); - currentData.fillVbo = true; - } - - // Bind and if necessary fill the VBO. We fill the VBO here rather than in doMakeOrderedRenderable so that - // there's no possibility of the VBO being ejected from the cache between the time it's filled and - // the time it's used. - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - if (currentData.fillVbo) { - gl.bufferData(gl.ARRAY_BUFFER, currentData.tessellatedPoints, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - } - - program.loadTextureEnabled(gl, false); - - if (dc.pickingMode) { - pickColor = dc.uniquePickColor(); - } - - if (this.mustDrawInterior(dc)) { - color = this.activeAttributes.interiorColor; - // Disable writing the shape's fragments to the depth buffer when the interior is semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, numPoints); - } - - if (this.activeAttributes.drawOutline) { - if (this.mustDrawVerticals(dc) && this.mustDrawInterior(dc) - || this.altitudeMode === WorldWind.CLAMP_TO_GROUND) { - // Make the verticals stand out from the interior, or the outline stand out from the terrain. - this.applyMvpMatrixForOutline(dc); - } - - color = this.activeAttributes.outlineColor; - // Disable writing the shape's fragments to the depth buffer when the interior is semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - gl.lineWidth(this.activeAttributes.outlineWidth); - - if (this.currentData.pointBufferHasExtrusionPoints) { - stride = 24; - nPts = numPoints / 2; - } else { - stride = 12; - nPts = numPoints; - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, stride, 0); - gl.drawArrays(gl.LINE_STRIP, 0, nPts); - - if (this.mustDrawVerticals(dc)) { - if (!currentData.verticalIndicesVboCacheKey) { - currentData.verticalIndicesVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.verticalIndicesVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.verticalIndicesVboCacheKey, vboId, - currentData.verticalIndices.length * 4); - currentData.fillVbo = true; - } - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vboId); - if (currentData.fillVbo) { - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, currentData.verticalIndices, - gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - gl.drawElements(gl.LINES, currentData.verticalIndices.length, - gl.UNSIGNED_SHORT, 0); - } - } - currentData.fillVbo = false; - - if (dc.pickingMode) { - var po = new PickedObject(pickColor, this.pickDelegate ? this.pickDelegate : this, null, this.layer, - false); - dc.resolvePick(po); - } -}; - -// Overridden from AbstractShape base class. -Path.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext; - - if (this.mustDrawInterior(dc)) { - gl.disable(gl.CULL_FACE); - } - - dc.findAndBindProgram(BasicTextureProgram); - gl.enableVertexAttribArray(dc.currentProgram.vertexPointLocation); -}; - -// Overridden from AbstractShape base class. -Path.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext; - - gl.disableVertexAttribArray(dc.currentProgram.vertexPointLocation); - gl.depthMask(true); - gl.lineWidth(1); - gl.enable(gl.CULL_FACE); -}; - -export default Path; diff --git a/web/src/gis/shapes/Placemark.js b/web/src/gis/shapes/Placemark.js deleted file mode 100644 index 863a21ca..00000000 --- a/web/src/gis/shapes/Placemark.js +++ /dev/null @@ -1,793 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Placemark - */ -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import Color from '../util/Color'; -import Font from '../util/Font'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import PlacemarkAttributes from '../shapes/PlacemarkAttributes'; -import Renderable from '../render/Renderable'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a placemark. - * @alias Placemark - * @constructor - * @augments Renderable - * @classdesc Represents a Placemark shape. A placemark displays an image, a label and a leader line connecting - * the placemark's geographic position to the ground. All three of these items are optional. By default, the - * leader line is not pickable. See [enableLeaderLinePicking]{@link Placemark#enableLeaderLinePicking}. - * <p> - * Placemarks may be drawn with either an image or as single-color square with a specified size. When the - * placemark attributes indicate a valid image, the placemark's image is drawn as a rectangle in the - * image's original dimensions, scaled by the image scale attribute. Otherwise, the placemark is drawn as a - * square with width and height equal to the value of the image scale attribute, in pixels, and color equal - * to the image color attribute. - * <p> - * By default, placemarks participate in decluttering with a [declutterGroupID]{@link Placemark#declutterGroup} - * of 2. Only placemark labels are decluttered relative to other placemark labels. The placemarks themselves - * are optionally scaled with eye distance to achieve decluttering of the placemark as a whole. - * See [eyeDistanceScaling]{@link Placemark#eyeDistanceScaling}. - * @param {Position} position The placemark's geographic position. - * @param {Boolean} eyeDistanceScaling Indicates whether the size of this placemark scales with eye distance. - * See [eyeDistanceScalingThreshold]{@link Placemark#eyeDistanceScalingThreshold} and - * [eyeDistanceScalingLabelThreshold]{@link Placemark#eyeDistanceScalingLabelThreshold}. - * @param {PlacemarkAttributes} attributes The attributes to associate with this placemark. May be null, - * in which case default attributes are associated. - * @throws {ArgumentError} If the specified position is null or undefined. - */ -function Placemark(position, eyeDistanceScaling, attributes) { - if (!position) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Placemark", "constructor", "missingPosition")); - } - - Renderable.call(this); - - /** - * The placemark's attributes. If null and this placemark is not highlighted, this placemark is not - * drawn. - * @type {PlacemarkAttributes} - * @default see [PlacemarkAttributes]{@link PlacemarkAttributes} - */ - this.attributes = attributes ? attributes : new PlacemarkAttributes(null); - - /** - * The attributes used when this placemark's highlighted flag is true. If null and the - * highlighted flag is true, this placemark's normal attributes are used. If they, too, are null, this - * placemark is not drawn. - * @type {PlacemarkAttributes} - * @default null - */ - this.highlightAttributes = null; - - /** - * Indicates whether this placemark uses its highlight attributes rather than its normal attributes. - * @type {Boolean} - * @default false - */ - this.highlighted = false; - - /** - * This placemark's geographic position. - * @type {Position} - */ - this.position = position; - - /** - * Indicates whether this placemark's size is reduced at higher eye distances. If true, this placemark's - * size is scaled inversely proportional to the eye distance if the eye distance is greater than the - * value of the [eyeDistanceScalingThreshold]{@link Placemark#eyeDistanceScalingThreshold} property. - * When the eye distance is below the threshold, this placemark is scaled only according to the - * [imageScale]{@link PlacemarkAttributes#imageScale}. - * @type {Boolean} - */ - this.eyeDistanceScaling = eyeDistanceScaling; - - /** - * The eye distance above which to reduce the size of this placemark, in meters. If - * [eyeDistanceScaling]{@link Placemark#eyeDistanceScaling} is true, this placemark's image, label and leader - * line sizes are reduced as the eye distance increases beyond this threshold. - * @type {Number} - * @default 1e6 (meters) - */ - this.eyeDistanceScalingThreshold = 1e6; - - /** - * The eye altitude above which this placemark's label is not displayed. - * @type {number} - */ - this.eyeDistanceScalingLabelThreshold = 1.5 * this.eyeDistanceScalingThreshold; - - /** - * This placemark's textual label. If null, no label is drawn. - * @type {String} - * @default null - */ - this.label = null; - - /** - * This placemark's altitude mode. May be one of - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * @default WorldWind.ABSOLUTE - */ - this.altitudeMode = WorldWind.ABSOLUTE; - - /** - * Indicates whether this placemark has visual priority over other shapes in the scene. - * @type {Boolean} - * @default false - */ - this.alwaysOnTop = false; - - /** - * Indicates whether this placemark's leader line, if any, is pickable. - * @type {Boolean} - * @default false - */ - this.enableLeaderLinePicking = false; - - /** - * Indicates whether this placemark's image should be re-retrieved even if it has already been retrieved. - * Set this property to true when the image has changed but has the same image path. - * The property is set to false when the image is re-retrieved. - * @type {Boolean} - */ - this.updateImage = true; - - /** - * Indicates the group ID of the declutter group to include this placemark. If non-zero, this placemark - * is decluttered relative to all other shapes within its group. - * @type {Number} - * @default 2 - */ - this.declutterGroup = 2; - - /** - * This placemark's target label visibility, a value between 0 and 1. During ordered rendering this - * placemark modifies its [current visibility]{@link Placemark#currentVisibility} towards its target - * visibility at the rate specified by the draw context's [fade time]{@link DrawContext#fadeTime} property. - * The target visibility and current visibility are used to control the fading in and out of this - * placemark's label. - * @type {Number} - * @default 1 - */ - this.targetVisibility = 1; - - /** - * This placemark's current label visibility, a value between 0 and 1. This property scales the placemark's - * effective label opacity. It is incremented or decremented each frame according to the draw context's - * [fade time]{@link DrawContext#fadeTime} property in order to achieve this placemark's - * [target visibility]{@link Placemark#targetVisibility}. This current visibility and target visibility are - * used to control the fading in and out of this placemark's label. - * @type {Number} - * @default 1 - * @readonly - */ - this.currentVisibility = 1; - - /** - * The amount of rotation to apply to the image, measured in degrees clockwise and relative to this - * placemark's [imageRotationReference]{@link Placemark#imageRotationReference}. - * @type {Number} - * @default 0 - */ - this.imageRotation = 0; - - /** - * The amount of tilt to apply to the image, measured in degrees away from the eye point and relative - * to this placemark's [imageTiltReference]{@link Placemark#imageTiltReference}. While any positive or - * negative number may be specified, values outside the range [0. 90] cause some or all of the image to - * be clipped. - * @type {Number} - * @default 0 - */ - this.imageTilt = 0; - - /** - * Indicates whether to apply this placemark's image rotation relative to the screen or the globe. - * If WorldWind.RELATIVE_TO_SCREEN, this placemark's image is rotated in the plane of the screen and - * its orientation relative to the globe changes as the view changes. - * If WorldWind.RELATIVE_TO_GLOBE, this placemark's image is rotated in a plane tangent to the globe - * at this placemark's position and retains its orientation relative to the globe. - * @type {String} - * @default WorldWind.RELATIVE_TO_SCREEN - */ - this.imageRotationReference = WorldWind.RELATIVE_TO_SCREEN; - - /** - * Indicates whether to apply this placemark's image tilt relative to the screen or the globe. - * If WorldWind.RELATIVE_TO_SCREEN, this placemark's image is tilted inwards (for positive tilts) - * relative to the plane of the screen, and its orientation relative to the globe changes as the view - * changes. If WorldWind.RELATIVE_TO_GLOBE, this placemark's image is tilted towards the globe's surface, - * and retains its orientation relative to the surface. - * @type {string} - * @default WorldWind.RELATIVE_TO_SCREEN - */ - this.imageTiltReference = WorldWind.RELATIVE_TO_SCREEN; - - // Internal use only. Intentionally not documented. - this.activeAttributes = null; - - // Internal use only. Intentionally not documented. - this.activeTexture = null; - - // Internal use only. Intentionally not documented. - this.labelTexture = null; - - // Internal use only. Intentionally not documented. - this.placePoint = new Vec3(0, 0, 0); // Cartesian point corresponding to this placemark's geographic position - - // Internal use only. Intentionally not documented. - this.groundPoint = new Vec3(0, 0, 0); // Cartesian point corresponding to ground position below this placemark - - // Internal use only. Intentionally not documented. - this.imageTransform = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.labelTransform = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.texCoordMatrix = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.imageBounds = null; - - // Internal use only. Intentionally not documented. - this.layer = null; - - // Internal use only. Intentionally not documented. - this.depthOffset = -0.003; -} - -// Internal use only. Intentionally not documented. -Placemark.screenPoint = new Vec3(0, 0, 0); // scratch variable -Placemark.matrix = Matrix.fromIdentity(); // scratch variable -Placemark.scratchPoint = new Vec3(0, 0, 0); // scratch variable - -Placemark.prototype = Object.create(Renderable.prototype); - -Object.defineProperties(Placemark.prototype, { - /** - * Indicates the screen coordinate bounds of this shape during ordered rendering. - * @type {Rectangle} - * @readonly - * @memberof Placemark.prototype - */ - screenBounds: { - get: function () { - return this.labelBounds; - } - } -}); - -/** - * Copies the contents of a specified placemark to this placemark. - * @param {Placemark} that The placemark to copy. - */ -Placemark.prototype.copy = function (that) { - this.position = that.position; - this.attributes = that.attributes; - this.highlightAttributes = that.highlightAttributes; - this.highlighted = that.highlighted; - this.enabled = that.enabled; - this.label = that.label; - this.altitudeMode = that.altitudeMode; - this.pickDelegate = that.pickDelegate; - this.alwaysOnTop = that.alwaysOnTop; - this.depthOffset = that.depthOffset; - this.targetVisibility = that.targetVisibility; - this.currentVisibility = that.currentVisibility; - this.imageRotation = that.imageRotation; - this.imageTilt = that.imageTilt; - this.imageRotationReference = that.imageRotationReference; - this.imageTiltReference = that.imageTiltReference; - - return this; -}; - -/** - * Creates a new placemark that is a copy of this placemark. - * @returns {Placemark} The new placemark. - */ -Placemark.prototype.clone = function () { - var clone = new Placemark(this.position); - - clone.copy(this); - clone.pickDelegate = this.pickDelegate ? this.pickDelegate : this; - - return clone; -}; - -/** - * Renders this placemark. This method is typically not called by applications but is called by - * {@link RenderableLayer} during rendering. For this shape this method creates and - * enques an ordered renderable with the draw context and does not actually draw the placemark. - * @param {DrawContext} dc The current draw context. - */ -Placemark.prototype.render = function (dc) { - if (!this.enabled) { - return; - } - - if (!dc.accumulateOrderedRenderables) { - return; - } - - if (dc.globe.projectionLimits - && !dc.globe.projectionLimits.containsLocation(this.position.latitude, this.position.longitude)) { - return; - } - - // Create an ordered renderable for this placemark. If one has already been created this frame then we're - // in 2D-continuous mode and another needs to be created for one of the alternate globe offsets. - var orderedPlacemark; - if (this.lastFrameTime !== dc.timestamp) { - orderedPlacemark = this.makeOrderedRenderable(dc); - } else { - var placemarkCopy = this.clone(); - orderedPlacemark = placemarkCopy.makeOrderedRenderable(dc); - } - - if (!orderedPlacemark) { - return; - } - - if (!orderedPlacemark.isVisible(dc)) { - return; - } - - orderedPlacemark.layer = dc.currentLayer; - - this.lastFrameTime = dc.timestamp; - dc.addOrderedRenderable(orderedPlacemark); -}; - -/** - * Draws this shape as an ordered renderable. Applications do not call this function. It is called by - * [WorldWindow]{@link WorldWindow} during rendering. - * @param {DrawContext} dc The current draw context. - */ -Placemark.prototype.renderOrdered = function (dc) { - this.drawOrderedPlacemark(dc); - - if (dc.pickingMode) { - var po = new PickedObject(this.pickColor.clone(), this.pickDelegate ? this.pickDelegate : this, - this.position, this.layer, false); - - if (dc.pickPoint && this.mustDrawLabel()) { - if (this.labelBounds.containsPoint( - dc.convertPointToViewport(dc.pickPoint, Placemark.scratchPoint))) { - po.labelPicked = true; - } - } - dc.resolvePick(po); - } -}; - -/* INTENTIONALLY NOT DOCUMENTED - * Creates an ordered renderable for this shape. - * @protected - * @param {DrawContext} dc The current draw context. - * @returns {OrderedRenderable} The ordered renderable. May be null, in which case an ordered renderable - * cannot be created or should not be created at the time this method is called. - */ -Placemark.prototype.makeOrderedRenderable = function (dc) { - var w, h, s, - offset; - - this.determineActiveAttributes(dc); - if (!this.activeAttributes) { - return null; - } - - // Compute the placemark's model point and corresponding distance to the eye point. If the placemark's - // position is terrain-dependent but off the terrain, then compute it ABSOLUTE so that we have a point for - // the placemark and are thus able to draw it. Otherwise its image and label portion that are potentially - // over the terrain won't get drawn, and would disappear as soon as there is no terrain at the placemark's - // position. This can occur at the window edges. - dc.surfacePointForMode(this.position.latitude, this.position.longitude, this.position.altitude, - this.altitudeMode, this.placePoint); - - this.eyeDistance = this.alwaysOnTop ? 0 : dc.eyePoint.distanceTo(this.placePoint); - - if (this.mustDrawLeaderLine(dc)) { - dc.surfacePointForMode(this.position.latitude, this.position.longitude, 0, - this.altitudeMode, this.groundPoint); - } - - // Compute the placemark's screen point in the OpenGL coordinate system of the WorldWindow by projecting its model - // coordinate point onto the viewport. Apply a depth offset in order to cause the placemark to appear above nearby - // terrain. When a placemark is displayed near the terrain portions of its geometry are often behind the terrain, - // yet as a screen element the placemark is expected to be visible. We adjust its depth values rather than moving - // the placemark itself to avoid obscuring its actual position. - if (!dc.projectWithDepth(this.placePoint, this.depthOffset, Placemark.screenPoint)) { - return null; - } - - var visibilityScale = this.eyeDistanceScaling ? - Math.max(0.0, Math.min(1, this.eyeDistanceScalingThreshold / this.eyeDistance)) : 1; - - // Compute the placemark's transform matrix and texture coordinate matrix according to its screen point, image size, - // image offset and image scale. The image offset is defined with its origin at the image's bottom-left corner and - // axes that extend up and to the right from the origin point. When the placemark has no active texture the image - // scale defines the image size and no other scaling is applied. - if (this.activeTexture) { - w = this.activeTexture.originalImageWidth; - h = this.activeTexture.originalImageHeight; - s = this.activeAttributes.imageScale * visibilityScale; - offset = this.activeAttributes.imageOffset.offsetForSize(w, h); - - this.imageTransform.setTranslation( - Placemark.screenPoint[0] - offset[0] * s, - Placemark.screenPoint[1] - offset[1] * s, - Placemark.screenPoint[2]); - - this.imageTransform.setScale(w * s, h * s, 1); - } else { - s = this.activeAttributes.imageScale * visibilityScale; - offset = this.activeAttributes.imageOffset.offsetForSize(s, s); - - this.imageTransform.setTranslation( - Placemark.screenPoint[0] - offset[0], - Placemark.screenPoint[1] - offset[1], - Placemark.screenPoint[2]); - - this.imageTransform.setScale(s, s, 1); - } - - this.imageBounds = WWMath.boundingRectForUnitQuad(this.imageTransform); - - // If there's a label, perform these same operations for the label texture. - - if (this.mustDrawLabel()) { - - this.labelTexture = dc.createTextTexture(this.label, this.activeAttributes.labelAttributes); - - w = this.labelTexture.imageWidth; - h = this.labelTexture.imageHeight; - s = this.activeAttributes.labelAttributes.scale * visibilityScale; - offset = this.activeAttributes.labelAttributes.offset.offsetForSize(w, h); - - this.labelTransform.setTranslation( - Placemark.screenPoint[0] - offset[0] * s, - Placemark.screenPoint[1] - offset[1] * s, - Placemark.screenPoint[2]); - - this.labelTransform.setScale(w * s, h * s, 1); - - this.labelBounds = WWMath.boundingRectForUnitQuad(this.labelTransform); - } - - return this; -}; - -// Internal. Intentionally not documented. -Placemark.prototype.determineActiveAttributes = function (dc) { - if (this.highlighted && this.highlightAttributes) { - this.activeAttributes = this.highlightAttributes; - } else { - this.activeAttributes = this.attributes; - } - - if (this.activeAttributes && this.activeAttributes.imageSource) { - this.activeTexture = dc.gpuResourceCache.resourceForKey(this.activeAttributes.imageSource); - - if (!this.activeTexture || this.updateImage) { - this.activeTexture = dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, - this.activeAttributes.imageSource); - this.updateImage = false; - } - } -}; - -// Internal. Intentionally not documented. -Placemark.prototype.isVisible = function (dc) { - if (dc.pickingMode) { - return dc.pickRectangle && (this.imageBounds.intersects(dc.pickRectangle) - || this.mustDrawLabel() && this.labelBounds.intersects(dc.pickRectangle) - || this.mustDrawLeaderLine(dc) - && dc.pickFrustum.intersectsSegment(this.groundPoint, this.placePoint)); - } else { - return this.imageBounds.intersects(dc.viewport) - || this.mustDrawLabel() && this.labelBounds.intersects(dc.viewport) - || this.mustDrawLeaderLine(dc) - && dc.frustumInModelCoordinates.intersectsSegment(this.groundPoint, this.placePoint); - } -}; - -// Internal. Intentionally not documented. -Placemark.prototype.drawOrderedPlacemark = function (dc) { - this.beginDrawing(dc); - - try { - this.doDrawOrderedPlacemark(dc); - if (!dc.pickingMode) { - this.drawBatchOrderedPlacemarks(dc); - } - } finally { - this.endDrawing(dc); - } -}; - -// Internal. Intentionally not documented. -Placemark.prototype.drawBatchOrderedPlacemarks = function (dc) { - // Draw any subsequent placemarks in the ordered renderable queue, removing each from the queue as it's - // processed. This avoids the overhead of setting up and tearing down OpenGL state for each placemark. - - var or; - - while ((or = dc.peekOrderedRenderable()) && or.doDrawOrderedPlacemark) { - dc.popOrderedRenderable(); // remove it from the queue - - try { - or.doDrawOrderedPlacemark(dc); - } catch (e) { - Logger.logMessage(Logger.LEVEL_WARNING, 'Placemark', 'drawBatchOrderedPlacemarks', - "Error occurred while rendering placemark using batching: " + e.message); - } - // Keep going. Render the rest of the ordered renderables. - } -}; - -// Internal. Intentionally not documented. -Placemark.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext, - program; - - dc.findAndBindProgram(BasicTextureProgram); - - // Configure GL to use the draw context's unit quad VBOs for both model coordinates and texture coordinates. - // Most browsers can share the same buffer for vertex and texture coordinates, but Internet Explorer requires - // that they be in separate buffers, so the code below uses the 3D buffer for vertex coords and the 2D - // buffer for texture coords. - program = dc.currentProgram; - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer()); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, 0, 0); - gl.enableVertexAttribArray(program.vertexPointLocation); - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - - // Tell the program which texture unit to use. - program.loadTextureUnit(gl, gl.TEXTURE0); - program.loadModulateColor(gl, dc.pickingMode); -}; - -// Internal. Intentionally not documented. -Placemark.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram; - - // Clear the vertex attribute state. - gl.disableVertexAttribArray(program.vertexPointLocation); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - - // Clear GL bindings. - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindTexture(gl.TEXTURE_2D, null); -}; - -// Internal. Intentionally not documented. -Placemark.prototype.doDrawOrderedPlacemark = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - depthTest = true, - textureBound; - - if (dc.pickingMode) { - this.pickColor = dc.uniquePickColor(); - } - - if (this.eyeDistanceScaling && this.eyeDistance > this.eyeDistanceScalingLabelThreshold) { - // Target visibility is set to 0 to cause the label to be faded in or out. Nothing else - // here uses target visibility. - this.targetVisibility = 0; - } - - // Compute the effective visibility. Use the current value if picking. - if (!dc.pickingMode && this.mustDrawLabel()) { - if (this.currentVisibility != this.targetVisibility) { - var visibilityDelta = (dc.timestamp - dc.previousRedrawTimestamp) / dc.fadeTime; - if (this.currentVisibility < this.targetVisibility) { - this.currentVisibility = Math.min(1, this.currentVisibility + visibilityDelta); - } else { - this.currentVisibility = Math.max(0, this.currentVisibility - visibilityDelta); - } - dc.redrawRequested = true; - } - } - - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - // Draw the leader line first so that the image and label have visual priority. - if (this.mustDrawLeaderLine(dc)) { - if (!this.leaderLinePoints) { - this.leaderLinePoints = new Float32Array(6); - } - - this.leaderLinePoints[0] = this.groundPoint[0]; // computed during makeOrderedRenderable - this.leaderLinePoints[1] = this.groundPoint[1]; - this.leaderLinePoints[2] = this.groundPoint[2]; - this.leaderLinePoints[3] = this.placePoint[0]; // computed during makeOrderedRenderable - this.leaderLinePoints[4] = this.placePoint[1]; - this.leaderLinePoints[5] = this.placePoint[2]; - - if (!this.leaderLineCacheKey) { - this.leaderLineCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - var leaderLineVboId = dc.gpuResourceCache.resourceForKey(this.leaderLineCacheKey); - if (!leaderLineVboId) { - leaderLineVboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(this.leaderLineCacheKey, leaderLineVboId, - this.leaderLinePoints.length * 4); - } - - program.loadTextureEnabled(gl, false); - program.loadColor(gl, dc.pickingMode ? this.pickColor : - this.activeAttributes.leaderLineAttributes.outlineColor); - - Placemark.matrix.copy(dc.modelviewProjection); - program.loadModelviewProjection(gl, Placemark.matrix); - - if (!this.activeAttributes.leaderLineAttributes.depthTest) { - gl.disable(gl.DEPTH_TEST); - } - - gl.lineWidth(this.activeAttributes.leaderLineAttributes.outlineWidth); - - gl.bindBuffer(gl.ARRAY_BUFFER, leaderLineVboId); - gl.bufferData(gl.ARRAY_BUFFER, this.leaderLinePoints, gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - gl.drawArrays(gl.LINES, 0, 2); - } - - // Turn off depth testing for the placemark image if requested. The placemark label and leader line have - // their own depth-test controls. - if (!this.activeAttributes.depthTest) { - depthTest = false; - gl.disable(gl.DEPTH_TEST); - } - - // Suppress frame buffer writes for the placemark image and its label. - // tag, 6/17/15: It's not clear why this call was here. It was carried over from WWJ. - //gl.depthMask(false); - - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer3()); - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - - // Compute and specify the MVP matrix. - Placemark.matrix.copy(dc.screenProjection); - Placemark.matrix.multiplyMatrix(this.imageTransform); - - var actualRotation = this.imageRotationReference === WorldWind.RELATIVE_TO_GLOBE ? - dc.navigator.heading - this.imageRotation : -this.imageRotation; - Placemark.matrix.multiplyByTranslation(0.5, 0.5, 0); - Placemark.matrix.multiplyByRotation(0, 0, 1, actualRotation); - Placemark.matrix.multiplyByTranslation(-0.5, -0.5, 0); - - // Perform the tilt before applying the rotation so that the image tilts back from its base into - // the view volume. - var actualTilt = this.imageTiltReference === WorldWind.RELATIVE_TO_GLOBE ? - dc.navigator.tilt + this.imageTilt : this.imageTilt; - Placemark.matrix.multiplyByRotation(-1, 0, 0, actualTilt); - - program.loadModelviewProjection(gl, Placemark.matrix); - - // Enable texture for both normal display and for picking. If picking is enabled in the shader (set in - // beginDrawing() above) then the texture's alpha component is still needed in order to modulate the - // pick color to mask off transparent pixels. - program.loadTextureEnabled(gl, true); - - if (dc.pickingMode) { - program.loadColor(gl, this.pickColor); - } else { - program.loadColor(gl, this.activeAttributes.imageColor); - } - - this.texCoordMatrix.setToIdentity(); - if (this.activeTexture) { - this.texCoordMatrix.multiplyByTextureTransform(this.activeTexture); - } - program.loadTextureMatrix(gl, this.texCoordMatrix); - - if (this.activeTexture) { - textureBound = this.activeTexture.bind(dc); // returns false if active texture is null or cannot be bound - program.loadTextureEnabled(gl, textureBound); - } else { - program.loadTextureEnabled(gl, false); - } - - // Draw the placemark's image quad. - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - - if (this.mustDrawLabel() && this.currentVisibility > 0) { - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity * this.currentVisibility); - - Placemark.matrix.copy(dc.screenProjection); - Placemark.matrix.multiplyMatrix(this.labelTransform); - program.loadModelviewProjection(gl, Placemark.matrix); - - if (!dc.pickingMode && this.labelTexture) { - this.texCoordMatrix.setToIdentity(); - this.texCoordMatrix.multiplyByTextureTransform(this.labelTexture); - - program.loadTextureMatrix(gl, this.texCoordMatrix); - program.loadColor(gl, Color.WHITE); - - textureBound = this.labelTexture.bind(dc); - program.loadTextureEnabled(gl, textureBound); - } else { - program.loadTextureEnabled(gl, false); - program.loadColor(gl, this.pickColor); - } - - if (this.activeAttributes.labelAttributes.depthTest) { - if (!depthTest) { - depthTest = true; - gl.enable(gl.DEPTH_TEST); - } - } else { - depthTest = false; - gl.disable(gl.DEPTH_TEST); - } - - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - } - - if (!depthTest) { - gl.enable(gl.DEPTH_TEST); - } - - // tag, 6/17/15: See note on depthMask above in this function. - //gl.depthMask(true); -}; - -// Internal. Intentionally not documented. -Placemark.prototype.mustDrawLabel = function () { - return this.label && this.label.length > 0 && this.activeAttributes.labelAttributes; -}; - -// Internal. Intentionally not documented. -Placemark.prototype.mustDrawLeaderLine = function (dc) { - return this.activeAttributes.drawLeaderLine && this.activeAttributes.leaderLineAttributes - && (!dc.pickingMode || this.enableLeaderLinePicking); -}; - -// Internal use only. Intentionally not documented. -Placemark.prototype.getReferencePosition = function () { - return this.position; -}; - -// Internal use only. Intentionally not documented. -Placemark.prototype.moveTo = function (globe, position) { - this.position = position; -}; - -export default Placemark; diff --git a/web/src/gis/shapes/PlacemarkAttributes.js b/web/src/gis/shapes/PlacemarkAttributes.js deleted file mode 100644 index bc5e511c..00000000 --- a/web/src/gis/shapes/PlacemarkAttributes.js +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports PlacemarkAttributes - */ -import Color from '../util/Color'; -import Font from '../util/Font'; -import Offset from '../util/Offset'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import TextAttributes from '../shapes/TextAttributes'; - - -/** - * Constructs a placemark attributes bundle. - * The defaults indicate a placemark displayed as a white 1x1 pixel square centered on the placemark's - * geographic position. - * @alias PlacemarkAttributes - * @constructor - * @classdesc Holds attributes applied to {@link Placemark} shapes. - * - * @param {PlacemarkAttributes} attributes Attributes to initialize this attributes instance to. May be null, - * in which case the new instance contains default attributes. - */ -function PlacemarkAttributes(attributes) { - // These are all documented with their property accessors below. - this._imageColor = attributes ? attributes._imageColor.clone() : Color.WHITE.clone(); - this._imageOffset = attributes ? attributes._imageOffset - : new Offset(WorldWind.OFFSET_FRACTION, 0.5, WorldWind.OFFSET_FRACTION, 0.5); - this._imageScale = attributes ? attributes._imageScale : 1; - this._imageSource = attributes ? attributes._imageSource : null; - this._depthTest = attributes ? attributes._depthTest : true; - this._labelAttributes = attributes ? attributes._labelAttributes : new TextAttributes(null); - this._drawLeaderLine = attributes ? attributes._drawLeaderLine : false; - this._leaderLineAttributes = attributes ? attributes._leaderLineAttributes : new ShapeAttributes(null); - - /** - * Indicates whether this object's state key is invalid. Subclasses must set this value to true when their - * attributes change. The state key will be automatically computed the next time it's requested. This flag - * will be set to false when that occurs. - * @type {Boolean} - * @protected - */ - this.stateKeyInvalid = true; -} - -/** - * Computes the state key for this attributes object. Subclasses that define additional attributes must - * override this method, call it from that method, and append the state of their attributes to its - * return value. - * @returns {String} The state key for this object. - * @protected - */ -PlacemarkAttributes.prototype.computeStateKey = function () { - return "ic " + this._imageColor.toHexString(true) - + " io " + this._imageOffset.toString() - + " is " + this._imageScale - + " ip " + this._imageSource - + " dt " + this._depthTest - + " la " + this._labelAttributes.stateKey - + " dll " + this._drawLeaderLine - + " lla " + this._leaderLineAttributes.stateKey; -}; - -Object.defineProperties(PlacemarkAttributes.prototype, { - /** - * A string identifying the state of this attributes object. The string encodes the current values of all - * this object's properties. It's typically used to validate cached representations of shapes associated - * with this attributes object. - * @type {String} - * @readonly - * @memberof PlacemarkAttributes.prototype - */ - stateKey: { - get: function () { - if (this.stateKeyInvalid) { - this._stateKey = this.computeStateKey(); - this.stateKeyInvalid = false; - } - return this._stateKey; - } - }, - - /** - * The image color. - * When this attribute bundle has a valid image path the placemark's image is composed with this image - * color to achieve the final placemark color. Otherwise the placemark is drawn in this color. The color - * white, the default, causes the image to be drawn in its native colors. - * @type {Color} - * @default White (1, 1, 1, 1) - * @memberof PlacemarkAttributes.prototype - */ - imageColor: { - get: function () { - return this._imageColor; - }, - set: function (value) { - this._imageColor = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the location within the placemark's image to align with the placemark's geographic position. - * May be null, in which case the image's bottom-left corner is placed at the geographic position. - * @type {Offset} - * @default 0.5, 0.5, both fractional (Centers the image on the geographic position.) - * @memberof PlacemarkAttributes.prototype - */ - imageOffset: { - get: function () { - return this._imageOffset; - }, - set: function (value) { - this._imageOffset = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the amount to scale the placemark's image. - * When this attribute bundle has a valid image path the scale is applied to the image's dimensions. Otherwise the - * scale indicates the dimensions in pixels of a square drawn at the placemark's geographic position. - * A scale of 0 causes the placemark to disappear; however, the placemark's label, if any, is still drawn. - * @type {Number} - * @default 1 - * @memberof PlacemarkAttributes.prototype - */ - imageScale: { - get: function () { - return this._imageScale; - }, - set: function (value) { - this._imageScale = value; - this.stateKeyInvalid = true; - } - }, - - /** - * The image source of the placemark's image. May be either a string giving the URL of the image, or an - * {@link ImageSource} object identifying an Image created dynamically. - * If null, the placemark is drawn as a square whose width and height are - * the value of this attribute object's [imageScale]{@link PlacemarkAttributes#imageScale} property. - * @type {String|ImageSource} - * @default null - * @memberof PlacemarkAttributes.prototype - */ - imageSource: { - get: function () { - return this._imageSource; - }, - set: function (value) { - this._imageSource = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether the placemark should be depth-tested against other objects in the scene. If true, - * the placemark may be occluded by terrain and other objects in certain viewing situations. If false, - * the placemark will not be occluded by terrain and other objects. If this value is true, the placemark's - * label, if any, has an independent depth-test control. - * See [PlacemarkAttributes.labelAttributes]{@link PlacemarkAttributes#labelAttributes} - * and [TextAttributes.depthTest]{@link TextAttributes#depthTest}. - * @type {Boolean} - * @default true - * @memberof PlacemarkAttributes.prototype - */ - depthTest: { - get: function () { - return this._depthTest; - }, - set: function (value) { - this._depthTest = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the attributes to apply to the placemark's label, if any. If null, the placemark's label is - * not drawn. - * @type {TextAttributes} - * @default The defaults of {@link TextAttributes}. - * @memberof PlacemarkAttributes.prototype - */ - labelAttributes: { - get: function () { - return this._labelAttributes; - }, - set: function (value) { - this._labelAttributes = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether to draw a line from the placemark's geographic position to the ground. - * @type {Boolean} - * @default false - * @memberof PlacemarkAttributes.prototype - */ - drawLeaderLine: { - get: function () { - return this._drawLeaderLine; - }, - set: function (value) { - this._drawLeaderLine = value; - this.stateKeyInvalid = true; - } - }, - - /** - * The attributes to apply to the leader line if it's drawn. If null, the placemark's leader line is - * not drawn. - * @type {ShapeAttributes} - * @default The defaults of {@link ShapeAttributes} - * @memberof PlacemarkAttributes.prototype - */ - leaderLineAttributes: { - get: function () { - return this._leaderLineAttributes; - }, - set: function (value) { - this._leaderLineAttributes = value; - this.stateKeyInvalid = true; - } - } -}); - -export default PlacemarkAttributes; diff --git a/web/src/gis/shapes/Polygon.js b/web/src/gis/shapes/Polygon.js deleted file mode 100644 index 969828d4..00000000 --- a/web/src/gis/shapes/Polygon.js +++ /dev/null @@ -1,902 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Polygon - */ -import AbstractShape from '../shapes/AbstractShape'; -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import BoundingBox from '../geom/BoundingBox'; -import Color from '../util/Color'; -import ImageSource from '../util/ImageSource'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import Position from '../geom/Position'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfacePolygon from '../shapes/SurfacePolygon'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; -import libtessDummy from '../util/libtess'; - - -/** - * Constructs a Polygon. - * @alias Polygon - * @constructor - * @augments AbstractShape - * @classdesc Represents a 3D polygon. The polygon may be extruded to the ground to form a prism. It may have - * multiple boundaries defining empty portions. See also {@link SurfacePolygon}. - * <p> - * Altitudes within the polygon's positions are interpreted according to the polygon's altitude mode, which - * can be one of the following: - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * If the latter, the polygon positions' altitudes are ignored. (If the polygon should be draped onto the - * terrain, you might want to use {@link SurfacePolygon} instead.) - * <p> - * Polygons have separate attributes for normal display and highlighted display. They use the interior and - * outline attributes of {@link ShapeAttributes}. If those attributes identify an image, that image is - * applied to the polygon. - * <p> - * A polygon displays as a vertical prism if its [extrude]{@link Polygon#extrude} property is true. A - * curtain is formed around its boundaries and extends from the polygon's edges to the ground. - * <p> - * A polygon can be textured, including its extruded boundaries. The textures are specified via the - * [imageSource]{@link ShapeAttributes#imageSource} property of the polygon's attributes. If that - * property is a single string or {@link ImageSource}, then it identifies the image source for the - * polygon's texture. If that property is an array of strings, {@link ImageSource}s or a combination of - * those, then the first entry in the array specifies the polygon's image source and subsequent entries - * specify the image sources of the polygon's extruded boundaries. If the array contains two entries, the - * first is the polygon's image source and the second is the common image source for all extruded - * boundaries. If the array contains more than two entries, then the first entry is the polygon's image - * source and each subsequent entry is the image source for consecutive extruded boundary segments. A null - * value for any entry indicates that no texture is applied for the corresponding polygon or extruded edge - * segment. If fewer image sources are specified then there are boundary segments, the last image source - * specified is applied to the remaining segments. Texture coordinates for the polygon's texture are - * specified via this polygon's [textureCoordinates]{@link Polygon#textureCoordinates} property. Texture - * coordinates for extruded boundary segments are implicitly defined to fit the full texture to each - * boundary segment. - * <p> - * When displayed on a 2D globe, this polygon displays as a {@link SurfacePolygon} if its - * [useSurfaceShapeFor2D]{@link AbstractShape#useSurfaceShapeFor2D} property is true. - * - * @param {Position[][] | Position[]} boundaries A two-dimensional array containing the polygon boundaries. - * Each entry of the array specifies the vertices of one boundary. - * This argument may also be a simple array of positions, - * in which case the polygon is assumed to have only one boundary. - * Each boundary is considered implicitly closed, so the last position of the boundary need not and should not - * duplicate the first position of the boundary. - * @param {ShapeAttributes} attributes The attributes to associate with this polygon. May be null, in which case - * default attributes are associated. - * - * @throws {ArgumentError} If the specified boundaries array is null or undefined. - */ -function Polygon(boundaries, attributes) { - if (!boundaries) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Polygon", "constructor", "missingBoundaries")); - } - - AbstractShape.call(this, attributes); - - if (boundaries.length > 0 && boundaries[0].latitude) { - boundaries = [boundaries]; - this._boundariesSpecifiedSimply = true; - } - - // Private. Documentation is with the defined property below and the constructor description above. - this._boundaries = boundaries; - - this._textureCoordinates = null; - - this.referencePosition = this.determineReferencePosition(this._boundaries); - - this._extrude = false; - - this.scratchPoint = new Vec3(0, 0, 0); // scratch variable -} - -Polygon.prototype = Object.create(AbstractShape.prototype); - -Object.defineProperties(Polygon.prototype, { - /** - * This polygon's boundaries. A two-dimensional array containing the polygon boundaries. Each entry of the - * array specifies the vertices of one boundary. This property may also be a simple - * array of positions, in which case the polygon is assumed to have only one boundary. - * @type {Position[][] | Position[]} - * @memberof Polygon.prototype - */ - boundaries: { - get: function () { - return this._boundariesSpecifiedSimply ? this._boundaries[0] : this._boundaries; - }, - set: function (boundaries) { - if (!boundaries) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Polygon", "boundaries", "missingBoundaries")); - } - - if (boundaries.length > 0 && boundaries[0].latitude) { - boundaries = [boundaries]; - this._boundariesSpecifiedSimply = true; - } - - this._boundaries = boundaries; - this.referencePosition = this.determineReferencePosition(this._boundaries); - this.reset(); - } - }, - - /** - * This polygon's texture coordinates if this polygon is to be textured. A texture coordinate must be - * provided for each boundary position. The texture coordinates are specified as a two-dimensional array, - * each entry of which specifies the texture coordinates for one boundary. Each texture coordinate is a - * {@link Vec2} containing the s and t coordinates. - * @type {Vec2[][]} - * @default null - * @memberof Polygon.prototype - */ - textureCoordinates: { - get: function () { - return this._textureCoordinates; - }, - set: function (value) { - this._textureCoordinates = value; - this.reset(); - } - }, - - /** - * Specifies whether to extrude this polygon to the ground by drawing a filled interior from the polygon - * to the terrain. The filled interior uses this polygon's interior attributes. - * @type {Boolean} - * @default false - * @memberof Polygon.prototype - */ - extrude: { - get: function () { - return this._extrude; - }, - set: function (extrude) { - this._extrude = extrude; - this.reset(); - } - } -}); - -// Intentionally not documented. -Polygon.prototype.determineReferencePosition = function (boundaries) { - // Assign the first position as the reference position. - return boundaries.length > 0 && boundaries[0].length > 2 ? boundaries[0][0] : null; -}; - -// Internal. Determines whether this shape's geometry must be re-computed. -Polygon.prototype.mustGenerateGeometry = function (dc) { - if (!this.currentData.boundaryPoints) { - return true; - } - - if (this.currentData.drawInterior !== this.activeAttributes.drawInterior) { - return true; - } - - if (this.altitudeMode === WorldWind.ABSOLUTE) { - return false; - } - - return this.currentData.isExpired; -}; - -// Internal. Indicates whether this polygon should be textured. -Polygon.prototype.hasCapTexture = function () { - return this.textureCoordinates && this.capImageSource(); -}; - -// Internal. Determines source of this polygon's cap texture. See the class description above for the policy. -Polygon.prototype.capImageSource = function () { - if (!this.activeAttributes.imageSource) { - return null; - } - - if (typeof this.activeAttributes.imageSource === "string" - || this.activeAttributes.imageSource instanceof ImageSource) { - return this.activeAttributes.imageSource; - } - - if (Array.isArray(this.activeAttributes.imageSource) - && this.activeAttributes.imageSource[0] - && (typeof this.activeAttributes.imageSource[0] === "string" - || this.activeAttributes.imageSource instanceof ImageSource)) { - return this.activeAttributes.imageSource[0]; - } - - return null; -}; - -// Internal. Indicates whether this polygon has side textures defined. -Polygon.prototype.hasSideTextures = function () { - return this.activeAttributes.imageSource && - Array.isArray(this.activeAttributes.imageSource) && - this.activeAttributes.imageSource.length > 1; -}; - -// Internal. Determines the side texture for a specified side. See the class description above for the policy. -Polygon.prototype.sideImageSource = function (side) { - if (side === 0 || this.activeAttributes.imageSource.length === 2) { - return this.activeAttributes.imageSource[1]; - } - - var numSideTextures = this.activeAttributes.imageSource.length - 1; - side = Math.min(side + 1, numSideTextures); - return this.activeAttributes.imageSource[side]; -}; - -Polygon.prototype.createSurfaceShape = function () { - return new SurfacePolygon(this.boundaries, null); -}; - -// Overridden from AbstractShape base class. -Polygon.prototype.doMakeOrderedRenderable = function (dc) { - // A null reference position is a signal that there are no boundaries to render. - if (!this.referencePosition) { - return null; - } - - if (!this.activeAttributes.drawInterior && !this.activeAttributes.drawOutline) { - return null; - } - - // See if the current shape data can be re-used. - if (!this.mustGenerateGeometry(dc)) { - return this; - } - - var currentData = this.currentData; - - // Set the transformation matrix to correspond to the reference position. - var refPt = currentData.referencePoint; - dc.surfacePointForMode(this.referencePosition.latitude, this.referencePosition.longitude, - this.referencePosition.altitude, this._altitudeMode, refPt); - currentData.transformationMatrix.setToTranslation(refPt[0], refPt[1], refPt[2]); - - // Close the boundaries. - var fullBoundaries = []; - for (var b = 0; b < this._boundaries.length; b++) { - fullBoundaries[b] = this._boundaries[b].slice(0); // clones the array - fullBoundaries[b].push(this._boundaries[b][0]); // appends the first position to the boundary - } - - // Convert the geographic coordinates to the Cartesian coordinates that will be rendered. - var boundaryPoints = this.computeBoundaryPoints(dc, fullBoundaries); - - // Tessellate the polygon if its interior is to be drawn. - if (this.activeAttributes.drawInterior) { - var capVertices = this.tessellatePolygon(dc, boundaryPoints); - if (capVertices) { - // Must copy the vertices to a typed array. (Can't use typed array to begin with because its size - // is unknown prior to tessellation.) - currentData.capTriangles = new Float32Array(capVertices.length); - for (var i = 0, len = capVertices.length; i < len; i++) { - currentData.capTriangles[i] = capVertices[i]; - } - } - } - - currentData.boundaryPoints = boundaryPoints; - currentData.drawInterior = this.activeAttributes.drawInterior; // remember for validation - this.resetExpiration(currentData); - currentData.refreshBuffers = true; // causes VBOs to be reloaded - - // Create the extent from the Cartesian points. Those points are relative to this path's reference point, - // so translate the computed extent to the reference point. - if (!currentData.extent) { - currentData.extent = new BoundingBox(); - } - if (boundaryPoints.length === 1) { - currentData.extent.setToPoints(boundaryPoints[0]); - } else { - var allPoints = []; - for (b = 0; b < boundaryPoints.length; b++) { - for (var p = 0; p < boundaryPoints[b].length; p++) { - allPoints.push(boundaryPoints[b][p]); - } - } - currentData.extent.setToPoints(allPoints); - } - currentData.extent.translate(currentData.referencePoint); - - return this; -}; - -// Private. Intentionally not documented. -Polygon.prototype.computeBoundaryPoints = function (dc, boundaries) { - var eyeDistSquared = Number.MAX_VALUE, - eyePoint = dc.eyePoint, - boundaryPoints = [], - stride = this._extrude ? 6 : 3, - pt = new Vec3(0, 0, 0), - numBoundaryPoints, pos, k, dSquared; - - for (var b = 0; b < boundaries.length; b++) { - numBoundaryPoints = (this._extrude ? 2 : 1) * boundaries[b].length; - boundaryPoints[b] = new Float32Array(numBoundaryPoints * 3); - - for (var i = 0, len = boundaries[b].length; i < len; i++) { - pos = boundaries[b][i]; - - dc.surfacePointForMode(pos.latitude, pos.longitude, pos.altitude, this.altitudeMode, pt); - - dSquared = pt.distanceToSquared(eyePoint); - if (dSquared < eyeDistSquared) { - eyeDistSquared = dSquared; - } - - pt.subtract(this.currentData.referencePoint); - - k = stride * i; - boundaryPoints[b][k] = pt[0]; - boundaryPoints[b][k + 1] = pt[1]; - boundaryPoints[b][k + 2] = pt[2]; - - if (this._extrude) { - dc.surfacePointForMode(pos.latitude, pos.longitude, 0, WorldWind.CLAMP_TO_GROUND, pt); - - dSquared = pt.distanceToSquared(eyePoint); - if (dSquared < eyeDistSquared) { - eyeDistSquared = dSquared; - } - - pt.subtract(this.currentData.referencePoint); - - boundaryPoints[b][k + 3] = pt[0]; - boundaryPoints[b][k + 4] = pt[1]; - boundaryPoints[b][k + 5] = pt[2]; - } - } - } - - this.currentData.eyeDistance = 0; - /*DO NOT COMMITMath.sqrt(eyeDistSquared);*/ - - return boundaryPoints; -}; - -Polygon.prototype.tessellatePolygon = function (dc, boundaryPoints) { - var triangles = [], // the output list of triangles - error = 0, - stride = this._extrude ? 6 : 3, - includeTextureCoordinates = this.hasCapTexture(), - coords, normal; - - if (!this.polygonTessellator) { - this.polygonTessellator = new libtess.GluTesselator(); - - this.polygonTessellator.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA, - function (data, tris) { - tris[tris.length] = data[0]; - tris[tris.length] = data[1]; - tris[tris.length] = data[2]; - - if (includeTextureCoordinates) { - tris[tris.length] = data[3]; - tris[tris.length] = data[4]; - } - }); - - this.polygonTessellator.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, - function (coords, data, weight) { - var newCoords = [coords[0], coords[1], coords[2]]; - - if (includeTextureCoordinates) { - for (var i = 3; i <= 4; i++) { - var value = 0; - for (var w = 0; w < 4; w++) { - if (weight[w] > 0) { - value += weight[w] * data[w][i]; - } - } - - newCoords[i] = value; - } - } - - return newCoords; - }); - - this.polygonTessellator.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, - function (errno) { - error = errno; - Logger.logMessage(Logger.LEVEL_WARNING, "Polygon", "tessellatePolygon", - "Tessellation error " + errno + "."); - }); - } - - // Compute a normal vector for the polygon. - normal = Vec3.computeBufferNormal(boundaryPoints[0], stride); - if (!normal) { - normal = new Vec3(0, 0, 0); - // The first boundary is colinear. Fall back to the surface normal. - dc.globe.surfaceNormalAtLocation(this.referencePosition.latitude, this.referencePosition.longitude, - normal); - } - this.polygonTessellator.gluTessNormal(normal[0], normal[1], normal[2]); - this.currentData.capNormal = normal; - - // Tessellate the polygon. - this.polygonTessellator.gluTessBeginPolygon(triangles); - for (var b = 0; b < boundaryPoints.length; b++) { - var t = 0; - this.polygonTessellator.gluTessBeginContour(); - var contour = boundaryPoints[b]; - for (var c = 0; c < contour.length; c += stride) { - coords = [contour[c], contour[c + 1], contour[c + 2]]; - if (includeTextureCoordinates) { - if (t < this.textureCoordinates[b].length) { - coords[3] = this.textureCoordinates[b][t][0]; - coords[4] = this.textureCoordinates[b][t][1]; - } else { - coords[3] = this.textureCoordinates[b][0][0]; - coords[4] = this.textureCoordinates[b][1][1]; - } - ++t; - } - this.polygonTessellator.gluTessVertex(coords, coords); - } - this.polygonTessellator.gluTessEndContour(); - } - this.polygonTessellator.gluTessEndPolygon(); - - return error === 0 ? triangles : null; -}; - -// Private. Intentionally not documented. -Polygon.prototype.mustDrawVerticals = function (dc) { - return this._extrude - && this.activeAttributes.drawOutline - && this.activeAttributes.drawVerticals - && this.altitudeMode !== WorldWind.CLAMP_TO_GROUND; -}; - -// Overridden from AbstractShape base class. -Polygon.prototype.doRenderOrdered = function (dc) { - var currentData = this.currentData, - pickColor; - - if (dc.pickingMode) { - pickColor = dc.uniquePickColor(); - } - - // Draw the cap if the interior requested and we were able to tessellate the polygon. - if (this.activeAttributes.drawInterior && currentData.capTriangles && currentData.capTriangles.length > 0) { - this.drawCap(dc, pickColor); - } - - if (this._extrude && this.activeAttributes.drawInterior) { - this.drawSides(dc, pickColor); - } - - if (this.activeAttributes.drawOutline) { - this.drawOutline(dc, pickColor); - } - - currentData.refreshBuffers = false; - - if (dc.pickingMode) { - var po = new PickedObject(pickColor, this.pickDelegate ? this.pickDelegate : this, null, - this.layer, false); - dc.resolvePick(po); - } -}; - -Polygon.prototype.drawCap = function (dc, pickColor) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - currentData = this.currentData, - refreshBuffers = currentData.refreshBuffers, - hasCapTexture = !!this.hasCapTexture(), - applyLighting = this.activeAttributes.applyLighting, - numCapVertices = currentData.capTriangles.length / (hasCapTexture ? 5 : 3), - vboId, color, stride, textureBound, capBuffer; - - // Assume no cap texture. - program.loadTextureEnabled(gl, false); - - this.applyMvpMatrix(dc); - - if (!currentData.capVboCacheKey) { - currentData.capVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.capVboCacheKey); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.capVboCacheKey, vboId, currentData.capTriangles.length * 4); - refreshBuffers = true; - } - - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - if (refreshBuffers) { - capBuffer = applyLighting ? this.makeCapBufferWithNormals() : currentData.capTriangles; - gl.bufferData(gl.ARRAY_BUFFER, capBuffer, gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - } - - color = this.activeAttributes.interiorColor; - // Disable writing the shape's fragments to the depth buffer when the interior is semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - stride = 12 + (hasCapTexture ? 8 : 0) + (applyLighting ? 12 : 0); - - if (hasCapTexture && !dc.pickingMode) { - this.activeTexture = dc.gpuResourceCache.resourceForKey(this.capImageSource()); - if (!this.activeTexture) { - this.activeTexture = - dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, this.capImageSource()); - } - - textureBound = this.activeTexture && this.activeTexture.bind(dc); - if (textureBound) { - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, stride, 12); - - this.scratchMatrix.setToIdentity(); - this.scratchMatrix.multiplyByTextureTransform(this.activeTexture); - - program.loadTextureEnabled(gl, true); - program.loadTextureUnit(gl, gl.TEXTURE0); - program.loadTextureMatrix(gl, this.scratchMatrix); - program.loadModulateColor(gl, dc.pickingMode); - } - } - - if (applyLighting && !dc.pickingMode) { - program.loadApplyLighting(gl, true); - gl.enableVertexAttribArray(program.normalVectorLocation); - gl.vertexAttribPointer(program.normalVectorLocation, 3, gl.FLOAT, false, stride, stride - 12); - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, stride, 0); - gl.drawArrays(gl.TRIANGLES, 0, numCapVertices); -}; - -Polygon.prototype.makeCapBufferWithNormals = function () { - var currentData = this.currentData, - normal = currentData.capNormal, - numFloatsIn = this.hasCapTexture() ? 5 : 3, - numFloatsOut = numFloatsIn + 3, - numVertices = currentData.capTriangles.length / numFloatsIn, - bufferIn = currentData.capTriangles, - bufferOut = new Float32Array(numVertices * numFloatsOut), - k = 0; - - for (var i = 0; i < numVertices; i++) { - for (var j = 0; j < numFloatsIn; j++) { - bufferOut[k++] = bufferIn[i * numFloatsIn + j]; - } - - bufferOut[k++] = normal[0]; - bufferOut[k++] = normal[1]; - bufferOut[k++] = normal[2]; - } - - return bufferOut; -}; - -Polygon.prototype.drawSides = function (dc, pickColor) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - currentData = this.currentData, - refreshBuffers = currentData.refreshBuffers, - hasSideTextures = this.hasSideTextures(), - applyLighting = this.activeAttributes.applyLighting, - numFloatsPerVertex = 3 + (hasSideTextures ? 2 : 0) + (applyLighting ? 3 : 0), - numBytesPerVertex = 4 * numFloatsPerVertex, - vboId, opacity, color, textureBound, sidesBuffer, numSides; - - numSides = 0; - for (var b = 0; b < currentData.boundaryPoints.length; b++) { // for each boundary} - numSides += currentData.boundaryPoints[b].length / 6 - 1; // 6 floats per boundary point: top + bottom - } - - if (!currentData.sidesVboCacheKey) { - currentData.sidesVboCacheKey = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.sidesVboCacheKey); - if (!vboId || refreshBuffers) { - sidesBuffer = this.makeSidesBuffer(numSides); - currentData.numSideVertices = sidesBuffer.length / numFloatsPerVertex; - - if (!vboId) { - vboId = gl.createBuffer(); - } - - dc.gpuResourceCache.putResource(currentData.sidesVboCacheKey, vboId, sidesBuffer.length * 4); - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - gl.bufferData(gl.ARRAY_BUFFER, sidesBuffer, gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - } else { - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - } - - color = this.activeAttributes.interiorColor; - // Disable writing the shape's fragments to the depth buffer when the interior is semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - if (hasSideTextures && !dc.pickingMode) { - if (applyLighting) { - program.loadApplyLighting(gl, true); - gl.enableVertexAttribArray(program.normalVectorLocation); - } else { - program.loadApplyLighting(gl, false); - } - - // Step through the sides buffer rendering each side independently but from the same buffer. - for (var side = 0; side < numSides; side++) { - var sideImageSource = this.sideImageSource(side), - sideTexture = dc.gpuResourceCache.resourceForKey(sideImageSource), - coordByteOffset = side * 6 * numBytesPerVertex; // 6 vertices (2 triangles) per side - - if (sideImageSource && !sideTexture) { - sideTexture = dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, sideImageSource); - } - - textureBound = sideTexture && sideTexture.bind(dc); - if (textureBound) { - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, numBytesPerVertex, - coordByteOffset + 12); - - this.scratchMatrix.setToIdentity(); - this.scratchMatrix.multiplyByTextureTransform(sideTexture); - - program.loadTextureEnabled(gl, true); - program.loadTextureUnit(gl, gl.TEXTURE0); - program.loadTextureMatrix(gl, this.scratchMatrix); - } else { - program.loadTextureEnabled(gl, false); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - } - - if (applyLighting) { - gl.vertexAttribPointer(program.normalVectorLocation, 3, gl.FLOAT, false, numBytesPerVertex, - coordByteOffset + 20); - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, numBytesPerVertex, - coordByteOffset); - gl.drawArrays(gl.TRIANGLES, 0, 6); // 6 vertices per side - } - } else { - program.loadTextureEnabled(gl, false); - - if (applyLighting && !dc.pickingMode) { - program.loadApplyLighting(gl, true); - gl.enableVertexAttribArray(program.normalVectorLocation); - gl.vertexAttribPointer(program.normalVectorLocation, 3, gl.FLOAT, false, numBytesPerVertex, - numBytesPerVertex - 12); - } else { - program.loadApplyLighting(gl, false); - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, numBytesPerVertex, 0); - gl.drawArrays(gl.TRIANGLES, 0, currentData.numSideVertices); - } -}; - -Polygon.prototype.makeSidesBuffer = function (numSides) { - var currentData = this.currentData, - hasSideTextures = this.hasSideTextures(), - applyLighting = this.activeAttributes.applyLighting, - numFloatsPerVertex = 3 + (hasSideTextures ? 2 : 0) + (applyLighting ? 3 : 0), - sidesBuffer, sidesBufferIndex, numBufferFloats, v0, v1, v2, v3, t0, t1, t2, t3; - - numBufferFloats = numSides * 2 * 3 * numFloatsPerVertex; // 2 triangles per side, 3 vertices per triangle - sidesBuffer = new Float32Array(numBufferFloats); - sidesBufferIndex = 0; - - v0 = new Vec3(0, 0, 0); - v1 = new Vec3(0, 0, 0); - v2 = new Vec3(0, 0, 0); - v3 = new Vec3(0, 0, 0); - - if (hasSideTextures) { - t0 = new Vec2(0, 1); - t1 = new Vec2(0, 0); - t2 = new Vec2(1, 1); - t3 = new Vec2(1, 0); - } else { - t0 = t1 = t2 = t3 = null; - } - - for (var b = 0; b < currentData.boundaryPoints.length; b++) { // for each boundary} - var boundaryPoints = currentData.boundaryPoints[b], - sideNormal; - - for (var i = 0; i < boundaryPoints.length - 6; i += 6) { - v0[0] = boundaryPoints[i]; - v0[1] = boundaryPoints[i + 1]; - v0[2] = boundaryPoints[i + 2]; - - v1[0] = boundaryPoints[i + 3]; - v1[1] = boundaryPoints[i + 4]; - v1[2] = boundaryPoints[i + 5]; - - v2[0] = boundaryPoints[i + 6]; - v2[1] = boundaryPoints[i + 7]; - v2[2] = boundaryPoints[i + 8]; - - v3[0] = boundaryPoints[i + 9]; - v3[1] = boundaryPoints[i + 10]; - v3[2] = boundaryPoints[i + 11]; - - sideNormal = applyLighting ? Vec3.computeTriangleNormal(v0, v1, v2) : null; - - // First triangle. - this.addVertexToBuffer(v0, t0, sideNormal, sidesBuffer, sidesBufferIndex); - sidesBufferIndex += numFloatsPerVertex; - - this.addVertexToBuffer(v1, t1, sideNormal, sidesBuffer, sidesBufferIndex); - sidesBufferIndex += numFloatsPerVertex; - - this.addVertexToBuffer(v2, t2, sideNormal, sidesBuffer, sidesBufferIndex); - sidesBufferIndex += numFloatsPerVertex; - - // Second triangle. - this.addVertexToBuffer(v1, t1, sideNormal, sidesBuffer, sidesBufferIndex); - sidesBufferIndex += numFloatsPerVertex; - - this.addVertexToBuffer(v3, t3, sideNormal, sidesBuffer, sidesBufferIndex); - sidesBufferIndex += numFloatsPerVertex; - - this.addVertexToBuffer(v2, t2, sideNormal, sidesBuffer, sidesBufferIndex); - sidesBufferIndex += numFloatsPerVertex; - } - } - - return sidesBuffer; -}; - -Polygon.prototype.addVertexToBuffer = function (v, texCoord, normal, buffer, bufferIndex) { - buffer[bufferIndex++] = v[0]; - buffer[bufferIndex++] = v[1]; - buffer[bufferIndex++] = v[2]; - - if (texCoord) { - buffer[bufferIndex++] = texCoord[0]; - buffer[bufferIndex++] = texCoord[1]; - } - - if (normal) { - buffer[bufferIndex++] = normal[0]; - buffer[bufferIndex++] = normal[1]; - buffer[bufferIndex] = normal[2]; - } -}; - -Polygon.prototype.drawOutline = function (dc, pickColor) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - currentData = this.currentData, - refreshBuffers = currentData.refreshBuffers, - numBoundaryPoints, vboId, opacity, color, stride, nPts, textureBound; - - program.loadTextureEnabled(gl, false); - program.loadApplyLighting(gl, false); - - if (this.hasCapTexture()) { - gl.disableVertexAttribArray(program.vertexTexCoordLocation); // we're not texturing the outline - } - - if (this.activeAttributes.applyLighting) { - gl.disableVertexAttribArray(program.normalVectorLocation); // we're not lighting the outline - } - - if (!currentData.boundaryVboCacheKeys) { - this.currentData.boundaryVboCacheKeys = []; - } - - // Make the outline stand out from the interior. - this.applyMvpMatrixForOutline(dc); - - program.loadTextureEnabled(gl, false); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - - for (var b = 0; b < currentData.boundaryPoints.length; b++) { // for each boundary} - numBoundaryPoints = currentData.boundaryPoints[b].length / 3; - - if (!currentData.boundaryVboCacheKeys[b]) { - currentData.boundaryVboCacheKeys[b] = dc.gpuResourceCache.generateCacheKey(); - } - - vboId = dc.gpuResourceCache.resourceForKey(currentData.boundaryVboCacheKeys[b]); - if (!vboId) { - vboId = gl.createBuffer(); - dc.gpuResourceCache.putResource(currentData.boundaryVboCacheKeys[b], vboId, numBoundaryPoints * 12); - refreshBuffers = true; - } - - gl.bindBuffer(gl.ARRAY_BUFFER, vboId); - if (refreshBuffers) { - gl.bufferData(gl.ARRAY_BUFFER, currentData.boundaryPoints[b], gl.STATIC_DRAW); - dc.frameStatistics.incrementVboLoadCount(1); - } - - color = this.activeAttributes.outlineColor; - // Disable writing the shape's fragments to the depth buffer when the interior is semi-transparent. - gl.depthMask(color.alpha * this.layer.opacity >= 1 || dc.pickingMode); - program.loadColor(gl, dc.pickingMode ? pickColor : color); - program.loadOpacity(gl, dc.pickingMode ? 1 : this.layer.opacity); - - gl.lineWidth(this.activeAttributes.outlineWidth); - - if (this._extrude) { - stride = 24; - nPts = numBoundaryPoints / 2; - } else { - stride = 12; - nPts = numBoundaryPoints; - } - - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, stride, 0); - gl.drawArrays(gl.LINE_STRIP, 0, nPts); - - if (this.mustDrawVerticals(dc)) { - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - gl.drawArrays(gl.LINES, 0, numBoundaryPoints - 2); - } - } -}; - -// Overridden from AbstractShape base class. -Polygon.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext; - - if (this.activeAttributes.drawInterior) { - gl.disable(gl.CULL_FACE); - } - - dc.findAndBindProgram(BasicTextureProgram); - gl.enableVertexAttribArray(dc.currentProgram.vertexPointLocation); - - var applyLighting = !dc.pickMode && this.activeAttributes.applyLighting; - if (applyLighting) { - dc.currentProgram.loadModelviewInverse(gl, dc.modelviewNormalTransform); - } -}; - -// Overridden from AbstractShape base class. -Polygon.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext; - - gl.disableVertexAttribArray(dc.currentProgram.vertexPointLocation); - gl.disableVertexAttribArray(dc.currentProgram.normalVectorLocation); - gl.depthMask(true); - gl.lineWidth(1); - gl.enable(gl.CULL_FACE); -}; - -export default Polygon; diff --git a/web/src/gis/shapes/ScreenImage.js b/web/src/gis/shapes/ScreenImage.js deleted file mode 100644 index e058e8dd..00000000 --- a/web/src/gis/shapes/ScreenImage.js +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ScreenImage - */ -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import Color from '../util/Color'; -import ImageSource from '../util/ImageSource'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import Offset from '../util/Offset'; -import PickedObject from '../pick/PickedObject'; -import Renderable from '../render/Renderable'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a screen image. - * @alias ScreenImage - * @constructor - * @augments Renderable - * @classdesc Displays an image at a specified screen location in the WorldWindow. - * The image location is specified by an offset, which causes the image to maintain its relative position - * when the window size changes. - * @param {Offset} screenOffset The offset indicating the image's placement on the screen. - * Use [the image offset property]{@link ScreenImage#imageOffset} to position the image relative to the - * specified screen offset. - * @param {String|ImageSource} imageSource The source of the image to display. - * May be either a string identifying the URL of the image, or an {@link ImageSource} object identifying a - * dynamically created image. - * @throws {ArgumentError} If the specified screen offset or image source is null or undefined. - */ -function ScreenImage(screenOffset, imageSource) { - if (!screenOffset) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenImage", "constructor", "missingOffset")); - } - - if (!imageSource) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenImage", "constructor", "missingImage")); - } - - Renderable.call(this); - - /** - * The offset indicating this screen image's placement on the screen. - * @type {Offset} - */ - this.screenOffset = screenOffset; - - // Documented with its property accessor below. - this._imageSource = imageSource; - - /** - * The image color. When displayed, this shape's image is multiplied by this image color to achieve the - * final image color. The color white, the default, causes the image to be drawn in its native colors. - * @type {Color} - * @default White (1, 1, 1, 1) - */ - this.imageColor = Color.WHITE; - - /** - * Indicates the location within the image at which to align with the specified screen location. - * May be null, in which case the image's bottom-left corner is placed at the screen location. - * @type {Offset} - * @default 0.5, 0.5, both fractional (Centers the image on the screen location.) - */ - this.imageOffset = new Offset(WorldWind.OFFSET_FRACTION, 0.5, WorldWind.OFFSET_FRACTION, 0.5); - - /** - * Indicates the amount to scale the image. - * @type {Number} - * @default 1 - */ - this.imageScale = 1; - - /** - * The amount of rotation to apply to the image, measured in degrees clockwise from the top of the window. - * @type {Number} - * @default 0 - */ - this.imageRotation = 0; - - /** - * The amount of tilt to apply to the image, measured in degrees. - * @type {Number} - * @default 0 - */ - this.imageTilt = 0; - - /** - * Indicates whether to draw this screen image. - * @type {Boolean} - * @default true - */ - this.enabled = true; - - /** - * This image's opacity. When this screen image is drawn, the actual opacity is the product of - * this opacity and the opacity of the layer containing this screen image. - * @type {Number} - */ - this.opacity = 1; - - /** - * Indicates the object to return as the userObject of this shape when picked. If null, - * then this shape is returned as the userObject. - * @type {Object} - * @default null - * @see [PickedObject.userObject]{@link PickedObject#userObject} - */ - this.pickDelegate = null; - - // Internal use only. Intentionally not documented. - this.activeTexture = null; - - // Internal use only. Intentionally not documented. - this.imageTransform = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.texCoordMatrix = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.imageBounds = null; - - // Internal use only. Intentionally not documented. - this.layer = null; -} - -// Internal use only. Intentionally not documented. -ScreenImage.matrix = Matrix.fromIdentity(); // scratch variable - -ScreenImage.prototype = Object.create(Renderable.prototype); - -Object.defineProperties(ScreenImage.prototype, { - /** - * The source of the image to display. - * May be either a string identifying the URL of the image, or an {@link ImageSource} object identifying a - * dynamically created image. - * @type {String|ImageSource} - * @default null - * @memberof ScreenImage.prototype - */ - imageSource: { - get: function () { - return this._imageSource; - }, - set: function (imageSource) { - if (!imageSource) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenImage", "imageSource", - "missingImage")); - } - - this._imageSource = imageSource; - this.imageSourceWasUpdated = true; - } - } -}); - -/** - * Renders this screen image. This method is typically not called by applications but is called by - * {@link RenderableLayer} during rendering. For this shape this method creates and - * enques an ordered renderable with the draw context and does not actually draw the image. - * @param {DrawContext} dc The current draw context. - */ -ScreenImage.prototype.render = function (dc) { - if (!this.enabled) { - return; - } - - if (!dc.accumulateOrderedRenderables) { - return; - } - - // Create an ordered renderable, but don't create more than one per frame. - var orderedScreenImage = null; - if (this.lastFrameTime !== dc.timestamp) { - orderedScreenImage = this.makeOrderedRenderable(dc); - } - - if (!orderedScreenImage) { - return; - } - - if (!orderedScreenImage.isVisible(dc)) { - return; - } - - orderedScreenImage.layer = dc.currentLayer; - - this.lastFrameTime = dc.timestamp; - dc.addOrderedRenderable(orderedScreenImage); -}; - -/** - * Draws this shape as an ordered renderable. Applications do not call this function. It is called by - * [WorldWindow]{@link WorldWindow} during rendering. - * @param {DrawContext} dc The current draw context. - */ -ScreenImage.prototype.renderOrdered = function (dc) { - this.drawOrderedScreenImage(dc); - - if (dc.pickingMode) { - var po = new PickedObject(this.pickColor.clone(), this.pickDelegate ? this.pickDelegate : this, - null, this.layer, false); - dc.resolvePick(po); - } -}; - -// Internal. Intentionally not documented. -ScreenImage.prototype.makeOrderedRenderable = function (dc) { - var w, h, s, ws, hs, - iOffset, sOffset; - - this.activeTexture = this.getActiveTexture(dc); - if (!this.activeTexture || this.imageSourceWasUpdated) { - this.activeTexture = dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, this._imageSource); - if (!this.activeTexture) { - return null; - } - } - - this.eyeDistance = 0; - - // Compute the image's transform matrix and texture coordinate matrix according to its screen point, image size, - // image offset and image scale. The image offset is defined with its origin at the image's bottom-left corner and - // axes that extend up and to the right from the origin point. - w = this.activeTexture.imageWidth; - h = this.activeTexture.imageHeight; - s = this.imageScale; - iOffset = this.imageOffset.offsetForSize(w, h); - ws = dc.viewport.width; - hs = dc.viewport.height; - sOffset = this.screenOffset.offsetForSize(ws, hs); - - this.imageTransform.setTranslation( - sOffset[0] - iOffset[0] * s, - sOffset[1] - iOffset[1] * s, - 0); - - this.imageTransform.setScale(w * s, h * s, 1); - - this.imageBounds = WWMath.boundingRectForUnitQuad(this.imageTransform); - - return this; -}; - -ScreenImage.prototype.getActiveTexture = function (dc) { - return dc.gpuResourceCache.resourceForKey(this._imageSource); -}; - -// Internal. Intentionally not documented. -ScreenImage.prototype.isVisible = function (dc) { - if (dc.pickingMode) { - return dc.pickRectangle && this.imageBounds.intersects(dc.pickRectangle); - } else { - return this.imageBounds.intersects(dc.viewport); - } -}; - -// Internal. Intentionally not documented. -ScreenImage.prototype.drawOrderedScreenImage = function (dc) { - this.beginDrawing(dc); - try { - this.doDrawOrderedScreenImage(dc); - } finally { - this.endDrawing(dc); - } -}; - -// Internal. Intentionally not documented. -ScreenImage.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext, - program; - - dc.findAndBindProgram(BasicTextureProgram); - - // Configure GL to use the draw context's unit quad VBOs for both model coordinates and texture coordinates. - // Most browsers can share the same buffer for vertex and texture coordinates, but Internet Explorer requires - // that they be in separate buffers, so the code below uses the 3D buffer for vertex coords and the 2D - // buffer for texture coords. - program = dc.currentProgram; - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer()); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, 0, 0); - gl.enableVertexAttribArray(program.vertexPointLocation); - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - - // Tell the program which texture unit to use. - program.loadTextureUnit(gl, gl.TEXTURE0); - program.loadModulateColor(gl, dc.pickingMode); - - // Turn off depth testing. - gl.disable(gl.DEPTH_TEST); -}; - -// Internal. Intentionally not documented. -ScreenImage.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram; - - // Clear the vertex attribute state. - gl.disableVertexAttribArray(program.vertexPointLocation); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - - // Clear GL bindings. - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindTexture(gl.TEXTURE_2D, null); - - // Re-enable depth testing. - gl.enable(gl.DEPTH_TEST); -}; - -// Internal. Intentionally not documented. -ScreenImage.prototype.doDrawOrderedScreenImage = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram; - - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer3()); - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - - // Compute and specify the MVP matrix. - ScreenImage.matrix.copy(dc.screenProjection); - ScreenImage.matrix.multiplyMatrix(this.imageTransform); - - ScreenImage.matrix.multiplyByTranslation(0.5, 0.5, 0.5); // shift Z to prevent image clipping - ScreenImage.matrix.multiplyByRotation(1, 0, 0, this.imageTilt); - ScreenImage.matrix.multiplyByRotation(0, 0, 1, this.imageRotation); - ScreenImage.matrix.multiplyByTranslation(-0.5, -0.5, 0); - - program.loadModelviewProjection(gl, ScreenImage.matrix); - - // Enable texture for both normal display and for picking. If picking is enabled in the shader (set in - // beginDrawing() above) then the texture's alpha component is still needed in order to modulate the - // pick color to mask off transparent pixels. - program.loadTextureEnabled(gl, true); - - // Set the pick color for picking or the color and opacity if not picking. - if (dc.pickingMode) { - this.pickColor = dc.uniquePickColor(); - program.loadColor(gl, this.pickColor); - program.loadOpacity(gl, 1); - } else { - program.loadColor(gl, this.imageColor); - program.loadOpacity(gl, this.opacity * this.layer.opacity); - } - - this.texCoordMatrix.setToIdentity(); - this.texCoordMatrix.multiplyByTextureTransform(this.activeTexture); - program.loadTextureMatrix(gl, this.texCoordMatrix); - - if (this.activeTexture.bind(dc)) { // returns false if active texture cannot be bound - // Draw the placemark's image quad. - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - } -}; - -export default ScreenImage; diff --git a/web/src/gis/shapes/ScreenText.js b/web/src/gis/shapes/ScreenText.js deleted file mode 100644 index 1ad99959..00000000 --- a/web/src/gis/shapes/ScreenText.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ScreenText - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Offset from '../util/Offset'; -import Text from '../shapes/Text'; - - -/** - * Constructs a screen text shape at a specified screen location. - * @alias ScreenText - * @constructor - * @augments Text - * @classdesc Represents a string of text displayed at a screen location. - * <p> - * See also {@link GeographicText}. - * - * @param {Offset} screenOffset The offset indicating the text's placement on the screen. - * Use [TextAttributes.offset]{@link TextAttributes#offset} to position the text relative to the specified - * screen offset. - * @param {String} text The text to display. - * @throws {ArgumentError} If either the specified screen offset or text is null or undefined. - */ -function ScreenText(screenOffset, text) { - if (!screenOffset) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Text", "constructor", "missingOffset")); - } - - Text.call(this, text); - - /** - * The offset indicating this text's placement on the screen. - * The [TextAttributes.offset]{@link TextAttributes#offset} property indicates the relationship of the text - * string to this location. - * @type {Offset} - */ - this.screenOffset = screenOffset; - - /** - * Inherited from [Text]{@link Text#altitudeMode} but not utilized by screen text. - */ - this.altitudeMode = null; -} - -ScreenText.prototype = Object.create(Text.prototype); - -// Documented in superclass. -ScreenText.prototype.render = function (dc) { - // Ensure that this text is drawn only once per frame. - if (this.lastFrameTime !== dc.timestamp) { - Text.prototype.render.call(this, dc); - } -}; - -// Documented in superclass. -ScreenText.prototype.computeScreenPointAndEyeDistance = function (dc) { - var gl = dc.currentGlContext, - offset = this.screenOffset.offsetForSize(gl.drawingBufferWidth, gl.drawingBufferHeight); - - this.screenPoint[0] = offset[0]; - this.screenPoint[1] = offset[1]; - this.screenPoint[2] = 0; - - this.eyeDistance = 0; - - return true; -}; - -export default ScreenText; diff --git a/web/src/gis/shapes/ShapeAttributes.js b/web/src/gis/shapes/ShapeAttributes.js deleted file mode 100644 index 732a2ea0..00000000 --- a/web/src/gis/shapes/ShapeAttributes.js +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ShapeAttributes - */ -import Color from '../util/Color'; -import ImageSource from '../util/ImageSource'; - - -/** - * Constructs a shape attributes bundle, optionally specifying a prototype set of attributes. Not all shapes - * use all the properties in the bundle. See the documentation of a specific shape to determine the properties - * it does use. - * @alias ShapeAttributes - * @constructor - * @classdesc Holds attributes applied to WorldWind shapes. - * @param {ShapeAttributes} attributes An attribute bundle whose properties are used to initially populate - * the constructed attributes bundle. May be null, in which case the constructed attributes bundle is populated - * with default attributes. - */ -function ShapeAttributes(attributes) { - - // All these are documented with their property accessors below. - this._drawInterior = attributes ? attributes._drawInterior : true; - this._drawOutline = attributes ? attributes._drawOutline : true; - this._enableLighting = attributes ? attributes._enableLighting : false; - this._interiorColor = attributes ? attributes._interiorColor.clone() : Color.WHITE.clone(); - this._outlineColor = attributes ? attributes._outlineColor.clone() : Color.RED.clone(); - this._outlineWidth = attributes ? attributes._outlineWidth : 1.0; - this._outlineStippleFactor = attributes ? attributes._outlineStippleFactor : 0; - this._outlineStipplePattern = attributes ? attributes._outlineStipplePattern : 0xF0F0; - this._imageSource = attributes ? attributes._imageSource : null; - this._depthTest = attributes ? attributes._depthTest : true; - this._drawVerticals = attributes ? attributes._drawVerticals : false; - this._applyLighting = attributes ? attributes._applyLighting : false; - - /** - * Indicates whether this object's state key is invalid. Subclasses must set this value to true when their - * attributes change. The state key will be automatically computed the next time it's requested. This flag - * will be set to false when that occurs. - * @type {Boolean} - * @protected - */ - this.stateKeyInvalid = true; -} - -/** - * Computes the state key for this attributes object. Subclasses that define additional attributes must - * override this method, call it from that method, and append the state of their attributes to its - * return value. - * @returns {String} The state key for this object. - * @protected - */ -ShapeAttributes.prototype.computeStateKey = function () { - return "di " + this._drawInterior + - " do " + this._drawOutline + - " el " + this._enableLighting + - " ic " + this._interiorColor.toHexString(true) + - " oc " + this._outlineColor.toHexString(true) + - " ow " + this._outlineWidth + - " osf " + this._outlineStippleFactor + - " osp " + this._outlineStipplePattern + - " is " + (this._imageSource ? - this.imageSource instanceof ImageSource ? this.imageSource.key : this.imageSource : "null") + - " dt " + this._depthTest + - " dv " + this._drawVerticals + - " li " + this._applyLighting; -}; - -Object.defineProperties(ShapeAttributes.prototype, { - /** - * A string identifying the state of this attributes object. The string encodes the current values of all - * this object's properties. It's typically used to validate cached representations of shapes associated - * with this attributes object. - * @type {String} - * @readonly - * @memberof ShapeAttributes.prototype - */ - stateKey: { - get: function () { - if (this.stateKeyInvalid) { - this._stateKey = this.computeStateKey(); - this.stateKeyInvalid = false; - } - return this._stateKey; - } - }, - - /** - * Indicates whether the interior of the associated shape is drawn. - * @type {Boolean} - * @default true - * @memberof ShapeAttributes.prototype - */ - drawInterior: { - get: function () { - return this._drawInterior; - }, - set: function (value) { - this._drawInterior = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether the outline of the associated shape is drawn - * @type {Boolean} - * @default true - * @memberof ShapeAttributes.prototype - */ - drawOutline: { - get: function () { - return this._drawOutline; - }, - set: function (value) { - this._drawOutline = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether lighting is applied to the associated shape. - * @type {Boolean} - * @default false - * @memberof ShapeAttributes.prototype - */ - enableLighting: { - get: function () { - return this._enableLighting; - }, - set: function (value) { - this._enableLighting = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the associated shape's interior color and opacity. - * @type {Color} - * @default Opaque white (red = 1, green = 1, blue = 1, alpha = 1) - * @memberof ShapeAttributes.prototype - */ - interiorColor: { - get: function () { - return this._interiorColor; - }, - set: function (value) { - this._interiorColor = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the associated shape's outline color and opacity. - * @type {Color} - * @default Opaque red (red = 1, green = 0, blue = 0, alpha = 1) - * @memberof ShapeAttributes.prototype - */ - outlineColor: { - get: function () { - return this._outlineColor; - }, - set: function (value) { - this._outlineColor = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the associated shape's outline width. - * @type {Number} - * @default 1.0 - * @memberof ShapeAttributes.prototype - */ - outlineWidth: { - get: function () { - return this._outlineWidth; - }, - set: function (value) { - this._outlineWidth = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the associated shape's outline stipple pattern. Specifies a number whose lower 16 bits - * define a pattern of which pixels in the outline are rendered and which are suppressed. Each bit - * corresponds to a pixel in the shape's outline, and the pattern repeats after every n*16 pixels, where - * n is the [stipple factor]{@link ShapeAttributes#outlineStippleFactor}. For example, if the outline - * stipple factor is 3, each bit in the stipple pattern is repeated three times before using the next bit. - * <p> - * To disable outline stippling, either specify a stipple factor of 0 or specify a stipple pattern of - * all 1 bits, i.e., 0xFFFF. - * @type {Number} - * @default 0xF0F0 - * @memberof ShapeAttributes.prototype - */ - outlineStipplePattern: { - get: function () { - return this._outlineStipplePattern; - }, - set: function (value) { - this._outlineStipplePattern = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the associated shape's outline stipple factor. Specifies the number of times each bit in the - * outline stipple pattern is repeated before the next bit is used. For example, if the outline stipple - * factor is 3, each bit is repeated three times before using the next bit. The specified factor must be - * either 0 or an integer greater than 0. A stipple factor of 0 indicates no stippling. - * @type {Number} - * @default 0 - * @memberof ShapeAttributes.prototype - */ - outlineStippleFactor: { - get: function () { - return this._outlineStippleFactor; - }, - set: function (value) { - this._outlineStippleFactor = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the associated shape's image source. May be null, in which case no image is - * applied to the shape. - * @type {String|ImageSource} - * @memberof ShapeAttributes.prototype - * @default null - */ - imageSource: { - get: function () { - return this._imageSource; - }, - set: function (value) { - this._imageSource = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether the shape should be depth-tested against other objects in the scene. If true, - * the shape may be occluded by terrain and other objects in certain viewing situations. If false, - * the shape will not be occluded by terrain and other objects. - * @type {Boolean} - * @default true - * @memberof ShapeAttributes.prototype - */ - depthTest: { - get: function () { - return this._depthTest; - }, - set: function (value) { - this._depthTest = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether this shape should draw vertical lines extending from its specified positions to the - * ground. - * @type {Boolean} - * @default false - * @memberof ShapeAttributes.prototype - */ - drawVerticals: { - get: function () { - return this._drawVerticals; - }, - set: function (value) { - this._drawVerticals = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether lighting is applied to the shape. - * @type {Boolean} - * @default false - * @memberof ShapeAttributes.prototype - */ - applyLighting: { - get: function () { - return this._applyLighting; - }, - set: function (value) { - this._applyLighting = value; - this.stateKeyInvalid = true; - } - } -}); - -export default ShapeAttributes; diff --git a/web/src/gis/shapes/SurfaceCircle.js b/web/src/gis/shapes/SurfaceCircle.js deleted file mode 100644 index 84ad3ce5..00000000 --- a/web/src/gis/shapes/SurfaceCircle.js +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceCircle - */ -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfaceShape from '../shapes/SurfaceShape'; - - -/** - * Constructs a surface circle with a specified center and radius and an optional attributes bundle. - * @alias SurfaceCircle - * @constructor - * @augments SurfaceShape - * @classdesc Represents a circle draped over the terrain surface. - * <p> - * SurfaceCircle uses the following attributes from its associated shape attributes bundle: - * <ul> - * <li>Draw interior</li> - * <li>Draw outline</li> - * <li>Interior color</li> - * <li>Outline color</li> - * <li>Outline width</li> - * <li>Outline stipple factor</li> - * <li>Outline stipple pattern</li> - * </ul> - * @param {Location} center The circle's center location. - * @param {Number} radius The circle's radius in meters. - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - * @throws {ArgumentError} If the specified center location is null or undefined or the specified radius - * is negative. - */ -function SurfaceCircle(center, radius, attributes) { - if (!center) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceCircle", "constructor", "missingLocation")); - } - - if (radius < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceCircle", "constructor", "Radius is negative")); - } - - SurfaceShape.call(this, attributes); - - // All these are documented with their property accessors below. - this._center = center; - this._radius = radius; - this._intervals = SurfaceCircle.DEFAULT_NUM_INTERVALS; -} - -SurfaceCircle.prototype = Object.create(SurfaceShape.prototype); - -Object.defineProperties(SurfaceCircle.prototype, { - /** - * This shape's center location. - * @memberof SurfaceCircle.prototype - * @type {Location} - */ - center: { - get: function () { - return this._center; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._center = value; - } - }, - - /** - * This shape's radius, in meters. - * @memberof SurfaceCircle.prototype - * @type {Number} - */ - radius: { - get: function () { - return this._radius; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._radius = value; - } - }, - - /** - * The number of intervals to generate locations for. - * @type {Number} - * @memberof SurfaceCircle.prototype - * @default SurfaceCircle.DEFAULT_NUM_INTERVALS - */ - intervals: { - get: function () { - return this._intervals; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._intervals = value; - } - } -}); - -// Internal use only. Intentionally not documented. -SurfaceCircle.staticStateKey = function (shape) { - var shapeStateKey = SurfaceShape.staticStateKey(shape); - - return shapeStateKey + - " ce " + shape.center.toString() + - " ra " + shape.radius.toString(); -}; - -// Internal use only. Intentionally not documented. -SurfaceCircle.prototype.computeStateKey = function () { - return SurfaceCircle.staticStateKey(this); -}; - -// Internal. Intentionally not documented. -SurfaceCircle.prototype.computeBoundaries = function (dc) { - if (this.radius === 0) { - return null; - } - - var numLocations = 1 + Math.max(SurfaceCircle.MIN_NUM_INTERVALS, this.intervals), - da = 360 / (numLocations - 1), - arcLength = this.radius / dc.globe.radiusAt(this.center.latitude, this.center.longitude); - - this._boundaries = new Array(numLocations); - - for (var i = 0; i < numLocations; i++) { - var azimuth = i !== numLocations - 1 ? i * da : 0; - this._boundaries[i] = Location.greatCircleLocation( - this.center, - azimuth, // In degrees - arcLength, // In radians - new Location(0, 0) - ); - } -}; - -// Internal use only. Intentionally not documented. -SurfaceCircle.prototype.getReferencePosition = function () { - return this.center; -}; - -// Internal use only. Intentionally not documented. -SurfaceCircle.prototype.moveTo = function (globe, position) { - this.center = position; -}; - -/** - * The minimum number of intervals the circle generates. - * @type {Number} - */ -SurfaceCircle.MIN_NUM_INTERVALS = 8; - -/** - * The default number of intervals the circle generates. - * @type {Number} - */ -SurfaceCircle.DEFAULT_NUM_INTERVALS = 64; - -export default SurfaceCircle; - diff --git a/web/src/gis/shapes/SurfaceEllipse.js b/web/src/gis/shapes/SurfaceEllipse.js deleted file mode 100644 index f760fd1f..00000000 --- a/web/src/gis/shapes/SurfaceEllipse.js +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceEllipse - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfaceShape from '../shapes/SurfaceShape'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a surface ellipse with a specified center and radii and an optional attributes bundle. - * @alias SurfaceEllipse - * @constructor - * @augments SurfaceShape - * @classdesc Represents an ellipse draped over the terrain surface. - * <p> - * SurfaceEllipse uses the following attributes from its associated shape attributes bundle: - * <ul> - * <li>Draw interior</li> - * <li>Draw outline</li> - * <li>Interior color</li> - * <li>Outline color</li> - * <li>Outline width</li> - * <li>Outline stipple factor</li> - * <li>Outline stipple pattern</li> - * </ul> - * @param {Location} center The ellipse's center location. - * @param {Number} majorRadius The ellipse's major radius in meters. - * @param {Number} minorRadius The ellipse's minor radius in meters. - * @param {Number} heading The heading of the major axis in degrees. - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - * @throws {ArgumentError} If the specified center location is null or undefined or if either specified radii - * is negative. - */ -function SurfaceEllipse(center, majorRadius, minorRadius, heading, attributes) { - if (!center) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceEllipse", "constructor", "missingLocation")); - } - - if (majorRadius < 0 || minorRadius < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceEllipse", "constructor", "Radius is negative.")); - } - - SurfaceShape.call(this, attributes); - - // All these are documented with their property accessors below. - this._center = center; - this._majorRadius = majorRadius; - this._minorRadius = minorRadius; - this._heading = heading; - this._intervals = SurfaceEllipse.DEFAULT_NUM_INTERVALS; -} - -SurfaceEllipse.prototype = Object.create(SurfaceShape.prototype); - -Object.defineProperties(SurfaceEllipse.prototype, { - /** - * This shape's center location. - * @memberof SurfaceEllipse.prototype - * @type {Location} - */ - center: { - get: function () { - return this._center; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._center = value; - } - }, - - /** - * This shape's major radius, in meters. - * @memberof SurfaceEllipse.prototype - * @type {Number} - */ - majorRadius: { - get: function () { - return this._majorRadius; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._majorRadius = value; - } - }, - - /** - * This shape's minor radius in meters. - * @memberof SurfaceEllipse.prototype - * @type {Number} - */ - minorRadius: { - get: function () { - return this._minorRadius; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._minorRadius = value; - } - }, - - /** - * The heading of the major axis, specified as degrees clockwise from North. - * @type {Number} - * @memberof SurfaceEllipse.prototype - * @default 0 - */ - heading: { - get: function () { - return this._heading; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._heading = value; - } - }, - - /** - * The number of intervals to generate locations for. - * @type {Number} - * @memberof SurfaceEllipse.prototype - * @default SurfaceEllipse.DEFAULT_NUM_INTERVALS - */ - intervals: { - get: function () { - return this._intervals; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._intervals = value; - } - } -}); - -// Internal use only. Intentionally not documented. -SurfaceEllipse.staticStateKey = function (shape) { - var shapeStateKey = SurfaceShape.staticStateKey(shape); - - return shapeStateKey + - " ce " + shape.center.toString() + - " ma " + shape.majorRadius.toString() + - " mi " + shape.minorRadius.toString() + - " he " + shape.heading.toString() + - " in " + shape.intervals.toString(); -}; - -// Internal use only. Intentionally not documented. -SurfaceEllipse.prototype.computeStateKey = function () { - return SurfaceEllipse.staticStateKey(this); -}; - -// Internal. Intentionally not documented. -SurfaceEllipse.prototype.computeBoundaries = function (dc) { - if (this.majorRadius == 0 && this.minorRadius == 0) { - return null; - } - - var globe = dc.globe, - numLocations = 1 + Math.max(SurfaceEllipse.MIN_NUM_INTERVALS, this.intervals), - da = 2 * Math.PI / (numLocations - 1), - globeRadius = globe.radiusAt(this.center.latitude, this.center.longitude); - - this._boundaries = new Array(numLocations); - - for (var i = 0; i < numLocations; i++) { - var angle = i != numLocations - 1 ? i * da : 0, - xLength = this.majorRadius * Math.cos(angle), - yLength = this.minorRadius * Math.sin(angle), - distance = Math.sqrt(xLength * xLength + yLength * yLength); - - // azimuth runs positive clockwise from north and through 360 degrees. - var azimuth = Math.PI / 2.0 - - (Math.acos(xLength / distance) * WWMath.signum(yLength) - this.heading * Angle.DEGREES_TO_RADIANS); - - this._boundaries[i] = Location.greatCircleLocation(this.center, azimuth * Angle.RADIANS_TO_DEGREES, - distance / globeRadius, new Location(0, 0)); - } -}; - -// Internal use only. Intentionally not documented. -SurfaceEllipse.prototype.getReferencePosition = function () { - return this.center; -}; - -// Internal use only. Intentionally not documented. -SurfaceEllipse.prototype.moveTo = function (globe, position) { - this.center = position; -}; - -/** - * The minimum number of intervals the ellipse generates. - * @type {Number} - */ -SurfaceEllipse.MIN_NUM_INTERVALS = 8; - -/** - * The default number of intervals the ellipse generates. - * @type {Number} - */ -SurfaceEllipse.DEFAULT_NUM_INTERVALS = 64; - -export default SurfaceEllipse; - diff --git a/web/src/gis/shapes/SurfaceImage.js b/web/src/gis/shapes/SurfaceImage.js deleted file mode 100644 index 888d9324..00000000 --- a/web/src/gis/shapes/SurfaceImage.js +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceImage - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import PickedObject from '../pick/PickedObject'; -import SurfaceTile from '../render/SurfaceTile'; - - -/** - * Constructs a surface image shape for a specified sector and image path. - * @alias SurfaceImage - * @constructor - * @augments SurfaceTile - * @classdesc Represents an image drawn on the terrain. - * @param {Sector} sector The sector spanned by this surface image. - * @param {String|ImageSource} imageSource The image source of the image to draw on the terrain. - * May be either a string identifying the URL of the image, or an {@link ImageSource} object identifying a - * dynamically created image. - * @throws {ArgumentError} If either the specified sector or image source is null or undefined. - */ -function SurfaceImage(sector, imageSource) { - if (!sector) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceImage", "constructor", - "missingSector")); - } - - if (!imageSource) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceImage", "constructor", - "missingImage")); - } - - SurfaceTile.call(this, sector); - - /** - * Indicates whether this surface image is drawn. - * @type {boolean} - * @default true - */ - this.enabled = true; - - /** - * The path to the image. - * @type {String} - */ - this._imageSource = imageSource; - - /** - * This surface image's resampling mode. Indicates the sampling algorithm used to display this image when it - * is larger on screen than its native resolution. May be one of: - * <ul> - * <li>WorldWind.FILTER_LINEAR</li> - * <li>WorldWind.FILTER_NEAREST</li> - * </ul> - * @default WorldWind.FILTER_LINEAR - */ - this.resamplingMode = WorldWind.FILTER_LINEAR; - - /** - * This surface image's opacity. When this surface image is drawn, the actual opacity is the product of - * this opacity and the opacity of the layer containing this surface image. - * @type {number} - */ - this.opacity = 1; - - /** - * This surface image's display name; - * @type {string} - */ - this.displayName = "Surface Image"; - - // Internal. Indicates whether the image needs to be updated in the GPU resource cache. - this.imageSourceWasUpdated = true; -} - -SurfaceImage.prototype = Object.create(SurfaceTile.prototype); - -Object.defineProperties(SurfaceImage.prototype, { - /** - * The source of the image to display. - * May be either a string identifying the URL of the image, or an {@link ImageSource} object identifying a - * dynamically created image. - * @type {String|ImageSource} - * @default null - * @memberof SurfaceImage.prototype - */ - imageSource: { - get: function () { - return this._imageSource; - }, - set: function (imageSource) { - if (!imageSource) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceImage", "imageSource", - "missingImage")); - } - - this._imageSource = imageSource; - this.imageSourceWasUpdated = true; - } - } -}); - -SurfaceImage.prototype.bind = function (dc) { - var texture = dc.gpuResourceCache.resourceForKey(this._imageSource); - if (texture && !this.imageSourceWasUpdated) { - return this.bindTexture(dc, texture); - } else { - texture = dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, this._imageSource); - this.imageSourceWasUpdated = false; - if (texture) { - return this.bindTexture(dc, texture); - } - } -}; - -SurfaceImage.prototype.bindTexture = function (dc, texture) { - var gl = dc.currentGlContext; - - texture.setTexParameter( - gl.TEXTURE_MAG_FILTER, - this.resamplingMode === WorldWind.FILTER_NEAREST ? gl.NEAREST : gl.LINEAR - ); - - return texture.bind(dc); -}; - -SurfaceImage.prototype.applyInternalTransform = function (dc, matrix) { - // No need to apply the transform. -}; - -/** - * Displays this surface image. Called by the layer containing this surface image. - * @param {DrawContext} dc The current draw context. - */ -SurfaceImage.prototype.render = function (dc) { - if (!this.enabled) { - return; - } - - if (!dc.terrain) { - return; - } - - if (!this.sector.overlaps(dc.terrain.sector)) { - return; - } - - if (dc.pickingMode) { - this.pickColor = dc.uniquePickColor(); - } - - dc.surfaceTileRenderer.renderTiles(dc, [this], this.opacity * dc.currentLayer.opacity); - - if (dc.pickingMode) { - var po = new PickedObject(this.pickColor.clone(), this.pickDelegate ? this.pickDelegate : this, - null, this.layer, false); - dc.resolvePick(po); - } - - dc.currentLayer.inCurrentFrame = true; -}; - -export default SurfaceImage; diff --git a/web/src/gis/shapes/SurfacePolygon.js b/web/src/gis/shapes/SurfacePolygon.js deleted file mode 100644 index 49382ad6..00000000 --- a/web/src/gis/shapes/SurfacePolygon.js +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfacePolygon - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfaceShape from '../shapes/SurfaceShape'; - - -/** - * Constructs a surface polygon. - * @alias SurfacePolygon - * @constructor - * @augments SurfaceShape - * @classdesc Represents a polygon draped over the terrain surface. The polygon may have multiple boundaries in - * order to define holes or empty regions. - * <p> - * SurfacePolygon uses the following attributes from its associated shape attributes bundle: - * <ul> - * <li>Draw interior</li> - * <li>Draw outline</li> - * <li>Interior color</li> - * <li>Outline color</li> - * <li>Outline width</li> - * <li>Outline stipple factor</li> - * <li>Outline stipple pattern</li> - * </ul> - * @param {Array} boundaries The polygons boundary locations. If this argument is an array of - * [Locations]{@link Location} they define this polygon's outer boundary. If it is an array of arrays of - * Locations then each array entry defines one of this polygon's boundaries. - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - * - * @throws {ArgumentError} If the specified boundaries are null or undefined. - */ -function SurfacePolygon(boundaries, attributes) { - if (!Array.isArray(boundaries)) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfacePolygon", "constructor", - "The specified boundary is not an array.")); - } - - SurfaceShape.call(this, attributes); - - this._boundaries = boundaries; - - this._stateId = SurfacePolygon.stateId++; -} - -SurfacePolygon.prototype = Object.create(SurfaceShape.prototype); - -Object.defineProperties(SurfacePolygon.prototype, { - /** - * This polygon's boundaries. The polygons boundary locations. If this argument is an array of - * [Locations]{@link Location} they define this polygon's outer boundary. If it is an array of arrays of - * Locations then each array entry defines one of this polygon's boundaries. - * @type {Location[][] | Location[]} - * @memberof SurfacePolygon.prototype - */ - boundaries: { - get: function () { - return this._boundaries; - }, - set: function (boundaries) { - if (!Array.isArray(boundaries)) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfacePolygon", "set boundaries", - "The specified value is not an array.")); - } - this.resetBoundaries(); - this._boundaries = boundaries; - this._stateId = SurfacePolygon.stateId++; - this.stateKeyInvalid = true; - } - } -}); - -// Internal use only. Intentionally not documented. -SurfacePolygon.stateId = Number.MIN_SAFE_INTEGER; - -// Internal use only. Intentionally not documented. -SurfacePolygon.staticStateKey = function (shape) { - var shapeStateKey = SurfaceShape.staticStateKey(shape); - - return shapeStateKey + - " pg " + shape._stateId; -}; - -// Internal use only. Intentionally not documented. -SurfacePolygon.prototype.computeStateKey = function () { - return SurfacePolygon.staticStateKey(this); -}; - -// Internal. Polygon doesn't generate its own boundaries. See SurfaceShape.prototype.computeBoundaries. -SurfacePolygon.prototype.computeBoundaries = function (dc) { -}; - -// Internal use only. Intentionally not documented. -SurfacePolygon.prototype.getReferencePosition = function () { - // Assign the first position as the reference position. - if (this.boundaries.length > 0 && this.boundaries[0].length > 2) { - return this.boundaries[0][0]; - } else if (this.boundaries.length > 2) { - return this.boundaries[0]; - } else { - return null; - } -}; - -// Internal use only. Intentionally not documented. -SurfacePolygon.prototype.moveTo = function (globe, position) { - if (this.boundaries.length > 0 && this.boundaries[0].length > 2) { - var boundaries = []; - for (var i = 0, len = this._boundaries.length; i < len; i++) { - var locations = this.computeShiftedLocations(globe, this.getReferencePosition(), position, - this._boundaries[i]); - boundaries.push(locations); - } - this.boundaries = boundaries; - } else if (this.boundaries.length > 2) { - this.boundaries = this.computeShiftedLocations(globe, this.getReferencePosition(), position, - this._boundaries); - } -}; - -export default SurfacePolygon; - diff --git a/web/src/gis/shapes/SurfacePolyline.js b/web/src/gis/shapes/SurfacePolyline.js deleted file mode 100644 index 3718bd92..00000000 --- a/web/src/gis/shapes/SurfacePolyline.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfacePolyline - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfaceShape from '../shapes/SurfaceShape'; - - -/** - * Constructs a surface polyline. - * @alias SurfacePolyline - * @constructor - * @augments SurfaceShape - * @classdesc Represents a polyline draped over the terrain surface. - * <p> - * SurfacePolyline uses the following attributes from its associated shape attributes bundle: - * <ul> - * <li>Draw outline</li> - * <li>Outline color</li> - * <li>Outline width</li> - * <li>Outline stipple factor</li> - * <li>Outline stipple pattern</li> - * </ul> - * @param {Location[]} locations This polyline's locations. - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - * @throws {ArgumentError} If the specified locations are null or undefined. - */ -function SurfacePolyline(locations, attributes) { - if (!locations) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfacePolyline", "constructor", - "The specified locations array is null or undefined.")); - } - - SurfaceShape.call(this, attributes); - - /** - * This shape's locations, specified as an array locations. - * @type {Array} - */ - this._boundaries = locations; - - this._stateId = SurfacePolyline.stateId++; - - // Internal use only. - this._isInteriorInhibited = true; -} - -SurfacePolyline.prototype = Object.create(SurfaceShape.prototype); - -Object.defineProperties(SurfacePolyline.prototype, { - /** - * This polyline's boundaries. The polylines locations. - * @type {Location[]} - * @memberof SurfacePolyline.prototype - */ - boundaries: { - get: function () { - return this._boundaries; - }, - set: function (boundaries) { - if (!Array.isArray(boundaries)) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfacePolyline", "set boundaries", - "The specified value is not an array.")); - } - this.resetBoundaries(); - this._boundaries = boundaries; - this._stateId = SurfacePolyline.stateId++; - this.stateKeyInvalid = true; - } - } -}); - -// Internal use only. Intentionally not documented. -SurfacePolyline.stateId = Number.MIN_SAFE_INTEGER; - -// Internal use only. Intentionally not documented. -SurfacePolyline.staticStateKey = function (shape) { - var shapeStateKey = SurfaceShape.staticStateKey(shape); - - return shapeStateKey + - " pl " + shape._stateId; -}; - -// Internal use only. Intentionally not documented. -SurfacePolyline.prototype.computeStateKey = function () { - return SurfacePolyline.staticStateKey(this); -}; - -// Internal. Polyline doesn't generate its own boundaries. See SurfaceShape.prototype.computeBoundaries. -SurfacePolyline.prototype.computeBoundaries = function (dc) { -}; - -// Internal use only. Intentionally not documented. -SurfacePolyline.prototype.getReferencePosition = function () { - return this.boundaries.length > 1 ? this.boundaries[0] : null; -}; - -// Internal use only. Intentionally not documented. -SurfacePolyline.prototype.moveTo = function (globe, position) { - this.boundaries = this.computeShiftedLocations(globe, this.getReferencePosition(), position, - this._boundaries); -}; - -export default SurfacePolyline; - diff --git a/web/src/gis/shapes/SurfaceRectangle.js b/web/src/gis/shapes/SurfaceRectangle.js deleted file mode 100644 index 17c2fd29..00000000 --- a/web/src/gis/shapes/SurfaceRectangle.js +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceRectangle - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfaceShape from '../shapes/SurfaceShape'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a surface rectangle with a specified center and size and an optional attributes bundle. - * @alias SurfaceRectangle - * @constructor - * @augments SurfaceShape - * @classdesc Represents a rectangle draped over the terrain surface. - * <p> - * SurfaceRectangle uses the following attributes from its associated shape attributes bundle: - * <ul> - * <li>Draw interior</li> - * <li>Draw outline</li> - * <li>Interior color</li> - * <li>Outline color</li> - * <li>Outline width</li> - * <li>Outline stipple factor</li> - * <li>Outline stipple pattern</li> - * </ul> - * @param {Location} center The rectangle's center location. - * @param {Number} width The rectangle's width in meters. - * @param {Number} height The rectangle's height in meters. - * @param {Number} heading The rectangle's heading. - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - * @throws {ArgumentError} If the specified center location is null or undefined or if either specified width - * or height is negative. - */ -function SurfaceRectangle(center, width, height, heading, attributes) { - if (!center) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceRectangle", "constructor", "missingLocation")); - } - - if (width < 0 || height < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceRectangle", "constructor", "Size is negative.")); - } - - SurfaceShape.call(this, attributes); - - // All these are documented with their property accessors below. - this._center = center; - this._width = width; - this._height = height; - this._heading = heading; -} - -SurfaceRectangle.prototype = Object.create(SurfaceShape.prototype); - -Object.defineProperties(SurfaceRectangle.prototype, { - /** - * This shape's center location. - * @memberof SurfaceRectangle.prototype - * @type {Location} - */ - center: { - get: function () { - return this._center; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._center = value; - } - }, - - /** - * This shape's width, in meters. - * @memberof SurfaceRectangle.prototype - * @type {Number} - */ - width: { - get: function () { - return this._width; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._width = value; - } - }, - - /** - * This shape's height in meters. - * @memberof SurfaceRectangle.prototype - * @type {Number} - */ - height: { - get: function () { - return this._height; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._height = value; - } - }, - - /** - * The shape's heading, specified as degrees clockwise from North. This shape's height and width are - * relative to its heading. - * @memberof SurfaceRectangle.prototype - * @type {number} - * @default 0 - */ - heading: { - get: function () { - return this._heading; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._heading = value; - } - } -}); - -// Internal use only. Intentionally not documented. -SurfaceRectangle.staticStateKey = function (shape) { - var shapeStateKey = SurfaceShape.staticStateKey(shape); - - return shapeStateKey + - " ce " + shape.center.toString() + - " wi " + shape.width.toString() + - " he " + shape.height.toString() + - " hd " + shape.heading.toString(); -}; - -// Internal use only. Intentionally not documented. -SurfaceRectangle.prototype.computeStateKey = function () { - return SurfaceRectangle.staticStateKey(this); -}; - -// Internal. Intentionally not documented. -SurfaceRectangle.prototype.computeBoundaries = function (dc) { - var halfWidth = 0.5 * this.width, - halfHeight = 0.5 * this.height, - globeRadius = dc.globe.radiusAt(this.center.latitude, this.center.longitude); - - - this._boundaries = new Array(4); - - this.addLocation(0, -halfWidth, -halfHeight, globeRadius); - this.addLocation(1, halfWidth, -halfHeight, globeRadius); - this.addLocation(2, halfWidth, halfHeight, globeRadius); - this.addLocation(3, -halfWidth, halfHeight, globeRadius); -}; - -SurfaceRectangle.prototype.addLocation = function (idx, xLength, yLength, globeRadius) { - var distance = Math.sqrt(xLength * xLength + yLength * yLength); - - // azimuth runs positive clockwise from north and through 360 degrees. - var azimuth = Math.PI / 2.0 - (Math.acos(xLength / distance) * WWMath.signum(yLength) - this.heading * Angle.DEGREES_TO_RADIANS); - - this._boundaries[idx] = Location.greatCircleLocation(this.center, azimuth * Angle.RADIANS_TO_DEGREES, - distance / globeRadius, new Location(0, 0)); - -}; - -// Internal use only. Intentionally not documented. -SurfaceRectangle.prototype.getReferencePosition = function () { - return this.center; -}; - -// Internal use only. Intentionally not documented. -SurfaceRectangle.prototype.moveTo = function (globe, position) { - this.center = this.computeShiftedLocations(globe, this.getReferencePosition(), position, [this.center])[0]; -}; - -export default SurfaceRectangle; - diff --git a/web/src/gis/shapes/SurfaceSector.js b/web/src/gis/shapes/SurfaceSector.js deleted file mode 100644 index 55de63f7..00000000 --- a/web/src/gis/shapes/SurfaceSector.js +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceSector - */ -import ArgumentError from '../error/ArgumentError'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfaceShape from '../shapes/SurfaceShape'; - - -/** - * Constructs a surface sector. - * @alias SurfaceSector - * @constructor - * @augments SurfaceShape - * @classdesc Represents a sector draped over the terrain surface. The sector is specified as a rectangular - * region in geographic coordinates. By default, a surface sector is drawn with a linear path, see - * {@link SurfaceShape#pathType}. - * <p> - * SurfaceSector uses the following attributes from its associated shape attributes bundle: - * <ul> - * <li>Draw interior</li> - * <li>Draw outline</li> - * <li>Interior color</li> - * <li>Outline color</li> - * <li>Outline width</li> - * <li>Outline stipple factor</li> - * <li>Outline stipple pattern</li> - * </ul> - * @param {Sector} sector This surface sector's sector. - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - * @throws {ArgumentError} If the specified boundaries are null or undefined. - */ -function SurfaceSector(sector, attributes) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceSector", "constructor", "missingSector")); - } - - SurfaceShape.call(this, attributes); - - /** - * This shape's sector. - * @type {Sector} - */ - this._sector = sector; - - // The default path type for a surface sector is linear so that it represents a bounding box by default. - this._pathType = WorldWind.LINEAR; -} - -SurfaceSector.prototype = Object.create(SurfaceShape.prototype); - -Object.defineProperties(SurfaceSector.prototype, { - /** - * This shape's sector. - * @memberof SurfaceSector.prototype - * @type {Sector} - */ - sector: { - get: function () { - return this._sector; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._sector = value; - } - } -}); - -// Internal use only. Intentionally not documented. -SurfaceSector.staticStateKey = function (shape) { - var shapeStateKey = SurfaceShape.staticStateKey(shape); - - return shapeStateKey; -}; - -// Internal use only. Intentionally not documented. -SurfaceSector.prototype.computeStateKey = function () { - return SurfaceSector.staticStateKey(this); -}; - -// Internal. Intentionally not documented. -SurfaceSector.prototype.computeBoundaries = function (dc) { - var sector = this._sector; - - this._boundaries = new Array(4); - - this._boundaries[0] = new Location(sector.minLatitude, sector.minLongitude); - this._boundaries[1] = new Location(sector.maxLatitude, sector.minLongitude); - this._boundaries[2] = new Location(sector.maxLatitude, sector.maxLongitude); - this._boundaries[3] = new Location(sector.minLatitude, sector.maxLongitude); -}; - -// Internal use only. Intentionally not documented. -SurfaceSector.prototype.getReferencePosition = function () { - return new Location(this.sector.centroidLatitude(), this.sector.centroidLongitude()); -}; - -// Internal use only. Intentionally not documented. -SurfaceSector.prototype.moveTo = function (globe, position) { - var sector = this._sector; - - var locations = new Array(3); - - locations[0] = new Location(sector.minLatitude, sector.minLongitude); - locations[1] = new Location(sector.maxLatitude, sector.minLongitude); - locations[2] = new Location(sector.maxLatitude, sector.maxLongitude); - - locations = this.computeShiftedLocations(globe, this.getReferencePosition(), position, locations); - - this.sector = new WorldWind.Sector( - locations[0].latitude, - locations[1].latitude, - locations[1].longitude, - locations[2].longitude - ); -}; - -export default SurfaceSector; - diff --git a/web/src/gis/shapes/SurfaceShape.js b/web/src/gis/shapes/SurfaceShape.js deleted file mode 100644 index 66fe22da..00000000 --- a/web/src/gis/shapes/SurfaceShape.js +++ /dev/null @@ -1,1063 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceShape - */ -import AbstractError from '../error/AbstractError'; -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import BoundingBox from '../geom/BoundingBox'; -import Color from '../util/Color'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import MemoryCache from '../cache/MemoryCache'; -import NotYetImplementedError from '../error/NotYetImplementedError'; -import PickedObject from '../pick/PickedObject'; -import PolygonSplitter from '../util/PolygonSplitter'; -import Renderable from '../render/Renderable'; -import Sector from '../geom/Sector'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a surface shape with an optionally specified bundle of default attributes. - * @alias SurfaceShape - * @constructor - * @augments Renderable - * @abstract - * @classdesc Represents a surface shape. This is an abstract base class and is meant to be instantiated - * only by subclasses. - * <p> - * Surface shapes other than SurfacePolyline {@link SurfacePolyline} have an interior and an outline and utilize - * the corresponding attributes in their associated ShapeAttributes {@link ShapeAttributes}. They do not - * utilize image-related attributes. - * - * @param {ShapeAttributes} attributes The attributes to apply to this shape. May be null, in which case - * attributes must be set directly before the shape is drawn. - */ -function SurfaceShape(attributes) { - - Renderable.call(this); - - // All these are documented with their property accessors below. - this._displayName = "Surface Shape"; - this._attributes = attributes ? attributes : new ShapeAttributes(null); - this._highlightAttributes = null; - this._highlighted = false; - this._enabled = true; - this._pathType = WorldWind.GREAT_CIRCLE; - this._maximumNumEdgeIntervals = SurfaceShape.DEFAULT_NUM_EDGE_INTERVALS; - this._polarThrottle = SurfaceShape.DEFAULT_POLAR_THROTTLE; - this._boundingSector = null; - - /** - * Indicates the object to return as the owner of this shape when picked. - * @type {Object} - * @default null - */ - this.pickDelegate = null; - - /* - * The bounding sectors for this tile, which may be needed for crossing the dateline. - * @type {Sector[]} - * @protected - */ - this._boundingSectors = []; - - /* - * The raw collection of locations defining this shape and are explicitly specified by the client of this class. - * @type {Location[]} - * @protected - */ - this._locations = null; - - /* - * Boundaries that are either the user specified locations or locations that are algorithmically generated. - * @type {Location[]} - * @protected - */ - this._boundaries = null; - - /* - * The collection of locations that describes a closed curve which can be filled. - * @type {Location[][]} - * @protected - */ - this._interiorGeometry = null; - - /* - * The collection of locations that describe the outline of the shape. - * @type {Location[][]} - * @protected - */ - this._outlineGeometry = null; - - /* - * Internal use only. - * Inhibit the filling of the interior. This is to be used ONLY by polylines. - * @type {Boolean} - * @protected - */ - this._isInteriorInhibited = false; - - /* - * Indicates whether this object's state key is invalid. Subclasses must set this value to true when their - * attributes change. The state key will be automatically computed the next time it's requested. This flag - * will be set to false when that occurs. - * @type {Boolean} - * @protected - */ - this.stateKeyInvalid = true; - - // Internal use only. Intentionally not documented. - this._attributesStateKey = null; - - // Internal use only. Intentionally not documented. - this.boundariesArePrepared = false; - - // Internal use only. Intentionally not documented. - this.layer = null; - - // Internal use only. Intentionally not documented. - this.pickColor = null; - - //the split contours returned from polygon splitter - this.contours = []; - this.containsPole = false; - this.crossesAntiMeridian = false; - - /** - * Indicates how long to use terrain-specific shape data before regenerating it, in milliseconds. A value - * of zero specifies that shape data should be regenerated every frame. While this causes the shape to - * adapt more frequently to the terrain, it decreases performance. - * @type {Number} - * @default 2000 (milliseconds) - */ - this.expirationInterval = 2000; - - // Internal use only. Intentionally not documented. - // Holds the per-globe data - this.shapeDataCache = new MemoryCache(3, 2); - - // Internal use only. Intentionally not documented. - // The shape-data-cache data that is for the currently active globe. - this.currentData = null; -} - -SurfaceShape.prototype = Object.create(Renderable.prototype); - -Object.defineProperties(SurfaceShape.prototype, { - stateKey: { - /** - * A hash key of the total visible external state of the surface shape. - * @memberof SurfaceShape.prototype - * @type {String} - */ - get: function () { - // If we don't have a state key for the shape attributes, consider this state key to be invalid. - if (!this._attributesStateKey) { - // Update the state key for the appropriate attributes for future - if (this._highlighted) { - if (this._highlightAttributes) { - this._attributesStateKey = this._highlightAttributes.stateKey; - } - } else { - if (this._attributes) { - this._attributesStateKey = this._attributes.stateKey; - } - } - - // If we now actually have a state key for the attributes, it was previously invalid. - if (this._attributesStateKey) { - this.stateKeyInvalid = true; - } - } else { - // Detect a change in the appropriate attributes. - var currentAttributesStateKey = null; - - if (this._highlighted) { - // If there are highlight attributes associated with this shape, ... - if (this._highlightAttributes) { - currentAttributesStateKey = this._highlightAttributes.stateKey; - } - } else { - if (this._attributes) { - currentAttributesStateKey = this._attributes.stateKey; - } - } - - // If the attributes state key changed, ... - if (currentAttributesStateKey != this._attributesStateKey) { - this._attributesStateKey = currentAttributesStateKey; - this.stateKeyInvalid = true; - } - } - - if (this.stateKeyInvalid) { - this._stateKey = this.computeStateKey(); - } - - return this._stateKey; - } - }, - - /** - * The shape's display name and label text. - * @memberof SurfaceShape.prototype - * @type {String} - * @default Surface Shape - */ - displayName: { - get: function () { - return this._displayName; - }, - set: function (value) { - this.stateKeyInvalid = true; - this._displayName = value; - } - }, - - /** - * The shape's attributes. If null and this shape is not highlighted, this shape is not drawn. - * @memberof SurfaceShape.prototype - * @type {ShapeAttributes} - * @default see [ShapeAttributes]{@link ShapeAttributes} - */ - attributes: { - get: function () { - return this._attributes; - }, - set: function (value) { - this.stateKeyInvalid = true; - this._attributes = value; - this._attributesStateKey = value.stateKey; - } - }, - - /** - * The attributes used when this shape's highlighted flag is true. If null and the - * highlighted flag is true, this shape's normal attributes are used. If they, too, are null, this - * shape is not drawn. - * @memberof SurfaceShape.prototype - * @type {ShapeAttributes} - * @default null - */ - highlightAttributes: { - get: function () { - return this._highlightAttributes; - }, - set: function (value) { - this.stateKeyInvalid = true; - this._highlightAttributes = value; - } - }, - - /** - * Indicates whether this shape displays with its highlight attributes rather than its normal attributes. - * @memberof SurfaceShape.prototype - * @type {Boolean} - * @default false - */ - highlighted: { - get: function () { - return this._highlighted; - }, - set: function (value) { - this.stateKeyInvalid = true; - this._highlighted = value; - } - }, - - /** - * Indicates whether this shape is drawn. - * @memberof SurfaceShape.prototype - * @type {Boolean} - * @default true - */ - enabled: { - get: function () { - return this._enabled; - }, - set: function (value) { - this.stateKeyInvalid = true; - this._enabled = value; - } - }, - - /** - * The path type to used to interpolate between locations on this shape. Recognized values are: - * <ul> - * <li>WorldWind.GREAT_CIRCLE</li> - * <li>WorldWind.RHUMB_LINE</li> - * <li>WorldWind.LINEAR</li> - * </ul> - * @memberof SurfaceShape.prototype - * @type {String} - * @default WorldWind.GREAT_CIRCLE - */ - pathType: { - get: function () { - return this._pathType; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._pathType = value; - } - }, - - /** - * The maximum number of intervals an edge will be broken into. This is the number of intervals that an - * edge that spans to opposite side of the globe would be broken into. This is strictly an upper bound - * and the number of edge intervals may be lower if this resolution is not needed. - * @memberof SurfaceShape.prototype - * @type {Number} - * @default SurfaceShape.DEFAULT_NUM_EDGE_INTERVALS - */ - maximumNumEdgeIntervals: { - get: function () { - return this._maximumNumEdgeIntervals; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._maximumNumEdgeIntervals = value; - } - }, - - /** - * A dimensionless number that controls throttling of edge traversal near the poles where edges need to be - * sampled more closely together. - * A value of 0 indicates that no polar throttling is to be performed. - * @memberof SurfaceShape.prototype - * @type {Number} - * @default SurfaceShape.DEFAULT_POLAR_THROTTLE - */ - polarThrottle: { - get: function () { - return this._polarThrottle; - }, - set: function (value) { - this.stateKeyInvalid = true; - this.resetBoundaries(); - this._polarThrottle = value; - } - }, - - /** - * Defines the extent of the shape in latitude and longitude. - * This sector only has valid data once the boundary is defined. Prior to this, it is null. - * @memberof SurfaceShape.prototype - * @type {Sector} - */ - boundingSector: { - get: function () { - return this._boundingSector; - } - } -}); - -SurfaceShape.staticStateKey = function (shape) { - shape.stateKeyInvalid = false; - - if (shape.highlighted) { - if (!shape._highlightAttributes) { - if (!shape._attributes) { - shape._attributesStateKey = null; - } else { - shape._attributesStateKey = shape._attributes.stateKey; - } - } else { - shape._attributesStateKey = shape._highlightAttributes.stateKey; - } - } else { - if (!shape._attributes) { - shape._attributesStateKey = null; - } else { - shape._attributesStateKey = shape._attributes.stateKey; - } - } - - return "dn " + shape.displayName + - " at " + (!shape._attributesStateKey ? "null" : shape._attributesStateKey) + - " hi " + shape.highlighted + - " en " + shape.enabled + - " pt " + shape.pathType + - " ne " + shape.maximumNumEdgeIntervals + - " po " + shape.polarThrottle + - " se " + "[" + - shape.boundingSector.minLatitude + "," + - shape.boundingSector.maxLatitude + "," + - shape.boundingSector.minLongitude + "," + - shape.boundingSector.maxLongitude + - "]"; -}; - -SurfaceShape.prototype.computeStateKey = function () { - return SurfaceShape.staticStateKey(this); -}; - -/** - * Returns this shape's area in square meters. - * @param {Globe} globe The globe on which to compute the area. - * @param {Boolean} terrainConformant If true, the returned area is that of the terrain, - * including its hillsides and other undulations. If false, the returned area is the shape's - * projected area. - */ -SurfaceShape.prototype.area = function (globe, terrainConformant) { - throw new NotYetImplementedError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceShape", "area", "notYetImplemented")); -}; - -// Internal function. Intentionally not documented. -SurfaceShape.prototype.computeBoundaries = function (globe) { - // This method is in the base class and should be overridden if the boundaries are generated. - // TODO: Incorrect error class - throw new AbstractError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceShape", "computeBoundaries", "abstractInvocation")); -}; - -// Internal. Intentionally not documented. -SurfaceShape.prototype.intersectsFrustum = function (dc) { - if (this.currentData && this.currentData.extent) { - if (dc.pickingMode) { - return this.currentData.extent.intersectsFrustum(dc.pickFrustum); - } else { - return this.currentData.extent.intersectsFrustum(dc.frustumInModelCoordinates); - } - } else { - return true; - } -}; - -/** - * Indicates whether a specified shape data object is current. Subclasses may override this method to add - * criteria indicating whether the shape data object is current, but must also call this method on this base - * class. Applications do not call this method. - * @param {DrawContext} dc The current draw context. - * @param {Object} shapeData The object to validate. - * @returns {Boolean} true if the object is current, otherwise false. - * @protected - */ -SurfaceShape.prototype.isShapeDataCurrent = function (dc, shapeData) { - return shapeData.verticalExaggeration === dc.verticalExaggeration - && shapeData.expiryTime > Date.now(); -}; - -/** - * Creates a new shape data object for the current globe state. Subclasses may override this method to - * modify the shape data object that this method creates, but must also call this method on this base class. - * Applications do not call this method. - * @returns {Object} The shape data object. - * @protected - */ -SurfaceShape.prototype.createShapeDataObject = function () { - return {}; -}; - -// Intentionally not documented. -SurfaceShape.prototype.resetExpiration = function (shapeData) { - // The random addition in the line below prevents all shapes from regenerating during the same frame. - shapeData.expiryTime = Date.now() + this.expirationInterval + 1e3 * Math.random(); -}; - -// Internal. Intentionally not documented. -SurfaceShape.prototype.establishCurrentData = function (dc) { - this.currentData = this.shapeDataCache.entryForKey(dc.globeStateKey); - if (!this.currentData) { - this.currentData = this.createShapeDataObject(); - this.resetExpiration(this.currentData); - this.shapeDataCache.putEntry(dc.globeStateKey, this.currentData, 1); - } - - this.currentData.isExpired = !this.isShapeDataCurrent(dc, this.currentData); -}; - -// Internal function. Intentionally not documented. -SurfaceShape.prototype.render = function (dc) { - if (!this.enabled) { - return; - } - - this.layer = dc.currentLayer; - - this.prepareBoundaries(dc); - - this.establishCurrentData(dc); - - if (this.currentData.isExpired || !this.currentData.extent) { - this.computeExtent(dc); - this.currentData.verticalExaggeration = dc.verticalExaggeration; - this.resetExpiration(this.currentData); - } - - // Use the last computed extent to see if this shape is out of view. - if (this.currentData && this.currentData.extent && !this.intersectsFrustum(dc)) { - return; - } - - dc.surfaceShapeTileBuilder.insertSurfaceShape(this); -}; - -// Internal function. Intentionally not documented. -SurfaceShape.prototype.interpolateLocations = function (locations) { - var first = locations[0], - next = first, - prev, - isNextFirst = true, - isPrevFirst = true,// Don't care initially, this will get set in first iteration. - countFirst = 0, - isInterpolated = true, - idx, len; - - this._locations = [first]; - - for (idx = 1, len = locations.length; idx < len; idx += 1) { - // Advance to next location, retaining previous location. - prev = next; - isPrevFirst = isNextFirst; - - next = locations[idx]; - - // Detect whether the next location and the first location are the same. - isNextFirst = next.latitude == first.latitude && next.longitude == first.longitude; - - // Inhibit interpolation if either endpoint if the first location, - // except for the first segement which will be the actual first location or that location - // as the polygon closes the first time. - // All subsequent encounters of the first location are used to connected secondary domains with the - // primary domain in multiply-connected geometry (an outer ring with multiple inner rings). - isInterpolated = true; - if (isNextFirst || isPrevFirst) { - countFirst += 1; - - if (countFirst > 2) { - isInterpolated = false; - } - } - - if (isInterpolated) { - this.interpolateEdge(prev, next, this._locations); - } - - this._locations.push(next); - - prev = next; - } - - // Force the closing of the border. - if (!this._isInteriorInhibited) { - // Avoid duplication if the first endpoint was already emitted. - if (prev.latitude != first.latitude || prev.longitude != first.longitude) { - this.interpolateEdge(prev, first, this._locations); - this._locations.push(first); - } - } -}; - -// Internal function. Intentionally not documented. -SurfaceShape.prototype.interpolateEdge = function (start, end, locations) { - var distanceRadians = Location.greatCircleDistance(start, end), - steps = Math.round(this._maximumNumEdgeIntervals * distanceRadians / Math.PI), - dt, - location; - - if (steps > 0) { - dt = 1 / steps; - location = start; - - for (var t = this.throttledStep(dt, location); t < 1; t += this.throttledStep(dt, location)) { - location = new Location(0, 0); - Location.interpolateAlongPath(this._pathType, t, start, end, location); - - //florin: ensure correct longitude sign and decimal error for anti-meridian - if (start.longitude === 180 && end.longitude === 180) { - location.longitude = 180; - } - else if (start.longitude === -180 && end.longitude === -180) { - location.longitude = -180; - } - - locations.push(location); - } - } -}; - -// Internal function. Intentionally not documented. -// Return a throttled step size when near the poles. -SurfaceShape.prototype.throttledStep = function (dt, location) { - var cosLat = Math.cos(location.latitude * Angle.DEGREES_TO_RADIANS); - cosLat *= cosLat; // Square cos to emphasize poles and de-emphasize equator. - - // Remap polarThrottle: - // 0 .. INF => 0 .. 1 - // This acts as a weight between no throttle and fill throttle. - var weight = this._polarThrottle / (1 + this._polarThrottle); - - return dt * (1 - weight + weight * cosLat); -}; - -// Internal function. Intentionally not documented. -SurfaceShape.prototype.prepareBoundaries = function (dc) { - if (this.boundariesArePrepared) { - return; - } - - this.computeBoundaries(dc); - - var newBoundaries = this.formatBoundaries(); - this.normalizeAngles(newBoundaries); - newBoundaries = this.interpolateBoundaries(newBoundaries); - - var contoursInfo = []; - var doesCross = PolygonSplitter.splitContours(newBoundaries, contoursInfo); - this.contours = contoursInfo; - this.crossesAntiMeridian = doesCross; - - this.prepareGeometry(dc, contoursInfo); - - this.prepareSectors(); - - this.boundariesArePrepared = true; -}; - -//Internal. Formats the boundaries of a surface shape to be a multi dimensional array -SurfaceShape.prototype.formatBoundaries = function () { - var boundaries = []; - if (!this._boundaries.length) { - return boundaries; - } - if (this._boundaries[0].latitude != null) { - //not multi dim array - boundaries.push(this._boundaries); - } - else { - boundaries = this._boundaries; - } - return boundaries; -}; - -// Internal. Resets boundaries for SurfaceShape recomputing. -SurfaceShape.prototype.resetBoundaries = function () { - this.boundariesArePrepared = false; - this.shapeDataCache.clear(false); -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.normalizeAngles = function (boundaries) { - for (var i = 0, len = boundaries.length; i < len; i++) { - var polygon = boundaries[i]; - for (var j = 0, lenP = polygon.length; j < lenP; j++) { - var point = polygon[j]; - if (point.longitude < -180 || point.longitude > 180) { - point.longitude = Angle.normalizedDegreesLongitude(point.longitude); - } - if (point.latitude < -90 || point.latitude > 90) { - point.latitude = Angle.normalizedDegreesLatitude(point.latitude); - } - } - } -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.interpolateBoundaries = function (boundaries) { - var newBoundaries = []; - for (var i = 0, len = boundaries.length; i < len; i++) { - var contour = boundaries[i]; - this.interpolateLocations(contour); - newBoundaries.push(this._locations.slice()); - this._locations.length = 0; - } - return newBoundaries; -}; - -/** - * Computes the bounding sectors for the shape. There will be more than one if the shape crosses the date line, - * but does not enclose a pole. - * - * @param {DrawContext} dc The drawing context containing a globe. - * - * @return {Sector[]} Bounding sectors for the shape. - */ -SurfaceShape.prototype.computeSectors = function (dc) { - // Return a previously computed value if it already exists. - if (this._boundingSectors && this._boundingSectors.length > 0) { - return this._boundingSectors; - } - - this.prepareBoundaries(dc); - - return this._boundingSectors; -}; - -/** - * Computes the extent for the shape based on its sectors. - * - * @param {DrawContext} dc The drawing context containing a globe. - * - * @return {BoundingBox} The extent for the shape. - */ -SurfaceShape.prototype.computeExtent = function (dc) { - - if (!this._boundingSectors || this._boundingSectors.length === 0) { - return null; - } - - if (!this.currentData) { - return null; - } - - if (!this.currentData.extent) { - this.currentData.extent = new BoundingBox(); - } - - - var boxPoints; - // This surface shape does not cross the international dateline, and therefore has a single bounding sector. - // Return the box which contains that sector. - if (this._boundingSectors.length === 1) { - boxPoints = this._boundingSectors[0].computeBoundingPoints(dc.globe, dc.verticalExaggeration); - this.currentData.extent.setToVec3Points(boxPoints); - } - // This surface crosses the international dateline, and its bounding sectors are split along the dateline. - // Return a box which contains the corners of the boxes bounding each sector. - else { - var boxCorners = []; - - for (var i = 0; i < this._boundingSectors.length; i++) { - boxPoints = this._boundingSectors[i].computeBoundingPoints(dc.globe, dc.verticalExaggeration); - var box = new BoundingBox(); - box.setToVec3Points(boxPoints); - var corners = box.getCorners(); - for (var j = 0; j < corners.length; j++) { - boxCorners.push(corners[j]); - } - } - this.currentData.extent.setToVec3Points(boxCorners); - } - - return this.currentData.extent; - -}; - -/** - * Computes a new set of locations translated from a specified location to a new location for a shape. - * - * @param {Globe} globe The globe on which to compute a new set of locations. - * @param {Location} oldLocation The original reference location. - * @param {Location} newLocation The new reference location. - * @param {Location[]} locations The locations to translate. - * - * @return {Location[]} The translated locations. - */ -SurfaceShape.prototype.computeShiftedLocations = function (globe, oldLocation, newLocation, locations) { - var newLocations = []; - var result = new Vec3(0, 0, 0); - var newPos = new WorldWind.Position(0, 0, 0); - - var oldPoint = globe.computePointFromLocation(oldLocation.latitude, oldLocation.longitude, - new Vec3(0, 0, 0)); - var newPoint = globe.computePointFromLocation(newLocation.latitude, newLocation.longitude, - new Vec3(0, 0, 0)); - var delta = newPoint.subtract(oldPoint); - - for (var i = 0, len = locations.length; i < len; i++) { - globe.computePointFromLocation(locations[i].latitude, locations[i].longitude, result); - result.add(delta); - globe.computePositionFromPoint(result[0], result[1], result[2], newPos); - newLocations.push(new Location(newPos.latitude, newPos.longitude)); - } - - return newLocations; -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.prepareSectors = function () { - this.determineSectors(); - if (this.crossesAntiMeridian) { - this.sectorsOverAntiMeridian(); - } - else { - this.sectorsNotOverAntiMeridian(); - } -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.determineSectors = function () { - for (var i = 0, len = this.contours.length; i < len; i++) { - var contour = this.contours[i]; - var polygons = contour.polygons; - contour.sectors = []; - for (var j = 0, lenP = polygons.length; j < lenP; j++) { - var polygon = polygons[j]; - var sector = new Sector(0, 0, 0, 0); - sector.setToBoundingSector(polygon); - if (this._pathType === WorldWind.GREAT_CIRCLE) { - var extremes = Location.greatCircleArcExtremeLocations(polygon); - var minLatitude = Math.min(sector.minLatitude, extremes[0].latitude); - var maxLatitude = Math.max(sector.maxLatitude, extremes[1].latitude); - sector.minLatitude = minLatitude; - sector.maxLatitude = maxLatitude; - } - contour.sectors.push(sector); - } - } -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.sectorsOverAntiMeridian = function () { - var eastSector = new Sector(90, -90, 180, -180); //positive - var westSector = new Sector(90, -90, 180, -180); //negative - for (var i = 0, len = this.contours.length; i < len; i++) { - var sectors = this.contours[i].sectors; - for (var j = 0, lenS = sectors.length; j < lenS; j++) { - var sector = sectors[j]; - if (sector.minLongitude < 0 && sector.maxLongitude > 0) { - westSector.union(sector); - eastSector.union(sector); - } - else if (sector.minLongitude < 0) { - westSector.union(sector); - } - else { - eastSector.union(sector); - } - } - } - var minLatitude = Math.min(eastSector.minLatitude, westSector.minLatitude); - var maxLatitude = Math.max(eastSector.maxLatitude, eastSector.maxLatitude); - this._boundingSector = new Sector(minLatitude, maxLatitude, -180, 180); - this._boundingSectors = [eastSector, westSector]; -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.sectorsNotOverAntiMeridian = function () { - this._boundingSector = new Sector(90, -90, 180, -180); - for (var i = 0, len = this.contours.length; i < len; i++) { - var sectors = this.contours[i].sectors; - for (var j = 0, lenS = sectors.length; j < lenS; j++) { - this._boundingSector.union(sectors[j]); - } - } - this._boundingSectors = [this._boundingSector]; -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.prepareGeometry = function (dc, contours) { - var interiorPolygons = []; - var outlinePolygons = []; - - for (var i = 0, len = contours.length; i < len; i++) { - var contour = contours[i]; - var poleIndex = contour.poleIndex; - - for (var j = 0, lenC = contour.polygons.length; j < lenC; j++) { - var polygon = contour.polygons[j]; - var iMap = contour.iMap[j]; - interiorPolygons.push(polygon); - - if (contour.pole !== Location.poles.NONE && lenC > 1) { - //split with pole - if (j === poleIndex) { - this.outlineForPole(polygon, iMap, outlinePolygons); - } - else { - this.outlineForSplit(polygon, iMap, outlinePolygons); - } - } - else if (contour.pole !== Location.poles.NONE && lenC === 1) { - //only pole - this.outlineForPole(polygon, iMap, outlinePolygons); - } - else if (contour.pole === Location.poles.NONE && lenC > 1) { - //only split - this.outlineForSplit(polygon, iMap, outlinePolygons); - } - else if (contour.pole === Location.poles.NONE && lenC === 1) { - //no pole, no split - outlinePolygons.push(polygon); - } - } - } - - this._interiorGeometry = interiorPolygons; - this._outlineGeometry = outlinePolygons; -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.outlineForPole = function (polygon, iMap, outlinePolygons) { - this.containsPole = true; - var outlinePolygon = []; - var pCount = 0; - for (var k = 0, lenP = polygon.length; k < lenP; k++) { - var point = polygon[k]; - var intersection = iMap.get(k); - if (intersection && intersection.forPole) { - pCount++; - if (pCount % 2 === 1) { - outlinePolygon.push(point); - outlinePolygons.push(outlinePolygon); - outlinePolygon = []; - } - } - if (pCount % 2 === 0) { - outlinePolygon.push(point); - } - } - if (outlinePolygon.length) { - outlinePolygons.push(outlinePolygon); - } -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.outlineForSplit = function (polygon, iMap, outlinePolygons) { - var outlinePolygon = []; - var iCount = 0; - for (var k = 0, lenP = polygon.length; k < lenP; k++) { - var point = polygon[k]; - var intersection = iMap.get(k); - if (intersection && !intersection.forPole) { - iCount++; - if (iCount % 2 === 0) { - outlinePolygon.push(point); - outlinePolygons.push(outlinePolygon); - outlinePolygon = []; - } - } - if (iCount % 2 === 1) { - outlinePolygon.push(point); - } - } -}; - -// Internal use only. Intentionally not documented. -SurfaceShape.prototype.resetPickColor = function () { - this.pickColor = null; -}; - -/** - * Internal use only. - * Render the shape onto the texture map of the tile. - * @param {DrawContext} dc The draw context to render onto. - * @param {CanvasRenderingContext2D} ctx2D The rendering context for SVG. - * @param {Number} xScale The multiplicative scale factor in the horizontal direction. - * @param {Number} yScale The multiplicative scale factor in the vertical direction. - * @param {Number} dx The additive offset in the horizontal direction. - * @param {Number} dy The additive offset in the vertical direction. - */ -SurfaceShape.prototype.renderToTexture = function (dc, ctx2D, xScale, yScale, dx, dy) { - var attributes = this._highlighted ? this._highlightAttributes || this._attributes : this._attributes; - if (!attributes) { - return; - } - - var drawInterior = !this._isInteriorInhibited && attributes.drawInterior; - var drawOutline = attributes.drawOutline && attributes.outlineWidth > 0; - if (!drawInterior && !drawOutline) { - return; - } - - if (dc.pickingMode) { - if (!this.pickColor) { - this.pickColor = dc.uniquePickColor(); - } - ctx2D.fillStyle = this.pickColor.toCssColorString(); - ctx2D.strokeStyle = ctx2D.fillStyle; - ctx2D.lineWidth = attributes.outlineWidth; - } else { - var ic = attributes.interiorColor, - oc = attributes.outlineColor; - ctx2D.fillStyle = new Color(ic.red, ic.green, ic.blue, ic.alpha * this.layer.opacity).toCssColorString(); - ctx2D.strokeStyle = new Color(oc.red, oc.green, oc.blue, oc.alpha * this.layer.opacity).toCssColorString(); - ctx2D.lineWidth = attributes.outlineWidth; - } - - if (this.crossesAntiMeridian || this.containsPole) { - if (drawInterior) { - this.draw(this._interiorGeometry, ctx2D, xScale, yScale, dx, dy); - ctx2D.fill(); - } - if (drawOutline) { - this.draw(this._outlineGeometry, ctx2D, xScale, yScale, dx, dy); - ctx2D.stroke(); - } - } - else { - this.draw(this._interiorGeometry, ctx2D, xScale, yScale, dx, dy); - if (drawInterior) { - ctx2D.fill(); - } - if (drawOutline) { - ctx2D.stroke(); - } - } - - if (dc.pickingMode) { - var po = new PickedObject(this.pickColor.clone(), this.pickDelegate ? this.pickDelegate : this, - null, this.layer, false); - dc.resolvePick(po); - } -}; - -SurfaceShape.prototype.draw = function (contours, ctx2D, xScale, yScale, dx, dy) { - ctx2D.beginPath(); - for (var i = 0, len = contours.length; i < len; i++) { - var contour = contours[i]; - var point = contour[0]; - var x = point.longitude * xScale + dx; - var y = point.latitude * yScale + dy; - ctx2D.moveTo(x, y); - for (var j = 1, lenC = contour.length; j < lenC; j++) { - point = contour[j]; - x = point.longitude * xScale + dx; - y = point.latitude * yScale + dy; - ctx2D.lineTo(x, y); - } - } -}; - -/** - * Default value for the maximum number of edge intervals. This results in a maximum error of 480 m for an arc - * that spans the entire globe. - * - * Other values for this parameter have the associated errors below: - * Intervals Maximum error (meters) - * 2 1280253.5 - * 4 448124.5 - * 8 120837.6 - * 16 30628.3 - * 32 7677.9 - * 64 1920.6 - * 128 480.2 - * 256 120.0 - * 512 30.0 - * 1024 7.5 - * 2048 1.8 - * The errors cited above are upper bounds and the actual error may be lower. - * @type {Number} - */ -SurfaceShape.DEFAULT_NUM_EDGE_INTERVALS = 128; - -/** - * The defualt value for the polar throttle, which slows edge traversal near the poles. - * @type {Number} - */ -SurfaceShape.DEFAULT_POLAR_THROTTLE = 10; - -export default SurfaceShape; diff --git a/web/src/gis/shapes/SurfaceShapeTile.js b/web/src/gis/shapes/SurfaceShapeTile.js deleted file mode 100644 index 99f0b66d..00000000 --- a/web/src/gis/shapes/SurfaceShapeTile.js +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceShapeTile - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Level from '../util/Level'; -import Logger from '../util/Logger'; -import Sector from '../geom/Sector'; -import Texture from '../render/Texture'; -import TextureTile from '../render/TextureTile'; - - -/** - * Constructs a surface shape tile. - * @alias SurfaceShapeTile - * @constructor - * @classdesc Represents a texture map containing renditions of surface shapes applied to a portion of a globe's terrain. - * @param {Sector} sector The sector this tile covers. - * @param {Level} level The level this tile is associated with. - * @param {number} row This tile's row in the associated level. - * @param {number} column This tile's column in the associated level. - * @throws {ArgumentError} If the specified sector or level is null or undefined, the row or column arguments - * are less than zero, or the specified image path is null, undefined or empty. - * - */ -function SurfaceShapeTile(sector, level, row, column) { - TextureTile.call(this, sector, level, row, column); // args are checked in the superclass' constructor - - /** - * The surface shapes that affect this tile. - * @type {SurfaceShape[]} - */ - this.surfaceShapes = []; - - // Internal use only. Intentionally not documented. - this.surfaceShapeStateKeys = []; - - // Internal use only. Intentionally not documented. - this.asRenderedSurfaceShapeStateKeys = []; - - /** - * The sector that bounds this tile. - * @type {Sector} - */ - this.sector = sector; - - /** - * A string to use as a cache key. - * @type {string} - */ - this.cacheKey = null; - - // Internal use only. Intentionally not documented. - this.pickSequence = 0; - - this.createCtx2D(); -} - -SurfaceShapeTile.prototype = Object.create(TextureTile.prototype); - -/** - * Clear all collected surface shapes. - */ -SurfaceShapeTile.prototype.clearShapes = function () { - // Clear out next surface shape. - this.surfaceShapes = []; - this.surfaceShapeStateKeys = []; -}; - -/** - * Query whether any surface shapes have been collected. - * @returns {boolean} Returns true if there are collected surface shapes. - */ -SurfaceShapeTile.prototype.hasShapes = function () { - return this.surfaceShapes.length > 0; -}; - -/** - * Get all shapes that this tile references. - * @returns {SurfaceShape[]} The collection of surface shapes referenced by this tile. - */ -SurfaceShapeTile.prototype.getShapes = function () { - return this.surfaceShapes; -}; - -/** - * Set the shapes this tile should reference. - * @param {SurfaceShape[]} surfaceShapes The collection of surface shapes to be referenced by this tile. - */ -SurfaceShapeTile.prototype.setShapes = function (surfaceShapes) { - this.surfaceShapes = surfaceShapes; -}; - -/** - * The sector that bounds this tile. - * @returns {Sector} - */ -SurfaceShapeTile.prototype.getSector = function () { - return this.sector; -}; - -/** - * Add a surface shape to this tile's collection of surface shapes. - * @param {SurfaceShape} surfaceShape The surface shape to add. - */ -SurfaceShapeTile.prototype.addSurfaceShape = function (surfaceShape) { - this.surfaceShapes.push(surfaceShape); - this.surfaceShapeStateKeys.push(surfaceShape.stateKey + " lo " + surfaceShape.layer.opacity); // combine the shape state key with layer opacity -}; - -// Internal use only. Intentionally not documented. -SurfaceShapeTile.prototype.needsUpdate = function (dc) { - var idx, len, surfaceShape, surfaceShapeStateKey; - - // If the number of surface shapes does not match the number of surface shapes already in the texture - if (this.surfaceShapes.length != this.asRenderedSurfaceShapeStateKeys.length) { - return true; - } - - // If the state key of the shape is different from the saved state key (in order or configuration) - for (idx = 0, len = this.surfaceShapes.length; idx < len; idx += 1) { - if (this.surfaceShapeStateKeys[idx] !== this.asRenderedSurfaceShapeStateKeys[idx]) { - return true; - } - } - - // If a texture does not already exist, ... - if (!this.hasTexture(dc)) { - return true; - } - - // If you get here, the texture can be reused. - return false; -}; - -/** - * Determine whether the surface shape tile has a valid texture. - * @param {DrawContext} dc The draw context. - * @returns {boolean} True if the surface shape tile has a valid texture, else false. - */ -SurfaceShapeTile.prototype.hasTexture = function (dc) { - if (dc.pickingMode) { - return false; - } - - if (!this.gpuCacheKey) { - this.gpuCacheKey = this.getCacheKey(); - } - - return dc.gpuResourceCache.containsResource(this.gpuCacheKey); -}; - -/** - * Redraw all of the surface shapes onto the texture for this tile. - * @param {DrawContext} dc - * @returns {Texture} - */ -SurfaceShapeTile.prototype.updateTexture = function (dc) { - var gl = dc.currentGlContext, - canvas = SurfaceShapeTile.canvas, - ctx2D = SurfaceShapeTile.ctx2D; - - canvas.width = this.tileWidth; - canvas.height = this.tileHeight; - - // Mapping from lat/lon to x/y: - // lon = minlon => x = 0 - // lon = maxLon => x = 256 - // lat = minLat => y = 256 - // lat = maxLat => y = 0 - // (assuming texture size is 256) - // So: - // x = 256 / sector.dlon * (lon - minLon) - // y = -256 / sector.dlat * (lat - maxLat) - var xScale = this.tileWidth / this.sector.deltaLongitude(), - yScale = -this.tileHeight / this.sector.deltaLatitude(), - xOffset = -this.sector.minLongitude * xScale, - yOffset = -this.sector.maxLatitude * yScale; - - // Reset the surface shape state keys - this.asRenderedSurfaceShapeStateKeys = []; - - for (var idx = 0, len = this.surfaceShapes.length; idx < len; idx += 1) { - var shape = this.surfaceShapes[idx]; - this.asRenderedSurfaceShapeStateKeys.push(this.surfaceShapeStateKeys[idx]); - - shape.renderToTexture(dc, ctx2D, xScale, yScale, xOffset, yOffset); - } - - this.gpuCacheKey = this.getCacheKey(); - - var gpuResourceCache = dc.gpuResourceCache; - var texture = new Texture(gl, canvas); - gpuResourceCache.putResource(this.gpuCacheKey, texture, texture.size); - gpuResourceCache.setResourceAgingFactor(this.gpuCacheKey, 10); // age this texture 10x faster than normal resources (e.g., tiles) - - return texture; -}; - -/** - * Get a key suitable for cache look-ups. - * @returns {string} - */ -SurfaceShapeTile.prototype.getCacheKey = function () { - if (!this.cacheKey) { - this.cacheKey = "SurfaceShapeTile:" + - this.tileKey + "," + - this.pickSequence.toString(); - } - - return this.cacheKey; -}; - -/** - * Create a new canvas and its 2D context on demand. - */ -SurfaceShapeTile.prototype.createCtx2D = function () { - // If the context was previously created, ... - if (!SurfaceShapeTile.ctx2D) { - SurfaceShapeTile.canvas = document.createElement("canvas"); - SurfaceShapeTile.ctx2D = SurfaceShapeTile.canvas.getContext("2d"); - } -}; - -/* - * For internal use only. - * 2D canvas and context, which is created lazily on demand. - */ -SurfaceShapeTile.canvas = null; -SurfaceShapeTile.ctx2D = null; - -export default SurfaceShapeTile; diff --git a/web/src/gis/shapes/SurfaceShapeTileBuilder.js b/web/src/gis/shapes/SurfaceShapeTileBuilder.js deleted file mode 100644 index 20081fb9..00000000 --- a/web/src/gis/shapes/SurfaceShapeTileBuilder.js +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports SurfaceShapeTileBuilder - */ -import ArgumentError from '../error/ArgumentError'; -import DrawContext from '../render/DrawContext'; -import Globe from '../globe/Globe'; -import GpuProgram from '../shaders/GpuProgram'; -import Level from '../util/Level'; -import LevelSet from '../util/LevelSet'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import MemoryCache from '../cache/MemoryCache'; -import NotYetImplementedError from '../error/NotYetImplementedError'; -import PickedObject from '../pick/PickedObject'; -import Rectangle from '../geom/Rectangle'; -import Sector from '../geom/Sector'; -import SurfaceShape from '../shapes/SurfaceShape'; -import SurfaceShapeTile from '../shapes/SurfaceShapeTile'; -import Terrain from '../globe/Terrain'; -import TerrainTile from '../globe/TerrainTile'; -import TerrainTileList from '../globe/TerrainTileList'; -import TextureTile from '../render/TextureTile'; -import Tile from '../util/Tile'; -import WWMath from '../util/WWMath'; - - -function SurfaceShapeTileBuilder() { - // Parameterize top level subdivision in one place. - - // TilesInTopLevel describes the most coarse tile structure. - this.numRowsTilesInTopLevel = 1; - this.numColumnsTilesInTopLevel = 1; - - // The maximum number of levels that will ever be tessellated. - this.maximumSubdivisionDepth = 18; - - // tileWidth, tileHeight - the number of subdivisions a single tile has; this determines the sampling grid. - this.tileWidth = 256; - this.tileHeight = 256; - - /** - * The collection of levels. - * @type {LevelSet} - */ - this.levels = new LevelSet( - Sector.FULL_SPHERE, - new Location( - 360 / this.numRowsTilesInTopLevel, - 360 / this.numColumnsTilesInTopLevel), - this.maximumSubdivisionDepth, - this.tileWidth, - this.tileHeight); - - /** - * The collection of surface shapes processed by this class. - * @type {SurfaceShape[]} - */ - this.surfaceShapes = []; - - /** - * The collection of surface shape tiles that actually contain surface shapes. - * @type {SurfaceShapeTile[]} - */ - this.surfaceShapeTiles = []; - - /** - * The collection of top level surface shape tiles, from which actual tiles are derived. - * @type {SurfaceShapeTile[]} - */ - this.topLevelTiles = []; - - /** - * Accumulator of all sectors for surface shapes - * @type {Sector} - */ - this.sector = new Sector(-WWMath.MAX_LAT, WWMath.MAX_LAT, -180, 180); - - /** - * The default split scale. The split scale 2.9 has been empirically determined to render sharp lines and edges with - * the SurfaceShapes such as SurfacePolyline and SurfacePolygon. - * - * @type {Number} - */ - this.detailControl = 1.25; - - // Internal use only. Intentionally not documented. - this.tileCache = new MemoryCache(500000, 400000); -} - -/** - * Clear all transient state from the surface shape tile builder. - */ -SurfaceShapeTileBuilder.prototype.clear = function () { - this.surfaceShapeTiles.splice(0, this.surfaceShapeTiles.length); - this.surfaceShapes.splice(0, this.surfaceShapes.length); -}; - -/** - * Insert a surface shape to be rendered into the surface shape tile builder. - * - * @param {SurfaceShape} surfaceShape A surfave shape to be processed. - */ -SurfaceShapeTileBuilder.prototype.insertSurfaceShape = function (surfaceShape) { - this.surfaceShapes.push(surfaceShape); -}; - -/** - * Perform the rendering of any accumulated surface shapes by building the surface shape tiles that contain these - * shapes and then rendering those tiles. - * - * @param {DrawContext} dc The drawing context. - */ -SurfaceShapeTileBuilder.prototype.doRender = function (dc) { - if (dc.pickingMode) { - // Picking rendering strategy: - // 1) save all tiles created prior to picking, - // 2) construct and render new tiles with pick-based contents (colored with pick IDs), - // 3) restore all prior tiles. - // This has a big potential win for normal rendering, since there is a lot of coherence - // from frame to frame if no picking is occurring. - for (var idx = 0, len = this.surfaceShapes.length; idx < len; idx += 1) { - this.surfaceShapes[idx].resetPickColor(); - } - - SurfaceShapeTileBuilder.pickSequence += 1; - - var savedTiles = this.surfaceShapeTiles; - var savedTopLevelTiles = this.topLevelTiles; - - this.surfaceShapeTiles = []; - this.topLevelTiles = []; - - this.buildTiles(dc); - - if (dc.deepPicking) { - // Normally, we render all shapes together in one tile (or a small number, but this detail - // doesn't matter). For deep picking, we need to render each shape individually. - this.doDeepPickingRender(dc); - - } else { - dc.surfaceTileRenderer.renderTiles(dc, this.surfaceShapeTiles, 1); - } - - this.surfaceShapeTiles = savedTiles; - this.topLevelTiles = savedTopLevelTiles; - } else { - this.buildTiles(dc); - - dc.surfaceTileRenderer.renderTiles(dc, this.surfaceShapeTiles, 1); - } -}; - -SurfaceShapeTileBuilder.prototype.doDeepPickingRender = function (dc) { - var idxTile, lenTiles, idxShape, lenShapes, idxPick, lenPicks, po, shape, tile; - - // Determine the shapes that were drawn during buildTiles. These shapes may not actually be - // at the pick point, but they are candidates for deep picking. - var deepPickShapes = []; - for (idxPick = 0, lenPicks = dc.objectsAtPickPoint.objects.length; idxPick < lenPicks; idxPick += 1) { - po = dc.objectsAtPickPoint.objects[idxPick]; - if (po.userObject instanceof SurfaceShape) { - shape = po.userObject; - - // If the shape was not already in the collection of deep picked shapes, ... - if (deepPickShapes.indexOf(shape) < 0) { - deepPickShapes.push(shape); - - // Delete the shape that was drawn during buildTiles from the pick list. - dc.objectsAtPickPoint.objects.splice(idxPick, 1); - - // Update the index and length to reflect the deletion. - idxPick -= 1; - lenPicks -= 1; - } - } - } - - if (deepPickShapes.length <= 0) { - return; - } - - // For all shapes, - // 1) force that shape to be the only shape in a tile, - // 2) re-render the tile, and - // 3) use the surfaceTileRenderer to render the tile on the terrain, - // 4) read the color to see if it is attributable to the current shape. - var resolvablePickObjects = []; - for (idxShape = 0, lenShapes = deepPickShapes.length; idxShape < lenShapes; idxShape += 1) { - shape = deepPickShapes[idxShape]; - for (idxTile = 0, lenTiles = this.surfaceShapeTiles.length; idxTile < lenTiles; idxTile += 1) { - tile = this.surfaceShapeTiles[idxTile]; - tile.setShapes([shape]); - tile.updateTexture(dc); - } - - dc.surfaceTileRenderer.renderTiles(dc, this.surfaceShapeTiles, 1); - - var pickColor = dc.readPickColor(dc.pickPoint); - if (!!pickColor && shape.pickColor.equals(pickColor)) { - po = new PickedObject(shape.pickColor.clone(), - shape.pickDelegate ? shape.pickDelegate : shape, null, shape.layer, false); - resolvablePickObjects.push(po); - } - } - - // Flush surface shapes that have accumulated in the updateTexture pass just completed on all shapes. - for (idxPick = 0, lenPicks = dc.objectsAtPickPoint.objects.length; idxPick < lenPicks; idxPick += 1) { - po = dc.objectsAtPickPoint.objects[idxPick]; - if (po.userObject instanceof SurfaceShape) { - // Delete the shape that was picked in the most recent pass. - dc.objectsAtPickPoint.objects.splice(idxPick, 1); - - // Update the index and length to reflect the deletion. - idxPick -= 1; - lenPicks -= 1; - } - } - - // Add the resolvable pick objects for surface shapes that were actually visible at the pick point - // to the pick list. - for (idxPick = 0, lenPicks = resolvablePickObjects.length; idxPick < lenPicks; idxPick += 1) { - po = resolvablePickObjects[idxPick]; - dc.objectsAtPickPoint.objects.push(po); - } -}; - -/** - * Assembles the surface tiles and draws any surface shapes that have been accumulated into those offscreen tiles. The - * surface tiles are assembled to meet the necessary resolution of to the draw context's. - * <p/> - * This does nothing if there are no surface shapes associated with this builder. - * - * @param {DrawContext} dc The draw context to build tiles for. - * - * @throws {ArgumentError} If the draw context is null. - */ -SurfaceShapeTileBuilder.prototype.buildTiles = function (dc) { - if (!dc) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SurfaceShapeTileBuilder", "buildTiles", "missingDc")); - } - - if (!this.surfaceShapes || this.surfaceShapes.length < 1) { - return; - } - - // Assemble the current visible tiles and update their associated textures if necessary. - this.assembleTiles(dc); - - // Clean up references to all surface shapes to avoid dangling references. The surface shape list is no - // longer needed, now that the shapes are held by each tile. - this.surfaceShapes.splice(0, this.surfaceShapes.length); - for (var idx = 0, len = this.surfaceShapeTiles.length; idx < len; idx += 1) { - var tile = this.surfaceShapeTiles[idx]; - tile.clearShapes(); - } -}; - -/** - * Assembles a set of surface tiles that are visible in the specified DrawContext and meet the tile builder's - * resolution criteria. Tiles are culled against the current surface shape list, against the DrawContext's view - * frustum during rendering mode, and against the DrawContext's pick frustums during picking mode. If a tile does - * not meet the tile builder's resolution criteria, it's split into four sub-tiles and the process recursively - * repeated on the sub-tiles. - * <p/> - * During assembly, each surface shape in {@link #surfaceShapes} is sorted into the tiles they - * intersect. The top level tiles are used as an index to quickly determine which tiles each shape intersects. - * Surface shapes are sorted into sub-tiles by simple intersection tests, and are added to each tile's surface - * renderable list at most once. See {@link SurfaceShapeTileBuilder.SurfaceShapeTile#addSurfaceShape(SurfaceShape, - * gov.nasa.worldwind.geom.Sector)}. Tiles that don't intersect any surface shapes are discarded. - * - * @param {DrawContext} dc The DrawContext to assemble tiles for. - */ -SurfaceShapeTileBuilder.prototype.assembleTiles = function (dc) { - var tile, idxShape, lenShapes, idxTile, lenTiles, idxSector, lenSectors; - - // Create a set of top level tiles only if that set doesn't exist yet. - if (this.topLevelTiles.length < 1) { - this.createTopLevelTiles(); - } - - // Store the top level tiles in a set to ensure that each top level tile is added only once. Store the tiles - // that intersect each surface shape in a set to ensure that each object is added to a tile at most once. - var intersectingTiles = {}; - - // Iterate over the current surface shapes, adding each surface shape to the top level tiles that it - // intersects. This produces a set of top level tiles containing the surface shapes that intersect each - // tile. We use the tile structure as an index to quickly determine the tiles a surface shape intersects, - // and add object to those tiles. This has the effect of quickly sorting the objects into the top level tiles. - // We collect the top level tiles in a HashSet to ensure there are no duplicates when multiple objects intersect - // the same top level tiles. - for (idxShape = 0, lenShapes = this.surfaceShapes.length; idxShape < lenShapes; idxShape += 1) { - var surfaceShape = this.surfaceShapes[idxShape]; - - var sectors = surfaceShape.computeSectors(dc); - if (!sectors) { - continue; - } - - for (idxSector = 0, lenSectors = sectors.length; idxSector < lenSectors; idxSector += 1) { - var sector = sectors[idxSector]; - - for (idxTile = 0, lenTiles = this.topLevelTiles.length; idxTile < lenTiles; idxTile += 1) { - tile = this.topLevelTiles[idxTile]; - - if (tile.sector.intersects(sector)) { - var cacheKey = tile.tileKey; - intersectingTiles[cacheKey] = tile; - tile.addSurfaceShape(surfaceShape); - } - } - } - } - - // Add each top level tile or its descendants to the current tile list. - //for (var idxTile = 0, lenTiles = this.topLevelTiles.length; idxTile < lenTiles; idxTile += 1) { - for (var key in intersectingTiles) { - if (intersectingTiles.hasOwnProperty(key)) { - tile = intersectingTiles[key]; - - this.addTileOrDescendants(dc, this.levels, null, tile); - } - } -}; - -/** - * Potentially adds the specified tile or its descendants to the tile builder's surface shape tile collection. - * The tile and its descendants are discarded if the tile is not visible or does not intersect any surface shapes in the - * parent's surface shape list. - * <p/> - * If the tile meet the tile builder's resolution criteria it's added to the tile builder's - * <code>currentTiles</code> list. Otherwise, it's split into four sub-tiles and each tile is recursively processed. - * - * @param {DrawContext} dc The current DrawContext. - * @param {LevelSet} levels The tile's LevelSet. - * @param {SurfaceShapeTile} parentTile The tile's parent, or null if the tile is a top level tile. - * @param {SurfaceShapeTile} tile The tile to add. - */ -SurfaceShapeTileBuilder.prototype.addTileOrDescendants = function (dc, levels, parentTile, tile) { - // Ignore this tile if it falls completely outside the frustum. This may be the viewing frustum or the pick - // frustum, depending on the implementation. - if (!this.intersectsFrustum(dc, tile)) { - // This tile is not added to the current tile list, so we clear it's object list to prepare it for use - // during the next frame. - tile.clearShapes(); - return; - } - - // If the parent tile is not null, add any parent surface shapes that intersect this tile. - if (parentTile != null) { - this.addIntersectingShapes(dc, parentTile, tile); - } - - // Ignore tiles that do not intersect any surface shapes. - if (!tile.hasShapes()) { - return; - } - - // If this tile meets the current rendering criteria, add it to the current tile list. This tile's object list - // is cleared after the tile update operation. - if (this.meetsRenderCriteria(dc, levels, tile)) { - this.addTile(dc, tile); - return; - } - - var nextLevel = levels.level(tile.level.levelNumber + 1); - var subTiles = dc.pickingMode ? - tile.subdivide(nextLevel, this) : - tile.subdivideToCache(nextLevel, this, this.tileCache); - for (var idxTile = 0, lenTiles = subTiles.length; idxTile < lenTiles; idxTile += 1) { - var subTile = subTiles[idxTile]; - this.addTileOrDescendants(dc, levels, tile, subTile); - } - - // This tile is not added to the current tile list, so we clear it's object list to prepare it for use during - // the next frame. - tile.clearShapes(); -}; - -/** - * Adds surface shapes from the parent's object list to the specified tile's object list. Adds any of the - * parent's surface shapes that intersect the tile's sector to the tile's object list. - * - * @param {DrawContext} dc The current DrawContext. - * @param {SurfaceShapeTile} parentTile The tile's parent. - * @param {SurfaceShapeTile} tile The tile to add intersecting surface shapes to. - */ -SurfaceShapeTileBuilder.prototype.addIntersectingShapes = function (dc, parentTile, tile) { - var shapes = parentTile.getShapes(); - for (var idxShape = 0, lenShapes = shapes.length; idxShape < lenShapes; idxShape += 1) { - var shape = shapes[idxShape]; - - var sectors = shape.computeSectors(dc); - if (!sectors) { - continue; - } - - // Test intersection against each of the surface shape's sectors. We break after finding an - // intersection to avoid adding the same object to the tile more than once. - for (var idxSector = 0, lenSectors = sectors.length; idxSector < lenSectors; idxSector += 1) { - var sector = sectors[idxSector]; - - if (tile.getSector().intersects(sector)) { - tile.addSurfaceShape(shape); - break; - } - } - } -}; - -/** - * Adds the specified tile to this tile builder's surface tile collection. - * - * @param {DrawContext} dc The draw context. - * @param {SurfaceShapeTile} tile The tile to add. - */ -SurfaceShapeTileBuilder.prototype.addTile = function (dc, tile) { - if (dc.pickingMode) { - tile.pickSequence = SurfaceShapeTileBuilder.pickSequence; - } - - if (tile.needsUpdate(dc)) { - tile.updateTexture(dc); - } - - this.surfaceShapeTiles.push(tile); -}; - -/** - * Internal use only. - * - * Returns a new SurfaceObjectTile corresponding to the specified {@code sector}, {@code level}, {@code row}, - * and {@code column}. - * - * CAUTION: it is assumed that there exists a single SurfaceShapeTileBuilder. This algorithm might be invalid if there - * are more of them (or it might actually work, although it hasn't been tested in that context). - * - * @param {Sector} sector The tile's Sector. - * @param {Level} level The tile's Level in a {@link LevelSet}. - * @param {Number} row The tile's row in the Level, starting from 0 and increasing to the right. - * @param {Number} column The tile's column in the Level, starting from 0 and increasing upward. - * - * @return {SurfaceShapeTile} a new SurfaceShapeTile. - */ -SurfaceShapeTileBuilder.prototype.createTile = function (sector, level, row, column) { - return new SurfaceShapeTile(sector, level, row, column); -}; - -SurfaceShapeTileBuilder.prototype.createTopLevelTiles = function () { - Tile.createTilesForLevel(this.levels.firstLevel(), this, this.topLevelTiles); -}; - -/** - * Test if the tile intersects the specified draw context's frustum. During picking mode, this tests intersection - * against all of the draw context's pick frustums. During rendering mode, this tests intersection against the draw - * context's viewing frustum. - * - * @param {DrawContext} dc The draw context the surface shape is related to. - * @param {SurfaceShapeTile} tile The tile to test for intersection. - * - * @return {Boolean} true if the tile intersects the draw context's frustum; false otherwise. - */ -SurfaceShapeTileBuilder.prototype.intersectsFrustum = function (dc, tile) { - if (dc.globe.projectionLimits && !tile.sector.overlaps(dc.globe.projectionLimits)) { - return false; - } - - tile.update(dc); - - return tile.extent.intersectsFrustum(dc.pickingMode ? dc.pickFrustum : dc.frustumInModelCoordinates); -}; - -/** - * Tests if the specified tile meets the rendering criteria on the specified draw context. This returns true if the - * tile is from the level set's final level, or if the tile achieves the desired resolution on the draw context. - * - * @param {DrawContext} dc The current draw context. - * @param {LevelSet} levels The level set the tile belongs to. - * @param {SurfaceShapeTile} tile The tile to test. - * - * @return {Boolean} true if the tile meets the rendering criteria; false otherwise. - */ -SurfaceShapeTileBuilder.prototype.meetsRenderCriteria = function (dc, levels, tile) { - return tile.level.levelNumber == levels.lastLevel().levelNumber || !tile.mustSubdivide(dc, this.detailControl); -}; - -/** - * Internal use only. - * Count of pick operations. This is used to give a surface shape tile a unique pick sequence number if it is - * participating in picking. - * @type {Number} - */ -SurfaceShapeTileBuilder.pickSequence = 0; - -export default SurfaceShapeTileBuilder; diff --git a/web/src/gis/shapes/Text.js b/web/src/gis/shapes/Text.js deleted file mode 100644 index 17680f8b..00000000 --- a/web/src/gis/shapes/Text.js +++ /dev/null @@ -1,538 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Text - */ -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import Color from '../util/Color'; -import Font from '../util/Font'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import Renderable from '../render/Renderable'; -import TextAttributes from '../shapes/TextAttributes'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; - - -/** - * Constructs a text shape. This constructor is intended to be called only by subclasses. - * @alias Text - * @constructor - * @augments Renderable - * @classdesc Represents a string of text displayed at a specified geographic or screen position. - * This is an abstract class meant to be subclassed and not meant to be instantiated directly. - * See {@link GeographicText} and {@link ScreenText} for concrete classes. - * - * @param {String} text The text to display. - * @throws {ArgumentError} If the specified text is null or undefined. - */ -function Text(text) { - if (!text) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Text", "constructor", "missingText")); - } - - Renderable.call(this); - - /** - * The text's attributes. If null and this text is not highlighted, this text is not drawn. - * @type {TextAttributes} - * @default see [TextAttributes]{@link TextAttributes} - */ - this.attributes = new TextAttributes(null); - - /** - * The attributes used when this text's highlighted flag is true. If null and the - * highlighted flag is true, this text's normal attributes are used. If they, too, are null, this - * text is not drawn. - * @type {TextAttributes} - * @default null - */ - this.highlightAttributes = null; - - /** - * Indicates whether this text uses its highlight attributes rather than its normal attributes. - * @type {boolean} - * @default false - */ - this.highlighted = false; - - /** - * Indicates whether this text is drawn. - * @type {boolean} - * @default true - */ - this.enabled = true; - - /** - * This shape's text. If null or empty, no text is drawn. - * @type {String} - * @default null - */ - this.text = text; - - /** - * This text's altitude mode. May be one of - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * @default WorldWind.ABSOLUTE - */ - this.altitudeMode = WorldWind.ABSOLUTE; - - /** - * Indicates the object to return as the userObject of this text when picked. If null, - * then this text object is returned as the userObject. - * @type {Object} - * @default null - * @see [PickedObject.userObject]{@link PickedObject#userObject} - */ - this.pickDelegate = null; - - /** - * Indicates whether this text has visual priority over other shapes in the scene. - * @type {Boolean} - * @default false - */ - this.alwaysOnTop = false; - - /** - * This shape's target visibility, a value between 0 and 1. During ordered rendering this shape modifies its - * [current visibility]{@link Text#currentVisibility} towards its target visibility at the rate - * specified by the draw context's [fadeVelocity]{@link DrawContext#fadeVelocity} property. The target - * visibility and current visibility are used to control the fading in and out of this shape. - * @type {Number} - * @default 1 - */ - this.targetVisibility = 1; - - /** - * This shape's current visibility, a value between 0 and 1. This property scales the shape's effective - * opacity. It is incremented or decremented each frame according to the draw context's - * [fade velocity]{@link DrawContext#fadeVelocity} property in order to achieve this shape's current - * [target visibility]{@link Text#targetVisibility}. This current visibility and target visibility are - * used to control the fading in and out of this shape. - * @type {Number} - * @default 1 - * @readonly - */ - this.currentVisibility = 1; - - /** - * Indicates the group ID of the declutter group to include this Text shape. If non-zer0, this shape - * is decluttered relative to all other shapes within its group. - * @type {Number} - * @default 0 - */ - this.declutterGroup = 0; - - /** - * The image to display when this text shape is eliminated from the scene due to decluttering. - * @type {String} - * @default A round dot drawn in this shape's text color. - */ - this.markerImageSource = WorldWind.configuration.baseUrl + "images/white-dot.png"; - - /** - * The scale to apply to the [markerImageSource]{@link Text#markerImageSource}. - * @type {Number} - * @default 0.1 - */ - this.markerImageScale = 0.1; - - // Internal use only. Intentionally not documented. - this.activeAttributes = null; - - // Internal use only. Intentionally not documented. - this.activeTexture = null; - - // Internal use only. Intentionally not documented. - this.imageTransform = Matrix.fromIdentity(); - - // Internal use only. Intentionally not documented. - this.imageBounds = null; - - // Internal use only. Intentionally not documented. - this.layer = null; - - // Internal use only. Intentionally not documented. - this.depthOffset = -0.003; - - // Internal use only. Intentionally not documented. - this.screenPoint = new Vec3(0, 0, 0); -} - -// Internal use only. Intentionally not documented. -Text.matrix = Matrix.fromIdentity(); // scratch variable -Text.glPickPoint = new Vec3(0, 0, 0); // scratch variable - -Text.prototype = Object.create(Renderable.prototype); - -/** - * Copies the contents of a specified text object to this text object. - * @param {Text} that The text object to copy. - */ -Text.prototype.copy = function (that) { - this.text = that.text; - this.attributes = that.attributes; - this.highlightAttributes = that.highlightAttributes; - this.highlighted = that.highlighted; - this.enabled = that.enabled; - this.altitudeMode = that.altitudeMode; - this.pickDelegate = that.pickDelegate; - this.alwaysOnTop = that.alwaysOnTop; - this.depthOffset = that.depthOffset; - this.declutterGroup = that.declutterGroup; - this.targetVisibility = that.targetVisibility; - this.currentVisibility = that.currentVisibility; - - return this; -}; - -Object.defineProperties(Text.prototype, { - /** - * Indicates the screen coordinate bounds of this shape during ordered rendering. - * @type {Rectangle} - * @readonly - * @memberof Text.prototype - */ - screenBounds: { - get: function () { - return this.imageBounds; - } - } -}); - -/** - * Renders this text. This method is typically not called by applications but is called by - * [RenderableLayer]{@link RenderableLayer} during rendering. For this shape this method creates and - * enques an ordered renderable with the draw context and does not actually draw the text. - * @param {DrawContext} dc The current draw context. - */ -Text.prototype.render = function (dc) { - if (!this.enabled || !this.text || this.text.length === 0) { - return; - } - - if (!dc.accumulateOrderedRenderables) { - return; - } - - // Create an ordered renderable for this text. If one has already been created this frame then we're - // in 2D-continuous mode and another needs to be created for one of the alternate globe offsets. - var orderedText; - if (this.lastFrameTime !== dc.timestamp) { - orderedText = this.makeOrderedRenderable(dc); - } else { - var textCopy = this.clone(); - orderedText = textCopy.makeOrderedRenderable(dc); - } - - if (!orderedText) { - return; - } - - if (!orderedText.isVisible(dc)) { - return; - } - - orderedText.layer = dc.currentLayer; - - this.lastFrameTime = dc.timestamp; - dc.addOrderedRenderable(orderedText); -}; - -/** - * Draws this shape as an ordered renderable. Applications do not call this function. It is called by - * {@link WorldWindow} during rendering. Implements the {@link OrderedRenderable} interface. - * @param {DrawContext} dc The current draw context. - */ -Text.prototype.renderOrdered = function (dc) { - // Optimize away the case of achieved target visibility of 0 and no marker image to display in that case. - if (this.currentVisibility === 0 && this.targetVisibility === 0 && !this.markerImageSource) { - return; - } - - this.drawOrderedText(dc); - - if (dc.pickingMode) { - var po = new PickedObject(this.pickColor.clone(), this.pickDelegate ? this.pickDelegate : this, - this.position, this.layer, false); - - dc.resolvePick(po); - } -}; - -// Intentionally not documented. -Text.prototype.makeOrderedRenderable = function (dc) { - var w, h, s, - offset; - - this.determineActiveAttributes(dc); - if (!this.activeAttributes) { - return null; - } - - //// Compute the text's screen point and distance to the eye point. - if (!this.computeScreenPointAndEyeDistance(dc)) { - return null; - } - - this.activeTexture = dc.createTextTexture(this.text, this.activeAttributes); - - w = this.activeTexture.imageWidth; - h = this.activeTexture.imageHeight; - s = this.activeAttributes.scale; - offset = this.activeAttributes.offset.offsetForSize(w, h); - - this.imageTransform.setTranslation( - this.screenPoint[0] - offset[0] * s, - this.screenPoint[1] - offset[1] * s, - this.screenPoint[2]); - - this.imageTransform.setScale(w * s, h * s, 1); - - this.imageBounds = WWMath.boundingRectForUnitQuad(this.imageTransform); - - return this; -}; - -/** - * Computes this shape's screen point and eye distance. Subclasses must override this method. - * @param {DrawContext} dc The current draw context. - * @returns {Boolean} true if the screen point can be computed, otherwise false. - * @protected - */ -Text.prototype.computeScreenPointAndEyeDistance = function (dc) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Renderable", "render", "abstractInvocation")); -}; - -// Internal. Intentionally not documented. -Text.prototype.determineActiveAttributes = function (dc) { - if (this.highlighted && this.highlightAttributes) { - this.activeAttributes = this.highlightAttributes; - } else { - this.activeAttributes = this.attributes; - } -}; - -// Internal. Intentionally not documented. -Text.prototype.isVisible = function (dc) { - if (dc.pickingMode) { - return dc.pickRectangle && this.imageBounds.intersects(dc.pickRectangle); - } else { - return this.imageBounds.intersects(dc.viewport); - } -}; - -// Internal. Intentionally not documented. -Text.prototype.drawOrderedText = function (dc) { - this.beginDrawing(dc); - - try { - this.doDrawOrderedText(dc); - if (!dc.pickingMode) { - //this.drawBatchOrderedText(dc); - } - } finally { - this.endDrawing(dc); - } -}; - -// Internal. Intentionally not documented. -Text.prototype.drawBatchOrderedText = function (dc) { - // Draw any subsequent text in the ordered renderable queue, removing each from the queue as it's - // processed. This avoids the overhead of setting up and tearing down OpenGL state for each text shape. - - var or; - - while ((or = dc.peekOrderedRenderable()) && or instanceof Text) { - dc.popOrderedRenderable(); // remove it from the queue - - try { - or.doDrawOrderedText(dc); - } catch (e) { - Logger.logMessage(Logger.LEVEL_WARNING, 'Text', 'drawBatchOrderedText', - "Error occurred while rendering text using batching: " + e.message); - } - // Keep going. Render the rest of the ordered renderables. - } -}; - -// Internal. Intentionally not documented. -Text.prototype.beginDrawing = function (dc) { - var gl = dc.currentGlContext, - program; - - dc.findAndBindProgram(BasicTextureProgram); - - // Configure GL to use the draw context's unit quad VBOs for both model coordinates and texture coordinates. - // Most browsers can share the same buffer for vertex and texture coordinates, but Internet Explorer requires - // that they be in separate buffers, so the code below uses the 3D buffer for vertex coords and the 2D - // buffer for texture coords. - program = dc.currentProgram; - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer3()); - gl.vertexAttribPointer(program.vertexPointLocation, 3, gl.FLOAT, false, 0, 0); - gl.bindBuffer(gl.ARRAY_BUFFER, dc.unitQuadBuffer()); - gl.vertexAttribPointer(program.vertexTexCoordLocation, 2, gl.FLOAT, false, 0, 0); - gl.enableVertexAttribArray(program.vertexPointLocation); - gl.enableVertexAttribArray(program.vertexTexCoordLocation); - - // Tell the program which texture unit to use. - program.loadTextureUnit(gl, gl.TEXTURE0); - - // Turn off color modulation since we want to pick against the text box and not just the text. - program.loadModulateColor(gl, false); - - // Suppress depth-buffer writes. - gl.depthMask(false); -}; - -// Internal. Intentionally not documented. -Text.prototype.endDrawing = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram; - - // Restore the default GL vertex attribute state. - gl.disableVertexAttribArray(program.vertexPointLocation); - gl.disableVertexAttribArray(program.vertexTexCoordLocation); - - // Restore the default GL buffer and texture bindings. - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindTexture(gl.TEXTURE_2D, null); - - // Restore the default GL depth mask state. - gl.depthMask(true); -}; - -// Internal. Intentionally not documented. -Text.prototype.doDrawOrderedText = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram; - - // Compute the text's current visibility, potentially requesting additional frames. - if (!dc.pickingMode && this.currentVisibility !== this.targetVisibility) { - var visibilityDelta = (dc.timestamp - dc.previousRedrawTimestamp) / dc.fadeTime; - if (this.currentVisibility < this.targetVisibility) { - this.currentVisibility = Math.min(1, this.currentVisibility + visibilityDelta); - } else { - this.currentVisibility = Math.max(0, this.currentVisibility - visibilityDelta); - } - dc.redrawRequested = true; - } - - // Turn off depth testing for the text unless it's been requested. - if (!this.activeAttributes.depthTest) { - gl.disable(gl.DEPTH_TEST); - } - - // Use the text color and opacity. Modulation is done to white to avoid the program's shader from - // modifying the text color. When picking, use the pick color, 100% opacity and no texture. - if (!dc.pickingMode) { - program.loadColor(gl, Color.WHITE); - program.loadOpacity(gl, this.layer.opacity * this.currentVisibility); - } else { - this.pickColor = dc.uniquePickColor(); - program.loadColor(gl, this.pickColor); - program.loadOpacity(gl, 1); - program.loadTextureEnabled(gl, false); - } - - // When the text is visible, draw the text label. - if (this.currentVisibility > 0) { - this.drawLabel(dc); - } - - // When the text is not visible, draw a marker to indicate that something is there. - if (this.currentVisibility < 1 && this.markerImageSource) { - this.drawMarker(dc); - } - - // Restore the default GL depth test state. - if (!this.activeAttributes.depthTest) { - gl.enable(gl.DEPTH_TEST); - } -}; - -// Internal. Intentionally not documented. -Text.prototype.drawLabel = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - textureBound; - - // Use the label texture when not picking. - if (!dc.pickingMode && this.activeTexture) { - Text.matrix.setToIdentity(); - Text.matrix.multiplyByTextureTransform(this.activeTexture); - textureBound = this.activeTexture.bind(dc); // returns false if texture is null or cannot be bound - program.loadTextureEnabled(gl, textureBound); - program.loadTextureMatrix(gl, Text.matrix); - } - - // Compute and specify the text label's modelview-projection matrix. - Text.matrix.copy(dc.screenProjection); - Text.matrix.multiplyMatrix(this.imageTransform); - program.loadModelviewProjection(gl, Text.matrix); - - // Draw the text as a two-triangle square. - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); -}; - -// Internal. Intentionally not documented. -Text.prototype.drawMarker = function (dc) { - var gl = dc.currentGlContext, - program = dc.currentProgram, - textureBound; - - var markerTexture = dc.gpuResourceCache.resourceForKey(this.markerImageSource); - if (!markerTexture) { - dc.gpuResourceCache.retrieveTexture(dc.currentGlContext, this.markerImageSource); - return; - } - - // Use the marker opacity and texture when not picking. - if (!dc.pickingMode) { - Text.matrix.setToIdentity(); - Text.matrix.multiplyByTextureTransform(markerTexture); - textureBound = markerTexture.bind(dc); // returns false if texture is null or cannot be bound - program.loadTextureEnabled(gl, textureBound); - program.loadTextureMatrix(gl, Text.matrix); - program.loadOpacity(gl, this.layer.opacity * (1 - this.currentVisibility)); - } - - // Compute and specify the marker's modelview-projection matrix. - var s = this.markerImageScale; - Text.matrix.copy(dc.screenProjection); - Text.matrix.multiplyByTranslation( - this.screenPoint[0] - s * markerTexture.imageWidth / 2, - this.screenPoint[1] - s * markerTexture.imageWidth / 2, - this.screenPoint[2]); - Text.matrix.multiplyByScale(markerTexture.imageWidth * s, markerTexture.imageHeight * s, 1); - program.loadModelviewProjection(gl, Text.matrix); - - // Draw the marker as a two-triangle square. - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); -}; - -export default Text; diff --git a/web/src/gis/shapes/TextAttributes.js b/web/src/gis/shapes/TextAttributes.js deleted file mode 100644 index bfae914a..00000000 --- a/web/src/gis/shapes/TextAttributes.js +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TextAttributes - */ -import Color from '../util/Color'; -import Font from '../util/Font'; -import Offset from '../util/Offset'; - - -/** - * Constructs a text attributes bundle. - * @alias TextAttributes - * @constructor - * @classdesc Holds attributes applied to [Text]{@link Text} shapes and [Placemark]{@link Placemark} labels. - * - * @param {TextAttributes} attributes Attributes to initialize this attributes instance to. May be null, - * in which case the new instance contains default attributes. - */ -function TextAttributes(attributes) { - this._color = attributes ? attributes._color.clone() : Color.WHITE.clone(); - this._font = attributes ? attributes._font : new Font(14); - this._offset = attributes ? attributes._offset - : new Offset(WorldWind.OFFSET_FRACTION, 0.5, WorldWind.OFFSET_FRACTION, 0.0); - this._scale = attributes ? attributes._scale : 1; - this._depthTest = attributes ? attributes._depthTest : false; - this._enableOutline = attributes ? attributes._enableOutline : true; - this._outlineWidth = attributes ? attributes._outlineWidth : 4; - this._outlineColor = attributes ? attributes._outlineColor : new Color(0, 0, 0, 0.5); - - /** - * Indicates whether this object's state key is invalid. Subclasses must set this value to true when their - * attributes change. The state key will be automatically computed the next time it's requested. This flag - * will be set to false when that occurs. - * @type {boolean} - * @protected - */ - this.stateKeyInvalid = true; -} - -/** - * Computes the state key for this attributes object. Subclasses that define additional attributes must - * override this method, call it from that method, and append the state of their attributes to its - * return value. - * @returns {String} The state key for this object. - * @protected - */ -TextAttributes.prototype.computeStateKey = function () { - return "c " + this._color.toHexString(true) + - " f " + this._font.toString() + - " o " + this._offset.toString() + - " s " + this._scale + - " dt " + this._depthTest + - " eo " + this._enableOutline + - " ow " + this._outlineWidth + - " oc " + this._outlineColor.toHexString(true); -}; - -Object.defineProperties(TextAttributes.prototype, { - /** - * A string identifying the state of this attributes object. The string encodes the current values of all - * this object's properties. It's typically used to validate cached representations of shapes associated - * with this attributes object. - * @type {String} - * @readonly - * @memberof TextAttributes.prototype - */ - stateKey: { - get: function () { - if (this.stateKeyInvalid) { - this._stateKey = this.computeStateKey(); - this.stateKeyInvalid = false; - } - return this._stateKey; - } - }, - - /** - * The text color. - * @type {Color} - * @default White (1, 1, 1, 1) - * @memberof TextAttributes.prototype - */ - color: { - get: function () { - return this._color; - }, - set: function (value) { - this._color = value; - this.stateKeyInvalid = true; - } - }, - - /** - * The text size, face and other characteristics, as described in [Font]{@link Font}. - * @type {Font} - * @default Those of [Font]{@link Font}, but with a font size of 14. - * @memberof TextAttributes.prototype - */ - font: { - get: function () { - return this._font; - }, - set: function (value) { - this._font = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the location of the text relative to its specified position. - * May be null, in which case the text's bottom-left corner is placed at the specified position. - * @type {Offset} - * @default 0.5, 0.0, both fractional (Places the text's horizontal center and vertical bottom at the - * specified position.) - * @memberof TextAttributes.prototype - */ - offset: { - get: function () { - return this._offset; - }, - set: function (value) { - this._offset = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the amount to scale the text. A value of 0 makes the text disappear. - * @type {Number} - * @default 1.0 - * @memberof TextAttributes.prototype - */ - scale: { - get: function () { - return this._scale; - }, - set: function (value) { - this._scale = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates whether the text should be depth-tested against other objects in the scene. If true, - * the text may be occluded by terrain and other objects in certain viewing situations. If false, - * the text will not be occluded by terrain and other objects. - * @type {Boolean} - * @default false - * @memberof TextAttributes.prototype - */ - depthTest: { - get: function () { - return this._depthTest; - }, - set: function (value) { - this._depthTest = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates if the text will feature an outline around its characters. - * @type {Boolean} - * @default true - * @memberof TextAttributes.prototype - */ - enableOutline: { - get: function () { - return this._enableOutline; - }, - set: function (value) { - this._enableOutline = value; - this.stateKeyInvalid = true; - } - }, - - /** - * Indicates the text outline width (or thickness) in pixels. - * @type {Number} - * @default 4 - * @memberof TextAttributes.prototype - */ - outlineWidth: { - get: function () { - return this._outlineWidth; - }, - set: function (value) { - this._outlineWidth = value; - this.stateKeyInvalid = true; - } - }, - - /** - * The color of the outline. - * @type {Color} - * @default Half-transparent black (0, 0, 0, 0.5) - * @memberof TextAttributes.prototype - */ - outlineColor: { - get: function () { - return this._outlineColor; - }, - set: function (value) { - this._outlineColor = value; - this.stateKeyInvalid = true; - } - } -}); - -export default TextAttributes; diff --git a/web/src/gis/shapes/TriangleMesh.js b/web/src/gis/shapes/TriangleMesh.js deleted file mode 100644 index f91d2ccb..00000000 --- a/web/src/gis/shapes/TriangleMesh.js +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TriangleMesh - */ -import AbstractMesh from '../shapes/AbstractMesh'; -import ArgumentError from '../error/ArgumentError'; -import BasicTextureProgram from '../shaders/BasicTextureProgram'; -import BoundingBox from '../geom/BoundingBox'; -import Color from '../util/Color'; -import ImageSource from '../util/ImageSource'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Matrix from '../geom/Matrix'; -import PickedObject from '../pick/PickedObject'; -import Position from '../geom/Position'; -import ShapeAttributes from '../shapes/ShapeAttributes'; -import SurfacePolygon from '../shapes/SurfacePolygon'; -import Vec2 from '../geom/Vec2'; -import Vec3 from '../geom/Vec3'; - - -/** - * Constructs a triangle mesh. - * @alias TriangleMesh - * @constructor - * @augments AbstractMesh - * @classdesc Represents a 3D triangle mesh. - * <p> - * Altitudes within the mesh's positions are interpreted according to the mesh's altitude mode, which - * can be one of the following: - * <ul> - * <li>[WorldWind.ABSOLUTE]{@link WorldWind#ABSOLUTE}</li> - * <li>[WorldWind.RELATIVE_TO_GROUND]{@link WorldWind#RELATIVE_TO_GROUND}</li> - * <li>[WorldWind.CLAMP_TO_GROUND]{@link WorldWind#CLAMP_TO_GROUND}</li> - * </ul> - * If the latter, the mesh positions' altitudes are ignored. (If the mesh should be draped onto the - * terrain, you might want to use {@link SurfacePolygon} instead.) - * <p> - * Meshes have separate attributes for normal display and highlighted display. They use the interior and - * outline attributes of {@link ShapeAttributes}. If those attributes identify an image, that image is - * applied to the mesh. Texture coordinates for the image may be specified, but if not specified the full - * image is stretched over the full mesh. If texture coordinates are specified, there must be one texture - * coordinate for each vertex in the mesh. - * - * @param {Position[]} positions An array containing the mesh vertices. - * There must be no more than 65536 positions. Use [split]{@link TriangleMesh#split} to subdivide large meshes - * into smaller ones that fit this limit. - * @param {Number[]} indices An array of integers identifying the positions of each mesh triangle. - * Each sequence of three indices defines one triangle in the mesh. The indices identify the index of the - * position in the associated positions array. The indices for each triangle should be in counter-clockwise - * order to identify the triangles as front-facing. - * @param {ShapeAttributes} attributes The attributes to associate with this mesh. May be null, in which case - * default attributes are associated. - * - * @throws {ArgumentError} If the specified positions array is null, empty or undefined, the number of indices - * is less than 3 or too many positions are specified (limit is 65536). - */ -function TriangleMesh(positions, indices, attributes) { - if (!positions) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "constructor", "missingPositions")); - } - - if (positions.length < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "constructor", "missingPositions")); - } - - // Check for size limit, which is the max number of available indices for a 16-bit unsigned int. - if (positions.length > 65536) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "constructor", - "Too many positions. Must be fewer than 65537. Use TriangleMesh.split to split the shape.")); - } - - if (!indices) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "constructor", - "Indices array is null or undefined")); - } - - if (indices.length < 3) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "constructor", "Too few indices.")); - } - - AbstractMesh.call(this, attributes); - - // Private. Documentation is with the defined property below and the constructor description above. - this._positions = positions; - - // Private. Documentation is with the defined property below and the constructor description above. - this._indices = indices; - - this.referencePosition = this._positions[0]; -} - -TriangleMesh.prototype = Object.create(AbstractMesh.prototype); - -Object.defineProperties(TriangleMesh.prototype, { - /** - * This mesh's positions. - * - * @type {Position[]} - * @memberof TriangleMesh.prototype - */ - positions: { - get: function () { - return this._positions; - }, - set: function (positions) { - if (!positions) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "positions", "missingPositions")); - } - - this._positions = positions; - this.referencePosition = this._positions[0]; - this.reset(); - } - }, - - /** - * The mesh indices, an array of integers identifying the indexes of each triangle. Each index in this - * array identifies the index of the corresponding position in the [positions]{@link TriangleMesh#positions} - * array. Each group of three indices in this array identifies the positions of one triangle. - * - * - * @type {Number[]} - * @memberof TriangleMesh.prototype - */ - indices: { - get: function () { - return this._indices; - }, - set: function (indices) { - if (!indices) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "indices", - "Indices array is null or undefined")); - } - - this._indices = indices; - this.meshIndices = null; - this.reset(); - } - }, - - /** - * The mesh outline indices, an array of integers identifying the positions in the outline. Each index in - * this array identifies the index of the corresponding position in the - * [positions]{@link TriangleMesh#positions} array. The collection of these positions forms the outline - * of this mesh. May be null, in which case no outline is drawn. - * - * @type {Number[]} - * @default null - * @memberof TriangleMesh.prototype - */ - outlineIndices: { - get: function () { - return this._outlineIndices; - }, - set: function (indices) { - this._outlineIndices = indices; - this.meshOutlineIndices = null; - this.reset(); - } - }, - - /** - * This mesh's texture coordinates if this mesh is textured. A texture coordinate must be - * provided for each mesh position. Each texture coordinate is a {@link Vec2} containing the s and t - * coordinates, in that order. If no texture coordinates are specified then texture is not applied to - * this mesh. - * @type {Vec2[]} - * @default null - * @memberof TriangleMesh.prototype - */ - textureCoordinates: { - get: function () { - return this._textureCoordinates; - }, - set: function (coords) { - - if (coords && coords.length != this._positions.length) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TriangleMesh", "textureCoordinates", - "Number of texture coordinates is inconsistent with the currently specified positions.")); - } - - this._textureCoordinates = coords; - this.reset(); - this.texCoords = null; - } - } -}); - -// Overridden from AbstractShape base class. -TriangleMesh.prototype.createSurfaceShape = function () { - if (this._outlineIndices) { - var boundaries = []; - - for (var i = 0; i < this._outlineIndices.length; i++) { - boundaries.push(this._positions[this._outlineIndices[i]]); - } - - return new SurfacePolygon(boundaries, null); - } else { - return null; - } - -}; - -// Overridden from AbstractShape base class. -TriangleMesh.prototype.computeMeshPoints = function (dc, currentData) { - var eyeDistSquared = Number.MAX_VALUE, - eyePoint = dc.eyePoint, - meshPoints = new Float32Array(this._positions.length * 3), - pt = new Vec3(0, 0, 0), - k = 0, - pos, dSquared; - - for (var i = 0; i < this._positions.length; i++) { - pos = this._positions[i]; - - dc.surfacePointForMode(pos.latitude, pos.longitude, pos.altitude * this._altitudeScale, - this.altitudeMode, pt); - - dSquared = pt.distanceToSquared(eyePoint); - if (dSquared < eyeDistSquared) { - eyeDistSquared = dSquared; - } - - pt.subtract(this.currentData.referencePoint); - - meshPoints[k++] = pt[0]; - meshPoints[k++] = pt[1]; - meshPoints[k++] = pt[2]; - } - - currentData.eyeDistance = Math.sqrt(eyeDistSquared); - - return meshPoints; -}; - -// Overridden from AbstractShape base class. -TriangleMesh.prototype.computeTexCoords = function () { - - if (!this._textureCoordinates) { - return null; - } else { - // Capture the texture coordinates to a single array parallel to the mesh points array. - var texCoords = new Float32Array(2 * this._textureCoordinates.length), - k = 0; - - for (var i = 0, len = this._textureCoordinates.length; i < len; i++) { - var texCoord = this._textureCoordinates[i]; - - texCoords[k++] = texCoord[0]; - texCoords[k++] = texCoord[1]; - } - - return texCoords; - } -}; - -// Overridden from AbstractShape base class. -TriangleMesh.prototype.computeMeshIndices = function () { - var meshIndices = new Uint16Array(this._indices.length); - - for (var i = 0, len = this._indices.length; i < len; i++) { - meshIndices[i] = this._indices[i]; - } - - return meshIndices; -}; - -// Overridden from AbstractShape base class. -TriangleMesh.prototype.computeOutlineIndices = function () { - if (!this._outlineIndices) { - return null; - } else { - var meshOutlineIndices = new Uint16Array(this._outlineIndices.length); - - for (var i = 0; i < this._outlineIndices.length; i++) { - meshOutlineIndices[i] = this._outlineIndices[i]; - } - - return meshOutlineIndices; - } -}; - -/** - * Splits a triangle mesh into several meshes, each of which contains fewer than 65536 positions. - * @param {Position[]} positions An array containing the mesh vertices. - * @param {Number[]} indices An array of integers identifying the positions of each mesh triangle. - * Each sequence of three indices defines one triangle in the mesh. The indices identify the index of the - * position in the associated positions array. - * @param {Vec2[]} textureCoords The mesh's texture coordinates. - * @param {Number[]} outlineIndices The mesh's outline indices. - * @returns {Object[]} An array of objects, each of which defines one subdivision of the full mesh. Each object - * in the array has the properties of the same name as the input arguments. - */ -TriangleMesh.split = function (positions, indices, textureCoords, outlineIndices) { - var splitPositions = [], - splitTexCoords = [], - splitIndices = [], - indexMap = [], - result = [], - originalIndex, mappedIndex; - - for (var i = 0; i <= indices.length; i++) { - if (i === indices.length || splitPositions.length > 65533 && splitIndices.length % 3 === 0) { - if (splitPositions.length > 0) { - var shape = { - positions: splitPositions, - indices: splitIndices - }; - - if (textureCoords) { - shape.textureCoords = splitTexCoords; - } - - if (outlineIndices) { - var splitOutline = []; - for (var j = 0; j < outlineIndices.length; j++) { - originalIndex = outlineIndices[j]; - mappedIndex = indexMap[originalIndex]; - if (mappedIndex) { - splitOutline.push(indexMap[outlineIndices[j]]); - } - } - - shape.outlineIndices = splitOutline; - } - - result.push(shape); - } - - if (i === indices.length) { - break; - } - - splitPositions = []; - splitIndices = []; - indexMap = []; - } - - originalIndex = indices[i]; - mappedIndex = indexMap[originalIndex]; - - if (!mappedIndex) { - mappedIndex = splitPositions.length; - indexMap[originalIndex] = mappedIndex; - - splitPositions.push(positions[originalIndex]); - - if (textureCoords) { - splitTexCoords.push(textureCoords[originalIndex]); - } - } - - splitIndices.push(mappedIndex); - } - - return result; -}; - -export default TriangleMesh; diff --git a/web/src/gis/util/AbsentResourceList.js b/web/src/gis/util/AbsentResourceList.js deleted file mode 100644 index 5031c104..00000000 --- a/web/src/gis/util/AbsentResourceList.js +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports AbsentResourceList - */ - - - -/** - * Constructs an absent resource list. - * @alias AbsentResourceList - * @constructor - * @classdesc Provides a collection to keep track of resources whose retrieval failed and when retrieval - * may be tried again. Applications typically do not use this class directly. - * @param {Number} maxTrys The number of attempts to make before the resource is marked as absent. - * @param {Number} minCheckInterval The amount of time to wait between attempts, in milliseconds. - * @constructor - */ -function AbsentResourceList(maxTrys, minCheckInterval) { - - /** - * The number of attempts to make before the resource is marked as absent. - * @type {Number} - */ - this.maxTrys = maxTrys; - - /** - * The amount of time to wait before each attempt. - * @type {Number} - */ - this.minCheckInterval = minCheckInterval; - - /** - * The amount of time, in milliseconds, beyond which retrieval attempts should again be allowed. - * When this time has elapsed from the most recent failed attempt the number of trys attempted is - * reset to 0. This prevents the resource from being permanently blocked. - * @type {number} - * @default 60,000 milliseconds (one minute) - */ - this.tryAgainInterval = 60e3; // 60 seconds - - this.possiblyAbsent = {}; -} - -/** - * Indicates whether a specified resource is marked as absent. - * @param {String} resourceId The resource identifier. - * @returns {Boolean} true if the resource is marked as absent, otherwise false. - */ -AbsentResourceList.prototype.isResourceAbsent = function (resourceId) { - var entry = this.possiblyAbsent[resourceId]; - - if (!entry) { - return false; - } - - if (entry.permanent) { - return true; - } - - var timeSinceLastMark = Date.now() - entry.timeOfLastMark; - - if (timeSinceLastMark > this.tryAgainInterval) { - delete this.possiblyAbsent[resourceId]; - return false; - } - - return timeSinceLastMark < this.minCheckInterval || entry.numTrys > this.maxTrys; -}; - -/** - * Marks a resource attempt as having failed. This increments the number-of-tries counter and sets the time - * of the last attempt. When this method has been called [this.maxTrys]{@link AbsentResourceList#maxTrys} - * times the resource is marked as absent until this absent resource list's - * [try-again-interval]{@link AbsentResourceList#tryAgainInterval} is reached. - * @param {String} resourceId The resource identifier. - */ -AbsentResourceList.prototype.markResourceAbsent = function (resourceId) { - var entry = this.possiblyAbsent[resourceId]; - - if (!entry) { - entry = { - timeOfLastMark: Date.now(), - numTrys: 0 - }; - this.possiblyAbsent[resourceId] = entry; - } - - entry.numTrys = entry.numTrys + 1; - entry.timeOfLastMark = Date.now(); -}; - -/** - * Marks a resource attempt as having failed permanently. No attempt will ever again be made to retrieve - * the resource. - * @param {String} resourceId The resource identifier. - */ -AbsentResourceList.prototype.markResourceAbsentPermanently = function (resourceId) { - var entry = this.possiblyAbsent[resourceId]; - - if (!entry) { - entry = { - timeOfLastMark: Date.now(), - numTrys: 0 - }; - this.possiblyAbsent[resourceId] = entry; - } - - entry.numTrys = entry.numTrys + 1; - entry.timeOfLastMark = Date.now(); - entry.permanent = true; -}; - -/** - * Removes the specified resource from this absent resource list. Call this method when retrieval attempts - * succeed. - * @param {String} resourceId The resource identifier. - */ -AbsentResourceList.prototype.unmarkResourceAbsent = function (resourceId) { - var entry = this.possiblyAbsent[resourceId]; - - if (entry) { - delete this.possiblyAbsent[resourceId]; - } -}; - -export default AbsentResourceList; diff --git a/web/src/gis/util/Color.js b/web/src/gis/util/Color.js deleted file mode 100644 index be539eb9..00000000 --- a/web/src/gis/util/Color.js +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Color - */ -import Logger from '../util/Logger'; - - -/** - * Constructs a color from red, green, blue and alpha values. - * @alias Color - * @constructor - * @classdesc Represents a red, green, blue, alpha, color. - * @param {Number} red The red component, a number between 0 and 1. - * @param {Number} green The green component, a number between 0 and 1. - * @param {Number} blue The blue component, a number between 0 and 1. - * @param {Number} alpha The alpha component, a number between 0 and 1. - */ -function Color(red, green, blue, alpha) { - - /** - * This color's red component, a number between 0 and 1. - * @type {Number} - */ - this.red = red; - - /** - * This color's green component, a number between 0 and 1. - * @type {Number} - */ - this.green = green; - - /** - * This color's blue component, a number between 0 and 1. - * @type {Number} - */ - this.blue = blue; - - /** - * This color's alpha component, a number between 0 and 1. - * @type {Number} - */ - this.alpha = alpha; -} - -/** - * The color white. - * @type {Color} - * @constant - */ -Color.WHITE = new Color(1, 1, 1, 1); - -/** - * The color black. - * @type {Color} - * @constant - */ -Color.BLACK = new Color(0, 0, 0, 1); - -/** - * The color red. - * @type {Color} - * @constant - */ -Color.RED = new Color(1, 0, 0, 1); - -/** - * The color green. - * @type {Color} - * @constant - */ -Color.GREEN = new Color(0, 1, 0, 1); - -/** - * The color blue. - * @type {Color} - * @constant - */ -Color.BLUE = new Color(0, 0, 1, 1); - -/** - * The color cyan. - * @type {Color} - * @constant - */ -Color.CYAN = new Color(0, 1, 1, 1); - -/** - * The color yellow. - * @type {Color} - * @constant - */ -Color.YELLOW = new Color(1, 1, 0, 1); - -/** - * The color magenta. - * @type {Color} - * @constant - */ -Color.MAGENTA = new Color(1, 0, 1, 1); - -/** - * A light gray (75% white). - * @type {Color} - */ -Color.LIGHT_GRAY = new Color(0.75, 0.75, 0.75, 1); - -/** - * A medium gray (50% white). - * @type {Color} - */ -Color.MEDIUM_GRAY = new Color(0.5, 0.5, 0.5, 1); - -/** - * A dark gray (25% white). - * @type {Color} - */ -Color.DARK_GRAY = new Color(0.25, 0.25, 0.25, 1); - -/** - * A transparent color. - * @type {Color} - */ -Color.TRANSPARENT = new Color(0, 0, 0, 0); - -/** - * Assigns the components of this color. - * @param {Number} red The red component, a number between 0 and 1. - * @param {Number} green The green component, a number between 0 and 1. - * @param {Number} blue The blue component, a number between 0 and 1. - * @param {Number} alpha The alpha component, a number between 0 and 1. - * @returns {Color} This color with the specified components assigned. - */ -Color.prototype.set = function (red, green, blue, alpha) { - this.red = red; - this.green = green; - this.blue = blue; - this.alpha = alpha; - - return this; -}; - -/** - * Copies the components of a specified color to this color. - * @param {Color} color The color to copy. - * @returns {Color} This color set to the red, green, blue and alpha values of the specified color. - * @throws {ArgumentError} If the specified color is null or undefined. - */ -Color.prototype.copy = function (color) { - if (!color) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Color", "copy", "missingColor")); - } - - this.red = color.red; - this.green = color.green; - this.blue = color.blue; - this.alpha = color.alpha; - - return this; -}; - -/** - * Create a copy of this color. - * @returns {Color} A new instance containing the color components of this color. - */ -Color.prototype.clone = function () { - return new Color(this.red, this.green, this.blue, this.alpha); -}; - -/** - * Returns this color's components premultiplied by this color's alpha component. - * @param {Float32Array} array A pre-allocated array in which to return the color components. - * @returns {Float32Array} This colors premultiplied components as an array, in the order RGBA. - */ -Color.prototype.premultipliedComponents = function (array) { - var a = this.alpha; - - array[0] = this.red * a; - array[1] = this.green * a; - array[2] = this.blue * a; - array[3] = a; - - return array; -}; - -/** - * Construct a color from an array of color components expressed as byte values. - * @param {Uint8Array} bytes A four-element array containing the red, green, blue and alpha color - * components each in the range [0, 255]; - * @returns {Color} The constructed color. - */ -Color.colorFromByteArray = function (bytes) { - return new Color(bytes[0] / 255, bytes[1] / 255, bytes[2] / 255, bytes[3] / 255); -}; - -/** - * Construct a color from specified color components expressed as byte values. - * @param {number} redByte The red component in the range [0, 255]. - * @param {number} greenByte The green component in the range [0, 255]. - * @param {number} blueByte The blue component in the range [0, 255]. - * @param {number} alphaByte The alpha component in the range [0, 255]. - * @returns {Color} The constructed color. - */ -Color.colorFromBytes = function (redByte, greenByte, blueByte, alphaByte) { - return new Color(redByte / 255, greenByte / 255, blueByte / 255, alphaByte / 255); -}; - -Color.colorFromHex = function (color) { - var red = parseInt(color.substring(0, 2), 16); - var green = parseInt(color.substring(2, 4), 16); - var blue = parseInt(color.substring(4, 6), 16); - var alpha = parseInt(color.substring(6, 8), 16); - return Color.colorFromBytes(red, green, blue, alpha); -}; - -Color.colorFromKmlHex = function (color) { - var alpha = parseInt(color.substring(0, 2), 16); - var blue = parseInt(color.substring(2, 4), 16); - var green = parseInt(color.substring(4, 6), 16); - var red = parseInt(color.substring(6, 8), 16); - return Color.colorFromBytes(red, green, blue, alpha); -}; - -/** - * Computes and sets this color to the next higher RBG color. If the color overflows, this color is set to - * (1 / 255, 0, 0, *), where * indicates the current alpha value. - * @returns {Color} This color, set to the next possible color. - */ -Color.prototype.nextColor = function () { - var rb = Math.round(this.red * 255), - gb = Math.round(this.green * 255), - bb = Math.round(this.blue * 255); - - if (rb < 255) { - this.red = (rb + 1) / 255; - } else if (gb < 255) { - this.red = 0; - this.green = (gb + 1) / 255; - } else if (bb < 255) { - this.red = 0; - this.green = 0; - this.blue = (bb + 1) / 255; - } else { - this.red = 1 / 255; - this.green = 0; - this.blue = 0; - } - - return this; -}; - -/** - * Indicates whether this color is equal to a specified color after converting the floating-point component - * values of each color to byte values. - * @param {Color} color The color to test, - * @returns {Boolean} true if the colors are equal, otherwise false. - */ -Color.prototype.equals = function (color) { - var rbA = Math.round(this.red * 255), - gbA = Math.round(this.green * 255), - bbA = Math.round(this.blue * 255), - abA = Math.round(this.alpha * 255), - rbB = Math.round(color.red * 255), - gbB = Math.round(color.green * 255), - bbB = Math.round(color.blue * 255), - abB = Math.round(color.alpha * 255); - - return rbA === rbB && gbA === gbB && bbA === bbB && abA === abB; -}; - -/** - * Indicates whether this color is equal to another color expressed as an array of bytes. - * @param {Uint8Array} bytes The red, green, blue and alpha color components. - * @returns {Boolean} true if the colors are equal, otherwise false. - */ -Color.prototype.equalsBytes = function (bytes) { - var rb = Math.round(this.red * 255), - gb = Math.round(this.green * 255), - bb = Math.round(this.blue * 255), - ab = Math.round(this.alpha * 255); - - return rb === bytes[0] && gb === bytes[1] && bb === bytes[2] && ab === bytes[3]; -}; - -/** - * Returns a string representation of this color, indicating the byte values corresponding to this color's - * floating-point component values. - * @returns {String} - */ -Color.prototype.toByteString = function () { - var rb = Math.round(this.red * 255), - gb = Math.round(this.green * 255), - bb = Math.round(this.blue * 255), - ab = Math.round(this.alpha * 255); - - return "(" + rb + "," + gb + "," + bb + "," + ab + ")"; -}; - -/** - * Create a hex color string that CSS can use. Optionally, inhibit capturing alpha, - * because some uses reject a four-component color specification. - * @param {Boolean} isUsingAlpha Enable the use of an alpha component. - * @returns {string} A color string suitable for CSS. - * @deprecated since version 0.10.0, use toCssColorString for valid CSS color strings - */ -Color.prototype.toHexString = function (isUsingAlpha) { - // Use Math.ceil() to get 0.75 to map to 0xc0. This is important if the display is dithering. - var redHex = Math.ceil(this.red * 255).toString(16), - greenHex = Math.ceil(this.green * 255).toString(16), - blueHex = Math.ceil(this.blue * 255).toString(16), - alphaHex = Math.ceil(this.alpha * 255).toString(16); - - var result = "#"; - result += redHex.length < 2 ? '0' + redHex : redHex; - result += greenHex.length < 2 ? '0' + greenHex : greenHex; - result += blueHex.length < 2 ? '0' + blueHex : blueHex; - if (isUsingAlpha) { - result += alphaHex.length < 2 ? '0' + alphaHex : alphaHex; - } - - return result; -}; - -/** - * Create a rgba color string that conforms to CSS Color Module Level 3 specification. - * @returns {string} A color string suitable for CSS. - */ -Color.prototype.toCssColorString = function () { - var red = Math.round(this.red * 255), - green = Math.round(this.green * 255), - blue = Math.round(this.blue * 255); - - // Per the CSS Color Module Level 3 specification, alpha is expressed as floating point value between 0 - 1 - return 'rgba(' + red + ', ' + green + ', ' + blue + ', ' + this.alpha + ')'; -}; - -export default Color; - diff --git a/web/src/gis/util/Font.js b/web/src/gis/util/Font.js deleted file mode 100644 index 7284da02..00000000 --- a/web/src/gis/util/Font.js +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Font - */ -import ArgumentError from '../error/ArgumentError'; -import Color from '../util/Color'; -import Logger from '../util/Logger'; - - -/** - * Construct a font descriptor. See the individual attribute descriptions below for possible parameter values. - * @param {Number} size The size of font. - * @param {String} style The style of the font. - * @param {String} variant The variant of the font. - * @param {String} weight The weight of the font. - * @param {String} family The family of the font. - * @param {String} horizontalAlignment The vertical alignment of the font. - * @alias Font - * @constructor - * @classdesc Holds attributes controlling the style, size and other attributes of {@link Text} shapes and - * the textual features of {@link Placemark} and other shapes. The values used for these attributes are those - * defined by the [CSS Font property]{@link http://www.w3schools.com/cssref/pr_font_font.asp}. - */ -function Font(size, style, variant, weight, family, horizontalAlignment) { - /* - * All properties of Font are intended to be private and must be accessed via public getters and setters. - */ - - if (!size) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Font", "constructor", - "missingSize")); - } - else if (size <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "Font", "constructor", - "invalidSize")); - } - else { - this._size = size; - } - - this.style = style || "normal"; - this.variant = variant || "normal"; - this.weight = weight || "normal"; - this.family = family || "sans-serif"; - this.horizontalAlignment = horizontalAlignment || "center"; -} - -Object.defineProperties(Font.prototype, { - /** - * The font size. - * @memberof Font.prototype - * @type Number - */ - size: { - get: function () { - return this._size; - }, - set: function (value) { - this._fontString = null; - this._size = value; - } - }, - /** - * The font style. - * See [CSS font-style]{@link http://www.w3schools.com/cssref/pr_font_font-style.asp} for defined values. - * @memberof Font.prototype - * @type {String} - * @default "normal" - */ - style: { - get: function () { - return this._style; - }, - set: function (value) { - this._fontString = null; - this._style = value; - } - }, - /** - * The font variant. - * See [CSS font-variant]{@link http://www.w3schools.com/cssref/pr_font_font-variant.asp} for defined values. - * @memberof Font.prototype - * @type {String} - * @default "normal" - */ - variant: { - get: function () { - return this._variant; - }, - set: function (value) { - this._fontString = null; - this._variant = value; - } - }, - /** - * The font weight. - * See [CSS font-weight]{@link http://www.w3schools.com/cssref/pr_font_weight.asp} for defined values. - * @memberof Font.prototype - * @type {String} - * @default "normal" - */ - weight: { - get: function () { - return this._weight; - }, - set: function (value) { - this._fontString = null; - this._weight = value; - } - }, - /** - * The font family. - * See [CSS font-family]{@link http://www.w3schools.com/cssref/pr_font_font-family.asp} for defined values. - * @memberof Font.prototype - * @type {String} - * @default "sans-serif" - */ - family: { - get: function () { - return this._family; - }, - set: function (value) { - this._fontString = null; - this._family = value; - } - }, - /** - * The horizontal alignment of the font. - * Recognized values are "left", "center" and "right". - * @memberof Font.prototype - * @type {String} - * @default "center" - */ - horizontalAlignment: { - get: function () { - return this._horizontalAlignment; - }, - set: function (value) { - this._toString = null; - this._horizontalAlignment = value; - } - }, - - /** - * A string representing this font's style, weight, size and family properties, suitable for - * passing directly to a 2D canvas context. - * @memberof Font.prototype - */ - fontString: { - get: function () { - if (!this._fontString) { - this._fontString = - this._style + " " + - this.variant + " " + - this._weight + " " + - this._size.toString() + "px " + - this._family; - } - return this._fontString; - } - } -}); - -/** - * Returns a string representation of this object. - * @returns {String} A string representation of this object. - */ -Font.prototype.toString = function () { - if (!this._toString || !this._fontString) { - this._toString = this.fontString + " " + this.horizontalAlignment; - } - return this._toString; -}; - -export default Font; diff --git a/web/src/gis/util/FrameStatistics.js b/web/src/gis/util/FrameStatistics.js deleted file mode 100644 index 93b30b67..00000000 --- a/web/src/gis/util/FrameStatistics.js +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports FrameStatistics - */ - - - -/** - * Constructs a performance statistics instance. This is performed internally by the {@link WorldWindow}. - * Applications do not construct instances of this class. - * @alias FrameStatistics - * @constructor - * @classdesc Captures performance statistics. - */ -function FrameStatistics() { - - // Internal: intentionally not documented - this.frameCount = 0; - - // Internal: intentionally not documented - this.frameTimeCumulative = 0; - - // Internal: intentionally not documented - this.frameTimeBase = 0; - - // Internal: intentionally not documented - this.frameTimeExtremes = [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]; - - /** - * The number of milliseconds required to render the most recent frame. - * @type {Number} - */ - this.frameTime = 0; - - /** - * The number of milliseconds spent tessellating the terrain during the most recent frame. - * @type {Number} - */ - this.tessellationTime = 0; - - /** - * The number of milliseconds spent rendering the active layers during the most recent frame. - * @type {Number} - */ - this.layerRenderingTime = 0; - - /** - * The number of milliseconds spent rendering ordered renderables during the most recent frame. - * @type {Number} - */ - this.orderedRenderingTime = 0; - - /** - * The number of terrain tiles in the most recent frame. - * @type {Number} - */ - this.terrainTileCount = 0; - - /** - * The number of image tiles in the most recent frame. - * @type {Number} - */ - this.imageTileCount = 0; - - /** - * The number of terrain tile renderings. Since terrain tiles are generally rendered more than once per - * frame, this count will be greater than the number of terrain tiles created for the frame. - * @type {Number} - */ - this.renderedTileCount = 0; - - /** - * The number of calls to [Tile.update()]{@link Tile#update} during the most recent frame. - * @type {Number} - */ - this.tileUpdateCount = 0; - - /** - * The number of texture bind calls during the most recent frame. - * @type {Number} - */ - this.textureLoadCount = 0; - - /** - * The number of WebGL VBO loads during the most recent frame. - * @type {Number} - */ - this.vboLoadCount = 0; - - /** - * The average frame time over the most recent two seconds. - * @type {Number} - */ - this.frameTimeAverage = 0; - - /** - * The average frame rate over the most recent two seconds. - * @type {Number} - */ - this.frameRateAverage = 0; - - /** - * The minimum frame time over the most recent two seconds. - * @type {Number} - */ - this.frameTimeMin = 0; - - /** - * The maximum frame time over the most recent two seconds. - * @type {Number} - */ - this.frameTimeMax = 0; -} - -/** - * Initializes this frame statistics with initial values. - */ -FrameStatistics.prototype.beginFrame = function () { - this.frameTime = Date.now(); - this.tessellationTime = 0; - this.layerRenderingTime = 0; - this.orderedRenderingTime = 0; - this.terrainTileCount = 0; - this.imageTileCount = 0; - this.renderedTileCount = 0; - this.tileUpdateCount = 0; - this.textureLoadCount = 0; - this.vboLoadCount = 0; - - ++this.frameCount; -}; - -/** - * Computes the statistics for the most recent frame. - */ -FrameStatistics.prototype.endFrame = function () { - var now = Date.now(); - this.frameTime = now - this.frameTime; - this.frameTimeCumulative += this.frameTime; - this.frameTimeExtremes[0] = Math.min(this.frameTimeExtremes[0], this.frameTime); - this.frameTimeExtremes[1] = Math.max(this.frameTimeExtremes[1], this.frameTime); - - // Compute averages every 2 seconds. - if (now - this.frameTimeBase > 2000) { - this.frameTimeAverage = this.frameTimeCumulative / this.frameCount; - this.frameRateAverage = 1000 * this.frameCount / (now - this.frameTimeBase); - this.frameTimeMin = this.frameTimeExtremes[0]; - this.frameTimeMax = this.frameTimeExtremes[1]; - this.frameCount = 0; - this.frameTimeCumulative = 0; - this.frameTimeBase = now; - this.frameTimeExtremes = [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]; - //console.log(this.frameTimeAverage.toString() + ", " + this.frameRateAverage.toString()); - } -}; - -/** - * Increments the rendered tile count. - * @param {Number} tileCount The amount to increment the counter. - */ -FrameStatistics.prototype.incrementRenderedTileCount = function (tileCount) { - this.renderedTileCount += tileCount; -}; - -/** - * Sets the terrain tile count. - * @param {Number} tileCount The amount to set the counter to. - */ -FrameStatistics.prototype.setTerrainTileCount = function (tileCount) { - this.terrainTileCount = tileCount; -}; - -/** - * Increments the image tile count. - * @param {Number} tileCount The amount to increment the counter. - */ -FrameStatistics.prototype.incrementImageTileCount = function (tileCount) { - this.imageTileCount = tileCount; -}; - -/** - * Increments the tile update count. - * @param {Number} count The amount to increment the counter. - */ -FrameStatistics.prototype.incrementTileUpdateCount = function (count) { - this.tileUpdateCount += count; -}; - -/** - * Increments the texture load count. - * @param {Number} count The amount to increment the counter. - */ -FrameStatistics.prototype.incrementTextureLoadCount = function (count) { - this.textureLoadCount += count; -}; - -/** - * Increments the VBO load count. - * @param {Number} count The amount to increment the counter. - */ -FrameStatistics.prototype.incrementVboLoadCount = function (count) { - this.vboLoadCount += count; -}; - -export default FrameStatistics; diff --git a/web/src/gis/util/GoToAnimator.js b/web/src/gis/util/GoToAnimator.js deleted file mode 100644 index d0a13568..00000000 --- a/web/src/gis/util/GoToAnimator.js +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports GoToAnimator - */ -import Location from '../geom/Location'; -import Logger from '../util/Logger'; -import Position from '../geom/Position'; -import Vec3 from '../geom/Vec3'; - -/** - * Constructs a GoTo animator. - * @alias GoToAnimator - * @constructor - * @classdesc Incrementally and smoothly moves a {@link Navigator} to a specified position. - * @param {WorldWindow} worldWindow The WorldWindow in which to perform the animation. - * @throws {ArgumentError} If the specified WorldWindow is null or undefined. - */ -function GoToAnimator(worldWindow) { - if (!worldWindow) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GoToAnimator", "constructor", - "missingWorldWindow")); - } - - /** - * The WorldWindow associated with this animator. - * @type {WorldWindow} - * @readonly - */ - this.wwd = worldWindow; - - /** - * The frequency in milliseconds at which to animate the position change. - * @type {Number} - * @default 20 - */ - this.animationFrequency = 20; - - /** - * The animation's duration, in milliseconds. When the distance is short, less than twice the viewport - * size, the travel time is reduced proportionally to the distance to travel. It therefore takes less - * time to move shorter distances. - * @type {Number} - * @default 3000 - */ - this.travelTime = 3000; - - /** - * Indicates whether the current or most recent animation has been cancelled. Use the cancel() function - * to cancel an animation. - * @type {Boolean} - * @default false - * @readonly - */ - this.cancelled = false; -} - -// Stop the current animation. -GoToAnimator.prototype.cancel = function () { - this.cancelled = true; -}; - -/** - * Moves the navigator to a specified location or position. - * @param {Location | Position} position The location or position to move the navigator to. If this - * argument contains an "altitude" property, as {@link Position} does, the end point of the navigation is - * at the specified altitude. Otherwise the end point is at the current altitude of the navigator. - * @param {Function} completionCallback If not null or undefined, specifies a function to call when the - * animation completes. The completion callback is called with a single argument, this animator. - * @throws {ArgumentError} If the specified location or position is null or undefined. - */ -GoToAnimator.prototype.goTo = function (position, completionCallback) { - if (!position) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "GoToAnimator", "goTo", - "missingPosition")); - } - - this.completionCallback = completionCallback; - - // Reset the cancellation flag. - this.cancelled = false; - - // Capture the target position and determine its altitude. - this.targetPosition = new Position(position.latitude, position.longitude, - position.altitude || this.wwd.navigator.range); - - // Capture the start position and start time. - this.startPosition = new Position( - this.wwd.navigator.lookAtLocation.latitude, - this.wwd.navigator.lookAtLocation.longitude, - this.wwd.navigator.range); - this.startTime = Date.now(); - - // Determination of the pan and range velocities requires the distance to be travelled. - var animationDuration = this.travelTime, - panDistance = Location.greatCircleDistance(this.startPosition, this.targetPosition), - rangeDistance; - - // Determine how high we need to go to give the user context. The max altitude computed is approximately - // that needed to fit the start and end positions in the same viewport assuming a 45 degree field of view. - var pA = this.wwd.globe.computePointFromLocation( - this.startPosition.latitude, this.startPosition.longitude, new Vec3(0, 0, 0)), - pB = this.wwd.globe.computePointFromLocation( - this.targetPosition.latitude, this.targetPosition.longitude, new Vec3(0, 0, 0)); - this.maxAltitude = pA.distanceTo(pB); - - // Determine an approximate viewport size in radians in order to determine whether we actually change - // the range as we pan to the new location. We don't want to change the range if the distance between - // the start and target positions is small relative to the current viewport. - var viewportSize = this.wwd.pixelSizeAtDistance(this.startPosition.altitude) - * this.wwd.canvas.clientWidth / this.wwd.globe.equatorialRadius; - - if (panDistance <= 2 * viewportSize) { - // Start and target positions are close, so don't back out. - this.maxAltitude = this.startPosition.altitude; - } - - // We need to capture the time the max altitude is reached in order to begin decreasing the range - // midway through the animation. If we're already above the max altitude, then that time is now since - // we don't back out if the current altitude is above the computed max altitude. - this.maxAltitudeReachedTime = this.maxAltitude <= this.wwd.navigator.range ? Date.now() : null; - - // Compute the total range to travel since we need that to compute the range velocity. - // Note that the range velocity and pan velocity are computed so that the respective animations, which - // operate independently, finish at the same time. - if (this.maxAltitude > this.startPosition.altitude) { - rangeDistance = Math.max(0, this.maxAltitude - this.startPosition.altitude); - rangeDistance += Math.abs(this.targetPosition.altitude - this.maxAltitude); - } else { - rangeDistance = Math.abs(this.targetPosition.altitude - this.startPosition.altitude); - } - - // Determine which distance governs the animation duration. - var animationDistance = Math.max(panDistance, rangeDistance / this.wwd.globe.equatorialRadius); - if (animationDistance === 0) { - return; // current and target positions are the same - } - - if (animationDistance < 2 * viewportSize) { - // Start and target positions are close, so reduce the travel time based on the - // distance to travel relative to the viewport size. - animationDuration = Math.min(animationDistance / viewportSize * this.travelTime, this.travelTime); - } - - // Don't let the animation duration go to 0. - animationDuration = Math.max(1, animationDuration); - - // Determine the pan velocity, in radians per millisecond. - this.panVelocity = panDistance / animationDuration; - - // Determine the range velocity, in meters per millisecond. - this.rangeVelocity = rangeDistance / animationDuration; // meters per millisecond - - // Set up the animation timer. - var thisAnimator = this; - var timerCallback = function () { - if (thisAnimator.cancelled) { - if (thisAnimator.completionCallback) { - thisAnimator.completionCallback(thisAnimator); - } - return; - } - - if (thisAnimator.update()) { - setTimeout(timerCallback, thisAnimator.animationFrequency); - } else if (thisAnimator.completionCallback) { - thisAnimator.completionCallback(thisAnimator); - } - }; - setTimeout(timerCallback, this.animationFrequency); // invoke it the first time -}; - -// Intentionally not documented. -GoToAnimator.prototype.update = function () { - // This is the timer callback function. It invokes the range animator and the pan animator. - - var currentPosition = new Position( - this.wwd.navigator.lookAtLocation.latitude, - this.wwd.navigator.lookAtLocation.longitude, - this.wwd.navigator.range); - - var continueAnimation = this.updateRange(currentPosition); - continueAnimation = this.updateLocation(currentPosition) || continueAnimation; - - this.wwd.redraw(); - - return continueAnimation; -}; - -// Intentionally not documented. -GoToAnimator.prototype.updateRange = function (currentPosition) { - // This function animates the range. - var continueAnimation = false, - nextRange, elapsedTime; - - // If we haven't reached the maximum altitude, then step-wise increase it. Otherwise step-wise change - // the range towards the target altitude. - if (!this.maxAltitudeReachedTime) { - elapsedTime = Date.now() - this.startTime; - nextRange = Math.min(this.startPosition.altitude + this.rangeVelocity * elapsedTime, this.maxAltitude); - // We're done if we get withing 1 meter of the desired range. - if (Math.abs(this.wwd.navigator.range - nextRange) < 1) { - this.maxAltitudeReachedTime = Date.now(); - } - this.wwd.navigator.range = nextRange; - continueAnimation = true; - } else { - elapsedTime = Date.now() - this.maxAltitudeReachedTime; - if (this.maxAltitude > this.targetPosition.altitude) { - nextRange = this.maxAltitude - this.rangeVelocity * elapsedTime; - nextRange = Math.max(nextRange, this.targetPosition.altitude); - } else { - nextRange = this.maxAltitude + this.rangeVelocity * elapsedTime; - nextRange = Math.min(nextRange, this.targetPosition.altitude); - } - this.wwd.navigator.range = nextRange; - // We're done if we get withing 1 meter of the desired range. - continueAnimation = Math.abs(this.wwd.navigator.range - this.targetPosition.altitude) > 1; - } - - return continueAnimation; -}; - -// Intentionally not documented. -GoToAnimator.prototype.updateLocation = function (currentPosition) { - // This function animates the pan to the desired location. - var elapsedTime = Date.now() - this.startTime, - distanceTravelled = Location.greatCircleDistance(this.startPosition, currentPosition), - distanceRemaining = Location.greatCircleDistance(currentPosition, this.targetPosition), - azimuthToTarget = Location.greatCircleAzimuth(currentPosition, this.targetPosition), - distanceForNow = this.panVelocity * elapsedTime, - nextDistance = Math.min(distanceForNow - distanceTravelled, distanceRemaining), - nextLocation = Location.greatCircleLocation(currentPosition, azimuthToTarget, nextDistance, - new Location(0, 0)), - locationReached = false; - - this.wwd.navigator.lookAtLocation.latitude = nextLocation.latitude; - this.wwd.navigator.lookAtLocation.longitude = nextLocation.longitude; - - // We're done if we're within a meter of the desired location. - if (nextDistance < 1 / this.wwd.globe.equatorialRadius) { - locationReached = true; - } - - return !locationReached; -}; - -export default GoToAnimator; diff --git a/web/src/gis/util/HashMap.js b/web/src/gis/util/HashMap.js deleted file mode 100644 index 346310d6..00000000 --- a/web/src/gis/util/HashMap.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports HashMap - */ - - - -/** - * Constructs a hash map. - * @alias HashMap - * @constructor - */ -function HashMap() { - this._entries = Object.create(null); -} - -/** - * Returns the stored value for this key or undefined - * @param{String | Number} key - * @returns the value for the specified key or undefined - */ -HashMap.prototype.get = function (key) { - return this._entries[key]; -}; - -/** - * Stores a value for a specified key - * @param{String | Number} key - * @param value a value to store for the specified key - */ -HashMap.prototype.set = function (key, value) { - this._entries[key] = value; -}; - -/** - * Removes the value and key for a specified key - * @param{String | Number} key - */ -HashMap.prototype.remove = function (key) { - delete this._entries[key]; -}; - -/** - * Indicates if the has map contains a key - * @param{String | Number} key - * @returns {Boolean} - */ -HashMap.prototype.contains = function (key) { - return key in this._entries; -}; - -/** - * Internal. Applications should call this function - * Creates a new HashMap with the same values as the original but increased indexes. - * The keys are used as indexes and are assumed to be natural numbers. - * Used by the PolygonSplitter. - * @param{HashMap} hashMap the hash map to re-index - * @param{Number} fromIndex the index from with to start reindexing - * @param{Number} amount the amount by which to increase the index - * @returns {HashMap} a new has map with re-indexed keys - */ -HashMap.reIndex = function (hashMap, fromIndex, amount) { - var newHashMap = new HashMap(); - for (var key in hashMap._entries) { - var index = parseInt(key); - if (index >= fromIndex) { - index += amount; - } - var entry = hashMap.get(key); - entry.index = index; - newHashMap.set(index, entry); - } - return newHashMap; -}; - -export default HashMap; diff --git a/web/src/gis/util/ImageSource.js b/web/src/gis/util/ImageSource.js deleted file mode 100644 index 629c108c..00000000 --- a/web/src/gis/util/ImageSource.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports ImageSource - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs an image source. - * @alias ImageSource - * @constructor - * @classdesc Holds an Image with an associated key that uniquely identifies that image. The key is - * automatically generated but may be reassigned after construction. Instances of this class are used to - * specify dynamically created image sources for {@link Placemark}, {@link SurfaceImage}, - * {@link Polygon} textures and other shapes that display imagery. - * @param {Image} image The image for this image source. - * @throws {ArgumentError} If the specified image is null or undefined. - */ -function ImageSource(image) { - if (!image) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "ImageSource", "constructor", - "missingImage")); - } - - /** - * This image source's image - * @type {Image} - * @readonly - */ - this.image = image; - - /** - * This image source's key. A unique key is automatically generated and assigned during construction. - * Applications may assign a different key after construction. - * @type {String} - * @default A unique string for this image source. - */ - this.key = "ImageSource " + ++ImageSource.keyPool; -} - -// Internal. Intentionally not documented. -ImageSource.keyPool = 0; // source of unique ids - -export default ImageSource; diff --git a/web/src/gis/util/Insets.js b/web/src/gis/util/Insets.js deleted file mode 100644 index 51e00c17..00000000 --- a/web/src/gis/util/Insets.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs an Insets object that is a representation of the borders of a container. - * It specifies the space that a container must leave at each of its edges. - * @alias Insets - * @param {Number} top The inset from the top. - * @param {Number} left The inset from the left. - * @param {Number} bottom The inset from the bottom. - * @param {Number} right The inset from the right. - * @constructor - */ -function Insets(top, left, bottom, right) { - - if (arguments.length !== 4) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Insets", "constructor", "invalidArgumentCount")); - } - - // These are all documented with their property accessors below. - this._top = top; - this._left = left; - this._bottom = bottom; - this._right = right; -} - -/** - * Set top, left, bottom, and right to the specified values. - * @param {Number} top The inset from the top. - * @param {Number} left The inset from the left. - * @param {Number} bottom The inset from the bottom. - * @param {Number} right The inset from the right. - */ -Insets.prototype.set = function (top, left, bottom, right) { - this._top = top; - this._left = left; - this._bottom = bottom; - this._right = right; -}; - -/** - * Creates a new copy of this insets with identical property values. - * @returns {Insets} A new insets instance with its property values the same as this one's. - */ -Insets.prototype.clone = function () { - return new Insets(this._top, this._left, this._bottom, this._right); -}; - -/** - * Returns a string representation of this object. - * @returns {String} A string representation of this object. - */ -Insets.prototype.toString = function () { - return this._top + " " + this._left + " " + this._bottom + " " + this._right; -}; - -Object.defineProperties(Insets.prototype, { - - /** - * Indicates the the inset from the top. - * @type {Number} - * @memberof Insets.prototype - */ - top: { - get: function () { - return this._top; - }, - set: function (value) { - this._top = value; - } - }, - - /** - * Indicates the the inset from the left. - * @type {Number} - * @memberof Insets.prototype - */ - left: { - get: function () { - return this._left; - }, - set: function (value) { - this._left = value; - } - }, - - /** - * Indicates the the inset from the bottom. - * @type {Number} - * @memberof Insets.prototype - */ - bottom: { - get: function () { - return this._bottom; - }, - set: function (value) { - this._bottom = value; - } - }, - - /** - * Indicates the the inset from the right. - * @type {Number} - * @memberof Insets.prototype - */ - right: { - get: function () { - return this._right; - }, - set: function (value) { - this._right = value; - } - } - -}); - -export default Insets; diff --git a/web/src/gis/util/Level.js b/web/src/gis/util/Level.js deleted file mode 100644 index 33e7bb54..00000000 --- a/web/src/gis/util/Level.js +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Level - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs a Level within a [LevelSet]{@link LevelSet}. Applications typically do not interact with this - * class. - * @alias Level - * @constructor - * @classdesc Represents a level in a tile pyramid. - * @throws {ArgumentError} If either the specified tile delta or parent level set is null or undefined. - */ -function Level(levelNumber, tileDelta, parent) { - if (!tileDelta) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Level", "constructor", - "The specified tile delta is null or undefined")); - } - - if (!parent) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Level", "constructor", - "The specified parent level set is null or undefined")); - } - - /** - * The level's ordinal in its parent level set. - * @type {Number} - */ - this.levelNumber = levelNumber; - - /** - * The geographic size of tiles within this level. - * @type {Location} - */ - this.tileDelta = tileDelta; - - /** - * The level set that this level is a member of. - * @type {LevelSet} - */ - this.parent = parent; - - /** - * The size of pixels or elevation cells within this level, in radians per pixel or per cell. - * @type {Number} - */ - this.texelSize = tileDelta.latitude * Angle.DEGREES_TO_RADIANS / parent.tileHeight; - - /** - * The width in pixels or cells of the resource associated with tiles within this level. - * @type {Number} - */ - this.tileWidth = parent.tileWidth; - - /** - * The height in pixels or cells of the resource associated with tiles within this level. - * @type {Number} - */ - this.tileHeight = parent.tileHeight; - - /** - * The sector spanned by this level. - * @type {Sector} - */ - this.sector = parent.sector; -} - -/** - * Indicates whether this level is the lowest resolution level (level 0) within its parent's level set. - * @returns {Boolean} true If this tile is the lowest resolution in the parent level set, - * otherwise false. - */ -Level.prototype.isFirstLevel = function () { - return this.parent.firstLevel() == this; -}; - -/** - * Indicates whether this level is the highest resolution level within its parent's level set. - * @returns {Boolean} true If this tile is the highest resolution in the parent level set, - * otherwise false. - */ -Level.prototype.isLastLevel = function () { - return this.parent.lastLevel() == this; -}; - -/** - * Returns the level whose ordinal occurs immediately before this level's ordinal in the parent level set, or - * null if this is the fist level. - * @returns {Level} The previous level, or null if this is the first level. - */ -Level.prototype.previousLevel = function () { - return this.parent.level(this.levelNumber - 1); -}; - -/** - * Returns the level whose ordinal occurs immediately after this level's ordinal in the parent level set, or - * null if this is the last level. - * @returns {Level} The next level, or null if this is the last level. - */ -Level.prototype.nextLevel = function () { - return this.parent.level(this.levelNumber + 1); -}; - -/** - * Compare this level's ordinal to that of a specified level. - * @param {Level} that The level to compare this one to. - * @returns {Number} 0 if the two ordinals are equivalent. -1 if this level's ordinal is less than the specified - * level's ordinal. 1 if this level's ordinal is greater than the specified level's ordinal. - * @throws {ArgumentError} If the specified level is null or undefined. - */ -Level.prototype.compare = function (that) { - if (!that) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Level", "compare", - "The specified level is null or undefined")); - } - - if (this.levelNumber < that.levelNumber) - return -1; - - if (this.levelNumber > that.levelNumber) - return 1; - - return 0; -}; - -export default Level; diff --git a/web/src/gis/util/LevelSet.js b/web/src/gis/util/LevelSet.js deleted file mode 100644 index 08d254d3..00000000 --- a/web/src/gis/util/LevelSet.js +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports LevelSet - */ -import ArgumentError from '../error/ArgumentError'; -import Level from '../util/Level'; -import Location from '../geom/Location'; -import Logger from '../util/Logger'; - - -/** - * Constructs a level set. - * @alias Level - * @constructor - * @classdesc Represents a multi-resolution, hierarchical collection of tiles. Applications typically do not - * interact with this class. - * @param {Sector} sector The sector spanned by this level set. - * @param {Location} levelZeroDelta The geographic size of tiles in the lowest resolution level of this level set. - * @param {Number} numLevels The number of levels in the level set. - * @param {Number} tileWidth The height in pixels of images associated with tiles in this level set, or the number of sample - * points in the longitudinal direction of elevation tiles associate with this level set. - * @param {Number} tileHeight The height in pixels of images associated with tiles in this level set, or the number of sample - * points in the latitudinal direction of elevation tiles associate with this level set. - * @throws {ArgumentError} If the specified sector or level-zero-delta is null or undefined, the level zero - * delta values are less than or equal to zero, or any of the number-of-levels, tile-width or tile-height - * arguments are less than 1. - */ -function LevelSet(sector, levelZeroDelta, numLevels, tileWidth, tileHeight) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "LevelSet", "constructor", "missingSector")); - } - - if (!levelZeroDelta) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "LevelSet", "constructor", - "The specified level zero delta is null or undefined")); - } - - if (levelZeroDelta.latitude <= 0 || levelZeroDelta.longitude <= 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "LevelSet", "constructor", - "The specified level zero delta is less than or equal to zero.")); - } - - if (numLevels < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "LevelSet", "constructor", - "The specified number of levels is less than one.")); - } - - if (tileWidth < 1 || tileHeight < 1) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "LevelSet", "constructor", - "The specified tile width or tile height is less than one.")); - } - - /** - * The sector spanned by this level set. - * @type {Sector} - * @readonly - */ - this.sector = sector; - - /** - * The geographic size of the lowest resolution (level 0) tiles in this level set. - * @type {Location} - * @readonly - */ - this.levelZeroDelta = levelZeroDelta; - - /** - * The number of levels in this level set. - * @type {Number} - * @readonly - */ - this.numLevels = numLevels; - - /** - * The width in pixels of images associated with tiles in this level set, or the number of sample points - * in the longitudinal direction of elevation tiles associated with this level set. - * @type {Number} - * @readonly - */ - this.tileWidth = tileWidth; - - /** - * The height in pixels of images associated with tiles in this level set, or the number of sample points - * in the latitudinal direction of elevation tiles associated with this level set. - * @type {Number} - * @readonly - */ - this.tileHeight = tileHeight; - - this.levels = []; - - for (var i = 0; i < numLevels; i += 1) { - var n = Math.pow(2, i), - latDelta = levelZeroDelta.latitude / n, - lonDelta = levelZeroDelta.longitude / n, - tileDelta = new Location(latDelta, lonDelta), - level = new Level(i, tileDelta, this); - - this.levels[i] = level; - } -} - -/** - * Returns the number of levels that match the specified resolution. firstLevelResolution indicates the - * resolution of the first level's tiles, in degrees per pixel. This depends only on the LevelSet configuration, - * and is derived by evaluating {@code levelZeroDelta.latitude / tileHeight}. lastLevelResolution indicates the - * resolution of the data represented by the LevelSet. - * - * The returned level count is a fractional value. The dataset resolution is rarely an even multiple of the - * first level resolution, so the ideal last level is typically somewhere in between two levels. An integer - * level count can be computed depending on the desired behavior. If the last level should - * <i>match or exceed</i> the data resolution, take the ceiling of the returned value. Otherwise, if the last - * level should be <i>no more than<i/> the data resolution, take the floor of the returned value. - * - * @param {Number} firstLevelResolution the known resolution of the first level in degrees per pixel - * @param {Number} lastLevelResolution the desired resolution of the last level in degrees per pixel - * - * @return {Number} the number of levels as a fractional level count - * - * @throws {ArgumentError} If either resolution is null, undefined, or zero - */ -LevelSet.numLevelsForResolution = function (firstLevelResolution, lastLevelResolution) { - if (!firstLevelResolution || !lastLevelResolution) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "LevelSet", "numLevelsForResolution", "missingResolution")); - } - - var lastLevel = Math.log(firstLevelResolution / lastLevelResolution) / Math.log(2); // fractional level address - - if (lastLevel < 0) { - lastLevel = 0; // ensure at least one level is used, resolution can be less than the first level resolution - } - - return lastLevel + 1; // convert level number to level count -}; - -/** - * Returns the {@link Level} for a specified level number. - * @param {Number} levelNumber The number of the desired level. - * @returns {Level} The requested level, or null if the level does not exist. - */ -LevelSet.prototype.level = function (levelNumber) { - if (levelNumber < 0 || levelNumber >= this.levels.length) { - return null; - } else { - return this.levels[levelNumber]; - } -}; - -/** - * Returns the level with a specified texel size. - * This function returns the first level if the specified texel size is greater than the first level's texel - * size, and returns the last level if the delta is less than the last level's texel size. - * @param {Number} texelSize The size of pixels or elevation cells in the level, in radians per pixel or cell. - */ -LevelSet.prototype.levelForTexelSize = function (texelSize) { - // TODO: Replace this loop with a computation. - var lastLevel = this.lastLevel(); - - if (lastLevel.texelSize >= texelSize) { - return lastLevel; // Can't do any better than the last level. - } - - for (var index = 0, length = this.levels.length; index < length; index += 1) { - var level = this.levels[index]; - if (level.texelSize <= texelSize) { - return level; - } - } - - return lastLevel; -}; - -/** - * Returns the first (lowest resolution) level of this level set. - * @returns {Level} The first level of this level set. - */ -LevelSet.prototype.firstLevel = function () { - return this.levels[0]; -}; - -/** - * Returns the last (highest resolution) level of this level set. - * @returns {Level} The last level of this level set. - */ -LevelSet.prototype.lastLevel = function () { - return this.levels[this.levels.length - 1]; -}; - -export default LevelSet; diff --git a/web/src/gis/util/Logger.js b/web/src/gis/util/Logger.js deleted file mode 100644 index 03fa5b78..00000000 --- a/web/src/gis/util/Logger.js +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/** - * Logs selected message types to the console. - * @exports Logger - */ - -var Logger = { - /** - * Log no messages. - * @constant - */ - LEVEL_NONE: 0, - /** - * Log messages marked as severe. - * @constant - */ - LEVEL_SEVERE: 1, - /** - * Log messages marked as warnings and messages marked as severe. - * @constant - */ - LEVEL_WARNING: 2, - /** - * Log messages marked as information, messages marked as warnings and messages marked as severe. - * @constant - */ - LEVEL_INFO: 3, - - /** - * Set the logging level used by subsequent invocations of the logger. - * @param {Number} level The logging level, one of Logger.LEVEL_NONE, Logger.LEVEL_SEVERE, Logger.LEVEL_WARNING, - * or Logger.LEVEL_INFO. - */ - setLoggingLevel: function (level) { - loggingLevel = level; - }, - - /** - * Indicates the current logging level. - * @returns {Number} The current logging level. - */ - getLoggingLevel: function () { - return loggingLevel; - }, - - /** - * Logs a specified message at a specified level. - * @param {Number} level The logging level of the message. If the current logging level allows this message to be - * logged it is written to the console. - * @param {String} message The message to log. Nothing is logged if the message is null or undefined. - */ - log: function (level, message) { - if (message && level > 0 && level <= loggingLevel) { - if (level === Logger.LEVEL_SEVERE) { - console.error(message); - } else if (level === Logger.LEVEL_WARNING) { - console.warn(message); - } else if (level === Logger.LEVEL_INFO) { - console.info(message); - } else { - console.log(message); - } - } - }, - - // Intentionally not documented. - makeMessage: function (className, functionName, message) { - var msg = this.messageTable[message] ? this.messageTable[message] : message; - - return className + "." + functionName + ": " + msg; - }, - - // Intentionally not documented. - logMessage: function (level, className, functionName, message) { - var msg = this.makeMessage(className, functionName, message); - this.log(level, msg); - - return msg; - }, - - // Intentionally not documented. - messageTable: { // KEEP THIS TABLE IN ALPHABETICAL ORDER - abstractInvocation: "The function called is abstract and must be overridden in a subclass.", - indexOutOfRange: "The specified index is out of range.", - invalidColumn: "The specified column is out of range.", - invalidHeight: "The specified height is zero or negative.", - invalidWidth: "The specified width is zero or negative.", - invalidRow: "The specified row is out of range.", - invalidSize: "The specified size is zero or negative.", - missingAltitudeMode: "The specified altitude mode is null or undefined.", - missingArrayBuffer: "The specified array buffer is null or undefined", - missingAttributeName: "The specified DBase attribute file name is null or undefined.", - missingArray: "The specified array is null, undefined or of insufficient length.", - missingBoundaries: "The specified boundaries array is null or undefined.", - missingBuffer: "The specified buffer descriptor is null or undefined.", - missingColor: "The specified color is null or undefined.", - missingConfig: "The specified config is null or undefined.", - missingDc: "The specified draw context is null or undefined.", - missingDomElement: "The specified DOM element is null or undefined.", - missingEntry: "The specified entry is null or undefined.", - missingFont: "The specified font is null or undefined.", - missingFrustum: "The specified frustum is null or undefined.", - missingFunction: "The specified function is null or undefined.", - missingGlContext: "The specified WebGL rendering context is null or undefined.", - missingGlobe: "The specified globe is null or undefined.", - missingId: "The specified id is null or undefined.", - missingImage: "The specified image is null or undefined.", - missingImageFormat: "The specified image format is null or undefined.", - missingIndices: "The specified indices array is null or undefined.", - missingKey: "The specified key is null or undefined.", - missingLevel: "The specified level is null or undefined.", - missingLine: "The specified line is null or undefined.", - missingList: "The specified list is null or undefined.", - missingListener: "The specified listener is null or undefined", - missingLocation: "The specified location is null or undefined.", - missingMatrix: "The specified matrix is null or undefined.", - missingOffset: "The specified offset is null or undefined.", - missingPath: "The specified path is null or undefined.", - missingPlacename: "The specified place name is null or undefined.", - missingPlane: "The specified plane is null or undefined.", - missingPoint: "The specified point is null or undefined.", - missingPoints: "The specified points array is null or undefined.", - missingPosition: "The specified position is null or undefined.", - missingPositions: "The specified positions array is null or undefined.", - missingProgram: "The specified program is null or undefined.", - missingProjection: "The specified projection is null or undefined.", - missingRectangle: "The specified rectangle is null or undefined.", - missingRenderable: "The specified renderable is null or undefined.", - missingResolution: "The specified resolution is null, undefined, or zero.", - missingResource: "The specified resource is null or undefined.", - missingResult: "The specified result variable is null or undefined.", - missingResults: "The specified results array is null or undefined.", - missingSector: "The specified sector is null or undefined.", - missingShapeType: "The specified shape type is null or undefined.", - missingSize: "The specified size is null or undefined.", - missingText: "The specified text is null or undefined.", - missingTexture: "The specified texture is null or undefined.", - missingTile: "The specified tile is null or undefined.", - missingType: "The specified type is null or undefined.", - missingUrl: "The specified URL is null or undefined", - missingVector: "The specified vector is null or undefined.", - missingVertex: "The specified vertex is null or undefined.", - missingViewport: "The specified viewport is null or undefined.", - missingWebCoverageService: "The specified WebCoverageService is null or undefined.", - missingWorldWindow: "The specified WorldWindow is null or undefined.", - notYetImplemented: "This function is not yet implemented", - unsupportedVersion: "The specified version is not supported.", - webglNotSupported: "The browser does not support WebGL, or WebGL is disabled." - } -}; - -var loggingLevel = 1; // log severe messages by default - -export default Logger; diff --git a/web/src/gis/util/Offset.js b/web/src/gis/util/Offset.js deleted file mode 100644 index 40b2047e..00000000 --- a/web/src/gis/util/Offset.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Offset - */ -import Vec2 from '../geom/Vec2'; - - -/** - * Constructs an offset instance given specified units and offsets. - * @alias Offset - * @constructor - * @classdesc Specifies an offset relative to a rectangle. Used by [Placemark]{@link Placemark} and - * other shapes. - * @param {String} xUnits The type of units specified for the X dimension. May be one of the following: - * <ul> - * <li>[WorldWind.OFFSET_FRACTION]{@link WorldWind#OFFSET_FRACTION}</li> - * <li>[WorldWind.OFFSET_INSET_PIXELS]{@link WorldWind#OFFSET_INSET_PIXELS}</li> - * <li>[WorldWind.OFFSET_PIXELS]{@link WorldWind#OFFSET_PIXELS}</li> - * </ul> - * @param {Number} x The offset in the X dimension. - * @param {String} yUnits The type of units specified for the Y dimension, assuming a lower-left Y origin. - * May be one of the following: - * <ul> - * <li>[WorldWind.OFFSET_FRACTION]{@link WorldWind#OFFSET_FRACTION}</li> - * <li>[WorldWind.OFFSET_INSET_PIXELS]{@link WorldWind#OFFSET_INSET_PIXELS}</li> - * <li>[WorldWind.OFFSET_PIXELS]{@link WorldWind#OFFSET_PIXELS}</li> - * </ul> - * @param {Number} y The offset in the Y dimension. - */ -function Offset(xUnits, x, yUnits, y) { - - /** - * The offset in the X dimension, interpreted according to this instance's xUnits argument. - * @type {Number} - */ - this.x = x; - - /** - * The offset in the Y dimension, interpreted according to this instance's yUnits argument. - * @type {Number} - */ - this.y = y; - - /** - * The units of this instance's X offset. See this class' constructor description for a list of the - * possible values. - * @type {String} - */ - this.xUnits = xUnits; - - /** - * The units of this instance's Y offset. See this class' constructor description for a list of the - * possible values. - * @type {String} - */ - this.yUnits = yUnits; -} - -/** - * Creates a new copy of this offset with identical property values. - * @returns {Offset} A new offset instance with its property values the same as this one's. - */ -Offset.prototype.clone = function () { - return new Offset(this.xUnits, this.x, this.yUnits, this.y); -}; - -/** - * Returns this offset's absolute X and Y coordinates in pixels for a rectangle of a specified size in pixels. - * The returned offset is in pixels relative to the rectangle's origin, and is defined in the coordinate - * system used by the caller. - * @param {Number} width The rectangle's width in pixels. - * @param {Number} height The rectangles height in pixels. - * @returns {Vec2} The computed offset relative to the rectangle's origin. - */ -Offset.prototype.offsetForSize = function (width, height) { - var x, y; - - if (this.xUnits === WorldWind.OFFSET_FRACTION) { - x = width * this.x; - } else if (this.xUnits === WorldWind.OFFSET_INSET_PIXELS) { - x = width - this.x; - } else { // default to OFFSET_PIXELS - x = this.x; - } - - if (this.yUnits === WorldWind.OFFSET_FRACTION) { - y = height * this.y; - } else if (this.yUnits === WorldWind.OFFSET_INSET_PIXELS) { - y = height - this.y; - } else { // default to OFFSET_PIXELS - y = this.y; - } - - return new Vec2(x, y); -}; - -/** - * Returns a string representation of this object. - * @returns {String} A string representation of this object. - */ -Offset.prototype.toString = function () { - return this.xUnits + " " + this.x + " " + this.yUnits + " " + this.y; -}; - -export default Offset; diff --git a/web/src/gis/util/PolygonSplitter.js b/web/src/gis/util/PolygonSplitter.js deleted file mode 100644 index b1ec5e3c..00000000 --- a/web/src/gis/util/PolygonSplitter.js +++ /dev/null @@ -1,452 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import HashMap from './HashMap'; -import Location from '../geom/Location'; -import Position from '../geom/Position'; -import WWMath from './WWMath'; - - -/** - * Splits polygons that cross the anti-meridian and/or contain a pole. - * @exports PolygonSplitter - */ - -var PolygonSplitter = { - - //Internal - //Keeps track of the index of added points so that no point is duplicated - addedIndex: -1, - - //Internal - //The index where pole insertion began - poleIndexOffset: -1, - - /** - * Splits an array of polygons that cross the anti-meridian or contain a pole. - * - * @param {Array} contours an array of arrays of Locations or Positions - * Each array entry defines one of this polygon's boundaries. - * @param {Array} resultContours an empty array to put the result of the split. Each element will have the - * shape of PolygonSplitter.formatContourOutput - * @returns {Boolean} true if one of the boundaries crosses the anti-meridian otherwise false - * */ - splitContours: function (contours, resultContours) { - var doesCross = false; - - for (var i = 0, len = contours.length; i < len; i++) { - var contourInfo = this.splitContour(contours[i]); - if (contourInfo.polygons.length > 1) { - doesCross = true; - } - resultContours.push(contourInfo); - } - - return doesCross; - }, - - /** - * Splits a polygon that cross the anti-meridian or contain a pole. - * - * @param {Location[] | Position[]} points an array of Locations or Positions that define a polygon - * @returns {Object} @see PolygonSplitter.formatContourOutput - * */ - splitContour: function (points) { - var iMap = new HashMap(); - var newPoints = []; - var intersections = []; - var polygons = []; - var iMaps = []; - var poleIndex = -1; - - var pole = this.findIntersectionAndPole(points, newPoints, intersections, iMap); - - if (intersections.length === 0) { - polygons.push(newPoints); - iMaps.push(iMap); - return this.formatContourOutput(polygons, pole, poleIndex, iMaps); - } - - if (intersections.length > 2) { - intersections.sort(function (a, b) { - return b.latitude - a.latitude; - }); - } - - if (pole !== Location.poles.NONE) { - newPoints = this.handleOnePole(newPoints, intersections, iMap, pole); - iMap = this.reindexIntersections(intersections, iMap, this.poleIndexOffset); - } - if (intersections.length === 0) { - polygons.push(newPoints); - iMaps.push(iMap); - poleIndex = 0; - return this.formatContourOutput(polygons, pole, poleIndex, iMaps); - } - - this.linkIntersections(intersections, iMap); - - poleIndex = this.makePolygons(newPoints, intersections, iMap, polygons, iMaps); - - return this.formatContourOutput(polygons, pole, poleIndex, iMaps); - }, - - /** - * Internal. Applications should not call this method. - * Finds the intersections with the anti-meridian and if the polygon contains one of the poles. - * A new polygon is constructed with the intersections and pole points and stored in newPoints - * - * @param {Location[] | Position[]} points An array of Locations or Positions that define a polygon - * @param {Location[] | Position[]} newPoints An empty array where to store the resulting polygon with intersections - * @param {Array} intersections An empty array where to store the intersection latitude and index - * @param {HashMap} iMap A hashMap to store intersection data - * The key is the index in the newPoints array and value is PolygonSplitter.makeIntersectionEntry - * @returns {Number} The pole number @see Location.poles - * */ - findIntersectionAndPole: function (points, newPoints, intersections, iMap) { - var containsPole = false; - var minLatitude = 90.0; - var maxLatitude = -90.0; - this.addedIndex = -1; - - for (var i = 0, lenC = points.length; i < lenC; i++) { - var pt1 = points[i]; - var pt2 = points[(i + 1) % lenC]; - - minLatitude = Math.min(minLatitude, pt1.latitude); - maxLatitude = Math.max(maxLatitude, pt1.latitude); - - var doesCross = Location.locationsCrossDateLine([pt1, pt2]); - if (doesCross) { - containsPole = !containsPole; - - var iLatitude = Location.meridianIntersection(pt1, pt2, 180); - if (iLatitude === null) { - iLatitude = (pt1.latitude + pt2.latitude) / 2; - } - var iLongitude = WWMath.signum(pt1.longitude) * 180 || 180; - - var iLoc1 = this.createPoint(iLatitude, iLongitude, pt1.altitude); - var iLoc2 = this.createPoint(iLatitude, -iLongitude, pt2.altitude); - - this.safeAdd(newPoints, pt1, i, lenC); - - var index = newPoints.length; - iMap.set(index, this.makeIntersectionEntry(index)); - iMap.set(index + 1, this.makeIntersectionEntry(index + 1)); - intersections.push({ - indexEnd: index, - indexStart: index + 1, - latitude: iLatitude - }); - - newPoints.push(iLoc1); - newPoints.push(iLoc2); - - this.safeAdd(newPoints, pt2, i + 1, lenC); - } - else { - this.safeAdd(newPoints, pt1, i, lenC); - this.safeAdd(newPoints, pt2, i + 1, lenC); - } - } - - var pole = Location.poles.NONE; - if (containsPole) { - pole = this.determinePole(minLatitude, maxLatitude); - } - - return pole; - }, - - /** - * Internal. Applications should not call this method. - * Determine which pole is enclosed. If the shape is entirely in one hemisphere, then assume that it encloses - * the pole in that hemisphere. Otherwise, assume that it encloses the pole that is closest to the shape's - * extreme latitude. - * @param {Number} minLatitude The minimum latitude of a polygon that contains a pole - * @param {Number} maxLatitude The maximum latitude of a polygon that contains a pole - * @returns {Number} The pole number @see Location.poles - * */ - determinePole: function (minLatitude, maxLatitude) { - var pole; - if (minLatitude > 0) { - pole = Location.poles.NORTH; // Entirely in Northern Hemisphere. - } - else if (maxLatitude < 0) { - pole = Location.poles.SOUTH; // Entirely in Southern Hemisphere. - } - else if (Math.abs(maxLatitude) >= Math.abs(minLatitude)) { - pole = Location.poles.NORTH; // Spans equator, but more north than south. - } - else { - pole = Location.poles.SOUTH; // Spans equator, but more south than north. - } - return pole; - }, - - /** - * Internal. Applications should not call this method. - * Creates a new array of points containing the two pole locations on both sides of the anti-meridian - * - * @param {Location[] | Position[]} points - * @param {Array} intersections - * @param {HashMap} iMap - * @param {Number} pole - * @return {Object} an object containing the new points and a new reIndexed iMap - * */ - handleOnePole: function (points, intersections, iMap, pole) { - var pointsClone; - - if (pole === Location.poles.NORTH) { - var intersection = intersections.shift(); - var poleLat = 90; - } - else if (pole === Location.poles.SOUTH) { - intersection = intersections.pop(); - poleLat = -90; - } - - var iEnd = iMap.get(intersection.indexEnd); - var iStart = iMap.get(intersection.indexStart); - iEnd.forPole = true; - iStart.forPole = true; - - this.poleIndexOffset = intersection.indexStart; - - pointsClone = points.slice(0, intersection.indexEnd + 1); - var polePoint1 = this.createPoint(poleLat, points[iEnd.index].longitude, points[iEnd.index].altitude); - var polePoint2 = this.createPoint(poleLat, points[iStart.index].longitude, points[iStart.index].altitude); - pointsClone.push(polePoint1, polePoint2); - pointsClone = pointsClone.concat(points.slice(this.poleIndexOffset)); - - return pointsClone; - }, - - /** - * Internal. Applications should not call this method. - * Links adjacents pairs of intersection by index - * @param {Array} intersections - * @param {HashMap} iMap - * */ - linkIntersections: function (intersections, iMap) { - for (var i = 0; i < intersections.length - 1; i += 2) { - var i0 = intersections[i]; - var i1 = intersections[i + 1]; - - var iEnd0 = iMap.get(i0.indexEnd); - var iStart0 = iMap.get(i0.indexStart); - var iEnd1 = iMap.get(i1.indexEnd); - var iStart1 = iMap.get(i1.indexStart); - - iEnd0.linkTo = i1.indexStart; - iStart0.linkTo = i1.indexEnd; - iEnd1.linkTo = i0.indexStart; - iStart1.linkTo = i0.indexEnd; - } - }, - - /** - * Internal. Applications should not call this method. - * ReIndexes the intersections due to the poles being added to the array of points - * @param {Array} intersections - * @param {HashMap} iMap - * @param {Number} indexOffset the index from which to start reIndexing - * @returns {HashMap} a new hash map with the correct indices - * */ - reindexIntersections: function (intersections, iMap, indexOffset) { - iMap = HashMap.reIndex(iMap, indexOffset, 2); - - for (var i = 0, len = intersections.length; i < len; i++) { - if (intersections[i].indexEnd >= indexOffset) { - intersections[i].indexEnd += 2; - } - if (intersections[i].indexStart >= indexOffset) { - intersections[i].indexStart += 2; - } - } - - return iMap; - }, - - /** - * Internal. Applications should not call this method. - * @param {Location[] | Position[]} points - * @param {Array} intersections - * @param {HashMap} iMap - * @param {Array} polygons an empty array to store the resulting polygons - * @param {HashMap[]} iMaps an empty array to store the resulting hasp maps for each polygon - * @returns {Number} the pole number @see Location.poles - * */ - makePolygons: function (points, intersections, iMap, polygons, iMaps) { - var poleIndex = -1; - for (var i = 0; i < intersections.length - 1; i += 2) { - var i0 = intersections[i]; - var i1 = intersections[i + 1]; - - var start = i0.indexStart; - var end = i1.indexEnd; - var polygon = []; - var polygonHashMap = new HashMap(); - var containsPole = this.makePolygon(start, end, points, iMap, polygon, polygonHashMap); - if (polygon.length) { - polygons.push(polygon); - iMaps.push(polygonHashMap); - if (containsPole) { - poleIndex = polygons.length - 1; - } - } - - start = i1.indexStart; - end = i0.indexEnd; - polygon = []; - polygonHashMap = new HashMap(); - containsPole = this.makePolygon(start, end, points, iMap, polygon, polygonHashMap); - if (polygon.length) { - polygons.push(polygon); - iMaps.push(polygonHashMap); - if (containsPole) { - poleIndex = polygons.length - 1; - } - } - } - - return poleIndex; - }, - - /** - * Internal. Applications should not call this method. - * Paths from a start intersection index to an end intersection index and makes a polygon and a hashMap - * with the intersection indices - * @param {Number} start the index of a start type intersection - * @param {Number} end the index of an end type intersection - * @param {Location[] | Position[]} points - * @param {HashMap} iMap - * @param {Location[] | Position[]} resultPolygon an empty array to store the resulting polygon - * @param {HashMap} polygonHashMap a hash map to record the indices of the intersections in the polygon - * @returns {Boolean} true if the polygon contains a pole - * */ - makePolygon: function (start, end, points, iMap, resultPolygon, polygonHashMap) { - var pass = false; - var len = points.length; - var containsPole = false; - - if (end < start) { - end += len; - } - - for (var i = start; i <= end; i++) { - var idx = i % len; - var pt = points[idx]; - var intersection = iMap.get(idx); - - if (intersection) { - if (intersection.visited) { - break; - } - - resultPolygon.push(pt); - polygonHashMap.set(resultPolygon.length - 1, intersection); - - if (intersection.forPole) { - containsPole = true; - } - else { - if (pass) { - i = intersection.linkTo - 1; - if (i + 1 === start) { - break; - } - } - pass = !pass; - intersection.visited = true; - } - } - else { - resultPolygon.push(pt); - } - } - - return containsPole; - }, - - /** - * Internal. Applications should not call this method. - * Adds an element to an array preventing duplication - * @param {Location[] | Position[]} points - * @param {Location | Position} point - * @param {Number} index The index of the Point from the source array - * @param {Number} len The length of the source array - * */ - safeAdd: function (points, point, index, len) { - if (this.addedIndex < index && this.addedIndex < len - 1) { - points.push(point); - this.addedIndex = index; - } - }, - - /** - * Internal. Applications should not call this method. - * Creates a Location or a Position - * @param {Number} latitude - * @param {Number} longitude - * @param {Number} altitude - * @returns Location | Position - * */ - createPoint: function (latitude, longitude, altitude) { - if (altitude == null) { - return new Location(latitude, longitude); - } - return new Position(latitude, longitude, altitude); - }, - - /** - * Internal. Applications should not call this method. - * @param {Array} polygons an array of arrays of Locations or Positions - * @param {Number} pole the pole number @see Location.poles - * @param {Number} poleIndex the index of the polygon containing the pole - * @param {HashMap[]} iMaps an array of hash maps for each polygon - * */ - formatContourOutput: function (polygons, pole, poleIndex, iMaps) { - return { - polygons: polygons, - pole: pole, - poleIndex: poleIndex, - iMap: iMaps - }; - }, - - /** - * Internal. Applications should not call this method. - * @param {Number} index the index of the intersection in the array of points - * */ - makeIntersectionEntry: function (index) { - if (index == null) { - index = -1; - } - return { - visited: false, - forPole: false, - index: index, - linkTo: -1 - } - } -}; - -export default PolygonSplitter; - - diff --git a/web/src/gis/util/SunPosition.js b/web/src/gis/util/SunPosition.js deleted file mode 100644 index 06253c71..00000000 --- a/web/src/gis/util/SunPosition.js +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Logger from './Logger'; -import WWMath from './WWMath'; - - -/** - * Provides utilities for determining the Sun geographic and celestial location. - * @exports SunPosition - */ -var SunPosition = { - - /** - * Computes the geographic location of the sun for a given date - * @param {Date} date - * @throws {ArgumentError} if the date is missing - * @return {{latitude: Number, longitude: Number}} the geographic location - */ - getAsGeographicLocation: function (date) { - if (date instanceof Date === false) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SunPosition", "getAsGeographicLocation", - "missingDate")); - } - - var celestialLocation = this.getAsCelestialLocation(date); - return this.celestialToGeographic(celestialLocation, date); - }, - - /** - * Computes the celestial location of the sun for a given julianDate - * @param {Date} date - * @throws {ArgumentError} if the date is missing - * @return {{declination: Number, rightAscension: Number}} the celestial location - */ - getAsCelestialLocation: function (date) { - if (date instanceof Date === false) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SunPosition", "getAsCelestialLocation", - "missingDate")); - } - - var julianDate = this.computeJulianDate(date); - - //number of days (positive or negative) since Greenwich noon, Terrestrial Time, on 1 January 2000 (J2000.0) - var numDays = julianDate - 2451545; - - var meanLongitude = WWMath.normalizeAngle360(280.460 + 0.9856474 * numDays); - - var meanAnomaly = WWMath.normalizeAngle360(357.528 + 0.9856003 * numDays) * Angle.DEGREES_TO_RADIANS; - - var eclipticLongitude = meanLongitude + 1.915 * Math.sin(meanAnomaly) + 0.02 * Math.sin(2 * meanAnomaly); - var eclipticLongitudeRad = eclipticLongitude * Angle.DEGREES_TO_RADIANS; - - var obliquityOfTheEcliptic = (23.439 - 0.0000004 * numDays) * Angle.DEGREES_TO_RADIANS; - - var declination = Math.asin(Math.sin(obliquityOfTheEcliptic) * Math.sin(eclipticLongitudeRad)) * - Angle.RADIANS_TO_DEGREES; - - var rightAscension = Math.atan(Math.cos(obliquityOfTheEcliptic) * Math.tan(eclipticLongitudeRad)) * - Angle.RADIANS_TO_DEGREES; - - //compensate for atan result - if (eclipticLongitude >= 90 && eclipticLongitude < 270) { - rightAscension += 180; - } - rightAscension = WWMath.normalizeAngle360(rightAscension); - - return { - declination: declination, - rightAscension: rightAscension - }; - }, - - /** - * Converts from celestial coordinates (declination and right ascension) to geographic coordinates - * (latitude, longitude) for a given julian date - * @param {{declination: Number, rightAscension: Number}} celestialLocation - * @param {Date} date - * @throws {ArgumentError} if celestialLocation or julianDate are missing - * @return {{latitude: Number, longitude: Number}} the geographic location - */ - celestialToGeographic: function (celestialLocation, date) { - if (!celestialLocation) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SunPosition", "celestialToGeographic", - "missingCelestialLocation")); - } - if (date instanceof Date === false) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SunPosition", "celestialToGeographic", "missingDate")); - } - - var julianDate = this.computeJulianDate(date); - - //number of days (positive or negative) since Greenwich noon, Terrestrial Time, on 1 January 2000 (J2000.0) - var numDays = julianDate - 2451545; - - //Greenwich Mean Sidereal Time - var GMST = WWMath.normalizeAngle360(280.46061837 + 360.98564736629 * numDays); - - //Greenwich Hour Angle - var GHA = WWMath.normalizeAngle360(GMST - celestialLocation.rightAscension); - - var longitude = Angle.normalizedDegreesLongitude(-GHA); - - return { - latitude: celestialLocation.declination, - longitude: longitude - }; - }, - - /** - * Computes the julian date from a javascript date object - * @param {Date} date - * @throws {ArgumentError} if the date is missing - * @return {Number} the julian date - */ - computeJulianDate: function (date) { - if (date instanceof Date === false) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "SunPosition", "computeJulianDate", "missingDate")); - } - - var year = date.getUTCFullYear(); - var month = date.getUTCMonth() + 1; - var day = date.getUTCDate(); - var hour = date.getUTCHours(); - var minute = date.getUTCMinutes(); - var second = date.getUTCSeconds(); - - var dayFraction = (hour + minute / 60 + second / 3600) / 24; - - if (month <= 2) { - year -= 1; - month += 12; - } - - var A = Math.floor(year / 100); - var B = 2 - A + Math.floor(A / 4); - var JD0h = Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5; - - return JD0h + dayFraction; - } - -}; - -export default SunPosition; - diff --git a/web/src/gis/util/Tile.js b/web/src/gis/util/Tile.js deleted file mode 100644 index 1d857b34..00000000 --- a/web/src/gis/util/Tile.js +++ /dev/null @@ -1,570 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports Tile - */ -import ArgumentError from '../error/ArgumentError'; -import BoundingBox from '../geom/BoundingBox'; -import Logger from '../util/Logger'; -import Sector from '../geom/Sector'; -import Vec3 from '../geom/Vec3'; -import WWMath from '../util/WWMath'; -import WWUtil from '../util/WWUtil'; - - -/** - * Constructs a tile for a specified sector, level, row and column. - * @alias Tile - * @constructor - * @classdesc Represents a tile of terrain or imagery. - * Provides a base class for texture tiles used by tiled image layers and elevation tiles used by elevation models. - * Applications typically do not interact with this class. - * @param {Sector} sector The sector represented by this tile. - * @param {Level} level This tile's level in a tile pyramid. - * @param {Number} row This tile's row in the specified level in a tile pyramid. - * @param {Number} column This tile's column in the specified level in a tile pyramid. - * @throws {ArgumentError} If the specified sector or level is null or undefined or the row or column arguments - * are less than zero. - */ -function Tile(sector, level, row, column) { - if (!sector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "constructor", "missingSector")); - } - - if (!level) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "constructor", - "The specified level is null or undefined.")); - } - - if (row < 0 || column < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "constructor", - "The specified row or column is less than zero.")); - } - - /** - * The sector represented by this tile. - * @type {Sector} - * @readonly - */ - this.sector = sector; - - /** - * The level at which this tile lies in a tile pyramid. - * @type {Number} - * @readonly - */ - this.level = level; - - /** - * The row in this tile's level in which this tile lies in a tile pyramid. - * @type {Number} - * @readonly - */ - this.row = row; - - /** - * The column in this tile's level in which this tile lies in a tile pyramid. - * @type {Number} - * @readonly - */ - this.column = column; - - /** - * The width in pixels or cells of this tile's associated resource. - * @type {Number} - */ - this.tileWidth = level.tileWidth; - - /** - * The height in pixels or cells of this tile's associated resource. - * @type {Number} - */ - this.tileHeight = level.tileHeight; - - /** - * The size in radians of pixels or cells of this tile's associated resource. - * @type {Number} - */ - this.texelSize = level.texelSize; - - /** - * A key that uniquely identifies this tile within a level set. - * @type {String} - * @readonly - */ - this.tileKey = Tile.computeTileKey(level.levelNumber, row, column); - - /** - * The Cartesian bounding box of this tile. - * @type {BoundingBox} - */ - this.extent = null; - - /** - * The tile's local origin in model coordinates. Any model coordinate points associates with the tile - * should be relative to this point. - * @type {Vec3} - */ - this.referencePoint = null; - - /** - * This tile's opacity. - * @type {Number} - * @default 1 - */ - this.opacity = 1; - - // Internal use only. Intentionally not documented. - this.samplePoints = null; - - // Internal use only. Intentionally not documented. - this.sampleElevations = null; - - // Internal use only. Intentionally not documented. - this.updateTimestamp = null; - - // Internal use only. Intentionally not documented. - this.updateVerticalExaggeration = null; - - // Internal use only. Intentionally not documented. - this.updateGlobeStateKey = null; -} - -/** - * Indicates whether this tile is equivalent to a specified tile. - * @param {Tile} that The tile to check equivalence with. - * @returns {boolean} true if this tile is equivalent to the specified one, false if - * they are not equivalent or the specified tile is null or undefined. - */ -Tile.prototype.isEqual = function (that) { - if (!that) - return false; - - if (!that.tileKey) - return false; - - return this.tileKey == that.tileKey; -}; - -/** - * Returns the size of this tile in bytes. - * @returns {Number} The size of this tile in bytes. - */ -Tile.prototype.size = function () { - return 4 // child pointer - + (4 + 32) // sector - + 4 //level pointer (the level is common to the layer or tessellator so is not included here) - + 8 // row and column - + 8 // texel size - + (4 + 32) // reference point - + (4 + 676) // bounding box - + 8 // min and max height - + (4 + 32) // nearest point - + 8; // extent timestamp and vertical exaggeration -}; - -/** - * Computes an approximate distance from this tile to a specified vector. - * @param {Vec3} vector The vector to compute the distance to. - * @returns {number} The distance between this tile and the vector. - * @throws {ArgumentError} If the specified vector is null or undefined. - */ -Tile.prototype.distanceTo = function (vector) { - if (!vector) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "distanceTo", "missingVector")); - } - - var px = vector[0], py = vector[1], pz = vector[2], - dx, dy, dz, - points = this.samplePoints, - distance = Number.POSITIVE_INFINITY; - - for (var i = 0, len = points.length; i < len; i += 3) { - dx = px - points[i]; - dy = py - points[i + 1]; - dz = pz - points[i + 2]; - distance = Math.min(distance, dx * dx + dy * dy + dz * dz); // minimum squared distance - } - - return Math.sqrt(distance); -}; - -/** - * Returns the four children formed by subdividing this tile. - * @param {Level} level The level of the children. - * @param {TileFactory} tileFactory The tile factory to use to create the children. - * @returns {Tile[]} An array containing the four child tiles. - * @throws {ArgumentError} If the specified tile factory or level is null or undefined. - */ -Tile.prototype.subdivide = function (level, tileFactory) { - if (!level) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "subdivide", - "The specified level is null or undefined.")); - } - - if (!tileFactory) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "subdivide", - "The specified tile factory is null or undefined.")); - } - - var latMin = this.sector.minLatitude, - latMax = this.sector.maxLatitude, - latMid = this.sector.centroidLatitude(), - - lonMin = this.sector.minLongitude, - lonMax = this.sector.maxLongitude, - lonMid = this.sector.centroidLongitude(), - - subRow, - subCol, - childSector, - children = []; - - subRow = 2 * this.row; - subCol = 2 * this.column; - childSector = new Sector(latMid, latMax, lonMin, lonMid); - children.push(tileFactory.createTile(childSector, level, subRow, subCol)); - - subRow = 2 * this.row; - subCol = 2 * this.column + 1; - childSector = new Sector(latMid, latMax, lonMid, lonMax); - children.push(tileFactory.createTile(childSector, level, subRow, subCol)); - - subRow = 2 * this.row + 1; - subCol = 2 * this.column; - childSector = new Sector(latMin, latMid, lonMin, lonMid); - children.push(tileFactory.createTile(childSector, level, subRow, subCol)); - - subRow = 2 * this.row + 1; - subCol = 2 * this.column + 1; - childSector = new Sector(latMin, latMid, lonMid, lonMax); - children.push(tileFactory.createTile(childSector, level, subRow, subCol)); - - return children; -}; - -/** - * Returns the four children formed by subdividing this tile, drawing those children from a specified cache - * if they exist there. - * @param {Level} level The level of the children. - * @param {TileFactory} tileFactory The tile factory to use to create the children. - * @param {MemoryCache} cache A memory cache that may contain pre-existing child tiles. If non-null, the - * cache is checked for a child collection prior to creating that tile. If one exists - * in the cache it is returned rather than creating a new collection of children. If a new collection is - * created, it is added to the cache. - * @returns {Tile[]} An array containing the four tiles. - * @throws {ArgumentError} If the specified tile factory or level is null or undefined. - */ -Tile.prototype.subdivideToCache = function (level, tileFactory, cache) { - if (!level) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "subdivideToCache", - "The specified level is null or undefined.")); - } - - if (!tileFactory) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "subdivideToCache", - "The specified tile factory is null or undefined.")); - } - - var childList = cache ? cache.entryForKey(this.tileKey) : null; - if (!childList) { - childList = this.subdivide(level, tileFactory); - if (childList && cache) { - cache.putEntry(this.tileKey, childList, 4 * childList[0].size()); - } - } - - return childList; -}; - -/** - * Indicates whether this tile should be subdivided based on the current navigation state and a specified - * detail factor. - * @param {DrawContext} dc The current draw context. - * @param {Number} detailFactor The detail factor to consider. - * @returns {boolean} true If the tile should be subdivided, otherwise false. - */ -Tile.prototype.mustSubdivide = function (dc, detailFactor) { - // Split when the cell height (length of a texel) becomes greater than the specified fraction of the eye - // distance. The fraction is specified as a power of 10. For example, a detail factor of 3 means split when - // the cell height becomes more than one thousandth of the eye distance. Another way to say it is, use the - // current tile if the cell height is less than the specified fraction of the eye distance. - // - // Note: It's tempting to instead compare a screen pixel size to the texel size, but that calculation is - // window-size dependent and results in selecting an excessive number of tiles when the window is large. - - var cellSize = dc.globe.equatorialRadius * this.texelSize, - distance = this.distanceTo(dc.eyePoint), - pixelSize = dc.pixelSizeAtDistance(distance); - - return cellSize > Math.max(detailFactor * pixelSize, 0.5); -}; - -/** - * Updates this tile's frame-dependent properties as necessary, according to the specified draw context. - * <p> - * The tile's frame-dependent properties, include the extent (bounding volume). These properties are dependent - * on the tile's sector and the elevation values currently in memory, and change when those dependencies change. - * Therefore <code>update</code> must be called once per frame before the extent and any other frame-dependent - * properties are used. <code>update</code> intelligently determines when it is necessary to recompute these - * properties, and does nothing if the state of all dependencies has not changed since the last call. - * @param {DrawContext} dc The current draw context. - */ -Tile.prototype.update = function (dc) { - var elevationTimestamp = dc.globe.elevationTimestamp(), - verticalExaggeration = dc.verticalExaggeration, - globeStateKey = dc.globeStateKey; - - if (this.updateTimestamp != elevationTimestamp - || this.updateVerticalExaggeration != verticalExaggeration - || this.updateGlobeStateKey != globeStateKey) { - - this.doUpdate(dc); - dc.frameStatistics.incrementTileUpdateCount(1); - - // Set the geometry extent to the globe's elevation timestamp on which the geometry is based. This - // ensures that the geometry timestamp can be reliably compared to the elevation timestamp in subsequent - // frames. - this.updateTimestamp = elevationTimestamp; - this.updateVerticalExaggeration = verticalExaggeration; - this.updateGlobeStateKey = globeStateKey; - } -}; - -/** - * Updates this tile's frame-dependent properties according to the specified draw context. - * @param {DrawContext} dc The current draw context. - * @protected - */ -Tile.prototype.doUpdate = function (dc) { - // Compute the minimum and maximum world coordinate height for this tile's sector by multiplying the minimum - // and maximum elevations by the scene's vertical exaggeration. This ensures that the elevations to used - // build the terrain are contained by this tile's extent. Use zero if the globe as no elevations in this - // tile's sector. - var globe = dc.globe, - verticalExaggeration = dc.verticalExaggeration, - extremes = globe.minAndMaxElevationsForSector(this.sector), - minHeight = extremes[0] * verticalExaggeration, - maxHeight = extremes[1] * verticalExaggeration; - - if (minHeight === maxHeight) { - minHeight = maxHeight + 10; // TODO: Determine if this is necessary. - } - - // Compute a bounding box for this tile that contains the terrain surface in the tile's coverage area. - if (!this.extent) { - this.extent = new BoundingBox(); - } - this.extent.setToSector(this.sector, globe, minHeight, maxHeight); - - // Compute the cartesian points for a 3x3 geographic grid. This grid captures sufficiently close sample - // points in order to estimate the distance from the viewer to this tile. - if (!this.samplePoints) { - this.sampleElevations = new Float64Array(9); - this.samplePoints = new Float64Array(3 * this.sampleElevations.length); - } - WWUtil.fillArray(this.sampleElevations, 0.5 * (minHeight + maxHeight)); - globe.computePointsForGrid(this.sector, 3, 3, this.sampleElevations, Vec3.ZERO, this.samplePoints); - - // Compute the reference point used as a local coordinate origin for the tile. - if (!this.referencePoint) { - this.referencePoint = new Vec3(0, 0, 0); - } - - globe.computePointFromPosition(WWMath.mercatorLatInvert(this.sector.centroidLatitude()), this.sector.centroidLongitude(), 0, - this.referencePoint); -}; - -/** - * Computes a key that uniquely identifies a tile within its level set. - * - * @param {Number} levelNumber The tile's level number in a tile pyramid. - * @param {Number} row The tile's row in the specified level in a tile pyramid. - * @param {Number} column The tile's column in the specified level in a tile pyramid. - * @returns {String} A string key uniquely identifying a tile with the specified level, row, and column. - */ -Tile.computeTileKey = function (levelNumber, row, column) { - return levelNumber + "." + row + "." + column; -}; - -/** - * Computes a row number for a tile within a level given the tile's latitude. - * @param {Number} delta The level's latitudinal tile delta in degrees. - * @param {Number} latitude The tile's minimum latitude. - * @returns {Number} The computed row number. - */ -Tile.computeRow = function (delta, latitude) { - var row = Math.floor((180 - latitude) / delta); - - // If latitude is at the end of the grid, subtract 1 from the computed row to return the last row. - if (latitude == -180) { - row -= 1; - } - - return row; -}; - -/** - * Computes a column number for a tile within a level given the tile's longitude. - * @param {Number} delta The level's longitudinal tile delta in degrees. - * @param {Number} longitude The tile's minimum longitude. - * @returns {Number} The computed column number. - */ -Tile.computeColumn = function (delta, longitude) { - var col = Math.floor((longitude + 180) / delta); - - // If longitude is at the end of the grid, subtract 1 from the computed column to return the last column. - if (longitude == 180) { - col -= 1; - } - - return col; -}; - -/** - * Computes the last row number for a tile within a level given the tile's maximum latitude. - * @param {Number} delta The level's latitudinal tile delta in degrees. - * @param {Number} maxLatitude The tile's maximum latitude in degrees. - * @returns {Number} The computed row number. - */ -Tile.computeLastRow = function (delta, maxLatitude) { - var row = Math.ceil((maxLatitude + 180) / delta - 1); - - // If max latitude is in the first row, set the max row to 0. - if (maxLatitude + 180 < delta) { - row = 0; - } - - return row; -}; - -/** - * Computes the last column number for a tile within a level given the tile's maximum longitude. - * @param {Number} delta The level's longitudinal tile delta in degrees. - * @param {Number} maxLongitude The tile's maximum longitude in degrees. - * @returns {Number} The computed column number. - */ -Tile.computeLastColumn = function (delta, maxLongitude) { - var col = Math.ceil((maxLongitude + 180) / delta - 1); - - // If max longitude is in the first column, set the max column to 0. - if (maxLongitude + 180 < delta) { - col = 0; - } - - return col; -}; - -/** - * Computes a sector spanned by a tile with the specified level number, row and column. - * @param {Level} level The tile's level number. - * @param {Number} row The tile's row number. - * @param {Number} column The tile's column number. - * @returns {Sector} The sector spanned by the tile. - * @throws {ArgumentError} If the specified level is null or undefined or the row or column are less than zero. - */ -Tile.computeSector = function (level, row, column) { - if (!level) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "computeSector", "missingLevel")); - } - - if (row < 0 || column < 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "computeSector", - "The specified row or column is less than zero.")); - } - - var deltaLat = level.tileDelta.latitude, - deltaLon = level.tileDelta.longitude, - - maxLat = 180 - row * deltaLat, - minLon = -180 + column * deltaLon, - minLat = maxLat - deltaLat, - maxLon = minLon + deltaLon; - - return new Sector(minLat, maxLat, minLon, maxLon); -}; - -/** - * Creates all tiles for a specified level number. - * @param {Level} level The level to create the tiles for. - * @param {TileFactory} tileFactory The tile factory to use for creating tiles. - * @param {Tile[]} result An array in which to return the results. - * @throws {ArgumentError} If any argument is null or undefined. - */ -Tile.createTilesForLevel = function (level, tileFactory, result) { - if (!level) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "createTilesForLevel", "missingLevel")); - } - - if (!tileFactory) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "createTilesForLevel", - "The specified tile factory is null or undefined")); - } - - if (!result) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "Tile", "createTilesForLevel", "missingResult")); - } - - var deltaLat = level.tileDelta.latitude, - deltaLon = level.tileDelta.longitude, - - sector = level.sector, - firstRow = Tile.computeRow(deltaLat, sector.maxLatitude), - lastRow = Tile.computeRow(deltaLat, sector.minLatitude), - - firstCol = Tile.computeColumn(deltaLon, sector.minLongitude), - lastCol = Tile.computeColumn(deltaLon, sector.maxLongitude), - - firstRowLat = 180 - firstRow * deltaLat, - firstRowLon = -180 + firstCol * deltaLon, - - minLat, - minLon, - maxLat = firstRowLat, - maxLon; - - for (var row = firstRow; row <= lastRow; row += 1) { - minLat = maxLat - deltaLat; - minLon = firstRowLon; - - for (var col = firstCol; col <= lastCol; col += 1) { - maxLon = minLon + deltaLon; - var tileSector = new Sector(minLat, maxLat, minLon, maxLon), - tile = tileFactory.createTile(tileSector, level, row, col); - result.push(tile); - - minLon = maxLon; - } - - maxLat = minLat; - } -}; - -export default Tile; diff --git a/web/src/gis/util/TileFactory.js b/web/src/gis/util/TileFactory.js deleted file mode 100644 index d200a97c..00000000 --- a/web/src/gis/util/TileFactory.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports TileFactory - */ -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Applications must not call this constructor. It is an interface class and is not meant to be instantiated - * directly. - * @alias TileFactory - * @constructor - * @classdesc - * Represents a tile factory. - * This is an interface class and is not meant to be instantiated directly. - */ -function TileFactory() { -} - -/** - * Creates a tile for a specified sector, level and row and column within that level. - * Implementers of this interface must implement this function. - * @param {Sector} sector The sector the tile spans. - * @param {Level} level The level the tile is a member of. - * @param {Number} row The tile's row within the specified level. - * @param {Number} column The tile's column within the specified level. - * @throws {ArgumentError} If the specified sector is null or undefined. - */ -TileFactory.prototype.createTile = function (sector, level, row, column) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "TileFactory", "createTile", "abstractInvocation")); -}; - -export default TileFactory; diff --git a/web/src/gis/util/UrlBuilder.js b/web/src/gis/util/UrlBuilder.js deleted file mode 100644 index 5f93ab14..00000000 --- a/web/src/gis/util/UrlBuilder.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports UrlBuilder - */ -import Logger from '../util/Logger'; -import UnsupportedOperationError from '../error/UnsupportedOperationError'; - - -/** - * Applications must not call this constructor. It is an interface class and is not meant to be instantiated. - * @alias UrlBuilder - * @constructor - * @classdesc - * Defines an interface for tile URL builders. This is an interface class and not meant to be instantiated. - */ -function UrlBuilder() { -} - -/** - * Creates the URL string for a resource. - * @param {Tile} tile The tile for which to create the URL. - * @param {String} format The format to request. - * @returns {String} A string identifying the URL for the specified tile's resource. - * @throws {ArgumentError} If either the specified tile or format is null or undefined. - */ -UrlBuilder.prototype.urlForTile = function (tile, format) { - throw new UnsupportedOperationError( - Logger.logMessage(Logger.LEVEL_SEVERE, "UrlBuilder", "urlForTile", "abstractInvocation")); -}; - -export default UrlBuilder; diff --git a/web/src/gis/util/WWMath.js b/web/src/gis/util/WWMath.js deleted file mode 100644 index e6245f7b..00000000 --- a/web/src/gis/util/WWMath.js +++ /dev/null @@ -1,873 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import Angle from '../geom/Angle'; -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; -import Rectangle from '../geom/Rectangle'; -import Vec3 from '../geom/Vec3'; - -/** - * Provides math constants and functions. - * @exports WWMath - */ -var WWMath = { - - /** - * Returns a number within the range of a specified minimum and maximum. - * @param {Number} value The value to clamp. - * @param {Number} minimum The minimum value to return. - * @param {Number} maximum The maximum value to return. - * @returns {Number} The minimum value if the specified value is less than the minimum, the maximum value if - * the specified value is greater than the maximum, otherwise the value specified is returned. - */ - clamp: function (value, minimum, maximum) { - return value < minimum ? minimum : value > maximum ? maximum : value; - }, - - /** - * Computes a number between two numbers. - * @param amount {Number} The relative distance between the numbers at which to compute the new number. This - * should normally be a number between 0 and 1 but whatever number is specified is applied. - * @param {Number} value1 The first number. - * @param {Number} value2 The second number. - * @returns {Number} the computed value. - */ - interpolate: function (amount, value1, value2) { - return (1 - amount) * value1 + amount * value2; - }, - - /** - * Returns the cube root of a specified value. - * @param {Number} x The value whose cube root is computed. - * @returns {Number} The cube root of the specified number. - */ - cbrt: function (x) { - // Use the built-in version if it exists. cbrt() is defined in ECMA6. - if (typeof Math.cbrt === 'function') { - return Math.cbrt(x); - } else { - return Math.pow(x, 1 / 3); - } - }, - - /** - * Computes the Cartesian intersection point of a specified line with an ellipsoid. - * @param {Line} line The line for which to compute the intersection. - * @param {Number} equatorialRadius The ellipsoid's major radius. - * @param {Number} polarRadius The ellipsoid's minor radius. - * @param {Vec3} result A pre-allocated Vec3 instance in which to return the computed point. - * @returns {boolean} true if the line intersects the ellipsoid, otherwise false - * @throws {ArgumentError} If the specified line or result is null or undefined. - * @deprecated utilize the Globe.intersectsLine method attached implementation - */ - computeEllipsoidalGlobeIntersection: function (line, equatorialRadius, polarRadius, result) { - if (!line) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeEllipsoidalGlobeIntersection", "missingLine")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeEllipsoidalGlobeIntersection", "missingResult")); - } - - // Taken from "Mathematics for 3D Game Programming and Computer Graphics, Second Edition", Section 5.2.3. - // - // Note that the parameter n from in equations 5.70 and 5.71 is omitted here. For an ellipsoidal globe this - // parameter is always 1, so its square and its product with any other value simplifies to the identity. - - var vx = line.direction[0], - vy = line.direction[1], - vz = line.direction[2], - sx = line.origin[0], - sy = line.origin[1], - sz = line.origin[2], - m = equatorialRadius / polarRadius, // ratio of the x semi-axis length to the y semi-axis length - m2 = m * m, - r2 = equatorialRadius * equatorialRadius, // nominal radius squared - a = vx * vx + m2 * vy * vy + vz * vz, - b = 2 * (sx * vx + m2 * sy * vy + sz * vz), - c = sx * sx + m2 * sy * sy + sz * sz - r2, - d = b * b - 4 * a * c, // discriminant - t; - - if (d < 0) { - return false; - } - else { - t = (-b - Math.sqrt(d)) / (2 * a); - result[0] = sx + vx * t; - result[1] = sy + vy * t; - result[2] = sz + vz * t; - return true; - } - }, - - /** - * Computes the Cartesian intersection point of a specified line with a triangle. - * @param {Line} line The line for which to compute the intersection. - * @param {Vec3} vertex0 The triangle's first vertex. - * @param {Vec3} vertex1 The triangle's second vertex. - * @param {Vec3} vertex2 The triangle's third vertex. - * @param {Vec3} result A pre-allocated Vec3 instance in which to return the computed point. - * @returns {boolean} true if the line intersects the triangle, otherwise false - * @throws {ArgumentError} If the specified line, vertex or result is null or undefined. - */ - computeTriangleIntersection: function (line, vertex0, vertex1, vertex2, result) { - if (!line) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriangleIntersection", "missingLine")); - } - - if (!vertex0 || !vertex1 || !vertex2) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriangleIntersection", "missingVertex")); - } - - if (!result) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriangleIntersection", "missingResult")); - } - - // Taken from Moller and Trumbore - // https://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf - - var vx = line.direction[0], - vy = line.direction[1], - vz = line.direction[2], - sx = line.origin[0], - sy = line.origin[1], - sz = line.origin[2], - EPSILON = 0.00001; - - // find vectors for two edges sharing point a: vertex1 - vertex0 and vertex2 - vertex0 - var edge1x = vertex1[0] - vertex0[0], - edge1y = vertex1[1] - vertex0[1], - edge1z = vertex1[2] - vertex0[2], - edge2x = vertex2[0] - vertex0[0], - edge2y = vertex2[1] - vertex0[1], - edge2z = vertex2[2] - vertex0[2]; - - // Compute cross product of line direction and edge2 - var px = vy * edge2z - vz * edge2y, - py = vz * edge2x - vx * edge2z, - pz = vx * edge2y - vy * edge2x; - - // Get determinant - var det = edge1x * px + edge1y * py + edge1z * pz; // edge1 dot p - if (det > -EPSILON && det < EPSILON) { // if det is near zero then ray lies in plane of triangle - return false; - } - - var inv_det = 1.0 / det; - - // Compute distance for vertex A to ray origin: origin - vertex0 - var tx = sx - vertex0[0], - ty = sy - vertex0[1], - tz = sz - vertex0[2]; - - // Calculate u parameter and test bounds: 1/det * t dot p - var u = inv_det * (tx * px + ty * py + tz * pz); - if (u < -EPSILON || u > 1 + EPSILON) { - return false; - } - - // Prepare to test v parameter: t cross edge1 - var qx = ty * edge1z - tz * edge1y, - qy = tz * edge1x - tx * edge1z, - qz = tx * edge1y - ty * edge1x; - - // Calculate v parameter and test bounds: 1/det * dir dot q - var v = inv_det * (vx * qx + vy * qy + vz * qz); - if (v < -EPSILON || u + v > 1 + EPSILON) { - return false; - } - - // Calculate the point of intersection on the line: t = 1/det * edge2 dot q - var t = inv_det * (edge2x * qx + edge2y * qy + edge2z * qz); - if (t < 0) { - return false; - } else { - result[0] = sx + vx * t; - result[1] = sy + vy * t; - result[2] = sz + vz * t; - return true; - } - }, - - computeIndexedTrianglesIntersection: function (line, points, indices, results) { - if (!line) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeIndexedTrianglesIntersection", "missingLine")); - } - - if (!points) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeIndexedTrianglesIntersection", "missingPoints")); - } - - if (!indices) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeIndexedTrianglesIntersection", "missingIndices")); - } - - if (!results) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeIndexedTrianglesIntersection", "missingResults")); - } - - var v0 = new Vec3(0, 0, 0), - v1 = new Vec3(0, 0, 0), - v2 = new Vec3(0, 0, 0), - iPoint = new Vec3(0, 0, 0); - - for (var i = 0, len = indices.length; i < len; i += 3) { - var i0 = 3 * indices[i], - i1 = 3 * indices[i + 1], - i2 = 3 * indices[i + 2]; - - v0[0] = points[i0]; - v0[1] = points[i0 + 1]; - v0[2] = points[i0 + 2]; - - v1[0] = points[i1]; - v1[1] = points[i1 + 1]; - v1[2] = points[i1 + 2]; - - v2[0] = points[i2]; - v2[1] = points[i2 + 1]; - v2[2] = points[i2 + 2]; - - if (WWMath.computeTriangleIntersection(line, v0, v1, v2, iPoint)) { - results.push(iPoint); - iPoint = new Vec3(0, 0, 0); - } - } - - return results.length > 0; - }, - - /** - * Computes the Cartesian intersection points of a specified line with a triangle strip. The triangle strip - * is specified by a list of vertex points and a list of indices indicating the triangle strip tessellation - * of those vertices. The triangle strip indices are interpreted in the same manner as WebGL, where each - * index indicates a vertex position rather than an actual index into the points array (e.g. a triangle - * strip index of 1 indicates the XYZ tuple starting at array index 3). This is equivalent to calling - * computeTriangleIntersection for each individual triangle in the triangle strip, but is potentially much - * more efficient. - * @param {Line} line The line for which to compute the intersection. - * @param {Array} points The list of vertex points, organized as a list of tightly-packed XYZ tuples. - * @param {Array} indices The list of triangle strip indices, organized as a list of vertex positions. - * @param {Array} results A pre-allocated array instance in which to return the intersection points as - * {@link Vec3} instances. - * @throws {ArgumentError} If the specified line, points, indices or results is null or undefined. - */ - computeTriStripIntersections: function (line, points, indices, results) { - if (!line) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriStripIntersections", "missingLine")); - } - - if (!points) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriStripIntersections", "missingPoints")); - } - - if (!indices) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriStripIntersections", "missingIndices")); - } - - if (!results) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "computeTriStripIntersections", "missingResults")); - } - - // Taken from Moller and Trumbore - // https://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf - - // Adapted from the original ray-triangle intersection algorithm to optimize for ray-triangle strip - // intersection. We optimize by reusing constant terms, replacing use of Vec3 with inline primitives, - // and exploiting the triangle strip organization to reuse computations common to adjacent triangles. - // These optimizations reduce worst-case terrain picking performance by approximately 50% in Chrome on a - // 2010 iMac and a Nexus 9. - - var vx = line.direction[0], - vy = line.direction[1], - vz = line.direction[2], - sx = line.origin[0], - sy = line.origin[1], - sz = line.origin[2], - vert0x, vert0y, vert0z, - vert1x, vert1y, vert1z, - vert2x, vert2y, vert2z, - edge1x, edge1y, edge1z, - edge2x, edge2y, edge2z, - px, py, pz, - tx, ty, tz, - qx, qy, qz, - u, v, t, - det, inv_det, - index, - EPSILON = 0.00001; - - // Get the triangle strip's first vertex. - index = 3 * indices[0]; - vert1x = points[index++]; - vert1y = points[index++]; - vert1z = points[index]; - - // Get the triangle strip's second vertex. - index = 3 * indices[1]; - vert2x = points[index++]; - vert2y = points[index++]; - vert2z = points[index]; - - // Compute the intersection of each triangle with the specified ray. - for (var i = 2, len = indices.length; i < len; i++) { - // Move the last two vertices into the first two vertices. This takes advantage of the triangle - // strip's structure and avoids redundant reads from points and indices. During the first - // iteration this places the triangle strip's first three vertices in vert0, vert1 and vert2, - // respectively. - vert0x = vert1x; - vert0y = vert1y; - vert0z = vert1z; - vert1x = vert2x; - vert1y = vert2y; - vert1z = vert2z; - - // Get the triangle strip's next vertex. - index = 3 * indices[i]; - vert2x = points[index++]; - vert2y = points[index++]; - vert2z = points[index]; - - // find vectors for two edges sharing point a: vert1 - vert0 and vert2 - vert0 - edge1x = vert1x - vert0x; - edge1y = vert1y - vert0y; - edge1z = vert1z - vert0z; - edge2x = vert2x - vert0x; - edge2y = vert2y - vert0y; - edge2z = vert2z - vert0z; - - // Compute cross product of line direction and edge2 - px = vy * edge2z - vz * edge2y; - py = vz * edge2x - vx * edge2z; - pz = vx * edge2y - vy * edge2x; - - // Get determinant - det = edge1x * px + edge1y * py + edge1z * pz; // edge1 dot p - if (det > -EPSILON && det < EPSILON) { // if det is near zero then ray lies in plane of triangle - continue; - } - - inv_det = 1.0 / det; - - // Compute distance for vertex A to ray origin: origin - vert0 - tx = sx - vert0x; - ty = sy - vert0y; - tz = sz - vert0z; - - // Calculate u parameter and test bounds: 1/det * t dot p - u = inv_det * (tx * px + ty * py + tz * pz); - if (u < -EPSILON || u > 1 + EPSILON) { - continue; - } - - // Prepare to test v parameter: tvec cross edge1 - qx = ty * edge1z - tz * edge1y; - qy = tz * edge1x - tx * edge1z; - qz = tx * edge1y - ty * edge1x; - - // Calculate v parameter and test bounds: 1/det * dir dot q - v = inv_det * (vx * qx + vy * qy + vz * qz); - if (v < -EPSILON || u + v > 1 + EPSILON) { - continue; - } - - // Calculate the point of intersection on the line: t = 1/det * edge2 dot q - t = inv_det * (edge2x * qx + edge2y * qy + edge2z * qz); - if (t >= 0) { - results.push(new Vec3(sx + vx * t, sy + vy * t, sz + vz * t)); - } - } - }, - - /** - * Computes the absolute value of a specified value. - * @param {Number} a The value whose absolute value to compute. - * @returns {Number} The absolute value of the specified number. - */ - fabs: function (a) { - return a >= 0 ? a : -a; - }, - - /** - * Computes the floating-point modulus of a specified number. - * @param {Number} number The number whose modulus to compute. - * @param {Number} modulus The modulus. - * @returns {Number} The remainder after dividing the number by the modulus: number % modulus. - */ - fmod: function (number, modulus) { - return modulus === 0 ? 0 : number - Math.floor(number / modulus) * modulus; - }, - - /** - * Returns the fractional part of a specified number - * @param {Number} number The number whose fractional part to compute. - * @returns {Number} The fractional part of the specified number: number - floor(number). - */ - fract: function (number) { - return number - Math.floor(number); - }, - - /** - * Returns the integer modulus of a specified number. This differs from the % operator in that - * the result is always positive when the modulus is positive. For example -1 % 10 = -1, - * whereas mod(-1, 10) = 1. - * @param {Number} number The number whose modulus to compute. - * @param {Number} modulus The modulus. - * @returns {Number} The remainder after dividing the number by the modulus. - */ - mod: function (number, modulus) { - return (number % modulus + modulus) % modulus; - }, - - /** - * Returns the maximum of two specified numbers. - * @param {Number} value1 The first value to compare. - * @param {Number} value2 The second value to compare. - * @returns {Number} The maximum of the two specified values. - */ - max: function (value1, value2) { - return value1 > value2 ? value1 : value2; - }, - - /** - * Computes the axes of a local coordinate system on the specified globe, placing the resultant axes in the specified - * axis arguments. - * - * Upon return the specified axis arguments contain three orthogonal axes identifying the X, Y, and Z axes. Each - * axis has unit length. - * - * The local coordinate system is defined such that the Z axis maps to the globe's surface normal at the point, the - * Y axis maps to the north pointing tangent, and the X axis maps to the east pointing tangent. - * - * @param {Vec3} origin The local coordinate system origin, in model coordinates. - * @param {Globe} globe The globe the coordinate system is relative to. - * @param {Vec3} xAxisResult A pre-allocated Vec3 in which to return the computed X axis. - * @param {Vec3} yAxisResult A pre-allocated Vec3 in which to return the computed Y axis. - * @param {Vec3} zAxisResult A pre-allocated Vec3 in which to return the computed Z axis. - * @throws {ArgumentError} If any argument is null or undefined. - */ - localCoordinateAxesAtPoint: function (origin, globe, xAxisResult, yAxisResult, zAxisResult) { - if (!origin) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "localCoordinateAxesAtPoint", "missingVector")); - } - - if (!globe) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "localCoordinateAxesAtPoint", "missingGlobe")); - } - - if (!xAxisResult || !yAxisResult || !zAxisResult) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "localCoordinateAxesAtPoint", "missingResult")); - } - - var x = origin[0], - y = origin[1], - z = origin[2]; - - // Compute the z axis from the surface normal in model coordinates. This axis is used to determine the other two - // axes, and is the only constant in the computations below. - globe.surfaceNormalAtPoint(x, y, z, zAxisResult); - - // Compute the y axis from the north pointing tangent in model coordinates. This axis is known to be orthogonal to - // the z axis, and is therefore used to compute the x axis. - globe.northTangentAtPoint(x, y, z, yAxisResult); - - // Compute the x axis as the cross product of the y and z axes. This ensures that the x and z axes are orthogonal. - xAxisResult.set(yAxisResult[0], yAxisResult[1], yAxisResult[2]); - xAxisResult.cross(zAxisResult); - xAxisResult.normalize(); - - // Re-compute the y axis as the cross product of the z and x axes. This ensures that all three axes are orthogonal. - // Though the initial y axis computed above is likely to be very nearly orthogonal, we re-compute it using cross - // products to reduce the effect of floating point rounding errors caused by working with Earth sized coordinates. - yAxisResult.set(zAxisResult[0], zAxisResult[1], zAxisResult[2]); - yAxisResult.cross(xAxisResult); - yAxisResult.normalize(); - }, - - /** - * Computes the distance to a globe's horizon from a viewer at a given altitude. - * - * Only the globe's ellipsoid is considered; terrain height is not incorporated. This returns zero if the radius is zero - * or if the altitude is less than or equal to zero. - * - * @param {Number} radius The globe's radius, in meters. - * @param {Number} altitude The viewer's altitude above the globe, in meters. - * @returns {Number} The distance to the horizon, in model coordinates. - * @throws {ArgumentError} If the specified globe radius is negative. - */ - horizonDistanceForGlobeRadius: function (radius, altitude) { - if (radius < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", - "horizontalDistanceForGlobeRadius", "The specified globe radius is negative.")); - } - - return radius > 0 && altitude > 0 ? Math.sqrt(altitude * (2 * radius + altitude)) : 0; - }, - - /** - * Computes the near clip distance that corresponds to a specified far clip distance and resolution at the far clip - * plane. - * - * This computes a near clip distance appropriate for use in [perspectiveFrustumRect]{@link WWMath#perspectiveFrustumRectangle} - * and [setToPerspectiveProjection]{@link Matrix#setToPerspectiveProjection}. This returns zero if either the distance or the - * resolution are zero. - * - * @param {Number} farDistance The far clip distance, in meters. - * @param {Number} farResolution The depth resolution at the far clip plane, in meters. - * @param {Number} depthBits The number of bit-planes in the depth buffer. - * @returns {Number} The near clip distance, in meters. - * @throws {ArgumentError} If either the distance or resolution is negative, or if the depth bits is less - * than one. - */ - perspectiveNearDistanceForFarDistance: function (farDistance, farResolution, depthBits) { - if (farDistance < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveNearDistanceForFarDistance", - "The specified distance is negative.")); - } - - if (farResolution < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveNearDistanceForFarDistance", - "The specified resolution is negative.")); - } - - if (depthBits < 1) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveNearDistanceForFarDistance", - "The specified depth bits is negative.")); - } - - var maxDepthValue = (1 << depthBits) - 1; - - return farDistance / (maxDepthValue / (1 - farResolution / farDistance) - maxDepthValue + 1); - }, - - /** - * Computes the maximum near clip distance for a perspective projection that avoids clipping an object at a - * given distance from the eye point. - * <p/> - * This computes a near clip distance appropriate for use in perspectiveFrustumRect and - * Matrix.setToPerspectiveProjection. The given distance should specify the smallest distance between the - * eye and the object being viewed, but may be an approximation if an exact distance is not required. - * - * @param {Number} viewportWidth The viewport width, in screen coordinates. - * @param {Number} viewportHeight The viewport height, in screen coordinates. - * @param {Number} distanceToSurface The distance from the perspective eye point to the nearest object, in - * meters. - * @returns {Number} The maximum near clip distance, in meters. - * @throws {ArgumentError} If the specified width or height is less than or equal to zero, or if the - * specified distance is negative. - */ - perspectiveNearDistance: function (viewportWidth, viewportHeight, distanceToSurface) { - if (viewportWidth <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveNearDistance", - "invalidWidth")); - } - - if (viewportHeight <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveNearDistance", - "invalidHeight")); - } - - if (distanceToSurface < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveNearDistance", - "The specified distance is negative.")); - } - - // Compute the maximum near clip distance that avoids clipping an object at the specified distance from - // the eye. Since the furthest points on the near clip rectangle are the four corners, we compute a near - // distance that puts any one of these corners exactly at the given distance. The distance to one of the - // four corners can be expressed in terms of the near clip distance, given distance to a corner 'd', - // near distance 'n', and aspect ratio 'a': - // - // d*d = x*x + y*y + z*z - // d*d = (n*n/4 * a*a) + (n*n/4) + (n*n) - // - // Extracting 'n*n/4' from the right hand side gives: - // - // d*d = (n*n/4) * (a*a + 1 + 4) - // d*d = (n*n/4) * (a*a + 5) - // - // Finally, solving for 'n' gives: - // - // n*n = 4 * d*d / (a*a + 5) - // n = 2 * d / sqrt(a*a + 5) - - // Assumes a 45 degree horizontal field of view. - var aspectRatio = viewportHeight / viewportWidth; - - return 2 * distanceToSurface / Math.sqrt(aspectRatio * aspectRatio + 5); - }, - - /** - * Computes the coordinates of a rectangle carved out of a perspective projection's frustum at a given - * distance in model coordinates. This returns an empty rectangle if the specified distance is zero. - * - * @param {Number} viewportWidth The viewport width, in screen coordinates. - * @param {Number} viewportHeight The viewport height, in screen coordinates. - * @param {Number} distance The distance along the negative Z axis, in model coordinates. - * @returns {Rectangle} The frustum rectangle, in model coordinates. - * @throws {ArgumentError} If the specified width or height is less than or equal to zero, or if the - * specified distance is negative. - */ - perspectiveFrustumRectangle: function (viewportWidth, viewportHeight, distance) { - if (viewportWidth <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveFrustumRectangle", - "invalidWidth")); - } - - if (viewportHeight <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveFrustumRectangle", - "invalidHeight")); - } - - if (distance < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectiveFrustumRectangle", - "The specified distance is negative.")); - } - - // Assumes a 45 degree horizontal field of view. - var width = distance, - height = distance * viewportHeight / viewportWidth; - - return new Rectangle(-width / 2, -height / 2, width, height); - }, - - /** - * Computes the vertical size of a pixel in model coordinates at a given distance from the eye point in a - * perspective projection. This returns zero if the specified distance is zero. The returned size is - * undefined if the distance is less than zero. - * <p/> - * This method assumes the model of a screen composed of rectangular pixels, where pixel coordinates denote - * infinitely thin space between pixels. The units of the returned size are in model coordinates per pixel - * (usually meters per pixel). - * - * @param {Number} viewportWidth The viewport width, in screen coordinates. - * @param {Number} viewportHeight The viewport height, in screen coordinates. - * @param {Number} distance The distance from the perspective eye point at which to determine pixel size, in - * model coordinates. - * @returns {Number} The pixel size at the specified distance from the eye point, in model coordinates per - * pixel. - * @throws {ArgumentError} If the specified width or height is less than or equal to zero, or if the - * specified distance is negative. - */ - perspectivePixelSize: function (viewportWidth, viewportHeight, distance) { - if (viewportWidth <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectivePixelSize", - "invalidWidth")); - } - - if (viewportHeight <= 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectivePixelSize", - "invalidHeight")); - } - - if (distance < 0) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "perspectivePixelSize", - "The specified distance is negative.")); - } - - var frustumHeight = WWMath.perspectiveFrustumRectangle(viewportWidth, viewportHeight, distance).height; - return frustumHeight / viewportHeight; - }, - - /** - * Computes the bounding rectangle for a unit quadrilateral after applying a transformation matrix to that - * quadrilateral. - * @param {Matrix} transformMatrix The matrix to apply to the unit quadrilateral. - * @returns {Rectangle} The computed bounding rectangle. - */ - boundingRectForUnitQuad: function (transformMatrix) { - if (!transformMatrix) { - throw new ArgumentError(Logger.logMessage(Logger.LEVEL_SEVERE, "WWMath", "boundingRectForUnitQuad", - "missingMatrix")); - } - - var m = transformMatrix, - // transform of (0, 0) - x1 = m[3], - y1 = m[7], - // transform of (1, 0) - x2 = m[0] + m[3], - y2 = m[4] + m[7], - // transform of (0, 1) - x3 = m[1] + m[3], - y3 = m[5] + m[7], - // transform of (1, 1) - x4 = m[0] + m[1] + m[3], - y4 = m[4] + m[5] + m[7], - minX = Math.min(Math.min(x1, x2), Math.min(x3, x4)), - maxX = Math.max(Math.max(x1, x2), Math.max(x3, x4)), - minY = Math.min(Math.min(y1, y2), Math.min(y3, y4)), - maxY = Math.max(Math.max(y1, y2), Math.max(y3, y4)); - - return new Rectangle(minX, minY, maxX - minX, maxY - minY); - }, - - /** - * Indicates whether a specified value is a power of two. - * @param {Number} value The value to test. - * @returns {boolean} <code>true</code> if the specified value is a power of two, - * otherwise <code>false</code>. - */ - isPowerOfTwo: function (value) { - return value != 0 && (value & value - 1) === 0; - }, - - /** - * Determine the sign of a number. - * @param {Number} value The value to determine the sign of. - * @returns {Number} 1, -1, or 0, depending on the sign of the value. - */ - signum: function (value) { - return value > 0 ? 1 : value < 0 ? -1 : 0; - }, - - /** - * Calculates the Gudermannian inverse used to unproject Mercator projections. - * @param {Number} latitude The latitude in degrees. - * @returns {Number} The Gudermannian inverse for the specified latitude. - */ - gudermannianInverse: function (latitude) { - return Math.log(Math.tan(Math.PI / 4 + latitude * Angle.DEGREES_TO_RADIANS / 2)) / Math.PI; - }, - - epsg3857ToEpsg4326: function (easting, northing) { - var r = 6.3781e6, - latRadians = Math.PI / 2 - 2 * Math.atan(Math.exp(-northing / r)), - lonRadians = easting / r; - - return [ - WWMath.clamp(latRadians * Angle.RADIANS_TO_DEGREES, -90, 90), - WWMath.clamp(lonRadians * Angle.RADIANS_TO_DEGREES, -180, 180) - ]; - }, - - /** - * Returns the value that is the nearest power of 2 less than or equal to the given value. - * @param {Number} value the reference value. The power of 2 returned is less than or equal to this value. - * @returns {Number} the value that is the nearest power of 2 less than or equal to the reference value - */ - powerOfTwoFloor: function (value) { - var power = Math.floor(Math.log(value) / Math.log(2)); - return Math.pow(2, power); - }, - - /** - * Restricts an angle to the range [0, 360] degrees, wrapping angles outside the range. - * Wrapping takes place as though traversing the edge of a unit circle; - * angles less than 0 wrap back to 360, while angles greater than 360 wrap back to 0. - * - * @param {Number} degrees the angle to wrap in degrees - * - * @return {Number} the specified angle wrapped to [0, 360] degrees - */ - normalizeAngle360: function (degrees) { - var angle = degrees % 360; - return angle >= 0 ? angle : angle < 0 ? 360 + angle : 360 - angle; - }, - - /** - * 墨卡托投影(弧度) - * @param {Number} lat 纬度(弧度) - * @returns {Number} 投影纬度(弧度) - * @see https://github.com/d3/d3-geo/blob/master/src/projection/mercator.js - */ - _mercatorLat: function (lat) { - return Math.log(Math.tan((Math.PI / 2 + lat) / 2)); - }, - - /** - * 墨卡托投影(角度) - * @param {Number} lat 纬度(角度) - * @returns {Number} 投影纬度(角度) - * @see https://github.com/d3/d3-geo/blob/master/src/projection/mercator.js - */ - mercatorLat: function (lat) { - return this._mercatorLat(lat * Angle.DEGREES_TO_RADIANS) * Angle.RADIANS_TO_DEGREES; - }, - - /** - * 墨卡托投影反算(弧度) - * @param {Number} y 墨卡托投影Y坐标 - * @returns {Number} 纬度(弧度) - * @see https://github.com/d3/d3-geo/blob/master/src/projection/mercator.js - */ - _mercatorLatInvert: function (y) { - return 2 * Math.atan(Math.exp(y)) - Math.PI / 2; - }, - - /** - * 墨卡托投影反算(角度) - * @param {Number} y 墨卡托投影Y坐标(角度) - * @returns {Number} 纬度(角度) - * @see https://github.com/d3/d3-geo/blob/master/src/projection/mercator.js - */ - mercatorLatInvert: function (y) { - return this._mercatorLatInvert(y * Angle.DEGREES_TO_RADIANS) * Angle.RADIANS_TO_DEGREES; - }, - - /** - * 计算两个经纬度之间距离(弧度) - * @param {Number} lon1 经度1(弧度) - * @param {Number} lat1 纬度1(弧度) - * @param {Number} lon2 经度2(弧度) - * @param {Number} lat2 纬度2(弧度) - * @returns {Number} 距离(米) - * @see https://www.xuebuyuan.com/2173606.html - */ - _getDistance: function (lon1, lat1, lon2, lat2) { - return 2 * 6378137 * Math.asin(Math.sqrt(Math.pow(Math.sin((lat1 - lat2) / 2), 2) + - Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin((lon1 - lon2) / 2), 2))); - }, - - /** - * 计算两个经纬度之间距离(角度) - * @param {*} lon1 经度1(角度) - * @param {*} lat1 纬度1(角度) - * @param {*} lon2 经度2(角度) - * @param {*} lat2 纬度2(角度) - * @returns {Number} 距离(米) - * @see https://www.xuebuyuan.com/2173606.html - */ - getDistance: function (lon1, lat1, lon2, lat2) { - lon1 *= Angle.DEGREES_TO_RADIANS; - lat1 *= Angle.DEGREES_TO_RADIANS; - lon2 *= Angle.DEGREES_TO_RADIANS; - lat2 *= Angle.DEGREES_TO_RADIANS; - - return this._getDistance(lon1, lat1, lon2, lat2); - }, - MAX_LAT: 180 // this.mercatorLatInvert(180) = 85.0511287798066 -}; - -export default WWMath; diff --git a/web/src/gis/util/WWUtil.js b/web/src/gis/util/WWUtil.js deleted file mode 100644 index 8abc7c20..00000000 --- a/web/src/gis/util/WWUtil.js +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import ArgumentError from '../error/ArgumentError'; -import Line from '../geom/Line'; -import Logger from '../util/Logger'; -import Rectangle from '../geom/Rectangle'; -import Vec3 from '../geom/Vec3'; - -/** - * Provides math constants and functions. - * @exports WWUtil - */ -var WWUtil = { - // A regular expression that matches latitude followed by a comma and possible white space followed by - // longitude. Latitude and longitude ranges are not considered. - latLonRegex: /^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/, - - /** - * Returns the suffix for a specified mime type. - * @param {String} mimeType The mime type to determine a suffix for. - * @returns {String} The suffix for the specified mime type, or null if the mime type is not recognized. - */ - suffixForMimeType: function (mimeType) { - if (mimeType === "image/png") - return "png"; - - if (mimeType === "image/jpeg") - return "jpg"; - - if (mimeType === "application/bil16") - return "bil"; - - if (mimeType === "application/bil32") - return "bil"; - - return null; - }, - - /** - * Returns the current location URL as obtained from window.location with the last path component - * removed. - * @returns {String} The current location URL with the last path component removed. - */ - currentUrlSansFilePart: function () { - var protocol = window.location.protocol, - host = window.location.host, - path = window.location.pathname, - pathParts = path.split("/"), - newPath = ""; - - for (var i = 0, len = pathParts.length; i < len - 1; i++) { - if (pathParts[i].length > 0) { - newPath = newPath + "/" + pathParts[i]; - } - } - - return protocol + "//" + host + newPath; - }, - - /** - * Returns the URL of the directory containing the WorldWind library. - * @returns {String} The URL of the directory containing the WorldWind library, or null if that directory - * cannot be determined. - */ - worldwindlibLocation: function () { - var scripts = document.getElementsByTagName("script"), - libraryName = "/worldwind."; - - for (var i = 0; i < scripts.length; i++) { - var index = scripts[i].src.indexOf(libraryName); - if (index >= 0) { - return scripts[i].src.substring(0, index) + "/"; - } - } - - return null; - }, - - /** - * Returns the path component of a specified URL. - * @param {String} url The URL from which to determine the path component. - * @returns {String} The path component, or the empty string if the specified URL is null, undefined - * or empty. - */ - urlPath: function (url) { - if (!url) - return ""; - - var urlParts = url.split("/"), - newPath = ""; - - for (var i = 0, len = urlParts.length; i < len; i++) { - var part = urlParts[i]; - - if (!part || part.length === 0 - || part.indexOf(":") != -1 - || part === "." - || part === ".." - || part === "null" - || part === "undefined") { - continue; - } - - if (newPath.length !== 0) { - newPath = newPath + "/"; - } - - newPath = newPath + part; - } - - return newPath; - }, - - /** - * Sets each element of an array to a specified value. This function is intentionally generic, and works - * with any data structure with a length property whose elements may be referenced using array index syntax. - * @param array The array to fill. - * @param {*} value The value to assign to each array element. - */ - fillArray: function (array, value) { - if (!array) { - return; - } - - for (var i = 0, len = array.length; i < len; i++) { - array[i] = value; - } - }, - - /** - * Multiplies each element of an array by a specified value and assigns each element to the result. This - * function is intentionally generic, and works with any data structure with a length property whose - * elements may be referenced using array index syntax. - * @param array The array to fill. - * @param {*} value The value to multiply by each array element. - */ - multiplyArray: function (array, value) { - if (!array) { - return; - } - - for (var i = 0, len = array.length; i < len; i++) { - array[i] *= value; - } - }, - - // Used to form unique function names for JSONP callback functions. - jsonpCounter: 0, - - /** - * Request a resource using JSONP. - * @param {String} url The url to receive the request. - * @param {String} parameterName The JSONP callback function key required by the server. Typically - * "jsonp" or "callback". - * @param {Function} callback The function to invoke when the request succeeds. The function receives - * one argument, the JSON payload of the JSONP request. - */ - jsonp: function (url, parameterName, callback) { - - // Generate a unique function name for the JSONP callback. - var functionName = "gov_nasa_worldwind_jsonp_" + WWUtil.jsonpCounter++; - - // Define a JSONP callback function. Assign it to global scope the browser can find it. - window[functionName] = function (jsonData) { - // Remove the JSONP callback from global scope. - delete window[functionName]; - - // Call the client's callback function. - callback(jsonData); - }; - - // Append the callback query parameter to the URL. - var jsonpUrl = url + (url.indexOf('?') === -1 ? '?' : '&'); - jsonpUrl += parameterName + "=" + functionName; - - // Create a script element for the browser to invoke. - var script = document.createElement('script'); - script.async = true; - script.src = jsonpUrl; - - // Prepare to add the script to the document's head. - var head = document.getElementsByTagName('head')[0]; - - // Set up to remove the script element once it's invoked. - var cleanup = function () { - script.onload = undefined; - script.onerror = undefined; - head.removeChild(script); - }; - - script.onload = cleanup; - script.onerror = cleanup; - - // Add the script element to the document, causing the browser to invoke it. - head.appendChild(script); - }, - - arrayEquals: function (array1, array2) { - return (array1.length == array2.length) && array1.every(function (element, index) { - return element === array2[index] || element.equals && element.equals(array2[index]); - }); - }, - - /** - * It transforms given item to the boolean. It respects that 0, "0" and "false" are percieved as false - * on top of the standard Boolean function. - * @param item {String} Item to transform - * @returns {boolean} Value transformed to the boolean. - */ - transformToBoolean: function (item) { - if (item == 0 || item == "0" || item == "false") { - return false; - } else { - return Boolean(item); - } - }, - - /** - * It clones original object into the new one. It is necessary to retain the options information valid - * for all nodes. - * @param original Object to clone - * @returns {Object} Cloned object - */ - clone: function (original) { - var clone = {}; - var i, keys = Object.keys(original); - - for (i = 0; i < keys.length; i++) { - // copy each property into the clone - clone[keys[i]] = original[keys[i]]; - } - - return clone; - }, - - /** - * It returns unique GUID. - * @returns {string} String representing unique identifier in the application. - */ - guid: function () { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000) - .toString(16) - .substring(1); - } - - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + - s4() + '-' + s4() + s4() + s4(); - }, - - /** - * Transforms item to date. It accepts ISO-8601 format. - * @param item {String} To transform. - * @returns {Date} Date extracted from the current information. - */ - date: function (item) { - return new Date(item); - }, - - /** - * Determines whether subjectString begins with the characters of searchString. - * @param {String} subjectString The string to analyse. - * @param {String} searchString The characters to be searched for at the start of subjectString. - * @param {Number} position The position in subjectString at which to begin searching for searchString; defaults to 0. - * @return {Boolean} true if the given characters are found at the beginning of the string; otherwise, false. - */ - startsWith: function (subjectString, searchString, position) { - position = position || 0; - return subjectString.substr(position, searchString.length) === searchString; - }, - - /** - * Determines whether subjectString ends with the characters of searchString. - * @param {String} subjectString The string to analyse. - * @param {String} searchString The characters to be searched for at the end of subjectString. - * @param {Number} length Optional. If provided overwrites the considered length of the string to search in. If omitted, the default value is the length of the string. - * @return {Boolean} true if the given characters are found at the end of the string; otherwise, false. - */ - endsWith: function (subjectString, searchString, length) { - if (typeof length !== 'number' || !isFinite(length) || Math.floor(length) !== length || length > subjectString.length) { - length = subjectString.length; - } - length -= searchString.length; - var lastIndex = subjectString.lastIndexOf(searchString, length); - return lastIndex !== -1 && lastIndex === length; - } -}; - -export default WWUtil; diff --git a/web/src/gis/util/WmsUrlBuilder.js b/web/src/gis/util/WmsUrlBuilder.js deleted file mode 100644 index e8b5062e..00000000 --- a/web/src/gis/util/WmsUrlBuilder.js +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the - * National Aeronautics and Space Administration. All rights reserved. - * - * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @exports WmsUrlBuilder - */ -import ArgumentError from '../error/ArgumentError'; -import Logger from '../util/Logger'; - - -/** - * Constructs a WMS URL builder. - * @alias WmsUrlBuilder - * @constructor - * @classdesc Provides a factory to create URLs for WMS Get Map requests. - * @param {String} serviceAddress The address of the WMS server. - * @param {String} layerNames The comma-separated list of names of the layers to retrieve. - * @param {String} styleNames The comma-separated list of names of the styles to retrieve. May be null. - * @param {String} wmsVersion The version of the WMS server. May be null, in which case version 1.3.0 is - * assumed. - * @param {String} timeString The time parameter included in GetMap requests. - * May be null, in which case no time parameter is included in the request. - * @throws {ArgumentError} If the service address or layer names are null or empty. - * - */ -function WmsUrlBuilder(serviceAddress, layerNames, styleNames, wmsVersion, timeString) { - if (!serviceAddress || serviceAddress.length === 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WmsUrlBuilder", "constructor", - "The WMS service address is missing.")); - } - - if (!layerNames || layerNames.length === 0) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WmsUrlBuilder", "constructor", - "The WMS layer names are not specified.")); - } - - /** - * The address of the WMS server. - * @type {String} - */ - this.serviceAddress = serviceAddress; - - /** - * The comma-separated list of layer names to retrieve. - * @type {String} - */ - this.layerNames = layerNames; - - /** - * The comma-separated list of style names to retrieve. - * @type {String} - */ - this.styleNames = styleNames ? styleNames : ""; - - /** - * Indicates whether the layer should be requested with transparency. - * @type {Boolean} - * @default true - */ - this.transparent = true; - - /** - * The WMS version to specify when requesting resources. - * @type {String} - * @default 1.3.0 - */ - this.wmsVersion = wmsVersion && wmsVersion.length > 0 ? wmsVersion : "1.3.0"; - this.isWms130OrGreater = this.wmsVersion >= "1.3.0"; - - /** - * The coordinate reference system to use when requesting layers. - * @type {String} - * @default EPSG:4326 - */ - this.crs = "EPSG:4326"; - - /** - * The time parameter included in GetMap requests. If null, no time parameter is included in the requests. - * @type {String} - */ - this.timeString = timeString; -} - -/** - * Creates the URL string for a WMS Get Map request. - * @param {Tile} tile The tile for which to create the URL. - * @param {String} imageFormat The image format to request. - * @throws {ArgumentError} If the specified tile or image format are null or undefined. - */ -WmsUrlBuilder.prototype.urlForTile = function (tile, imageFormat) { - if (!tile) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WmsUrlBuilder", "urlForTile", "missingTile")); - } - - if (!imageFormat) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WmsUrlBuilder", "urlForTile", - "The image format is null or undefined.")); - } - - var sector = tile.sector; - - var sb = WmsUrlBuilder.fixGetMapString(this.serviceAddress); - - if (sb.search(/service=wms/i) < 0) { - sb = sb + "service=WMS"; - } - - sb = sb + "&request=GetMap"; - sb = sb + "&version=" + this.wmsVersion; - sb = sb + "&transparent=" + (this.transparent ? "TRUE" : "FALSE"); - sb = sb + "&layers=" + this.layerNames; - sb = sb + "&styles=" + this.styleNames; - sb = sb + "&format=" + imageFormat; - sb = sb + "&width=" + tile.tileWidth; - sb = sb + "&height=" + tile.tileHeight; - - if (this.timeString) { - sb = sb + "&time=" + this.timeString; - } - - if (this.isWms130OrGreater) { - sb = sb + "&crs=" + this.crs; - sb = sb + "&bbox="; - if (this.crs === "CRS:84") { - sb = sb + sector.minLongitude + "," + sector.minLatitude + ","; - sb = sb + sector.maxLongitude + "," + sector.maxLatitude; - } else { - sb = sb + sector.minLatitude + "," + sector.minLongitude + ","; - sb = sb + sector.maxLatitude + "," + sector.maxLongitude; - } - } else { - sb = sb + "&srs=" + this.crs; - sb = sb + "&bbox="; - sb = sb + sector.minLongitude + "," + sector.minLatitude + ","; - sb = sb + sector.maxLongitude + "," + sector.maxLatitude; - } - - sb = sb.replace(" ", "%20"); - - return sb; -}; - -// Intentionally not documented. -WmsUrlBuilder.fixGetMapString = function (serviceAddress) { - if (!serviceAddress) { - throw new ArgumentError( - Logger.logMessage(Logger.LEVEL_SEVERE, "WmsUrlBuilder", "fixGetMapString", - "The specified service address is null or undefined.")); - } - - var index = serviceAddress.indexOf("?"); - - if (index < 0) { // if string contains no question mark - serviceAddress = serviceAddress + "?"; // add one - } else if (index !== serviceAddress.length - 1) { // else if question mark not at end of string - index = serviceAddress.search(/&$/); - if (index < 0) { - serviceAddress = serviceAddress + "&"; // add a parameter separator - } - } - - return serviceAddress; -}; - -export default WmsUrlBuilder; diff --git a/web/src/gis/util/libtess.js b/web/src/gis/util/libtess.js deleted file mode 100644 index 787faed1..00000000 --- a/web/src/gis/util/libtess.js +++ /dev/null @@ -1,5272 +0,0 @@ -/* - * @license - * Copyright 2000, Silicon Graphics, Inc. All Rights Reserved. - * Copyright 2014, Google Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice including the dates of first publication and - * either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Original Code. The Original Code is: OpenGL Sample Implementation, - * Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, - * Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. - * Copyright in any portions created by third parties is as indicated - * elsewhere herein. All Rights Reserved. - */ -/* - * @author ericv@cs.stanford.edu (Eric Veach) - * @author bckenny@google.com (Brendan Kenny) - */ - -/* - * Base namespace. - * @const - */ -var libtess = {}; - -/** - * Whether to run asserts and extra debug checks. - * @define {boolean} - */ -libtess.DEBUG = false; - -/** - * Checks if the condition evaluates to true if libtess.DEBUG is true. - * @param {*} condition The condition to check. - * @param {string=} opt_message Error message in case of failure. - * @throws {Error} Assertion failed, the condition evaluates to false. - */ -libtess.assert = function (condition, opt_message) { - if (libtess.DEBUG && !condition) { - throw new Error('Assertion failed' + - (opt_message ? ': ' + opt_message : '')); - } -}; - -/** - * The maximum vertex coordinate size, 1e150. Anything larger will trigger a - * GLU_TESS_COORD_TOO_LARGE error callback and the vertex will be clamped to - * this value for all tessellation calculations. - * @const {number} - */ -libtess.GLU_TESS_MAX_COORD = 1e150; -// NOTE(bckenny): value from glu.pl generator - -/** - * Normally the polygon is projected to a plane perpendicular to one of the - * three coordinate axes before tessellating in 2d. This helps numerical - * accuracy by forgoing a transformation step by simply dropping one coordinate - * dimension. - * - * However, this can affect the placement of intersection points for non-axis- - * aligned polygons. Setting TRUE_PROJECT to true will instead project onto a - * plane actually perpendicular to the polygon's normal. - * - * NOTE(bckenny): I can find no instances on the internet in which this mode has - * been used, but it's difficult to search for. This was a compile-time setting - * in the original, so setting this as constant. If this is exposed in the - * public API, remove the ignore coverage directives on - * libtess.normal.projectPolygon and libtess.normal.normalize_. - * @const {boolean} - */ -libtess.TRUE_PROJECT = false; - -/** - * We cache vertex data for single-contour polygons so that we can try a - * quick-and-dirty decomposition first. - * @const {number} - */ -libtess.TESS_MAX_CACHE = 100; - -/** - * The default tolerance for merging features, 0, meaning vertices are only - * merged if they are exactly coincident - * If a higher tolerance is needed, significant rewriting will need to occur. - * See libtess.sweep.TOLERANCE_NONZERO_ as a starting place. - * @const {number} - */ -libtess.GLU_TESS_DEFAULT_TOLERANCE = 0; - -/** - * The input contours parition the plane into regions. A winding - * rule determines which of these regions are inside the polygon. - * - * For a single contour C, the winding number of a point x is simply - * the signed number of revolutions we make around x as we travel - * once around C (where CCW is positive). When there are several - * contours, the individual winding numbers are summed. This - * procedure associates a signed integer value with each point x in - * the plane. Note that the winding number is the same for all - * points in a single region. - * - * The winding rule classifies a region as "inside" if its winding - * number belongs to the chosen category (odd, nonzero, positive, - * negative, or absolute value of at least two). The current GLU - * tesselator implements the "odd" rule. The "nonzero" rule is another - * common way to define the interior. The other three rules are - * useful for polygon CSG operations. - * @enum {number} - */ -libtess.windingRule = { - // NOTE(bckenny): values from enumglu.spec - GLU_TESS_WINDING_ODD: 100130, - GLU_TESS_WINDING_NONZERO: 100131, - GLU_TESS_WINDING_POSITIVE: 100132, - GLU_TESS_WINDING_NEGATIVE: 100133, - GLU_TESS_WINDING_ABS_GEQ_TWO: 100134 -}; - -/** - * The type of primitive return from a "begin" callback. GL_LINE_LOOP is only - * returned when GLU_TESS_BOUNDARY_ONLY is true. GL_TRIANGLE_STRIP and - * GL_TRIANGLE_FAN are no longer returned since 1.1.0 (see release notes). - * @enum {number} - */ -libtess.primitiveType = { - GL_LINE_LOOP: 2, - GL_TRIANGLES: 4, - GL_TRIANGLE_STRIP: 5, - GL_TRIANGLE_FAN: 6 -}; - -/** - * The types of errors provided in the error callback. - * @enum {number} - */ -libtess.errorType = { - // TODO(bckenny) doc types - // NOTE(bckenny): values from enumglu.spec - GLU_TESS_MISSING_BEGIN_POLYGON: 100151, - GLU_TESS_MISSING_END_POLYGON: 100153, - GLU_TESS_MISSING_BEGIN_CONTOUR: 100152, - GLU_TESS_MISSING_END_CONTOUR: 100154, - GLU_TESS_COORD_TOO_LARGE: 100155, - GLU_TESS_NEED_COMBINE_CALLBACK: 100156 -}; - -/** - * Enum values necessary for providing settings and callbacks. See the readme - * for details. - * @enum {number} - */ -libtess.gluEnum = { - // TODO(bckenny): rename so not always typing libtess.gluEnum.*? - - // NOTE(bckenny): values from enumglu.spec - GLU_TESS_BEGIN: 100100, - GLU_TESS_VERTEX: 100101, - GLU_TESS_END: 100102, - GLU_TESS_ERROR: 100103, - GLU_TESS_EDGE_FLAG: 100104, - GLU_TESS_COMBINE: 100105, - GLU_TESS_BEGIN_DATA: 100106, - GLU_TESS_VERTEX_DATA: 100107, - GLU_TESS_END_DATA: 100108, - GLU_TESS_ERROR_DATA: 100109, - GLU_TESS_EDGE_FLAG_DATA: 100110, - GLU_TESS_COMBINE_DATA: 100111, - - GLU_TESS_MESH: 100112, // NOTE(bckenny): from tess.c - GLU_TESS_TOLERANCE: 100142, - GLU_TESS_WINDING_RULE: 100140, - GLU_TESS_BOUNDARY_ONLY: 100141, - - // TODO(bckenny): move this to libtess.errorType? - GLU_INVALID_ENUM: 100900, - GLU_INVALID_VALUE: 100901 -}; - -/** @typedef {number} */ -libtess.PQHandle; - -// TODO(bckenny): better typing on key? -/** @typedef {Object} */ -libtess.PQKey; - - -/* global libtess */ - -/** @const */ -libtess.geom = {}; - -/** - * Returns whether vertex u and vertex v are equal. - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @return {boolean} - */ -libtess.geom.vertEq = function (u, v) { - return u.s === v.s && u.t === v.t; -}; - -/** - * Returns whether vertex u is lexicographically less than or equal to vertex v. - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @return {boolean} - */ -libtess.geom.vertLeq = function (u, v) { - return u.s < v.s || u.s === v.s && u.t <= v.t; -}; - -/** - * Given three vertices u,v,w such that geom.vertLeq(u,v) && geom.vertLeq(v,w), - * evaluates the t-coord of the edge uw at the s-coord of the vertex v. - * Returns v.t - (uw)(v.s), ie. the signed distance from uw to v. - * If uw is vertical (and thus passes thru v), the result is zero. - * - * The calculation is extremely accurate and stable, even when v - * is very close to u or w. In particular if we set v.t = 0 and - * let r be the negated result (this evaluates (uw)(v.s)), then - * r is guaranteed to satisfy MIN(u.t,w.t) <= r <= MAX(u.t,w.t). - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @param {libtess.GluVertex} w - * @return {number} - */ -libtess.geom.edgeEval = function (u, v, w) { - - var gapL = v.s - u.s; - var gapR = w.s - v.s; - - if (gapL + gapR > 0) { - if (gapL < gapR) { - return v.t - u.t + (u.t - w.t) * (gapL / (gapL + gapR)); - } else { - return v.t - w.t + (w.t - u.t) * (gapR / (gapL + gapR)); - } - } - - // vertical line - return 0; -}; - -/** - * Returns a number whose sign matches geom.edgeEval(u,v,w) but which - * is cheaper to evaluate. Returns > 0, == 0 , or < 0 - * as v is above, on, or below the edge uw. - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @param {libtess.GluVertex} w - * @return {number} - */ -libtess.geom.edgeSign = function (u, v, w) { - - var gapL = v.s - u.s; - var gapR = w.s - v.s; - - if (gapL + gapR > 0) { - return (v.t - w.t) * gapL + (v.t - u.t) * gapR; - } - - // vertical line - return 0; -}; - -/** - * Version of VertLeq with s and t transposed. - * Returns whether vertex u is lexicographically less than or equal to vertex v. - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @return {boolean} - */ -libtess.geom.transLeq = function (u, v) { - return u.t < v.t || u.t === v.t && u.s <= v.s; -}; - -/** - * Version of geom.edgeEval with s and t transposed. - * Given three vertices u,v,w such that geom.transLeq(u,v) && - * geom.transLeq(v,w), evaluates the t-coord of the edge uw at the s-coord of - * the vertex v. Returns v.s - (uw)(v.t), ie. the signed distance from uw to v. - * If uw is vertical (and thus passes thru v), the result is zero. - * - * The calculation is extremely accurate and stable, even when v - * is very close to u or w. In particular if we set v.s = 0 and - * let r be the negated result (this evaluates (uw)(v.t)), then - * r is guaranteed to satisfy MIN(u.s,w.s) <= r <= MAX(u.s,w.s). - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @param {libtess.GluVertex} w - * @return {number} - */ -libtess.geom.transEval = function (u, v, w) { - - var gapL = v.t - u.t; - var gapR = w.t - v.t; - - if (gapL + gapR > 0) { - if (gapL < gapR) { - return v.s - u.s + (u.s - w.s) * (gapL / (gapL + gapR)); - } else { - return v.s - w.s + (w.s - u.s) * (gapR / (gapL + gapR)); - } - } - - // vertical line - return 0; -}; - -/** - * Version of geom.edgeSign with s and t transposed. - * Returns a number whose sign matches geom.transEval(u,v,w) but which - * is cheaper to evaluate. Returns > 0, == 0 , or < 0 - * as v is above, on, or below the edge uw. - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @param {libtess.GluVertex} w - * @return {number} - */ -libtess.geom.transSign = function (u, v, w) { - - var gapL = v.t - u.t; - var gapR = w.t - v.t; - - if (gapL + gapR > 0) { - return (v.s - w.s) * gapL + (v.s - u.s) * gapR; - } - - // vertical line - return 0; -}; - -/** - * Returns whether edge is directed from right to left. - * @param {libtess.GluHalfEdge} e - * @return {boolean} - */ -libtess.geom.edgeGoesLeft = function (e) { - return libtess.geom.vertLeq(e.dst(), e.org); -}; - -/** - * Returns whether edge is directed from left to right. - * @param {libtess.GluHalfEdge} e - * @return {boolean} - */ -libtess.geom.edgeGoesRight = function (e) { - return libtess.geom.vertLeq(e.org, e.dst()); -}; - -/** - * Calculates the L1 distance between vertices u and v. - * @param {libtess.GluVertex} u - * @param {libtess.GluVertex} v - * @return {number} - */ -libtess.geom.vertL1dist = function (u, v) { - return Math.abs(u.s - v.s) + Math.abs(u.t - v.t); -}; - -// NOTE(bckenny): vertCCW is called nowhere in libtess and isn't part of the -// public API. -/* istanbul ignore next */ -/** - * For almost-degenerate situations, the results are not reliable. - * Unless the floating-point arithmetic can be performed without - * rounding errors, *any* implementation will give incorrect results - * on some degenerate inputs, so the client must have some way to - * handle this situation. - * @param {!libtess.GluVertex} u - * @param {!libtess.GluVertex} v - * @param {!libtess.GluVertex} w - * @return {boolean} - */ -libtess.geom.vertCCW = function (u, v, w) { - return u.s * (v.t - w.t) + v.s * (w.t - u.t) + w.s * (u.t - v.t) >= 0; -}; - -/** - * Given parameters a,x,b,y returns the value (b*x+a*y)/(a+b), - * or (x+y)/2 if a==b==0. It requires that a,b >= 0, and enforces - * this in the rare case that one argument is slightly negative. - * The implementation is extremely stable numerically. - * In particular it guarantees that the result r satisfies - * MIN(x,y) <= r <= MAX(x,y), and the results are very accurate - * even when a and b differ greatly in magnitude. - * @private - * @param {number} a - * @param {number} x - * @param {number} b - * @param {number} y - * @return {number} - */ -libtess.geom.interpolate_ = function (a, x, b, y) { - // from Macro RealInterpolate: - //(a = (a < 0) ? 0 : a, b = (b < 0) ? 0 : b, ((a <= b) ? ((b == 0) ? ((x+y) / 2) : (x + (y-x) * (a/(a+b)))) : (y + (x-y) * (b/(a+b))))) - a = a < 0 ? 0 : a; - b = b < 0 ? 0 : b; - - if (a <= b) { - if (b === 0) { - return (x + y) / 2; - } else { - return x + (y - x) * (a / (a + b)); - } - } else { - return y + (x - y) * (b / (a + b)); - } -}; - -/** - * Given edges (o1,d1) and (o2,d2), compute their point of intersection. - * The computed point is guaranteed to lie in the intersection of the - * bounding rectangles defined by each edge. - * @param {!libtess.GluVertex} o1 - * @param {!libtess.GluVertex} d1 - * @param {!libtess.GluVertex} o2 - * @param {!libtess.GluVertex} d2 - * @param {!libtess.GluVertex} v - */ -libtess.geom.edgeIntersect = function (o1, d1, o2, d2, v) { - // This is certainly not the most efficient way to find the intersection - // of two line segments, but it is very numerically stable. - - // Strategy: find the two middle vertices in the VertLeq ordering, - // and interpolate the intersection s-value from these. Then repeat - // using the TransLeq ordering to find the intersection t-value. - var z1; - var z2; - var tmp; - if (!libtess.geom.vertLeq(o1, d1)) { - // Swap(o1, d1); - tmp = o1; - o1 = d1; - d1 = tmp; - } - if (!libtess.geom.vertLeq(o2, d2)) { - // Swap(o2, d2); - tmp = o2; - o2 = d2; - d2 = tmp; - } - if (!libtess.geom.vertLeq(o1, o2)) { - // Swap(o1, o2); - tmp = o1; - o1 = o2; - o2 = tmp; - // Swap(d1, d2); - tmp = d1; - d1 = d2; - d2 = tmp; - } - - if (!libtess.geom.vertLeq(o2, d1)) { - // Technically, no intersection -- do our best - v.s = (o2.s + d1.s) / 2; - - } else if (libtess.geom.vertLeq(d1, d2)) { - // Interpolate between o2 and d1 - z1 = libtess.geom.edgeEval(o1, o2, d1); - z2 = libtess.geom.edgeEval(o2, d1, d2); - if (z1 + z2 < 0) { z1 = -z1; z2 = -z2; } - v.s = libtess.geom.interpolate_(z1, o2.s, z2, d1.s); - - } else { - // Interpolate between o2 and d2 - z1 = libtess.geom.edgeSign(o1, o2, d1); - z2 = -libtess.geom.edgeSign(o1, d2, d1); - if (z1 + z2 < 0) { z1 = -z1; z2 = -z2; } - v.s = libtess.geom.interpolate_(z1, o2.s, z2, d2.s); - } - - // Now repeat the process for t - if (!libtess.geom.transLeq(o1, d1)) { - // Swap(o1, d1); - tmp = o1; - o1 = d1; - d1 = tmp; - } - if (!libtess.geom.transLeq(o2, d2)) { - // Swap(o2, d2); - tmp = o2; - o2 = d2; - d2 = tmp; - } - if (!libtess.geom.transLeq(o1, o2)) { - // Swap(o1, o2); - tmp = o1; - o1 = o2; - o2 = tmp; - // Swap(d1, d2); - tmp = d1; - d1 = d2; - d2 = tmp; - } - - if (!libtess.geom.transLeq(o2, d1)) { - // Technically, no intersection -- do our best - v.t = (o2.t + d1.t) / 2; - - } else if (libtess.geom.transLeq(d1, d2)) { - // Interpolate between o2 and d1 - z1 = libtess.geom.transEval(o1, o2, d1); - z2 = libtess.geom.transEval(o2, d1, d2); - if (z1 + z2 < 0) { z1 = -z1; z2 = -z2; } - v.t = libtess.geom.interpolate_(z1, o2.t, z2, d1.t); - - } else { - // Interpolate between o2 and d2 - z1 = libtess.geom.transSign(o1, o2, d1); - z2 = -libtess.geom.transSign(o1, d2, d1); - if (z1 + z2 < 0) { z1 = -z1; z2 = -z2; } - v.t = libtess.geom.interpolate_(z1, o2.t, z2, d2.t); - } -}; - - - -/* global libtess */ - -// TODO(bckenny): could maybe merge GluMesh and mesh.js since these are -// operations on the mesh - -/** @const */ -libtess.mesh = {}; - -/****************** Basic Edge Operations **********************/ - - -/** - * makeEdge creates one edge, two vertices, and a loop (face). - * The loop consists of the two new half-edges. - * - * @param {libtess.GluMesh} mesh [description]. - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.mesh.makeEdge = function (mesh) { - // TODO(bckenny): probably move to GluMesh, but needs Make* methods with it - - var e = libtess.mesh.makeEdgePair_(mesh.eHead); - - // complete edge with vertices and face (see mesh.makeEdgePair_) - libtess.mesh.makeVertex_(e, mesh.vHead); - libtess.mesh.makeVertex_(e.sym, mesh.vHead); - libtess.mesh.makeFace_(e, mesh.fHead); - - return e; -}; - - -/** - * meshSplice(eOrg, eDst) is the basic operation for changing the - * mesh connectivity and topology. It changes the mesh so that - * eOrg.oNext <- OLD( eDst.oNext ) - * eDst.oNext <- OLD( eOrg.oNext ) - * where OLD(...) means the value before the meshSplice operation. - * - * This can have two effects on the vertex structure: - * - if eOrg.org != eDst.org, the two vertices are merged together - * - if eOrg.org == eDst.org, the origin is split into two vertices - * In both cases, eDst.org is changed and eOrg.org is untouched. - * - * Similarly (and independently) for the face structure, - * - if eOrg.lFace == eDst.lFace, one loop is split into two - * - if eOrg.lFace != eDst.lFace, two distinct loops are joined into one - * In both cases, eDst.lFace is changed and eOrg.lFace is unaffected. - * - * Some special cases: - * If eDst == eOrg, the operation has no effect. - * If eDst == eOrg.lNext, the new face will have a single edge. - * If eDst == eOrg.lPrev(), the old face will have a single edge. - * If eDst == eOrg.oNext, the new vertex will have a single edge. - * If eDst == eOrg.oPrev(), the old vertex will have a single edge. - * - * @param {libtess.GluHalfEdge} eOrg [description]. - * @param {libtess.GluHalfEdge} eDst [description]. - */ -libtess.mesh.meshSplice = function (eOrg, eDst) { - // TODO: more descriptive name? - - var joiningLoops = false; - var joiningVertices = false; - - if (eOrg === eDst) { - return; - } - - if (eDst.org !== eOrg.org) { - // We are merging two disjoint vertices -- destroy eDst.org - joiningVertices = true; - libtess.mesh.killVertex_(eDst.org, eOrg.org); - } - - if (eDst.lFace !== eOrg.lFace) { - // We are connecting two disjoint loops -- destroy eDst.lFace - joiningLoops = true; - libtess.mesh.killFace_(eDst.lFace, eOrg.lFace); - } - - // Change the edge structure - libtess.mesh.splice_(eDst, eOrg); - - if (!joiningVertices) { - // We split one vertex into two -- the new vertex is eDst.org. - // Make sure the old vertex points to a valid half-edge. - libtess.mesh.makeVertex_(eDst, eOrg.org); - eOrg.org.anEdge = eOrg; - } - - if (!joiningLoops) { - // We split one loop into two -- the new loop is eDst.lFace. - // Make sure the old face points to a valid half-edge. - libtess.mesh.makeFace_(eDst, eOrg.lFace); - eOrg.lFace.anEdge = eOrg; - } -}; - - -/** - * deleteEdge(eDel) removes the edge eDel. There are several cases: - * if (eDel.lFace != eDel.rFace()), we join two loops into one; the loop - * eDel.lFace is deleted. Otherwise, we are splitting one loop into two; - * the newly created loop will contain eDel.dst(). If the deletion of eDel - * would create isolated vertices, those are deleted as well. - * - * This function could be implemented as two calls to __gl_meshSplice - * plus a few calls to memFree, but this would allocate and delete - * unnecessary vertices and faces. - * - * @param {libtess.GluHalfEdge} eDel [description]. - */ -libtess.mesh.deleteEdge = function (eDel) { - var eDelSym = eDel.sym; - var joiningLoops = false; - - // First step: disconnect the origin vertex eDel.org. We make all - // changes to get a consistent mesh in this "intermediate" state. - if (eDel.lFace !== eDel.rFace()) { - // We are joining two loops into one -- remove the left face - joiningLoops = true; - libtess.mesh.killFace_(eDel.lFace, eDel.rFace()); - } - - if (eDel.oNext === eDel) { - libtess.mesh.killVertex_(eDel.org, null); - - } else { - // Make sure that eDel.org and eDel.rFace() point to valid half-edges - eDel.rFace().anEdge = eDel.oPrev(); - eDel.org.anEdge = eDel.oNext; - - libtess.mesh.splice_(eDel, eDel.oPrev()); - - if (!joiningLoops) { - // We are splitting one loop into two -- create a new loop for eDel. - libtess.mesh.makeFace_(eDel, eDel.lFace); - } - } - - // Claim: the mesh is now in a consistent state, except that eDel.org - // may have been deleted. Now we disconnect eDel.dst(). - if (eDelSym.oNext === eDelSym) { - libtess.mesh.killVertex_(eDelSym.org, null); - libtess.mesh.killFace_(eDelSym.lFace, null); - - } else { - // Make sure that eDel.dst() and eDel.lFace point to valid half-edges - eDel.lFace.anEdge = eDelSym.oPrev(); - eDelSym.org.anEdge = eDelSym.oNext; - libtess.mesh.splice_(eDelSym, eDelSym.oPrev()); - } - - // Any isolated vertices or faces have already been freed. - libtess.mesh.killEdge_(eDel); -}; - -/******************** Other Edge Operations **********************/ - -/* All these routines can be implemented with the basic edge - * operations above. They are provided for convenience and efficiency. - */ - - -/** - * addEdgeVertex(eOrg) creates a new edge eNew such that - * eNew == eOrg.lNext, and eNew.dst() is a newly created vertex. - * eOrg and eNew will have the same left face. - * - * @param {libtess.GluHalfEdge} eOrg [description]. - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.mesh.addEdgeVertex = function (eOrg) { - // TODO(bckenny): why is it named this? - - var eNew = libtess.mesh.makeEdgePair_(eOrg); - var eNewSym = eNew.sym; - - // Connect the new edge appropriately - libtess.mesh.splice_(eNew, eOrg.lNext); - - // Set the vertex and face information - eNew.org = eOrg.dst(); - - libtess.mesh.makeVertex_(eNewSym, eNew.org); - - eNew.lFace = eNewSym.lFace = eOrg.lFace; - - return eNew; -}; - - -/** - * splitEdge(eOrg) splits eOrg into two edges eOrg and eNew, - * such that eNew == eOrg.lNext. The new vertex is eOrg.dst() == eNew.org. - * eOrg and eNew will have the same left face. - * - * @param {libtess.GluHalfEdge} eOrg [description]. - * @return {!libtess.GluHalfEdge} [description]. - */ -libtess.mesh.splitEdge = function (eOrg) { - var tempHalfEdge = libtess.mesh.addEdgeVertex(eOrg); - var eNew = tempHalfEdge.sym; - - // Disconnect eOrg from eOrg.dst() and connect it to eNew.org - libtess.mesh.splice_(eOrg.sym, eOrg.sym.oPrev()); - libtess.mesh.splice_(eOrg.sym, eNew); - - // Set the vertex and face information - eOrg.sym.org = eNew.org; // NOTE(bckenny): assignment to dst - eNew.dst().anEdge = eNew.sym; // may have pointed to eOrg.sym - eNew.sym.lFace = eOrg.rFace(); // NOTE(bckenny): assignment to rFace - eNew.winding = eOrg.winding; // copy old winding information - eNew.sym.winding = eOrg.sym.winding; - - return eNew; -}; - - -/** - * connect(eOrg, eDst) creates a new edge from eOrg.dst() - * to eDst.org, and returns the corresponding half-edge eNew. - * If eOrg.lFace == eDst.lFace, this splits one loop into two, - * and the newly created loop is eNew.lFace. Otherwise, two disjoint - * loops are merged into one, and the loop eDst.lFace is destroyed. - * - * If (eOrg == eDst), the new face will have only two edges. - * If (eOrg.lNext == eDst), the old face is reduced to a single edge. - * If (eOrg.lNext.lNext == eDst), the old face is reduced to two edges. - * - * @param {libtess.GluHalfEdge} eOrg [description]. - * @param {libtess.GluHalfEdge} eDst [description]. - * @return {!libtess.GluHalfEdge} [description]. - */ -libtess.mesh.connect = function (eOrg, eDst) { - var joiningLoops = false; - var eNew = libtess.mesh.makeEdgePair_(eOrg); - var eNewSym = eNew.sym; - - if (eDst.lFace !== eOrg.lFace) { - // We are connecting two disjoint loops -- destroy eDst.lFace - joiningLoops = true; - libtess.mesh.killFace_(eDst.lFace, eOrg.lFace); - } - - // Connect the new edge appropriately - libtess.mesh.splice_(eNew, eOrg.lNext); - libtess.mesh.splice_(eNewSym, eDst); - - // Set the vertex and face information - eNew.org = eOrg.dst(); - eNewSym.org = eDst.org; - eNew.lFace = eNewSym.lFace = eOrg.lFace; - - // Make sure the old face points to a valid half-edge - eOrg.lFace.anEdge = eNewSym; - - if (!joiningLoops) { - // We split one loop into two -- the new loop is eNew.lFace - libtess.mesh.makeFace_(eNew, eOrg.lFace); - } - return eNew; -}; - -/******************** Other Operations **********************/ - - -/** - * zapFace(fZap) destroys a face and removes it from the - * global face list. All edges of fZap will have a null pointer as their - * left face. Any edges which also have a null pointer as their right face - * are deleted entirely (along with any isolated vertices this produces). - * An entire mesh can be deleted by zapping its faces, one at a time, - * in any order. Zapped faces cannot be used in further mesh operations! - * - * @param {libtess.GluFace} fZap [description]. - */ -libtess.mesh.zapFace = function (fZap) { - var eStart = fZap.anEdge; - - // walk around face, deleting edges whose right face is also NULL - var eNext = eStart.lNext; - var e; - do { - e = eNext; - eNext = e.lNext; - - e.lFace = null; - if (e.rFace() === null) { - // delete the edge -- see mesh.deleteEdge above - if (e.oNext === e) { - libtess.mesh.killVertex_(e.org, null); - - } else { - // Make sure that e.org points to a valid half-edge - e.org.anEdge = e.oNext; - libtess.mesh.splice_(e, e.oPrev()); - } - - var eSym = e.sym; - - if (eSym.oNext === eSym) { - libtess.mesh.killVertex_(eSym.org, null); - - } else { - // Make sure that eSym.org points to a valid half-edge - eSym.org.anEdge = eSym.oNext; - libtess.mesh.splice_(eSym, eSym.oPrev()); - } - libtess.mesh.killEdge_(e); - } - } while (e !== eStart); - - // delete from circular doubly-linked list - var fPrev = fZap.prev; - var fNext = fZap.next; - fNext.prev = fPrev; - fPrev.next = fNext; - - // TODO(bckenny): memFree( fZap ); - // TODO(bckenny): probably null at callsite -}; - -// TODO(bckenny): meshUnion isn't called within libtess and isn't part of the -// public API. Could be useful if more mesh manipulation functions are exposed. -/* istanbul ignore next */ -/** - * meshUnion() forms the union of all structures in - * both meshes, and returns the new mesh (the old meshes are destroyed). - * - * @param {!libtess.GluMesh} mesh1 - * @param {!libtess.GluMesh} mesh2 - * @return {!libtess.GluMesh} - */ -libtess.mesh.meshUnion = function (mesh1, mesh2) { - // TODO(bceknny): probably move to GluMesh method - var f1 = mesh1.fHead; - var v1 = mesh1.vHead; - var e1 = mesh1.eHead; - - var f2 = mesh2.fHead; - var v2 = mesh2.vHead; - var e2 = mesh2.eHead; - - // Add the faces, vertices, and edges of mesh2 to those of mesh1 - if (f2.next !== f2) { - f1.prev.next = f2.next; - f2.next.prev = f1.prev; - f2.prev.next = f1; - f1.prev = f2.prev; - } - - if (v2.next !== v2) { - v1.prev.next = v2.next; - v2.next.prev = v1.prev; - v2.prev.next = v1; - v1.prev = v2.prev; - } - - if (e2.next !== e2) { - e1.sym.next.sym.next = e2.next; - e2.next.sym.next = e1.sym.next; - e2.sym.next.sym.next = e1; - e1.sym.next = e2.sym.next; - } - - // TODO(bckenny): memFree(mesh2); - // TODO(bckenny): If function is kept, remove mesh2's data to enforce. - return mesh1; -}; - - -/** - * deleteMesh(mesh) will free all storage for any valid mesh. - * @param {libtess.GluMesh} mesh [description]. - */ -libtess.mesh.deleteMesh = function (mesh) { - // TODO(bckenny): unnecessary, I think. - // TODO(bckenny): might want to explicitly null at callsite - // lots of memFrees. see also DELETE_BY_ZAPPING -}; - -/************************ Utility Routines ************************/ - - -/** - * Creates a new pair of half-edges which form their own loop. - * No vertex or face structures are allocated, but these must be assigned - * before the current edge operation is completed. - * - * TODO(bckenny): warning about eNext strictly being first of pair? (see code) - * - * @private - * @param {libtess.GluHalfEdge} eNext [description]. - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.mesh.makeEdgePair_ = function (eNext) { - var e = new libtess.GluHalfEdge(); - var eSym = new libtess.GluHalfEdge(); - - // TODO(bckenny): how do we ensure this? see above comment in jsdoc - // Make sure eNext points to the first edge of the edge pair - // if (eNext->Sym < eNext ) { eNext = eNext->Sym; } - - // NOTE(bckenny): check this for bugs in current implementation! - - // Insert in circular doubly-linked list before eNext. - // Note that the prev pointer is stored in sym.next. - var ePrev = eNext.sym.next; - eSym.next = ePrev; - ePrev.sym.next = e; - e.next = eNext; - eNext.sym.next = eSym; - - e.sym = eSym; - e.oNext = e; - e.lNext = eSym; - - eSym.sym = e; - eSym.oNext = eSym; - eSym.lNext = e; - - return e; -}; - - -/** - * splice_ is best described by the Guibas/Stolfi paper or the - * CS348a notes. Basically, it modifies the mesh so that - * a.oNext and b.oNext are exchanged. This can have various effects - * depending on whether a and b belong to different face or vertex rings. - * For more explanation see mesh.meshSplice below. - * - * @private - * @param {libtess.GluHalfEdge} a [description]. - * @param {libtess.GluHalfEdge} b [description]. - */ -libtess.mesh.splice_ = function (a, b) { - var aONext = a.oNext; - var bONext = b.oNext; - - aONext.sym.lNext = b; - bONext.sym.lNext = a; - a.oNext = bONext; - b.oNext = aONext; -}; - - -/** - * makeVertex_(eOrig, vNext) attaches a new vertex and makes it the - * origin of all edges in the vertex loop to which eOrig belongs. "vNext" gives - * a place to insert the new vertex in the global vertex list. We insert - * the new vertex *before* vNext so that algorithms which walk the vertex - * list will not see the newly created vertices. - * - * NOTE: unlike original, acutally allocates new vertex. - * - * @private - * @param {libtess.GluHalfEdge} eOrig [description]. - * @param {libtess.GluVertex} vNext [description]. - */ -libtess.mesh.makeVertex_ = function (eOrig, vNext) { - // insert in circular doubly-linked list before vNext - var vPrev = vNext.prev; - var vNew = new libtess.GluVertex(vNext, vPrev); - vPrev.next = vNew; - vNext.prev = vNew; - - vNew.anEdge = eOrig; - // leave coords, s, t undefined - // TODO(bckenny): does above line mean 0 specifically, or does it matter? - - // fix other edges on this vertex loop - var e = eOrig; - do { - e.org = vNew; - e = e.oNext; - } while (e !== eOrig); -}; - - -/** - * makeFace_(eOrig, fNext) attaches a new face and makes it the left - * face of all edges in the face loop to which eOrig belongs. "fNext" gives - * a place to insert the new face in the global face list. We insert - * the new face *before* fNext so that algorithms which walk the face - * list will not see the newly created faces. - * - * NOTE: unlike original, acutally allocates new face. - * - * @private - * @param {libtess.GluHalfEdge} eOrig [description]. - * @param {libtess.GluFace} fNext [description]. - */ -libtess.mesh.makeFace_ = function (eOrig, fNext) { - // insert in circular doubly-linked list before fNext - var fPrev = fNext.prev; - var fNew = new libtess.GluFace(fNext, fPrev); - fPrev.next = fNew; - fNext.prev = fNew; - - fNew.anEdge = eOrig; - - // The new face is marked "inside" if the old one was. This is a - // convenience for the common case where a face has been split in two. - fNew.inside = fNext.inside; - - // fix other edges on this face loop - var e = eOrig; - do { - e.lFace = fNew; - e = e.lNext; - } while (e !== eOrig); -}; - - -/** - * killEdge_ destroys an edge (the half-edges eDel and eDel.sym), - * and removes from the global edge list. - * - * @private - * @param {libtess.GluHalfEdge} eDel [description]. - */ -libtess.mesh.killEdge_ = function (eDel) { - // TODO(bckenny): in this case, no need to worry(?), but check when checking mesh.makeEdgePair_ - // Half-edges are allocated in pairs, see EdgePair above - // if (eDel->Sym < eDel ) { eDel = eDel->Sym; } - - // delete from circular doubly-linked list - var eNext = eDel.next; - var ePrev = eDel.sym.next; - eNext.sym.next = ePrev; - ePrev.sym.next = eNext; - - // TODO(bckenny): memFree( eDel ); (which also frees eDel.sym) - // TODO(bckenny): need to null at callsites? -}; - - -/** - * killVertex_ destroys a vertex and removes it from the global - * vertex list. It updates the vertex loop to point to a given new vertex. - * - * @private - * @param {libtess.GluVertex} vDel [description]. - * @param {libtess.GluVertex} newOrg [description]. - */ -libtess.mesh.killVertex_ = function (vDel, newOrg) { - var eStart = vDel.anEdge; - - // change the origin of all affected edges - var e = eStart; - do { - e.org = newOrg; - e = e.oNext; - } while (e !== eStart); - - // delete from circular doubly-linked list - var vPrev = vDel.prev; - var vNext = vDel.next; - vNext.prev = vPrev; - vPrev.next = vNext; - - // TODO(bckenny): memFree( vDel ); - // TODO(bckenny): need to null at callsites? -}; - - -/** - * killFace_ destroys a face and removes it from the global face - * list. It updates the face loop to point to a given new face. - * - * @private - * @param {libtess.GluFace} fDel [description]. - * @param {libtess.GluFace} newLFace [description]. - */ -libtess.mesh.killFace_ = function (fDel, newLFace) { - var eStart = fDel.anEdge; - - // change the left face of all affected edges - var e = eStart; - do { - e.lFace = newLFace; - e = e.lNext; - } while (e !== eStart); - - // delete from circular doubly-linked list - var fPrev = fDel.prev; - var fNext = fDel.next; - fNext.prev = fPrev; - fPrev.next = fNext; - - // TODO(bckenny): memFree( fDel ); - // TODO(bckenny): need to null at callsites? -}; - - -/* global libtess */ - -/** @const */ -libtess.normal = {}; - -// TODO(bckenny): Integrate SLANTED_SWEEP somehow? -/* The "feature merging" is not intended to be complete. There are - * special cases where edges are nearly parallel to the sweep line - * which are not implemented. The algorithm should still behave - * robustly (ie. produce a reasonable tesselation) in the presence - * of such edges, however it may miss features which could have been - * merged. We could minimize this effect by choosing the sweep line - * direction to be something unusual (ie. not parallel to one of the - * coordinate axes). - * #if defined(SLANTED_SWEEP) - * #define S_UNIT_X 0.50941539564955385 // Pre-normalized - * #define S_UNIT_Y 0.86052074622010633 - * #endif - */ - -/** - * X coordinate of local basis for polygon projection. - * @private - * @const - */ -libtess.normal.S_UNIT_X_ = 1.0; - -/** - * Y coordinate of local basis for polygon projection. - * @private - * @const - */ -libtess.normal.S_UNIT_Y_ = 0.0; - -/** - * Determines a polygon normal and projects vertices onto the plane of the - * polygon. - * @param {!libtess.GluTesselator} tess - */ -libtess.normal.projectPolygon = function (tess) { - var computedNormal = false; - - var norm = [ - tess.normal[0], - tess.normal[1], - tess.normal[2] - ]; - if (norm[0] === 0 && norm[1] === 0 && norm[2] === 0) { - libtess.normal.computeNormal_(tess, norm); - computedNormal = true; - } - - var sUnit = tess.sUnit; - var tUnit = tess.tUnit; - var i = libtess.normal.longAxis_(norm); - - // NOTE(bckenny): This branch is never taken. See comment on - // libtess.TRUE_PROJECT. - /* istanbul ignore if */ - if (libtess.TRUE_PROJECT) { - // Choose the initial sUnit vector to be approximately perpendicular - // to the normal. - libtess.normal.normalize_(norm); - - sUnit[i] = 0; - sUnit[(i + 1) % 3] = libtess.normal.S_UNIT_X_; - sUnit[(i + 2) % 3] = libtess.normal.S_UNIT_Y_; - - // Now make it exactly perpendicular - var w = libtess.normal.dot_(sUnit, norm); - sUnit[0] -= w * norm[0]; - sUnit[1] -= w * norm[1]; - sUnit[2] -= w * norm[2]; - libtess.normal.normalize_(sUnit); - - // Choose tUnit so that (sUnit,tUnit,norm) form a right-handed frame - tUnit[0] = norm[1] * sUnit[2] - norm[2] * sUnit[1]; - tUnit[1] = norm[2] * sUnit[0] - norm[0] * sUnit[2]; - tUnit[2] = norm[0] * sUnit[1] - norm[1] * sUnit[0]; - libtess.normal.normalize_(tUnit); - - } else { - // Project perpendicular to a coordinate axis -- better numerically - sUnit[i] = 0; - sUnit[(i + 1) % 3] = libtess.normal.S_UNIT_X_; - sUnit[(i + 2) % 3] = libtess.normal.S_UNIT_Y_; - - tUnit[i] = 0; - tUnit[(i + 1) % 3] = norm[i] > 0 ? - -libtess.normal.S_UNIT_Y_ : libtess.normal.S_UNIT_Y_; - tUnit[(i + 2) % 3] = norm[i] > 0 ? - libtess.normal.S_UNIT_X_ : -libtess.normal.S_UNIT_X_; - } - - // Project the vertices onto the sweep plane - var vHead = tess.mesh.vHead; - for (var v = vHead.next; v !== vHead; v = v.next) { - v.s = libtess.normal.dot_(v.coords, sUnit); - v.t = libtess.normal.dot_(v.coords, tUnit); - } - - if (computedNormal) { - libtess.normal.checkOrientation_(tess); - } -}; - -/** - * Computes the dot product of vectors u and v. - * @private - * @param {!Array.<number>} u - * @param {!Array.<number>} v - * @return {number} - */ -libtess.normal.dot_ = function (u, v) { - return u[0] * v[0] + u[1] * v[1] + u[2] * v[2]; -}; - -// NOTE(bckenny): only called from within libtess.normal.projectPolygon's -// TRUE_PROJECT branch, so ignoring for code coverage. -/* istanbul ignore next */ -/** - * Normalize vector v. - * @private - * @param {!Array.<number>} v - */ -libtess.normal.normalize_ = function (v) { - var len = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; - - len = Math.sqrt(len); - v[0] /= len; - v[1] /= len; - v[2] /= len; -}; - -/** - * Returns the index of the longest component of vector v. - * @private - * @param {!Array.<number>} v - * @return {number} - */ -libtess.normal.longAxis_ = function (v) { - var i = 0; - - if (Math.abs(v[1]) > Math.abs(v[0])) { - i = 1; - } - if (Math.abs(v[2]) > Math.abs(v[i])) { - i = 2; - } - - return i; -}; - -/** - * Compute an approximate normal of the polygon from the vertices themselves. - * Result returned in norm. - * @private - * @param {!libtess.GluTesselator} tess - * @param {!Array.<number>} norm - */ -libtess.normal.computeNormal_ = function (tess, norm) { - var maxVal = [ - -2 * libtess.GLU_TESS_MAX_COORD, - -2 * libtess.GLU_TESS_MAX_COORD, - -2 * libtess.GLU_TESS_MAX_COORD - ]; - var minVal = [ - 2 * libtess.GLU_TESS_MAX_COORD, - 2 * libtess.GLU_TESS_MAX_COORD, - 2 * libtess.GLU_TESS_MAX_COORD - ]; - var maxVert = []; - var minVert = []; - - var v; - var vHead = tess.mesh.vHead; - for (v = vHead.next; v !== vHead; v = v.next) { - for (var i = 0; i < 3; ++i) { - var c = v.coords[i]; - if (c < minVal[i]) { minVal[i] = c; minVert[i] = v; } - if (c > maxVal[i]) { maxVal[i] = c; maxVert[i] = v; } - } - } - - // Find two vertices separated by at least 1/sqrt(3) of the maximum - // distance between any two vertices - var index = 0; - if (maxVal[1] - minVal[1] > maxVal[0] - minVal[0]) { index = 1; } - if (maxVal[2] - minVal[2] > maxVal[index] - minVal[index]) { index = 2; } - if (minVal[index] >= maxVal[index]) { - // All vertices are the same -- normal doesn't matter - norm[0] = 0; norm[1] = 0; norm[2] = 1; - return; - } - - // Look for a third vertex which forms the triangle with maximum area - // (Length of normal == twice the triangle area) - var maxLen2 = 0; - var v1 = minVert[index]; - var v2 = maxVert[index]; - var tNorm = [0, 0, 0]; - var d1 = [ - v1.coords[0] - v2.coords[0], - v1.coords[1] - v2.coords[1], - v1.coords[2] - v2.coords[2] - ]; - var d2 = [0, 0, 0]; - for (v = vHead.next; v !== vHead; v = v.next) { - d2[0] = v.coords[0] - v2.coords[0]; - d2[1] = v.coords[1] - v2.coords[1]; - d2[2] = v.coords[2] - v2.coords[2]; - tNorm[0] = d1[1] * d2[2] - d1[2] * d2[1]; - tNorm[1] = d1[2] * d2[0] - d1[0] * d2[2]; - tNorm[2] = d1[0] * d2[1] - d1[1] * d2[0]; - var tLen2 = tNorm[0] * tNorm[0] + tNorm[1] * tNorm[1] + tNorm[2] * tNorm[2]; - if (tLen2 > maxLen2) { - maxLen2 = tLen2; - norm[0] = tNorm[0]; - norm[1] = tNorm[1]; - norm[2] = tNorm[2]; - } - } - - if (maxLen2 <= 0) { - // All points lie on a single line -- any decent normal will do - norm[0] = norm[1] = norm[2] = 0; - norm[libtess.normal.longAxis_(d1)] = 1; - } -}; - -/** - * Check that the sum of the signed area of all projected contours is - * non-negative. If not, negate the t-coordinates to reverse the orientation and - * make it so. - * @private - * @param {!libtess.GluTesselator} tess - */ -libtess.normal.checkOrientation_ = function (tess) { - var area = 0; - var fHead = tess.mesh.fHead; - for (var f = fHead.next; f !== fHead; f = f.next) { - var e = f.anEdge; - if (e.winding <= 0) { continue; } - do { - area += (e.org.s - e.dst().s) * (e.org.t + e.dst().t); - e = e.lNext; - } while (e !== f.anEdge); - } - - if (area < 0) { - // Reverse the orientation by flipping all the t-coordinates - var vHead = tess.mesh.vHead; - for (var v = vHead.next; v !== vHead; v = v.next) { - v.t = -v.t; - } - tess.tUnit[0] = -tess.tUnit[0]; - tess.tUnit[1] = -tess.tUnit[1]; - tess.tUnit[2] = -tess.tUnit[2]; - } -}; - - -/* global libtess */ - -/** @const */ -libtess.render = {}; - -/** - * Takes a mesh, breaks it into separate triangles, and renders them. The - * rendering output is provided as callbacks (see the API). Set flagEdges to - * true to get edgeFlag callbacks (tess.flagBoundary in original libtess). - * @param {!libtess.GluTesselator} tess - * @param {!libtess.GluMesh} mesh - * @param {boolean} flagEdges - */ -libtess.render.renderMesh = function (tess, mesh, flagEdges) { - var beginOrBeginDataCalled = false; - - // TODO(bckenny): edgeState needs to be boolean, but !== on first call - // force edge state output for first vertex - var edgeState = -1; - - // We examine all faces in an arbitrary order. Whenever we find - // an inside triangle f, we render f. - // NOTE(bckenny): go backwards through face list to match original libtess - // triangle order - for (var f = mesh.fHead.prev; f !== mesh.fHead; f = f.prev) { - if (f.inside) { - // We're going to emit a triangle, so call begin callback once - if (!beginOrBeginDataCalled) { - tess.callBeginOrBeginData(libtess.primitiveType.GL_TRIANGLES); - beginOrBeginDataCalled = true; - } - - // check that face has only three edges - var e = f.anEdge; - // Loop once for each edge (there will always be 3 edges) - do { - if (flagEdges) { - // Set the "edge state" to true just before we output the - // first vertex of each edge on the polygon boundary. - var newState = !e.rFace().inside ? 1 : 0; // TODO(bckenny): total hack to get edgeState working. fix me. - if (edgeState !== newState) { - edgeState = newState; - // TODO(bckenny): edgeState should be boolean now - tess.callEdgeFlagOrEdgeFlagData(!!edgeState); - } - } - - // emit vertex - tess.callVertexOrVertexData(e.org.data); - - e = e.lNext; - } while (e !== f.anEdge); - } - } - - // only call end callback if begin was called - if (beginOrBeginDataCalled) { - tess.callEndOrEndData(); - } -}; - -/** - * Takes a mesh, and outputs one contour for each face marked "inside". The - * rendering output is provided as callbacks (see the API). - * @param {!libtess.GluTesselator} tess - * @param {!libtess.GluMesh} mesh - */ -libtess.render.renderBoundary = function (tess, mesh) { - for (var f = mesh.fHead.next; f !== mesh.fHead; f = f.next) { - if (f.inside) { - tess.callBeginOrBeginData(libtess.primitiveType.GL_LINE_LOOP); - - var e = f.anEdge; - do { - tess.callVertexOrVertexData(e.org.data); - e = e.lNext; - } while (e !== f.anEdge); - - tess.callEndOrEndData(); - } - } -}; - - -/* global libtess */ - -// TODO(bckenny): a number of these never return null (as opposed to original) and should be typed appropriately - -/* - * Invariants for the Edge Dictionary. - * - each pair of adjacent edges e2=succ(e1) satisfies edgeLeq_(e1,e2) - * at any valid location of the sweep event - * - if edgeLeq_(e2,e1) as well (at any valid sweep event), then e1 and e2 - * share a common endpoint - * - for each e, e.dst() has been processed, but not e.org - * - each edge e satisfies vertLeq(e.dst(),event) && vertLeq(event,e.org) - * where "event" is the current sweep line event. - * - no edge e has zero length - * - * Invariants for the Mesh (the processed portion). - * - the portion of the mesh left of the sweep line is a planar graph, - * ie. there is *some* way to embed it in the plane - * - no processed edge has zero length - * - no two processed vertices have identical coordinates - * - each "inside" region is monotone, ie. can be broken into two chains - * of monotonically increasing vertices according to VertLeq(v1,v2) - * - a non-invariant: these chains may intersect (very slightly) - * - * Invariants for the Sweep. - * - if none of the edges incident to the event vertex have an activeRegion - * (ie. none of these edges are in the edge dictionary), then the vertex - * has only right-going edges. - * - if an edge is marked "fixUpperEdge" (it is a temporary edge introduced - * by ConnectRightVertex), then it is the only right-going edge from - * its associated vertex. (This says that these edges exist only - * when it is necessary.) - */ - -/** @const */ -libtess.sweep = {}; - - -/** - * Make the sentinel coordinates big enough that they will never be - * merged with real input features. (Even with the largest possible - * input contour and the maximum tolerance of 1.0, no merging will be - * done with coordinates larger than 3 * libtess.GLU_TESS_MAX_COORD). - * @private - * @const - * @type {number} - */ -libtess.sweep.SENTINEL_COORD_ = 4 * libtess.GLU_TESS_MAX_COORD; - - -/** - * Because vertices at exactly the same location are merged together - * before we process the sweep event, some degenerate cases can't occur. - * However if someone eventually makes the modifications required to - * merge features which are close together, the cases below marked - * TOLERANCE_NONZERO will be useful. They were debugged before the - * code to merge identical vertices in the main loop was added. - * @private - * @const - * @type {boolean} - */ -libtess.sweep.TOLERANCE_NONZERO_ = false; - - -/** - * computeInterior(tess) computes the planar arrangement specified - * by the given contours, and further subdivides this arrangement - * into regions. Each region is marked "inside" if it belongs - * to the polygon, according to the rule given by tess.windingRule. - * Each interior region is guaranteed be monotone. - * - * @param {libtess.GluTesselator} tess [description]. - */ -libtess.sweep.computeInterior = function (tess) { - tess.fatalError = false; - - // Each vertex defines an event for our sweep line. Start by inserting - // all the vertices in a priority queue. Events are processed in - // lexicographic order, ie. - // e1 < e2 iff e1.x < e2.x || (e1.x == e2.x && e1.y < e2.y) - libtess.sweep.removeDegenerateEdges_(tess); - libtess.sweep.initPriorityQ_(tess); - libtess.sweep.initEdgeDict_(tess); - - // TODO(bckenny): don't need the cast if pq's key is better typed - var v; - while ((v = /** @type {libtess.GluVertex} */tess.pq.extractMin()) !== null) { - for (; ;) { - var vNext = /** @type {libtess.GluVertex} */tess.pq.minimum(); - if (vNext === null || !libtess.geom.vertEq(vNext, v)) { - break; - } - - /* Merge together all vertices at exactly the same location. - * This is more efficient than processing them one at a time, - * simplifies the code (see connectLeftDegenerate), and is also - * important for correct handling of certain degenerate cases. - * For example, suppose there are two identical edges A and B - * that belong to different contours (so without this code they would - * be processed by separate sweep events). Suppose another edge C - * crosses A and B from above. When A is processed, we split it - * at its intersection point with C. However this also splits C, - * so when we insert B we may compute a slightly different - * intersection point. This might leave two edges with a small - * gap between them. This kind of error is especially obvious - * when using boundary extraction (GLU_TESS_BOUNDARY_ONLY). - */ - vNext = /** @type {libtess.GluVertex} */tess.pq.extractMin(); - libtess.sweep.spliceMergeVertices_(tess, v.anEdge, vNext.anEdge); - } - libtess.sweep.sweepEvent_(tess, v); - } - - // TODO(bckenny): what does the next comment mean? can we eliminate event except when debugging? - // Set tess.event for debugging purposes - var minRegion = tess.dict.getMin().getKey(); - tess.event = minRegion.eUp.org; - libtess.sweep.doneEdgeDict_(tess); - libtess.sweep.donePriorityQ_(tess); - - libtess.sweep.removeDegenerateFaces_(tess.mesh); - tess.mesh.checkMesh(); -}; - - -/** - * When we merge two edges into one, we need to compute the combined - * winding of the new edge. - * @private - * @param {libtess.GluHalfEdge} eDst [description]. - * @param {libtess.GluHalfEdge} eSrc [description]. - */ -libtess.sweep.addWinding_ = function (eDst, eSrc) { - // NOTE(bckenny): from AddWinding macro - eDst.winding += eSrc.winding; - eDst.sym.winding += eSrc.sym.winding; -}; - - -/** - * Both edges must be directed from right to left (this is the canonical - * direction for the upper edge of each region). - * - * The strategy is to evaluate a "t" value for each edge at the - * current sweep line position, given by tess.event. The calculations - * are designed to be very stable, but of course they are not perfect. - * - * Special case: if both edge destinations are at the sweep event, - * we sort the edges by slope (they would otherwise compare equally). - * - * @private - * @param {!libtess.GluTesselator} tess - * @param {!libtess.ActiveRegion} reg1 - * @param {!libtess.ActiveRegion} reg2 - * @return {boolean} - */ -libtess.sweep.edgeLeq_ = function (tess, reg1, reg2) { - var event = tess.event; - var e1 = reg1.eUp; - var e2 = reg2.eUp; - - if (e1.dst() === event) { - if (e2.dst() === event) { - // Two edges right of the sweep line which meet at the sweep event. - // Sort them by slope. - if (libtess.geom.vertLeq(e1.org, e2.org)) { - return libtess.geom.edgeSign(e2.dst(), e1.org, e2.org) <= 0; - } - - return libtess.geom.edgeSign(e1.dst(), e2.org, e1.org) >= 0; - } - - return libtess.geom.edgeSign(e2.dst(), event, e2.org) <= 0; - } - - if (e2.dst() === event) { - return libtess.geom.edgeSign(e1.dst(), event, e1.org) >= 0; - } - - // General case - compute signed distance *from* e1, e2 to event - var t1 = libtess.geom.edgeEval(e1.dst(), event, e1.org); - var t2 = libtess.geom.edgeEval(e2.dst(), event, e2.org); - return t1 >= t2; -}; - - -/** - * [deleteRegion_ description] - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} reg [description]. - */ -libtess.sweep.deleteRegion_ = function (tess, reg) { - if (reg.fixUpperEdge) { - // It was created with zero winding number, so it better be - // deleted with zero winding number (ie. it better not get merged - // with a real edge). - } - - reg.eUp.activeRegion = null; - - tess.dict.deleteNode(reg.nodeUp); - reg.nodeUp = null; - - // memFree( reg ); TODO(bckenny) - // TODO(bckenny): may need to null at callsite -}; - - -/** - * Replace an upper edge which needs fixing (see connectRightVertex). - * @private - * @param {libtess.ActiveRegion} reg [description]. - * @param {libtess.GluHalfEdge} newEdge [description]. - */ -libtess.sweep.fixUpperEdge_ = function (reg, newEdge) { - libtess.mesh.deleteEdge(reg.eUp); - - reg.fixUpperEdge = false; - reg.eUp = newEdge; - newEdge.activeRegion = reg; -}; - - -/** - * Find the region above the uppermost edge with the same origin. - * @private - * @param {libtess.ActiveRegion} reg [description]. - * @return {libtess.ActiveRegion} [description]. - */ -libtess.sweep.topLeftRegion_ = function (reg) { - var org = reg.eUp.org; - - // Find the region above the uppermost edge with the same origin - do { - reg = reg.regionAbove(); - } while (reg.eUp.org === org); - - // If the edge above was a temporary edge introduced by connectRightVertex, - // now is the time to fix it. - if (reg.fixUpperEdge) { - var e = libtess.mesh.connect(reg.regionBelow().eUp.sym, reg.eUp.lNext); - libtess.sweep.fixUpperEdge_(reg, e); - reg = reg.regionAbove(); - } - - return reg; -}; - - -/** - * Find the region above the uppermost edge with the same destination. - * @private - * @param {libtess.ActiveRegion} reg [description]. - * @return {libtess.ActiveRegion} [description]. - */ -libtess.sweep.topRightRegion_ = function (reg) { - var dst = reg.eUp.dst(); - - do { - reg = reg.regionAbove(); - } while (reg.eUp.dst() === dst); - - return reg; -}; - - -/** - * Add a new active region to the sweep line, *somewhere* below "regAbove" - * (according to where the new edge belongs in the sweep-line dictionary). - * The upper edge of the new region will be "eNewUp". - * Winding number and "inside" flag are not updated. - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regAbove [description]. - * @param {libtess.GluHalfEdge} eNewUp [description]. - * @return {libtess.ActiveRegion} regNew. - */ -libtess.sweep.addRegionBelow_ = function (tess, regAbove, eNewUp) { - var regNew = new libtess.ActiveRegion(); - - regNew.eUp = eNewUp; - regNew.nodeUp = tess.dict.insertBefore(regAbove.nodeUp, regNew); - eNewUp.activeRegion = regNew; - - return regNew; -}; - - -/** - * [isWindingInside_ description] - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {number} n int. - * @return {boolean} [description]. - */ -libtess.sweep.isWindingInside_ = function (tess, n) { - switch (tess.windingRule) { - case libtess.windingRule.GLU_TESS_WINDING_ODD: - return (n & 1) !== 0; - case libtess.windingRule.GLU_TESS_WINDING_NONZERO: - return n !== 0; - case libtess.windingRule.GLU_TESS_WINDING_POSITIVE: - return n > 0; - case libtess.windingRule.GLU_TESS_WINDING_NEGATIVE: - return n < 0; - case libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO: - return n >= 2 || n <= -2; - } - - // TODO(bckenny): not reached - return false; -}; - - -/** - * [computeWinding_ description] - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} reg [description]. - */ -libtess.sweep.computeWinding_ = function (tess, reg) { - reg.windingNumber = reg.regionAbove().windingNumber + reg.eUp.winding; - reg.inside = libtess.sweep.isWindingInside_(tess, reg.windingNumber); -}; - - -/** - * Delete a region from the sweep line. This happens when the upper - * and lower chains of a region meet (at a vertex on the sweep line). - * The "inside" flag is copied to the appropriate mesh face (we could - * not do this before -- since the structure of the mesh is always - * changing, this face may not have even existed until now). - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} reg [description]. - */ -libtess.sweep.finishRegion_ = function (tess, reg) { - // TODO(bckenny): may need to null reg at callsite - - var e = reg.eUp; - var f = e.lFace; - - f.inside = reg.inside; - f.anEdge = e; // optimization for tessmono.tessellateMonoRegion() // TODO(bckenny): how so? - libtess.sweep.deleteRegion_(tess, reg); -}; - - -/** - * We are given a vertex with one or more left-going edges. All affected - * edges should be in the edge dictionary. Starting at regFirst.eUp, - * we walk down deleting all regions where both edges have the same - * origin vOrg. At the same time we copy the "inside" flag from the - * active region to the face, since at this point each face will belong - * to at most one region (this was not necessarily true until this point - * in the sweep). The walk stops at the region above regLast; if regLast - * is null we walk as far as possible. At the same time we relink the - * mesh if necessary, so that the ordering of edges around vOrg is the - * same as in the dictionary. - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regFirst [description]. - * @param {libtess.ActiveRegion} regLast [description]. - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.sweep.finishLeftRegions_ = function (tess, regFirst, regLast) { - var regPrev = regFirst; - var ePrev = regFirst.eUp; - while (regPrev !== regLast) { - // placement was OK - regPrev.fixUpperEdge = false; - var reg = regPrev.regionBelow(); - var e = reg.eUp; - if (e.org !== ePrev.org) { - if (!reg.fixUpperEdge) { - /* Remove the last left-going edge. Even though there are no further - * edges in the dictionary with this origin, there may be further - * such edges in the mesh (if we are adding left edges to a vertex - * that has already been processed). Thus it is important to call - * finishRegion rather than just deleteRegion. - */ - libtess.sweep.finishRegion_(tess, regPrev); - break; - } - - // If the edge below was a temporary edge introduced by - // connectRightVertex, now is the time to fix it. - e = libtess.mesh.connect(ePrev.lPrev(), e.sym); - libtess.sweep.fixUpperEdge_(reg, e); - } - - // Relink edges so that ePrev.oNext === e - if (ePrev.oNext !== e) { - libtess.mesh.meshSplice(e.oPrev(), e); - libtess.mesh.meshSplice(ePrev, e); - } - - // may change reg.eUp - libtess.sweep.finishRegion_(tess, regPrev); - ePrev = reg.eUp; - regPrev = reg; - } - - return ePrev; -}; - - -/** - * Purpose: insert right-going edges into the edge dictionary, and update - * winding numbers and mesh connectivity appropriately. All right-going - * edges share a common origin vOrg. Edges are inserted CCW starting at - * eFirst; the last edge inserted is eLast.oPrev. If vOrg has any - * left-going edges already processed, then eTopLeft must be the edge - * such that an imaginary upward vertical segment from vOrg would be - * contained between eTopLeft.oPrev and eTopLeft; otherwise eTopLeft - * should be null. - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regUp [description]. - * @param {libtess.GluHalfEdge} eFirst [description]. - * @param {libtess.GluHalfEdge} eLast [description]. - * @param {libtess.GluHalfEdge} eTopLeft [description]. - * @param {boolean} cleanUp [description]. - */ -libtess.sweep.addRightEdges_ = function (tess, regUp, eFirst, eLast, eTopLeft, - cleanUp) { - - var firstTime = true; - - // Insert the new right-going edges in the dictionary - var e = eFirst; - do { - libtess.sweep.addRegionBelow_(tess, regUp, e.sym); - e = e.oNext; - } while (e !== eLast); - - // Walk *all* right-going edges from e.org, in the dictionary order, - // updating the winding numbers of each region, and re-linking the mesh - // edges to match the dictionary ordering (if necessary). - if (eTopLeft === null) { - eTopLeft = regUp.regionBelow().eUp.rPrev(); - } - var regPrev = regUp; - var ePrev = eTopLeft; - var reg; - for (; ;) { - reg = regPrev.regionBelow(); - e = reg.eUp.sym; - if (e.org !== ePrev.org) { - break; - } - - if (e.oNext !== ePrev) { - // Unlink e from its current position, and relink below ePrev - libtess.mesh.meshSplice(e.oPrev(), e); - libtess.mesh.meshSplice(ePrev.oPrev(), e); - } - // Compute the winding number and "inside" flag for the new regions - reg.windingNumber = regPrev.windingNumber - e.winding; - reg.inside = libtess.sweep.isWindingInside_(tess, reg.windingNumber); - - // Check for two outgoing edges with same slope -- process these - // before any intersection tests (see example in libtess.sweep.computeInterior). - regPrev.dirty = true; - if (!firstTime && libtess.sweep.checkForRightSplice_(tess, regPrev)) { - libtess.sweep.addWinding_(e, ePrev); - libtess.sweep.deleteRegion_(tess, regPrev); // TODO(bckenny): need to null regPrev anywhere else? - libtess.mesh.deleteEdge(ePrev); - } - firstTime = false; - regPrev = reg; - ePrev = e; - } - - regPrev.dirty = true; - - if (cleanUp) { - // Check for intersections between newly adjacent edges. - libtess.sweep.walkDirtyRegions_(tess, regPrev); - } -}; - - -/** - * [callCombine_ description] - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.GluVertex} isect [description]. - * @param {Array.<Object>} data [description]. - * @param {Array.<number>} weights [description]. - * @param {boolean} needed [description]. - */ -libtess.sweep.callCombine_ = function (tess, isect, data, weights, needed) { - // Copy coord data in case the callback changes it. - var coords = [ - isect.coords[0], - isect.coords[1], - isect.coords[2] - ]; - - isect.data = null; - isect.data = tess.callCombineOrCombineData(coords, data, weights); - if (isect.data === null) { - if (!needed) { - // not needed, so just use data from first vertex - isect.data = data[0]; - - } else if (!tess.fatalError) { - // The only way fatal error is when two edges are found to intersect, - // but the user has not provided the callback necessary to handle - // generated intersection points. - tess.callErrorOrErrorData( - libtess.errorType.GLU_TESS_NEED_COMBINE_CALLBACK); - tess.fatalError = true; - } - } -}; - - -/** - * Two vertices with idential coordinates are combined into one. - * e1.org is kept, while e2.org is discarded. - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.GluHalfEdge} e1 [description]. - * @param {libtess.GluHalfEdge} e2 [description]. - */ -libtess.sweep.spliceMergeVertices_ = function (tess, e1, e2) { - // TODO(bckenny): better way to init these? save them? - var data = [null, null, null, null]; - var weights = [0.5, 0.5, 0, 0]; - - data[0] = e1.org.data; - data[1] = e2.org.data; - libtess.sweep.callCombine_(tess, e1.org, data, weights, false); - libtess.mesh.meshSplice(e1, e2); -}; - - -/** - * Find some weights which describe how the intersection vertex is - * a linear combination of org and dst. Each of the two edges - * which generated "isect" is allocated 50% of the weight; each edge - * splits the weight between its org and dst according to the - * relative distance to "isect". - * - * @private - * @param {libtess.GluVertex} isect [description]. - * @param {libtess.GluVertex} org [description]. - * @param {libtess.GluVertex} dst [description]. - * @param {Array.<number>} weights [description]. - * @param {number} weightIndex Index into weights for first weight to supply. - */ -libtess.sweep.vertexWeights_ = function (isect, org, dst, weights, weightIndex) { - // TODO(bckenny): think through how we can use L1dist here and be correct for coords - var t1 = libtess.geom.vertL1dist(org, isect); - var t2 = libtess.geom.vertL1dist(dst, isect); - - // TODO(bckenny): introduced weightIndex to mimic addressing in original - // 1) document (though it is private and only used from getIntersectData) - // 2) better way? manually inline into getIntersectData? supply two two-length tmp arrays? - var i0 = weightIndex; - var i1 = weightIndex + 1; - weights[i0] = 0.5 * t2 / (t1 + t2); - weights[i1] = 0.5 * t1 / (t1 + t2); - isect.coords[0] += weights[i0] * org.coords[0] + weights[i1] * dst.coords[0]; - isect.coords[1] += weights[i0] * org.coords[1] + weights[i1] * dst.coords[1]; - isect.coords[2] += weights[i0] * org.coords[2] + weights[i1] * dst.coords[2]; -}; - - -/** - * We've computed a new intersection point, now we need a "data" pointer - * from the user so that we can refer to this new vertex in the - * rendering callbacks. - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.GluVertex} isect [description]. - * @param {libtess.GluVertex} orgUp [description]. - * @param {libtess.GluVertex} dstUp [description]. - * @param {libtess.GluVertex} orgLo [description]. - * @param {libtess.GluVertex} dstLo [description]. - */ -libtess.sweep.getIntersectData_ = function (tess, isect, orgUp, dstUp, orgLo, - dstLo) { - - // TODO(bckenny): called for every intersection event, should these be from a pool? - // TODO(bckenny): better way to init these? - var weights = [0, 0, 0, 0]; - var data = [ - orgUp.data, - dstUp.data, - orgLo.data, - dstLo.data - ]; - - // TODO(bckenny): it appears isect is a reappropriated vertex, so does need to be zeroed. - // double check this. - isect.coords[0] = isect.coords[1] = isect.coords[2] = 0; - - // TODO(bckenny): see note in libtess.sweep.vertexWeights_ for explanation of weightIndex. fix? - libtess.sweep.vertexWeights_(isect, orgUp, dstUp, weights, 0); - libtess.sweep.vertexWeights_(isect, orgLo, dstLo, weights, 2); - - libtess.sweep.callCombine_(tess, isect, data, weights, true); -}; - - -/** - * Check the upper and lower edge of regUp, to make sure that the - * eUp.org is above eLo, or eLo.org is below eUp (depending on which - * origin is leftmost). - * - * The main purpose is to splice right-going edges with the same - * dest vertex and nearly identical slopes (ie. we can't distinguish - * the slopes numerically). However the splicing can also help us - * to recover from numerical errors. For example, suppose at one - * point we checked eUp and eLo, and decided that eUp.org is barely - * above eLo. Then later, we split eLo into two edges (eg. from - * a splice operation like this one). This can change the result of - * our test so that now eUp.org is incident to eLo, or barely below it. - * We must correct this condition to maintain the dictionary invariants. - * - * One possibility is to check these edges for intersection again - * (i.e. checkForIntersect). This is what we do if possible. However - * checkForIntersect requires that tess.event lies between eUp and eLo, - * so that it has something to fall back on when the intersection - * calculation gives us an unusable answer. So, for those cases where - * we can't check for intersection, this routine fixes the problem - * by just splicing the offending vertex into the other edge. - * This is a guaranteed solution, no matter how degenerate things get. - * Basically this is a combinatorial solution to a numerical problem. - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regUp [description]. - * @return {boolean} [description]. - */ -libtess.sweep.checkForRightSplice_ = function (tess, regUp) { - // TODO(bckenny): fully learn how these two checks work - - var regLo = regUp.regionBelow(); - var eUp = regUp.eUp; - var eLo = regLo.eUp; - - if (libtess.geom.vertLeq(eUp.org, eLo.org)) { - if (libtess.geom.edgeSign(eLo.dst(), eUp.org, eLo.org) > 0) { - return false; - } - - // eUp.org appears to be below eLo - if (!libtess.geom.vertEq(eUp.org, eLo.org)) { - // Splice eUp.org into eLo - libtess.mesh.splitEdge(eLo.sym); - libtess.mesh.meshSplice(eUp, eLo.oPrev()); - regUp.dirty = regLo.dirty = true; - - } else if (eUp.org !== eLo.org) { - // merge the two vertices, discarding eUp.org - // TODO(bckenny): fix pqHandle null situation - tess.pq.remove(/** @type {libtess.PQHandle} */eUp.org.pqHandle); - libtess.sweep.spliceMergeVertices_(tess, eLo.oPrev(), eUp); - } - - } else { - if (libtess.geom.edgeSign(eUp.dst(), eLo.org, eUp.org) < 0) { - return false; - } - - // eLo.org appears to be above eUp, so splice eLo.org into eUp - regUp.regionAbove().dirty = regUp.dirty = true; - libtess.mesh.splitEdge(eUp.sym); - libtess.mesh.meshSplice(eLo.oPrev(), eUp); - } - - return true; -}; - - -/** - * Check the upper and lower edge of regUp to make sure that the - * eUp.dst() is above eLo, or eLo.dst() is below eUp (depending on which - * destination is rightmost). - * - * Theoretically, this should always be true. However, splitting an edge - * into two pieces can change the results of previous tests. For example, - * suppose at one point we checked eUp and eLo, and decided that eUp.dst() - * is barely above eLo. Then later, we split eLo into two edges (eg. from - * a splice operation like this one). This can change the result of - * the test so that now eUp.dst() is incident to eLo, or barely below it. - * We must correct this condition to maintain the dictionary invariants - * (otherwise new edges might get inserted in the wrong place in the - * dictionary, and bad stuff will happen). - * - * We fix the problem by just splicing the offending vertex into the - * other edge. - * - * @private - * @param {libtess.GluTesselator} tess description]. - * @param {libtess.ActiveRegion} regUp [description]. - * @return {boolean} [description]. - */ -libtess.sweep.checkForLeftSplice_ = function (tess, regUp) { - var regLo = regUp.regionBelow(); - var eUp = regUp.eUp; - var eLo = regLo.eUp; - var e; - - if (libtess.geom.vertLeq(eUp.dst(), eLo.dst())) { - if (libtess.geom.edgeSign(eUp.dst(), eLo.dst(), eUp.org) < 0) { - return false; - } - - // eLo.dst() is above eUp, so splice eLo.dst() into eUp - regUp.regionAbove().dirty = regUp.dirty = true; - e = libtess.mesh.splitEdge(eUp); - libtess.mesh.meshSplice(eLo.sym, e); - e.lFace.inside = regUp.inside; - - } else { - if (libtess.geom.edgeSign(eLo.dst(), eUp.dst(), eLo.org) > 0) { - return false; - } - - // eUp.dst() is below eLo, so splice eUp.dst() into eLo - regUp.dirty = regLo.dirty = true; - e = libtess.mesh.splitEdge(eLo); - libtess.mesh.meshSplice(eUp.lNext, eLo.sym); - e.rFace().inside = regUp.inside; - } - - return true; -}; - - -/** - * Check the upper and lower edges of the given region to see if - * they intersect. If so, create the intersection and add it - * to the data structures. - * - * Returns true if adding the new intersection resulted in a recursive - * call to addRightEdges_(); in this case all "dirty" regions have been - * checked for intersections, and possibly regUp has been deleted. - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regUp [description]. - * @return {boolean} [description]. - */ -libtess.sweep.checkForIntersect_ = function (tess, regUp) { - var regLo = regUp.regionBelow(); - var eUp = regUp.eUp; - var eLo = regLo.eUp; - var orgUp = eUp.org; - var orgLo = eLo.org; - var dstUp = eUp.dst(); - var dstLo = eLo.dst(); - - var isect = new libtess.GluVertex(); - - if (orgUp === orgLo) { - // right endpoints are the same - return false; - } - - var tMinUp = Math.min(orgUp.t, dstUp.t); - var tMaxLo = Math.max(orgLo.t, dstLo.t); - if (tMinUp > tMaxLo) { - // t ranges do not overlap - return false; - } - - if (libtess.geom.vertLeq(orgUp, orgLo)) { - if (libtess.geom.edgeSign(dstLo, orgUp, orgLo) > 0) { - return false; - } - } else { - if (libtess.geom.edgeSign(dstUp, orgLo, orgUp) < 0) { - return false; - } - } - - // At this point the edges intersect, at least marginally - libtess.geom.edgeIntersect(dstUp, orgUp, dstLo, orgLo, isect); - - // The following properties are guaranteed: - - if (libtess.geom.vertLeq(isect, tess.event)) { - /* The intersection point lies slightly to the left of the sweep line, - * so move it until it's slightly to the right of the sweep line. - * (If we had perfect numerical precision, this would never happen - * in the first place). The easiest and safest thing to do is - * replace the intersection by tess.event. - */ - isect.s = tess.event.s; - isect.t = tess.event.t; - } - - // TODO(bckenny): try to find test54.d - /* Similarly, if the computed intersection lies to the right of the - * rightmost origin (which should rarely happen), it can cause - * unbelievable inefficiency on sufficiently degenerate inputs. - * (If you have the test program, try running test54.d with the - * "X zoom" option turned on). - */ - var orgMin = libtess.geom.vertLeq(orgUp, orgLo) ? orgUp : orgLo; - if (libtess.geom.vertLeq(orgMin, isect)) { - isect.s = orgMin.s; - isect.t = orgMin.t; - } - - if (libtess.geom.vertEq(isect, orgUp) || libtess.geom.vertEq(isect, orgLo)) { - // Easy case -- intersection at one of the right endpoints - libtess.sweep.checkForRightSplice_(tess, regUp); - return false; - } - - // TODO(bckenny): clean this up; length is distracting - if (!libtess.geom.vertEq(dstUp, tess.event) && - libtess.geom.edgeSign(dstUp, tess.event, isect) >= 0 || - !libtess.geom.vertEq(dstLo, tess.event) && - libtess.geom.edgeSign(dstLo, tess.event, isect) <= 0) { - - /* Very unusual -- the new upper or lower edge would pass on the - * wrong side of the sweep event, or through it. This can happen - * due to very small numerical errors in the intersection calculation. - */ - if (dstLo === tess.event) { - // Splice dstLo into eUp, and process the new region(s) - libtess.mesh.splitEdge(eUp.sym); - libtess.mesh.meshSplice(eLo.sym, eUp); - regUp = libtess.sweep.topLeftRegion_(regUp); - eUp = regUp.regionBelow().eUp; - libtess.sweep.finishLeftRegions_(tess, regUp.regionBelow(), regLo); - libtess.sweep.addRightEdges_(tess, regUp, eUp.oPrev(), eUp, eUp, true); - return true; - } - - if (dstUp === tess.event) { - // Splice dstUp into eLo, and process the new region(s) - libtess.mesh.splitEdge(eLo.sym); - libtess.mesh.meshSplice(eUp.lNext, eLo.oPrev()); - regLo = regUp; - regUp = libtess.sweep.topRightRegion_(regUp); - var e = regUp.regionBelow().eUp.rPrev(); - regLo.eUp = eLo.oPrev(); - eLo = libtess.sweep.finishLeftRegions_(tess, regLo, null); - libtess.sweep.addRightEdges_(tess, regUp, eLo.oNext, eUp.rPrev(), e, - true); - return true; - } - - /* Special case: called from connectRightVertex. If either - * edge passes on the wrong side of tess.event, split it - * (and wait for connectRightVertex to splice it appropriately). - */ - if (libtess.geom.edgeSign(dstUp, tess.event, isect) >= 0) { - regUp.regionAbove().dirty = regUp.dirty = true; - libtess.mesh.splitEdge(eUp.sym); - eUp.org.s = tess.event.s; - eUp.org.t = tess.event.t; - } - - if (libtess.geom.edgeSign(dstLo, tess.event, isect) <= 0) { - regUp.dirty = regLo.dirty = true; - libtess.mesh.splitEdge(eLo.sym); - eLo.org.s = tess.event.s; - eLo.org.t = tess.event.t; - } - - // leave the rest for connectRightVertex - return false; - } - - /* General case -- split both edges, splice into new vertex. - * When we do the splice operation, the order of the arguments is - * arbitrary as far as correctness goes. However, when the operation - * creates a new face, the work done is proportional to the size of - * the new face. We expect the faces in the processed part of - * the mesh (ie. eUp.lFace) to be smaller than the faces in the - * unprocessed original contours (which will be eLo.oPrev.lFace). - */ - libtess.mesh.splitEdge(eUp.sym); - libtess.mesh.splitEdge(eLo.sym); - libtess.mesh.meshSplice(eLo.oPrev(), eUp); - eUp.org.s = isect.s; - eUp.org.t = isect.t; - eUp.org.pqHandle = tess.pq.insert(eUp.org); - libtess.sweep.getIntersectData_(tess, eUp.org, orgUp, dstUp, orgLo, dstLo); - regUp.regionAbove().dirty = regUp.dirty = regLo.dirty = true; - - return false; -}; - - -/** - * When the upper or lower edge of any region changes, the region is - * marked "dirty". This routine walks through all the dirty regions - * and makes sure that the dictionary invariants are satisfied - * (see the comments at the beginning of this file). Of course, - * new dirty regions can be created as we make changes to restore - * the invariants. - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regUp [description]. - */ -libtess.sweep.walkDirtyRegions_ = function (tess, regUp) { - var regLo = regUp.regionBelow(); - - for (; ;) { - // Find the lowest dirty region (we walk from the bottom up). - while (regLo.dirty) { - regUp = regLo; - regLo = regLo.regionBelow(); - } - if (!regUp.dirty) { - regLo = regUp; - regUp = regUp.regionAbove(); - if (regUp === null || !regUp.dirty) { - // We've walked all the dirty regions - return; - } - } - - regUp.dirty = false; - var eUp = regUp.eUp; - var eLo = regLo.eUp; - - if (eUp.dst() !== eLo.dst()) { - // Check that the edge ordering is obeyed at the dst vertices. - if (libtess.sweep.checkForLeftSplice_(tess, regUp)) { - // If the upper or lower edge was marked fixUpperEdge, then - // we no longer need it (since these edges are needed only for - // vertices which otherwise have no right-going edges). - if (regLo.fixUpperEdge) { - libtess.sweep.deleteRegion_(tess, regLo); - libtess.mesh.deleteEdge(eLo); - regLo = regUp.regionBelow(); - eLo = regLo.eUp; - - } else if (regUp.fixUpperEdge) { - libtess.sweep.deleteRegion_(tess, regUp); - libtess.mesh.deleteEdge(eUp); - regUp = regLo.regionAbove(); - eUp = regUp.eUp; - } - } - } - - if (eUp.org !== eLo.org) { - if (eUp.dst() !== eLo.dst() && !regUp.fixUpperEdge && - !regLo.fixUpperEdge && - (eUp.dst() === tess.event || eLo.dst() === tess.event)) { - /* When all else fails in checkForIntersect(), it uses tess.event - * as the intersection location. To make this possible, it requires - * that tess.event lie between the upper and lower edges, and also - * that neither of these is marked fixUpperEdge (since in the worst - * case it might splice one of these edges into tess.event, and - * violate the invariant that fixable edges are the only right-going - * edge from their associated vertex). - */ - if (libtess.sweep.checkForIntersect_(tess, regUp)) { - // walkDirtyRegions() was called recursively; we're done - return; - } - - } else { - // Even though we can't use checkForIntersect(), the org vertices - // may violate the dictionary edge ordering. Check and correct this. - libtess.sweep.checkForRightSplice_(tess, regUp); - } - } - - if (eUp.org === eLo.org && eUp.dst() === eLo.dst()) { - // A degenerate loop consisting of only two edges -- delete it. - libtess.sweep.addWinding_(eLo, eUp); - libtess.sweep.deleteRegion_(tess, regUp); - libtess.mesh.deleteEdge(eUp); - regUp = regLo.regionAbove(); - } - } -}; - - -/** - * Purpose: connect a "right" vertex vEvent (one where all edges go left) - * to the unprocessed portion of the mesh. Since there are no right-going - * edges, two regions (one above vEvent and one below) are being merged - * into one. regUp is the upper of these two regions. - * - * There are two reasons for doing this (adding a right-going edge): - * - if the two regions being merged are "inside", we must add an edge - * to keep them separated (the combined region would not be monotone). - * - in any case, we must leave some record of vEvent in the dictionary, - * so that we can merge vEvent with features that we have not seen yet. - * For example, maybe there is a vertical edge which passes just to - * the right of vEvent; we would like to splice vEvent into this edge. - * - * However, we don't want to connect vEvent to just any vertex. We don't - * want the new edge to cross any other edges; otherwise we will create - * intersection vertices even when the input data had no self-intersections. - * (This is a bad thing; if the user's input data has no intersections, - * we don't want to generate any false intersections ourselves.) - * - * Our eventual goal is to connect vEvent to the leftmost unprocessed - * vertex of the combined region (the union of regUp and regLo). - * But because of unseen vertices with all right-going edges, and also - * new vertices which may be created by edge intersections, we don't - * know where that leftmost unprocessed vertex is. In the meantime, we - * connect vEvent to the closest vertex of either chain, and mark the region - * as "fixUpperEdge". This flag says to delete and reconnect this edge - * to the next processed vertex on the boundary of the combined region. - * Quite possibly the vertex we connected to will turn out to be the - * closest one, in which case we won't need to make any changes. - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regUp [description]. - * @param {libtess.GluHalfEdge} eBottomLeft [description]. - */ -libtess.sweep.connectRightVertex_ = function (tess, regUp, eBottomLeft) { - var eTopLeft = eBottomLeft.oNext; - var regLo = regUp.regionBelow(); - var eUp = regUp.eUp; - var eLo = regLo.eUp; - var degenerate = false; - - if (eUp.dst() !== eLo.dst()) { - libtess.sweep.checkForIntersect_(tess, regUp); - } - - // Possible new degeneracies: upper or lower edge of regUp may pass - // through vEvent, or may coincide with new intersection vertex - if (libtess.geom.vertEq(eUp.org, tess.event)) { - libtess.mesh.meshSplice(eTopLeft.oPrev(), eUp); - regUp = libtess.sweep.topLeftRegion_(regUp); - eTopLeft = regUp.regionBelow().eUp; - libtess.sweep.finishLeftRegions_(tess, regUp.regionBelow(), regLo); - degenerate = true; - } - if (libtess.geom.vertEq(eLo.org, tess.event)) { - libtess.mesh.meshSplice(eBottomLeft, eLo.oPrev()); - eBottomLeft = libtess.sweep.finishLeftRegions_(tess, regLo, null); - degenerate = true; - } - if (degenerate) { - libtess.sweep.addRightEdges_(tess, regUp, eBottomLeft.oNext, eTopLeft, - eTopLeft, true); - return; - } - - // Non-degenerate situation -- need to add a temporary, fixable edge. - // Connect to the closer of eLo.org, eUp.org. - var eNew; - if (libtess.geom.vertLeq(eLo.org, eUp.org)) { - eNew = eLo.oPrev(); - } else { - eNew = eUp; - } - eNew = libtess.mesh.connect(eBottomLeft.lPrev(), eNew); - - // Prevent cleanup, otherwise eNew might disappear before we've even - // had a chance to mark it as a temporary edge. - libtess.sweep.addRightEdges_(tess, regUp, eNew, eNew.oNext, eNew.oNext, - false); - eNew.sym.activeRegion.fixUpperEdge = true; - libtess.sweep.walkDirtyRegions_(tess, regUp); -}; - - -/** - * The event vertex lies exacty on an already-processed edge or vertex. - * Adding the new vertex involves splicing it into the already-processed - * part of the mesh. - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.ActiveRegion} regUp [description]. - * @param {libtess.GluVertex} vEvent [description]. - */ -libtess.sweep.connectLeftDegenerate_ = function (tess, regUp, vEvent) { - var e = regUp.eUp; - /* istanbul ignore if */ - if (libtess.geom.vertEq(e.org, vEvent)) { - // NOTE(bckenny): this code is unreachable but remains for a hypothetical - // future extension of libtess. See docs on libtess.sweep.TOLERANCE_NONZERO_ - // for more information. Conditional on TOLERANCE_NONZERO_ to help Closure - // Compiler eliminate dead code. - // e.org is an unprocessed vertex - just combine them, and wait - // for e.org to be pulled from the queue - if (libtess.sweep.TOLERANCE_NONZERO_) { - libtess.sweep.spliceMergeVertices_(tess, e, vEvent.anEdge); - } - return; - } - - if (!libtess.geom.vertEq(e.dst(), vEvent)) { - // General case -- splice vEvent into edge e which passes through it - libtess.mesh.splitEdge(e.sym); - - if (regUp.fixUpperEdge) { - // This edge was fixable -- delete unused portion of original edge - libtess.mesh.deleteEdge(e.oNext); - regUp.fixUpperEdge = false; - } - - libtess.mesh.meshSplice(vEvent.anEdge, e); - - // recurse - libtess.sweep.sweepEvent_(tess, vEvent); - return; - } - - // NOTE(bckenny): this code is unreachable but remains for a hypothetical - // future extension of libtess. See docs on libtess.sweep.TOLERANCE_NONZERO_ - // for more information. Conditional on TOLERANCE_NONZERO_ to help Closure - // Compiler eliminate dead code. - // vEvent coincides with e.dst(), which has already been processed. - // Splice in the additional right-going edges. - /* istanbul ignore next */ - - /* istanbul ignore next */ - if (libtess.sweep.TOLERANCE_NONZERO_) { - regUp = libtess.sweep.topRightRegion_(regUp); - var reg = regUp.regionBelow(); - var eTopRight = reg.eUp.sym; - var eTopLeft = eTopRight.oNext; - var eLast = eTopLeft; - - if (reg.fixUpperEdge) { - // Here e.dst() has only a single fixable edge going right. - // We can delete it since now we have some real right-going edges. - - // there are some left edges too - libtess.sweep.deleteRegion_(tess, reg); // TODO(bckenny): something to null? - libtess.mesh.deleteEdge(eTopRight); - eTopRight = eTopLeft.oPrev(); - } - - libtess.mesh.meshSplice(vEvent.anEdge, eTopRight); - if (!libtess.geom.edgeGoesLeft(eTopLeft)) { - // e.dst() had no left-going edges -- indicate this to addRightEdges() - eTopLeft = null; - } - - libtess.sweep.addRightEdges_(tess, regUp, eTopRight.oNext, eLast, eTopLeft, - true); - } -}; - - -/** - * Connect a "left" vertex (one where both edges go right) - * to the processed portion of the mesh. Let R be the active region - * containing vEvent, and let U and L be the upper and lower edge - * chains of R. There are two possibilities: - * - * - the normal case: split R into two regions, by connecting vEvent to - * the rightmost vertex of U or L lying to the left of the sweep line - * - * - the degenerate case: if vEvent is close enough to U or L, we - * merge vEvent into that edge chain. The subcases are: - * - merging with the rightmost vertex of U or L - * - merging with the active edge of U or L - * - merging with an already-processed portion of U or L - * - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.GluVertex} vEvent [description]. - */ -libtess.sweep.connectLeftVertex_ = function (tess, vEvent) { - // TODO(bckenny): tmp only used for sweep. better to keep tmp across calls? - var tmp = new libtess.ActiveRegion(); - - // NOTE(bckenny): this was commented out in the original - // libtess.assert(vEvent.anEdge.oNext.oNext === vEvent.anEdge); - - // Get a pointer to the active region containing vEvent - tmp.eUp = vEvent.anEdge.sym; - var regUp = tess.dict.search(tmp).getKey(); - var regLo = regUp.regionBelow(); - var eUp = regUp.eUp; - var eLo = regLo.eUp; - - // try merging with U or L first - if (libtess.geom.edgeSign(eUp.dst(), vEvent, eUp.org) === 0) { - libtess.sweep.connectLeftDegenerate_(tess, regUp, vEvent); - return; - } - - // Connect vEvent to rightmost processed vertex of either chain. - // e.dst() is the vertex that we will connect to vEvent. - var reg = libtess.geom.vertLeq(eLo.dst(), eUp.dst()) ? regUp : regLo; - var eNew; - if (regUp.inside || reg.fixUpperEdge) { - if (reg === regUp) { - eNew = libtess.mesh.connect(vEvent.anEdge.sym, eUp.lNext); - - } else { - var tempHalfEdge = libtess.mesh.connect(eLo.dNext(), vEvent.anEdge); - eNew = tempHalfEdge.sym; - } - - if (reg.fixUpperEdge) { - libtess.sweep.fixUpperEdge_(reg, eNew); - - } else { - libtess.sweep.computeWinding_(tess, - libtess.sweep.addRegionBelow_(tess, regUp, eNew)); - } - libtess.sweep.sweepEvent_(tess, vEvent); - - } else { - // The new vertex is in a region which does not belong to the polygon. - // We don''t need to connect this vertex to the rest of the mesh. - libtess.sweep.addRightEdges_(tess, regUp, vEvent.anEdge, vEvent.anEdge, - null, true); - } -}; - - -/** - * Does everything necessary when the sweep line crosses a vertex. - * Updates the mesh and the edge dictionary. - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {libtess.GluVertex} vEvent [description]. - */ -libtess.sweep.sweepEvent_ = function (tess, vEvent) { - tess.event = vEvent; // for access in edgeLeq_ // TODO(bckenny): wuh? - - /* Check if this vertex is the right endpoint of an edge that is - * already in the dictionary. In this case we don't need to waste - * time searching for the location to insert new edges. - */ - var e = vEvent.anEdge; - while (e.activeRegion === null) { - e = e.oNext; - if (e === vEvent.anEdge) { - // All edges go right -- not incident to any processed edges - libtess.sweep.connectLeftVertex_(tess, vEvent); - return; - } - } - - /* Processing consists of two phases: first we "finish" all the - * active regions where both the upper and lower edges terminate - * at vEvent (ie. vEvent is closing off these regions). - * We mark these faces "inside" or "outside" the polygon according - * to their winding number, and delete the edges from the dictionary. - * This takes care of all the left-going edges from vEvent. - */ - var regUp = libtess.sweep.topLeftRegion_(e.activeRegion); - var reg = regUp.regionBelow(); - var eTopLeft = reg.eUp; - var eBottomLeft = libtess.sweep.finishLeftRegions_(tess, reg, null); - - /* Next we process all the right-going edges from vEvent. This - * involves adding the edges to the dictionary, and creating the - * associated "active regions" which record information about the - * regions between adjacent dictionary edges. - */ - if (eBottomLeft.oNext === eTopLeft) { - // No right-going edges -- add a temporary "fixable" edge - libtess.sweep.connectRightVertex_(tess, regUp, eBottomLeft); - - } else { - libtess.sweep.addRightEdges_(tess, regUp, eBottomLeft.oNext, eTopLeft, - eTopLeft, true); - } -}; - - -/** - * We add two sentinel edges above and below all other edges, - * to avoid special cases at the top and bottom. - * @private - * @param {libtess.GluTesselator} tess [description]. - * @param {number} t [description]. - */ -libtess.sweep.addSentinel_ = function (tess, t) { - var reg = new libtess.ActiveRegion(); - - var e = libtess.mesh.makeEdge(tess.mesh); - - e.org.s = libtess.sweep.SENTINEL_COORD_; - e.org.t = t; - e.dst().s = -libtess.sweep.SENTINEL_COORD_; - e.dst().t = t; - tess.event = e.dst(); //initialize it - - reg.eUp = e; - reg.windingNumber = 0; - reg.inside = false; - reg.fixUpperEdge = false; - reg.sentinel = true; - reg.dirty = false; - reg.nodeUp = tess.dict.insert(reg); -}; - - -/** - * We maintain an ordering of edge intersections with the sweep line. - * This order is maintained in a dynamic dictionary. - * @private - * @param {libtess.GluTesselator} tess [description]. - */ -libtess.sweep.initEdgeDict_ = function (tess) { - tess.dict = new libtess.Dict(tess, libtess.sweep.edgeLeq_); - - libtess.sweep.addSentinel_(tess, -libtess.sweep.SENTINEL_COORD_); - libtess.sweep.addSentinel_(tess, libtess.sweep.SENTINEL_COORD_); -}; - - -/** - * [doneEdgeDict_ description] - * @private - * @param {libtess.GluTesselator} tess [description]. - */ -libtess.sweep.doneEdgeDict_ = function (tess) { - // NOTE(bckenny): fixedEdges is only used in the assert below, so ignore so - // when asserts are removed jshint won't error. - /* jshint unused:false */ - var fixedEdges = 0; - - var reg; - while ((reg = tess.dict.getMin().getKey()) !== null) { - // At the end of all processing, the dictionary should contain - // only the two sentinel edges, plus at most one "fixable" edge - // created by connectRightVertex(). - if (!reg.sentinel) { - } - libtess.sweep.deleteRegion_(tess, reg); - } - - // NOTE(bckenny): see tess.dict.deleteDict_() for old delete dict function - tess.dict = null; -}; - - -/** - * Remove zero-length edges, and contours with fewer than 3 vertices. - * @private - * @param {libtess.GluTesselator} tess [description]. - */ -libtess.sweep.removeDegenerateEdges_ = function (tess) { - var eHead = tess.mesh.eHead; - - var eNext; - for (var e = eHead.next; e !== eHead; e = eNext) { - eNext = e.next; - var eLNext = e.lNext; - - if (libtess.geom.vertEq(e.org, e.dst()) && e.lNext.lNext !== e) { - // Zero-length edge, contour has at least 3 edges - libtess.sweep.spliceMergeVertices_(tess, eLNext, e); // deletes e.org - libtess.mesh.deleteEdge(e); // e is a self-loop TODO(bckenny): does this comment really apply here? - e = eLNext; - eLNext = e.lNext; - } - - if (eLNext.lNext === e) { - // Degenerate contour (one or two edges) - if (eLNext !== e) { - if (eLNext === eNext || eLNext === eNext.sym) { - eNext = eNext.next; - } - libtess.mesh.deleteEdge(eLNext); - } - - if (e === eNext || e === eNext.sym) { - eNext = eNext.next; - } - libtess.mesh.deleteEdge(e); - } - } -}; - - -/** - * Construct priority queue and insert all vertices into it, which determines - * the order in which vertices cross the sweep line. - * @private - * @param {libtess.GluTesselator} tess [description]. - */ -libtess.sweep.initPriorityQ_ = function (tess) { - // TODO(bckenny): libtess.geom.vertLeq needs cast? - var pq = new libtess.PriorityQ( - /** @type {function(Object, Object): boolean} */libtess.geom.vertLeq); - tess.pq = pq; - - var vHead = tess.mesh.vHead; - var v; - for (v = vHead.next; v !== vHead; v = v.next) { - v.pqHandle = pq.insert(v); - } - - pq.init(); -}; - - -/** - * [donePriorityQ_ description] - * @private - * @param {libtess.GluTesselator} tess [description]. - */ -libtess.sweep.donePriorityQ_ = function (tess) { - // TODO(bckenny): probably don't need deleteQ. check that function for comment - tess.pq.deleteQ(); - tess.pq = null; -}; - - -/** - * Delete any degenerate faces with only two edges. walkDirtyRegions() - * will catch almost all of these, but it won't catch degenerate faces - * produced by splice operations on already-processed edges. - * The two places this can happen are in finishLeftRegions(), when - * we splice in a "temporary" edge produced by connectRightVertex(), - * and in checkForLeftSplice(), where we splice already-processed - * edges to ensure that our dictionary invariants are not violated - * by numerical errors. - * - * In both these cases it is *very* dangerous to delete the offending - * edge at the time, since one of the routines further up the stack - * will sometimes be keeping a pointer to that edge. - * - * @private - * @param {libtess.GluMesh} mesh [description]. - */ -libtess.sweep.removeDegenerateFaces_ = function (mesh) { - var fNext; - for (var f = mesh.fHead.next; f !== mesh.fHead; f = fNext) { - fNext = f.next; - var e = f.anEdge; - - if (e.lNext.lNext === e) { - // A face with only two edges - libtess.sweep.addWinding_(e.oNext, e); - libtess.mesh.deleteEdge(e); - } - } -}; - - -/* global libtess */ - -/** @const */ -libtess.tessmono = {}; - -/** - * Tessellates a monotone region (what else would it do??). The region must - * consist of a single loop of half-edges (see mesh.js) oriented CCW. "Monotone" - * in this case means that any vertical line intersects the interior of the - * region in a single interval. - * - * Tessellation consists of adding interior edges (actually pairs of - * half-edges), to split the region into non-overlapping triangles. - * @private - * @param {!libtess.GluFace} face - */ -libtess.tessmono.tessellateMonoRegion_ = function (face) { - /* The basic idea is explained in Preparata and Shamos (which I don't - * have handy right now), although their implementation is more - * complicated than this one. The are two edge chains, an upper chain - * and a lower chain. We process all vertices from both chains in order, - * from right to left. - * - * The algorithm ensures that the following invariant holds after each - * vertex is processed: the untessellated region consists of two - * chains, where one chain (say the upper) is a single edge, and - * the other chain is concave. The left vertex of the single edge - * is always to the left of all vertices in the concave chain. - * - * Each step consists of adding the rightmost unprocessed vertex to one - * of the two chains, and forming a fan of triangles from the rightmost - * of two chain endpoints. Determining whether we can add each triangle - * to the fan is a simple orientation test. By making the fan as large - * as possible, we restore the invariant (check it yourself). - * - * All edges are oriented CCW around the boundary of the region. - * First, find the half-edge whose origin vertex is rightmost. - * Since the sweep goes from left to right, face.anEdge should - * be close to the edge we want. - */ - var up = face.anEdge; - - for (; libtess.geom.vertLeq(up.dst(), up.org); up = up.lPrev()) { } - for (; libtess.geom.vertLeq(up.org, up.dst()); up = up.lNext) { } - - var lo = up.lPrev(); - - var tempHalfEdge; - while (up.lNext !== lo) { - if (libtess.geom.vertLeq(up.dst(), lo.org)) { - // up.dst() is on the left. It is safe to form triangles from lo.org. - // The edgeGoesLeft test guarantees progress even when some triangles - // are CW, given that the upper and lower chains are truly monotone. - while (lo.lNext !== up && (libtess.geom.edgeGoesLeft(lo.lNext) || - libtess.geom.edgeSign(lo.org, lo.dst(), lo.lNext.dst()) <= 0)) { - - tempHalfEdge = libtess.mesh.connect(lo.lNext, lo); - lo = tempHalfEdge.sym; - } - lo = lo.lPrev(); - - } else { - // lo.org is on the left. We can make CCW triangles from up.dst(). - while (lo.lNext !== up && (libtess.geom.edgeGoesRight(up.lPrev()) || - libtess.geom.edgeSign(up.dst(), up.org, up.lPrev().org) >= 0)) { - - tempHalfEdge = libtess.mesh.connect(up, up.lPrev()); - up = tempHalfEdge.sym; - } - up = up.lNext; - } - } - - // Now lo.org == up.dst() == the leftmost vertex. The remaining region - // can be tessellated in a fan from this leftmost vertex. - while (lo.lNext.lNext !== up) { - tempHalfEdge = libtess.mesh.connect(lo.lNext, lo); - lo = tempHalfEdge.sym; - } -}; - -/** - * Tessellates each region of the mesh which is marked "inside" the polygon. - * Each such region must be monotone. - * @param {!libtess.GluMesh} mesh - */ -libtess.tessmono.tessellateInterior = function (mesh) { - var next; - for (var f = mesh.fHead.next; f !== mesh.fHead; f = next) { - // Make sure we don't try to tessellate the new triangles. - next = f.next; - if (f.inside) { - libtess.tessmono.tessellateMonoRegion_(f); - } - } -}; - -/** - * Zaps (i.e. sets to null) all faces which are not marked "inside" the polygon. - * Since further mesh operations on null faces are not allowed, the main purpose - * is to clean up the mesh so that exterior loops are not represented in the - * data structure. - * @param {!libtess.GluMesh} mesh - */ -libtess.tessmono.discardExterior = function (mesh) { - var next; - for (var f = mesh.fHead.next; f !== mesh.fHead; f = next) { - // Since f will be destroyed, save its next pointer. - next = f.next; - if (!f.inside) { - libtess.mesh.zapFace(f); - } - } -}; - -/** - * Resets the winding numbers on all edges so that regions marked "inside" the - * polygon have a winding number of "value", and regions outside have a winding - * number of 0. - * - * If keepOnlyBoundary is true, it also deletes all edges which do not separate - * an interior region from an exterior one. - * - * @param {!libtess.GluMesh} mesh - * @param {number} value - * @param {boolean} keepOnlyBoundary - */ -libtess.tessmono.setWindingNumber = function (mesh, value, keepOnlyBoundary) { - var eNext; - for (var e = mesh.eHead.next; e !== mesh.eHead; e = eNext) { - eNext = e.next; - - if (e.rFace().inside !== e.lFace.inside) { - // This is a boundary edge (one side is interior, one is exterior). - e.winding = e.lFace.inside ? value : -value; - - } else { - // Both regions are interior, or both are exterior. - if (!keepOnlyBoundary) { - e.winding = 0; - - } else { - libtess.mesh.deleteEdge(e); - } - } - } -}; - - -/* global libtess */ - -/** - * A list of edges crossing the sweep line, sorted from top to bottom. - * Implementation is a doubly-linked list, sorted by the injected edgeLeq - * comparator function. Here it is a simple ordering, but see libtess.sweep for - * the list of invariants on the edge dictionary this ordering creates. - * @constructor - * @struct - * @param {!libtess.GluTesselator} frame - * @param {function(!libtess.GluTesselator, !libtess.ActiveRegion, !libtess.ActiveRegion): boolean} leq - */ -libtess.Dict = function (frame, leq) { - - /** - * The head of the doubly-linked DictNode list. At creation time, links back - * and forward only to itself. - * @private - */ - this.head_ = new libtess.DictNode(); - - /** - * The GluTesselator used as the frame for edge/event comparisons. - * @private - */ - this.frame_ = frame; - - /** - * Comparison function to maintain the invariants of the Dict. See - * libtess.sweep.edgeLeq_ for source. - * @private - * @type {function(!libtess.GluTesselator, !libtess.ActiveRegion, !libtess.ActiveRegion): boolean} - */ - this.leq_ = leq; -}; - -/* istanbul ignore next */ -/** - * Formerly used to delete the dict. - * NOTE(bckenny): No longer called but left for memFree documentation. Nulled at - * former callsite instead (sweep.doneEdgeDict_) - * @private - */ -libtess.Dict.prototype.deleteDict_ = function () { - // for (var node = this.head_.next; node !== this.head_; node = node.next) { - // memFree(node); - // } - // memFree(dict); -}; - -/** - * Insert the supplied key into the edge list and return its new node. - * @param {libtess.DictNode} node - * @param {!libtess.ActiveRegion} key - * @return {!libtess.DictNode} - */ -libtess.Dict.prototype.insertBefore = function (node, key) { - do { - node = node.prev; - } while (node.key !== null && !this.leq_(this.frame_, node.key, key)); - - // insert the new node and update the surrounding nodes to point to it - var newNode = new libtess.DictNode(key, node.next, node); - node.next.prev = newNode; - node.next = newNode; - - return newNode; -}; - -/** - * Insert key into the dict and return the new node that contains it. - * @param {!libtess.ActiveRegion} key - * @return {!libtess.DictNode} - */ -libtess.Dict.prototype.insert = function (key) { - // NOTE(bckenny): from a macro in dict.h/dict-list.h - return this.insertBefore(this.head_, key); -}; - -/** - * Remove node from the list. - * @param {libtess.DictNode} node - */ -libtess.Dict.prototype.deleteNode = function (node) { - node.next.prev = node.prev; - node.prev.next = node.next; - - // NOTE(bckenny): nulled at callsite (sweep.deleteRegion_) - // memFree( node ); -}; - -/** - * Search returns the node with the smallest key greater than or equal - * to the given key. If there is no such key, returns a node whose - * key is null. Similarly, max(d).getSuccessor() has a null key, etc. - * @param {!libtess.ActiveRegion} key - * @return {!libtess.DictNode} - */ -libtess.Dict.prototype.search = function (key) { - var node = this.head_; - - do { - node = node.next; - } while (node.key !== null && !this.leq_(this.frame_, key, node.key)); - - return node; -}; - -/** - * Return the node with the smallest key. - * @return {!libtess.DictNode} - */ -libtess.Dict.prototype.getMin = function () { - // NOTE(bckenny): from a macro in dict.h/dict-list.h - return this.head_.next; -}; - -// NOTE(bckenny): libtess.Dict.getMax isn't called within libtess and isn't part -// of the public API. For now, leaving in but ignoring for coverage. -/* istanbul ignore next */ -/** - * Returns the node with the greatest key. - * @return {!libtess.DictNode} - */ -libtess.Dict.prototype.getMax = function () { - // NOTE(bckenny): from a macro in dict.h/dict-list.h - return this.head_.prev; -}; - - -/* global libtess */ - -/** - * A doubly-linked-list node with a libtess.ActiveRegion payload. - * The key for this node and the next and previous nodes in the parent Dict list - * can be provided to insert it into an existing list (or all can be omitted if - * this is to be the founding node of the list). - * @param {!libtess.ActiveRegion=} opt_key - * @param {!libtess.DictNode=} opt_nextNode - * @param {!libtess.DictNode=} opt_prevNode - * @constructor - * @struct - */ -libtess.DictNode = function (opt_key, opt_nextNode, opt_prevNode) { - /** - * The ActiveRegion key for this node, or null if the head of the list. - * @type {libtess.ActiveRegion} - */ - this.key = opt_key || null; - - /** - * Link to next DictNode in parent list or to self if this is the first node. - * @type {!libtess.DictNode} - */ - this.next = opt_nextNode || this; - - /** - * Link to previous DictNode in parent list or to self if this is the first - * node. - * @type {!libtess.DictNode} - */ - this.prev = opt_prevNode || this; -}; - -/** - * Get the key from this node. - * @return {libtess.ActiveRegion} - */ -libtess.DictNode.prototype.getKey = function () { - return this.key; -}; - -/** - * Get the successor node to this one. - * @return {!libtess.DictNode} - */ -libtess.DictNode.prototype.getSuccessor = function () { - return this.next; -}; - -/** - * Get the predecessor node to this one. - * @return {!libtess.DictNode} - */ -libtess.DictNode.prototype.getPredecessor = function () { - return this.prev; -}; - - - -/* global libtess */ - -/** - * Cached vertex data for single-countour polygons for quick-and-dirty - * decomposition. - * @constructor - * @struct - */ -libtess.CachedVertex = function () { - /** - * [coords description] - * @type {Array.<number>} - */ - this.coords = [0, 0, 0]; - // TODO(bckenny): better way to init? - - /** - * [data description] - * @type {Object} - */ - this.data = null; -}; - - - -/* global libtess */ - -// TODO(bckenny): create more javascript-y API, e.g. make gluTessEndPolygon -// async, don't require so many temp objects created - -/** - * The tesselator main class, providing the public API. - * @constructor - * @struct - */ -libtess.GluTesselator = function () { - // Only initialize fields which can be changed by the api. Other fields - // are initialized where they are used. - - // TODO(bckenny): many of these can be made private - // TODO(bckenny): can we combine call* and call*Data functions? - - /*** state needed for collecting the input data ***/ - - /** - * what begin/end calls have we seen? - * @type {libtess.GluTesselator.tessState_} - */ - this.state = libtess.GluTesselator.tessState_.T_DORMANT; - - /** - * lastEdge_.org is the most recent vertex - * @private - * @type {libtess.GluHalfEdge} - */ - this.lastEdge_ = null; - - /** - * stores the input contours, and eventually the tessellation itself - * @type {libtess.GluMesh} - */ - this.mesh = null; - // NOTE(bckenny): initialized in this.emptyCache_ - - /** - * Error callback. - * @private - * @type {?function((libtess.errorType|libtess.gluEnum))} - */ - this.callError_ = null; - - - /*** state needed for projecting onto the sweep plane ***/ - - /** - * user-specified normal (if provided) - * @type {!Array.<number>} - */ - this.normal = [0, 0, 0]; - // TODO(bckenny): better way to init these arrays? - - /** - * unit vector in s-direction (debugging) - * @type {!Array.<number>} - */ - this.sUnit = [0, 0, 0]; - - /** - * unit vector in t-direction (debugging) - * @type {!Array.<number>} - */ - this.tUnit = [0, 0, 0]; - - /*** state needed for the line sweep ***/ - // TODO(bckenny): this could be moved to a sweep state object of some sort - - /** - * tolerance for merging features - * @type {number} - */ - this.relTolerance = libtess.GLU_TESS_DEFAULT_TOLERANCE; - - /** - * rule for determining polygon interior - * @type {libtess.windingRule} - */ - this.windingRule = libtess.windingRule.GLU_TESS_WINDING_ODD; - - /** - * fatal error: needed combine callback - * @type {boolean} - */ - this.fatalError = false; - - /** - * edge dictionary for sweep line - * @type {libtess.Dict} - */ - this.dict = null; - // NOTE(bckenny): dict initialized in sweep.initEdgeDict_, removed in sweep.doneEdgeDict_ - - /** - * priority queue of vertex events - * @type {libtess.PriorityQ} - */ - this.pq = null; - // NOTE(bckenny): pq initialized in sweep.initPriorityQ - - /** - * current sweep event being processed - * @type {libtess.GluVertex} - */ - this.event = null; - - /** - * Combine callback. - * @private - * @type {?function(Array.<number>, Array.<Object>, Array.<number>): Object} - */ - this.callCombine_ = null; - - /*** state needed for rendering callbacks (see render.js) ***/ - - /** - * Extract contours, not triangles - * @type {boolean} - */ - this.boundaryOnly = false; - - /** - * Begin callback. - * @private - * @type {?function(libtess.primitiveType)} - */ - this.callBegin_ = null; - - /** - * Edge flag callback. - * @private - * @type {?function(boolean)} - */ - this.callEdgeFlag_ = null; - - /** - * Vertex callback. - * @private - * @type {?function(Object)} - */ - this.callVertex_ = null; - - /** - * End callback. - * @private - * @type {?function()} - */ - this.callEnd_ = null; - - /** - * Mesh callback. - * @private - * @type {?function(libtess.GluMesh)} - */ - this.callMesh_ = null; - - /*** rendering callbacks that also pass polygon data ***/ - /** - * BeginData callback. - * @private - * @type {?function(libtess.primitiveType, Object)} - */ - this.callBeginData_ = null; - - /** - * EdgeFlagData callback. - * @private - * @type {?function(boolean, Object)} - */ - this.callEdgeFlagData_ = null; - - /** - * VertexData callback. - * @private - * @type {?function(Object, Object)} - */ - this.callVertexData_ = null; - - /** - * EndData callback. - * @private - * @type {?function(Object)} - */ - this.callEndData_ = null; - - /** - * ErrorData callback. - * @private - * @type {?function((libtess.errorType|libtess.gluEnum), Object)} - */ - this.callErrorData_ = null; - - /** - * CombineData callback. - * @private - * @type {?function(Array.<number>, Array.<Object>, Array.<number>, Object): Object} - */ - this.callCombineData_ = null; - - /** - * client data for current polygon - * @private - * @type {Object} - */ - this.polygonData_ = null; - - /*** state needed to cache single-contour polygons for renderCache() ***/ - /** - * empty cache on next vertex() call - * @type {boolean} - */ - this.emptyCache = false; - // TODO(bckenny): possibly rename to be clear it's a boolean - - /** - * number of cached vertices - * @type {number} - */ - this.cacheCount = 0; - - /** - * the vertex data - * @type {Array.<libtess.CachedVertex>} - */ - this.cache = new Array(libtess.TESS_MAX_CACHE); - - // TODO(bckenny): fill now? or init on demand - for (var i = 0; i < libtess.TESS_MAX_CACHE; i++) { - this.cache[i] = new libtess.CachedVertex(); - } -}; - -/** - * The begin/end calls must be properly nested. We keep track of the current - * state to enforce the ordering. - * @enum {number} - * @private - */ -libtess.GluTesselator.tessState_ = { - T_DORMANT: 0, - T_IN_POLYGON: 1, - T_IN_CONTOUR: 2 -}; - -/** - * Destory the tesselator object. See README. - */ -libtess.GluTesselator.prototype.gluDeleteTess = function () { - // TODO(bckenny): This does nothing but assert that it isn't called while - // building the polygon since we rely on GC to handle memory. *If* the public - // API changes, this should go. - this.requireState_(libtess.GluTesselator.tessState_.T_DORMANT); - // memFree(tess); TODO(bckenny) -}; - - -/** - * Set properties for control over tesselation. See README. - * @param {libtess.gluEnum} which [description]. - * @param {number|boolean} value [description]. - */ -libtess.GluTesselator.prototype.gluTessProperty = function (which, value) { - // TODO(bckenny): split into more setters? - // TODO(bckenny): in any case, we can do better than this switch statement - - switch (which) { - case libtess.gluEnum.GLU_TESS_TOLERANCE: - if (value < 0 || value > 1) { - break; - } - // TODO(bckenny): libtess doesn't support any tolerance but 0. This should - // reject any non-zero tolerance accordingly. - this.relTolerance = /** @type {number} */value; - return; - - case libtess.gluEnum.GLU_TESS_WINDING_RULE: - var windingRule = /** @type {libtess.windingRule} */value; - - switch (windingRule) { - case libtess.windingRule.GLU_TESS_WINDING_ODD: - case libtess.windingRule.GLU_TESS_WINDING_NONZERO: - case libtess.windingRule.GLU_TESS_WINDING_POSITIVE: - case libtess.windingRule.GLU_TESS_WINDING_NEGATIVE: - case libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO: - this.windingRule = windingRule; - return; - default: - } - break; - - case libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY: - // TODO(bckenny): added boolean param type. make sure ok. - this.boundaryOnly = !!value; - return; - - default: - this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM); - return; - } - this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_VALUE); -}; - - -/** - * Returns tessellator property - * @param {libtess.gluEnum} which [description]. - * @return {number|boolean} [description]. - */ -libtess.GluTesselator.prototype.gluGetTessProperty = function (which) { - // TODO(bckenny): as above, split into more getters? and improve on switch statement - // why are these being asserted in getter but not setter? - - switch (which) { - case libtess.gluEnum.GLU_TESS_TOLERANCE: - // tolerance should be in range [0..1] - return this.relTolerance; - - case libtess.gluEnum.GLU_TESS_WINDING_RULE: - var rule = this.windingRule; - return rule; - - case libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY: - return this.boundaryOnly; - - default: - this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM); - break; - } - return false; -}; - - -/** - * Lets the user supply the polygon normal, if known. All input data - * is projected into a plane perpendicular to the normal before - * tesselation. All output triangles are oriented CCW with - * respect to the normal (CW orientation can be obtained by - * reversing the sign of the supplied normal). For example, if - * you know that all polygons lie in the x-y plane, call - * "tess.gluTessNormal(0.0, 0.0, 1.0)" before rendering any polygons. - * - * @param {number} x [description]. - * @param {number} y [description]. - * @param {number} z [description]. - */ -libtess.GluTesselator.prototype.gluTessNormal = function (x, y, z) { - this.normal[0] = x; - this.normal[1] = y; - this.normal[2] = z; -}; - - -/** - * Specify callbacks. See README. A null or undefined opt_fn removes current callback. - * - * @param {libtess.gluEnum} which [description]. - * @param {?Function=} opt_fn [description]. - */ -libtess.GluTesselator.prototype.gluTessCallback = function (which, opt_fn) { - var fn = !opt_fn ? null : opt_fn; - // TODO(bckenny): better opt_fn typing? - - switch (which) { - case libtess.gluEnum.GLU_TESS_BEGIN: - this.callBegin_ = /** @type {function(libtess.primitiveType)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_BEGIN_DATA: - this.callBeginData_ = - /** @type {function(libtess.primitiveType, Object)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_EDGE_FLAG: - this.callEdgeFlag_ = /** @type {function(boolean)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_EDGE_FLAG_DATA: - this.callEdgeFlagData_ = /** @type {function(boolean, Object)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_VERTEX: - this.callVertex_ = /** @type {function(Object)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_VERTEX_DATA: - this.callVertexData_ = /** @type {function(Object, Object)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_END: - this.callEnd_ = /** @type {function()} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_END_DATA: - this.callEndData_ = /** @type {function(Object)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_ERROR: - this.callError_ = /** @type {function((libtess.errorType|libtess.gluEnum))} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_ERROR_DATA: - this.callErrorData_ = - /** @type {function((libtess.errorType|libtess.gluEnum), Object)} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_COMBINE: - this.callCombine_ = /** @type {function(Array.<number>, Array.<Object>, Array.<number>): Object} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_COMBINE_DATA: - this.callCombineData_ = /** @type {function(Array.<number>, Array.<Object>, Array.<number>, Object): Object} */ fn; - return; - - case libtess.gluEnum.GLU_TESS_MESH: - this.callMesh_ = /** @type {function(libtess.GluMesh)} */ fn; - return; - - default: - this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM); - return; - } -}; - - -/** - * Specify a vertex and associated data. Must be within calls to - * beginContour/endContour. See README. - * - * @param {Array.<number>} coords [description]. - * @param {Object} data [description]. - */ -libtess.GluTesselator.prototype.gluTessVertex = function (coords, data) { - var tooLarge = false; - - // TODO(bckenny): pool allocation? - var clamped = [0, 0, 0]; - - this.requireState_(libtess.GluTesselator.tessState_.T_IN_CONTOUR); - - if (this.emptyCache) { - this.emptyCache_(); - this.lastEdge_ = null; - } - - for (var i = 0; i < 3; ++i) { - var x = coords[i]; - if (x < -libtess.GLU_TESS_MAX_COORD) { - x = -libtess.GLU_TESS_MAX_COORD; - tooLarge = true; - } - if (x > libtess.GLU_TESS_MAX_COORD) { - x = libtess.GLU_TESS_MAX_COORD; - tooLarge = true; - } - clamped[i] = x; - } - - if (tooLarge) { - this.callErrorOrErrorData(libtess.errorType.GLU_TESS_COORD_TOO_LARGE); - } - - if (this.mesh === null) { - if (this.cacheCount < libtess.TESS_MAX_CACHE) { - this.cacheVertex_(clamped, data); - return; - } - - // cache is full, create mesh and add cached verts to it - this.emptyCache_(); - } - - this.addVertex_(clamped, data); -}; - - -/** - * [gluTessBeginPolygon description] - * @param {Object} data Client data for current polygon. - */ -libtess.GluTesselator.prototype.gluTessBeginPolygon = function (data) { - this.requireState_(libtess.GluTesselator.tessState_.T_DORMANT); - - this.state = libtess.GluTesselator.tessState_.T_IN_POLYGON; - this.cacheCount = 0; - this.emptyCache = false; - this.mesh = null; - - this.polygonData_ = data; -}; - - -/** - * [gluTessBeginContour description] - */ -libtess.GluTesselator.prototype.gluTessBeginContour = function () { - this.requireState_(libtess.GluTesselator.tessState_.T_IN_POLYGON); - - this.state = libtess.GluTesselator.tessState_.T_IN_CONTOUR; - this.lastEdge_ = null; - if (this.cacheCount > 0) { - // Just set a flag so we don't get confused by empty contours - // -- these can be generated accidentally with the obsolete - // NextContour() interface. - // TODO(bckenny): we aren't implementing NextContour() interface. - this.emptyCache = true; - } -}; - - -/** - * [gluTessEndContour description] - */ -libtess.GluTesselator.prototype.gluTessEndContour = function () { - this.requireState_(libtess.GluTesselator.tessState_.T_IN_CONTOUR); - this.state = libtess.GluTesselator.tessState_.T_IN_POLYGON; -}; - - -/** - * [gluTessEndPolygon description] - */ -libtess.GluTesselator.prototype.gluTessEndPolygon = function () { - this.requireState_(libtess.GluTesselator.tessState_.T_IN_POLYGON); - this.state = libtess.GluTesselator.tessState_.T_DORMANT; - - if (this.mesh === null) { - // TODO(bckenny): can we eliminate more cache functionality? - this.emptyCache_(); - } - - // Determine the polygon normal and project vertices onto the plane - // of the polygon. - libtess.normal.projectPolygon(this); - - // computeInterior(tess) computes the planar arrangement specified - // by the given contours, and further subdivides this arrangement - // into regions. Each region is marked "inside" if it belongs - // to the polygon, according to the rule given by this.windingRule. - // Each interior region is guaranteed be monotone. - libtess.sweep.computeInterior(this); - - if (!this.fatalError) { - // If the user wants only the boundary contours, we throw away all edges - // except those which separate the interior from the exterior. - // Otherwise we tessellate all the regions marked "inside". - // NOTE(bckenny): we know this.mesh has been initialized, so help closure out. - var mesh = /** @type {!libtess.GluMesh} */this.mesh; - if (this.boundaryOnly) { - libtess.tessmono.setWindingNumber(mesh, 1, true); - } else { - libtess.tessmono.tessellateInterior(mesh); - } - - this.mesh.checkMesh(); - - if (this.callBegin_ || this.callEnd_ || this.callVertex_ || - this.callEdgeFlag_ || this.callBeginData_ || this.callEndData_ || - this.callVertexData_ || this.callEdgeFlagData_) { - - if (this.boundaryOnly) { - // output boundary contours - libtess.render.renderBoundary(this, this.mesh); - - } else { - // output triangles (with edge callback if one is set) - var flagEdges = !!(this.callEdgeFlag_ || this.callEdgeFlagData_); - libtess.render.renderMesh(this, this.mesh, flagEdges); - } - } - - if (this.callMesh_) { - // Throw away the exterior faces, so that all faces are interior. - // This way the user doesn't have to check the "inside" flag, - // and we don't need to even reveal its existence. It also leaves - // the freedom for an implementation to not generate the exterior - // faces in the first place. - libtess.tessmono.discardExterior(this.mesh); - // user wants the mesh itself - this.callMesh_(this.mesh); - - this.mesh = null; - this.polygonData_ = null; - return; - } - } - - libtess.mesh.deleteMesh(this.mesh); - this.polygonData_ = null; - this.mesh = null; -}; - - -/** - * Return the tessellator to its original dormant state. - * @private - */ -libtess.GluTesselator.prototype.makeDormant_ = function () { - if (this.mesh) { - libtess.mesh.deleteMesh(this.mesh); - } - this.state = libtess.GluTesselator.tessState_.T_DORMANT; - this.lastEdge_ = null; - this.mesh = null; -}; - - -/** - * [requireState_ description] - * @private - * @param {libtess.GluTesselator.tessState_} state [description]. - */ -libtess.GluTesselator.prototype.requireState_ = function (state) { - if (this.state !== state) { - this.gotoState_(state); - } -}; - - -/** - * [gotoState_ description] - * @private - * @param {libtess.GluTesselator.tessState_} newState [description]. - */ -libtess.GluTesselator.prototype.gotoState_ = function (newState) { - while (this.state !== newState) { - // We change the current state one level at a time, to get to the desired - // state. - if (this.state < newState) { - switch (this.state) { - case libtess.GluTesselator.tessState_.T_DORMANT: - this.callErrorOrErrorData( - libtess.errorType.GLU_TESS_MISSING_BEGIN_POLYGON); - this.gluTessBeginPolygon(null); - break; - - case libtess.GluTesselator.tessState_.T_IN_POLYGON: - this.callErrorOrErrorData( - libtess.errorType.GLU_TESS_MISSING_BEGIN_CONTOUR); - this.gluTessBeginContour(); - break; - } - - } else { - switch (this.state) { - case libtess.GluTesselator.tessState_.T_IN_CONTOUR: - this.callErrorOrErrorData( - libtess.errorType.GLU_TESS_MISSING_END_CONTOUR); - this.gluTessEndContour(); - break; - - case libtess.GluTesselator.tessState_.T_IN_POLYGON: - this.callErrorOrErrorData( - libtess.errorType.GLU_TESS_MISSING_END_POLYGON); - // this.gluTessEndPolygon() is too much work! - this.makeDormant_(); - break; - } - } - } -}; - - -/** - * [addVertex_ description] - * @private - * @param {Array.<number>} coords [description]. - * @param {Object} data [description]. - */ -libtess.GluTesselator.prototype.addVertex_ = function (coords, data) { - var e = this.lastEdge_; - if (e === null) { - // Make a self-loop (one vertex, one edge). - e = libtess.mesh.makeEdge(this.mesh); - libtess.mesh.meshSplice(e, e.sym); - - } else { - // Create a new vertex and edge which immediately follow e - // in the ordering around the left face. - libtess.mesh.splitEdge(e); - e = e.lNext; - } - - // The new vertex is now e.org. - e.org.data = data; - e.org.coords[0] = coords[0]; - e.org.coords[1] = coords[1]; - e.org.coords[2] = coords[2]; - - // The winding of an edge says how the winding number changes as we - // cross from the edge''s right face to its left face. We add the - // vertices in such an order that a CCW contour will add +1 to - // the winding number of the region inside the contour. - e.winding = 1; - e.sym.winding = -1; - - this.lastEdge_ = e; -}; - - -/** - * [cacheVertex_ description] - * @private - * @param {Array.<number>} coords [description]. - * @param {Object} data [description]. - */ -libtess.GluTesselator.prototype.cacheVertex_ = function (coords, data) { - var v = this.cache[this.cacheCount]; - - v.data = data; - v.coords[0] = coords[0]; - v.coords[1] = coords[1]; - v.coords[2] = coords[2]; - ++this.cacheCount; -}; - - -/** - * [emptyCache_ description] - * @private - */ -libtess.GluTesselator.prototype.emptyCache_ = function () { - // NOTE(bckenny): surprise! - this.mesh = new libtess.GluMesh(); - - for (var i = 0; i < this.cacheCount; i++) { - var v = this.cache[i]; - this.addVertex_(v.coords, v.data); - } - - this.cacheCount = 0; - this.emptyCache = false; -}; - - -// TODO(bckenny): all following conditional callbacks could be simplified -// TODO(bckenny): using null for now, but may rework -// TODO(bckenny): should add documentation that references in callback are volatile (or make a copy) -// see README callback descriptions -/** - * [callBeginOrBeginData description] - * @param {libtess.primitiveType} type [description]. - */ -libtess.GluTesselator.prototype.callBeginOrBeginData = function (type) { - if (this.callBeginData_) { - this.callBeginData_(type, this.polygonData_); - - } else if (this.callBegin_) { - this.callBegin_(type); - } -}; - - -/** - * [callVertexOrVertexData description] - * @param {Object} data [description]. - */ -libtess.GluTesselator.prototype.callVertexOrVertexData = function (data) { - if (this.callVertexData_) { - this.callVertexData_(data, this.polygonData_); - - } else if (this.callVertex_) { - this.callVertex_(data); - } -}; - - -/** - * [callEdgeFlagOrEdgeFlagData description] - * @param {boolean} flag [description]. - */ -libtess.GluTesselator.prototype.callEdgeFlagOrEdgeFlagData = function (flag) { - if (this.callEdgeFlagData_) { - this.callEdgeFlagData_(flag, this.polygonData_); - - } else if (this.callEdgeFlag_) { - this.callEdgeFlag_(flag); - } -}; - - -/** - * [callEndOrEndData description] - */ -libtess.GluTesselator.prototype.callEndOrEndData = function () { - if (this.callEndData_) { - this.callEndData_(this.polygonData_); - - } else if (this.callEnd_) { - this.callEnd_(); - } -}; - - -/** - * [callCombineOrCombineData description] - * @param {Array.<number>} coords [description]. - * @param {Array.<Object>} data [description]. - * @param {Array.<number>} weight [description]. - * @return {Object} Interpolated vertex. - */ -libtess.GluTesselator.prototype.callCombineOrCombineData = - function (coords, data, weight) { - - var interpData; - if (this.callCombineData_) { - interpData = this.callCombineData_(coords, data, weight, this.polygonData_); - - } else if (this.callCombine_) { - interpData = this.callCombine_(coords, data, weight); - } - - // TODO(bckenny): can't be undefined - if (interpData === undefined) { - interpData = null; - } - return interpData; - }; - - -// TODO(bckenny): combine the enums in libtess -/** - * [callErrorOrErrorData description] - * @param {(libtess.errorType|libtess.gluEnum)} errno [description]. - */ -libtess.GluTesselator.prototype.callErrorOrErrorData = function (errno) { - if (this.callErrorData_) { - this.callErrorData_(errno, this.polygonData_); - - } else if (this.callError_) { - this.callError_(errno); - } -}; - - - -/* global libtess */ - -/** - * Each face has a pointer to the next and previous faces in the - * circular list, and a pointer to a half-edge with this face as - * the left face (null if this is the dummy header). There is also - * a field "data" for client data. - * - * @param {libtess.GluFace=} opt_nextFace - * @param {libtess.GluFace=} opt_prevFace - * @constructor - * @struct - */ -libtess.GluFace = function (opt_nextFace, opt_prevFace) { - // TODO(bckenny): reverse order of params? - - /** - * next face (never null) - * @type {!libtess.GluFace} - */ - this.next = opt_nextFace || this; - - /** - * previous face (never NULL) - * @type {!libtess.GluFace} - */ - this.prev = opt_prevFace || this; - - /** - * A half edge with this left face. - * @type {libtess.GluHalfEdge} - */ - this.anEdge = null; - - /** - * room for client's data - * @type {Object} - */ - this.data = null; - - /** - * This face is in the polygon interior. - * @type {boolean} - */ - this.inside = false; -}; - - - -/* global libtess */ - -/** - * The fundamental data structure is the "half-edge". Two half-edges - * go together to make an edge, but they point in opposite directions. - * Each half-edge has a pointer to its mate (the "symmetric" half-edge sym), - * its origin vertex (org), the face on its left side (lFace), and the - * adjacent half-edges in the CCW direction around the origin vertex - * (oNext) and around the left face (lNext). There is also a "next" - * pointer for the global edge list (see below). - * - * The notation used for mesh navigation: - * sym = the mate of a half-edge (same edge, but opposite direction) - * oNext = edge CCW around origin vertex (keep same origin) - * dNext = edge CCW around destination vertex (keep same dest) - * lNext = edge CCW around left face (dest becomes new origin) - * rNext = edge CCW around right face (origin becomes new dest) - * - * "prev" means to substitute CW for CCW in the definitions above. - * - * The circular edge list is special; since half-edges always occur - * in pairs (e and e.sym), each half-edge stores a pointer in only - * one direction. Starting at eHead and following the e.next pointers - * will visit each *edge* once (ie. e or e.sym, but not both). - * e.sym stores a pointer in the opposite direction, thus it is - * always true that e.sym.next.sym.next === e. - * - * @param {libtess.GluHalfEdge=} opt_nextEdge - * @constructor - * @struct - */ -libtess.GluHalfEdge = function (opt_nextEdge) { - // TODO(bckenny): are these the right defaults? (from gl_meshNewMesh requirements) - - /** - * doubly-linked list (prev==sym->next) - * @type {!libtess.GluHalfEdge} - */ - this.next = opt_nextEdge || this; - - // TODO(bckenny): how can this be required if created in pairs? move to factory creation only? - /** - * same edge, opposite direction - * @type {libtess.GluHalfEdge} - */ - this.sym = null; - - /** - * next edge CCW around origin - * @type {libtess.GluHalfEdge} - */ - this.oNext = null; - - /** - * next edge CCW around left face - * @type {libtess.GluHalfEdge} - */ - this.lNext = null; - - /** - * origin vertex (oVertex too long) - * @type {libtess.GluVertex} - */ - this.org = null; - - /** - * left face - * @type {libtess.GluFace} - */ - this.lFace = null; - - // Internal data (keep hidden) - // NOTE(bckenny): can't be private, though... - - /** - * a region with this upper edge (see sweep.js) - * @type {libtess.ActiveRegion} - */ - this.activeRegion = null; - - /** - * change in winding number when crossing from the right face to the left face - * @type {number} - */ - this.winding = 0; -}; - -// NOTE(bckenny): the following came from macros in mesh -// TODO(bckenny): using methods as aliases for sym connections for now. -// not sure about this approach. getters? renames? - - -/** - * [rFace description] - * @return {libtess.GluFace} [description]. - */ -libtess.GluHalfEdge.prototype.rFace = function () { - return this.sym.lFace; -}; - - -/** - * [dst description] - * @return {libtess.GluVertex} [description]. - */ -libtess.GluHalfEdge.prototype.dst = function () { - return this.sym.org; -}; - - -/** - * [oPrev description] - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.GluHalfEdge.prototype.oPrev = function () { - return this.sym.lNext; -}; - - -/** - * [lPrev description] - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.GluHalfEdge.prototype.lPrev = function () { - return this.oNext.sym; -}; - -// NOTE(bckenny): libtess.GluHalfEdge.dPrev is called nowhere in libtess and -// isn't part of the current public API. It could be useful for mesh traversal -// and manipulation if made public, however. -/* istanbul ignore next */ -/** - * The edge clockwise around destination vertex (keep same dest). - * @return {libtess.GluHalfEdge} - */ -libtess.GluHalfEdge.prototype.dPrev = function () { - return this.lNext.sym; -}; - - -/** - * [rPrev description] - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.GluHalfEdge.prototype.rPrev = function () { - return this.sym.oNext; -}; - - -/** - * [dNext description] - * @return {libtess.GluHalfEdge} [description]. - */ -libtess.GluHalfEdge.prototype.dNext = function () { - return this.rPrev().sym; -}; - - -// NOTE(bckenny): libtess.GluHalfEdge.rNext is called nowhere in libtess and -// isn't part of the current public API. It could be useful for mesh traversal -// and manipulation if made public, however. -/* istanbul ignore next */ -/** - * The edge CCW around the right face (origin of this becomes new dest). - * @return {libtess.GluHalfEdge} - */ -libtess.GluHalfEdge.prototype.rNext = function () { - return this.oPrev().sym; -}; - - - -/* global libtess */ - -/** - * Creates a new mesh with no edges, no vertices, - * and no loops (what we usually call a "face"). - * - * @constructor - * @struct - */ -libtess.GluMesh = function () { - /** - * dummy header for vertex list - * @type {libtess.GluVertex} - */ - this.vHead = new libtess.GluVertex(); - - /** - * dummy header for face list - * @type {libtess.GluFace} - */ - this.fHead = new libtess.GluFace(); - - /** - * dummy header for edge list - * @type {libtess.GluHalfEdge} - */ - this.eHead = new libtess.GluHalfEdge(); - - /** - * and its symmetric counterpart - * @type {libtess.GluHalfEdge} - */ - this.eHeadSym = new libtess.GluHalfEdge(); - - // TODO(bckenny): better way to pair these? - this.eHead.sym = this.eHeadSym; - this.eHeadSym.sym = this.eHead; -}; - - -// TODO(bckenny): #ifndef NDEBUG -/** - * Checks mesh for self-consistency. - */ -libtess.GluMesh.prototype.checkMesh = function () { - if (!libtess.DEBUG) { - return; - } - - var fHead = this.fHead; - var vHead = this.vHead; - var eHead = this.eHead; - - var e; - - // faces - var f; - var fPrev = fHead; - for (fPrev = fHead; (f = fPrev.next) !== fHead; fPrev = f) { - e = f.anEdge; - do { - e = e.lNext; - } while (e !== f.anEdge); - } - - // vertices - var v; - var vPrev = vHead; - for (vPrev = vHead; (v = vPrev.next) !== vHead; vPrev = v) { - e = v.anEdge; - do { - e = e.oNext; - } while (e !== v.anEdge); - } - - // edges - var ePrev = eHead; - for (ePrev = eHead; (e = ePrev.next) !== eHead; ePrev = e) { - } -}; - - - -/* global libtess */ - -/** - * Each vertex has a pointer to next and previous vertices in the - * circular list, and a pointer to a half-edge with this vertex as - * the origin (null if this is the dummy header). There is also a - * field "data" for client data. - * - * @param {libtess.GluVertex=} opt_nextVertex [description]. - * @param {libtess.GluVertex=} opt_prevVertex [description]. - * @constructor - * @struct - */ -libtess.GluVertex = function (opt_nextVertex, opt_prevVertex) { - // TODO(bckenny): reverse order of params? - - /** - * Next vertex (never null). - * @type {!libtess.GluVertex} - */ - this.next = opt_nextVertex || this; - - /** - * Previous vertex (never null). - * @type {!libtess.GluVertex} - */ - this.prev = opt_prevVertex || this; - - /** - * A half-edge with this origin. - * @type {libtess.GluHalfEdge} - */ - this.anEdge = null; - - /** - * The client's data. - * @type {Object} - */ - this.data = null; - - /** - * The vertex location in 3D. - * @type {!Array.<number>} - */ - this.coords = [0, 0, 0]; - // TODO(bckenny): we may want to rethink coords, either eliminate (using s - // and t and user data) or index into contiguous storage? - - /** - * Component of projection onto the sweep plane. - * @type {number} - */ - this.s = 0; - - /** - * Component of projection onto the sweep plane. - * @type {number} - */ - this.t = 0; - - /** - * To allow deletion from priority queue. - * @type {?libtess.PQHandle} - */ - this.pqHandle = null; - // NOTE(bckenny): pqHandle inited in sweep - // TODO(bckenny): can we have a numeric default value? null may do bad things -}; - - - -/* global libtess */ - -// TODO(bckenny): more specific typing on key - -/** - * [PQHandleElem description] - * @constructor - * @struct - */ -libtess.PQHandleElem = function () { - // TODO(bckenny): if key could instead be an indexed into another store, makes heap storage a lot easier - - /** - * [key description] - * @type {libtess.PQKey} - */ - this.key = null; - - /** - * [node description] - * @type {libtess.PQHandle} - */ - this.node = 0; -}; - - -/** - * Allocate a PQHandleElem array of size size. If oldArray is not null, its - * contents are copied to the beginning of the new array. The rest of the array - * is filled with new PQHandleElems. - * - * @param {?Array.<libtess.PQHandleElem>} oldArray [description]. - * @param {number} size [description]. - * @return {Array.<libtess.PQHandleElem>} [description]. - */ -libtess.PQHandleElem.realloc = function (oldArray, size) { - var newArray = new Array(size); - - // TODO(bckenny): better to reallocate array? or grow array? - var index = 0; - if (oldArray !== null) { - for (; index < oldArray.length; index++) { - newArray[index] = oldArray[index]; - } - } - - for (; index < size; index++) { - newArray[index] = new libtess.PQHandleElem(); - } - - return newArray; -}; - - - -/* global libtess */ - -// TODO(bckenny): maybe just have these created inline as literals -// (or unboxed directly - PQHandle is just an array index number) - -/** - * [PQNode description] - * @constructor - * @struct - */ -libtess.PQNode = function () { - /** - * [handle description] - * @type {libtess.PQHandle} - */ - this.handle = 0; -}; - - -/** - * Allocate a PQNode array of size size. If oldArray is not null, its contents - * are copied to the beginning of the new array. The rest of the array is - * filled with new PQNodes. - * - * @param {?Array.<libtess.PQNode>} oldArray [description]. - * @param {number} size [description]. - * @return {Array.<libtess.PQNode>} [description]. - */ -libtess.PQNode.realloc = function (oldArray, size) { - var newArray = new Array(size); - - // TODO(bckenny): better to reallocate array? or grow array? - var index = 0; - if (oldArray !== null) { - for (; index < oldArray.length; index++) { - newArray[index] = oldArray[index]; - } - } - - for (; index < size; index++) { - newArray[index] = new libtess.PQNode(); - } - - return newArray; -}; - - - -/* global libtess */ - -// TODO(bckenny): preallocating arrays may actually be hurting us in sort -// performance (esp if theres some undefs in there) - -/** - * [PriorityQ description] - * @constructor - * @struct - * @param {function(Object, Object): boolean} leq [description]. - */ -libtess.PriorityQ = function (leq) { - /** - * [keys description] - * @private - * @type {Array.<libtess.PQKey>} - */ - this.keys_ = libtess.PriorityQ.prototype.PQKeyRealloc_(null, - libtess.PriorityQ.INIT_SIZE_); - - /** - * Array of indexes into this.keys_ - * @private - * @type {Array.<number>} - */ - this.order_ = null; - - /** - * [size description] - * @private - * @type {number} - */ - this.size_ = 0; - - /** - * [max_ description] - * @private - * @type {number} - */ - this.max_ = libtess.PriorityQ.INIT_SIZE_; - - /** - * [initialized description] - * @private - * @type {boolean} - */ - this.initialized_ = false; - - // TODO(bckenny): leq was inlined by define in original, but appears to just - // be vertLeq, as passed. keep an eye on this as to why its not used. - /** - * [leq description] - * @private - * @type {function(libtess.PQKey, libtess.PQKey): boolean} - */ - this.leq_ = - /** @type {function(libtess.PQKey, libtess.PQKey): boolean} */leq; - - /** - * [heap_ description] - * @private - * @type {libtess.PriorityQHeap} - */ - this.heap_ = new libtess.PriorityQHeap(this.leq_); -}; - - -/** - * [INIT_SIZE_ description] - * @private - * @const - * @type {number} - */ -libtess.PriorityQ.INIT_SIZE_ = 32; - - -/** - * [deleteQ description] - */ -libtess.PriorityQ.prototype.deleteQ = function () { - // TODO(bckenny): unnecessary, I think. - this.heap_.deleteHeap(); - this.heap_ = null; - this.order_ = null; - this.keys_ = null; - // NOTE(bckenny): nulled at callsite (sweep.donePriorityQ_) -}; - - -/** - * [init description] - */ -libtess.PriorityQ.prototype.init = function () { - // TODO(bckenny): reuse. in theory, we don't have to empty this, as access is - // dictated by this.size_, but array.sort doesn't know that - this.order_ = []; - - // Create an array of indirect pointers to the keys, so that - // the handles we have returned are still valid. - // TODO(bckenny): valid for when? it appears we can just store indexes into - // keys_, but what did this mean? - for (var i = 0; i < this.size_; i++) { - this.order_[i] = i; - } - - // sort the indirect pointers in descending order of the keys themselves - // TODO(bckenny): make sure it's ok that keys[a] === keys[b] returns 1 - // TODO(bckenny): unstable sort means we may get slightly different polys in - // different browsers, but only when passing in equal points - // TODO(bckenny): make less awkward closure? - var comparator = (function (keys, leq) { - return function (a, b) { - return leq(keys[a], keys[b]) ? 1 : -1; - }; - })(this.keys_, this.leq_); - this.order_.sort(comparator); - - this.max_ = this.size_; - this.initialized_ = true; - this.heap_.init(); - - // TODO(bckenny): - // #ifndef NDEBUG - if (libtess.DEBUG) { - var p = 0; - var r = p + this.size_ - 1; - for (i = p; i < r; ++i) { - } - } - // #endif -}; - - -/** - * [insert description] - * @param {libtess.PQKey} keyNew [description]. - * @return {libtess.PQHandle} [description]. - */ -libtess.PriorityQ.prototype.insert = function (keyNew) { - // NOTE(bckenny): originally returned LONG_MAX as alloc failure signal. no - // longer does. - if (this.initialized_) { - return this.heap_.insert(keyNew); - } - - var curr = this.size_; - if (++this.size_ >= this.max_) { - // If the heap overflows, double its size. - this.max_ *= 2; - this.keys_ = - libtess.PriorityQ.prototype.PQKeyRealloc_(this.keys_, this.max_); - } - - this.keys_[curr] = keyNew; - - // Negative handles index the sorted array. - return -(curr + 1); -}; - - -/** - * Allocate a PQKey array of size size. If oldArray is not null, its - * contents are copied to the beginning of the new array. The rest of the array - * is filled with nulls. - * - * @private - * @param {?Array.<libtess.PQKey>} oldArray [description]. - * @param {number} size [description]. - * @return {Array.<(?libtess.PQKey)>} [description]. - */ -libtess.PriorityQ.prototype.PQKeyRealloc_ = function (oldArray, size) { - // TODO(bckenny): double check return type. can we have ? there? - var newArray = new Array(size); - - // TODO(bckenny): better to reallocate array? or grow array? - var index = 0; - if (oldArray !== null) { - for (; index < oldArray.length; index++) { - newArray[index] = oldArray[index]; - } - } - - for (; index < size; index++) { - newArray[index] = null; - } - - return newArray; -}; - -// NOTE(bckenny): libtess.PriorityQ.keyLessThan_ is called nowhere in libtess -// and isn't part of the public API. -/* istanbul ignore next */ -/** - * Whether x is less than y according to this.leq_. - * @private - * @param {number} x - * @param {number} y - * @return {boolean} - */ -libtess.PriorityQ.prototype.keyLessThan_ = function (x, y) { - // NOTE(bckenny): was macro LT - var keyX = this.keys_[x]; - var keyY = this.keys_[y]; - return !this.leq_(keyY, keyX); -}; - -// NOTE(bckenny): libtess.PriorityQ.keyGreaterThan_ is called nowhere in libtess -// and isn't part of the public API. -/* istanbul ignore next */ -/** - * Whether x is greater than y according to this.leq_. - * @private - * @param {number} x - * @param {number} y - * @return {boolean} - */ -libtess.PriorityQ.prototype.keyGreaterThan_ = function (x, y) { - // NOTE(bckenny): was macro GT - var keyX = this.keys_[x]; - var keyY = this.keys_[y]; - return !this.leq_(keyX, keyY); -}; - - -/** - * [extractMin description] - * @return {libtess.PQKey} [description]. - */ -libtess.PriorityQ.prototype.extractMin = function () { - if (this.size_ === 0) { - return this.heap_.extractMin(); - } - - var sortMin = this.keys_[this.order_[this.size_ - 1]]; - if (!this.heap_.isEmpty()) { - var heapMin = this.heap_.minimum(); - if (this.leq_(heapMin, sortMin)) { - return this.heap_.extractMin(); - } - } - - do { - --this.size_; - } while (this.size_ > 0 && this.keys_[this.order_[this.size_ - 1]] === null); - - return sortMin; -}; - - -/** - * [minimum description] - * @return {libtess.PQKey} [description]. - */ -libtess.PriorityQ.prototype.minimum = function () { - if (this.size_ === 0) { - return this.heap_.minimum(); - } - - var sortMin = this.keys_[this.order_[this.size_ - 1]]; - if (!this.heap_.isEmpty()) { - var heapMin = this.heap_.minimum(); - if (this.leq_(heapMin, sortMin)) { - return heapMin; - } - } - - return sortMin; -}; - -// NOTE(bckenny): libtess.PriorityQ.isEmpty_ isn't called within libtess and -// isn't part of the public API. For now, leaving in but ignoring for coverage. -/* istanbul ignore next */ -/** - * Returns whether the priority queue is empty. - * @private - * @return {boolean} - */ -libtess.PriorityQ.prototype.isEmpty_ = function () { - return this.size_ === 0 && this.heap_.isEmpty(); -}; - - -/** - * [remove description] - * @param {libtess.PQHandle} curr [description]. - */ -libtess.PriorityQ.prototype.remove = function (curr) { - if (curr >= 0) { - this.heap_.remove(curr); - return; - } - curr = -(curr + 1); - - this.keys_[curr] = null; - while (this.size_ > 0 && this.keys_[this.order_[this.size_ - 1]] === null) { - --this.size_; - } -}; - - - -/* global libtess */ - -// TODO(bckenny): keys appear to always be GluVertex in this case? - -/** - * [PriorityQHeap description] - * @constructor - * @struct - * @param {function(libtess.PQKey, libtess.PQKey): boolean} leq [description]. - */ -libtess.PriorityQHeap = function (leq) { - /** - * The heap itself. Active nodes are stored in the range 1..size. Each node - * stores only an index into handles. - * @private - * @type {Array.<libtess.PQNode>} - */ - this.nodes_ = libtess.PQNode.realloc(null, - libtess.PriorityQHeap.INIT_SIZE_ + 1); - - /** - * Each handle stores a key, plus a pointer back to the node which currently - * represents that key (ie. nodes[handles[i].node].handle == i). - * @private - * @type {Array.<libtess.PQHandleElem>} - */ - this.handles_ = libtess.PQHandleElem.realloc(null, - libtess.PriorityQHeap.INIT_SIZE_ + 1); - - // TODO(bckenny): size and max should probably be libtess.PQHandle for correct - // typing (see PriorityQ.js) - /** - * The size of the queue. - * @private - * @type {number} - */ - this.size_ = 0; - - /** - * The queue's current allocated space. - * @private - * @type {number} - */ - this.max_ = libtess.PriorityQHeap.INIT_SIZE_; - - /** - * The index of the next free hole in the handles array. Handle in that slot - * has next item in freeList in its node propert. If there are no holes, - * freeList === 0 and one at the end of handles must be use. - * @private - * @type {libtess.PQHandle} - */ - this.freeList_ = 0; - - /** - * Indicates that the heap has been initialized via init. If false, inserts - * are fast insertions at the end of a list. If true, all inserts will now be - * correctly ordered in the queue before returning. - * @private - * @type {boolean} - */ - this.initialized_ = false; - - // TODO(bckenny): leq was inlined by define in original, but appears to - // be vertLeq, as passed. Using injected version, but is it better just to - // manually inline? - /** - * [leq description] - * @private - * @type {function(libtess.PQKey, libtess.PQKey): boolean} - */ - this.leq_ = leq; - - // so that minimum returns null - this.nodes_[1].handle = 1; -}; - - -/** - * [INIT_SIZE_ description] - * @private - * @const - * @type {number} - */ -libtess.PriorityQHeap.INIT_SIZE_ = 32; - - -/** - * [deleteHeap description] - */ -libtess.PriorityQHeap.prototype.deleteHeap = function () { - // TODO(bckenny): unnecessary, I think. - this.handles_ = null; - this.nodes_ = null; - // NOTE(bckenny): nulled at callsite in PriorityQ.deleteQ -}; - - -/** - * Initializing ordering of the heap. Must be called before any method other - * than insert is called to ensure correctness when removing or querying. - */ -libtess.PriorityQHeap.prototype.init = function () { - // This method of building a heap is O(n), rather than O(n lg n). - for (var i = this.size_; i >= 1; --i) { - this.floatDown_(i); - } - - this.initialized_ = true; -}; - - -/** - * Insert a new key into the heap. - * @param {libtess.PQKey} keyNew The key to insert. - * @return {libtess.PQHandle} A handle that can be used to remove the key. - */ -libtess.PriorityQHeap.prototype.insert = function (keyNew) { - var curr = ++this.size_; - - // if the heap overflows, double its size. - if (curr * 2 > this.max_) { - this.max_ *= 2; - this.nodes_ = libtess.PQNode.realloc(this.nodes_, this.max_ + 1); - this.handles_ = libtess.PQHandleElem.realloc(this.handles_, this.max_ + 1); - } - - var free; - if (this.freeList_ === 0) { - free = curr; - } else { - free = this.freeList_; - this.freeList_ = this.handles_[free].node; - } - - this.nodes_[curr].handle = free; - this.handles_[free].node = curr; - this.handles_[free].key = keyNew; - - if (this.initialized_) { - this.floatUp_(curr); - } - - return free; -}; - - -/** - * @return {boolean} Whether the heap is empty. - */ -libtess.PriorityQHeap.prototype.isEmpty = function () { - return this.size_ === 0; -}; - - -/** - * Returns the minimum key in the heap. If the heap is empty, null will be - * returned. - * @return {libtess.PQKey} [description]. - */ -libtess.PriorityQHeap.prototype.minimum = function () { - return this.handles_[this.nodes_[1].handle].key; -}; - - -/** - * Removes the minimum key from the heap and returns it. If the heap is empty, - * null will be returned. - * @return {libtess.PQKey} [description]. - */ -libtess.PriorityQHeap.prototype.extractMin = function () { - var n = this.nodes_; - var h = this.handles_; - var hMin = n[1].handle; - var min = h[hMin].key; - - if (this.size_ > 0) { - n[1].handle = n[this.size_].handle; - h[n[1].handle].node = 1; - - h[hMin].key = null; - h[hMin].node = this.freeList_; - this.freeList_ = hMin; - - if (--this.size_ > 0) { - this.floatDown_(1); - } - } - - return min; -}; - - -/** - * Remove key associated with handle hCurr (returned from insert) from heap. - * @param {libtess.PQHandle} hCurr [description]. - */ -libtess.PriorityQHeap.prototype.remove = function (hCurr) { - var n = this.nodes_; - var h = this.handles_; - - var curr = h[hCurr].node; - n[curr].handle = n[this.size_].handle; - h[n[curr].handle].node = curr; - - if (curr <= --this.size_) { - if (curr <= 1 || - this.leq_(h[n[curr >> 1].handle].key, h[n[curr].handle].key)) { - - this.floatDown_(curr); - } else { - this.floatUp_(curr); - } - } - - h[hCurr].key = null; - h[hCurr].node = this.freeList_; - this.freeList_ = hCurr; -}; - - -/** - * [floatDown_ description] - * @private - * @param {libtess.PQHandle} curr [description]. - */ -libtess.PriorityQHeap.prototype.floatDown_ = function (curr) { - var n = this.nodes_; - var h = this.handles_; - - var hCurr = n[curr].handle; - for (; ;) { - // The children of node i are nodes 2i and 2i+1. - // set child to the index of the child with the minimum key - var child = curr << 1; - if (child < this.size_ && - this.leq_(h[n[child + 1].handle].key, h[n[child].handle].key)) { - - ++child; - } - - var hChild = n[child].handle; - if (child > this.size_ || this.leq_(h[hCurr].key, h[hChild].key)) { - n[curr].handle = hCurr; - h[hCurr].node = curr; - break; - } - n[curr].handle = hChild; - h[hChild].node = curr; - curr = child; - } -}; - - -/** - * [floatUp_ description] - * @private - * @param {libtess.PQHandle} curr [description]. - */ -libtess.PriorityQHeap.prototype.floatUp_ = function (curr) { - var n = this.nodes_; - var h = this.handles_; - - var hCurr = n[curr].handle; - for (; ;) { - var parent = curr >> 1; - var hParent = n[parent].handle; - if (parent === 0 || this.leq_(h[hParent].key, h[hCurr].key)) { - n[curr].handle = hCurr; - h[hCurr].node = curr; - break; - } - - n[curr].handle = hParent; - h[hParent].node = curr; - curr = parent; - } -}; - - -/* global libtess */ - -// TODO(bckenny): apparently only visible outside of sweep for debugging routines. -// find out if we can hide - -/** - * For each pair of adjacent edges crossing the sweep line, there is - * an ActiveRegion to represent the region between them. The active - * regions are kept in sorted order in a dynamic dictionary. As the - * sweep line crosses each vertex, we update the affected regions. - * @constructor - * @struct - */ -libtess.ActiveRegion = function () { - // TODO(bckenny): I *think* eUp and nodeUp could be passed in as constructor params - - /** - * The upper edge of the region, directed right to left - * @type {libtess.GluHalfEdge} - */ - this.eUp = null; - - /** - * Dictionary node corresponding to eUp edge. - * @type {libtess.DictNode} - */ - this.nodeUp = null; - - /** - * Used to determine which regions are inside the polygon. - * @type {number} - */ - this.windingNumber = 0; - - /** - * Whether this region is inside the polygon. - * @type {boolean} - */ - this.inside = false; - - /** - * Marks fake edges at t = +/-infinity. - * @type {boolean} - */ - this.sentinel = false; - - /** - * Marks regions where the upper or lower edge has changed, but we haven't - * checked whether they intersect yet. - * @type {boolean} - */ - this.dirty = false; - - /** - * marks temporary edges introduced when we process a "right vertex" (one - * without any edges leaving to the right) - * @type {boolean} - */ - this.fixUpperEdge = false; -}; - -/** - * Returns the ActiveRegion below this one. - * @return {libtess.ActiveRegion} - */ -libtess.ActiveRegion.prototype.regionBelow = function () { - return this.nodeUp.getPredecessor().getKey(); -}; - -/** - * Returns the ActiveRegion above this one. - * @return {libtess.ActiveRegion} - */ -libtess.ActiveRegion.prototype.regionAbove = function () { - return this.nodeUp.getSuccessor().getKey(); -}; - -/* global libtess, module */ - -/** - * node.js export for non-compiled source - */ -if (typeof module !== 'undefined') { - module.exports = libtess; -} diff --git a/web/view.html b/web/view.html index c8be8a35..3f90a6fe 100644 --- a/web/view.html +++ b/web/view.html @@ -7,6 +7,7 @@ <title>Shadow Editor Viewer +

)u>S+Ol1VA9+UH*3fcfCXJ+5tp##P_%$iX`_9 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 J*6C*Me*liy%M1Vj literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..732c32f954742a50ed13b6e2411fcd5ee6826c53 GIT binary patch literal 14940 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 F{a+$VI>G<| literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..576ec70e73593bd2838014bb941e5a0af455f10f GIT binary patch literal 9531 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 z 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 literal 0 HcmV?d00001 diff --git a/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg b/web/assets/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..300aa5803058740c23a2f7feacdffc885fbc0d59 GIT binary patch literal 11678 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